Cybersécurité

Backup VPS complet avec Restic : tutoriel 2026

13 min de lecture

Tutoriel pratique pour configurer un backup VPS complet avec Restic vers un stockage distant en 2026 (informations vérifiées en avril 2026, susceptibles d’évoluer).

Voir notre guide Restic complet.

Architecture proposée

  • VPS Hetzner CX23 (4 €/mois)
  • Backups Restic vers Backblaze B2 (~6 USD/To/mois)
  • Backup quotidien à 03h00 UTC
  • Rétention 7d-4w-12m
  • Test restauration mensuel sur VPS staging

Étape 1 — Lister ce qu’il faut backuper

  • /etc/ — config système
  • /home/ — homes utilisateurs
  • /var/www/ — sites web statiques (uploads notamment)
  • /var/lib/postgresql/ ou via pg_dump — bases
  • /opt/ — applis manuelles
  • /etc/letsencrypt/ ou config Caddy avec certs
  • /var/lib/coolify/ si Coolify hôte

Étape 2 — Pre-backup hook PostgreSQL

# /usr/local/bin/pg-pre-backup.sh
#!/bin/bash
mkdir -p /var/backups/pg
sudo -u postgres pg_dumpall --clean --if-exists | gzip > /var/backups/pg/all-databases.sql.gz

Étape 3 — Script backup principal

# /usr/local/bin/backup.sh
#!/bin/bash
set -e

# Variables d'env
source /root/.restic.env

# Pre-backup
/usr/local/bin/pg-pre-backup.sh

# Backup
restic backup \
    /etc \
    /home \
    /var/www \
    /var/backups/pg \
    /opt/myapp \
    --exclude='**/node_modules' \
    --exclude='**/.cache' \
    --tag daily

# Forget + prune
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune

# Vérification intégrité (~2 min/jour)
restic check --read-data-subset=2%

# Notification optionnelle
curl -fsS https://uptime-kuma.exemple.sn/api/push/abc123?status=up&msg=BackupOK

Étape 4 — Permissions et cron

chmod +x /usr/local/bin/backup.sh
chmod 600 /root/.restic.env

# Cron quotidien
echo "0 3 * * * /usr/local/bin/backup.sh >> /var/log/restic-backup.log 2>&1" | crontab -

Étape 5 — Monitoring

  • Push heartbeat vers Uptime Kuma à la fin du script
  • Si pas de heartbeat dans les 25h, Uptime Kuma alerte
  • Logs persistants pour debug

Pour creuser ce sujet

Hostinger pour vos premiers déploiements

Le panel hPanel reste l’un des plus accessibles du marché pour les débutants en self-hosting.

Découvrir hPanel →

Lien d affiliation. Si vous achetez via ce lien, le blog reçoit une petite commission sans surcoût pour vous.

Pourquoi Restic pour un VPS hébergé en Afrique de l’Ouest

La plupart des PME ouest-africaines hébergent leurs applications sur un VPS Hetzner, OVH, Contabo ou Scaleway facturé entre 4 et 12 EUR (2 600 à 7 900 FCFA) par mois. Une seule panne disque, une commande rm -rf mal placée ou un ransomware peut tout effacer. Restic est un outil de sauvegarde open source écrit en Go qui chiffre, déduplique et compresse vos données avant de les pousser vers un stockage objet (Backblaze B2, Wasabi, Scaleway Object Storage, AWS S3 ou un MinIO auto-hébergé à Dakar). Tout est protégé par AES-256 et la clé reste sur le VPS — même si l’hébergeur du bucket est compromis, vos données restent illisibles.

Avant d’attaquer ce tutoriel, vous devez avoir un VPS Linux (Debian 12 ou Ubuntu 24.04 LTS recommandés), un accès SSH avec un utilisateur sudo, et un compte sur un fournisseur de stockage objet. Pour un projet sénégalais ou ivoirien, Backblaze B2 est imbattable : 6 USD (3 935 FCFA) par To et par mois, sans frais d’egress jusqu’à 3 fois le volume stocké. Wasabi facture 6,99 USD le To sans aucun frais de sortie, idéal si vous restaurez souvent.

Étape 1 — Installer Restic depuis le binaire officiel

Le paquet Debian/Ubuntu est souvent en retard. On télécharge la version 0.17.x officielle directement depuis GitHub pour avoir les dernières optimisations de compression zstd.

cd /tmp
curl -L https://github.com/restic/restic/releases/download/v0.17.3/restic_0.17.3_linux_amd64.bz2 -o restic.bz2
bzip2 -d restic.bz2
sudo install -m 0755 restic /usr/local/bin/restic
restic version

