infra/.claude/reference/service-catalog.md
Viktor Barzin ddc8bfa8cf
All checks were successful
ci/woodpecker/push/default Pipeline was successful
ci/woodpecker/push/build-cli Pipeline was successful
tripit: remove Gmail-scrape ingest-mail CronJob; plans@ becomes sole channel
The Gmail All-Mail scrape (tripit-ingest-mail) is retired — Viktor only wants
mail ingested when forwarded to plans@viktorbarzin.me, and only from actual
users. Dropped the ingest-mail CronJob and removed MAIL_DEFAULT_OWNER_EMAIL
from ingest-plans (the app now ignores mail from non-users instead of filing it
under the default owner). ingest-plans already carries EMAIL_PROVIDER/SMTP_* for
the new sender notifications. Service-catalog updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 13:50:53 +00:00

11 KiB

Service Catalog

Auto-maintained reference. See .claude/CLAUDE.md for operational guidance.

Critical - Network & Auth (Tier: core)

Service Description Stack
wireguard VPN server wireguard
technitium DNS server (10.0.20.201, query logging on PostgreSQL via custom PG plugin) technitium
headscale Tailscale control server headscale
traefik Ingress controller (Helm) traefik
xray Proxy/tunnel platform
authentik Identity provider (SSO) authentik
cloudflared Cloudflare tunnel cloudflared
authelia Auth middleware (may be merged into ebooks or removed) platform
monitoring Prometheus/Grafana/Loki stack monitoring

Storage & Security (Tier: cluster)

Service Description Stack
vaultwarden Bitwarden-compatible password manager platform
redis Shared Redis 8.x via HAProxy at redis-master.redis.svc.cluster.local — 3-pod raw StatefulSet redis-v2 (redis+sentinel+exporter per pod), quorum=2. Clients use HAProxy only, no sentinel fallback. redis
immich Photo management (GPU) immich
nvidia GPU device plugin nvidia
metrics-server K8s metrics metrics-server
uptime-kuma Status monitoring uptime-kuma
crowdsec Security/WAF (PostgreSQL backend) crowdsec
kyverno Policy engine kyverno

Admin

Service Description Stack
k8s-dashboard Kubernetes dashboard at k8s.viktorbarzin.me. Forward-auth + auto-injected SA token (apiserver OIDC blocked, see design §12). nginx token-injector (dashboard_injector.tf) maps X-authentik-username → the user's dashboard-<user> SA token (ns admin + read-only on namespace-list/nodes only via dashboard-nav-readonly — no cross-tenant reads, rbac/.../dashboard-sa.tf; admins → cluster-admin SA) and sets Authorization: Bearer → no token-paste, dashboard auto-authenticates per user. Forward-auth admits kubernetes-* groups for this host (stacks/authentik/admin-services-restriction.tf). oauth2-proxy + k8s-dashboard OIDC app built but idle. k8s-dashboard
reverse-proxy Generic reverse proxy reverse-proxy
t3code Multi-user coding-agent GUI at t3.viktorbarzin.me. auth=required (Authentik) → DevVM t3-dispatch service (10.0.10.10:3780, unprivileged user) maps X-authentik-username → that user's own t3-serve@<u> instance (file perms enforced by uid; wizard→:3773, emo→:3774; unmapped→403) and auto-injects the t3 session on first visit (mints via the root t3-mint wrapper, scoped sudoers → /api/auth/bootstrap t3_session cookie). Source of truth /etc/ttyd-user-map; t3-provision-users reconcile (systemd timer) turns map entries into t3-serve@<u> instances + dispatch.json. Add a user: one line in /etc/ttyd-user-map (must already be an OS account + Authentik identity) → reconcile. DevVM artifacts versioned in infra/scripts/ (t3-serve@.service, t3-provision-users, t3-dispatch/, t3-mint, sudoers-t3-autopair, t3-autoupdate.*); TF (stacks/t3code) owns only the ingress + Endpoints→:3780. t3 binary tracks nightly via t3-autoupdate (daily systemd timer; health-check + auto-rollback on a bad build; restarts only idle instances) — so new models (e.g. Opus 4.8) land as t3 ships them. Native app/app.t3.codes unsupported (cross-origin) — deferred until published. Design: docs/plans/2026-06-01-t3-auto-provision-*. t3code

