Post-HTTPS-rollout improvements identified once every linux-server service was
wired up with a Tailscale sidecar. Plan tracked in TODO.md →
"Server observability & hardening (post-HTTPS rollout)"; per-service HTTPS pattern
in linux-server/HTTPS.md. To be tackled in follow-up PR(s) (can be split).
1. Watchtower observability — "what updated, and when"
Watchtower auto-updates containers (3am daily) and is monitored in Uptime Kuma via
its /v1/metrics API — but that's cumulative counters only
(watchtower_containers_updated / _failed / _scanned, watchtower_scans_total):
no record of which containers updated, to what version, or when. The "what &
when" must come from notifications/logs.
2. Resilience
3. Maintainability
4. Security
Post-HTTPS-rollout improvements identified once every linux-server service was
wired up with a Tailscale sidecar. Plan tracked in
TODO.md→"Server observability & hardening (post-HTTPS rollout)"; per-service HTTPS pattern
in
linux-server/HTTPS.md. To be tackled in follow-up PR(s) (can be split).1. Watchtower observability — "what updated, and when"
Watchtower auto-updates containers (3am daily) and is monitored in Uptime Kuma via
its
/v1/metricsAPI — but that's cumulative counters only(
watchtower_containers_updated/_failed/_scanned,watchtower_scans_total):no record of which containers updated, to what version, or when. The "what &
when" must come from notifications/logs.
WATCHTOWER_NOTIFICATION_URL(shoutrrr ntfy URL → our ntfy, topic e.g.watchtower) +WATCHTOWER_NOTIFICATION_REPORT=true. Persistent, timestampedper-run report (containers updated/failed/skipped, old→new image) + phone push.
Keep it metrics-only on the HTTP API (no update endpoint) so the schedule keeps
running.
counters, alert on
watchtower_containers_failed > 0. Counts only — pairs withTier 1. Also a home for other metrics (glances, node-exporter, cAdvisor).
for a per-container available/applied-update view.
2. Resilience
tailscale/tailscale:latestand watchtower auto-updates them — a bad releasecould drop every HTTPS front door at once. Pin a stable tag (bump deliberately)
or exclude the sidecars from watchtower.
linux-server/backup/(6965c1b): nightly restic backupof all persistent server state to the dedicated 1TB drive (+ optional 14TB second
copy), encrypted/deduplicated/pruned, with ntfy alerts and a homepage status card.
Covers Forgejo (repos+LFS+DB), all SQLite app DBs (online
.backup, no downtime),Portainer BoltDB, certs/configs, and every
.env.ts-state/deliberatelyexcluded (re-auth via
TS_AUTHKEYregenerates node keys). systemd timer (03:30,Persistent) + OnFailure alert; restore runbook in the README.
3. Maintainability
<svc>-tsblocks +ts-serve.json(differ only by hostname/port). Use Composeextendsfrom ashared base so a global change is one edit, not 13. (Touches all stacks — needs
live re-verify.)
TS_AUTHKEYinstead of the same OAuth secret copied into ~13.envfiles (rotation/rebuild pain).dryrun-smoke.sh):assert every
linux-server/*/has matching compose +ts-serve.json+.env.example, valid YAML/JSON, serve port == container port,ts-state/gitignored.
4. Security
tag:containernodes(currently default allow-all).
*.home.ulises-c.meNPM trusted-HTTPS setup, since filebrowser/glances etc.have weak/no auth once exposed off-tailnet.