Pular para o conteúdo principal

Backup

Este guia explica como fazer backup dos dados do PCH-SIG.

Estratégia de backup

Elementos para backup

ElementoFrequênciaRetenção
Banco de dados PostgreSQLDiária30 dias
Arquivos enviadosDiária30 dias
ConfiguraçãoSemanal90 dias
LogsSemanal14 dias

Arquitetura de backup

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│ PostgreSQL │────▶│ pg_dump │────▶│ Armazenamento │
│ │ │ │ │ local │
│ │ │ │ │ C:\pch-sig\ │
│ │ │ │ │ backups\ │
└─────────────────┘ └─────────────────┘ └────────┬────────┘


┌─────────────────┐
│ Armazenamento │
│ remoto │
│ (NAS, Cloud) │
└─────────────────┘

Backup do banco de dados

Backup manual

# Backup completo
docker exec pch_postgres pg_dump -U pch_admin -d pch_sig > backup_$(date +%Y%m%d_%H%M%S).sql

# Backup comprimido
docker exec pch_postgres pg_dump -U pch_admin -d pch_sig | gzip > backup_$(date +%Y%m%d).sql.gz

Script de backup automático

Arquivo: C:\pch-sig\scripts\backup-db.ps1

# Script de backup PostgreSQL
$Date = Get-Date -Format "yyyyMMdd_HHmmss"
$BackupDir = "C:\pch-sig\backups\database"
$BackupFile = "$BackupDir\pch_sig_$Date.sql"

# Criar o diretório se necessário
New-Item -ItemType Directory -Force -Path $BackupDir | Out-Null

# Executar pg_dump
docker-machine ssh default "docker exec pch_postgres pg_dump -U pch_admin -d pch_sig" > $BackupFile

# Comprimir
Compress-Archive -Path $BackupFile -DestinationPath "$BackupFile.zip"
Remove-Item $BackupFile

# Limpar backups antigos (> 30 dias)
Get-ChildItem $BackupDir -Filter "*.zip" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Remove-Item

Write-Host "Backup concluído: $BackupFile.zip"

Opções pg_dump

OpçãoDescrição
-F cFormato personalizado (restauração seletiva)
-F pFormato SQL texto (padrão)
--no-ownerIgnorar proprietários
--schema-onlyApenas estrutura
--data-onlyApenas dados

Backup formato personalizado

# Backup formato personalizado (recomendado)
docker exec pch_postgres pg_dump -U pch_admin -d pch_sig -F c > backup.dump

# Restauração seletiva possível
pg_restore -d pch_sig -t menages backup.dump

Backup de arquivos

Documentos enviados

# Fazer backup dos 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

Configuração

# Fazer backup da configuração
$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 backup completo

Arquivo: C:\pch-sig\scripts\backup-full.ps1

# Backup completo PCH-SIG
param(
[string]$BackupRoot = "C:\pch-sig\backups"
)

$Date = Get-Date -Format "yyyyMMdd_HHmmss"
$BackupDir = "$BackupRoot\full_$Date"

Write-Host "=== Backup PCH-SIG ===" -ForegroundColor Cyan
Write-Host "Destino: $BackupDir"

# Criar o diretório
New-Item -ItemType Directory -Force -Path $BackupDir | Out-Null

# 1. Banco de dados
Write-Host "1. Backup PostgreSQL..." -ForegroundColor Yellow
docker-machine ssh default "docker exec pch_postgres pg_dump -U pch_admin -d pch_sig" > "$BackupDir\database.sql"

# 2. Redis (opcional)
Write-Host "2. Backup 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. Arquivos enviados
Write-Host "3. Backup uploads..." -ForegroundColor Yellow
Copy-Item -Path "C:\pch-sig\backend\public\uploads" -Destination "$BackupDir\uploads" -Recurse

# 4. Configuração
Write-Host "4. Backup configuração..." -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. Compressão
Write-Host "5. Compressão..." -ForegroundColor Yellow
Compress-Archive -Path $BackupDir -DestinationPath "$BackupDir.zip"
Remove-Item -Path $BackupDir -Recurse -Force

# 6. Limpeza de backups antigos
Write-Host "6. Limpeza..." -ForegroundColor Yellow
Get-ChildItem "$BackupRoot\full_*.zip" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Remove-Item

Write-Host "=== Backup concluído ===" -ForegroundColor Green
Write-Host "Arquivo: $BackupDir.zip"

Agendamento de backups

Tarefa agendada Windows

# Criar tarefa de backup diário
$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 "Backup diário PCH-SIG"

Verificar a tarefa

Get-ScheduledTask -TaskName "PCH-SIG Backup"

Armazenamento externo

Cópia para NAS

# Copiar para um compartilhamento de rede
$Date = Get-Date -Format "yyyyMMdd"
$Source = "C:\pch-sig\backups\full_$Date.zip"
$Dest = "\\nas\backups\pch-sig\"

Copy-Item -Path $Source -Destination $Dest

Sincronização com rclone

# Instalar rclone e configurar
rclone sync C:\pch-sig\backups remote:pch-sig-backups --progress

Verificação dos backups

Testar a integridade

# Verificar o arquivo ZIP
Test-Path "C:\pch-sig\backups\full_20240115.zip"

# Listar o conteúdo
Expand-Archive -Path "C:\pch-sig\backups\full_20240115.zip" -DestinationPath "C:\temp\test-backup" -Force
Get-ChildItem "C:\temp\test-backup" -Recurse

Testar a restauração

# Restaurar em um banco de teste
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

# Verificar os dados
docker exec pch_postgres psql -U pch_admin -d pch_sig_test -c "SELECT count(*) FROM menages;"

Monitoramento dos backups

Script de verificação

# check-backups.ps1
$BackupDir = "C:\pch-sig\backups"
$MaxAge = 2 # dias

$LatestBackup = Get-ChildItem "$BackupDir\full_*.zip" |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1

if (-not $LatestBackup) {
Write-Host "ERRO: Nenhum backup encontrado!" -ForegroundColor Red
exit 1
}

$Age = (Get-Date) - $LatestBackup.LastWriteTime

if ($Age.TotalDays -gt $MaxAge) {
Write-Host "ATENÇÃO: Último backup há $($Age.Days) dias" -ForegroundColor Yellow
exit 1
}

Write-Host "OK: Último backup: $($LatestBackup.Name)" -ForegroundColor Green
Write-Host " Tamanho: $([math]::Round($LatestBackup.Length/1MB, 2)) MB"
Write-Host " Data: $($LatestBackup.LastWriteTime)"

Boas práticas

Regra 3-2-1

  • 3 cópias dos dados
  • 2 suportes diferentes (disco local + NAS)
  • 1 cópia fora do local (cloud ou local distante)

Segurança

  • Criptografar backups sensíveis
  • Proteger o acesso aos arquivos de backup
  • Não armazenar senhas em texto claro nos scripts

Documentação

  • Documentar o procedimento de restauração
  • Testar regularmente as restaurações
  • Manter um registro dos backups

Próximos passos