Dockerfile 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # Stage 1: Install dependencies (isolated layout, same as local dev)
  2. FROM node:22-bookworm AS deps
  3. # 使用阿里云镜像源
  4. RUN sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources
  5. RUN corepack enable && corepack prepare pnpm@10.24.0 --activate
  6. RUN apt-get update && \
  7. apt-get install -y --no-install-recommends ffmpeg python3 python3-pip && \
  8. rm -rf /var/lib/apt/lists/*
  9. RUN pip3 install --break-system-packages -i https://mirrors.aliyun.com/pypi/simple/ faster-whisper
  10. WORKDIR /app
  11. COPY package.json pnpm-lock.yaml pnpm-workspace.yaml turbo.json ./
  12. COPY apps/cli/package.json apps/cli/
  13. COPY apps/web/package.json apps/web/
  14. COPY packages/shared/package.json packages/shared/
  15. COPY packages/core/package.json packages/core/
  16. COPY packages/tts/package.json packages/tts/
  17. COPY packages/templates/package.json packages/templates/
  18. COPY packages/collect/package.json packages/collect/
  19. RUN pnpm config set registry https://registry.npmmirror.com && \
  20. pnpm install --frozen-lockfile
  21. # Stage 2: Build
  22. FROM deps AS build
  23. COPY . .
  24. RUN pnpm build
  25. # Stage 3: Runtime — fresh prod install with hoisted layout
  26. FROM node:22-bookworm-slim AS runtime
  27. RUN sed -i 's|deb.debian.org|mirrors.aliyun.com|g' /etc/apt/sources.list.d/debian.sources
  28. RUN corepack enable && corepack prepare pnpm@10.24.0 --activate
  29. RUN apt-get update && \
  30. apt-get install -y --no-install-recommends \
  31. ffmpeg python3 python3-pip fontconfig \
  32. libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 libdrm2 \
  33. libxkbcommon0 libxcomposite1 libxdamage1 libxfixes3 libxrandr2 \
  34. libgbm1 libpango-1.0-0 libcairo2 libasound2 && \
  35. rm -rf /var/lib/apt/lists/*
  36. RUN pip3 install --break-system-packages -i https://mirrors.aliyun.com/pypi/simple/ faster-whisper
  37. WORKDIR /app
  38. # Copy workspace manifests + lockfile so pnpm install can resolve workspaces
  39. COPY --from=build /app/package.json /app/pnpm-lock.yaml /app/pnpm-workspace.yaml /app/turbo.json ./
  40. COPY --from=build /app/apps/cli/package.json apps/cli/
  41. COPY --from=build /app/apps/web/package.json apps/web/
  42. COPY --from=build /app/packages/shared/package.json packages/shared/
  43. COPY --from=build /app/packages/core/package.json packages/core/
  44. COPY --from=build /app/packages/tts/package.json packages/tts/
  45. COPY --from=build /app/packages/templates/package.json packages/templates/
  46. COPY --from=build /app/packages/collect/package.json packages/collect/
  47. # Install production deps with hoisted layout (everything flat at root node_modules)
  48. RUN pnpm config set registry https://registry.npmmirror.com && \
  49. pnpm install --frozen-lockfile --prod --config.node-linker=hoisted
  50. # Re-create workspace symlinks at root so any package can resolve @pipeline/* by walking up
  51. RUN mkdir -p node_modules/@pipeline && \
  52. ln -s ../../packages/shared node_modules/@pipeline/shared && \
  53. ln -s ../../packages/core node_modules/@pipeline/core && \
  54. ln -s ../../packages/tts node_modules/@pipeline/tts && \
  55. ln -s ../../packages/templates node_modules/@pipeline/templates && \
  56. ln -s ../../packages/collect node_modules/@pipeline/collect
  57. # Copy build artifacts (dist, .next, template src for Remotion entry, etc.)
  58. COPY --from=build /app/apps/cli/dist apps/cli/dist/
  59. COPY --from=build /app/apps/web/.next apps/web/.next/
  60. COPY --from=build /app/apps/web/next.config.mjs apps/web/
  61. COPY --from=build /app/apps/web/src apps/web/src/
  62. COPY --from=build /app/packages/shared/dist packages/shared/dist/
  63. COPY --from=build /app/packages/core/dist packages/core/dist/
  64. COPY --from=build /app/packages/tts/dist packages/tts/dist/
  65. COPY --from=build /app/packages/tts/scripts packages/tts/scripts/
  66. COPY --from=build /app/packages/templates/dist packages/templates/dist/
  67. COPY --from=build /app/packages/templates/src packages/templates/src/
  68. COPY --from=build /app/packages/collect/dist packages/collect/dist/
  69. COPY --from=build /app/assets assets/
  70. COPY --from=build /app/config config/
  71. # Install bundled Noto Sans SC as system font so Chrome can render CJK via fontconfig fallback
  72. RUN mkdir -p /usr/share/fonts/truetype/noto && \
  73. cp assets/fonts/NotoSansSC-Regular.ttf assets/fonts/NotoSansSC-Bold.ttf /usr/share/fonts/truetype/noto/ && \
  74. fc-cache -f
  75. EXPOSE 3000
  76. WORKDIR /app/apps/web
  77. CMD ["/app/node_modules/.bin/next", "start"]