promovaweb-devops-review-chatwoot-stack

Installation
SKILL.md

Review Chatwoot Stack

Executa uma auditoria completa do arquivo chatwoot.yaml e reporta conformidade, problemas e sugestões.

Instruções de Execução

Quando esta skill for invocada, siga exatamente este roteiro:

Passo 1 — Ler o arquivo

Leia o arquivo chatwoot.yaml completo.

Passo 2 — Executar todos os checks abaixo

Execute cada bloco de verificação e registre os resultados (✅ OK / ⚠️ Atenção / ❌ Erro).

Passo 3 — Gravar o resultado

Grave o relatório completo em um arquivo chamado chatwoot.audit.md.


Checks de Verificação

1. Variáveis de Ambiente Obrigatórias

Verifique se todas as variáveis abaixo estão definidas nos anchors YAML (x-chatwoot-*):

Banco de dados (x-chatwoot-db)

  • POSTGRES_HOST — deve ser definido (padrão: postgres)
  • POSTGRES_USERNAME — deve ser definido (padrão: postgres)
  • POSTGRES_PASSWORD — deve existir e não deve ser o placeholder SENHA, compare com a senha definida em postgres.yaml
  • POSTGRES_DATABASE — deve ser definido (padrão: chatwoot)

Redis (x-chatwoot-redis)

  • REDIS_URL — deve começar com redis:// e conter host e porta válidos (ex: redis://redis:6379)
  • REDIS_PASSWORD — verificar se está definida (recomendado se Redis usa autenticação)

Object Storage (x-chatwoot-storage)

  • ACTIVE_STORAGE_SERVICE — deve ser s3_compatible ou local
  • STORAGE_BUCKET_NAME — deve ser definido se usar S3
  • STORAGE_ACCESS_KEY_ID — deve ser preenchido se usar S3 (alertar se vazio)
  • STORAGE_SECRET_ACCESS_KEY — deve ser preenchido se usar S3 (alertar se vazio)
  • STORAGE_REGION — deve ser definido se usar S3
  • STORAGE_ENDPOINT — deve ser uma URL válida se usar S3
  • STORAGE_FORCE_PATH_STYLE — deve ser "true" se usar S3 compatível

Ambiente Geral (x-chatwoot-env)

  • INSTALLATION_NAME — deve ser definido (padrão: chatwoot)
  • NODE_ENV — deve ser production
  • RAILS_ENV — deve ser production
  • INSTALLATION_ENV — deve ser docker
  • SECRET_KEY_BASE — deve existir, ter pelo menos 32 caracteres e não ser o valor de exemplo 123458bb7ef6402f6a8bcf5d3be54321
  • FRONTEND_URL — deve começar com https:// e ser um domínio válido (não localhost, não chat.agenciasynca.com.br se for apenas placeholder)
  • DEFAULT_LOCALE — deve ser definido (ex: pt-BR)
  • FORCE_SSL — deve ser "true"
  • ENABLE_ACCOUNT_SIGNUP — verificar se é intencional estar habilitado (risco de segurança)
  • RAILS_LOG_TO_STDOUT — deve ser "true"
  • USE_INBOX_AVATAR_FOR_BOT — deve ser "true"
  • ENABLE_PUSH_RELAY_SERVER — deve ser "true"

2. Serviços Obrigatórios

Verifique se todos estes serviços estão presentes:

Serviço Obrigatório Hostname Esperado
chatwoot_admin Sim {{.Service.Name}}.{{.Task.Slot}}
chatwoot_sidekiq Sim {{.Service.Name}}.{{.Task.Slot}}

3. Comandos dos Containers

Verifique o comando (command) e entrypoint de cada serviço:

Serviço Entrypoint Esperado Comando Esperado
chatwoot_admin docker/entrypoints/rails.sh bundle exec rails s -p 3000 -b 0.0.0.0
chatwoot_sidekiq deve incluir db:prepare, db:chatwoot_prepare e sidekiq -C config/sidekiq.yml

Alertar se o comando do chatwoot_sidekiq não incluir a preparação do banco de dados antes de iniciar o Sidekiq.


4. Replicas dos Serviços

Verifique a quantidade de réplicas de cada serviço:

Serviço Réplicas Mínimas Observação
chatwoot_admin 1 Pode escalar, mas atenção à sessão
chatwoot_sidekiq 1 Pode escalar para mais workers

5. Rotas Traefik

Para o serviço chatwoot_admin, verifique:

