Procedimentos de Manutenção Preventiva
Sistema Acesso ao Emprego - Portal de Talentos
| Informação | Detalhes |
|---|---|
| Versão do Documento | 1.0.0 |
| Data de Criação | Janeiro/2026 |
| Última Atualização | Janeiro/2026 |
| Classificação | Interno |
| Responsável | Equipe de Operações |
1. Introdução
1.1 Objetivo
Este documento define os procedimentos de manutenção preventiva do Sistema Acesso ao Emprego, visando garantir a disponibilidade, performance e segurança do ambiente de produção.
1.2 Escopo
- Rotinas de verificação diária, semanal e mensal
- Procedimentos de monitoramento
- Gestão de atualizações
- Otimização de recursos
- Verificação de segurança
1.3 Responsabilidades
| Função | Responsabilidade |
|---|---|
| Administrador de Sistemas | Execução das rotinas diárias e semanais |
| DBA | Manutenção do banco de dados |
| DevOps | Atualizações e deploys |
| Segurança | Verificações de segurança |
2. Rotinas Diárias
2.1 Verificação de Saúde dos Serviços
Horário: 08:00 e 18:00 Responsável: Administrador de Sistemas Tempo Estimado: 15 minutos
Procedimento
#!/bin/bash
# /opt/scripts/daily-health-check.sh
echo "=== VERIFICAÇÃO DIÁRIA - $(date) ==="
echo -e "\n[1/6] Status dos Containers..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml ps
echo -e "\n[2/6] Health Check da API..."
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" https://seu-dominio.com.br/api/v1/health/)
if [ "$HTTP_CODE" == "200" ]; then
echo "✅ API: OK (HTTP $HTTP_CODE)"
else
echo "❌ API: FALHA (HTTP $HTTP_CODE)"
fi
echo -e "\n[3/6] Status do Celery Worker..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T backend celery -A app status
echo -e "\n[4/6] Conexões do Banco de Dados..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d portal_talentos_db -c "SELECT count(*) as conexoes_ativas FROM pg_stat_activity WHERE state = 'active';"
echo -e "\n[5/6] Uso de Memória Redis..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T redis redis-cli INFO memory | grep used_memory_human
echo -e "\n[6/6] Uso de Disco..."
df -h / | tail -1
echo -e "\n=== FIM DA VERIFICAÇÃO ==="
Checklist
- Todos os containers em status "Up"
- Health check da API retornando 200
- Celery worker respondendo
- Conexões de banco dentro do normal (< 50)
- Memória Redis abaixo de 70%
- Disco abaixo de 80%
2.2 Análise de Logs de Erro
Horário: 09:00 Responsável: Administrador de Sistemas Tempo Estimado: 20 minutos
Procedimento
#!/bin/bash
# /opt/scripts/analyze-errors.sh
DATE=$(date -d "yesterday" +%Y-%m-%d)
echo "=== ANÁLISE DE ERROS - $DATE ==="
echo -e "\n[Backend] Erros nas últimas 24h:"
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml logs --since="24h" backend 2>&1 | grep -c "ERROR"
echo -e "\n[Backend] Últimos 10 erros:"
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml logs --since="24h" backend 2>&1 | grep "ERROR" | tail -10
echo -e "\n[Worker] Erros nas últimas 24h:"
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml logs --since="24h" worker 2>&1 | grep -c "ERROR"
echo -e "\n[Nginx] Erros 5xx:"
grep "\" 5[0-9][0-9] " /var/log/nginx/portal-talentos.access.log | wc -l
Ações por Tipo de Erro
| Tipo de Erro | Ação |
|---|---|
| Database Connection | Verificar pool de conexões |
| Memory Error | Analisar e reiniciar serviço |
| Timeout | Verificar queries lentas |
| 500 Errors | Analisar stack trace |
2.3 Verificação de Backups
Horário: 10:00 Responsável: DBA Tempo Estimado: 10 minutos
Procedimento
#!/bin/bash
# /opt/scripts/verify-daily-backup.sh
BACKUP_DIR="/backups/database"
TODAY=$(date +%Y%m%d)
echo "=== VERIFICAÇÃO DE BACKUP - $TODAY ==="
LATEST_BACKUP=$(ls -t $BACKUP_DIR/*.enc 2>/dev/null | head -1)
if [ -z "$LATEST_BACKUP" ]; then
echo "❌ ALERTA: Nenhum backup encontrado!"
exit 1
fi
BACKUP_DATE=$(echo $LATEST_BACKUP | grep -oP '\d{8}')
BACKUP_SIZE=$(du -h $LATEST_BACKUP | cut -f1)
echo "✅ Último backup: $LATEST_BACKUP"
echo " Data: $BACKUP_DATE"
echo " Tamanho: $BACKUP_SIZE"
if [ "$BACKUP_DATE" != "$TODAY" ]; then
echo "⚠️ ALERTA: Backup não é de hoje!"
fi
2.4 Monitoramento de Filas
Horário: 11:00 e 16:00 Responsável: Administrador de Sistemas Tempo Estimado: 5 minutos
Procedimento
#!/bin/bash
# /opt/scripts/check-queues.sh
echo "=== MONITORAMENTO DE FILAS ==="
echo -e "\n[Celery] Tasks ativas:"
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T backend celery -A app inspect active
echo -e "\n[Celery] Tasks agendadas:"
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T backend celery -A app inspect scheduled
echo -e "\n[Redis] Tamanho da fila:"
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T redis redis-cli LLEN celery
Limites de Alerta
| Métrica | Normal | Alerta | Crítico |
|---|---|---|---|
| Tasks na fila | < 100 | 100-500 | > 500 |
| Tasks ativas | < 10 | 10-50 | > 50 |
3. Rotinas Semanais
3.1 Limpeza de Dados Temporários
Dia: Segunda-feira Horário: 03:00 (Automático via cron) Tempo Estimado: 30 minutos
Procedimento
#!/bin/bash
# /opt/scripts/weekly-cleanup.sh
echo "=== LIMPEZA SEMANAL - $(date) ==="
echo -e "\n[1/5] Limpando sessões expiradas..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T backend python manage.py clearsessions
echo -e "\n[2/5] Limpando arquivos temporários..."
find /opt/portal-talentos/backend/media/temp -type f -mtime +7 -delete 2>/dev/null
echo "Arquivos removidos: $(find /opt/portal-talentos/backend/media/temp -type f -mtime +7 2>/dev/null | wc -l)"
echo -e "\n[3/5] Limpando logs antigos do Docker..."
docker system prune -f --filter "until=168h"
echo -e "\n[4/5] Rotacionando logs do Nginx..."
sudo logrotate -f /etc/logrotate.d/nginx
echo -e "\n[5/5] Limpando cache Redis expirado..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T redis redis-cli --scan --pattern "*" | head -100
echo -e "\n=== LIMPEZA CONCLUÍDA ==="
3.2 Análise de Performance do Banco de Dados
Dia: Terça-feira Horário: 06:00 Responsável: DBA Tempo Estimado: 45 minutos
Procedimento
#!/bin/bash
# /opt/scripts/db-performance-analysis.sh
echo "=== ANÁLISE DE PERFORMANCE DO BD - $(date) ==="
echo -e "\n[1/6] Tamanho do banco de dados..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d portal_talentos_db -c "SELECT pg_size_pretty(pg_database_size('portal_talentos_db'));"
echo -e "\n[2/6] Top 10 tabelas por tamanho..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d portal_talentos_db -c "
SELECT
schemaname || '.' || tablename as tabela,
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as tamanho_total
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC
LIMIT 10;"
echo -e "\n[3/6] Índices não utilizados..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d portal_talentos_db -c "
SELECT
schemaname || '.' || relname as tabela,
indexrelname as indice,
idx_scan as vezes_usado
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC
LIMIT 10;"
echo -e "\n[4/6] Queries mais lentas..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d portal_talentos_db -c "
SELECT
substring(query, 1, 100) as query,
calls,
round(mean_exec_time::numeric, 2) as tempo_medio_ms,
round(total_exec_time::numeric, 2) as tempo_total_ms
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;"
echo -e "\n[5/6] Dead tuples (necessidade de VACUUM)..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d portal_talentos_db -c "
SELECT
relname as tabela,
n_live_tup as tuplas_vivas,
n_dead_tup as tuplas_mortas,
last_autovacuum
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY n_dead_tup DESC
LIMIT 10;"
echo -e "\n[6/6] Cache hit ratio..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d portal_talentos_db -c "
SELECT
round(100 * sum(blks_hit) / (sum(blks_hit) + sum(blks_read)), 2) as cache_hit_ratio
FROM pg_stat_database
WHERE datname = 'portal_talentos_db';"
echo -e "\n=== ANÁLISE CONCLUÍDA ==="
Métricas de Referência
| Métrica | Ideal | Aceitável | Requer Ação |
|---|---|---|---|
| Cache Hit Ratio | > 99% | 95-99% | < 95% |
| Dead Tuples | < 1000 | 1000-10000 | > 10000 |
| Índices não usados | 0 | 1-5 | > 5 |
3.3 Verificação de Segurança
Dia: Quarta-feira Horário: 10:00 Responsável: Segurança Tempo Estimado: 30 minutos
Checklist de Segurança Semanal
- Verificar tentativas de login falhas
- Analisar logs de acesso suspeitos
- Verificar status dos certificados SSL
- Verificar atualizações de segurança disponíveis
- Revisar permissões de arquivos sensíveis
Script de Verificação
#!/bin/bash
# /opt/scripts/security-check.sh
echo "=== VERIFICAÇÃO DE SEGURANÇA - $(date) ==="
echo -e "\n[1/5] Tentativas de login falhas (últimos 7 dias)..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml logs --since="168h" backend 2>&1 | grep -i "login failed" | wc -l
echo -e "\n[2/5] Validade do certificado SSL..."
echo | openssl s_client -connect seu-dominio.com.br:443 -servername seu-dominio.com.br 2>/dev/null | openssl x509 -noout -dates
echo -e "\n[3/5] Atualizações de segurança pendentes..."
sudo apt list --upgradable 2>/dev/null | grep -i security
echo -e "\n[4/5] Portas abertas..."
sudo netstat -tlnp | grep LISTEN
echo -e "\n[5/5] Verificação de permissões..."
ls -la /opt/portal-talentos/backend/configs/env/.env
echo -e "\n=== VERIFICAÇÃO CONCLUÍDA ==="
3.4 Teste de Restauração de Backup
Dia: Quinta-feira Horário: 06:00 Responsável: DBA Tempo Estimado: 60 minutos
Procedimento
#!/bin/bash
# /opt/scripts/test-backup-restore.sh
echo "=== TESTE DE RESTAURAÇÃO - $(date) ==="
LATEST_BACKUP=$(ls -t /backups/database/*.enc | head -1)
TEST_DB="portal_talentos_test_restore"
echo "[1/5] Descriptografando backup..."
openssl enc -aes-256-cbc -d -pbkdf2 \
-in $LATEST_BACKUP \
-out /tmp/test_restore.dump.gz \
-pass file:/opt/scripts/.backup_key
echo "[2/5] Descompactando..."
gunzip /tmp/test_restore.dump.gz
echo "[3/5] Criando banco de teste..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d postgres -c "DROP DATABASE IF EXISTS $TEST_DB;"
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d postgres -c "CREATE DATABASE $TEST_DB;"
echo "[4/5] Restaurando..."
cat /tmp/test_restore.dump | docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres pg_restore -U portal_talentos_user -d $TEST_DB
echo "[5/5] Verificando integridade..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d $TEST_DB -c "SELECT COUNT(*) FROM accounts_user;"
echo "[Limpeza] Removendo banco de teste..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d postgres -c "DROP DATABASE $TEST_DB;"
rm /tmp/test_restore.dump
echo "✅ Teste de restauração concluído com sucesso!"
4. Rotinas Mensais
4.1 Atualização de Dependências
Dia: Primeiro sábado do mês Horário: 02:00 Responsável: DevOps Tempo Estimado: 2 horas
Procedimento
- Backup pré-atualização
/opt/scripts/backup-database.sh
docker-compose -f docker-compose.prod.yml exec backend pip freeze > /backups/pip_freeze_$(date +%Y%m%d).txt
- Verificar atualizações disponíveis
docker-compose -f docker-compose.prod.yml exec backend pip list --outdated
- Aplicar atualizações de segurança
docker-compose -f docker-compose.prod.yml exec backend pip install --upgrade pip
docker-compose -f docker-compose.prod.yml exec backend pip install -r configs/requirements.txt --upgrade
- Executar testes
docker-compose -f docker-compose.prod.yml exec backend python manage.py test --verbosity=2
- Reiniciar serviços
docker-compose -f docker-compose.prod.yml restart backend worker
4.2 Otimização do Banco de Dados
Dia: Segundo domingo do mês Horário: 03:00 Responsável: DBA Tempo Estimado: 2 horas
Procedimento
#!/bin/bash
# /opt/scripts/monthly-db-optimization.sh
echo "=== OTIMIZAÇÃO MENSAL DO BANCO - $(date) ==="
echo "[1/4] VACUUM ANALYZE em todas as tabelas..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d portal_talentos_db -c "VACUUM ANALYZE;"
echo "[2/4] REINDEX do banco..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d portal_talentos_db -c "REINDEX DATABASE portal_talentos_db;"
echo "[3/4] Atualizando estatísticas..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d portal_talentos_db -c "ANALYZE;"
echo "[4/4] Resetando estatísticas de pg_stat_statements..."
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d portal_talentos_db -c "SELECT pg_stat_statements_reset();"
echo "✅ Otimização concluída!"
4.3 Revisão de Capacidade
Dia: Última sexta-feira do mês Responsável: Administrador de Sistemas Tempo Estimado: 1 hora
Checklist
- Tendência de uso de CPU (últimos 30 dias)
- Tendência de uso de memória
- Crescimento do banco de dados
- Crescimento de arquivos de mídia
- Projeção para próximos 3 meses
- Recomendações de escalonamento
Relatório de Capacidade
#!/bin/bash
# /opt/scripts/capacity-report.sh
echo "=== RELATÓRIO DE CAPACIDADE - $(date) ==="
echo -e "\n[CPU] Média de uso (últimas 24h):"
docker stats --no-stream --format "{{.Name}}: {{.CPUPerc}}"
echo -e "\n[Memória] Uso atual:"
docker stats --no-stream --format "{{.Name}}: {{.MemUsage}}"
echo -e "\n[Disco] Uso atual:"
df -h / /opt /backups
echo -e "\n[Banco] Tamanho atual:"
docker-compose -f /opt/portal-talentos/docker-compose.prod.yml exec -T postgres psql -U portal_talentos_user -d portal_talentos_db -c "SELECT pg_size_pretty(pg_database_size('portal_talentos_db'));"
echo -e "\n[Mídia] Tamanho do diretório:"
du -sh /opt/portal-talentos/backend/media/
5. Rotinas Trimestrais
5.1 Auditoria de Segurança
- Revisão de permissões de usuários
- Análise de logs de auditoria
- Teste de penetração (se aplicável)
- Revisão de políticas de senha
- Verificação de compliance
5.2 Teste de Recuperação de Desastres
- Simulação de falha completa
- Teste de failover
- Medição de RTO/RPO real
- Atualização do plano de DR
5.3 Revisão de Documentação
- Atualização de procedimentos
- Revisão de contatos de emergência
- Validação de scripts de automação
6. Automação e Agendamento
6.1 Configuração do Cron
# /etc/cron.d/portal-talentos-maintenance
# Rotinas Diárias
0 8,18 * * * root /opt/scripts/daily-health-check.sh >> /var/log/maintenance/health-check.log 2>&1
0 9 * * * root /opt/scripts/analyze-errors.sh >> /var/log/maintenance/errors.log 2>&1
0 10 * * * root /opt/scripts/verify-daily-backup.sh >> /var/log/maintenance/backup-verify.log 2>&1
0 11,16 * * * root /opt/scripts/check-queues.sh >> /var/log/maintenance/queues.log 2>&1
# Rotinas Semanais
0 3 * * 1 root /opt/scripts/weekly-cleanup.sh >> /var/log/maintenance/cleanup.log 2>&1
0 6 * * 2 root /opt/scripts/db-performance-analysis.sh >> /var/log/maintenance/db-perf.log 2>&1
0 10 * * 3 root /opt/scripts/security-check.sh >> /var/log/maintenance/security.log 2>&1
0 6 * * 4 root /opt/scripts/test-backup-restore.sh >> /var/log/maintenance/restore-test.log 2>&1
# Rotinas Mensais
0 3 8-14 * 0 root /opt/scripts/monthly-db-optimization.sh >> /var/log/maintenance/db-opt.log 2>&1
6.2 Monitoramento das Rotinas
#!/bin/bash
# /opt/scripts/check-maintenance-status.sh
echo "=== STATUS DAS ROTINAS DE MANUTENÇÃO ==="
for log in /var/log/maintenance/*.log; do
LAST_RUN=$(tail -1 "$log" | grep -oP '\d{4}-\d{2}-\d{2}' | head -1)
STATUS=$(tail -1 "$log" | grep -q "✅\|sucesso\|OK" && echo "✅" || echo "⚠️")
echo "$STATUS $(basename $log .log): Última execução: $LAST_RUN"
done
7. Registro e Documentação
7.1 Registro de Manutenções
Todas as manutenções devem ser registradas no sistema de tickets com:
- Data e hora
- Procedimento executado
- Resultado
- Observações
- Responsável
7.2 Métricas de Acompanhamento
| Métrica | Meta | Medição |
|---|---|---|
| Disponibilidade | > 99.9% | Mensal |
| Backups bem-sucedidos | 100% | Diário |
| Tempo de resposta API | < 200ms | Contínuo |
| Incidentes evitados | Tendência ↓ | Trimestral |
Controle de Alterações
| Versão | Data | Alteração | Autor |
|---|---|---|---|
| 1.0.0 | Jan/2026 | Versão inicial | [Nome] |