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