Installer et configurer Saga#
Ce document couvre l'installation de Saga et tout ce qui se configure : options du serveur, HTTPS, reverse proxy, pare-feu, comptes, ligne de commande, agent du module « Machines », maintenance et désinstallation. L'utilisation au quotidien est décrite dans le guide d'utilisation.
Les exemples utilisent un serveur Saga en 192.168.10.6 et le domaine exemple.lan.
Remplacez-les par vos valeurs.
1. Prérequis#
| Élément | Détail |
|---|---|
| Système | Debian 12 ou 13, amd64 (VM, conteneur LXC ou machine physique) |
| Ressources | 1 cœur, 256 Mio de mémoire, quelques centaines de Mio de disque pour l'historique |
| Réseau | Accès aux services à surveiller ; accès sortant vers vos canaux d'alerte (ntfy, Telegram…) |
| Facultatif | Un reverse proxy (Caddy, Nginx, Nginx Proxy Manager) si l'interface doit être publique |
Saga est un seul programme qui embarque sa base de données (SQLite), son interface web et son serveur HTTPS : pas de serveur web, de base de données, de Node.js ni de conteneur à installer.
Placez-le en dehors de ce qu'il surveille quand c'est possible (une petite VM sur un autre hôte, un Raspberry Pi…) : un superviseur qui tombe avec le reste ne prévient personne.
2. Installer#
2.1 Avec le paquet Debian (recommandé)#
sudo apt install ./saga-server_0.3.0_amd64.deb
Le paquet installe :
| Fichier | Rôle |
|---|---|
/usr/bin/saga-server |
Le serveur |
/usr/share/saga/saga-agent |
L'agent, servi aux machines du module « Machines » |
/etc/saga/saga.env |
La configuration (conservée lors des mises à jour) |
/usr/lib/systemd/system/saga.service |
Le service saga, activé et démarré |
/var/lib/saga/ |
Les données (base saga.db, certificats du HTTPS intégré) |
2.2 Depuis les sources#
Prérequis : Go 1.24.
./scripts/build.sh # tests, puis dist/linux/saga-server et saga-agent
./packaging/deb/build-deb.sh # installateurs/saga-server_*.deb et saga-agent_*.deb
Aucune étape front-end : l'interface (HTML, CSS, JavaScript) est intégrée telle quelle au binaire.
2.3 Pour essayer, sans rien installer#
SAGA_DB=/tmp/saga-essai.db SAGA_SETUP_TOKEN=essai ./saga-server
Ouvrez http://localhost:8090 et créez le compte avec le jeton essai. Supprimez
/tmp/saga-essai.db pour repartir de zéro.
3. Premier lancement#
Au premier démarrage, sans compte, Saga génère un jeton d'installation :
sudo journalctl -u saga | grep jeton
Il est aussi dans /var/lib/private/saga/setup-token. Ouvrez l'interface (voir la
section 5), saisissez le jeton, choisissez l'identifiant
(admin par défaut) et le mot de passe (10 caractères minimum) du premier administrateur. Le
jeton est ensuite supprimé.
Activez tout de suite la double authentification : Paramètres › Compte.
4. Le fichier de configuration#
Toute la configuration du serveur est dans /etc/saga/saga.env, relu au redémarrage :
sudo nano /etc/saga/saga.env
sudo systemctl restart saga
Le reste (sondes, canaux, pages de statut, comptes) se règle dans l'interface. La liste complète des variables est en section 14.
5. Accès à l'interface et HTTPS#
Par défaut, Saga n'écoute que sur 127.0.0.1:8090 : l'interface n'est joignable que depuis
le serveur lui-même. Pour l'ouvrir depuis votre poste sans rien changer, un tunnel SSH suffit :
ssh -L 8090:127.0.0.1:8090 utilisateur@192.168.10.6
puis http://localhost:8090 tant que la session est ouverte. Pour un accès permanent, trois possibilités.
5.1 HTTPS intégré avec autorité locale (auto) — recommandé sur un réseau privé#
SAGA_ADDR=192.168.10.6:8443
SAGA_TLS=auto
SAGA_TLS_HOSTS=192.168.10.6,saga.exemple.lan
SAGA_PUBLIC_URL=https://saga.exemple.lan:8443
Saga crée une autorité de certification locale et signe lui-même son certificat, renouvelé
automatiquement. L'autorité est bridée : elle ne peut signer que des adresses privées et
les noms déclarés dans SAGA_TLS_HOSTS ; installée sur vos appareils, elle ne permettrait pas
d'usurper un site public.
Pour supprimer l'avertissement du navigateur, installez l'autorité sur vos appareils :
téléchargez https://192.168.10.6:8443/saga-ca.crt et comparez son empreinte avec celle du
journal (journalctl -u saga | grep autorité).
SAGA_PUBLIC_URL sert aux liens des notifications et aux commandes affichées dans
l'interface.
5.2 Vos propres certificats (files)#
SAGA_ADDR=0.0.0.0:8443
SAGA_TLS=files
SAGA_TLS_CERT=/etc/saga/cert.pem
SAGA_TLS_KEY=/etc/saga/key.pem
Le service lit les fichiers au démarrage : redémarrez-le après un renouvellement.
5.3 Derrière un reverse proxy (off)#
Gardez l'écoute locale et confiez le HTTPS au proxy :
SAGA_ADDR=127.0.0.1:8090
SAGA_TLS=off
SAGA_TRUST_PROXY=1
SAGA_PUBLIC_URL=https://saga.exemple.fr
SAGA_TRUST_PROXY=1 fait lire l'adresse du visiteur dans X-Forwarded-For (blocage après
plusieurs échecs de connexion) et le protocole dans X-Forwarded-Proto (cookie de session
Secure). Ne l'activez que si seul le proxy peut joindre Saga.
L'interface reçoit les mises à jour en direct par /api/live (Server-Sent Events), une
connexion qui reste ouverte :
- Caddy : rien à faire (
reverse_proxy 127.0.0.1:8090). - Nginx : Saga désactive lui-même la mise en tampon (
X-Accel-Buffering: no) ; gardez unproxy_read_timeoutd'au moins 60 s. - Nginx Proxy Manager : réglages par défaut.
Si les pages de statut doivent être publiques mais pas l'interface, publiez seulement
/status/, /api/public/, /api/push/ et les fichiers statiques (/style.css,
/status.js, /common.js, /theme-init.js, /favicon.*), et réservez le reste à votre
réseau.
5.4 Interface en HTTP sur le réseau (déconseillé)#
SAGA_ADDR=0.0.0.0:8090 avec SAGA_TLS=off fonctionne, mais mots de passe et cookies
circulent en clair. À réserver à un réseau de confiance, le temps d'un essai.
6. Réseau et pare-feu#
| Sens | Port | Pour |
|---|---|---|
| Entrant | 8090 ou 8443 (SAGA_ADDR) |
L'interface, les pages de statut, les signaux push, les agents |
| Sortant | Selon vos sondes | HTTP(S), ports TCP, DNS (53), ICMP |
| Sortant | 443 | Canaux d'alerte en ligne (ntfy.sh, api.telegram.org, Discord…) |
| Sortant | 465 ou 587 | E-mail (SMTP) |
Ping sans root. Les sondes ping utilisent la socket « datagramme ICMP » de Linux,
autorisée pour les groupes listés dans net.ipv4.ping_group_range. systemd l'ouvre à tous par
défaut ; sinon :
echo 'net.ipv4.ping_group_range = 0 2147483647' | sudo tee /etc/sysctl.d/60-saga-ping.conf
sudo sysctl --system
Avec ufw, par exemple, pour une interface en 8443 réservée au réseau local :
sudo ufw allow from 192.168.10.0/24 to any port 8443 proto tcp
7. Comptes, rôles et double authentification#
| Rôle | Peut |
|---|---|
| Lecteur | Consulter le tableau de bord, les sondes, les pages de statut et les maintenances |
| Éditeur | En plus : créer, modifier, mettre en pause et supprimer sondes, pages de statut et maintenances |
| Administrateur | Tout : utilisateurs, canaux de notification, sauvegarde et import, module « Machines » |
Les comptes se gèrent dans Paramètres › Utilisateurs. Il reste toujours au moins un administrateur. Un administrateur peut redéfinir le mot de passe d'un autre utilisateur et couper sa double authentification (téléphone perdu).
Double authentification (TOTP) : Paramètres › Compte › Activer. Saga affiche un QR code à scanner (Aegis, 2FAS, Google Authenticator, Andvari…) puis dix codes de secours à usage unique, à conserver hors du téléphone. Un code déjà utilisé est refusé.
Connexion : 5 essais libres par adresse, puis un blocage qui double à chaque nouvel échec (jusqu'à une heure). Les sessions durent 30 jours ; changer son mot de passe ferme les autres.
8. Service systemd#
sudo systemctl status saga
sudo systemctl restart saga
sudo journalctl -u saga -f
Le service tourne avec un utilisateur éphémère (DynamicUser), un système de fichiers en
lecture seule sauf son dossier de données, sans accès aux dossiers personnels, avec des appels
système filtrés et aucun privilège.
Pour ajuster sans modifier le fichier du paquet :
sudo systemctl edit saga
par exemple pour limiter la mémoire :
[Service]
MemoryMax=256M
9. Ligne de commande#
Les commandes accèdent à la base : arrêtez le service avant, et lancez-les avec le même utilisateur éphémère :
sudo systemctl stop saga
sudo systemd-run --pty --wait -p DynamicUser=yes -p User=saga -p StateDirectory=saga \
-E SAGA_DB=/var/lib/saga/saga.db /usr/bin/saga-server <commande>
sudo systemctl start saga
| Commande | Effet |
|---|---|
passwd [identifiant] |
Change le mot de passe (demandé deux fois), désactive la double authentification et ferme les sessions. Sans identifiant : le premier administrateur ; sans compte : en crée un |
version |
Affiche la version |
10. Module « Machines » : l'agent#
Facultatif, à activer dans Paramètres › Machines. Un agent installé sur chaque serveur envoie toutes les 30 s le CPU, la mémoire, le swap, la charge, le réseau et l'occupation des disques.
Machines › Ajouter une machine affiche une commande d'installation avec le jeton de la machine, montré une seule fois :
curl -fsSL https://saga.exemple.lan:8443/install.sh | sudo sh -s -- <jeton>
Avec l'autorité locale (SAGA_TLS=auto), la commande affichée contient -k pour ce premier
téléchargement ; le script installe ensuite l'autorité sur la machine et tout le reste est
vérifié. Le script installe /usr/local/bin/saga-agent, sa configuration
/etc/saga-agent/saga-agent.env et le service saga-agent (utilisateur éphémère, système en
lecture seule).
Sans le script, avec le paquet saga-agent :
sudo apt install ./saga-agent_0.3.0_amd64.deb
sudo nano /etc/saga-agent/saga-agent.env # SAGA_SERVER, SAGA_TOKEN, SAGA_CA
sudo systemctl enable --now saga-agent
Vérifier sans envoyer : saga-agent -print. Désinstaller :
sudo systemctl disable --now saga-agent, puis supprimer ces fichiers.
11. Völund#
Völund (la forge des machines, de la même famille) peut prévenir Saga à la fin de chaque installation de Debian :
- Dans Saga : nouvelle sonde de type Push, copiez son URL (
…/api/push/<jeton>). - Dans Völund : Paramètres › Saga › URL push de la sonde.
- Si Saga utilise son HTTPS intégré, collez aussi son autorité (contenu de
/saga-ca.crt).
12. Mise à jour, sauvegarde, restauration#
Mettre à jour : installez le nouveau paquet, le service redémarre seul. La configuration, les comptes et l'historique sont conservés ; la base est mise à niveau au démarrage.
sudo apt install ./saga-server_0.3.0_amd64.deb
Depuis la 0.2, le compte unique devient l'utilisateur admin, avec le même mot de passe.
Sauvegarder la configuration : Paramètres › Sauvegarde › Exporter (JSON des sondes, canaux, pages de statut et maintenances, avec ou sans les secrets).
Sauvegarder tout (comptes et historique compris), service en marche :
sudo sqlite3 /var/lib/private/saga/saga.db ".backup /root/saga-$(date +%F).db"
Restaurer : arrêtez le service, remettez le fichier à sa place, redémarrez.
sudo systemctl stop saga
sudo install -m 600 /root/saga-2026-10-15.db /var/lib/private/saga/saga.db
sudo systemctl start saga
13. Désinstaller#
sudo apt remove saga-server # garde la configuration et les données
sudo apt purge saga-server # supprime aussi /etc/saga et /var/lib/private/saga
14. Référence des variables#
| Variable | Défaut | Rôle |
|---|---|---|
SAGA_ADDR |
127.0.0.1:8090 |
Adresse et port d'écoute |
SAGA_TLS |
off |
off, auto (autorité locale) ou files |
SAGA_TLS_HOSTS |
Noms et IP du certificat (auto), séparés par des virgules |
|
SAGA_TLS_DIR |
<dossier de la base>/tls |
Autorité et certificat (auto) |
SAGA_TLS_CERT, SAGA_TLS_KEY |
Certificat et clé (files) |
|
SAGA_PUBLIC_URL |
Adresse publique : liens des notifications et commandes affichées | |
SAGA_TRUST_PROXY |
1 : lire X-Forwarded-For et X-Forwarded-Proto |
|
SAGA_DB |
saga.db (/var/lib/saga/saga.db avec le paquet) |
Base de données |
SAGA_RETENTION |
30d |
Durée de conservation des pulsations (l'historique quotidien est gardé 400 jours) |
SAGA_OFFLINE_AFTER |
90s |
Machine injoignable après ce délai sans rapport (module « Machines ») |
SAGA_SETUP_TOKEN |
généré | Jeton de création du premier compte |
SAGA_AGENT_BIN |
/usr/share/saga/saga-agent |
Agent servi par /dl/saga-agent |
Guide d'utilisation de Saga#
Ce guide décrit l'utilisation de Saga au quotidien : tableau de bord, sondes, alertes, pages de statut, maintenances et paramètres. L'installation et la configuration du serveur sont dans Installer et configurer Saga.
1. Le tableau de bord#
À gauche, la liste des sondes, rangées par groupe, avec une recherche et un filtre par état. Chaque ligne montre la disponibilité sur 24 heures et les dernières pulsations (une barre par vérification) :
| Couleur | État |
|---|---|
| Vert | En ligne |
| Rouge | Hors service |
| Ambre | En attente : un échec, nouvelle tentative avant d'alerter |
| Bleu | En maintenance |
| Gris | En pause, ou pas encore de résultat |
À droite, la vue rapide (nombre de sondes par état) et le journal des évènements importants : chaque passage d'un état à un autre, avec la date et le message.
Tout se met à jour en direct : une vérification apparaît au moment où elle se termine, sans recharger la page. L'indicateur « EN DIRECT » passe à « HORS LIGNE » si la connexion au serveur est coupée ; elle se rétablit seule.
La fiche d'une sonde#
Un clic sur une sonde ouvre sa fiche :
- les 100 dernières pulsations et le dernier message (code HTTP, mot-clé trouvé, adresse résolue…) ;
- le temps de réponse actuel et moyen sur 24 h, la disponibilité sur 24 h, 30 et 90 jours, la date d'expiration du certificat ;
- l'historique sur 90 jours : une barre par jour, verte, ambre ou rouge selon la disponibilité du jour (détail au survol) ;
- le graphique du temps de réponse, de 1 heure à 7 jours ;
- le journal de ses évènements.
Les boutons permettent de la mettre en pause (plus de vérification ni d'alerte), de la vérifier tout de suite, de la modifier, de la cloner ou de la supprimer.
2. Les sondes#
Bouton Nouvelle sonde. Six types :
| Type | Cible | En ligne si… |
|---|---|---|
| HTTP(S) | URL | le code de réponse est accepté (200-299 par défaut) et, si demandé, le mot-clé est présent (ou absent, en mode inversé) |
| Port TCP | hôte:port |
la connexion est acceptée |
| Ping | hôte ou IP | l'hôte répond au ping |
| DNS | nom de domaine | un enregistrement du type choisi (A, AAAA, CNAME, MX, NS, TXT) existe, et contient la valeur attendue si elle est donnée |
| Certificat TLS | hôte:port |
le certificat est valide et pas expiré |
| Push | — | votre tâche a appelé l'URL de la sonde dans l'intervalle |
Fréquence et tentatives#
- Intervalle : temps entre deux vérifications (20 s minimum). Pour une sonde push : délai maximal entre deux signaux.
- Tentatives avant alerte : après un succès, un échec met la sonde « en attente » et la revérifie après l'intervalle entre tentatives ; elle n'est déclarée hors service qu'après ce nombre d'échecs supplémentaires. Évite les alertes pour un hoquet du réseau.
- Délai max. : au-delà, la vérification échoue (« délai dépassé »).
- Rappel pendant une panne : renvoie l'alerte toutes les N minutes tant que la sonde reste hors service (« 🔁 Toujours hors service »). 0 : une seule alerte.
Options avancées#
- Alerte d'expiration du certificat (HTTP et TLS) : une alerte quand il reste moins de N jours, une autre quand il est renouvelé.
- Ignorer les erreurs de certificat : pour un service en certificat auto-signé, comme l'interface de Proxmox sur le port 8006.
- Mode inversé : la sonde est en ligne quand le service ne répond pas (vérifier qu'un port reste fermé, qu'une ancienne adresse ne répond plus…).
- HTTP : méthode (GET, POST…), corps de requête, en-têtes en JSON (par exemple
{"Authorization": "Bearer …"}), codes acceptés (200-299, 301), nombre maximal de redirections suivies.
Organisation#
Le groupe range la sonde dans la liste (Sites web, Proxmox, Tâches…) ; la description s'affiche dans sa fiche.
Sondes push#
Pour ce qui ne s'interroge pas de l'extérieur : sauvegardes, tâches cron, scripts. Saga donne une URL à appeler à chaque exécution réussie :
curl -fsS "https://saga.exemple.lan/api/push/<jeton>?status=up&msg=OK" >/dev/null
Paramètres facultatifs : status=down pour signaler un échec, msg (le message affiché),
ping (une durée en millisecondes). Sans signal pendant l'intervalle, la sonde passe hors
service.
Par exemple, en fin de script de sauvegarde :
if restic backup /srv; then
curl -fsS "https://saga.exemple.lan/api/push/<jeton>?msg=sauvegarde+OK" >/dev/null
else
curl -fsS "https://saga.exemple.lan/api/push/<jeton>?status=down&msg=sauvegarde+en+échec" >/dev/null
fi
3. Les notifications#
Les canaux se déclarent dans Paramètres › Notifications (administrateurs), puis se cochent dans chaque sonde.
| Canal | À renseigner |
|---|---|
| ntfy | URL du sujet (https://ntfy.sh/mon-sujet-secret ou votre serveur), jeton facultatif |
| Telegram | Jeton du bot (@BotFather), identifiant de la discussion |
| Gotify | URL du serveur, jeton d'application |
| Webhook | URL : Discord, Slack, Mattermost, Rocket.Chat, ou tout service qui accepte du JSON |
| Serveur SMTP, port (465 TLS ou 587 STARTTLS), identifiants, expéditeur, destinataires |
Le bouton Tester envoie une notification d'essai. Un canal par défaut est coché d'office sur les nouvelles sondes et reçoit les alertes du module « Machines ».
Une sonde envoie :
- 🔴 Hors service quand elle passe hors service (après les tentatives) ;
- 🔁 Toujours hors service à chaque rappel, si un rappel est réglé ;
- ✅ Rétabli à son retour, avec la durée de la coupure ;
- 🟠 quand son certificat approche de l'expiration.
Une seule alerte part par panne, même si le serveur redémarre entre-temps.
4. Pages de statut et maintenances#
Pages de statut#
Pages de statut › Nouvelle page : un titre et une adresse (/status/services). Puis :
- Services affichés : des groupes (« Sites web », « Messagerie »…) et les sondes de chacun, dans l'ordre voulu ;
- Réglages : description, pied de page, publication, affichage de l'expiration des certificats ;
- Annonce : un message en haut de la page (information, avertissement, incident, résolu).
La page montre l'état général (« Tous les services fonctionnent normalement », « Certains services rencontrent des problèmes », « Panne majeure », « Maintenance en cours »), les maintenances en cours et, pour chaque service, la disponibilité des 90 derniers jours. Elle se met à jour toutes les 30 secondes.
Elle ne montre que les noms et les états : jamais l'adresse d'un service, un message d'erreur ou un jeton. Une page non publiée n'est visible qu'une fois connecté.
Maintenances#
Maintenance › Planifier une maintenance : un titre, une description, un début et une fin, et les sondes concernées (ou toutes). Pendant la fenêtre, ces sondes ne sont plus vérifiées, leurs pulsations sont bleues, aucune alerte ne part, et les pages de statut affichent la maintenance. Le bouton Terminer l'arrête avant l'heure.
5. Paramètres#
Compte#
Votre mot de passe et la double authentification : Activer, scanner le QR code, saisir le code affiché, puis conserver les dix codes de secours (dans Andvari, par exemple). Chacun ne sert qu'une fois et remplace le téléphone en cas de perte.
Utilisateurs (administrateurs)#
Ajouter un compte : identifiant, rôle (lecteur, éditeur ou administrateur) et mot de passe à transmettre à la personne. Un administrateur peut changer le rôle, redéfinir le mot de passe ou couper la double authentification d'un autre utilisateur.
Sauvegarde (administrateurs)#
- Exporter sans les secrets : sondes, canaux, pages de statut et maintenances, partageable.
- Exporter avec les secrets : en plus, mots de passe SMTP, jetons et URL de push, pour une restauration complète. À garder en lieu sûr.
- Importer : un export Saga, ou une sauvegarde Uptime Kuma (Kuma : Paramètres › Sauvegarde › Exporter). Les sondes HTTP, mot-clé, port, ping, DNS et push sont reprises, les groupes Kuma deviennent des groupes, les jetons push sont conservés : vos scripts n'ont qu'à changer d'adresse. Canaux repris : ntfy, Telegram, Gotify, Discord, Slack, Mattermost, Rocket.Chat, webhook et SMTP. Ce qui ne peut pas l'être est listé à la fin.
Deux modes : ajouter (une sonde de même nom, type et cible est ignorée) ou remplacer toute la configuration.
Apparence#
Saga (sombre) et Vélin (clair), plus les thèmes de la famille : Fjord (Gná), Nuit et Parchemin (Andvari), Braise et Givre. Le choix est propre à chaque appareil.
Machines#
Le module facultatif de métriques système : voir l'agent.
6. Bonnes pratiques de sécurité#
- Activez la double authentification, au moins pour les administrateurs, et rangez les codes de secours hors du téléphone.
- Un compte par personne, avec le rôle le plus faible qui suffit : lecteur pour qui consulte, éditeur pour qui gère les sondes.
- N'exposez pas l'interface sur Internet si ce n'est pas nécessaire : accès par le réseau
local, un VPN (WireGuard) ou un tunnel SSH. Pour des pages de statut publiques, ne publiez
que
/status/,/api/public/et/api/push/(voir le reverse proxy). - Traitez les URL de push comme des secrets : qui connaît l'URL peut envoyer des signaux. Une URL divulguée se change en recréant la sonde.
- Gardez l'export « avec les secrets » en lieu sûr, chiffré ; partagez seulement l'export sans les secrets.
- Sauvegardez la base régulièrement (
/var/lib/private/saga/saga.db). - Surveillez Saga lui-même : une sonde HTTP sur
/api/healthdepuis une autre machine (un second Saga, ou un service externe), pour savoir si le superviseur tombe.
7. Dépannage#
| Symptôme | Piste |
|---|---|
| Ping : « ping non autorisé » | net.ipv4.ping_group_range : voir Réseau et pare-feu |
| HTTPS : « certificat non reconnu (autorité inconnue) » | Certificat auto-signé : cochez « Ignorer les erreurs de certificat », ou utilisez une sonde TLS |
| « nom introuvable (DNS) » | Le serveur Saga ne résout pas ce nom : vérifiez /etc/resolv.conf, ou mettez l'IP |
| Une sonde push passe hors service à tort | L'intervalle doit être un peu plus long que la période de votre tâche (par exemple 25 h pour une tâche quotidienne) |
| Aucune notification | Paramètres › Notifications › Tester : le message d'erreur dit pourquoi ; vérifiez que le canal est coché dans la sonde et actif |
| « EN DIRECT » reste à « HORS LIGNE » derrière Nginx | proxy_read_timeout trop court, ou mise en tampon : voir le reverse proxy |
| Mot de passe ou téléphone perdu | Un autre administrateur peut le redéfinir ; sinon saga-server passwd (voir la ligne de commande) |
Le journal du service donne le détail de chaque panne, alerte et erreur d'envoi :
sudo journalctl -u saga -f