Por que usar o Modo Servidor?
Centralização
Um único servidor com API keys configuradas atende múltiplos clientes
Segurança
As chaves de API ficam no servidor, nunca expostas nos terminais clientes
Flexibilidade
Clientes podem usar suas próprias credenciais (API key ou OAuth) se desejarem
Performance
Comunicação via gRPC com suporte a TLS e streaming progressivo
Iniciando o Servidor
Flags DisponÃveis
| Flag | Descrição | Padrão | Env Var |
|---|---|---|---|
--port | Porta do servidor gRPC | 50051 | CHATCLI_SERVER_PORT |
--token | Token de autenticação (vazio = sem auth) | "" | CHATCLI_SERVER_TOKEN |
--tls-cert | Arquivo de certificado TLS | "" | CHATCLI_SERVER_TLS_CERT |
--tls-key | Arquivo de chave TLS | "" | CHATCLI_SERVER_TLS_KEY |
--provider | Provedor de LLM padrão | Auto-detectado | LLM_PROVIDER |
--model | Modelo de LLM padrão | Auto-detectado | |
--metrics-port | Porta HTTP para métricas Prometheus (0 = desabilita) | 9090 | CHATCLI_METRICS_PORT |
Flags de Fallback (opcionais)
| Flag | Descrição | Padrão | Env Var |
|---|---|---|---|
--fallback-providers | Lista de provedores separados por vÃrgula para failover | "" | CHATCLI_FALLBACK_PROVIDERS |
--fallback-max-retries | Tentativas por provedor antes de avançar | 2 | CHATCLI_FALLBACK_MAX_RETRIES |
--fallback-cooldown-base | Cooldown base após falha | 30s | CHATCLI_FALLBACK_COOLDOWN_BASE |
--fallback-cooldown-max | Cooldown máximo (backoff exponencial) | 5m | CHATCLI_FALLBACK_COOLDOWN_MAX |
Flag MCP (opcional)
| Flag | Descrição | Padrão | Env Var |
|---|---|---|---|
--mcp-config | Arquivo JSON de configuração MCP | "" | CHATCLI_MCP_CONFIG |
Prometheus Metrics
O servidor expõe métricas Prometheus emhttp://localhost:9090/metrics por padrão. As métricas incluem:
- gRPC:
chatcli_grpc_requests_total,chatcli_grpc_request_duration_seconds,chatcli_grpc_in_flight_requests - LLM:
chatcli_llm_requests_total,chatcli_llm_request_duration_seconds,chatcli_llm_errors_total - Watcher:
chatcli_watcher_collection_duration_seconds,chatcli_watcher_alerts_total,chatcli_watcher_pods_ready - Session:
chatcli_session_active_total,chatcli_session_operations_total - Server:
chatcli_server_uptime_seconds,chatcli_server_info - Go runtime: goroutines, memória, GC (via GoCollector/ProcessCollector)
--metrics-port 0.
Variáveis de Segurança
| Env Var | Descrição | Padrão |
|---|---|---|
CHATCLI_GRPC_REFLECTION | Habilita gRPC reflection para debugging. Requer AMBOS a flag --grpc-reflection E esta variável como true. Mantenha desabilitado em produção. Configurável via Helm com server.grpcReflection. | false |
CHATCLI_DISABLE_VERSION_CHECK | Desabilita verificação automática de versão no startup. | false |
CHATCLI_BIND_ADDRESS | Endereço de bind do servidor. Padrão 127.0.0.1 (local); em Kubernetes, auto-detecta via KUBERNETES_SERVICE_HOST e usa 0.0.0.0. Valor explÃcito sempre prevalece. | 127.0.0.1 / 0.0.0.0 (K8s) |
O endereço de bind padrão é
127.0.0.1 (seguro para uso local). Em Kubernetes, o servidor auto-detecta o ambiente via KUBERNETES_SERVICE_HOST e automaticamente usa 0.0.0.0 — nenhuma configuração adicional é necessária. Um valor explÃcito em CHATCLI_BIND_ADDRESS sempre prevalece.Flags do K8s Watcher (opcionais)
| Flag | Descrição | Padrão | Env Var |
|---|---|---|---|
--watch-config | Arquivo YAML multi-target | "" | CHATCLI_WATCH_CONFIG |
--watch-deployment | Deployment único (legado) | "" | CHATCLI_WATCH_DEPLOYMENT |
--watch-namespace | Namespace do deployment | "default" | CHATCLI_WATCH_NAMESPACE |
--watch-interval | Intervalo de coleta | 30s | CHATCLI_WATCH_INTERVAL |
--watch-window | Janela de observação | 2h | CHATCLI_WATCH_WINDOW |
--watch-max-log-lines | Max linhas de log por pod | 100 | CHATCLI_WATCH_MAX_LOG_LINES |
--watch-kubeconfig | Caminho do kubeconfig | Auto-detectado | CHATCLI_KUBECONFIG |
Use
--watch-config para monitorar múltiplos deployments simultaneamente com métricas Prometheus. Veja K8s Watcher para o formato do arquivo YAML.Autenticação do Servidor
- Sem Autenticação
- Com Token
- JWT com RBAC
- TLS (HTTPS)
Por padrão, o servidor não exige autenticação. Qualquer cliente pode conectar:
Modos de Credencial
O servidor suporta múltiplos modos de credencial LLM, dando flexibilidade total:1. Credenciais do Servidor (Padrão)
1. Credenciais do Servidor (Padrão)
O servidor usa suas próprias API keys configuradas via variáveis de ambiente:Nenhuma configuração adicional necessária no cliente.
2. Credenciais do Cliente (API Key)
2. Credenciais do Cliente (API Key)
O cliente pode enviar sua própria API key, que o servidor usa em vez das suas:
3. Credenciais do Cliente (OAuth Local)
3. Credenciais do Cliente (OAuth Local)
O cliente pode usar tokens OAuth do auth store local (
~/.chatcli/auth-profiles.json):4. Credenciais StackSpot
4. Credenciais StackSpot
Para o provedor StackSpot, envie as credenciais completas:
5. GitHub Copilot (OAuth Local)
5. GitHub Copilot (OAuth Local)
Para usar GitHub Copilot, faça login via Device Flow e conecte com
--use-local-auth:6. Ollama (Sem Credenciais)
6. Ollama (Sem Credenciais)
Para modelos locais via Ollama, basta informar a URL:
Arquitetura gRPC
O servidor implementa um serviço gRPC com os seguintes RPCs:| RPC | Descrição |
|---|---|
SendPrompt | Envia um prompt e recebe a resposta completa |
StreamPrompt | Envia um prompt e recebe a resposta em chunks progressivos |
InteractiveSession | Streaming bidirecional para sessões interativas |
ListSessions | Lista sessões salvas no servidor |
LoadSession | Carrega uma sessão salva |
SaveSession | Salva a sessão atual |
Health | Health check do servidor |
GetServerInfo | Informações do servidor (versão, provider, modelo, watcher) |
GetWatcherStatus | Status do K8s Watcher (se ativo) |
ListRemotePlugins | Lista plugins disponÃveis no servidor |
ListRemoteAgents | Lista agents disponÃveis no servidor |
ListRemoteSkills | Lista skills disponÃveis no servidor |
GetAgentDefinition | Retorna o conteúdo completo de um agent (markdown + frontmatter) |
GetSkillContent | Retorna o conteúdo completo de uma skill |
ExecuteRemotePlugin | Executa um plugin no servidor e retorna o resultado |
DownloadPlugin | Streaming de download do binário de um plugin |
GetAlerts | Retorna alertas ativos do K8s Watcher (usado pelo Operator) |
AnalyzeIssue | Envia contexto de um Issue ao LLM e retorna análise + ações sugeridas |
gRPC com Múltiplas Réplicas
O gRPC usa conexões HTTP/2 persistentes que, por padrão, fixam em um único pod via kube-proxy. Para cenários com múltiplas réplicas no Kubernetes:- 1 réplica: Service ClusterIP padrão — sem configuração extra necessária
- Múltiplas réplicas: Use um Service headless (
ClusterIP: None) para que o DNS retorne os IPs individuais dos pods, habilitando balanceamento round-robin client-side via resolverdns:///do gRPC - O client do ChatCLI já possui keepalive (ping a cada 10s) e suporte a round-robin integrados
- No Helm chart, habilite
service.headless: truequandoreplicaCount > 1 - No Operator, o headless é ativado automaticamente quando
spec.replicas > 1
Para mais detalhes, veja a documentação do K8s Operator e o deploy com Helm.
Streaming Progressivo
O RPCStreamPrompt divide a resposta em chunks de ~200 caracteres em fronteiras naturais (parágrafos, linhas, frases), proporcionando uma experiência de resposta progressiva no cliente.
RPCs de Descoberta de Recursos
Os RPCsListRemotePlugins, ListRemoteAgents, ListRemoteSkills, GetAgentDefinition, GetSkillContent, ExecuteRemotePlugin e DownloadPlugin permitem que clientes conectados descubram e usem recursos instalados no servidor.
- Plugins: Executados no servidor via
ExecuteRemotePluginou baixados viaDownloadPlugin(streaming binário) - Agents/Skills: Conteúdo markdown transferido ao client via
GetAgentDefinition/GetSkillContentpara composição local de prompts
RPCs da Plataforma AIOps
Os RPCsGetAlerts e AnalyzeIssue são usados pelo Operator AIOps para alimentar o pipeline autônomo de remediação.
GetAlerts
Retorna os alertas ativos detectados pelo K8s Watcher:AnalyzeIssue
Envia o contexto de um Issue ao LLM e retorna análise estruturada com ações sugeridas:REST API Gateway
Além do gRPC, o operator agora expõe uma API REST HTTP na porta:8090 com:
- 30+ endpoints cobrindo incidents, SLOs, runbooks, approvals, postmortems, analytics, clusters e audit
- Autenticação via
X-API-Keycom mapeamento de roles (viewer/operator/admin) - Rate limiting de 100 req/min por chave
- Web Dashboard embutido servido em
/
Comandos Remotos via InteractiveSession
Ao conectar a um servidor viachatcli connect, a sessão interativa suporta comandos executados diretamente no servidor:
| Comando | Descrição |
|---|---|
/status | Informações do servidor (versão, provider, modelo, uptime) |
/watcher status | Detalhes do K8s Watcher (targets, snapshots, alertas) |
/plugins list | Lista plugins disponÃveis no servidor |
/agents list | Lista agents disponÃveis no servidor |
/skills list | Lista skills disponÃveis no servidor |
InteractiveSession).
Integração com K8s Watcher
Quando o servidor é iniciado com--watch-config ou --watch-deployment, o K8s Watcher monitora continuamente os deployments e injeta automaticamente o contexto Kubernetes em todos os prompts dos clientes remotos.
- Single-Target (legado)
- Multi-Target (recomendado)
Rate Limiting
O servidor implementa rate limiting por cliente usando token bucket para proteger contra abuso:| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_RATE_LIMIT_RPS | Requisições por segundo por cliente | 10 |
CHATCLI_RATE_LIMIT_BURST | Burst máximo permitido | 30 |
ResourceExhausted com um header Retry-After indicando quantos segundos o cliente deve aguardar.
Prevenção de SSRF
O servidor valida todas as URLs configuradas emprovider_config antes de utilizá-las, bloqueando:
- IPs privados:
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 - Metadados de cloud:
169.254.169.254(AWS, GCP, Azure) - Link-local:
169.254.0.0/16,fe80::/10 - Loopback:
127.0.0.0/8,::1
Limites de Tamanho de Mensagem
| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_MAX_RECV_MSG_SIZE | Tamanho máximo de mensagem recebida | 50MB |
CHATCLI_MAX_SEND_MSG_SIZE | Tamanho máximo de mensagem enviada | 50MB |
CHATCLI_MAX_CONCURRENT_STREAMS | Streams simultâneas por conexão | 100 |
Audit Logging
O servidor pode gerar logs de auditoria em formato JSON-lines para rastreabilidade completa:| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_AUDIT_LOG_PATH | Caminho do arquivo de audit log (vazio = desabilitado) | "" |
- Autenticação (sucesso/falha)
- Execução de prompts e plugins
- Operações de sessão (save/load/delete)
- Alterações de configuração
O formato JSON-lines facilita integração com ferramentas como
jq, Elasticsearch, Loki e Splunk. Cada linha é um objeto JSON independente com timestamp, request ID, ação e resultado.Rotação de Logs
| Variável | Descrição | Padrão |
|---|---|---|
CHATCLI_LOG_FILE | Caminho do arquivo de log principal | "" (stdout) |
CHATCLI_LOG_MAX_SIZE_MB | Tamanho máximo antes de rotacionar | 100 |
CHATCLI_LOG_MAX_BACKUPS | Número de backups antigos a manter | 5 |
CHATCLI_LOG_MAX_AGE_DAYS | Dias máximos de retenção | 30 |
CHATCLI_LOG_COMPRESS | Comprimir backups com gzip | true |
Variáveis de Ambiente
Todas as variáveis de ambiente usadas pelo ChatCLI local também funcionam no servidor:Próximo Passo
Conexão Remota
Conectar ao servidor remotamente
K8s Watcher
Multi-target + Prometheus
K8s Operator
K8s Operator (AIOps)
Deploy
Deploy com Docker e Helm