# ntfy-bridge Hub central de notifications pour homelab — agrège des sources multiples (Gitea, Docker, Uptime Kuma, health checks HTTP, scripts cron) et les transforme en notifications [Ntfy](https://ntfy.sh/) intelligentes, formatées, avec priorités et contexte. ``` ┌─────────────────┐ │ Gitea webhook │──┐ ├─────────────────┤ │ │ Uptime Kuma │──┤ ├─────────────────┤ │ ┌──────────────┐ ┌───────────┐ ┌──────────────┐ │ Docker events │──┤────→│ ntfy-bridge │─────→│ Ntfy Srv │─────→│ Ton phone │ ├─────────────────┤ │ └──────────────┘ └───────────┘ └──────────────┘ │ HTTP health │──┤ ├─────────────────┤ │ │ Scripts cron │──┘ └─────────────────┘ ``` ## Pourquoi ntfy-bridge ? Dans un homelab avec 8+ hôtes Docker, Gitea, Uptime Kuma et des dizaines de services, les alertes arrivent de partout. `ntfy-bridge` centralise tout dans une seule file de notifications intelligentes — avec le bon niveau de priorité, le bon format, et le bon topic Ntfy. | Sans ntfy-bridge | Avec ntfy-bridge | |---|---| | Webhook Gitea → email (noyé) | Push = notif Ntfy formatée avec auteur, commit, message | | Uptime Kuma → alerte brute | "🚨 Gitea DOWN — 503 — since 14:32" avec priority=5 | | Container qui crashe → logs Docker | "🐳 flowdeck exited OOMKilled on docker-prod-1" | | Script cron → email perdu | Résumé quotidien disque à 9h dans ta poche | ## Installation ### Docker (recommandé) ```bash # 1. Cloner le repo git clone https://git.dracodev.net/bruno/ntfy-bridge.git cd ntfy-bridge # 2. Compiler le binaire Linux (cross-compilation depuis Windows/Mac) v -os linux -prod -o ntfy-bridge . # Ou compiler directement sur Linux : # v -prod -o ntfy-bridge . # 3. Configurer cp ntfy-bridge.example.yaml ntfy-bridge.yaml vim ntfy-bridge.yaml # 4. Lancer avec docker compose docker compose up -d # 5. Vérifier curl http://localhost:9090/health ``` Le `docker-compose.yml` inclus monte : - `ntfy-bridge.yaml` → `/etc/ntfy-bridge/ntfy-bridge.yaml` (read-only) - `dashboard.html` → `/etc/ntfy-bridge/dashboard.html` (read-only) - Port `9090` exposé sur localhost - Variables d'environnement `NTFY_TOKEN` et `NTFY_HMAC_SECRET` - Healthcheck intégré (`/health`) ### Raspberry Pi / ARM64 ```bash # Option A : Binaire pré-compilé (CI) — pas besoin de V # Télécharge l'artifact "ntfy-bridge-linux-arm64" depuis Gitea Actions : # https://git.dracodev.net/bruno/ntfy-bridge/actions # ou via API : curl -s -o ntfy-bridge "https://git.dracodev.net/api/v1/repos/bruno/ntfy-bridge/actions/artifacts/latest/zip?name=binaires" unzip binaires.zip ntfy-bridge-linux-arm64 mv ntfy-bridge-linux-arm64 ntfy-bridge chmod +x ntfy-bridge # Option B : Compiler soi-même (nécessite V) # Installer V sur Debian 12 / Raspberry Pi OS (aarch64) : git clone --depth 1 https://github.com/vlang/v ~/v cd ~/v && make sudo ln -sf ~/v/v /usr/local/bin/v # Compiler ntfy-bridge git clone https://git.dracodev.net/bruno/ntfy-bridge.git cd ntfy-bridge v -prod -o ntfy-bridge . # Lancer cp ntfy-bridge.example.yaml ntfy-bridge.yaml vim ntfy-bridge.yaml ./ntfy-bridge --config ntfy-bridge.yaml ``` ### Compilation manuelle ```bash # Installer V sur Linux x86_64 (Debian/Ubuntu) curl -s https://github.com/vlang/v/releases/latest/download/v_linux.zip -o /tmp/v.zip unzip /tmp/v.zip -d /tmp && sudo /tmp/v/v symlink # Compiler git clone https://git.dracodev.net/bruno/ntfy-bridge.git cd ntfy-bridge v -prod . # Configurer cp ntfy-bridge.example.yaml ntfy-bridge.yaml vim ntfy-bridge.yaml # Lancer ./ntfy-bridge --config ntfy-bridge.yaml ``` ## Sources supportées | Source | Type | Description | |--------|------|-------------| | **Gitea** | Webhook | Push, PR, issues, releases → notifs formatées | | **Uptime Kuma** | Webhook | Statut up/down avec priorité critique | | **Docker** | Socket | Container start/die/oom/health_status | | **HTTP Poll** | Polling | Health checks périodiques | | **Cron** | Webhook | Reçoit des notifs depuis des scripts shell | | **Generic** | Webhook | Endpoint passe-partout pour tout script custom | | **Plugin** | Exec | Exécutable externe appelé périodiquement (bash, python, …) | ## Features - **ACLs** — Restriction par IP (CIDR) ou Bearer token sur chaque webhook - **Plugins** — Scripts externes exécutés toutes les 60s, contrat JSON stdout - **Dashboard** — Interface web avec stats, statuts, historique temps réel - **Filtres** — Règles conditionnelles drop/set_priority/add_tag par source - **Actions Ntfy** — Boutons click, vues, broadcast intégrés - **Prometheus** — Endpoint `/metrics` pour Grafana - **Outgoing webhooks** — Forward vers Slack, Discord, JSON - **Silence rules** — Mute temporaire des notifs via API - **Grouping** — Regroupement intelligent des notifs identiques - **State persistence** — Sauvegarde de l'état up/down et silence sur disque ## Exemple de config minimale ```yaml server: url: https://ntfy.dracodev.net listen: ":9090" sources: gitea: - webhook_path: /webhooks/gitea topic: dev-notifs ``` ## Licence MIT