Skip to content

Commit b98fd9e

Browse files
nieaoclaude
andcommitted
feat(deploy): add deploy-on-vps.sh + ONESHOT.md (绕过本地 SSH 网络障碍)
[meta-cc] 本机有 DNS 劫持代理 (Clash/V2Ray 类) 把所有域名解析到 198.18.x.x 本地拦截 IP, HTTPS 走代理通但 SSH 22 端口出不去 → 没法直接 ssh root@ha2. 绕过方案: 在 VPS 上一行命令完成部署 (不依赖部署人本机网络) 新增: - deploy/deploy-on-vps.sh: VPS-side 部署脚本, git pull + npm install + build + systemd - deploy/ONESHOT.md: 一行命令 + 验证 + 故障排查 + 升级流程 oneshot 命令 (boss/lichang333 ssh 到 VPS 后粘贴): sudo bash -c 'set -e; test -d /opt/know-canvas/.git && (cd /opt/know-canvas && git pull) || git clone https://github.com/nieao/know-canvas.git /opt/know-canvas; cd /opt/know-canvas; bash deploy/deploy-on-vps.sh' 原 deploy/deploy.sh (本地 rsync 模式) 保留, boss 没装 VPN 时可走那个. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent b1cfd42 commit b98fd9e

2 files changed

Lines changed: 317 additions & 0 deletions

File tree

