Backup & Restore¶
Stratégie de sauvegarde et restauration pour JARVIS.
Vue d'Ensemble¶
| Composant | Méthode | Fréquence | Rétention |
|---|---|---|---|
| PostgreSQL | pg_dump | Quotidien | 30 jours |
| MinIO | mc mirror | Quotidien | 30 jours |
| Redis | RDB snapshot | Horaire | 7 jours |
| Config | Git | À chaque changement | Permanent |
PostgreSQL¶
Backup Manuel¶
# Dump complet
docker compose exec postgres pg_dump -U jarvis jarvis > backup_$(date +%Y%m%d).sql
# Dump compressé
docker compose exec postgres pg_dump -U jarvis jarvis | gzip > backup_$(date +%Y%m%d).sql.gz
Backup Automatisé¶
#!/bin/bash
# scripts/backup-postgres.sh
BACKUP_DIR="/backups/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30
# Créer le backup
docker compose exec -T postgres pg_dump -U jarvis jarvis | gzip > "${BACKUP_DIR}/jarvis_${DATE}.sql.gz"
# Nettoyer les anciens backups
find ${BACKUP_DIR} -name "*.sql.gz" -mtime +${RETENTION_DAYS} -delete
echo "Backup terminé: jarvis_${DATE}.sql.gz"
Cron¶
# /etc/cron.d/jarvis-backup
0 2 * * * root /opt/jarvis/scripts/backup-postgres.sh >> /var/log/jarvis-backup.log 2>&1
Restore¶
# Restaurer depuis un backup
gunzip < backup_20260116.sql.gz | docker compose exec -T postgres psql -U jarvis jarvis
# Restaurer une table spécifique
docker compose exec -T postgres pg_restore -U jarvis -d jarvis -t users backup.dump
MinIO¶
Backup avec mc¶
# Configurer l'alias
mc alias set jarvis http://localhost:9000 ${MINIO_ACCESS_KEY} ${MINIO_SECRET_KEY}
# Mirror vers backup
mc mirror jarvis/documents /backups/minio/documents
# Sync incrémental
mc mirror --overwrite jarvis/documents /backups/minio/documents
Script Automatisé¶
#!/bin/bash
# scripts/backup-minio.sh
BACKUP_DIR="/backups/minio"
DATE=$(date +%Y%m%d)
mc mirror jarvis/documents "${BACKUP_DIR}/${DATE}/documents"
mc mirror jarvis/avatars "${BACKUP_DIR}/${DATE}/avatars"
# Archiver
tar -czf "${BACKUP_DIR}/minio_${DATE}.tar.gz" "${BACKUP_DIR}/${DATE}"
rm -rf "${BACKUP_DIR}/${DATE}"
Redis¶
Snapshot RDB¶
# Forcer un snapshot
docker compose exec redis redis-cli BGSAVE
# Copier le fichier RDB
docker cp jarvis-redis:/data/dump.rdb /backups/redis/dump_$(date +%Y%m%d).rdb
Configuration Persistence¶
# redis.conf
save 900 1 # Save après 900s si 1 clé modifiée
save 300 10 # Save après 300s si 10 clés modifiées
save 60 10000 # Save après 60s si 10000 clés modifiées
appendonly yes
appendfsync everysec
Disaster Recovery¶
Procédure de Restauration Complète¶
# 1. Arrêter les services
docker compose down
# 2. Restaurer PostgreSQL
docker compose up -d postgres
sleep 10
gunzip < /backups/postgres/jarvis_latest.sql.gz | docker compose exec -T postgres psql -U jarvis jarvis
# 3. Restaurer MinIO
docker compose up -d minio
mc mirror /backups/minio/latest/documents jarvis/documents
# 4. Restaurer Redis
docker cp /backups/redis/dump_latest.rdb jarvis-redis:/data/dump.rdb
docker compose up -d redis
# 5. Redémarrer l'API
docker compose up -d api
Vérification Post-Restore¶
# Health check
curl http://localhost:8000/health
# Vérifier les données
docker compose exec postgres psql -U jarvis -c "SELECT COUNT(*) FROM users;"
docker compose exec postgres psql -U jarvis -c "SELECT COUNT(*) FROM conversations;"
Stockage Distant¶
S3/Object Storage¶
# Sync vers S3
aws s3 sync /backups/postgres s3://jarvis-backups/postgres/
aws s3 sync /backups/minio s3://jarvis-backups/minio/
# Lifecycle policy (30 jours)
aws s3api put-bucket-lifecycle-configuration \
--bucket jarvis-backups \
--lifecycle-configuration file://lifecycle.json