Background image: Matthieu's World Background image: Matthieu's World
Social Icons

Sauvegarder ses VPS sans Coolify : le script maison

5 min de lecture
Par Matthieu Cousin

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 profil scaleway 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 ✌️