This commit is contained in:
67
.gitea/workflows/deploy.yml
Normal file
67
.gitea/workflows/deploy.yml
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
name: Build and Deploy
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
workflow_dispatch: # 支持手动触发
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Deploy to Server
|
||||||
|
uses: appleboy/ssh-action@v1
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.SERVER_HOST }}
|
||||||
|
port: ${{ secrets.SERVER_PORT || 22 }}
|
||||||
|
username: ${{ secrets.SERVER_USER }}
|
||||||
|
key: ${{ secrets.SSH_KEY }}
|
||||||
|
script: |
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo "开始部署: $(date '+%Y-%m-%d %H:%M:%S')"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
# 项目路径配置
|
||||||
|
PROJECT_DIR=/www/wwwroot/sionrui
|
||||||
|
BACKEND_DIR=/www/wwwroot/yudao-server
|
||||||
|
FRONTEND_DIR=/www/wwwroot/muyetools.cn
|
||||||
|
|
||||||
|
# 1. 拉取最新代码
|
||||||
|
echo "[1/4] 拉取最新代码..."
|
||||||
|
cd $PROJECT_DIR
|
||||||
|
git fetch origin
|
||||||
|
git reset --hard origin/main
|
||||||
|
git pull origin main
|
||||||
|
|
||||||
|
# 2. 构建后端
|
||||||
|
echo "[2/4] 构建后端..."
|
||||||
|
cd $PROJECT_DIR
|
||||||
|
mvn clean package -DskipTests -q
|
||||||
|
|
||||||
|
# 备份并部署后端
|
||||||
|
if [ -f "$BACKEND_DIR/yudao-server.jar" ]; then
|
||||||
|
cp $BACKEND_DIR/yudao-server.jar $BACKEND_DIR/backup/yudao-server-$(date +%Y%m%d%H%M).jar
|
||||||
|
fi
|
||||||
|
cp $PROJECT_DIR/yudao-server/target/yudao-server.jar $BACKEND_DIR/
|
||||||
|
|
||||||
|
# 3. 构建前端
|
||||||
|
echo "[3/4] 构建前端..."
|
||||||
|
cd $PROJECT_DIR/frontend
|
||||||
|
pnpm install --frozen-lockfile
|
||||||
|
pnpm build
|
||||||
|
|
||||||
|
# 部署前端
|
||||||
|
rm -rf $FRONTEND_DIR/*
|
||||||
|
cp -r $PROJECT_DIR/frontend/app/web-gold/dist/* $FRONTEND_DIR/
|
||||||
|
|
||||||
|
# 4. 重启后端服务
|
||||||
|
echo "[4/4] 重启后端服务..."
|
||||||
|
cd $BACKEND_DIR
|
||||||
|
bash deploy.sh
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo "部署完成: $(date '+%Y-%m-%d %H:%M:%S')"
|
||||||
|
echo "=========================================="
|
||||||
201
script/deploy/deploy-all.sh
Normal file
201
script/deploy/deploy-all.sh
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# ============================================
|
||||||
|
# 全量部署脚本 - 前后端一起部署
|
||||||
|
# 用法: bash deploy-all.sh [backend-only|frontend-only]
|
||||||
|
# ============================================
|
||||||
|
set -e
|
||||||
|
|
||||||
|
DATE=$(date +%Y%m%d%H%M)
|
||||||
|
|
||||||
|
# ==================== 配置区 ====================
|
||||||
|
# 项目路径
|
||||||
|
PROJECT_DIR=/www/wwwroot/sionrui
|
||||||
|
|
||||||
|
# 后端配置
|
||||||
|
BACKEND_DIR=/www/wwwroot/yudao-server
|
||||||
|
BACKEND_JAR_NAME=yudao-server.jar
|
||||||
|
BACKEND_PORT=9900
|
||||||
|
|
||||||
|
# 前端配置
|
||||||
|
FRONTEND_SRC=$PROJECT_DIR/frontend/app/web-gold/dist
|
||||||
|
FRONTEND_DIR=/www/wwwroot/muyetools.cn
|
||||||
|
|
||||||
|
# JVM 参数
|
||||||
|
JAVA_OPTS="-Xms1g -Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$BACKEND_DIR/heapError"
|
||||||
|
|
||||||
|
# 环境
|
||||||
|
PROFILES_ACTIVE=prod
|
||||||
|
|
||||||
|
# 健康检查 URL
|
||||||
|
HEALTH_CHECK_URL=http://127.0.0.1:$BACKEND_PORT/actuator/health/
|
||||||
|
|
||||||
|
# ==================== 函数定义 ====================
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 后端备份
|
||||||
|
backup_backend() {
|
||||||
|
if [ -f "$BACKEND_DIR/$BACKEND_JAR_NAME" ]; then
|
||||||
|
log "[后端] 备份旧 JAR 包..."
|
||||||
|
mkdir -p $BACKEND_DIR/backup
|
||||||
|
cp $BACKEND_DIR/$BACKEND_JAR_NAME $BACKEND_DIR/backup/yudao-server-$DATE.jar
|
||||||
|
# 只保留最近 5 个备份
|
||||||
|
cd $BACKEND_DIR/backup && ls -t | tail -n +6 | xargs -r rm -f
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 停止后端服务
|
||||||
|
stop_backend() {
|
||||||
|
log "[后端] 停止服务..."
|
||||||
|
PID=$(ps -ef | grep $BACKEND_DIR/$BACKEND_JAR_NAME | grep -v "grep" | awk '{print $2}')
|
||||||
|
|
||||||
|
if [ -n "$PID" ]; then
|
||||||
|
log "[后端] 发现进程 PID: $PID,正在停止..."
|
||||||
|
kill -15 $PID
|
||||||
|
|
||||||
|
# 等待最多 60 秒
|
||||||
|
for i in {1..60}; do
|
||||||
|
sleep 1
|
||||||
|
PID=$(ps -ef | grep $BACKEND_DIR/$BACKEND_JAR_NAME | grep -v "grep" | awk '{print $2}')
|
||||||
|
if [ -z "$PID" ]; then
|
||||||
|
log "[后端] 服务已停止"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
echo -n "."
|
||||||
|
done
|
||||||
|
|
||||||
|
# 强制杀死
|
||||||
|
log "[后端] 强制停止..."
|
||||||
|
kill -9 $PID 2>/dev/null || true
|
||||||
|
else
|
||||||
|
log "[后端] 服务未运行"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 启动后端服务
|
||||||
|
start_backend() {
|
||||||
|
log "[后端] 启动服务..."
|
||||||
|
log "[后端] JAVA_OPTS: $JAVA_OPTS"
|
||||||
|
log "[后端] PROFILES: $PROFILES_ACTIVE"
|
||||||
|
|
||||||
|
cd $BACKEND_DIR
|
||||||
|
mkdir -p $BACKEND_DIR/logs
|
||||||
|
mkdir -p $BACKEND_DIR/heapError
|
||||||
|
nohup java -server $JAVA_OPTS -jar $BACKEND_JAR_NAME --spring.profiles.active=$PROFILES_ACTIVE > $BACKEND_DIR/logs/console.log 2>&1 &
|
||||||
|
|
||||||
|
log "[后端] 服务启动中..."
|
||||||
|
}
|
||||||
|
|
||||||
|
# 后端健康检查
|
||||||
|
health_check() {
|
||||||
|
if [ -n "$HEALTH_CHECK_URL" ]; then
|
||||||
|
log "[后端] 健康检查开始..."
|
||||||
|
|
||||||
|
for i in {1..120}; do
|
||||||
|
sleep 1
|
||||||
|
result=$(curl -s -o /dev/null -w "%{http_code}" $HEALTH_CHECK_URL 2>/dev/null || echo "000")
|
||||||
|
|
||||||
|
if [ "$result" == "200" ]; then
|
||||||
|
log "[后端] 健康检查通过!"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
echo -n "."
|
||||||
|
done
|
||||||
|
|
||||||
|
log "[后端] 健康检查失败,查看日志:"
|
||||||
|
tail -n 20 $BACKEND_DIR/logs/console.log
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 部署后端
|
||||||
|
deploy_backend() {
|
||||||
|
log "========== 开始部署后端 =========="
|
||||||
|
|
||||||
|
# 拉取代码
|
||||||
|
log "[后端] 拉取最新代码..."
|
||||||
|
cd $PROJECT_DIR
|
||||||
|
git fetch origin
|
||||||
|
git reset --hard origin/main
|
||||||
|
|
||||||
|
# 构建(只构建 yudao-server 模块)
|
||||||
|
log "[后端] 构建 JAR 包..."
|
||||||
|
mvn clean package -DskipTests -pl yudao-server -am -q
|
||||||
|
|
||||||
|
# 备份
|
||||||
|
backup_backend
|
||||||
|
|
||||||
|
# 复制新 JAR
|
||||||
|
log "[后端] 复制 JAR 包..."
|
||||||
|
cp $PROJECT_DIR/yudao-server/target/yudao-server.jar $BACKEND_DIR/
|
||||||
|
|
||||||
|
# 停止旧服务
|
||||||
|
stop_backend
|
||||||
|
|
||||||
|
# 启动新服务
|
||||||
|
start_backend
|
||||||
|
|
||||||
|
# 健康检查
|
||||||
|
health_check
|
||||||
|
|
||||||
|
log "========== 后端部署完成 =========="
|
||||||
|
}
|
||||||
|
|
||||||
|
# 部署前端
|
||||||
|
deploy_frontend() {
|
||||||
|
log "========== 开始部署前端 =========="
|
||||||
|
|
||||||
|
cd $PROJECT_DIR/frontend
|
||||||
|
|
||||||
|
# 安装依赖
|
||||||
|
log "[前端] 安装依赖..."
|
||||||
|
pnpm install
|
||||||
|
|
||||||
|
# 构建
|
||||||
|
log "[前端] 构建项目..."
|
||||||
|
pnpm build
|
||||||
|
|
||||||
|
# 备份旧文件
|
||||||
|
if [ -d "$FRONTEND_DIR" ] && [ "$(ls -A $FRONTEND_DIR 2>/dev/null)" ]; then
|
||||||
|
log "[前端] 备份旧文件..."
|
||||||
|
mkdir -p /www/wwwroot/web-gold-backup
|
||||||
|
rm -rf /www/wwwroot/web-gold-backup/dist-$DATE
|
||||||
|
cp -r $FRONTEND_DIR /www/wwwroot/web-gold-backup/dist-$DATE
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 部署新文件
|
||||||
|
log "[前端] 部署新文件..."
|
||||||
|
rm -rf $FRONTEND_DIR/*
|
||||||
|
cp -r $FRONTEND_SRC/* $FRONTEND_DIR/
|
||||||
|
|
||||||
|
log "========== 前端部署完成 =========="
|
||||||
|
}
|
||||||
|
|
||||||
|
# ==================== 主流程 ====================
|
||||||
|
|
||||||
|
main() {
|
||||||
|
log "=========================================="
|
||||||
|
log "开始部署: $(date '+%Y-%m-%d %H:%M:%S')"
|
||||||
|
log "=========================================="
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
backend-only)
|
||||||
|
deploy_backend
|
||||||
|
;;
|
||||||
|
frontend-only)
|
||||||
|
deploy_frontend
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
deploy_backend
|
||||||
|
deploy_frontend
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
log "=========================================="
|
||||||
|
log "全部部署完成: $(date '+%Y-%m-%d %H:%M:%S')"
|
||||||
|
log "=========================================="
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
||||||
38
script/docker/docker-compose.prod.yml
Normal file
38
script/docker/docker-compose.prod.yml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
# 生产环境 Docker Compose 配置
|
||||||
|
# 注意:数据库和 Redis 使用外部服务,不在此文件中定义
|
||||||
|
# 前端静态文件由 Nginx 直接托管,不使用 Docker
|
||||||
|
|
||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
name: sionrui-prod
|
||||||
|
|
||||||
|
services:
|
||||||
|
# 后端服务
|
||||||
|
backend:
|
||||||
|
container_name: sionrui-backend
|
||||||
|
build:
|
||||||
|
context: ../../
|
||||||
|
dockerfile: yudao-server/Dockerfile
|
||||||
|
image: sionrui-backend:latest
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "9900:9900"
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Shanghai
|
||||||
|
- SPRING_PROFILES_ACTIVE=prod
|
||||||
|
- JAVA_OPTS=-Xms1g -Xmx1g -XX:+HeapDumpOnOutOfMemoryError
|
||||||
|
volumes:
|
||||||
|
- /www/wwwroot/yudao-server/logs:/app/logs
|
||||||
|
- /www/wwwroot/yudao-server/heapError:/app/heapError
|
||||||
|
- /www/wwwroot/yudao-server/config:/app/config
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:9900/actuator/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 60s
|
||||||
|
logging:
|
||||||
|
driver: "json-file"
|
||||||
|
options:
|
||||||
|
max-size: "100m"
|
||||||
|
max-file: "3"
|
||||||
Reference in New Issue
Block a user