379 lines
10 KiB
Bash
Executable File
379 lines
10 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# QAUP 主部署脚本
|
|
# 用于在客户环境中一键部署 QAUP 系统
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
|
|
# 颜色输出
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
print_message() {
|
|
local color=$1
|
|
local message=$2
|
|
echo -e "${color}${message}${NC}"
|
|
}
|
|
|
|
print_banner() {
|
|
echo ""
|
|
print_message $BLUE "========================================="
|
|
print_message $BLUE " QAUP 系统 Docker 部署脚本"
|
|
print_message $BLUE "========================================="
|
|
echo ""
|
|
}
|
|
|
|
# 检查系统要求
|
|
check_prerequisites() {
|
|
print_message $BLUE "检查系统要求..."
|
|
|
|
local errors=0
|
|
|
|
# 检查 Docker
|
|
if ! command -v docker &> /dev/null; then
|
|
print_message $RED "✗ Docker 未安装"
|
|
errors=$((errors + 1))
|
|
else
|
|
print_message $GREEN "✓ Docker 已安装"
|
|
fi
|
|
|
|
# 检查 Docker Compose
|
|
if ! command -v docker-compose &> /dev/null; then
|
|
print_message $RED "✗ Docker Compose 未安装"
|
|
errors=$((errors + 1))
|
|
else
|
|
print_message $GREEN "✓ Docker Compose 已安装"
|
|
fi
|
|
|
|
# 检查 curl
|
|
if ! command -v curl &> /dev/null; then
|
|
print_message $YELLOW "⚠ curl 未安装,建议安装以支持健康检查"
|
|
else
|
|
print_message $GREEN "✓ curl 已安装"
|
|
fi
|
|
|
|
if [ $errors -gt 0 ]; then
|
|
print_message $RED "系统要求检查失败,请安装缺失的组件"
|
|
exit 1
|
|
fi
|
|
|
|
print_message $GREEN "系统要求检查通过"
|
|
}
|
|
|
|
# 初始化配置
|
|
initialize_config() {
|
|
print_message $BLUE "初始化配置..."
|
|
|
|
# 运行配置管理器
|
|
if [ -x "$PROJECT_ROOT/docker/config-manager.sh" ]; then
|
|
"$PROJECT_ROOT/docker/config-manager.sh" init
|
|
else
|
|
print_message $RED "配置管理脚本不存在或不可执行"
|
|
exit 1
|
|
fi
|
|
|
|
print_message $GREEN "配置初始化完成"
|
|
}
|
|
|
|
# 验证环境
|
|
validate_environment() {
|
|
print_message $BLUE "验证部署环境..."
|
|
|
|
if [ -x "$PROJECT_ROOT/docker/validate-environment.sh" ]; then
|
|
if "$PROJECT_ROOT/docker/validate-environment.sh"; then
|
|
print_message $GREEN "环境验证通过"
|
|
else
|
|
print_message $RED "环境验证失败,请修复问题后重试"
|
|
exit 1
|
|
fi
|
|
else
|
|
print_message $YELLOW "环境验证脚本不存在,跳过验证"
|
|
fi
|
|
}
|
|
|
|
# 构建镜像
|
|
build_images() {
|
|
print_message $BLUE "构建 Docker 镜像..."
|
|
|
|
cd "$PROJECT_ROOT"
|
|
|
|
# 使用 Docker Compose 管理器构建
|
|
if [ -x "$PROJECT_ROOT/docker/docker-compose-manager.sh" ]; then
|
|
"$PROJECT_ROOT/docker/docker-compose-manager.sh" prod build
|
|
else
|
|
# 直接使用 docker-compose 构建
|
|
docker-compose -f docker-compose.yml -f docker-compose.prod.yml build
|
|
fi
|
|
|
|
print_message $GREEN "镜像构建完成"
|
|
}
|
|
|
|
# 启动服务
|
|
start_services() {
|
|
print_message $BLUE "启动服务..."
|
|
|
|
cd "$PROJECT_ROOT"
|
|
|
|
# 使用 Docker Compose 管理器启动
|
|
if [ -x "$PROJECT_ROOT/docker/docker-compose-manager.sh" ]; then
|
|
"$PROJECT_ROOT/docker/docker-compose-manager.sh" prod start
|
|
else
|
|
# 直接使用 docker-compose 启动
|
|
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
|
|
fi
|
|
|
|
print_message $GREEN "服务启动完成"
|
|
}
|
|
|
|
# 等待服务就绪
|
|
wait_for_services() {
|
|
print_message $BLUE "等待服务就绪..."
|
|
|
|
local max_wait=300 # 最大等待5分钟
|
|
local wait_time=0
|
|
local interval=10
|
|
|
|
while [ $wait_time -lt $max_wait ]; do
|
|
if curl -f -s http://localhost/health &>/dev/null; then
|
|
print_message $GREEN "✓ 服务已就绪"
|
|
return 0
|
|
fi
|
|
|
|
print_message $YELLOW "等待服务启动... (${wait_time}s/${max_wait}s)"
|
|
sleep $interval
|
|
wait_time=$((wait_time + interval))
|
|
done
|
|
|
|
print_message $RED "服务启动超时"
|
|
return 1
|
|
}
|
|
|
|
# 运行健康检查
|
|
run_health_checks() {
|
|
print_message $BLUE "运行健康检查..."
|
|
|
|
if [ -x "$PROJECT_ROOT/docker/monitor.sh" ]; then
|
|
"$PROJECT_ROOT/docker/monitor.sh" health
|
|
else
|
|
print_message $YELLOW "监控脚本不存在,跳过健康检查"
|
|
fi
|
|
}
|
|
|
|
# 显示部署信息
|
|
show_deployment_info() {
|
|
print_message $GREEN "========================================="
|
|
print_message $GREEN " QAUP 系统部署完成!"
|
|
print_message $GREEN "========================================="
|
|
echo ""
|
|
|
|
print_message $BLUE "访问信息:"
|
|
echo " 前端地址: http://localhost"
|
|
echo " API 地址: http://localhost/prod-api"
|
|
echo " 健康检查: http://localhost/health"
|
|
echo ""
|
|
|
|
print_message $BLUE "管理命令:"
|
|
echo " 查看状态: docker/docker-compose-manager.sh prod status"
|
|
echo " 查看日志: docker/log-manager.sh view all"
|
|
echo " 系统监控: docker/monitor.sh watch"
|
|
echo " 停止服务: docker/docker-compose-manager.sh prod stop"
|
|
echo ""
|
|
|
|
print_message $BLUE "重要文件:"
|
|
echo " 环境配置: .env"
|
|
echo " 日志目录: ./logs/"
|
|
echo " 数据目录: ./data/"
|
|
echo " 备份目录: ./backup/"
|
|
echo ""
|
|
|
|
print_message $YELLOW "注意事项:"
|
|
echo " 1. 请妥善保管 .env 文件中的密码"
|
|
echo " 2. 定期备份数据库和配置文件"
|
|
echo " 3. 监控系统资源使用情况"
|
|
echo " 4. 查看部署文档了解更多管理命令"
|
|
}
|
|
|
|
# 清理部署
|
|
cleanup_deployment() {
|
|
print_message $YELLOW "清理部署..."
|
|
|
|
read -p "确定要清理部署吗?这将删除所有容器和数据 (y/N): " -n 1 -r
|
|
echo
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
cd "$PROJECT_ROOT"
|
|
|
|
if [ -x "$PROJECT_ROOT/docker/docker-compose-manager.sh" ]; then
|
|
"$PROJECT_ROOT/docker/docker-compose-manager.sh" prod clean
|
|
else
|
|
docker-compose -f docker-compose.yml -f docker-compose.prod.yml down -v
|
|
docker system prune -f
|
|
fi
|
|
|
|
print_message $GREEN "部署清理完成"
|
|
else
|
|
print_message $BLUE "取消清理操作"
|
|
fi
|
|
}
|
|
|
|
# 更新部署
|
|
update_deployment() {
|
|
print_message $BLUE "更新部署..."
|
|
|
|
# 备份当前配置
|
|
if [ -x "$PROJECT_ROOT/docker/config-manager.sh" ]; then
|
|
"$PROJECT_ROOT/docker/config-manager.sh" backup
|
|
fi
|
|
|
|
# 重新构建镜像
|
|
build_images
|
|
|
|
# 重启服务
|
|
cd "$PROJECT_ROOT"
|
|
if [ -x "$PROJECT_ROOT/docker/docker-compose-manager.sh" ]; then
|
|
"$PROJECT_ROOT/docker/docker-compose-manager.sh" prod restart
|
|
else
|
|
docker-compose -f docker-compose.yml -f docker-compose.prod.yml restart
|
|
fi
|
|
|
|
# 等待服务就绪
|
|
wait_for_services
|
|
|
|
print_message $GREEN "部署更新完成"
|
|
}
|
|
|
|
# 显示帮助信息
|
|
show_help() {
|
|
echo "QAUP Docker 部署脚本"
|
|
echo ""
|
|
echo "用法: $0 [命令] [选项]"
|
|
echo ""
|
|
echo "命令:"
|
|
echo " install 完整安装部署"
|
|
echo " start 启动服务"
|
|
echo " stop 停止服务"
|
|
echo " restart 重启服务"
|
|
echo " status 查看状态"
|
|
echo " update 更新部署"
|
|
echo " cleanup 清理部署"
|
|
echo " logs 查看日志"
|
|
echo " monitor 系统监控"
|
|
echo ""
|
|
echo "示例:"
|
|
echo " $0 install # 完整安装"
|
|
echo " $0 start # 启动服务"
|
|
echo " $0 logs app # 查看应用日志"
|
|
echo " $0 monitor # 系统监控"
|
|
}
|
|
|
|
# 完整安装流程
|
|
full_install() {
|
|
print_banner
|
|
|
|
print_message $BLUE "开始 QAUP 系统完整安装..."
|
|
echo ""
|
|
|
|
# 执行安装步骤
|
|
check_prerequisites
|
|
echo ""
|
|
|
|
initialize_config
|
|
echo ""
|
|
|
|
validate_environment
|
|
echo ""
|
|
|
|
build_images
|
|
echo ""
|
|
|
|
start_services
|
|
echo ""
|
|
|
|
if wait_for_services; then
|
|
echo ""
|
|
run_health_checks
|
|
echo ""
|
|
show_deployment_info
|
|
else
|
|
print_message $RED "部署失败,请检查日志"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# 主函数
|
|
main() {
|
|
if [ $# -eq 0 ]; then
|
|
show_help
|
|
exit 0
|
|
fi
|
|
|
|
local command=$1
|
|
shift
|
|
|
|
case $command in
|
|
install)
|
|
full_install
|
|
;;
|
|
start)
|
|
start_services
|
|
wait_for_services
|
|
;;
|
|
stop)
|
|
if [ -x "$PROJECT_ROOT/docker/docker-compose-manager.sh" ]; then
|
|
"$PROJECT_ROOT/docker/docker-compose-manager.sh" prod stop
|
|
else
|
|
docker-compose -f docker-compose.yml -f docker-compose.prod.yml stop
|
|
fi
|
|
;;
|
|
restart)
|
|
if [ -x "$PROJECT_ROOT/docker/docker-compose-manager.sh" ]; then
|
|
"$PROJECT_ROOT/docker/docker-compose-manager.sh" prod restart
|
|
else
|
|
docker-compose -f docker-compose.yml -f docker-compose.prod.yml restart
|
|
fi
|
|
wait_for_services
|
|
;;
|
|
status)
|
|
if [ -x "$PROJECT_ROOT/docker/docker-compose-manager.sh" ]; then
|
|
"$PROJECT_ROOT/docker/docker-compose-manager.sh" prod status
|
|
else
|
|
docker-compose -f docker-compose.yml -f docker-compose.prod.yml ps
|
|
fi
|
|
;;
|
|
update)
|
|
update_deployment
|
|
;;
|
|
cleanup)
|
|
cleanup_deployment
|
|
;;
|
|
logs)
|
|
if [ -x "$PROJECT_ROOT/docker/log-manager.sh" ]; then
|
|
"$PROJECT_ROOT/docker/log-manager.sh" view "$@"
|
|
else
|
|
docker-compose -f docker-compose.yml -f docker-compose.prod.yml logs -f "$@"
|
|
fi
|
|
;;
|
|
monitor)
|
|
if [ -x "$PROJECT_ROOT/docker/monitor.sh" ]; then
|
|
"$PROJECT_ROOT/docker/monitor.sh" watch
|
|
else
|
|
print_message $YELLOW "监控脚本不存在"
|
|
fi
|
|
;;
|
|
help|--help|-h)
|
|
show_help
|
|
;;
|
|
*)
|
|
print_message $RED "未知命令: $command"
|
|
show_help
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
main "$@" |