Commit graph

2794 commits

Author SHA1 Message Date
Viktor Barzin
7fe9eb65e8 state(ntfy): update encrypted state 2026-04-16 10:07:04 +00:00
Viktor Barzin
c72257c58e state(novelapp): update encrypted state 2026-04-16 10:06:45 +00:00
Viktor Barzin
71a3998193 state(nextcloud): update encrypted state 2026-04-16 10:06:26 +00:00
Viktor Barzin
44ef6af4fb state(netbox): update encrypted state 2026-04-16 10:03:54 +00:00
Viktor Barzin
f78672d30b state(navidrome): update encrypted state 2026-04-16 10:03:31 +00:00
Viktor Barzin
53855b4265 state(n8n): update encrypted state 2026-04-16 10:03:15 +00:00
Viktor Barzin
2e3edd7a48 state(matrix): update encrypted state 2026-04-16 10:02:24 +00:00
Viktor Barzin
4d4996f246 state(mailserver): update encrypted state 2026-04-16 10:01:59 +00:00
Viktor Barzin
0bd17e3122 state(kms): update encrypted state 2026-04-16 10:01:32 +00:00
Viktor Barzin
b8a35ecf52 state(k8s-portal): update encrypted state 2026-04-16 10:01:13 +00:00
Viktor Barzin
5d248e98fa state(freedify): update encrypted state 2026-04-16 10:00:54 +00:00
Viktor Barzin
ab82b926da state(k8s-portal): update encrypted state 2026-04-16 09:58:45 +00:00
Viktor Barzin
b25d121e4a state(k8s-dashboard): update encrypted state 2026-04-16 09:58:35 +00:00
Viktor Barzin
b22496e6d8 state(jsoncrack): update encrypted state 2026-04-16 09:58:08 +00:00
Viktor Barzin
a1dfe195c6 state(immich): update encrypted state 2026-04-16 09:57:23 +00:00
Viktor Barzin
e3a68b5746 state(homepage): update encrypted state 2026-04-16 09:57:03 +00:00
Viktor Barzin
f0334f268c state(health): update encrypted state 2026-04-16 09:56:40 +00:00
Viktor Barzin
db0c176a52 state(headscale): update encrypted state 2026-04-16 09:56:15 +00:00
Viktor Barzin
6a0d8e73e2 state(hackmd): update encrypted state 2026-04-16 09:56:00 +00:00
Viktor Barzin
83c3d95258 state(frigate): update encrypted state 2026-04-16 09:55:31 +00:00
Viktor Barzin
cd1f8c9aa7 state(freshrss): update encrypted state 2026-04-16 09:55:16 +00:00
Viktor Barzin
4ff56e0b1e state(forgejo): update encrypted state 2026-04-16 09:44:29 +00:00
Viktor Barzin
d5060d07e9 state(foolery): update encrypted state 2026-04-16 09:44:03 +00:00
Viktor Barzin
f856e97980 state(f1-stream): update encrypted state 2026-04-16 09:43:42 +00:00
Viktor Barzin
c9c6f60a30 state(excalidraw): update encrypted state 2026-04-16 09:43:20 +00:00
Viktor Barzin
28fb866fa2 state(ebooks): update encrypted state 2026-04-16 09:43:03 +00:00
Viktor Barzin
49c59ad81f state(ebook2audiobook): update encrypted state 2026-04-16 09:42:44 +00:00
Viktor Barzin
d914e4aadf state(dawarich): update encrypted state 2026-04-16 09:32:09 +00:00
Viktor Barzin
d0d68968c1 state(dashy): update encrypted state 2026-04-16 09:31:01 +00:00
Viktor Barzin
4daeb12e3e state(crowdsec): update encrypted state 2026-04-16 09:20:12 +00:00
Viktor Barzin
fb14f8046a state(city-guesser): update encrypted state 2026-04-16 09:19:49 +00:00
Viktor Barzin
e81f71dfd7 state(changedetection): update encrypted state 2026-04-16 09:19:31 +00:00
Viktor Barzin
9f7a72c3f8 state(blog): update encrypted state 2026-04-16 09:19:11 +00:00
Viktor Barzin
445dc17156 state(authentik): update encrypted state 2026-04-16 09:18:31 +00:00
Viktor Barzin
6db061cdb7 state(affine): update encrypted state 2026-04-16 09:18:12 +00:00
Viktor Barzin
f7fd52b1cd state(echo): update encrypted state 2026-04-16 09:15:46 +00:00
Viktor Barzin
b98890d799 fix(beads-server): fix Workbench GraphQL URL for remote hosting
Dolt Workbench hardcodes http://localhost:9002/graphql in the built JS.
For k8s hosting, init container patches this to relative /graphql path.
Second ingress routes /graphql to port 9002 behind Authentik auth.

