部署方案 · 待审核

cloudcli 远程访问部署方案

在 dev 机安装 cloudcli(原 claudecodeui),经自有域名 cc.dzdt.online 安全远程访问其 3001 网页 UI,带独立密码登录。

目标 · cc.dzdt.online 包 · @cloudcli-ai/cloudcli 端口 · 3001(单端口) 生成 · 2026-07-02 11:35
背景

为什么这样做

探索得到的关键事实,直接决定了方案走向:

cloudcli 本身

生产 单端口 3001,前后端合一;HOST 默认 0.0.0.0(装完不改就已对公网裸露)。内置单用户账号密码登录(JWT + bcrypt,存 SQLite),首次访问网页自设管理员密码 —— 你要的"独立密码登录"开箱即用。

dev 机环境

Node v22.14.0(满足);无 nginx/certbot/docker;80/443/3001 空闲;firewalld 未启用;能免密 ssh root 直连香港网关 150.109(已有 nginx+SSL 全套,跑着 pass/search.dzdt.online)。1 核 3.6G。

⚠️最大风险:这不是普通网页

该 UI 内置终端、能执行任意 Claude Code / 命令 —— 等于把 dev 机的 shell 开到网页上。而这台 dev 机恰是"皇冠机":持有到全部 7 台服务器的 SSH 私钥、根 .env所有 API key。登录页一旦被攻破 = 整个 fleet 沦陷。故必须:只绑 127.0.0.1、走隧道不裸露端口、加网关层 Basic-Auth、强 JWT_SECRET、强密码、Claude 工具保持默认全禁用。

架构

推荐架构:经 150.109 反向隧道

🌐 浏览器
你 / 授权用户
HTTPS · cc.dzdt.online
🛡 150.109 香港网关 · nginx
SSL 证书 + Basic-Auth + 限流
proxy_pass → 127.0.0.1:3001(隧道口,仅本机可达)
🔒 autossh 反向隧道
dev ──> 150.109(systemd 保活)
-R 127.0.0.1:3001
⚙️ dev 机 · cloudcli
systemd 常驻,绑 127.0.0.1:3001 不开公网端口

为什么走隧道而非 dev 直接暴露:dev 机不开任何新公网端口,cloudcli 只绑 127.0.0.1;公网入口全部落在已有全套 SSL 基建的 150.109,与 pass/search.dzdt.online 同模式。同时绕开"dev 云厂商安全组是否放行 80/443"这一未知项。

步骤

执行步骤

A

安装并常驻 cloudcli(绑本机)dev 机

  • mkdir -p /home/dev/projects/cloudclinpm i -g @cloudcli-ai/cloudcli
  • 生成强 JWT_SECRETopenssl rand -hex 32),配置:HOST=127.0.0.1SERVER_PORT=3001DATABASE_PATH 固定到本目录便于备份
  • 建 systemd cloudcli.serviceExecStart 用绝对路径 /home/dev/.local/bin/nodeEnvironment= 注入上述变量,Restart=always
  • 验证:ss -tlnp | grep 3001 应仅显示 127.0.0.1:3001
全局装的 cloudcli 从安装目录.env;若实测不读工作目录,则首选用 systemd Environment= 直接注入(更稳妥)。node 绝对路径是 106 踩过的坑。
B

反向隧道 dev → 150.109(autossh 常驻)dev 机

  • 与笔记本 autossh-*-tunnel.service 同模式;无 autossh 则退用 ssh -N -R + ServerAliveInterval 由 systemd 保活
  • 映射到 150.109 的 127.0.0.1:3001(仅其本机 nginx 可达,不对 150.109 公网开放)
  • 复用统一 ed25519 身份密钥;建 cc-tunnel.serviceRestart=always
-R 127.0.0.1:3001:127.0.0.1:3001 root@150.109.98.224
C

nginx vhost + SSL + Basic-Auth150.109

  • 加站点 cc.dzdt.onlineproxy_pass http://127.0.0.1:3001 + WebSocket 升级头(cloudcli 用 WS,必需)
  • 签发 SSL 证书(复用该机既有 certbot / acme.sh / 宝塔机制,与 pass 同法)
  • Basic-Authhtpasswd 口令文件 + nginx auth_basic 保护整站,到 cloudcli 登录页前先过一道密码
  • limit_req 限流 + 安全响应头
宝塔编辑站点会覆盖手动 location,配置后需留意重加(该机既有坑)。
D

DNS 记录你的 DNS 后台

  • 添加 cc.dzdt.online A 记录 → 150.109.98.224(与 pass/search 同机)
  • 由你在服务商后台添加;若托管 Cloudflare 且你提供 API Token,可脚本化添加
需你的服务商后台权限,执行时确认目标 IP 后添加 —— 这是唯一需要你亲自介入的一步。
E

首次使用与收尾

  • 浏览器开 https://cc.dzdt.online → 过 Basic-Auth → cloudcli 引导页设管理员强密码
  • 确认 Claude Code 工具保持默认全禁用,按需最小化开启
  • 记一条 memory 固化架构 / 端口 / 隧道服务名 / 凭据位置
决策

待你审核的决策点

已按推荐默认选定(绿色高亮),你可改。

① 公网暴露架构
经 150.109 反向隧道推荐 · 已选
dev 不开公网端口,复用现有 dzdt SSL 基建,绕开安全组未知项
dev 机直接暴露
需装 nginx+certbot、确认云安全组放行、给皇冠机新增公网面,风险更高
② 鉴权层级
nginx Basic-Auth + 内置密码推荐 · 已选
双重口令,几乎零成本,挡掉对登录页的探测/爆破
再加 IP 白名单
最严,但你出口 IP 变动时要改配置
仅内置密码
最简,但登录页直面公网,风险最高
③ DNS 管理 & 安装形态
cc.dzdt.online → 150.109.98.224
由谁添加记录?(你有面板自加 / 提供 CF Token 我加 / 待查)
全局 npm 安装已选
如你更想"clone 到本目录跑源码"我再调整
验证

端到端验证

  • dev 未裸露ss -tlnp | grep 3001127.0.0.1
  • 隧道活 — 150.109 上 curl 127.0.0.1:3001/api/auth/status
  • 网关鉴权 — 不带口令 curl -I https://cc.dzdt.online 返回 401;带 -u 正确口令返回登录页;证书有效
  • 完整链路 — 浏览器:Basic-Auth → cloudcli 登录 → 能看到 ~/.claude/projects 会话
  • 重启自恢复systemctl restart cloudcli / tunnel 后复测通过