Post

⚙️🌐 Uptime Kuma : supervision serveur DNS Technitium

⚙️🌐 Uptime Kuma : supervision serveur DNS Technitium

Uptime Kuma : supervision de Technitium DNS

Uptime Kuma (Docker, via Portainer) pour surveiller le serveur DNS Technitium, avec alertes par ntfy.

1. Objectif et architecture

Élément Valeur
Serveur DNS surveillé Technitium, 192.168.0.205 (nginx devant, dns.home.arpa)
Machine de supervision Une autre machine que Technitium (VM ou LXC sur un autre nœud Proxmox)
DNS principal du conteneur Kuma 192.168.0.205 (Technitium)
DNS de secours du conteneur Kuma 192.168.0.254 (box)
Notifications ntfy, https://ntfy.rnmkcy.eu, topic yan_infos

Principe : la sonde ne doit pas tomber avec ce qu’elle surveille. Si Technitium s’arrête, le conteneur Kuma doit pouvoir résoudre le nom du serveur ntfy (via la box) pour envoyer l’alerte.

2. Prérequis

  • Portainer opérationnel sur la machine qui héberge Kuma.
  • Le certificat public de la CA home.arpa copié sur cette machine, par exemple dans /opt/uptime-kuma/certs/ca-home-arpa.crt. Jamais la clé privée.
  • Un jeton ntfy avec droit d’écriture sur le topic yan_infos.
  • L’IP de la machine Kuma doit appartenir à un réseau autorisé dans la liste de récursion de Technitium (192.168.0.0/24 convient), sinon les moniteurs DNS recevront REFUSED.
  • Vérifier que la box répond aux requêtes DNS :
1
dig @192.168.0.254 ntfy.rnmkcy.eu +time=2 +tries=1

3. Installation via Portainer

Stacks → Add stack → Web editor, nom : uptime-kuma.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
services:
  uptime-kuma:
    container_name: uptime-kuma
    image: louislam/uptime-kuma:2.5.7
    restart: unless-stopped
    ports:
      - "3001:3001"
    dns:
      - 192.168.0.205
      - 192.168.0.254
    extra_hosts:
      - "dns.home.arpa:192.168.0.205"
    environment:
      - TZ=Europe/Paris
      - NODE_EXTRA_CA_CERTS=/certs/ca-home-arpa.crt
    volumes:
      - uptime-kuma-data:/app/data
      - /opt/uptime-kuma/certs/ca-home-arpa.crt:/certs/ca-home-arpa.crt:ro
    security_opt:
      - no-new-privileges:true
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

volumes:
  uptime-kuma-data:

Points importants :

  • VERSION_FIXEE : choisir un tag précis dans l’onglet Tags de Docker Hub (hub.docker.com/r/louislam/uptime-kuma). Ne pas utiliser latest.
  • dns : Technitium d’abord (192.168.0.205), la box en secours(192.168.0.254). Docker n’essaie le second serveur que si le premier ne répond pas.
  • extra_hosts : le moniteur DoH atteint dns.home.arpa sans dépendre du DNS.
  • NODE_EXTRA_CA_CERTS : Kuma fait confiance à ta CA locale, sans désactiver la vérification TLS.
  • Chemins : dans l’éditeur web de Portainer, utiliser des chemins absolus ou un volume nommé (pas de ./).
  • Port : 3001 ne doit jamais être exposé à Internet. Voir la section 9.

Cliquer sur Deploy the stack

Statut Signification
starting Le conteneur vient de démarrer, premier contrôle en attente (quelques dizaines de secondes)
healthy Les contrôles réussissent : l’application répond
unhealthy Plusieurs contrôles consécutifs ont échoué (application plantée, bloquée ou base corrompue)

healthy garantit seulement que Kuma tourne.

Ouvrir http://192.168.0.224:3001

  1. Créer le compte administrateur ,mot de passe fort
  2. Double authentification recommandée dans Paramètres → Sécurité

4. Notification ntfy

