Sauvegarde
Ce guide explique comment sauvegarder les données de PCH-SIG.
Stratégie de sauvegarde
Éléments à sauvegarder
| Élément | Fréquence | Rétention |
|---|---|---|
| Base de données PostgreSQL | Quotidienne | 30 jours |
| Fichiers uploadés | Quotidienne | 30 jours |
| Configuration | Hebdomadaire | 90 jours |
| Logs | Hebdomadaire | 14 jours |
Architecture de sauvegarde
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ PostgreSQL │────▶│ pg_dump │────▶│ Stockage local │
│ │ │ │ │ C:\pch-sig\ │
│ │ │ │ │ backups\ │
└─────────────────┘ └─────────────────┘ └────────┬────────┘
│
▼
┌─────────────────┐
│ Stockage distant│
│ (NAS, Cloud) │
└─────────────────┘
Sauvegarde de la base de données
Sauvegarde manuelle
# Sauvegarde complète
docker exec pch_postgres pg_dump -U pch_admin -d pch_sig > backup_$(date +%Y%m%d_%H%M%S).sql
# Sauvegarde compressée
docker exec pch_postgres pg_dump -U pch_admin -d pch_sig | gzip > backup_$(date +%Y%m%d).sql.gz
Script de sauvegarde automatique
Fichier : C:\pch-sig\scripts\backup-db.ps1
# Script de sauvegarde PostgreSQL
$Date = Get-Date -Format "yyyyMMdd_HHmmss"
$BackupDir = "C:\pch-sig\backups\database"
$BackupFile = "$BackupDir\pch_sig_$Date.sql"
# Créer le répertoire si nécessaire
New-Item -ItemType Directory -Force -Path $BackupDir | Out-Null
# Exécuter pg_dump
docker-machine ssh default "docker exec pch_postgres pg_dump -U pch_admin -d pch_sig" > $BackupFile
# Compresser
Compress-Archive -Path $BackupFile -DestinationPath "$BackupFile.zip"
Remove-Item $BackupFile
# Nettoyer les anciennes sauvegardes (> 30 jours)
Get-ChildItem $BackupDir -Filter "*.zip" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Remove-Item
Write-Host "Sauvegarde terminée: $BackupFile.zip"
Options pg_dump
| Option | Description |
|---|---|
-F c | Format custom (restauration sélective) |
-F p | Format SQL texte (par défaut) |
--no-owner | Ignorer les propriétaires |
--schema-only | Structure uniquement |
--data-only | Données uniquement |
Sauvegarde format custom
# Sauvegarde format custom (recommandé)
docker exec pch_postgres pg_dump -U pch_admin -d pch_sig -F c > backup.dump
# Restauration sélective possible
pg_restore -d pch_sig -t menages backup.dump
Sauvegarde des fichiers
Documents uploadés
# Sauvegarder les uploads
$Date = Get-Date -Format "yyyyMMdd"
$Source = "C:\pch-sig\backend\public\uploads"
$Dest = "C:\pch-sig\backups\uploads\uploads_$Date.zip"
Compress-Archive -Path $Source -DestinationPath $Dest
Configuration
# Sauvegarder la configuration
$Date = Get-Date -Format "yyyyMMdd"
$Files = @(
"C:\pch-sig\deploy\docker-compose.yml",
"C:\pch-sig\backend\.env",
"C:\pch-sig\backend\config\jwt\*"
)
Compress-Archive -Path $Files -DestinationPath "C:\pch-sig\backups\config\config_$Date.zip"
Script de sauvegarde complète
Fichier : C:\pch-sig\scripts\backup-full.ps1
# Sauvegarde complète PCH-SIG
param(
[string]$BackupRoot = "C:\pch-sig\backups"
)
$Date = Get-Date -Format "yyyyMMdd_HHmmss"
$BackupDir = "$BackupRoot\full_$Date"
Write-Host "=== Sauvegarde PCH-SIG ===" -ForegroundColor Cyan
Write-Host "Destination: $BackupDir"
# Créer le répertoire
New-Item -ItemType Directory -Force -Path $BackupDir | Out-Null
# 1. Base de données
Write-Host "1. Sauvegarde PostgreSQL..." -ForegroundColor Yellow
docker-machine ssh default "docker exec pch_postgres pg_dump -U pch_admin -d pch_sig" > "$BackupDir\database.sql"
# 2. Redis (optionnel)
Write-Host "2. Sauvegarde Redis..." -ForegroundColor Yellow
docker-machine ssh default "docker exec pch_redis redis-cli -a redis_secure_2025 BGSAVE"
Start-Sleep -Seconds 5
docker-machine ssh default "docker cp pch_redis:/data/dump.rdb /c/pch-sig/backups/redis_$Date.rdb"
# 3. Fichiers uploadés
Write-Host "3. Sauvegarde uploads..." -ForegroundColor Yellow
Copy-Item -Path "C:\pch-sig\backend\public\uploads" -Destination "$BackupDir\uploads" -Recurse
# 4. Configuration
Write-Host "4. Sauvegarde configuration..." -ForegroundColor Yellow
Copy-Item -Path "C:\pch-sig\deploy\docker-compose.yml" -Destination "$BackupDir\"
Copy-Item -Path "C:\pch-sig\backend\.env" -Destination "$BackupDir\backend.env"
Copy-Item -Path "C:\pch-sig\backend\config\jwt" -Destination "$BackupDir\jwt" -Recurse
# 5. Compression
Write-Host "5. Compression..." -ForegroundColor Yellow
Compress-Archive -Path $BackupDir -DestinationPath "$BackupDir.zip"
Remove-Item -Path $BackupDir -Recurse -Force
# 6. Nettoyage anciennes sauvegardes
Write-Host "6. Nettoyage..." -ForegroundColor Yellow
Get-ChildItem "$BackupRoot\full_*.zip" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Remove-Item
Write-Host "=== Sauvegarde terminée ===" -ForegroundColor Green
Write-Host "Fichier: $BackupDir.zip"
Planification des sauvegardes
Tâche planifiée Windows
# Créer la tâche de sauvegarde quotidienne
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-ExecutionPolicy Bypass -File C:\pch-sig\scripts\backup-full.ps1"
$Trigger = New-ScheduledTaskTrigger -Daily -At "02:00"
$Principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
$Settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable
Register-ScheduledTask -TaskName "PCH-SIG Backup" -Action $Action -Trigger $Trigger -Principal $Principal -Settings $Settings -Description "Sauvegarde quotidienne PCH-SIG"
Vérifier la tâche
Get-ScheduledTask -TaskName "PCH-SIG Backup"
Stockage externe
Copie vers NAS
# Copier vers un partage réseau
$Date = Get-Date -Format "yyyyMMdd"
$Source = "C:\pch-sig\backups\full_$Date.zip"
$Dest = "\\nas\backups\pch-sig\"
Copy-Item -Path $Source -Destination $Dest
Synchronisation avec rclone
# Installer rclone et configurer
rclone sync C:\pch-sig\backups remote:pch-sig-backups --progress
Vérification des sauvegardes
Tester l'intégrité
# Vérifier l'archive ZIP
Test-Path "C:\pch-sig\backups\full_20240115.zip"
# Lister le contenu
Expand-Archive -Path "C:\pch-sig\backups\full_20240115.zip" -DestinationPath "C:\temp\test-backup" -Force
Get-ChildItem "C:\temp\test-backup" -Recurse
Tester la restauration
# Restaurer dans une base de test
docker exec -i pch_postgres psql -U pch_admin -c "CREATE DATABASE pch_sig_test;"
docker exec -i pch_postgres psql -U pch_admin -d pch_sig_test < backup.sql
# Vérifier les données
docker exec pch_postgres psql -U pch_admin -d pch_sig_test -c "SELECT count(*) FROM menages;"
Monitoring des sauvegardes
Script de vérification
# check-backups.ps1
$BackupDir = "C:\pch-sig\backups"
$MaxAge = 2 # jours
$LatestBackup = Get-ChildItem "$BackupDir\full_*.zip" |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1
if (-not $LatestBackup) {
Write-Host "ERREUR: Aucune sauvegarde trouvée!" -ForegroundColor Red
exit 1
}
$Age = (Get-Date) - $LatestBackup.LastWriteTime
if ($Age.TotalDays -gt $MaxAge) {
Write-Host "ATTENTION: Dernière sauvegarde il y a $($Age.Days) jours" -ForegroundColor Yellow
exit 1
}
Write-Host "OK: Dernière sauvegarde: $($LatestBackup.Name)" -ForegroundColor Green
Write-Host " Taille: $([math]::Round($LatestBackup.Length/1MB, 2)) MB"
Write-Host " Date: $($LatestBackup.LastWriteTime)"
Bonnes pratiques
Règle 3-2-1
- 3 copies des données
- 2 supports différents (disque local + NAS)
- 1 copie hors site (cloud ou site distant)
Sécurité
- Chiffrer les sauvegardes sensibles
- Protéger l'accès aux fichiers de sauvegarde
- Ne pas stocker les mots de passe en clair dans les scripts
Documentation
- Documenter la procédure de restauration
- Tester régulièrement les restaurations
- Tenir un journal des sauvegardes