Skip to main content
O Modo Servidor transforma o ChatCLI em um serviço gRPC de alta performance que pode ser acessado remotamente por qualquer terminal. Isso permite centralizar o acesso a IA em um servidor (bare-metal, VM, Docker ou Kubernetes) e conectar de qualquer lugar.

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
O modo servidor oferece integração nativa com o K8s Watcher para monitoramento de deployments Kubernetes.

Iniciando o Servidor

1

Modo mais simples

Servidor na porta padrão (50051):
2

Com porta e autenticação customizados

3

Com TLS habilitado

4

Com K8s Watcher integrado (opcional)

5

Com fallback de provedores (opcional)

6

Com MCP (opcional)

Flags Disponíveis

Flags de Fallback (opcionais)

Flag MCP (opcional)

Prometheus Metrics

O servidor expõe métricas Prometheus em http://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)
Para desabilitar, use --metrics-port 0.

Variáveis de Segurança

O gRPC reflection agora requer duas condições: a flag --grpc-reflection E a variável CHATCLI_GRPC_REFLECTION=true. Isso evita habilitação acidental em produção. Veja a documentação de segurança para todas as medidas de hardening.
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)

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

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:
O servidor usa suas próprias API keys configuradas via variáveis de ambiente:
Nenhuma configuração adicional necessária no cliente.
O cliente pode enviar sua própria API key, que o servidor usa em vez das suas:
O cliente pode usar tokens OAuth do auth store local (~/.chatcli/auth-profiles.json):
Para o provedor StackSpot, envie as credenciais completas:
Para usar GitHub Copilot, faça login via Device Flow e conecte com --use-local-auth:
Para modelos locais via Ollama, basta informar a URL:

Arquitetura gRPC

O servidor implementa um serviço gRPC com os seguintes RPCs:

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 resolver dns:/// 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: true quando replicaCount > 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 RPC StreamPrompt 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 RPCs ListRemotePlugins, ListRemoteAgents, ListRemoteSkills, GetAgentDefinition, GetSkillContent, ExecuteRemotePlugin e DownloadPlugin permitem que clientes conectados descubram e usem recursos instalados no servidor.
  • Plugins: Executados no servidor via ExecuteRemotePlugin ou baixados via DownloadPlugin (streaming binário)
  • Agents/Skills: Conteúdo markdown transferido ao client via GetAgentDefinition/GetSkillContent para composição local de prompts

RPCs da Plataforma AIOps

Os RPCs GetAlerts 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-Key com mapeamento de roles (viewer/operator/admin)
  • Rate limiting de 100 req/min por chave
  • Web Dashboard embutido servido em /
Para referência completa, consulte a API Reference.

Comandos Remotos via InteractiveSession

Ao conectar a um servidor via chatcli connect, a sessão interativa suporta comandos executados diretamente no servidor: Esses comandos são processados pelo servidor e retornam resultados via streaming gRPC bidirecional (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.
Qualquer usuário conectado pode fazer perguntas sobre os deployments sem configuração adicional:

Rate Limiting

O servidor implementa rate limiting por cliente usando token bucket para proteger contra abuso: Quando o limite é atingido, o servidor retorna o código gRPC ResourceExhausted com um header Retry-After indicando quantos segundos o cliente deve aguardar.
Em ambientes com múltiplos clientes legítimos, aumente o burst para acomodar picos de uso. O RPS controla a taxa sustentada.

Prevenção de SSRF

O servidor valida todas as URLs configuradas em provider_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
Isso impede que provedores LLM maliciosos ou configurações incorretas acessem recursos internos da rede. A validação ocorre antes de qualquer requisição HTTP ser enviada.

Limites de Tamanho de Mensagem

Esses limites protegem contra ataques de esgotamento de recursos e garantem estabilidade do servidor sob carga.

Audit Logging

O servidor pode gerar logs de auditoria em formato JSON-lines para rastreabilidade completa: Cada requisição recebe um Request ID único para correlação. Os eventos registrados incluem:
  • 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á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