Files
i-tools/deploy.sh
yfan 3d175d75af
Some checks failed
Build and Push Docker Image / build (push) Has been cancelled
Sync to CNB / sync (push) Has been cancelled
Delete old workflow runs / del_runs (push) Has been cancelled
Upstream Sync / Sync latest commits from upstream repo (push) Has been cancelled
first commit
2026-01-30 16:57:44 +08:00

291 lines
7.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "$@"