11#! /usr/bin/env bash
22# Know Canvas — 一键部署到新 VPS (66.245.216.250:8765)
33#
4+ # 设计原则: 独立 caddy 实例 + 独立端口 (默认 :8081), 跟同机其他 caddy/服务完全解耦.
5+ # 这样邻居 (比如 Hermes Agent) 怎么覆盖主 Caddyfile 都不影响我们.
6+ #
47# 用法 (本地开发机):
58# DEEPSEEK_API_KEY=sk-xxx bash deploy/deploy-newvps.sh
69#
710# 可选环境变量:
811# REMOTE_USER 默认 root
912# REMOTE_HOST 默认 66.245.216.250
1013# REMOTE_PORT 默认 8765
14+ # CANVAS_PORT 默认 8081 (独立 caddy 监听端口)
1115# DEEPSEEK_API_KEY 必填; 写入远端 /etc/know-canvas/llm.env (不进 git)
1216# LLM_BASE_URL 默认 https://api.deepseek.com/v1
1317# LLM_MODEL 默认 deepseek-chat
1418#
1519# 干什么:
1620# 1. 本地 npm run build:canvas
1721# 2. SSH 远端: 检查 / 安装 caddy + node 22
18- # 3. rsync dist/ → /var/www/know-canvas/
19- # 4. rsync server/ → /opt/know-canvas/server/ + npm install --production
22+ # 3. tar dist/ → /var/www/know-canvas/
23+ # 4. tar server/ → /opt/know-canvas/server/ + npm install --production
2024# 5. 写 /etc/know-canvas/llm.env (LLM_API_KEY + base url + model)
21- # 6. 装 systemd unit (yws + llm-proxy), enable + start
22- # 7. 装 Caddyfile, reload caddy
23- # 8. 健康检查 / canvas/ + /canvas /api/llm/health
25+ # 6. 装 systemd unit (yws + llm-proxy + know-canvas-caddy ), enable + start
26+ # 7. 不动主 /etc/caddy/ Caddyfile — 我们跑独立 caddy 实例监听 CANVAS_PORT
27+ # 8. 健康检查 http://host:CANVAS_PORT/ canvas/ + ... /api/llm/health
2428
2529set -euo pipefail
2630
2731REMOTE_USER=" ${REMOTE_USER:- root} "
2832REMOTE_HOST=" ${REMOTE_HOST:- 66.245.216.250} "
2933REMOTE_PORT=" ${REMOTE_PORT:- 8765} "
34+ CANVAS_PORT=" ${CANVAS_PORT:- 8081} "
3035LLM_BASE_URL=" ${LLM_BASE_URL:- https:// api.deepseek.com/ v1} "
3136LLM_MODEL=" ${LLM_MODEL:- deepseek-chat} "
3237
5762# 2. 远端环境探测 + 安装依赖
5863echo " "
5964echo " ==> 2/8 探测远端环境 (caddy / node)"
60- ssh $SSH_OPTS " $REMOTE " ' bash -s' << 'REMOTE_PROBE '
65+ ssh $SSH_OPTS " $REMOTE " " CANVAS_PORT= ${CANVAS_PORT} bash -s" << 'REMOTE_PROBE '
6166set -e
6267echo "[probe] OS: $(. /etc/os-release && echo $PRETTY_NAME)"
6368echo "[probe] uname: $(uname -a)"
69+ echo "[probe] CANVAS_PORT=${CANVAS_PORT}"
6470
6571# Node
6672if ! command -v node >/dev/null 2>&1; then
@@ -85,20 +91,15 @@ if ! command -v caddy >/dev/null 2>&1; then
8591fi
8692echo "[probe] caddy: $(caddy version | head -1)"
8793
88- # UFW 开 80 (公网访问入口 )
94+ # UFW 开独立 caddy 监听端口 (默认 8081 )
8995if command -v ufw >/dev/null 2>&1 && ufw status | grep -q "Status: active"; then
90- ufw allow 80/tcp 2>/dev/null || true
91- ufw allow 443/tcp 2>/dev/null || true
92- fi
93-
94- # rsync (本脚本用 rsync, 远端也得装才能反向同步)
95- if ! command -v rsync >/dev/null 2>&1; then
96- apt install -y rsync
96+ ufw allow ${CANVAS_PORT}/tcp 2>/dev/null || true
9797fi
9898
99- # 准备目录
100- mkdir -p /opt/know-canvas/server /var/www/know-canvas /etc/know-canvas
101- chown -R www-data:www-data /opt/know-canvas /var/www/know-canvas
99+ # 独立 caddy 实例的目录 (跟系统 caddy 完全隔离, 不共享 storage)
100+ mkdir -p /opt/know-canvas/server /opt/know-canvas/caddy-data /var/www/know-canvas /etc/know-canvas
101+ chown -R caddy:caddy /opt/know-canvas/caddy-data 2>/dev/null || true
102+ chown -R www-data:www-data /opt/know-canvas/server /var/www/know-canvas
102103echo "[probe] 目录就绪"
103104REMOTE_PROBE
104105
@@ -136,66 +137,65 @@ chown root:root /etc/know-canvas/llm.env
136137echo '[llm.env] 已写入'
137138"
138139
139- # 6. 装 systemd units
140+ # 6. 装 systemd units (yws + llm-proxy + 独立 caddy 实例)
140141echo " "
141- echo " ==> 6/8 装 systemd unit (yws + llm-proxy)"
142+ echo " ==> 6/8 装 systemd unit (yws + llm-proxy + know-canvas-caddy )"
142143scp -P " $REMOTE_PORT " \
143144 " $PROJECT_ROOT /deploy/know-canvas-yws.service" \
144145 " $PROJECT_ROOT /deploy/know-canvas-llm-proxy.service" \
146+ " $PROJECT_ROOT /deploy/know-canvas-caddy.service" \
147+ " $PROJECT_ROOT /deploy/know-canvas-caddy.Caddyfile" \
145148 " $REMOTE :/tmp/"
146149
147150ssh $SSH_OPTS " $REMOTE " ' set -e
148151mv /tmp/know-canvas-yws.service /etc/systemd/system/
149152mv /tmp/know-canvas-llm-proxy.service /etc/systemd/system/
153+ mv /tmp/know-canvas-caddy.service /etc/systemd/system/
154+ mv /tmp/know-canvas-caddy.Caddyfile /opt/know-canvas/Caddyfile
155+ chown caddy:caddy /opt/know-canvas/Caddyfile 2>/dev/null || true
150156systemctl daemon-reload
151- systemctl enable know-canvas-yws know-canvas-llm-proxy
152- systemctl restart know-canvas-yws know-canvas-llm-proxy
157+ systemctl enable know-canvas-yws know-canvas-llm-proxy know-canvas-caddy
158+ systemctl restart know-canvas-yws know-canvas-llm-proxy know-canvas-caddy
153159sleep 2
154- # is-active / status 在 activating 时返回非零, 用 || true 避免 set -e 早退
155160echo "--- yws ---"
156161systemctl is-active know-canvas-yws || true
157- journalctl -u know-canvas-yws -n 5 --no-pager || true
158162echo "--- llm-proxy ---"
159163systemctl is-active know-canvas-llm-proxy || true
160- journalctl -u know-canvas-llm-proxy -n 5 --no-pager || true
164+ echo "--- know-canvas-caddy ---"
165+ systemctl is-active know-canvas-caddy || true
161166'
162167
163- # 7. 装 Caddyfile
168+ # 7. 推 dist (前端)
164169echo " "
165- echo " ==> 7/8 装 Caddyfile + reload"
166- scp -P " $REMOTE_PORT " " $PROJECT_ROOT /deploy/Caddyfile.newvps" " $REMOTE :/tmp/Caddyfile"
167- ssh $SSH_OPTS " $REMOTE " ' set -e
168- mv /tmp/Caddyfile /etc/caddy/Caddyfile
169- caddy validate --config /etc/caddy/Caddyfile
170- systemctl reload caddy || systemctl restart caddy
171- sleep 1
172- systemctl status caddy --no-pager -l | head -10
173- '
170+ echo " ==> 7/8 推 dist 已在 step 3 完成 (这一步无操作, 跳过)"
174171
175- # 8. 健康检查
172+ # 8. 健康检查 (用独立端口 CANVAS_PORT)
176173echo " "
177- echo " ==> 8/8 健康检查"
178- ssh $SSH_OPTS " $REMOTE " ' set +e
179- echo "--- 本机 yws health ---"
174+ echo " ==> 8/8 健康检查 (端口 ${CANVAS_PORT} )"
175+ ssh $SSH_OPTS " $REMOTE " " CANVAS_PORT=${CANVAS_PORT} bash -s" << 'HEALTHCHECK '
176+ set +e
177+ echo "--- 内部 yws ---"
180178curl -sf http://127.0.0.1:1234/health && echo
181- echo "--- 本机 llm-proxy health ---"
179+ echo "--- 内部 llm-proxy ---"
182180curl -sf http://127.0.0.1:17080/health && echo
183- echo "--- 通过 caddy /canvas/ ---"
184- curl -sI http://127.0.0.1/canvas/ | head -3
185- echo "--- 通过 caddy /canvas/api/llm/health ---"
186- curl -sf http://127.0.0.1/canvas/api/llm/health && echo
187- '
181+ echo "--- 通过独立 caddy /canvas/ ---"
182+ curl -sI http://127.0.0.1:${CANVAS_PORT} /canvas/ | head -3
183+ echo "--- /canvas/api/llm/health ---"
184+ curl -sf http://127.0.0.1:${CANVAS_PORT} /canvas/api/llm/health && echo
185+ HEALTHCHECK
188186
189187echo " "
190188echo " ============================================================"
191189echo " 部署完成。访问:"
192190echo " "
193- echo " http://${REMOTE_HOST} /canvas/"
191+ echo " http://${REMOTE_HOST} :${CANVAS_PORT} /canvas/"
192+ echo " "
193+ echo " (独立 caddy 监听 :${CANVAS_PORT} , 完全跟系统 caddy/Hermes 解耦)"
194194echo " "
195195echo " 排查:"
196196echo " ssh -p ${REMOTE_PORT} ${REMOTE} 'journalctl -u know-canvas-yws -n 50'"
197197echo " ssh -p ${REMOTE_PORT} ${REMOTE} 'journalctl -u know-canvas-llm-proxy -n 50'"
198- echo " ssh -p ${REMOTE_PORT} ${REMOTE} 'journalctl -u caddy -n 50'"
198+ echo " ssh -p ${REMOTE_PORT} ${REMOTE} 'journalctl -u know-canvas- caddy -n 50'"
199199echo " "
200200echo " 更换 API key:"
201201echo " ssh -p ${REMOTE_PORT} ${REMOTE} 'nano /etc/know-canvas/llm.env'"
0 commit comments