Aller au contenu

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

lifecycle.json

{
  "Rules": [
    {
      "ID": "DeleteOldBackups",
      "Status": "Enabled",
      "Filter": {"Prefix": ""},
      "Expiration": {"Days": 30}
    }
  ]
}