Add Navidrome music streaming server #79
9 changed files with 183 additions and 0 deletions
Add Navidrome music streaming server deployment
Deploy Navidrome to k8s at dj.ops.eblu.me with: - NFS mount for music library from sifaka:/volume1/music (read-only) - Local PVC for SQLite database and config (10Gi) - Tailscale ingress for dj.tail8d86e.ts.net - Caddy reverse proxy for dj.ops.eblu.me - Homepage annotations for dashboard discovery Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
commit
5f7051bb39
|
|
@ -64,6 +64,9 @@ caddy_services:
|
||||||
- name: immich
|
- name: immich
|
||||||
host: "photos.{{ caddy_domain }}"
|
host: "photos.{{ caddy_domain }}"
|
||||||
backend: "https://photos.tail8d86e.ts.net"
|
backend: "https://photos.tail8d86e.ts.net"
|
||||||
|
- name: navidrome
|
||||||
|
host: "dj.{{ caddy_domain }}"
|
||||||
|
backend: "https://dj.tail8d86e.ts.net"
|
||||||
- name: hajimari
|
- name: hajimari
|
||||||
host: "go.{{ caddy_domain }}"
|
host: "go.{{ caddy_domain }}"
|
||||||
backend: "https://go.tail8d86e.ts.net"
|
backend: "https://go.tail8d86e.ts.net"
|
||||||
|
|
|
||||||
18
argocd/apps/navidrome.yaml
Normal file
18
argocd/apps/navidrome.yaml
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
---
|
||||||
|
apiVersion: argoproj.io/v1alpha1
|
||||||
|
kind: Application
|
||||||
|
metadata:
|
||||||
|
name: navidrome
|
||||||
|
namespace: argocd
|
||||||
|
spec:
|
||||||
|
project: default
|
||||||
|
source:
|
||||||
|
repoURL: ssh://forgejo@forge.ops.eblu.me:2222/eblume/blumeops.git
|
||||||
|
targetRevision: main
|
||||||
|
path: argocd/manifests/navidrome
|
||||||
|
destination:
|
||||||
|
server: https://kubernetes.default.svc
|
||||||
|
namespace: navidrome
|
||||||
|
syncPolicy:
|
||||||
|
syncOptions:
|
||||||
|
- CreateNamespace=true
|
||||||
63
argocd/manifests/navidrome/deployment.yaml
Normal file
63
argocd/manifests/navidrome/deployment.yaml
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: navidrome
|
||||||
|
namespace: navidrome
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: navidrome
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: navidrome
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: navidrome
|
||||||
|
image: deluan/navidrome:latest
|
||||||
|
ports:
|
||||||
|
- containerPort: 4533
|
||||||
|
name: http
|
||||||
|
env:
|
||||||
|
- name: ND_SCANSCHEDULE
|
||||||
|
value: "1h"
|
||||||
|
- name: ND_LOGLEVEL
|
||||||
|
value: "info"
|
||||||
|
- name: ND_MUSICFOLDER
|
||||||
|
value: "/music"
|
||||||
|
- name: ND_DATAFOLDER
|
||||||
|
value: "/data"
|
||||||
|
volumeMounts:
|
||||||
|
- name: music
|
||||||
|
mountPath: /music
|
||||||
|
readOnly: true
|
||||||
|
- name: data
|
||||||
|
mountPath: /data
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
memory: "128Mi"
|
||||||
|
cpu: "100m"
|
||||||
|
limits:
|
||||||
|
memory: "512Mi"
|
||||||
|
cpu: "500m"
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /ping
|
||||||
|
port: 4533
|
||||||
|
initialDelaySeconds: 10
|
||||||
|
periodSeconds: 30
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /ping
|
||||||
|
port: 4533
|
||||||
|
initialDelaySeconds: 5
|
||||||
|
periodSeconds: 10
|
||||||
|
volumes:
|
||||||
|
- name: music
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: navidrome-music
|
||||||
|
- name: data
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: navidrome-data
|
||||||
25
argocd/manifests/navidrome/ingress-tailscale.yaml
Normal file
25
argocd/manifests/navidrome/ingress-tailscale.yaml
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: navidrome-tailscale
|
||||||
|
namespace: navidrome
|
||||||
|
annotations:
|
||||||
|
tailscale.com/proxy-class: "default"
|
||||||
|
gethomepage.dev/enabled: "true"
|
||||||
|
gethomepage.dev/name: "DJ"
|
||||||
|
gethomepage.dev/group: "Media"
|
||||||
|
gethomepage.dev/icon: "navidrome.png"
|
||||||
|
gethomepage.dev/description: "Music streaming server"
|
||||||
|
gethomepage.dev/href: "https://dj.ops.eblu.me"
|
||||||
|
gethomepage.dev/pod-selector: "app=navidrome"
|
||||||
|
spec:
|
||||||
|
ingressClassName: tailscale
|
||||||
|
defaultBackend:
|
||||||
|
service:
|
||||||
|
name: navidrome
|
||||||
|
port:
|
||||||
|
number: 4533
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- dj
|
||||||
11
argocd/manifests/navidrome/kustomization.yaml
Normal file
11
argocd/manifests/navidrome/kustomization.yaml
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
---
|
||||||
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||||
|
kind: Kustomization
|
||||||
|
namespace: navidrome
|
||||||
|
resources:
|
||||||
|
- pv-nfs.yaml
|
||||||
|
- pvc-music.yaml
|
||||||
|
- pvc-data.yaml
|
||||||
|
- deployment.yaml
|
||||||
|
- service.yaml
|
||||||
|
- ingress-tailscale.yaml
|
||||||
22
argocd/manifests/navidrome/pv-nfs.yaml
Normal file
22
argocd/manifests/navidrome/pv-nfs.yaml
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
# NFS PersistentVolume for Navidrome music library
|
||||||
|
# Requires: NFS share on sifaka at /volume1/music with NFS permissions for indri
|
||||||
|
#
|
||||||
|
# To create on Synology:
|
||||||
|
# 1. Control Panel > Shared Folder > Create
|
||||||
|
# 2. Name: music, Location: Volume 1
|
||||||
|
# 3. Control Panel > File Services > NFS > NFS Rules
|
||||||
|
# 4. Add rule for "music" share: Hostname=indri, Privilege=Read-Only, Squash=No mapping
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolume
|
||||||
|
metadata:
|
||||||
|
name: navidrome-music-nfs-pv
|
||||||
|
spec:
|
||||||
|
capacity:
|
||||||
|
storage: 1Ti
|
||||||
|
accessModes:
|
||||||
|
- ReadOnlyMany
|
||||||
|
persistentVolumeReclaimPolicy: Retain
|
||||||
|
storageClassName: ""
|
||||||
|
nfs:
|
||||||
|
server: sifaka
|
||||||
|
path: /volume1/music
|
||||||
13
argocd/manifests/navidrome/pvc-data.yaml
Normal file
13
argocd/manifests/navidrome/pvc-data.yaml
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
# PersistentVolumeClaim for Navidrome data (SQLite database, config, cache)
|
||||||
|
# Uses minikube's default storage class for local provisioning
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: navidrome-data
|
||||||
|
namespace: navidrome
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOnce
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 10Gi
|
||||||
15
argocd/manifests/navidrome/pvc-music.yaml
Normal file
15
argocd/manifests/navidrome/pvc-music.yaml
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
# PersistentVolumeClaim for Navidrome music library
|
||||||
|
# Binds to the NFS PV for sifaka:/volume1/music
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: navidrome-music
|
||||||
|
namespace: navidrome
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadOnlyMany
|
||||||
|
storageClassName: ""
|
||||||
|
volumeName: navidrome-music-nfs-pv
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 1Ti
|
||||||
13
argocd/manifests/navidrome/service.yaml
Normal file
13
argocd/manifests/navidrome/service.yaml
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: navidrome
|
||||||
|
namespace: navidrome
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: navidrome
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 4533
|
||||||
|
targetPort: 4533
|
||||||
Loading…
Add table
Add a link
Reference in a new issue