291 lines
7.4 KiB
Bash
Executable File
291 lines
7.4 KiB
Bash
Executable File
#!/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 "$@"
|