parent
4e7c86505f
commit
d9a9fe6a86
|
@ -6,14 +6,9 @@ self: super: {
|
||||||
packageOverrides = python-self: python-super: {
|
packageOverrides = python-self: python-super: {
|
||||||
pytapo = python-self.callPackage ./pytapo { };
|
pytapo = python-self.callPackage ./pytapo { };
|
||||||
brother-ql = python-self.callPackage ./brother-ql { };
|
brother-ql = python-self.callPackage ./brother-ql { };
|
||||||
onvif-zeep = python-self.callPackage ./onvif-zeep { };
|
|
||||||
motmetrics = python-self.callPackage ./motmetrics { };
|
|
||||||
norfair = python-self.callPackage ./norfair { };
|
|
||||||
pydantic = python-super.pydantic_1;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
frigate = super.callPackage ./frigate { };
|
|
||||||
#gotosocial = super.callPackage ./gotosocial { };
|
#gotosocial = super.callPackage ./gotosocial { };
|
||||||
pulse-secure = super.callPackage ./pulse-secure { };
|
pulse-secure = super.callPackage ./pulse-secure { };
|
||||||
studio-link = super.callPackage ./studio-link { };
|
studio-link = super.callPackage ./studio-link { };
|
||||||
|
|
|
@ -1,170 +0,0 @@
|
||||||
{ lib
|
|
||||||
, callPackage
|
|
||||||
, python3
|
|
||||||
, fetchFromGitHub
|
|
||||||
, fetchurl
|
|
||||||
, frigate
|
|
||||||
, nixosTests
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
version = "0.13.1";
|
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
|
||||||
#name = "frigate-${version}-source";
|
|
||||||
owner = "blakeblackshear";
|
|
||||||
repo = "frigate";
|
|
||||||
rev = "refs/tags/v${version}";
|
|
||||||
hash = "sha256-2J7DhnYDX9ubbsk0qhji/vIKDouy9IqQztzbdPj2kxo=";
|
|
||||||
};
|
|
||||||
|
|
||||||
frigate-web = callPackage ./web.nix {
|
|
||||||
inherit version src;
|
|
||||||
};
|
|
||||||
|
|
||||||
python = python3.override {
|
|
||||||
packageOverrides = self: super: {
|
|
||||||
|
|
||||||
versioningit = super.versioningit.overridePythonAttrs {
|
|
||||||
# checkPhase requires pydantic>=2
|
|
||||||
doCheck = false;
|
|
||||||
};
|
|
||||||
onvif-zeep = self.callPackage ../onvif-zeep { };
|
|
||||||
norfair = self.callPackage ../norfair { };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Tensorflow Lite models
|
|
||||||
# https://github.com/blakeblackshear/frigate/blob/v0.13.0/docker/main/Dockerfile#L96-L97
|
|
||||||
tflite_cpu_model = fetchurl {
|
|
||||||
url = "https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess.tflite";
|
|
||||||
hash = "sha256-kLszpjTgQZFMwYGapd+ZgY5sOWxNLblSwP16nP/Eck8=";
|
|
||||||
};
|
|
||||||
tflite_edgetpu_model = fetchurl {
|
|
||||||
url = "https://github.com/google-coral/test_data/raw/release-frogfish/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite";
|
|
||||||
hash = "sha256-Siviu7YU5XbVbcuRT6UnUr8PE0EVEnENNV2X+qGzVkE=";
|
|
||||||
};
|
|
||||||
|
|
||||||
# OpenVino models
|
|
||||||
# https://github.com/blakeblackshear/frigate/blob/v0.13.0/docker/main/Dockerfile#L101
|
|
||||||
openvino_model = fetchurl {
|
|
||||||
url = "https://github.com/openvinotoolkit/open_model_zoo/raw/master/data/dataset_classes/coco_91cl_bkgr.txt";
|
|
||||||
hash = "sha256-5Cj2vEiWR8Z9d2xBmVoLZuNRv4UOuxHSGZQWTJorXUQ=";
|
|
||||||
};
|
|
||||||
in
|
|
||||||
python.pkgs.buildPythonApplication rec {
|
|
||||||
pname = "frigate";
|
|
||||||
inherit version;
|
|
||||||
format = "other";
|
|
||||||
|
|
||||||
inherit src;
|
|
||||||
|
|
||||||
postPatch = ''
|
|
||||||
echo 'VERSION = "${version}"' > frigate/version.py
|
|
||||||
|
|
||||||
substituteInPlace frigate/app.py \
|
|
||||||
--replace "Router(migrate_db)" 'Router(migrate_db, "${placeholder "out"}/share/frigate/migrations")'
|
|
||||||
|
|
||||||
substituteInPlace frigate/const.py \
|
|
||||||
--replace "/media/frigate" "/var/lib/frigate" \
|
|
||||||
--replace "/tmp/cache" "/var/cache/frigate" \
|
|
||||||
--replace "/config" "/var/lib/frigate" \
|
|
||||||
--replace "{CONFIG_DIR}/model_cache" "/var/cache/frigate/model_cache"
|
|
||||||
|
|
||||||
substituteInPlace frigate/http.py \
|
|
||||||
--replace "/opt/frigate" "${placeholder "out"}/${python.sitePackages}"
|
|
||||||
|
|
||||||
substituteInPlace frigate/output.py \
|
|
||||||
--replace "/opt/frigate" "${placeholder "out"}/${python.sitePackages}"
|
|
||||||
|
|
||||||
substituteInPlace frigate/detectors/detector_config.py \
|
|
||||||
--replace "/labelmap.txt" "${placeholder "out"}/share/frigate/labelmap.txt"
|
|
||||||
|
|
||||||
substituteInPlace frigate/config.py \
|
|
||||||
--replace "/cpu_model.tflite" "${tflite_cpu_model}" \
|
|
||||||
--replace "/edgetpu_model.tflite" "${tflite_edgetpu_model}"
|
|
||||||
|
|
||||||
substituteInPlace frigate/test/test_config.py \
|
|
||||||
--replace "(MODEL_CACHE_DIR" "('/build/model_cache'" \
|
|
||||||
--replace "/config/model_cache" "/build/model_cache"
|
|
||||||
'';
|
|
||||||
|
|
||||||
dontBuild = true;
|
|
||||||
|
|
||||||
propagatedBuildInputs = with python.pkgs; [
|
|
||||||
# docker/main/requirements.txt
|
|
||||||
scikit-build
|
|
||||||
# docker/main/requirements-wheel.txt
|
|
||||||
click
|
|
||||||
flask
|
|
||||||
imutils
|
|
||||||
matplotlib
|
|
||||||
norfair
|
|
||||||
numpy
|
|
||||||
onvif-zeep
|
|
||||||
opencv4
|
|
||||||
openvino
|
|
||||||
paho-mqtt
|
|
||||||
peewee
|
|
||||||
peewee-migrate
|
|
||||||
psutil
|
|
||||||
py3nvml
|
|
||||||
pydantic
|
|
||||||
pytz
|
|
||||||
pyyaml
|
|
||||||
requests
|
|
||||||
ruamel-yaml
|
|
||||||
scipy
|
|
||||||
setproctitle
|
|
||||||
tensorflow
|
|
||||||
tzlocal
|
|
||||||
unidecode
|
|
||||||
ws4py
|
|
||||||
];
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
runHook preInstall
|
|
||||||
|
|
||||||
mkdir -p $out/${python.sitePackages}/frigate
|
|
||||||
cp -R frigate/* $out/${python.sitePackages}/frigate/
|
|
||||||
|
|
||||||
mkdir -p $out/share/frigate
|
|
||||||
cp -R {migrations,labelmap.txt} $out/share/frigate/
|
|
||||||
|
|
||||||
cp --no-preserve=mode ${openvino_model} $out/share/frigate/coco_91cl_bkgr.txt
|
|
||||||
sed -i 's/truck/car/g' $out/share/frigate/coco_91cl_bkgr.txt
|
|
||||||
|
|
||||||
runHook postInstall
|
|
||||||
'';
|
|
||||||
|
|
||||||
nativeCheckInputs = with python.pkgs; [
|
|
||||||
pytestCheckHook
|
|
||||||
];
|
|
||||||
|
|
||||||
disabledTests = [
|
|
||||||
# Test needs network access
|
|
||||||
"test_plus_labelmap"
|
|
||||||
];
|
|
||||||
|
|
||||||
passthru = {
|
|
||||||
web = frigate-web;
|
|
||||||
inherit python;
|
|
||||||
pythonPath =(python.pkgs.makePythonPath propagatedBuildInputs) + ":${frigate}/${python.sitePackages}";
|
|
||||||
tests = {
|
|
||||||
inherit (nixosTests) frigate;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
meta = with lib; {
|
|
||||||
changelog = "https://github.com/blakeblackshear/frigate/releases/tag/v${version}";
|
|
||||||
description = "NVR with realtime local object detection for IP cameras";
|
|
||||||
longDescription = ''
|
|
||||||
A complete and local NVR designed for Home Assistant with AI
|
|
||||||
object detection. Uses OpenCV and Tensorflow to perform realtime
|
|
||||||
object detection locally for IP cameras.
|
|
||||||
'';
|
|
||||||
homepage = "https://github.com/blakeblackshear/frigate";
|
|
||||||
license = licenses.mit;
|
|
||||||
maintainers = with maintainers; [ hexa ];
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,26 +0,0 @@
|
||||||
{ buildNpmPackage
|
|
||||||
, src
|
|
||||||
, version
|
|
||||||
}:
|
|
||||||
|
|
||||||
buildNpmPackage {
|
|
||||||
pname = "frigate-web";
|
|
||||||
inherit version src;
|
|
||||||
|
|
||||||
sourceRoot = "${src.name}/web";
|
|
||||||
|
|
||||||
postPatch = ''
|
|
||||||
substituteInPlace package.json \
|
|
||||||
--replace "--base=/BASE_PATH/" ""
|
|
||||||
|
|
||||||
substituteInPlace src/routes/Storage.jsx \
|
|
||||||
--replace "/media/frigate" "/var/lib/frigate" \
|
|
||||||
--replace "/tmp/cache" "/var/cache/frigate"
|
|
||||||
'';
|
|
||||||
|
|
||||||
npmDepsHash = "sha256-+36quezGArqIM9dM+UihwcIgmE3EVmJQThuicLgDW4A=";
|
|
||||||
|
|
||||||
installPhase = ''
|
|
||||||
cp -rv dist/ $out
|
|
||||||
'';
|
|
||||||
}
|
|
|
@ -2,6 +2,5 @@
|
||||||
imports = [
|
imports = [
|
||||||
#./gotosocial.nix
|
#./gotosocial.nix
|
||||||
./mealie.nix
|
./mealie.nix
|
||||||
#./frigate.nix
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,438 +0,0 @@
|
||||||
{ config
|
|
||||||
, lib
|
|
||||||
, pkgs
|
|
||||||
, ...
|
|
||||||
}:
|
|
||||||
|
|
||||||
let
|
|
||||||
inherit (lib)
|
|
||||||
literalExpression
|
|
||||||
mkDefault
|
|
||||||
mdDoc
|
|
||||||
mkEnableOption
|
|
||||||
mkPackageOption
|
|
||||||
mkIf
|
|
||||||
mkOption
|
|
||||||
types;
|
|
||||||
|
|
||||||
cfg = config.services.frigate;
|
|
||||||
|
|
||||||
format = pkgs.formats.yaml { };
|
|
||||||
|
|
||||||
filteredConfig = lib.converge (lib.filterAttrsRecursive (_: v: ! lib.elem v [ null ])) cfg.settings;
|
|
||||||
|
|
||||||
cameraFormat = with types; submodule {
|
|
||||||
freeformType = format.type;
|
|
||||||
options = {
|
|
||||||
ffmpeg = {
|
|
||||||
inputs = mkOption {
|
|
||||||
description = mdDoc ''
|
|
||||||
List of inputs for this camera.
|
|
||||||
'';
|
|
||||||
type = listOf (submodule {
|
|
||||||
freeformType = format.type;
|
|
||||||
options = {
|
|
||||||
path = mkOption {
|
|
||||||
type = str;
|
|
||||||
example = "rtsp://192.0.2.1:554/rtsp";
|
|
||||||
description = mdDoc ''
|
|
||||||
Stream URL
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
roles = mkOption {
|
|
||||||
type = listOf (enum [ "detect" "record" "rtmp" ]);
|
|
||||||
example = literalExpression ''
|
|
||||||
[ "detect" "rtmp" ]
|
|
||||||
'';
|
|
||||||
description = mdDoc ''
|
|
||||||
List of roles for this stream
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
});
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
in
|
|
||||||
|
|
||||||
{
|
|
||||||
meta.buildDocsInSandbox = false;
|
|
||||||
|
|
||||||
options.services.frigate = with types; {
|
|
||||||
enable = mkEnableOption (mdDoc "Frigate NVR");
|
|
||||||
|
|
||||||
package = mkPackageOption pkgs "frigate" { };
|
|
||||||
|
|
||||||
hostname = mkOption {
|
|
||||||
type = str;
|
|
||||||
example = "frigate.exampe.com";
|
|
||||||
description = mdDoc ''
|
|
||||||
Hostname of the nginx vhost to configure.
|
|
||||||
|
|
||||||
Only nginx is supported by upstream for direct reverse proxying.
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
settings = mkOption {
|
|
||||||
type = submodule {
|
|
||||||
freeformType = format.type;
|
|
||||||
options = {
|
|
||||||
cameras = mkOption {
|
|
||||||
type = attrsOf cameraFormat;
|
|
||||||
description = mdDoc ''
|
|
||||||
Attribute set of cameras configurations.
|
|
||||||
|
|
||||||
https://docs.frigate.video/configuration/cameras
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
database = {
|
|
||||||
path = mkOption {
|
|
||||||
type = path;
|
|
||||||
default = "/var/lib/frigate/frigate.db";
|
|
||||||
description = mdDoc ''
|
|
||||||
Path to the SQLite database used
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
mqtt = {
|
|
||||||
enabled = mkEnableOption (mdDoc "MQTT support");
|
|
||||||
|
|
||||||
host = mkOption {
|
|
||||||
type = nullOr str;
|
|
||||||
default = null;
|
|
||||||
example = "mqtt.example.com";
|
|
||||||
description = mdDoc ''
|
|
||||||
MQTT server hostname
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
default = { };
|
|
||||||
description = mdDoc ''
|
|
||||||
Frigate configuration as a nix attribute set.
|
|
||||||
|
|
||||||
See the project documentation for how to configure frigate.
|
|
||||||
- [Creating a config file](https://docs.frigate.video/guides/getting_started)
|
|
||||||
- [Configuration reference](https://docs.frigate.video/configuration/index)
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = mkIf cfg.enable {
|
|
||||||
services.nginx = {
|
|
||||||
enable = true;
|
|
||||||
additionalModules = with pkgs.nginxModules; [
|
|
||||||
secure-token
|
|
||||||
rtmp
|
|
||||||
vod
|
|
||||||
];
|
|
||||||
recommendedProxySettings = mkDefault true;
|
|
||||||
recommendedGzipSettings = mkDefault true;
|
|
||||||
mapHashBucketSize = mkDefault 128;
|
|
||||||
upstreams = {
|
|
||||||
frigate-api.servers = {
|
|
||||||
"127.0.0.1:5001" = { };
|
|
||||||
};
|
|
||||||
frigate-mqtt-ws.servers = {
|
|
||||||
"127.0.0.1:5002" = { };
|
|
||||||
};
|
|
||||||
frigate-jsmpeg.servers = {
|
|
||||||
"127.0.0.1:8082" = { };
|
|
||||||
};
|
|
||||||
frigate-go2rtc.servers = {
|
|
||||||
"127.0.0.1:1984" = { };
|
|
||||||
};
|
|
||||||
};
|
|
||||||
proxyCachePath."frigate" = {
|
|
||||||
enable = true;
|
|
||||||
keysZoneSize = "10m";
|
|
||||||
keysZoneName = "api_cache";
|
|
||||||
maxSize = "10m";
|
|
||||||
inactive = "1m";
|
|
||||||
levels = "1:2";
|
|
||||||
};
|
|
||||||
# Based on https://github.com/blakeblackshear/frigate/blob/v0.12.0/docker/rootfs/usr/local/nginx/conf/nginx.conf
|
|
||||||
virtualHosts."${cfg.hostname}" = {
|
|
||||||
locations = {
|
|
||||||
"/api/" = {
|
|
||||||
proxyPass = "http://frigate-api/";
|
|
||||||
extraConfig = ''
|
|
||||||
proxy_cache api_cache;
|
|
||||||
proxy_cache_lock on;
|
|
||||||
proxy_cache_use_stale updating;
|
|
||||||
proxy_cache_valid 200 5s;
|
|
||||||
proxy_cache_bypass $http_x_cache_bypass;
|
|
||||||
proxy_no_cache $should_not_cache;
|
|
||||||
add_header X-Cache-Status $upstream_cache_status;
|
|
||||||
|
|
||||||
location /api/vod/ {
|
|
||||||
proxy_pass http://frigate-api/vod/;
|
|
||||||
proxy_cache off;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /api/stats {
|
|
||||||
access_log off;
|
|
||||||
rewrite ^/api/(.*)$ $1 break;
|
|
||||||
proxy_pass http://frigate-api;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /api/version {
|
|
||||||
access_log off;
|
|
||||||
rewrite ^/api/(.*)$ $1 break;
|
|
||||||
proxy_pass http://frigate-api;
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
"~* /api/.*\.(jpg|jpeg|png)$" = {
|
|
||||||
proxyPass = "http://frigate-api";
|
|
||||||
extraConfig = ''
|
|
||||||
rewrite ^/api/(.*)$ $1 break;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
"/vod/" = {
|
|
||||||
extraConfig = ''
|
|
||||||
aio threads;
|
|
||||||
vod hls;
|
|
||||||
|
|
||||||
secure_token $args;
|
|
||||||
secure_token_types application/vnd.apple.mpegurl;
|
|
||||||
|
|
||||||
add_header Cache-Control "no-store";
|
|
||||||
expires off;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
"/stream/" = {
|
|
||||||
# TODO
|
|
||||||
};
|
|
||||||
"/ws" = {
|
|
||||||
proxyPass = "http://frigate-mqtt-ws/";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
};
|
|
||||||
"/live/jsmpeg" = {
|
|
||||||
proxyPass = "http://frigate-jsmpeg/";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
};
|
|
||||||
"/live/mse/" = {
|
|
||||||
proxyPass = "http://frigate-go2rtc/";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
};
|
|
||||||
# frigate lovelace card uses this path
|
|
||||||
"/live/mse/api/ws" = {
|
|
||||||
proxyPass = "http://frigate-go2rtc/api/ws";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
extraConfig = ''
|
|
||||||
limit_except GET {
|
|
||||||
deny all;
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
"/live/webrtc/" = {
|
|
||||||
proxyPass = "http://frigate-go2rtc/";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
};
|
|
||||||
"/live/webrtc/api/ws" = {
|
|
||||||
proxyPass = "http://frigate-go2rtc/api/ws";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
extraConfig = ''
|
|
||||||
limit_except GET {
|
|
||||||
deny all;
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
# pass through go2rtc player
|
|
||||||
"/live/webrtc/webrtc.html" = {
|
|
||||||
proxyPass = "http://frigate-go2rtc/webrtc.html";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
extraConfig = ''
|
|
||||||
limit_except GET {
|
|
||||||
deny all;
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
"/api/go2rtc/api" = {
|
|
||||||
proxyPass = "http://frigate-go2rtc/api";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
extraConfig = ''
|
|
||||||
limit_except GET {
|
|
||||||
deny all;
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
# integrationn uses this to add webrtc candidate
|
|
||||||
"/api/go2rtc/webrtc" = {
|
|
||||||
proxyPass = "http://frigate-go2rtc/api/webrtc";
|
|
||||||
proxyWebsockets = true;
|
|
||||||
extraConfig = ''
|
|
||||||
limit_except GET {
|
|
||||||
deny all;
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
"/cache/" = {
|
|
||||||
alias = "/var/cache/frigate/";
|
|
||||||
};
|
|
||||||
"/clips/" = {
|
|
||||||
root = "/var/lib/frigate";
|
|
||||||
extraConfig = ''
|
|
||||||
types {
|
|
||||||
video/mp4 mp4;
|
|
||||||
image/jpeg jpg;
|
|
||||||
}
|
|
||||||
|
|
||||||
autoindex on;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
"/recordings/" = {
|
|
||||||
root = "/var/lib/frigate";
|
|
||||||
extraConfig = ''
|
|
||||||
types {
|
|
||||||
video/mp4 mp4;
|
|
||||||
}
|
|
||||||
|
|
||||||
autoindex on;
|
|
||||||
autoindex_format json;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
"/assets/" = {
|
|
||||||
root = cfg.package.web;
|
|
||||||
extraConfig = ''
|
|
||||||
access_log off;
|
|
||||||
expires 1y;
|
|
||||||
add_header Cache-Control "public";
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
"/" = {
|
|
||||||
root = cfg.package.web;
|
|
||||||
tryFiles = "$uri $uri/ /index.html";
|
|
||||||
extraConfig = ''
|
|
||||||
add_header Cache-Control "no-store";
|
|
||||||
expires off;
|
|
||||||
|
|
||||||
sub_filter 'href="/BASE_PATH/' 'href="$http_x_ingress_path/';
|
|
||||||
sub_filter 'url(/BASE_PATH/' 'url($http_x_ingress_path/';
|
|
||||||
sub_filter '"/BASE_PATH/dist/' '"$http_x_ingress_path/dist/';
|
|
||||||
sub_filter '"/BASE_PATH/js/' '"$http_x_ingress_path/js/';
|
|
||||||
sub_filter '"/BASE_PATH/assets/' '"$http_x_ingress_path/assets/';
|
|
||||||
sub_filter '"/BASE_PATH/monacoeditorwork/' '"$http_x_ingress_path/assets/';
|
|
||||||
sub_filter 'return"/BASE_PATH/"' 'return window.baseUrl';
|
|
||||||
sub_filter '<body>' '<body><script>window.baseUrl="$http_x_ingress_path/";</script>';
|
|
||||||
sub_filter_types text/css application/javascript;
|
|
||||||
sub_filter_once off;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
extraConfig = ''
|
|
||||||
# vod settings
|
|
||||||
vod_base_url "";
|
|
||||||
vod_segments_base_url "";
|
|
||||||
vod_mode mapped;
|
|
||||||
vod_max_mapping_response_size 1m;
|
|
||||||
vod_upstream_location /api;
|
|
||||||
vod_align_segments_to_key_frames on;
|
|
||||||
vod_manifest_segment_durations_mode accurate;
|
|
||||||
vod_ignore_edit_list on;
|
|
||||||
vod_segment_duration 10000;
|
|
||||||
vod_hls_mpegts_align_frames off;
|
|
||||||
vod_hls_mpegts_interleave_frames on;
|
|
||||||
# file handle caching / aio
|
|
||||||
open_file_cache max=1000 inactive=5m;
|
|
||||||
open_file_cache_valid 2m;
|
|
||||||
open_file_cache_min_uses 1;
|
|
||||||
open_file_cache_errors on;
|
|
||||||
aio on;
|
|
||||||
# https://github.com/kaltura/nginx-vod-module#vod_open_file_thread_pool
|
|
||||||
vod_open_file_thread_pool default;
|
|
||||||
# vod caches
|
|
||||||
vod_metadata_cache metadata_cache 512m;
|
|
||||||
vod_mapping_cache mapping_cache 5m 10m;
|
|
||||||
# gzip manifest
|
|
||||||
gzip_types application/vnd.apple.mpegurl;
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
appendConfig = ''
|
|
||||||
rtmp {
|
|
||||||
server {
|
|
||||||
listen 1935;
|
|
||||||
chunk_size 4096;
|
|
||||||
allow publish 127.0.0.1;
|
|
||||||
deny publish all;
|
|
||||||
allow play all;
|
|
||||||
application live {
|
|
||||||
live on;
|
|
||||||
record off;
|
|
||||||
meta copy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
appendHttpConfig = ''
|
|
||||||
map $sent_http_content_type $should_not_cache {
|
|
||||||
'application/json' 0;
|
|
||||||
default 1;
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.nginx.serviceConfig.SupplementaryGroups = [
|
|
||||||
"frigate"
|
|
||||||
];
|
|
||||||
|
|
||||||
users.users.frigate = {
|
|
||||||
isSystemUser = true;
|
|
||||||
group = "frigate";
|
|
||||||
};
|
|
||||||
users.groups.frigate = { };
|
|
||||||
|
|
||||||
systemd.services.frigate = {
|
|
||||||
after = [
|
|
||||||
"go2rtc.service"
|
|
||||||
"network.target"
|
|
||||||
];
|
|
||||||
wantedBy = [
|
|
||||||
"multi-user.target"
|
|
||||||
];
|
|
||||||
environment = {
|
|
||||||
CONFIG_FILE = format.generate "frigate.yml" filteredConfig;
|
|
||||||
HOME = "/var/lib/frigate";
|
|
||||||
PYTHONPATH = cfg.package.pythonPath;
|
|
||||||
};
|
|
||||||
path = with pkgs; [
|
|
||||||
# unfree:
|
|
||||||
# config.boot.kernelPackages.nvidiaPackages.latest.bin
|
|
||||||
ffmpeg_5-headless
|
|
||||||
libva-utils
|
|
||||||
procps
|
|
||||||
radeontop
|
|
||||||
] ++ lib.optionals (!stdenv.isAarch64) [
|
|
||||||
# not available on aarch64-linux
|
|
||||||
intel-gpu-tools
|
|
||||||
];
|
|
||||||
serviceConfig = {
|
|
||||||
ExecStart = "${cfg.package.python.interpreter} -m frigate";
|
|
||||||
Restart = "on-failure";
|
|
||||||
|
|
||||||
User = "frigate";
|
|
||||||
Group = "frigate";
|
|
||||||
|
|
||||||
UMask = "0027";
|
|
||||||
|
|
||||||
StateDirectory = "frigate";
|
|
||||||
StateDirectoryMode = "0750";
|
|
||||||
|
|
||||||
# Caches
|
|
||||||
PrivateTmp = true;
|
|
||||||
CacheDirectory = "frigate";
|
|
||||||
CacheDirectoryMode = "0750";
|
|
||||||
|
|
||||||
BindPaths = [
|
|
||||||
"/migrations:${cfg.package}/share/frigate/migrations:ro"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,58 +0,0 @@
|
||||||
{ lib
|
|
||||||
, buildPythonPackage
|
|
||||||
, fetchFromGitHub
|
|
||||||
|
|
||||||
# build-system
|
|
||||||
, setuptools
|
|
||||||
|
|
||||||
# dependencies
|
|
||||||
, numpy
|
|
||||||
, pandas
|
|
||||||
, scipy
|
|
||||||
, xmltodict
|
|
||||||
|
|
||||||
# tests
|
|
||||||
, pytestCheckHook
|
|
||||||
, pytest-benchmark
|
|
||||||
}:
|
|
||||||
|
|
||||||
buildPythonPackage rec {
|
|
||||||
pname = "motmetrics";
|
|
||||||
version = "1.4.0-unstable-20240130";
|
|
||||||
pyproject = true;
|
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
|
||||||
owner = "cheind";
|
|
||||||
repo = "py-motmetrics";
|
|
||||||
# latest release is not compatible with pandas 2.0
|
|
||||||
rev = "7210fcce0be1b76c96a62f6fe4ddbc90d944eacb";
|
|
||||||
hash = "sha256-7LKLHXWgW4QpivAgzvWl6qEG0auVvpiZ6bfDViCKsFY=";
|
|
||||||
};
|
|
||||||
|
|
||||||
nativeBuildInputs = [
|
|
||||||
setuptools
|
|
||||||
];
|
|
||||||
|
|
||||||
propagatedBuildInputs = [
|
|
||||||
numpy
|
|
||||||
pandas
|
|
||||||
scipy
|
|
||||||
xmltodict
|
|
||||||
];
|
|
||||||
|
|
||||||
nativeCheckInputs = [
|
|
||||||
pytestCheckHook
|
|
||||||
pytest-benchmark
|
|
||||||
];
|
|
||||||
|
|
||||||
pythonImportsCheck = [
|
|
||||||
"motmetrics"
|
|
||||||
];
|
|
||||||
|
|
||||||
meta = with lib; {
|
|
||||||
description = "Bar_chart: Benchmark multiple object trackers (MOT) in Python";
|
|
||||||
homepage = "https://github.com/cheind/py-motmetrics";
|
|
||||||
license = licenses.mit;
|
|
||||||
maintainers = with maintainers; [ ];
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,69 +0,0 @@
|
||||||
{ lib
|
|
||||||
, buildPythonPackage
|
|
||||||
, fetchFromGitHub
|
|
||||||
, poetry-core
|
|
||||||
, filterpy
|
|
||||||
, importlib-metadata
|
|
||||||
, numpy
|
|
||||||
, rich
|
|
||||||
, scipy
|
|
||||||
, opencv4
|
|
||||||
, pytestCheckHook
|
|
||||||
, pythonRelaxDepsHook
|
|
||||||
, python3
|
|
||||||
}:
|
|
||||||
|
|
||||||
buildPythonPackage rec {
|
|
||||||
pname = "norfair";
|
|
||||||
version = "2.2.0";
|
|
||||||
pyproject = true;
|
|
||||||
|
|
||||||
src = fetchFromGitHub {
|
|
||||||
owner = "tryolabs";
|
|
||||||
repo = "norfair";
|
|
||||||
rev = "v${version}";
|
|
||||||
hash = "sha256-aKB5TYSLW7FOXIy9u2hK7px6eEmIQdKPrhChKaU1uYs=";
|
|
||||||
};
|
|
||||||
|
|
||||||
nativeBuildInputs = [
|
|
||||||
poetry-core
|
|
||||||
pythonRelaxDepsHook
|
|
||||||
];
|
|
||||||
|
|
||||||
pythonRelaxDeps = [
|
|
||||||
"rich"
|
|
||||||
];
|
|
||||||
|
|
||||||
propagatedBuildInputs = [
|
|
||||||
filterpy
|
|
||||||
importlib-metadata
|
|
||||||
numpy
|
|
||||||
rich
|
|
||||||
scipy
|
|
||||||
];
|
|
||||||
|
|
||||||
passthru.optional-dependencies = {
|
|
||||||
metrics = [
|
|
||||||
python3.pkgs.motmetrics
|
|
||||||
];
|
|
||||||
video = [
|
|
||||||
opencv4
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
nativeCheckInputs = [
|
|
||||||
pytestCheckHook
|
|
||||||
];
|
|
||||||
|
|
||||||
pythonImportsCheck = [
|
|
||||||
"norfair"
|
|
||||||
];
|
|
||||||
|
|
||||||
meta = with lib; {
|
|
||||||
description = "Lightweight Python library for adding real-time multi-object tracking to any detector";
|
|
||||||
changelog = "https://github.com/tryolabs/norfair/releases/tag/v${version}";
|
|
||||||
homepage = "https://github.com/tryolabs/norfair";
|
|
||||||
license = licenses.bsd3;
|
|
||||||
maintainers = with maintainers; [ fleaz ];
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
{ lib
|
|
||||||
, buildPythonPackage
|
|
||||||
, fetchPypi
|
|
||||||
, setuptools
|
|
||||||
, zeep
|
|
||||||
}:
|
|
||||||
|
|
||||||
buildPythonPackage rec {
|
|
||||||
pname = "onvif-zeep";
|
|
||||||
version = "0.2.12";
|
|
||||||
pyproject = true;
|
|
||||||
|
|
||||||
src = fetchPypi {
|
|
||||||
pname = "onvif_zeep";
|
|
||||||
inherit version;
|
|
||||||
hash = "sha256-qou8Aqc+qlCJSwwY45+o0xilg6ZkxlvzWzyAKdHEC0k=";
|
|
||||||
};
|
|
||||||
|
|
||||||
nativeBuildInputs = [
|
|
||||||
setuptools
|
|
||||||
];
|
|
||||||
|
|
||||||
propagatedBuildInputs = [
|
|
||||||
zeep
|
|
||||||
];
|
|
||||||
|
|
||||||
pythonImportsCheck = [
|
|
||||||
"onvif"
|
|
||||||
];
|
|
||||||
|
|
||||||
# Tests require hardware
|
|
||||||
doCheck = false;
|
|
||||||
|
|
||||||
meta = with lib; {
|
|
||||||
description = "Python Client for ONVIF Camera";
|
|
||||||
homepage = "https://github.com/quatanium/python-onvif";
|
|
||||||
license = licenses.mit;
|
|
||||||
maintainers = with maintainers; [ fleaz ];
|
|
||||||
};
|
|
||||||
}
|
|
Loading…
Reference in a new issue