refactor: convert to traditional deployment without Docker

This commit is contained in:
2026-02-28 16:52:41 +08:00
parent 6a8f3c9369
commit 94cd83ea2c

View File

@@ -1,6 +1,7 @@
#!/bin/bash
# Spug Docker Compose 自动部署脚本 - 直接粘贴到 Spug 执行
# 用途:使用 docker-compose 快速部署医院绩效考核系统
# Spug 自动部署脚本 - 直接粘贴到 Spug 执行
# 用途:医院绩效考核系统传统部署(非 Docker
# 适用:服务器无法访问 Docker Hub 的情况
set -e
@@ -9,9 +10,9 @@ PROJECT_DIR="${SPUG_DEPLOY_DIR:-/data/spug/service/hospital_performance}"
GIT_REPO="${SPUG_GIT_URL:-https://gitea.gentronhealth.com/chenqi/hospital_performance.git}"
GIT_BRANCH="${SPUG_GIT_BRANCH:-main}"
# Docker 配置
DOCKER_TAG="${DOCKER_TAG:-latest}"
COMPOSE_PROJECT_NAME="${COMPOSE_PROJECT_NAME:-hospital_performance}"
# 服务配置
BACKEND_PORT="${BACKEND_PORT:-8000}"
FRONTEND_PORT="${FRONTEND_PORT:-80}"
# 环境变量
export DATABASE_HOST="${DATABASE_HOST:-192.168.110.252}"
@@ -21,9 +22,6 @@ export DATABASE_PASSWORD="${DATABASE_PASSWORD:-Jchl1528}"
export DATABASE_NAME="${DATABASE_NAME:-hospital_performance}"
export SECRET_KEY="${SECRET_KEY:-change-this-secret-key-in-production}"
export DEBUG="${DEBUG:-False}"
export BACKEND_PORT="${BACKEND_PORT:-8000}"
export FRONTEND_PORT="${FRONTEND_PORT:-80}"
export DOCKER_TAG="${DOCKER_TAG}"
# 日志配置
LOG_FILE="/tmp/spug-deploy-$(date +%Y%m%d_%H%M%S).log"
@@ -64,29 +62,101 @@ commit_hash=$(git rev-parse --short HEAD)
commit_msg=$(git log -1 --pretty=format:"%s")
echo "✅ 代码更新完成,当前版本:${commit_hash} - ${commit_msg}"
# ================= Step 2: 停止旧容器 =================
# ================= Step 2: 停止旧服务 =================
echo "========== 停止旧服务 =========="
if docker compose ps &>/dev/null; then
docker compose down || true
echo "✅ 旧服务已停止"
else
echo "未发现运行中的服务"
# 停止旧的后端进程
OLD_BACKEND_PID=$(ps -ef | grep "uvicorn.*app.main:app" | grep -v grep | awk '{print $2}')
if [ -n "$OLD_BACKEND_PID" ]; then
echo "停止旧的后端进程 $OLD_BACKEND_PID"
kill -9 $OLD_BACKEND_PID || true
fi
# ================= Step 3: 构建 Docker 镜像 =================
echo "========== 构建 Docker 镜像 =========="
docker compose build --no-cache
echo "✅ Docker 镜像构建完成"
echo "✅ 旧服务已停止"
# ================= Step 4: 启动新容器 =================
echo "========== 启动新容器 =========="
docker compose up -d
echo "✅ 容器启动成功"
# ================= Step 3: 安装依赖并部署后端 =================
echo "========== 部署后端 =========="
cd "${PROJECT_DIR}/backend"
# ================= Step 5: 等待并健康检查 =================
# 创建虚拟环境
if [ ! -d "venv" ]; then
echo "创建 Python 虚拟环境..."
python3 -m venv venv
fi
# 激活虚拟环境
source venv/bin/activate
# 安装依赖
echo "安装 Python 依赖..."
pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 数据库迁移
echo "执行数据库迁移..."
alembic upgrade head || true
# 启动后端
echo "启动后端服务..."
mkdir -p logs
nohup venv/bin/uvicorn app.main:app --host 0.0.0.0 --port ${BACKEND_PORT} --workers 4 > logs/backend.log 2>&1 &
echo "✅ 后端服务已启动,端口 ${BACKEND_PORT}"
# ================= Step 4: 构建前端 =================
echo "========== 构建前端 =========="
cd "${PROJECT_DIR}/frontend"
# 检查 node_modules
if [ ! -d "node_modules" ]; then
echo "安装前端依赖..."
npm install --registry=https://registry.npmmirror.com
else
echo "更新前端依赖..."
npm update --registry=https://registry.npmmirror.com
fi
# 构建前端
echo "构建前端项目..."
npm run build
echo "✅ 前端构建完成"
# ================= Step 5: 部署前端到 Nginx =================
echo "========== 部署前端 =========="
NGINX_HTML="/var/www/hospital_performance_html"
mkdir -p ${NGINX_HTML}
rm -rf ${NGINX_HTML}/*
cp -r ${PROJECT_DIR}/frontend/dist/* ${NGINX_HTML}/
# 创建 Nginx 配置
cat > /etc/nginx/conf.d/hospital_performance.conf <<EOF
server {
listen ${FRONTEND_PORT};
server_name localhost;
root ${NGINX_HTML};
index index.html;
location /api/ {
proxy_pass http://127.0.0.1:${BACKEND_PORT};
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
}
location / {
try_files \$uri \$uri/ /index.html;
}
}
EOF
# 重启 Nginx
echo "重启 Nginx..."
systemctl restart nginx || nginx -s reload || true
echo "✅ 前端部署完成"
# ================= Step 6: 等待并健康检查 =================
echo "========== 执行健康检查 =========="
echo "等待服务启动..."
sleep 15
sleep 10
max_attempts=10
attempt=1
@@ -99,7 +169,7 @@ while [ $attempt -le $max_attempts ]; do
if [ $attempt -eq $max_attempts ]; then
echo "❌ 后端 API 健康检查失败"
echo "最近日志如下:"
docker compose logs backend | tail -n 50
tail -n 50 ${PROJECT_DIR}/backend/logs/backend.log || echo "日志文件不存在"
exit 1
fi
echo "后端服务未就绪,等待... (${attempt}/${max_attempts})"
@@ -108,17 +178,19 @@ while [ $attempt -le $max_attempts ]; do
fi
done
# ================= Step 6: 查看状态 =================
# ================= Step 7: 查看状态 =================
echo "========== 服务状态 =========="
docker compose ps
echo "后端进程:"
ps -ef | grep "uvicorn.*app.main:app" | grep -v grep
echo ""
echo "Nginx 状态:"
systemctl status nginx --no-pager || true
# ================= Step 7: 清理 =================
echo "========== 清理旧镜像 =========="
docker image prune -f
echo "✅ 清理完成"
# ================= Step 8: 完成 =================
echo "✅ 部署完成"
echo "========================================"
echo "🎉 Docker Compose 部署成功完成!"
echo "🎉 部署成功完成!"
echo "后端地址http://localhost:${BACKEND_PORT}"
echo "前端地址http://localhost:${FRONTEND_PORT}"
echo "========================================"