Runbook Operacional
Introdução ao documento
Este runbook descreve os procedimentos operacionais para executar, implantar e recuperar o serviço activity-delivery-api.
Versionamento
- Versão do documento: 1.0.0
- Última atualização: 2026-03-04
- Responsável: Time Dhedalos
Referencial teórico
Escopo
- Ambiente local (Docker Compose)
- Deploy (GitHub Actions + Helm + Kubernetes)
- Rollback
- Troubleshooting
Fontes de verdade
docker-compose.yml— serviços Docker locaisDockerfile— build de produção.github/workflows/ci-cd-pipeline.yaml— pipeline CI/CD.github/workflows/test.yaml— pipeline de testeshelm/— charts Helm para deploy Kuberneteskubernetes/— configs específicas por cluster
Como rodar local
Pré-requisitos:
- Docker e Docker Compose instalados
- Node.js / npm instalados na máquina host
- Portas disponíveis: 8000, 5173, 13306, 8025, 6379
Comandos:
# Start (primeira vez)
npm install
cp .env.example .env
docker-compose up --build
docker-compose exec laravel php artisan migrate --seed
docker-compose exec laravel php artisan key:generate
docker-compose exec laravel php artisan storage:link
# Start (subsequente)
docker-compose up
# Logs
docker-compose logs -f laravel
# Stop
docker-compose down
# Stop e limpar volumes
docker-compose down -v
Serviços Docker (local)
| Serviço | Porta | Descrição |
|---|---|---|
laravel | 8000 | Aplicação principal (PHP + Octane) |
vite | 5173 | Build de frontend (assets) |
mysql | 13306 (host) → 3306 (container) | Banco de dados MySQL 8.0 |
mailhog | 8025 | Servidor de e-mail para testes |
redis | 6379 | Cache e sessão |
Deploy
Pipeline CI/CD
- Trigger: push/PR em qualquer branch
- Etapas:
build— Build da imagem Docker, push para registry com tags (branch normalizada + SHA)deploy-piloto— Deploy automático na branchmainpara clusteroke-we-002, namespacepiloto-dhedalos-ecosystemdeploy-prod— Deploy automático na branchreleasepara clusteroke-we-001, namespacedhedalos-ecosystem
- Evidência:
.github/workflows/ci-cd-pipeline.yaml:15-86
Pipeline de Testes
- Trigger: push/PR para branch
main - Etapas:
- Setup PHP 8.2 + MySQL 8.0
composer install(usacomposer.ci.jsonpara evitar dependências privadas)- Migrations + seed
- PHP CS Fixer (se config presente)
- PHPStan (se config presente)
php artisan test --coverage- Upload de cobertura para Codecov
- Bloqueio: deploy só acontece se testes passarem
- Evidência:
.github/workflows/test.yaml
Dockerfile (produção)
- Base:
dunglas/frankenphp:1.3.2-php8.3.14 - Extensões:
pdo_mysql,pdo_pgsql,redis - Limites: memory 6144M, upload 5120M
- Entrypoint: migrations → storage link → optimize → Octane FrankenPHP (porta 8000)
- Worker: Supervisor configurado para
artisan queue:work - Evidência:
Dockerfile:1,30-33
Comando de deploy manual (Helm)
# Piloto
helm upgrade --install activity-delivery-api ./helm \
--namespace piloto-dhedalos-ecosystem \
--kubeconfig <path-to-kubeconfig-oke-we-002>
# Produção
helm upgrade --install activity-delivery-api ./helm \
--namespace dhedalos-ecosystem \
--kubeconfig <path-to-kubeconfig-oke-we-001>
⚠️ PENDÊNCIA: Verificar valores reais do Helm chart (
helm/values.yaml) para secrets, replicas e resource limits.
Rollback
# Rollback Helm (última revisão)
helm rollback activity-delivery-api --namespace <namespace>
# Rollback para revisão específica
helm history activity-delivery-api --namespace <namespace>
helm rollback activity-delivery-api <revision> --namespace <namespace>
# Rollback de migration (local)
docker-compose exec laravel php artisan migrate:rollback
# Rollback de migration (N steps)
docker-compose exec laravel php artisan migrate:rollback --step=3
Comandos úteis
Logs
# Local — logs do container
docker-compose logs -f laravel
# Local — log viewer (browser)
# http://localhost:8000/admin/api-logs (requer login admin)
# Produção — kubectl
kubectl logs -f deployment/activity-delivery-api -n <namespace>
Migração / Schema
# Executar migrations pendentes
docker-compose exec laravel php artisan migrate
# Status das migrations
docker-compose exec laravel php artisan migrate:status
# Rollback
docker-compose exec laravel php artisan migrate:rollback
# Fresh (drop all + migrate + seed) — APENAS DEV
docker-compose exec laravel php artisan migrate:fresh --seed
Cache / Otimização
# Limpar cache de aplicação
docker-compose exec laravel php artisan cache:clear
# Limpar cache de configuração
docker-compose exec laravel php artisan config:clear
# Limpar cache de rotas
docker-compose exec laravel php artisan route:clear
# Otimizar para produção
docker-compose exec laravel php artisan optimize
Queue / Worker
# Iniciar worker manualmente
docker-compose exec laravel php artisan queue:work
# Listar jobs falhados
docker-compose exec laravel php artisan queue:failed
# Reprocessar jobs falhados
docker-compose exec laravel php artisan queue:retry all
# Limpar jobs falhados
docker-compose exec laravel php artisan queue:flush
API Key
# Gerar nova chave de API
docker-compose exec laravel php artisan api:key:generate --description="App Mobile"
Swagger
# Regenerar documentação
docker-compose exec laravel php artisan l5-swagger:generate
Troubleshooting (Top 5)
1. 401 Unauthorized na API
- Sintoma: Resposta 401 em chamadas à API.
- Causa provável: API Key inválida ou ausente; JWT expirado (1h de validade).
- Como diagnosticar: Verificar header
Authorizationna request; verificar se a API Key existe na tabelaapi_keys; verificar expiração do JWT. - Ação de correção: Gerar nova API Key (
php artisan api:key:generate); obter novo JWT viaGET /api/submissions/token.
2. Falha de upload de arquivo
- Sintoma: Erro 422 ou 500 ao submeter arquivos.
- Causa provável: MIME type não permitido; tamanho excedendo limite; storage S3 inacessível.
- Como diagnosticar: Verificar MIME types em
app/Helpers/MimeTypes.php; verificar logs do Laravel; verificar configuração AWS no.env. - Ação de correção: Validar tipo de arquivo; ajustar
upload_max_filesize/post_max_sizeno PHP; verificar credenciais AWS.
3. Notificação Novu não enviada
- Sintoma: Participante/facilitador não recebe notificação.
- Causa provável:
NOVU_SECRET_KEYinválida;app_keydo workflow não encontrada na tabelanovu_keys; Novu API fora do ar. - Como diagnosticar: Verificar logs do
NotificationService; verificar tabelanovu_keys; testar Novu API manualmente. - Ação de correção: Atualizar
NOVU_SECRET_KEYno.env; inserir workflow correto na tabelanovu_keys.
4. Falha de deploy (CI/CD)
- Sintoma: Pipeline falha no GitHub Actions.
- Causa provável: Testes falhando; build Docker com erro; registry inacessível.
- Como diagnosticar: Verificar logs do GitHub Actions; rodar testes localmente; verificar Dockerfile.
- Ação de correção: Corrigir testes falhando; rebuild local da imagem Docker; verificar credenciais do registry.
5. Erro de conexão com banco de dados
- Sintoma:
SQLSTATE[HY000]ouConnection refused. - Causa provável: Container MySQL não iniciou; credenciais incorretas no
.env; banco não existe. - Como diagnosticar:
docker-compose pspara verificar estado dos containers; verificar variáveisDB_*no.env. - Ação de correção:
docker-compose restart mysql; verificar/corrigir credenciais; criar banco manualmente se necessário.
Pendências
- ⚠️ PENDÊNCIA: Documentar procedimento de rotação de secrets (JWT_SECRET, NOVU_SECRET_KEY, API Keys) em produção.
- ⚠️ PENDÊNCIA: Documentar configuração de auto-scaling e resource limits Kubernetes a partir do Helm chart.
- ⚠️ PENDÊNCIA: Documentar procedimento de backup e restore do banco de dados de produção.
- ⚠️ PENDÊNCIA: Documentar liveness/readiness probes configuradas no Kubernetes.