- Init container copies static JS to writable emptyDir, patches URL
- Pre-seeds store.json with Dolt connection config
- Added /graphql ingress with Authentik forward-auth

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 21:53:57 +00:00
Viktor Barzin
375a3d91d5 [monitoring] Exclude websocket protocol from HighServiceLatency alert
Traefik records websocket connection lifetimes (minutes to hours) as
"request duration." When websockets close, the full lifetime pollutes
the average latency metric — Authentik showed 6.7s avg (201s websocket
avg) vs 0.065s actual HTTP avg. This caused ~90 false alerts/day across
12 services (Authentik, Vaultwarden, Terminal, HA, etc.).

Changes:
- Add protocol!="websocket" filter to HighServiceLatency alert expr
- Raise minimum traffic threshold from 0.01 to 0.05 rps to filter
  statistical noise from services with <3 req/min
- Remove .githooks/pre-commit file-size hook (blocked state commits)

Validated against 7-day historical data: 637 breaches → ~2 with both
filters applied (99.7% reduction).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 21:51:19 +00:00
Viktor Barzin
3e273399c1 fix(ci): add registry.viktorbarzin.me:5050 to imagePullSecrets
Pipeline pods pull from registry.viktorbarzin.me:5050 but the
registry-credentials secret only had auth for registry.viktorbarzin.me
(without port). Containerd requires exact hostname:port match.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 21:50:51 +00:00
Viktor Barzin
116fdcf82d fix(ci): Woodpecker secret sync includes all event types
The vault-woodpecker-sync script was creating global secrets with only
push/tag/deployment events. Manual and cron-triggered pipelines couldn't
access secrets, causing "secret not found" errors and pipeline failures.

Also fixes three root causes of CI failures:
1. Pull-through cache corruption: purged stale blobs, added post-GC
   registry restart cron to prevent recurrence
2. Missing repo-level secrets: added registry_user/registry_password
   for the infra repo's build-ci-image workflow
3. Stuck pipelines: cleaned up 3 pipelines stuck in "running" since March

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 21:43:48 +00:00
Viktor Barzin
27b6c79f11 state(woodpecker): update encrypted state 2026-04-15 21:43:37 +00:00
Viktor Barzin
d9ed166640 fix(beads-server): add Authentik auth to Dolt Workbench
- Set protected=true on ingress (Authentik forward-auth)
- Remove unused DATABASE_URL env var (Workbench uses browser-based connection config)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 21:43:22 +00:00
Viktor Barzin
c33f597111 feat(upgrade-agent): add automated service upgrade pipeline with n8n + DIUN
Pipeline: DIUN detects new image versions every 6h → webhook to n8n →
n8n filters (skip databases/custom/infra/:latest) and rate-limits
(max 5/6h) → SSH to dev VM → claude -p runs upgrade agent.

Agent workflow: resolve GitHub repo → fetch changelogs → classify risk
(SAFE/CAUTION) → backup DB if needed → bump version in .tf → commit+push
→ wait for CI → verify (pod ready + HTTP + Uptime Kuma) → rollback on
failure.

Changes:
- stacks/n8n: add N8N_PORT=5678 to fix K8s env var conflict
- stacks/n8n/workflows: version-controlled n8n workflow backup
- docs/architecture/automated-upgrades.md: full pipeline documentation
- AGENTS.md: add upgrade agent section
- service-catalog.md: update DIUN description

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 21:38:27 +00:00
Viktor Barzin
27d7c91608 feat(beads-server): add Dolt Workbench web UI
Deploy dolthub/dolt-workbench alongside the Dolt server in beads-server
namespace. Provides SQL console, spreadsheet editor, and commit graph
visualization for the centralized beads task database.

- Workbench at dolt-workbench.viktorbarzin.me (Cloudflare-proxied)
- Connects to Dolt server via in-cluster service DNS
- Added to cloudflare_proxied_names for external access

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 21:32:45 +00:00
Viktor Barzin
a729f183be state(cloudflared): update encrypted state 2026-04-15 21:31:59 +00:00
Viktor Barzin
e19993519b chore: verify CI pipeline after pull secret fix 2026-04-15 21:28:15 +00:00
Viktor Barzin
234ca1c73e test: trigger CI pipeline [ci skip] 2026-04-15 21:24:00 +00:00
Viktor Barzin
c124a23390 fix(ci): add K8s pull secrets to Woodpecker agents
Pipeline pods were failing with "authorization failed: no basic auth
credentials" when pulling from the private registry. The
WOODPECKER_BACKEND_K8S_PULL_SECRET_NAMES env var was in values.yaml but
never deployed to the agents.

Also removes the stale db-init job that used `-U root` (incompatible
with CNPG's `postgres` superuser). The database already exists.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 21:21:12 +00:00
Viktor Barzin
577d4e778c state(woodpecker): update encrypted state 2026-04-15 21:20:44 +00:00
Viktor Barzin
e91c0b293d state(woodpecker): update encrypted state 2026-04-15 21:18:05 +00:00