Paramètres → Notifications → Créer une notification :

  1. Type : Apprise.
  2. Nom d’affichage: Uptime Kuma
  3. URL apprise : ` ntfys://tk_xxxxxxxxxxxxxx@ntfy.rnmkcy.eu/yan_infos `.
  4. Titer : Notifications Kuma
  5. Cocher « Activé par défaut » pour que les nouveaux moniteurs l’utilisent.
  6. Bouton Test : un message doit arriver sur ton téléphone et ton desktop.

5. Sonde

Réglages communs : intervalle 60 s, nouvelles tentatives 2 ou 3, notification ntfy yan_infos. Regrouper les moniteurs dans un groupe « DNS ».

# Nom Type Paramètres Ce que ça détecte
1 DNS : résolution externe DNS Résolveur 192.168.0.205, port 53, nom example.com, type A Technitium ne résout plus
2 DNS : zone locale DNS Résolveur 192.168.0.205, nom dns.home.arpa, type A, résultat attendu 192.168.0.205 (si le champ existe) Zone home.arpa cassée
3 DNS : port TCP TCP 192.168.0.205, port 53 Écoute TCP
4 DoH via nginx HTTP(s) URL ci-dessous, codes acceptés 200 Chaîne nginx → DoH

5.1 résolution externe

  1. Dans Kuma, clique sur Ajouter une nouvelle sonde.
  2. Type : DNS.
  3. Nom : DNS : résolution externe
  4. Nom d’hôte : example.com
  5. Serveur de résolution : 192.168.0.205, port 53.
  6. Type d’enregistrement : A.
  7. Intervalle : 60 secondes, tentatives : 2.
  8. Sauvegarder.

Le moniteur doit passer au vert.

5.2 zone locale

  1. Dans Kuma, clique sur Ajouter une nouvelle sonde.
  2. Type : DNS.
  3. Nom : DNS : zone locale
  4. Nom d’hôte : dns.home.arpa
  5. Serveur de résolution : 192.168.0.205, port 53.
  6. Type d’enregistrement : A.
  7. Intervalle : 60 secondes, tentatives : 2.
  8. Sauvegarder.

5.3 zone locale

  1. Dans Kuma, clique sur Ajouter une nouvelle sonde.
  2. Type : TCP.
  3. Nom : DNS : zone locale
  4. Nom d’hôte : dns.home.arpa
  5. Serveur de résolution : 192.168.0.205, port 53.
  6. Type d’enregistrement : A.
  7. Intervalle : 60 secondes, tentatives : 2.
  8. Sauvegarder.

5.4 TCP (port 53)

Champ Valeur
Type de moniteur TCP Port
Nom d’affichage DNS : port TCP 53
Nom d’hôte 192.168.0.205
Port 53
Intervalle de vérification 60
Tentatives 2
Intervalle entre les tentatives 60

Ce moniteur vérifie seulement que Technitium écoute en TCP sur le port 53. Il ne teste pas la résolution, qui reste couverte par ton moniteur DNS.

5.5 DoH (HTTP(s))

Champ Valeur
Type de moniteur HTTP(s)
Nom d’affichage DNS : DoH via nginx
URL https://dns.home.arpa/dns-query?dns=AAABAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE
Méthode GET
Intervalle de vérification 60
Tentatives 2
Intervalle entre les tentatives 60
Délai d’attente (timeout) 10 secondes
Redirections maximales 0
Codes d’état acceptés 200-299
En-têtes (JSON) {"Accept": "application/dns-message"}
Ignorer les erreurs TLS/SSL Décoché
Alerte d’expiration du certificat Cochée

Ne renseigne ni mot-clé ni corps de requête : la réponse est binaire, seul le code 200 compte.

Dans le champ des en-têtes, les guillemets doivent être droits ", sinon Kuma refuse le JSON.

Si le moniteur DoH échoue au premier essai

