@echo off REM 环境管理脚本 - Windows版本 REM 用于切换不同环境的Docker Compose配置 REM Requirements: 5.3, 6.5 setlocal enabledelayedexpansion REM 设置脚本目录 set "SCRIPT_DIR=%~dp0" set "DOCKER_DIR=%SCRIPT_DIR%.." set "PROJECT_ROOT=%DOCKER_DIR%\.." REM 颜色定义 (Windows不支持颜色,使用文本标识) set "INFO=[INFO]" set "WARN=[WARN]" set "ERROR=[ERROR]" set "DEBUG=[DEBUG]" REM 显示帮助信息 :show_help echo 环境管理脚本 - 若依框架Docker部署 (Windows版本) echo. echo 用法: %~nx0 [命令] [环境] echo. echo 命令: echo deploy 部署指定环境 echo stop 停止指定环境 echo restart 重启指定环境 echo status 查看指定环境状态 echo logs 查看指定环境日志 echo clean 清理指定环境 echo backup 备份指定环境数据 echo list 列出所有可用环境 echo help 显示此帮助信息 echo. echo 环境: echo development (dev) 开发环境 echo staging (stage) 测试环境 echo production (prod) 生产环境 echo. echo 示例: echo %~nx0 deploy development # 部署开发环境 echo %~nx0 stop prod # 停止生产环境 echo %~nx0 logs staging # 查看测试环境日志 echo %~nx0 status dev # 查看开发环境状态 echo. goto :eof REM 验证环境参数 :validate_environment set "input_env=%1" if "%input_env%"=="development" set "validated_env=development" & goto :eof if "%input_env%"=="dev" set "validated_env=development" & goto :eof if "%input_env%"=="staging" set "validated_env=staging" & goto :eof if "%input_env%"=="stage" set "validated_env=staging" & goto :eof if "%input_env%"=="production" set "validated_env=production" & goto :eof if "%input_env%"=="prod" set "validated_env=production" & goto :eof echo %ERROR% 无效的环境: %input_env% echo %INFO% 支持的环境: development, staging, production exit /b 1 REM 获取compose文件路径 :get_compose_file set "compose_file=%DOCKER_DIR%\docker-compose.%1.yml" goto :eof REM 获取环境配置文件路径 :get_env_file set "env_file=%DOCKER_DIR%\environments\.env.%1" goto :eof REM 检查文件是否存在 :check_files call :get_compose_file %1 call :get_env_file %1 if not exist "%compose_file%" ( echo %ERROR% Compose文件不存在: %compose_file% exit /b 1 ) if not exist "%env_file%" ( echo %ERROR% 环境配置文件不存在: %env_file% exit /b 1 ) echo %DEBUG% 文件检查通过: %compose_file%, %env_file% goto :eof REM 创建数据目录 :create_directories set "env=%1" echo %INFO% 创建数据目录... REM 创建基础目录结构 if not exist "%DOCKER_DIR%\data\%env%" mkdir "%DOCKER_DIR%\data\%env%" if not exist "%DOCKER_DIR%\data\%env%\mysql" mkdir "%DOCKER_DIR%\data\%env%\mysql" if not exist "%DOCKER_DIR%\data\%env%\mysql-logs" mkdir "%DOCKER_DIR%\data\%env%\mysql-logs" if not exist "%DOCKER_DIR%\data\%env%\backend-logs" mkdir "%DOCKER_DIR%\data\%env%\backend-logs" if not exist "%DOCKER_DIR%\data\%env%\uploads" mkdir "%DOCKER_DIR%\data\%env%\uploads" if not exist "%DOCKER_DIR%\data\%env%\nginx-logs" mkdir "%DOCKER_DIR%\data\%env%\nginx-logs" if not "%env%"=="development" ( if not exist "%DOCKER_DIR%\data\%env%\backups" mkdir "%DOCKER_DIR%\data\%env%\backups" ) goto :eof REM 部署环境 :deploy_environment set "env=%1" echo %INFO% 开始部署 %env% 环境... call :check_files %env% if errorlevel 1 exit /b 1 call :create_directories %env% echo %INFO% 启动Docker Compose服务... cd /d "%DOCKER_DIR%" docker-compose -f "%compose_file%" --env-file "%env_file%" up -d if errorlevel 1 ( echo %ERROR% Docker Compose启动失败 exit /b 1 ) echo %INFO% 等待服务启动... timeout /t 10 /nobreak >nul call :check_services %env% echo %INFO% %env% 环境部署完成! goto :eof REM 停止环境 :stop_environment set "env=%1" echo %INFO% 停止 %env% 环境... call :get_compose_file %env% call :get_env_file %env% cd /d "%DOCKER_DIR%" docker-compose -f "%compose_file%" --env-file "%env_file%" down echo %INFO% %env% 环境已停止 goto :eof REM 重启环境 :restart_environment set "env=%1" echo %INFO% 重启 %env% 环境... call :stop_environment %env% timeout /t 5 /nobreak >nul call :deploy_environment %env% goto :eof REM 查看环境状态 :check_services set "env=%1" echo %INFO% 检查 %env% 环境服务状态... call :get_compose_file %env% call :get_env_file %env% cd /d "%DOCKER_DIR%" docker-compose -f "%compose_file%" --env-file "%env_file%" ps echo %INFO% 执行健康检查... docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | findstr anxin-%env% goto :eof REM 查看日志 :view_logs set "env=%1" set "service=%2" call :get_compose_file %env% call :get_env_file %env% cd /d "%DOCKER_DIR%" if "%service%"=="" ( echo %INFO% 查看 %env% 环境所有服务日志... docker-compose -f "%compose_file%" --env-file "%env_file%" logs -f ) else ( echo %INFO% 查看 %env% 环境 %service% 服务日志... docker-compose -f "%compose_file%" --env-file "%env_file%" logs -f %service% ) goto :eof REM 清理环境 :clean_environment set "env=%1" echo %WARN% 即将清理 %env% 环境 (包括数据卷)... set /p "confirm=确认继续? (y/N): " if /i "%confirm%"=="y" ( echo %INFO% 清理 %env% 环境... call :get_compose_file %env% call :get_env_file %env% cd /d "%DOCKER_DIR%" docker-compose -f "%compose_file%" --env-file "%env_file%" down -v --remove-orphans docker system prune -f echo %INFO% %env% 环境清理完成 ) else ( echo %INFO% 取消清理操作 ) goto :eof REM 备份环境数据 :backup_environment set "env=%1" echo %INFO% 备份 %env% 环境数据... if "%env%"=="production" ( docker exec anxin-mysql-prod /backup.sh ) else if "%env%"=="staging" ( docker exec anxin-mysql-staging /backup.sh ) else if "%env%"=="development" ( echo %WARN% 开发环境通常不需要备份 ) echo %INFO% %env% 环境数据备份完成 goto :eof REM 列出所有环境 :list_environments echo %INFO% 可用环境: echo development (dev) - 开发环境 echo staging (stage) - 测试环境 echo production (prod) - 生产环境 echo. echo %INFO% 当前运行的容器: docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | findstr anxin if errorlevel 1 echo 无运行中的容器 goto :eof REM 检查Docker是否安装 :check_docker docker --version >nul 2>&1 if errorlevel 1 ( echo %ERROR% Docker未安装或不在PATH中 exit /b 1 ) docker-compose --version >nul 2>&1 if errorlevel 1 ( echo %ERROR% Docker Compose未安装或不在PATH中 exit /b 1 ) goto :eof REM 主函数 :main call :check_docker if errorlevel 1 exit /b 1 set "command=%1" set "environment=%2" if "%command%"=="deploy" ( if "%environment%"=="" ( echo %ERROR% 请指定环境 call :show_help exit /b 1 ) call :validate_environment %environment% if errorlevel 1 exit /b 1 call :deploy_environment !validated_env! ) else if "%command%"=="stop" ( if "%environment%"=="" ( echo %ERROR% 请指定环境 call :show_help exit /b 1 ) call :validate_environment %environment% if errorlevel 1 exit /b 1 call :stop_environment !validated_env! ) else if "%command%"=="restart" ( if "%environment%"=="" ( echo %ERROR% 请指定环境 call :show_help exit /b 1 ) call :validate_environment %environment% if errorlevel 1 exit /b 1 call :restart_environment !validated_env! ) else if "%command%"=="status" ( if "%environment%"=="" ( echo %ERROR% 请指定环境 call :show_help exit /b 1 ) call :validate_environment %environment% if errorlevel 1 exit /b 1 call :check_services !validated_env! ) else if "%command%"=="logs" ( if "%environment%"=="" ( echo %ERROR% 请指定环境 call :show_help exit /b 1 ) call :validate_environment %environment% if errorlevel 1 exit /b 1 call :view_logs !validated_env! %3 ) else if "%command%"=="clean" ( if "%environment%"=="" ( echo %ERROR% 请指定环境 call :show_help exit /b 1 ) call :validate_environment %environment% if errorlevel 1 exit /b 1 call :clean_environment !validated_env! ) else if "%command%"=="backup" ( if "%environment%"=="" ( echo %ERROR% 请指定环境 call :show_help exit /b 1 ) call :validate_environment %environment% if errorlevel 1 exit /b 1 call :backup_environment !validated_env! ) else if "%command%"=="list" ( call :list_environments ) else if "%command%"=="help" ( call :show_help ) else if "%command%"=="--help" ( call :show_help ) else if "%command%"=="-h" ( call :show_help ) else ( echo %ERROR% 未知命令: %command% call :show_help exit /b 1 ) goto :eof REM 执行主函数 call :main %*