更新部署脚本:切换到 Caddy + systemd 架构

- deploy.sh 改为使用 Caddy host 架构(不再依赖 docker nginx)
- 前端 dist 部署到 /opt/mikivl/note(Caddy note.mikivl.online root)
- 主页从 ../mikivl.online/index.html 上传(防止覆盖最新主页)
- 添加 better-sqlite3 自动重新编译逻辑
- docker-compose.yml 移除 program1 只读挂载限制

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
MikiVL 2026-07-26 09:53:45 +08:00
parent b02f23729b
commit c4ac36fc03
2 changed files with 47 additions and 24 deletions

View File

@ -1,51 +1,74 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# deploy.sh — 本地运行,构建并上传到 VPS # deploy.sh — 本地运行,构建并上传到 VPS
# 架构Caddy (host) + Node.js systemd service (host)
set -euo pipefail set -euo pipefail
VPS_USER="root" VPS_HOST="mikivl"
VPS_HOST="your.vps.ip" # ← 替换为你的 VPS IP 或域名
VPS_DIR="/opt/mikivl" VPS_DIR="/opt/mikivl"
# 主页文件位置(使用 mikivl.online 主仓库的最新版本)
HOMEPAGE_SRC="../mikivl.online/index.html"
info() { printf "\033[36m[INFO]\033[0m %s\n" "$*"; } info() { printf "\033[36m[INFO]\033[0m %s\n" "$*"; }
ok() { printf "\033[32m[OK]\033[0m %s\n" "$*"; } ok() { printf "\033[32m[OK]\033[0m %s\n" "$*"; }
die() { printf "\033[31m[ERROR]\033[0m %s\n" "$*" >&2; exit 1; } die() { printf "\033[31m[ERROR]\033[0m %s\n" "$*" >&2; exit 1; }
# ── Step 1: 本地构建 ────────────────────────────────────────────────────────── # ── Step 1: 本地构建 ──────────────────────────────────────────────────────────
info "Building Vite app (base=/app/) ..." info "Building Vite app ..."
npm run build npm run build
ok "Build complete → dist/" ok "Build complete → dist/"
# ── Step 2: 上传文件 ────────────────────────────────────────────────────────── # ── Step 2: 上传文件 ──────────────────────────────────────────────────────────
info "Uploading to ${VPS_USER}@${VPS_HOST}:${VPS_DIR} ..." info "Uploading to ${VPS_HOST}:${VPS_DIR} ..."
ssh "${VPS_USER}@${VPS_HOST}" "mkdir -p ${VPS_DIR}/{homepage,app,nginx,program1/server,program1/node_modules}" # 个人主页(从主仓库上传最新版本)
if [ -f "${HOMEPAGE_SRC}" ]; then
scp "${HOMEPAGE_SRC}" "${VPS_HOST}:${VPS_DIR}/homepage/index.html"
ok "Homepage uploaded from ${HOMEPAGE_SRC}"
else
die "Homepage source not found: ${HOMEPAGE_SRC}"
fi
# 个人主页 # App 构建产物 → note 目录Caddy 的 note.mikivl.online root
scp homepage/index.html "${VPS_USER}@${VPS_HOST}:${VPS_DIR}/homepage/" rsync -az --delete dist/ "${VPS_HOST}:${VPS_DIR}/note/"
# App 构建产物
rsync -az --delete dist/ "${VPS_USER}@${VPS_HOST}:${VPS_DIR}/app/"
# 后端源码 # 后端源码
rsync -az server/ "${VPS_USER}@${VPS_HOST}:${VPS_DIR}/program1/server/" rsync -az server/ "${VPS_HOST}:${VPS_DIR}/program1/server/"
scp package.json package-lock.json "${VPS_USER}@${VPS_HOST}:${VPS_DIR}/program1/" scp package.json package-lock.json "${VPS_HOST}:${VPS_DIR}/program1/"
# Nginx 配置 + Docker Compose
scp nginx/default.conf "${VPS_USER}@${VPS_HOST}:${VPS_DIR}/nginx/"
scp docker-compose.yml "${VPS_USER}@${VPS_HOST}:${VPS_DIR}/"
ok "Upload complete." ok "Upload complete."
# ── Step 3: VPS 上安装依赖并重启服务 ───────────────────────────────────────── # ── Step 3: VPS 上安装依赖并重启服务 ─────────────────────────────────────────
info "Restarting services on VPS ..." info "Installing dependencies and restarting program1 service on VPS ..."
ssh "${VPS_USER}@${VPS_HOST}" bash <<'REMOTE' ssh "${VPS_HOST}" bash <<'REMOTE'
set -euo pipefail set -euo pipefail
NODE=/root/.nvm/versions/node/v24.15.0/bin/node
NPM=/root/.nvm/versions/node/v24.15.0/bin/npm
cd /opt/mikivl/program1 cd /opt/mikivl/program1
npm ci --omit=dev ${NPM} ci --ignore-scripts
cd /opt/mikivl
docker compose up -d --remove-orphans # 检查 better-sqlite3 是否需要重新编译
docker compose ps REQUIRED_VERSION=$(${NODE} -e "process.stdout.write(String(process.versions.modules))")
BUILT_VERSION=$(${NODE} -e "
try {
const b = require('./node_modules/better-sqlite3');
process.stdout.write('ok');
} catch(e) {
process.stdout.write('rebuild');
}
" 2>/dev/null || echo "rebuild")
if [ "${BUILT_VERSION}" = "rebuild" ]; then
echo "[INFO] Rebuilding better-sqlite3 for Node $(${NODE} -v) ..."
cd node_modules/better-sqlite3
${NODE} /root/.nvm/versions/node/v24.15.0/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js rebuild
cd ../..
fi
systemctl restart program1.service
sleep 3
systemctl is-active program1.service && echo "[OK] program1.service is running"
REMOTE REMOTE
ok "Deployment complete! → https://www.mikivl.online" ok "Deployment complete! → https://note.mikivl.online"

View File

@ -8,7 +8,7 @@ services:
- MODELS_FILE=/app/models_data/models.json - MODELS_FILE=/app/models_data/models.json
- NODE_ENV=production - NODE_ENV=production
volumes: volumes:
- ./program1:/app:ro - ./program1:/app
- models_data:/app/models_data - models_data:/app/models_data
expose: expose:
- "3001" - "3001"