Active Use

Service Description Stack
mailserver Email (docker-mailserver) mailserver
shadowsocks Proxy shadowsocks
webhook_handler Webhook processing webhook_handler
tuya-bridge Smart home bridge tuya-bridge
dawarich Location history dawarich
owntracks Location tracking owntracks
nextcloud File sync/share nextcloud
calibre E-book management (may be merged into ebooks stack) calibre
onlyoffice Document editing onlyoffice
f1-stream F1 streaming (uses chrome-service for hmembeds verifier); source in own repo viktor/f1-stream (Forgejo, extracted 2026-06-05), Woodpecker-native build->deploy (repo id 166) f1-stream
chrome-service Headed Chromium WebSocket pool (ws://chrome-service.chrome-service.svc:3000/<token>) for sibling services driving anti-bot embeds chrome-service
rybbit Analytics rybbit
isponsorblocktv SponsorBlock for TV isponsorblocktv
actualbudget Budgeting (factory pattern) actualbudget
insta2spotify Instagram reel song ID to Spotify playlist insta2spotify
trading-bot Event-driven trading with sentiment analysis trading-bot
claude-memory Persistent memory MCP server claude-memory
paperless-mcp Paperless-ngx document search MCP (barryw/PaperlessMCP). Traefik bearer auth via Aetherinox api-token-middleware. auth=none at ingress; gateway-level bearer enforced by paperless-mcp/bearer-auth Middleware CRD. Tokens + paperless API token in Vault secret/paperless-mcp. paperless-mcp
council-complaints Islington civic reporting pilot council-complaints

Optional

Service Description Stack
blog Personal blog blog
descheduler Pod descheduler descheduler
hackmd Collaborative markdown hackmd
kms Windows/Office volume-license activation (vlmcsd); site kms.viktorbarzin.me, endpoint vlmcs.viktorbarzin.me:1688 kms
privatebin Encrypted pastebin privatebin
vault HashiCorp Vault vault
reloader ConfigMap/Secret reloader reloader
city-guesser Game city-guesser
echo Echo server echo
url URL shortener url
excalidraw Whiteboard excalidraw
travel_blog Travel blog travel_blog
dashy Dashboard dashy
send Firefox Send send
ytdlp YouTube downloader ytdlp
wealthfolio Finance tracking wealthfolio
audiobookshelf Audiobook server (may be merged into ebooks stack) audiobookshelf
paperless-ngx Document management paperless-ngx
jsoncrack JSON visualizer jsoncrack
servarr Media automation (Sonarr/Radarr/etc) servarr
aiostreams Stremio stream aggregator (Real-Debrid + Torrentio/Comet/MediaFusion/StremThru/Knaben). auth=app (own UUID+password); canary stream-probe + 3 alerts; weekly NFS config + Stremio-account-collection backups to /srv/nfs/aiostreams-backup/. PG-backed user config. servarr/aiostreams
ntfy Push notifications ntfy
cyberchef Data transformation cyberchef
diun Docker image update notifier — detects new versions, fires webhook to n8n upgrade agent diun
meshcentral Remote management meshcentral
homepage Dashboard/startpage homepage
matrix Matrix chat server matrix
linkwarden Bookmark manager linkwarden
changedetection Web change detection changedetection
tandoor Recipe manager tandoor
n8n Workflow automation n8n
real-estate-crawler Property crawler real-estate-crawler
tor-proxy Tor proxy tor-proxy
forgejo Git forge forgejo
freshrss RSS reader freshrss
navidrome Music streaming navidrome
networking-toolbox Network tools networking-toolbox
stirling-pdf PDF tools stirling-pdf
speedtest Speed testing speedtest
freedify Music streaming (factory pattern) freedify
phpipam IP Address Management (IPAM) + auto-discovery phpipam
netbox Network documentation (disabled, replaced by phpipam) netbox
infra-maintenance Maintenance jobs infra-maintenance
ollama LLM server (GPU) ollama
frigate NVR/camera (GPU) frigate
ebook2audiobook E-book to audio (GPU) ebook2audiobook
affine Visual canvas/whiteboard (PostgreSQL + Redis) affine
health Apple Health data dashboard (PostgreSQL) health
whisper Wyoming Faster Whisper STT (CPU on GPU node) whisper
grampsweb Genealogy web app (Gramps Web) grampsweb
openclaw AI agent gateway (OpenClaw) openclaw
poison-fountain Anti-AI scraping (tarpit + poison) poison-fountain
priority-pass Boarding pass color transformer priority-pass
status-page Status page status-page
plotting-book Book plotting/world-building app plotting-book
tripit Self-hosted TripIt-clone travel-itinerary PWA (FastAPI + SvelteKit SPA, same-origin). CNPG (tripit db, Vault static role pg-tripit) + RWX NFS trip-doc vault (/srv/nfs/tripit-documents) + RWO proxmox-lvm-encrypted personal-document vault tripit-personal-documents (passports/IDs — AES-256-GCM app-layer envelope, master key DOCUMENT_ENCRYPTION_KEY in secret/tripit). auth=required (Authentik forward-auth, reads X-authentik-email); second auth=none ingress on /api/calendar for HMAC-token-gated .ics feed. Email-ingest CronJob tripit-ingest-plans (*/15) is the SOLE inbound path — forward a booking to plans@viktorbarzin.me (catch-all → spam@), polled read-only and routed ONLY to a registered user / verified linked address (no default-owner fallback; strangers ignored), parsed by local LLM (qwen3vl-4b), and the sender is emailed the outcome (Added to trip / Couldn't import). Plus tripit-poll-flights, tripit-run-reminders, tripit-transport-nudge, tripit-weather-brief. (The old Gmail-scrape tripit-ingest-mail CronJob was removed 2026-06-05.) App secrets in Vault secret/tripit. tripit

Cloudflare Domains

Proxied (CDN + WAF enabled)

blog, hackmd, privatebin, url, echo, f1tv, excalidraw, send,
audiobookshelf, jsoncrack, ntfy, cyberchef, homepage, linkwarden,
changedetection, tandoor, n8n, stirling-pdf, dashy, city-guesser,
travel, netbox, phpipam, tripit, t3

Non-Proxied (Direct DNS)

mail, wg, headscale, immich, calibre, vaultwarden,
mailserver-antispam, mailserver-admin, webhook, uptime,
owntracks, dawarich, tuya, meshcentral, nextcloud, actualbudget,
onlyoffice, forgejo, freshrss, navidrome, ollama, openwebui,
isponsorblocktv, speedtest, freedify, rybbit, paperless,
servarr, prowlarr, bazarr, radarr, sonarr, flaresolverr,
jellyfin, jellyseerr, tdarr, affine, health, family, openclaw

Special Subdomains

  • *.viktor.actualbudget - Actualbudget factory instances
  • *.freedify - Freedify factory instances
  • mailserver.* - Mail server components (antispam, admin)

Key Runbooks

Operational surfaces that aren't k8s services (VMs, pipelines, host-side procedures) are documented in infra/docs/runbooks/:

Surface Runbook
Private Docker registry VM (10.0.20.10) registry-vm.md
Rebuild after orphan-index incident registry-rebuild-image.md
PVE host operations (backups, LVM) proxmox-host.md
NFS prerequisites and CSI mount options nfs-prerequisites.md
pfSense + Unbound DNS pfsense-unbound.md
Mailserver PROXY-protocol / HAProxy mailserver-pfsense-haproxy.md
Technitium apply flow technitium-apply.md