172 lines
4.9 KiB
Bash
Raw Normal View History

2026-05-20 21:39:12 +08:00
#!/bin/bash
2026-05-21 11:20:19 +08:00
# GPU Guard Backend Docker 构建和部署脚本
2026-05-20 21:39:12 +08:00
# 适用于 Node.js + Midway.js + Cool Admin 项目
set -e # 遇到错误立即退出
# 项目配置
2026-05-21 11:20:19 +08:00
group_name='gpu-guard'
app_name='gpu-guard-backend'
2026-05-20 21:39:12 +08:00
app_version='latest'
app_port=8002
# 颜色定义
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"
}
echo ""
2026-05-21 11:20:19 +08:00
log_info "开始 GPU Guard Backend 部署流程..."
2026-05-20 21:39:12 +08:00
echo "========================================"
# 检查 Docker 是否安装
if ! command -v docker &> /dev/null; then
log_error "Docker 未安装,请先安装 Docker"
exit 1
fi
# 检查并删除旧容器和镜像
log_info "检查并清理旧容器和镜像..."
if docker ps -a --format "{{.Names}}" | grep -q "^${app_name}$"; then
log_warning "发现旧容器,正在删除..."
docker rm -f ${app_name}
docker rmi ${group_name}/${app_name}:${app_version} 2>/dev/null || true
log_success "旧容器和镜像清理完成"
else
log_info "未发现旧容器"
fi
# 创建必要目录
log_info "创建必要目录..."
mkdir -p /usr/local/ai-flow/uploads /usr/local/ai-flow/public /usr/local/ai-flow/cache
# 构建Docker镜像
log_info "构建 Docker 镜像..."
docker build -t ${group_name}/${app_name}:${app_version} . || {
log_error "Docker 镜像构建失败"
exit 1
}
log_success "Docker 镜像构建完成"
# 运行新容器
log_info "启动新容器..."
docker run --name ${app_name} \
--restart unless-stopped \
-v /usr/local/ai-flow/uploads:/app/public/uploads \
-v /usr/local/ai-flow/public:/app/public \
-v /usr/local/ai-flow/cache:/app/cache \
-e NODE_ENV=local \
-e TZ=Asia/Shanghai \
-p ${app_port}:${app_port} \
-d ${group_name}/${app_name}:${app_version} \
sh -c 'NODE_ENV=local node ./bootstrap.js' || {
log_error "容器启动失败"
exit 1
}
# 等待容器启动
log_info "等待容器启动..."
sleep 20
# 检查容器状态
log_info "检查容器状态..."
if docker ps --format "{{.Names}}" | grep -q "^${app_name}$"; then
log_success "容器启动成功"
docker ps -f name=${app_name} --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
else
log_error "容器启动失败"
docker logs ${app_name}
exit 1
fi
# 显示容器启动日志
log_info "容器启动日志:"
docker logs --tail=20 ${app_name}
# Node.js 应用健康检查
log_info "进行应用健康检查..."
sleep 10
# 检查进程是否运行
if docker exec ${app_name} ps aux | grep -q "node.*bootstrap"; then
log_success "Node.js 进程运行正常"
else
log_warning "Node.js 进程检查异常,查看详细日志"
fi
# 检查端口监听
log_info "检查端口监听状态..."
if docker exec ${app_name} netstat -tlnp 2>/dev/null | grep -q ":${app_port}"; then
log_success "端口 ${app_port} 监听正常"
else
log_warning "端口 ${app_port} 监听检查异常"
docker exec ${app_name} netstat -tlnp 2>/dev/null || true
fi
# HTTP 健康检查
log_info "进行 HTTP 健康检查..."
sleep 5
if curl -f -s "http://localhost:${app_port}/" >/dev/null 2>&1 || \
curl -f -s "http://localhost:${app_port}/ping" >/dev/null 2>&1 || \
docker exec ${app_name} wget -q --spider "http://localhost:${app_port}/" 2>/dev/null; then
log_success "HTTP 健康检查通过"
else
log_warning "HTTP 健康检查失败,但服务可能仍在启动中"
log_info "请手动检查服务状态: curl http://localhost:${app_port}/"
fi
# 检查依赖服务连接(如果配置了的话)
log_info "检查应用配置..."
if docker exec ${app_name} cat package.json | grep -q "cool-admin"; then
log_success "Cool Admin 框架检测正常"
fi
if docker exec ${app_name} cat package.json | grep -q "typeorm"; then
log_info "检测到 TypeORM请确保数据库连接正常"
fi
if docker exec ${app_name} cat package.json | grep -q "redis"; then
log_info "检测到 Redis 依赖,请确保 Redis 服务可用"
fi
echo ""
2026-05-21 11:20:19 +08:00
log_success "🎉 GPU Guard Backend 部署完成!"
2026-05-20 21:39:12 +08:00
echo "========================================"
echo "容器名称: ${app_name}"
echo "访问地址: http://localhost:${app_port}"
echo "管理后台: http://localhost:${app_port}/admin"
echo "API 文档: http://localhost:${app_port}/api-docs"
echo ""
echo "常用命令:"
echo "查看日志: docker logs -f ${app_name}"
echo "进入容器: docker exec -it ${app_name} sh"
echo "重启服务: docker restart ${app_name}"
echo "停止服务: docker stop ${app_name}"
echo "删除容器: docker rm -f ${app_name}"
echo ""
echo "文件挂载:"
echo "上传目录: /usr/local/ai-flow/uploads"
echo "静态文件: /usr/local/ai-flow/public"
echo "缓存目录: /usr/local/ai-flow/cache"
echo "========================================"