Âncora de endereço (x-chatwoot-app-url):

  • A âncora x-chatwoot-app-url deve existir e conter um domínio válido (não placeholder como chat.agenciasynca.com.br)
  • O domínio na âncora deve ser idêntico ao domínio dentro de Host(...) na label traefik.http.routers.chatwoot_admin.rule
  • Se não forem iguais, reportar como ❌ Erro: inconsistência entre x-chatwoot-app-url e a regra Traefik
  • O domínio na âncora deve coincidir também com o domínio em FRONTEND_URL (sem o https://)

Labels obrigatórias:

  • traefik.enable=true
  • traefik.swarm.network=network_swarm_public
  • traefik.http.routers.chatwoot_admin.rule — deve conter Host(...) com domínio válido e coincidir com x-chatwoot-app-url e FRONTEND_URL
  • traefik.http.routers.chatwoot_admin.entrypoints=websecure
  • traefik.http.routers.chatwoot_admin.tls.certresolver=letsencryptresolver
  • traefik.http.routers.chatwoot_admin.service=chatwoot_admin
  • traefik.http.services.chatwoot_admin.loadbalancer.server.port=3000
  • traefik.http.services.chatwoot_admin.loadbalancer.passhostheader=true

Middleware WebSocket:

  • traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https — obrigatório para WebSockets
  • traefik.http.routers.chatwoot_admin.middlewares=sslheader@swarm — deve estar presente

6. Volumes

Verifique se os volumes estão corretamente configurados:

  • chatwoot_data — deve ser declarado como external: true e montado em ambos os serviços em /app/storage
  • Ambos os serviços (chatwoot_admin e chatwoot_sidekiq) devem compartilhar o mesmo volume para consistência de storage

7. Recursos dos Containers

Para cada serviço, verifique os limites de recursos:

Serviço CPU Mínimo Memória Mínima Memória Máxima
chatwoot_admin "1" 1024M 2048M
chatwoot_sidekiq "1" 1024M 2048M

Alertar se algum serviço não tiver resources.limits definido.


8. Configuração de Deploy

Para cada serviço, verifique:

  • mode: replicated — ambos devem ser replicated
  • placement.constraints — deve incluir node.role == manager
  • Verificar se há update_config com order: start-first e failure_action: rollback (recomendado)

9. Redes e Imagens

Redes:

  • Ambos os serviços devem estar na rede network_swarm_public
  • A rede deve ser declarada como external: true na seção networks:

Imagens:

  • Ambos os serviços devem usar *chatwoot-image (anchor)
  • Verificar se a imagem usa tag específica de versão em vez de latest (recomendado em produção)

10. Segurança

  • POSTGRES_PASSWORD não deve ser SENHA (placeholder)
  • SECRET_KEY_BASE não deve ser o valor de exemplo 123458bb7ef6402f6a8bcf5d3be54321 (deve ser gerado com openssl rand -hex 32)
  • STORAGE_ACCESS_KEY_ID e STORAGE_SECRET_ACCESS_KEY não devem estar vazios se usar S3
  • STORAGE_BUCKET_NAME não deve ser chatwoot (placeholder)
  • ENABLE_ACCOUNT_SIGNUP: "false" — recomendado para instalações privadas
  • FORCE_SSL: "true" — deve estar presente
  • FRONTEND_URL deve usar HTTPS e domínio real.

Formato do Relatório de Saída

Ao final, produza um relatório estruturado:

# Relatório de Auditoria — chatwoot.yaml
Data: <data atual>

## Resumo
- Total de checks: X
- ✅ OK: X
- ⚠️ Atenções: X
- ❌ Erros: X

## Resultados por Categoria

### 1. Variáveis de Ambiente
✅ POSTGRES_HOST: definido
❌ POSTGRES_PASSWORD: usando placeholder SENHA — troque antes do deploy
...

### 2. Serviços
✅ chatwoot_admin: presente
✅ chatwoot_sidekiq: presente

### 3. Comandos
✅ chatwoot_admin: entrypoint e comando corretos
✅ chatwoot_sidekiq: inclui db:prepare e db:chatwoot_prepare
...

### 4. Replicas
✅ chatwoot_admin: 1 réplica
✅ chatwoot_sidekiq: 1 réplica
...

### 5. Rotas Traefik
✅ chatwoot_admin: rota Host correta, TLS ok
✅ chatwoot_admin: middleware WebSocket configurado
...

### 6. Volumes
✅ chatwoot_data: declarado como external e compartilhado
...

### 7. Recursos
✅ Todos os serviços com limits definidos
...

### 8. Deploy
⚠️ update_config não definido — recomendado configurar start-first e rollback
...

### 9. Redes e Imagens
⚠️ Imagem usando `latest` — considere fixar uma versão em produção
...

### 10. Segurança
❌ POSTGRES_PASSWORD: placeholder SENHA detectado
❌ SECRET_KEY_BASE: valor parece ser exemplo — gere um novo com openssl rand -hex 32
...

## Ações Recomendadas (por prioridade)

### Crítico (fazer antes do deploy)
1. ...

### Recomendado
1. ...

### Opcional
1. ...
Related skills
Installs
9
GitHub Stars
4
First Seen
Mar 28, 2026