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