Commit graph

137 commits

Author SHA1 Message Date
Hermes Agent
c480da26de feat(homeassistant): schedule brian lamp 2026-07-07 17:11:54 +02:00
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
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
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
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
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
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
34da2eb196 Document deployment lessons from arr-stack LXC build
Four issues encountered during the arr-stack LXC 101 deployment that were not
covered or not clear enough in existing docs:

PROXMOX-NVIDIA-LXC.md — expanded Section 4 into four explicit sub-steps:
  4a: copy installer into LXC via pct push (it lives on the Proxmox host)
  4b: install userspace libs with --no-kernel-module then run ldconfig
  4c: install Container Toolkit (must come after libs, not before)
  4d: switch runtime mode auto→legacy with clear explanation of why CDI fails
      in an LXC even after the libraries are installed

TROUBLESHOOTING.md — new section 5c for the stale gluetun namespace error:
  "joining network namespace of container: No such container"
  Cause: gluetun recreated with new container ID, qbittorrent holds old ID
  Fix: docker rm -f qbittorrent && docker compose up -d qbittorrent
  Renumbered old 5c (HTTPS 502) to 5d

arr-stack README.md — AirVPN preshared key warning in the Installation section:
  AirVPN generates per-server preshared keys; the built-in airvpn provider
  selects a server dynamically so the key never matches → silent VPN failure.
  Documents when and how to use VPN_SERVICE_PROVIDER=custom with a pinned server.

DEPLOYMENT.md — two new sections:
  Section 9: Set a Static IP — via Proxmox .conf net0 line, not inside the LXC
  Section 10: Rename a Container (VMID change) — lvrename + conf file swap

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 15:44:30 +02:00
Brian Pooe
adf98ff727 Move arr-stack from Synology (10.0.10.24) to LXC 101 (10.0.10.20)
Update all media stack reverse proxy upstreams from .24 to .20 and rename
the section header from "Synology Media Stack" to "Arr Stack (LXC 101, 10.0.10.20)".

On the Caddy host: git pull, re-render Caddyfile, validate, and reload:
  ./substitute_env.sh docker-compose-files/caddy/Caddyfile_template docker-compose-files/caddy/Caddyfile .env
  chmod 644 docker-compose-files/caddy/Caddyfile
  docker compose -f docker-compose.caddy.yml exec caddy caddy validate --config /etc/caddy/Caddyfile
  docker compose -f docker-compose.caddy.yml exec caddy caddy reload --config /etc/caddy/Caddyfile

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 15:39:07 +02:00
Brian Pooe
8b546ac123 Support Gluetun custom provider and document NVIDIA legacy mode for LXC
- Add optional WIREGUARD_PUBLIC_KEY, WIREGUARD_ENDPOINT_IP, WIREGUARD_ENDPOINT_PORT
  to gluetun template so custom provider renders cleanly without manual patching
- Make SERVER_COUNTRIES optional (:-) so re-renders don't fail for custom provider
- Document the required mode = "legacy" change in /etc/nvidia-container-runtime/config.toml
  for NVIDIA Container Toolkit in a privileged LXC; the default "auto" CDI mode fails
  until userspace libraries are installed and the mode is explicitly set to legacy

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 15:20:54 +02:00
Brian Pooe
e02f79092f Fix arr-stack docs for real-world UNAS NFSv3 constraints
Correct DEPLOYMENT.md fstab entry (vers=3, UUID path, 10.0.10.25) and
add No Root Squash requirement note to the chown step. Fix arr-stack
README to document host-side chown from a privileged LXC instead of
the incorrect unprivileged-LXC warning. Also carries forward nfs-mounts.md
from the previous session.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 14:23:25 +02:00
Brian Pooe
b67c32c2e9 Harden strict substitution workflow 2026-06-17 22:15:54 +02:00
Brian Pooe
78f42fc7ca Remove Node-RED stack and associated configurations 2026-06-17 18:42:57 +02:00
Brian Pooe
fc2d5b24ca Standardize UNAS share naming to underscores (arr_data) 2026-06-16 18:08:58 +02:00
Brian Pooe
7dd49a94ab Streamline documentation for privileged LXC and GPU support 2026-06-16 18:01:02 +02:00
Brian Pooe
2bedd9f7b2 Update Immich data share naming to immich_data 2026-06-16 17:52:03 +02:00
Brian Pooe
fccb2220ad Update Immich configuration for dedicated UNAS share 2026-06-16 17:51:19 +02:00
Brian Pooe
b972e3fe07 Add Immich template with NVIDIA GPU acceleration support 2026-06-16 17:48:36 +02:00
Brian Pooe
a8c22c8267 Integrate NVIDIA GPU passthrough for Proxmox 9 and arr-stack 2026-06-16 17:15:53 +02:00
Brian Pooe
396df066d4 Document Recyclarr bootstrap sequence 2026-06-15 22:16:56 +02:00
Brian Pooe
b0730b342f Align Arr Stack storage with TRaSH Guides 2026-06-15 22:12:17 +02:00