#!/usr/bin/env bash # memind_adm → 100 服务器 rsync 部署 # # 用法: # ./scripts/rsync_to_server.sh # ./scripts/rsync_to_server.sh --skip-build # ./scripts/rsync_to_server.sh --no-restart # SKIP_BUILD=1 NO_RESTART=1 ./scripts/rsync_to_server.sh set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" EXCLUDE="${ROOT}/scripts/.rsync-exclude-lan" DEPLOY_HOST="${DEPLOY_HOST:-john@100.99.38.66}" REMOTE_DIR="${REMOTE_DIR:-/Users/john/Project/memind_adm}" ADM_PORT="${ADM_PORT:-5174}" SSH_OPTS=(-o ConnectTimeout=15 -o BatchMode=yes -o StrictHostKeyChecking=accept-new) SKIP_BUILD=0 NO_RESTART=0 for arg in "$@"; do case "$arg" in --skip-build) SKIP_BUILD=1 ;; --no-restart) NO_RESTART=1 ;; -h|--help) sed -n '2,8p' "$0" exit 0 ;; *) echo "未知参数: $arg" >&2 exit 1 ;; esac done ssh_cmd() { ssh "${SSH_OPTS[@]}" "${DEPLOY_HOST}" "$@" } require_ssh() { if ! ssh_cmd 'echo ok' >/dev/null 2>&1; then echo "❌ 无法 SSH 到 ${DEPLOY_HOST}" >&2 echo "请确认 Tailscale 已连接,或执行: ssh-copy-id ${DEPLOY_HOST}" >&2 exit 1 fi } echo "======================================" echo "memind_adm → ${DEPLOY_HOST}" echo "时间: $(date '+%Y-%m-%d %H:%M:%S')" echo "本地: ${ROOT}" echo "远端: ${REMOTE_DIR}" echo "端口: ${ADM_PORT}" echo "======================================" require_ssh if [[ "${SKIP_BUILD}" -eq 0 ]]; then echo "==> 本地构建..." cd "${ROOT}" npm run build fi echo "==> 创建远端目录..." ssh_cmd "mkdir -p '${REMOTE_DIR}'" echo "==> rsync 源码 (--delete)..." rsync -az --delete --exclude-from="${EXCLUDE}" \ "${ROOT}/" \ "${DEPLOY_HOST}:${REMOTE_DIR}/" echo "==> rsync dist..." rsync -az --delete \ "${ROOT}/dist/" \ "${DEPLOY_HOST}:${REMOTE_DIR}/dist/" echo "==> 写入远端 .env(不覆盖已有)..." ssh_cmd "test -f '${REMOTE_DIR}/.env' || cat > '${REMOTE_DIR}/.env' <<'EOF' ADM_DEV_BACKEND=http://127.0.0.1:8081 VITE_MAIN_APP_URL=http://127.0.0.1:8081 EOF" if [[ "${NO_RESTART}" -eq 0 ]]; then echo "==> 远端重启服务..." ssh_cmd "ADM_ROOT='${REMOTE_DIR}' ADM_PORT='${ADM_PORT}' bash -s" <"${ROOT}/scripts/remote_restart.sh" fi echo "" echo "✅ 已部署到 ${DEPLOY_HOST}:${REMOTE_DIR}" echo " 本机访问: ssh ${DEPLOY_HOST} 'curl -sI http://127.0.0.1:${ADM_PORT}/ | head -1'"