Message affiché Cause probable
Certificat non vérifiable (unable to verify…) Kuma ne fait pas confiance à ta CA : vérifie le fichier monté dans /certs, que c’est bien le certificat de la CA, puis redémarre le conteneur
403 L’IP de la machine Kuma n’est pas dans les réseaux autorisés par nginx
400 URL mal copiée : recopie-la en entier, sans espace
Nom dns.home.arpa non résolu La ligne extra_hosts manque dans le compose de Kuma

Pour la dernière ligne, le compose doit contenir :

1
2
    extra_hosts:
      - "dns.home.arpa:192.168.0.205"

Validation

Une fois les deux moniteurs créés, ils doivent passer au vert en moins d’une minute. Tu les as déjà testés en rouge avec l’arrêt de Technitium : ils réagiront de la même façon, et la notification part par ta configuration ntfy existante.

Dis-moi si l’un des deux reste orange ou rouge, avec le message affiché, et on le corrige. Pour le dernier, Kuma doit faire confiance à ta CA (NODE_EXTRA_CA_CERTS). S’il affiche une erreur de certificat, dis-le-moi et on vérifie le fichier monté.

Tester la vraie alerte

  • Vérifie que ton moniteur DNS est bien vert dans Kuma.
  • Choisis un moment calme : pendant l’arrêt, tous les appareils qui utilisent uniquement Technitium perdent leur DNS, y compris ton navigateur configuré en DoH. Cette machine-ci et ton téléphone en données mobiles ne sont pas concernés.
  • Prépare la commande de relance dans un second terminal, ou garde Portainer ouvert sur le bouton Start.

Quand les moniteurs tournent, coupe Technitium 2 à 3 minutes pour vérifier que l’alerte arrive, puis relance-le pour recevoir le message de rétablissement. Fais-le à un moment calme, puisque le DNS de ton réseau sera coupé pendant ce temps.

Avec un intervalle de 60 s et 2 tentatives, compte 2 à 3 minutes avant l’alerte « Down » sur ton téléphone. Elle doit arriver même si Technitium est coupé, puisque le conteneur Kuma bascule sur la box (192.168.0.254) pour résoudre ntfy.rnmkcy.eu.

Pour couper technitium, se connecter sur cwwk qui l’héberge

1
cd /sharenfs/docker-app/technitium

Sur le serveur qui héberge Technitium, dans le dossier de son docker-compose.yml :

1
docker compose stop technitium

Pour le relancer à la fin du test :

1
docker compose start technitium

Quand elle est arrivée, relance Technitium : le moniteur repasse au vert et tu reçois le message de rétablissement. Comme le conteneur est configuré avec restart: unless-stopped, un arrêt manuel n’est pas annulé tout seul : n’oublie pas de le redémarrer.

Dans la minute qui suit, le moniteur repasse au vert et tu dois recevoir une notification de rétablissement. Si elle arrive, le test est entièrement validé.

Maintenance

Symptôme Cause probable Solution
Moniteur DNS : REFUSED IP de la machine Kuma absente de la liste de récursion Ajouter son réseau dans Settings → Recursion de Technitium
Moniteur DNS : timeout Pare-feu (ufw) du serveur DNS Vérifier les règles du port 53
HTTP(s) : certificat non vérifiable CA non prise en compte Vérifier le montage du fichier, que c’est bien le certificat de la CA, et redémarrer la stack
HTTP(s) : 403 IP de Kuma hors des réseaux autorisés par nginx Ajouter son réseau dans les allow
Notification de test en échec Nom de ntfy.rnmkcy.eu non résolu, ou jeton invalide Test getent hosts ci-dessus, puis droits du jeton sur le topic
Pas d’alerte pendant une vraie panne Le conteneur dépend uniquement de Technitium Vérifier les deux entrées dns: du compose
  • Mise à jour : changer le tag de l’image dans la stack Portainer, puis Update the stack en cochant Re-pull image. Lire les notes de version avant.
  • Sauvegarde : le volume uptime-kuma-data (base SQLite) à inclure dans ta sauvegarde Borg.
  • Jeton ntfy : un jeton dédié à Kuma, avec droit d’écriture sur le topic uniquement.

