Files
home-network-k3s/decisions/adr-0007-secrets-sops-age.md
T
jakman85andClaude Opus 4.8 e8c555cfeb Initial baseline: home platform (k3s + Longhorn) specification repository
Greenfield spec set for a GitOps-driven PaaS+IaaS home platform: vision &
requirements (R-* IDs), architecture, 14 domain specs, 11 ADRs, roadmap
(phases + workstreams), and AI-agent coordination (roles, protocol,
definition-of-done, task board).

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

32 lines
1.7 KiB
Markdown

# ADR-0007 — Secrets: SOPS + age
- Status: Accepted
- Date: 2026-08-15
- Serves: R-SEC-01, R-GITOPS-01
- Supersedes: —
## Context
Secrets (VPN keys, DNS API token, SMTP creds, service passwords, backup-target creds) must live in
git for GitOps but MUST NOT be plaintext. The engine is Flux (ADR-0004), which decrypts SOPS
natively.
## Decision
Encrypt secrets in git with **SOPS** using **age** recipients; **Flux decrypts in-cluster** at
reconciliation via an age private key bootstrapped as a Kubernetes Secret. Plaintext secrets never
enter git or logs. Secret rotation = re-encrypt + commit; Flux rolls it out (restart triggered by
checksum annotation where needed).
## Alternatives considered
- **Sealed Secrets (Bitnami)** — solid; one-way encryption to a cluster key. SOPS chosen for native
Flux integration, multi-recipient/age simplicity, and readable, reviewable encrypted diffs.
- **External Secrets Operator + external vault (Vault/cloud SM)** — stronger for large orgs but adds
an external dependency and operational weight not justified for a single-operator home platform.
May be revisited via superseding ADR if a real external secret store is introduced.
- **Plaintext + private repo** — rejected outright (R-SEC-01).
## Consequences
- Secrets are versioned, encrypted, and reconciled with the rest of GitOps state.
- The **age private key bootstrap** is a sanctioned out-of-band step (documented; one of the few
non-GitOps actions, [07](../docs/07-security-and-secrets.md)).
- Key custody/rotation for the age key itself must be documented; losing it blocks decryption.
- No secret material may appear in agent output, PRs, or logs ([AGENTS.md §5](../AGENTS.md)).