promovaweb-devops-review-portainer-stack

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Review Portainer Stack

Portainer栈审核

Executa uma auditoria completa do arquivo
portainer.yaml
e reporta conformidade, problemas e sugestões.
portainer.yaml
文件执行完整审计,输出合规性结果、问题以及优化建议。

Instruções de Execução

执行说明

Quando esta skill for invocada, siga exatamente este roteiro:
调用该skill时,请严格遵循以下流程:

Passo 1 — Ler o arquivo

步骤1 — 读取文件

Leia o arquivo
portainer.yaml
completo.
读取完整的
portainer.yaml
文件。

Passo 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 portainer.audit.md.

将完整报告保存为名为portainer.audit.md的文件。

Checks de Verificação

检查项

1. Imagens

1. 镜像

Verifique as imagens dos serviços:
Agent:
  • Deve usar
    portainer/agent:sts
    ou versão estável (
    portainer/agent:<versão>
    )
  • Alertar se estiver usando tag instável em produção
Portainer CE:
  • Deve usar
    portainer/portainer-ce:sts
    ou versão estável
  • Verificar se a tag
    sts
    (Short Term Support) é adequada ou se
    lts
    (Long Term Support) é mais apropriado para produção

检查服务使用的镜像:
Agent:
  • 必须使用
    portainer/agent:sts
    或稳定版本(
    portainer/agent:<版本号>
  • 生产环境使用不稳定标签需给出告警
Portainer CE:
  • 必须使用
    portainer/portainer-ce:sts
    或稳定版本
  • 检查
    sts
    (Short Term Support)标签是否适用,或者
    lts
    (Long Term Support)是否更适合生产环境

2. Serviços Obrigatórios

2. 必选服务

Verifique se todos estes serviços estão presentes:
ServiçoObrigatório
agent
Sim
portainer
Sim

检查是否包含以下所有服务:
服务是否必选
agent
portainer

3. Comando do Portainer

3. Portainer启动命令

Verifique o comando do serviço
portainer
:
  • Deve conter
    -H tcp://tasks.agent:9001
    — aponta para o serviço agent via DNS do Swarm
  • Deve conter
    --tlsskipverify
    — permite comunicação sem TLS entre portainer e agent (aceitável em rede interna)
  • Alertar se a URL do agent não usar
    tasks.agent
    (nome de serviço do Swarm)

检查
portainer
服务的启动命令:
  • 必须包含
    -H tcp://tasks.agent:9001
    — 通过Swarm的DNS指向agent服务
  • 必须包含
    --tlsskipverify
    — 允许Portainer和agent之间无需TLS通信(内部网络可接受)
  • 若agent的URL没有使用
    tasks.agent
    (Swarm服务名)需给出告警

4. Modo de Deploy

4. 部署模式

Agent:
  • Deve usar
    mode: global
    — garante que um agent roda em cada nó do Swarm
  • Alertar se não for
    global
    (agents ausentes em alguns nós)
Portainer:
  • Deve usar
    mode: replicated
    com
    replicas: 1
  • Alertar se tiver mais de 1 réplica (Portainer CE não suporta HA nativo)

Agent:
  • 必须使用
    mode: global
    — 确保Swarm的每个节点上都运行一个agent
  • 若不是
    global
    模式需给出告警(部分节点无agent运行)
Portainer:
  • 必须使用
    mode: replicated
    replicas: 1
  • 若副本数超过1需给出告警(Portainer CE原生不支持高可用)

5. Placement Constraints

5. 部署位置约束

Agent:
  • Deve ter
    node.platform.os == linux
    — garante compatibilidade com nós Linux
  • Não deve ter
    node.role == manager
    (agent deve rodar em todos os nós)
Portainer:
  • Deve ter
    node.role == manager
    — interface web acessível apenas no manager

Agent:
  • 必须配置
    node.platform.os == linux
    — 确保与Linux节点兼容
  • 不能配置
    node.role == manager
    (agent需要在所有节点上运行)
Portainer:
  • 必须配置
    node.role == manager
    — Web界面仅在manager节点可访问

6. Volumes do Agent

6. Agent卷配置

Agent:
  • /var/run/docker.sock:/var/run/docker.sock
    — obrigatório para comunicação com Docker
  • /var/lib/docker/volumes:/var/lib/docker/volumes
    — obrigatório para gerenciamento de volumes
Alertar se algum desses volumes estiver ausente no agent.

Agent:
  • /var/run/docker.sock:/var/run/docker.sock
    — 与Docker通信的必选项
  • /var/lib/docker/volumes:/var/lib/docker/volumes
    — 卷管理的必选项
如果agent缺少以上任意卷配置需给出告警。

7. Volume do Portainer

7. Portainer卷配置

  • portainer_data
    — deve ser declarado como
    external: true
  • Verificar se está montado em
    /data
  • Alertar se o volume não for externo (dados de configuração perdidos em redeploy)

  • portainer_data
    — 必须声明为
    external: true
  • 检查是否挂载到
    /data
    路径
  • 若卷不是外部卷需给出告警(重新部署时配置数据会丢失)

8. Portas Expostas

8. 暴露端口

Portainer:
  • 9000:9000
    — porta HTTP do Portainer
  • Verificar se esta porta é necessária ou se apenas Traefik (HTTPS) é suficiente
  • Alertar se porta 9000 exposta e Traefik também configurado (redundante)
Agent:
  • Não deve ter portas expostas publicamente (comunicação apenas interna via Swarm)

Portainer:
  • 9000:9000
    — Portainer的HTTP端口
  • 检查该端口是否必要,或者是否仅Traefik(HTTPS)即可满足需求
  • 若同时暴露9000端口且配置了Traefik需给出告警(配置冗余)
Agent:
  • 不能公网暴露端口(仅通过Swarm进行内部通信)

9. Rotas Traefik

9. Traefik路由

Para o serviço
portainer
, verifique:
Âncora de endereço (
x-portainer-app-url
):
  • A âncora
    x-portainer-app-url
    deve existir e conter um domínio válido (não placeholder como
    painel.seudominio.com.br
    )
  • O domínio na âncora deve ser idêntico ao domínio dentro de
    Host(...)
    na label
    traefik.http.routers.portainer.rule
  • Se não forem iguais, reportar como ❌ Erro: inconsistência entre
    x-portainer-app-url
    e a regra Traefik
Labels obrigatórias:
  • traefik.enable=true
  • traefik.swarm.network=network_swarm_public
  • traefik.http.routers.portainer.rule
    — deve conter
    Host(...)
    com domínio válido e coincidir com
    x-portainer-app-url
  • traefik.http.routers.portainer.entrypoints=websecure
  • traefik.http.routers.portainer.tls.certresolver=letsencryptresolver
  • traefik.http.routers.portainer.service=portainer
  • traefik.http.services.portainer.loadbalancer.server.port=9000
  • traefik.http.routers.portainer.priority=1
    — verificar se é adequado
Regras:
  • O
    agent
    não deve ter labels Traefik (serviço interno)

检查
portainer
服务的以下配置:
地址锚点(
x-portainer-app-url
):
  • 必须存在
    x-portainer-app-url
    锚点且包含有效域名(不能是
    painel.seudominio.com.br
    这类占位符)
  • 锚点中的域名必须与
    traefik.http.routers.portainer.rule
    标签中
    Host(...)
    内的域名完全一致
  • 若不一致,标记为❌ 错误:
    x-portainer-app-url
    与Traefik规则不一致
必选标签:
  • traefik.enable=true
  • traefik.swarm.network=network_swarm_public
  • traefik.http.routers.portainer.rule
    — 必须包含
    Host(...)
    且配置有效域名,与
    x-portainer-app-url
    一致
  • traefik.http.routers.portainer.entrypoints=websecure
  • traefik.http.routers.portainer.tls.certresolver=letsencryptresolver
  • traefik.http.routers.portainer.service=portainer
  • traefik.http.services.portainer.loadbalancer.server.port=9000
  • traefik.http.routers.portainer.priority=1
    — 检查配置是否合理
规则:
  • agent
    不能配置Traefik标签(内部服务)

10. Redes

10. 网络

Agent:
  • Deve estar na rede
    network_swarm_public
Portainer:
  • Deve estar na rede
    network_swarm_public
  • A rede deve ser declarada como
    external: true

Agent:
  • 必须加入
    network_swarm_public
    网络
Portainer:
  • 必须加入
    network_swarm_public
    网络
  • 该网络必须声明为
    external: true

11. Segurança

11. 安全

  • --tlsskipverify
    na comunicação portainer-agent — aceitável em rede interna, mas documentar
  • Porta 9000 exposta + Traefik: considere remover a exposição de porta direta
  • Portainer CE por padrão não tem autenticação além do login — garanta senha forte no primeiro acesso
  • Verificar se o domínio configurado no Traefik tem acesso restrito (recomendado proteger com IP allowlist)

  • portainer与agent通信配置
    --tlsskipverify
    — 内部网络可接受,但需记录说明
  • 同时暴露9000端口+配置Traefik:建议移除直接端口暴露
  • Portainer CE默认仅支持登录认证 — 首次访问需设置强密码
  • 检查Traefik中配置的域名是否做了访问限制(建议配置IP白名单保护)

Formato do Relatório de Saída

输出报告格式

Ao final, produza um relatório estruturado:
undefined
执行完成后,输出结构化的报告:
undefined

Relatório de Auditoria — portainer.yaml

审计报告 — portainer.yaml

Data: <data atual>
日期: <当前日期>

Resumo

摘要

  • Total de checks: X
  • ✅ OK: X
  • ⚠️ Atenções: X
  • ❌ Erros: X
  • 总检查项: X
  • ✅ 正常: X
  • ⚠️ 注意: X
  • ❌ 错误: X

Resultados por Categoria

分类检查结果

1. Imagens

1. 镜像

✅ portainer/agent:sts: tag definida ⚠️ Tag
sts
(Short Term Support): considere
lts
para ambientes de produção estáveis ...
✅ portainer/agent:sts: 标签配置正常 ⚠️
sts
(短期支持)标签:稳定生产环境建议使用
lts
标签 ...

2. Serviços

2. 服务

✅ agent: presente ✅ portainer: presente
✅ agent: 已配置 ✅ portainer: 已配置

3. Comando

3. 启动命令

✅ portainer: -H tcp://tasks.agent:9001 --tlsskipverify correto ...
✅ portainer: -H tcp://tasks.agent:9001 --tlsskipverify 配置正确 ...

4. Modo de Deploy

4. 部署模式

✅ agent: mode global (correto para todos os nós) ✅ portainer: mode replicated, 1 réplica ...
✅ agent: global模式(适配所有节点,配置正确) ✅ portainer: replicated模式,1个副本 ...

5. Placement

5. 部署位置约束

✅ agent: node.platform.os == linux ✅ portainer: node.role == manager ...
✅ agent: node.platform.os == linux 配置正确 ✅ portainer: node.role == manager 配置正确 ...

6. Volumes Agent

6. Agent卷配置

✅ docker.sock: montado ✅ docker volumes: montado ...
✅ docker.sock: 已挂载 ✅ docker volumes: 已挂载 ...

7. Volume Portainer

7. Portainer卷配置

✅ portainer_data: volume externo em /data ...
✅ portainer_data: 已配置为外部卷,挂载到/data路径 ...

8. Portas

8. 端口

⚠️ Porta 9000 exposta e Traefik configurado — considere remover exposição direta de porta ...
⚠️ 同时暴露9000端口且配置了Traefik — 建议移除直接端口暴露 ...

9. Rotas Traefik

9. Traefik路由

✅ portainer: rota Host correta, TLS ok ✅ agent: sem Traefik (correto) ...
✅ portainer: Host路由配置正确,TLS配置正常 ✅ agent: 未配置Traefik(配置正确) ...

10. Redes

10. 网络

✅ network_swarm_public: configurado como external ...
✅ network_swarm_public: 已配置为外部网络 ...

11. Segurança

11. 安全

⚠️ --tlsskipverify: documentar que comunicação interna é confiável ⚠️ Configure senha forte no primeiro acesso ao Portainer ⚠️ Considere adicionar IP allowlist no Traefik para o Portainer ...
⚠️ --tlsskipverify: 需记录说明内部通信是可信的 ⚠️ Portainer首次访问需设置强密码 ⚠️ 建议在Traefik中为Portainer添加IP白名单限制 ...

Ações Recomendadas (por prioridade)

建议操作(按优先级排序)

Crítico (fazer antes do deploy)

严重(部署前必须修复)

  1. ...
  1. ...

Recomendado

建议优化

  1. ...
  1. ...

Opcional

可选优化

  1. ...
undefined
  1. ...
undefined