Construir
Implementar e correr o agent
O agent é um único binário que corres na tua própria infraestrutura. Serve o suplemento de Excel, executa as tuas funções contra as tuas fontes de dados e reporta ao ConnXL apenas por ligações de saída. Esta página é a referência do operador — instalá-lo como serviço, atualizá-lo, monitorizá-lo e retirá-lo.
12 min de leitura
O agent é um único executável autocontido. Não tem instalador, nem dependências de execução, nem base de dados própria, e lê toda a sua configuração das variáveis de ambiente mais o instantâneo de configuração que extrai do ConnXL. Tudo o que se segue assume que já criaste um suplemento e um ambiente no dashboard — o separador Implementação da página do Agente é onde transferes um binário já gravado com a sua identidade.
Um agent por ambiente
Cada ambiente corre o seu próprio agent, e o certificado para o qual o agent se inscreve é o que o liga a esse ambiente. Podes correr muitas réplicas do agent do mesmo ambiente atrás de um balanceador de carga — todas partilham um único token de inscrição e cada uma recebe o seu próprio certificado.
Transferir e verificar o binário
Implementação → Transferir agent configurado dá-te um binário com o URL do backend, o ID do suplemento, o ID do ambiente e um token de inscrição novo já incorporados, por isso corre com zero variáveis de ambiente. Plataformas: Windows x64, Linux x64, Linux arm64.
Cada transferência é publicada juntamente com um ficheiro SHA256SUMS. Verifica antes de o executares:
# Linux / macOS
sha256sum -c SHA256SUMS --ignore-missing
# Windows PowerShell
(Get-FileHash .\connxl-agent.exe -Algorithm SHA256).Hash -eq (Get-Content .\SHA256SUMS | Select-String 'connxl-agent.exe').ToString().Split()[0]Confirma a qualquer momento o que tens:
connxl-agent --version # imprime a versão de compilação
connxl-agent --licenses # imprime os avisos de terceirosUm binário gravado transporta uma credencial
O token de inscrição incorporado é uma credencial real para esse único ambiente. Trata uma transferência configurada como um segredo: não a submetas a um repositório nem a partilhes entre ambientes. Se uma for divulgada, Regenerar no separador Implementação revoga de uma só vez todos os tokens emitidos para esse ambiente.
Correr como serviço
O agent corre em primeiro plano e escreve os logs em stdout, por isso qualquer gestor de serviços serve. Dá-lhe um utilizador dedicado e um diretório de trabalho estável — é aí que escreve a identidade que inscreve.
Linux (systemd)
[Unit]
Description=ConnXL Agent
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=connxl
WorkingDirectory=/opt/connxl
ExecStart=/opt/connxl/connxl-agent
Restart=always
RestartSec=5
Environment=CONNXL_DATA_DIR=/var/lib/connxl
# TimeoutStopSec tem de exceder o dreno de 10 s de pedidos em voo do agent.
TimeoutStopSec=30
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now connxl-agent
sudo systemctl status connxl-agentWindows (serviço)
O binário é uma aplicação de consola simples, por isso regista-o com sc.exe ou com um wrapper de serviços como o NSSM:
# A usar o NSSM (trata do redirecionamento de stdout e dos reinícios)
nssm install ConnXLAgent "C:\Program Files\ConnXL\connxl-agent.exe"
nssm set ConnXLAgent AppDirectory "C:\Program Files\ConnXL"
nssm set ConnXLAgent AppEnvironmentExtra "CONNXL_DATA_DIR=C:\ProgramData\ConnXL"
nssm set ConnXLAgent AppStdout "C:\ProgramData\ConnXL\logs\stdout.log"
nssm start ConnXLAgentCorrer num contentor
Não há imagem publicada — constrói uma mínima à volta do binário de Linux. O agent precisa de certificados de CA para o TLS de saída e de um volume persistente para a sua identidade, ou volta a inscrever-se a cada reinício.
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates \
&& rm -rf /var/lib/apt/lists/*
COPY connxl-agent /usr/local/bin/connxl-agent
ENV CONNXL_DATA_DIR=/var/lib/connxl
VOLUME /var/lib/connxl
EXPOSE 3000
ENTRYPOINT ["/usr/local/bin/connxl-agent"]Kubernetes. Corre-o como um Deployment atrás de um Service, com o token de inscrição vindo de um Secret. Usa apenas uma sonda de liveness — vê o aviso sobre o endpoint de saúde na secção 6.
spec:
containers:
- name: connxl-agent
image: your-registry/connxl-agent:0.1.0
ports:
- containerPort: 3000
env:
- name: CONNXL_BACKEND_URL
value: https://api.connxl.com
- name: CONNXL_ADDIN_ID
value: "<add-in id>"
- name: CONNXL_ENV_ID
value: "<environment id>"
- name: CONNXL_ENROLL_TOKEN
valueFrom:
secretKeyRef: { name: connxl-agent, key: enrollToken }
livenessProbe:
httpGet: { path: /healthz, port: 3000 }
initialDelaySeconds: 10
periodSeconds: 30
terminationGracePeriodSeconds: 30O token de inscrição é reutilizável
Cada réplica pode usar o mesmo token — cada troca produz o seu próprio certificado. É isso que faz um Deployment escalado funcionar a partir de um único Secret.
Variáveis de ambiente
Um binário gravado não precisa de nenhuma destas; ainda assim, cada variável sobrepõe-se ao seu valor gravado. Só o grupo de identidade é obrigatório num binário não configurado.
Identidade e backend
| Variável | O que faz | Predefinição |
|---|---|---|
CONNXL_BACKEND_URL | URL base da API do ConnXL. Obrigatória (ou gravada) — o agent recusa-se a arrancar sem ela | — |
CONNXL_ENROLL_TOKEN | Credencial de inscrição de uso único por agent; reutilizável entre réplicas | — |
CONNXL_ENROLL_ATTESTATION | aws | gcp | azure — inscreve-te com a identidade cloud do host em vez de um token | — |
CONNXL_ADDIN_ID | Suplemento que este agent serve | valor gravado |
CONNXL_ENV_ID | Ambiente que este agent serve | valor gravado |
CONNXL_BOOTSTRAP_URL | URL separado para a inscrição sem certificado | CONNXL_BACKEND_URL |
CONNXL_REPLICA_ID | Etiqueta que distingue as réplicas no dashboard | hostname |
CONNXL_ZONE, CONNXL_REGION | Etiquetas de localização reportadas com a saúde | vazio |
CONNXL_HEARTBEAT_SECONDS | Intervalo do heartbeat, limitado a 60 | 30 |
Listener e TLS
| Variável | O que faz | Predefinição |
|---|---|---|
CONNXL_LISTEN_ADDR | Endereço de escuta da superfície do suplemento | :3000 |
CONNXL_TLS_TERMINATION | edge (HTTP simples atrás de um balanceador de carga que termina o TLS) ou agent (o agent serve HTTPS a partir de cert.pem/key.pem junto ao binário) | edge |
CONNXL_TRUSTED_PROXY | Confiar nos cabeçalhos reencaminhados (X-Forwarded-For/-Proto/-Host) do proxy frontal: necessário para as regras de acesso de rede E para construir o callback de início de sessão OAuth como https:// quando o TLS termina num balanceador; sem isto, o início de sessão dos utilizadores falha por incompatibilidade do URI de redirecionamento. Ativa apenas atrás de um proxy que controles | desativado |
Armazenamento e ficheiros de identidade
| Variável | O que faz | Predefinição |
|---|---|---|
CONNXL_DATA_DIR | Diretório base de identity/ e logs/ | connxl-agent/ junto ao binário |
CONNXL_MTLS_CERT | Onde é guardado o certificado de cliente inscrito | <data dir>/identity/cert.pem |
CONNXL_MTLS_KEY | Onde é guardada a chave privada inscrita | <data dir>/identity/key.pem |
CONNXL_STATE_DIR | Cache da licença de direitos (entitlement lease) | o diretório de identidade |
Logging
| Variável | O que faz | Predefinição |
|---|---|---|
CONNXL_LOG_LEVEL | debug | info | warn | error. error esconde também as falhas repetíveis (um heartbeat falhado, uma reinscrição falhada) — prefere warn para reduzir o ruído | info |
CONNXL_LOG_FORMAT | json para um objeto JSON por linha | text |
CONNXL_LOG_MAX_MB | Tamanho a que o ficheiro de registo roda | 100 |
CONNXL_LOG_MAX_FILES | Ficheiros rodados mantidos; a ocupação em disco é aproximadamente MAX_MB × MAX_FILES | 5 |
Segredos
| Variável | O que faz | Predefinição |
|---|---|---|
CONNXL_SECRETS_KEY | Frase-passe para o armazém de segredos em ficheiro cifrado | — |
CONNXL_SECRETS_TTL_SECONDS | TTL de cache das referências secret:// resolvidas; 0 desativa | 300 |
CONNXL_SECRETS_AWS_REGION | Região para as referências do AWS Secrets Manager | — |
CONNXL_SECRETS_AWS_ENDPOINT | Endpoint próprio do Secrets Manager / Parameter Store — um VPC endpoint, um endpoint FIPS ou um emulador | — |
CONNXL_SECRETS_GCP_ENDPOINT | Endpoint próprio do GCP Secret Manager. Quando definido, as Application Default Credentials são ignoradas | — |
CONNXL_SECRETS_AZURE_ENDPOINT | Endpoint próprio do Azure Key Vault. Quando definido, o DefaultAzureCredential é ignorado | — |
Os endpoints próprios têm de ser https
As três variáveis _ENDPOINT são ignoradas a não ser que o URL seja https ou aponte para um endereço de loopback, e o agent regista um aviso quando rejeita uma. Definir um endpoint próprio ignora também a cadeia de credenciais dessa cloud, por isso um endpoint em texto simples enviaria os nomes dos segredos e receberia os respetivos valores em claro, sem autenticação e sem qualquer erro de autenticação que denuncie a falha.
Afinação do pool de base de dados
Cada conector SQL lê os seus próprios parâmetros de pool, prefixados por motor — POSTGRES_MAX_OPEN_CONNS, MYSQL_MAX_IDLE_CONNS, SQLSERVER_CONN_MAX_LIFETIME, e assim por diante (MAX_OPEN_CONNS é 20 por omissão, MAX_IDLE_CONNS 5). Deixa-os em paz a não ser que estejas a bater num limite de ligações do lado do servidor.
Requisitos de rede
Todas as ligações ao ConnXL são iniciadas pelo agent para fora. Nada precisa de alcançar o agent a partir da internet, e não é necessária nenhuma regra de firewall de entrada para o próprio ConnXL.
Saída — permite para o host da tua API do ConnXL em TCP 443:
| Caminho | Protocolo | Quando |
|---|---|---|
POST /v1/agent/enroll | HTTPS | apenas no primeiro arranque |
GET /v1/agent/certificates/trust-bundle | HTTPS | apenas no primeiro arranque |
POST /v1/agent/certificates/renew | HTTPS | renovação automática |
GET /v1/agent/config/snapshot | HTTPS | no arranque e após cada alteração |
POST /v1/agent/heartbeat | HTTPS | a cada 30 s |
GET /v1/agent/config/stream | HTTPS/SSE | persistente |
GET /v1/agent/control | WSS | persistente |
POST /v1/agent/telemetry/ingest | HTTPS | periódico |
Duas destas — o stream SSE de configuração e o canal de controlo por WebSocket — são ligações de longa duração. Os middleboxes que matam ligações inativas provocarão reconexões repetidas; o agent recupera, mas o dashboard vai oscilar.
Entrada: os teus utilizadores de Excel (e o teu balanceador de carga) têm de alcançar o agent em CONNXL_LISTEN_ADDR, porta 3000 por omissão.
Permite também: as tuas próprias fontes de dados e — apenas se usares inscrição por identidade cloud — o endpoint de metadados da instância (169.254.169.254).
Atrás de um proxy HTTP
HTTPS_PROXY, HTTP_PROXY e NO_PROXY são respeitados em todas as ligações que o agent faz ao ConnXL, incluindo os canais SSE e WebSocket de longa duração — por isso um host sem saída direta funciona. A autenticação por certificado de cliente não é afetada: o proxy abre um túnel CONNECT e o handshake TLS mantém-se ponta a ponta.
Se o teu proxy inspecionar o TLS em vez de o tunelar, a respetiva CA raiz tem de ser confiável para o sistema operativo onde o agent corre — o agent usa o armazém de confiança do sistema. As chamadas de saída para as tuas próprias fontes de dados REST seguem as mesmas variáveis, a não ser que essa ligação use uma CA personalizada ou um certificado de cliente.
Verificações de saúde e monitorização
O agent serve GET /healthz no seu endereço de escuta. Devolve 200 ok sempre que o processo está a correr.
/healthz é uma verificação de liveness, não de readiness
Não verifica nada — nem a conectividade com o backend, nem a inscrição, nem se alguma vez chegou um instantâneo de configuração. Um agent que perdeu a ligação ao ConnXL e está a servir um conjunto de funções desatualizado continua a responder 200. Usa-o para detetar um processo morto ou um host inalcançável; não o uses como sonda de readiness do Kubernetes nem o tomes como prova de que o agent está a funcionar.
Para saúde a sério, usa o dashboard: a página do Agente do ambiente mostra o CPU, a memória e o disco de cada réplica com uma linha temporal de 24 horas, o último heartbeat e a versão de configuração efetivamente aplicada. O backend marca um agent como offline ao fim de cerca de 90 segundos sem heartbeat, e os alertas podem notificar-te — vê Alertas.
Atualizar para uma versão nova
O agent nunca se atualiza a si próprio. Quando uma réplica reporta uma versão mais antiga do que a última publicada, o dashboard assinala-a e pode levantar uma notificação de Atualização disponível, mas nada é transferido nem substituído sem ti. Uma atualização é: colocar o binário novo no lugar e reiniciar.
Como não há qualquer handshake de desregisto com o teu balanceador de carga, tira tu mesmo a instância de rotação primeiro — o /healthz vai continuar a devolver 200 mesmo durante um encerramento, por isso não consegue sinalizar o dreno por ti.
- Remove a réplica do balanceador de carga.
- Envia
draina partir da página do Agente. Isto desmonta os subscritores de streaming para que se reconectem noutro sítio; não para o listener nem termina o processo. - Para o serviço (
SIGTERM, ousystemctl stop). Os pedidos em voo têm até 10 segundos para terminar, por isso permite pelo menos 30 segundos de timeout de paragem. - Substitui o binário e arranca o serviço de novo.
- Confirma a nova versão na página do Agente e devolve a réplica à rotação.
Com mais do que uma réplica, faz isto uma de cada vez e o ambiente mantém-se disponível do princípio ao fim.
Reverter
Reverter é o mesmo procedimento com o binário mais antigo — o agent não guarda em disco nenhum estado específico de versão, e o seu certificado inscrito continua válido. Guarda o binário anterior até teres confirmado que o novo está a servir.
O que o agent guarda em disco
| Localização | Conteúdo |
|---|---|
<data dir>/identity/ | O certificado mTLS inscrito e a chave privada (modo de diretório 0700) |
<data dir>/logs/ | Um ficheiro de log datado por dia, purgado ao fim de 7 dias |
<state dir>/lease.json | Licença de direitos em cache |
~/.connxl/ | O índice do keyring do SO e o armazém de segredos em ficheiro cifrado, se usados |
Os resultados de funções em cache são mantidos em memória, ou em Valkey/Redis quando o ambiente configura uma cache externa — nunca em disco.
Não precisas de fazer cópia de segurança de nada disto. Se o diretório de dados se perder, o agent volta a inscrever-se automaticamente no arranque seguinte e continua, desde que o seu token de inscrição (ou a atestação cloud, ou a identidade gravada) continue no seu ambiente. O único custo é um certificado novo e um histórico de logs do zero. Só precisas de um token novo se um administrador tiver entretanto clicado em Regenerar.
A chave privada, essa, protege
Nada precisa de cópia de segurança, mas o diretório de identidade contém uma credencial viva. Mantém-no em disco local com as suas permissões restritivas intactas em vez de num volume partilhado, e nunca o incorpores numa imagem de máquina que venha a ser clonada.
Dimensionamento e escalabilidade
O agent é um proxy leve: não retém qualquer conjunto de dados, e o seu trabalho é dominado pela espera pelas tuas fontes de dados. Uma instância pequena — 1 vCPU e 512 MB de memória — corre confortavelmente um ambiente típico, e o uso de disco limita-se a uma semana de logs.
Escala horizontalmente, não verticalmente. Acrescenta réplicas atrás de um balanceador de carga quando precisares de débito ou de redundância:
- Todas as réplicas de um ambiente partilham um único token de inscrição e aparecem individualmente na página do Agente.
- Não é necessária afinidade de sessão — o agent não guarda estado por utilizador entre pedidos.
- Dimensiona primeiro para a concorrência nas tuas fontes de dados; as predefinições do pool SQL (20 ligações abertas por motor, por réplica) multiplicam-se pelo número de réplicas.
Retirar um agent
Para desativar um host de forma limpa:
- Tira-o de rotação e confirma que o tráfego passou para outra réplica.
- Para o serviço e desativa o seu arranque automático.
- Expulsa a réplica a partir da página do Agente do ambiente. Isto coloca-a numa lista de bloqueio para que não se possa voltar a ligar mesmo que o processo regresse — a forma fiável de cortar um host que já não controlas.
- Apaga o diretório de dados para destruir a chave privada em disco.
- Se estiveres a retirar todos os agents desse ambiente, clica em Regenerar no separador Implementação para que os tokens de inscrição antigos deixem de funcionar.
Parar o processo não é revogar
Um agent parado continua a ter um certificado válido. Até o expulsares, reiniciar o binário volta a juntá-lo ao ambiente. Expulsa primeiro, apaga depois.
Glossário
Todos os termos do ConnXL num só sítio, com a distinção que mais se confunde: um suplemento é o que crias, um agent é o que o executa.
Instalar o suplemento
Instalar o ConnXL significa duas coisas: correr o agent num host que os teus utilizadores de Excel consigam alcançar, e levar o manifesto gerado até ao Excel. O agent serve o suplemento; o manifesto apenas diz ao Excel onde vive o agent.