Commit Graph
38 Commits
Author SHA1 Message Date
hermes-claw 4050872698 feat(ci): ajoute l'upload Nexus des binaires
CI / build (push) Successful in 4m32s
2026-08-06 23:38:20 -04:00
bruno 46bbf743ca docs: ajout section Raspberry Pi / ARM64 + install V sur Debian aarch64
CI / build (push) Successful in 4m45s
2026-08-06 17:30:21 -04:00
bruno ee4a19cc8a fix: CI — downgrade upload-artifact@v4 vers @v3 (compat Gitea Actions)
CI / build (push) Successful in 5m5s
2026-08-06 17:10:04 -04:00
bruno 32bae70004 fix: CI — installer cross-compilers MinGW (Windows) + ARM64 avant les builds
CI / build (push) Failing after 4m55s
2026-08-06 17:03:13 -04:00
bruno 38ccde3f0b fix: CI — remplacer env:PATH par export inline (evite ecrasement PATH du runner)
CI / build (push) Failing after 1m49s
2026-08-06 16:56:49 -04:00
bruno 84c90e89ee fix: CI — V binary symlink + PATH for Gitea Actions runner permissions
CI / build (push) Failing after 10s
2026-08-06 16:53:38 -04:00
bruno c74ab7429a chore: bump v0.6.0, update docs + add Docker install to README
CI / build (push) Failing after 12s
2026-08-06 16:50:06 -04:00
bruno 4964362ff4 ci: fallback install V — curl puis git sans submodules si GH offline
CI / build (push) Failing after 10s
2026-08-05 21:31:13 -04:00
bruno b683aca227 ci: utiliser le binaire V pre-compile (evite le submodule tcc)
CI / build (push) Failing after 10s
2026-08-05 21:29:39 -04:00
bruno b049b9ce2a ci: job unique — artifacts sur chaque push, release via API sur tag
CI / build (push) Failing after 36s
Un seul job build qui:
1. Build 3 archs (linux amd64, linux arm64, windows amd64)
2. Lance les tests
3. Upload les binaires comme artifacts (dispo dans Actions > Summary)
4. Si tag v*: crée une release Gitea + attache les binaires (curl API)

Plus besoin de job release séparé — tout est dans build.
v0.6.0
2026-08-05 21:26:21 -04:00
bruno 3aec26b09d ci: workflow unique — artifacts sur chaque push, release sur tag
Un seul workflow avec 2 jobs:
- build: compile 3 archs + test + upload artifacts (tous les push/PR)
  → binaires téléchargeables dans l'onglet Actions > Summary > Artifacts
- release: seulement sur tag v*, download les artifacts, crée une
  release Gitea avec les 3 binaires attachés (curl API, idempotent)
2026-08-05 21:25:57 -04:00
bruno e1b68a71f1 ci: split en deux workflows — CI (push main) + Release (tags v*)
CI / test (push) Successful in 2m50s
- ci.yml: build + test sur chaque push/PR (lightweight)
- release.yml: cross-compile linux/x86_64, linux/arm64, windows/x86_64
  puis crée une release Gitea avec curl + API (idempotent, re-run safe)
2026-08-04 23:11:52 -04:00
bruno e99591c201 ci: ajout job release — build multi-arch + release auto sur tag
CI / test (push) Successful in 3m10s
CI / release (push) Has been skipped
Build sur tags v*: linux x86_64, linux arm64, windows x86_64.
Release Gitea créée automatiquement avec les 3 binaires attachés.
2026-08-04 22:58:33 -04:00
bruno 85f139cd1b ci: trigger rebuild
CI / test (push) Successful in 3m35s
2026-08-04 22:44:42 -04:00
bruno 1a4808f5f7 feat: v0.6.0 — ACLs multi-utilisateurs + Plugin system
CI / test (push) Has been cancelled
**ACLs (Access Control Lists):**
- Ajout du type AclConfig dans sources/event.v (allowed_ips CIDR + allowed_tokens)
- Chaque source webhook (Gitea, Uptime Kuma, Cron, Generic) supporte les ACLs
- Validation IP via X-Forwarded-For / X-Real-IP avant HMAC
- Validation Bearer token via Authorization header
- Tests: 7 tests ACL (IP exact, CIDR, parse IPv4, ACL vide, IP+token combiné)

**Plugin system:**
- sources/plugin.v: runner exécutable externe, stdout JSON → Event
- Exit 0 = publish, exit ≠ 0 = skip. Timeout configurable
- Plugin loop dans server.v (goroutine, toutes les 60s)
- Example: scripts/example-plugin-disk.sh (vérifie espace disque)

