fix: Docker one-click deployment — all deps bundled, native modules, health check

- Multi-stage build: builder installs backend + frontend deps, compiles
- Production stage: npm ci --production rebuilds native modules (opus, sqlite3)
- FFmpeg bundled via ffmpeg-static (no apt install ffmpeg)
- .dockerignore prevents node_modules/dist from being copied
- docker-compose uses host network for TS3 UDP connectivity
- Named volume for persistent data
- Health check endpoint

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
saopig1andClaude Opus 4.6 committed 2026-03-30 13:20:00 +08:00
1 parent ea38636e9b
commit 74193ffbf0
3 files changed
+82 -16

No files matched your search

+13
View File
@@ -0,0 +1,13 @@
node_modules/
web/node_modules/
dist/
web/dist/
data/
*.db
.env
config.json
cookies/
.git/
.claude/
docs/superpowers/
test-*.ts
+51 -12
View File
@@ -1,24 +1,63 @@
# ==========================================
# TSMusicBot Docker Image
# One-click deployment — all dependencies included
# ==========================================
# --- Stage 1: Build backend + frontend ---
FROM node:20-slim AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-slim
RUN apt-get update && apt-get install -y --no-install-recommends ffmpeg && \
# 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
# --- Stage 2: Production image ---
FROM node:20-slim
# Install only runtime native build tools (needed for native module rebuild)
RUN apt-get update && apt-get install -y --no-install-recommends \
python3 make g++ && \
rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Copy built output
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/web/dist ./web/dist
COPY --from=builder /app/package*.json ./
RUN npm ci --production
EXPOSE 3000
# Install production dependencies (includes ffmpeg-static, opus, sqlite3)
# These need to compile native addons inside the container
RUN npm ci --production && npm cache clean --force
# Remove build tools to reduce image size
RUN apt-get purge -y python3 make g++ && apt-get autoremove -y && \
rm -rf /var/lib/apt/lists/*
# FFmpeg is bundled via ffmpeg-static — no system ffmpeg needed
# 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"]
+18 -4
View File
@@ -1,4 +1,8 @@
version: '3.8'
# TSMusicBot — Docker Compose
# 一键部署:docker-compose up -d
#
# 所有依赖已内置(Node.js, FFmpeg, Opus 编码器)
# 无需安装任何额外软件
services:
tsmusicbot:
@@ -6,10 +10,20 @@ services:
context: ../..
dockerfile: scripts/docker/Dockerfile
container_name: tsmusicbot
ports:
- "3000:3000"
# Use host network so the bot can reach TS3 server on LAN
# If your TS3 server is on the same machine, this is required
network_mode: host
# If you prefer port mapping instead of host network, comment out
# network_mode and uncomment ports:
# ports:
# - "3000:3000" # WebUI
# - "9987:9987/udp" # TS3 voice (only if TS3 server is in another container)
volumes:
- ./data:/app/data
- tsmusicbot-data:/app/data
restart: unless-stopped
environment:
- NODE_ENV=production
volumes:
tsmusicbot-data:
driver: local