Pular para o conteúdo principal

Backup

Este guia explica como fazer backup dos dados do Bemba.

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 Bemba
param(
[string]$BackupRoot = "C:\pch-sig\backups"
)

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

Write-Host "=== Backup Bemba ===" -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 "Bemba Backup" -Action $Action -Trigger $Trigger -Principal $Principal -Settings $Settings -Description "Backup diário Bemba"

Verificar a tarefa

Get-ScheduledTask -TaskName "Bemba 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