diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 33708ce..3803139 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -38,12 +38,11 @@ ENV NODE_ENV=production # 复制 package 文件(用于安装生产依赖) COPY package*.json ./ -# 安装生产依赖 + TypeScript(next start 加载 next.config.ts 需要 TS,必须在构建时装好,避免运行时安装) -RUN npm ci --only=production && npm install typescript --no-save && npm cache clean --force +# 只安装生产依赖;生产阶段仅使用 next.config.mjs,不复制 .ts,避免 next start 触发任何 npm install +RUN npm ci --only=production && npm cache clean --force -# 从构建阶段复制必要的文件 -COPY --from=builder /app/next.config.ts ./ -COPY --from=builder /app/tsconfig.json ./ +# 从构建阶段复制必要的文件(仅 .mjs 配置,Next 不会加载 .ts 故不会尝试安装 TypeScript) +COPY --from=builder /app/next.config.mjs ./ COPY --from=builder /app/public ./public COPY --from=builder /app/.next ./.next diff --git a/frontend/next.config.mjs b/frontend/next.config.mjs new file mode 100644 index 0000000..49f58f8 --- /dev/null +++ b/frontend/next.config.mjs @@ -0,0 +1,65 @@ +/** + * 生产用 Next 配置(纯 JS,运行时无需 TypeScript) + * 与 next.config.ts 逻辑一致,供 Docker 生产镜像使用,避免 next start 触发 npm install + */ + +const backendPort = process.env.NEXT_PUBLIC_BACKEND_PORT || "8080"; +const backendHost = process.env.NEXT_PUBLIC_BACKEND_HOST || "localhost"; + +/** @type {import('next').NextConfig} */ +const nextConfig = { + eslint: { + ignoreDuringBuilds: true, + }, + async rewrites() { + if (process.env.NODE_ENV === "development") { + return [ + { + source: "/agent/profile/:path*", + destination: `http://${backendHost}:${backendPort}/agent/profile/:path*`, + }, + { + source: "/agent/avatar/:path*", + destination: `http://${backendHost}:${backendPort}/agent/avatar/:path*`, + }, + { + source: "/agent/embedding-config", + destination: `http://${backendHost}:${backendPort}/agent/embedding-config`, + }, + { + source: "/agent/ai-config/:path*", + destination: `http://${backendHost}:${backendPort}/agent/ai-config/:path*`, + }, + { + source: "/:path((?!_next|agent|chat|favicon.ico).*)", + destination: `http://${backendHost}:${backendPort}/:path*`, + }, + ]; + } + return []; + }, + images: { + remotePatterns: [ + { + protocol: "http", + hostname: "192.168.124.9", + port: backendPort, + pathname: "/uploads/**", + }, + { + protocol: "http", + hostname: "localhost", + port: backendPort, + pathname: "/uploads/**", + }, + { + protocol: "http", + hostname: "127.0.0.1", + port: backendPort, + pathname: "/uploads/**", + }, + ], + }, +}; + +export default nextConfig;