Musicseerr -> DroppedNeedle and cleanup of retired services

This commit is contained in:
Astra Logical 2026-07-18 17:41:29 -04:00
parent 7941c5645c
commit 1594d6721d
44 changed files with 147 additions and 90 deletions

View file

@ -14,4 +14,4 @@ spec:
volumes:
- name: target-volume
persistentVolumeClaim:
claimName: musicseerr-config-pvc
claimName: calibre-web-config-pvc

View file

@ -50,18 +50,3 @@ spec:
nfs:
server: robin.home.nest
path: /yarr/media
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: bazarr-anime-config-pvc
labels:
recurring-job.longhorn.io/source: "enabled"
recurring-job-group.longhorn.io/app-config-group: "enabled"
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 10Mi

View file

@ -0,0 +1,14 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: bazarr-anime-config-pvc
labels:
recurring-job.longhorn.io/source: "enabled"
recurring-job-group.longhorn.io/app-config-group: "enabled"
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 1Gi

View file

@ -50,18 +50,3 @@ spec:
nfs:
server: robin.home.nest
path: /yarr/media
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: bazarr-config-pvc
labels:
recurring-job.longhorn.io/source: "enabled"
recurring-job-group.longhorn.io/app-config-group: "enabled"
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 5Mi

View file

@ -0,0 +1,14 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: bazarr-config-pvc
labels:
recurring-job.longhorn.io/source: "enabled"
recurring-job-group.longhorn.io/app-config-group: "enabled"
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 50Mi

BIN
services/calibre-web/app.db Normal file

Binary file not shown.

View file

@ -2,31 +2,28 @@ apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: musicseerr
name: musicseerr
app: droppedneedle
name: droppedneedle
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: musicseerr
app: droppedneedle
strategy:
type: Recreate
template:
metadata:
labels:
app: musicseerr
app: droppedneedle
spec:
containers:
- name: musicseerr
image: ghcr.io/habirabbu/musicseerr:latest
- name: droppedneedle
image: ghcr.io/habirabbu/droppedneedle:latest
ports:
- containerPort: 8688
protocol: TCP
name: web-ui
envFrom:
- secretRef:
name: musicseerr-secrets
env:
- name: PUID
value: "1000"
@ -40,24 +37,26 @@ spec:
value: "true"
- name: UVICORN_FORWARDED_ALLOW_IPS
value: "*"
- name: LIDARR_URL
value: "http://lidarr.k3s.home.nest"
- name: SLSKD_DOWNLOADS_PATH
value: "/yarr/downloads/slskd/complete"
volumeMounts:
- mountPath: /app/config
name: musicseerr-config
name: droppedneedle-config
- mountPath: /app/cache
name: musicseerr-cache
- mountPath: /music
name: droppedneedle-cache
- mountPath: /yarr
name: yarr
restartPolicy: Always
volumes:
- name: musicseerr-config
- name: droppedneedle-config
persistentVolumeClaim:
claimName: musicseerr-config-pvc
- name: musicseerr-cache
claimName: musicseerr-config-pvc # Service changed name, cannot rename PVC
- name: droppedneedle-cache
persistentVolumeClaim:
claimName: musicseerr-cache-pvc
# Note: in order for atomic renames to work we need the music library
# and the downloads folders to be on the same mount
- name: yarr
nfs:
server: robin.home.nest
path: /yarr/media
path: /yarr

View file

@ -1,7 +1,7 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: musicseerr-ingress
name: droppedneedle-ingress
namespace: default
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
@ -12,7 +12,7 @@ spec:
tls:
- hosts:
- heron.mynest.love
secretName: musicseerr-tls
secretName: droppedneedle-tls
rules:
- host: heron.mynest.love
http:
@ -21,6 +21,6 @@ spec:
pathType: Prefix
backend:
service:
name: musicseerr
name: droppedneedle
port:
name: http-web

View file

@ -1,3 +1,5 @@
# Note: This service changed name from musicseerr to droppedneedle
# PVC names are immutable, so just keeping the old names
apiVersion: v1
kind: PersistentVolumeClaim
metadata:

View file

@ -2,8 +2,8 @@ apiVersion: v1
kind: Service
metadata:
labels:
app: musicseerr
name: musicseerr
app: droppedneedle
name: droppedneedle
namespace: default
spec:
type: ClusterIP
@ -12,4 +12,4 @@ spec:
port: 80
targetPort: web-ui
selector:
app: musicseerr
app: droppedneedle

View file

