From 736807408c73a4ff9da90d76cbf7b98bfcdf58c2 Mon Sep 17 00:00:00 2001 From: Eduardo Cuducos Date: Sat, 17 Oct 2026 21:07:02 -0400 Subject: [PATCH] Adds Bubble Mix --- apps/edge/default.conf | 2 + apps/maintenance/dbs.yaml | 4 +- apps/maintenance/navidrome-db-dump.yaml | 43 ++++++++++++++++++ apps/monitoring/prometheus.yaml | 12 +++++ apps/navidrome/README.md | 12 +++++ apps/navidrome/audiomuse-ai.yaml | 4 +- apps/navidrome/bubblemix-postgres.yaml | 60 +++++++++++++++++++++++++ apps/navidrome/bubblemix-qdrant.yaml | 49 ++++++++++++++++++++ apps/navidrome/bubblemix.yaml | 54 ++++++++++++++++++++++ apps/navidrome/deployment.yaml | 4 +- 10 files changed, 238 insertions(+), 6 deletions(-) create mode 100644 apps/maintenance/navidrome-db-dump.yaml create mode 100644 apps/navidrome/bubblemix-postgres.yaml create mode 100644 apps/navidrome/bubblemix-qdrant.yaml create mode 100644 apps/navidrome/bubblemix.yaml diff --git a/apps/edge/default.conf b/apps/edge/default.conf index 19230a3..5e4fb88 100644 --- a/apps/edge/default.conf +++ b/apps/edge/default.conf @@ -4,6 +4,7 @@ map $host $edge_backend { default not_found; api.wed.fyi http://api.wed.svc.cluster.local:4000; + bubblemix.cuducos.me http://bubblemix.navidrome.svc.cluster.local:8080; chat.cuducos.me http://element.matrix.svc.cluster.local:80; ci.cuducos.me http://server.woodpecker.svc.cluster.local:8000; dj.cuducos.me http://audiomuse-ai.navidrome.svc.cluster.local:8000; @@ -43,6 +44,7 @@ map $arg_domain $ask_allowed { default not_found; api.wed.fyi allowed; + bubblemix.cuducos.me allowed; chat.cuducos.me allowed; ci.cuducos.me allowed; dj.cuducos.me allowed; diff --git a/apps/maintenance/dbs.yaml b/apps/maintenance/dbs.yaml index 3002ae9..70bd6e1 100644 --- a/apps/maintenance/dbs.yaml +++ b/apps/maintenance/dbs.yaml @@ -52,8 +52,8 @@ data: exclude=true navidrome-sqlite: | kind=sqlite - db=/mnt/Cofrin/navidrome/data/navidrome.db - path=/mnt/Cofrin/navidrome/data + db=/mnt/Cofrin/navidrome/backup/navidrome.db + path=/mnt/Cofrin/navidrome/backup exclude=true wed-sqlite: | kind=sqlite diff --git a/apps/maintenance/navidrome-db-dump.yaml b/apps/maintenance/navidrome-db-dump.yaml new file mode 100644 index 0000000..2e9d92b --- /dev/null +++ b/apps/maintenance/navidrome-db-dump.yaml @@ -0,0 +1,43 @@ +apiVersion: batch/v1 +kind: CronJob +metadata: + name: navidrome-db-dump + namespace: maintenance +spec: + schedule: "45 5,17 * * *" + successfulJobsHistoryLimit: 3 + failedJobsHistoryLimit: 3 + jobTemplate: + spec: + backoffLimit: 3 + activeDeadlineSeconds: 1800 + template: + spec: + restartPolicy: OnFailure + nodeSelector: + kubernetes.io/hostname: pumbaa + containers: + - name: dump + image: cr.cuducos.me/cuducos/pop-zero-bkp:latest + imagePullPolicy: Always + command: + - /bin/sh + - -c + - test -f /data/navidrome.db && sqlite3 /data/navidrome.db ".backup '/backup/.navidrome.db.tmp'" && mv /backup/.navidrome.db.tmp /backup/navidrome.db + securityContext: + runAsUser: 1000 + runAsGroup: 1000 + volumeMounts: + - name: data + mountPath: /data + - name: backup + mountPath: /backup + volumes: + - name: data + hostPath: + path: /home/cuducos/navidrome/data + type: Directory + - name: backup + hostPath: + path: /mnt/Cofrin/navidrome/backup + type: Directory diff --git a/apps/monitoring/prometheus.yaml b/apps/monitoring/prometheus.yaml index 30dfc44..ad1ea4e 100644 --- a/apps/monitoring/prometheus.yaml +++ b/apps/monitoring/prometheus.yaml @@ -121,6 +121,18 @@ data: action: keep - source_labels: [__meta_kubernetes_pod_node_name] target_label: node + - job_name: 'bubblemix' + kubernetes_sd_configs: + - role: pod + relabel_configs: + - source_labels: [__meta_kubernetes_pod_label_app] + regex: bubblemix + action: keep + - source_labels: [__meta_kubernetes_pod_container_port_number] + regex: "8080" + action: keep + - source_labels: [__meta_kubernetes_pod_node_name] + target_label: node - job_name: 'minha-receita' scheme: https metrics_path: /metrics diff --git a/apps/navidrome/README.md b/apps/navidrome/README.md index 04ce007..af8e5bb 100644 --- a/apps/navidrome/README.md +++ b/apps/navidrome/README.md @@ -22,4 +22,16 @@ kubectl create secret generic multi-scrobbler-secrets \ --from-env-file=/mnt/Cofrin/navidrome/multi-scrobbler/.env ``` +## Bubblemix + +Once the project is shipped, kick the one-off backfill (add `--env=BUBBLEMIX_JETSTREAM_API_KEY=...`): + +```bash +kubectl run bubblemix-backfill --namespace=navidrome \ + --image=cr.cuducos.me/cuducos/bubblemix:latest --restart=Never \ + --env=BUBBLEMIX_DATABASE_URL=postgres://bubblemix:bubblemix@bubblemix-postgres:5432/bubblemix \ + --env=BUBBLEMIX_QDRANT_URL=http://bubblemix-qdrant:6334 \ + -- backfill +``` + diff --git a/apps/navidrome/audiomuse-ai.yaml b/apps/navidrome/audiomuse-ai.yaml index e2ccf9e..4e25cd1 100644 --- a/apps/navidrome/audiomuse-ai.yaml +++ b/apps/navidrome/audiomuse-ai.yaml @@ -24,7 +24,7 @@ spec: - name: POSTGRES_PORT value: "5432" - name: TZ - value: America/Sao_Paulo + value: America/Toronto envFrom: - secretRef: name: audiomuse-ai-env @@ -71,7 +71,7 @@ spec: - name: POSTGRES_PORT value: "5432" - name: TZ - value: America/Sao_Paulo + value: America/Toronto envFrom: - secretRef: name: audiomuse-ai-env diff --git a/apps/navidrome/bubblemix-postgres.yaml b/apps/navidrome/bubblemix-postgres.yaml new file mode 100644 index 0000000..9d58f3d --- /dev/null +++ b/apps/navidrome/bubblemix-postgres.yaml @@ -0,0 +1,60 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: bubblemix-postgres + namespace: navidrome +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: bubblemix-postgres + template: + metadata: + labels: + app: bubblemix-postgres + spec: + nodeSelector: + kubernetes.io/hostname: pumbaa + initContainers: + - name: chown-data + image: busybox:1.38 + command: ["sh", "-c", "chown -R 999:999 /var/lib/postgresql"] + volumeMounts: + - name: data + mountPath: /var/lib/postgresql + containers: + - name: postgres + image: postgres:18-trixie + env: + - name: POSTGRES_USER + value: bubblemix + - name: POSTGRES_PASSWORD + value: bubblemix + - name: POSTGRES_DB + value: bubblemix + - name: TZ + value: America/Toronto + ports: + - containerPort: 5432 + volumeMounts: + - name: data + mountPath: /var/lib/postgresql + volumes: + - name: data + hostPath: + path: /home/cuducos/bubblemix/postgres + type: Directory +--- +apiVersion: v1 +kind: Service +metadata: + name: bubblemix-postgres + namespace: navidrome +spec: + selector: + app: bubblemix-postgres + ports: + - port: 5432 + targetPort: 5432 diff --git a/apps/navidrome/bubblemix-qdrant.yaml b/apps/navidrome/bubblemix-qdrant.yaml new file mode 100644 index 0000000..76a2b95 --- /dev/null +++ b/apps/navidrome/bubblemix-qdrant.yaml @@ -0,0 +1,49 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: bubblemix-qdrant + namespace: navidrome +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app: bubblemix-qdrant + template: + metadata: + labels: + app: bubblemix-qdrant + spec: + nodeSelector: + kubernetes.io/hostname: pumbaa + containers: + - name: qdrant + image: qdrant/qdrant:v1.19.2 + ports: + - containerPort: 6333 + - containerPort: 6334 + volumeMounts: + - name: data + mountPath: /qdrant/storage + volumes: + - name: data + hostPath: + path: /home/cuducos/bubblemix/qdrant + type: Directory +--- +apiVersion: v1 +kind: Service +metadata: + name: bubblemix-qdrant + namespace: navidrome +spec: + selector: + app: bubblemix-qdrant + ports: + - name: http + port: 6333 + targetPort: 6333 + - name: grpc + port: 6334 + targetPort: 6334 diff --git a/apps/navidrome/bubblemix.yaml b/apps/navidrome/bubblemix.yaml new file mode 100644 index 0000000..964a663 --- /dev/null +++ b/apps/navidrome/bubblemix.yaml @@ -0,0 +1,54 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: bubblemix + namespace: navidrome +spec: + replicas: 1 + selector: + matchLabels: + app: bubblemix + template: + metadata: + labels: + app: bubblemix + spec: + containers: + - name: bubblemix + image: cr.cuducos.me/cuducos/bubblemix:latest + imagePullPolicy: Always + args: ["serve"] + env: + - name: BUBBLEMIX_DATABASE_URL + value: postgres://bubblemix:bubblemix@bubblemix-postgres:5432/bubblemix + - name: BUBBLEMIX_QDRANT_URL + value: http://bubblemix-qdrant:6334 + - name: BUBBLEMIX_API_TOKEN + value: 5bb826e1397acff633ee20989b63fbbd6bbcb6d481a2dcc87838b1f9e3364dd4 + - name: TZ + value: America/Toronto + ports: + - containerPort: 8080 + readinessProbe: + httpGet: + path: /health + port: 8080 + initialDelaySeconds: 5 + periodSeconds: 30 + livenessProbe: + tcpSocket: + port: 8080 + initialDelaySeconds: 10 + periodSeconds: 30 +--- +apiVersion: v1 +kind: Service +metadata: + name: bubblemix + namespace: navidrome +spec: + selector: + app: bubblemix + ports: + - port: 8080 + targetPort: 8080 diff --git a/apps/navidrome/deployment.yaml b/apps/navidrome/deployment.yaml index 1eb9408..f24f321 100644 --- a/apps/navidrome/deployment.yaml +++ b/apps/navidrome/deployment.yaml @@ -34,7 +34,7 @@ spec: - name: ND_PLUGINS_AUTORELOAD value: "true" - name: ND_AGENTS - value: audiomuseai,lastfm + value: bubblemix,audiomuseai,lastfm envFrom: - secretRef: name: navidrome-env @@ -47,7 +47,7 @@ spec: volumes: - name: data hostPath: - path: /mnt/Cofrin/navidrome/data + path: /home/cuducos/navidrome/data type: Directory - name: music hostPath: -- knotmirror 0.0.1