680e2c9427
Provide rsync deploy and restart tooling for the 100 server, document the workflow, and add pagination plus user filtering across billing and user management pages. Co-authored-by: Cursor <cursoragent@cursor.com>
91 lines
2.3 KiB
Bash
Executable File
91 lines
2.3 KiB
Bash
Executable File
#!/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'"
|