Skip to main content
O ChatCLI pode ser empacotado como container Docker e deployado no Kubernetes usando o Helm chart oficial. Esta página cobre todos os cenários de deployment.

Imagens Oficiais (GHCR)

As imagens Docker oficiais são publicadas automaticamente no GitHub Container Registry a cada release:

Servidor ChatCLI

Última versão: 1.188.0
ghcr.io/diillson/chatcli:1.188.0

Kubernetes Operator

Última versão: 1.188.0
ghcr.io/diillson/chatcli-operator:1.188.0
As imagens suportam multi-arch (linux/amd64 e linux/arm64).

Docker

Build da Imagem (Local)

O Dockerfile usa multi-stage build para produzir uma imagem mínima (~20MB):
  • Build stage: golang:1.25-alpine compila o binário
  • Runtime stage: alpine:3.21 com usuário não-root, health check integrado

Build da Imagem do Operator (Local)

O Dockerfile do operator usa:
  • Build stage: golang:1.25 com suporte multi-arch (TARGETARCH)
  • Runtime stage: gcr.io/distroless/static:nonroot (segurança máxima, sem shell)

Rodar com Docker

Docker Compose

O projeto inclui um docker-compose.yml pronto para desenvolvimento:
1

Defina as variáveis

2

Inicie o container

3

Conecte do seu terminal

O Docker Compose configura:
  • Porta 50051 exposta
  • Volumes persistentes para sessões e plugins
  • Restart automático (unless-stopped)
  • Todas as variáveis de LLM via environment
  • Hardening de segurança: filesystem read-only, no-new-privileges, limites de CPU/memória, tmpfs para /tmp

Arquivo docker-compose.yml

O container roda com filesystem read-only e no-new-privileges por padrão. O diretório /tmp usa tmpfs em memória (limitado a 100MB). Os volumes nomeados (chatcli-sessions, chatcli-plugins) são os únicos pontos graváveis. Veja a documentação de segurança para detalhes.

Kubernetes (Helm)

Os Helm charts do ChatCLI estão disponíveis como artefatos OCI no GHCR — não é necessário clonar o repositório.

Pré-requisitos

  • Cluster Kubernetes (kind, minikube, EKS, GKE, AKS, etc.)
  • Helm 3.8+ instalado (suporte a OCI)
  • kubectl configurado para o cluster

Instalação Básica

Se preferir usar o chart local (após clonar o repo), substitua oci://ghcr.io/diillson/charts/chatcli por ./deploy/helm/chatcli/ em todos os comandos abaixo.

Instalação com Segurança (Helm)

Para deployments com segurança completa, incluindo rate limiting, autenticação JWT e modo agente seguro:

Instalação com K8s Watcher (Single-Target)

Instalação com Multi-Target + Prometheus

Para monitorar múltiplos deployments com métricas Prometheus, use um values.yaml:
O chart automaticamente:
  • Cria ServiceAccount com RBAC para o watcher ler pods, eventos, logs
  • Auto-detecta multi-namespace: se targets estão em namespaces diferentes, usa ClusterRole em vez de Role
  • Gera ConfigMap <name>-watch-config com o YAML multi-target
  • Monta o config como volume e passa --watch-config ao container
  • Passa corretamente as flags --token, --model e --mcp-config ao servidor
  • Usa health probes gRPC nativas (liveness, readiness e startup) em vez de pidof
  • Inclui todos os 17 CRDs do operator no diretório crds/

Valores do Helm Chart

Servidor

TLS

LLM

Secrets (API Keys)

GitHub Copilot

Para autenticação, use secrets.githubCopilotToken com um token obtido via /auth login github-copilot, ou defina GITHUB_COPILOT_TOKEN como variável de ambiente.

Ollama

K8s Watcher

Campos de cada target (watcher.targets[].):

Fallback de Provedores

MCP (Model Context Protocol)

Bootstrap e Memória

Skill Registry

Quando habilitado, os valores são passados como variáveis CHATCLI_REGISTRY_* no ConfigMap. O container ChatCLI cria automaticamente ~/.chatcli/registries.yaml com os registries padrão (chatcli, clawhub). Use /skill search e /skill install para gerenciar skills via registries.

Persistência

Segurança

Quando readOnlyRootFilesystem está true, o chart monta automaticamente um tmpfs em /tmp e um emptyDir em /home/chatcli/.chatcli (200Mi) para dados de runtime. A variável HOME=/home/chatcli é definida automaticamente. Para monitorar múltiplos namespaces, habilite rbac.clusterWide: true. Veja a documentação de segurança para detalhes. Nota: O ConfigMap e o Secret referenciados via envFrom são marcados como optional: true, permitindo criar o Instance/Deployment antes dos recursos dependentes. O operator observa Secrets automaticamente e dispara rolling updates quando são criados ou atualizados.

Autoscaling (HPA)

Quando autoscaling.enabled é true, o replicaCount é ignorado e o HPA controla o número de réplicas automaticamente.

Pod Disruption Budget

O PDB garante alta disponibilidade durante upgrades de nó, drain e manutenção do cluster.

Network Policy

A NetworkPolicy restringe tráfego de rede no nível do pod. Requer um CNI com suporte a NetworkPolicy (Calico, Cilium, etc.).

Rede

gRPC e múltiplas réplicas: O gRPC usa conexões HTTP/2 persistentes que fixam em um único pod. Para replicaCount > 1, habilite service.headless: true para ativar balanceamento round-robin via DNS. O client já possui keepalive e round-robin integrados. Ingress gRPC: Quando o Ingress está habilitado com className: nginx, o chart adiciona automaticamente a annotation nginx.ingress.kubernetes.io/backend-protocol: "GRPC" para rotear tráfego gRPC corretamente.

Usando Secret Existente

Se você já tem um Secret com as API keys:
O Secret deve conter as chaves esperadas:

Acessar o Servidor

Ingress (com TLS)

Upgrade e Rollback


Configuração de Segurança

O Helm chart suporta configuração de segurança avançada para ambientes de produção:
Em Kubernetes, o bindAddress é automaticamente detectado como 0.0.0.0 via a variável de ambiente KUBERNETES_SERVICE_HOST. Não é necessário configurar manualmente.
Em produção, sempre configure security.jwtSecretRef para habilitar autenticação JWT. Sem isso, o servidor aceita conexões sem autenticação.

Exemplo Completo: Produção

Single-Target (Legado)

Multi-Target com Prometheus (Recomendado)

Quando targets estão em namespaces diferentes (ex: production e batch), o chart cria automaticamente um ClusterRole em vez de Role namespace-scoped.

Próximos Passos

Servidor

Configurar o servidor gRPC

Conexão Remota

Conectar ao servidor

K8s Watcher

Monitorar Kubernetes