Table des matières
Coolify, c’est super pratique pour déployer des services ou même pour sauvegarder ses données sans toucher à une seule ligne de code, grâce à son intégration intelligente avec le S3 storage.
D’ailleurs, j’ai déjà écrit un article complet sur comment automatiser la sauvegarde d’un VPS avec Coolify.
Mais si tu veux garder la main, comprendre ce que tu fais, ou tout simplement éviter les outils tout-en-un, voici un autre chemin : un script 100 % personnalisé.
Honnêtement, je ne l’utilise plus. J’ai choisi la simplicité et la légèreté côté stockage.Mais comme je l’ai conçu et testé de fond en comble, autant qu’il serve à quelqu’un d’autre.
Si tu as des besoins différents des miens, ce script pourrait bien te sauver la mise.
Système de Sauvegarde des Volumes Docker sur VPS avec Backup vers S3
Ce guide explique pas à pas la mise en place d’un système de sauvegarde complet pour plusieurs VPS agents, en utilisant un VPS maître comme point central. Chaque agent archive ses volumes Docker, envoie l'archive au maître, qui la transfère ensuite dans un bucket S3 (Scaleway).
🌐 Vue d'ensemble du système
- VPS Agents : exécution d’un script de backup local sur chaque machine
- VPS Maître :
- déclenche les sauvegardes sur les agents (via SSH)
- centralise les fichiers
- les transfère vers S3 dans des sous-dossiers distincts

