mirror of
https://github.com/ZHANGTIANYAO1/teamspeak-music-bot.git
synced 2026-10-02 04:52:50 +08:00
The ffmpeg-static npm package bundles a pre-compiled binary that passes `ffmpeg -version` but crashes with SIGSEGV during actual audio processing inside Docker containers (incompatible glibc/missing shared libraries). Changes: - Install system FFmpeg via apt-get in Docker production stage, which is always compatible with the container runtime - Reverse FFmpeg resolution priority in player.ts: prefer system FFmpeg, fall back to ffmpeg-static (for non-Docker environments like Windows) - Optimize Dockerfile multi-stage build: compile native modules (opus, better-sqlite3) in builder stage and copy to production, eliminating the need for build tools (python3, make, g++) in the production image - Fix qq-music-api dependency from file:../qq-music-api (path outside Docker build context, breaks npm ci) to npm registry ^2.2.10 https://claude.ai/code/session_01JAV8sBokoifKh4Hc8XbJws
61 lines
1.8 KiB
Docker
61 lines
1.8 KiB
Docker
# ==========================================
|
|
# TSMusicBot Docker Image
|
|
# One-click deployment — all dependencies included
|
|
# ==========================================
|
|
|
|
# --- Stage 1: Build backend + frontend ---
|
|
FROM node:20-slim AS builder
|
|
|
|
# Install build tools for native modules (opus, better-sqlite3)
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
python3 make g++ && \
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /app
|
|
|
|
# Install backend dependencies
|
|
COPY package*.json ./
|
|
RUN npm ci
|
|
|
|
# Install frontend dependencies
|
|
COPY web/package*.json ./web/
|
|
RUN cd web && npm ci
|
|
|
|
# Copy source and build
|
|
COPY . .
|
|
RUN npm run build
|
|
|
|
# Install production dependencies (with native addons compiled) in the builder
|
|
# so we don't need build tools in the production image.
|
|
RUN rm -rf node_modules && npm ci --production && npm cache clean --force
|
|
|
|
# --- Stage 2: Production image ---
|
|
FROM node:20-slim
|
|
|
|
# Install system FFmpeg — the ffmpeg-static npm package bundles a pre-compiled
|
|
# binary that can SIGSEGV inside Docker (incompatible glibc / missing libs).
|
|
# System-installed FFmpeg is always compatible with the container runtime.
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
ffmpeg && \
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy built output and pre-compiled production node_modules from builder
|
|
COPY --from=builder /app/dist ./dist
|
|
COPY --from=builder /app/web/dist ./web/dist
|
|
COPY --from=builder /app/package*.json ./
|
|
COPY --from=builder /app/node_modules ./node_modules
|
|
|
|
# Data directory for database, cookies, logs
|
|
RUN mkdir -p /app/data
|
|
VOLUME ["/app/data"]
|
|
|
|
EXPOSE 3000
|
|
|
|
# Health check
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s \
|
|
CMD node -e "fetch('http://localhost:3000/api/health').then(r=>r.ok?process.exit(0):process.exit(1)).catch(()=>process.exit(1))"
|
|
|
|
CMD ["node", "dist/index.js"]
|