Aller au contenu

Notify Stack : DIUN + ntfy

La Notify Stack centralise deux briques de notification de l’infrastructure :

ComposantRôleImage
DIUNDétecteur de mises à jour d’images Dockercrazymax/diun
ntfyServeur de notifications push self-hostedbinwiederhier/ntfy

Canaux de notification

N8N · workflow Docker DIUN

notify-stack

webhook Bearer

webhook

/var/run/docker.sock

base-images.yml · file provider

DIUN · scan toutes les 6 h

ntfy · auth deny-all

/webhook/notify/image-update

Router · critical / base / applicatif

DIUN Update Executor

Telegram

Discord

Mobile · ntfy app


Pourquoi DIUN plutôt que Watchtower ou Docker Hub UI ?

Section intitulée « Pourquoi DIUN plutôt que Watchtower ou Docker Hub UI ? »
CritèreDIUNWatchtowerDocker Hub UI
Détection sans pullOui (compare digests)Non (pull pour vérifier)Manuel
Auto-updateNon (notification only)Oui (mais aveugle)Non
File providerOui (images de base custom)NonNon
Webhook personnalisableOui (Bearer auth)NonNon
Exclusion par labelOuiOuiN/A

Critères de décision :

  1. Découpler détection et mise à jour — Watchtower applique aveuglément, DIUN notifie et délègue la décision à un workflow N8N qui peut classifier (critical / base / applicatif) et demander une approbation Telegram.
  2. Surveiller les images de base des Dockerfiles custom — Le file provider permet de détecter qu’une nouvelle version de caddy:builder est sortie alors qu’aucun container ne tourne directement avec cette image.
  3. Pas de pull inutile — DIUN compare les digests via l’API du registre, sans télécharger l’image entière.
Critèrentfy self-hostedPushoverSlack
CoûtGratuit (VPS)Payant à l’appGratuit / payant
SouverainetéDonnées chez moiSaaSSaaS
API simplecurl HTTPAPI propriétaireAPI propriétaire
AuthToken + user/passTokenOAuth + tokens
Multi-canauxTopicsDevicesChannels

L’objectif est d’avoir un canal de notification séparé de Telegram pour les alertes monitoring (Alertmanager, Grafana). Telegram est utilisé pour l’interactif (workflows N8N, approbations) ; ntfy pour les push silencieux côté mobile.


Le service tourne sans interface, configuré entièrement par variables d’environnement.

# notify-stack/docker-compose.yaml (extrait DIUN)
diun:
image: crazymax/diun:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- notify-diun-data:/data
- ./diun/base-images.yml:/config/base-images.yml:ro
environment:
- DIUN_WATCH_WORKERS=10
- DIUN_WATCH_SCHEDULE=0 */6 * * *
- DIUN_WATCH_FIRSTCHECKNOTIF=false
- DIUN_PROVIDERS_DOCKER=true
- DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=true
- DIUN_PROVIDERS_DOCKER_WATCHSTOPPED=false
- DIUN_PROVIDERS_FILE_FILENAME=/config/base-images.yml
- DIUN_NOTIF_DISCORD_WEBHOOKURL=${DISCORD_WEBHOOK_URL}
- DIUN_NOTIF_WEBHOOK_ENDPOINT=${N8N_WEBHOOK_URL}
- DIUN_NOTIF_WEBHOOK_HEADERS_AUTHORIZATION=Bearer ${DIUN_WEBHOOK_TOKEN}
ProviderSourceComportement post-détection
dockerContainers en cours d’exécutionAuto-update si catégorie critical / base / approbation Telegram si applicatif
filebase-images.yml (images FROM des Dockerfiles custom)Notification + rebuild manuel ou approbation

Le fichier base-images.yml liste les images surveillées qui ne sont pas directement utilisées par un container :

- name: docker.n8n.io/n8nio/n8n:latest # base de n8n-custom
- name: caddy:builder # base de caddy-crowdsec
- name: caddy:latest
- name: node:20-slim # base de cli-ollama
- name: ghcr.io/astral-sh/uv:latest
ntfy:
image: binwiederhier/ntfy:latest
command: serve
volumes:
- ntfy-cache:/var/cache/ntfy
- ntfy-data:/var/lib/ntfy
- ./ntfy/server.yml:/etc/ntfy/server.yml:ro