deploy/ONESHOT.md

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
# Know Canvas — VPS 一键部署 oneshot
2+
3+
> **场景**: boss / lichang333 在 VPS 终端 (ssh root@ha2.digitalvio.shop) 直接粘贴一行命令完成全部部署
4+
> **优势**: 不依赖本地 rsync / SSH key 配对; 不依赖部署人本机的网络环境
5+
6+
---
7+
8+
## TL;DR — 一行部署
9+
10+
ssh 到 VPS 后, 复制粘贴这一段:
11+
12+
```bash
13+
sudo bash -c '
14+
set -e
15+
test -d /opt/know-canvas/.git && (cd /opt/know-canvas && git pull) || git clone https://github.com/nieao/know-canvas.git /opt/know-canvas
16+
cd /opt/know-canvas
17+
bash deploy/deploy-on-vps.sh
18+
'
19+
```
20+
21+
**全程约 3-5 分钟**, 期间会自动:
22+
1. git clone / pull 最新代码
23+
2. npm install + npm run build:canvas (前端 build, base=/canvas/)
24+
3. 复制 dist/ 到 /var/www/know-canvas/
25+
4. cd server && npm install (Yjs sync 后端依赖)
26+
5. 装 systemd unit know-canvas-yws + 启动
27+
6. 健康检查 (curl localhost:1234/health)
28+
7. 打印 Caddy 配置追加指引 (这步要手动 — 避免破坏 Hermes 的 Caddyfile)
29+
30+
---
31+
32+
## 前置要求 (VPS 应该已经满足)
33+
34+
```bash
35+
# 检查
36+
node --version # 应该 >= 18
37+
npm --version # 应该 >= 8
38+
git --version # 任意
39+
caddy version # Hermes 已经在用, 应该已装
40+
41+
# 如果 node 不够新:
42+
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
43+
sudo apt install -y nodejs
44+
```
45+
46+
---
47+
48+
## 部署完成后必须手动做的一步: Caddy 配置
49+
50+
部署脚本不会自动改 `/etc/caddy/Caddyfile` (太敏感, 可能跟 Hermes 配置冲突)。
51+
52+
```bash
53+
sudo nano /etc/caddy/Caddyfile
54+
```
55+
56+
在现有 `ha2.digitalvio.shop {...}` site block 里 (Hermes 的反代规则**之前**), 追加:
57+
58+
```caddy
59+
# Know Canvas 前端 (静态文件)
60+
handle_path /canvas/* {
61+
root * /var/www/know-canvas
62+
try_files {path} /index.html
63+
file_server
64+
}
65+
66+
# Yjs WebSocket 反代 → localhost:1234
67+
handle_path /yws/* {
68+
reverse_proxy localhost:1234 {
69+
header_up Host {host}
70+
header_up X-Real-IP {remote}
71+
}
72+
}
73+
```
74+
75+
然后:
76+
77+
```bash
78+
sudo caddy validate /etc/caddy/Caddyfile # 检查语法
79+
sudo systemctl reload caddy # 生效
80+
```
81+
82+
**完整范本**`/opt/know-canvas/deploy/Caddyfile.canvas` (deploy-on-vps.sh 末尾会打印).
83+
84+
---
85+
86+
## 验证部署成功
87+
88+
```bash
89+
# 1) y-ws-server 起来
90+
curl -s http://127.0.0.1:1234/health
91+
# 期望: {"ok":true,"service":"know-canvas-yjs-sync","port":1234,...}
92+
93+
# 2) 前端能访问
94+
curl -s -o /dev/null -w '%{http_code}\n' https://ha2.digitalvio.shop/canvas/
95+
# 期望: 200
96+
97+
# 3) 浏览器打开
98+
# https://ha2.digitalvio.shop/canvas/?room=demo-railway
99+
# 在两个浏览器 / 两台电脑同时打开同一房间, 应该实时同步
100+
```
101+
102+
---
103+
104+
## 升级 (代码更新后重新部署)
105+
106+
```bash
107+
cd /opt/know-canvas && sudo bash deploy/deploy-on-vps.sh
108+
```
109+
110+
git pull → 重 build → 重启 systemd. **服务无中断升级** (重启 yws 时 LevelDB 数据保留).
111+
112+
---
113+
114+
## 故障排查
115+
116+
```bash
117+
# Yjs sync 起不来?
118+
sudo journalctl -u know-canvas-yws -f
119+
120+
# 看占用端口
121+
sudo netstat -tlnp | grep -E ':(1234|17081|18080)'
122+
123+
# 重启
124+
sudo systemctl restart know-canvas-yws
125+
126+
# 备份画布数据 (LevelDB)
127+
sudo tar czf /root/yjs-backup-$(date +%F).tgz /opt/know-canvas/server/yjs-data/
128+
129+
# 完全重置 (⚠ 删除所有画布数据)
130+
sudo systemctl stop know-canvas-yws
131+
sudo rm -rf /opt/know-canvas/server/yjs-data
132+
sudo systemctl start know-canvas-yws
133+
```
134+
135+
---
136+
137+
## 这套部署不包含的东西 (boss 自己还要做)
138+
139+
| 不做的事 | 怎么补 |
140+
|---------|------|
141+
| **claude-bridge** (本机 Claude CLI 桥) | 每个用户**自己电脑**`cd server && npm run bridge`, 不能放云端 (会暴露 Claude 账号) |
142+
| **hermes-proxy** (Hermes API 中转) | 同上, 不能跟 know-canvas 一起部署到云端 — 凭据敏感 (HERMES_USER/PASS), 应该走 Caddy 前置反代或本机跑 |
143+
| **WSS 协议升级** | 现在脚本配的是 ws:// 反代, 上 SSL 后 Caddy 会自动 upgrade 到 wss:// (Caddy 默认行为) |
144+
| **token 鉴权** | 默认关. 开启: `sudo systemctl edit know-canvas-yws``Environment=KNOW_CANVAS_TOKEN=随机字符串`, 然后前端 yjsClient.js 也要带 token (P1) |
145+
146+
---
147+
148+
## [meta-cc] / 后续 cc 的提示
149+
150+
当用户说"部署 know-canvas 到云端" / "推上去" / "上线":
151+
152+
1. 检查 boss 本机能否 SSH 到 VPS (`ssh root@ha2.digitalvio.shop` 是否通)
153+
2. **如果本机 SSH 不通** (DNS 劫持 / VPN / 防火墙阻拦): 用本文档的 oneshot 模式让 boss/lichang333 在 VPS 上自己跑
154+
3. **如果本机 SSH 通**: 走 `bash deploy/deploy.sh root@ha2.digitalvio.shop` (本地 build + rsync)
155+
156+
两种方式产出一致, 选你能做的.

