⚙️🌐 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.arpacopié 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/24convient), sinon les moniteurs DNS recevrontREFUSED. - 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 utiliserlatest.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 atteintdns.home.arpasans 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 :
3001ne 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

- Créer le compte administrateur ,mot de passe fort
- Double authentification recommandée dans Paramètres → Sécurité
4. Notification ntfy
Paramètres → Notifications → Créer une notification :
- Type : Apprise.
- Nom d’affichage: Uptime Kuma
- URL apprise : ` ntfys://tk_xxxxxxxxxxxxxx@ntfy.rnmkcy.eu/yan_infos `.
- Titer :
Notifications Kuma - Cocher « Activé par défaut » pour que les nouveaux moniteurs l’utilisent.
- 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
- Dans Kuma, clique sur Ajouter une nouvelle sonde.
- Type : DNS.
- Nom :
DNS : résolution externe - Nom d’hôte :
example.com - Serveur de résolution :
192.168.0.205, port53. - Type d’enregistrement :
A. - Intervalle :
60secondes, tentatives :2. - Sauvegarder.
Le moniteur doit passer au vert.
5.2 zone locale
- Dans Kuma, clique sur Ajouter une nouvelle sonde.
- Type : DNS.
- Nom :
DNS : zone locale - Nom d’hôte :
dns.home.arpa - Serveur de résolution :
192.168.0.205, port53. - Type d’enregistrement :
A. - Intervalle :
60secondes, tentatives :2. - Sauvegarder.
5.3 zone locale
- Dans Kuma, clique sur Ajouter une nouvelle sonde.
- Type : TCP.
- Nom :
DNS : zone locale - Nom d’hôte :
dns.home.arpa - Serveur de résolution :
192.168.0.205, port53. - Type d’enregistrement :
A. - Intervalle :
60secondes, tentatives :2. - 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/denyau niveauserverest indispensable : cette machine sert aussi des sites publics. Sans lui, n’importe qui peut demanderkuma.home.arpaà ton IP publique et obtenir la page de connexion. - Les en-têtes
UpgradeetConnectionassurent 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
mapne doit exister qu’une fois dans toute ta configuration nginx. Vérifie avecsudo nginx -T | grep connection_upgradequ’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.

