Files
wiki/Catalogue-Self-Hosted/apps/app-docker-volume-backup.md
2026-06-09 18:40:21 +02:00

192 lines
8.5 KiB
Markdown

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