#!/usr/bin/env bash # 呼籁旅行官网(1814.love) · 一键部署脚本 # # 用法(在本机 Git Bash 里跑): # bash deploy.sh # 在服务器上 git pull 最新 master 并重建重启 # bash deploy.sh <提交号> # 部署指定提交(默认 master 最新) # # 线上形态: Nuxt 3 纯 SSR,跑在 1.182.108.58,PM2 hulai-website 运行 .output/server/index.mjs (端口 9005)。 # 链路: 1814.love(47 nginx) → 1.182.108.58:9002(nginx) → 127.0.0.1:9005(PM2 node)。 # 服务器上 /opt/gw/hulai-website 是完整 git clone,部署 = git pull + build + 重启。 # # ⚠️ 验收域名用 www.1814.love,不要用裸域 1814.love: # 裸域是双 A 记录(1.182.108.58 + 47.105.95.198),会漂移到 1.182 上的 Gitea; # www 只解析到 47 的官网 nginx,才是正确入口。 # # 铁律(脚本已保护): 以下运行时数据绝不被动 — # server/database/hulai.db* (SQLite 数据库) # public/images/ public/uploads/ public/旅拍照片/ (用户上传/内容图) # .env (可选: 企业微信 webhook key) set -euo pipefail HOST="root@1.182.108.58" APP="/opt/gw/hulai-website" NAME="hulai-website" URL="https://www.1814.love" REF="${1:-master}" SSH="ssh -o BatchMode=yes $HOST" echo "==> 目标: $HOST:$APP (ref: $REF)" # ---------- 步骤 0: 备份数据库 + .env + 记录当前版本 ---------- echo "==> 备份数据库 / .env / 记录当前版本" TS=$($SSH 'date +%Y%m%d_%H%M%S') BK="$APP/.deploy-backups/$TS" $SSH "mkdir -p $BK && cp -a $APP/server/database/ $BK/ 2>/dev/null; cp -a $APP/.env $BK/ 2>/dev/null; cp -a $APP/.output $BK/.output_pre 2>/dev/null; echo done" PREV=$($SSH "cd $APP && git rev-parse HEAD") echo " 备份: $BK 当前版本: ${PREV:0:8}" # ---------- 步骤 1: git pull 最新代码 ---------- echo "==> git fetch + 切到 $REF" $SSH "cd $APP && git fetch origin --prune && git checkout -q $REF && git pull --ff-only origin master 2>/dev/null || true && git rev-parse --short HEAD" # ---------- 步骤 2: 安装依赖 + 构建 ---------- echo "==> npm ci + npm run build (Nuxt SSR, 需几分钟)" $SSH "cd $APP && npm ci --no-audit --no-fund && npm run build" # ---------- 步骤 3: 重启 ---------- echo "==> 重启 PM2 ($NAME)" $SSH "pm2 restart $NAME >/dev/null 2>&1 && pm2 save >/dev/null 2>&1 && echo ' 已重启'" # ---------- 步骤 4: 验收 ---------- echo "==> 验收" sleep 4 $SSH "curl -sk -o /dev/null -w ' 本机 127.0.0.1:9005: %{http_code}\n' http://127.0.0.1:9005/" curl -sk -o /dev/null -w " 对外 $URL: %{http_code}\n" "$URL/" BODY=$(curl -sk --compressed "$URL/") echo "$BODY" | grep -q "呼籁" && echo " ✅ 首页含『呼籁』" || echo " ⚠️ 首页未见『呼籁』" echo "" echo "✅ 部署完成。访问: $URL" echo " 回滚: ssh $HOST 'cd $APP && git checkout -q $PREV && npm run build && pm2 restart $NAME'"