Configurazione VPN Wireguard#
Come visto nell’articolo dedicato, dobbiamo configurare Proxmox Backup Server come peer, in modo che possa comunicare col VPS tramite la VPN wireguard self-hosted.
PBS#
- Accedere via SSH a PBS e installare il seguente pacchetto:
1
|
apt install wireguard-tools
|
- Generare la coppia di chiavi, impostando i permessi corretti
1
2
3
|
wg genkey | tee /etc/wireguard/pbs-priv.key | wg pubkey > /etc/wireguard/pbs-pub.key
chmod 600 /etc/wireguard/*
|
- Creare il file di configurazione per il client PBS
1
2
3
4
5
6
7
8
9
10
|
cat /etc/wireguard/wg0.conf
[Interface]
PrivateKey = [CHIAVE_PRIVATA_CLIENT]
Address = 10.8.0.5/32
[Peer]
PublicKey = [CHIAVE_PUBBLICA_SERVER]
Endpoint = [IP_PUBBLICO_SERVER]:51820
AllowedIPs = 10.8.0.0/24
|
- Soltanto il traffico della subnet della VPN,
10.8.0.0/24, viene instradato nella VPN
- Collegarsi via SSH al VPS
- Sul server VPN, aggiungere il client alla lista dei peer autorizzati:
1
2
3
4
5
6
|
cat /etc/wireguard/wg0.conf
[Peer]
PublicKey = [CHIAVE_PUBBLICA_PBS]
AllowedIPs = 10.8.0.5/32
PersistentKeepalive = 25
|
1
2
3
4
5
|
wg-quick up wg0
# oppure
systemctl enable --now wg-quick@wg0.service
|
- Verificare che client (PBS) e server VPN (VPS) siano tra loro raggiungili attraverso la VPN
1
2
3
4
5
6
7
8
9
10
11
12
|
[15:00 Sun Apr 12]root@pbs01 (223):~
> ping -c 4 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=62.9 ms
64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=67.5 ms
64 bytes from 10.8.0.1: icmp_seq=3 ttl=64 time=60.7 ms
64 bytes from 10.8.0.1: icmp_seq=4 ttl=64 time=59.2 ms
--- 10.8.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 59.229/62.590/67.522/3.134 ms
|
Datastore e utente dedicato#
Dall’interfaccia grafica di PBS, creare un Datastore e un utente dedicato per il backup, avendo cura di impostare il ruolo DatastoreBackup, come spiegato precedentemente.
Cronjob#
Su PBS creare i seguenti cronjob:
1
2
|
@reboot /usr/bin/wg-quick up wg0
59 2 * * * /usr/bin/ping -c 4 10.8.0.1
|
In questo modo:
- La VPN si attiverà in automatico al boot di PBS
- Il backup, come si vedrà nei paragrafi successivi, inizierà alle ore 03:00. Tramite il ping, ci assicuriamo che la connessione sia effettivamente attiva, evitando che il servizio fallisca
VPS#
Installazione Proxmox Backup Client#
- Sul VPS, aggiungere i repository per installare
proxmox-backup-client
1
|
wget https://enterprise.proxmox.com/debian/proxmox-archive-keyring-trixie.gpg -O /usr/share/keyrings/proxmox-archive-keyring.gpg
|
- Creare il file
/etc/apt/sources.list.d/pbs-client.sources col seguente contenuto:
1
2
3
4
5
|
Types: deb
URIs: http://download.proxmox.com/debian/pbs-client
Suites: trixie
Components: main
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
|
- Installare infine il pacchetto col comando:
1
|
apt install proxmox-backup-client
|
Configurazione del servizio#
Come discusso abbondantemente nell’articolo su Proxmox Backup Server, creare il servizio proxmox-backup.service e il timer relativo. In particolare:
- Il servizio
/etc/systemd/system/proxmox-backup.service
1
2
3
4
5
6
7
8
9
10
|
[Unit]
Description=Proxmox Host Backup
[Service]
Type=oneshot
RemainAfterExit=no
EnvironmentFile=/etc/default/proxmox-backup
ExecStart=/usr/bin/proxmox-backup-client backup vps.pxar:/ --repository ${PBS_REPOSITORY} --backup-type host --keyfile ${PBS_ENCRYPTION_FILE} --backup-id ${ID}
StandardOutput=journal
StandardError=journal
ExecStartPost=/bin/bash -c 'EXIT_CODE=$?; DATE=$(date); if [ $EXIT_CODE -eq 0 ]; then curl -H "X-Tags: white_check_mark,daily-backup" -d "$DATE VPS Backup completed successfully!" $SERVER/$TOPIC; else curl -H "Priority: urgent" -H "X-Tags: warning,daily-backup" -d "$DATE VPS Backup ERROR!" $SERVER/$TOPIC; fi'
|
- Il timer
/etc/systemd/system/proxmox-backup.timer
1
2
3
4
5
6
7
|
[Unit]
Description=Daily Backup
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
|
- Le variabili
/etc/default/proxmox-backup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
PBS_REPOSITORY="user@pam@your-pbs-server:your-datastore"
PBS_PASSWORD="your-pbs-password"
PBS_FINGERPRINT="your-server-fingerprint"
PBS_ENCRYPTION_PASSWORD="your-backup-key-password"
# PBS_ENCRYPTION_PASSWORD: se impostata, questa variabile d’ambiente viene utilizzata per accedere alla encryption key /etc/proxmox/backup.key (se protetta da password)
PBS_ENCRYPTION_FILE="/etc/proxmox/backup.key"
ID="contabo-vps"
# ntfy
TOPIC=""
SERVER="https://ntfy.novemila.org"
# date
DATE="$(date +%d-%m-%Y) ore $(date +%H:%M:%S)"
TIMESTAMP="$(date +%d-%m-%Y_%H-%M)"
|
- Ricordarsi di impostare i permessi corretti al file appena creato:
chmod 600 /etc/default/proxmox-backup
- Creare la chiave di crittografia. Si consiglia di proteggerla con una password
1
2
3
4
5
6
|
mkdir /etc/proxmox
proxmox-backup-client key create /etc/proxmox/backup.key
Encryption Key Password: ********
Verify Password: ********
chmod 600 /etc/proxmox/backup.key
|
Importantissimo: salvarsi il contenuto del file /etc/proxmox/backup.key in un posto sicuro, altrimenti il restore non sarà possibile
- Avviare il timer col comando
systemctl enable --now proxmox-backup.timer
Backup#
- Per eseguire un backup manuale, semplicemente riavviare il servizio
systemctl restart proxmox-backup.service
- Se tutto é stato configurato in maniera corretta, arriverà una notifica sullo smartphone, simile alla seguente, al termine del backup
Se leggiamo i log sottostanti, possiamo notare che il backup:
- É stato avviato alle ore 16:03:30
- Ha terminato alle ore 16:33:50
- Sono stati trasferiti circa 38 GB
- Tempo impiegato circa 30 minuti
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[16:04 Sun Apr 05]root@vps (2403):~
> journalctl -u proxmox-backup.service -f
Apr 05 16:03:30 mail.novemila.org systemd[1]: Started proxmox-backup.service - Proxmox Host Backup.
Apr 05 16:03:30 mail.novemila.org proxmox-backup-client[1980573]: Starting backup: host/contabo-vps/2026-04-05T14:03:30Z
Apr 05 16:03:30 mail.novemila.org proxmox-backup-client[1980573]: Client name: mail
Apr 05 16:03:30 mail.novemila.org proxmox-backup-client[1980573]: Starting backup protocol: Sun Apr 5 16:03:30 2026
Apr 05 16:03:30 mail.novemila.org proxmox-backup-client[1980573]: Using encryption key from '/etc/proxmox/backup.key'..
Apr 05 16:03:30 mail.novemila.org proxmox-backup-client[1980573]: Encryption key fingerprint: 06:21:23:91:09:ba:3c:bd
Apr 05 16:03:30 mail.novemila.org proxmox-backup-client[1980573]: No previous manifest available.
Apr 05 16:03:30 mail.novemila.org proxmox-backup-client[1980573]: Upload directory '/' to 'vps-backup@pbs@10.8.0.5:8007:pbs-usb-pool' as contabo-vps.pxar.didx
Apr 05 16:03:31 mail.novemila.org proxmox-backup-client[1980573]: skipping mount point: "boot/efi"
Apr 05 16:03:31 mail.novemila.org proxmox-backup-client[1980573]: skipping mount point: "dev"
Apr 05 16:04:31 mail.novemila.org proxmox-backup-client[1980573]: processed 1.454 GiB in 1m, uploaded 1.377 GiB
Apr 05 16:05:31 mail.novemila.org proxmox-backup-client[1980573]: processed 2.243 GiB in 2m, uploaded 2.191 GiB
Apr 05 16:06:31 mail.novemila.org proxmox-backup-client[1980573]: processed 3.186 GiB in 3m, uploaded 3.139 GiB
|
Dalla seconda esecuzione, il tempo impiegato scende drasticamente:
- Avviato alle ore 16:40:02
- Terminato alle ore 16:47:33, impiegando circa7 minuti
Restore#
Il restore puó essere eseguito direttamente dal VPS oppure da una seconda macchina che però deve:
- Comunicare con PBS, nel quale risiedono fisicamente i backup
- Avere il contenuto del file
/etc/proxmox/backup.key
Ad esempio, se volessimo eseguire il restore di alcuni file sul nostro computer, dovremo:
- Creare il file
backup.key col contenuto di /etc/proxmox/backup.key
- Creare il file
proxmox-backup con le variabili correttamente valorizzate
1
2
3
4
|
root@pc:~/vps-restore# ls -lh
-rw------- 1 root root 384 Apr 12 15:19 backup.key
-rw------- 1 root root 351 Apr 12 15:23 proxmox-backup
|
- Per visualizzare la lista dei backup presenti eseguire il comando:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
source /path/to/proxmox-backup
proxmox-backup-client snapshot list --repository "$PBS_REPOSITORY"
Password for "vps-backup@pbs":
┌───────────────────────────────────────┬────────────┬───────────────────────────────────────────┐
│ snapshot │ size │ files │
╞═══════════════════════════════════════╪════════════╪═══════════════════════════════════════════╡
│ host/contabo-vps/2026-04-05T16:15:24Z │ 38.923 GiB │ catalog.pcat1 contabo-vps.pxar index.json │
├───────────────────────────────────────┼────────────┼───────────────────────────────────────────┤
├───────────────────────────────────────┼────────────┼───────────────────────────────────────────┤
│ host/contabo-vps/2026-04-10T01:00:02Z │ 40.37 GiB │ catalog.pcat1 contabo-vps.pxar index.json │
├───────────────────────────────────────┼────────────┼───────────────────────────────────────────┤
│ host/contabo-vps/2026-04-11T01:00:13Z │ 39.586 GiB │ catalog.pcat1 contabo-vps.pxar index.json │
└───────────────────────────────────────┴────────────┴───────────────────────────────────────────┘
|
- Per visualizzare il contenuto di un backup:
1
|
proxmox-backup-client catalog dum host/contabo-vps/2026-04-11T01:00:13Z --repository "$PBS_REPOSITORY" --keyfile "$PBS_ENCRYPTION_FILE"
|
- Per montare il backup in
/mnt/vps:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
proxmox-backup-client mount host/contabo-vps/2026-04-11T01:00:13Z contabo-vps.pxar /mnt/vps/ --repository "$PBS_REPOSITORY" --keyfile "$PBS_ENCRYPTION_FILE"
ls -lh /mnt/vps/
lrwxrwxrwx 1 root root 0 May 12 2025 bin -> usr/bin
drwxr-xr-x 2 root root 0 Mar 14 21:21 boot
drwxr-xr-x 2 root root 0 Apr 10 21:10 dev
drwxr-xr-x 2 root root 0 Apr 8 06:11 etc
drwxr-xr-x 2 root root 0 Mar 8 17:28 home
lrwxrwxrwx 1 root root 0 May 12 2025 lib -> usr/lib
lrwxrwxrwx 1 root root 0 May 12 2025 lib64 -> usr/lib64
drwx------ 2 root root 0 Aug 6 2025 lost+found
drwxr-xr-x 2 root root 0 Aug 6 2025 media
drwxr-xr-x 2 root root 0 Mar 8 16:29 mnt
drwxr-xr-x 2 root root 0 Mar 14 14:17 opt
dr-xr-xr-x 2 root root 0 Apr 10 21:10 proc
drwx------ 2 root root 0 Apr 11 01:30 root
drwxr-xr-x 2 root root 0 Apr 11 00:26 run
lrwxrwxrwx 1 root root 0 May 12 2025 sbin -> usr/sbin
drwxr-xr-x 2 root root 0 Aug 6 2025 srv
dr-xr-xr-x 2 root root 0 Apr 10 21:10 sys
drwxrwxrwt 2 root root 0 Apr 11 03:00 tmp
drwxr-xr-x 2 root root 0 Aug 6 2025 usr
drwxr-xr-x 2 root root 0 Mar 7 16:13 var
|
- Ora risulta semplice copiare i file e le directory di interesse nel path di destinazione
1
|
cp -a /mnt/vps/var/lib/docker/volumes/* /var/lib/docker/volumes/
|
PBS mantiene permessi e proprietario originale di file e directory
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
root@pc:~# ll /var/lib/docker/volumes/nextcloud_aio_database/_data/
drwx------ 1 dnsmasq systemd-journal 16 Jun 13 2025 base
drwx------ 1 dnsmasq systemd-journal 648 Apr 10 21:11 global
drwx------ 1 dnsmasq systemd-journal 0 Jun 13 2025 pg_commit_ts
drwx------ 1 dnsmasq systemd-journal 0 Jun 13 2025 pg_dynshmem
-rw------- 1 dnsmasq systemd-journal 5.7K Jun 13 2025 pg_hba.conf
-rw------- 1 dnsmasq systemd-journal 2.6K Jun 13 2025 pg_ident.conf
drwx------ 1 dnsmasq systemd-journal 76 Apr 11 03:16 pg_logical
drwx------ 1 dnsmasq systemd-journal 28 Jun 13 2025 pg_multixact
drwx------ 1 dnsmasq systemd-journal 0 Jun 13 2025 pg_notify
drwx------ 1 dnsmasq systemd-journal 0 Jun 13 2025 pg_replslot
drwx------ 1 dnsmasq systemd-journal 0 Jun 13 2025 pg_serial
drwx------ 1 dnsmasq systemd-journal 0 Jun 13 2025 pg_snapshots
drwx------ 1 dnsmasq systemd-journal 0 Apr 10 21:11 pg_stat
drwx------ 1 dnsmasq systemd-journal 0 Jun 13 2025 pg_stat_tmp
drwx------ 1 dnsmasq systemd-journal 8 Apr 8 10:34 pg_subtrans
drwx------ 1 dnsmasq systemd-journal 0 Jun 13 2025 pg_tblspc
drwx------ 1 dnsmasq systemd-journal 0 Jun 13 2025 pg_twophase
-rw------- 1 dnsmasq systemd-journal 3 Jun 13 2025 PG_VERSION
drwx------ 1 dnsmasq systemd-journal 142 Apr 10 23:46 pg_wal
drwx------ 1 dnsmasq systemd-journal 72 Mar 3 14:15 pg_xact
-rw------- 1 dnsmasq systemd-journal 88 Jun 13 2025 postgresql.auto.conf
-rw------- 1 dnsmasq systemd-journal 30K Apr 10 21:11 postgresql.conf
-rw------- 1 dnsmasq systemd-journal 24 Apr 10 21:11 postmaster.opts
|
- Ad esempio, possiamo osservare i log del database postgresql di Nextcloud AIO che, migrato su un’altro server, si avvia correttamente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
docker logs nextcloud-aio-database
PostgreSQL Database directory appears to contain a database; Skipping initialization
2026-04-12 16:03:43.524 CEST [14] LOG: starting PostgreSQL 17.9 on x86_64-pc-linux-musl, compiled by gcc (Alpine 15.2.0) 15.2.0, 64-bit
2026-04-12 16:03:43.524 CEST [14] LOG: listening on IPv4 address "0.0.0.0", port 5432
2026-04-12 16:03:43.524 CEST [14] LOG: listening on IPv6 address "::", port 5432
2026-04-12 16:03:43.525 CEST [14] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2026-04-12 16:03:43.529 CEST [24] LOG: database system was interrupted; last known up at 2026-04-11 03:16:24 CEST
2026-04-12 16:03:43.549 CEST [24] LOG: database system was not properly shut down; automatic recovery in progress
2026-04-12 16:03:43.551 CEST [24] LOG: redo starts at 4/EB52CD98
2026-04-12 16:03:43.551 CEST [24] LOG: invalid record length at 4/EB52CED8: expected at least 24, got 0
2026-04-12 16:03:43.551 CEST [24] LOG: redo done at 4/EB52CEA0 system usage: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s
2026-04-12 16:03:43.567 CEST [14] LOG: database system is ready to accept connections
|
Shell interattiva#
Esiste anche la possibilitá di ripristinare i file interattivamente:
1
2
3
|
source /path/to/proxmox-backup
proxmox-backup-client catalog shell host/contabo-vps/2026-04-05T14:40:02Z contabo-vps.pxar --repository "$PBS_REPOSITORY" --keyfile "$PBS_ENCRYPTION_FILE"
|
Interessante e utile la GUI interattiva PBS Browser per visualizzare ed eseguire il restore dei vari backup.
Per maggiori informazioni sul processo di restore, si rimanda alla documentazione ufficiale.
Riferimenti#