Good:
- No WAN admin exposure; remote access via Tailscale only
- Most LXCs unprivileged; Docker inside unprivileged LXC is the default pattern
- Authentik (2026.5.3) deployed as IdP; NPM forward-auth outposts observed on at least two proxy hosts
- MQTT requires authentication (no anonymous)
- qBittorrent traffic forced through Mullvad via gluetun network namespace
- Frigate UI (8971) is the authenticated/TLS port; unauthenticated 5000 is not exposed
Gaps (details in Audit Findings):
- Proxmox firewall:
firewall=1 set on most guest NICs but zero rules defined — it does nothing today
- Heavy reuse of one standard password across OS logins, DBs, apps, cameras
- Secrets in plaintext docker-compose files (Ghost, Karakeep, OpenProject, gluetun) instead of
.env (Authentik/Storj do it right)
- Privileged LXCs: Immich (107), Arr-Stack (110), Frigate (115, plus privileged docker container inside)
- Ollama API on .208:11434 has no authentication (LAN-open)
- Automatic security updates only on Wiki.js LXC + Jellyfin VM; nowhere else
- Cameras on the same L2 as everything else (VLAN Plan)
- Unprivileged LXC; nesting only if Docker needed
- Secrets in
.env (mode 600), never inline in compose
- Unique generated secrets (
openssl rand -base64 24) — never the standard password
unattended-upgrades installed and active
- No new WAN exposure without NPM + Authentik in front
- Add to Uptime Kuma + document in wiki on deploy day