diff --git a/deployment/deploy.sh b/deployment/deploy.sh new file mode 100644 index 0000000..d2d5d59 --- /dev/null +++ b/deployment/deploy.sh @@ -0,0 +1,62 @@ +#!/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'" diff --git a/deployment/部署步骤.md b/deployment/部署步骤.md new file mode 100644 index 0000000..161fd7d --- /dev/null +++ b/deployment/部署步骤.md @@ -0,0 +1,76 @@ +# 呼籁旅行官网 · 部署步骤 + +部署到 `https://www.1814.love`。这是 **Nuxt 3 纯 SSR 应用**,要在服务器上重新构建。 + +> ⚠️ **访问/验收一律用 `www.1814.love`,别用裸域 `1814.love`**:裸域是双 A 记录(`1.182.108.58` + `47.105.95.198`),会漂移到 1.182 上的 Gitea;`www` 只解析到 47 的官网 nginx,才是正确入口。 + +## 一键部署(推荐) + +在 Git Bash 里: + +```bash +cd /d/work2/hulai-website/deployment +bash deploy.sh # 部署 master 最新 +bash deploy.sh <提交号> # 或部署指定提交 +``` + +脚本自动做完:**备份数据库/.env → 服务器 `git pull` 最新代码 → `npm ci` + `npm run build` → 重启 PM2 → 验收**。 + +## 线上形态(速查) + +| 项 | 值 | +|---|---| +| 应用所在服务器 | **`1.182.108.58`**(不是 47.105.95.198) | +| 项目目录 | `/opt/gw/hulai-website`(是完整 git clone,分支 `master`) | +| 框架 / 渲染 | Nuxt 3,**纯 SSR**(`nuxt build` 产物 `.output/server/index.mjs`) | +| 运行 | PM2 `hulai-website`(fork,监听 `*:9005`,Node v20) | +| 访问链路 | `1814.love`(47 nginx)→ `1.182.108.58:9002`(nginx)→ `127.0.0.1:9005`(PM2 node) | +| Node 版本 | v20(`/usr/bin/node`,**不像筛选器要 v22**) | +| nginx 配置 | 前端在 47 `hl-website.conf`;9002 在 1.182 `/etc/nginx/sites-available/gw` | + +## ⚠️ 绝不覆盖的运行时数据(脚本已保护) + +| 数据 | 位置 | 说明 | +|---|---|---| +| SQLite 数据库 | `server/database/hulai.db*`(含 -wal/-shm) | 官网表单/内容数据,**在持续写入** | +| 内容/上传图 | `public/images/` `public/uploads/` `public/旅拍照片/` | 用户上传与内容图,nginx 直接 alias 服务 | +| 环境变量 | `.env`(可选) | 企业微信 webhook key,当前未配 | + +部署用 `git pull` 更新代码,这些是 git 未跟踪或不受影响的运行时文件,不会被覆盖;脚本额外先备份数据库再动手。 + +## 手动部署(不想用脚本时) + +```bash +ssh root@1.182.108.58 +cd /opt/gw/hulai-website + +# 1. 备份数据库 +cp -a server/database/ /root/hulai-db-bak-$(date +%s)/ + +# 2. 拉代码 + 构建 + 重启 +git fetch origin && git checkout master && git pull --ff-only +npm ci +npm run build +pm2 restart hulai-website && pm2 save + +# 3. 验收 +curl http://127.0.0.1:9005/ +curl https://www.1814.love/ +``` + +## 回滚 + +```bash +ssh root@1.182.108.58 +cd /opt/gw/hulai-website +git checkout -q <旧提交号> +npm run build +pm2 restart hulai-website +``` + +## 常见问题 + +- **官网打不开**:先 `ssh root@1.182.108.58 'pm2 status; curl 127.0.0.1:9005/'`;node 没起来或 9005 不通 → 重启 PM2。 +- **改完没变化**:没重新 `npm run build` + `pm2 restart`。SSR 每次请求即时渲染,但必须 rebuild 才用新代码。 +- **build 很慢/占内存**:Nuxt 全量 build 需几分钟,服务器内存够(31G),耐心等。 +- **数据库相关功能异常**:确认 `server/database/hulai.db*` 没被部署动到(脚本已保护);异常时从 `.deploy-backups/<时间戳>/` 还原。