Commit graph

299 commits

Author SHA1 Message Date
Hermes Agent
269ee5106a fix(homeassistant): remove kids lamps group 2026-07-07 16:42:02 +02:00
Hermes Agent
1385194cc1 fix(homeassistant): reset lamps before turning off 2026-07-07 15:07:40 +02:00
Brian Pooe
3a314b16d6 feat: add Koffan, Rackula, and SnapOtter stacks; expose Hermes dashboard
- new compose templates + READMEs for the three LXC apps (110-112)
- Makefile deploy targets (rackula pre-owns its data dir for uid 1001)
- Caddy vhosts for all four, incl. Hermes /auth/login redirect workaround
- firewall docs: CADDY->TRUSTED rules for LXCs 110-113
2026-07-06 20:50:34 +02:00
Brian Pooe
c8d43957c1 docs(network): add IT-Tools to public SSO exposure, note host-derived redirect 2026-07-06 19:41:03 +02:00
Brian Pooe
d8f549714e docs(network): document public app exposure with Zitadel SSO via VPS 2026-07-06 19:33:40 +02:00
Brian Pooe
110d17f59f fix(gramps-web): correct container paths in config template and gate OIDC
The official grampsweb image works under /app, not /opt/gramps-web —
media/index/cache paths pointed at unmounted directories. OIDC is now
opt-in via GRAMPS_OIDC_ENABLED and all optional placeholders have
defaults so rendering works without an OIDC/email config.
2026-07-03 19:02:17 +02:00
Brian Pooe
cc6cdebba2 fix(paperless-ngx): keep SQLite database and index on local disk
Only media/consume/export/trash stay on the UNAS share; SQLite over
NFS risks lock contention and corruption.
2026-07-03 18:38:50 +02:00
Brian Pooe
d20500c5be feat(beszel-hub): support SSO-only login via OIDC with PKCE
Add DISABLE_PASSWORD_AUTH and USER_CREATION env toggles and document
the Zitadel PKCE provider setup.
2026-07-03 18:31:11 +02:00
Brian Pooe
5f1e762e03 docs(network): add Caddy firewall rules for the four new LXC apps
Drop the removed Drawio rule from the audit doc and fix the Gramps
upstream port to 80.
2026-07-03 18:17:46 +02:00
Brian Pooe
4eb6d6ee04 feat(paperless-ngx): store documents on the UNAS paperless_data share
Bind data/media/consume/export/trash from PAPERLESS_DATA_ROOT with
create_host_path: false so the stack refuses to start when the NFS
share is not mounted. Wire PAPERLESS_TRASH_DIR.
2026-07-03 18:11:49 +02:00
Brian Pooe
ab6c2b7b54 feat(vaultwarden): add deploy-vaultwarden Makefile target 2026-07-03 17:48:19 +02:00
Brian Pooe
1815beadf4 refactor: restructure docs, sync stacks with Caddyfile, harden compose templates
- Add compose stacks for apps already proxied by Caddy: bento-pdf,
  it-tools, paperless-ngx, and beszel-hub (with Makefile targets)
- Remove the unused Vault stack and the drawio Caddyfile block
- Fix Caddyfile gramps upstream to port 80 to match the compose file
- Bring immich and gramps-web up to the shared template pattern
  (no-new-privileges, log rotation, memory limits, healthchecks)
- Single-quote vaultwarden SSO_AUDIENCE_TRUSTED so regex values like
  ^\d{18}$ render as valid YAML
- Move root docs into kebab-case topic folders, rebuild the docs index
  to cover every doc, and fix all broken links
2026-07-03 17:45:16 +02:00
Brian Pooe
f5a1c53713 chore: track .env.sample files for all stacks
Now that .gitignore allows docker-compose-files/**/.env.sample, add the
existing sample files that were previously untracked.
2026-07-02 22:28:44 +02:00
Brian Pooe
da5652aa10 feat(vaultwarden): add SSO/OIDC support with Zitadel documentation
- Add SSO environment variables to template.yaml (SSO_ENABLED, SSO_ONLY,
  SSO_AUTHORITY, SSO_CLIENT_ID, SSO_CLIENT_SECRET, SSO_SCOPES, SSO_PKCE,
  SSO_AUDIENCE_TRUSTED)
- Add SSO variables to .env.sample with Zitadel audience quirk explained
- Document full Zitadel setup in README: app creation, redirect URI, OIDC
  settings, and the audience fix (SSO_AUDIENCE_TRUSTED=^\d{18}$)
