- JavaScript 97.8%
- Python 2.1%
| cache-build | ||
| e2e | ||
| indexer-build | ||
| routes | ||
| ytify-api | ||
| ytify-build | ||
| ytify-src-newfiles | ||
| yubal-build | ||
| .env.example | ||
| .gitignore | ||
| beatbump-patch.py | ||
| diag-fix.py | ||
| diag-playback.py | ||
| diag-proxy.py | ||
| diag-vp.py | ||
| docker-compose.yml | ||
| fanout-mapedit.py | ||
| LICENSE | ||
| lid-backfill.py | ||
| p1-patch.py | ||
| p15-patch.py | ||
| p15b-patch.py | ||
| README.md | ||
| soulseek-sample.py | ||
| test-artist.py | ||
| update.sh | ||
| ytify-src.patch | ||
| ytify-src.PATCH-README.txt | ||
| ytify-web-nginx.conf | ||
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 bridgeytm-cache(bridge.py+Dockerfile).indexer-build/— l'indexeurytm-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 (voirytify-src.PATCH-README.txtpour 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 (voirbeatbump-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).