**Docs:**
- README.md: ajout source Plugin + section Features complète
- ARCHITECTURE.md: flux Plugin, flux ACL, endpoints /metrics /api/silence
- ROADMAP.md: Phase 5 → 8/8 complet, ajout v0.6.0
- ntfy-bridge.example.yaml: sections ACLs et Plugins commentées
- Version bump: 0.5.0 → 0.6.0
2026-08-04 22:25:48 -04:00
bruno 151dd4a1a8 fix: Docker requires pre-built Linux binary (cannot cross-compile on Windows)
CI / test (push) Failing after 16s
2026-08-03 20:51:53 -04:00
bruno 1c847a824d fix: Dockerfile → COPY pre-built binary (no network needed)
CI / test (push) Successful in 2m45s
Docker Desktop Windows blocks build network access. Instead of
building V from source inside Docker, cross-compile Linux binary
on host and COPY into minimal alpine image.
2026-08-03 20:26:02 -04:00
bruno 35a79f1d5b fix: clone yaml module directly (v install fails in Docker)
CI / test (push) Successful in 2m43s
v install yaml échoue dans le conteneur thevlang/vlang:alpine
car le metadata fetch ne fonctionne pas. Clone direct du repo git.
2026-08-03 20:18:08 -04:00
bruno 5b0b580792 fix: add yaml dependency to v.mod + Dockerfile v install yaml
CI / test (push) Successful in 2m31s
The thevlang/vlang:alpine container doesn't include the yaml
module. Added it as a declared dependency and install step.
2026-08-03 20:13:26 -04:00
bruno 50a77c96c0 fix: Dockerfile uses thevlang/vlang:alpine container (pre-built V)
CI / test (push) Successful in 2m35s
Building V from source on Alpine fails due to C function
redefinition (musl libc). Use the official V Alpine container
which has a pre-built, compatible V compiler.
2026-08-03 20:08:09 -04:00
bruno e5eb4125af fix: Dockerfile pin V to 0.5.2 commit (not latest)
CI / test (push) Successful in 3m50s
V latest (git clone --depth 1) has incompatible APIs with
the source code written for V 0.5.2. Pin to exact commit
45ae01d to match local dev environment.
2026-08-03 20:03:56 -04:00
bruno 4fbac2121a fix: docker install copies Dockerfile + sources for build
CI / test (push) Successful in 3m11s
2026-08-03 19:54:41 -04:00
bruno 5191e88b73 fix: docker-compose uses build from git repo instead of non-existent ghcr image
CI / test (push) Successful in 2m28s
2026-08-03 18:28:14 -04:00
bruno e2a6d8d00c feat: --install-docker + --install-docker-prometheus
CI / test (push) Successful in 2m29s
- docker_install.v: génère docker-compose.yml, ntfy-bridge.yaml,
  dashboard.html, et prometheus.yml si --install-docker-prometheus
- main.v: nouveaux flags --install-docker <dir> et
  --install-docker-prometheus <dir>
- Stack Prometheus scrape /metrics sur ntfy-bridge:9090
2026-08-03 18:13:09 -04:00
bruno 83778cfb0d feat: Prometheus /metrics endpoint — Phase 5 -> 6/8
CI / test (push) Successful in 2m30s
- metrics.v: GET /metrics au format OpenMetrics (gauges + counters)
- server.v: route /metrics, Stats.http_polls counter, increment in poll loop
- metrics_test.v: test du endpoint metrics
- ROADMAP: Phase 5 6/8 (Prometheus done)
2026-08-03 18:03:26 -04:00
bruno 4150c56054 feat: Phase 5 — filtres, actions Ntfy, outgoing webhooks, state file
CI / test (push) Successful in 2m34s
- Filtres avancés: drop, set_priority, add_tag avec wildcard * (filter_outgoing.v)
- Notifications structurées: click_url + actions (ntfy.v + sources/event.v)
- Webhook sortant: Slack, Discord, JSON (filter_outgoing.v)
- Fichier d'état: persistance poll_state + silence_until (filter_outgoing.v)
- Config: sections filters, outgoing, state (config.v)
- Tests: 9 nouveaux tests unitaires (filter_outgoing_test.v)
- Docs: ROADMAP Phase 5 4/8, version 0.5.0
2026-08-03 17:41:53 -04:00
bruno 5d0db9478c fix: dashboard affiche la version dynamique ({{VERSION}})
CI / test (push) Successful in 2m33s
dashboard.html utilise {{VERSION}}, remplacé par server.v au chargement
via const version de main.v. Plus besoin de maj manuelle du HTML.
2026-08-03 17:24:14 -04:00
bruno adcb1945b8 fix: ne plus utiliser sc delete (cause marked for deletion)
CI / test (push) Successful in 2m14s
sc.exe delete met le service en état 'marked for deletion'
que nssm ne peut pas résoudre. Nettoyage uniquement via nssm.
2026-08-03 17:18:18 -04:00
bruno 51dcefc98d fix: retry logic for 'marked for deletion' Windows SCM race
CI / test (push) Successful in 2m15s
- Clean up both sc.exe and nssm services before install
- Wait 1s after remove for SCM to release
- Retry up to 3x with 3s delay if 'marked for deletion'
- Added import time for sleep calls
2026-08-03 17:08:54 -04:00
bruno 4129379ca5 fix: Windows service via NSSM (sc.exe incompatible)
CI / test (push) Successful in 2m22s
Error 1053 — sc.exe alone cannot run non-service-aware .exe.
ntfy-bridge needs NSSM (Non-Sucking Service Manager) wrapper.