- Update .gitignore to track .env.sample files in docker-compose-files
2026-07-02 22:25:15 +02:00
Brian Pooe
206d83235d fix(caddy): restore vaultwarden hostname and Physical/static devices comment 2026-07-02 18:55:04 +02:00
Brian Pooe
2f2b3a6c6f feat(caddy,vaultwarden): add vaultwarden stack and reorganise Caddyfile by VLAN
- Add docker-compose-files/vaultwarden/ with template.yaml, .env.sample,
  and README (LXC assigned 10.0.10.16, port 8800)
- Reorganise Caddyfile site blocks into VLAN 1 / VLAN 10 / VLAN 30 sections
  matching the TRUSTED / IoT zone layout from docs/network/firewall-rules.md
- Sort VLAN 10 entries by IP; split into physical devices vs LXC Apps sub-sections
- Move zigbee from LAN section to VLAN 30 where it actually lives (10.0.30.5)
2026-07-02 18:53:25 +02:00
Brian Pooe
ab77ce7057 fix(homeassistant): target bulbs individually to fix hloni missing commands
Replaced light.kids_lambs group entity with explicit list of mpho_lamb
and hloni_lamb in sunset and 20:30 automations. Group multicast was
causing hloni to silently miss Zigbee commands; unicast to each bulb
individually ensures reliable delivery.
2026-06-30 21:45:55 +02:00
Brian Pooe
b123c57c4f feat(homeassistant): add 3-retry logic to all kids_lambs automations
Each automation now retries the command 3 times with a 1-minute gap to
handle transient Zigbee timeouts (e.g. hloni_lamb missing sunset trigger).
2026-06-29 18:59:39 +02:00
Brian Pooe
9287b93e90 feat(homeassistant): reduce mpho night light from 10% to 5% at 02:00 2026-06-28 18:18:53 +02:00
Brian Pooe
1164a79d46 fix(homeassistant): replace color_temp mireds with color_temp_kelvin
HA 2026 rejects color_temp (mireds) via the service API with 400 Bad
Request, silently breaking automation actions. Switch all color
parameters to color_temp_kelvin: 6500 (cool white) and 2200 (warm white).
2026-06-28 18:14:52 +02:00
Brian Pooe
5b347f8fbb feat(homeassistant): drive kids_lambs on purely by sunset
Removes the fixed 18:00 fallback trigger — lights now come on at actual
sunset year-round via the sun platform.
2026-06-28 18:05:46 +02:00
Brian Pooe
6a2af1c91e feat(homeassistant): add mpho night-light dim and switch to sunrise off
Dims mpho_lamb to 10% warm at 02:00 as a night light, and replaces the
fixed 06:00 off trigger with a sun sunrise event so the light goes off
at actual daybreak year-round.
2026-06-28 18:02:57 +02:00
Brian Pooe
8081e0c753 feat(homeassistant): add kids_lambs light group and daily automations
Creates a light group combining mpho_lamb and hloni_lamb, and sets up
four daily automations: on at sunset/18:00 (full cool white), warm dim
at 20:30, hloni off at 22:00, mpho off at 06:00 — all with fade transitions.
setup-homeassistant.sh now deploys automations.yaml alongside configuration.yaml.
2026-06-28 17:59:26 +02:00
Brian Pooe
e2f62deb2d Document Youtarr SMB storage mount 2026-06-28 13:40:08 +02:00
Brian Pooe
cdd4874bf1 Document and proxy Youtarr deployment 2026-06-28 11:59:59 +02:00
Brian Pooe
0fca695aa4 Add Youtarr stack and document PhotoSync storage 2026-06-28 11:47:24 +02:00
Brian Pooe
d59814c8fe fix(homeassistant): harden blueprint for fresh installs and public repo safety
- Add SLZB06_HOST and CADDY_HOST_IP stubs to root .env.sample so cp -n covers all required vars
- Remove dead :-10.0.15.5 default from ha_configuration.yaml (CADDY_HOST_IP is required; default was unreachable)
- Genericise CADDY_HOST_IP comment in ha_configuration.yaml (removed hardcoded personal IP)
- Default zigbee2mqtt pan_id and network_key to GENERATE (remove personal network credentials from public blueprint)
- Remove hardcoded device list from zigbee2mqtt_configuration.yaml (Z2M builds this on pairing)
- Clarify README installation steps: root .env path, missing-var behaviour for SLZB06_HOST and CADDY_HOST_IP
2026-06-27 17:38:04 +02:00
Brian Pooe
86cfe2aecc docs(immich): add phone-to-NAS mobile sync guide and wire mobile_photos share
Documents the FolderSync/PhotoSync → UNAS Pro → Immich external library
pattern as the workaround for immich-app/immich#4282 (deleted photos
re-uploading on next mobile sync). Includes all steps: UNAS share creation,
Proxmox NFS mount, LXC bind mount, docker-compose volume, Immich library
import path update, and per-app config for Android (FolderSync) and iOS
(PhotoSync).

