Files
home-network-k3s/decisions
jakman85andClaude Opus 4.8 a2cbdf656d Resolve OQ-1/2/3, refine OQ-4: single ExpressVPN gateway, single WAN, external media
Operator answers folded into the specs:
- OQ-3 VPN: ExpressVPN, cluster-controlled SINGLE shared in-cluster tunnel
  (OpenVPN UDP / non-TCP), rules enforced outside the service. New ADR-0012
  supersedes ADR-0008 (Gluetun-sidecar default dropped). Central kill-switch.
- OQ-1 WAN/edge: one commercial WAN, no multi-ISP plans; dumb SOHO edge (no
  VLAN/VPN/services). Multi-WAN out of scope; segmentation + VPN in-cluster;
  edge = NAT + manual port-forward. Gateway VIP resolved to Cilium L2
  announcement. T-3.3 marked won't-do.
- OQ-2 storage: bulk media lives outside the cluster (backing TBD, non-blocking)
  via a 'bulk' external-mount indirection; Plex metadata DB stays on Longhorn.
  Split out a separate OQ-BKP for the off-cluster DR backup target (Phase 4).
- OQ-4 refined: wildcard record covers reachability but NOT ACME DNS-01 (needs
  TXT-write access) and does not match *.home.* depth. Still OPEN: Cloudflare
  API token (Option A) vs acme-dns delegation (Option B). T-2.4/T-2.5 blocked.

Updated: docs 00,01,03,04,08,09; ADR-0008/0012 + index; task board.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-08-15 23:00:11 -05:00
..

Architecture Decision Records (ADRs)

ADRs are an append-only ledger of the significant technology and pattern choices for this platform. Each records the context, the decision, the rejected alternatives, and the requirements it serves. Do not edit an accepted decision in place — supersede it with a new ADR.

ADRs are specifications and are immutable to AI agents (R-TEST-06). Agents may draft a proposed ADR and escalate it, but only the human operator/architect approves/accepts or edits ADRs. See ../AGENTS.md §3 and §11.

Process (read before proposing a change)

  1. To change a decision, create a new ADR with the next number and set Status: Proposed, Supersedes: ADR-XXXX. (Agents draft + escalate; the human approves.)
  2. State what new information invalidates the old decision.
  3. On approval, set the new ADR Accepted and the old one Superseded by: ADR-YYYY.
  4. Never silently re-interpret an accepted ADR (see ../AGENTS.md §3).

Template

# ADR-XXXX — <title>
- Status: Proposed | Accepted | Superseded by ADR-YYYY
- Date: <YYYY-MM-DD>
- Serves: <requirement IDs, e.g. R-NET-01, R-NET-06>
- Supersedes: <ADR-ZZZZ or —>

## Context
<forces, constraints, why a decision is needed>

## Decision
<what we chose, stated decisively>

## Alternatives considered
<options and why rejected>

## Consequences
<positive, negative, follow-ups, risks>

Index

ADR Title Status Serves
0001 Kubernetes distribution: k3s Accepted R-PLAT-01
0002 CNI & network policy & ingress: Cilium + Gateway API Accepted R-NET-01..07, R-DNS-01
0003 Distributed storage: Longhorn (+ bulk tier, Velero) Accepted R-STATE-01..04
0004 GitOps engine: Flux CD Accepted R-GITOPS-01..03
0005 VM workloads: KubeVirt + CDI Accepted R-PLAT-03
0006 TLS: cert-manager + Let's Encrypt (DNS-01) Accepted R-TLS-01..03
0007 Secrets: SOPS + age Accepted R-SEC-01
0008 VPN egress model: Gluetun sidecar + Cilium Egress Gateway Superseded by 0012 R-NET-05/06
0009 Automated updates: Flux image automation + Renovate Accepted R-UPD-01..03
0010 Conformance testing: automated, reproducible, behavior-based Accepted R-TEST-01..06
0011 Conformance test tooling: Kyverno + Chainsaw Accepted R-TEST-01..05
0012 VPN egress: single shared in-cluster ExpressVPN gateway Accepted R-NET-05/06/07