mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-09-15 17:24:10 +00:00
Bump the pinned release and follow the four build changes that matter outside of Docker. ffmpeg: 0.18 ships 8.0 as the default and keeps 7.0 and 5.0 alongside it, so /etc/frigate.env has to name all three or the s6 run script resolves a version that install_deps.sh never downloaded. go2rtc: pin to v1.9.14, the version the Dockerfile fetches. "latest" happened to work but shipped whatever AlexxIT had tagged that day rather than the build Frigate was tested against. OpenVINO: requirements-ov.txt dropped tensorflow and openvino-dev, and build_ov_model.py no longer uses the Model Optimizer. omz_tools is therefore gone, which left the first two branches of the labelmap lookup dead; download coco_91cl_bkgr.txt the way the Dockerfile does. Intel media driver: 0.18 builds intel-media-va-driver-non-free from source for Battlemage, because the prebuilt noble/trixie packages need a glibc that bookworm does not have. Run it before install_deps.sh, as the deps-rootfs stage does, and drop the jammy repo the build adds so the later trixie pull for libva2 is not resolved against it. The remaining build scripts and requirement files changed too, but those come from the checked-out tree and follow the version bump on their own.
413 lines
13 KiB
Bash
413 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
|
|
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
|
|
ffmpeg:
|
|
hwaccel_args: auto
|
|
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
|
|
ffmpeg:
|
|
hwaccel_args: auto
|
|
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
|