#!/bin/bash # 信奥工具箱 - 服务器部署脚本 set -e # 配置变量 REGISTRY="registry.cn-hangzhou.aliyuncs.com" NAMESPACE="nick-x86" IMAGE_NAME="i-tools" CONTAINER_NAME="i-tools" PORT=3000 # 颜色输出 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 "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 显示横幅 show_banner() { echo -e "${BLUE}" echo "=================================================" echo " 信奥工具箱 - 服务器部署脚本" echo "=================================================" echo -e "${NC}" } # 检查Docker是否安装 check_docker() { if ! command -v docker &> /dev/null; then log_error "Docker 未安装或不在 PATH 中" exit 1 fi if ! docker info &> /dev/null; then log_error "Docker 守护进程未运行" exit 1 fi log_success "Docker 环境检查通过" } # 检查是否已登录阿里云镜像仓库 check_registry_login() { log_info "检查阿里云镜像仓库登录状态..." if ! docker system info | grep -q "Registry:"; then log_warning "建议先登录阿里云镜像仓库" echo "请运行以下命令登录:" echo "docker login --username=<用户名> $REGISTRY" read -p "是否已经登录?(y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_error "请先登录阿里云镜像仓库后再运行此脚本" exit 1 fi fi log_success "镜像仓库登录状态检查通过" } # 拉取最新镜像 pull_image() { local image_name="$REGISTRY/$NAMESPACE/$IMAGE_NAME:latest" log_info "拉取最新镜像: $image_name" if docker pull "$image_name"; then log_success "镜像拉取成功" else log_error "镜像拉取失败" exit 1 fi } # 停止并删除旧容器 stop_old_container() { if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then log_info "停止并删除旧容器: $CONTAINER_NAME" docker stop "$CONTAINER_NAME" 2>/dev/null || true docker rm "$CONTAINER_NAME" 2>/dev/null || true log_success "旧容器已清理" else log_info "未找到旧容器,跳过清理步骤" fi } # 启动新容器 start_container() { local image_name="$REGISTRY/$NAMESPACE/$IMAGE_NAME:latest" local run_opts=( -d --name "$CONTAINER_NAME" --restart unless-stopped -p "$PORT:3000" -e NODE_ENV=production -e PORT=3000 ) # 若存在 .env 则传入容器(用于测试点生成-大模型等配置) if [ -f .env ]; then log_info "使用 .env 注入环境变量(含 ENABLE_AI/DASHSCOPE_API_KEY 等)" run_opts+=(--env-file .env) else log_warning "未找到 .env,测试点生成将使用本地智能算法(不调用大模型)" fi log_info "启动新容器: $CONTAINER_NAME" log_info "端口映射: $PORT:3000" if docker run "${run_opts[@]}" "$image_name"; then log_success "容器启动成功" else log_error "容器启动失败" exit 1 fi } # 使用 Docker Compose 部署 deploy_with_compose() { log_info "使用 Docker Compose 部署..." if [ ! -f "docker-compose.yml" ]; then log_error "未找到 docker-compose.yml 文件" exit 1 fi # 拉取最新镜像 docker-compose pull # 停止并删除旧容器,启动新容器 docker-compose up -d log_success "Docker Compose 部署完成" } # 显示部署信息 show_deployment_info() { local image_name="$REGISTRY/$NAMESPACE/$IMAGE_NAME:latest" echo -e "${GREEN}" echo "=================================================" echo " 部署成功!" echo "=================================================" echo -e "${NC}" echo "容器信息:" echo " 容器名称: $CONTAINER_NAME" echo " 镜像地址: $image_name" echo " 访问地址: http://localhost:$PORT" echo "" echo "常用命令:" echo " 查看日志: docker logs -f $CONTAINER_NAME" echo " 停止服务: docker stop $CONTAINER_NAME" echo " 启动服务: docker start $CONTAINER_NAME" echo " 重启服务: docker restart $CONTAINER_NAME" echo " 查看状态: docker ps | grep $CONTAINER_NAME" echo "" if [ ! -f .env ]; then echo "提示: 在部署目录创建 .env 并配置 ENABLE_AI、DASHSCOPE_API_KEY 可启用测试点生成-大模型。" echo " 参考项目根目录 .env.example" echo "" fi } # 解析命令行参数 parse_args() { USE_COMPOSE=false PORT_ARG="" while [[ $# -gt 0 ]]; do case $1 in --compose) USE_COMPOSE=true shift ;; -p|--port) if [ -z "$2" ]; then log_error "-p/--port 参数需要指定端口号" exit 1 fi PORT_ARG="$2" shift 2 ;; -h|--help) show_help exit 0 ;; *) log_error "未知参数: $1" show_help exit 1 ;; esac done if [ ! -z "$PORT_ARG" ]; then PORT="$PORT_ARG" fi } # 帮助信息 show_help() { echo "信奥工具箱 - 服务器部署脚本" echo "" echo "用法:" echo " $0 [选项]" echo "" echo "选项:" echo " --compose 使用 Docker Compose 部署(推荐)" echo " -p, --port <端口> 指定主机端口(默认: 3000)" echo " -h, --help 显示此帮助信息" echo "" echo "示例:" echo " $0 # 使用默认端口 3000 部署" echo " $0 -p 8080 # 使用端口 8080 部署" echo " $0 --compose # 使用 Docker Compose 部署" echo "" echo "环境要求:" echo " - Docker已安装并运行" echo " - 已登录阿里云镜像仓库" echo "" echo "测试点生成-大模型(可选):" echo " 在部署目录创建 .env,参考 .env.example 配置:" echo " ENABLE_AI=true" echo " DASHSCOPE_API_KEY=sk-xxx" echo " QWEN_MODEL=qwen-max" echo " 未配置时测试点生成使用本地智能算法。" echo "" echo "登录命令:" echo " docker login --username=<用户名> $REGISTRY" } # 主函数 main() { show_banner # 解析命令行参数 parse_args "$@" # 环境检查 check_docker check_registry_login # 部署 if [ "$USE_COMPOSE" = true ]; then deploy_with_compose else pull_image stop_old_container start_container fi # 等待容器启动 log_info "等待容器启动..." sleep 3 # 检查容器状态 if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then log_success "容器运行正常" else log_warning "容器可能未正常启动,请检查日志: docker logs $CONTAINER_NAME" fi # 显示结果 show_deployment_info log_success "部署完成!" } # 脚本入口 main "$@"