From 310d6d6426df25c7bb87e2011bca101001bce5ce Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Fri, 11 Aug 2023 18:23:30 +0300 Subject: [PATCH] NAS-123485 / 24.04 / Add `frigate` to `community` apps (#1434) * Add `frigate` to `community` apps * add cia values * add initial templtes * add values * add common * fix typo * another one * make it non-fail no matter the indendation * typo * questions and gpu * perms * more caps * port * shm and usb * whops * privieleged on usb bus mount * invert logic --- library/ix-dev/community/frigate/Chart.lock | 6 + library/ix-dev/community/frigate/Chart.yaml | 25 ++ library/ix-dev/community/frigate/README.md | 5 + .../ix-dev/community/frigate/app-readme.md | 5 + .../frigate/charts/common-1.0.12.tgz | Bin 0 -> 56725 bytes .../community/frigate/ci/basic-values.yaml | 20 + .../community/frigate/ci/extra-values.yaml | 30 ++ .../community/frigate/ci/hostNet-values.yaml | 17 + library/ix-dev/community/frigate/item.yaml | 10 + .../ix-dev/community/frigate/metadata.yaml | 18 + .../ix-dev/community/frigate/questions.yaml | 351 ++++++++++++++++++ .../community/frigate/templates/NOTES.txt | 1 + .../community/frigate/templates/_frigate.tpl | 92 +++++ .../frigate/templates/_persistence.tpl | 69 ++++ .../community/frigate/templates/_portal.tpl | 16 + .../community/frigate/templates/_service.tpl | 65 ++++ .../community/frigate/templates/common.yaml | 11 + .../community/frigate/upgrade_info.json | 1 + .../ix-dev/community/frigate/upgrade_strategy | 31 ++ library/ix-dev/community/frigate/values.yaml | 39 ++ 20 files changed, 812 insertions(+) create mode 100644 library/ix-dev/community/frigate/Chart.lock create mode 100644 library/ix-dev/community/frigate/Chart.yaml create mode 100644 library/ix-dev/community/frigate/README.md create mode 100644 library/ix-dev/community/frigate/app-readme.md create mode 100644 library/ix-dev/community/frigate/charts/common-1.0.12.tgz create mode 100644 library/ix-dev/community/frigate/ci/basic-values.yaml create mode 100644 library/ix-dev/community/frigate/ci/extra-values.yaml create mode 100644 library/ix-dev/community/frigate/ci/hostNet-values.yaml create mode 100644 library/ix-dev/community/frigate/item.yaml create mode 100644 library/ix-dev/community/frigate/metadata.yaml create mode 100644 library/ix-dev/community/frigate/questions.yaml create mode 100644 library/ix-dev/community/frigate/templates/NOTES.txt create mode 100644 library/ix-dev/community/frigate/templates/_frigate.tpl create mode 100644 library/ix-dev/community/frigate/templates/_persistence.tpl create mode 100644 library/ix-dev/community/frigate/templates/_portal.tpl create mode 100644 library/ix-dev/community/frigate/templates/_service.tpl create mode 100644 library/ix-dev/community/frigate/templates/common.yaml create mode 100644 library/ix-dev/community/frigate/upgrade_info.json create mode 100755 library/ix-dev/community/frigate/upgrade_strategy create mode 100644 library/ix-dev/community/frigate/values.yaml diff --git a/library/ix-dev/community/frigate/Chart.lock b/library/ix-dev/community/frigate/Chart.lock new file mode 100644 index 0000000000..8fee3a5f0d --- /dev/null +++ b/library/ix-dev/community/frigate/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.12 +digest: sha256:debd30721d09ae8293b1cbdd9d0115981d40b47908be3035fc3cf657c9d5eedb +generated: "2023-08-09T18:48:28.063805611+03:00" diff --git a/library/ix-dev/community/frigate/Chart.yaml b/library/ix-dev/community/frigate/Chart.yaml new file mode 100644 index 0000000000..6b873b8c77 --- /dev/null +++ b/library/ix-dev/community/frigate/Chart.yaml @@ -0,0 +1,25 @@ +name: frigate +description: Frigate is an NVR With Realtime Object Detection for IP Cameras +annotations: + title: Frigate +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: 0.12.1 +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: + - name: common + repository: file://../../../common + version: 1.0.12 +home: https://github.com/blakeblackshear/frigate +icon: https://raw.githubusercontent.com/blakeblackshear/frigate/dev/web/images/favicon.svg +sources: + - https://github.com/truenas/charts/tree/master/library/ix-dev/community/frigate + - https://github.com/blakeblackshear/frigate +keywords: + - camera + - nvr diff --git a/library/ix-dev/community/frigate/README.md b/library/ix-dev/community/frigate/README.md new file mode 100644 index 0000000000..b83410de4d --- /dev/null +++ b/library/ix-dev/community/frigate/README.md @@ -0,0 +1,5 @@ +# Frigate + +[Frigate](https://github.com/frigate/frigate) is an NVR With Realtime Object Detection for IP Cameras + +> Note: **m.2** Coral TPU devices is not supported. diff --git a/library/ix-dev/community/frigate/app-readme.md b/library/ix-dev/community/frigate/app-readme.md new file mode 100644 index 0000000000..b83410de4d --- /dev/null +++ b/library/ix-dev/community/frigate/app-readme.md @@ -0,0 +1,5 @@ +# Frigate + +[Frigate](https://github.com/frigate/frigate) is an NVR With Realtime Object Detection for IP Cameras + +> Note: **m.2** Coral TPU devices is not supported. diff --git a/library/ix-dev/community/frigate/charts/common-1.0.12.tgz b/library/ix-dev/community/frigate/charts/common-1.0.12.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2ecabcba55df05979196b1abbc67173aae88ba1e GIT binary patch literal 56725 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 + This is required if you want to use USB devices, like Coral
+ This will mount the USB bus to /dev/bus/usb inside the container. + schema: + type: boolean + default: false + - variable: additionalEnvs + label: Additional Environment Variables + description: Configure additional environment variables for Frigate. + schema: + type: list + default: [] + items: + - variable: env + label: Environment Variable + schema: + type: dict + attrs: + - variable: name + label: Name + schema: + type: string + required: true + - variable: value + label: Value + schema: + type: string + required: true + + - variable: frigateNetwork + label: "" + group: Network Configuration + schema: + type: dict + attrs: + - variable: hostNetwork + label: Host Network + description: | + Bind to the host network. It's recommended to keep this disabled.
+ schema: + type: boolean + default: false + show_subquestions_if: false + subquestions: + - variable: webPort + label: Web Port + description: | + The port for the Frigate Web UI.
+ Internal port: 5000 + schema: + type: int + default: 30058 + min: 9000 + max: 65535 + required: true + - variable: enableRtmp + label: Enable RTMP + description: Enable RTMP for Frigate. + schema: + type: boolean + default: false + - variable: rtmpPort + label: RTMP Port + description: | + The RTMP port for Frigate.
+ Internal port: 1935 + schema: + type: int + default: 30059 + show_if: [["enableRtmp", "=", true]] + min: 9000 + max: 65535 + required: true + - variable: enableRtsp + label: Enable RTSP + description: Enable RTSP for Frigate. + schema: + type: boolean + default: false + - variable: rtspPort + label: RTSP Port + description: | + The RTSP port for Frigate.
+ Internal port: 8554 + schema: + type: int + default: 30060 + show_if: [["enableRtsp", "=", true]] + min: 9000 + max: 65535 + required: true + - variable: enableWebRtc + label: Enable WebRTC + description: Enable WebRTC for Frigate. + schema: + type: boolean + default: false + - variable: webRtcPort + label: WebRTC Port + description: | + The WebRTC port for Frigate.
+ Internal port: 8555
+ Applies to both TCP and UDP. + schema: + type: int + default: 30061 + show_if: [["enableWebRtc", "=", true]] + min: 9000 + max: 65535 + required: true + + - variable: frigateStorage + label: "" + group: Storage Configuration + schema: + type: dict + attrs: + - variable: config + label: Frigate Config Storage + description: The path to store Frigate Configuration. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "config" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: media + label: Frigate Media Storage + description: The path to store Frigate Media. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: "config" + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: cache + label: Frigate Cache Storage + schema: + type: dict + attrs: + - variable: sizeGiB + label: Size (GiB) + description: The size of RAM is allowed to Frigate to use as cache + schema: + type: int + max: 4 + default: 1 + required: true + - variable: shm + label: Frigate /dev/shm Storage + schema: + type: dict + attrs: + - variable: sizeMiB + label: Size (MiB) + description: | + The size of RAM is allowed to Frigate to use as /dev/shm
+ https://docs.frigate.video/frigate/installation/#calculating-required-shm-size + schema: + type: int + max: 2048 + default: 64 + required: true + - variable: additionalStorages + label: Additional Storage + description: Additional storage for Frigate. + schema: + type: list + default: [] + items: + - variable: storageEntry + label: Storage Entry + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: mountPath + label: Mount Path + description: The path inside the container to mount the storage. + schema: + type: path + required: true + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + required: true + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + immutable: true + default: "storage_entry" + $ref: + - "normalize/ixVolume" + + - variable: resources + group: Resources Configuration + label: "" + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for Frigate. + schema: + type: string + max_length: 6 + valid_chars: '^(0\.[1-9]|[1-9][0-9]*)(\.[0-9]|m?)$' + valid_chars_error: | + Valid CPU limit formats are
+ - Plain Integer - eg. 1
+ - Float - eg. 0.5
+ - Milicpu - eg. 500m + default: "4000m" + required: true + - variable: memory + label: Memory + description: Memory limit for Frigate. + schema: + type: string + max_length: 12 + valid_chars: '^[1-9][0-9]*([EPTGMK]i?|e[0-9]+)?$' + valid_chars_error: | + Valid Memory limit formats are
+ - Suffixed with E/P/T/G/M/K - eg. 1G
+ - Suffixed with Ei/Pi/Ti/Gi/Mi/Ki - eg. 1Gi
+ - Plain Integer in bytes - eg. 1024
+ - Exponent - eg. 134e6 + default: "8Gi" + required: true + + - variable: frigateGPU + group: Resources Configuration + label: GPU Configuration + schema: + type: dict + $ref: + - "definitions/gpuConfiguration" + attrs: [] diff --git a/library/ix-dev/community/frigate/templates/NOTES.txt b/library/ix-dev/community/frigate/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/frigate/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/frigate/templates/_frigate.tpl b/library/ix-dev/community/frigate/templates/_frigate.tpl new file mode 100644 index 0000000000..0b7d283148 --- /dev/null +++ b/library/ix-dev/community/frigate/templates/_frigate.tpl @@ -0,0 +1,92 @@ +{{- define "frigate.workload" -}} +workload: + frigate: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: {{ .Values.frigateNetwork.hostNetwork }} + containers: + frigate: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: 0 + runAsGroup: 0 + runAsNonRoot: false + readOnlyRootFilesystem: false + {{- if .Values.frigateConfig.mountUSBBus }} + privileged: true + allowPrivilegeEscalation: true + {{- end }} + capabilities: + add: + - CHOWN + - DAC_OVERRIDE + - FOWNER + - SETUID + - SETGID + {{ with .Values.frigateConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: http + port: 5000 + path: /api + readiness: + enabled: true + type: http + port: 5000 + path: /api + startup: + enabled: true + type: http + port: 5000 + path: /api + initContainers: + 01-init: + enabled: true + type: init + imageSelector: bashImage + securityContext: + runAsUser: 0 + runAsGroup: 0 + runAsNonRoot: false + readOnlyRootFilesystem: false + command: + - /bin/sh + args: + - -c + - | + if [ ! -f /config/config.yml ]; then + { + echo 'mqtt:' + echo ' enabled: false' + echo 'cameras:' + echo ' dummy:' + echo ' enabled: false' + echo ' ffmpeg:' + echo ' inputs:' + echo ' - path: rtsp://127.0.0.1:554/rtsp' + echo ' roles:' + echo ' - detect' + } > /config/config.yml + fi + {{- with .Values.frigateGPU }} +scaleGPU: + {{- range $key, $value := . }} + - gpu: + {{ $key }}: {{ $value }} + targetSelector: + frigate: + - frigate + {{- end }} + {{- end -}} +{{- end -}} diff --git a/library/ix-dev/community/frigate/templates/_persistence.tpl b/library/ix-dev/community/frigate/templates/_persistence.tpl new file mode 100644 index 0000000000..70735b7c95 --- /dev/null +++ b/library/ix-dev/community/frigate/templates/_persistence.tpl @@ -0,0 +1,69 @@ +{{- define "frigate.persistence" -}} +persistence: + config: + enabled: true + type: {{ .Values.frigateStorage.config.type }} + datasetName: {{ .Values.frigateStorage.config.datasetName | default "" }} + hostPath: {{ .Values.frigateStorage.config.hostPath | default "" }} + targetSelector: + frigate: + frigate: + mountPath: /config + 01-init: + mountPath: /config + media: + enabled: true + type: {{ .Values.frigateStorage.media.type }} + datasetName: {{ .Values.frigateStorage.media.datasetName | default "" }} + hostPath: {{ .Values.frigateStorage.media.hostPath | default "" }} + targetSelector: + frigate: + frigate: + mountPath: /media + tmp: + enabled: true + type: emptyDir + targetSelector: + frigate: + frigate: + mountPath: /tmp + cache: + enabled: true + type: emptyDir + medium: Memory + size: {{ printf "%vGi" .Values.frigateStorage.cache.sizeGiB }} + targetSelector: + frigate: + frigate: + mountPath: /tmp/cache + shm: + enabled: true + type: emptyDir + medium: Memory + size: {{ printf "%vMi" .Values.frigateStorage.shm.sizeMiB }} + targetSelector: + frigate: + frigate: + mountPath: /dev/shm + {{- if .Values.frigateConfig.mountUSBBus }} + usb-bus: + enabled: true + type: hostPath + hostPath: /dev/bus/usb + targetSelector: + frigate: + frigate: + mountPath: /dev/bus/usb + {{- end -}} + {{- range $idx, $storage := .Values.frigateStorage.additionalStorages }} + {{ printf "frigate-%v" (int $idx) }}: + enabled: true + type: {{ $storage.type }} + datasetName: {{ $storage.datasetName | default "" }} + hostPath: {{ $storage.hostPath | default "" }} + targetSelector: + frigate: + frigate: + mountPath: {{ $storage.mountPath }} + {{- end }} +{{- end -}} diff --git a/library/ix-dev/community/frigate/templates/_portal.tpl b/library/ix-dev/community/frigate/templates/_portal.tpl new file mode 100644 index 0000000000..b897e4cb8e --- /dev/null +++ b/library/ix-dev/community/frigate/templates/_portal.tpl @@ -0,0 +1,16 @@ +{{- define "frigate.portal" -}} + {{- $port := .Values.frigateNetwork.webPort -}} + {{- if .Values.frigateNetwork.hostNetwork -}} + {{- $port = 5000 -}} + {{- end }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: "/" + port: {{ $port | quote }} + protocol: http + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/frigate/templates/_service.tpl b/library/ix-dev/community/frigate/templates/_service.tpl new file mode 100644 index 0000000000..113ac50a78 --- /dev/null +++ b/library/ix-dev/community/frigate/templates/_service.tpl @@ -0,0 +1,65 @@ +{{- define "frigate.service" -}} +service: + frigate: + enabled: true + primary: true + type: NodePort + targetSelector: frigate + ports: + webui: + enabled: true + primary: true + port: {{ .Values.frigateNetwork.webPort }} + nodePort: {{ .Values.frigateNetwork.webPort }} + targetPort: 5000 + targetSelector: frigate + {{ if .Values.frigateNetwork.enableRtmp }} + rtmp: + enabled: true + type: NodePort + targetSelector: frigate + ports: + rtmp: + enabled: true + primary: true + port: {{ .Values.frigateNetwork.rtmpPort }} + nodePort: {{ .Values.frigateNetwork.rtmpPort }} + targetPort: 1935 + targetSelector: frigate + {{ end }} + {{ if .Values.frigateNetwork.enableRtsp }} + rtsp: + enabled: true + type: NodePort + targetSelector: frigate + ports: + rtsp: + enabled: true + primary: true + port: {{ .Values.frigateNetwork.rtspPort }} + nodePort: {{ .Values.frigateNetwork.rtspPort }} + targetPort: 8554 + targetSelector: frigate + {{ end }} + {{ if .Values.frigateNetwork.enableWebRtc }} + webrtc: + enabled: true + type: NodePort + targetSelector: frigate + ports: + tcp: + enabled: true + primary: true + port: {{ .Values.frigateNetwork.webRtcPort }} + nodePort: {{ .Values.frigateNetwork.webRtcPort }} + targetPort: 8555 + targetSelector: frigate + udp: + enabled: true + port: {{ .Values.frigateNetwork.webRtcPort }} + nodePort: {{ .Values.frigateNetwork.webRtcPort }} + targetPort: 8555 + protocol: udp + targetSelector: frigate + {{ end }} +{{- end -}} diff --git a/library/ix-dev/community/frigate/templates/common.yaml b/library/ix-dev/community/frigate/templates/common.yaml new file mode 100644 index 0000000000..36753edcf7 --- /dev/null +++ b/library/ix-dev/community/frigate/templates/common.yaml @@ -0,0 +1,11 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "frigate.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "frigate.service" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "frigate.persistence" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "frigate.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/frigate/upgrade_info.json b/library/ix-dev/community/frigate/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/frigate/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/frigate/upgrade_strategy b/library/ix-dev/community/frigate/upgrade_strategy new file mode 100755 index 0000000000..af685230a1 --- /dev/null +++ b/library/ix-dev/community/frigate/upgrade_strategy @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'\d+\.\d+\.\d+') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t: t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/library/ix-dev/community/frigate/values.yaml b/library/ix-dev/community/frigate/values.yaml new file mode 100644 index 0000000000..a46a80a66d --- /dev/null +++ b/library/ix-dev/community/frigate/values.yaml @@ -0,0 +1,39 @@ +image: + repository: ghcr.io/blakeblackshear/frigate + pullPolicy: IfNotPresent + tag: 0.12.1 + +resources: + limits: + cpu: 4000m + memory: 8Gi + +frigateConfig: + mountUSBBus: false + additionalEnvs: [] + +frigateNetwork: + hostNetwork: false + # Port numbers ignored if hostNetwork is true + webPort: 30058 + enableRtmp: false + rtmpPort: 30059 + enableRtsp: false + rtspPort: 30060 + enableWebRtc: false + webRtcPort: 30061 + +frigateGPU: {} + +frigateStorage: + media: + type: ixVolume + datasetName: media + config: + type: ixVolume + datasetName: config + cache: + sizeGiB: 1 + shm: + sizeMiB: 64 + additionalStorages: []