diff --git a/charts/incubator/frigate/.helmignore b/charts/incubator/frigate/.helmignore new file mode 100644 index 00000000000..e559de0a012 --- /dev/null +++ b/charts/incubator/frigate/.helmignore @@ -0,0 +1,24 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ +# OWNERS file for Kubernetes +OWNERS diff --git a/charts/incubator/frigate/Chart.yaml b/charts/incubator/frigate/Chart.yaml new file mode 100644 index 00000000000..76cfb9a7610 --- /dev/null +++ b/charts/incubator/frigate/Chart.yaml @@ -0,0 +1,31 @@ +apiVersion: v2 +appVersion: "0.0.1" +dependencies: +- name: common + repository: https://truecharts.org + version: 8.9.21 +deprecated: false +description: NVR With Realtime Object Detection for IP Cameras +home: https://github.com/truecharts/apps/tree/master/charts/incubator/frigate +icon: https://truecharts.org/_static/img/appicons/frigate-icon.png +keywords: +- encode +- nvr +- media +- frigate +kubeVersion: '>=1.16.0-0' +maintainers: +- email: info@truecharts.org + name: TrueCharts + url: https://truecharts.org +name: frigate +sources: +- https://github.com/blakeblackshear/frigate +- https://hub.docker.com/r/blakeblackshear/frigate +type: application +version: 0.0.4 +annotations: + truecharts.org/catagories: | + - nvr + truecharts.org/SCALE-support: "true" + truecharts.org/grade: U diff --git a/charts/incubator/frigate/README.md b/charts/incubator/frigate/README.md new file mode 100644 index 00000000000..c05da19d957 --- /dev/null +++ b/charts/incubator/frigate/README.md @@ -0,0 +1,38 @@ +# Introduction + +Audio/Video library transcoding automation + +TrueCharts are designed to be installed as TrueNAS SCALE app only. We can not guarantee this charts works as a stand-alone helm installation. +**This chart is not maintained by the upstream project and any issues with the chart should be raised [here](https://github.com/truecharts/apps/issues/new/choose)** + +## Source Code + +* +* + +## Requirements + +Kubernetes: `>=1.16.0-0` + +## Dependencies + +| Repository | Name | Version | +|------------|------|---------| +| https://truecharts.org | common | 8.9.21 | + +## Installing the Chart + +To install this App on TrueNAS SCALE check our [Quick-Start Guide](https://truecharts.org/manual/Quick-Start%20Guides/03-Installing-an-App/). + +## Uninstalling the Chart + +To remove this App from TrueNAS SCALE check our [Quick-Start Guide](https://truecharts.org/manual/Quick-Start%20Guides/07-Deleting-an-App/). + +## Support + +- Please check our [quick-start guides](https://truecharts.org/manual/Quick-Start%20Guides/01-Open-Apps/) first. +- See the [Wiki](https://truecharts.org) +- Check our [Discord](https://discord.gg/tVsPTHWTtr) +- Open a [issue](https://github.com/truecharts/apps/issues/new/choose) +--- +All Rights Reserved - The TrueCharts Project diff --git a/charts/incubator/frigate/questions.yaml b/charts/incubator/frigate/questions.yaml new file mode 100644 index 00000000000..e6d96152dc3 --- /dev/null +++ b/charts/incubator/frigate/questions.yaml @@ -0,0 +1,430 @@ +# Include{groups} +portals: + web_portal: + protocols: + - "$kubernetes-resource_configmap_portal_protocol" + host: + - "$kubernetes-resource_configmap_portal_host" + ports: + - "$kubernetes-resource_configmap_portal_port" +questions: +# Include{global} + - variable: controller + group: "Controller" + label: "" + schema: + type: dict + attrs: + - variable: advanced + label: "Show Advanced Controller Settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: type + description: "Please specify type of workload to deploy" + label: "(Advanced) Controller Type" + schema: + type: string + default: "deployment" + required: true + enum: + - value: "deployment" + description: "Deployment" + - value: "statefulset" + description: "Statefulset" + - value: "daemonset" + description: "Daemonset" + - variable: replicas + description: "Number of desired pod replicas" + label: "Desired Replicas" + schema: + type: int + default: 1 + required: true + - variable: strategy + description: "Please specify type of workload to deploy" + label: "(Advanced) Update Strategy" + schema: + type: string + default: "Recreate" + required: true + enum: + - value: "Recreate" + description: "Recreate: Kill existing pods before creating new ones" + - value: "RollingUpdate" + description: "RollingUpdate: Create new pods and then kill old ones" + - value: "OnDelete" + description: "(Legacy) OnDelete: ignore .spec.template changes" +# Include{controllerExpert} + + - variable: env + group: "Container Configuration" + label: "Image Environment" + schema: + type: dict + attrs: + +# Include{fixedEnv} +# Include{containerConfig} + + - variable: service + group: "Networking and Services" + label: "Configure Service(s)" + schema: + type: dict + attrs: + - variable: main + label: "Main Service" + description: "The Primary service on which the healthcheck runs, often the webUI" + schema: + type: dict + attrs: +# Include{serviceSelector} + - variable: main + label: "Main Service Port Configuration" + schema: + type: dict + attrs: + - variable: port + label: "Port" + description: "This port exposes the container port on the service" + schema: + type: int + default: 5000 + editable: true + required: true + - variable: advanced + label: "Show Advanced settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: protocol + label: "Port Type" + schema: + type: string + default: "HTTP" + enum: + - value: HTTP + description: "HTTP" + - value: "HTTPS" + description: "HTTPS" + - value: TCP + description: "TCP" + - value: "UDP" + description: "UDP" + - variable: nodePort + label: "Node Port (Optional)" + description: "This port gets exposed to the node. Only considered when service type is NodePort, Simple or LoadBalancer" + schema: + type: int + min: 9000 + max: 65535 + - variable: targetPort + label: "Target Port" + description: "The internal(!) port on the container the Application runs on" + schema: + type: int + default: 5000 + + + - variable: rtmp + label: "RTMP Service" + description: "The service on which nodes connect to." + schema: + type: dict + attrs: +# Include{serviceSelector} + - variable: rtmp + label: "RTMP Service Port Configuration" + schema: + type: dict + attrs: + - variable: enabled + label: "Enable the port" + schema: + type: boolean + default: true + hidden: true + - variable: port + label: "Port" + description: "This port exposes the container port on the service" + schema: + type: int + default: 1935 + editable: true + required: true + - variable: advanced + label: "Show Advanced settings" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: protocol + label: "Port Type" + schema: + type: string + default: "HTTP" + enum: + - value: HTTP + description: "HTTP" + - value: "HTTPS" + description: "HTTPS" + - value: TCP + description: "TCP" + - value: "UDP" + description: "UDP" + - variable: nodePort + label: "Node Port (Optional)" + description: "This port gets exposed to the node. Only considered when service type is NodePort, Simple or LoadBalancer" + schema: + type: int + min: 9000 + max: 65535 + - variable: targetPort + label: "Target Port" + description: "The internal(!) port on the container the Application runs on" + schema: + type: int + default: 1935 + + - variable: serviceexpert + group: "Networking and Services" + label: "Show Expert Config" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: hostNetwork + group: "Networking and Services" + label: "Host-Networking (Complicated)" + schema: + type: boolean + default: false + +# Include{serviceExpert} + +# Include{serviceList} + + - variable: persistence + label: "Integrated Persistent Storage" + description: "Integrated Persistent Storage" + group: "Storage and Persistence" + schema: + type: dict + attrs: + - variable: config + label: "App Config Storage" + description: "Stores the Application Configuration." + schema: + type: dict + attrs: + - variable: enabled + label: "Enable the storage" + schema: + type: boolean + default: true + hidden: true + - variable: type + label: "Type of Storage" + description: "Sets the persistence type, Anything other than PVC could break rollback!" + schema: + type: string + default: "simplePVC" + enum: + - value: "simplePVC" + description: "PVC (simple)" + - value: "simpleHP" + description: "HostPath (simple)" + - value: "emptyDir" + description: "emptyDir" + - value: "pvc" + description: "pvc" + - value: "hostPath" + description: "hostPath" +# Include{persistenceBasic} + - variable: hostPath + label: "hostPath" + description: "Path inside the container the storage is mounted" + schema: + show_if: [["type", "=", "hostPath"]] + type: hostpath + - variable: medium + label: "EmptyDir Medium" + schema: + show_if: [["type", "=", "emptyDir"]] + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "Memory" + description: "Memory" +# Include{persistenceAdvanced} + - variable: cache + label: "Video Cache in Memory" + description: "Stores the cached video data." + schema: + type: dict + attrs: + - variable: enabled + label: "Enable the storage" + schema: + type: boolean + default: true + hidden: true +# Include{persistenceBasic} +# Include{persistenceAdvanced} + + + + - variable: cache + label: "App Transcode cache" + description: "Stores the Application Transcode cache." + schema: + type: dict + attrs: + - variable: enabled + label: "Enable the storage" + schema: + type: boolean + default: true + - variable: type + label: "(Advanced) Type of Storage" + description: "Sets the persistence type" + schema: + type: string + default: "emptyDir" + enum: + - value: "pvc" + description: "pvc" + - value: "emptyDir" + description: "emptyDir" + - value: "hostPath" + description: "hostPath" +# Include{persistenceBasic} + - variable: hostPath + label: "hostPath" + description: "Path inside the container the storage is mounted" + schema: + show_if: [["type", "=", "hostPath"]] + type: hostpath + - variable: medium + label: "EmptyDir Medium" + schema: + show_if: [["type", "=", "emptyDir"]] + type: string + default: "" + enum: + - value: "" + description: "Default" + - value: "Memory" + description: "Memory" +# Include{persistenceAdvanced} +# Include{persistenceList} + + - variable: ingress + label: "" + group: "Ingress" + schema: + type: dict + attrs: + - variable: main + label: "Main Ingress" + schema: + type: dict + attrs: +# Include{ingressDefault} + +# Include{ingressTLS} + +# Include{ingressTraefik} + +# Include{ingressExpert} + - variable: rtmp + label: "RTMP Ingress" + schema: + type: dict + attrs: + +# Include{ingressDefault} + +# Include{ingressTLS} + +# Include{ingressTraefik} + +# Include{ingressExpert} + +# Include{ingressList} + + - variable: advancedSecurity + label: "Show Advanced Security Settings" + group: "Security and Permissions" + schema: + type: boolean + default: false + show_subquestions_if: true + subquestions: + - variable: securityContext + label: "Security Context" + schema: + type: dict + attrs: + - variable: privileged + label: "Privileged mode" + schema: + type: boolean + default: false + - variable: readOnlyRootFilesystem + label: "ReadOnly Root Filesystem" + schema: + type: boolean + default: false + - variable: allowPrivilegeEscalation + label: "Allow Privilege Escalation" + schema: + type: boolean + default: false + - variable: runAsNonRoot + label: "runAsNonRoot" + schema: + type: boolean + default: false +# Include{securityContextAdvanced} + + - variable: podSecurityContext + group: "Security and Permissions" + label: "Pod Security Context" + schema: + type: dict + attrs: + - variable: runAsUser + label: "runAsUser" + description: "The UserID of the user running the application" + schema: + type: int + default: 0 + - variable: runAsGroup + label: "runAsGroup" + description: The groupID this App of the user running the application" + schema: + type: int + default: 0 + - variable: fsGroup + label: "fsGroup" + description: "The group that should own ALL storage." + schema: + type: int + default: 568 +# Include{podSecurityContextAdvanced} + +# Include{resources} + +# Include{advanced} + +# Include{addons} diff --git a/charts/incubator/frigate/templates/common.yaml b/charts/incubator/frigate/templates/common.yaml new file mode 100644 index 00000000000..9999dfc637a --- /dev/null +++ b/charts/incubator/frigate/templates/common.yaml @@ -0,0 +1,17 @@ +{{/* Make sure all variables are set properly */}} +{{- include "common.setup" . }} + +{{/* Append the configMap volume to the volumes */}} +{{- define "frigate.configVolume" -}} +enabled: "true" +mountPath: "/config/config.yml" +subPath: "config.yml" +type: "custom" +volumeSpec: + configMap: + name: {{ template "common.names.fullname" . }}-config +{{- end -}} +{{- $_ := set .Values.persistence "frigate-config" (include "frigate.configVolume" . | fromYaml) -}} + +{{/* Render the templates */}} +{{ include "common.postSetup" . }} diff --git a/charts/incubator/frigate/templates/configmap.yaml b/charts/incubator/frigate/templates/configmap.yaml new file mode 100644 index 00000000000..6ebafa3d014 --- /dev/null +++ b/charts/incubator/frigate/templates/configmap.yaml @@ -0,0 +1,395 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ template "common.names.fullname" . }}-config + labels: + {{- include "common.labels" . | nindent 4 }} +data: + config.yml: | + mqtt: + # Required: host name + host: {{ .Values.frigate.mqtt.host }} + # Optional: port (default: shown below) + port: {{ .Values.frigate.mqtt.port }} + # Optional: topic prefix (default: shown below) + # NOTE: must be unique if you are running multiple instances + topic_prefix: frigate + # Optional: client id (default: shown below) + # NOTE: must be unique if you are running multiple instances + client_id: frigate +{{- if .Values.frigate.mqtt.authenticated }} + user: {{ .Values.frigate.mqtt.username }} + password: {{ .Values.frigate.mqtt.password }} + # Optional: user + # user: mqtt_user + # Optional: password + # NOTE: MQTT password can be specified with an environment variables that must begin with 'FRIGATE_'. + # e.g. password: '{FRIGATE_MQTT_PASSWORD}' + # password: password +{{- end }} + # Optional: tls_ca_certs for enabling TLS using self-signed certs (default: None) + # tls_ca_certs: /path/to/ca.crt + # Optional: tls_client_cert and tls_client key in order to use self-signed client + # certificates (default: None) + # NOTE: certificate must not be password-protected + # do not set user and password when using a client certificate + # tls_client_cert: /path/to/client.crt + # tls_client_key: /path/to/client.key + # Optional: tls_insecure (true/false) for enabling TLS verification of + # the server hostname in the server certificate (default: None) + # tls_insecure: false + # Optional: interval in seconds for publishing stats (default: shown below) + stats_interval: 60 + + # Optional: Detectors configuration. Defaults to a single CPU detector + detectors: + # Required: name of the detector +{{- if .Values.persistence.coral.enabled }} + coral: + # Required: type of the detector + # Valid values are 'edgetpu' (requires device property below) and 'cpu'. + type: edgetpu + # Optional: device name as defined here: https://coral.ai/docs/edgetpu/multiple-edgetpu/#using-the-tensorflow-lite-python-api + device: usb +{{- else }} + cpu1: + type: cpu + # Optional: num_threads value passed to the tflite.Interpreter (default: shown below) + # This value is only used for CPU types + num_threads: 2 +{{- end }} + + + + # Optional: Database configuration + # database: + # The path to store the SQLite DB (default: shown below) + # path: /media/frigate/frigate.db + + # Optional: model modifications + # model: + # Optional: path to the model (default: automatic based on detector) + # path: /edgetpu_model.tflite + # Optional: path to the labelmap (default: shown below) + # labelmap_path: /labelmap.txt + # Required: Object detection model input width (default: shown below) + # width: 320 + # Required: Object detection model input height (default: shown below) + # height: 240 + # Optional: Label name modifications. These are merged into the standard labelmap. + # labelmap: + # 2: vehicle + + # Optional: logger verbosity settings + logger: + # Optional: Default log verbosity (default: shown below) + default: info + # Optional: Component specific logger overrides + # logs: + # frigate.event: info + + # Optional: set environment variables + # environment_vars: + # EXAMPLE_VAR: value + + # Optional: birdseye configuration + birdseye: + # Optional: Enable birdseye view (default: shown below) + enabled: {{ .Values.frigate.birdseye.enabled }} + # Optional: Width of the output resolution (default: shown below) + width: 1280 + # Optional: Height of the output resolution (default: shown below) + height: 720 + # Optional: Encoding quality of the mpeg1 feed (default: shown below) + # 1 is the highest quality, and 31 is the lowest. Lower quality feeds utilize less CPU resources. + quality: 8 + # Optional: Mode of the view. Available options are: objects, motion, and continuous + # objects - cameras are included if they have had a tracked object within the last 30 seconds + # motion - cameras are included if motion was detected in the last 30 seconds + # continuous - all cameras are included always + mode: {{ .Values.frigate.birdseye.mode }} + + # Optional: ffmpeg configuration + ffmpeg: + # Optional: global ffmpeg args (default: shown below) warning instead of debug + global_args: -hide_banner -loglevel debug + # Optional: global hwaccel args (default: shown below) + # NOTE: See hardware acceleration docs for your specific device + # hwaccel_args: [] + # Optional: global input args (default: shown below) + # input_args: -avoid_negative_ts make_zero -fflags +genpts+discardcorrupt -rtsp_transport tcp -stimeout 5000000 -use_wallclock_as_timestamps 1 + # Optional: global output args + # output_args: + # Optional: output args for detect streams (default: shown below) + # detect: -f rawvideo -pix_fmt yuv420p + # Optional: output args for record streams (default: shown below) + # record: -f segment -segment_time 10 -segment_format mp4 -reset_timestamps 1 -strftime 1 -c copy -an + # Optional: output args for rtmp streams (default: shown below) + # rtmp: -c copy -f flv + + # Optional: Detect configuration + # NOTE: Can be overridden at the camera level + detect: + # Optional: width of the frame for the input with the detect role (default: shown below) + width: 1280 + # Optional: height of the frame for the input with the detect role (default: shown below) + height: 720 + # Optional: desired fps for your camera for the input with the detect role (default: shown below) + # NOTE: Recommended value of 5. Ideally, try and reduce your FPS on the camera. + fps: 5 + # Optional: enables detection for the camera (default: True) + # This value can be set via MQTT and will be updated in startup based on retained value + enabled: True + # Optional: Number of frames without a detection before frigate considers an object to be gone. (default: 5x the frame rate) + # max_disappeared: 25 + # Optional: Frequency for running detection on stationary objects (default: 10x the frame rate) + # stationary_interval: 50 + + # Optional: Object configuration + # NOTE: Can be overridden at the camera level + objects: + # Optional: list of objects to track from labelmap.txt (default: shown below) + track: + - person + - car + - motorcyle + - cat + - dog + # Optional: mask to prevent all object types from being detected in certain areas (default: no mask) + # Checks based on the bottom center of the bounding box of the object. + # NOTE: This mask is COMBINED with the object type specific mask below + # mask: 0,0,1000,0,1000,200,0,200 + # Optional: filters to reduce false positives for specific object types + filters: + person: + # Optional: minimum width*height of the bounding box for the detected object (default: 0) + min_area: 5000 + # Optional: maximum width*height of the bounding box for the detected object (default: 24000000) + max_area: 100000 + # Optional: minimum score for the object to initiate tracking (default: shown below) + # min_score: 0.5 + # Optional: minimum decimal percentage for tracked object's computed score to be considered a true positive (default: shown below) + # threshold: 0.7 + # Optional: mask to prevent this object type from being detected in certain areas (default: no mask) + # Checks based on the bottom center of the bounding box of the object + # mask: 0,0,1000,0,1000,200,0,200 + + # Optional: Motion configuration + # NOTE: Can be overridden at the camera level + motion: + # Optional: The threshold passed to cv2.threshold to determine if a pixel is different enough to be counted as motion. (default: shown below) + # Increasing this value will make motion detection less sensitive and decreasing it will make motion detection more sensitive. + # The value should be between 1 and 255. + # threshold: 25 + # Optional: Minimum size in pixels in the resized motion image that counts as motion (default: 30) + # Increasing this value will prevent smaller areas of motion from being detected. Decreasing will + # make motion detection more sensitive to smaller moving objects. + # As a rule of thumb: + # - 15 - high sensitivity + # - 30 - medium sensitivity + # - 50 - low sensitivity + contour_area: 30 + # Optional: Alpha value passed to cv2.accumulateWeighted when averaging the motion delta across multiple frames (default: shown below) + # Higher values mean the current frame impacts the delta a lot, and a single raindrop may register as motion. + # Too low and a fast moving person wont be detected as motion. + # delta_alpha: 0.2 + # Optional: Alpha value passed to cv2.accumulateWeighted when averaging frames to determine the background (default: shown below) + # Higher values mean the current frame impacts the average a lot, and a new object will be averaged into the background faster. + # Low values will cause things like moving shadows to be detected as motion for longer. + # https://www.geeksforgeeks.org/background-subtraction-in-an-image-using-concept-of-running-average/ + # frame_alpha: 0.2 + # Optional: Height of the resized motion frame (default: 50) + # This operates as an efficient blur alternative. Higher values will result in more granular motion detection at the expense + # of higher CPU usage. Lower values result in less CPU, but small changes may not register as motion. + # frame_height: 50 + # Optional: motion mask + # NOTE: see docs for more detailed info on creating masks + # mask: 0,900,1080,900,1080,1920,0,1920 + + # Optional: Record configuration + # NOTE: Can be overridden at the camera level + record: + # Optional: Enable recording (default: shown below) + enabled: False + # Optional: Retention settings for recording + retain: + # Optional: Number of days to retain recordings regardless of events (default: shown below) + # NOTE: This should be set to 0 and retention should be defined in events section below + # if you only want to retain recordings of events. + days: 7 + # Optional: Mode for retention. Available options are: all, motion, and active_objects + # all - save all recording segments regardless of activity + # motion - save all recordings segments with any detected motion + # active_objects - save all recording segments with active/moving objects + # NOTE: this mode only applies when the days setting above is greater than 0 + mode: motion + # Optional: Event recording settings + events: + # Optional: Maximum length of time to retain video during long events. (default: shown below) + # NOTE: If an object is being tracked for longer than this amount of time, the retained recordings + # will be the last x seconds of the event unless retain->days under record is > 0. + max_seconds: 300 + # Optional: Number of seconds before the event to include (default: shown below) + pre_capture: 5 + # Optional: Number of seconds after the event to include (default: shown below) + post_capture: 5 + # Optional: Objects to save recordings for. (default: all tracked objects) + # objects: + # - person + # Optional: Restrict recordings to objects that entered any of the listed zones (default: no required zones) + # required_zones: [] + # Optional: Retention settings for recordings of events + retain: + # Required: Default retention days (default: shown below) + default: 14 + # Optional: Mode for retention. (default: shown below) + # all - save all recording segments for events regardless of activity + # motion - save all recordings segments for events with any detected motion + # active_objects - save all recording segments for event with active/moving objects + # + # NOTE: If the retain mode for the camera is more restrictive than the mode configured + # here, the segments will already be gone by the time this mode is applied. + # For example, if the camera retain mode is "motion", the segments without motion are + # never stored, so setting the mode to "all" here won't bring them back. + mode: active_objects + # Optional: Per object retention days + # objects: + # person: 15 + + # Optional: Configuration for the jpg snapshots written to the clips directory for each event + # NOTE: Can be overridden at the camera level + snapshots: + # Optional: Enable writing jpg snapshot to /media/frigate/clips (default: shown below) + # This value can be set via MQTT and will be updated in startup based on retained value + enabled: False + # Optional: print a timestamp on the snapshots (default: shown below) + # timestamp: False + # Optional: draw bounding box on the snapshots (default: shown below) + # bounding_box: False + # Optional: crop the snapshot (default: shown below) + # crop: False + # Optional: height to resize the snapshot to (default: original size) + # height: 175 + # Optional: Restrict snapshots to objects that entered any of the listed zones (default: no required zones) + required_zones: [] + # Optional: Camera override for retention settings (default: global values) + retain: + # Required: Default retention days (default: shown below) + default: 10 + # Optional: Per object retention days + objects: + person: 15 + + # Optional: RTMP configuration + # NOTE: Can be overridden at the camera level + rtmp: + # Optional: Enable the RTMP stream (default: True) + enabled: True + + # Optional: Live stream configuration for WebUI + # NOTE: Can be overridden at the camera level + live: + # Optional: Set the height of the live stream. (default: 720) + # This must be less than or equal to the height of the detect stream. Lower resolutions + # reduce bandwidth required for viewing the live stream. Width is computed to match known aspect ratio. + # height: 720 + # Optional: Set the encode quality of the live stream (default: shown below) + # 1 is the highest quality, and 31 is the lowest. Lower quality feeds utilize less CPU resources. + quality: 8 + + # Optional: in-feed timestamp style configuration + # NOTE: Can be overridden at the camera level + # timestamp_style: + # Optional: Position of the timestamp (default: shown below) + # "tl" (top left), "tr" (top right), "bl" (bottom left), "br" (bottom right) + # position: "tl" + # Optional: Format specifier conform to the Python package "datetime" (default: shown below) + # Additional Examples: + # german: "%d.%m.%Y %H:%M:%S" + # format: "%m/%d/%Y %H:%M:%S" + # Optional: Color of font + # color: + # All Required when color is specified (default: shown below) + # red: 255 + # green: 255 + # blue: 255 + # Optional: Line thickness of font (default: shown below) + # thickness: 2 + # Optional: Effect of lettering (default: shown below) + # None (No effect), + # "solid" (solid background in inverse color of font) + # "shadow" (shadow for font) + effect: solid + + # Required + cameras: +{{- range .Values.frigate.cameras }} + # Required: name of the camera + {{ .name }}: + objects: + # Optional: list of objects to track from labelmap.txt (default: shown below) + track: + {{- range .objects.track }} + - {{ . }} + {{- end }} + detect: + width: {{ .detect.width }} + height: {{ .detect.height }} + # Required: ffmpeg settings for the camera + ffmpeg: + # Required: A list of input streams for the camera. See documentation for more information. + inputs: + {{- range .inputs }} + - path: {{ .path }} + roles: + {{- range .roles }} + - {{ . }} + {{- end }} + {{- end }} + record: + enabled: {{ .record.enabled }} + # Optional: timeout for highest scoring image before allowing it + # to be replaced by a newer image. (default: shown below) + best_image_timeout: 60 + snapshots: + enabled: {{ .snapshots.enabled }} + + # Optional: zones for this camera + # zones: + # Required: name of the zone + # NOTE: This must be different than any camera names, but can match with another zone on another + # camera. + # front_steps: + # Required: List of x,y coordinates to define the polygon of the zone. + # NOTE: Coordinates can be generated at https://www.image-map.net/ + # coordinates: 545,1077,747,939,788,805 + # Optional: List of objects that can trigger this zone (default: all tracked objects) + # objects: + # - person + # Optional: Zone level object filters. + # NOTE: The global and camera filters are applied upstream. + # filters: + # person: + # min_area: 5000 + # max_area: 100000 + # threshold: 0.7 + + # Optional: Configuration for the jpg snapshots published via MQTT + # mqtt: + # Optional: Enable publishing snapshot via mqtt for camera (default: shown below) + # NOTE: Only applies to publishing image data to MQTT via 'frigate///snapshot'. + # All other messages will still be published. + # enabled: True + # Optional: print a timestamp on the snapshots (default: shown below) + # timestamp: True + # Optional: draw bounding box on the snapshots (default: shown below) + # bounding_box: True + # Optional: crop the snapshot (default: shown below) + # crop: True + # Optional: height to resize the snapshot to (default: shown below) + # height: 270 + # Optional: jpeg encode quality (default: shown below) + # quality: 70 + # Optional: Restrict mqtt messages to objects that entered any of the listed zones (default: no required zones) + # required_zones: [] +{{- end }} diff --git a/charts/incubator/frigate/values.yaml b/charts/incubator/frigate/values.yaml new file mode 100644 index 00000000000..e031d420bf0 --- /dev/null +++ b/charts/incubator/frigate/values.yaml @@ -0,0 +1,87 @@ +image: + repository: blakeblackshear/frigate + pullPolicy: IfNotPresent + tag: 0.10.0-beta6-amd64nvidia + +securityContext: + readOnlyRootFilesystem: false + runAsNonRoot: false + +podSecurityContext: + runAsUser: 0 + runAsGroup: 0 +portal: + enabled: true +env: + +service: + main: + ports: + main: + targetPort: 5000 + port: 5000 + rtmp: + enabled: true + ports: + rtmp: + protocol: TCP + enabled: true + port: 1935 + targetPort: 1935 + +frigate: + mqtt: + host: mosquitto.ix-mosquitto.svc.cluster.local + port: 1883 + authentitcated: false + username: mqtt_user + password: password + birdseye: + enabled: true + mode: motion + cameras: + - name: camera1 + objects: + # Optional: list of objects to track from labelmap.txt (default: shown below) + track: + - person + - car + - motorcyle + - cat + - dog + detect: + height: 720 + width: 1280 + inputs: + # Required: the path to the stream + # NOTE: path may include environment variables, which must begin with 'FRIGATE_' and be referenced in {} + - path: rtsp://username:password@highres.url + # Required: list of roles for this stream. valid values are: detect,record,rtmp + # NOTICE: In addition to assigning the record, and rtmp roles, + # they must also be enabled in the camera config. + roles: + - record + - path: rtsp://username:password@lowres.url + roles: + - detect + - rtmp + record: + enabled: True + # Optional: timeout for highest scoring image before allowing it + # to be replaced by a newer image. (default: shown below) + best_image_timeout: 60 + snapshots: + enabled: True +persistence: + cache: + enabled: true + mountPath: "/tmp/cache" + type: "emptyDir" + shm: + enabled: true + mountPath: "/dev/shm" + type: "emptyDir" + medium: "Memory" + media: + enabled: true + mountPath: "/media"