Business Digital

Backups Outline et procédure de restauration : tutoriel 2026

11 min de lecture

📍 Article principal de la série : Outline 2026 : guide pratique.

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 :

  1. Provision nouveau VPS Hetzner CX23.
  2. Install Coolify + Outline (Resources → New).
  3. Configurer mêmes variables d’env (SECRET_KEY, etc.) depuis Vaultwarden.
  4. Restic restore Postgres dump → docker exec outline-db pg_restore.
  5. Restic restore fichiers MinIO → mc mirror back vers minio-prod/outline.
  6. Update DNS si IP change.
  7. 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

Pratique locale vs documentation internationale

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 creuser ce sujet

Pourquoi sauvegarder Outline en 2026 (et ce qui casse sans backup)

Outline, le wiki open source self-hosted, centralise souvent toute la connaissance interne d’une PME : procédures comptables, mots de passe internes, comptes-rendus client, contrats. Une corruption Postgres ou un rm -rf mal placé efface des années de capital intellectuel en quelques secondes. À Dakar comme à Abidjan, la majorité des équipes qui découvrent Outline via Docker oublient deux choses : que la base Postgres et le bucket S3-compatible (MinIO, Wasabi, Scaleway Object Storage) doivent être sauvegardés ensemble, et que le test de restauration vaut mille fois la sauvegarde elle-même.

Concrètement, un backup Outline complet couvre trois zones : la base Postgres (utilisateurs, documents, révisions, permissions), le stockage objet (pièces jointes, avatars, exports), et le fichier .env qui contient les clés de chiffrement. Perdre l’une des trois rend la restauration impossible. Comptez 2 à 4 heures pour mettre en place le pipeline complet la première fois, puis 5 minutes par semaine pour vérifier les logs.

Étape 1 — Inventorier votre installation Outline avant tout backup

Avant de scripter quoi que ce soit, identifiez précisément où vit la donnée. Sur un déploiement Docker Compose standard, connectez-vous au VPS en SSH et listez les services actifs :

docker compose ps
docker compose config | grep -E "image|volumes|environment" | head -50

Vous devez voir trois services au minimum : outline, postgres (souvent postgres:15) et redis. Notez le nom exact du volume Postgres (souvent outline_database-data) et l’URL du bucket S3-compatible déclarée dans AWS_S3_UPLOAD_BUCKET_URL. Cette étape évite 80 % des erreurs de restauration.

Étape 2 — Dump Postgres quotidien avec rotation 7/4/12

Le dump SQL reste la méthode la plus portable. Créez le script /opt/outline-backup/pg-dump.sh avec rotation Grandfather-Father-Son (7 jours, 4 semaines, 12 mois) :

#!/usr/bin/env bash
set -euo pipefail
STAMP=$(date +%Y%m%d-%H%M)
DEST=/opt/outline-backup/pg
mkdir -p "$DEST"/{daily,weekly,monthly}
docker compose -f /opt/outline/docker-compose.yml exec -T postgres \
  pg_dump -U outline -d outline --format=custom --compress=9 \
  > "$DEST/daily/outline-$STAMP.dump"
# Rotation
find "$DEST/daily" -name "outline-*.dump" -mtime +7 -delete
[[ $(date +%u) == 7 ]] && cp "$DEST/daily/outline-$STAMP.dump" "$DEST/weekly/"
find "$DEST/weekly" -name "outline-*.dump" -mtime +28 -delete
[[ $(date +%d) == 01 ]] && cp "$DEST/daily/outline-$STAMP.dump" "$DEST/monthly/"
find "$DEST/monthly" -name "outline-*.dump" -mtime +365 -delete

Rendez-le exécutable (chmod +x) et planifiez via cron à 03h15 heure de Dakar. Le format custom de pg_dump permet une restauration sélective table par table, contrairement au format plain. La compression niveau 9 réduit un dump de 800 Mo à environ 90 Mo, économisant la bande passante vers votre stockage distant.

Étape 3 — Synchroniser le bucket S3 vers stockage froid

Les pièces jointes (PDF, captures d’écran, exports DOCX) vivent dans MinIO, Wasabi ou Scaleway. Utilisez rclone avec versioning côté destination pour éviter qu’un ransomware sur le serveur source ne corrompe aussi le backup :

rclone sync minio:outline-uploads wasabi-backup:outline-uploads-cold \
  --backup-dir wasabi-backup:outline-uploads-versions/$(date +%Y-%m-%d) \
  --transfers 8 --checkers 16 --log-file /var/log/rclone-outline.log

L’option --backup-dir déplace les fichiers supprimés ou modifiés dans un dossier daté plutôt que de les écraser. Vous gardez ainsi 90 jours d’historique sans coût démesuré : chez Wasabi (région Paris ou Francfort), 1 To en stockage froid coûte environ 6,99 USD/mois soit 4 590 FCFA. Pour un wiki Outline de PME (typiquement 5 à 50 Go), comptez 30 à 350 FCFA mensuels.

Étape 4 — Sauvegarder le .env et les secrets de chiffrement

Le fichier .env d’Outline contient SECRET_KEY, UTILS_SECRET, DATABASE_URL et les credentials S3. Sans ces clés, les sessions et certains champs chiffrés ne se relisent pas. Chiffrez-le avec age (alternative moderne à GPG, ~2 Mo) avant tout transfert :

