Aller au contenu principal

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

Prochaines étapes