Restauration
Ce guide explique comment restaurer les données de PCH-SIG à partir d'une sauvegarde.
Prérequis
Avant de restaurer :
- Accès aux fichiers de sauvegarde
- Accès administrateur au serveur
- Docker en cours d'exécution
- Sauvegarde de l'état actuel (au cas où)
Attention
La restauration écrase les données existantes. Assurez-vous d'avoir une sauvegarde de l'état actuel avant de procéder.
Restauration de la base de données
Restauration complète
# Arrêter l'application (éviter les écritures)
docker stop pch_backend
# Restaurer la base de données
docker exec -i pch_postgres psql -U pch_admin -d pch_sig < backup.sql
# Redémarrer l'application
docker start pch_backend
Restauration depuis archive compressée
# Décompresser
gunzip backup_20240115.sql.gz
# Restaurer
docker exec -i pch_postgres psql -U pch_admin -d pch_sig < backup_20240115.sql
Restauration format custom (pg_dump -Fc)
# Restauration complète
docker exec -i pch_postgres pg_restore -U pch_admin -d pch_sig -c < backup.dump
# Restauration d'une table spécifique
docker exec -i pch_postgres pg_restore -U pch_admin -d pch_sig -t menages < backup.dump
Restauration sélective
Restaurer une seule table
# Extraire une table du dump
pg_restore -t menages backup.dump > menages_only.sql
# Restaurer la table
docker exec -i pch_postgres psql -U pch_admin -d pch_sig < menages_only.sql
Restaurer plusieurs tables
pg_restore -t menages -t beneficiaires -t paiements backup.dump > tables.sql
docker exec -i pch_postgres psql -U pch_admin -d pch_sig < tables.sql
Restaurer sans les contraintes
# Désactiver les contraintes
docker exec pch_postgres psql -U pch_admin -d pch_sig -c "SET session_replication_role = 'replica';"
# Restaurer
docker exec -i pch_postgres psql -U pch_admin -d pch_sig < backup.sql
# Réactiver les contraintes
docker exec pch_postgres psql -U pch_admin -d pch_sig -c "SET session_replication_role = 'origin';"
Restauration dans une nouvelle base
Créer une base de restauration
# Créer la nouvelle base
docker exec pch_postgres psql -U pch_admin -c "CREATE DATABASE pch_sig_restore;"
# Restaurer dans la nouvelle base
docker exec -i pch_postgres psql -U pch_admin -d pch_sig_restore < backup.sql
# Vérifier les données
docker exec pch_postgres psql -U pch_admin -d pch_sig_restore -c "SELECT count(*) FROM menages;"
Remplacer la base principale
# Renommer la base actuelle
docker exec pch_postgres psql -U pch_admin -c "ALTER DATABASE pch_sig RENAME TO pch_sig_old;"
# Renommer la base restaurée
docker exec pch_postgres psql -U pch_admin -c "ALTER DATABASE pch_sig_restore RENAME TO pch_sig;"
# Supprimer l'ancienne base (après vérification)
docker exec pch_postgres psql -U pch_admin -c "DROP DATABASE pch_sig_old;"
Restauration des fichiers
Documents uploadés
# Décompresser l'archive
Expand-Archive -Path "C:\pch-sig\backups\uploads_20240115.zip" -DestinationPath "C:\temp\uploads-restore"
# Copier vers le répertoire d'uploads
Copy-Item -Path "C:\temp\uploads-restore\*" -Destination "C:\pch-sig\backend\public\uploads" -Recurse -Force
Configuration
# Restaurer docker-compose.yml
Copy-Item -Path "C:\pch-sig\backups\config\docker-compose.yml" -Destination "C:\pch-sig\deploy\"
# Restaurer .env backend
Copy-Item -Path "C:\pch-sig\backups\config\backend.env" -Destination "C:\pch-sig\backend\.env"
# Restaurer les clés JWT
Copy-Item -Path "C:\pch-sig\backups\config\jwt\*" -Destination "C:\pch-sig\backend\config\jwt\" -Recurse
Restauration complète
Script de restauration
Fichier : C:\pch-sig\scripts\restore-full.ps1
# Restauration complète PCH-SIG
param(
[Parameter(Mandatory=$true)]
[string]$BackupFile
)
Write-Host "=== Restauration PCH-SIG ===" -ForegroundColor Cyan
Write-Host "Archive: $BackupFile"
# Vérifier l'archive
if (-not (Test-Path $BackupFile)) {
Write-Host "ERREUR: Archive non trouvée!" -ForegroundColor Red
exit 1
}
# Créer un répertoire temporaire
$TempDir = "C:\temp\pch-restore-$(Get-Date -Format 'yyyyMMdd_HHmmss')"
New-Item -ItemType Directory -Force -Path $TempDir | Out-Null
# Décompresser
Write-Host "1. Extraction de l'archive..." -ForegroundColor Yellow
Expand-Archive -Path $BackupFile -DestinationPath $TempDir
# Sauvegarder l'état actuel
Write-Host "2. Sauvegarde de l'état actuel..." -ForegroundColor Yellow
docker-machine ssh default "docker exec pch_postgres pg_dump -U pch_admin -d pch_sig" > "$TempDir\current_backup.sql"
# Arrêter le backend
Write-Host "3. Arrêt du backend..." -ForegroundColor Yellow
docker-machine ssh default "docker stop pch_backend"
# Restaurer la base de données
Write-Host "4. Restauration PostgreSQL..." -ForegroundColor Yellow
Get-Content "$TempDir\database.sql" | docker-machine ssh default "docker exec -i pch_postgres psql -U pch_admin -d pch_sig"
# Restaurer les uploads
Write-Host "5. Restauration des uploads..." -ForegroundColor Yellow
if (Test-Path "$TempDir\uploads") {
Copy-Item -Path "$TempDir\uploads\*" -Destination "C:\pch-sig\backend\public\uploads" -Recurse -Force
}
# Restaurer la configuration
Write-Host "6. Restauration de la configuration..." -ForegroundColor Yellow
if (Test-Path "$TempDir\jwt") {
Copy-Item -Path "$TempDir\jwt\*" -Destination "C:\pch-sig\backend\config\jwt\" -Recurse -Force
}
# Redémarrer le backend
Write-Host "7. Redémarrage du backend..." -ForegroundColor Yellow
docker-machine ssh default "docker start pch_backend"
# Vider le cache
Write-Host "8. Vidage du cache..." -ForegroundColor Yellow
docker-machine ssh default "docker exec pch_backend php bin/console cache:clear"
# Nettoyage
Write-Host "9. Nettoyage..." -ForegroundColor Yellow
Remove-Item -Path $TempDir -Recurse -Force
Write-Host "=== Restauration terminée ===" -ForegroundColor Green
Restauration Redis
# Arrêter Redis
docker stop pch_redis
# Copier le fichier dump.rdb
docker cp dump.rdb pch_redis:/data/dump.rdb
# Redémarrer Redis
docker start pch_redis
# Vérifier
docker exec pch_redis redis-cli -a redis_secure_2025 DBSIZE
Vérification post-restauration
Vérifier la base de données
# Nombre de ménages
docker exec pch_postgres psql -U pch_admin -d pch_sig -c "SELECT count(*) FROM menages;"
# Nombre de bénéficiaires
docker exec pch_postgres psql -U pch_admin -d pch_sig -c "SELECT count(*) FROM beneficiaires;"
# Nombre de paiements
docker exec pch_postgres psql -U pch_admin -d pch_sig -c "SELECT count(*) FROM paiements;"
Vérifier l'intégrité
# Vérifier les contraintes de clés étrangères
docker exec pch_postgres psql -U pch_admin -d pch_sig -c "
SELECT count(*) FROM menages m
LEFT JOIN regions r ON m.region_id = r.id
WHERE m.region_id IS NOT NULL AND r.id IS NULL;"
Tester l'application
# Test API
curl http://localhost:8000/api/health
# Test authentification
curl -X POST http://localhost:8000/api/login_check \
-H "Content-Type: application/json" \
-d '{"email":"admin@pch-sig.sn","password":"Admin123!"}'
Dépannage
Erreur "Database does not exist"
# Créer la base de données
docker exec pch_postgres psql -U pch_admin -c "CREATE DATABASE pch_sig;"
# Puis restaurer
docker exec -i pch_postgres psql -U pch_admin -d pch_sig < backup.sql
Erreur de permissions
# Corriger les permissions des fichiers
docker exec pch_backend chown -R www-data:www-data /app/var
docker exec pch_backend chown -R www-data:www-data /app/public/uploads
Erreur de version PostgreSQL
Si la sauvegarde provient d'une version différente de PostgreSQL :
# Utiliser pg_restore avec --no-owner --no-acl
docker exec -i pch_postgres pg_restore --no-owner --no-acl -U pch_admin -d pch_sig < backup.dump
Conflits de données
# Vider la base avant restauration
docker exec pch_postgres psql -U pch_admin -d pch_sig -c "
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO pch_admin;"
# Puis restaurer
docker exec -i pch_postgres psql -U pch_admin -d pch_sig < backup.sql
Point de restauration
Créer un point de restauration avant modification
# Avant une opération risquée
docker exec pch_postgres pg_dump -U pch_admin -d pch_sig -F c > /tmp/before_operation.dump
# Si problème, restaurer
docker exec -i pch_postgres pg_restore -U pch_admin -d pch_sig -c < /tmp/before_operation.dump