Ce que vous saurez faire
- Règle 3-2-1 pour backups
- Restic + B2 chiffré
- PostgreSQL PITR
- Tests de restauration automatiques
Étape 1 — Règle 3-2-1-1-0
3 copies de chaque donnée critique
2 supports différents (disque + cloud)
1 copie hors site
1 copie offline/immuable (anti-ransomware)
0 erreur: chaque backup testé
Étape 2 — Inventaire
Critique Fréquence RPO Rétention
Base de données H+1 1h 90 jours
Fichiers users J+1 24h 90 jours
Emails J+1 24h 7 ans
Contrats PDF temps réel 0 10 ans
Config à changement 0 illimité
VMs système J+7 + M+1 1 sem 1 an
Étape 3 — Rsync incrémental
#!/usr/bin/env bash
# /usr/local/bin/backup.sh
set -euo pipefail
HORODATAGE=$(date +%Y%m%d_%H%M)
DEST="/srv/backups/$HORODATAGE"
DERNIER="/srv/backups/dernier"
mkdir -p "$DEST"
rsync -aH --delete --link-dest="$DERNIER" \
/srv/data/ "$DEST/"
ln -snf "$DEST" "$DERNIER"
# Rotation: 7 quotidiennes + 4 hebdo + 12 mensuelles
find /srv/backups -maxdepth 1 -type d -mtime +7 -name '2[0-9]*' \
| sort | head -n -30 | xargs -r rm -rf
# Sync vers backup distant
rsync -aHz --delete /srv/backups/ backup@nas.itsc.sn:/volumes/itsc/
Étape 4 — Restic vers S3/B2
apt install -y restic
export RESTIC_REPOSITORY="s3:s3.amazonaws.com/itsc-backups-2026"
export RESTIC_PASSWORD="$(cat /etc/restic.pass)"
export AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=...
restic init
restic backup /srv/data /etc /home --tag quotidien --exclude-caches
# Rétention
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune
# Restauration
restic snapshots
restic restore latest --target /tmp/restore
Étape 5 — PostgreSQL dump chiffré
pg_dump --format=custom --compress=9 -d itsc \
| age -r $(cat /etc/age.pub) \
| aws s3 cp - "s3://itsc-backups/pg/$(date +%F).dump.age" \
--sse AES256 --storage-class STANDARD_IA
Étape 6 — WAL archiving PITR
# postgresql.conf
wal_level = replica
archive_mode = on
archive_command = 'aws s3 cp %p s3://itsc-backups/pg-wal/%f --storage-class STANDARD_IA'
# Restauration point-in-time
pg_basebackup -D /data/restore -Xs -P
# recovery_target_time = '2026-04-22 14:23:00'
Étape 7 — Sauvegardes immuables (anti-ransomware)
# S3 Object Lock en mode COMPLIANCE
aws s3api put-object-lock-configuration --bucket itsc-backups \
--object-lock-configuration '{
"ObjectLockEnabled": "Enabled",
"Rule": { "DefaultRetention": { "Mode": "COMPLIANCE", "Days": 30 } }
}'
# Impossible de supprimer même avec compte AWS root
Étape 8 — Test mensuel automatique
#!/usr/bin/env bash
# /usr/local/bin/restore-test.sh
DOSSIER="/tmp/restore-test-$(date +%F)"
mkdir -p "$DOSSIER"
restic restore latest --target "$DOSSIER"
# Contrôle intégrité
EXPECTED=1500
ACTUAL=$(find "$DOSSIER" -type f | wc -l)
if [ "$ACTUAL" -lt "$EXPECTED" ]; then
curl -X POST "$SLACK_WEBHOOK" \
-d "{\"text\":\"ALERTE: $ACTUAL fichiers restaurés (attendus $EXPECTED)\"}"
fi
rm -rf "$DOSSIER"
Étape 9 — Log SQL backup
CREATE TABLE backup_log (
id SERIAL PRIMARY KEY,
ts TIMESTAMPTZ DEFAULT now(),
type TEXT, -- 'db', 'files', 'mail'
status TEXT, -- 'success', 'failure'
duration_s INT,
size_bytes BIGINT,
destination TEXT,
verified BOOLEAN DEFAULT false
);
-- Rapport hebdo
SELECT type,
COUNT(*) FILTER (WHERE status = 'success') AS success,
COUNT(*) FILTER (WHERE status = 'failure') AS failure,
MAX(ts) AS last_backup
FROM backup_log
WHERE ts >= CURRENT_DATE - 7
GROUP BY type;
Étape 10 — Chiffrement avec age
age-keygen -o ~/.age/key.txt
# Publique: age1xxxxxx...
tar czf - /srv/data | age -r age1xxxxxx... > backup.tar.gz.age
# Restauration
age -d -i ~/.age/key.txt backup.tar.gz.age | tar xzf -
Coûts 1 To
Backblaze B2: 6 USD/mo
AWS S3 Standard-IA: 12,5 USD/mo
Hetzner Storage: 3,50 EUR/mo
Restic + B2: 6 USD + 0 bandwidth sortante (recommandé PME)
Plan 30 jours
- J1: cartographier données critiques
- J3: choisir outil (Restic + B2)
- J7: premier backup complet chiffré
- J14: rotation/rétention automatisées
- J21: restauration test réussie
- J30: monitoring Slack + runbook
Besoin d'un site web ?
Confiez-nous la Création de Votre Site Web
Site vitrine, e-commerce ou application web — nous transformons votre vision en réalité digitale. Accompagnement personnalisé de A à Z.
À partir de 250.000 FCFA
Parlons de Votre Projet
Publicité