192 lines
8.5 KiB
Markdown
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
|