@ -0,0 +1,72 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: droppedneedle-transcoder-script
namespace: default
data:
transcode.sh: |
#!/bin/bash
WATCH_DIR="/yarr/media/music"
echo "Starting transcoder watch on $WATCH_DIR..."
# Listen for files moved into the directory (atomic renames) and direct writes
inotifywait -m -r -e moved_to,close_write --format '%w%f' "$WATCH_DIR" | while read FILE
do
# Case-insensitive check for .flac extension
if [[ "${FILE,,}" == *.flac ]]; then
echo "Detected new FLAC via import: $FILE"
OPUS_FILE="${FILE%.*}.opus"
# Transcode (preserves tags natively in newer ffmpeg versions)
ffmpeg -y -i "$FILE" -acodec libopus -ac 2 -ab 160k "$OPUS_FILE"
if [ $? -eq 0 ]; then
echo "Transcode successful. Removing original FLAC..."
rm "$FILE"
echo "Triggering DroppedNeedle library scan..."
# Calls the DroppedNeedle service using internal Kubernetes DNS
curl -X POST http://droppedneedle.default.svc.cluster.local:8688/api/v1/library/scan/start
else
echo "Error: FFmpeg transcode failed for $FILE"
fi
fi
done
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: droppedneedle-transcoder
name: droppedneedle-transcoder
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: droppedneedle-transcoder
template:
metadata:
labels:
app: droppedneedle-transcoder
spec:
containers:
- name: transcoder
image: alpine:latest
command: ["/bin/sh", "-c"]
args:
- "apk add --no-cache bash inotify-tools ffmpeg curl && bash /scripts/transcode.sh"
volumeMounts:
- mountPath: /yarr
name: yarr
- mountPath: /scripts
name: script-volume
restartPolicy: Always
volumes:
- name: yarr
nfs:
server: robin.home.nest
path: /yarr
- name: script-volume
configMap:
name: droppedneedle-transcoder-script

View file

@ -1,18 +0,0 @@
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: musicseerr-secrets
namespace: default
spec:
refreshInterval: "1h"
secretStoreRef:
name: vault-external-secrets-store
kind: ClusterSecretStore
target:
name: musicseerr-secrets
creationPolicy: Owner
data:
- secretKey: LIDARR_API_KEY
remoteRef:
key: lidarr
property: api-key

View file

@ -2,20 +2,24 @@ apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: jellyseerr
name: jellyseerr
app: seerr
name: seerr
spec:
replicas: 1
selector:
matchLabels:
app: jellyseerr
app: seerr
strategy:
type: Recreate
template:
metadata:
labels:
app: jellyseerr
app: seerr
spec:
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
containers:
- env:
- name: PGID
@ -26,17 +30,17 @@ spec:
value: "3000"
- name: TZ
value: America/New_York
image: fallenbagel/jellyseerr:preview-OIDC
name: jellyseerr
image: ghcr.io/seerr-team/seerr:preview-new-oidc
name: seerr
ports:
- containerPort: 5055
protocol: TCP
name: web-ui
volumeMounts:
- mountPath: /app/config
name: jellyseerr-volume
name: seerr-volume
restartPolicy: Always
volumes:
- name: jellyseerr-volume
- name: seerr-volume
persistentVolumeClaim:
claimName: jellyseerr-data-pvc
claimName: seerr-data-pvc

View file

@ -1,7 +1,7 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: jellyseerr-ingress
name: seerr-ingress
namespace: default
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
@ -11,7 +11,7 @@ spec:
tls:
- hosts:
- stork.mynest.love
secretName: jellyseerr-tls
secretName: seerr-tls
rules:
- host: stork.mynest.love
http:
@ -20,6 +20,6 @@ spec:
pathType: Prefix
backend:
service:
name: jellyseerr
name: seerr
port:
name: http-web

View file

@ -1,7 +1,7 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jellyseerr-data-pvc
name: seerr-data-pvc
labels:
recurring-job.longhorn.io/source: "enabled"
recurring-job-group.longhorn.io/app-config-group: "enabled"

View file

@ -2,8 +2,8 @@ apiVersion: v1
kind: Service
metadata:
labels:
app: jellyseerr
name: jellyseerr
app: seerr
name: seerr
spec:
type: ClusterIP
ports:
@ -11,4 +11,4 @@ spec:
port: 80
targetPort: web-ui
selector:
app: jellyseerr
app: seerr

View file

@ -33,7 +33,7 @@ spec:
- name: SLSKD_INCOMPLETE_DIR
value: /downloads/slskd/incomplete
- name: SLSKD_REMOTE_CONFIGURATION
value: "false"
value: "true"
- name: SLSKD_REMOTE_FILE_MANAGEMENT
value: "true"
- name: TZ