Sécurité

  • Ne pas exposer le port 3001 à Internet. Limiter l’accès par pare-feu au réseau local ; pour un accès HTTPS, publier Kuma derrière nginx sur un nom *.home.arpa, avec les en-têtes WebSocket et le filtrage par réseaux.
  • Activer la double authentification du compte administrateur.
  • Ne jamais écrire le jeton ntfy dans un document ou un dépôt.

kuma.home.arpa

1. Créer le nom dans Technitium

Zones → home.arpa → Add Record :

Champ Valeur
Nom kuma
Type A
Adresse 192.168.0.205 (l’IP de ton nginx, celle de dns.home.arpa)

Un enregistrement CNAME vers dns.home.arpa convient aussi : il suit l’IP du nginx si elle change.

2. Vérifier le certificat

Ton certificat doit couvrir kuma.home.arpa, ce qui est le cas s’il est de type *.home.arpa :

1
openssl x509 -in /etc/ssl/homearpa/homearpa.crt -noout -ext subjectAltName

Cherche DNS:*.home.arpa dans la sortie.

3. Bloc nginx

Dans un nouveau fichier de /etc/nginx/conf.d/, kuma.home.arpa.conf.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;
    server_name kuma.home.arpa;

    allow 192.168.0.0/24;
    allow 100.64.0.0/24;
    allow fd7a:115c:a1e0::/48;
    deny all;

    ssl_certificate     /etc/ssl/homearpa/homearpa.crt;
    ssl_certificate_key /etc/ssl/homearpa/homearpa.key;
    ssl_protocols       TLSv1.2 TLSv1.3;

    access_log /var/log/nginx/kuma-access.log;
    error_log  /var/log/nginx/kuma-error.log;

    location / {
        proxy_pass http://192.168.0.224:3001;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_read_timeout 3600s;
    }
}

Trois points importants :

  • Le filtre allow/deny au niveau server est indispensable : cette machine sert aussi des sites publics. Sans lui, n’importe qui peut demander kuma.home.arpa à ton IP publique et obtenir la page de connexion.
  • Les en-têtes Upgrade et Connection assurent le WebSocket, dont Kuma a besoin pour afficher l’état en direct. Sans eux, la page reste bloquée sur « Cannot connect to socket server ».
  • La directive map ne doit exister qu’une fois dans toute ta configuration nginx. Vérifie avec sudo nginx -T | grep connection_upgrade qu’aucun autre fichier ne la définit déjà. Si c’est le cas, retire la tienne et réutilise l’existante.

Puis : sudo nginx -t && sudo systemctl reload nginx.

4. Réglages dans Kuma

  • Paramètres → Proxy inverse : Faire confiance au proxy = Oui.
  • Paramètres → Général : URL de base principale = https://kuma.home.arpa. Les liens dans les notifications pointeront alors vers cette adresse.

Tests

1
2
3
4
5
# Depuis le LAN : doit répondre 200 ou 302
curl -sI https://kuma.home.arpa/ | head -1

# Depuis l'extérieur (VPS ou 4G) : doit répondre 403
curl -skI --resolve kuma.home.arpa:443:TON_IP_PUBLIQUE https://kuma.home.arpa/ | head -1

Ouvre ensuite https://kuma.home.arpa dans Brave, connecte-toi (avec la double authentification) et vérifie que les moniteurs se mettent à jour en direct.

Un point à garder en tête

Le nom kuma.home.arpa dépend de Technitium. Pendant une panne du DNS, c’est justement quand tu voudras ouvrir Kuma que le nom ne se résoudra pas. Garde donc l’accès direct http://IP_KUMA:3001 comme accès de secours sur ton réseau local, sans l’exposer à Internet. Le nginx qui porte le HTTPS est aussi sur la machine du DNS : si elle tombe, kuma.home.arpa tombe avec elle.

Dis-moi si la page s’affiche, ou le message que tu obtiens sinon.

Cet article est sous licence CC BY 4.0 par l'auteur.