Pré-requis
- Un VPS maître capable de se connecter aux agents via SSH (ex:
ssh vps-agent
fonctionne) - Des VPS agents avec Docker installé. Qui tournent sur coolify de préférence
- Un bucket Scaleway S3 déjà configuré
aws-cli
installé sur le VPS maître avec un profilscaleway
fonctionnel
1. 📦 Sur chaque VPS Agent : création du script d’archivage
1. Créer le dossier de sauvegarde sur chaque agent
sudo mkdir -p /opt/backup
2. Créer le script /opt/backup/backup_all_volumes.sh
sudo nano /opt/backup/backup_all_volumes.sh
A coller dans le fichier
#!/bin/bash
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
ARCHIVE_PATH="/tmp/backup.tar.gz"
echo "🔍 Récupération des chemins des volumes..."
VOLUMES=$(docker volume ls -q)
VOLUME_PATHS=()
for volume in $VOLUMES; do
MOUNTPOINT=$(docker volume inspect "$volume" | grep Mountpoint | awk -F'"' '{print $4}')
if [ -d "$MOUNTPOINT" ]; then
echo "➕ Ajout du volume : $volume ($MOUNTPOINT)"
VOLUME_PATHS+=("$MOUNTPOINT")
fi
done
if [ ${#VOLUME_PATHS[@]} -eq 0 ]; then
echo "❌ Aucun chemin valide à sauvegarder."
exit 1
fi
echo "🧹 Suppression de l’ancienne archive $ARCHIVE_PATH..."
rm -f "$ARCHIVE_PATH"
echo "📦 Création de la nouvelle archive dans $ARCHIVE_PATH"
tar czf "$ARCHIVE_PATH" "${VOLUME_PATHS[@]}"
echo "✅ Archive terminée"
✅ Rendre le script exécutable :
sudo chmod +x /opt/backup/backup_all_volumes.sh
🚀 Tester le script
sudo /opt/backup/backup_all_volumes.sh
Vérifie que /tmp/backup.tar.gz
est bien créé, et qu’il contient bien tous les volumes nécessaires.
2. 🤝 Connexion SSH rapide depuis le VPS maître
Sur le VPS maître, ajoute dans ~/.ssh/config
:
commande pour accéder à ssh config
sudo nano ~/.ssh/config
Host vps-agent
HostName <IP_AGENT_1>
User TONUSER
IdentityFile ~/.ssh/id_rsa
Host vps-agent2
HostName <IP_AGENT_2>
User TONUSER
IdentityFile ~/.ssh/id_rsa
Teste les connexions :
ssh vps-agent
ssh vps-agent2
3. 📥 Récupération et envoi S3 depuis le VPS maître
1. ✅ Installer la version 2 de awscli depuis le site officiel
Préférez la version 2 plutôt que la version 1
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
C'est ce qui va nous permettre de communiquer avec notre S3 Storage.
2. 🔎 Vérifier la version installée
aws --version
Tu dois obtenir un retour comme :
aws-cli/2.15.X Python/3.X.X Linux/x86_64
3. 🔐 Configurer le profil Scaleway
On configure tout bêtement l'endroit où on va envoyer les fichiers ainsi que nos identifiants.
Crée les fichiers de configuration AWS :
mkdir -p ~/.aws
nano ~/.aws/config
Contenu :
[default]
region = fr-par
output = json
[profile scaleway]
region = fr-par
output = json
Puis :
nano ~/.aws/credentials
Contenu :
[scaleway]
aws_access_key_id = VOTRE_ID
aws_secret_access_key = VOTRE_SECRET
4. Tester la connexion
aws s3 ls --profile scaleway --endpoint-url https://s3.fr-par.scw.cloud
Script d’envoi vers S3 sur le VPS maître
Créer le script
nano /opt/scripts/backups/send_all_backups_to_s3.sh
#!/bin/bash
BUCKET="NOM DU BACKUP"
ENDPOINT="https://s3.fr-par.scw.cloud"
PROFILE="scaleway"
SLOT="slot$(date +%d).tar.gz"
ROOT="/backups"
echo "📤 Envoi des backups du jour : $SLOT"
echo "📂 Racine : $ROOT"
for dir in $ROOT/*; do
VPS_NAME=$(basename "$dir")
FILE="$dir/$SLOT"
LOG_FILE="/var/log/backup_${VPS_NAME}.log"
echo "📦 [$VPS_NAME] Tentative d'envoi de $SLOT" | tee -a "$LOG_FILE"
if [ -f "$FILE" ]; then
aws s3 cp "$FILE" \
"s3://$BUCKET/$VPS_NAME/$SLOT" \
--endpoint-url "$ENDPOINT" \
--profile "$PROFILE" && \
echo "✅ [$VPS_NAME] Envoi réussi." | tee -a "$LOG_FILE" || \
echo "❌ [$VPS_NAME] Échec de l'envoi." | tee -a "$LOG_FILE"
else
echo "ℹ️ [$VPS_NAME] Aucun fichier à envoyer aujourd'hui." | tee -a "$LOG_FILE"
fi
done
2. Rendre le script exécutable
sudo chmod +x /opt/scripts/backups/send_all_backups_to_s3.sh
Étape 4 : Script maître pour lancer tout depuis un seul point
📁 Script principal : récupère les back up sur les VPS agent et exécute l'envoie vers le S3 storage
commande pour créer le fichier de script
nano /opt/scripts/backups/run_full_backup.sh
#!/bin/bash
set -euo pipefail
BACKUP_NAME="slot$(date +%d).tar.gz"
BACKUP_ROOT="/backups"
AGENTS=(vps-agent vps-agent2)
echo "\U0001F680 Lancement du backup global - $BACKUP_NAME"
for AGENT in "${AGENTS[@]}"; do
echo "\U0001F6F0️ [$AGENT] Connexion et lancement du script de sauvegarde..."
ssh "$AGENT" "sudo /opt/backup/backup_all_volumes.sh"
mkdir -p "$BACKUP_ROOT/$AGENT"
echo "\U0001F4E5 [$AGENT] Transfert du fichier vers le VPS maître..."
scp "$AGENT:/tmp/backup.tar.gz" "$BACKUP_ROOT/$AGENT/$BACKUP_NAME" || echo "❌ [$AGENT] Échec du transfert. On passe au suivant."
done
# Appel du script S3
/opt/scripts/backups/send_all_backups_to_s3.sh
echo "✅ Script global terminé."
2. Rendre le script exécutable
sudo chmod +x /opt/scripts/backups/run_full_backup.sh
Usage manuel (permet de tester)
Tu peux simplement lancer :
sudo /opt/scripts/backups/run_full_backup.sh
Cela lancera la sauvegarde sur chaque VPS, centralisera les fichiers, puis les enverra vers ton bucket Scaleway.
Tu peux vérifier que ton bucket Scaleway contient bien les sauvegarde après exécution du script.
Étape 5 (optionnelle) : Planification automatique avec Cron
1. Ouvrir le fichier crontab
crontab -e
2. Ajouter la ligne suivante pour une exécution chaque nuit à 2h
0 2 * * * /opt/scripts/backups/run_full_backup.sh >> /var/log/full_backup.log 2>&1
✅ Résultat final
- Chaque VPS agent archive ses volumes Docker →
/tmp/backup.tar.gz
- Le VPS maître les récupère et les stocke localement →
/backups/agent-name/slotXX.tar.gz
- Puis les envoie vers Scaleway S3 →
s3://coolify85-backup/agent-name/slotXX.tar.gz
Tu peux à tout moment :
- Relancer le script manuellement,
- Auditer les logs (
/var/log/backup_*.log
), - Re-télécharger une archive spécifique depuis S3 si nécessaire.
Remarques
- Les archives sur les VPS agents sont écrasées chaque jour, donc peu de stockage utilisé. Il y a toujours UN SEUL fichier de sauvegarde sur le VPS agent, le dernier exporté
- Les archives sur le VPS maître sont écrasées chaque jour aussi. Mais comme les noms changent, il y a 30 copies qui sont conservées en tout et qui tournent
- Le script est modulaire : tu peux facilement ajouter un nouveau VPS à la liste.
🌟 Conclusion
Ce script n’est peut-être pas le plus sexy, mais il est transparent, efficace, et 100 % adapté à mon infrastructure multi-VPS.
Si tu veux te l’approprier, adapte les chemins, les profils, les noms d’hôte.
Besoin d’un coup de main pour cette partie technique ?
Je sais que parfois, même bien expliqué, un workflow reste intimidant.
Si tu préfères qu’on le mette en place ensemble, contacte-moi : je suis freelance en automatisation, et je peux t’aider à passer de “je devrais le faire” à “c’est déjà en place”.
Sinon, continue de piocher dans les ressources du site, elles sont faites pour ça ✌️