Operations
Sauvegardes
Ou sont les backups, comment restaurer et comment migrer vers une nouvelle VM.
Ou sont les donnees
| Donnee | Emplacement | Persistance |
|---|---|---|
| Base PostgreSQL | Volume Docker postgres-data | Survit aux redemarrages |
| Images et PDF | Volume Docker minio-data | Survit aux redemarrages |
| Uploads SFTP | /opt/qovans/uploads/ | Fichier systeme |
| Logs de sync | /var/log/qovans/ | Fichier systeme, rotation 30j |
| Config prod | /opt/qovans/.env.prod | Fichier systeme |
| Caddy | /etc/caddy/Caddyfile | Fichier systeme |
| VPN | /etc/openvpn/client/audaxium.conf | Fichier systeme |
| Code source | /opt/qovans/ (repo Git) | Git, pas besoin de backup |
Backup PostgreSQL
Manuel
# Sur le VPS
docker exec qovans-postgres pg_dump -U qovans qovans | gzip > /opt/backups/qovans-$(date +%Y%m%d-%H%M).sql.gzAutomatique (cron)
Ajouter dans crontab -e :
# Backup PostgreSQL tous les jours a 2h30
30 2 * * * mkdir -p /opt/backups && docker exec qovans-postgres pg_dump -U qovans qovans | gzip > /opt/backups/qovans-$(date +\%Y\%m\%d).sql.gz
# Supprimer les backups de plus de 30 jours
0 4 * * * find /opt/backups -name "qovans-*.sql.gz" -mtime +30 -deleteVerifier les backups
# Lister
ls -lh /opt/backups/
# Verifier l'integrite du dernier
gunzip -t /opt/backups/qovans-$(date +%Y%m%d).sql.gz && echo "OK"Restaurer un backup
# Arreter le backend
docker compose -f docker-compose.prod.yml stop backend
# Restaurer
gunzip -c /opt/backups/qovans-20260709.sql.gz | docker exec -i qovans-postgres psql -U qovans qovans
# Redemarrer
docker compose -f docker-compose.prod.yml start backendBackup MinIO (images)
Les images produits sont dans le volume Docker minio-data. Pour sauvegarder :
# Copier le volume vers un dossier
docker run --rm -v qovans_minio-data:/data -v /opt/backups:/backup alpine \
tar czf /backup/minio-$(date +%Y%m%d).tar.gz -C /data .Backup de la configuration
Les fichiers de config critiques a sauvegarder :
# Copier les configs hors du repo
cp /opt/qovans/.env.prod /opt/backups/env.prod.bak
cp /etc/caddy/Caddyfile /opt/backups/Caddyfile.bak
cp /etc/openvpn/client/audaxium.conf /opt/backups/audaxium.conf.bakMigration vers une nouvelle VM
Si vous devez migrer Qovans vers un nouveau serveur, voici la procedure complete.
1. Preparer le nouveau serveur
# Installer Docker
curl -fsSL https://get.docker.com | sh
# Installer Caddy
apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt update && apt install caddy
# Installer OpenVPN
apt install -y openvpn2. Copier les donnees depuis l'ancien serveur
# Depuis l'ancien serveur, exporter les donnees
docker exec qovans-postgres pg_dump -U qovans qovans | gzip > /tmp/qovans-migration.sql.gz
# Copier vers le nouveau serveur
scp /tmp/qovans-migration.sql.gz root@NOUVELLE_IP:/opt/
scp /opt/qovans/.env.prod root@NOUVELLE_IP:/opt/
scp /etc/caddy/Caddyfile root@NOUVELLE_IP:/etc/caddy/
scp /etc/openvpn/client/audaxium.conf root@NOUVELLE_IP:/etc/openvpn/client/Pour les images MinIO :
# Exporter le volume MinIO
docker run --rm -v qovans_minio-data:/data -v /tmp:/backup alpine \
tar czf /backup/minio-migration.tar.gz -C /data .
scp /tmp/minio-migration.tar.gz root@NOUVELLE_IP:/opt/3. Deployer sur le nouveau serveur
# Cloner le repo
cd /opt
git clone git@github.com:VOTRE_REPO/qovans.git
cd qovans
# Copier la config
cp /opt/.env.prod .env.prod
# Demarrer les services
docker compose -f docker-compose.prod.yml up -d
# Attendre que PostgreSQL soit pret
sleep 10
# Restaurer la base
gunzip -c /opt/qovans-migration.sql.gz | docker exec -i qovans-postgres psql -U qovans qovans
# Restaurer les images MinIO
docker run --rm -v qovans_minio-data:/data -v /opt:/backup alpine \
tar xzf /backup/minio-migration.tar.gz -C /data
# Redemarrer pour prendre en compte les donnees
docker compose -f docker-compose.prod.yml restart4. Configurer le reseau
# VPN
sudo systemctl start openvpn-client@audaxium
sudo systemctl enable openvpn-client@audaxium # Auto-start si possible
# Caddy (la config a deja ete copiee)
sudo systemctl restart caddy
# Verifier
curl http://localhost:8000/health
curl http://localhost:8000/api/test-cegid
curl http://localhost:30005. Basculer le DNS
Chez votre registrar DNS, changer les enregistrements A :
| Domaine | Ancienne IP | Nouvelle IP |
|---|---|---|
espaceclient.qovans.com | 81.22.222.96 | NOUVELLE_IP |
apicegid.qovans.com | 81.22.222.96 | NOUVELLE_IP |
docs.qovans.com | 81.22.222.96 | NOUVELLE_IP |
Caddy obtiendra automatiquement les nouveaux certificats HTTPS apres la propagation DNS.
6. Restaurer les cron jobs
crontab -eAjouter :
0 3 * * * /opt/qovans/backend/scripts/nightly_sync.sh
*/2 * * * * /opt/qovans/scripts/process_sftp_uploads.sh
30 2 * * * mkdir -p /opt/backups && docker exec qovans-postgres pg_dump -U qovans qovans | gzip > /opt/backups/qovans-$(date +\%Y\%m\%d).sql.gz
0 4 * * * find /opt/backups -name "qovans-*.sql.gz" -mtime +30 -delete7. Verifier que tout fonctionne
# Services
docker compose -f docker-compose.prod.yml ps
# API
curl https://apicegid.qovans.com/health
# Frontend
curl -s -o /dev/null -w "%{http_code}" https://espaceclient.qovans.com
# Cegid
curl https://apicegid.qovans.com/api/test-cegid
# Sync (attendre le lendemain et verifier les logs)
cat /var/log/qovans/sync_$(date +%Y-%m-%d).log