anxin-ruoyi/docker/scripts/env-manager.sh
2026-01-05 01:46:20 +08:00

379 lines
9.4 KiB
Bash

#!/bin/bash
# 环境管理脚本 - 用于切换不同环境的Docker Compose配置
# Requirements: 5.3, 6.5
set -e
# 脚本目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DOCKER_DIR="$(dirname "$SCRIPT_DIR")"
PROJECT_ROOT="$(dirname "$DOCKER_DIR")"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
log_debug() {
echo -e "${BLUE}[DEBUG]${NC} $1"
}
# 显示帮助信息
show_help() {
cat << EOF
环境管理脚本 - 若依框架Docker部署
用法: $0 [命令] [环境]
命令:
deploy 部署指定环境
stop 停止指定环境
restart 重启指定环境
status 查看指定环境状态
logs 查看指定环境日志
clean 清理指定环境
backup 备份指定环境数据
list 列出所有可用环境
help 显示此帮助信息
环境:
development (dev) 开发环境
staging (stage) 测试环境
production (prod) 生产环境
示例:
$0 deploy development # 部署开发环境
$0 stop prod # 停止生产环境
$0 logs staging # 查看测试环境日志
$0 status dev # 查看开发环境状态
EOF
}
# 验证环境参数
validate_environment() {
local env=$1
case $env in
development|dev)
echo "development"
;;
staging|stage)
echo "staging"
;;
production|prod)
echo "production"
;;
*)
log_error "无效的环境: $env"
log_info "支持的环境: development, staging, production"
exit 1
;;
esac
}
# 获取compose文件路径
get_compose_file() {
local env=$1
echo "${DOCKER_DIR}/docker-compose.${env}.yml"
}
# 获取环境配置文件路径
get_env_file() {
local env=$1
echo "${DOCKER_DIR}/environments/.env.${env}"
}
# 检查文件是否存在
check_files() {
local env=$1
local compose_file=$(get_compose_file $env)
local env_file=$(get_env_file $env)
if [ ! -f "$compose_file" ]; then
log_error "Compose文件不存在: $compose_file"
exit 1
fi
if [ ! -f "$env_file" ]; then
log_error "环境配置文件不存在: $env_file"
exit 1
fi
log_debug "文件检查通过: $compose_file, $env_file"
}
# 部署环境
deploy_environment() {
local env=$1
local compose_file=$(get_compose_file $env)
local env_file=$(get_env_file $env)
log_info "开始部署 $env 环境..."
# 检查文件
check_files $env
# 创建必要的目录
log_info "创建数据目录..."
source "$env_file"
mkdir -p "${MYSQL_DATA_PATH:-./data/$env/mysql}"
mkdir -p "${MYSQL_LOG_PATH:-./data/$env/mysql-logs}"
mkdir -p "${BACKEND_LOG_PATH:-./data/$env/backend-logs}"
mkdir -p "${BACKEND_UPLOAD_PATH:-./data/$env/uploads}"
mkdir -p "${FRONTEND_LOG_PATH:-./data/$env/nginx-logs}"
if [ "$env" != "development" ]; then
mkdir -p "${BACKUP_DATA_PATH:-./data/$env/backups}"
fi
# 部署服务
log_info "启动Docker Compose服务..."
cd "$DOCKER_DIR"
docker-compose -f "$compose_file" --env-file "$env_file" up -d
# 等待服务启动
log_info "等待服务启动..."
sleep 10
# 检查服务状态
check_services $env
log_info "$env 环境部署完成!"
}
# 停止环境
stop_environment() {
local env=$1
local compose_file=$(get_compose_file $env)
local env_file=$(get_env_file $env)
log_info "停止 $env 环境..."
cd "$DOCKER_DIR"
docker-compose -f "$compose_file" --env-file "$env_file" down
log_info "$env 环境已停止"
}
# 重启环境
restart_environment() {
local env=$1
log_info "重启 $env 环境..."
stop_environment $env
sleep 5
deploy_environment $env
}
# 查看环境状态
check_services() {
local env=$1
local compose_file=$(get_compose_file $env)
local env_file=$(get_env_file $env)
log_info "检查 $env 环境服务状态..."
cd "$DOCKER_DIR"
docker-compose -f "$compose_file" --env-file "$env_file" ps
# 健康检查
log_info "执行健康检查..."
local services=("anxin-mysql-${env}" "anxin-backend-${env}" "anxin-frontend-${env}")
for service in "${services[@]}"; do
if docker ps --format "table {{.Names}}" | grep -q "$service"; then
local health=$(docker inspect --format='{{.State.Health.Status}}' "$service" 2>/dev/null || echo "no-healthcheck")
if [ "$health" = "healthy" ] || [ "$health" = "no-healthcheck" ]; then
log_info "$service: 运行正常"
else
log_warn "$service: 健康检查失败 ($health)"
fi
else
log_error "$service: 未运行"
fi
done
}
# 查看日志
view_logs() {
local env=$1
local service=$2
local compose_file=$(get_compose_file $env)
local env_file=$(get_env_file $env)
cd "$DOCKER_DIR"
if [ -n "$service" ]; then
log_info "查看 $env 环境 $service 服务日志..."
docker-compose -f "$compose_file" --env-file "$env_file" logs -f "$service"
else
log_info "查看 $env 环境所有服务日志..."
docker-compose -f "$compose_file" --env-file "$env_file" logs -f
fi
}
# 清理环境
clean_environment() {
local env=$1
local compose_file=$(get_compose_file $env)
local env_file=$(get_env_file $env)
log_warn "即将清理 $env 环境 (包括数据卷)..."
read -p "确认继续? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
log_info "清理 $env 环境..."
cd "$DOCKER_DIR"
docker-compose -f "$compose_file" --env-file "$env_file" down -v --remove-orphans
docker system prune -f
log_info "$env 环境清理完成"
else
log_info "取消清理操作"
fi
}
# 备份环境数据
backup_environment() {
local env=$1
log_info "备份 $env 环境数据..."
case $env in
production)
docker exec anxin-mysql-prod /backup.sh
;;
staging)
docker exec anxin-mysql-staging /backup.sh
;;
development)
log_warn "开发环境通常不需要备份"
;;
esac
log_info "$env 环境数据备份完成"
}
# 列出所有环境
list_environments() {
log_info "可用环境:"
echo " development (dev) - 开发环境"
echo " staging (stage) - 测试环境"
echo " production (prod) - 生产环境"
echo
log_info "当前运行的容器:"
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep anxin || echo " 无运行中的容器"
}
# 主函数
main() {
local command=$1
local environment=$2
case $command in
deploy)
if [ -z "$environment" ]; then
log_error "请指定环境"
show_help
exit 1
fi
env=$(validate_environment "$environment")
deploy_environment "$env"
;;
stop)
if [ -z "$environment" ]; then
log_error "请指定环境"
show_help
exit 1
fi
env=$(validate_environment "$environment")
stop_environment "$env"
;;
restart)
if [ -z "$environment" ]; then
log_error "请指定环境"
show_help
exit 1
fi
env=$(validate_environment "$environment")
restart_environment "$env"
;;
status)
if [ -z "$environment" ]; then
log_error "请指定环境"
show_help
exit 1
fi
env=$(validate_environment "$environment")
check_services "$env"
;;
logs)
if [ -z "$environment" ]; then
log_error "请指定环境"
show_help
exit 1
fi
env=$(validate_environment "$environment")
view_logs "$env" "$3"
;;
clean)
if [ -z "$environment" ]; then
log_error "请指定环境"
show_help
exit 1
fi
env=$(validate_environment "$environment")
clean_environment "$env"
;;
backup)
if [ -z "$environment" ]; then
log_error "请指定环境"
show_help
exit 1
fi
env=$(validate_environment "$environment")
backup_environment "$env"
;;
list)
list_environments
;;
help|--help|-h)
show_help
;;
*)
log_error "未知命令: $command"
show_help
exit 1
;;
esac
}
# 检查Docker是否安装
if ! command -v docker &> /dev/null; then
log_error "Docker未安装或不在PATH中"
exit 1
fi
if ! command -v docker-compose &> /dev/null; then
log_error "Docker Compose未安装或不在PATH中"
exit 1
fi
# 执行主函数
main "$@"