## Summary - Enable NVIDIA container toolkit on ringtail NixOS and configure k3s containerd with nvidia runtime - Add NVIDIA device plugin ArgoCD app (RuntimeClass + DaemonSet) to expose `nvidia.com/gpu` resources - Re-target Frigate from indri minikube (arm64, ZMQ detector) to ringtail k3s (x86_64, TensorRT/ONNX) - Switch Frigate image to `-tensorrt` variant with GPU resource limits and increased shared memory ## Manual Prerequisites 1. **NFS access**: Verify ringtail can mount `sifaka:/volume1/frigate` ```fish ssh ringtail 'sudo mount -t nfs sifaka:/volume1/frigate /mnt/storage1 && ls /mnt/storage1 && sudo umount /mnt/storage1' ``` 2. **YOLO model**: Verify `/volume1/frigate/models/yolov9m.onnx` exists on sifaka ## Deployment Steps 1. Provision ringtail: `mise run provision-ringtail` 2. Sync ArgoCD apps: `argocd app sync apps --prune` 3. Deploy NVIDIA device plugin: `argocd app sync nvidia-device-plugin` 4. Verify GPU: `kubectl --context=k3s-ringtail get nodes -o json | jq '.items[].status.capacity'` 5. Deploy Frigate: `argocd app sync frigate` ## Verification - [ ] `nvidia.com/gpu: 1` visible in node capacity - [ ] Frigate pod running with GPU allocated - [ ] Frigate UI loads at `https://nvr.ops.eblu.me` - [ ] Detector shows ONNX/TensorRT on System page - [ ] Camera feed with bounding boxes in live view - [ ] TensorRT engine build completes (watch logs on first start) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Reviewed-on: https://forge.ops.eblu.me/eblume/blumeops/pulls/217
219 lines
6.3 KiB
YAML
219 lines
6.3 KiB
YAML
# Homepage values for blumeops
|
|
# Service dashboard at go.ops.eblu.me
|
|
|
|
# Enable RBAC for Kubernetes service autodiscovery
|
|
enableRbac: true
|
|
|
|
serviceAccount:
|
|
create: true
|
|
|
|
# Tailscale Ingress is managed separately in ingress-tailscale.yaml
|
|
# (Helm chart template doesn't support tailscale.com/* annotations)
|
|
ingress:
|
|
main:
|
|
enabled: false
|
|
|
|
env:
|
|
- name: HOMEPAGE_ALLOWED_HOSTS
|
|
value: "go.tail8d86e.ts.net,go.ops.eblu.me"
|
|
# Weather widget
|
|
- name: HOMEPAGE_VAR_OPENWEATHERMAP_API_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: homepage-openweathermap
|
|
key: apikey
|
|
# Jellyfin widget
|
|
- name: HOMEPAGE_VAR_JELLYFIN_API_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: homepage-jellyfin
|
|
key: apikey
|
|
# Miniflux widget
|
|
- name: HOMEPAGE_VAR_MINIFLUX_API_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: homepage-miniflux
|
|
key: apikey
|
|
# Grafana widget
|
|
- name: HOMEPAGE_VAR_GRAFANA_USERNAME
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: homepage-grafana
|
|
key: username
|
|
- name: HOMEPAGE_VAR_GRAFANA_PASSWORD
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: homepage-grafana
|
|
key: password
|
|
# Forgejo widget
|
|
- name: HOMEPAGE_VAR_FORGEJO_API_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: homepage-forgejo
|
|
key: apikey
|
|
# Navidrome widget
|
|
- name: HOMEPAGE_VAR_NAVIDROME_USER
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: homepage-navidrome
|
|
key: user
|
|
- name: HOMEPAGE_VAR_NAVIDROME_SALT
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: homepage-navidrome
|
|
key: salt
|
|
- name: HOMEPAGE_VAR_NAVIDROME_TOKEN
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: homepage-navidrome
|
|
key: token
|
|
|
|
config:
|
|
# Host services (non-k8s, on indri or LAN)
|
|
services:
|
|
- Host Services:
|
|
- Forgejo:
|
|
href: https://forge.ops.eblu.me
|
|
icon: forgejo
|
|
description: Git forge
|
|
widget:
|
|
type: gitea
|
|
url: https://forge.ops.eblu.me
|
|
key: "{{HOMEPAGE_VAR_FORGEJO_API_KEY}}"
|
|
- Registry:
|
|
href: https://registry.ops.eblu.me
|
|
icon: docker
|
|
description: Container registry
|
|
- Sifaka NAS:
|
|
href: https://nas.ops.eblu.me
|
|
icon: synology
|
|
description: NAS dashboard
|
|
widget:
|
|
type: prometheusmetric
|
|
url: https://prometheus.ops.eblu.me
|
|
metrics:
|
|
- label: Used
|
|
query: node_filesystem_size_bytes{mountpoint="/Volumes/backups"} - node_filesystem_avail_bytes{mountpoint="/Volumes/backups"}
|
|
format:
|
|
type: bytes
|
|
- label: Total
|
|
query: node_filesystem_size_bytes{mountpoint="/Volumes/backups"}
|
|
format:
|
|
type: bytes
|
|
- Borgmatic:
|
|
href: https://grafana.ops.eblu.me/d/borgmatic
|
|
icon: borgmatic
|
|
description: Backup system
|
|
widget:
|
|
type: prometheusmetric
|
|
url: https://prometheus.ops.eblu.me
|
|
metrics:
|
|
- label: Last backup
|
|
query: time() - borgmatic_last_archive_timestamp
|
|
format:
|
|
type: duration
|
|
- label: Archive size
|
|
query: borgmatic_repo_deduplicated_size_bytes
|
|
format:
|
|
type: bytes
|
|
- Jellyfin:
|
|
href: https://jellyfin.ops.eblu.me
|
|
icon: jellyfin
|
|
description: Media server
|
|
widget:
|
|
type: jellyfin
|
|
url: https://jellyfin.ops.eblu.me
|
|
key: "{{HOMEPAGE_VAR_JELLYFIN_API_KEY}}"
|
|
enableBlocks: true
|
|
enableNowPlaying: true
|
|
# TODO: Add Caddy widget when admin API is enabled (currently admin off)
|
|
# - Caddy:
|
|
# href: https://indri.tail8d86e.ts.net
|
|
# icon: caddy
|
|
# description: Reverse proxy
|
|
# widget:
|
|
# type: caddy
|
|
# url: http://indri.tail8d86e.ts.net:2019
|
|
|
|
# Services on ringtail k3s (not autodiscovered — different cluster)
|
|
- Infrastructure:
|
|
- NVR:
|
|
href: https://nvr.ops.eblu.me
|
|
icon: frigate.png
|
|
description: Network video recorder
|
|
- Ntfy:
|
|
href: https://ntfy.ops.eblu.me
|
|
icon: ntfy.png
|
|
description: Push notifications
|
|
|
|
# External bookmarks
|
|
bookmarks:
|
|
- Admin:
|
|
- Tailscale Admin:
|
|
- href: https://login.tailscale.com/admin
|
|
icon: tailscale
|
|
- 1Password:
|
|
- href: https://my.1password.com
|
|
icon: 1password
|
|
- Pulumi:
|
|
- href: https://app.pulumi.com/eblume/blumeops-tailnet
|
|
icon: si-pulumi
|
|
- ArgoCD:
|
|
- href: https://argocd.ops.eblu.me
|
|
icon: argo-cd
|
|
- UniFi:
|
|
- href: https://unifi.ui.com
|
|
icon: ubiquiti
|
|
|
|
# Widgets on the page (info bar at top)
|
|
widgets:
|
|
- greeting:
|
|
text_size: xl
|
|
text: Welcome to Blue Mops
|
|
- datetime:
|
|
text_size: lg
|
|
format:
|
|
dateStyle: long
|
|
timeStyle: short
|
|
hour12: true
|
|
- openweathermap:
|
|
label: Camano
|
|
latitude: 48.18235
|
|
longitude: -122.52590
|
|
units: imperial
|
|
provider: openweathermap
|
|
apiKey: "{{HOMEPAGE_VAR_OPENWEATHERMAP_API_KEY}}"
|
|
cache: 15
|
|
# TODO: Add UniFi widget when controller is set up
|
|
# - unifi_console:
|
|
# url: https://192.168.1.1
|
|
# username: homepage
|
|
# password: "{{HOMEPAGE_VAR_UNIFI_PASSWORD}}"
|
|
# TODO: Add Glances widget when Glances is deployed
|
|
# - glances:
|
|
# url: http://indri.tail8d86e.ts.net:61208
|
|
# metric: cpu
|
|
|
|
# Kubernetes autodiscovery
|
|
kubernetes:
|
|
mode: cluster
|
|
|
|
# Layout and styling
|
|
settingsString: |
|
|
title: BlumeOps
|
|
headerStyle: boxed
|
|
quicklaunch:
|
|
searchDescriptions: true
|
|
showSearchSuggestions: true
|
|
provider: custom
|
|
url: https://kagi.com/search?q=
|
|
suggestionUrl: https://kagisuggest.com/api/autosuggest?q=
|
|
layout:
|
|
Host Services:
|
|
style: column
|
|
Content:
|
|
style: column
|
|
Infrastructure:
|
|
style: column
|
|
Services:
|
|
style: column
|