Pular para o conteúdo principal

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

Próximos passos