- Adds docs/immich/mobile-sync.md with full step-by-step guide
- Adds mobile_photos to share map in docs/unas/nfs-mounts.md
- Adds IMMICH_MOBILE_SYNC_DIR volume (/mnt/mobile:ro) to template.yaml
- Documents IMMICH_MOBILE_SYNC_DIR in README.md and .env.sample
2026-06-27 15:31:08 +02:00
Brian Pooe
eb3c0a0f00 feat(immich): switch to NVENC for transcoding and CUDA for ML inference
- immich-server: add runtime: nvidia + NVIDIA_DRIVER_CAPABILITIES=video,
  compute,utility to enable NVENC hardware H.264 transcoding
- immich-machine-learning: change image tag to :release-cuda so
  CUDAExecutionProvider is selected over CPUExecutionProvider for CLIP,
  face detection, and OCR
- Update GPU Verification section in README with verification commands
  and note on resetting QSV → NVENC in the admin UI
2026-06-27 12:31:30 +02:00
Brian Pooe
11935bd02a docs(immich): document OIDC-only login, external library setup, and firewall rule
- Adds OIDC disable-password-login workflow to README (enforce SSO after
  confirming Zitadel PKCE works; clarifies client secret is not needed)
- Expands external library section with user UUID lookup and warning about
  Immich blocking paths under the upload volume
- Adds Allow Caddy to Immich rule (10.0.15.5 → 10.0.10.15:2283) to
  firewall-rules.md
2026-06-27 12:18:12 +02:00
Brian Pooe
2fa6de1d4c feat(immich): add external library volume mount for NAS photo recovery
Adds IMMICH_EXTERNAL_LIBRARY volume (mounted read-only at /mnt/external
in the container) so existing photos stored outside the upload folder
can be imported as an external library without triggering Immich's
upload-folder restriction.

Documents the API-based external library creation workflow in README.
2026-06-27 12:10:25 +02:00
Brian Pooe
ac6726c880 fix(immich): fix duplicate reservations key in machine-learning deploy block 2026-06-27 11:18:40 +02:00
Brian Pooe
6099da80f8 fix(immich): add DISABLE_PASSWORD_LOGIN, fix OIDC_AUTO_REDIRECT default, document PKCE 2026-06-27 11:17:22 +02:00
Brian Pooe
c1403bf9b3 fix(immich): align template and docs with official install guide
- Fix upload container path: /usr/src/app/upload -> /data
- Update Redis image: redis:6.2-alpine -> valkey/valkey:9
- Update DB image: tensorchord/pgvecto-rs -> ghcr.io/immich-app/postgres vectorchord
- Fix DB_HOSTNAME: immich-postgres -> database (Docker service name)
- Fix REDIS_HOSTNAME: immich-redis -> redis (Docker service name)
- Replace DOCKERCONFDIR with dedicated IMMICH_DATA_DIR variable
2026-06-27 11:08:09 +02:00
Brian Pooe
f2466096f1 docs(immich): remove arr-stack references, use /opt/immich/appdata paths 2026-06-27 11:00:54 +02:00
Brian Pooe
02a02498fb docs(network): add Synology NAS and IoT intra-zone firewall rules
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 18:23:28 +02:00
Brian Pooe
d8c31a29c5 docs(arr-stack): document qBittorrent warning fix, TBA import block, and Prowlarr indexer setup
Adds three new troubleshooting sections:
- 5k: qBittorrent ShareLimitAction=Remove warning — config file edit required
  (hotio image API does not persist max_ratio_act to disk)
- 5l: Sonarr TBA title import block — episodeTitleRequired bulkSeasonReleases fix
  and manual rename procedure via pct exec + RescanSeries
- 5m: Prowlarr indexer recommendations — usenet retention gaps, public torrent
  fallback indexers (EZTV, 1337x, Knaben, TPB), FlareSolverr requirement for
  Cloudflare-protected indexers, and priority ordering

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-22 15:15:20 +02:00
Brian Pooe
3554f11f9c docs(network): replace rack layout ASCII with Mermaid, drop zones migration doc
Updated rack order reflects current hardware (UDM Pro SE in place, dual Pi 4B shelf,
USW-Lite moved to shelf 9). Removed udm-pro-zones-migration.md — migration complete.
README links updated to point to firewall-rules.md instead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-21 22:32:39 +02:00
Brian Pooe
781b75d7ac docs(network): update firewall policies with verified custom rules, return traffic states, and seerr ports 2026-06-21 22:10:53 +02:00
Brian Pooe
bba03c675a Fix arr-stack OOM kills and decluttarr auth for 25 GB downloads
- qbittorrent memory limit 1G → 3G: piece-verification buffers for 25 GB+
  torrents exceed 1G and trigger cgroup OOM kill mid-download
