mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-09-15 17:24:10 +00:00
The install wrote a config with mqtt, cameras, auth and detect, then the detector branch wrote the file again instead of adding to it. Both branches used a single redirect, so everything above them was discarded and the result had neither mqtt nor cameras. frigate/config/config.py declares both as Field() without a default, in 0.17.2 as well as in 0.18.0, so Frigate rejected the file and came up in safe mode: mqtt - Field required cameras - Field required Move hwaccel_args into the base block, since both branches set it, and append the detector and model sections instead of overwriting. Checked by generating both branches and parsing the result: the OpenVINO path yields auth, cameras, detect, detectors, ffmpeg, model, mqtt, the CPU path the same without detectors, and the test camera survives in both.
411 lines
13 KiB
Bash
411 lines
13 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# Copyright (c) 2021-2026 community-scripts ORG
|
|
# Authors: MickLesk (CanbiZ) | Co-Authors: remz1337
|
|
# License: MIT | https://github.com/community-scripts/ProxmoxVE/raw/main/LICENSE
|
|
# Source: https://frigate.video/ | Github: https://github.com/blakeblackshear/frigate
|
|
|
|
source /dev/stdin <<<"$FUNCTIONS_FILE_PATH"
|
|
color
|
|
verb_ip6
|
|
catch_errors
|
|
setting_up_container
|
|
network_check
|
|
update_os
|
|
|
|
source /etc/os-release
|
|
if [[ "$VERSION_ID" != "12" ]]; then
|
|
msg_error "Frigate requires Debian 12 (Bookworm) due to Python 3.11 dependencies"
|
|
exit 238
|
|
fi
|
|
|
|
msg_info "Converting APT sources to DEB822 format"
|
|
if [ -f /etc/apt/sources.list ]; then
|
|
cat >/etc/apt/sources.list.d/debian.sources <<'EOF'
|
|
Types: deb
|
|
URIs: http://deb.debian.org/debian
|
|
Suites: bookworm
|
|
Components: main contrib
|
|
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
|
|
|
|
Types: deb
|
|
URIs: http://deb.debian.org/debian
|
|
Suites: bookworm-updates
|
|
Components: main contrib
|
|
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
|
|
|
|
Types: deb
|
|
URIs: http://security.debian.org
|
|
Suites: bookworm-security
|
|
Components: main contrib
|
|
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
|
|
EOF
|
|
mv /etc/apt/sources.list /etc/apt/sources.list.bak
|
|
$STD apt update
|
|
fi
|
|
msg_ok "Converted APT sources"
|
|
|
|
msg_info "Installing Dependencies"
|
|
$STD apt install -y \
|
|
xz-utils \
|
|
python3 \
|
|
python3-dev \
|
|
python3-pip \
|
|
gcc \
|
|
pkg-config \
|
|
libhdf5-dev \
|
|
build-essential \
|
|
automake \
|
|
libtool \
|
|
ccache \
|
|
libusb-1.0-0-dev \
|
|
apt-transport-https \
|
|
cmake \
|
|
git \
|
|
libgtk-3-dev \
|
|
libavcodec-dev \
|
|
libavformat-dev \
|
|
libswscale-dev \
|
|
libv4l-dev \
|
|
libxvidcore-dev \
|
|
libx264-dev \
|
|
libjpeg-dev \
|
|
libpng-dev \
|
|
libtiff-dev \
|
|
gfortran \
|
|
openexr \
|
|
libssl-dev \
|
|
libtbbmalloc2 \
|
|
libtbb-dev \
|
|
libdc1394-dev \
|
|
libopenexr-dev \
|
|
libgstreamer-plugins-base1.0-dev \
|
|
libgstreamer1.0-dev \
|
|
tclsh \
|
|
libopenblas-dev \
|
|
liblapack-dev \
|
|
libgomp1 \
|
|
make \
|
|
moreutils
|
|
msg_ok "Installed Dependencies"
|
|
|
|
setup_hwaccel
|
|
|
|
export TARGETARCH="$(arch_resolve)"
|
|
export CCACHE_DIR=/root/.ccache
|
|
export CCACHE_MAXSIZE=2G
|
|
export APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=DontWarn
|
|
export PIP_BREAK_SYSTEM_PACKAGES=1
|
|
export NVIDIA_VISIBLE_DEVICES=all
|
|
export NVIDIA_DRIVER_CAPABILITIES="compute,video,utility"
|
|
export TOKENIZERS_PARALLELISM=true
|
|
export TRANSFORMERS_NO_ADVISORY_WARNINGS=1
|
|
export OPENCV_FFMPEG_LOGLEVEL=8
|
|
export PYTHONWARNINGS="ignore:::numpy.core.getlimits"
|
|
export HAILORT_LOGGER_PATH=NONE
|
|
export TF_CPP_MIN_LOG_LEVEL=3
|
|
export TF_CPP_MIN_VLOG_LEVEL=3
|
|
export TF_ENABLE_ONEDNN_OPTS=0
|
|
export AUTOGRAPH_VERBOSITY=0
|
|
export GLOG_minloglevel=3
|
|
export GLOG_logtostderr=0
|
|
|
|
fetch_and_deploy_gh_release "frigate" "blakeblackshear/frigate" "tarball" "v0.18.0" "/opt/frigate"
|
|
|
|
msg_info "Building Nginx"
|
|
$STD bash /opt/frigate/docker/main/build_nginx.sh
|
|
sed -e '/s6-notifyoncheck/ s/^#*/#/' -i /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run
|
|
ln -sf /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
|
|
msg_ok "Built Nginx"
|
|
|
|
msg_info "Building SQLite Extensions"
|
|
$STD bash /opt/frigate/docker/main/build_sqlite_vec.sh
|
|
msg_ok "Built SQLite Extensions"
|
|
|
|
if [[ "$(arch_resolve)" == "amd64" ]]; then
|
|
msg_info "Building Intel Media Driver (Patience)"
|
|
$STD bash /opt/frigate/docker/main/build_intel_media_driver.sh
|
|
cp -a /rootfs/. /
|
|
rm -rf /rootfs
|
|
rm -f /etc/apt/sources.list.d/intel-gpu-jammy.list /usr/share/keyrings/intel-graphics.gpg
|
|
$STD apt update
|
|
ldconfig
|
|
msg_ok "Built Intel Media Driver"
|
|
fi
|
|
|
|
fetch_and_deploy_gh_release "go2rtc" "AlexxIT/go2rtc" "singlefile" "v1.9.14" "/usr/local/go2rtc/bin" "go2rtc_linux_$(arch_resolve)"
|
|
|
|
msg_info "Installing Tempio"
|
|
sed -i 's|/rootfs/usr/local|/usr/local|g' /opt/frigate/docker/main/install_tempio.sh
|
|
$STD bash /opt/frigate/docker/main/install_tempio.sh
|
|
ln -sf /usr/local/tempio/bin/tempio /usr/local/bin/tempio
|
|
msg_ok "Installed Tempio"
|
|
|
|
msg_info "Building libUSB"
|
|
fetch_and_deploy_gh_release "libusb" "libusb/libusb" "tarball" "v1.0.26" "/opt/libusb"
|
|
cd /opt/libusb
|
|
$STD ./bootstrap.sh
|
|
$STD ./configure CC='ccache gcc' CCX='ccache g++' --disable-udev --enable-shared
|
|
$STD make -j "$(nproc)"
|
|
cd /opt/libusb/libusb
|
|
mkdir -p /usr/local/lib /usr/local/include/libusb-1.0 /usr/local/lib/pkgconfig
|
|
$STD bash ../libtool --mode=install /usr/bin/install -c libusb-1.0.la /usr/local/lib
|
|
install -c -m 644 libusb.h /usr/local/include/libusb-1.0
|
|
cd /opt/libusb/
|
|
install -c -m 644 libusb-1.0.pc /usr/local/lib/pkgconfig
|
|
ldconfig
|
|
msg_ok "Built libUSB"
|
|
|
|
msg_info "Bootstrapping pip"
|
|
curl_with_retry "https://bootstrap.pypa.io/get-pip.py" "/tmp/get-pip.py"
|
|
sed -i 's/args.append("setuptools")/args.append("setuptools==77.0.3")/' /tmp/get-pip.py
|
|
$STD python3 /tmp/get-pip.py "pip"
|
|
rm -f /tmp/get-pip.py
|
|
msg_ok "Bootstrapped pip"
|
|
|
|
msg_info "Installing Python Dependencies"
|
|
$STD pip3 install -r /opt/frigate/docker/main/requirements.txt
|
|
msg_ok "Installed Python Dependencies"
|
|
|
|
msg_info "Building Python Wheels (Patience)"
|
|
mkdir -p /wheels
|
|
$STD bash /opt/frigate/docker/main/build_pysqlite3.sh
|
|
for i in {1..3}; do
|
|
$STD pip3 wheel --wheel-dir=/wheels -r /opt/frigate/docker/main/requirements-wheels.txt --default-timeout=300 --retries=3 && break
|
|
[[ $i -lt 3 ]] && sleep 10
|
|
done
|
|
msg_ok "Built Python Wheels"
|
|
|
|
NODE_VERSION="20" setup_nodejs
|
|
|
|
msg_info "Downloading Inference Models"
|
|
mkdir -p /models /openvino-model
|
|
curl_download "/edgetpu_model.tflite" "https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite"
|
|
curl_download "/models/cpu_model.tflite" "https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess.tflite"
|
|
cp /opt/frigate/labelmap.txt /labelmap.txt
|
|
msg_ok "Downloaded Inference Models"
|
|
|
|
msg_info "Downloading Audio Model"
|
|
curl_download "/tmp/yamnet.tar.gz" "https://www.kaggle.com/api/v1/models/google/yamnet/tfLite/classification-tflite/1/download"
|
|
$STD tar xzf /tmp/yamnet.tar.gz -C /
|
|
mv /1.tflite /cpu_audio_model.tflite
|
|
cp /opt/frigate/audio-labelmap.txt /audio-labelmap.txt
|
|
rm -f /tmp/yamnet.tar.gz
|
|
msg_ok "Downloaded Audio Model"
|
|
|
|
msg_info "Installing OpenVino"
|
|
$STD pip3 install -r /opt/frigate/docker/main/requirements-ov.txt
|
|
msg_ok "Installed OpenVino"
|
|
|
|
msg_info "Building OpenVino Model"
|
|
cd /models
|
|
curl_download "ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz" "http://download.tensorflow.org/models/object_detection/ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz"
|
|
$STD tar -zxf ssdlite_mobilenet_v2_coco_2018_05_09.tar.gz --no-same-owner
|
|
if python3 /opt/frigate/docker/main/build_ov_model.py &>/dev/null; then
|
|
mkdir -p /openvino-model
|
|
cp /models/ssdlite_mobilenet_v2.xml /openvino-model/
|
|
cp /models/ssdlite_mobilenet_v2.bin /openvino-model/
|
|
curl_with_retry "https://raw.githubusercontent.com/openvinotoolkit/open_model_zoo/master/data/dataset_classes/coco_91cl_bkgr.txt" "/openvino-model/coco_91cl_bkgr.txt"
|
|
sed -i 's/truck/car/g' /openvino-model/coco_91cl_bkgr.txt
|
|
msg_ok "Built OpenVino Model"
|
|
else
|
|
msg_warn "OpenVino build failed (CPU may not support required instructions). Frigate will use CPU model."
|
|
fi
|
|
|
|
msg_info "Installing HailoRT Runtime"
|
|
$STD bash /opt/frigate/docker/main/install_hailort.sh
|
|
cp -a /opt/frigate/docker/main/rootfs/. /
|
|
sed -i '/^.*unset DEBIAN_FRONTEND.*$/d' /opt/frigate/docker/main/install_deps.sh
|
|
echo "libedgetpu1-max libedgetpu/accepted-eula boolean true" | debconf-set-selections
|
|
echo "libedgetpu1-max libedgetpu/install-confirm-max boolean true" | debconf-set-selections
|
|
echo 'force-overwrite' >/etc/dpkg/dpkg.cfg.d/force-overwrite
|
|
$STD bash /opt/frigate/docker/main/install_deps.sh
|
|
rm -f /etc/dpkg/dpkg.cfg.d/force-overwrite
|
|
$STD pip3 install -U /wheels/*.whl
|
|
ldconfig
|
|
msg_ok "Installed HailoRT Runtime"
|
|
|
|
msg_info "Installing MemryX Runtime"
|
|
$STD bash /opt/frigate/docker/main/install_memryx.sh
|
|
msg_ok "Installed MemryX Runtime"
|
|
|
|
msg_info "Building Frigate Application (Patience)"
|
|
cd /opt/frigate
|
|
$STD pip3 install -r /opt/frigate/docker/main/requirements-dev.txt
|
|
$STD bash /opt/frigate/.devcontainer/initialize.sh
|
|
$STD make version
|
|
cd /opt/frigate/web
|
|
$STD npm install
|
|
$STD npm run build
|
|
mv /opt/frigate/web/dist/BASE_PATH/monacoeditorwork/* /opt/frigate/web/dist/assets/
|
|
rm -rf /opt/frigate/web/dist/BASE_PATH
|
|
cp -r /opt/frigate/web/dist/* /opt/frigate/web/
|
|
sed -i '/^s6-svc -O \.$/s/^/#/' /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run
|
|
msg_ok "Built Frigate Application"
|
|
|
|
msg_info "Configuring Frigate"
|
|
mkdir -p /config /media/frigate
|
|
cp -r /opt/frigate/config/. /config
|
|
|
|
curl_download "/media/frigate/person-bicycle-car-detection.mp4" "https://github.com/intel-iot-devkit/sample-videos/raw/master/person-bicycle-car-detection.mp4"
|
|
|
|
echo "tmpfs /tmp/cache tmpfs defaults 0 0" >>/etc/fstab
|
|
|
|
cat <<EOF >/etc/frigate.env
|
|
DEFAULT_FFMPEG_VERSION="8.0"
|
|
INCLUDED_FFMPEG_VERSIONS="8.0:7.0:5.0"
|
|
NVIDIA_VISIBLE_DEVICES=all
|
|
NVIDIA_DRIVER_CAPABILITIES="compute,video,utility"
|
|
TOKENIZERS_PARALLELISM=true
|
|
TRANSFORMERS_NO_ADVISORY_WARNINGS=1
|
|
OPENCV_FFMPEG_LOGLEVEL=8
|
|
PYTHONWARNINGS="ignore:::numpy.core.getlimits"
|
|
HAILORT_LOGGER_PATH=NONE
|
|
TF_CPP_MIN_LOG_LEVEL=3
|
|
TF_CPP_MIN_VLOG_LEVEL=3
|
|
TF_ENABLE_ONEDNN_OPTS=0
|
|
AUTOGRAPH_VERBOSITY=0
|
|
GLOG_minloglevel=3
|
|
GLOG_logtostderr=0
|
|
EOF
|
|
|
|
cat <<EOF >/config/config.yml
|
|
mqtt:
|
|
enabled: false
|
|
cameras:
|
|
test:
|
|
ffmpeg:
|
|
inputs:
|
|
- path: /media/frigate/person-bicycle-car-detection.mp4
|
|
input_args: -re -stream_loop -1 -fflags +genpts
|
|
roles:
|
|
- detect
|
|
detect:
|
|
height: 1080
|
|
width: 1920
|
|
fps: 5
|
|
auth:
|
|
enabled: false
|
|
detect:
|
|
enabled: false
|
|
ffmpeg:
|
|
hwaccel_args: auto
|
|
EOF
|
|
|
|
if grep -q -o -m1 -E 'avx[^ ]*|sse4_2' /proc/cpuinfo && [[ -f /openvino-model/ssdlite_mobilenet_v2.xml ]] && [[ -f /openvino-model/coco_91cl_bkgr.txt ]]; then
|
|
cat <<EOF >>/config/config.yml
|
|
detectors:
|
|
detector01:
|
|
type: openvino
|
|
device: AUTO
|
|
model:
|
|
width: 300
|
|
height: 300
|
|
input_tensor: nhwc
|
|
input_pixel_format: bgr
|
|
path: /openvino-model/ssdlite_mobilenet_v2.xml
|
|
labelmap_path: /openvino-model/coco_91cl_bkgr.txt
|
|
EOF
|
|
else
|
|
cat <<EOF >>/config/config.yml
|
|
model:
|
|
path: /models/cpu_model.tflite
|
|
EOF
|
|
fi
|
|
msg_ok "Configured Frigate"
|
|
|
|
msg_info "Creating Services"
|
|
cat <<EOF >/etc/systemd/system/create_directories.service
|
|
[Unit]
|
|
Description=Create necessary directories for Frigate logs
|
|
Before=frigate.service go2rtc.service nginx.service
|
|
|
|
[Service]
|
|
Type=oneshot
|
|
ExecStart=/bin/bash -c '/bin/mkdir -p /dev/shm/logs/{frigate,go2rtc,nginx} && /bin/touch /dev/shm/logs/{frigate/current,go2rtc/current,nginx/current} && /bin/chmod -R 777 /dev/shm/logs'
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
cat <<EOF >/etc/systemd/system/go2rtc.service
|
|
[Unit]
|
|
Description=go2rtc streaming service
|
|
After=network.target create_directories.service
|
|
StartLimitIntervalSec=0
|
|
|
|
[Service]
|
|
Type=simple
|
|
Restart=always
|
|
RestartSec=1
|
|
User=root
|
|
EnvironmentFile=/etc/frigate.env
|
|
ExecStartPre=+rm -f /dev/shm/logs/go2rtc/current
|
|
ExecStart=/bin/bash -c "bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/run 2> >(/usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S ' >&2) | /usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S '"
|
|
StandardOutput=file:/dev/shm/logs/go2rtc/current
|
|
StandardError=file:/dev/shm/logs/go2rtc/current
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
cat <<EOF >/etc/systemd/system/frigate.service
|
|
[Unit]
|
|
Description=Frigate NVR service
|
|
After=go2rtc.service create_directories.service
|
|
StartLimitIntervalSec=0
|
|
|
|
[Service]
|
|
Type=simple
|
|
Restart=always
|
|
RestartSec=1
|
|
User=root
|
|
EnvironmentFile=/etc/frigate.env
|
|
ExecStartPre=+/usr/bin/systemctl restart go2rtc.service
|
|
ExecStartPre=+rm -f /dev/shm/logs/frigate/current
|
|
ExecStart=/bin/bash -c "bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run 2> >(/usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S ' >&2) | /usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S '"
|
|
StandardOutput=file:/dev/shm/logs/frigate/current
|
|
StandardError=file:/dev/shm/logs/frigate/current
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
cat <<EOF >/etc/systemd/system/nginx.service
|
|
[Unit]
|
|
Description=Nginx reverse proxy for Frigate
|
|
After=frigate.service create_directories.service
|
|
StartLimitIntervalSec=0
|
|
|
|
[Service]
|
|
Type=simple
|
|
Restart=always
|
|
RestartSec=1
|
|
User=root
|
|
ExecStartPre=+rm -f /dev/shm/logs/nginx/current
|
|
ExecStart=/bin/bash -c "bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run 2> >(/usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S ' >&2) | /usr/bin/ts '%%Y-%%m-%%d %%H:%%M:%%.S '"
|
|
StandardOutput=file:/dev/shm/logs/nginx/current
|
|
StandardError=file:/dev/shm/logs/nginx/current
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
systemctl daemon-reload
|
|
systemctl enable -q --now create_directories
|
|
sleep 2
|
|
systemctl enable -q --now go2rtc
|
|
sleep 2
|
|
systemctl enable -q --now frigate
|
|
sleep 2
|
|
systemctl enable -q --now nginx
|
|
msg_ok "Created Services"
|
|
|
|
msg_info "Cleaning Up"
|
|
rm -rf /opt/libusb /wheels /models/*.tar.gz
|
|
msg_ok "Cleaned Up"
|
|
|
|
motd_ssh
|
|
customize
|
|
cleanup_lxc
|