Configuration
Toute la configuration passe par des variables d'environnement, validées au démarrage. Échec immédiat et message explicite plutôt que panne à l'usage : un outil de crise ne découvre pas sa mauvaise configuration le jour J.
Les variables
Identité de l'instance
| Variable | Rôle |
|---|---|
KASTELL_URL_PUBLIQUE | L'adresse que composent vos utilisateurs. Elle sert aussi à fabriquer les liens envoyés par courriel. |
KASTELL_ENV | developpement ou production. En production, aucune valeur d'exemple n'est tolérée. |
KASTELL_PORT | 8080 par défaut. |
SECRET_SESSION | 32 caractères minimum. openssl rand -hex 32. |
SECRET_SESSIONIl chiffre aussi les identifiants des passerelles de diffusion. Le perdre les rend illisibles — c'est voulu, et il faut le sauvegarder ailleurs que dans la base qu'il protège.
Derrière un reverse proxy
| Variable | Rôle |
|---|---|
KASTELL_PROXY_DE_CONFIANCE | Qui a le droit de dire l'adresse d'origine d'un appel. Vide par défaut. |
L'adresse d'origine sert à deux choses : limiter le débit des tentatives de
connexion, et s'inscrire au journal, où elle a valeur de preuve. Elle est lue
dans l'en-tête X-Forwarded-For — que l'appelant peut écrire lui-même.
Tant que cette variable est vide, l'en-tête est ignoré et c'est l'adresse de la connexion qui compte. C'est le bon réglage si l'application est exposée directement.
Si vous avez placé un proxy devant, renseignez son adresse — sinon toutes les tentatives paraîtront venir de lui, et une limite atteinte par un seul utilisateur bloquerait tout le monde :
KASTELL_PROXY_DE_CONFIANCE=172.18.0.0/16
Sont acceptés : une ou plusieurs adresses ou plages séparées par des virgules,
et le mot loopback. true fait confiance à tout le monde : à ne poser que si
rien d'autre que le proxy n'atteint le port.
Images de la composition
Toutes les images sont épinglées par version explicite et empreinte :
image: postgres:17.11-alpine3.24@sha256:18cfe3ef…
Une étiquette comme :latest ou 17-alpine bouge : deux démarrages à un mois
d'écart ne partent pas de la même image, et rien ne dit laquelle tourne. Sur un
outil de crise, savoir exactement ce qui est déployé fait partie du produit.
Les empreintes sont celles des manifestes multi-architecture : une empreinte propre à une plateforme casserait l'autre, et la composition doit tourner sur amd64 comme sur arm64.
Pour monter de version : relever la nouvelle empreinte, puis remplacer version et empreinte ensemble.
docker buildx imagetools inspect postgres:17-alpine
Courriel
Aucun transport de courriel n'est encore livré. En KASTELL_ENV=production,
l'instance refuse de démarrer plutôt que d'utiliser le transport de
développement, qui écrit les messages dans les traces — donc les liens de
connexion en clair, à la portée de qui lit les journaux.
Les parcours concernés sont la connexion par lien, la vérification d'adresse et les campagnes de vérification de l'annuaire. Le reste de l'instance n'en dépend pas.
Offre de code source — AGPL, section 13
| Variable | Rôle |
|---|---|
KASTELL_SOURCE_URL | Où trouver le code de cette instance. Si vous l'avez modifié, pointez vers votre dépôt. |
KASTELL_REVISION | La révision exacte, inscrite à la construction. |
Voir Licence.
Base, cache, stockage
DATABASE_URL, REDIS_URL, S3_ENDPOINT, S3_BUCKET, S3_ACCES,
S3_SECRET, S3_REGION.
Sans Redis, le flux temps réel se dégrade : chaque écran se met à jour à l'action, sans propagation immédiate. L'instance reste utilisable.
Visioconférence
| Variable | Rôle |
|---|---|
LIVEKIT_URL | Ce que compose le navigateur. |
LIVEKIT_URL_INTERNE | Ce que compose le serveur — dans une composition Docker, http://livekit:7880. |
LIVEKIT_CLE, LIVEKIT_SECRET | Les identifiants. |
« localhost », vu du conteneur applicatif, le désigne lui-même. Confondre les
deux donne un ECONNREFUSED que l'interface traduirait en panne réseau.
En production, activez le relais TURN sur le port 443 dans
docker/livekit.yaml : c'est le seul port que tous les pare-feux laissent
passer, et souvent le seul chemin depuis l'hôtel où la cellule s'est repliée.
Analyse antivirale
CLAMAV_HOTE, CLAMAV_PORT. Sans analyseur, les dépôts sont marqués
« non analysée » — jamais « saine ».
Au premier démarrage, ClamAV télécharge ses signatures pendant quelques minutes. Les dépôts restent possibles pendant ce temps.
Notifications mobiles
KASTELL_RELAIS_POUSSEE, KASTELL_RELAIS_CLE. Sans relais, l'instance reste
entière : elle ne réveille simplement personne, et le dit.
Canaux de diffusion, par organisation
Chaque organisation branche ses propres passerelles depuis Paramètres → Canaux de diffusion : OVHcloud pour le SMS, Brevo pour le courriel, ou n'importe quel fournisseur parlant HTTP décrit par un gabarit.
Les identifiants sont chiffrés au repos et ne ressortent jamais : ni par l'API, ni par la console root. Administrer une instance n'est pas lire les secrets de ses clients.
Un canal jamais éprouvé est une hypothèse. Le bouton « Éprouver » envoie un message d'essai vers vous, et vers vous seul.
Notification mobile : le relais de heurtoir
Les serveurs d'Apple n'acceptent que des messages signés par la clé de l'éditeur de l'application. Une instance auto-hébergée ne peut donc pas, seule, faire sonner l'application Kastell installée sur un téléphone : elle passe par un relais qui détient cette clé.
Sans relais, l'instance reste entière. Lecture, consignation, appel : rien n'est perdu. Elle ne réveille personne, et le dit — à sa sonde d'état, donc à l'application au moment où l'on choisit son instance. Le SMS et l'appel vocal restent les canaux de mobilisation de premier rang.
Pour le lancer avec la composition :
docker compose --profile mobile up -d
| Variable | Rôle |
|---|---|
KASTELL_RELAIS_POUSSEE | L'adresse du relais, vue de l'instance. |
KASTELL_RELAIS_CLE | La clé que l'instance présente au relais. |
APNS_CLE, APNS_CLE_ID, APNS_EQUIPE_ID, APNS_PAQUET | Les identifiants Apple du relais. |
APNS_ALERTE_CRITIQUE | true seulement si Apple a accordé l'habilitation. |
Le relais ne reçoit qu'un jeton d'appareil, un identifiant opaque et un degré
d'urgence : ni organisation, ni crise, ni personne. Il ne conserve rien. Son
code et son protocole sont dans apps/relais/ — vous pouvez exploiter le
vôtre, ou vérifier ce que fait celui que vous utilisez.