feat: add Frigate NVR deployment for chelsty-infra
VAAPI decode via Intel UHD 630, CPU detection, 2x Reolink RLC-540 placeholders. MQTT to local mosquitto (127.0.0.1), 7-day recording retention. Secrets in /opt/homelab/config/frigate/frigate.env on node. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
9b39581b53
commit
f34399a30d
88
hosts/chelsty-infra/runtime/frigate/config.yml
Normal file
88
hosts/chelsty-infra/runtime/frigate/config.yml
Normal file
|
|
@ -0,0 +1,88 @@
|
||||||
|
# Frigate NVR — chelsty-infra
|
||||||
|
# Hardware decode: Intel UHD 630 via VAAPI (/dev/dri/renderD128)
|
||||||
|
# Object detection: CPU (no Coral TPU)
|
||||||
|
# Cameras: 2x Reolink RLC-540 (5MP, WiFi)
|
||||||
|
#
|
||||||
|
# Required env vars in /opt/homelab/config/frigate/frigate.env:
|
||||||
|
# CAMERA1_IP, CAMERA1_USER, CAMERA1_PASS
|
||||||
|
# CAMERA2_IP, CAMERA2_USER, CAMERA2_PASS
|
||||||
|
# MQTT_USER, MQTT_PASS (if mosquitto auth is enabled)
|
||||||
|
|
||||||
|
mqtt:
|
||||||
|
enabled: true
|
||||||
|
host: 127.0.0.1
|
||||||
|
port: 1883
|
||||||
|
# user: "{MQTT_USER}"
|
||||||
|
# password: "{MQTT_PASS}"
|
||||||
|
|
||||||
|
detectors:
|
||||||
|
cpu1:
|
||||||
|
type: cpu
|
||||||
|
num_threads: 3
|
||||||
|
|
||||||
|
ffmpeg:
|
||||||
|
hwaccel_args: preset-vaapi
|
||||||
|
global_args:
|
||||||
|
- -hide_banner
|
||||||
|
- -loglevel
|
||||||
|
- warning
|
||||||
|
|
||||||
|
record:
|
||||||
|
enabled: true
|
||||||
|
retain:
|
||||||
|
days: 7
|
||||||
|
mode: all
|
||||||
|
events:
|
||||||
|
retain:
|
||||||
|
default: 14
|
||||||
|
mode: motion
|
||||||
|
|
||||||
|
snapshots:
|
||||||
|
enabled: true
|
||||||
|
retain:
|
||||||
|
default: 7
|
||||||
|
quality: 70
|
||||||
|
|
||||||
|
objects:
|
||||||
|
track:
|
||||||
|
- person
|
||||||
|
- car
|
||||||
|
- bicycle
|
||||||
|
filters:
|
||||||
|
person:
|
||||||
|
min_area: 5000
|
||||||
|
max_area: 100000
|
||||||
|
threshold: 0.7
|
||||||
|
|
||||||
|
cameras:
|
||||||
|
camera1:
|
||||||
|
ffmpeg:
|
||||||
|
inputs:
|
||||||
|
# Main stream — high-res recording
|
||||||
|
- path: rtsp://{CAMERA1_USER}:{CAMERA1_PASS}@{CAMERA1_IP}:554/h264Preview_01_main
|
||||||
|
roles:
|
||||||
|
- record
|
||||||
|
# Sub stream — low-res detection (lower CPU cost)
|
||||||
|
- path: rtsp://{CAMERA1_USER}:{CAMERA1_PASS}@{CAMERA1_IP}:554/h264Preview_01_sub
|
||||||
|
roles:
|
||||||
|
- detect
|
||||||
|
detect:
|
||||||
|
enabled: true
|
||||||
|
width: 640
|
||||||
|
height: 480
|
||||||
|
fps: 5
|
||||||
|
|
||||||
|
camera2:
|
||||||
|
ffmpeg:
|
||||||
|
inputs:
|
||||||
|
- path: rtsp://{CAMERA2_USER}:{CAMERA2_PASS}@{CAMERA2_IP}:554/h264Preview_01_main
|
||||||
|
roles:
|
||||||
|
- record
|
||||||
|
- path: rtsp://{CAMERA2_USER}:{CAMERA2_PASS}@{CAMERA2_IP}:554/h264Preview_01_sub
|
||||||
|
roles:
|
||||||
|
- detect
|
||||||
|
detect:
|
||||||
|
enabled: true
|
||||||
|
width: 640
|
||||||
|
height: 480
|
||||||
|
fps: 5
|
||||||
24
hosts/chelsty-infra/runtime/frigate/docker-compose.yml
Normal file
24
hosts/chelsty-infra/runtime/frigate/docker-compose.yml
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
services:
|
||||||
|
frigate:
|
||||||
|
container_name: frigate
|
||||||
|
image: ghcr.io/blakeblackshear/frigate:stable
|
||||||
|
restart: unless-stopped
|
||||||
|
privileged: true
|
||||||
|
shm_size: "256mb"
|
||||||
|
network_mode: host
|
||||||
|
devices:
|
||||||
|
- /dev/dri/renderD128:/dev/dri/renderD128
|
||||||
|
volumes:
|
||||||
|
- /etc/localtime:/etc/localtime:ro
|
||||||
|
- ./config.yml:/config/config.yml:ro
|
||||||
|
- /opt/homelab/data/frigate:/media/frigate
|
||||||
|
tmpfs:
|
||||||
|
- /tmp/cache
|
||||||
|
env_file:
|
||||||
|
- /opt/homelab/config/frigate/frigate.env
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "wget -q --spider http://localhost:5000/api/version 2>&1 || exit 1"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 60s
|
||||||
|
|
@ -8,3 +8,5 @@ services:
|
||||||
role: zigbee-mqtt-bridge
|
role: zigbee-mqtt-bridge
|
||||||
stability-agent:
|
stability-agent:
|
||||||
role: node-stability-monitor
|
role: node-stability-monitor
|
||||||
|
frigate:
|
||||||
|
role: nvr
|
||||||
|
|
|
||||||
26
scripts/deploy/deploy-frigate.sh
Executable file
26
scripts/deploy/deploy-frigate.sh
Executable file
|
|
@ -0,0 +1,26 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# deploy-frigate.sh - Deploy Frigate NVR on chelsty-infra (print or SSH)
|
||||||
|
|
||||||
|
MODE="print"
|
||||||
|
[[ "$1" == "--ssh" ]] && MODE="ssh"
|
||||||
|
|
||||||
|
TARGET="100.122.201.22"
|
||||||
|
NODE="chelsty-infra"
|
||||||
|
REPO_PATH="/home/oskar/homelab-codex-ws"
|
||||||
|
SERVICE_PATH="$REPO_PATH/hosts/chelsty-infra/runtime/frigate"
|
||||||
|
|
||||||
|
echo "HOST: $NODE"
|
||||||
|
echo "MODE: $MODE"
|
||||||
|
echo "TARGET: $TARGET"
|
||||||
|
|
||||||
|
# Secrets must exist at /opt/homelab/config/frigate/frigate.env on the node
|
||||||
|
# before first deploy. See config.yml for required variables.
|
||||||
|
DEPLOY_CMD="cd $REPO_PATH && git fetch origin && git checkout master && git pull origin master && cd $SERVICE_PATH && docker compose up -d --pull always"
|
||||||
|
|
||||||
|
if [[ "$MODE" == "ssh" ]]; then
|
||||||
|
echo "--- Deploying Frigate to $NODE ($TARGET) via SSH ---"
|
||||||
|
ssh oskar@$TARGET "$DEPLOY_CMD"
|
||||||
|
else
|
||||||
|
echo "# --- Deployment commands for $NODE ---"
|
||||||
|
echo "ssh oskar@$TARGET '$DEPLOY_CMD'"
|
||||||
|
fi
|
||||||
Loading…
Reference in a new issue