Qovans Docs
Operations

Sauvegardes

Ou sont les backups, comment restaurer et comment migrer vers une nouvelle VM.

Ou sont les donnees

DonneeEmplacementPersistance
Base PostgreSQLVolume Docker postgres-dataSurvit aux redemarrages
Images et PDFVolume Docker minio-dataSurvit aux redemarrages
Uploads SFTP/opt/qovans/uploads/Fichier systeme
Logs de sync/var/log/qovans/Fichier systeme, rotation 30j
Config prod/opt/qovans/.env.prodFichier systeme
Caddy/etc/caddy/CaddyfileFichier systeme
VPN/etc/openvpn/client/audaxium.confFichier 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.gz

Automatique (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 -delete

Verifier 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 backend

Backup 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.bak

Migration 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 openvpn

2. 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 restart

4. 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:3000

5. Basculer le DNS

Chez votre registrar DNS, changer les enregistrements A :

DomaineAncienne IPNouvelle IP
espaceclient.qovans.com81.22.222.96NOUVELLE_IP
apicegid.qovans.com81.22.222.96NOUVELLE_IP
docs.qovans.com81.22.222.96NOUVELLE_IP

Caddy obtiendra automatiquement les nouveaux certificats HTTPS apres la propagation DNS.

6. Restaurer les cron jobs

crontab -e

Ajouter :

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 -delete

7. 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