- service.v: --install-service uses nssm.exe (auto-detect PATH or dir)
- scripts/install.ps1: auto-downloads NSSM 2.24 before installing
- Falls back to sc.exe for uninstall/status if nssm not found
2026-08-03 17:04:12 -04:00
bruno 45e349e79d feat: Phase 4.5 — Déploiement multi-plateforme v0.4.5
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
2026-08-03 16:51:24 -04:00
bruno 26341578fa fix: os.signal_opt API callback-based (V latest)
CI / test (push) Successful in 2m46s
La nouvelle API est fn(os.Signal, fn(os.Signal)) au lieu de
chan+variadic. Enregistrement séparé pour .hup, .int, .term.
2026-08-03 15:00:39 -04:00
bruno 75e438f7d3 fix: _.DockerSource → sources.DockerSource dans docker_watcher.v
CI / test (push) Failing after 11s
2026-08-03 14:57:20 -04:00
bruno fa4fbc23a5 fix: compatibilité V latest — import sources et signal_opt
CI / test (push) Failing after 9s
- docker_watcher.v: 'import sources as _' → 'import sources'
  (le _ supprimait les symboles dans V récent)
- server.v: os.new_signal_channel → os.signal_opt
  (API retirée dans V latest)
- server.v: 'import json' déprécié → 'import x.json2 as json'
2026-08-03 14:55:27 -04:00
bruno 65e2a0d487 fix: CI workflow — remove container, install V on runner
CI / test (push) Failing after 1m29s
The vlang:alpine container lacks Node.js which Gitea Actions needs
for action steps (checkout@v4). Now installs V from source on the
default ubuntu-latest runner image instead.
2026-08-03 14:49:45 -04:00
bruno 72b797704f feat: phase 3 + phase 4 complete — v0.4.0
CI / test (push) Failing after 24s
Phase 3:
- Config reload via SIGHUP (handle_signals loop: .hup reloads config, .int/.term shutdown)
- Hot reload: cfg, webhook_routes, ntfy client, dedup updated without restart

Phase 4:
- Silence rules: POST /api/silence?duration=30m, GET /api/silence, DELETE /api/silence
- Grouping: buffer 10s, events grouped with (×N in 10s) suffix
- CI/CD: .gitea/workflows/ci.yml (build + test on push/PR)

Docs:
- ROADMAP.md: phases 3 & 4 marked DONE, version table updated
- ARCHITECTURE.md: synced with actual code

Version: 0.1.0 → 0.4.0 (main.v, v.mod)
2026-08-03 14:35:59 -04:00
bruno 4e1d7cd94a Add config validation and dashboard
Add YAML config loading with validation, env overrides for secrets, and
a web dashboard exposing health, stats, and recent events.
2026-08-03 12:12:12 -04:00
bruno 3f48912ad7 docs: initial architecture, roadmap, readme for ntfy-bridge
- README.md: project overview, quickstart, sources summary
- ARCHITECTURE.md: complete architecture, data flow, project structure
- ROADMAP.md: 5-phase development plan (v0.1.0 → v0.5.0+)
- CONTRIBUTING.md: dev setup, conventions, how to add a source
- ntfy-bridge.example.yaml: fully documented configuration template
- scripts/example-cron-disk.sh: example cron script → ntfy-bridge
2026-08-01 10:56:32 -04:00