--- title: Docker Volume Backup created: 2026-06-07 updated: 2026-06-07 type: app tags: [catalogue, docker, container, backup, volume, s3, ssh, cron] confidence: high contested: false sources: [https://selfh.st/apps/?tag=Docker, https://github.com/offen/docker-volume-backup] --- # 🐳 Docker Volume Backup > **Le backup automatisé de volumes Docker multi-destinations** — S3, SSH, local, exécuté en cron dans un conteneur léger. ## 📋 Informations Générales | Champ | Valeur | | :--- | :--- | | **Site web** | [offen.github.io/docker-volume-backup](https://offen.github.io/docker-volume-backup/) | | **GitHub** | [offen/docker-volume-backup](https://github.com/offen/docker-volume-backup) | | **License** | MIT | | **Langage** | Go | | **Étoiles GitHub** | 3,6k ⭐ | | **Dernière MAJ** | 2026-06-07 | | **Catégorie** | [[cat-docker\|Docker]] | ## 📝 Description **Docker Volume Backup** (souvent appelé *offen/docker-volume-backup*) est un **conteneneur utilitaire** dont le seul rôle est de **sauvegarder régulièrement les volumes Docker** de votre homelab vers une destination au choix : **local**, **S3** (AWS, MinIO, Backblaze B2, Wasabi, Scaleway…), **SSH** (rsync sur un serveur distant), ou **WebDAV**. Conçu par les mainteneurs de Offen (suite d'analytics self-hosted), il est devenu un standard de la communauté. Chaque sauvegarde crée une **archive tar.gz horodatée** (avec un nom explicite du conteneur et du volume), et applique automatiquement une **rotation** (garder les N dernières, supprimer les plus vieilles). L'outil supporte les **backups incrémentaux via restic** et le chiffrement AES-256 au repos. - ✅ **Backups automatisés** par cron interne (configurable) - ✅ **Multi-destinations** : local, S3, SSH/SFTP, WebDAV (et combos) - ✅ **Multi-volumes** : un ou plusieurs volumes par conteneur - ✅ **Backups par labels** : `docker-volume-backup.daily` ou `weekly` - ✅ **Backups pré/post-hook** : exécuter une commande dans un conteneur (ex : `pg_dump` avant, `redis-cli BGSAVE` après) - ✅ **Chiffrement** : AES-256 natif (clé passphrase ou KMS) - ✅ **Compression** : tar.gz par défaut, niveau ajustable - ✅ **Rotation** : garder N sauvegardes, purger les vieilles - ✅ **Intégration restic** : backups incrémentaux + déduplication - ✅ **Healthcheck endpoint** : `/health` pour monitoring **Public cible** : **tout homelab qui veut des backups automatiques de ses données** (BDD, configs, volumes persistants) sans écrire un script bash maison. Particulièrement pertinent pour ceux qui ont déjà un S3 ou un NAS pour stocker les archives. **Alternatives directes** : **borgbackup** + cron (plus puissant, plus complexe), **restic** standalone (incrémental), **Tugtainer** (UI web + scheduling), **Repliqate** (modulaire, plus jeune), **scripts bash maison**. ## 🚀 Installation ### Option 1 : Docker Compose (recommandé) ```yaml # docker-compose.yml version: '3.8' services: docker-volume-backup: image: offen/docker-volume-backup:latest container_name: docker-volume-backup restart: unless-stopped security_opt: - no-new-privileges:true volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - /var/lib/docker/volumes:/volumes:ro # accès aux volumes Docker - /etc/docker-volume-backup:/archive # dossier local des backups - ./backup_env:/env:ro # fichier d'env (credentials S3/SSH) env_file: - ./backup_env labels: - "docker-volume-backup.daily=true" # ne s'applique qu'à ce conteneur, voir labels plus bas volumes: # mounts partagés vers les conteneurs à backuper (exemples) : # pgdata:/source/postgres:ro ``` ### Option 2 : Annotations sur vos stacks (la magie des labels) ```yaml # Sur la stack à backuper, ajouter ces labels : services: postgres: image: postgres:16 volumes: - pgdata:/var/lib/postgresql/data labels: - "docker-volume-backup.daily=true" - "docker-volume-backup.pre-hook=postgres pg_dump -U app mydb > /tmp/dump.sql" - "docker-volume-backup.post-hook=rm -f /tmp/dump.sql" nextcloud: image: nextcloud:28 volumes: - nc_data:/var/www/html labels: - "docker-volume-backup.weekly=true" - "docker-volume-backup.exclude=__pycache__" ``` ### Fichier `backup_env` (credentials S3) ```bash # ./backup_env BACKUP_CRON_DAILY="0 3 * * *" # tous les jours à 3h BACKUP_CRON_WEEKLY="0 4 * * 0" # tous les dimanches à 4h # Destination S3 (ex : Backblaze B2, Scaleway, MinIO…) BACKUP_S3_BUCKET="my-backups" AWS_ACCESS_KEY_ID="..." AWS_SECRET_ACCESS_KEY="..." AWS_S3_ENDPOINT="https://s3.fr-par.scw.cloud" AWS_REGION="fr-par" # Chiffrement BACKUP_ARCHIVE_PASSWORD="..PASSWORD..." # Rotation BACKUP_RETENTION_DAYS="7" BACKUP_PRUNING_PREFIX="backup-" ``` ## ⚙️ Configuration Initiale 1. **Choisir sa destination** : local pour débuter, S3 pour la résilience. 2. **Créer le fichier `backup_env`** avec les credentials (chmod 600). 3. **Lancer le conteneur** et vérifier les logs : `docker logs docker-volume-backup`. 4. **Annoter les stacks à backuper** avec les labels `docker-volume-backup.daily` / `.weekly` / `.monthly`. 5. **Tester un backup manuel** : `docker exec docker-volume-backup backup`. 6. **Vérifier la restauration** sur un autre hôte — *un backup non testé n'est pas un backup*. ## 🔄 Alternatives ### Open Source - **BorgBackup** — Déduplication, chiffrement, plus puissant (mais CLI) - **Restic** — Incrémental, S3/SSH, très mature - **Duplicati** — UI web, multi-destinations (mais pas Docker-native) - **Tugtainer** — UI web, scheduling fin, plus récent - **Repliqate** — Backup modulaire, plugins - **Kopia** — UI + CLI, snapshots chiffrés - **rclone** — Outil CLI de sync multi-cloud - **Wal-G** — Backups PostgreSQL/MySQL/Mongo ### Propriétaires - **Duplicacy** (modèle licence) — Déduplication cloud - **Veeam** — Enterprise backup - **Acronis** — Cloud backup - **Backblaze B2** + **Cloudflare R2** — Stockage (pas backup en soi) - **Arq Backup** — Mac/Win - **Carbonite** — Cloud backup ### Tableau comparatif | Critère | Docker Volume Backup | Restic | BorgBackup | Tugtainer | Duplicati | | :--- | :--- | :--- | :--- | :--- | :--- | | Docker-native | ✅ | ⚠️ CLI | ⚠️ CLI | ✅ | ⚠️ | | UI web | ❌ | ⚠️ (restic UI tiers) | ⚠️ (Vorta, Pika) | ✅ | ✅ | | Multi-destination | ✅ (S3, SSH, local) | ✅ | ✅ | ✅ | ✅ | | Incrémental | ✅ (via restic) | ✅ | ✅ | ✅ | ✅ | | Chiffrement | ✅ AES-256 | ✅ AES-256 | ✅ AES-256 | ✅ | ✅ | | Labels Docker | ✅ | ❌ | ❌ | ✅ | ❌ | | Hooks pre/post | ✅ | ⚠️ via wrapper | ⚠️ via wrapper | ⚠️ | ⚠️ | | Licence | MIT | BSD-2 | BSD-3 | MIT | LGPL | **Verdict** : **Docker Volume Backup est imbattable pour sa niche** : un *sidecar* léger qui scanne vos conteneurs par labels et sauvegarde automatiquement. Pour des backups plus complexes (déduplication avancée, snapshots distants), **Restic** ou **BorgBackup** en CLI sont plus adaptés. ## 🔐 Sécurité - ⚠️ **Le socket Docker monté** (même en `:ro`) permet de lister les volumes et de lire leurs chemins. **Réseau isolé recommandé** : ne pas exposer ce conteneur. - **Chiffrement obligatoire** des archives : `BACKUP_ARCHIVE_PASSWORD` doit être une passphrase forte (20+ caractères, stockée dans un coffre-fort, ex : [[app-bitwarden]]). - **Credentials en fichiers `chmod 600`** : jamais de clé AWS en clair dans le `docker-compose.yml` versionné. Utiliser `env_file` avec un fichier non commité. - **Destination chiffrée aussi** : S3 doit être chiffré at-rest (configuré au niveau bucket). - **Test de restauration trimestriel** : un backup jamais restauré est suspect. Faire des *drills* réguliers sur un hôte de test. - **Règle 3-2-1** : 3 copies, 2 supports, 1 hors-site. Exemple : backup local + S3 B2 + cron de copie vers un serveur distant (ou vice-versa). ## 📚 Ressources - [GitHub offen/docker-volume-backup](https://github.com/offen/docker-volume-backup) - [Documentation officielle](https://offen.github.io/docker-volume-backup/) - [Exemples de stacks annotées](https://github.com/offen/docker-volume-backup#supported-services) - [Discussion sur les labels](https://github.com/offen/docker-volume-backup#how-to-use) ## Pages Liées - [[cat-docker]] — Catégorie Docker - [[app-portainer]] — Pour superviser - [[app-traefik]] — Reverse proxy - [[observabilite]] — Vérifier que les backups marchent - [[securisation-home-lab]] — Stratégie 3-2-1 - [[recettes-docker-compose]] — Templates Compose