Compare commits

..

12 Commits

Author SHA1 Message Date
Kilian
1538b8cf12 Clarify Live View motion status flag (#170)
* docs(hub): clarify live view status flag

Clarify that the device status flag controls connectivity and recent-motion state.

* docs(hub): clarify remote recording UI

Clarify the remote-recording value controls the REC action and recording-state overlay.
2026-09-16 15:43:52 +02:00
Kilian
30378b94bf feat(hub): make classification catalog optional (#169)
Allow deployments to disable the rendered classification catalog so Hub API can read the legacy MongoDB settings catalog directly.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-09-16 08:53:20 +02:00
Kilian
f6ac0b771c feat(hub): configure API audit producer (#168)
Pass the audit intake queue and dead-letter queue to Hub API when the audit service is enabled, and bump the chart to 0.141.0.
2026-09-15 17:07:51 +02:00
Kilian
065335c0f8 feat(hub): expose live view status flag (#167)
Map the Live View device status badge setting into normal and demo frontend deployments.
2026-09-15 17:07:45 +02:00
Kilian
456aba7ee5 feat: configure marker category priority (#166)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-09-15 17:07:41 +02:00
Kilian
a364873372 Merge pull request #165 from kerberos-io/feat/audit-intake
Configure durable Hub audit intake
2026-09-15 11:54:09 +02:00
Kilian Boute
3e78109e52 chore(hub): pin audit v1.0.1 2026-09-15 08:48:47 +00:00
Kilian Boute
4a6ea2dc59 chore(hub): bump chart to 0.140.0 2026-09-15 07:46:23 +00:00
Kilian Boute
518ea5732a Merge remote-tracking branch 'origin/main' into feat/audit-intake 2026-09-15 07:45:32 +00:00
Kilian
a2b10cde36 Merge pull request #164 from kerberos-io/chore/hub-chart-0.139.0
Bump Hub chart to 0.139.0
2026-09-14 16:24:40 +02:00
Kilian Boute
4ed325fdab feat(hub): configure durable audit intake 2026-09-14 11:51:47 +00:00
Kilian Boute
01f5a7beb3 chore: bump Hub chart to 0.139.0 2026-09-14 11:36:10 +00:00
10 changed files with 95 additions and 13 deletions

View File

@@ -16,7 +16,7 @@ type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.138.0
version: 0.142.0
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to

View File

@@ -229,7 +229,8 @@ Below all configuration options and parameters are listed.
| `kerberoshub.frontend.features.liveview.liveStreamMode` | Transport backing LIVE mode: `webrtc`, `hls`, or `moq`. | `"webrtc"` |
| `kerberoshub.frontend.features.liveview.hlsEnabled` | Offer HLS as a selectable LIVE transport. | `"true"` |
| `kerberoshub.frontend.features.liveview.moqEnabled` | Offer MoQ as a selectable LIVE transport. | `"false"` |
| `kerberoshub.frontend.features.liveview.remoteRecordingEnabled` | Show the manual REC control in live views. | `"true"` |
| `kerberoshub.frontend.features.liveview.remoteRecordingEnabled` | Show the manual REC control and recording-state overlay in live views. | `"true"` |
| `kerberoshub.frontend.features.liveview.deviceStatusEnabled` | Show connectivity and recent-motion status in live view tile headers. | `"true"` |
| `kerberoshub.frontend.features.liveview.moqRelayUrl` | WebTransport URL of the MoQ relay. | `"https://relay.uug.ai/anon"` |
| `kerberoshub.frontend.features.liveview.moqBroadcastPrefix` | Prefix used to build MoQ broadcast names. | `"devices"` |
| `kerberoshub.frontend.features.liveview.paginationMode` | Liveview behavior setting: `paginationMode` (`scroll`, `numbered` or `maxStreams`). | `"scroll"` |
@@ -241,6 +242,7 @@ Below all configuration options and parameters are listed.
| `kerberoshub.frontend.features.chart.colorChartGridStroke` | Stroke color for chart grid lines. | `"rgba(0, 106, 255, 0.18)"` |
| `kerberoshub.frontend.features.devices.hideAgent` | Hide agent controls in the devices section of the frontend. | `"false"` |
| `kerberoshub.frontend.features.devices.analyticsEnabled` | Enable or disable the Analytics tab on device detail pages. | `"true"` |
| `kerberoshub.frontend.features.devices.developerToolsEnabled` | Enable or disable owner-only live Agent logs and terminal access on device detail pages. | `"true"` |
| `kerberoshub.frontend.features.dashboard.sitesFullscreenEnabled` | Enable or disable the fullscreen Sites map on the Dashboard. | `"true"` |
| `kerberoshub.frontend.features.media.filter.date.enabled` | Enable or disable `kerberoshub.frontend.features.media.filter.date`. | `"true"` |
| `kerberoshub.frontend.features.media.filter.sites.enabled` | Enable or disable `kerberoshub.frontend.features.media.filter.sites`. | `"true"` |
@@ -253,6 +255,8 @@ Below all configuration options and parameters are listed.
| `kerberoshub.frontend.features.media.filter.category.enabled` | Enable or disable `kerberoshub.frontend.features.media.filter.category`. | `"true"` |
| `kerberoshub.frontend.features.media.filter.markers.enabled` | Enable or disable `kerberoshub.frontend.features.media.filter.markers`. | `"true"` |
| `kerberoshub.frontend.features.media.filter.markerOptionsByDate.enabled` | Limit marker, category, event, and tag filter options to the selected recordings day. | `"false"` |
| `kerberoshub.frontend.features.media.filter.markerCategoryPriority.enabled` | Order marker filter options from configured categories before other markers. | `"false"` |
| `kerberoshub.frontend.features.media.filter.markerCategoryPriority.categories` | Ordered exact, case-sensitive marker category names to prioritize. | `[]` |
| `kerberoshub.frontend.features.media.filter.events.enabled` | Enable or disable `kerberoshub.frontend.features.media.filter.events`. | `"true"` |
| `kerberoshub.frontend.features.media.filter.tags.enabled` | Enable or disable `kerberoshub.frontend.features.media.filter.tags`. | `"true"` |
| `kerberoshub.frontend.features.media.filter.defaultView` | Default view for the media page: `timeline` or `grid`. | `"timeline"` |
@@ -309,11 +313,16 @@ Below all configuration options and parameters are listed.
| `kerberoshub.audit.enabled` | Deploy the Hub audit service. Its first responsibility is forwarding canonical MongoDB `audit_events` to configured destinations. | `false` |
| `kerberoshub.audit.repository` | Hub audit service container image repository. | `"ghcr.io/uug-ai/hub-audit"` |
| `kerberoshub.audit.pullPolicy` | Hub audit service image pull policy. | `"IfNotPresent"` |
| `kerberoshub.audit.tag` | Hub audit service image tag. | `"v1.0.0"` |
| `kerberoshub.audit.tag` | Hub audit service image tag. | `"v1.0.1"` |
| `kerberoshub.audit.replicas` | Number of audit service replicas. Per-destination MongoDB leases prevent concurrent delivery. | `1` |
| `kerberoshub.audit.dispatchInterval` | How often the mounted destination configuration is reloaded and eligible destinations are polled. | `"5s"` |
| `kerberoshub.audit.leaseDuration` | Per-destination lease duration. It must exceed every destination timeout by at least 30 seconds. | `"2m"` |
| `kerberoshub.audit.terminationGracePeriodSeconds` | Pod termination grace period. Keep this longer than `leaseDuration` so an in-flight cycle can finish. | `150` |
| `kerberoshub.audit.intake.queue` | Durable RabbitMQ queue used by Hub API producers and the audit consumer. | `"hub-audit-events"` |
| `kerberoshub.audit.intake.deadletterQueue` | RabbitMQ queue used by Hub API and the audit consumer for invalid events and exhausted persistence retries. | `"hub-audit-dead-letter"` |
| `kerberoshub.audit.intake.maxRetries` | Maximum MongoDB persistence retries before an intake event is dead-lettered. | `10` |
| `kerberoshub.audit.intake.prefetchCount` | Maximum unacknowledged intake events per audit replica. | `20` |
| `kerberoshub.audit.intake.persistTimeout` | Timeout for one MongoDB persistence attempt. | `"10s"` |
| `kerberoshub.audit.destinations` | Webhook destinations. Each entry supports `id`, `enabled`, `url`, delivery limits, filters, public `headers`, `bearerTokenSecret`, and arbitrary `secretHeaders`. Destination IDs retain independent checkpoints. | `[]` |
| `kerberoshub.audit.serviceMonitor.enabled` | Create a Prometheus `ServiceMonitor` for audit service metrics. | `true` |
| `kerberoshub.audit.serviceMonitor.interval` | Audit service metrics scrape interval. | `"15s"` |
@@ -513,13 +522,15 @@ New deployments should define the shared classification list through
`key`, the user-facing `label`, and an `icon` key. Hub API exposes this catalog
to alerts and filters. When the mounted catalog is unavailable, compatible Hub
API versions fall back to the legacy `settings` document and then the built-in
classification list.
classification list. Set `classificationCatalogEnabled: false` to omit the
ConfigMap and make Hub API use that fallback directly.
```yaml
classificationCatalogEnabled: true
classificationCatalog:
- key: forklift
label: Forklift
icon: vehicle
- key: forklift
label: Forklift
icon: vehicle
```
### Indexing

View File

@@ -1,3 +1,4 @@
{{- if .Values.classificationCatalogEnabled }}
apiVersion: v1
kind: ConfigMap
metadata:
@@ -5,4 +6,5 @@ metadata:
namespace: {{ .Release.Namespace }}
data:
classifications.json: |-
{{- toPrettyJson .Values.classificationCatalog | nindent 4 }}
{{- toPrettyJson .Values.classificationCatalog | nindent 4 }}
{{- end }}

View File

@@ -1,4 +1,4 @@
{{- if and (or (eq .Values.mode "all") (eq .Values.mode "ui")) .Values.kerberoshub.audit.enabled -}}
{{- if .Values.kerberoshub.audit.enabled -}}
{{- $destinations := list -}}
{{- $destinationIDs := dict -}}
{{- range $index, $destination := .Values.kerberoshub.audit.destinations -}}

View File

@@ -120,7 +120,9 @@ spec:
metadata:
annotations:
checksum/config-mongodb: {{ include (print $.Template.BasePath "/configmap-mongodb.yaml") . | sha256sum }}
{{- if .Values.classificationCatalogEnabled }}
checksum/classification-catalog: {{ include (print $.Template.BasePath "/configmap-classification-catalog.yaml") . | sha256sum }}
{{- end }}
labels:
app: hub-api
spec:
@@ -133,10 +135,14 @@ spec:
{{- end }}
{{- $serverTLS := .Values.kerberoshub.api.serverTLS }}
{{- $mongodbTLS := .Values.mongodb.tls }}
{{- $classificationCatalogEnabled := .Values.classificationCatalogEnabled }}
{{- if or $classificationCatalogEnabled .Values.kerberoshub.api.volumes (and $serverTLS.enabled $serverTLS.secretName) (and $mongodbTLS.enabled $mongodbTLS.existingSecret) }}
volumes:
{{- if $classificationCatalogEnabled }}
- name: classification-catalog
configMap:
name: classification-catalog
{{- end }}
{{- with .Values.kerberoshub.api.volumes }}
{{- toYaml . | nindent 8 }}
{{- end }}
@@ -148,6 +154,7 @@ spec:
{{- if and $mongodbTLS.enabled $mongodbTLS.existingSecret }}
{{- include "hub.mongodb.tlsVolume" . | nindent 8 }}
{{- end }}
{{- end }}
{{- with .Values.kerberoshub.api.topologySpreadConstraints }}
topologySpreadConstraints:
{{- toYaml . | nindent 8 }}
@@ -163,10 +170,13 @@ spec:
ports:
- containerPort: 80
name: http
{{- if or $classificationCatalogEnabled .Values.kerberoshub.api.volumeMounts (and $serverTLS.enabled $serverTLS.secretName) (and $mongodbTLS.enabled $mongodbTLS.existingSecret) }}
volumeMounts:
{{- if $classificationCatalogEnabled }}
- name: classification-catalog
mountPath: /etc/kerberos/classifications
readOnly: true
{{- end }}
{{- with .Values.kerberoshub.api.volumeMounts}}
{{- toYaml . | nindent 12 }}
{{- end }}
@@ -178,13 +188,16 @@ spec:
{{- if and $mongodbTLS.enabled $mongodbTLS.existingSecret }}
{{- include "hub.mongodb.tlsVolumeMount" . | nindent 12 }}
{{- end }}
{{- end }}
# Mongodb - loaded from ConfigMap
envFrom:
- configMapRef:
name: mongodb-config
env:
{{- if $classificationCatalogEnabled }}
- name: CLASSIFICATION_CATALOG_FILE
value: /etc/kerberos/classifications/classifications.json
{{- end }}
- name: ENVIRONMENT
value: "{{ .Values.environment }}"
- name: READ_ONLY
@@ -361,6 +374,12 @@ spec:
value: "{{ .Values.rabbitmq.username }}"
- name: RABBITMQ_PASSWORD
value: "{{ .Values.rabbitmq.password }}"
{{- if .Values.kerberoshub.audit.enabled }}
- name: AUDIT_QUEUE
value: {{ .Values.kerberoshub.audit.intake.queue | quote }}
- name: AUDIT_DEADLETTER_QUEUE
value: {{ .Values.kerberoshub.audit.intake.deadletterQueue | quote }}
{{- end }}
# Slack notifications (this will send events/logs to a specific channel).
- name: SLACK_ENABLED

View File

@@ -1,4 +1,4 @@
{{- if and (or (eq .Values.mode "all") (eq .Values.mode "ui")) .Values.kerberoshub.audit.enabled .Values.kerberoshub.audit.serviceMonitor.enabled -}}
{{- if and .Values.kerberoshub.audit.enabled .Values.kerberoshub.audit.serviceMonitor.enabled -}}
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:

View File

@@ -1,4 +1,7 @@
{{- if and (or (eq .Values.mode "all") (eq .Values.mode "ui")) .Values.kerberoshub.audit.enabled -}}
{{- if .Values.kerberoshub.audit.enabled -}}
{{- if ne (upper .Values.queueProvider) "RABBITMQ" -}}
{{- fail "kerberoshub.audit currently requires queueProvider=RABBITMQ" -}}
{{- end -}}
apiVersion: apps/v1
kind: Deployment
metadata:
@@ -111,6 +114,24 @@ spec:
- configMapRef:
name: mongodb-config
env:
- name: RABBITMQ_HOST
value: {{ .Values.rabbitmq.host | quote }}
- name: RABBITMQ_EXCHANGE
value: {{ .Values.rabbitmq.exchange | quote }}
- name: RABBITMQ_USERNAME
value: {{ .Values.rabbitmq.username | quote }}
- name: RABBITMQ_PASSWORD
value: {{ .Values.rabbitmq.password | quote }}
- name: AUDIT_QUEUE
value: {{ .Values.kerberoshub.audit.intake.queue | quote }}
- name: AUDIT_DEADLETTER_QUEUE
value: {{ .Values.kerberoshub.audit.intake.deadletterQueue | quote }}
- name: AUDIT_MAX_RETRIES
value: {{ .Values.kerberoshub.audit.intake.maxRetries | quote }}
- name: AUDIT_PREFETCH_COUNT
value: {{ .Values.kerberoshub.audit.intake.prefetchCount | quote }}
- name: AUDIT_PERSIST_TIMEOUT
value: {{ .Values.kerberoshub.audit.intake.persistTimeout | quote }}
- name: DISPATCH_INTERVAL
value: {{ .Values.kerberoshub.audit.dispatchInterval | quote }}
- name: LEASE_DURATION

View File

@@ -239,6 +239,8 @@ spec:
value: "{{ .Values.kerberoshub.frontend.features.devices.analyticsEnabled }}"
- name: FEATURE_DASHBOARD_SITES_FULLSCREEN_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.dashboard.sitesFullscreenEnabled }}"
- name: FEATURE_DEVICE_DEVELOPER_TOOLS_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.devices.developerToolsEnabled }}"
- name: FEATURE_ORGANISATIONS_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.organisations.enabled }}"
- name: FEATURE_ORGANISATION_SWITCHER_ENABLED
@@ -277,6 +279,8 @@ spec:
value: "{{ .Values.kerberoshub.frontend.features.liveview.moqEnabled }}"
- name: FEATURE_REMOTE_RECORDING_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.liveview.remoteRecordingEnabled }}"
- name: FEATURE_LIVE_VIEW_DEVICE_STATUS_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.liveview.deviceStatusEnabled }}"
- name: MOQ_RELAY_URL
value: "{{ .Values.kerberoshub.frontend.features.liveview.moqRelayUrl }}"
- name: MOQ_BROADCAST_PREFIX
@@ -375,6 +379,10 @@ spec:
value: "{{ .Values.kerberoshub.frontend.features.media.filter.markers.enabled }}"
- name: FEATURE_MEDIA_FILTER_MARKER_OPTIONS_BY_DATE_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.media.filter.markerOptionsByDate.enabled }}"
- name: FEATURE_MEDIA_FILTER_MARKER_CATEGORY_PRIORITY_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.media.filter.markerCategoryPriority.enabled }}"
- name: FEATURE_MEDIA_FILTER_MARKER_CATEGORY_PRIORITY_CATEGORIES
value: {{ .Values.kerberoshub.frontend.features.media.filter.markerCategoryPriority.categories | toJson | replace "\\" "\\\\" | replace "'" "\\u0027" | quote }}
- name: FEATURE_MEDIA_FILTER_EVENTS_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.media.filter.events.enabled }}"
- name: FEATURE_MEDIA_FILTER_TAGS_ENABLED

