Skip to content

Services Catalog

Inventory of all services deployed in the fzymgc-house cluster.

ServiceURLNamespaceCategory
Vaultvault.fzymgc.housevaultPlatform
Keycloakid.fzymgc.housekeycloakPlatform
Grafanagrafana.fzymgc.housegrafanaPlatform
ArgoCDargocd.fzymgc.houseargocdPlatform
Temporaltemporal.fzymgc.housetemporalApplication
Mealiemealie.fzymgc.housemealieApplication
Octopusoctopus.fzymgc.houseoctopusApplication
Longhornlonghorn.fzymgc.houselonghorn-systemInfrastructure
TailscaleInternaltailscaleInfrastructure
TraefikInternaltraefikInfrastructure
Router Hosts OperatorInternalrouter-hosts-operatorInfrastructure
NATSInternalnatsInfrastructure
Mosquittomqtt.fzymgc.house:8883mosquittoInfrastructure
CloudflaredN/A (outbound)cloudflaredInfrastructure
VictoriaMetricsInternalprometheusObservability
LokiInternallokiObservability
Hubble UIhubble.fzymgc.househubbleObservability
Uptime Kumastatus.fzymgc.houseuptime-kumaObservability
HyperDXhyperdx.fzymgc.houseclickstackObservability
ClickStack OperatorsInternalclickstack-operatorsObservability
VectorInternalvectorObservability
OTel ScraperInternalotel-scraperObservability
Dolt SQL Serverdoltdb.fzymgc.housedoltApplication
CNPGpostgres.fzymgc.housepostgresInfrastructure
Gateway APIInternalkube-systemInfrastructure
Grafana OperatorInternalgrafana-operatorInfrastructure
Grafana MCPgrafana-mcp.fzymgc.housegrafana-mcpApplication
Karakeepkarakeep.fzymgc.housekarakeepApplication
Agentgatewayllm-gw.fzymgc.house / mcp-gw.fzymgc.houseagentgatewayApplication
Agentgateway ControllerInternalagentgateway-systemApplication
Agent Memory (Engram)mcp-gw.fzymgc.house/mcp/engramagent-memoryApplication
Headroom (apps)headroom-apps.headroom-apps.svc.cluster.local:8787 (internal)headroom-appsApplication
Headroom (agents)https://headroom.fzymgc.house (Tailscale-internal)headroom-agentsApplication
Firewalla MCPmcp-gw.fzymgc.house/mcp/firewalla-rofirewalla-mcpApplication
RustDeskrd.fzymgc.house (edge node)rustdeskApplication
K8s OIDC RBACInternalN/APlatform
Kubernetes ReplicatorInternalkube-systemInfrastructure
ReloaderInternalkube-systemInfrastructure
System Upgrade ControllerInternalsystem-upgradeInfrastructure
VeleroInternalveleroInfrastructure
HCP Terraform OperatorInternalhcp-terraformGitOps
Actions Runner ControllerInternalarc-systemsGitOps
GitHub Actions RunnersInternalarc-runnersGitOps
PropertyValue
URLvault.fzymgc.house
Alt URLsvault-0.fzymgc.house, vault-1.fzymgc.house, vault-2.fzymgc.house
Namespacevault
Ingress TypeTCP Passthrough (TLS termination at Vault)
Auth MethodOIDC (Keycloak)
Vault Pathsecret/fzymgc-house/cluster/vault/*
StatusOperational
PropertyValue
URLid.fzymgc.house
Namespacekeycloak
Ingress TypeTraefik IngressRoute (/admin + /realms/master additionally gated to LAN/Tailscale by the admin-allowlist Middleware)
Auth MethodNative (IdP)
Vault Pathsecret/fzymgc-house/cluster/keycloak
StatusOperational
PropertyValue
URLgrafana.fzymgc.house
Namespacegrafana
Ingress TypeHelm Managed
Auth MethodOIDC (Keycloak)
Vault Pathsecret/fzymgc-house/cluster/grafana
StatusOperational
PropertyValue
URLargocd.fzymgc.house
Namespaceargocd
Ingress TypeHelm Managed
Auth MethodOIDC (Keycloak, via the Dex connector)
Vault Pathsecret/fzymgc-house/cluster/argocd, secret/fzymgc-house/cluster/argocd/oidc
StatusOperational
PropertyValue
URLInternal only
NamespaceCluster-scoped
PurposeKubernetes RBAC bindings for Keycloak OIDC groups
Auth MethodOIDC (Keycloak)
StatusOperational

RBAC Bindings:

Keycloak GroupClusterRoleDescription
k8s-adminscluster-adminFull cluster access
k8s-developerseditEdit resources in namespaces
k8s-viewersviewRead-only access

How it works:

  1. Keycloak issues OIDC tokens with group claims (k8s-admins, etc.)
  2. ClusterRoleBindings map those groups to Kubernetes RBAC roles
  3. k3s validates tokens using --kube-apiserver-arg=oidc-* flags
PropertyValue
URLtemporal.fzymgc.house
Namespacetemporal
Ingress TypeTraefik IngressRoute
Auth MethodForward-Auth (shared oauth2-proxy, Keycloak-backed — group temporal-users, ADR hl-1fia)
Vault Pathsecret/fzymgc-house/cluster/temporal/*
DatabaseCNPG main cluster: temporal (default store), temporal_visibility (visibility store)
Workers Repofzymgc-house/temporal-workers
StatusActive

Components:

  • temporal-server - Core Temporal services (frontend, history, matching, worker)
  • temporal-web - Web UI for workflow visibility
  • temporal-admintools - CLI tools for namespace management
  • temporal-worker-controller - Manages worker deployments via CRDs
PropertyValue
URLmealie.fzymgc.house
Alt URLmealie.k8s.fzymgc.house
Namespacemealie
Ingress TypeTraefik IngressRoute
Auth MethodOIDC (Keycloak, native login — not forward-auth)
Vault Pathsecret/fzymgc-house/cluster/mealie
StatusOperational
PropertyValue
URL (admin UI)octopus.fzymgc.house (internal, router-hosts)
Webhook (public)octopus-wh.fzymgc.net/api/github/webhook
Namespaceoctopus
Ingress TypeTraefik IngressRoute (UI) + Cloudflare tunnel webhook_services (webhook)
Auth MethodBetter Auth (GitHub OAuth + ADMIN_EMAILS); webhook by GitHub HMAC signature
Imageghcr.io/seanb4t/octopus (fork) + ghcr.io/seanb4t/octopus-migrate
Vault Pathsecret/fzymgc-house/cluster/octopus
Runbookdocs/operations/octopus.md
StatusStaged (replicas:0 until go-live, hl-0we.13)

Purpose: Self-hosted AI PR review. LLM + embeddings routed through agentgateway (OpenRouter reviews under ZDR + in-cluster bge-m3 embeddings). Dedicated Qdrant + dedicated CNPG octopus database. Epic hl-0we.

PropertyValue
URLgrafana-mcp.fzymgc.house
Namespacegrafana-mcp
Ingress TypeTraefik IngressRoute
Auth MethodOIDC (Keycloak)
Vault Pathsecret/fzymgc-house/cluster/grafana
Chartgrafana/mcp-grafana v0.2.2
StatusOperational

Purpose:

MCP (Model Context Protocol) server for Claude Code integration. Provides AI assistants with structured access to Grafana data sources:

  • Query metrics from Prometheus/VictoriaMetrics
  • Query logs from Loki
  • List and access dashboards
  • Execute Grafana API operations

Usage:

Claude Code connects via the fzymgc-house:grafana skill which uses this MCP server to:

  • Investigate infrastructure issues via Grafana data
  • Check application metrics and logs
  • Create or update dashboards
PropertyValue
URLdoltdb.fzymgc.house
Namespacedolt
Port3306 (MySQL wire protocol)
Ingress TypeMetalLB LoadBalancer
Auth MethodMySQL native (password)
Vault Pathsecret/fzymgc-house/cluster/dolt
StatusOperational

Purpose:

Version-controlled SQL database (MySQL-compatible) for Beads, Gastown, and AI agents. Dolt provides Git-like versioning for database content, enabling branch/merge workflows on structured data.

PropertyValue
URLkarakeep.fzymgc.house
Namespacekarakeep
Ingress TypeTraefik IngressRoute
Auth MethodOIDC (Keycloak)
Vault Pathsecret/fzymgc-house/cluster/karakeep
StatusIn Progress

Self-hosted bookmark manager with AI-powered auto-tagging, full-text search (Meilisearch), and page crawling/archiving (browserless/chrome).

PropertyValue
LLM URLllm-gw.fzymgc.house (curated, alias-gated OpenAI-compatible: /v1/chat/completions, /v1/embeddings, /v1/models)
OpenRouter passthroughopenrouter-gw.fzymgc.house/api/v1 (transparent: any OpenRouter model slug + endpoint, any params; opt-in ZDR via header x-agentgateway-backend: openrouter-generic-zdr)
MCP URLmcp-gw.fzymgc.house/mcp/<server>
Admin UIagentgateway.fzymgc.house (Traefik + shared oauth2-proxy forward-auth, Keycloak-backed)
Namespaceagentgateway
Ingress TypeGateway API (gatewayClassName: agentgateway) for LLM/MCP; Traefik IngressRoute for the admin UI
Auth MethodLLM + SaaS MCP: per-client virtual key (apiKeyAuthentication); engram MCP: OAuth/JWT (Keycloak mcp-public, real RFC 7591 DCR)
Vault Pathsecret/fzymgc-house/cluster/agentgateway
Chartsagentgateway-crds + agentgateway 1.3.1 (images cr.agentgateway.dev/{controller,agentgateway}:v1.3.1)
StatusOperational

Purpose: k8s-native AI gateway (XDS control-plane via the agentgateway controller + agentgateway.dev/v1alpha1 CRDs). Single front door for the LLM proxy (OpenRouter chat/models + Ollama bge-m3 embeddings, with ZDR + drop_params) and a 6-server MCP gateway. Replaced the standalone (local config.yaml) deployment (ADR hl-jd4, superseded by hl-m3c).

Generic OpenRouter passthrough (openrouter-gw.fzymgc.house): a dedicated transparent lane — use it exactly like https://openrouter.ai/api/v1 (set the client base URL to https://openrouter-gw.fzymgc.house/api/v1). It forwards any OpenRouter OpenAI-compatible endpoint with any model slug and any params, with no per-model alias registration, while still capturing OTel usage/token telemetry (Detect route type). For Zero-Data-Retention, add request header x-agentgateway-backend: openrouter-generic-zdr (chat + embeddings; ZDR is enforced server-side via provider.zdr=true). Auth is a dedicated accept-list (agentgateway-openrouter-vkeys) holding only vk_openrouter_passthrough — separate from the curated agentgateway-vkeys, so the service-account keys (karakeep, mealie, octopus, …) cannot reach this unrestricted lane. Provision vk_openrouter_passthrough in Vault (fzymgc-house/cluster/agentgateway) before use; the lane fails closed until then. The curated llm-gw lane and its or-* aliases are unaffected. ADRs hl-v4vo (dedicated host), hl-l875 (Detect over Passthrough), hl-d5lu (header-selected ZDR).

fovea ZDR lanes (/fovea-scout, /fovea-deepdive): fovea (AI code review) is an agentgateway client that routes its two LLM roles through dedicated header-free ZDR path lanes on llm-gw.fzymgc.house: scout/fovea-scout/v1/chat/completions (DeepSeek V4-Flash via the openrouter-zdr backend) and deepdive/fovea-deepdive/v1/chat/completions (GLM-5.2 via the dedicated openrouter-zdr-glm backend). fovea’s correctness and security scout aspects run on the deepdive (GLM-5.2) role; types and tests run on the cheaper scout (Flash) role — a two-tier split bounded by fovea’s closed scout|deepdive role set. Auth is the vk_fovea virtual key on the curated agentgateway-vkeys accept-list. Path-prefix routing (rather than the x-agentgateway-backend header used by llm-chat-zdr) is required because fovea’s per-role base_url cannot set a custom backend-selection header; the backend’s pathPrefix: /api/v1 rewrites the upstream path. ZDR is enforced backend-global (provider.zdr=true, require_parameters=true). A third role, guard (fovea 0.4.4 injection-guard layer), reuses the scout lane (/fovea-scout/v1, DeepSeek V4-Flash) for its LLM-as-judge classifier — it calls with RoleGuard + RequireZDR (fovea injects provider.zdr=true per request), so no new backend or route is needed. The input gate runs in monitor mode (detect-only; emits the fovea.guard.checks metric, never blocks a review — fail-open per fovea ADR fovea-iod); escalate to flag/block after the signal is trusted. Epics hl-3w5i (routing), hl-dbrb (0.5.0 + guard).

Deployment model: Two ArgoCD apps — agentgateway-controller (sync-wave −1: CRDs + controller via multi-source Helm) and agentgateway (sync-wave 0: Gateway + HTTPRoutes + AgentgatewayBackend/AgentgatewayPolicy CRs + ESO secrets). The controller provisions the data-plane Deployment/Service (LoadBalancer, MetalLB). Host DNS (llm-gw/mcp-gw/openrouter-gw → Gateway LB) is registered via a HostMapping CR (the router-hosts operator doesn’t watch Gateways); the litellm host was dropped at decommission (hl-0sr Phase 5).

Observability: agentgateway exports telemetry to ClickStack via two paths (its Rust data plane has no OTLP metrics exporter, so the surfaces are asymmetric):

  • Metrics (gen_ai_token_usage, gen_ai_request_duration, gen_ai_time_to_first_token for LLM; mcp_requests for MCP) are exposed on the data plane’s stats port :15020/metrics (the admin :15000 returns 404 on /metrics) via the repo-managed agentgateway-metrics Service, and scraped by monitoring-otel-scraper (static job agentgatewaycs-otel-collectorotel_metrics_{sum,histogram}, ServiceName='agentgateway').
  • Traces are pushed natively (OTLP/gRPC to cs-otel-collector:4317, configured via AgentgatewayParameters.rawConfig.config.tracing, authed with the otel_ingest_api_key raw token).

The HyperDX dashboard agentgateway-llm-mcp-usage reports LLM-vs-MCP usage distinctly.

MCP servers: engram (OAuth/Keycloak), exa, firecrawl, context7, fal, deepwiki (the SaaS five gated by virtual key, with per-upstream Authorization keys injected from Vault; deepwiki needs no upstream key).

DCR (Dynamic Client Registration): real RFC 7591 DCR is live. agentgateway’s jwtAuthentication.mcp middleware serves the OAuth discovery + DCR endpoints and proxies anonymous /register calls to Keycloak (no clientId mock short-circuit — mcp-oauth-shared.yaml); authorize/token point at Keycloak directly. The static mcp-public PKCE client remains the discovery anchor/fallback for clients that skip DCR. The DCR call is routed cluster-internally to Keycloak (CoreDNS split-horizon rewrite) with pod-level TLS trust for Keycloak’s ICA1 certificate, restoring cluster-internal-only DCR at the network layer — see ADR hl-ll5p (supersedes the earlier Authentik-era mock-DCR limitation described in ADR hl-23m).

Client config (claude-code / codex):

// LLM: base URL https://llm-gw.fzymgc.house , api key = vk_claude_code
// MCP servers (mcpServers):
"engram": { "type": "http", "url": "https://mcp-gw.fzymgc.house/mcp/engram" }, // OAuth (Keycloak, DCR)
"exa": { "type": "http", "url": "https://mcp-gw.fzymgc.house/mcp/exa", "headers": { "Authorization": "Bearer <vk_claude_code>" } },
"firecrawl": { "type": "http", "url": "https://mcp-gw.fzymgc.house/mcp/firecrawl", "headers": { "Authorization": "Bearer <vk_claude_code>" } },
"context7": { "type": "http", "url": "https://mcp-gw.fzymgc.house/mcp/context7", "headers": { "Authorization": "Bearer <vk_claude_code>" } },
"fal-ai": { "type": "http", "url": "https://mcp-gw.fzymgc.house/mcp/fal", "headers": { "Authorization": "Bearer <vk_claude_code>" } },
"deepwiki": { "type": "http", "url": "https://mcp-gw.fzymgc.house/mcp/deepwiki", "headers": { "Authorization": "Bearer <vk_claude_code>" } }
PropertyValue
URLInternal only
Namespaceagentgateway-system
PurposeXDS control plane + CRD lifecycle for agentgateway data-plane
Chartsagentgateway-crds + agentgateway controller 1.3.1
ArgoCD Appagentgateway-controller (sync-wave −1)
StatusOperational

Purpose: Installs agentgateway.dev/v1alpha1 CRDs and runs the agentgateway controller that watches those CRDs and configures the data-plane pods in the agentgateway namespace via XDS. Deployed ahead of the gateway app (sync-wave −1).

PropertyValue
MCP URLmcp-gw.fzymgc.house/mcp/engram (via agentgateway, OAuth)
Console URLengram.fzymgc.house (root redirects to /ui since 0.7.0; LAN/Tailscale-only; Traefik IngressRoute, vault-issuer TLS)
Namespaceagent-memory
Chartghcr.io/seanb4t/charts/engram 0.7.0
Auth MethodMCP: OAuth/JWT (Keycloak mcp-public, DCR, validated by agentgateway). Console: OIDC auth-code (Keycloak engram-ui confidential client, distinct MEM_UI_ISSUER)
Vault Pathsecret/fzymgc-house/cluster/agent-memory (embedder/OTLP), secret/fzymgc-house/cluster/engram-ui (console OIDC client secret + cookie key)
StorageQdrant vector DB (qdrant-data PVC, longhorn-encrypted) + R2 snapshot backup
StatusOperational

Purpose: Persistent vector-memory store for AI agent harness. Wraps a Qdrant instance with an MCP server (seanb4t/engram). Embeddings routed via agentgateway (ollama/bge-m3). The MCP endpoint is exposed through agentgateway — clients authenticate with Keycloak mcp-public OAuth tokens (DCR). The operator console (“Connect” web UI) is exposed LAN-only at engram.fzymgc.house via a Traefik IngressRoute, authenticated through a separate Keycloak engram-ui confidential client. engram 0.6.1’s MEM_UI_ISSUER decouples the console’s OIDC issuer from the MCP bearer issuer so both auth lanes coexist (per-app Keycloak issuers differ). Since 0.7.0 the MCP transport mounts at an explicit MEM_MCP_PATH (/mcp, matching the agentgateway backend) instead of the root catch-all, freeing the host root to redirect to the console.

PropertyValue
MCP URLmcp-gw.fzymgc.house/mcp/firewalla-ro (via agentgateway, virtual key vk_firewalla)
Namespacefirewalla-mcp
Imageghcr.io/fzymgc-house/firewalla-mcp (pinned by digest)
Auth MethodClient: per-client virtual key (apiKeyAuthentication); gateway→server static bearer; server→MSP personal access token
Vault Pathsecret/fzymgc-house/cluster/firewalla-mcp (msp_id/token/box_id); bearer + VK at secret/fzymgc-house/cluster/agentgateway
Source Repogithub.com/fzymgc-house/firewalla-mcp (Go, modelcontextprotocol/go-sdk)
StatusRead-only v1 (boxes/devices/alarms/flows/rules/target-lists); scoped writes are a fast-follow

Purpose: Read-only MCP server wrapping the Firewalla MSP API v2 (docs.firewalla.net), so agents can triage Firewalla state (the class of incident behind hl-gy4x) over MCP instead of manual SSH spelunking. Built in fzymgc-house/firewalla-mcp (engram pattern: own repo, distroless image, CI-published), deployed in-cluster behind agentgateway. v1 exposes only read tools on /mcp/firewalla-ro; scoped writes (rule + target-list management) will land on a separate /mcp/firewalla-rw route (ADR hl-rzrg). Tracked under epic hl-vbvu.1.

Two single-replica instances providing LLM context compression. Each lives in its own namespace with an independent PVC and telemetry service.name.

PropertyValue
URLhttp://headroom-apps.headroom-apps.svc.cluster.local:8787 (ClusterIP, internal only)
Namespaceheadroom-apps
SurfaceOpenAI /v1/chat/completions
Upstreamhttps://llm-gw.fzymgc.house/v1
Run mode--mode token (maximize JSON compression)
Imageghcr.io/chopratejas/headroom:0.27.0-nonroot
Vault Pathsecret/fzymgc-house/cluster/clickstack (otel_ingest_api_key, reused)
Runbookdocs/operations/headroom.md
StatusOperational
PropertyValue
URLhttps://headroom.fzymgc.house (Tailscale-internal; not on public DNS)
Namespaceheadroom-agents
SurfaceAnthropic /v1/messages
Upstreamhttps://api.anthropic.com (direct)
Run mode--mode cache (preserve Anthropic prefix-cache hits)
Imageghcr.io/chopratejas/headroom:0.27.0-code-nonroot
Vault Pathsecret/fzymgc-house/cluster/clickstack (otel_ingest_api_key, reused)
Runbookdocs/operations/headroom.md
StatusOperational
PropertyValue
URLrd.fzymgc.house
Namespacerustdesk
StatusRemnant (namespace exists; workloads run on edge node)

Note: RustDesk Pro (hbbs + hbbr) runs on the DigitalOcean edge node (edge-node.fzymgc.house) via Docker Compose — not in the k3s cluster. The rustdesk namespace exists in the cluster but contains no active workloads; it is a remnant from an earlier deployment attempt. See docs/operations/rustdesk-clients.md for client configuration.

PropertyValue
URLInternal only
Namespacetraefik
Ingress TypeN/A (is the ingress controller)
Auth MethodNone
Ports80 (HTTP), 443 (HTTPS)
StatusOperational
PropertyValue
URLlonghorn.fzymgc.house
Namespacelonghorn-system
Ingress TypeTraefik IngressRoute
Auth MethodForward-Auth (shared oauth2-proxy, Keycloak-backed — group longhorn-users, ADR hl-1fia)
StatusOperational
PropertyValue
URLInternal only
Namespacemetallb
Ingress TypeN/A (provides LoadBalancer IPs)
Auth MethodNone
IP Pools192.168.20.145-149, 192.168.20.155-159
StatusOperational
PropertyValue
URLInternal only
Namespacecert-manager
Ingress TypeN/A
Auth MethodNone
IssuersLet’s Encrypt (production), Self-signed (internal)
StatusOperational
PropertyValue
URLInternal only
Namespaceexternal-secrets
Ingress TypeN/A
Auth MethodVault Kubernetes Auth
ClusterSecretStorevault
StatusOperational
PropertyValue
URLN/A (outbound tunnel)
Namespacecloudflared
PurposeExternal ingress via Cloudflare Tunnel
StatusOperational
PropertyValue
URLInternal only
Namespacetailscale
Ingress TypeN/A (outbound mesh network)
Auth MethodOAuth (Tailscale API)
PurposeSubnet router and exit node for tailnet access
Vault Pathsecret/fzymgc-house/cluster/tailscale/oauth
StatusOperational
PropertyValue
URLInternal only
Namespacerouter-hosts-operator
Chart Sourceghcr.io/fzymgc-house/charts/router-hosts-operator
Chart Version0.8.14
Imageghcr.io/fzymgc-house/router-hosts-operator:0.8.14
Auth MethodmTLS (Vault PKI)
PurposeDNS host entry management via HostEntry CRD
Vault PKI Rolerouter-hosts-client
Server Version0.9.7 (Ansible: Firewalla router image tag)
StatusOperational
PropertyValue
URLInternal only
Namespacenats
Ingress TypeN/A (internal messaging)
Auth MethodNKey (Ed25519 signatures)
Vault Pathsecret/fzymgc-house/cluster/nats
Storage10Gi per node (longhorn-encrypted)
Cluster Size3 replicas
StatusActive

Features:

  • JetStream persistence with Raft consensus
  • 3-node cluster for high availability
  • TLS for client and cluster connections
  • Account-based multi-tenancy (SYS, SERVICES, IOT)
  • Prometheus metrics on port 7777

Accounts:

AccountPurposeConsumers
SYSSystem monitoring and adminnats-box, monitoring
SERVICESCluster service communicationTemporal, future services
IOTIoT device messagingHome Assistant (future)

Ports:

PortProtocolPurpose
4222NATSClient connections
1883MQTTMQTT listener
6222NATSCluster routes
7777HTTPPrometheus metrics
8222HTTPMonitoring endpoint

See NATS Operations for key management and administration.

PropertyValue
URLmqtt.fzymgc.house:8883
Namespacemosquitto
Ingress TypeLoadBalancer (MetalLB)
Auth MethodUsername/password (mosquitto_passwd)
Password File/mosquitto/config/passwd (from mosquitto-auth)
PurposeMQTT broker for IoT and Home Assistant
TLSExternal on port 8883
Bridge TLSUses fzymgc-ica1-ca full chain bundle
StatusOperational
PropertyValue
URLpostgres.fzymgc.house
Namespacepostgres
Ingress TypeTraefik IngressRoute
Auth MethodPostgreSQL native (TLS + password)
Cluster Namemain
Instances3 replicas
Storage10Gi per instance (postgres-storage)
PostgreSQL Version18.1
StatusOperational

Purpose:

CloudNativePG is a Kubernetes operator for PostgreSQL. It manages the main PostgreSQL cluster that provides databases for multiple applications.

Databases:

DatabaseOwnerApplication
keycloakkeycloakKeycloak IdP
grafanagrafanaGrafana
mealiemealieMealie
octopusoctopusOctopus PR review
temporaltemporalTemporal (default store)
temporal_visibilitytemporalTemporal (visibility store)

Features:

  • Automatic failover with Raft consensus
  • Continuous backup to Longhorn snapshots
  • TLS encryption for all connections
  • WAL archiving via Barman Cloud plugin
  • 15-day retention policy for backups

Connection:

postgres://user:password@main-rw.postgres.svc.cluster.local:5432/database?sslmode=require

Connection pooling (Keycloak):

Keycloak connects through a CNPG Pooler (PgBouncer) instead of main-rw directly, so a primary switchover is absorbed by the pooler — Keycloak keeps its JDBC socket while PgBouncer reconnects server-side to the new primary — rather than collapsing Keycloak’s pool and dropping it out of Traefik rotation (mirrors the same failure mode originally documented against Authentik on 2026-06-16, before the decommission). Epic hl-1jn1; pairs with primaryUpdateMethod: switchover.

PropertyValue
Poolerkeycloak-pooler-rw (ns postgres)
Service DNSkeycloak-pooler-rw.postgres.svc.cluster.local:5432
Instances2 (HA)
Type / poolModerw / session
Authauto-provisioned (cnpg_pooler_pgbouncer role + user_search)
  • session pool mode is used (not transaction) because transaction pooling would break session-scoped state Keycloak relies on (advisory locks during startup Liquibase migrations, prepared statements via the Agroal/JDBC pool).
  • TLS: the client→pooler hop is TLS-required. PgBouncer otherwise serves clients plaintext by default, so the pooler sets client_tls_sslmode: require (encrypt only — not verify-ca/verify-full, which would force client-cert mTLS that Keycloak’s password auth does not do). The operator supplies the cluster server cert (postgres-main-server-tls, vault-issuer) for the pooler to present; its SAN covers only main-r/ro/rw, so clients cannot use sslmode=verify-full against the pooler DNS. Closing that gap (add the pooler DNS to the postgres-main-server cert SAN, then move both ends to verify-full) is tracked in hl-20ep.
  • CNPG does not auto-pause PgBouncer on switchover. For a planned switchover where zero connection errors are required, manually pause first: set spec.pgbouncer.paused: true on the Pooler (PgBouncer PAUSE), perform the switchover, then set it back to false.
  • Deliberately no conn_max_age / conn_health_checks: the session-mode pooler already pools and stabilizes the socket across a switchover, so ephemeral per-request connections recover on their own. App-side persistent connections (conn_max_age>0) double-pool and pin session slots — they crashlooped a previous co-tenant’s server via liveness timeouts (PR #1329, reverted #1330); avoid setting it for any pooled consumer of this cluster.
PropertyValue
URLInternal only
Namespacekube-system
Versionv1.4.1 (experimental CRDs)
PurposeKubernetes Gateway API resources
StatusOperational

Purpose:

Gateway API provides Kubernetes-native traffic routing resources. Currently deployed for experimental features and future traffic management capabilities.

Installed CRDs:

  • GatewayClass, Gateway, HTTPRoute
  • TCPRoute, UDPRoute, TLSRoute
  • ReferenceGrant, BackendTLSPolicy
PropertyValue
URLInternal only
Namespacegrafana-operator
PurposeKubernetes operator for Grafana resources
StatusOperational

Purpose:

Manages Grafana resources declaratively via Kubernetes CRDs:

  • GrafanaFolder - Dashboard organization
  • GrafanaDashboard - Dashboard definitions
  • GrafanaAlertRuleGroup - Alert rules
  • GrafanaDatasource - Data source configuration

Usage:

Applications define their Grafana resources in their app-configs directories, and the operator syncs them to the Grafana instance.

PropertyValue
URLInternal only
Namespacekube-system
Sourcemittwald/kubernetes-replicator
PurposeReplicate Secrets and ConfigMaps across namespaces
StatusOperational

Purpose:

Automatically replicates Secrets and ConfigMaps to multiple namespaces based on annotations.

Usage:

Add annotation to source Secret/ConfigMap:

replicator.v1.mittwald.de/replicate-to: "namespace-a,namespace-b"

Or use regex patterns:

replicator.v1.mittwald.de/replicate-to-matching: "app-.*"
PropertyValue
URLInternal only
Namespacekube-system
Replicas2
PurposeAuto-reload Deployments on ConfigMap/Secret changes
StatusOperational

Purpose:

Watches for changes in ConfigMaps and Secrets, then triggers rolling restarts of associated Deployments/StatefulSets/DaemonSets.

Usage:

Add annotation to Deployment:

reloader.stakater.com/auto: "true"

Or specify exact resources:

configmap.reloader.stakater.com/reload: "my-configmap"
secret.reloader.stakater.com/reload: "my-secret"
PropertyValue
URLInternal only
Namespacesystem-upgrade
Versionv0.18.0
PurposeAutomated k3s cluster upgrades
StatusOperational

Purpose:

Manages rolling upgrades of k3s server and agent nodes using Plan CRDs.

Upgrade Plans:

PlanTargetChannel
k3s-serverControl plane nodesstable
k3s-agentWorker nodesstable

Process:

  1. Plans check k3s release channel for new versions
  2. Server nodes upgrade first (one at a time)
  3. Agent nodes upgrade after servers complete
  4. Nodes are cordoned/drained during upgrade
PropertyValue
URLInternal only
Namespacevelero
PurposeKubernetes backup and disaster recovery
Vault Pathsecret/fzymgc-house/cluster/velero
StatusOperational

Purpose:

Backs up Kubernetes resources and persistent volumes for disaster recovery.

Backup Strategy:

Uses exclude-only approach - all namespaces backed up by default except infrastructure/stateless ones.

Schedules:

ScheduleFrequencyTTLDescription
daily-backupDaily 2 AM30 daysCore resources
weekly-full-backupSunday 3 AM90 daysExtended resources including NetworkPolicies

Excluded Namespaces:

  • Kubernetes core: kube-system, kube-node-lease, kube-public, default
  • Networking: traefik, metallb (Cilium runs in kube-system which is already excluded)
  • Operators: cert-manager, external-secrets, cnpg-system, grafana-operator
  • Ephemeral: arc-systems, arc-runners, system-upgrade
  • Telemetry: loki, cloudflared, vector, grafana-mcp
PropertyValue
URLInternal only
Namespaceprometheus
Ingress TypeNone
Auth MethodNone
PurposeMetrics storage (Prometheus-compatible)
StatusOperational
PropertyValue
URLInternal only
Namespaceloki
Ingress TypeNone
Auth MethodNone
PurposeLog aggregation
StatusOperational
PropertyValue
URLstatus.fzymgc.house
Namespaceuptime-kuma
Ingress TypeTraefik IngressRoute (status.fzymgc.house redirects to status.fzymgc.net)
Auth MethodCloudflare Access (status.fzymgc.net) — no group restriction, broadly accessible to cluster operators
Storage1Gi Longhorn PVC (SQLite)
StatusOperational

Purpose: External service uptime monitoring with status page capabilities.

Initial Monitors:

  • https://id.fzymgc.house - Keycloak
  • https://vault.fzymgc.house - Vault UI
  • https://grafana.fzymgc.house - Grafana

Planned Enhancement: Terraform-managed monitors via breml/uptimekuma provider (see selfhosted-cluster-ucb).

PropertyValue
URLhubble.fzymgc.house
Namespacehubble (ingress); upstream service in kube-system
Ingress TypeTraefik IngressRoute (cross-namespace service ref to hubble-ui.kube-system.svc:80)
Auth MethodForwardAuth (shared oauth2-proxy, Keycloak-backed), group hubble-users (ADR hl-1fia)
StorageNone (read-only flow visualization from hubble-relay)
StatusOperational

Purpose: Cilium network flow observability dashboard. Visualizes live pod-to-pod traffic, filters by namespace/verdict/L7 attributes, and renders a service-map graph. Used during CiliumNetworkPolicy rollouts to verify intended flows are permitted and unintended flows are dropped.

Operator runbook: docs/operations/hubble-ui.md.

PropertyValue
URLhyperdx.fzymgc.house
Namespaceclickstack
Ingress TypeTraefik IngressRoute
Auth MethodOIDC (Keycloak)
Vault Pathsecret/fzymgc-house/cluster/clickstack
OTel Endpoint192.168.20.149:4317 (MetalLB, TLS + bearer token)
StatusEvaluation (parallel-run with Loki)

Purpose: ClickStack UI providing logs, metrics, and traces in a unified observability interface. Evaluation period compares against Loki + Grafana stack. See docs/operations/clickstack-comparison.md for the evaluation scorecard.

PropertyValue
URLInternal only
Namespaceclickstack-operators
Chartclickhouse.github.io/ClickStack-helm-charts/clickstack-operators 1.0.0
PurposeMongoDB and ClickHouse operators for the ClickStack observability stack
StatusOperational

Purpose: Bundles the MongoDB Community Operator and the ClickHouse operator (Altinity). Deployed in clickstack-operators, configured to reconcile CRs in the clickstack namespace. Required before the clickstack ArgoCD app.

PropertyValue
URLInternal only
Namespacevector
Charthelm.vector.dev/vector 0.52.0 (app 0.55.0-distroless-libc)
ControllerDaemonSet (role: Agent)
PurposeShip pod logs directly to ClickHouse (otel_logs)
StatusOperational

Purpose: Cluster-wide log shipper. Runs as a DaemonSet (tolerates control-plane taint) reading pod logs from the Kubernetes API and writing directly to ClickHouse (otelcollector user), bypassing the OTel Collector. Part of the ClickStack observability pipeline. Config via argocd/app-configs/monitoring-vector/.

PropertyValue
URLInternal only
Namespaceotel-scraper
Chartopen-telemetry.github.io/opentelemetry-helm-charts/opentelemetry-collector 0.154.0
ControllersDeployment (static Prometheus scrape) + DaemonSet (host metrics per node)
Vault Pathsecret/fzymgc-house/cluster/clickstack (otel_ingest_api_key)
PurposeScrape cluster metrics and node metrics, forward to ClickStack via OTLP
StatusOperational

Purpose: Two OpenTelemetry collector deployments — otel-scrape (Deployment: scrapes ~20 in-cluster Prometheus targets + k8scluster receiver) and otel-node (DaemonSet: hostmetrics + kubeletstats per node). Both export OTLP/gRPC to cs-otel-collector.clickstack.svc.cluster.local:4317. See docs/operations/clickstack.md for token rotation.

PropertyValue
URLInternal only
Namespacehcp-terraform
Charthelm.releases.hashicorp.com/hcp-terraform-operator 2.11.0
PurposeTerraform Cloud workspace management via Workspace CRDs
StatusOperational

Purpose: Watches Workspace CRDs in the cluster and drives HCP Terraform to plan/apply the corresponding workspaces. Credentials sourced from Vault via ESO. See docs/operations/hcp-terraform.md.

PropertyValue
URLInternal only
Controller Namespacearc-systems
Runners Namespacearc-runners
Chartghcr.io/actions/actions-runner-controller-charts/gha-runner-scale-set-controller 0.14.1
PurposeGitHub Actions self-hosted runners (autoscaling scale sets)
StatusOperational

Purpose: Actions Runner Controller (ARC) deploys autoscaling GitHub Actions runner scale sets. The controller (arc-systems) manages runner pods in arc-runners. Scale-set registration token from arc-runners ExternalSecret.

ServicePurposeManagement
CloudflareDNS, Tunnels, WAFTerraform (tf/cloudflare)
HCP TerraformInfrastructure automationWeb UI
GitHubSource control, ActionsWeb UI
Let’s EncryptTLS certificatescert-manager
MethodDescriptionConfiguration
OIDCDirect OpenID Connect authenticationKeycloak client integration
Forward-AuthTraefik middleware proxies auth to the shared oauth2-proxy (Keycloak-backed)forwardAuth middleware
CertificatemTLS client certificateVault PKI integration
NoneNo authentication requiredInternal services only
TypeDescriptionTLS Handling
Traefik IngressRouteNative Traefik CRDTraefik terminates TLS
TCP PassthroughRaw TCP proxyBackend terminates TLS
Helm ManagedIngress defined in Helm valuesVaries by chart
Cloudflare TunnelExternal via cloudflaredCloudflare terminates
kube-vip VIPDirect LoadBalancer IPService handles TLS
  1. Create Kubernetes manifests in argocd/app-configs/<service>/
  2. Configure ingress (IngressRoute or Ingress resource)
  3. Set up authentication:
    • OIDC: Create a Keycloak client (tf/keycloak/)
    • Forward-Auth: Add a route to the shared oauth2-proxy middleware (with a ?allowed_groups=<app>-users gate) — see ADR hl-1fia
  4. Add secrets to Vault if needed
  5. Create ExternalSecret for Kubernetes secret sync
  6. Update this catalog