deploy/deploy-on-vps.sh

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
#!/usr/bin/env bash
2+
# Know Canvas — 在 VPS 本地一键部署 (不依赖本地 SSH)
3+
#
4+
# 用法 (在 VPS 上 ssh 登录后跑):
5+
# sudo bash deploy/deploy-on-vps.sh
6+
#
7+
# 或者 oneshot 远程拉取 + 部署:
8+
# sudo bash -c "git clone https://github.com/nieao/know-canvas.git /opt/know-canvas-deploy && cd /opt/know-canvas-deploy && bash deploy/deploy-on-vps.sh"
9+
#
10+
# 假设 (满足则 OK, 不满足脚本会提示):
11+
# - Ubuntu 20.04+ / Debian 11+
12+
# - root 权限 (跑 sudo) 或者 systemd 写权限
13+
# - node >= 18, npm >= 8
14+
# - git
15+
# - Caddy 已部署且有 ha2.digitalvio.shop 的 site block (Hermes 已用)
16+
#
17+
# 部署后:
18+
# /opt/know-canvas/ 前端源码 + server (做 git pull 升级用)
19+
# /var/www/know-canvas/ 前端 build 产物 (Caddy 提供)
20+
# /opt/know-canvas/server/yjs-data/ LevelDB 持久化
21+
# systemd: know-canvas-yws Yjs sync 守护进程
22+
#
23+
# 不会自动改 Caddyfile (太敏感, 可能跟 Hermes 冲突)
24+
# 部署完后会打印 Caddyfile 追加位置 + 内容
25+
26+
set -e
27+
28+
REPO_URL="${REPO_URL:-https://github.com/nieao/know-canvas.git}"
29+
INSTALL_DIR="${INSTALL_DIR:-/opt/know-canvas}"
30+
WEB_DIR="${WEB_DIR:-/var/www/know-canvas}"
31+
BRANCH="${BRANCH:-main}"
32+
33+
echo "============================================================"
34+
echo " Know Canvas 一键 VPS 部署"
35+
echo " 仓库: $REPO_URL"
36+
echo " 分支: $BRANCH"
37+
echo " 安装到: $INSTALL_DIR + $WEB_DIR"
38+
echo "============================================================"
39+
40+
# ---- 0. 前置检查 ----
41+
echo ""
42+
echo "[0/6] 前置检查..."
43+
44+
if [ "$EUID" -ne 0 ]; then
45+
echo " WARN: 没用 root 运行, 部分步骤可能 sudo 弹密码"
46+
fi
47+
48+
for cmd in node npm git; do
49+
if ! command -v $cmd > /dev/null 2>&1; then
50+
echo " ERROR: 缺少 $cmd"
51+
if [ "$cmd" = "node" ]; then
52+
echo " 安装: curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt install -y nodejs"
53+
elif [ "$cmd" = "git" ]; then
54+
echo " 安装: sudo apt install -y git"
55+
fi
56+
exit 1
57+
fi
58+
done
59+
60+
NODE_MAJOR=$(node -v | sed 's/v//' | cut -d. -f1)
61+
if [ "$NODE_MAJOR" -lt 18 ]; then
62+
echo " ERROR: node 版本 $(node -v) < 18, 升级一下"
63+
exit 1
64+
fi
65+
66+
echo " ✓ node $(node -v), npm $(npm -v), git OK"
67+
68+
# ---- 1. clone / pull ----
69+
echo ""
70+
echo "[1/6] 拉取代码到 $INSTALL_DIR..."
71+
if [ -d "$INSTALL_DIR/.git" ]; then
72+
echo " 目录已存在, git pull"
73+
cd "$INSTALL_DIR"
74+
git fetch origin
75+
git checkout "$BRANCH"
76+
git pull origin "$BRANCH"
77+
else
78+
echo " git clone"
79+
sudo mkdir -p "$(dirname "$INSTALL_DIR")"
80+
sudo git clone --branch "$BRANCH" "$REPO_URL" "$INSTALL_DIR"
81+
sudo chown -R "$USER:$USER" "$INSTALL_DIR"
82+
cd "$INSTALL_DIR"
83+
fi
84+
85+
# ---- 2. 装前端依赖 + build ----
86+
echo ""
87+
echo "[2/6] 装前端依赖 + build (base=/canvas/)..."
88+
cd "$INSTALL_DIR"
89+
npm ci --no-audit --no-fund 2>&1 | tail -3 || npm install --no-audit --no-fund 2>&1 | tail -3
90+
npm run build:canvas 2>&1 | tail -5
91+
92+
if [ ! -d "$INSTALL_DIR/dist" ]; then
93+
echo " ERROR: build 失败, 没看到 dist/"
94+
exit 1
95+
fi
96+
echo " ✓ build 完成, dist/ 大小 $(du -sh dist | cut -f1)"
97+
98+
# ---- 3. 复制 dist → /var/www/know-canvas/ ----
99+
echo ""
100+
echo "[3/6] 复制 dist → $WEB_DIR..."
101+
sudo mkdir -p "$WEB_DIR"
102+
sudo rsync -a --delete "$INSTALL_DIR/dist/" "$WEB_DIR/"
103+
echo " ✓ web 目录已更新"
104+
105+
# ---- 4. 装 server 依赖 ----
106+
echo ""
107+
echo "[4/6] 装 server (Yjs sync) 依赖..."
108+
cd "$INSTALL_DIR/server"
109+
npm install --production --no-audit --no-fund 2>&1 | tail -3
110+
echo " ✓ server deps OK"
111+
112+
# ---- 5. 装 systemd unit ----
113+
echo ""
114+
echo "[5/6] 装 systemd unit know-canvas-yws..."
115+
sudo cp "$INSTALL_DIR/deploy/know-canvas-yws.service" /etc/systemd/system/
116+
sudo systemctl daemon-reload
117+
sudo systemctl enable know-canvas-yws
118+
sudo systemctl restart know-canvas-yws
119+
sleep 2
120+
echo " systemd status:"
121+
sudo systemctl status know-canvas-yws --no-pager -l | head -15
122+
123+
# ---- 6. 健康检查 ----
124+
echo ""
125+
echo "[6/6] 健康检查..."
126+
HEALTH=$(curl -sf http://127.0.0.1:1234/health 2>&1 || echo 'FAILED')
127+
if echo "$HEALTH" | grep -q '"ok":true'; then
128+
echo " ✓ y-ws-server /health OK: $HEALTH"
129+
else
130+
echo " ✗ y-ws-server 起不来: $HEALTH"
131+
echo " 看日志: sudo journalctl -u know-canvas-yws -n 50"
132+
fi
133+
134+
# ---- 完成提示 ----
135+
echo ""
136+
echo "============================================================"
137+
echo " ✓ Know Canvas 部署完成"
138+
echo "============================================================"
139+
echo ""
140+
echo "下一步手动操作 (Caddy 追加, 不能自动改避免破坏 Hermes 配置):"
141+
echo ""
142+
echo " 1) 编辑 /etc/caddy/Caddyfile, 在 ha2.digitalvio.shop 这个 site block 里"
143+
echo " 插入下面两段 (位于 Hermes 已有规则之前, Caddy 按顺序匹配):"
144+
echo ""
145+
echo " --------- 复制开始 ---------"
146+
sed -n '/^ha2.digitalvio.shop/,/^}/p' "$INSTALL_DIR/deploy/Caddyfile.canvas" 2>/dev/null || cat "$INSTALL_DIR/deploy/Caddyfile.canvas"
147+
echo " --------- 复制结束 ---------"
148+
echo ""
149+
echo " 2) sudo caddy validate /etc/caddy/Caddyfile"
150+
echo " 3) sudo systemctl reload caddy"
151+
echo ""
152+
echo "验证: curl -sf https://ha2.digitalvio.shop/canvas/ → 应该看到 HTML"
153+
echo " curl -sf http://127.0.0.1:1234/health → y-ws ok"
154+
echo ""
155+
echo "升级方式 (将来):"
156+
echo " cd $INSTALL_DIR && sudo bash deploy/deploy-on-vps.sh"
157+
echo ""
158+
echo "查看 Yjs 日志:"
159+
echo " sudo journalctl -u know-canvas-yws -f"
160+
echo ""
161+
echo "============================================================"

0 commit comments

Comments
 (0)