promovaweb-devops-review-chatwoot-stack
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseReview Chatwoot Stack
Chatwoot栈审查
Executa uma auditoria completa do arquivo e reporta conformidade, problemas e sugestões.
chatwoot.yaml对文件执行完整审计,并报告合规性、存在的问题和优化建议。
chatwoot.yamlInstruções de Execução
执行说明
Quando esta skill for invocada, siga exatamente este roteiro:
当本skill被调用时,请严格遵循以下流程执行:
Passo 1 — Ler o arquivo
步骤1 — 读取文件
Leia o arquivo completo.
chatwoot.yaml完整读取文件内容。
chatwoot.yamlPasso 2 — Executar todos os checks abaixo
步骤2 — 执行所有以下检查项
Execute cada bloco de verificação e registre os resultados (✅ OK / ⚠️ Atenção / ❌ Erro).
逐块执行所有校验规则,记录结果(✅ 正常 / ⚠️ 警告 / ❌ 错误)。
Passo 3 — Gravar o resultado
步骤3 — 保存结果
Grave o relatório completo em um arquivo chamado chatwoot.audit.md.
将完整审计报告保存为名为chatwoot.audit.md的文件。
Checks de Verificação
校验规则
1. Variáveis de Ambiente Obrigatórias
1. 必填环境变量
Verifique se todas as variáveis abaixo estão definidas nos anchors YAML ():
x-chatwoot-*Banco de dados ()
x-chatwoot-db- — deve ser definido (padrão:
POSTGRES_HOST)postgres - — deve ser definido (padrão:
POSTGRES_USERNAME)postgres - — deve existir e não deve ser o placeholder
POSTGRES_PASSWORD, compare com a senha definida emSENHApostgres.yaml - — deve ser definido (padrão:
POSTGRES_DATABASE)chatwoot
Redis ()
x-chatwoot-redis- — deve começar com
REDIS_URLe conter host e porta válidos (ex:redis://)redis://redis:6379 - — verificar se está definida (recomendado se Redis usa autenticação)
REDIS_PASSWORD
Object Storage ()
x-chatwoot-storage- — deve ser
ACTIVE_STORAGE_SERVICEous3_compatiblelocal - — deve ser definido se usar S3
STORAGE_BUCKET_NAME - — deve ser preenchido se usar S3 (alertar se vazio)
STORAGE_ACCESS_KEY_ID - — deve ser preenchido se usar S3 (alertar se vazio)
STORAGE_SECRET_ACCESS_KEY - — deve ser definido se usar S3
STORAGE_REGION - — deve ser uma URL válida se usar S3
STORAGE_ENDPOINT - — deve ser
STORAGE_FORCE_PATH_STYLEse usar S3 compatível"true"
Ambiente Geral ()
x-chatwoot-env- — deve ser definido (padrão:
INSTALLATION_NAME)chatwoot - — deve ser
NODE_ENVproduction - — deve ser
RAILS_ENVproduction - — deve ser
INSTALLATION_ENVdocker - — deve existir, ter pelo menos 32 caracteres e não ser o valor de exemplo
SECRET_KEY_BASE123458bb7ef6402f6a8bcf5d3be54321 - — deve começar com
FRONTEND_URLe ser um domínio válido (não localhost, nãohttps://se for apenas placeholder)chat.agenciasynca.com.br - — deve ser definido (ex:
DEFAULT_LOCALE)pt-BR - — deve ser
FORCE_SSL"true" - — verificar se é intencional estar habilitado (risco de segurança)
ENABLE_ACCOUNT_SIGNUP - — deve ser
RAILS_LOG_TO_STDOUT"true" - — deve ser
USE_INBOX_AVATAR_FOR_BOT"true" - — deve ser
ENABLE_PUSH_RELAY_SERVER"true"
检查以下所有变量是否都在YAML锚点()中定义:
x-chatwoot-*数据库()
x-chatwoot-db- — 必须定义(默认值:
POSTGRES_HOST)postgres - — 必须定义(默认值:
POSTGRES_USERNAME)postgres - — 必须存在且不能是占位符
POSTGRES_PASSWORD,需与SENHA中定义的密码比对一致postgres.yaml - — 必须定义(默认值:
POSTGRES_DATABASE)chatwoot
Redis()
x-chatwoot-redis- — 必须以
REDIS_URL开头,包含有效的主机和端口(例如:redis://)redis://redis:6379 - — 检查是否已定义(如果Redis启用了认证则为必填)
REDIS_PASSWORD
对象存储()
x-chatwoot-storage- — 必须为
ACTIVE_STORAGE_SERVICE或s3_compatiblelocal - — 使用S3时必须定义
STORAGE_BUCKET_NAME - — 使用S3时必须填写(为空则告警)
STORAGE_ACCESS_KEY_ID - — 使用S3时必须填写(为空则告警)
STORAGE_SECRET_ACCESS_KEY - — 使用S3时必须定义
STORAGE_REGION - — 使用S3时必须为有效的URL
STORAGE_ENDPOINT - — 使用兼容S3的存储时必须为
STORAGE_FORCE_PATH_STYLE"true"
通用环境变量()
x-chatwoot-env- — 必须定义(默认值:
INSTALLATION_NAME)chatwoot - — 必须为
NODE_ENVproduction - — 必须为
RAILS_ENVproduction - — 必须为
INSTALLATION_ENVdocker - — 必须存在,长度至少32位且不能是示例值
SECRET_KEY_BASE123458bb7ef6402f6a8bcf5d3be54321 - — 必须以
FRONTEND_URL开头且为有效域名(不能是localhost,仅作为占位符的https://也不符合要求)chat.agenciasynca.com.br - — 必须定义(例如:
DEFAULT_LOCALE)pt-BR - — 必须为
FORCE_SSL"true" - — 检查是否为主动开启(存在安全风险)
ENABLE_ACCOUNT_SIGNUP - — 必须为
RAILS_LOG_TO_STDOUT"true" - — 必须为
USE_INBOX_AVATAR_FOR_BOT"true" - — 必须为
ENABLE_PUSH_RELAY_SERVER"true"
2. Serviços Obrigatórios
2. 必填服务
Verifique se todos estes serviços estão presentes:
| Serviço | Obrigatório | Hostname Esperado |
|---|---|---|
| Sim | |
| Sim | |
检查是否存在以下所有服务:
| 服务 | 是否必填 | 预期主机名 |
|---|---|---|
| 是 | |
| 是 | |
3. Comandos dos Containers
3. 容器命令
Verifique o comando () e de cada serviço:
commandentrypoint| Serviço | Entrypoint Esperado | Comando Esperado |
|---|---|---|
| | |
| — | deve incluir |
Alertar se o comando do não incluir a preparação do banco de dados antes de iniciar o Sidekiq.
chatwoot_sidekiq检查每个服务的和配置:
commandentrypoint| 服务 | 预期Entrypoint | 预期Command |
|---|---|---|
| | |
| — | 必须包含 |
如果的命令中未在启动Sidekiq前包含数据库准备操作,需给出告警。
chatwoot_sidekiq4. Replicas dos Serviços
4. 服务副本数
Verifique a quantidade de réplicas de cada serviço:
| Serviço | Réplicas Mínimas | Observação |
|---|---|---|
| 1 | Pode escalar, mas atenção à sessão |
| 1 | Pode escalar para mais workers |
检查每个服务的副本数量:
| 服务 | 最小副本数 | 说明 |
|---|---|---|
| 1 | 可扩容,但需注意会话一致性 |
| 1 | 可扩容为更多worker |
5. Rotas Traefik
5. Traefik路由
Para o serviço , verifique:
chatwoot_adminÂncora de endereço ():
x-chatwoot-app-url- A âncora deve existir e conter um domínio válido (não placeholder como
x-chatwoot-app-url)chat.agenciasynca.com.br - O domínio na âncora deve ser idêntico ao domínio dentro de na label
Host(...)traefik.http.routers.chatwoot_admin.rule - Se não forem iguais, reportar como ❌ Erro: inconsistência entre e a regra Traefik
x-chatwoot-app-url - O domínio na âncora deve coincidir também com o domínio em (sem o
FRONTEND_URL)https://
Labels obrigatórias:
traefik.enable=truetraefik.swarm.network=network_swarm_public- — deve conter
traefik.http.routers.chatwoot_admin.rulecom domínio válido e coincidir comHost(...)ex-chatwoot-app-urlFRONTEND_URL traefik.http.routers.chatwoot_admin.entrypoints=websecuretraefik.http.routers.chatwoot_admin.tls.certresolver=letsencryptresolvertraefik.http.routers.chatwoot_admin.service=chatwoot_admintraefik.http.services.chatwoot_admin.loadbalancer.server.port=3000traefik.http.services.chatwoot_admin.loadbalancer.passhostheader=true
Middleware WebSocket:
- — obrigatório para WebSockets
traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https - — deve estar presente
traefik.http.routers.chatwoot_admin.middlewares=sslheader@swarm
针对服务,检查以下配置:
chatwoot_admin地址锚点():
x-chatwoot-app-url- 必须存在锚点,且包含有效域名(不能是
x-chatwoot-app-url这类占位符)chat.agenciasynca.com.br - 锚点中的域名必须完全一致于标签中
traefik.http.routers.chatwoot_admin.rule内的域名Host(...) - 如果不一致,标记为❌ 错误:与Traefik规则不匹配
x-chatwoot-app-url - 锚点中的域名也必须与中的域名一致(去掉
FRONTEND_URL前缀后)https://
必填标签:
traefik.enable=truetraefik.swarm.network=network_swarm_public- — 必须包含带有有效域名的
traefik.http.routers.chatwoot_admin.rule,且与Host(...)和x-chatwoot-app-url一致FRONTEND_URL traefik.http.routers.chatwoot_admin.entrypoints=websecuretraefik.http.routers.chatwoot_admin.tls.certresolver=letsencryptresolvertraefik.http.routers.chatwoot_admin.service=chatwoot_admintraefik.http.services.chatwoot_admin.loadbalancer.server.port=3000traefik.http.services.chatwoot_admin.loadbalancer.passhostheader=true
WebSocket中间件:
- — WebSocket必填配置
traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https - — 必须存在
traefik.http.routers.chatwoot_admin.middlewares=sslheader@swarm
6. Volumes
6. 存储卷
Verifique se os volumes estão corretamente configurados:
- — deve ser declarado como
chatwoot_datae montado em ambos os serviços emexternal: true/app/storage - Ambos os serviços (e
chatwoot_admin) devem compartilhar o mesmo volume para consistência de storagechatwoot_sidekiq
检查存储卷是否配置正确:
- — 必须声明为
chatwoot_data,且挂载到两个服务的external: true路径/app/storage - 两个服务(和
chatwoot_admin)必须共享同一个存储卷,保证存储一致性chatwoot_sidekiq
7. Recursos dos Containers
7. 容器资源
Para cada serviço, verifique os limites de recursos:
| Serviço | CPU Mínimo | Memória Mínima | Memória Máxima |
|---|---|---|---|
| "1" | 1024M | 2048M |
| "1" | 1024M | 2048M |
Alertar se algum serviço não tiver definido.
resources.limits检查每个服务的资源限制:
| 服务 | 最低CPU配置 | 最低内存配置 | 最大内存配置 |
|---|---|---|---|
| "1" | 1024M | 2048M |
| "1" | 1024M | 2048M |
如果任意服务未配置需给出告警。
resources.limits8. Configuração de Deploy
8. 部署配置
Para cada serviço, verifique:
- — ambos devem ser
mode: replicatedreplicated - — deve incluir
placement.constraintsnode.role == manager - Verificar se há com
update_configeorder: start-first(recomendado)failure_action: rollback
检查每个服务的以下配置:
- — 两个服务都必须为
mode: replicated模式replicated - — 必须包含
placement.constraintsnode.role == manager - 检查是否配置了,包含
update_config和order: start-first(推荐配置)failure_action: rollback
9. Redes e Imagens
9. 网络与镜像
Redes:
- Ambos os serviços devem estar na rede
network_swarm_public - A rede deve ser declarada como na seção
external: truenetworks:
Imagens:
- Ambos os serviços devem usar (anchor)
*chatwoot-image - Verificar se a imagem usa tag específica de versão em vez de (recomendado em produção)
latest
网络:
- 两个服务都必须加入网络
network_swarm_public - 该网络必须在区块中声明为
networks:external: true
镜像:
- 两个服务都必须使用(锚点)
*chatwoot-image - 检查镜像是否使用了具体版本标签而非(生产环境推荐固定版本)
latest
10. Segurança
10. 安全配置
- não deve ser
POSTGRES_PASSWORD(placeholder)SENHA - não deve ser o valor de exemplo
SECRET_KEY_BASE(deve ser gerado com123458bb7ef6402f6a8bcf5d3be54321)openssl rand -hex 32 - e
STORAGE_ACCESS_KEY_IDnão devem estar vazios se usar S3STORAGE_SECRET_ACCESS_KEY - não deve ser
STORAGE_BUCKET_NAME(placeholder)chatwoot - — recomendado para instalações privadas
ENABLE_ACCOUNT_SIGNUP: "false" - — deve estar presente
FORCE_SSL: "true" - deve usar HTTPS e domínio real.
FRONTEND_URL
- 不能是占位符
POSTGRES_PASSWORDSENHA - 不能是示例值
SECRET_KEY_BASE(需使用123458bb7ef6402f6a8bcf5d3be54321生成)openssl rand -hex 32 - 使用S3时和
STORAGE_ACCESS_KEY_ID不能为空STORAGE_SECRET_ACCESS_KEY - 不能是占位符
STORAGE_BUCKET_NAMEchatwoot - 私有部署推荐配置
ENABLE_ACCOUNT_SIGNUP: "false" - 必须配置
FORCE_SSL: "true" - 必须使用HTTPS和真实域名。
FRONTEND_URL
Formato do Relatório de Saída
输出报告格式
Ao final, produza um relatório estruturado:
undefined执行完成后,生成结构化报告:
undefinedRelatório de Auditoria — chatwoot.yaml
审计报告 — chatwoot.yaml
Data: <data atual>
日期: <当前日期>
Resumo
摘要
- Total de checks: X
- ✅ OK: X
- ⚠️ Atenções: X
- ❌ Erros: X
- 总检查项: X
- ✅ 正常: X
- ⚠️ 警告项: X
- ❌ 错误项: X
Resultados por Categoria
各分类检查结果
1. Variáveis de Ambiente
1. 环境变量
✅ POSTGRES_HOST: definido
❌ POSTGRES_PASSWORD: usando placeholder SENHA — troque antes do deploy
...
✅ POSTGRES_HOST: 已定义
❌ POSTGRES_PASSWORD: 使用占位符SENHA — 部署前请修改
...
2. Serviços
2. 服务
✅ chatwoot_admin: presente
✅ chatwoot_sidekiq: presente
✅ chatwoot_admin: 已存在
✅ chatwoot_sidekiq: 已存在
3. Comandos
3. 命令配置
✅ chatwoot_admin: entrypoint e comando corretos
✅ chatwoot_sidekiq: inclui db:prepare e db:chatwoot_prepare
...
✅ chatwoot_admin: entrypoint和command配置正确
✅ chatwoot_sidekiq: 包含db:prepare和db:chatwoot_prepare
...
4. Replicas
4. 副本数
✅ chatwoot_admin: 1 réplica
✅ chatwoot_sidekiq: 1 réplica
...
✅ chatwoot_admin: 1个副本
✅ chatwoot_sidekiq: 1个副本
...
5. Rotas Traefik
5. Traefik路由
✅ chatwoot_admin: rota Host correta, TLS ok
✅ chatwoot_admin: middleware WebSocket configurado
...
✅ chatwoot_admin: Host路由正确,TLS配置正常
✅ chatwoot_admin: WebSocket中间件已配置
...
6. Volumes
6. 存储卷
✅ chatwoot_data: declarado como external e compartilhado
...
✅ chatwoot_data: 已声明为外部卷且实现共享
...
7. Recursos
7. 资源配置
✅ Todos os serviços com limits definidos
...
✅ 所有服务都已配置资源限制
...
8. Deploy
8. 部署配置
⚠️ update_config não definido — recomendado configurar start-first e rollback
...
⚠️ 未定义update_config — 推荐配置start-first和回滚策略
...
9. Redes e Imagens
9. 网络与镜像
⚠️ Imagem usando — considere fixar uma versão em produção
...
latest⚠️ 镜像使用标签 — 生产环境建议固定具体版本
...
latest10. Segurança
10. 安全配置
❌ POSTGRES_PASSWORD: placeholder SENHA detectado
❌ SECRET_KEY_BASE: valor parece ser exemplo — gere um novo com openssl rand -hex 32
...
❌ POSTGRES_PASSWORD: 检测到占位符SENHA
❌ SECRET_KEY_BASE: 疑似示例值 — 请使用openssl rand -hex 32生成新值
...
Ações Recomendadas (por prioridade)
推荐操作(按优先级排序)
Crítico (fazer antes do deploy)
严重(部署前必须修复)
- ...
- ...
Recomendado
建议修复
- ...
- ...
Opcional
可选优化
- ...
undefined- ...
undefined