#!/bin/bash # DMS合规性测试工具 - WSL简化版本 # 基于原始multiplatform脚本,仅适配WSL环境 set -euo pipefail # WSL环境检测和设置 if [[ -n "${WSL_DISTRO_NAME:-}" ]] || [[ -n "${WSL_INTEROP:-}" ]]; then echo "[信息] 检测到WSL环境: ${WSL_DISTRO_NAME:-Unknown}" export MSYS_NO_PATHCONV=1 export COMPOSE_CONVERT_WINDOWS_PATHS=1 else echo "[信息] 检测到Linux环境" fi # 配置变量 EXPORT_DIR="dms-compliance-wsl-$(date +%Y%m%d-%H%M%S)" IMAGE_NAME="compliance-dms-wsl" ARCHIVE_NAME="$EXPORT_DIR.tar.gz" # 支持的平台列表 get_platform() { case "$1" in 1) echo "linux/amd64" ;; 2) echo "linux/arm64" ;; 3) echo "linux/arm/v7" ;; *) echo "" ;; esac } get_platform_name() { case "$1" in "linux/amd64") echo "AMD64 (x86_64) - Intel/AMD 64位" ;; "linux/arm64") echo "ARM64 (aarch64) - Apple M1/M2, ARM 64位" ;; "linux/arm/v7") echo "ARMv7 - 树莓派 3/4, ARM 32位" ;; *) echo "未知平台" ;; esac } # 服务架构选择 get_service_arch() { case "$1" in 1) echo "dual" ;; 2) echo "fastapi" ;; 3) echo "flask" ;; *) echo "" ;; esac } get_service_arch_name() { case "$1" in "dual") echo "双服务架构 - API服务器(5050) + 历史查看器(5051)" ;; "fastapi") echo "FastAPI服务 - 现代异步框架,自动生成API文档(5051)" ;; "flask") echo "Flask服务 - 轻量级传统框架(5050)" ;; *) echo "未知架构" ;; esac } get_service_ports() { case "$1" in "dual") echo "5050,5051" ;; "fastapi") echo "5051" ;; "flask") echo "5050" ;; *) echo "5050" ;; esac } # 检测当前平台 CURRENT_ARCH=$(docker version --format '{{.Server.Arch}}' 2>/dev/null || echo "amd64") case "$CURRENT_ARCH" in x86_64|amd64) CURRENT_PLATFORM="linux/amd64" ;; aarch64|arm64) CURRENT_PLATFORM="linux/arm64" ;; armv7l) CURRENT_PLATFORM="linux/arm/v7" ;; *) CURRENT_PLATFORM="linux/amd64" ;; esac echo "=== DMS合规性测试工具 WSL简化版本 ===" echo "[信息] 当前平台: $(get_platform_name "$CURRENT_PLATFORM")" echo "" # 选择服务架构 echo "请选择服务架构:" echo " 1) $(get_service_arch_name "dual")" echo " 2) $(get_service_arch_name "fastapi")" echo " 3) $(get_service_arch_name "flask")" echo "" read -p "请输入选择 (1-3) [默认: 1]: " service_choice service_choice=${service_choice:-1} SELECTED_SERVICE_ARCH=$(get_service_arch "$service_choice") if [[ -z "$SELECTED_SERVICE_ARCH" ]]; then echo "[错误] 无效的服务架构选择" exit 1 fi SELECTED_PORTS=$(get_service_ports "$SELECTED_SERVICE_ARCH") echo "[信息] 选择的架构: $(get_service_arch_name "$SELECTED_SERVICE_ARCH")" echo "[信息] 服务端口: $SELECTED_PORTS" echo "" # 选择目标平台(简化版) echo "请选择目标平台架构:" echo " 1) $(get_platform_name "linux/amd64") [推荐]" echo " 2) $(get_platform_name "linux/arm64")" echo " 3) $(get_platform_name "linux/arm/v7")" echo " 0) 自动检测当前平台" echo "" read -p "请输入选择 (0-3) [默认: 0]: " platform_choice platform_choice=${platform_choice:-0} if [[ "$platform_choice" == "0" ]]; then TARGET_PLATFORM="$CURRENT_PLATFORM" TARGET_PLATFORM_NAME="$(get_platform_name "$CURRENT_PLATFORM") [自动检测]" else TARGET_PLATFORM=$(get_platform "$platform_choice") if [[ -z "$TARGET_PLATFORM" ]]; then echo "[错误] 无效的平台选择" exit 1 fi TARGET_PLATFORM_NAME=$(get_platform_name "$TARGET_PLATFORM") fi echo "[信息] 目标平台: $TARGET_PLATFORM_NAME" echo "" # 确认构建 echo "构建配置确认:" echo " 架构: $(get_service_arch_name "$SELECTED_SERVICE_ARCH")" echo " 端口: $SELECTED_PORTS" echo " 平台: $TARGET_PLATFORM_NAME" echo "" read -p "确认开始构建? (y/N): " confirm if [[ ! "$confirm" =~ ^[Yy]$ ]]; then echo "[信息] 构建已取消" exit 0 fi echo "" echo "=== 开始构建流程 ===" # 更新导出目录名称 platform_suffix=$(echo "$TARGET_PLATFORM" | sed 's/linux\///g' | sed 's/\//-/g') EXPORT_DIR="dms-compliance-${SELECTED_SERVICE_ARCH}-${platform_suffix}-wsl-$(date +%Y%m%d-%H%M%S)" ARCHIVE_NAME="$EXPORT_DIR.tar.gz" # 创建最终导出目录 rm -rf "$EXPORT_DIR" mkdir -p "$EXPORT_DIR" echo "" # 复制项目文件(直接使用原始脚本的逻辑) echo "[步骤 1/6] 复制项目文件..." # 创建临时构建目录 TEMP_BUILD_DIR=$(mktemp -d) trap "rm -rf $TEMP_BUILD_DIR" EXIT # 复制核心目录(排除缓存和临时文件) echo "[信息] 复制核心目录..." mkdir -p "$TEMP_BUILD_DIR"/{ddms_compliance_suite,custom_stages,custom_testcases,templates,static,assets} rsync -av --exclude='__pycache__' --exclude='*.pyc' --exclude='*.log' ddms_compliance_suite/ "$TEMP_BUILD_DIR/ddms_compliance_suite/" 2>/dev/null || cp -r ddms_compliance_suite "$TEMP_BUILD_DIR/" rsync -av --exclude='__pycache__' --exclude='*.pyc' custom_stages/ "$TEMP_BUILD_DIR/custom_stages/" 2>/dev/null || cp -r custom_stages "$TEMP_BUILD_DIR/" rsync -av --exclude='__pycache__' --exclude='*.pyc' custom_testcases/ "$TEMP_BUILD_DIR/custom_testcases/" 2>/dev/null || cp -r custom_testcases "$TEMP_BUILD_DIR/" 2>/dev/null || true # 复制模板和静态文件 rsync -av templates/ "$TEMP_BUILD_DIR/templates/" 2>/dev/null || cp -r templates "$TEMP_BUILD_DIR/" 2>/dev/null || mkdir -p "$TEMP_BUILD_DIR/templates" rsync -av static/ "$TEMP_BUILD_DIR/static/" 2>/dev/null || cp -r static "$TEMP_BUILD_DIR/" 2>/dev/null || mkdir -p "$TEMP_BUILD_DIR/static" rsync -av assets/ "$TEMP_BUILD_DIR/assets/" 2>/dev/null || cp -r assets "$TEMP_BUILD_DIR/" 2>/dev/null || mkdir -p "$TEMP_BUILD_DIR/assets" # 复制核心Python文件 echo "[信息] 复制核心Python文件..." for file in api_server.py history_viewer.py flask_app.py web_interface.py; do [ -f "$file" ] && cp "$file" "$TEMP_BUILD_DIR/" done # 复制requirements.txt if [ -f "requirements.txt" ]; then cp requirements.txt "$TEMP_BUILD_DIR/" else echo "[错误] requirements.txt 文件不存在" exit 1 fi echo "[成功] 项目文件复制完成" echo "" # 创建Dockerfile(直接使用原始脚本的逻辑) echo "[步骤 2/6] 创建 Dockerfile..." cd "$TEMP_BUILD_DIR" if [[ "$SELECTED_SERVICE_ARCH" == "dual" ]]; then # 双服务架构 - 使用supervisor管理两个服务 cat > "Dockerfile" << 'EOF' # 多阶段构建 - 构建阶段 FROM python:3.11-alpine AS builder # 安装构建依赖 RUN apk add --no-cache \ gcc \ musl-dev \ libffi-dev \ openssl-dev \ cargo \ rust # 设置工作目录 WORKDIR /app # 复制依赖文件 COPY requirements.txt . # 创建虚拟环境并安装依赖 RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" RUN pip install --no-cache-dir --upgrade pip setuptools wheel RUN pip install --no-cache-dir -r requirements.txt # 运行阶段 FROM python:3.11-alpine AS runtime # 安装运行时依赖 RUN apk add --no-cache \ supervisor \ curl \ bash \ tzdata # 从构建阶段复制虚拟环境 COPY --from=builder /opt/venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" # 设置工作目录 WORKDIR /app # 复制应用代码 COPY . . # 创建supervisor配置 RUN mkdir -p /etc/supervisor/conf.d COPY supervisord.conf /etc/supervisor/conf.d/ # 创建必要目录 RUN mkdir -p /var/log/supervisor /app/logs /app/test_reports /app/uploads # 创建非root用户 RUN addgroup -g 1000 appuser && \ adduser -D -u 1000 -G appuser appuser && \ chown -R appuser:appuser /app /var/log/supervisor USER appuser # 设置环境变量 ENV PYTHONPATH=/app ENV FLASK_ENV=production ENV PYTHONUNBUFFERED=1 # 健康检查 HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD curl -f http://localhost:5050/ || exit 1 # 暴露端口 EXPOSE 5050 5051 # 启动命令 CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] EOF # 创建supervisor配置 cat > "supervisord.conf" << 'EOF' [supervisord] nodaemon=true logfile=/var/log/supervisor/supervisord.log pidfile=/var/run/supervisord.pid childlogdir=/var/log/supervisor logfile_maxbytes=50MB logfile_backups=10 loglevel=info [unix_http_server] file=/tmp/supervisor.sock chmod=0700 [supervisorctl] serverurl=unix:///tmp/supervisor.sock [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface # DMS API服务器 (主服务) [program:api_server] command=python api_server.py directory=/app autostart=true autorestart=true redirect_stderr=true stdout_logfile=/var/log/supervisor/api_server.log stdout_logfile_maxbytes=10MB stdout_logfile_backups=5 environment=PYTHONPATH="/app",PYTHONUNBUFFERED="1" # 历史查看器服务 [program:history_viewer] command=python history_viewer.py directory=/app autostart=true autorestart=true redirect_stderr=true stdout_logfile=/var/log/supervisor/history_viewer.log stdout_logfile_maxbytes=10MB stdout_logfile_backups=5 environment=PYTHONPATH="/app",PYTHONUNBUFFERED="1" # 进程组配置 [group:dms_services] programs=api_server,history_viewer priority=999 EOF elif [[ "$SELECTED_SERVICE_ARCH" == "fastapi" ]]; then cat > "Dockerfile" << 'EOF' # 多阶段构建 - 构建阶段 FROM python:3.11-alpine AS builder # 安装构建依赖 RUN apk add --no-cache \ gcc \ musl-dev \ libffi-dev \ openssl-dev \ cargo \ rust # 设置工作目录 WORKDIR /app # 复制依赖文件 COPY requirements.txt . # 创建虚拟环境并安装依赖 RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" RUN pip install --no-cache-dir --upgrade pip setuptools wheel RUN pip install --no-cache-dir -r requirements.txt RUN pip install --no-cache-dir fastapi uvicorn[standard] # 运行阶段 FROM python:3.11-alpine AS runtime # 安装运行时依赖 RUN apk add --no-cache \ curl \ bash \ tzdata # 从构建阶段复制虚拟环境 COPY --from=builder /opt/venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" # 设置工作目录 WORKDIR /app # 复制应用代码 COPY . . # 创建非root用户 RUN addgroup -g 1000 appuser && \ adduser -D -u 1000 -G appuser appuser && \ chown -R appuser:appuser /app USER appuser # 健康检查 HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD curl -f http://localhost:5051/health || exit 1 # 暴露端口 EXPOSE 5051 # 启动命令 CMD ["uvicorn", "web_interface_fastapi:app", "--host", "0.0.0.0", "--port", "5051"] EOF else # Flask服务架构 cat > "Dockerfile" << 'EOF' # 多阶段构建 - 构建阶段 FROM python:3.11-alpine AS builder # 安装构建依赖 RUN apk add --no-cache \ gcc \ musl-dev \ libffi-dev \ openssl-dev \ cargo \ rust # 设置工作目录 WORKDIR /app # 复制依赖文件 COPY requirements.txt . # 创建虚拟环境并安装依赖 RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" RUN pip install --no-cache-dir --upgrade pip setuptools wheel RUN pip install --no-cache-dir -r requirements.txt # 运行阶段 FROM python:3.11-alpine AS runtime # 安装运行时依赖 RUN apk add --no-cache \ curl \ bash \ tzdata # 从构建阶段复制虚拟环境 COPY --from=builder /opt/venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" # 设置工作目录 WORKDIR /app # 复制应用代码 COPY . . # 创建非root用户 RUN addgroup -g 1000 appuser && \ adduser -D -u 1000 -G appuser appuser && \ chown -R appuser:appuser /app USER appuser # 健康检查 HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD curl -f http://localhost:5050/ || exit 1 # 暴露端口 EXPOSE 5050 # 启动命令 CMD ["python", "api_server.py"] EOF fi cd - > /dev/null echo "[成功] Dockerfile创建完成" echo "" # 复制构建文件到最终目录 echo "[步骤 3/6] 复制构建文件..." mkdir -p "$EXPORT_DIR" cp -r "$TEMP_BUILD_DIR"/* "$EXPORT_DIR/" # 创建Docker Compose文件 echo "[步骤 4/6] 创建 Docker Compose 配置..." if [[ "$SELECTED_SERVICE_ARCH" == "dual" ]]; then # 双服务架构 cat > "$EXPORT_DIR/docker-compose.yml" << EOF services: dms-compliance: build: context: . dockerfile: Dockerfile platforms: - $TARGET_PLATFORM image: $IMAGE_NAME:latest container_name: dms-compliance-tool ports: - "5050:5050" # API服务器端口 - "5051:5051" # 历史查看器端口 environment: - PYTHONPATH=/app - TZ=Asia/Shanghai - FLASK_ENV=production - PYTHONUNBUFFERED=1 volumes: - ./uploads:/app/uploads - ./logs:/app/logs - ./test_reports:/app/test_reports - ./config:/app/config:ro restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:5050/"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - dms-network networks: dms-network: driver: bridge volumes: uploads: logs: test_reports: config: EOF else # 单服务架构 PRIMARY_PORT=$(echo "$SELECTED_PORTS" | cut -d',' -f1) cat > "$EXPORT_DIR/docker-compose.yml" << EOF services: dms-compliance: build: context: . dockerfile: Dockerfile platforms: - $TARGET_PLATFORM image: $IMAGE_NAME:latest container_name: dms-compliance-tool ports: - "$PRIMARY_PORT:$PRIMARY_PORT" environment: - PYTHONPATH=/app - TZ=Asia/Shanghai - PYTHONUNBUFFERED=1 volumes: - ./uploads:/app/uploads - ./logs:/app/logs - ./reports:/app/reports restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:$PRIMARY_PORT/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - dms-network networks: dms-network: driver: bridge volumes: uploads: logs: reports: EOF fi # 创建环境配置文件 cat > "$EXPORT_DIR/.env" << EOF # DMS合规性测试工具环境配置 - WSL版本 COMPOSE_PROJECT_NAME=dms-compliance-wsl COMPOSE_FILE=docker-compose.yml # 服务配置 SERVICE_PORTS=$SELECTED_PORTS SERVICE_ARCH=$SELECTED_SERVICE_ARCH TARGET_PLATFORM=$TARGET_PLATFORM # 应用配置 PYTHONPATH=/app TZ=Asia/Shanghai LOG_LEVEL=INFO # 构建配置 IMAGE_NAME=$IMAGE_NAME CONTAINER_NAME=dms-compliance-tool EOF # 创建管理脚本 echo "[步骤 5/6] 创建管理脚本..." # 启动脚本 cat > "$EXPORT_DIR/start.sh" << 'EOF' #!/bin/bash set -e echo "=== DMS合规性测试工具启动脚本 ===" # WSL兼容性设置 export MSYS_NO_PATHCONV=1 export COMPOSE_CONVERT_WINDOWS_PATHS=1 # 检查Docker和Docker Compose if ! command -v docker &> /dev/null; then echo "[错误] Docker未安装" exit 1 fi if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then echo "[错误] Docker Compose未安装" exit 1 fi # 选择Docker Compose命令 if docker compose version &> /dev/null; then COMPOSE_CMD="docker compose" else COMPOSE_CMD="docker-compose" fi echo "[信息] 使用 $COMPOSE_CMD" # 创建必要的目录 mkdir -p uploads logs test_reports config # 构建并启动服务 echo "[信息] 构建Docker镜像..." $COMPOSE_CMD build echo "[信息] 启动服务..." $COMPOSE_CMD up -d # 等待服务启动 echo "[信息] 等待服务启动..." sleep 15 # 检查服务状态 if $COMPOSE_CMD ps | grep -q "Up"; then echo "[成功] 服务启动成功!" echo "" echo "访问地址:" if grep -q "dual" .env; then echo " API服务器: http://localhost:5050" echo " 历史查看器: http://localhost:5051" elif grep -q "fastapi" .env; then echo " Web界面: http://localhost:5051" echo " API文档: http://localhost:5051/docs" else echo " Web界面: http://localhost:5050" fi echo "" echo "管理命令:" echo " 查看日志: $COMPOSE_CMD logs -f" echo " 停止服务: ./stop.sh" echo " 查看状态: $COMPOSE_CMD ps" else echo "[错误] 服务启动失败" echo "查看日志: $COMPOSE_CMD logs" exit 1 fi EOF # 停止脚本 cat > "$EXPORT_DIR/stop.sh" << 'EOF' #!/bin/bash set -e echo "=== DMS合规性测试工具停止脚本 ===" # WSL兼容性设置 export MSYS_NO_PATHCONV=1 export COMPOSE_CONVERT_WINDOWS_PATHS=1 # 选择Docker Compose命令 if docker compose version &> /dev/null; then COMPOSE_CMD="docker compose" else COMPOSE_CMD="docker-compose" fi echo "[信息] 停止服务..." $COMPOSE_CMD down echo "[成功] 服务已停止" EOF # 日志查看脚本 cat > "$EXPORT_DIR/logs.sh" << 'EOF' #!/bin/bash # WSL兼容性设置 export MSYS_NO_PATHCONV=1 export COMPOSE_CONVERT_WINDOWS_PATHS=1 # 选择Docker Compose命令 if docker compose version &> /dev/null; then COMPOSE_CMD="docker compose" else COMPOSE_CMD="docker-compose" fi echo "=== DMS合规性测试工具日志 ===" $COMPOSE_CMD logs -f EOF # 设置脚本执行权限 chmod +x "$EXPORT_DIR/start.sh" chmod +x "$EXPORT_DIR/stop.sh" chmod +x "$EXPORT_DIR/logs.sh" echo "[成功] 管理脚本创建完成" echo "" # 构建Docker镜像并导出 echo "[步骤 6/6] 构建Docker镜像..." ORIGINAL_DIR=$(pwd) cd "$EXPORT_DIR" echo "[信息] 构建平台: $TARGET_PLATFORM" docker buildx build \ --platform "$TARGET_PLATFORM" \ --tag "$IMAGE_NAME:latest" \ --load \ . || { echo "[错误] Docker镜像构建失败" cd "$ORIGINAL_DIR" exit 1 } # 导出Docker镜像 echo "[信息] 导出Docker镜像..." docker save "$IMAGE_NAME:latest" | gzip > "docker-image.tar.gz" cd "$ORIGINAL_DIR" # 创建README文件 cat > "$EXPORT_DIR/README.md" << EOF # DMS合规性测试工具 - WSL版本 ## 系统信息 - **架构**: $(get_service_arch_name "$SELECTED_SERVICE_ARCH") - **端口**: $SELECTED_PORTS - **平台**: $TARGET_PLATFORM_NAME - **构建时间**: $(date '+%Y-%m-%d %H:%M:%S') ## 快速开始 ### 1. 解压部署包 \`\`\`bash tar -xzf $ARCHIVE_NAME cd $EXPORT_DIR \`\`\` ### 2. 启动服务 \`\`\`bash ./start.sh \`\`\` ### 3. 访问服务 EOF if [[ "$SELECTED_SERVICE_ARCH" == "dual" ]]; then cat >> "$EXPORT_DIR/README.md" << EOF - API服务器: http://localhost:5050 - 历史查看器: http://localhost:5051 EOF elif [[ "$SELECTED_SERVICE_ARCH" == "fastapi" ]]; then cat >> "$EXPORT_DIR/README.md" << EOF - Web界面: http://localhost:5051 - API文档: http://localhost:5051/docs - 健康检查: http://localhost:5051/health EOF else cat >> "$EXPORT_DIR/README.md" << EOF - Web界面: http://localhost:5050 - 健康检查: http://localhost:5050/health EOF fi cat >> "$EXPORT_DIR/README.md" << EOF ## WSL特殊说明 ### 环境要求 - Windows 10/11 with WSL2 - Docker Desktop for Windows - 确保Docker Desktop已启动并启用WSL集成 ### 管理命令 \`\`\`bash ./start.sh # 启动服务 ./stop.sh # 停止服务 ./logs.sh # 查看日志 \`\`\` ### 故障排除 - 确保Docker Desktop已启动 - 检查端口是否被占用 - 查看日志: ./logs.sh ## 目录结构 \`\`\` $EXPORT_DIR/ ├── docker-compose.yml # Docker Compose配置 ├── Dockerfile # Docker镜像构建文件 ├── .env # 环境变量配置 ├── start.sh # 启动脚本 ├── stop.sh # 停止脚本 ├── logs.sh # 日志查看脚本 ├── docker-image.tar.gz # Docker镜像文件 └── README.md # 说明文档 \`\`\` EOF echo "[成功] 文档创建完成" # 创建压缩包 echo "[信息] 创建压缩包..." tar -czf "$ARCHIVE_NAME" "$EXPORT_DIR" # 清理目录 rm -rf "$EXPORT_DIR" # 显示结果 echo "" echo "=== 构建完成 ===" echo "[成功] WSL版本部署包已创建: $ARCHIVE_NAME" echo "[信息] 架构: $(get_service_arch_name "$SELECTED_SERVICE_ARCH")" echo "[信息] 端口: $SELECTED_PORTS" echo "[信息] 平台: $TARGET_PLATFORM_NAME" echo "[信息] 文件大小: $(du -h "$ARCHIVE_NAME" | cut -f1)" echo "" echo "部署说明:" echo "1. 将 $ARCHIVE_NAME 传输到目标WSL环境" echo "2. 解压: tar -xzf $ARCHIVE_NAME" echo "3. 进入目录: cd $EXPORT_DIR" echo "4. 启动服务: ./start.sh" echo "" if [[ "$SELECTED_SERVICE_ARCH" == "dual" ]]; then echo "访问地址:" echo "- API服务器: http://localhost:5050" echo "- 历史查看器: http://localhost:5051" elif [[ "$SELECTED_SERVICE_ARCH" == "fastapi" ]]; then echo "访问地址:" echo "- Web界面: http://localhost:5051" echo "- API文档: http://localhost:5051/docs" else echo "访问地址: http://localhost:5050" fi echo "" echo "WSL版本构建完成!"