View File

@@ -318,6 +318,8 @@ spec:
value: "{{ .Values.kerberoshub.frontend.features.devices.analyticsEnabled }}"
- name: FEATURE_DASHBOARD_SITES_FULLSCREEN_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.dashboard.sitesFullscreenEnabled }}"
- name: FEATURE_DEVICE_DEVELOPER_TOOLS_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.devices.developerToolsEnabled }}"
- name: FEATURE_ORGANISATIONS_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.organisations.enabled }}"
- name: FEATURE_ORGANISATION_SWITCHER_ENABLED
@@ -358,6 +360,8 @@ spec:
value: "{{ .Values.kerberoshub.frontend.features.liveview.moqEnabled }}"
- name: FEATURE_REMOTE_RECORDING_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.liveview.remoteRecordingEnabled }}"
- name: FEATURE_LIVE_VIEW_DEVICE_STATUS_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.liveview.deviceStatusEnabled }}"
- name: MOQ_RELAY_URL
value: "{{ .Values.kerberoshub.frontend.features.liveview.moqRelayUrl }}"
- name: MOQ_BROADCAST_PREFIX
@@ -467,6 +471,10 @@ spec:
value: "{{ .Values.kerberoshub.frontend.features.media.filter.markers.enabled }}"
- name: FEATURE_MEDIA_FILTER_MARKER_OPTIONS_BY_DATE_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.media.filter.markerOptionsByDate.enabled }}"
- name: FEATURE_MEDIA_FILTER_MARKER_CATEGORY_PRIORITY_ENABLED
value: "{{ .Values.kerberoshub.frontend.features.media.filter.markerCategoryPriority.enabled }}"
- name: FEATURE_MEDIA_FILTER_MARKER_CATEGORY_PRIORITY_CATEGORIES
value: {{ .Values.kerberoshub.frontend.features.media.filter.markerCategoryPriority.categories | toJson | replace "\\" "\\\\" | replace "'" "\\u0027" | quote }}
- name: FEATURE_MEDIA_FILTER_DEFAULT_VIEW
value: "{{ .Values.kerberoshub.frontend.features.media.filter.defaultView }}"
- name: FEATURE_MEDIA_FILTER_EVENTS_ENABLED

