From f949e7f436e80e855931762174ee9824a842b23b Mon Sep 17 00:00:00 2001 From: Alex Lebens Date: Mon, 20 Oct 2025 20:55:49 -0500 Subject: [PATCH] add channels --- .../cl01tl/applications/channels/Chart.yaml | 22 ++++++++ .../channels/templates/external-secret.yaml | 55 +++++++++++++++++++ .../channels/templates/http-route.yaml | 28 ++++++++++ .../templates/persistent-volume-claim.yaml | 17 ++++++ .../channels/templates/persistent-volume.yaml | 23 ++++++++ .../templates/replication-source.yaml | 25 +++++++++ .../cl01tl/applications/channels/values.yaml | 47 ++++++++++++++++ .../cl01tl/applications/homepage/values.yaml | 28 +++++----- clusters/cl01tl/services/blocky/values.yaml | 2 +- hosts/ps08rp/blocky/config.yml | 2 +- hosts/ps09rp/blocky/config.yml | 2 +- 11 files changed, 234 insertions(+), 17 deletions(-) create mode 100644 clusters/cl01tl/applications/channels/Chart.yaml create mode 100644 clusters/cl01tl/applications/channels/templates/external-secret.yaml create mode 100644 clusters/cl01tl/applications/channels/templates/http-route.yaml create mode 100644 clusters/cl01tl/applications/channels/templates/persistent-volume-claim.yaml create mode 100644 clusters/cl01tl/applications/channels/templates/persistent-volume.yaml create mode 100644 clusters/cl01tl/applications/channels/templates/replication-source.yaml create mode 100644 clusters/cl01tl/applications/channels/values.yaml diff --git a/clusters/cl01tl/applications/channels/Chart.yaml b/clusters/cl01tl/applications/channels/Chart.yaml new file mode 100644 index 000000000..aa9324ecc --- /dev/null +++ b/clusters/cl01tl/applications/channels/Chart.yaml @@ -0,0 +1,22 @@ +apiVersion: v2 +name: channels +version: 1.0.0 +description: Channels +keywords: + - channels + - dvr + - tv +home: https://wiki.alexlebens.dev/s/ +sources: + - https://getchannels.com/dvr-server/ + - https://hub.docker.com/r/fancybits/channels-dvr + - https://github.com/bjw-s-labs/helm-charts/tree/main/charts/other/app-template +maintainers: + - name: alexlebens +dependencies: + - name: app-template + alias: channels + repository: https://bjw-s-labs.github.io/helm-charts/ + version: 4.4.0 +icon: https://cdn.jsdelivr.net/gh/selfhst/icons/png/channels-dvr.png +appVersion: 1.0.0 diff --git a/clusters/cl01tl/applications/channels/templates/external-secret.yaml b/clusters/cl01tl/applications/channels/templates/external-secret.yaml new file mode 100644 index 000000000..98cc8cb83 --- /dev/null +++ b/clusters/cl01tl/applications/channels/templates/external-secret.yaml @@ -0,0 +1,55 @@ +apiVersion: external-secrets.io/v1 +kind: ExternalSecret +metadata: + name: channels-data-backup-secret + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/name: eigenfocus-data-backup-secret + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/part-of: {{ .Release.Name }} +spec: + secretStoreRef: + kind: ClusterSecretStore + name: vault + target: + template: + mergePolicy: Merge + engineVersion: v2 + data: + RESTIC_REPOSITORY: "{{ `{{ .BUCKET_ENDPOINT }}` }}/channels/channels-data" + data: + - secretKey: BUCKET_ENDPOINT + remoteRef: + conversionStrategy: Default + decodingStrategy: None + key: /cl01tl/volsync/restic/config + metadataPolicy: None + property: S3_BUCKET_ENDPOINT + - secretKey: RESTIC_PASSWORD + remoteRef: + conversionStrategy: Default + decodingStrategy: None + key: /cl01tl/volsync/restic/config + metadataPolicy: None + property: RESTIC_PASSWORD + - secretKey: AWS_DEFAULT_REGION + remoteRef: + conversionStrategy: Default + decodingStrategy: None + key: /cl01tl/volsync/restic/config + metadataPolicy: None + property: AWS_DEFAULT_REGION + - secretKey: AWS_ACCESS_KEY_ID + remoteRef: + conversionStrategy: Default + decodingStrategy: None + key: /digital-ocean/home-infra/volsync-backups + metadataPolicy: None + property: access_key + - secretKey: AWS_SECRET_ACCESS_KEY + remoteRef: + conversionStrategy: Default + decodingStrategy: None + key: /digital-ocean/home-infra/volsync-backups + metadataPolicy: None + property: secret_key diff --git a/clusters/cl01tl/applications/channels/templates/http-route.yaml b/clusters/cl01tl/applications/channels/templates/http-route.yaml new file mode 100644 index 000000000..2faa1f0c0 --- /dev/null +++ b/clusters/cl01tl/applications/channels/templates/http-route.yaml @@ -0,0 +1,28 @@ +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: http-route-channels + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/name: http-route-channels + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/part-of: {{ .Release.Name }} +spec: + parentRefs: + - group: gateway.networking.k8s.io + kind: Gateway + name: traefik-gateway + namespace: traefik + hostnames: + - channels.alexlebens.net + rules: + - matches: + - path: + type: PathPrefix + value: / + backendRefs: + - group: '' + kind: Service + name: channels + port: 80 + weight: 100 diff --git a/clusters/cl01tl/applications/channels/templates/persistent-volume-claim.yaml b/clusters/cl01tl/applications/channels/templates/persistent-volume-claim.yaml new file mode 100644 index 000000000..9a34d8712 --- /dev/null +++ b/clusters/cl01tl/applications/channels/templates/persistent-volume-claim.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: channels-dvr-nfs-storage + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/name: channels-dvr-nfs-storage + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/part-of: {{ .Release.Name }} +spec: + volumeName: channels-dvr-nfs-storage + storageClassName: nfs-client + accessModes: + - ReadOnlyMany + resources: + requests: + storage: 1Gi diff --git a/clusters/cl01tl/applications/channels/templates/persistent-volume.yaml b/clusters/cl01tl/applications/channels/templates/persistent-volume.yaml new file mode 100644 index 000000000..ce5b0bebb --- /dev/null +++ b/clusters/cl01tl/applications/channels/templates/persistent-volume.yaml @@ -0,0 +1,23 @@ +apiVersion: v1 +kind: PersistentVolume +metadata: + name: channels-dvr-nfs-storage + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/name: channels-drv-nfs-storage + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/part-of: {{ .Release.Name }} +spec: + persistentVolumeReclaimPolicy: Retain + storageClassName: nfs-client + capacity: + storage: 1Gi + accessModes: + - ReadOnlyMany + nfs: + path: /volume2/Storage/DVR + server: synologybond.alexlebens.net + mountOptions: + - vers=4 + - minorversion=1 + - noac diff --git a/clusters/cl01tl/applications/channels/templates/replication-source.yaml b/clusters/cl01tl/applications/channels/templates/replication-source.yaml new file mode 100644 index 000000000..de9554304 --- /dev/null +++ b/clusters/cl01tl/applications/channels/templates/replication-source.yaml @@ -0,0 +1,25 @@ +apiVersion: volsync.backube/v1alpha1 +kind: ReplicationSource +metadata: + name: channels-data-backup-source + namespace: {{ .Release.Namespace }} + labels: + app.kubernetes.io/name: channels-data-backup-source + app.kubernetes.io/instance: {{ .Release.Name }} + app.kubernetes.io/part-of: {{ .Release.Name }} +spec: + sourcePVC: channels-data + trigger: + schedule: 0 4 * * * + restic: + pruneIntervalDays: 7 + repository: channels-data + retain: + hourly: 1 + daily: 3 + weekly: 2 + monthly: 2 + yearly: 4 + copyMethod: Snapshot + storageClassName: ceph-block + volumeSnapshotClassName: ceph-blockpool-snapshot diff --git a/clusters/cl01tl/applications/channels/values.yaml b/clusters/cl01tl/applications/channels/values.yaml new file mode 100644 index 000000000..08169cfda --- /dev/null +++ b/clusters/cl01tl/applications/channels/values.yaml @@ -0,0 +1,47 @@ +channels: + controllers: + main: + type: deployment + replicas: 1 + strategy: Recreate + revisionHistoryLimit: 3 + containers: + main: + image: + repository: fancybits/channels-dvr + tag: latest@sha256:284fed6f4ee5150d41d9a7f247a63e190f6f1c3a4e4bc740f029df6d36955d29 + pullPolicy: IfNotPresent + resources: + limits: + gpu.intel.com/i915: 1 + requests: + gpu.intel.com/i915: 1 + cpu: 100 + memory: 1Gi + service: + main: + controller: main + ports: + http: + port: 80 + targetPort: 8089 + protocol: HTTP + persistence: + data: + forceRename: channels-data + storageClass: ceph-block + accessMode: ReadWriteOnce + size: 2Gi + retain: true + advancedMounts: + main: + main: + - path: /channels-dvr + readOnly: false + dvr: + existingClaim: channels-dvr-nfs-storage + advancedMounts: + main: + main: + - path: /shares/DVR + readOnly: false diff --git a/clusters/cl01tl/applications/homepage/values.yaml b/clusters/cl01tl/applications/homepage/values.yaml index 094999690..61cc17845 100644 --- a/clusters/cl01tl/applications/homepage/values.yaml +++ b/clusters/cl01tl/applications/homepage/values.yaml @@ -132,21 +132,27 @@ homepage: href: https://plex.alexlebens.net siteMonitor: http://plex.plex:32400 statusStyle: dot - - Media Requests: - icon: sh-overseerr.webp - description: Overseer - href: https://overseerr.alexlebens.net - siteMonitor: http://overseerr.overseerr:80 - statusStyle: dot - Jellyfin: icon: sh-jellyfin.webp description: Media server href: https://jellyfin.alexlebens.net siteMonitor: http://jellyfin.jellyfin:80 statusStyle: dot - - Yamtrack: + - DVR: + icon: sh-channels-dvr.webp + description: Channels + href: https://channels.alexlebens.net + siteMonitor: http://channels.channels:80 + statusStyle: dot + - Media Requests: + icon: sh-overseerr.webp + description: Overseer + href: https://overseerr.alexlebens.net + siteMonitor: http://overseerr.overseerr:80 + statusStyle: dot + - Media Tracking: icon: sh-yamtrack.webp - description: Watched Media Tracking + description: Yamtrack href: https://yamtrack.alexlebens.net siteMonitor: http://yamtrack.yamtrack:80 statusStyle: dot @@ -242,12 +248,6 @@ homepage: href: https://actual.alexlebens.net siteMonitor: http://actual.actual:80 statusStyle: dot - - Project Management: - icon: sh-eigenfocus.webp - description: Eigenfocus - href: https://eigenfocus.alexlebens.net - siteMonitor: http://eigenfocus.eigenfocus:80 - statusStyle: dot - AI: icon: sh-ollama.webp description: Ollama diff --git a/clusters/cl01tl/services/blocky/values.yaml b/clusters/cl01tl/services/blocky/values.yaml index b82e31209..c700fd2ca 100644 --- a/clusters/cl01tl/services/blocky/values.yaml +++ b/clusters/cl01tl/services/blocky/values.yaml @@ -113,8 +113,8 @@ blocky: calibre IN CNAME traefik-cl01tl calibre-downloader IN CNAME traefik-cl01tl ceph IN CNAME traefik-cl01tl + channels IN CNAME traefik-cl01tl code-server IN CNAME traefik-cl01tl - eigenfocus IN CNAME traefik-cl01tl gatus IN CNAME traefik-cl01tl gitea IN CNAME traefik-cl01tl grafana IN CNAME traefik-cl01tl diff --git a/hosts/ps08rp/blocky/config.yml b/hosts/ps08rp/blocky/config.yml index c81a910ad..cc0575203 100644 --- a/hosts/ps08rp/blocky/config.yml +++ b/hosts/ps08rp/blocky/config.yml @@ -89,8 +89,8 @@ customDNS: calibre IN CNAME traefik-cl01tl calibre-downloader IN CNAME traefik-cl01tl ceph IN CNAME traefik-cl01tl + channels IN CNAME traefik-cl01tl code-server IN CNAME traefik-cl01tl - eigenfocus IN CNAME traefik-cl01tl gatus IN CNAME traefik-cl01tl gitea IN CNAME traefik-cl01tl grafana IN CNAME traefik-cl01tl diff --git a/hosts/ps09rp/blocky/config.yml b/hosts/ps09rp/blocky/config.yml index c81a910ad..cc0575203 100644 --- a/hosts/ps09rp/blocky/config.yml +++ b/hosts/ps09rp/blocky/config.yml @@ -89,8 +89,8 @@ customDNS: calibre IN CNAME traefik-cl01tl calibre-downloader IN CNAME traefik-cl01tl ceph IN CNAME traefik-cl01tl + channels IN CNAME traefik-cl01tl code-server IN CNAME traefik-cl01tl - eigenfocus IN CNAME traefik-cl01tl gatus IN CNAME traefik-cl01tl gitea IN CNAME traefik-cl01tl grafana IN CNAME traefik-cl01tl