Pular para o conteúdo principal

Procedimentos de Manutenção Preventiva

Sistema Acesso ao Emprego - Portal de Talentos


InformaçãoDetalhes
Versão do Documento1.0.0
Data de CriaçãoJaneiro/2026
Última AtualizaçãoJaneiro/2026
ClassificaçãoInterno
ResponsávelEquipe 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çãoResponsabilidade
Administrador de SistemasExecução das rotinas diárias e semanais
DBAManutenção do banco de dados
DevOpsAtualizações e deploys
SegurançaVerificaçõ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 ErroAção
Database ConnectionVerificar pool de conexões
Memory ErrorAnalisar e reiniciar serviço
TimeoutVerificar queries lentas
500 ErrorsAnalisar 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étricaNormalAlertaCrítico
Tasks na fila< 100100-500> 500
Tasks ativas< 1010-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étricaIdealAceitávelRequer Ação
Cache Hit Ratio> 99%95-99%< 95%
Dead Tuples< 10001000-10000> 10000
Índices não usados01-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

  1. 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
  1. Verificar atualizações disponíveis
docker-compose -f docker-compose.prod.yml exec backend pip list --outdated
  1. 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
  1. Executar testes
docker-compose -f docker-compose.prod.yml exec backend python manage.py test --verbosity=2
  1. 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étricaMetaMedição
Disponibilidade> 99.9%Mensal
Backups bem-sucedidos100%Diário
Tempo de resposta API< 200msContínuo
Incidentes evitadosTendência ↓Trimestral

Controle de Alterações

VersãoDataAlteraçãoAutor
1.0.0Jan/2026Versão inicial[Nome]