- bazarr, prowlarr, seerr limits 512M → 1G: all three were at 40-67% at
  idle with insufficient headroom for subtitle batch events, RSS floods,
  and Emby library syncs respectively
- Add *media-data-mount and storage-guard dependency to decluttarr so
  detect_deletions can access /data/media paths
- Fix decluttarr auth ban loop: add Docker bridge 172.18.0.0/16 to
  qBittorrent WebUI auth subnet whitelist (applied live via API)
- Update README mount table (Decluttarr now gets /data/media), memory
  limit table with per-service rationale sized for 25 GB average files
- Add TROUBLESHOOTING sections 5e-5j covering qBittorrent path issues,
  OOM kill pattern, and decluttarr auth ban loop with fixes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-21 17:52:19 +02:00
Brian Pooe
de3a23c990 Add NVIDIA device init to LXC boot dependency doc
nvidia-smi must run before LXC 101 starts to create /dev/nvidia0 and
/dev/nvidia-caps/*. Without it emby fails with nvml insufficient
permissions even though kernel modules are loaded. Documents the
nvidia-init.service and the updated LXC 101 drop-in that requires both
NFS and NVIDIA to be ready before the container starts.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-21 12:04:48 +02:00
Brian Pooe
2e7ce470b5 Document NFS LXC boot dependency fix for UNAS-backed containers
arr-stack (LXC 101) failed to start on boot because the UNAS NFS mount
was not ready when the Proxmox pre-start hook ran. Documents the root
cause, the global fstab timeout fix, and the per-container systemd
drop-in pattern with a checklist for future containers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-21 11:58:25 +02:00
Brian Pooe
b75a82a979 Correct intra-zone rule advice — keep TRUSTED and IoT Any rules
Removing Allow TRUSTED to TRUSTED Any broke SSH to Technitium,
proving UniFi custom zones do not get the default intra-zone allow.
Mark both intra-zone rules as required, not redundant.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-21 11:44:21 +02:00
Brian Pooe
d52245f5c6 Add immediate cleanup section to Caddy firewall policy doc
Redundant rules to delete (TRUSTED to TRUSTED, IoT to IoT, CADDY to
Gateway DNS), the FAMILY to CADDY action fix, and a review table for
the direct Emby pinholes that bypass Caddy.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 22:46:37 +02:00
Brian Pooe
3029d2ef66 Add Caddy firewall policy audit doc
Documents the missing and incorrect UniFi policies found during zone
policy review: FAMILY to CADDY action fix, all CADDY to TRUSTED backend
app policies, CADDY to IoT policies, and public DNS block policies per
zone.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 22:42:15 +02:00
Brian Pooe
230e3808bb Rename DMZ zone to CADDY throughout network docs
Reflects the actual deployed zone name in UniFi. Preserves the one
reference to UniFi's built-in DMZ zone in the defaults list (§4).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 22:31:45 +02:00
Brian Pooe
4db6fdc36b Fix WebSocket for UDM and UNAS by stripping Origin header
UniFi devices validate the Origin header on WebSocket upgrades and reject
connections where it doesn't match their own hostname, causing real-time
dashboard stats to show N/A. Add unifi-upstream snippet that strips Origin
before forwarding, and apply it to both udm and unas proxy blocks.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 22:15:22 +02:00
Brian Pooe
c4b6fd0783 Add UDM Pro SE and UNAS Pro to Caddyfile
Both use self-signed TLS backends so they get the office-admin-upstream
snippet (tls_insecure_skip_verify). Update firewall backend policy table
in network docs to match.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 21:43:01 +02:00
Brian Pooe
59f41d8964 Update Caddyfile: switchlite8poe IP, remove tplink16de and speedtest
- switchlite8poe moved to 10.0.1.6
- tplink16de removed (device no longer exists)
- speedtest removed (no longer needed)
- Update firewall backend policy table in network docs to match

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 21:37:32 +02:00
Brian Pooe
7a5e3d562e Document UFW rule ordering requirement for Caddy host hardening
Explicit ufw deny 22/tcp is dangerous — if run before the targeted
allows it lands at the top of the list and locks out SSH. Replace with
default deny incoming policy, consolidate all UFW commands into a single
ordered sequence, and add verification steps and a note explaining why
order matters.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 21:28:54 +02:00