Add MindSpace page live edit, chat skills, and H5 deploy tooling.

Introduce page edit sessions with draft preview and patch API, chat skill picker, user memory profile, h5ApiBase resolution, voice WAV transport, and scripts for 105/g2 deployment and Plaza local dev.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
John
2026-06-15 22:09:38 -07:00
parent 3cd322ccfe
commit 6ee6fd64dd
94 changed files with 7015 additions and 2136 deletions
+165
View File
@@ -0,0 +1,165 @@
#!/usr/bin/env bash
# Plaza 独立部署 → 105(与 Memind H5 解耦,仅共享同机 API)
#
# 架构:
# plaza.tkmind.cn
# /plaza、/_next → goose-plaza-web :3002 (/root/plaza/web)
# /api、/auth、/u → goose-h5 :8080 (/root/tkmind_go/ui/h5)
#
# 用法:
# pnpm deploy:plaza-105
# pnpm deploy:plaza-105 -- --skip-build
# pnpm deploy:plaza-105 -- --no-restart
#
# 前置:
# 1. DNS: plaza.tkmind.cn A → 120.26.184.105
# 2. H5 已部署:pnpm deploy:105(提供 Plaza API + 登录 + 发布页)
# 3. 可选:cp deploy/plaza-105/plaza-105.env.example deploy/plaza-105/plaza-105.env
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
DEPLOY_DIR="${ROOT}/deploy/plaza-105"
DEPLOY_ENV="${DEPLOY_DIR}/plaza-105.env"
EXCLUDE="${ROOT}/scripts/.rsync-exclude-plaza-web"
PLAZA_APP_DIR="${PLAZA_APP_DIR:-${ROOT}/../tkmind_go/ui/plaza}"
PLAZA_DEPLOY_HOST="${PLAZA_DEPLOY_HOST:-root@120.26.184.105}"
PLAZA_REMOTE_DIR="${PLAZA_REMOTE_DIR:-/root/plaza/web}"
PLAZA_PROD_URL="${PLAZA_PROD_URL:-https://plaza.tkmind.cn}"
PLAZA_PORT="${PLAZA_PORT:-3002}"
PLAZA_SYSTEMD_SERVICE="${PLAZA_SYSTEMD_SERVICE:-goose-plaza-web}"
H5_SYSTEMD_SERVICE="${H5_SYSTEMD_SERVICE:-goose-h5}"
MINDSPACE_PUBLIC_BASE="${MINDSPACE_PUBLIC_BASE:-https://g2.tkmind.cn}"
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,18p' "$0"
exit 0
;;
*)
echo "未知参数: $arg(可用 --skip-build / --no-restart" >&2
exit 1
;;
esac
done
if [[ -f "${DEPLOY_ENV}" ]]; then
set -a
# shellcheck disable=SC1090
source "${DEPLOY_ENV}"
set +a
fi
if [[ ! -f "${PLAZA_APP_DIR}/package.json" ]]; then
echo "错误: 未找到 Plaza Next.js${PLAZA_APP_DIR}" >&2
echo "请设置 PLAZA_APP_DIR 或确认 tkmind_go/ui/plaza 存在" >&2
exit 1
fi
ssh_cmd() {
ssh -o ConnectTimeout=15 -o BatchMode=yes "${PLAZA_DEPLOY_HOST}" "$@"
}
write_remote_env() {
ssh_cmd "mkdir -p '${PLAZA_REMOTE_DIR}' && cat > '${PLAZA_REMOTE_DIR}/.env' <<EOF
PLAZA_API_PROXY=http://127.0.0.1:8080
PLAZA_API_BASE=http://127.0.0.1:8080
NEXT_PUBLIC_API_BASE=${PLAZA_PROD_URL}
NEXT_PUBLIC_SITE_BASE=${PLAZA_PROD_URL}
NEXT_PUBLIC_MINDSPACE_BASE=${MINDSPACE_PUBLIC_BASE}
NEXT_PUBLIC_PLAZA_BASE=/plaza
EOF"
}
install_nginx() {
echo "==> 安装 Nginx 配置..."
ssh_cmd "mkdir -p /var/www/certbot"
if ssh_cmd "test -f /etc/letsencrypt/live/plaza.tkmind.cn/fullchain.pem"; then
scp "${DEPLOY_DIR}/plaza.tkmind.cn.nginx.conf" \
"${PLAZA_DEPLOY_HOST}:/etc/nginx/conf.d/plaza.tkmind.cn.conf"
ssh_cmd "nginx -t && systemctl reload nginx"
return
fi
echo "==> 首次部署:启用 HTTP bootstrap..."
scp "${DEPLOY_DIR}/plaza.tkmind.cn.bootstrap.nginx.conf" \
"${PLAZA_DEPLOY_HOST}:/etc/nginx/conf.d/plaza.tkmind.cn.conf"
ssh_cmd "nginx -t && systemctl reload nginx"
echo "==> 申请 SSL 证书..."
ssh_cmd "certbot certonly --webroot -w /var/www/certbot -d plaza.tkmind.cn \
--non-interactive --agree-tos -m admin@tkmind.cn || true"
if ssh_cmd "test -f /etc/letsencrypt/live/plaza.tkmind.cn/fullchain.pem"; then
scp "${DEPLOY_DIR}/plaza.tkmind.cn.nginx.conf" \
"${PLAZA_DEPLOY_HOST}:/etc/nginx/conf.d/plaza.tkmind.cn.conf"
else
echo "⚠ 证书未签发,暂保留 HTTP bootstrap"
fi
ssh_cmd "nginx -t && systemctl reload nginx"
}
install_systemd() {
echo "==> 安装 systemd (${PLAZA_SYSTEMD_SERVICE})..."
scp "${DEPLOY_DIR}/goose-plaza-web.service" \
"${PLAZA_DEPLOY_HOST}:/etc/systemd/system/${PLAZA_SYSTEMD_SERVICE}.service"
ssh_cmd "systemctl daemon-reload && systemctl enable '${PLAZA_SYSTEMD_SERVICE}'"
}
echo "======================================"
echo "Plaza 独立部署 → 105"
echo "时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "前端: ${PLAZA_APP_DIR}"
echo "远端: ${PLAZA_DEPLOY_HOST}:${PLAZA_REMOTE_DIR}"
echo "公网: ${PLAZA_PROD_URL}"
echo "API: goose-h5 @ :8080(需已 deploy:105"
echo "======================================"
echo "==> rsync Plaza Next.js..."
rsync -az --delete --exclude-from="${EXCLUDE}" \
"${PLAZA_APP_DIR}/" \
"${PLAZA_DEPLOY_HOST}:${PLAZA_REMOTE_DIR}/"
write_remote_env
if [[ "${SKIP_BUILD}" -eq 0 ]]; then
echo "==> 远端 npm install && build..."
ssh_cmd "cd '${PLAZA_REMOTE_DIR}' && npm install && npm run build"
fi
install_systemd
install_nginx
if [[ "${NO_RESTART}" -eq 0 ]]; then
echo "==> 重启服务..."
ssh_cmd "systemctl is-active --quiet '${H5_SYSTEMD_SERVICE}' || {
echo '⚠ ${H5_SYSTEMD_SERVICE} 未运行,Plaza API 不可用。请先 pnpm deploy:105' >&2
exit 1
}"
ssh_cmd "systemctl restart '${PLAZA_SYSTEMD_SERVICE}'"
sleep 2
fi
echo ""
echo "=== 健康检查 ==="
ssh_cmd "systemctl is-active '${PLAZA_SYSTEMD_SERVICE}' && echo '${PLAZA_SYSTEMD_SERVICE}: active'"
ssh_cmd "curl -sf 'http://127.0.0.1:8080/api/status' && echo ' ← plaza-api (goose-h5) ok'" || {
echo "✗ goose-h5 API 不可用,请执行 pnpm deploy:105" >&2
exit 1
}
ssh_cmd "curl -s -o /dev/null -w 'plaza-web local → %{http_code}\n' 'http://127.0.0.1:${PLAZA_PORT}/plaza'" || true
curl -s --max-time 20 -o /dev/null -w "${PLAZA_PROD_URL}/plaza → %{http_code}\n" "${PLAZA_PROD_URL}/plaza" || true
echo ""
echo "✅ Plaza 前端已独立部署"
echo " 首页: ${PLAZA_PROD_URL}/plaza"
echo " 目录: ${PLAZA_REMOTE_DIR}"
echo " API: 仍由 goose-h5 提供(pnpm deploy:105 同步)"