FROM node:20-slim # 安裝 pnpm 和必要工具 RUN npm install -g pnpm && \ apt-get update && \ apt-get install -y python3 make g++ && \ rm -rf /var/lib/apt/lists/* WORKDIR /app # 複製 pnpm 配置 COPY .npmrc ./ # 複製 workspace 配置(使用 HF 優化版本) COPY package.json pnpm-lock.yaml ./ COPY pnpm-workspace-hf.yaml ./pnpm-workspace.yaml COPY tsconfig.base.json tsconfig.json ./ # 複製所有 packages 和啟動腳本 COPY artifacts ./artifacts COPY lib ./lib COPY start.sh ./start.sh RUN chmod +x ./start.sh # 安裝依賴 RUN pnpm install --no-frozen-lockfile # 強制重新編譯 better-sqlite3 原生模組 RUN echo "=== Rebuilding better-sqlite3 ===" && \ cd node_modules/.pnpm/better-sqlite3@*/node_modules/better-sqlite3 && \ npm run build-release && \ echo "=== better-sqlite3 rebuild completed ===" # 驗證關鍵依賴 RUN echo "=== Checking esbuild ===" && pnpm list esbuild || echo "esbuild not found" RUN echo "=== Checking vite ===" && pnpm list vite || echo "vite not found" RUN echo "=== Checking typescript ===" && pnpm list typescript || echo "typescript not found" # 設定建置時需要的環境變數 ENV NODE_ENV=production ENV PORT=7860 ENV DATABASE_URL=file:/data/sqlite.db ENV TEMP_STORAGE_PATH=/app/temp-storage ENV NODE_PATH=/app/node_modules # 建置前端 RUN echo "=== Starting frontend build ===" && \ cd artifacts/image-gen && \ pnpm run build && \ echo "=== Frontend build completed ===" # 建置後端 RUN echo "=== Starting backend build ===" && \ cd artifacts/api-server && \ pnpm run build && \ echo "=== Backend build completed ===" # 驗證 better-sqlite3 是否已安裝 RUN echo "=== Checking better-sqlite3 ===" && \ pnpm list better-sqlite3 || echo "better-sqlite3 not found in workspace" && \ ls -la node_modules/.pnpm/ | grep better-sqlite3 || echo "better-sqlite3 not in .pnpm" # 建立資料和暫存目錄 RUN mkdir -p /data /app/temp-storage && \ chmod 777 /data /app/temp-storage # 暴露 Hugging Face Spaces 預設端口 EXPOSE 7860 # 啟動命令(使用腳本確保從正確的目錄執行) CMD ["./start.sh"]