La dernière commande doit afficher restic 0.17.3 compiled with go1.23 on linux/amd64. Si Go affiche une version inférieure à 1.22, vous avez téléchargé un vieux binaire — recommencez. Sur un VPS ARM (Hetzner CAX11 à 4,51 EUR/mois soit 2 960 FCFA), remplacez amd64 par arm64.

Étape 2 — Créer un bucket et générer des clés d’accès

Sur Backblaze B2, créez un bucket privé nommé par exemple backup-vps-dakar. Générez ensuite une Application Key restreinte à ce bucket avec les permissions listFiles, readFiles, writeFiles, deleteFiles. Ne jamais utiliser la Master Key — si elle fuit, l’attaquant peut supprimer tous vos buckets.

Stockez les identifiants dans un fichier d’environnement /root/.restic.env en mode 0600 :

sudo tee /root/.restic.env > /dev/null <<'EOF'
export B2_ACCOUNT_ID="000xxxxxxxxxxxx"
export B2_ACCOUNT_KEY="K000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
export RESTIC_REPOSITORY="b2:backup-vps-dakar:/srv"
export RESTIC_PASSWORD="GENEREZ_UN_MOT_DE_PASSE_LONG_ALEATOIRE"
EOF
sudo chmod 600 /root/.restic.env

Le mot de passe Restic chiffre les snapshots ; sans lui, aucune restauration possible — copiez-le aussi dans un gestionnaire de mots de passe hors ligne (Bitwarden, KeePassXC).

Étape 3 — Initialiser le dépôt

L’initialisation crée la structure cryptographique (un fichier config chiffré et le keyring) dans le bucket. Elle ne se fait qu’une seule fois.

source /root/.restic.env
restic init

Vous devez voir created restic repository xxxxxxxxxx at b2:backup-vps-dakar:/srv. Si l’erreur est Fatal: create key in repository: ... 401 Unauthorized, vérifiez que la Application Key a bien la permission writeFiles et que le bucket existe.

Étape 4 — Premier snapshot avec exclusions intelligentes

Sur un VPS de production, on sauvegarde /etc, /home, /var/www, /var/lib/docker/volumes et /srv, en excluant les caches et fichiers volatils :

sudo tee /root/restic-excludes.txt > /dev/null <<'EOF'
**/cache
**/tmp
**/.cache
**/node_modules
**/__pycache__
*.log
*.tmp
EOF

source /root/.restic.env
restic backup /etc /home /var/www /var/lib/docker/volumes /srv   --exclude-file=/root/restic-excludes.txt   --tag prod --tag $(hostname)

Le premier snapshot prend du temps (compter 1 heure pour 20 Go sur une connexion 100 Mbps). Restic affiche en temps réel Files: X new ... Added to the repository: Y MiB. À la fin, notez l’ID du snapshot — c’est votre point de restauration.

Étape 5 — Automatiser avec systemd timer (pas de cron)

Systemd timer remplace cron avec de meilleurs logs, un suivi via journalctl et des relances en cas d’échec. On crée d’abord le service :

sudo tee /etc/systemd/system/restic-backup.service > /dev/null <<'EOF'
[Unit]
Description=Sauvegarde Restic du VPS
After=network-online.target

[Service]
Type=oneshot
EnvironmentFile=/root/.restic.env
ExecStart=/usr/local/bin/restic backup /etc /home /var/www /var/lib/docker/volumes /srv --exclude-file=/root/restic-excludes.txt --tag prod --tag %H
ExecStartPost=/usr/local/bin/restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
Nice=10
IOSchedulingClass=best-effort
IOSchedulingPriority=7
EOF

sudo tee /etc/systemd/system/restic-backup.timer > /dev/null <<'EOF'
[Unit]
Description=Lance la sauvegarde Restic chaque nuit

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
RandomizedDelaySec=600

[Install]
WantedBy=timers.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now restic-backup.timer

Le timer déclenche la sauvegarde chaque nuit à 02h30 GMT (heure de Dakar et Abidjan), avec un délai aléatoire de 0 à 10 minutes pour ne pas saturer Backblaze si vous gérez plusieurs VPS. ExecStartPost applique la politique de rétention : on garde 7 sauvegardes quotidiennes, 4 hebdomadaires, 6 mensuelles. Vérifiez l’activation avec systemctl list-timers restic-backup.timer.

Étape 6 — Tester une restauration (sinon ce n’est pas un backup)

Une sauvegarde non testée n’est qu’une croyance. Lancez chaque mois une restauration partielle dans /tmp pour valider l’intégrité :

source /root/.restic.env
restic snapshots
restic restore latest --target /tmp/restore-test --include /etc/nginx
ls /tmp/restore-test/etc/nginx/sites-available/
sudo rm -rf /tmp/restore-test

