Tear down ntfy, consolidate fleet alerting into Telegram (coilyco_ops_bot, green/red chats) #369
Labels
No labels
burndown-2026-06
coherence-core
consult
headless
interactive
P0
P1
P2
P3
P4
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
coilyco-flight-deck/infrastructure#369
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Tear down self-hosted ntfy and consolidate all fleet alerting into Telegram via the existing
coilyco_ops_bot. Replaces the ntfy server + thexenrox/ntfy-alertmanagerbridge + the direct-curl producers.Routing model: two chats
/coilysiren/telegram/green-chat-id) — good news: successful deploys,fleet-convergeapplied-a-commit, clean git-state sweeps./coilysiren/telegram/red-chat-id) — failures/alerts: every vmalert rule, converge FAILED, git drift/unreachable, deploy job failures./coilysiren/telegram/bot-token(SecureString). Bot:coilyco_ops_bot(local: coilyco-ops).Inventory (what posts to ntfy today)
Cluster path (deploy repo,
services/ser8-observability/): vmalert → VictoriaMetrics bundled Alertmanager →xenrox/ntfy-alertmanagerbridge → ntfy topicalerts. AM is upstream-Prometheus-compatible, so it speakstelegram_configsnatively — drop the bridge, swap thentfyreceiver for a Telegram red receiver.Direct-curl scripts (this repo):
ansible/roles/git-state-watch/files/fleet-git-state.sh— daily git drift sweep. clean→green, drift/unreachable→red.ansible/roles/fleet-converge/files/fleet-converge.shnotify()— every 30 min. applied→green, FAILED→red.scripts/coilysiren-mirror-reconcile.sh— already DEAD (itsmirror-sync.ymlnever setsNTFY_URL); migrate for completeness.Plumbing to retire:
deploy/ntfy.yml(binwiederhier server, Flux + tailscale sidecar),ansible/roles/o11y-ntfy/(SSM base-url cache role), SSM/coilysiren/ntfy/{base-url,ts-authkey}, the flux kustomization + tailscale service entries,~/.config/fleet-o11y/ntfy-base-url.Stages (dual-ship so no alert gap)
coilyco_ops_bot. Done out-of-band.o11y-telegramansible role caching the 3 SSM params host-local (mirrors o11y-ntfy); swap the 3 scripts' ntfy curl for TelegramsendMessagewith green/red selection; add the Telegram red receiver todeployvmalert-values.yml. Both fire in parallel; confirm Telegram lands.ntfy.yml+o11y-ntfyrole + flux/tailscale/SSM entries; update all docs/FEATURES (infra + deploy).Open detail
Alertmanager
telegram_configsneedsbot_token/chat_id— keep them out of tracked files. Eitherbot_token_file+ out-of-band config Secret (same precedent as today's imperative ntfy-bridge Secret), or keep a thin Telegram webhook relay fed by an ExternalSecret. Decide at cluster-path authoring time.Out of scope
Discord
#coilyco-alerting— its only producer is the retiredcoilybinary (coily repo, not here); deferred, tracked separately.Decisions locked: two chats (green/red); Discord deferred. Bot
coilyco_ops_botpre-exists.Additional teardown item folded in (found during the cluster red-receiver apply):
Dead
grafana-adminExternalSecret on ser8 —infrastructure/deploy/observability/admin-password-externalsecret.ymlsyncs/grafana/admin-passwordinto the ser8observabilitynamespace, but:ser8-observabilitydocs/ser8-k3s.md: "No Grafana: vmui for ad-hoc queries").no matches for kind "ExternalSecret" in version "external-secrets.io/v1"), so it could never have applied anyway.Action during the sweep: delete
admin-password-externalsecret.yml, and (if unused) retire the/grafana/admin-passwordSSM param. Same root cause as the ntfy plumbing — ser8 secrets are imperative, not SSM-synced.