refactor: convert to traditional deployment without Docker
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Spug Docker Compose 自动部署脚本 - 直接粘贴到 Spug 执行
|
# Spug 自动部署脚本 - 直接粘贴到 Spug 执行
|
||||||
# 用途:使用 docker-compose 快速部署医院绩效考核系统
|
# 用途:医院绩效考核系统传统部署(非 Docker)
|
||||||
|
# 适用:服务器无法访问 Docker Hub 的情况
|
||||||
|
|
||||||
set -e
|
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_REPO="${SPUG_GIT_URL:-https://gitea.gentronhealth.com/chenqi/hospital_performance.git}"
|
||||||
GIT_BRANCH="${SPUG_GIT_BRANCH:-main}"
|
GIT_BRANCH="${SPUG_GIT_BRANCH:-main}"
|
||||||
|
|
||||||
# Docker 配置
|
# 服务配置
|
||||||
DOCKER_TAG="${DOCKER_TAG:-latest}"
|
BACKEND_PORT="${BACKEND_PORT:-8000}"
|
||||||
COMPOSE_PROJECT_NAME="${COMPOSE_PROJECT_NAME:-hospital_performance}"
|
FRONTEND_PORT="${FRONTEND_PORT:-80}"
|
||||||
|
|
||||||
# 环境变量
|
# 环境变量
|
||||||
export DATABASE_HOST="${DATABASE_HOST:-192.168.110.252}"
|
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 DATABASE_NAME="${DATABASE_NAME:-hospital_performance}"
|
||||||
export SECRET_KEY="${SECRET_KEY:-change-this-secret-key-in-production}"
|
export SECRET_KEY="${SECRET_KEY:-change-this-secret-key-in-production}"
|
||||||
export DEBUG="${DEBUG:-False}"
|
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"
|
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")
|
commit_msg=$(git log -1 --pretty=format:"%s")
|
||||||
echo "✅ 代码更新完成,当前版本:${commit_hash} - ${commit_msg}"
|
echo "✅ 代码更新完成,当前版本:${commit_hash} - ${commit_msg}"
|
||||||
|
|
||||||
# ================= Step 2: 停止旧容器 =================
|
# ================= Step 2: 停止旧服务 =================
|
||||||
echo "========== 停止旧服务 =========="
|
echo "========== 停止旧服务 =========="
|
||||||
if docker compose ps &>/dev/null; then
|
|
||||||
docker compose down || true
|
# 停止旧的后端进程
|
||||||
echo "✅ 旧服务已停止"
|
OLD_BACKEND_PID=$(ps -ef | grep "uvicorn.*app.main:app" | grep -v grep | awk '{print $2}')
|
||||||
else
|
if [ -n "$OLD_BACKEND_PID" ]; then
|
||||||
echo "未发现运行中的服务"
|
echo "停止旧的后端进程 $OLD_BACKEND_PID"
|
||||||
|
kill -9 $OLD_BACKEND_PID || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ================= Step 3: 构建 Docker 镜像 =================
|
echo "✅ 旧服务已停止"
|
||||||
echo "========== 构建 Docker 镜像 =========="
|
|
||||||
docker compose build --no-cache
|
|
||||||
echo "✅ Docker 镜像构建完成"
|
|
||||||
|
|
||||||
# ================= Step 4: 启动新容器 =================
|
# ================= Step 3: 安装依赖并部署后端 =================
|
||||||
echo "========== 启动新容器 =========="
|
echo "========== 部署后端 =========="
|
||||||
docker compose up -d
|
cd "${PROJECT_DIR}/backend"
|
||||||
echo "✅ 容器启动成功"
|
|
||||||
|
|
||||||
# ================= 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 "========== 执行健康检查 =========="
|
||||||
echo "等待服务启动..."
|
echo "等待服务启动..."
|
||||||
sleep 15
|
sleep 10
|
||||||
|
|
||||||
max_attempts=10
|
max_attempts=10
|
||||||
attempt=1
|
attempt=1
|
||||||
@@ -99,7 +169,7 @@ while [ $attempt -le $max_attempts ]; do
|
|||||||
if [ $attempt -eq $max_attempts ]; then
|
if [ $attempt -eq $max_attempts ]; then
|
||||||
echo "❌ 后端 API 健康检查失败"
|
echo "❌ 后端 API 健康检查失败"
|
||||||
echo "最近日志如下:"
|
echo "最近日志如下:"
|
||||||
docker compose logs backend | tail -n 50
|
tail -n 50 ${PROJECT_DIR}/backend/logs/backend.log || echo "日志文件不存在"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "后端服务未就绪,等待... (${attempt}/${max_attempts})"
|
echo "后端服务未就绪,等待... (${attempt}/${max_attempts})"
|
||||||
@@ -108,17 +178,19 @@ while [ $attempt -le $max_attempts ]; do
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# ================= Step 6: 查看状态 =================
|
# ================= Step 7: 查看状态 =================
|
||||||
echo "========== 服务状态 =========="
|
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: 清理 =================
|
# ================= Step 8: 完成 =================
|
||||||
echo "========== 清理旧镜像 =========="
|
echo "✅ 部署完成"
|
||||||
docker image prune -f
|
|
||||||
echo "✅ 清理完成"
|
|
||||||
|
|
||||||
echo "========================================"
|
echo "========================================"
|
||||||
echo "🎉 Docker Compose 部署成功完成!"
|
echo "🎉 部署成功完成!"
|
||||||
echo "后端地址:http://localhost:${BACKEND_PORT}"
|
echo "后端地址:http://localhost:${BACKEND_PORT}"
|
||||||
echo "前端地址:http://localhost:${FRONTEND_PORT}"
|
echo "前端地址:http://localhost:${FRONTEND_PORT}"
|
||||||
echo "========================================"
|
echo "========================================"
|
||||||
|
|||||||
Reference in New Issue
Block a user