Configuração de Backup Automático
Visão Geral
Este guia aborda a implementação de backups automáticos para o servidor de ferramentas BITIO, incluindo dados do Forgejo, configurações do Pritunl e metadados do sistema.
🎯 Estratégia de Backup
Tipos de Backup
| Tipo | Frequência | Retenção | Destino |
|---|---|---|---|
| Local | Diário | 7 dias | Volume EBS local |
| S3 | Semanal | 30 dias | Amazon S3 |
| Snapshot EBS | Semanal | 4 semanas | AWS EBS Snapshots |
Dados a Fazer Backup
Dados Críticos:
- Repositórios Git (Forgejo)
- Banco de dados PostgreSQL
- Configurações VPN (Pritunl)
- Chaves SSH
- Certificados SSL
Configurações:
- Docker Compose files
- Nginx configuration
- UFW rules
- Cron jobs
📦 Configuração do Backup Local
1. Script de Backup Principal
#!/bin/bash
# /home/ubuntu/scripts/backup-tools.sh
set -e
# Configurações
BACKUP_DIR="/mnt/forgejo_data/backups"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7
LOG_FILE="/var/log/bitio-backup.log"
# Função de log
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "=== Iniciando backup $DATE ==="
# Criar diretório de backup se não existir
mkdir -p "$BACKUP_DIR"
# 1. Backup do banco de dados PostgreSQL
log "Fazendo backup do banco de dados..."
docker exec forgejo-db pg_dump -U forgejo -h localhost -d forgejo > "$BACKUP_DIR/forgejo-db-$DATE.sql"
# 2. Backup dos dados do Forgejo
log "Fazendo backup dos dados do Forgejo..."
tar -czf "$BACKUP_DIR/forgejo-data-$DATE.tar.gz" -C /mnt/forgejo_data forgejo/data forgejo/config
# 3. Backup das configurações do Pritunl
log "Fazendo backup das configurações do Pritunl..."
tar -czf "$BACKUP_DIR/pritunl-config-$DATE.tar.gz" -C /mnt/forgejo_data pritunl/
# 4. Backup das configurações do sistema
log "Fazendo backup das configurações do sistema..."
tar -czf "$BACKUP_DIR/system-config-$DATE.tar.gz" \
/etc/nginx/sites-available/ \
/home/ubuntu/.ssh/ \
/home/ubuntu/scripts/ \
/etc/ufw/ \
/var/spool/cron/crontabs/
# 5. Backup dos Docker Compose files
log "Fazendo backup dos Docker Compose files..."
tar -czf "$BACKUP_DIR/docker-compose-$DATE.tar.gz" \
/mnt/forgejo_data/forgejo/docker-compose.yml \
/mnt/forgejo_data/pritunl/docker-compose.yml
# 6. Criar manifest do backup
cat > "$BACKUP_DIR/backup-manifest-$DATE.txt" << EOF
BITIO Tools Server Backup Manifest
================================
Date: $DATE
Server: $(hostname)
IP: $(curl -s ifconfig.me)
Files included:
- forgejo-db-$DATE.sql (PostgreSQL dump)
- forgejo-data-$DATE.tar.gz (Git repositories and configs)
- pritunl-config-$DATE.tar.gz (VPN configurations)
- system-config-$DATE.tar.gz (System configurations)
- docker-compose-$DATE.tar.gz (Container definitions)
Sizes:
$(ls -lh "$BACKUP_DIR"/*$DATE* | awk '{print $5" "$9}')
Total size: $(du -sh "$BACKUP_DIR" | awk '{print $1}')
EOF
log "Backup local concluído. Arquivos:"
ls -la "$BACKUP_DIR"/*$DATE*
# Limpeza de backups antigos
log "Limpando backups locais antigos (>$RETENTION_DAYS dias)..."
find "$BACKUP_DIR" -name "*.sql" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_DIR" -name "*.txt" -mtime +$RETENTION_DAYS -delete
log "=== Backup $DATE concluído com sucesso ==="
2. Tornar o Script Executável
# Criar diretório de scripts
sudo mkdir -p /home/ubuntu/scripts
# Copiar e dar permissão
sudo cp backup-tools.sh /home/ubuntu/scripts/
sudo chmod +x /home/ubuntu/scripts/backup-tools.sh
sudo chown ubuntu:ubuntu /home/ubuntu/scripts/backup-tools.sh
☁️ Configuração do Backup S3
1. Configurar AWS CLI e S3
# Instalar AWS CLI (se não estiver instalado)
sudo apt install awscli
# Configurar credentials (já configurado com profile bitio)
aws configure list --profile bitio
# Criar bucket S3 para backups
aws s3 mb s3://bitio-tools-backups-staging --profile bitio
# Configurar lifecycle policy para limpeza automática
cat > /tmp/s3-lifecycle.json << EOF
{
"Rules": [
{
"ID": "BitioToolsBackupRetention",
"Status": "Enabled",
"Transitions": [
{
"Days": 7,
"StorageClass": "STANDARD_IA"
},
{
"Days": 30,
"StorageClass": "GLACIER"
}
],
"Expiration": {
"Days": 90
}
}
]
}
EOF
aws s3api put-bucket-lifecycle-configuration \
--bucket bitio-tools-backups-staging \
--lifecycle-configuration file:///tmp/s3-lifecycle.json \
--profile bitio
2. Script de Sync para S3
#!/bin/bash
# /home/ubuntu/scripts/sync-to-s3.sh
set -e
BACKUP_DIR="/mnt/forgejo_data/backups"
S3_BUCKET="bitio-tools-backups-staging"
LOG_FILE="/var/log/bitio-s3-sync.log"
AWS_PROFILE="bitio"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "=== Iniciando sync para S3 ==="
# Sync dos backups para S3
log "Fazendo upload dos backups para S3..."
aws s3 sync "$BACKUP_DIR" "s3://$S3_BUCKET/" \
--profile $AWS_PROFILE \
--storage-class STANDARD \
--exclude "*.tmp" \
--exclude "*.log"
# Verificar se upload foi bem-sucedido
UPLOAD_STATUS=$?
if [ $UPLOAD_STATUS -eq 0 ]; then
log "Upload para S3 concluído com sucesso"
else
log "ERRO: Falha no upload para S3 (código: $UPLOAD_STATUS)"
exit 1
fi
# Listar backups no S3
log "Backups disponíveis no S3:"
aws s3 ls "s3://$S3_BUCKET/" --profile $AWS_PROFILE
log "=== Sync S3 concluído ==="
📅 Configuração do Cron
1. Configurar Jobs de Backup
# Editar crontab do usuário ubuntu
crontab -e
# Adicionar as seguintes linhas:
# Backup local diário às 2:00 AM
0 2 * * * /home/ubuntu/scripts/backup-tools.sh >> /var/log/bitio-backup.log 2>&1
# Sync para S3 às terças e sextas às 3:00 AM
0 3 * * 2,5 /home/ubuntu/scripts/sync-to-s3.sh >> /var/log/bitio-s3-sync.log 2>&1
# Limpeza de logs antigos todo domingo às 4:00 AM
0 4 * * 0 find /var/log -name "bitio-*.log" -mtime +30 -delete
# Health check dos backups toda segunda às 8:00 AM
0 8 * * 1 /home/ubuntu/scripts/backup-healthcheck.sh >> /var/log/bitio-backup-check.log 2>&1
2. Script de Health Check
#!/bin/bash
# /home/ubuntu/scripts/backup-healthcheck.sh
BACKUP_DIR="/mnt/forgejo_data/backups"
LOG_FILE="/var/log/bitio-backup-check.log"
ALERT_EMAIL="admin@bitio.com.br"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "=== Verificação de saúde dos backups ==="
# Verificar se existem backups recentes
RECENT_BACKUPS=$(find "$BACKUP_DIR" -name "*.sql" -mtime -2 | wc -l)
if [ $RECENT_BACKUPS -eq 0 ]; then
log "ERRO: Nenhum backup encontrado nos últimos 2 dias"
echo "ALERTA: Backups BITIO Tools não estão sendo executados" | \
mail -s "BITIO Tools - Backup Alert" $ALERT_EMAIL 2>/dev/null || true
fi
# Verificar tamanho dos backups
BACKUP_SIZE=$(du -sm "$BACKUP_DIR" | awk '{print $1}')
if [ $BACKUP_SIZE -lt 10 ]; then
log "AVISO: Tamanho dos backups muito pequeno ($BACKUP_SIZE MB)"
fi
# Verificar integridade do último backup do banco
LATEST_DB_BACKUP=$(ls -t "$BACKUP_DIR"/forgejo-db-*.sql 2>/dev/null | head -1)
if [ -n "$LATEST_DB_BACKUP" ]; then
if ! head -10 "$LATEST_DB_BACKUP" | grep -q "PostgreSQL"; then
log "ERRO: Último backup do banco parece corrompido"
else
log "Último backup do banco OK: $(basename $LATEST_DB_BACKUP)"
fi
fi
log "=== Verificação concluída ==="
📊 Monitoramento de Backups
1. Dashboard de Backup Status
#!/bin/bash
# /home/ubuntu/scripts/backup-status.sh
BACKUP_DIR="/mnt/forgejo_data/backups"
echo "=== BITIO Tools - Status dos Backups ==="
echo "Data: $(date)"
echo ""
echo "📁 Backups Locais:"
echo "Total de arquivos: $(ls -1 $BACKUP_DIR/*.sql $BACKUP_DIR/*.tar.gz 2>/dev/null | wc -l)"
echo "Espaço utilizado: $(du -sh $BACKUP_DIR | awk '{print $1}')"
echo "Último backup: $(ls -t $BACKUP_DIR/backup-manifest-*.txt 2>/dev/null | head -1 | xargs basename)"
echo ""
echo "☁️ Backups S3:"
aws s3 ls s3://bitio-tools-backups-staging/ --profile bitio --recursive --human-readable --summarize | tail -2
echo ""
echo "🔍 Últimos 5 backups:"
ls -lt $BACKUP_DIR/backup-manifest-*.txt 2>/dev/null | head -5 | awk '{print $6" "$7" "$8" - "$9}' || echo "Nenhum backup encontrado"
2. Alertas por Email
# Instalar mailutils para envio de emails
sudo apt install mailutils postfix
# Configurar Postfix como satellite (relay via outro servidor SMTP)
sudo dpkg-reconfigure postfix
🔄 Procedimentos de Restore
1. Restore Completo
#!/bin/bash
# /home/ubuntu/scripts/restore-from-backup.sh
set -e
BACKUP_DATE="$1" # Format: YYYYMMDD_HHMMSS
BACKUP_DIR="/mnt/forgejo_data/backups"
if [ -z "$BACKUP_DATE" ]; then
echo "Uso: $0 <data_backup>"
echo "Exemplo: $0 20260703_020000"
echo ""
echo "Backups disponíveis:"
ls $BACKUP_DIR/backup-manifest-*.txt | sed 's/.*manifest-//' | sed 's/.txt//'
exit 1
fi
echo "=== RESTORE FROM BACKUP $BACKUP_DATE ==="
echo "⚠️ ATENÇÃO: Este processo irá substituir todos os dados atuais!"
read -p "Deseja continuar? (yes/NO): " confirm
if [ "$confirm" != "yes" ]; then
echo "Restore cancelado."
exit 0
fi
# Parar serviços
echo "Parando serviços..."
cd /mnt/forgejo_data/forgejo && docker compose down
cd /mnt/forgejo_data/pritunl && docker compose down
# Fazer backup dos dados atuais
echo "Fazendo backup de segurança dos dados atuais..."
mv /mnt/forgejo_data/forgejo/data /mnt/forgejo_data/forgejo/data.backup-$(date +%s)
mv /mnt/forgejo_data/pritunl /mnt/forgejo_data/pritunl.backup-$(date +%s)
# Restaurar dados
echo "Restaurando dados do Forgejo..."
tar -xzf "$BACKUP_DIR/forgejo-data-$BACKUP_DATE.tar.gz" -C /mnt/forgejo_data/
echo "Restaurando configurações do Pritunl..."
tar -xzf "$BACKUP_DIR/pritunl-config-$BACKUP_DATE.tar.gz" -C /mnt/forgejo_data/
# Iniciar banco de dados
echo "Iniciando banco de dados..."
cd /mnt/forgejo_data/forgejo && docker compose up -d forgejo-db
sleep 10
# Restaurar banco de dados
echo "Restaurando banco de dados..."
docker exec -i forgejo-db psql -U forgejo -d forgejo < "$BACKUP_DIR/forgejo-db-$BACKUP_DATE.sql"
# Iniciar todos os serviços
echo "Iniciando serviços..."
cd /mnt/forgejo_data/forgejo && docker compose up -d
cd /mnt/forgejo_data/pritunl && docker compose up -d
echo "=== RESTORE CONCLUÍDO ==="
echo "Verifique se os serviços estão funcionando:"
echo "- Forgejo: http://3.208.54.208"
echo "- Pritunl: https://3.208.54.208:9443"
2. Restore de S3
#!/bin/bash
# Baixar backup específico do S3
aws s3 cp s3://bitio-tools-backups-staging/backup-manifest-20260703_020000.txt /tmp/ --profile bitio
# Baixar todos os arquivos do backup
aws s3 sync s3://bitio-tools-backups-staging/ /tmp/restore-s3/ \
--profile bitio \
--exclude "*" \
--include "*20260703_020000*"
# Executar restore
/home/ubuntu/scripts/restore-from-backup.sh 20260703_020000
🧪 Teste de Backup e Restore
1. Script de Teste
#!/bin/bash
# /home/ubuntu/scripts/test-backup-restore.sh
echo "=== TESTE DE BACKUP E RESTORE ==="
# 1. Executar backup
echo "1. Executando backup de teste..."
/home/ubuntu/scripts/backup-tools.sh
# 2. Verificar arquivos criados
LATEST_BACKUP=$(ls -t /mnt/forgejo_data/backups/backup-manifest-*.txt | head -1)
BACKUP_DATE=$(basename $LATEST_BACKUP | sed 's/backup-manifest-//' | sed 's/.txt//')
echo "2. Backup criado: $BACKUP_DATE"
# 3. Testar integridade do backup do banco
echo "3. Testando integridade do backup do banco..."
DB_BACKUP="/mnt/forgejo_data/backups/forgejo-db-$BACKUP_DATE.sql"
if head -10 "$DB_BACKUP" | grep -q "PostgreSQL"; then
echo " ✅ Backup do banco OK"
else
echo " ❌ Problema no backup do banco"
fi
# 4. Verificar arquivos tar
echo "4. Verificando arquivos compactados..."
for file in /mnt/forgejo_data/backups/*$BACKUP_DATE*.tar.gz; do
if tar -tzf "$file" > /dev/null 2>&1; then
echo " ✅ $(basename $file) OK"
else
echo " ❌ $(basename $file) corrompido"
fi
done
echo "=== TESTE CONCLUÍDO ==="
📋 Checklist de Backup
Configuração Inicial
- Scripts de backup criados e testados
- Cron jobs configurados
- Bucket S3 criado com políticas de lifecycle
- Testes de restore executados
- Monitoramento configurado
Verificação Mensal
- Verificar se backups estão sendo executados
- Testar restore de backup recente
- Verificar espaço utilizado em S3
- Revisar logs de backup
- Validar integridade dos arquivos
Manutenção Trimestral
- Executar restore completo em ambiente de teste
- Revisar retenção de backups
- Otimizar tamanho dos backups
- Atualizar documentação de procedures
- Treinar equipe nos procedimentos de restore