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 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

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

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