feat: Frigate NVR with Coral TPU and tiered gold storage #88

Merged
claude-bot merged 5 commits from feat/frigate-nvr into main 2026-05-13 16:47:05 +00:00
Collaborator

Summary

  • Adds Mosquitto MQTT broker container for Frigate event publishing
  • Adds Frigate NVR container with Coral USB TPU, event-only recording (21-day local), and alert-severity gold archive to Hyperion NAS (180-day)
  • Reolink RLC-410-5MP frontyard camera configured; Wyze indoor disabled pending firmware fix (issue #87)
  • SOPS/age encrypted credentials committed as .env.enc
  • Home Assistant gold export automation fires on frigate/reviews MQTT alert events, calls frigate.export_recording to write clips to /mnt/nas/frigate-gold/
  • Systemd timer frigate-gold-cleanup.timer on Nexus prunes gold clips older than 180 days at 03:00 daily

Key fixes discovered during setup

  • Snap Docker cannot read env_file from /mnt/server/ � must use relative ./env in repo dir
  • Frigate uses Python str.format() so RTSP credential substitution requires {FRIGATE_VAR} syntax (not ${VAR})
  • All camera credential vars must be prefixed FRIGATE_ to be substituted
  • RTSP paths must be inline in YAML to avoid leading whitespace in URLs

Test plan

  • Walk through yard zone on frontyard camera
  • Verify alert-severity review appears in Frigate UI at http://192.168.1.226:5000
  • Confirm HA automation trace fires: Settings ? Automations ? Traces
  • Confirm clip appears at /mnt/nas/frigate-gold/
  • Verify cleanup timer: systemctl list-timers frigate-gold-cleanup.timer

?? Generated with Claude Code

## Summary - Adds Mosquitto MQTT broker container for Frigate event publishing - Adds Frigate NVR container with Coral USB TPU, event-only recording (21-day local), and alert-severity gold archive to Hyperion NAS (180-day) - Reolink RLC-410-5MP frontyard camera configured; Wyze indoor disabled pending firmware fix (issue #87) - SOPS/age encrypted credentials committed as `.env.enc` - Home Assistant gold export automation fires on `frigate/reviews` MQTT alert events, calls `frigate.export_recording` to write clips to `/mnt/nas/frigate-gold/` - Systemd timer `frigate-gold-cleanup.timer` on Nexus prunes gold clips older than 180 days at 03:00 daily ## Key fixes discovered during setup - Snap Docker cannot read `env_file` from `/mnt/server/` � must use relative `./env` in repo dir - Frigate uses Python `str.format()` so RTSP credential substitution requires `{FRIGATE_VAR}` syntax (not `${VAR}`) - All camera credential vars must be prefixed `FRIGATE_` to be substituted - RTSP paths must be inline in YAML to avoid leading whitespace in URLs ## Test plan - [ ] Walk through `yard` zone on frontyard camera - [ ] Verify alert-severity review appears in Frigate UI at `http://192.168.1.226:5000` - [ ] Confirm HA automation trace fires: Settings ? Automations ? Traces - [ ] Confirm clip appears at `/mnt/nas/frigate-gold/` - [ ] Verify cleanup timer: `systemctl list-timers frigate-gold-cleanup.timer` ?? Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- docker-compose.yml: Frigate stable, Coral USB passthrough, local media
  mount + Hyperion NFS gold storage overlay at /media/frigate/exports
- .env.enc: SOPS/age encrypted camera credentials (encrypted on Nexus)
- .env.example: placeholder template documenting expected vars
- .gitignore: prevents accidental commit of plain .env or config.yml

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
config.yml.example documents all settings with inline comments.
Real config.yml lives only on Nexus at /mnt/server/containers/frigate/config/.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Switch from single FRIGATE_RTSP_PASSWORD to per-camera variables:
- REOLINK_RTSP_PASSWORD for frontyard Reolink camera
- WYZE_RTSP_USER + WYZE_RTSP_PASSWORD for indoor Wyze cam

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Change env_file to relative ./.env (snap Docker can't access /mnt/server)
- Fix RTSP URL template syntax: use {FRIGATE_VAR} not ${FRIGATE_VAR}
  (Frigate uses Python str.format(), not shell variable substitution)
- Prefix all env vars with FRIGATE_ as required by Frigate's substitution engine
- Add README with bootstrap instructions and secrets workflow
- Inline RTSP path values to avoid leading-whitespace YAML parse issue

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
matt/homelab-docker!88
No description provided.