CI / test (push) Successful in 2m26s
- service.v: --install-service / --uninstall-service / --service-status Windows (sc.exe SCM), Linux systemd, Linux openrc — auto-détection OS - main.v: nouveaux flags service, help mis à jour - Dockerfile: multi-stage (V from source → alpine:3.20 minimal) - docker-compose.yml: prêt à l'emploi avec healthcheck - scripts/install.sh: one-liner Linux (detect OS/arch, build, install) - scripts/install.ps1: one-liner Windows PowerShell Docs: ROADMAP Phase 4.5 marqué DONE, version 0.4.5
150 lines
8.0 KiB
Markdown
150 lines
8.0 KiB
Markdown
# ntfy-bridge — Roadmap
|
||
|
||
## Phase 1 : MVP (core engine) — v0.1.0 ✓ DONE
|
||
|
||
Objectif : daemon qui compile, lit une config, écoute des webhooks et envoie vers Ntfy.
|
||
|
||
- [x] `main.v` — CLI args (`--config`, `--version`, `--validate`, `--quiet`, `--help`)
|
||
- [x] `config.v` — Chargement + validation du YAML (env overrides `NTFY_TOKEN`, `NTFY_HMAC_SECRET`, détection de chemins dupliqués)
|
||
- [x] `server.v` — HTTP server sur `:9090` avec routing O(1), dashboard, health/stats endpoints
|
||
- [x] `event.v` — Types de données : `Event`, `Config`, `Source` + template engine `render_source_template`
|
||
- [x] `ntfy.v` — Client HTTP POST vers Ntfy (topic, message, priority, tags) + retry avec backoff exponentiel (3 tentatives)
|
||
- [x] `sources/generic.v` — Webhook passe-partout (POST raw → Ntfy)
|
||
- [x] `log.v` — Logging structuré (timestamp, level, message) — dual mode: human-readable + JSON
|
||
- [x] `ntfy-bridge.example.yaml` — Config d'exemple complète et commentée
|
||
|
||
**Sortie** : `ntfy-bridge` compile, accepte un webhook générique et l'envoie vers Ntfy. ✅
|
||
|
||
## Phase 2 : Sources spécialisées — v0.2.0 ✓ DONE
|
||
|
||
- [x] `sources/gitea.v` — Transformer Gitea (push, PR, issues, releases)
|
||
- Parse le JSON webhook Gitea
|
||
- Template configurable avec variables `{repo}`, `{user}`, `{action}`, `{title}`, `{sha}`
|
||
- Priority map par type d'événement
|
||
- [x] `sources/uptime_kuma.v` — Transformer Uptime Kuma
|
||
- Parse le JSON webhook Kuma (heartbeat)
|
||
- `state_map` pour configurer priority/tags par état (up/down)
|
||
- Template configurable avec variables `{monitor}`, `{status}`, `{msg}`, `{ping}`, `{time}`
|
||
- [x] `sources/docker.v` — Watcher socket Docker
|
||
- Connexion au socket Docker Unix (`docker_watcher.v`)
|
||
- Filtrage par événements (die, health_status, oom)
|
||
- Template de message configurable
|
||
- Multi-hôtes (plusieurs sockets dans la config)
|
||
- [x] `sources/http_poll.v` — Poller HTTP
|
||
- Goroutine de polling périodique (intervalle configurable)
|
||
- Vérification status code + timeout
|
||
- State machine up/down avec notification uniquement au changement
|
||
- Template configurable avec variables `{url}`, `{error}`, `{status}`
|
||
- [x] `dedup.v` — Déduplication + rate limiting
|
||
- Cache avec TTL (5 min par défaut) basé sur hash du message
|
||
- Clé de déduplication : source + type + topic + hash(message)
|
||
- Rate limiting par topic et par source
|
||
|
||
**Bonus (non planifié) :**
|
||
- [x] `sources/cron.v` — Webhook pour scripts cron (pass-through)
|
||
- [x] `webhook.v` — Route dispatch O(1) via `map[string]WebhookRoute`
|
||
|
||
**Sortie** : Toutes les sources majeures sont intégrées et fonctionnelles. ✅
|
||
|
||
## Phase 3 : Robustesse — v0.3.0 ✅ DONE
|
||
|
||
- [x] ~~`dedup.v` amélioré~~ — Rate limiting déjà intégré dans la phase 2
|
||
- [x] Signature webhooks — Vérification HMAC-SHA256 (appliquée à **tous** les webhooks, pas seulement Gitea)
|
||
- [x] Retry logic — Retry avec backoff exponentiel vers Ntfy (3 tentatives, 1s/2s/4s)
|
||
- [x] Graceful shutdown — SIGTERM/SIGINT → drain des événements en cours (Linux/macOS)
|
||
- [x] Health endpoint — `GET /health` → 200 + uptime + stats basiques
|
||
- [x] Stats endpoint — `GET /stats` → compteurs par source
|
||
- [x] Config reload — `SIGHUP` → reload config sans redémarrage
|
||
- [x] Tests unitaires — `config_test.v`, `gitea_test.v`, `uptime_kuma_test.v`, `dedup_test.v`
|
||
|
||
**Sortie** : Le daemon est prêt pour la production homelab. ✅
|
||
|
||
## Phase 4 : Qualité de vie — v0.4.0 ✅ DONE
|
||
|
||
- [x] Template engine — Support des variables `{key}` dans les messages (toutes les sources)
|
||
```
|
||
"🐳 {container_name} → {status} (exit: {exit_code}) on {host}"
|
||
```
|
||
- [x] Silence rules — `POST /api/silence?duration=30m` + `GET /api/silence` + `DELETE /api/silence`
|
||
- [x] Grouping — Regrouper N notifications similaires (buffer 10s, flush avec ×N)
|
||
- [x] Webhook secret validation — HMAC global (tous les webhooks, pas seulement Gitea)
|
||
- [x] CI/CD via Gitea Actions — `.gitea/workflows/ci.yml`
|
||
|
||
**Sortie** : Expérience utilisateur complète. ✅
|
||
|
||
## Phase 4.5 : Déploiement multi-plateforme — v0.4.5 ✅ DONE
|
||
|
||
Objectif : un seul binaire, une seule commande pour installer/désinstaller le service sur tous les OS supportés.
|
||
|
||
- [x] `service.v` — Module d'installation de service unifié
|
||
- Commande `--install-service` : détecte l'OS et installe le service
|
||
- Commande `--uninstall-service` : désinstalle le service
|
||
- Commande `--service-status` : vérifie si le service est installé + running
|
||
- [x] Windows Service — Intégration native Windows
|
||
- Installation via `sc.exe` (Service Control Manager)
|
||
- Support des événements start/stop/query
|
||
- Options de recovery configurées (restart auto)
|
||
- [x] Linux Debian/Ubuntu (systemd) — `ntfy-bridge.service`
|
||
- Création + activation automatique du unit file
|
||
- `--quiet` par défaut (logging JSON → journald)
|
||
- Restart=always, démarrage après network.target
|
||
- [x] Linux Alpine (openrc) — Script init.d
|
||
- `/etc/init.d/ntfy-bridge` généré automatiquement
|
||
- Commandes start/stop/restart/status
|
||
- Ajout au runlevel default
|
||
- [x] Raspberry Pi (Debian aarch64) — Support confirmé
|
||
- Cross-compilation `v -os linux -arch arm64`
|
||
- Même unit systemd que Debian x86_64
|
||
- Testé sur Raspberry Pi OS (arm64)
|
||
- [x] Docker image multi-arch — `Dockerfile` + `docker-compose.yml`
|
||
- Build multi-stage (V from source → minimal Alpine runtime)
|
||
- docker-compose.yml prêt à l'emploi avec healthcheck
|
||
- [x] Scripts d'installation one-liner
|
||
- `scripts/install.sh` : détecte l'OS/arch, build V, installe le service
|
||
- `scripts/install.ps1` : équivalent Windows PowerShell
|
||
- `curl -fsSL https://.../install.sh | bash`
|
||
|
||
**Sortie** : `ntfy-bridge --install-service` fonctionne sur Windows 10+, Debian 11+, Alpine 3.18+, Raspberry Pi OS (arm64). ✅
|
||
|
||
## Phase 5 : Futures idées — v0.5.0+
|
||
|
||
- [x] Web UI minimale — Dashboard HTML avec stats, status, historique (+ API `/api/config`, `/api/status`, `/api/history`)
|
||
- [ ] Filtres avancés — Expressions conditionnelles par source
|
||
```yaml
|
||
filters:
|
||
- match: { container_name: "test-*" }
|
||
action: drop
|
||
```
|
||
- [ ] Notifications structurées — Support des actions Ntfy (boutons click)
|
||
- [ ] Intégration Prometheus — Métriques exposées au format OpenMetrics
|
||
- [ ] Webhook sortant — Forwarder les événements vers un autre webhook (Slack, Discord)
|
||
- [ ] Support multi-utilisateurs — ACLs par webhook_path
|
||
- [ ] Fichier d'état — Persistance de l'état up/down des health checks
|
||
- [ ] Plugin system — Sources customisables via dll/.so (futur lointain)
|
||
|
||
## Fonctionnalités non planifiées mais implémentées
|
||
|
||
Ces features ont été ajoutées en cours de route :
|
||
|
||
| Feature | Fichier | Description |
|
||
|---------|---------|-------------|
|
||
| Source Cron | `sources/cron.v` | Webhook pass-through pour scripts cron (curl → Ntfy) |
|
||
| Dashboard web | `dashboard.html` | Interface avec stats, statut des health checks, historique récent |
|
||
| Logging JSON | `log.v` | Mode JSON structuré activé avec `--quiet` (pour systemd) |
|
||
| Env overrides | `config.v` | `NTFY_TOKEN` et `NTFY_HMAC_SECRET` depuis l'environnement |
|
||
| Validation dupplicates | `config.v` | Détection de chemins webhook dupliqués dans la config |
|
||
| Flag `--quiet` | `main.v` | Supprime la bannière ASCII au démarrage |
|
||
| Flag `-V` (version) | `main.v` | Version courte en plus de `--version` |
|
||
| API endpoints | `server.v` | `/api/config`, `/api/status`, `/api/history` pour le dashboard |
|
||
|
||
## Suivi des versions
|
||
|
||
| Version | Statut | Contenu |
|
||
|---------|--------|---------|
|
||
| v0.1.0 | ✅ Terminé | Moteur core + webhook générique + logging |
|
||
| v0.2.0 | ✅ Terminé | Sources Gitea, Uptime Kuma, Docker, HTTP poll, Cron, déduplication |
|
||
| v0.3.0 | ✅ Terminé | Robustesse, HMAC, retry, graceful shutdown, SIGHUP reload, tests |
|
||
| v0.4.0 | ✅ Terminé | Templates, silence, grouping, HMAC global, CI/CD |
|
||
| v0.4.5 | ✅ Terminé | Déploiement multi-plateforme : --install-service, Windows, systemd, openrc, Docker, install scripts |
|
||
| v0.5.0+ | 🔮 1/8 | Dashboard web — reste filtres, actions Ntfy, Prometheus, etc. |
|