Self-hosted YouTube-Music stack (Beatbump + ytify + Navidrome + Yubal) with yt-dlp/po-token workarounds
  • JavaScript 97.8%
  • Python 2.1%
Find a file
2026-07-15 01:45:27 +02:00
cache-build Initial public release 2026-07-15 01:45:27 +02:00
e2e Initial public release 2026-07-15 01:45:27 +02:00
indexer-build Initial public release 2026-07-15 01:45:27 +02:00
routes Initial public release 2026-07-15 01:45:27 +02:00
ytify-api Initial public release 2026-07-15 01:45:27 +02:00
ytify-build Initial public release 2026-07-15 01:45:27 +02:00
ytify-src-newfiles Initial public release 2026-07-15 01:45:27 +02:00
yubal-build Initial public release 2026-07-15 01:45:27 +02:00
.env.example Initial public release 2026-07-15 01:45:27 +02:00
.gitignore Initial public release 2026-07-15 01:45:27 +02:00
beatbump-patch.py Initial public release 2026-07-15 01:45:27 +02:00
diag-fix.py Initial public release 2026-07-15 01:45:27 +02:00
diag-playback.py Initial public release 2026-07-15 01:45:27 +02:00
diag-proxy.py Initial public release 2026-07-15 01:45:27 +02:00
diag-vp.py Initial public release 2026-07-15 01:45:27 +02:00
docker-compose.yml Initial public release 2026-07-15 01:45:27 +02:00
fanout-mapedit.py Initial public release 2026-07-15 01:45:27 +02:00
LICENSE Initial public release 2026-07-15 01:45:27 +02:00
lid-backfill.py Initial public release 2026-07-15 01:45:27 +02:00
p1-patch.py Initial public release 2026-07-15 01:45:27 +02:00
p15-patch.py Initial public release 2026-07-15 01:45:27 +02:00
p15b-patch.py Initial public release 2026-07-15 01:45:27 +02:00
README.md Initial public release 2026-07-15 01:45:27 +02:00
soulseek-sample.py Initial public release 2026-07-15 01:45:27 +02:00
test-artist.py Initial public release 2026-07-15 01:45:27 +02:00
update.sh Initial public release 2026-07-15 01:45:27 +02:00
ytify-src.patch Initial public release 2026-07-15 01:45:27 +02:00
ytify-src.PATCH-README.txt Initial public release 2026-07-15 01:45:27 +02:00
ytify-web-nginx.conf Initial public release 2026-07-15 01:45:27 +02:00

ytm-stack — pile auto-hébergée derrière music.example.com

Orchestration et code maison de la pile musicale auto-hébergée (own-the-data) servie sur music.example.com. L'application elle-même (interface + backend, fork Beatbump) vit dans un dépôt séparé : beatbump-ekaii. Ce dépôt-ci contient tout le reste : la composition Docker, les services maison (bridge, indexer), les empaquetages et correctifs, et les scripts.

Secrets — non versionnés

Aucun secret n'est dans ce dépôt. Les identifiants vivent sur l'hôte, hors git :

  • .env — MEILI_MASTER_KEY, COMPANION_SECRET_KEY.
  • .creds — NAVIDROME_USER / NAVIDROME_PASS, YUBAL_AUTH_USER / YUBAL_AUTH_PASS.

Voir .env.example pour la liste des variables attendues. Dans docker-compose.yml, les valeurs sensibles sont des références ${VAR} résolues depuis .env.

Services

Service Image Rôle
beatbump beatbump-ekaii:local (dépôt beatbump-ekaii) L'application (interface + API).
meili getmeili/meilisearch Index du catalogue local (titres / albums / artistes).
indexer ytm-indexer:local (indexer-build/) Indexe la bibliothèque dans Meilisearch + score qualité. Code maison.
ytm-cache ytm-cache:local (cache-build/) Le « bridge » : résolution transparente local/online (meilleure copie), sert fichiers locaux et pochettes, met en cache à la lecture. Code maison.
yubal yubal-bgutil:local (yubal-build/) Téléchargeur po-token (acquisition de la discographie).
ytify-api / ytify-web node / nginx (ytify-api/, ytify-build/, ytify-web-nginx.conf) Lecteur YouTube complémentaire auto-hébergé (empaquetage maison de ytify).
navidrome deluan/navidrome Bibliothèque own-the-data.

Dépendances externes (hors de ce dépôt, images upstream) : Invidious + invidious-companion (+ provider po-token bgutil) servent l'audio et la radio YouTube ; leur configuration vit à part sur l'hôte (a host directory outside this repo) car elle est dominée par des secrets (clé partagée, proxy résidentiel) — non versionnée ici.

Contenu du dépôt

  • docker-compose.yml — la pile (secrets en ${VAR}).
  • cache-build/ — le bridge ytm-cache (bridge.py + Dockerfile).
  • indexer-build/ — l'indexeur ytm-indexer (indexer.py + Dockerfile).
  • yubal-build/ — build Yubal (po-token) : Dockerfile, sitecustomize.py.
  • ytify-build/, ytify-api/, ytify-web-nginx.conf — empaquetage ytify.
  • ytify-src.patch + ytify-src-newfiles/ — nos correctifs ytify appliqués sur le clone amont (voir ytify-src.PATCH-README.txt pour le commit de base et la commande d'application).
  • routes/ytm-routes.yaml — routage (fanout anti-bot) des services.
  • e2e/harness.cjs — suite de tests de bout en bout Playwright (voir beatbump-ekaii).
  • *.py — scripts de maintenance / diagnostic / migration ponctuels (diag-*, *-patch, lid-backfill, fanout-mapedit, etc.).
  • update.sh — rafraîchissement hebdomadaire des morceaux qui touchent YouTube (yt-dlp / po-token).

Déploiement

# secrets sur l'hôte (non versionnés)
cp .env.example .env   # puis renseigner les valeurs ; créer aussi .creds

# construire les images maison
docker build -t ytm-cache:local   cache-build/
docker build -t ytm-indexer:local indexer-build/
docker build -t yubal-bgutil:local yubal-build/
# beatbump : voir le dépôt beatbump-ekaii

docker compose up -d

Les données (*-data/, *-state/, *-downloads/, meili-data/, navidrome-data/) et les clones amont (beatbump-src/, ytify-src/) restent sur l'hôte et ne sont pas versionnés (voir .gitignore).