Official Images (GHCR)
Official Docker images are automatically published to the GitHub Container Registry with each release:ChatCLI Server
Latest version: 1.172.0
ghcr.io/diillson/chatcli:1.172.0Kubernetes Operator
Latest version: 1.172.0
ghcr.io/diillson/chatcli-operator:1.172.0The images support multi-arch (
linux/amd64 and linux/arm64).Docker
Building the Image (Local)
- Build stage:
golang:1.25-alpinecompiles the binary - Runtime stage:
alpine:3.21with non-root user and built-in health check
Building the Operator Image (Local)
- Build stage:
golang:1.25with multi-arch support (TARGETARCH) - Runtime stage:
gcr.io/distroless/static:nonroot(maximum security, no shell)
Running with Docker
- Basic
- With Auth
- With Persistence
Docker Compose
The project includes adocker-compose.yml ready for development:
1
Set the variables
2
Start the container
3
Connect from your terminal
- Port 50051 exposed
- Persistent volumes for sessions and plugins
- Automatic restart (
unless-stopped) - All LLM variables via environment
- Security hardening: read-only filesystem,
no-new-privileges, CPU/memory limits, tmpfs for/tmp
docker-compose.yml File
The container runs with a read-only filesystem andno-new-privilegesby default. The/tmpdirectory uses an in-memory tmpfs (limited to 100MB). The named volumes (chatcli-sessions,chatcli-plugins) are the only writable mount points. See the security documentation for details.
Kubernetes (Helm)
ChatCLI Helm charts are available as OCI artifacts on GHCR โ no need to clone the repository.Prerequisites
- Kubernetes cluster (kind, minikube, EKS, GKE, AKS, etc.)
- Helm 3.8+ installed (OCI support)
kubectlconfigured for the cluster
Basic Installation
- OpenAI
- Anthropic (with Auth)
Installation with Security (Helm)
For deployments with full security, including rate limiting, JWT authentication, and secure agent mode:Installation with K8s Watcher (Single-Target)
Installation with Multi-Target + Prometheus
To monitor multiple deployments with Prometheus metrics, use avalues.yaml:
- Creates a ServiceAccount with RBAC for the watcher to read pods, events, and logs
- Auto-detects multi-namespace: if targets are in different namespaces, uses
ClusterRoleinstead ofRole - Generates a ConfigMap
<name>-watch-configwith the multi-target YAML - Mounts the config as a volume and passes
--watch-configto the container - Properly passes
--token,--model, and--mcp-configflags to the server - Uses native gRPC health probes (liveness, readiness, and startup) instead of
pidof - Includes all 17 operator CRDs in the
crds/directory
Helm Chart Values
Server
TLS
LLM
Secrets (API Keys)
GitHub Copilot
For authentication, usesecrets.githubCopilotTokenwith a token obtained via/auth login github-copilot, or setGITHUB_COPILOT_TOKENas an environment variable.
Ollama
K8s Watcher
Fields for each target (
watcher.targets[].):
Provider Fallback
MCP (Model Context Protocol)
Bootstrap and Memory
Skill Registry
When enabled, the values are passed asCHATCLI_REGISTRY_*environment variables in the ConfigMap. The ChatCLI container automatically creates~/.chatcli/registries.yamlwith the default registries (chatcli, clawhub). Use/skill searchand/skill installto manage skills via registries.
Persistence
Security
WhenreadOnlyRootFilesystemistrue, the chart automatically mounts a tmpfs at/tmpand an emptyDir at/home/chatcli/.chatcli(200Mi) for runtime data. TheHOME=/home/chatclivariable is set automatically. To monitor multiple namespaces, enablerbac.clusterWide: true. See the security documentation for details. Note: The ConfigMap and Secret referenced viaenvFromare marked asoptional: true, allowing you to create the Instance/Deployment before the dependent resources. The operator watches Secrets automatically and triggers rolling updates when they are created or updated.
Autoscaling (HPA)
Whenautoscaling.enabledistrue,replicaCountis ignored and the HPA controls the number of replicas automatically.
Pod Disruption Budget
The PDB ensures high availability during node upgrades, drains, and cluster maintenance.
Network Policy
NetworkPolicy restricts network traffic at the pod level. Requires a CNI with NetworkPolicy support (Calico, Cilium, etc.).
Networking
gRPC and multiple replicas: gRPC uses persistent HTTP/2 connections that pin to a single pod. ForreplicaCount > 1, enableservice.headless: trueto activate round-robin load balancing via DNS. The client already has built-in keepalive and round-robin support. Ingress gRPC: When Ingress is enabled withclassName: nginx, the chart automatically adds thenginx.ingress.kubernetes.io/backend-protocol: "GRPC"annotation to route gRPC traffic correctly.
Using an Existing Secret
If you already have a Secret with the API keys:Accessing the Server
- Port Forward (Dev)
- NodePort
- LoadBalancer
Ingress (with TLS)
Upgrade and Rollback
Security Configuration
The Helm chart supports advanced security configuration for production environments:In Kubernetes,
bindAddress is automatically detected as 0.0.0.0 via the KUBERNETES_SERVICE_HOST environment variable. No manual configuration is needed.Full Example: Production
Single-Target (Legacy)
Multi-Target with Prometheus (Recommended)
When targets are in different namespaces (e.g.,productionandbatch), the chart automatically creates aClusterRoleinstead of a namespace-scopedRole.
Next Steps
Server
Configure the gRPC server
Remote Connection
Connect to the server
K8s Watcher
Monitor Kubernetes