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
  • Avviare su PBS la VPN:
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, un Namespace 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
11
12
13
14
15
16
17
18
[Unit]
Description=Proxmox Host Backup
OnFailure=failure-pbs-notification.service

[Service]
Type=oneshot
RemainAfterExit=no
EnvironmentFile=/etc/default/proxmox-backup
ExecStart=/usr/bin/proxmox-backup-client backup \
  contabo-vps.pxar:/ \
  --repository ${PBS_REPOSITORY} \
  --backup-type host \
  --ns ${PBS_NAMESPACE} \
  --keyfile ${PBS_ENCRYPTION_FILE} \
  --backup-id ${ID}
StandardOutput=journal
StandardError=journal
ExecStartPost=/bin/bash -c 'DATE=$(date); curl -H "X-Tags: white_check_mark,daily-backup" -d "$DATE VPS Backup completed successfully!" $SERVER/$TOPIC'
  • Nel caso il servizio fallisse, viene eseguito failure-pbs-notification.service:
1
2
3
4
5
6
7
8
[Unit]
Description=Send a push notification whenever proxmox-backup.service fails
After=network.target

[Service]
Type=simple
EnvironmentFile=/etc/default/proxmox-backup
ExecStart=/bin/bash -c 'DATE=$(date); curl -H "Priority: urgent" -H "X-Tags: warning,daily-backup" -d "$DATE VPS Backup ERROR!" $SERVER/$TOPIC'
  • 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
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"
PBS_NAMESPACE='contabo-vps'
ID="contabo-vps"

# ntfy
TOPIC=""
SERVER="https://ntfy.novemila.org"
  • 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

backup-ntfy

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

pbs-network-traffic

Restore

Per uno script automatico, che si occupa di montare il backup desiderato sulla propria macchina, fare riferimento al post dedicato.

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