Update frigate-install.sh

Major changes!
This commit is contained in:
tteckster 2024-03-30 08:08:19 -04:00 committed by GitHub
parent 2358fa788f
commit 078e99ecb1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,7 +1,7 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2024 tteck
# Authors: tteck (tteckster), remz1337
# Authors: tteck (tteckster)
# License: MIT
# https://github.com/tteck/Proxmox/raw/main/LICENSE
@ -13,209 +13,111 @@ setting_up_container
network_check
update_os
msg_info "Installing Dependencies"
#Configuration to make unattended installs with APT
#https://serverfault.com/questions/48724/100-non-interactive-debian-dist-upgrade
export DEBIAN_FRONTEND=noninteractive
export APT_LISTCHANGES_FRONTEND=none
#especially libc6, installed part of the dependency script (install_deps.sh)
echo 'libc6 libraries/restart-without-asking boolean true' | debconf-set-selections
cd /opt
$STD apt update
$STD apt upgrade -y
#I tried to install all the dependencies at the beginning, but it induced an error when building nginx, so I kept them in the same order of the Dockerfile
$STD apt install -y git automake build-essential wget xz-utils
msg_info "Installing Dependencies (Patience)"
$STD apt-get install -y {curl,sudo,mc,git,gpg,automake,build-essential,xz-utils,libtool,ccache,pkg-config,libgtk-3-dev,libavcodec-dev,libavformat-dev,libswscale-dev,libv4l-dev,libxvidcore-dev,libx264-dev,libjpeg-dev,libpng-dev,libtiff-dev,gfortran,openexr,libatlas-base-dev,libssl-dev,libtbb2,libtbb-dev,libdc1394-22-dev,libopenexr-dev,libgstreamer-plugins-base1.0-dev,libgstreamer1.0-dev,gcc,gfortran,libopenblas-dev,liblapack-dev,libusb-1.0-0-dev}
msg_ok "Installed Dependencies"
msg_info "Installing Python3 Dependencies"
$STD apt-get install -y {python3,python3-dev,python3-setuptools,python3-distutils}
wget -q https://bootstrap.pypa.io/get-pip.py -O get-pip.py
$STD python3 get-pip.py --quiet "pip"
msg_ok "Installed Python3 Dependencies"
msg_info "Downloading Frigate"
#Pull Frigate from repo
#git clone https://github.com/blakeblackshear/frigate.git
$STD wget https://github.com/blakeblackshear/frigate/archive/refs/tags/v0.13.0-beta2.tar.gz -O frigate.tar.gz
mkdir frigate
$STD tar -xzf frigate.tar.gz -C frigate --strip-components 1
cd /opt/frigate
#Used in build dependencies scripts
export TARGETARCH=amd64
msg_ok "Downloaded Frigate"
msg_info "Building Nginx with custom modules"
$STD docker/main/build_nginx.sh
msg_ok "Built Nginx with custom modules"
msg_info "Installing Node.js"
mkdir -p /etc/apt/keyrings
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" >/etc/apt/sources.list.d/nodesource.list
$STD apt-get update
$STD apt-get install -y nodejs
msg_ok "Installed Node.js"
msg_info "Installing go2rtc"
mkdir -p /usr/local/go2rtc/bin
cd /usr/local/go2rtc/bin
$STD wget -O go2rtc "https://github.com/AlexxIT/go2rtc/releases/download/v1.8.1/go2rtc_linux_${TARGETARCH}"
wget -qO go2rtc "https://github.com/AlexxIT/go2rtc/releases/latest/download/go2rtc_linux_amd64"
chmod +x go2rtc
$STD ln -svf /usr/local/go2rtc/bin/go2rtc /usr/local/bin/go2rtc
msg_ok "Installed go2rtc"
msg_info "Installing object detection models"
cd /opt/frigate
if [[ "$CTTYPE" == "0" ]]; then
msg_info "Setting Up Hardware Acceleration"
$STD apt-get -y install {va-driver-all,ocl-icd-libopencl1,intel-opencl-icd,vainfo,intel-gpu-tools}
chgrp video /dev/dri
chmod 755 /dev/dri
chmod 660 /dev/dri/*
$STD adduser $(id -u -n) video
$STD adduser $(id -u -n) render
msg_ok "Set Up Hardware Acceleration"
fi
### OpenVino
$STD apt install -y wget python3 python3-distutils
$STD wget https://bootstrap.pypa.io/get-pip.py -O get-pip.py
$STD python3 get-pip.py "pip"
$STD pip install -r docker/main/requirements-ov.txt
# Get OpenVino Model
RELEASE=$(curl -s https://api.github.com/repos/blakeblackshear/frigate/releases/latest | grep -o '"tag_name": *"[^"]*"' | cut -d '"' -f 4)
msg_info "Installing Frigate $RELEASE (Perseverance)"
cd ~
mkdir -p /opt/frigate/models
cd /opt/frigate/models
$STD omz_downloader --name ssdlite_mobilenet_v2
cd /opt/frigate/models
$STD omz_converter --name ssdlite_mobilenet_v2 --precision FP16
# Build libUSB without udev. Needed for Openvino NCS2 support
wget -q https://github.com/blakeblackshear/frigate/archive/refs/tags/${RELEASE}.tar.gz -O frigate.tar.gz
tar -xzf frigate.tar.gz -C /opt/frigate --strip-components 1
rm -rf frigate.tar.gz
cd /opt/frigate
$STD pip3 wheel --wheel-dir=/wheels -r /opt/frigate/docker/main/requirements-wheels.txt
cp -a /opt/frigate/docker/main/rootfs/. /
export TARGETARCH="amd64"
echo 'libc6 libraries/restart-without-asking boolean true' | debconf-set-selections
$STD /opt/frigate/docker/main/install_deps.sh
$STD ln -svf /usr/lib/btbn-ffmpeg/bin/ffmpeg /usr/local/bin/ffmpeg
$STD ln -svf /usr/lib/btbn-ffmpeg/bin/ffprobe /usr/local/bin/ffprobe
$STD pip3 install -U /wheels/*.whl
ldconfig
$STD pip3 install -r /opt/frigate/docker/main/requirements-dev.txt
$STD /opt/frigate/.devcontainer/initialize.sh
$STD make version
cd /opt/frigate/web
$STD npm install
$STD npm run build
cp -r /opt/frigate/web/dist/* /opt/frigate/web/
cp -r /opt/frigate/config/. /config
sed -i '/^s6-svc -O \.$/s/^/#/' /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run
msg_ok "Installed Frigate $RELEASE"
msg_info "Installing Object Detection Models (Resilience)"
$STD pip install -r /opt/frigate/docker/main/requirements-ov.txt
cd /opt/frigate/models
export ENABLE_ANALYTICS=NO
$STD /usr/local/bin/omz_downloader --name ssdlite_mobilenet_v2
cd ..
export CCACHE_DIR=/root/.ccache
export CCACHE_MAXSIZE=2G
$STD apt install -y unzip build-essential automake libtool ccache pkg-config
$STD wget https://github.com/libusb/libusb/archive/v1.0.26.zip -O v1.0.26.zip
$STD unzip v1.0.26.zip
wget -q https://github.com/libusb/libusb/archive/v1.0.26.zip
unzip -q v1.0.26.zip
cd libusb-1.0.26
$STD ./bootstrap.sh
$STD ./configure --disable-udev --enable-shared
$STD make -j $(nproc --all)
$STD apt install -y --no-install-recommends libusb-1.0-0-dev
cd /opt/frigate/libusb-1.0.26/libusb
mkdir -p /usr/local/lib
$STD /bin/bash ../libtool --mode=install /usr/bin/install -c libusb-1.0.la '/usr/local/lib'
mkdir -p /usr/local/include/libusb-1.0
$STD /usr/bin/install -c -m 644 libusb.h '/usr/local/include/libusb-1.0'
mkdir -p /usr/local/lib/pkgconfig
cd /opt/frigate/libusb-1.0.26/
$STD /usr/bin/install -c -m 644 libusb-1.0.pc '/usr/local/lib/pkgconfig'
ldconfig
######## Frigate expects model files at root of filesystem
#cd /opt/frigate/models
cd /
# Get model and labels
$STD wget -O edgetpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite
$STD wget -O cpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess.tflite
#cp /opt/frigate/labelmap.txt .
$STD cp /opt/frigate/labelmap.txt /labelmap.txt
$STD cp -r /opt/frigate/models/public/ssdlite_mobilenet_v2/FP16 openvino-model
$STD wget https://github.com/openvinotoolkit/open_model_zoo/raw/master/data/dataset_classes/coco_91cl_bkgr.txt -O openvino-model/coco_91cl_bkgr.txt
cd ~
wget -qO edgetpu_model.tflite https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite
wget -qO 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
cp -r /opt/frigate/models/public/ssdlite_mobilenet_v2 openvino-model
wget -q https://github.com/openvinotoolkit/open_model_zoo/raw/master/data/dataset_classes/coco_91cl_bkgr.txt -O openvino-model/coco_91cl_bkgr.txt
sed -i 's/truck/car/g' openvino-model/coco_91cl_bkgr.txt
# Get Audio Model and labels
$STD wget -qO cpu_audio_model.tflite https://tfhub.dev/google/lite-model/yamnet/classification/tflite/1?lite-format=tflite
$STD cp /opt/frigate/audio-labelmap.txt /audio-labelmap.txt
msg_ok "Installed object detection models"
wget -qO cpu_audio_model.tflite https://tfhub.dev/google/lite-model/yamnet/classification/tflite/1?lite-format=tflite
cp /opt/frigate/audio-labelmap.txt /audio-labelmap.txt
msg_ok "Installed Object Detection Models"
msg_info "Configuring Python dependencies"
cd /opt/frigate
$STD apt install -y python3 python3-dev wget build-essential cmake git pkg-config libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev gfortran openexr libatlas-base-dev libssl-dev libtbb2 libtbb-dev libdc1394-22-dev libopenexr-dev libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev gcc gfortran libopenblas-dev liblapack-dev
$STD pip3 install -r docker/main/requirements.txt
$STD pip3 wheel --wheel-dir=/wheels -r /opt/frigate/docker/main/requirements-wheels.txt
#pip3 wheel --wheel-dir=/trt-wheels -r /opt/frigate/docker/tensorrt/requirements-amd64.txt
#Copy preconfigured files
$STD cp -a /opt/frigate/docker/main/rootfs/. /
#exports are lost upon system reboot...
#export PATH="$PATH:/usr/lib/btbn-ffmpeg/bin:/usr/local/go2rtc/bin:/usr/local/nginx/sbin"
# Install dependencies
$STD /opt/frigate/docker/main/install_deps.sh
#Create symbolic links to ffmpeg and go2rtc
$STD ln -svf /usr/lib/btbn-ffmpeg/bin/ffmpeg /usr/local/bin/ffmpeg
$STD ln -svf /usr/lib/btbn-ffmpeg/bin/ffprobe /usr/local/bin/ffprobe
$STD ln -svf /usr/local/go2rtc/bin/go2rtc /usr/local/bin/go2rtc
$STD pip3 install -U /wheels/*.whl
ldconfig
msg_ok "Configured Python dependencies"
msg_info "Installing NodeJS"
# Install Node 16
#wget -O- https://deb.nodesource.com/setup_16.x | bash -
# Install Node 21
#curl -fsSL https://deb.nodesource.com/setup_21.x | sudo -E bash -
#curl -fsSL https://deb.nodesource.com/setup_21.x | bash -
$STD wget https://deb.nodesource.com/setup_21.x
$STD /bin/bash setup_21.x
$STD apt install -y nodejs
#npm install -g npm@9
$STD npm install -g npm
msg_ok "Installed NodeJS"
msg_info "Installing Frigate"
$STD pip3 install -r /opt/frigate/docker/main/requirements-dev.txt
cd /opt/frigate
$STD /opt/frigate/.devcontainer/initialize.sh
$STD make version
# Frigate web build
# This should be architecture agnostic, so speed up the build on multiarch by not using QEMU.
cd /opt/frigate/web
$STD npm install
$STD npm run build
$STD cp -r dist/BASE_PATH/monacoeditorwork/* dist/assets/
cd /opt/frigate/
$STD cp -r /opt/frigate/web/dist/* /opt/frigate/web/
### BUILD COMPLETE, NOW INITIALIZE
mkdir /config
$STD cp -r /opt/frigate/config/. /config
$STD cp /config/config.yml.example /config/config.yml
################### EDIT CONFIG FILE HERE ################
#mqtt:
# enabled: False
#
#cameras:
# Camera1:
# ffmpeg:
# hwaccel_args: -c:v h264_cuvid
## hwaccel_args: preset-nvidia-h264 #This one is not working...
# inputs:
# - path: rtsp://user:password@192.168.1.123:554/h264Preview_01_main
# roles:
# - detect
# detect:
# enabled: False
# width: 2560
# height: 1920
#########################################################
cd /opt/frigate
msg_ok "Installed Frigate"
msg_info "Configuring Services"
#####Start order should be:
#1. Go2rtc
#2. Frigate
#3. Nginx
### Starting go2rtc
#Create systemd service. If done manually, edit the file (nano /etc/systemd/system/go2rtc.service) then copy/paste the service configuraiton
go2rtc_service="$(cat << EOF
msg_info "Building Nginx with Custom Modules"
$STD /opt/frigate/docker/main/build_nginx.sh
sed -i 's/exec nginx/exec \/usr\/local\/nginx\/sbin\/nginx/g' /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run
sed -i 's/error_log \/dev\/stdout warn\;/error_log nginx\.err warn\;/' /usr/local/nginx/conf/nginx.conf
sed -i 's/access_log \/dev\/stdout main\;/access_log nginx\.log main\;/' /usr/local/nginx/conf/nginx.conf
msg_ok "Built Nginx"
msg_info "Creating Services"
cat <<EOF >/etc/systemd/system/go2rtc.service
[Unit]
Description=go2rtc service
After=network.target
@ -230,34 +132,10 @@ ExecStart=bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/run
[Install]
WantedBy=multi-user.target
EOF
)"
echo "${go2rtc_service}" > /etc/systemd/system/go2rtc.service
$STD systemctl start go2rtc
$STD systemctl enable go2rtc
#Allow for a small delay before starting the next service
systemctl enable -q --now go2rtc
sleep 3
#Test go2rtc access at
#http://<machine_ip>:1984/
### Starting Frigate
#First, comment the call to S6 in the run script
sed -i '/^s6-svc -O \.$/s/^/#/' /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/run
#Second, install yq, needed by script to check database path
$STD wget -O /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
chmod a+x /usr/local/bin/yq
#Create systemd service
frigate_service="$(cat << EOF
cat <<EOF >/etc/systemd/system/frigate.service
[Unit]
Description=Frigate service
After=go2rtc.service
@ -272,31 +150,10 @@ ExecStart=bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/ru
[Install]
WantedBy=multi-user.target
EOF
)"
echo "${frigate_service}" > /etc/systemd/system/frigate.service
$STD systemctl start frigate
$STD systemctl enable frigate
#Allow for a small delay before starting the next service
systemctl enable -q --now frigate
sleep 3
### Starting Nginx
## Call nginx from absolute path
## nginx --> /usr/local/nginx/sbin/nginx
sed -i 's/exec nginx/exec \/usr\/local\/nginx\/sbin\/nginx/g' /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run
#Can't log to /dev/stdout with systemd, so log to file
sed -i 's/error_log \/dev\/stdout warn\;/error_log nginx\.err warn\;/' /usr/local/nginx/conf/nginx.conf
sed -i 's/access_log \/dev\/stdout main\;/access_log nginx\.log main\;/' /usr/local/nginx/conf/nginx.conf
#Create systemd service
nginx_service="$(cat << EOF
cat <<EOF >/etc/systemd/system/nginx.service
[Unit]
Description=Nginx service
After=frigate.service
@ -311,30 +168,14 @@ ExecStart=bash /opt/frigate/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/run
[Install]
WantedBy=multi-user.target
EOF
)"
echo "${nginx_service}" > /etc/systemd/system/nginx.service
$STD systemctl start nginx
$STD systemctl enable nginx
systemctl enable -q --now nginx
msg_ok "Configured Services"
#Test frigate through Nginx access at
#http://<machine_ip>:5000/
######## FULL FRIGATE CONFIG EXAMPLE:
#https://docs.frigate.video/configuration/
motd_ssh
customize
msg_info "Cleaning up"
rm /opt/frigate.tar.gz
$STD apt-get autoremove
$STD apt-get autoclean
msg_ok "Cleaned"
msg_ok "Don't forget to edit the Frigate config file (/config/config.yml) and reboot. Example configuration at https://docs.frigate.video/configuration/"
msg_ok "Frigate standalone installation complete! You can access the web interface at http://<machine_ip>:5000"