{"repo": "bobby-sheng/aitestmind", "files": {"quick-deploy.sh": {"52dbf6ffa577baaf76fe4c55f2a873f3f839b5a2": {"t": 1785745940.9484894, "n": 9527, "h": "92f3739365f684a7", "c": "#!/bin/bash\n\n# ================================\n# AI TestMind - 快速部署脚本\n# ================================\n\nset -e\n\n# 颜色定义\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nYELLOW='\\033[1;33m'\nBLUE='\\033[0;34m'\nCYAN='\\033[0;36m'\nNC='\\033[0m' # No Color\n\n# 显示横幅\nshow_banner() {\n echo -e \"${BLUE}\"\n cat << \"EOF\"\n ___ ____ ______ __ __ ___ __\n / | / _/ /_ __/__ _____/ /_/ |/ (_)___ ____/ /\n / /| | / / / / / _ \\/ ___/ __/ /|_/ / / __ \\/ __ / \n / ___ |_/ / / / / __(__ ) /_/ / / / / / / / /_/ / \n/_/ |_/___/ /_/ \\___/____/\\__/_/ /_/_/_/ /_/\\__,_/ \n\nEOF\n echo -e \"${NC}\"\n echo -e \"${CYAN}AI-Powered Visual API Test Orchestration Platform${NC}\"\n echo -e \"${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\"\n echo \"\"\n}\n\n# 检查依赖\ncheck_dependencies() {\n echo -e \"${BLUE}📋 检查系统依赖...${NC}\"\n \n # 检查 Docker\n if ! command -v docker &> /dev/null; then\n echo -e \"${RED}❌ Docker 未安装${NC}\"\n echo \"请先安装 Docker: https://docs.docker.com/get-docker/\"\n exit 1\n fi\n \n # 检查 Docker 是否运行\n if ! docker info &> /dev/null; then\n echo -e \"${RED}❌ Docker 未运行${NC}\"\n echo \"请先启动 Docker\"\n exit 1\n fi\n \n echo -e \"${GREEN}✅ Docker 已就绪${NC}\"\n \n # 检查 Docker Compose(可选)\n if command -v docker-compose &> /dev/null; then\n echo -e \"${GREEN}✅ Docker Compose 已安装${NC}\"\n USE_COMPOSE=true\n else\n echo -e \"${YELLOW}⚠️ Docker Compose 未安装,将使用 docker run${NC}\"\n USE_COMPOSE=false\n fi\n \n echo \"\"\n}\n\n# 选择镜像仓库\nselect_registry() {\n echo -e \"${BLUE}📦 选择镜像仓库:${NC}\"\n echo \" 1) GitHub Container Registry (ghcr.io) - 推荐\"\n echo \" 2) Docker Hub (docker.io)\"\n echo \" 3) 自定义镜像地址\"\n echo \"\"\n \n read -p \"请选择 [1-3]: \" registry_choice\n \n case $registry_choice in\n 1)\n echo \"\"\n echo -e \"${CYAN}请输入 GitHub 用户名或组织名:${NC}\"\n read -p \"GitHub Username: \" github_user\n IMAGE=\"ghcr.io/${github_user}/aitestmind-all-in-one:latest\"\n ;;\n 2)\n echo \"\"\n echo -e \"${CYAN}请输入 Docker Hub 用户名:${NC}\"\n read -p \"Docker Username: \" docker_user\n IMAGE=\"${docker_user}/aitestmind-all-in-one:latest\"\n ;;\n 3)\n echo \"\"\n echo -e \"${CYAN}请输入完整的镜像地址:${NC}\"\n read -p \"Image: \" IMAGE\n ;;\n *)\n echo -e \"${RED}❌ 无效的选择${NC}\"\n exit 1\n ;;\n esac\n \n echo \"\"\n echo -e \"${GREEN}📦 使用镜像: ${IMAGE}${NC}\"\n echo \"\"\n}\n\n# 配置端口\nconfigure_ports() {\n echo -e \"${BLUE}🔧 端口配置${NC}\"\n \n # 前端端口\n read -p \"前端端口 [默认: 3000]: \" frontend_port\n FRONTEND_PORT=${frontend_port:-3000}\n \n # 执行器端口\n read -p \"执行器端口 [默认: 8001]: \" executor_port\n EXECUTOR_PORT=${executor_port:-8001}\n \n # 代理端口\n read -p \"代理端口 [默认: 8899]: \" proxy_port\n PROXY_PORT=${proxy_port:-8899}\n \n echo \"\"\n echo -e \"${GREEN}✅ 端口配置:${NC}\"\n echo \" • 前端: ${FRONTEND_PORT}\"\n echo \" • 执行器: ${EXECUTOR_PORT}\"\n echo \" • 代理: ${PROXY_PORT} (mitmproxy API 采集)\"\n echo \"\"\n}\n\n# 配置 AI 提供商\nconfigure_ai() {\n echo -e \"${BLUE}🤖 AI 提供商配置 (可选)${NC}\"\n echo \"\"\n read -p \"是否配置 AI 提供商?[y/N]: \" config_ai\n \n AI_ENV=\"\"\n \n if [[ $config_ai =~ ^[Yy]$ ]]; then\n echo \"\"\n echo \"选择 AI 提供商:\"\n echo \" 1) OpenAI\"\n echo \" 2) DeepSeek\"\n echo \" 3) Claude\"\n echo \" 4) 跳过\"\n echo \"\"\n read -p \"请选择 [1-4]: \" ai_choice\n \n case $ai_choice in\n 1)\n read -p \"OpenAI API Key: \" openai_key\n read -p \"OpenAI Base URL [默认: https://api.openai.com/v1]: \" openai_url\n openai_url=${openai_url:-https://api.openai.com/v1}\n AI_ENV=\"-e OPENAI_API_KEY=$openai_key -e OPENAI_BASE_URL=$openai_url\"\n ;;\n 2)\n read -p \"DeepSeek API Key: \" deepseek_key\n AI_ENV=\"-e DEEPSEEK_API_KEY=$deepseek_key -e DEEPSEEK_BASE_URL=https://api.deepseek.com/v1\"\n ;;\n 3)\n read -p \"Claude API Key: \" claude_key\n AI_ENV=\"-e ANTHROPIC_API_KEY=$claude_key\"\n ;;\n 4)\n echo \"跳过 AI 配置\"\n ;;\n esac\n fi\n \n echo \"\"\n}\n\n# 创建目录\ncreate_directories() {\n echo -e \"${BLUE}📁 创建数据目录...${NC}\"\n \n mkdir -p ./data\n mkdir -p ./logs\n \n echo -e \"${GREEN}✅ 目录创建完成${NC}\"\n echo \"\"\n}\n\n# 拉取镜像\npull_image() {\n echo -e \"${BLUE}📥 拉取 Docker 镜像...${NC}\"\n echo \"\"\n \n docker pull $IMAGE\n \n if [ $? -ne 0 ]; then\n echo \"\"\n echo -e \"${RED}❌ 镜像拉取失败${NC}\"\n echo \"请检查:\"\n echo \" 1. 镜像地址是否正确\"\n echo \" 2. 是否需要登录 (私有镜像)\"\n echo \" 3. 网络连接是否正常\"\n exit 1\n fi\n \n echo \"\"\n echo -e \"${GREEN}✅ 镜像拉取成功${NC}\"\n echo \"\"\n}\n\n# 停止旧容器\nstop_old_container() {\n if docker ps -a | grep -q aitestmind-prod; then\n echo -e \"${YELLOW}⏹️ 停止旧容器...${NC}\"\n docker stop aitestmind-prod > /dev/null 2>&1 || true\n docker rm aitestmind-prod > /dev/null 2>&1 || true\n echo -e \"${GREEN}✅ 旧容器已停止${NC}\"\n echo \"\"\n fi\n}\n\n# 使用 Docker Run 部署\ndeploy_with_docker_run() {\n echo -e \"${BLUE}🚀 启动容器...${NC}\"\n echo \"\"\n \n docker run -d \\\n --name aitestmind-prod \\\n -p ${FRONTEND_PORT}:3000 \\\n -p ${EXECUTOR_PORT}:8001 \\\n -p ${PROXY_PORT}:8899 \\\n -e NODE_ENV=production \\\n -e DATABASE_URL=file:/app/data/dev.db \\\n -e EXECUTOR_URL=http://localhost:8001 \\\n -e PYTHONUNBUFFERED=1 \\\n $AI_ENV \\\n -v $(pwd)/data:/app/data \\\n -v $(pwd)/logs:/app/logs \\\n --restart unless-stopped \\\n $IMAGE\n \n if [ $? -ne 0 ]; then\n echo \"\"\n echo -e \"${RED}❌ 容器启动失败${NC}\"\n exit 1\n fi\n \n echo \"\"\n echo -e \"${GREEN}✅ 容器启动成功${NC}\"\n}\n\n# 使用 Docker Compose 部署\ndeploy_with_compose() {\n echo -e \"${BLUE}📝 创建 docker-compose.yml...${NC}\"\n \n cat > docker-compose.yml << EOF\nversion: '3.8'\n\nservices:\n aitestmind:\n image: $IMAGE\n container_name: aitestmind-prod\n ports:\n - \"${FRONTEND_PORT}:3000\"\n - \"${EXECUTOR_PORT}:8001\"\n - \"${PROXY_PORT}:8899\"\n environment:\n - NODE_ENV=production\n - DATABASE_URL=file:/app/data/dev.db\n - EXECUTOR_URL=http://localhost:8001\n - PYTHONUNBUFFERED=1\nEOF\n\n if [ -n \"$AI_ENV\" ]; then\n # 解析 AI_ENV 并添加到 compose 文件\n echo \"$AI_ENV\" | sed 's/-e / - /g' >> docker-compose.yml\n fi\n\n cat >> docker-compose.yml << EOF\n volumes:\n - ./data:/app/data\n - ./logs:/app/logs\n restart: unless-stopped\n healthcheck:\n test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:3000/api/health\"]\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 40s\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\nEOF\n\n echo \"\"\n echo -e \"${BLUE}🚀 启动服务...${NC}\"\n echo \"\"\n \n docker-compose up -d\n \n if [ $? -ne 0 ]; then\n echo \"\"\n echo -e \"${RED}❌ 服务启动失败${NC}\"\n exit 1\n fi\n \n echo \"\"\n echo -e \"${GREEN}✅ 服务启动成功${NC}\"\n}\n\n# 等待服务就绪\nwait_for_service() {\n echo \"\"\n echo -e \"${YELLOW}⏳ 等待服务启动...${NC}\"\n \n max_attempts=30\n attempt=0\n \n while [ $attempt -lt $max_attempts ]; do\n if curl -f http://localhost:${FRONTEND_PORT}/api/health > /dev/null 2>&1; then\n echo \"\"\n echo -e \"${GREEN}✅ 服务已就绪!${NC}\"\n return 0\n fi\n \n echo -n \".\"\n sleep 2\n attempt=$((attempt + 1))\n done\n \n echo \"\"\n echo -e \"${YELLOW}⚠️ 服务启动超时,请检查日志${NC}\"\n}\n\n# 显示部署信息\nshow_deployment_info() {\n echo \"\"\n echo -e \"${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\"\n echo -e \"${GREEN}🎉 AI TestMind 部署完成!${NC}\"\n echo -e \"${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\"\n echo \"\"\n echo -e \"${BLUE}🌐 访问地址:${NC}\"\n echo \" • 前端界面: ${CYAN}http://localhost:${FRONTEND_PORT}${NC}\"\n echo \" • 执行器API: ${CYAN}http://localhost:${EXECUTOR_PORT}${NC}\"\n echo \" • API文档: ${CYAN}http://localhost:${EXECUTOR_PORT}/docs${NC}\"\n echo \" • 代理端口: ${CYAN}localhost:${PROXY_PORT}${NC} (mitmproxy API 采集)\"\n echo \"\"\n echo -e \"${BLUE}📊 实用命令:${NC}\"\n \n if [ \"$USE_COMPOSE\" = true ]; then\n echo \" • 查看日志: ${YELLOW}docker-compose logs -f${NC}\"\n echo \" • 停止服务: ${YELLOW}docker-compose down${NC}\"\n echo \" • 重启服务: ${YELLOW}docker-compose restart${NC}\"\n else\n echo \" • 查看日志: ${YELLOW}docker logs -f aitestmind-prod${NC}\"\n echo \" • 停止容器: ${YELLOW}docker stop aitestmind-prod${NC}\"\n echo \" • 重启容器: ${YELLOW}docker restart aitestmind-prod${NC}\"\n fi\n \n echo \"\"\n echo -e \"${BLUE}📁 数据目录:${NC}\"\n echo \" • 数据库: $(pwd)/data/dev.db\"\n echo \" • 日志: $(pwd)/logs/\"\n echo \"\"\n echo -e \"${BLUE}📖 更多信息:${NC}\"\n echo \" • 部署指南: ${CYAN}docs/deployment/DEPLOYMENT_GUIDE.md${NC}\"\n echo \" • 用户文档: ${CYAN}docs/user-guide/${NC}\"\n echo \"\"\n echo -e \"${GREEN}✨ 祝你使用愉快!${NC}\"\n echo \"\"\n}\n\n# 主函数\nmain() {\n show_banner\n check_dependencies\n select_registry\n configure_ports\n configure_ai\n create_directories\n pull_image\n stop_old_container\n \n if [ \"$USE_COMPOSE\" = true ]; then\n deploy_with_compose\n else\n deploy_with_docker_run\n fi\n \n wait_for_service\n show_deployment_info\n}\n\n# 运行主函数\nmain\n\n"}, "b556eaca137e0700cc192afd6d76f303fbbf7a1f": {"t": 1785758105.4702957, "n": 9527, "h": "92f3739365f684a7", "c": "#!/bin/bash\n\n# ================================\n# AI TestMind - 快速部署脚本\n# ================================\n\nset -e\n\n# 颜色定义\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nYELLOW='\\033[1;33m'\nBLUE='\\033[0;34m'\nCYAN='\\033[0;36m'\nNC='\\033[0m' # No Color\n\n# 显示横幅\nshow_banner() {\n echo -e \"${BLUE}\"\n cat << \"EOF\"\n ___ ____ ______ __ __ ___ __\n / | / _/ /_ __/__ _____/ /_/ |/ (_)___ ____/ /\n / /| | / / / / / _ \\/ ___/ __/ /|_/ / / __ \\/ __ / \n / ___ |_/ / / / / __(__ ) /_/ / / / / / / / /_/ / \n/_/ |_/___/ /_/ \\___/____/\\__/_/ /_/_/_/ /_/\\__,_/ \n\nEOF\n echo -e \"${NC}\"\n echo -e \"${CYAN}AI-Powered Visual API Test Orchestration Platform${NC}\"\n echo -e \"${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\"\n echo \"\"\n}\n\n# 检查依赖\ncheck_dependencies() {\n echo -e \"${BLUE}📋 检查系统依赖...${NC}\"\n \n # 检查 Docker\n if ! command -v docker &> /dev/null; then\n echo -e \"${RED}❌ Docker 未安装${NC}\"\n echo \"请先安装 Docker: https://docs.docker.com/get-docker/\"\n exit 1\n fi\n \n # 检查 Docker 是否运行\n if ! docker info &> /dev/null; then\n echo -e \"${RED}❌ Docker 未运行${NC}\"\n echo \"请先启动 Docker\"\n exit 1\n fi\n \n echo -e \"${GREEN}✅ Docker 已就绪${NC}\"\n \n # 检查 Docker Compose(可选)\n if command -v docker-compose &> /dev/null; then\n echo -e \"${GREEN}✅ Docker Compose 已安装${NC}\"\n USE_COMPOSE=true\n else\n echo -e \"${YELLOW}⚠️ Docker Compose 未安装,将使用 docker run${NC}\"\n USE_COMPOSE=false\n fi\n \n echo \"\"\n}\n\n# 选择镜像仓库\nselect_registry() {\n echo -e \"${BLUE}📦 选择镜像仓库:${NC}\"\n echo \" 1) GitHub Container Registry (ghcr.io) - 推荐\"\n echo \" 2) Docker Hub (docker.io)\"\n echo \" 3) 自定义镜像地址\"\n echo \"\"\n \n read -p \"请选择 [1-3]: \" registry_choice\n \n case $registry_choice in\n 1)\n echo \"\"\n echo -e \"${CYAN}请输入 GitHub 用户名或组织名:${NC}\"\n read -p \"GitHub Username: \" github_user\n IMAGE=\"ghcr.io/${github_user}/aitestmind-all-in-one:latest\"\n ;;\n 2)\n echo \"\"\n echo -e \"${CYAN}请输入 Docker Hub 用户名:${NC}\"\n read -p \"Docker Username: \" docker_user\n IMAGE=\"${docker_user}/aitestmind-all-in-one:latest\"\n ;;\n 3)\n echo \"\"\n echo -e \"${CYAN}请输入完整的镜像地址:${NC}\"\n read -p \"Image: \" IMAGE\n ;;\n *)\n echo -e \"${RED}❌ 无效的选择${NC}\"\n exit 1\n ;;\n esac\n \n echo \"\"\n echo -e \"${GREEN}📦 使用镜像: ${IMAGE}${NC}\"\n echo \"\"\n}\n\n# 配置端口\nconfigure_ports() {\n echo -e \"${BLUE}🔧 端口配置${NC}\"\n \n # 前端端口\n read -p \"前端端口 [默认: 3000]: \" frontend_port\n FRONTEND_PORT=${frontend_port:-3000}\n \n # 执行器端口\n read -p \"执行器端口 [默认: 8001]: \" executor_port\n EXECUTOR_PORT=${executor_port:-8001}\n \n # 代理端口\n read -p \"代理端口 [默认: 8899]: \" proxy_port\n PROXY_PORT=${proxy_port:-8899}\n \n echo \"\"\n echo -e \"${GREEN}✅ 端口配置:${NC}\"\n echo \" • 前端: ${FRONTEND_PORT}\"\n echo \" • 执行器: ${EXECUTOR_PORT}\"\n echo \" • 代理: ${PROXY_PORT} (mitmproxy API 采集)\"\n echo \"\"\n}\n\n# 配置 AI 提供商\nconfigure_ai() {\n echo -e \"${BLUE}🤖 AI 提供商配置 (可选)${NC}\"\n echo \"\"\n read -p \"是否配置 AI 提供商?[y/N]: \" config_ai\n \n AI_ENV=\"\"\n \n if [[ $config_ai =~ ^[Yy]$ ]]; then\n echo \"\"\n echo \"选择 AI 提供商:\"\n echo \" 1) OpenAI\"\n echo \" 2) DeepSeek\"\n echo \" 3) Claude\"\n echo \" 4) 跳过\"\n echo \"\"\n read -p \"请选择 [1-4]: \" ai_choice\n \n case $ai_choice in\n 1)\n read -p \"OpenAI API Key: \" openai_key\n read -p \"OpenAI Base URL [默认: https://api.openai.com/v1]: \" openai_url\n openai_url=${openai_url:-https://api.openai.com/v1}\n AI_ENV=\"-e OPENAI_API_KEY=$openai_key -e OPENAI_BASE_URL=$openai_url\"\n ;;\n 2)\n read -p \"DeepSeek API Key: \" deepseek_key\n AI_ENV=\"-e DEEPSEEK_API_KEY=$deepseek_key -e DEEPSEEK_BASE_URL=https://api.deepseek.com/v1\"\n ;;\n 3)\n read -p \"Claude API Key: \" claude_key\n AI_ENV=\"-e ANTHROPIC_API_KEY=$claude_key\"\n ;;\n 4)\n echo \"跳过 AI 配置\"\n ;;\n esac\n fi\n \n echo \"\"\n}\n\n# 创建目录\ncreate_directories() {\n echo -e \"${BLUE}📁 创建数据目录...${NC}\"\n \n mkdir -p ./data\n mkdir -p ./logs\n \n echo -e \"${GREEN}✅ 目录创建完成${NC}\"\n echo \"\"\n}\n\n# 拉取镜像\npull_image() {\n echo -e \"${BLUE}📥 拉取 Docker 镜像...${NC}\"\n echo \"\"\n \n docker pull $IMAGE\n \n if [ $? -ne 0 ]; then\n echo \"\"\n echo -e \"${RED}❌ 镜像拉取失败${NC}\"\n echo \"请检查:\"\n echo \" 1. 镜像地址是否正确\"\n echo \" 2. 是否需要登录 (私有镜像)\"\n echo \" 3. 网络连接是否正常\"\n exit 1\n fi\n \n echo \"\"\n echo -e \"${GREEN}✅ 镜像拉取成功${NC}\"\n echo \"\"\n}\n\n# 停止旧容器\nstop_old_container() {\n if docker ps -a | grep -q aitestmind-prod; then\n echo -e \"${YELLOW}⏹️ 停止旧容器...${NC}\"\n docker stop aitestmind-prod > /dev/null 2>&1 || true\n docker rm aitestmind-prod > /dev/null 2>&1 || true\n echo -e \"${GREEN}✅ 旧容器已停止${NC}\"\n echo \"\"\n fi\n}\n\n# 使用 Docker Run 部署\ndeploy_with_docker_run() {\n echo -e \"${BLUE}🚀 启动容器...${NC}\"\n echo \"\"\n \n docker run -d \\\n --name aitestmind-prod \\\n -p ${FRONTEND_PORT}:3000 \\\n -p ${EXECUTOR_PORT}:8001 \\\n -p ${PROXY_PORT}:8899 \\\n -e NODE_ENV=production \\\n -e DATABASE_URL=file:/app/data/dev.db \\\n -e EXECUTOR_URL=http://localhost:8001 \\\n -e PYTHONUNBUFFERED=1 \\\n $AI_ENV \\\n -v $(pwd)/data:/app/data \\\n -v $(pwd)/logs:/app/logs \\\n --restart unless-stopped \\\n $IMAGE\n \n if [ $? -ne 0 ]; then\n echo \"\"\n echo -e \"${RED}❌ 容器启动失败${NC}\"\n exit 1\n fi\n \n echo \"\"\n echo -e \"${GREEN}✅ 容器启动成功${NC}\"\n}\n\n# 使用 Docker Compose 部署\ndeploy_with_compose() {\n echo -e \"${BLUE}📝 创建 docker-compose.yml...${NC}\"\n \n cat > docker-compose.yml << EOF\nversion: '3.8'\n\nservices:\n aitestmind:\n image: $IMAGE\n container_name: aitestmind-prod\n ports:\n - \"${FRONTEND_PORT}:3000\"\n - \"${EXECUTOR_PORT}:8001\"\n - \"${PROXY_PORT}:8899\"\n environment:\n - NODE_ENV=production\n - DATABASE_URL=file:/app/data/dev.db\n - EXECUTOR_URL=http://localhost:8001\n - PYTHONUNBUFFERED=1\nEOF\n\n if [ -n \"$AI_ENV\" ]; then\n # 解析 AI_ENV 并添加到 compose 文件\n echo \"$AI_ENV\" | sed 's/-e / - /g' >> docker-compose.yml\n fi\n\n cat >> docker-compose.yml << EOF\n volumes:\n - ./data:/app/data\n - ./logs:/app/logs\n restart: unless-stopped\n healthcheck:\n test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:3000/api/health\"]\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 40s\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\nEOF\n\n echo \"\"\n echo -e \"${BLUE}🚀 启动服务...${NC}\"\n echo \"\"\n \n docker-compose up -d\n \n if [ $? -ne 0 ]; then\n echo \"\"\n echo -e \"${RED}❌ 服务启动失败${NC}\"\n exit 1\n fi\n \n echo \"\"\n echo -e \"${GREEN}✅ 服务启动成功${NC}\"\n}\n\n# 等待服务就绪\nwait_for_service() {\n echo \"\"\n echo -e \"${YELLOW}⏳ 等待服务启动...${NC}\"\n \n max_attempts=30\n attempt=0\n \n while [ $attempt -lt $max_attempts ]; do\n if curl -f http://localhost:${FRONTEND_PORT}/api/health > /dev/null 2>&1; then\n echo \"\"\n echo -e \"${GREEN}✅ 服务已就绪!${NC}\"\n return 0\n fi\n \n echo -n \".\"\n sleep 2\n attempt=$((attempt + 1))\n done\n \n echo \"\"\n echo -e \"${YELLOW}⚠️ 服务启动超时,请检查日志${NC}\"\n}\n\n# 显示部署信息\nshow_deployment_info() {\n echo \"\"\n echo -e \"${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\"\n echo -e \"${GREEN}🎉 AI TestMind 部署完成!${NC}\"\n echo -e \"${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\"\n echo \"\"\n echo -e \"${BLUE}🌐 访问地址:${NC}\"\n echo \" • 前端界面: ${CYAN}http://localhost:${FRONTEND_PORT}${NC}\"\n echo \" • 执行器API: ${CYAN}http://localhost:${EXECUTOR_PORT}${NC}\"\n echo \" • API文档: ${CYAN}http://localhost:${EXECUTOR_PORT}/docs${NC}\"\n echo \" • 代理端口: ${CYAN}localhost:${PROXY_PORT}${NC} (mitmproxy API 采集)\"\n echo \"\"\n echo -e \"${BLUE}📊 实用命令:${NC}\"\n \n if [ \"$USE_COMPOSE\" = true ]; then\n echo \" • 查看日志: ${YELLOW}docker-compose logs -f${NC}\"\n echo \" • 停止服务: ${YELLOW}docker-compose down${NC}\"\n echo \" • 重启服务: ${YELLOW}docker-compose restart${NC}\"\n else\n echo \" • 查看日志: ${YELLOW}docker logs -f aitestmind-prod${NC}\"\n echo \" • 停止容器: ${YELLOW}docker stop aitestmind-prod${NC}\"\n echo \" • 重启容器: ${YELLOW}docker restart aitestmind-prod${NC}\"\n fi\n \n echo \"\"\n echo -e \"${BLUE}📁 数据目录:${NC}\"\n echo \" • 数据库: $(pwd)/data/dev.db\"\n echo \" • 日志: $(pwd)/logs/\"\n echo \"\"\n echo -e \"${BLUE}📖 更多信息:${NC}\"\n echo \" • 部署指南: ${CYAN}docs/deployment/DEPLOYMENT_GUIDE.md${NC}\"\n echo \" • 用户文档: ${CYAN}docs/user-guide/${NC}\"\n echo \"\"\n echo -e \"${GREEN}✨ 祝你使用愉快!${NC}\"\n echo \"\"\n}\n\n# 主函数\nmain() {\n show_banner\n check_dependencies\n select_registry\n configure_ports\n configure_ai\n create_directories\n pull_image\n stop_old_container\n \n if [ \"$USE_COMPOSE\" = true ]; then\n deploy_with_compose\n else\n deploy_with_docker_run\n fi\n \n wait_for_service\n show_deployment_info\n}\n\n# 运行主函数\nmain\n\n"}}, "docker-compose.prod.yml": {"52dbf6ffa577baaf76fe4c55f2a873f3f839b5a2": {"t": 1785746329.5333958, "n": 2099, "h": "e53a10111ceef3a6", "c": "version: '3.8'\n\n# ================================\n# API 智能测试平台 - 生产环境配置\n# 使用预构建的 Docker 镜像\n# ================================\n\nservices:\n aitestmind:\n # 使用 GitHub Container Registry 镜像\n # 也可以使用 Docker Hub: yourusername/aitestmind-all-in-one:latest\n image: ghcr.io/bobby-sheng/aitestmind-all-in-one:latest\n \n container_name: aitestmind-prod\n \n ports:\n - \"3000:3000\" # 前端端口\n - \"8001:8001\" # 执行器端口\n - \"8899:8899\" # mitmproxy 代理端口(API 采集)\n \n environment:\n # 基础配置\n - NODE_ENV=production\n - DATABASE_URL=file:/app/data/dev.db\n - EXECUTOR_URL=http://localhost:8001\n - PYTHONUNBUFFERED=1\n \n # AI 提供商配置(可选)\n # OpenAI\n - OPENAI_API_KEY=${OPENAI_API_KEY:-}\n - OPENAI_BASE_URL=${OPENAI_BASE_URL:-https://api.openai.com/v1}\n \n # DeepSeek\n - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-}\n - DEEPSEEK_BASE_URL=${DEEPSEEK_BASE_URL:-https://api.deepseek.com/v1}\n \n # Claude\n - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}\n \n # 百度文心一言\n - BAIDU_API_KEY=${BAIDU_API_KEY:-}\n - BAIDU_SECRET_KEY=${BAIDU_SECRET_KEY:-}\n \n # 阿里通义千问\n - DASHSCOPE_API_KEY=${DASHSCOPE_API_KEY:-}\n \n # Ollama(本地部署)\n - OLLAMA_BASE_URL=${OLLAMA_BASE_URL:-}\n \n volumes:\n # 数据持久化\n - ./data:/app/data\n - ./logs:/app/logs\n \n restart: unless-stopped\n \n # 健康检查\n healthcheck:\n test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:3000/api/health\", \"&&\", \"curl\", \"-f\", \"http://localhost:8001/health\"]\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 40s\n \n # 资源限制\n deploy:\n resources:\n limits:\n cpus: '2'\n memory: 2G\n reservations:\n cpus: '0.5'\n memory: 512M\n \n # 日志配置\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\n \n networks:\n - aitestmind-network\n\nnetworks:\n aitestmind-network:\n driver: bridge\n\n# 数据卷(可选)\n# 如果不使用绑定挂载,可以使用命名卷\n# volumes:\n# aitestmind-data:\n# aitestmind-logs:\n"}, "bcf0ffe2fa1bec76102f767be072392e7615e763": {"t": 1785758106.6787083, "n": 2099, "h": "e53a10111ceef3a6", "c": "version: '3.8'\n\n# ================================\n# API 智能测试平台 - 生产环境配置\n# 使用预构建的 Docker 镜像\n# ================================\n\nservices:\n aitestmind:\n # 使用 GitHub Container Registry 镜像\n # 也可以使用 Docker Hub: yourusername/aitestmind-all-in-one:latest\n image: ghcr.io/bobby-sheng/aitestmind-all-in-one:latest\n \n container_name: aitestmind-prod\n \n ports:\n - \"3000:3000\" # 前端端口\n - \"8001:8001\" # 执行器端口\n - \"8899:8899\" # mitmproxy 代理端口(API 采集)\n \n environment:\n # 基础配置\n - NODE_ENV=production\n - DATABASE_URL=file:/app/data/dev.db\n - EXECUTOR_URL=http://localhost:8001\n - PYTHONUNBUFFERED=1\n \n # AI 提供商配置(可选)\n # OpenAI\n - OPENAI_API_KEY=${OPENAI_API_KEY:-}\n - OPENAI_BASE_URL=${OPENAI_BASE_URL:-https://api.openai.com/v1}\n \n # DeepSeek\n - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-}\n - DEEPSEEK_BASE_URL=${DEEPSEEK_BASE_URL:-https://api.deepseek.com/v1}\n \n # Claude\n - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}\n \n # 百度文心一言\n - BAIDU_API_KEY=${BAIDU_API_KEY:-}\n - BAIDU_SECRET_KEY=${BAIDU_SECRET_KEY:-}\n \n # 阿里通义千问\n - DASHSCOPE_API_KEY=${DASHSCOPE_API_KEY:-}\n \n # Ollama(本地部署)\n - OLLAMA_BASE_URL=${OLLAMA_BASE_URL:-}\n \n volumes:\n # 数据持久化\n - ./data:/app/data\n - ./logs:/app/logs\n \n restart: unless-stopped\n \n # 健康检查\n healthcheck:\n test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:3000/api/health\", \"&&\", \"curl\", \"-f\", \"http://localhost:8001/health\"]\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 40s\n \n # 资源限制\n deploy:\n resources:\n limits:\n cpus: '2'\n memory: 2G\n reservations:\n cpus: '0.5'\n memory: 512M\n \n # 日志配置\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\n \n networks:\n - aitestmind-network\n\nnetworks:\n aitestmind-network:\n driver: bridge\n\n# 数据卷(可选)\n# 如果不使用绑定挂载,可以使用命名卷\n# volumes:\n# aitestmind-data:\n# aitestmind-logs:\n"}, "b556eaca137e0700cc192afd6d76f303fbbf7a1f": {"t": 1785758108.8693528, "n": 2100, "h": "bcb5fe52baf174f2", "c": "version: '3.8'\n\n# ================================\n# AI TestMind - 生产环境配置\n# 使用预构建的 Docker 镜像\n# ================================\n\nservices:\n aitestmind:\n # 使用 GitHub Container Registry 镜像\n # 也可以使用 Docker Hub: yourusername/aitestmind-all-in-one:latest\n image: ghcr.io/bobby-sheng/aitestmind-all-in-one:latest\n \n container_name: aitestmind-prod\n \n ports:\n - \"3000:3000\" # 前端端口\n - \"8001:8001\" # 执行器端口\n - \"8899:8899\" # mitmproxy 代理端口(API 采集)\n \n environment:\n # 基础配置\n - NODE_ENV=production\n - DATABASE_URL=file:/app/data/dev.db\n - EXECUTOR_URL=http://localhost:8001\n - PYTHONUNBUFFERED=1\n \n # AI 提供商配置(可选)\n # OpenAI\n - OPENAI_API_KEY=${OPENAI_API_KEY:-}\n - OPENAI_BASE_URL=${OPENAI_BASE_URL:-https://api.openai.com/v1}\n \n # DeepSeek\n - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-}\n - DEEPSEEK_BASE_URL=${DEEPSEEK_BASE_URL:-https://api.deepseek.com/v1}\n \n # Claude\n - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}\n \n # 百度文心一言\n - BAIDU_API_KEY=${BAIDU_API_KEY:-}\n - BAIDU_SECRET_KEY=${BAIDU_SECRET_KEY:-}\n \n # 阿里通义千问\n - DASHSCOPE_API_KEY=${DASHSCOPE_API_KEY:-}\n \n # Ollama(本地部署)\n - OLLAMA_BASE_URL=${OLLAMA_BASE_URL:-}\n \n volumes:\n # 数据持久化\n - ./data:/app/data\n - ./logs:/app/logs\n \n restart: unless-stopped\n \n # 健康检查\n healthcheck:\n test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:3000/api/health\", \"&&\", \"curl\", \"-f\", \"http://localhost:8001/health\"]\n interval: 30s\n timeout: 10s\n retries: 3\n start_period: 40s\n \n # 资源限制\n deploy:\n resources:\n limits:\n cpus: '2'\n memory: 2G\n reservations:\n cpus: '0.5'\n memory: 512M\n \n # 日志配置\n logging:\n driver: \"json-file\"\n options:\n max-size: \"10m\"\n max-file: \"3\"\n \n networks:\n - aitestmind-network\n\nnetworks:\n aitestmind-network:\n driver: bridge\n\n# 数据卷(可选)\n# 如果不使用绑定挂载,可以使用命名卷\n# volumes:\n# aitestmind-data:\n# aitestmind-logs:\n"}}}}