Commit graph

332 commits

Author SHA1 Message Date
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
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
16a5194085 Document persistent NFS mounts for all six UNAS Pro shares and point DOCKERSTORAGEDIR at arr_data
- Add docs/unas/nfs-mounts.md: step-by-step guide covering the UUID-based
  volume path structure, enabling NFS per share in UniFi Drive 4.3.6,
  fstab entries for all six shares, per-LXC bind mount commands, and
  PBS datastore setup for pbs_backup
- Update DOCKERSTORAGEDIR in .env.sample to /mnt/unas/arr_data (was the
  generic /mnt/storage placeholder)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 11:51:15 +02:00
Brian Pooe
99c4ec1ca2 Document U-NAS in-pool reflink moves 2026-06-18 21:44:23 +02:00
199ad26c06
Merge pull request #23 from brianpooe/codex-strict-substitution-doc-fixes
Harden strict substitution workflow
2026-06-17 22:16:53 +02:00
Brian Pooe
b67c32c2e9 Harden strict substitution workflow 2026-06-17 22:15:54 +02:00
Brian Pooe
7bbee7bf60 Harden substitute_env.sh: strict variable lookup and fail on missing placeholders 2026-06-17 21:48:21 +02:00
Brian Pooe
ff40d8439d Implement targeted environment validation during deployment 2026-06-17 21:46:40 +02:00
Brian Pooe
cda999c497 Refactor environment management into modular, stack-specific files 2026-06-17 21:42:48 +02:00
Brian Pooe
76ee58c694 Add zero-downtime reload-caddy target to Makefile 2026-06-17 21:34:51 +02:00
Brian Pooe
f211fe3ee6 Enhance Makefile for consistent graceful updates 2026-06-17 19:03:14 +02:00
Brian Pooe
c13af8f98f Add Makefile and unify stack management 2026-06-17 18:57:05 +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