Runbook
Introdução ao documento
Este runbook descreve os procedimentos operacionais comprováveis no repositório para executar, empacotar, publicar e recuperar a aplicação. O foco está no que é acionável com base em scripts, pipeline, Docker e Helm realmente versionados aqui.
Fato observado
- A aplicação é executada localmente por scripts
npm, por contêiner comdocker-composee em ambiente remoto por pipeline GitHub Actions + Helm. - O deploy remoto publica imagens Docker tagueadas por branch normalizada e por
github.sha, e instala a aplicação em namespaces Kubernetes distintos.
Evidências:
../../package.json#L5-L13../../docker-compose.yml#L1-L24../../compose.sh#L1-L4../../.github/workflows/ci-cd-pipeline.yaml#L13-L57../../.github/workflows/ci-cd-pipeline.yaml#L59-L153
Versionamento
Este documento deve ser atualizado quando houver mudança em:
- scripts de execução local, build ou testes;
- estratégia de imagem Docker;
- pipeline de build e deploy;
- chart Helm, secrets, probes ou namespaces de destino.
Evidências:
../../package.json#L5-L13../../Dockerfile#L1-L58../../.github/workflows/ci-cd-pipeline.yaml#L13-L153../../helm/templates/deployment.yaml#L35-L78../../helm/templates/secret.yaml#L12-L61
Referencial teórico
Este runbook foi montado a partir de três fontes operacionais do próprio repositório:
- scripts de aplicação (
package.json); - empacotamento local e em contêiner (
Dockerfile,docker-compose.yml,compose.sh); - automação de entrega (
.github/workflows/ci-cd-pipeline.yaml,helm/,kubernetes/).
Inferência controlada
- Como não há documentação externa versionada de SRE neste workspace, o procedimento operacional mais confiável é o que reproduz o pipeline e os manifests locais.
Evidências:
../../package.json#L5-L13../../Dockerfile#L1-L58../../docker-compose.yml#L1-L24../../.github/workflows/ci-cd-pipeline.yaml#L31-L57../../helm/templates/deployment.yaml#L39-L77
Execução local
Pré-requisitos observados
Fato observado
- O repositório expõe execução local por
npm. - Existe um
.env.examplecom variáveis para auth, WordPress, WhatsApp, Datadog, AMEI e metadados. - Existe uma opção de execução em contêiner via
docker-compose, usando.enve mapeando a aplicação para3010:3000.
Evidências:
Procedimento com npm
- Criar
.enva partir de.env.example. - Instalar dependências com o gerenciador escolhido pelo time.
- Executar
npm run devpara ambiente de desenvolvimento. - Executar
npm run test:unitpara testes unitários. - Executar
npm run buildpara validar build de produção. - Executar
npm run startpara subir a build local.
Evidências:
Procedimento com contêiner
- Garantir um arquivo
.envno diretório do projeto. - Garantir que a rede externa
dhedalos-networkexista no host Docker. - Executar
docker-compose up --build -dou usar compose.sh. - Acessar a aplicação na porta
3010.
Evidências:
Observações de build/runtime local
Fato observado
- O
Dockerfileusapnpm install --frozen-lockfile,pnpm run buildepnpm prune --prod. - A imagem final roda
node server.jsem modostandalone, comNODE_ENV=production,PORT=3000,UV_THREADPOOL_SIZE=4eNODE_OPTIONScom GC exposto.
Evidências:
Deploy
Pipeline comprovado
Fato observado
- O job
buildroda emubuntu-latest, baixa um.envde S3 e publica a imagem no registry. - A imagem é enviada com duas tags: branch normalizada e
github.sha. mainfaz deploy empiloto-dhedalos-ecosystemno clusteroke-we-002.releasefaz deploy emessencia-ecosystemedhedalos-ecosystemno clusteroke-we-001.
Evidências:
../../.github/workflows/ci-cd-pipeline.yaml#L15-L57../../.github/workflows/ci-cd-pipeline.yaml#L59-L90../../.github/workflows/ci-cd-pipeline.yaml#L91-L121../../.github/workflows/ci-cd-pipeline.yaml#L123-L153
Comando de deploy observado no pipeline
helm dependency build helm
helm upgrade --install --create-namespace -n <namespace> <release-name> helm \
-f kubernetes/<cluster>/<namespace>/values.yaml \
--set image.repository=<registry>/<repository>/<app> \
--set image.tag=<github-sha>
Evidências:
../../.github/workflows/ci-cd-pipeline.yaml#L84-L89../../.github/workflows/ci-cd-pipeline.yaml#L116-L121../../.github/workflows/ci-cd-pipeline.yaml#L148-L153
Ambientes comprovados
| Fluxo | Branch | Cluster | Namespace | Hostname(s) |
|---|---|---|---|---|
| Piloto | main | oke-we-002 | piloto-dhedalos-ecosystem | onboarding.stg.dhedalos.com |
| Essência | release | oke-we-001 | essencia-ecosystem | cadastro.essencia.dhedalos.com, onboarding.essencia.dhedalos.com |
| Produção | release | oke-we-001 | dhedalos-ecosystem | cadastro.sebraeingresse.com.br |
Evidências:
../../.github/workflows/ci-cd-pipeline.yaml#L63-L66../../.github/workflows/ci-cd-pipeline.yaml#L95-L98../../.github/workflows/ci-cd-pipeline.yaml#L127-L130../../kubernetes/oke-we-002/piloto-dhedalos-ecosystem/values.yaml#L1-L11../../kubernetes/oke-we-001/essencia-ecosystem/values.yaml#L1-L13../../kubernetes/oke-we-001/dhedalos-ecosystem/values.yaml#L1-L11
Checklist mínimo pós-deploy
- Confirmar que o Deployment está apontando para a imagem
repository:tagesperada. - Confirmar que o secret
*-envsexiste e não ficou comPLACEHOLDER_*. - Confirmar resposta HTTP do probe principal em
/api/health. - Confirmar entrada HTTPS do hostname do ambiente.
Evidências:
../../helm/templates/deployment.yaml#L39-L77../../helm/templates/secret.yaml#L7-L10../../helm/templates/secret.yaml#L19-L61../../pages/api/health.ts#L20-L108
Rollback
Fato observado
- O pipeline de deploy usa
helm upgrade --installcomimage.tag=${github.sha}. - O job de build publica a imagem também com a tag do commit SHA.
- Não há job de rollback explícito nem uso comprovado de
helm rollbackno repositório.
Inferência controlada
- O caminho de rollback mais aderente ao que está versionado aqui é reaplicar o mesmo comando de deploy apontando
image.tagpara um SHA anterior conhecido como saudável.
Evidências:
../../.github/workflows/ci-cd-pipeline.yaml#L49-L57../../.github/workflows/ci-cd-pipeline.yaml#L84-L89../../.github/workflows/ci-cd-pipeline.yaml#L116-L121../../.github/workflows/ci-cd-pipeline.yaml#L148-L153
Procedimento sugerido a partir do mecanismo real de deploy
- Identificar o último
github.shaestável do ambiente. - Reexecutar o
helm dependency build helm. - Reaplicar
helm upgrade --installno namespace do ambiente, substituindoimage.tagpelo SHA anterior. - Validar
/api/healthapós o rollout.
Exemplo:
helm dependency build helm
helm upgrade --install --create-namespace -n <namespace> <release-name> helm \
-f kubernetes/<cluster>/<namespace>/values.yaml \
--set image.repository=<registry>/<repository>/<app> \
--set image.tag=<sha-anterior-saudavel>
Evidências:
../../.github/workflows/ci-cd-pipeline.yaml#L84-L89../../.github/workflows/ci-cd-pipeline.yaml#L116-L121../../.github/workflows/ci-cd-pipeline.yaml#L148-L153../../pages/api/health.ts#L20-L108
Comandos úteis
Aplicação
npm run dev
npm run build
npm run start
npm run test:unit
npm run start:storybook
npm run build:storybook
Evidências:
Contêiner local
docker-compose up --build -d
Evidências:
Pipeline/Helm
docker build --build-arg NPM_TOKEN=<token> -t <image>:<tag> .
helm dependency build helm
helm upgrade --install --create-namespace -n <namespace> <release-name> helm \
-f kubernetes/<cluster>/<namespace>/values.yaml \
--set image.repository=<registry>/<repository>/<app> \
--set image.tag=<tag>
Evidências:
../../Dockerfile#L5-L23../../.github/workflows/ci-cd-pipeline.yaml#L49-L57../../.github/workflows/ci-cd-pipeline.yaml#L84-L89
Troubleshooting dos 5 incidentes mais prováveis
1. Aplicação não sobe localmente
Sintomas observáveis:
npm run devounpm run buildfalham por configuração ausente.docker-composefalha por.envausente ou rededhedalos-networkinexistente.
Ações:
- Conferir se o
.envfoi criado a partir de.env.example. - Conferir se as variáveis de auth e integrações mínimas estão preenchidas.
- No fluxo em contêiner, confirmar a existência da rede externa
dhedalos-network.
Evidências:
2. Deploy conclui, mas a aplicação fica unhealthy ou não responde
Sintomas observáveis:
- Probe principal falha.
- O app responde
status: "degraded"oustatus: "unhealthy"em/api/health.
Ações:
- Verificar a imagem e a tag aplicadas no Deployment.
- Confirmar se o secret de ambiente não ficou com
PLACEHOLDER_*. - Verificar
memory.usage,healthCheckDurationeconsecutiveSlowChecksem/api/health. - Se necessário, reaplicar o último SHA saudável.
Evidências:
../../helm/templates/deployment.yaml#L39-L77../../helm/templates/secret.yaml#L7-L10../../pages/api/health.ts#L39-L59../../pages/api/health.ts#L71-L106
3. Login falha, fica lento ou retorna mensagem de sobrecarga
Sintomas observáveis:
- Mensagens de erro ligadas à autenticação.
- Timeout de 15s no fluxo de
NextAuth. - Rejeição por excesso de requisições concorrentes.
Ações:
- Conferir
NEXTAUTH_URLeNEXTAUTH_SECRET. - Confirmar reachability e credenciais dos backends consultados na autenticação.
- Procurar por logs
[Auth] Too many concurrent requests,[Auth] TIMEOUT after 15se[Auth Error].
Evidências:
../../pages/api/auth/[...nextauth].ts#L25-L38../../pages/api/auth/[...nextauth].ts#L49-L56../../pages/api/auth/[...nextauth].ts#L109-L124../../helm/templates/secret.yaml#L13-L19
4. OTP ou envio de template falha
Sintomas observáveis:
- O envio do código falha em
/v1/otp/send. - A confirmação falha em
/v1/otp/confirm. - O envio do template após confirmação retorna erro.
Ações:
- Conferir
API_WHATS_BASE_URLeAPI_WHATS_TOKEN. - Procurar erros
[API] ... whats/otpSende[API] ... whats/sendFlowTemplate. - Confirmar se a customização do curso retorna
flow_template_ideflow_template_header_image.
Evidências:
../../pages/api/v1/otp/send.ts#L20-L35../../pages/api/v1/otp/confirm.ts#L29-L56../../src/features/api/external/whats/otpSend/otpSend.ts#L10-L35../../src/features/api/external/whats/sendFlowTemplate/sendFlowTemplate.ts#L14-L41../../helm/templates/secret.yaml#L37-L40
5. Usuários caem em manutenção ou não conseguem entrar no curso/grupo
Sintomas observáveis:
- Redirecionamento global para
/maintenance. - Página de curso retorna
notFound. - Link de grupo não é resolvido.
Ações:
- Verificar a resposta do endpoint de maintenance mode do WordPress.
- Confirmar
API_WP_BACKEND_URLeAPI_WP_BACKEND_TOKEN. - Verificar se
getCustomization,getCourseStatusegetGroupLinkestão respondendo sem timeout. - Procurar erros de middleware e de adapters
wp/*.
Evidências:
../../middleware.ts#L4-L35../../src/features/api/external/wp/getMaintenanceMode/getMaintenanceMode.ts#L16-L29../../src/features/api/external/wp/getCustomization/getCustomization.ts#L26-L37../../src/features/api/external/wp/getGroupLink/getGroupLink.ts#L16-L35../../helm/templates/secret.yaml#L33-L35
Pendências
- O repositório não traz um procedimento automatizado de rollback.
- O secret Helm usa
PLACEHOLDER_*; a substituição real de valores não está documentada aqui. - O pipeline baixa
.envdo S3, mas o conteúdo desse arquivo não está versionado neste workspace.
Evidências: