ConnXL Docs

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:

verificar a transferênciash
# 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:

shellsh
connxl-agent --version     # imprime a versão de compilação
connxl-agent --licenses    # imprime os avisos de terceiros

Um 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)

/etc/systemd/system/connxl-agent.serviceini
[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.target
shellsh
sudo systemctl daemon-reload
sudo systemctl enable --now connxl-agent
sudo systemctl status connxl-agent

Windows (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:

PowerShell (admin)powershell
# 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 ConnXLAgent

Correr 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.

Dockerfiledocker
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.

deployment.yaml (excerto)yaml
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: 30

O 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ávelO que fazPredefinição
CONNXL_BACKEND_URLURL base da API do ConnXL. Obrigatória (ou gravada) — o agent recusa-se a arrancar sem ela
CONNXL_ENROLL_TOKENCredencial de inscrição de uso único por agent; reutilizável entre réplicas
CONNXL_ENROLL_ATTESTATIONaws | gcp | azure — inscreve-te com a identidade cloud do host em vez de um token
CONNXL_ADDIN_IDSuplemento que este agent servevalor gravado
CONNXL_ENV_IDAmbiente que este agent servevalor gravado
CONNXL_BOOTSTRAP_URLURL separado para a inscrição sem certificadoCONNXL_BACKEND_URL
CONNXL_REPLICA_IDEtiqueta que distingue as réplicas no dashboardhostname
CONNXL_ZONE, CONNXL_REGIONEtiquetas de localização reportadas com a saúdevazio
CONNXL_HEARTBEAT_SECONDSIntervalo do heartbeat, limitado a 6030

Listener e TLS

VariávelO que fazPredefinição
CONNXL_LISTEN_ADDREndereço de escuta da superfície do suplemento:3000
CONNXL_TLS_TERMINATIONedge (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_PROXYConfiar 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 controlesdesativado

Armazenamento e ficheiros de identidade

VariávelO que fazPredefinição
CONNXL_DATA_DIRDiretório base de identity/ e logs/connxl-agent/ junto ao binário
CONNXL_MTLS_CERTOnde é guardado o certificado de cliente inscrito<data dir>/identity/cert.pem
CONNXL_MTLS_KEYOnde é guardada a chave privada inscrita<data dir>/identity/key.pem
CONNXL_STATE_DIRCache da licença de direitos (entitlement lease)o diretório de identidade

Logging

VariávelO que fazPredefinição
CONNXL_LOG_LEVELdebug | info | warn | error. error esconde também as falhas repetíveis (um heartbeat falhado, uma reinscrição falhada) — prefere warn para reduzir o ruídoinfo
CONNXL_LOG_FORMATjson para um objeto JSON por linhatext
CONNXL_LOG_MAX_MBTamanho a que o ficheiro de registo roda100
CONNXL_LOG_MAX_FILESFicheiros rodados mantidos; a ocupação em disco é aproximadamente MAX_MB × MAX_FILES5

Segredos

VariávelO que fazPredefinição
CONNXL_SECRETS_KEYFrase-passe para o armazém de segredos em ficheiro cifrado
CONNXL_SECRETS_TTL_SECONDSTTL de cache das referências secret:// resolvidas; 0 desativa300
CONNXL_SECRETS_AWS_REGIONRegião para as referências do AWS Secrets Manager
CONNXL_SECRETS_AWS_ENDPOINTEndpoint próprio do Secrets Manager / Parameter Store — um VPC endpoint, um endpoint FIPS ou um emulador
CONNXL_SECRETS_GCP_ENDPOINTEndpoint próprio do GCP Secret Manager. Quando definido, as Application Default Credentials são ignoradas
CONNXL_SECRETS_AZURE_ENDPOINTEndpoint 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:

CaminhoProtocoloQuando
POST /v1/agent/enrollHTTPSapenas no primeiro arranque
GET /v1/agent/certificates/trust-bundleHTTPSapenas no primeiro arranque
POST /v1/agent/certificates/renewHTTPSrenovação automática
GET /v1/agent/config/snapshotHTTPSno arranque e após cada alteração
POST /v1/agent/heartbeatHTTPSa cada 30 s
GET /v1/agent/config/streamHTTPS/SSEpersistente
GET /v1/agent/controlWSSpersistente
POST /v1/agent/telemetry/ingestHTTPSperió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.

  1. Remove a réplica do balanceador de carga.
  2. Envia drain a 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.
  3. Para o serviço (SIGTERM, ou systemctl stop). Os pedidos em voo têm até 10 segundos para terminar, por isso permite pelo menos 30 segundos de timeout de paragem.
  4. Substitui o binário e arranca o serviço de novo.
  5. 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çãoConteú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.jsonLicenç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:

  1. Tira-o de rotação e confirma que o tráfego passou para outra réplica.
  2. Para o serviço e desativa o seu arranque automático.
  3. 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.
  4. Apaga o diretório de dados para destruir a chave privada em disco.
  5. 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.

Nesta página