Construire
Déployer et exécuter l'agent
L'agent est un binaire unique que vous exécutez sur votre propre infrastructure. Il sert le complément Excel, exécute vos fonctions sur vos sources de données et rend compte à ConnXL uniquement via des connexions sortantes. Cette page est la référence de l'exploitant — l'installer comme service, le mettre à jour, le surveiller et le retirer.
12 min de lecture
L'agent est un exécutable unique et autonome. Il n'a ni installeur, ni dépendance d'exécution, ni base de données propre, et il lit toute sa configuration dans les variables d'environnement plus l'instantané de configuration qu'il récupère depuis ConnXL. Tout ce qui suit suppose que vous avez déjà créé un complément et un environnement dans le tableau de bord — l'onglet Déploiement de la page Agent est l'endroit où vous téléchargez un binaire déjà gravé avec son identité.
Un agent par environnement
Chaque environnement exécute son propre agent, et le certificat pour lequel l'agent s'enrôle est ce qui le lie à cet environnement. Vous pouvez exécuter plusieurs répliques de l'agent d'un même environnement derrière un répartiteur de charge — elles partagent toutes un seul jeton d'enrôlement et chacune obtient son propre certificat.
Télécharger et vérifier le binaire
Déploiement → Télécharger l'agent configuré vous donne un binaire avec son URL de backend, son ID de complément, son ID d'environnement et un jeton d'enrôlement neuf déjà intégrés, de sorte qu'il s'exécute avec zéro variable d'environnement. Plateformes : Windows x64, Linux x64, Linux arm64.
Chaque téléchargement est publié avec un fichier SHA256SUMS. Vérifiez-le avant de l'exécuter :
# 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]Confirmez à tout moment ce dont vous disposez :
connxl-agent --version # affiche la version de build
connxl-agent --licenses # affiche les mentions tiercesUn binaire gravé porte un identifiant
Le jeton d'enrôlement intégré est un véritable identifiant pour ce seul environnement. Traitez un téléchargement configuré comme un secret : ne le commitez pas dans un dépôt et ne le partagez pas entre environnements. Si l'un d'eux fuit, Régénérer dans l'onglet Déploiement révoque d'un coup tous les jetons émis pour cet environnement.
L'exécuter comme un service
L'agent s'exécute au premier plan et écrit ses logs sur stdout, n'importe quel gestionnaire de services convient donc. Donnez-lui un utilisateur dédié et un répertoire de travail stable — c'est là qu'il écrit l'identité qu'il enrôle.
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 doit dépasser le drainage de 10 s des requêtes en vol de l'agent.
TimeoutStopSec=30
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now connxl-agent
sudo systemctl status connxl-agentWindows (service)
Le binaire est une simple application console, enregistrez-le donc avec sc.exe ou un wrapper de service tel que NSSM :
# Avec NSSM (gère la redirection de stdout et les redémarrages)
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 ConnXLAgentL'exécuter dans un conteneur
Il n'y a pas d'image publiée — construisez-en une minimale autour du binaire Linux. L'agent a besoin des certificats CA pour le TLS sortant et d'un volume persistant pour son identité, sans quoi il se réenrôle à chaque redémarrage.
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. Exécutez-le comme un Deployment derrière un Service, avec le jeton d'enrôlement issu d'un Secret. Utilisez uniquement une sonde de liveness — voir l'avertissement sur l'endpoint de santé à la section 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: 30Le jeton d'enrôlement est réutilisable
Chaque réplique peut utiliser le même jeton — chaque échange produit son propre certificat. C'est ce qui permet à un Deployment mis à l'échelle de fonctionner à partir d'un seul Secret.
Variables d'environnement
Un binaire gravé n'a besoin d'aucune de ces variables ; chacune remplace tout de même sa valeur gravée. Seul le groupe identité est requis sur un binaire non configuré.
Identité et backend
| Variable | Ce qu'elle fait | Par défaut |
|---|---|---|
CONNXL_BACKEND_URL | URL de base de l'API ConnXL. Requise (ou gravée) — l'agent refuse de démarrer sans elle | — |
CONNXL_ENROLL_TOKEN | Identifiant d'enrôlement à usage unique par agent ; réutilisable entre répliques | — |
CONNXL_ENROLL_ATTESTATION | aws | gcp | azure — s'enrôler avec l'identité cloud de l'hôte au lieu d'un jeton | — |
CONNXL_ADDIN_ID | Complément que cet agent sert | valeur gravée |
CONNXL_ENV_ID | Environnement que cet agent sert | valeur gravée |
CONNXL_BOOTSTRAP_URL | URL distincte pour l'enrôlement sans certificat | CONNXL_BACKEND_URL |
CONNXL_REPLICA_ID | Étiquette distinguant les répliques dans le tableau de bord | hostname |
CONNXL_ZONE, CONNXL_REGION | Étiquettes de placement rapportées avec la santé | vide |
CONNXL_HEARTBEAT_SECONDS | Intervalle du heartbeat, plafonné à 60 | 30 |
Listener et TLS
| Variable | Ce qu'elle fait | Par défaut |
|---|---|---|
CONNXL_LISTEN_ADDR | Adresse d'écoute de la surface du complément | :3000 |
CONNXL_TLS_TERMINATION | edge (HTTP simple derrière un répartiteur de charge terminant le TLS) ou agent (l'agent sert en HTTPS depuis cert.pem/key.pem à côté du binaire) | edge |
CONNXL_TRUSTED_PROXY | Faire confiance aux en-têtes transférés (X-Forwarded-For/-Proto/-Host) du proxy frontal : nécessaire pour les règles d'accès réseau ET pour construire le callback de connexion OAuth en https:// lorsque le TLS se termine sur un équilibreur de charge ; sans cela, la connexion des utilisateurs échoue pour non-concordance de l'URI de redirection. À activer uniquement derrière un proxy que vous contrôlez | désactivé |
Stockage et fichiers d'identité
| Variable | Ce qu'elle fait | Par défaut |
|---|---|---|
CONNXL_DATA_DIR | Répertoire de base pour identity/ et logs/ | connxl-agent/ à côté du binaire |
CONNXL_MTLS_CERT | Où est stocké le certificat client enrôlé | <data dir>/identity/cert.pem |
CONNXL_MTLS_KEY | Où est stockée la clé privée enrôlée | <data dir>/identity/key.pem |
CONNXL_STATE_DIR | Cache du bail de droits (entitlement lease) | le répertoire d'identité |
Logging
| Variable | Ce qu'elle fait | Par défaut |
|---|---|---|
CONNXL_LOG_LEVEL | debug | info | warn | error. error masque aussi les échecs réessayables (un heartbeat échoué, un ré-enrôlement échoué) — préférez warn pour réduire le bruit | info |
CONNXL_LOG_FORMAT | json pour un objet JSON par ligne | text |
CONNXL_LOG_MAX_MB | Taille à laquelle le fichier de log tourne | 100 |
CONNXL_LOG_MAX_FILES | Fichiers tournés conservés ; l'empreinte disque vaut environ MAX_MB × MAX_FILES | 5 |
Secrets
| Variable | Ce qu'elle fait | Par défaut |
|---|---|---|
CONNXL_SECRETS_KEY | Phrase secrète du magasin de secrets en fichier chiffré | — |
CONNXL_SECRETS_TTL_SECONDS | TTL de cache des références secret:// résolues ; 0 désactive | 300 |
CONNXL_SECRETS_AWS_REGION | Région pour les références AWS Secrets Manager | — |
CONNXL_SECRETS_AWS_ENDPOINT | Endpoint personnalisé Secrets Manager / Parameter Store — un endpoint VPC, un endpoint FIPS ou un émulateur | — |
CONNXL_SECRETS_GCP_ENDPOINT | Endpoint personnalisé GCP Secret Manager. Lorsqu'il est défini, les Application Default Credentials sont ignorées | — |
CONNXL_SECRETS_AZURE_ENDPOINT | Endpoint personnalisé Azure Key Vault. Lorsqu'il est défini, DefaultAzureCredential est ignoré | — |
Les endpoints personnalisés doivent être en https
Les trois variables _ENDPOINT sont ignorées sauf si l'URL est en https ou pointe vers une adresse de bouclage, et l'agent journalise un avertissement lorsqu'il en rejette une. Définir un endpoint personnalisé contourne aussi la chaîne d'identifiants de ce cloud : un endpoint en clair enverrait donc les noms des secrets et recevrait leurs valeurs en clair, sans authentification et sans erreur d'authentification pour signaler l'erreur.
Réglage du pool de base de données
Chaque connecteur SQL lit ses propres réglages de pool, préfixés par moteur — POSTGRES_MAX_OPEN_CONNS, MYSQL_MAX_IDLE_CONNS, SQLSERVER_CONN_MAX_LIFETIME, et ainsi de suite (MAX_OPEN_CONNS vaut 20 par défaut, MAX_IDLE_CONNS 5). Laissez-les tels quels sauf si vous atteignez une limite de connexions côté serveur.
Prérequis réseau
Chaque connexion vers ConnXL est initiée par l'agent en sortant. Rien n'a besoin d'atteindre l'agent depuis internet, et aucune règle de pare-feu entrante n'est requise pour ConnXL lui-même.
Sortant — autorisez vers l'hôte de votre API ConnXL sur TCP 443 :
| Chemin | Protocole | Quand |
|---|---|---|
POST /v1/agent/enroll | HTTPS | premier démarrage uniquement |
GET /v1/agent/certificates/trust-bundle | HTTPS | premier démarrage uniquement |
POST /v1/agent/certificates/renew | HTTPS | renouvellement automatique |
GET /v1/agent/config/snapshot | HTTPS | au démarrage et après chaque changement |
POST /v1/agent/heartbeat | HTTPS | toutes les 30 s |
GET /v1/agent/config/stream | HTTPS/SSE | persistant |
GET /v1/agent/control | WSS | persistant |
POST /v1/agent/telemetry/ingest | HTTPS | périodique |
Deux d'entre elles — le flux SSE de configuration et le canal de contrôle WebSocket — sont des connexions de longue durée. Les middleboxes qui tuent les connexions inactives provoqueront des reconnexions répétées ; l'agent s'en remet, mais le tableau de bord clignotera.
Entrant : vos utilisateurs Excel (et votre répartiteur de charge) doivent atteindre l'agent sur CONNXL_LISTEN_ADDR, port 3000 par défaut.
Autorisez aussi : vos propres sources de données et — uniquement si vous utilisez l'enrôlement par identité cloud — l'endpoint de métadonnées d'instance (169.254.169.254).
Derrière un proxy HTTP
HTTPS_PROXY, HTTP_PROXY et NO_PROXY sont respectés sur toutes les connexions que l'agent établit vers ConnXL, y compris les canaux SSE et WebSocket de longue durée — un hôte sans sortie directe fonctionne donc. L'authentification par certificat client n'est pas affectée : le proxy ouvre un tunnel CONNECT et la poignée de main TLS reste de bout en bout.
Si votre proxy inspecte le TLS au lieu de le tunneliser, sa CA racine doit être approuvée par le système d'exploitation sur lequel tourne l'agent — l'agent utilise le magasin de confiance du système. Les appels sortants vers vos propres sources de données REST suivent les mêmes variables, sauf si cette connexion utilise une CA personnalisée ou un certificat client.
Contrôles de santé et surveillance
L'agent sert GET /healthz sur son adresse d'écoute. Il renvoie 200 ok dès lors que le processus tourne.
/healthz est un contrôle de liveness, pas de readiness
Il ne vérifie rien — ni la connectivité au backend, ni l'enrôlement, ni le fait qu'un instantané de configuration soit jamais arrivé. Un agent qui a perdu sa connexion à ConnXL et qui sert un jeu de fonctions périmé répond toujours 200. Utilisez-le pour détecter un processus mort ou un hôte injoignable ; ne l'utilisez pas comme sonde de readiness Kubernetes et n'y voyez pas la preuve que l'agent fonctionne.
Pour une véritable santé, utilisez le tableau de bord : la page Agent de l'environnement affiche le CPU, la mémoire et le disque de chaque réplique avec une chronologie sur 24 heures, le dernier heartbeat et la version de configuration réellement appliquée. Le backend signale un agent hors ligne après environ 90 secondes sans heartbeat, et les alertes peuvent vous prévenir — voir Alertes.
Mettre à jour vers une nouvelle version
L'agent ne se met jamais à jour tout seul. Lorsqu'une réplique rapporte une version plus ancienne que la dernière publiée, le tableau de bord la signale et peut lever une notification Mise à jour disponible, mais rien n'est téléchargé ni remplacé sans vous. Une mise à jour consiste à : mettre le nouveau binaire en place et redémarrer.
Comme il n'y a pas de poignée de main de désenregistrement avec votre répartiteur de charge, sortez vous-même l'instance de la rotation en premier — /healthz continuera de renvoyer 200 jusque pendant un arrêt, il ne peut donc pas signaler le drainage à votre place.
- Retirez la réplique du répartiteur de charge.
- Envoyez
draindepuis la page Agent. Cela démonte les abonnés en streaming afin qu'ils se reconnectent ailleurs ; cela n'arrête ni le listener ni le processus. - Arrêtez le service (
SIGTERM, ousystemctl stop). Les requêtes en vol disposent de 10 secondes maximum pour finir, prévoyez donc au moins 30 secondes de timeout d'arrêt. - Remplacez le binaire et redémarrez le service.
- Confirmez la nouvelle version sur la page Agent, puis remettez la réplique en rotation.
Avec plus d'une réplique, faites-le une à la fois et l'environnement reste disponible du début à la fin.
Revenir en arrière
Le retour arrière est la même procédure avec l'ancien binaire — l'agent ne conserve aucun état spécifique à une version sur le disque, et son certificat enrôlé reste valide. Gardez le binaire précédent jusqu'à ce que vous ayez confirmé que le nouveau sert bien.
Ce que l'agent stocke sur le disque
| Emplacement | Contenu |
|---|---|
<data dir>/identity/ | Le certificat mTLS enrôlé et la clé privée (mode de répertoire 0700) |
<data dir>/logs/ | Un fichier de log daté par jour, purgé après 7 jours |
<state dir>/lease.json | Bail de droits mis en cache |
~/.connxl/ | L'index du trousseau de l'OS et le magasin de secrets en fichier chiffré, le cas échéant |
Les résultats de fonctions mis en cache sont conservés en mémoire, ou dans Valkey/Redis lorsque l'environnement configure un cache externe — jamais sur le disque.
Vous n'avez besoin de sauvegarder rien de tout cela. Si le répertoire de données est perdu, l'agent se réenrôle automatiquement au démarrage suivant et poursuit, tant que son jeton d'enrôlement (ou son attestation cloud, ou son identité gravée) est toujours dans son environnement. Le seul coût est un nouveau certificat et un historique de logs remis à zéro. Vous n'avez besoin d'un nouveau jeton que si un administrateur a cliqué sur Régénérer entre-temps.
Protégez tout de même la clé privée
Rien n'a besoin d'être sauvegardé, mais le répertoire d'identité contient un identifiant actif. Gardez-le sur un disque local avec ses permissions restrictives intactes plutôt que sur un volume partagé, et ne l'intégrez jamais dans une image machine destinée à être clonée.
Dimensionnement et mise à l'échelle
L'agent est un proxy léger : il ne détient aucun jeu de données, et son travail est dominé par l'attente de vos sources de données. Une petite instance — 1 vCPU et 512 Mo de mémoire — fait tourner confortablement un environnement typique, et l'usage disque se limite à une semaine de logs.
Mettez à l'échelle horizontalement, pas verticalement. Ajoutez des répliques derrière un répartiteur de charge quand vous avez besoin de débit ou de redondance :
- Toutes les répliques d'un environnement partagent un seul jeton d'enrôlement et apparaissent individuellement sur la page Agent.
- Aucune affinité de session n'est requise — l'agent ne conserve aucun état par utilisateur entre les requêtes.
- Dimensionnez d'abord pour la concurrence au niveau de vos sources de données ; les valeurs par défaut du pool SQL (20 connexions ouvertes par moteur, par réplique) se multiplient par le nombre de répliques.
Retirer un agent
Pour mettre un hôte hors service proprement :
- Sortez-le de la rotation et confirmez que le trafic est passé sur une autre réplique.
- Arrêtez le service et désactivez son démarrage automatique.
- Évincez la réplique depuis la page Agent de l'environnement. Cela la met en liste de blocage afin qu'elle ne puisse pas se reconnecter même si le processus revient — le moyen fiable de couper un hôte que vous ne contrôlez plus.
- Supprimez le répertoire de données pour détruire la clé privée sur le disque.
- Si vous retirez tous les agents de cet environnement, cliquez sur Régénérer dans l'onglet Déploiement pour que les anciens jetons d'enrôlement cessent de fonctionner.
Arrêter le processus n'est pas une révocation
Un agent arrêté détient toujours un certificat valide. Tant que vous ne l'évincez pas, redémarrer le binaire le fait rejoindre l'environnement. Évincez d'abord, supprimez ensuite.
Glossaire
Tous les termes de ConnXL au même endroit, avec la distinction la plus souvent ratée : un complément est ce que vous créez, un agent est ce qui le fait tourner.
Installer le complément
Installer ConnXL, c'est deux choses : exécuter l'agent sur un hôte que vos utilisateurs Excel peuvent atteindre, et faire entrer le manifeste généré dans Excel. L'agent sert le complément ; le manifeste indique simplement à Excel où se trouve l'agent.