View File

@@ -72,6 +72,8 @@ mongodb:
# Classifications supported by Hub filters, alerts, markers, and other
# downstream processing. Classifier output keys must match these values.
# Disable this to use the legacy classification catalog stored in MongoDB.
classificationCatalogEnabled: true
classificationCatalog:
- key: animal
label: Animal
@@ -539,7 +541,8 @@ kerberoshub:
liveStreamMode: "webrtc" # Transport backing the LIVE (HD) mode: 'webrtc' (default), 'hls' or 'moq'
hlsEnabled: "true" # Offer HLS as a selectable LIVE transport 'true' or 'false'. When 'false' the HLS option is removed from the front-end and streams use webrtc
moqEnabled: "false" # Offer MoQ as a selectable LIVE transport 'true' or 'false'
remoteRecordingEnabled: "true" # Show the manual REC control in live views
remoteRecordingEnabled: "true" # Show the manual REC control and recording-state overlay in live views
deviceStatusEnabled: "true" # Show connectivity and recent-motion status in live view tile headers
moqRelayUrl: "https://relay.uug.ai/anon" # WebTransport URL of the MoQ relay
moqBroadcastPrefix: "devices" # Prefix used to build devices/<deviceKey>/live.hang broadcast names
paginationMode: "scroll" # Pagination mode in live view 'scroll', 'numbered' or 'maxStreams'
@@ -549,6 +552,7 @@ kerberoshub:
devices:
hideAgent: "false" # Hide the 'add agent' button in the front-end
analyticsEnabled: "true" # Enable or disable the Analytics tab on device detail pages 'true' or 'false'
developerToolsEnabled: "true" # Enable or disable device logs and terminal access 'true' or 'false'
# Dashboard page
dashboard:
sitesFullscreenEnabled: "true" # Enable or disable the fullscreen Sites map 'true' or 'false'
@@ -577,6 +581,9 @@ kerberoshub:
enabled: "true" # Enable or disable markers filter in media 'true' or 'false'
markerOptionsByDate:
enabled: "false" # Limit marker-related filter options to the selected recording day
markerCategoryPriority:
enabled: "false" # Order marker options from configured categories before other markers
categories: [] # Ordered marker category names, for example ["security", "traffic"]
events:
enabled: "true" # Enable or disable events filter in media 'true' or 'false'
tags:
@@ -704,11 +711,17 @@ kerberoshub:
enabled: false
repository: ghcr.io/uug-ai/hub-audit
pullPolicy: IfNotPresent
tag: "v1.0.0"
tag: "v1.0.1"
replicas: 1
dispatchInterval: "5s"
leaseDuration: "2m"
terminationGracePeriodSeconds: 150 # Keep above leaseDuration so an in-flight cycle can finish.
intake:
queue: "hub-audit-events"
deadletterQueue: "hub-audit-dead-letter"
maxRetries: 10
prefetchCount: 20
persistTimeout: "10s"
topologySpreadConstraints: []
volumes: []
volumeMounts: []