Le fichier server.yml impose auth-default-access: deny-all : chaque topic doit être publié par un utilisateur authentifié. Deux modes coexistent :

ModeCas d’usage
Token BearerAppels API depuis Alertmanager, N8N, scripts
User / passwordAuthentification dans l’app mobile
Fenêtre de terminal
# Gestion utilisateurs (depuis le VPS)
docker exec ntfy ntfy user list
docker exec -e NTFY_PASSWORD="..." ntfy ntfy user add --role=admin guillaume
# Tokens d'API
docker exec ntfy ntfy token add --label="alertmanager" alertmanager-bot
docker exec ntfy ntfy token list
TopicProducteursConsommateurs
alertsAlertmanager, Notification Hub (fallback)Mobile, Telegram
updatesWorkflow Docker DIUNMobile
monitoringGrafanaMobile

Publier un message :

Fenêtre de terminal
# Depuis l'extérieur (HTTPS via Caddy)
curl -H "Authorization: Bearer tk_xxx" \
-H "Title: Disk Alert" \
-H "Priority: high" \
-H "Tags: warning" \
-d "Disk usage above 80%" \
https://ntfy.guigpap.com/alerts
# Depuis l'intérieur (réseau Docker, depuis N8N)
curl -H "Authorization: Bearer tk_xxx" \
-d "Message" \
http://ntfy:80/alerts

DIUN n’applique aucune mise à jour : il poste un webhook authentifié vers N8N, qui prend toutes les décisions.

docker

file

critical

base

applicatif

DIUN scan · 0 */6 * * *

/webhook/notify/image-update · Bearer auth

Switch Provider · docker / file

Docker Inspect

Lookup Policy · Data Table image_policies

Catégorie ?

Critical · update immédiat

Base · queue 03h-05h

Applicatif · approbation Telegram

DIUN Update Executor · SW-1

Notification Hub

La table image_policies (gérée dans N8N Data Tables) définit le comportement par image. Voir l’article workflow Docker Updates pour le détail des sous-workflows et de la logique d’auto-rebuild.

Fenêtre de terminal
# Stack management
docker compose -f notify-stack/docker-compose.yaml up -d
docker compose -f notify-stack/docker-compose.yaml logs -f
# DIUN — forcer un scan immédiat
docker exec diun diun --run
# DIUN — lister les images surveillées
docker exec diun diun image list
# ntfy — publier depuis le container (pour test)
docker exec ntfy ntfy publish mytopic "Test message"

LimiteImpactMitigation
DIUN ne pousse pas directement sur ntfyToute notification mobile transite par N8NAjouter le notifier ntfy natif de DIUN à terme
Pas d’UI DIUNVisibilité uniquement via logsLe workflow Docker DIUN sert de tableau de bord côté Telegram
ntfy single-nodePas de HARestart auto + monitoring du container
Quota Discord webhookSpam possible si beaucoup d’images bougentDIUN groupe les notifs par scan

Si le volume de notifications augmente :

  • Configurer le notifier ntfy natif de DIUN (sortie directe, sans passer par N8N pour les notifs informatives).
  • Activer le bundling DIUN (regrouper plusieurs détections en une seule notification par scan).

Si je veux un fallback en cas de N8N indisponible :

  • DIUN peut écrire en parallèle sur Discord (déjà fait) et ntfy (à ajouter), garantissant la trace même si le workflow N8N plante.

Si j’expose ntfy à d’autres utilisateurs :

  • Créer des ACL par topic (lecture/écriture séparées).
  • Activer le rate limiting global dans server.yml.
MétriqueSourceSeuil d’attention
Détections DIUN par scandocker logs diunSpike inhabituel = changement de tag massif chez un éditeur
Échecs webhook DIUN → N8Nlogs DIUN + DLQ N8N> 1 par scan = vérifier l’auth ou la disponibilité N8N
Containers exclusdocker exec diun diun image listVérifier régulièrement que rien d’important n’est diun.enable=false par erreur