Si les fichiers Nginx restaurés sont identiques à /etc/nginx/sites-available/ en production (vérifiez avec diff -r), votre chaîne complète fonctionne. Programmez aussi un restic check --read-data-subset=10% mensuel pour détecter une corruption silencieuse du bucket.

Étape 7 — Surveiller les sauvegardes avec un webhook

Si une sauvegarde échoue silencieusement pendant trois semaines, vous le découvrez le jour de la panne. Ajoutez un OnFailure dans le service systemd qui pousse une alerte vers un webhook (n8n, Discord, ou un canal WhatsApp Business via votre outil habituel) :

sudo tee /etc/systemd/system/restic-alert@.service > /dev/null <<'EOF'
[Unit]
Description=Alerte échec Restic pour %i

[Service]
Type=oneshot
ExecStart=/usr/bin/curl -X POST -H 'Content-Type: application/json'   -d '{"text":"Echec Restic sur '$(hostname)' - service %i"}'   https://VOTRE_WEBHOOK_URL
EOF

Ajoutez ensuite OnFailure=restic-alert@%n.service dans la section [Unit] de restic-backup.service et rechargez systemd. Vous recevrez désormais une notification dès qu’un backup échoue.

Étape 8 — Coûts réels et budget mensuel

Pour un VPS typique d’agence à Dakar (50 Go de données utiles, 3 mois de rétention soit environ 75 Go stockés après déduplication), le coût Backblaze B2 tourne autour de 0,45 USD par mois (295 FCFA). Avec un VPS Hetzner CX22 à 4,51 EUR (2 960 FCFA), votre infrastructure complète et sauvegardée coûte moins de 3 300 FCFA mensuels. Comparez à une perte de données après piratage : reconstruire un site WooCommerce de 800 produits prend 80 heures à 25 000 FCFA l’heure, soit 2 millions de FCFA. Le ROI d’un Restic bien configuré se compte en heures.

Pour étoffer le tableau

Cette base couvre 90 % des besoins. Si vous gérez plusieurs serveurs, déléguez la planification à un orchestrateur léger comme Uptime Kuma pour la supervision et complétez par Docker Compose en production pour cadrer les volumes à sauvegarder. Pour un parc de plus de 10 VPS, regardez Resticprofile (wrapper Go), Autorestic (config YAML) ou backrest (UI web). Tout cela reste compatible avec le dépôt Restic créé ici — la portabilité est le principal atout du format.

Restaurer un VPS entier sur une nouvelle machine

Le scénario du pire : votre VPS principal est compromis ou supprimé par l’hébergeur. Vous louez un nouveau serveur, le partitionnez, installez Debian, recréez l’utilisateur sudo, puis lancez la procédure de restauration complète. Comme la clé Restic et les identifiants Backblaze sont stockés dans votre gestionnaire de mots de passe hors ligne, vous reprenez la main sans dépendre du serveur originel.

sudo apt update && sudo apt install -y curl bzip2
cd /tmp
curl -L https://github.com/restic/restic/releases/download/v0.17.3/restic_0.17.3_linux_amd64.bz2 -o restic.bz2
bzip2 -d restic.bz2 && sudo install -m 0755 restic /usr/local/bin/restic

export B2_ACCOUNT_ID="..."
export B2_ACCOUNT_KEY="..."
export RESTIC_REPOSITORY="b2:backup-vps-dakar:/srv"
export RESTIC_PASSWORD="..."

restic snapshots --tag prod --host ancien-serveur
restic restore latest --target /

L’opération restaure les fichiers à leur emplacement d’origine. Comptez environ 45 minutes pour 30 Go sur une connexion 200 Mbps. Une fois la restauration terminée, redémarrez les services concernés (systemctl restart nginx docker postgresql) et vérifiez que vos applications répondent.

Bonnes pratiques de gestion des clés

Trois règles à graver au mur de votre bureau. Premièrement, le mot de passe Restic ne doit JAMAIS être stocké uniquement sur le VPS sauvegardé — sinon une compromission supprime à la fois données et clé. Deuxièmement, créez une seconde Application Key Backblaze restreinte en lecture seule pour des audits et des restaurations partielles depuis votre poste local : si elle fuit, l’attaquant peut lire mais pas effacer. Troisièmement, activez le mode Object Lock sur Backblaze (3 USD le To pour la rétention immuable) pour bloquer toute suppression pendant 30 jours, même par un administrateur compromis. C’est l’arme anti-ransomware par excellence.

Alternative budget : MinIO auto-hébergé à Dakar

Si vous voulez garder vos données dans un datacenter local (Sonatel Orange Business à Diamniadio, Wakanet Tier III), installez MinIO sur un second VPS et utilisez-le comme cible Restic via le protocole S3. Variables d’environnement adaptées :

