diff --git a/.dockerignore b/.dockerignore index fad52b9..5c71c94 100644 --- a/.dockerignore +++ b/.dockerignore @@ -38,7 +38,8 @@ coverage .nyc_output # 文档 -*.md +README.md +README_EN.md docs # 其他 diff --git a/Dockerfile b/Dockerfile index 02e23aa..48a4b34 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,16 +18,141 @@ RUN npm config set registry https://registry.npmjs.org/ && \ npm config delete http-proxy 2>/dev/null || true && \ npm install -g pnpm +# 声明构建参数 - 这些参数可以在 docker build 时传入 +# LLM 通用配置 +ARG VITE_LLM_PROVIDER +ARG VITE_LLM_API_KEY +ARG VITE_LLM_MODEL +ARG VITE_LLM_BASE_URL +ARG VITE_LLM_TIMEOUT +ARG VITE_LLM_TEMPERATURE +ARG VITE_LLM_MAX_TOKENS + +# Google Gemini 配置 +ARG VITE_GEMINI_API_KEY +ARG VITE_GEMINI_MODEL +ARG VITE_GEMINI_TIMEOUT_MS + +# OpenAI 配置 +ARG VITE_OPENAI_API_KEY +ARG VITE_OPENAI_MODEL +ARG VITE_OPENAI_BASE_URL + +# Claude 配置 +ARG VITE_CLAUDE_API_KEY +ARG VITE_CLAUDE_MODEL + +# 通义千问配置 +ARG VITE_QWEN_API_KEY +ARG VITE_QWEN_MODEL + +# DeepSeek 配置 +ARG VITE_DEEPSEEK_API_KEY +ARG VITE_DEEPSEEK_MODEL + +# 智谱AI 配置 +ARG VITE_ZHIPU_API_KEY +ARG VITE_ZHIPU_MODEL + +# Moonshot 配置 +ARG VITE_MOONSHOT_API_KEY +ARG VITE_MOONSHOT_MODEL + +# 百度文心一言配置 +ARG VITE_BAIDU_API_KEY +ARG VITE_BAIDU_MODEL + +# MiniMax 配置 +ARG VITE_MINIMAX_API_KEY +ARG VITE_MINIMAX_MODEL + +# 豆包配置 +ARG VITE_DOUBAO_API_KEY +ARG VITE_DOUBAO_MODEL + +# Ollama 配置 +ARG VITE_OLLAMA_API_KEY +ARG VITE_OLLAMA_MODEL +ARG VITE_OLLAMA_BASE_URL + +# Supabase 配置 +ARG VITE_SUPABASE_URL +ARG VITE_SUPABASE_ANON_KEY + +# GitHub 配置 +ARG VITE_GITHUB_TOKEN + +# 应用配置 +ARG VITE_APP_ID +ARG VITE_MAX_ANALYZE_FILES +ARG VITE_LLM_CONCURRENCY +ARG VITE_LLM_GAP_MS + +# 将构建参数转换为环境变量(Vite 构建时会读取这些环境变量) +ENV VITE_LLM_PROVIDER=$VITE_LLM_PROVIDER +ENV VITE_LLM_API_KEY=$VITE_LLM_API_KEY +ENV VITE_LLM_MODEL=$VITE_LLM_MODEL +ENV VITE_LLM_BASE_URL=$VITE_LLM_BASE_URL +ENV VITE_LLM_TIMEOUT=$VITE_LLM_TIMEOUT +ENV VITE_LLM_TEMPERATURE=$VITE_LLM_TEMPERATURE +ENV VITE_LLM_MAX_TOKENS=$VITE_LLM_MAX_TOKENS + +ENV VITE_GEMINI_API_KEY=$VITE_GEMINI_API_KEY +ENV VITE_GEMINI_MODEL=$VITE_GEMINI_MODEL +ENV VITE_GEMINI_TIMEOUT_MS=$VITE_GEMINI_TIMEOUT_MS + +ENV VITE_OPENAI_API_KEY=$VITE_OPENAI_API_KEY +ENV VITE_OPENAI_MODEL=$VITE_OPENAI_MODEL +ENV VITE_OPENAI_BASE_URL=$VITE_OPENAI_BASE_URL + +ENV VITE_CLAUDE_API_KEY=$VITE_CLAUDE_API_KEY +ENV VITE_CLAUDE_MODEL=$VITE_CLAUDE_MODEL + +ENV VITE_QWEN_API_KEY=$VITE_QWEN_API_KEY +ENV VITE_QWEN_MODEL=$VITE_QWEN_MODEL + +ENV VITE_DEEPSEEK_API_KEY=$VITE_DEEPSEEK_API_KEY +ENV VITE_DEEPSEEK_MODEL=$VITE_DEEPSEEK_MODEL + +ENV VITE_ZHIPU_API_KEY=$VITE_ZHIPU_API_KEY +ENV VITE_ZHIPU_MODEL=$VITE_ZHIPU_MODEL + +ENV VITE_MOONSHOT_API_KEY=$VITE_MOONSHOT_API_KEY +ENV VITE_MOONSHOT_MODEL=$VITE_MOONSHOT_MODEL + +ENV VITE_BAIDU_API_KEY=$VITE_BAIDU_API_KEY +ENV VITE_BAIDU_MODEL=$VITE_BAIDU_MODEL + +ENV VITE_MINIMAX_API_KEY=$VITE_MINIMAX_API_KEY +ENV VITE_MINIMAX_MODEL=$VITE_MINIMAX_MODEL + +ENV VITE_DOUBAO_API_KEY=$VITE_DOUBAO_API_KEY +ENV VITE_DOUBAO_MODEL=$VITE_DOUBAO_MODEL + +ENV VITE_OLLAMA_API_KEY=$VITE_OLLAMA_API_KEY +ENV VITE_OLLAMA_MODEL=$VITE_OLLAMA_MODEL +ENV VITE_OLLAMA_BASE_URL=$VITE_OLLAMA_BASE_URL + +ENV VITE_SUPABASE_URL=$VITE_SUPABASE_URL +ENV VITE_SUPABASE_ANON_KEY=$VITE_SUPABASE_ANON_KEY + +ENV VITE_GITHUB_TOKEN=$VITE_GITHUB_TOKEN + +ENV VITE_APP_ID=$VITE_APP_ID +ENV VITE_MAX_ANALYZE_FILES=$VITE_MAX_ANALYZE_FILES +ENV VITE_LLM_CONCURRENCY=$VITE_LLM_CONCURRENCY +ENV VITE_LLM_GAP_MS=$VITE_LLM_GAP_MS + # 复制依赖文件 COPY package.json pnpm-lock.yaml ./ # 安装依赖 RUN pnpm install --no-frozen-lockfile -# 复制项目文件(包括 .env) +# 复制项目文件(不包括 .env,因为我们使用构建参数) COPY . . -# 构建应用(环境变量会在构建时被读取) +# 构建应用(环境变量会在构建时被 Vite 读取并硬编码到代码中) RUN pnpm build # 生产阶段 - 使用 nginx 提供静态文件服务 diff --git a/docker-compose.yml b/docker-compose.yml index fd803b8..0de6b77 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,27 +4,80 @@ services: build: context: . dockerfile: Dockerfile + # 构建参数 - 从 .env 文件或环境变量传入 + args: + # LLM 通用配置 + - VITE_LLM_PROVIDER=${VITE_LLM_PROVIDER:-gemini} + - VITE_LLM_API_KEY=${VITE_LLM_API_KEY} + - VITE_LLM_MODEL=${VITE_LLM_MODEL} + - VITE_LLM_BASE_URL=${VITE_LLM_BASE_URL} + - VITE_LLM_TIMEOUT=${VITE_LLM_TIMEOUT:-150000} + - VITE_LLM_TEMPERATURE=${VITE_LLM_TEMPERATURE:-0.2} + - VITE_LLM_MAX_TOKENS=${VITE_LLM_MAX_TOKENS:-4096} + + # Google Gemini 配置 + - VITE_GEMINI_API_KEY=${VITE_GEMINI_API_KEY} + - VITE_GEMINI_MODEL=${VITE_GEMINI_MODEL:-gemini-2.5-flash} + - VITE_GEMINI_TIMEOUT_MS=${VITE_GEMINI_TIMEOUT_MS:-25000} + + # OpenAI 配置 + - VITE_OPENAI_API_KEY=${VITE_OPENAI_API_KEY} + - VITE_OPENAI_MODEL=${VITE_OPENAI_MODEL:-gpt-4o-mini} + - VITE_OPENAI_BASE_URL=${VITE_OPENAI_BASE_URL} + + # Claude 配置 + - VITE_CLAUDE_API_KEY=${VITE_CLAUDE_API_KEY} + - VITE_CLAUDE_MODEL=${VITE_CLAUDE_MODEL:-claude-3-5-sonnet-20241022} + + # 通义千问配置 + - VITE_QWEN_API_KEY=${VITE_QWEN_API_KEY} + - VITE_QWEN_MODEL=${VITE_QWEN_MODEL:-qwen-turbo} + + # DeepSeek 配置 + - VITE_DEEPSEEK_API_KEY=${VITE_DEEPSEEK_API_KEY} + - VITE_DEEPSEEK_MODEL=${VITE_DEEPSEEK_MODEL:-deepseek-chat} + + # 智谱AI 配置 + - VITE_ZHIPU_API_KEY=${VITE_ZHIPU_API_KEY} + - VITE_ZHIPU_MODEL=${VITE_ZHIPU_MODEL:-glm-4-flash} + + # Moonshot 配置 + - VITE_MOONSHOT_API_KEY=${VITE_MOONSHOT_API_KEY} + - VITE_MOONSHOT_MODEL=${VITE_MOONSHOT_MODEL:-moonshot-v1-8k} + + # 百度文心一言配置 + - VITE_BAIDU_API_KEY=${VITE_BAIDU_API_KEY} + - VITE_BAIDU_MODEL=${VITE_BAIDU_MODEL:-ERNIE-3.5-8K} + + # MiniMax 配置 + - VITE_MINIMAX_API_KEY=${VITE_MINIMAX_API_KEY} + - VITE_MINIMAX_MODEL=${VITE_MINIMAX_MODEL:-abab6.5-chat} + + # 豆包配置 + - VITE_DOUBAO_API_KEY=${VITE_DOUBAO_API_KEY} + - VITE_DOUBAO_MODEL=${VITE_DOUBAO_MODEL:-doubao-pro-32k} + + # Ollama 配置 + - VITE_OLLAMA_API_KEY=${VITE_OLLAMA_API_KEY:-ollama} + - VITE_OLLAMA_MODEL=${VITE_OLLAMA_MODEL:-llama3} + - VITE_OLLAMA_BASE_URL=${VITE_OLLAMA_BASE_URL:-http://localhost:11434/v1} + + # Supabase 配置 + - VITE_SUPABASE_URL=${VITE_SUPABASE_URL} + - VITE_SUPABASE_ANON_KEY=${VITE_SUPABASE_ANON_KEY} + + # GitHub 配置 + - VITE_GITHUB_TOKEN=${VITE_GITHUB_TOKEN} + + # 应用配置 + - VITE_APP_ID=${VITE_APP_ID:-xcodereviewer} + - VITE_MAX_ANALYZE_FILES=${VITE_MAX_ANALYZE_FILES:-40} + - VITE_LLM_CONCURRENCY=${VITE_LLM_CONCURRENCY:-2} + - VITE_LLM_GAP_MS=${VITE_LLM_GAP_MS:-500} + container_name: xcodereviewer-app ports: - "5174:80" - environment: - # Google Gemini AI 配置 (必需) - - VITE_GEMINI_API_KEY=${VITE_GEMINI_API_KEY} - - VITE_GEMINI_MODEL=${VITE_GEMINI_MODEL:-gemini-2.5-flash} - - VITE_GEMINI_TIMEOUT_MS=${VITE_GEMINI_TIMEOUT_MS:-25000} - - # Supabase 配置 (可选) - - VITE_SUPABASE_URL=${VITE_SUPABASE_URL} - - VITE_SUPABASE_ANON_KEY=${VITE_SUPABASE_ANON_KEY} - - # GitHub 集成 (可选) - - VITE_GITHUB_TOKEN=${VITE_GITHUB_TOKEN} - - # 应用配置 - - VITE_APP_ID=${VITE_APP_ID:-xcodereviewer} - - VITE_MAX_ANALYZE_FILES=${VITE_MAX_ANALYZE_FILES:-40} - - VITE_LLM_CONCURRENCY=${VITE_LLM_CONCURRENCY:-2} - - VITE_LLM_GAP_MS=${VITE_LLM_GAP_MS:-500} restart: unless-stopped networks: - xcodereviewer-network