Frigate NVR + HA on QNAP NAS + TrueNAS Scale 部署教學
簡單的寫一下目前 IPCAM NVR 的配置,這幾年陸陸續續用過 IPCAM 內建的 APP 、 Zoneminder (搭配 zmNinja 手機推播)、Synology Surveillance、UniFi Protect 等,一直找不到理想的方案(內建 APP 只支援該廠牌的 IPCAM、Zoneminder 介面老舊且 Event Server 設定太複雜,Synology 兩支以上需要授權,UniFi Protect 一樣只支援 UniFi 生態,另外 Blue Iris 需要用 VM 裝 Windows 系統所以一直不考慮),直到 Frigate NVR 出來後,解決了上述所有的問題,稍微操作了一下 demo 頁面,立刻感受到「摁,就是這個了」。
2024.09.24 註:UniFi Protect 5.0.20 後新增了加入非 UniFi 監視器的功能(目前為 early access)
1. 系統需求
監視器的話有支援 rtsp 協定就好(例如 Tapo C100),若需要 PTZ 操作雲台則需要有 ONVIF 支援。若有監視器廠牌的安全疑慮可以在 router 端切 VLAN 或設定 WAN OUT 的 firewall rule 阻擋對外的連線。
硬體的話只要有支援 container 都行,例如 Intel PC 、 Raspberry Pi ,我這裡用的是 QNAP 的 TS-673A 。
OS 的話也是一樣有支援 container 就可以,使用 NAS 內建的 QuTS 或是安裝任意 Linux 系列的 OS 也行,我這裡用的是 TrueNAS Scale 。
因為我的 QNAP NAS 沒有內建顯示介面,需要裝一張顯示卡來完成 TrueNAS 的安裝步驟,顯示卡也可以做來用 Frigate 的硬體加速和物件辨識,支援的硬體可以看這裡和那裡。
硬碟的話因為我是 always-on 錄影,裝了兩個 WD RED HDD 做 RAID1。
另外如果要用物件辨識的功能,最好再加裝 detector ,我用的是 Google Coral TPU USB 。
2. 安裝步驟
用部署過 docker container 的話應該都很熟悉,照著官網的步驟裝就好,要注意若有安裝顯卡要設定一下 GPU passthrough ,若要用 NVIDIA 顯卡做物件辨識的話要用帶有 tensorrt
後綴的 image 。另外設定一下 /dev/shm
和 /tmp/cache
使用 tmpfs
,避免頻繁的硬碟存取;若有用 Coral TPU USB 還需要開啟 privileged mode 讓 container 能存取 USB 設備。
點我展開 TrueNAS Scale 的詳細設定
- Image Repository:
ghcr.io/blakeblackshear/frigate
- Image Tag:
stable
或stable-tensorrt
- Add external Interfaces 或 Port forwarding:
- Container Port:
5000
- Protocol:
TCP
- Container Port:
- Host Path Volumes:
- Mount Path:
/media/frigate
- Mount Path:
/config
- Mount Path:
- Memory Backed Volumes:
- Mount Path:
/dev/shm
- Mount Path:
/tmp/cache
- Mount Path:
- Privileged Mode:
Enabled
- GPU Configuration: Allocate GPU resource (如果要使用硬體加速)
因為我有用 HA ( Home Assistant )收 event ,所以還要再裝個 MQTT broker 的 container ,我這裡避免麻煩不使用帳號密碼認證,直接建立一個檔案,內容為:
# This is a Mosquitto configuration file that creates a listener on port 1883
# that allows unauthenticated access.
listener 1883
allow_anonymous true
然後 mount 到 container 內的 /mosquitto/config/mosquitto.conf
最後是 Home Assistant ,可以用 VM 裝 HAOS 或是 container ,要注意的是如果用 container 的話, network 要開 host 模式(才可以用 auto-discovery 的功能)。
3. Config 設定
Frigate 的 config 檔案請照這個頁面一步步設定,增減想要的功能(例如錄影保留多久、辨識哪些物件等)就好,並根據現有的硬體設定硬體加速,有問題的話可以留言或 Discord 討論。
Home Assistant 需要先裝 HACS 和 MQTT integration ,然後在 HACS 找到 Frigate 安裝。如果只是單純做錄影(不需要手機推播通知的話),就不需要裝 Home Assistant 。
都裝好後你的 Integrations 頁面應該會有黃底的這三個。
接下來要設定根據藍圖設定手機推播,這邊要注意如果你是想要在外網收到通知並正常顯示照片,那就需要 port forwarding 或是 Home Assistant Cloud 。我這裡是用 nginx reverse proxy 做 hostname 和 port 的 forwarding 。
手機安裝 Home Assistant 並登入後,Integrations 頁面會多個 Mobile App ,接著用匯入的藍圖建立新的 Automation ,並且在 Mobile Device 選擇你的手機裝置。
要注意你的 Frigate detection 功能要在 config 或 UI 打開(可以看 Frigate Cameras 頁面,有個人型的按鈕有沒有按下去),手機才會收到通知,要 debug 的話藍圖下面有個 debug 模式打開後,可以從 HA 的 Logbook 看 error message 。
Frigate 之後也會支援 PTZ (但在我寫這篇的時候還沒支援),我是在 HA 裝 ONVIF ,在 Lovelace UI 加入按鈕進行 PTZ 。這邊避免多餘的網路流量和 IPCAM 負擔,影像是抓 Frigate 串流的,所以 ONVIF 這裡的 FFMPEG 設定為 null input 。
也可以設定預設點的按鈕(上圖的 reset icon 和下圖的骰子), preset 的名字要跟 IPCAM APP 裡面設定的一樣就是了。
點我展開 Card 的 YAML
type: picture-glance
entities:
- entity: camera.YOUR_ONVIF_CAMERA_STREAM
tap_action:
action: call-service
service: onvif.ptz
service_data:
entity_id: camera.YOUR_ONVIF_CAMERA_STREAM
pan: LEFT
speed: 1
distance: 0.3
move_mode: ContinuousMove
name: Pan Left
show_state: false
icon: mdi:arrow-left
show_icon: true
- entity: camera.YOUR_ONVIF_CAMERA_STREAM
tap_action:
action: call-service
service: onvif.ptz
service_data:
entity_id: camera.YOUR_ONVIF_CAMERA_STREAM
tilt: UP
speed: 1
distance: 0.3
move_mode: ContinuousMove
name: Tilt Up
icon: mdi:arrow-up
- entity: camera.YOUR_ONVIF_CAMERA_STREAM
tap_action:
action: call-service
service: onvif.ptz
service_data:
entity_id: camera.YOUR_ONVIF_CAMERA_STREAM
tilt: DOWN
speed: 1
distance: 0.3
move_mode: ContinuousMove
name: Tilt Down
icon: mdi:arrow-down
- entity: camera.YOUR_ONVIF_CAMERA_STREAM
tap_action:
action: call-service
service: onvif.ptz
service_data:
entity_id: camera.YOUR_ONVIF_CAMERA_STREAM
pan: RIGHT
speed: 1
distance: 0.3
move_mode: ContinuousMove
name: Pan Right
icon: mdi:arrow-right
show_icon: true
- entity: camera.YOUR_ONVIF_CAMERA_STREAM
tap_action:
action: call-service
service: onvif.ptz
service_data:
entity_id: camera.YOUR_ONVIF_CAMERA_STREAM
preset: '1'
move_mode: GotoPreset
name: Preset 1
icon: mdi:dice-1
show_icon: true
- entity: camera.YOUR_ONVIF_CAMERA_STREAM
tap_action:
action: call-service
service: onvif.ptz
service_data:
entity_id: camera.YOUR_ONVIF_CAMERA_STREAM
preset: '2'
move_mode: GotoPreset
name: Preset 2
icon: mdi:dice-2
show_icon: true
- entity: camera.YOUR_ONVIF_CAMERA_STREAM
tap_action:
action: call-service
service: onvif.ptz
service_data:
entity_id: camera.YOUR_ONVIF_CAMERA_STREAM
preset: '3'
move_mode: GotoPreset
name: Preset 3
icon: mdi:dice-3
show_icon: true
camera_image: camera.YOUR_FRIGATE_CAMERA_STREAM
camera_view: live
另外有開啟物件辨識或是 IPCAM 數量很多的話,可能會有升級硬體的需求,這邊提供手邊現有的 CPU/GPU/TPU 使用量供參考:下面左圖是使用 NVIDIA T400 GPU 和 tensorRT 做 decoder 和 detector( model 為 yolov7-tiny-416
);右圖則是用 Intel J4105 的內顯做 decoder 、 Coral USB 作 detector ,兩邊分別裝了 6-8 台 1080p / 2K 的 IPCAM ,目前運作都順暢。建議可以先用手邊現有的硬體部署,若遇上效能瓶頸再考慮升級(聽說中國最近有一批很好用的 Tesla P4 ,不介意二手的話可以買來賭人品,不過因為 P4 是被動散熱方案,需要自行再加裝風扇就是了)。
Frigate | NVR | HA | TrueNAS 相關討論的 Discord 連結
2024.09 Update: Added a M.2 Coral TPU