export AWS_ACCESS_KEY_ID="VOTRE_CLE_MINIO"
export AWS_SECRET_ACCESS_KEY="VOTRE_SECRET_MINIO"
export RESTIC_REPOSITORY="s3:https://minio.exemple.sn/backup-vps"
export RESTIC_PASSWORD="..."
restic init

Le coût dépend du VPS qui héberge MinIO (compter 8 EUR / 5 250 FCFA pour 200 Go SSD chez Hetzner). L’avantage : latence réduite à 5 ms depuis Dakar contre 180 ms pour Backblaze EU, donc restaurations 10 fois plus rapides.

Restaurer un VPS entier sur une nouvelle machine

Le scénario du pire : votre VPS principal est compromis ou supprimé par l’hébergeur. Vous louez un nouveau serveur, le partitionnez, installez Debian, recréez l’utilisateur sudo, puis lancez la procédure de restauration complète. Comme la clé Restic et les identifiants Backblaze sont stockés dans votre gestionnaire de mots de passe hors ligne, vous reprenez la main sans dépendre du serveur originel.

sudo apt update && sudo apt install -y curl bzip2
cd /tmp
curl -L https://github.com/restic/restic/releases/download/v0.17.3/restic_0.17.3_linux_amd64.bz2 -o restic.bz2
bzip2 -d restic.bz2 && sudo install -m 0755 restic /usr/local/bin/restic

export B2_ACCOUNT_ID="..."
export B2_ACCOUNT_KEY="..."
export RESTIC_REPOSITORY="b2:backup-vps-dakar:/srv"
export RESTIC_PASSWORD="..."

restic snapshots --tag prod --host ancien-serveur
restic restore latest --target /

L’opération restaure les fichiers à leur emplacement d’origine. Comptez environ 45 minutes pour 30 Go sur une connexion 200 Mbps. Une fois la restauration terminée, redémarrez les services concernés (systemctl restart nginx docker postgresql) et vérifiez que vos applications répondent.

Bonnes pratiques de gestion des clés

Trois règles à graver au mur de votre bureau. Premièrement, le mot de passe Restic ne doit jamais être stocké uniquement sur le VPS sauvegardé — sinon une compromission supprime à la fois données et clé. Deuxièmement, créez une seconde Application Key Backblaze restreinte en lecture seule pour des audits et des restaurations partielles depuis votre poste local : si elle fuit, l’attaquant peut lire mais pas effacer. Troisièmement, activez le mode Object Lock sur Backblaze (3 USD le To pour la rétention immuable) pour bloquer toute suppression pendant 30 jours, même par un administrateur compromis. C’est l’arme anti-ransomware par excellence.

Alternative budget : MinIO auto-hébergé à Dakar

Si vous voulez garder vos données dans un datacenter local (Sonatel Orange Business à Diamniadio, Wakanet Tier III), installez MinIO sur un second VPS et utilisez-le comme cible Restic via le protocole S3. Variables d’environnement adaptées :

export AWS_ACCESS_KEY_ID="VOTRE_CLE_MINIO"
export AWS_SECRET_ACCESS_KEY="VOTRE_SECRET_MINIO"
export RESTIC_REPOSITORY="s3:https://minio.exemple.sn/backup-vps"
export RESTIC_PASSWORD="..."
restic init

Le coût dépend du VPS qui héberge MinIO (compter 8 EUR / 5 250 FCFA pour 200 Go SSD chez Hetzner). L’avantage : latence réduite à 5 ms depuis Dakar contre 180 ms pour Backblaze EU, donc restaurations 10 fois plus rapides depuis votre bureau à Plateau ou Almadies.

Optimisations avancées de performance

Sur un VPS modeste avec 2 vCPU, le chiffrement et la déduplication peuvent saturer le processeur. Trois leviers réduisent l’impact. D’abord, la flag --compression max active zstd niveau 22 — utile pour des bases de données mais coûteux en CPU. Préférez --compression auto par défaut. Ensuite, --pack-size 32 augmente la taille des packs à 32 Mio (par défaut 16) ce qui réduit le nombre de requêtes HTTP vers Backblaze de moitié et accélère la sauvegarde sur connexions à forte latence. Enfin, GOMAXPROCS=2 restic backup limite Restic à 2 cœurs pour ne pas affamer Nginx ou PostgreSQL en pleine journée.

GOMAXPROCS=2 restic backup /var/www   --pack-size 32   --compression auto   --exclude-file=/root/restic-excludes.txt

Sur un test réel avec 40 Go de fichiers WordPress, ces options ont fait passer la sauvegarde de 38 minutes à 22 minutes, et la charge moyenne du VPS de 3,8 à 1,4 — différence visible immédiatement dans Netdata ou Glances.

Partager