Skip to content

Sauvegarde & Restauration

Sauvegardez et restaurez votre instance Repod.

Version complète en anglais

Consultez le guide complet → pour les options de rétention et la restauration complète.


Ce qu'il faut sauvegarder

Répertoire / Fichier Contenu Priorité
repos/auth/ Base de données utilisateurs Critique
repos/gnupg/ Clé privée GPG Critique
.env, backend.env Secrets et configuration Critique
repos/pool/ Binaires des paquets Élevée
repos/manifests/ Manifestes JSON des paquets Élevée
repos/audit/ Journaux d'audit Élevée
repos/security/ Décisions CVE Moyenne

Ne perdez pas la clé GPG

Perdre repos/gnupg/ rend impossible la signature des futures releases du dépôt. Sauvegardez cette clé hors-ligne dans un coffre-fort sécurisé.


Sauvegarde manuelle

cd /opt/repod

# Arrêter les services pour une cohérence garantie
docker compose down

# Créer l'archive
tar -czf /opt/backups/repod-$(date +%Y%m%d-%H%M).tar.gz \
  repos/auth/ repos/gnupg/ repos/manifests/ repos/pool/ \
  repos/audit/ repos/security/ repos/settings.json \
  .env backend.env

# Redémarrer
docker compose up -d

Sauvegarde à chaud (sans interruption)

# Sauvegarde à chaud — quelques secondes d'incohérence possible sur la base de données
tar -czf /opt/backups/repod-$(date +%Y%m%d-%H%M).tar.gz \
  /opt/repod/repos /opt/repod/.env /opt/repod/backend.env

Pour une cohérence parfaite de la base SQLite :

docker exec backend-api python3 -c "
import sqlite3, shutil
for db in ['/repos/auth/users.db', '/repos/package-index/packages.db']:
    con = sqlite3.connect(db)
    bck = sqlite3.connect(db + '.bck')
    con.backup(bck)
    bck.close()
    con.close()
print('Backup SQLite terminé')
"

Automatisation avec cron

# Sauvegarde quotidienne à 03h00, rétention 30 jours
cat > /etc/cron.d/repod-backup << 'EOF'
0 3 * * * root cd /opt/repod && \
  tar -czf /opt/backups/repod-$(date +%Y%m%d).tar.gz repos/ .env backend.env && \
  find /opt/backups -name "repod-*.tar.gz" -mtime +30 -delete \
  >> /var/log/repod-backup.log 2>&1
EOF

Restauration

cd /opt/repod

# 1. Arrêter les services
docker compose down

# 2. Restaurer l'archive
tar -xzf /opt/backups/repod-20260101-0300.tar.gz -C /opt/repod

# 3. Vérifier les permissions
docker run --rm -v /opt/repod/repos:/repos \
  alpine chown -R 1000:1000 /repos/auth /repos/gnupg

# 4. Redémarrer
docker compose up -d

# 5. Vérifier
curl http://localhost:8000/health/live