Klar pour Stalwart
Un filtre anti-spam à base de transformer, qui tourne sur votre serveur Stalwart. Rien ne quitte la machine.
curl -fsSL https://raw.githubusercontent.com/klar-im/engine/main/install.sh | sudo KLAR_ACCEPT_MODEL_LICENSE=1 sh Linux avec systemd, en x86_64 ou arm64. Un système plus ancien utilise le conteneur.
Sa place dans Stalwart
Stalwart transmet chaque message entrant au milter Klar à l’étape DATA. Le moteur lit les en-têtes et le corps sur votre serveur. Il renvoie son verdict dans des en-têtes X-Klar.
Un script Sieve range ensuite chaque message selon ce verdict. Le spam part dans les Indésirables, le marketing dans son propre dossier, et le reste ne quitte pas la boîte de réception.
Une commande de plus branche Stalwart sur le milter. Elle déclare le milter pour le courrier entrant, impose un DMARC strict sur le port 25, installe le script Sieve. Avec --shadow, le filtre intégré continue de noter mais ne range plus rien :
export STALWART_URL=http://127.0.0.1:8080 STALWART_USER=admin STALWART_PASSWORD=...
python3 /opt/klar/share/stalwart/scripts/apply.py --shadow --milter-host 127.0.0.1 --milter-port 8891 Le filtre intégré doit cesser de décider. Il passe avant tout milter, et un message qu’il marque comme spam part dans les Indésirables, quoi qu’en dise Klar.
Activez ensuite le classement sur chaque boîte réellement lue, avec le mot de passe de ce compte. Laissez-le désactivé sur les pièges à spam et sur abuse@ : ils gardent les en-têtes et rien n’est déplacé.
STALWART_PASSWORD='alice-pw' python3 /opt/klar/share/stalwart/scripts/sieve_activate.py --url https://mail.example.com --user alice@example.com Le guide opérateurComparez avant de basculer
En mode observation, le filtre de Stalwart continue de tourner. Il note chaque message et écrit le résultat dans les en-têtes, mais ne range jamais rien. C’est Klar qui décide où va le courrier.
Chaque message porte donc deux verdicts. Comptez leurs désaccords sur votre propre courrier, aussi longtemps que vous voulez. Une fois prêt, relancez la commande sans --shadow. Elle désactive alors le filtre intégré :
python3 /opt/klar/share/stalwart/scripts/apply.py --milter-host 127.0.0.1 --milter-port 8891 Vous pouvez aussi le laisser actif pour de bon. Un second avis sur chaque message coûte quelques millisecondes.
X-Klar-Label: spamX-Klar-Class: spamX-Klar-Score-Spam: 0.98X-Klar-Model-Version: …Prérequis
x86_64- Debian 12, Ubuntu 22.04 ou plus récent, avec systemd.
arm64- Debian 13, Ubuntu 24.04 ou plus récent, avec systemd.
- Systèmes plus anciens
- Le conteneur ghcr.io/klar-im/klar-milterd, pour amd64 et arm64.
- Mémoire
- Environ 700 Mo de RSS une fois le modèle chargé. Un message à la fois.
- Vitesse
- Une médiane de 6 s par message sur un VPS à 2 vCPU, sur le seul processeur. Stalwart attend 60 s, puis livre sans classement.
- Stalwart
- Version 0.16, avec un accès admin via stalwart-cli.
Licences
Le code est open source sous AGPLv3. Le modèle a sa propre licence, CC-BY-NC-4.0 : libre pour un usage non commercial, avec attribution. L’installeur ne le télécharge que si KLAR_ACCEPT_MODEL_LICENSE=1 confirme que vous l’avez lue.
Non commercial, c’est un serveur personnel ou familial, un projet de loisir ou la recherche universitaire. Filtrer le courrier d’une entreprise (ses propres salariés compris, un essai aussi) ou d’un service payant demande une licence commerciale : c’est Klar Pro. Dans le doute, écrivez-nous à hello@klar.im avant de déployer.
Les questions des administrateurs
Une partie de mon courrier quitte-t-elle le serveur ?
Non. Le modèle tourne à côté du milter, sur la même machine, et classer un message ne fait aucun appel réseau. Les seuls téléchargements ont lieu à l’installation : la version publiée sur GitHub, puis le modèle.
Que se passe-t-il si le milter est arrêté ?
Stalwart livre le message sans classement, sans en-têtes X-Klar. Le milter laisse passer en cas d’échec : une panne ne retarde ni ne rejette jamais de courrier. Postfix fait de même avec notre configuration.
Comment mettre à jour ?
Relancez la commande d’installation. Elle conserve votre configuration et saute les fichiers du modèle déjà à jour. Pour figer une version, ajoutez KLAR_VERSION=v0.2.0 après sudo, à côté de KLAR_ACCEPT_MODEL_LICENSE=1.
Comment le désinstaller ?
Défaites d’abord le côté Stalwart. Lancez sieve_activate.py --deactivate pour chaque boîte. Supprimez le milter Klar et le script Sieve global klar, puis réactivez le filtre anti-spam. Si vous avez utilisé le mode observation, supprimez aussi le tag KLAR_SHADOW et sa règle. Rétablissez dmarcVerify si vous voulez retrouver l’ancienne politique. Arrêtez et désactivez ensuite klar-milterd, puis supprimez son fichier d’unité. Enfin, supprimez /opt/klar, /etc/klar, /var/lib/klar et l’utilisateur klarmilter.
Puis-je le lancer dans Docker ?
Oui. L’image ghcr.io/klar-im/klar-milterd tourne sur amd64 et arm64 et télécharge le même modèle au premier démarrage. Liez ses ports à 127.0.0.1, ou placez-la sur le réseau Docker de Stalwart et passez --milter-host klar-milterd. L’image ne contient pas apply.py : lancez les scripts depuis un clone du dépôt du moteur. N’exposez jamais le port 8891 sur internet.
Vous gérez le courrier d’une entreprise ?
Klar Pro est la licence commerciale du même moteur, sur vos propres serveurs. Décrivez-nous votre configuration.