在 dev 机安装 cloudcli(原 claudecodeui),经自有域名 cc.dzdt.online 安全远程访问其 3001 网页 UI,带独立密码登录。
探索得到的关键事实,直接决定了方案走向:
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 工具保持默认全禁用。
为什么走隧道而非 dev 直接暴露:dev 机不开任何新公网端口,cloudcli 只绑 127.0.0.1;公网入口全部落在已有全套 SSL 基建的 150.109,与 pass/search.dzdt.online 同模式。同时绕开"dev 云厂商安全组是否放行 80/443"这一未知项。
mkdir -p /home/dev/projects/cloudcli;npm i -g @cloudcli-ai/cloudcliJWT_SECRET(openssl rand -hex 32),配置:HOST=127.0.0.1、SERVER_PORT=3001、DATABASE_PATH 固定到本目录便于备份cloudcli.service:ExecStart 用绝对路径 /home/dev/.local/bin/node,Environment= 注入上述变量,Restart=alwaysss -tlnp | grep 3001 应仅显示 127.0.0.1:3001.env;若实测不读工作目录,则首选用 systemd Environment= 直接注入(更稳妥)。node 绝对路径是 106 踩过的坑。autossh-*-tunnel.service 同模式;无 autossh 则退用 ssh -N -R + ServerAliveInterval 由 systemd 保活cc-tunnel.service(Restart=always)-R 127.0.0.1:3001:127.0.0.1:3001 root@150.109.98.224
cc.dzdt.online:proxy_pass http://127.0.0.1:3001 + WebSocket 升级头(cloudcli 用 WS,必需)htpasswd 口令文件 + nginx auth_basic 保护整站,到 cloudcli 登录页前先过一道密码limit_req 限流 + 安全响应头cc.dzdt.online A 记录 → 150.109.98.224(与 pass/search 同机)https://cc.dzdt.online → 过 Basic-Auth → cloudcli 引导页设管理员强密码已按推荐默认选定(绿色高亮),你可改。
ss -tlnp | grep 3001 仅 127.0.0.1curl 127.0.0.1:3001/api/auth/status 通curl -I https://cc.dzdt.online 返回 401;带 -u 正确口令返回登录页;证书有效~/.claude/projects 会话systemctl restart cloudcli / tunnel 后复测通过