Restauração
Este guia explica como restaurar os dados do PCH-SIG a partir de um backup.
Pré-requisitos
Antes de restaurar:
- Acesso aos arquivos de backup
- Acesso de administrador ao servidor
- Docker em execução
- Backup do estado atual (por precaução)
Atenção
A restauração sobrescreve os dados existentes. Certifique-se de ter um backup do estado atual antes de prosseguir.
Restauração do banco de dados
Restauração completa
# Parar a aplicação (evitar escritas)
docker stop pch_backend
# Restaurar o banco de dados
docker exec -i pch_postgres psql -U pch_admin -d pch_sig < backup.sql
# Reiniciar a aplicação
docker start pch_backend
Restauração a partir de arquivo comprimido
# Descomprimir
gunzip backup_20240115.sql.gz
# Restaurar
docker exec -i pch_postgres psql -U pch_admin -d pch_sig < backup_20240115.sql
Restauração formato personalizado (pg_dump -Fc)
# Restauração completa
docker exec -i pch_postgres pg_restore -U pch_admin -d pch_sig -c < backup.dump
# Restauração de uma tabela específica
docker exec -i pch_postgres pg_restore -U pch_admin -d pch_sig -t menages < backup.dump
Restauração seletiva
Restaurar uma única tabela
# Extrair uma tabela do dump
pg_restore -t menages backup.dump > menages_only.sql
# Restaurar a tabela
docker exec -i pch_postgres psql -U pch_admin -d pch_sig < menages_only.sql
Restaurar várias tabelas
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
Restaurar sem as restrições
# Desativar as restrições
docker exec pch_postgres psql -U pch_admin -d pch_sig -c "SET session_replication_role = 'replica';"
# Restaurar
docker exec -i pch_postgres psql -U pch_admin -d pch_sig < backup.sql
# Reativar as restrições
docker exec pch_postgres psql -U pch_admin -d pch_sig -c "SET session_replication_role = 'origin';"
Restauração em um novo banco
Criar um banco de restauração
# Criar o novo banco
docker exec pch_postgres psql -U pch_admin -c "CREATE DATABASE pch_sig_restore;"
# Restaurar no novo banco
docker exec -i pch_postgres psql -U pch_admin -d pch_sig_restore < backup.sql
# Verificar os dados
docker exec pch_postgres psql -U pch_admin -d pch_sig_restore -c "SELECT count(*) FROM menages;"
Substituir o banco principal
# Renomear o banco atual
docker exec pch_postgres psql -U pch_admin -c "ALTER DATABASE pch_sig RENAME TO pch_sig_old;"
# Renomear o banco restaurado
docker exec pch_postgres psql -U pch_admin -c "ALTER DATABASE pch_sig_restore RENAME TO pch_sig;"
# Excluir o banco antigo (após verificação)
docker exec pch_postgres psql -U pch_admin -c "DROP DATABASE pch_sig_old;"
Restauração de arquivos
Documentos enviados
# Descomprimir o arquivo
Expand-Archive -Path "C:\pch-sig\backups\uploads_20240115.zip" -DestinationPath "C:\temp\uploads-restore"
# Copiar para o diretório de uploads
Copy-Item -Path "C:\temp\uploads-restore\*" -Destination "C:\pch-sig\backend\public\uploads" -Recurse -Force
Configuração
# Restaurar docker-compose.yml
Copy-Item -Path "C:\pch-sig\backups\config\docker-compose.yml" -Destination "C:\pch-sig\deploy\"
# Restaurar .env backend
Copy-Item -Path "C:\pch-sig\backups\config\backend.env" -Destination "C:\pch-sig\backend\.env"
# Restaurar as chaves JWT
Copy-Item -Path "C:\pch-sig\backups\config\jwt\*" -Destination "C:\pch-sig\backend\config\jwt\" -Recurse
Restauração completa
Script de restauração
Arquivo: C:\pch-sig\scripts\restore-full.ps1
# Restauração completa PCH-SIG
param(
[Parameter(Mandatory=$true)]
[string]$BackupFile
)
Write-Host "=== Restauração PCH-SIG ===" -ForegroundColor Cyan
Write-Host "Arquivo: $BackupFile"
# Verificar o arquivo
if (-not (Test-Path $BackupFile)) {
Write-Host "ERRO: Arquivo não encontrado!" -ForegroundColor Red
exit 1
}
# Criar um diretório temporário
$TempDir = "C:\temp\pch-restore-$(Get-Date -Format 'yyyyMMdd_HHmmss')"
New-Item -ItemType Directory -Force -Path $TempDir | Out-Null
# Descomprimir
Write-Host "1. Extração do arquivo..." -ForegroundColor Yellow
Expand-Archive -Path $BackupFile -DestinationPath $TempDir
# Salvar o estado atual
Write-Host "2. Backup do estado atual..." -ForegroundColor Yellow
docker-machine ssh default "docker exec pch_postgres pg_dump -U pch_admin -d pch_sig" > "$TempDir\current_backup.sql"
# Parar o backend
Write-Host "3. Parando o backend..." -ForegroundColor Yellow
docker-machine ssh default "docker stop pch_backend"
# Restaurar o banco de dados
Write-Host "4. Restaurando PostgreSQL..." -ForegroundColor Yellow
Get-Content "$TempDir\database.sql" | docker-machine ssh default "docker exec -i pch_postgres psql -U pch_admin -d pch_sig"
# Restaurar os uploads
Write-Host "5. Restaurando uploads..." -ForegroundColor Yellow
if (Test-Path "$TempDir\uploads") {
Copy-Item -Path "$TempDir\uploads\*" -Destination "C:\pch-sig\backend\public\uploads" -Recurse -Force
}
# Restaurar a configuração
Write-Host "6. Restaurando configuração..." -ForegroundColor Yellow
if (Test-Path "$TempDir\jwt") {
Copy-Item -Path "$TempDir\jwt\*" -Destination "C:\pch-sig\backend\config\jwt\" -Recurse -Force
}
# Reiniciar o backend
Write-Host "7. Reiniciando o backend..." -ForegroundColor Yellow
docker-machine ssh default "docker start pch_backend"
# Limpar o cache
Write-Host "8. Limpando o cache..." -ForegroundColor Yellow
docker-machine ssh default "docker exec pch_backend php bin/console cache:clear"
# Limpeza
Write-Host "9. Limpeza..." -ForegroundColor Yellow
Remove-Item -Path $TempDir -Recurse -Force
Write-Host "=== Restauração concluída ===" -ForegroundColor Green
Restauração Redis
# Parar Redis
docker stop pch_redis
# Copiar o arquivo dump.rdb
docker cp dump.rdb pch_redis:/data/dump.rdb
# Reiniciar Redis
docker start pch_redis
# Verificar
docker exec pch_redis redis-cli -a redis_secure_2025 DBSIZE
Verificação pós-restauração
Verificar o banco de dados
# Número de domicílios
docker exec pch_postgres psql -U pch_admin -d pch_sig -c "SELECT count(*) FROM menages;"
# Número de beneficiários
docker exec pch_postgres psql -U pch_admin -d pch_sig -c "SELECT count(*) FROM beneficiaires;"
# Número de pagamentos
docker exec pch_postgres psql -U pch_admin -d pch_sig -c "SELECT count(*) FROM paiements;"
Verificar a integridade
# Verificar as restrições de chave estrangeira
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;"
Testar a aplicação
# Teste API
curl http://localhost:8000/api/health
# Teste autenticação
curl -X POST http://localhost:8000/api/login_check \
-H "Content-Type: application/json" \
-d '{"email":"admin@pch-sig.sn","password":"Admin123!"}'
Solução de problemas
Erro "Database does not exist"
# Criar o banco de dados
docker exec pch_postgres psql -U pch_admin -c "CREATE DATABASE pch_sig;"
# Depois restaurar
docker exec -i pch_postgres psql -U pch_admin -d pch_sig < backup.sql
Erro de permissões
# Corrigir as permissões dos arquivos
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
Erro de versão PostgreSQL
Se o backup vem de uma versão diferente do PostgreSQL:
# Usar pg_restore com --no-owner --no-acl
docker exec -i pch_postgres pg_restore --no-owner --no-acl -U pch_admin -d pch_sig < backup.dump
Conflitos de dados
# Limpar o banco antes da restauração
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;"
# Depois restaurar
docker exec -i pch_postgres psql -U pch_admin -d pch_sig < backup.sql
Ponto de restauração
Criar um ponto de restauração antes de modificação
# Antes de uma operação arriscada
docker exec pch_postgres pg_dump -U pch_admin -d pch_sig -F c > /tmp/before_operation.dump
# Se houver problema, restaurar
docker exec -i pch_postgres pg_restore -U pch_admin -d pch_sig -c < /tmp/before_operation.dump