first commit
Some checks failed
Some checks failed
This commit is contained in:
290
deploy.sh
Executable file
290
deploy.sh
Executable file
@@ -0,0 +1,290 @@
|
||||
#!/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 "$@"
|
||||
Reference in New Issue
Block a user