# NovaSonic download backend — bakes the heavy deps (ffmpeg, Deno, yt-dlp, node libs) so restarts are # instant instead of re-installing everything on every boot. Build context = ./backend. FROM node:22-slim # System deps: python (yt-dlp), ffmpeg (tagging/convert), curl/git/unzip (installers), ca-certs. RUN apt-get update && apt-get install -y --no-install-recommends \ python3 python3-pip ffmpeg curl git unzip ca-certificates \ && rm -rf /var/lib/apt/lists/* # yt-dlp (nightly) + the Spotify helper tooling. RUN pip install --break-system-packages -U --pre 'yt-dlp[default]' \ && pip install --break-system-packages spotapi 'git+https://github.com/TzurSoffer/spotify-downloader' # Deno — yt-dlp uses it to solve YouTube's JS signature/nsig challenge. RUN curl -fsSL https://deno.land/install.sh | sh ENV PATH="/root/.deno/bin:${PATH}" # Node libs the server loads (express, kuromoji) — kept out of the app dir like the compose setup did. WORKDIR /deps RUN npm install express kuromoji ENV NODE_PATH=/deps/node_modules # App code. WORKDIR /app COPY . /app/ ENV PORT=3700 DATA_PATH=/data EXPOSE 3700 # Refresh yt-dlp on start (heavy deps already baked, so this is a quick pull) — non-fatal if offline, # the baked version still works. Keeps the "always-latest yt-dlp" behaviour of the old compose command. CMD ["sh","-c","pip install --break-system-packages -U --pre 'yt-dlp[default]' >/dev/null 2>&1 || true; node novasonic-server.js"]