153 lines
5.6 KiB
Markdown
153 lines
5.6 KiB
Markdown
# 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
|