📍 Article principal du cluster : Outline 2026 : guide complet.
Outline est la mémoire institutionnelle de votre PME : procédures, runbooks, comptes rendus, documentation produit. Sa perte est un désastre opérationnel. Ce tutoriel détaille la procédure complète de sauvegarde 3-2-1 avec restic chiffré vers Backblaze B2, et le test de restauration mensuel obligatoire.
Prérequis
- Outline en production avec données réelles.
- Compte Backblaze B2 ou MinIO secondaire.
- Niveau attendu : intermédiaire.
- Temps estimé : 1h setup + 30 min test mensuel.
Étape 1 — Identifier les éléments à sauvegarder
- PostgreSQL : tous les documents, utilisateurs, permissions, historique versions.
- MinIO bucket outline : images, fichiers attachés.
- Redis : sessions, cache (régénérable, optionnel).
- Variables d’environnement : SECRET_KEY, OIDC config (à conserver).
Étape 2 — Initialiser le repository restic
export RESTIC_REPOSITORY="s3:s3.eu-central-003.backblazeb2.com/outline-backup-prod"
export AWS_ACCESS_KEY_ID="votre-keyID-B2"
export AWS_SECRET_ACCESS_KEY="votre-applicationKey-B2"
export RESTIC_PASSWORD="passphrase-très-très-forte-unique"
restic init
Étape 3 — Script de sauvegarde Postgres
#!/bin/bash
set -euo pipefail
TS=$(date +%Y%m%d-%H%M%S)
TMP=/tmp/outline-pg-$TS
docker exec outline-db pg_dump -U outline -d outline -F c -f /tmp/outline-$TS.dump
docker cp outline-db:/tmp/outline-$TS.dump $TMP.dump
docker exec outline-db rm /tmp/outline-$TS.dump
export RESTIC_REPOSITORY="s3:s3.eu-central-003.backblazeb2.com/outline-backup-prod"
export RESTIC_PASSWORD_FILE="/root/.restic-password"
export AWS_ACCESS_KEY_ID="..."
export AWS_SECRET_ACCESS_KEY="..."
restic backup $TMP.dump --tag outline-db --tag prod
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune
rm -f $TMP.dump
curl -s "https://ntfy.sh/votre-topic" -d "Outline DB backup OK $TS"
Étape 4 — Script de sauvegarde MinIO
#!/bin/bash
set -euo pipefail
# Sync MinIO bucket vers staging local
mc mirror minio-prod/outline /tmp/outline-files/
export RESTIC_REPOSITORY="s3:s3.eu-central-003.backblazeb2.com/outline-backup-prod"
export RESTIC_PASSWORD_FILE="/root/.restic-password"
export AWS_ACCESS_KEY_ID="..."
export AWS_SECRET_ACCESS_KEY="..."
restic backup /tmp/outline-files --tag outline-files --tag prod
restic forget --keep-daily 14 --keep-weekly 8 --keep-monthly 24 --prune
rm -rf /tmp/outline-files
curl -s "https://ntfy.sh/votre-topic" -d "Outline files backup OK"
Étape 5 — Cron schedule
chmod +x /srv/scripts/outline-backup-*.sh
crontab -e
0 */6 * * * /srv/scripts/outline-backup-db.sh >> /var/log/outline-backup.log 2>&1
0 4,16 * * * /srv/scripts/outline-backup-files.sh >> /var/log/outline-backup.log 2>&1
0 5 * * 0 restic check --read-data-subset=10% >> /var/log/outline-backup.log 2>&1
Étape 6 — Test de restauration mensuel
# Sur VPS staging
restic snapshots --tag outline-db | tail -5
restic restore latest --tag outline-db --target /tmp/restore
# Restaurer dans Postgres test
docker run -d --name pg-test -e POSTGRES_PASSWORD=test postgres:16
sleep 10
docker cp /tmp/restore/tmp/outline-*.dump pg-test:/tmp/
docker exec pg-test pg_restore -U postgres --create -d postgres /tmp/outline-*.dump
# Vérifier
docker exec pg-test psql -U postgres -d outline -c "SELECT COUNT(*) FROM documents;"
# Doit correspondre à prod ± 1h
Étape 7 — Documentation runbook
Wiki interne (dans Outline lui-même !) avec :
- URL du repository B2.
- Référence Vaultwarden vers RESTIC_PASSWORD.
- Procédure de restauration complète (commandes exactes).
- Date du dernier test réussi.
- Contact d’urgence (admin principal + secondaire).
Étape 8 — Restauration en cas de désastre
Procédure si serveur Outline détruit :
- Provision nouveau VPS Hetzner CX22.
- Install Coolify + Outline (Resources → New).
- Configurer mêmes variables d’env (SECRET_KEY, etc.) depuis Vaultwarden.
- Restic restore Postgres dump → docker exec outline-db pg_restore.
- Restic restore fichiers MinIO → mc mirror back vers minio-prod/outline.
- Update DNS si IP change.
- Test login admin.
Comptez 1 à 3 heures selon volume.
Erreurs fréquentes
| Erreur | Cause | Solution |
|---|---|---|
| Sauvegarde corrompue | pg_dump pendant écriture lourde | Toujours utiliser -F c format custom (consistent) |
| Restic password perdu | Stockage unique | 3 copies indépendantes |
| Test restauration échoue | Version Postgres différente | Restaurer sur même version |
| MinIO sync incomplet | Bandwidth limité | Mirror nocturne en parallèle DB |
| Bucket B2 saturé | Forget non lancé | Vérifier --prune dans cron |
| Outline pas redémarré post-restore | Volume Docker pas remonté | Vérifier docker-compose volumes |
Adaptation au contexte ouest-africain
Trois précisions. Coût Backblaze : 200 Go = 1,20 USD/mois. Wikis Outline pèsent typiquement 5-30 Go. Coût négligeable. Egress gratuit Cloudflare : restauration sans frais via Cloudflare Bandwidth Alliance. Test sur poste local : test mensuel sur Raspberry Pi à domicile valide la procédure même hors infrastructure principale. Important si admin unique = bus factor 1.
Tutoriels frères
FAQ
Restic vs borgbackup ? Restic supporte S3 natif. Borg meilleur sur SSH local. Pour Backblaze, restic gagne.
Combien de RPO acceptable ? 6 heures pour wiki standard. 1 heure pour wiki business critique. Ajuster fréquence cron.
Backup chiffré quantum-resistant ? AES-256 considéré quantum-resistant à horizon 2030+ par NIST.
Versioning multiple ? Restic conserve toutes les versions par défaut. Forget configure rétention (7j daily, 4 weekly, 12 monthly).
Sauvegarde Redis ? Optionnel. Sessions perdues = utilisateurs reconnectent. Pas critique.
Pour aller plus loin
- 🔝 Retour au pilier : Guide complet Outline 2026
- Documentation Restic : restic.readthedocs.io