Aller au contenu principal

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

VariableRôle
KASTELL_URL_PUBLIQUEL'adresse que composent vos utilisateurs. Elle sert aussi à fabriquer les liens envoyés par courriel.
KASTELL_ENVdeveloppement ou production. En production, aucune valeur d'exemple n'est tolérée.
KASTELL_PORT8080 par défaut.
SECRET_SESSION32 caractères minimum. openssl rand -hex 32.
Ne perdez pas SECRET_SESSION

Il 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

VariableRôle
KASTELL_PROXY_DE_CONFIANCEQui 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

VariableRôle
KASTELL_SOURCE_URLOù trouver le code de cette instance. Si vous l'avez modifié, pointez vers votre dépôt.
KASTELL_REVISIONLa 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

VariableRôle
LIVEKIT_URLCe que compose le navigateur.
LIVEKIT_URL_INTERNECe que compose le serveur — dans une composition Docker, http://livekit:7880.
LIVEKIT_CLE, LIVEKIT_SECRETLes identifiants.
Deux adresses, et c'est important

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

Éprouvez le canal avant d'en avoir besoin

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
VariableRôle
KASTELL_RELAIS_POUSSEEL'adresse du relais, vue de l'instance.
KASTELL_RELAIS_CLELa clé que l'instance présente au relais.
APNS_CLE, APNS_CLE_ID, APNS_EQUIPE_ID, APNS_PAQUETLes identifiants Apple du relais.
APNS_ALERTE_CRITIQUEtrue 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.