age-keygen -o ~/.age/outline-backup.key
# Récupérer la clé publique :
grep "public key" ~/.age/outline-backup.key
# Chiffrer
age -r age1xyz... -o /opt/outline-backup/env-$(date +%Y%m%d).age /opt/outline/.env

Stockez la clé privée hors-ligne (clé USB chiffrée, gestionnaire de mots de passe Bitwarden famille, coffre-fort physique). Ne la commitez jamais dans Git, même privé : un ancien employé ayant cloné le repo y aurait toujours accès.

Étape 5 — Tester la restauration sur VPS jetable une fois par mois

Un backup non testé n’est pas un backup. Provisionnez un VPS éphémère (Hetzner CX22 à 4,59 EUR/mois soit 3 010 FCFA, ou Scaleway DEV1-S à 4,99 EUR soit 3 273 FCFA), montez Outline vierge avec le même docker-compose.yml et restaurez :

# Sur le VPS jetable
docker compose up -d postgres
sleep 20
cat outline-20260101-0315.dump | docker compose exec -T postgres \
  pg_restore -U outline -d outline --clean --if-exists --no-owner
docker compose up -d outline
curl -I http://localhost:3000/api/auth.config

Vous devez recevoir un HTTP/1.1 200 OK et pouvoir vous connecter avec un compte existant. Si l’auth Slack/Google échoue, vérifiez que les redirect URIs OAuth pointent bien vers le domaine de test (sinon Google bloque). Documentez le temps total RTO (Recovery Time Objective) : visez moins de 30 minutes pour une PME de 20 personnes.

Étape 6 — Automatiser les alertes en cas d’échec

Un cron silencieux qui échoue trois mois de suite est pire que pas de backup du tout. Encadrez chaque script avec une notification Healthchecks.io (gratuit jusqu’à 20 checks) ou un webhook Slack interne :

curl -fsS -m 10 --retry 3 https://hc-ping.com/UUID/start
/opt/outline-backup/pg-dump.sh && \
  curl -fsS -m 10 --retry 3 https://hc-ping.com/UUID || \
  curl -fsS -m 10 --retry 3 https://hc-ping.com/UUID/fail

Si le ping /fail est envoyé ou si le ping de succès manque pendant 6 heures, vous recevez un mail et un SMS via Mixx by Yas (anciennement Free Money/Free Sénégal — l’opérateur historique des SMS pro au Sénégal). Coût d’un SMS pro Mixx by Yas : environ 25 FCFA l’unité, négligeable face à la perte d’un wiki.

Étape 7 — Procédure de restauration d’urgence en production

Le jour J (corruption Postgres, hack, erreur humaine), suivez exactement cette séquence sans improviser. Coupez d’abord le trafic au reverse proxy Caddy ou Nginx pour figer l’état :

# 1. Stopper Outline (garder Postgres)
docker compose stop outline
# 2. Vider la base actuelle
docker compose exec postgres psql -U outline -c "DROP DATABASE outline;"
docker compose exec postgres psql -U outline -c "CREATE DATABASE outline OWNER outline;"
# 3. Restaurer le dump
cat outline-LAST.dump | docker compose exec -T postgres \
  pg_restore -U outline -d outline --no-owner --verbose
# 4. Restaurer le bucket
rclone sync wasabi-backup:outline-uploads-cold minio:outline-uploads
# 5. Redémarrer
docker compose up -d outline
# 6. Vérifier
docker compose logs -f outline | grep -i "ready"

Le log "Listening on port 3000" confirme la reprise. Rouvrez ensuite le reverse proxy et envoyez un message Mattermost ou Discord à l’équipe pour qu’elle vide le cache navigateur (Ctrl+Shift+R).

Étape 8 — Documenter et facturer la prestation backup à un client

Si vous opérez Outline pour un cabinet d’avocats à Dakar ou une ONG à Lomé, formalisez la prestation dans un PV de réception : fréquence des dumps, lieu de stockage froid (juridiction du data center — important pour la loi 2008-12 sur les données personnelles au Sénégal), RTO/RPO, test de restauration trimestriel signé. Tarif marché Afrique de l’Ouest francophone pour un setup backup + monitoring + 1 test annuel : 250 000 à 450 000 FCFA en one-shot, plus 35 000 à 60 000 FCFA/mois de supervision.

Sur un angle proche, consultez notre tutoriel d’installation Outline complet et notre guide sauvegarder Postgres sur VPS.

Compléments terrain — coûts cachés et erreurs fréquentes

Trois pièges récurrents dans les déploiements Outline accompagnés en 2025-2026 à Dakar, Cotonou et Yaoundé : (1) oublier que pg_dump exécuté pendant un import massif (par exemple migration depuis Notion) génère un dump incohérent — planifiez les dumps hors heures ouvrées (03h-05h heure locale) ; (2) sous-estimer la bande passante upload sur fibre Sonatel ou Canalbox : un dump quotidien de 500 Mo vers Wasabi représente 15 Go/mois, à vérifier dans le forfait pro ; (3) confondre versioning S3 et backup — le versioning protège contre les écrasements accidentels mais pas contre une suppression totale du bucket.

Dernier conseil : conservez une copie offline mensuelle sur disque externe chiffré (LUKS sous Linux, FileVault sur macOS), rangé dans un coffre. Coût : un disque Toshiba Canvio 2 To autour de 39 000 FCFA, à remplacer tous les 3 ans. C’est l’assurance ultime contre un compromis simultané du serveur et du compte cloud Wasabi.

Partager