Runbook Operacional
Introdução ao documento
Este runbook descreve os procedimentos operacionais para executar, implantar e recuperar o serviço.
Versionamento
- Versão do documento: 1.0.0
- Última atualização: 2026-03-09
- Responsável: Marivaldo Vinicius
Referencial teórico
Escopo
- Ambiente local (desenvolvimento)
- Deploy em produção (Kubernetes/Helm)
- Rollback
- Troubleshooting
Fontes de verdade
- Configuração Docker: docker-compose.yml e Dockerfiles
- Scripts de inicialização: entrypoint.sh
- Configuração de produção: Helm charts e Dockerfile
Como rodar local
Pré-requisitos
- Docker e Docker Compose instalados
- PHP >= 8.2 (apenas se rodar sem Docker)
- Composer >= 2.7.2 (apenas se rodar sem Docker)
- Node >= 18 (apenas se rodar sem Docker)
- MySQL >= 8.0.32 (apenas se rodar sem Docker)
Ambiente Docker Compose
O projeto utiliza Docker Compose com três serviços principais:
- laravel: Aplicação PHP/Laravel (porta 8000)
- vite: Servidor de desenvolvimento frontend (porta 5173)
- mysql: Banco de dados MySQL 8.0 (porta 13306)
Comandos:
# Iniciar todos os serviços
docker compose up
# Iniciar em background
docker compose up -d
# Parar serviços
docker compose down
# Reconstruir containers
docker compose up --build
# Ver logs
docker compose logs -f laravel
docker compose logs -f vite
docker compose logs -f mysql
Variáveis de ambiente
O ambiente local utiliza variáveis do arquivo .env. Principais variáveis:
APP_PORT: Porta da aplicação (padrão: 8000)VITE_PORT: Porta do Vite (padrão: 5173)SAIL_XDEBUG_MODE: Modo Xdebug (padrão: off)SAIL_XDEBUG_CONFIG: Configuração Xdebug
Configuração inicial:
# Copiar arquivo de exemplo
cp .env.example .env
# Gerar chave da aplicação
docker compose exec laravel php artisan key:generate
# Limpar cache de configuração
docker compose exec laravel php artisan config:clear
Inicialização automática
O entrypoint do container Laravel (docker/dev/entrypoint.sh) executa automaticamente:
- Configura autenticação Composer para Backpack
- Instala dependências via Composer
- Cria link simbólico de storage
- Otimiza aplicação
- Executa migrações
- Gera chave da aplicação
- Publica assets do Log Viewer
- Inicia Supervisor para workers
Primeira execução
# 1. Iniciar containers
docker compose up -d
# 2. Aguardar inicialização completa (verificar logs)
docker compose logs -f laravel
# 3. Executar migrações e seeders
docker compose exec laravel php artisan migrate --seed
# 4. Criar usuário admin
docker compose exec laravel php artisan backpack:user
# 5. Acessar aplicação
# http://localhost:8000 (aplicação)
# http://localhost:5173 (Vite dev server)
Deploy
Pipeline atual
O deploy em produção utiliza Kubernetes com Helm charts. Configuração em helm/values.yaml e templates em helm/templates/.
Processo de deploy:
- Build da imagem Docker (baseada em
Dockerfile) - Push para registry (
registry.nuvem.online/weconcept/dhedalos-app-dashboard-laravel) - Deploy via Helm no cluster Kubernetes
- Execução do entrypoint (
entrypoint.sh) que:- Cria link de storage
- Otimiza aplicação
- Executa migrações
- Publica assets do Log Viewer
- Inicia Supervisor
Imagem de produção
A imagem de produção (Dockerfile) utiliza:
- Base:
dunglas/frankenphp:1.3.2-php8.3.14 - Servidor: Laravel Octane com FrankenPHP
- Workers: Supervisor gerencia 4 processos de queue worker
- Build: Frontend compilado via
npm run build
Configuração Kubernetes
- Replicas: Configurável via
helm/values.yaml(padrão: 1) - Service: ClusterIP
- Ingress: Configurável (desabilitado por padrão)
- Autoscaling: Configurável (desabilitado por padrão)
Rollback
Rollback via Helm
# Listar releases
helm list
# Ver histórico de releases
helm history <release-name>
# Rollback para versão anterior
helm rollback <release-name>
# Rollback para versão específica
helm rollback <release-name> <revision-number>
Rollback manual
- Identificar versão anterior da imagem
- Atualizar
helm/values.yamlcom tag da imagem anterior - Aplicar via
helm upgrade
Comandos úteis
Logs
# Logs da aplicação (local)
docker compose logs -f laravel
# Logs do worker (local)
docker compose exec laravel tail -f storage/logs/laravel-supervisor-worker.log
# Logs em produção (Kubernetes)
kubectl logs -f <pod-name>
kubectl logs -f <pod-name> -c laravel-worker
Migração e schema
# Executar migrações
docker compose exec laravel php artisan migrate
# Executar migrações com seeders
docker compose exec laravel php artisan migrate --seed
# Reverter última migração
docker compose exec laravel php artisan migrate:rollback
# Ver status das migrações
docker compose exec laravel php artisan migrate:status
Cache
# Limpar todos os caches
docker compose exec laravel php artisan cache:clear
docker compose exec laravel php artisan config:clear
docker compose exec laravel php artisan route:clear
docker compose exec laravel php artisan view:clear
# Otimizar aplicação
docker compose exec laravel php artisan optimize
# Limpar cache de configuração
docker compose exec laravel php artisan config:clear
Queue e workers
# Processar jobs manualmente
docker compose exec laravel php artisan queue:work
# Ver jobs falhados
docker compose exec laravel php artisan queue:failed
# Retry jobs falhados
docker compose exec laravel php artisan queue:retry all
# Limpar jobs falhados
docker compose exec laravel php artisan queue:flush
Nota: Em produção, workers são gerenciados pelo Supervisor (4 processos configurados em laravel-worker.conf).
Frontend
# Desenvolvimento (hot reload)
docker compose exec vite npm run dev
# Build de produção
docker compose exec vite npm run build
# Build Storybook
docker compose exec vite npm run build-storybook
Swagger/API Docs
# Gerar documentação Swagger
docker compose exec laravel php artisan l5-swagger:generate
# Acessar documentação
# http://localhost:8080/api/documentation#/default
Testes
Testes Backend (Pest PHP)
# Executar todos os testes
docker compose exec laravel php artisan test
# Executar com Pest diretamente
docker compose exec laravel ./vendor/bin/pest
# Executar apenas testes unitários
docker compose exec laravel ./vendor/bin/pest tests/Unit
# Executar apenas testes de feature
docker compose exec laravel ./vendor/bin/pest tests/Feature
# Executar com cobertura
docker compose exec laravel ./vendor/bin/pest --coverage --min=100
# Executar teste específico
docker compose exec laravel php artisan test --filter="NomeDoTeste"
Testes E2E (Cypress)
Pré-requisitos:
- Aplicação Laravel rodando em
http://localhost:8000 - Dependências Node instaladas (
npm install) - Usuário de teste criado no banco de dados
Comandos:
# Abrir Cypress Test Runner (interface gráfica)
npm run cypress:open
# Executar testes em modo headless
npm run cypress:run
Criar usuário de teste:
# Via Tinker
docker compose exec laravel php artisan tinker
# Criar usuário com email e senha conhecidos
# Ou via seeder (se configurado)
docker compose exec laravel php artisan db:seed --class=CypressUserSeeder
Variáveis de ambiente para Cypress:
# Configurar URL base (opcional, default: http://localhost:8000)
export CYPRESS_BASE_URL=http://localhost:8000
# Configurar credenciais de teste (opcional)
export CYPRESS_USER_EMAIL=test@example.com
export CYPRESS_USER_PASSWORD=password
Troubleshooting de testes Cypress:
# Verificar se aplicação está rodando
curl http://localhost:8000/up
# Verificar logs do servidor
docker compose logs laravel
# Limpar cache antes de executar testes
docker compose exec laravel php artisan cache:clear
docker compose exec laravel php artisan config:clear
# Verificar se usuário de teste existe
docker compose exec laravel php artisan tinker
# App\Models\User::where('email', 'test@example.com')->first();
Documentação completa: docs/tests/cypress.md
Troubleshooting (Top 5)
1. Erro 500 - Aplicação não inicia
Sintoma: Aplicação retorna erro 500 ou não responde.
Causas prováveis:
- Cache de configuração desatualizado
- Variáveis de ambiente não configuradas
- Permissões de storage incorretas
- Banco de dados não acessível
Diagnóstico:
# Verificar logs
docker compose logs laravel
# Verificar variáveis de ambiente
docker compose exec laravel php artisan config:show
# Verificar conexão com banco
docker compose exec laravel php artisan tinker
# DB::connection()->getPdo();
Correção:
# Limpar caches
docker compose exec laravel php artisan config:clear
docker compose exec laravel php artisan cache:clear
# Verificar permissões
docker compose exec laravel chmod -R 775 storage bootstrap/cache
# Verificar .env
docker compose exec laravel cat .env | grep DB_
2. Jobs não processam / Fila travada
Sintoma: Jobs ficam na fila e não são processados.
Causas prováveis:
- Worker não está rodando
- Conexão com queue driver falhou
- Timeout de jobs muito baixo
- Memória insuficiente
Diagnóstico:
# Verificar workers (local)
docker compose exec laravel supervisorctl status
# Verificar jobs na fila
docker compose exec laravel php artisan queue:work --once
# Verificar jobs falhados
docker compose exec laravel php artisan queue:failed
Correção:
# Reiniciar workers (local)
docker compose exec laravel supervisorctl restart laravel-worker:*
# Processar jobs manualmente
docker compose exec laravel php artisan queue:work --tries=3
# Verificar configuração de queue
docker compose exec laravel php artisan config:show queue
3. Erro de conexão com banco de dados
Sintoma: Erro "SQLSTATE[HY000] [2002] Connection refused" ou similar.
Causas prováveis:
- MySQL não está rodando
- Credenciais incorretas no
.env - Porta incorreta
- Rede Docker não configurada
Diagnóstico:
# Verificar se MySQL está rodando
docker compose ps mysql
# Testar conexão
docker compose exec laravel php artisan tinker
# DB::connection()->getPdo();
# Verificar variáveis de ambiente
docker compose exec laravel env | grep DB_
Correção:
# Reiniciar MySQL
docker compose restart mysql
# Verificar logs do MySQL
docker compose logs mysql
# Verificar .env
# DB_HOST deve ser 'mysql' (nome do serviço no docker-compose)
# DB_PORT deve ser 3306 (porta interna do container)
4. Cache não atualiza / Dados desatualizados
Sintoma: Dados retornados pela API estão desatualizados mesmo após atualização.
Causas prováveis:
- Cache não foi limpo após atualização
- Jobs de cache não executaram
- TTL do cache muito longo
- Cache driver não configurado corretamente
Diagnóstico:
# Verificar status do cache
docker compose exec laravel php artisan cache:table
# Verificar jobs de cache
docker compose exec laravel php artisan queue:failed
# Verificar configuração de cache
docker compose exec laravel php artisan config:show cache
Correção:
# Limpar cache manualmente
docker compose exec laravel php artisan cache:clear
# Disparar atualização de cache via API (requer autenticação)
# GET /api/v1/cache/inscricoes
# Ou via artisan
docker compose exec laravel php artisan tinker
# Cache::flush();
5. Erro de permissão / Storage não acessível
Sintoma: Erro ao salvar arquivos, uploads falham, ou logs não são escritos.
Causas prováveis:
- Permissões incorretas em
storage/ebootstrap/cache/ - Link simbólico de storage não criado
- Usuário do container sem permissões
Diagnóstico:
# Verificar permissões
docker compose exec laravel ls -la storage/
docker compose exec laravel ls -la public/
# Verificar link simbólico
docker compose exec laravel ls -la public/storage
Correção:
# Corrigir permissões
docker compose exec laravel chmod -R 775 storage bootstrap/cache
docker compose exec laravel chown -R www-data:www-data storage bootstrap/cache
# Recriar link de storage
docker compose exec laravel php artisan storage:link --force
Comandos de manutenção
Backup
# Backup do banco de dados (local)
docker compose exec mysql mysqldump -u laravel -p laravel > backup.sql
# Restore
docker compose exec -T mysql mysql -u laravel -p laravel < backup.sql
Limpeza
# Limpar containers parados
docker compose down
# Limpar volumes (CUIDADO: apaga dados)
docker compose down -v
# Limpar imagens não utilizadas
docker system prune -a
Monitoramento de recursos
# Uso de recursos dos containers
docker stats
# Espaço em disco
docker system df