From 83b3fac62cd8fd12dc9ebc6ec84e4ab0b2e5b568 Mon Sep 17 00:00:00 2001 From: shijing Date: Fri, 10 Jul 2026 16:11:28 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=96=B0=E5=A2=9E=20update.sh=20?= =?UTF-8?q?=E4=B8=80=E9=94=AE=E6=9B=B4=E6=96=B0=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git pull -> pip install -> 前端构建 -> 重启带 SSL 的 uvicorn。 配套 .gitattributes 固定 *.sh 为 LF。 Co-Authored-By: Claude Opus 4.7 --- .gitattributes | 1 + update.sh | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 .gitattributes create mode 100644 update.sh diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfdb8b7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.sh text eol=lf diff --git a/update.sh b/update.sh new file mode 100644 index 0000000..69bafda --- /dev/null +++ b/update.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +# 一键更新:git pull -> pip install -> 前端构建(可选)-> 重启后端 +set -euo pipefail + +PROJECT_ROOT="$(cd "$(dirname "$0")" && pwd)" +BACKEND_DIR="$PROJECT_ROOT/backend" +FRONTEND_DIR="$PROJECT_ROOT/frontend" +SSL_DIR="$PROJECT_ROOT/ssl" +PID_FILE="$BACKEND_DIR/backend.pid" +PORT="${PORT:-8775}" +HOST="${HOST:-0.0.0.0}" + +echo "==> [1/4] git pull" +cd "$PROJECT_ROOT" +git pull --ff-only + +echo "==> [2/4] 后端依赖" +cd "$BACKEND_DIR" +if [ ! -d ".venv" ]; then + echo " 创建虚拟环境 .venv" + python3 -m venv .venv +fi +# shellcheck disable=SC1091 +source .venv/bin/activate +pip install --upgrade pip setuptools wheel >/dev/null +pip install -e . + +echo "==> [3/4] 前端构建" +if [ -d "$FRONTEND_DIR" ] && command -v npm >/dev/null 2>&1; then + cd "$FRONTEND_DIR" + npm install --no-audit --no-fund + npm run build + rm -rf "$BACKEND_DIR/dist" + cp -r "$FRONTEND_DIR/dist" "$BACKEND_DIR/dist" + echo " frontend/dist -> backend/dist 完成" +else + echo " 跳过(未装 npm 或无 frontend 目录)" +fi + +echo "==> [4/4] 重启后端" +cd "$BACKEND_DIR" + +# 停旧进程 +if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then + echo " 停旧进程 PID=$(cat "$PID_FILE")" + kill "$(cat "$PID_FILE")" || true + sleep 1 +fi +pkill -f 'uvicorn.*app.main:app' 2>/dev/null || true +sleep 1 + +# 校验证书 +if [ ! -f "$SSL_DIR/finai.ctc-zc.com.pem" ] || [ ! -f "$SSL_DIR/finai.ctc-zc.com.key" ]; then + echo "!! 证书不存在于 $SSL_DIR,退出" >&2 + exit 1 +fi + +# 启新进程 +nohup .venv/bin/python -m uvicorn app.main:app \ + --host "$HOST" --port "$PORT" \ + --ssl-certfile "$SSL_DIR/finai.ctc-zc.com.pem" \ + --ssl-keyfile "$SSL_DIR/finai.ctc-zc.com.key" \ + > "$BACKEND_DIR/backend.out.log" 2> "$BACKEND_DIR/backend.err.log" & +echo $! > "$PID_FILE" + +sleep 2 +NEW_PID="$(cat "$PID_FILE")" +if kill -0 "$NEW_PID" 2>/dev/null; then + echo "OK 启动成功 PID=$NEW_PID https://$HOST:$PORT" +else + echo "!! 启动失败,查看 $BACKEND_DIR/backend.err.log" >&2 + tail -n 20 "$BACKEND_DIR/backend.err.log" >&2 || true + exit 1 +fi