Move 更新记录/Release Notes to the end-of-doc area and place them immediately before 补充说明/Notes in both Chinese and English README files.
9.5 KiB
9.5 KiB
CC-Web
Claude Code 轻量级 Web 远程工具 — 在浏览器中与 Claude Code CLI 交互。
Vibe产物,readme比较絮叨,建议直接丢给CC,拷打一番就好。
一键部署:claude
https://github.com/ZgDaniel/cc-web 给我装!
功能特性
- 超轻量 — 后端性能占用少,前端通过web访问,不易被杀后台
- 多会话管理 — 创建、切换、重命名、删除会话,自动保存历史
- 会话续接 — 基于
--resume实现跨消息上下文保持,也可通过SSH使用tmux attach -t claude命令加入会话 - 后台任务 — 关闭浏览器后 Claude 进程继续运行,完成后推送通知
- 多渠道通知 — 支持 PushPlus / Telegram / Server酱 / 飞书机器人 / QQ(Qmsg),Web UI 内可视化配置
- 进程持久化 — detached 进程 + PID 文件,服务重启不丢失运行中的任务
- 移动端适配 — 响应式布局,支持 PWA 通知
- 密码认证 — 自动生成初始密码、首次登录强制改密、Web UI 修改密码
前提条件
- Node.js >= 18
- Claude Code CLI 已安装并配置(
claude命令可用)npm install -g @anthropic-ai/claude-code
快速开始
Linux / macOS
git clone https://github.com/ZgDaniel/cc-web.git
cd cc-web
npm install
cp .env.example .env # 可选,不设密码则首次启动自动生成
npm start
Windows
git clone https://github.com/ZgDaniel/cc-web.git
cd cc-web
npm install
copy .env.example .env & REM 可选
然后双击 start.bat,或在终端运行 node server.js。
启动后访问 http://localhost:8002,输入密码即可使用。
配置
环境变量 (.env)
| 变量 | 必填 | 默认值 | 说明 |
|---|---|---|---|
CC_WEB_PASSWORD |
否 | 自动生成 | Web 登录密码(首次启动自动迁移到 config/auth.json) |
PORT |
否 | 8002 |
服务监听端口 |
CLAUDE_PATH |
否 | claude |
Claude CLI 可执行文件路径 |
PUSHPLUS_TOKEN |
否 | - | PushPlus Token(首次启动自动迁移到通知配置) |
通知配置
点击侧边栏底部的 ⚙ 设置按钮,在 Web UI 中可视化配置推送通知:
| 通知方式 | 所需配置 | 获取方式 |
|---|---|---|
| PushPlus(微信推送) | Token | pushplus.plus 注册获取 |
| Telegram | Bot Token + Chat ID | @BotFather 创建机器人 |
| Server酱 | SendKey | sct.ftqq.com 注册获取 |
| 飞书机器人 | Webhook URL | 飞书群 → 设置 → 群机器人 → 添加自定义机器人 |
| QQ(Qmsg) | Qmsg Key | qmsg.zendee.cn 登录后获取,需添加接收 QQ 号 |
配置保存在 config/notify.json,Token 在 UI 中脱敏显示(仅显示前4后4位)。
密码管理
密码存储在 config/auth.json,支持自动生成与 Web UI 修改:
- 首次启动(无
.env密码、无auth.json):自动生成 12 位随机密码,打印到控制台,首次登录强制修改 - 从
.env迁移:如已在.env设置CC_WEB_PASSWORD,启动时自动迁移到auth.json,无需改密 - Web UI 修改:设置面板 → 修改密码(需输入当前密码)
- 密码要求:≥ 8 位,包含大写/小写/数字/特殊字符中的至少 2 种
- 改密后:所有已登录会话失效,需重新认证
项目结构
cc-web/
├── server.js # Node.js 后端(HTTP + WebSocket + 进程管理 + 通知)
├── public/
│ ├── index.html # 页面结构
│ ├── app.js # 前端逻辑(WebSocket 通信、UI 交互)
│ ├── style.css # 样式(和风暖色调主题)
│ └── sw.js # Service Worker(移动端推送通知)
├── config/
│ ├── notify.json # 通知渠道配置(运行时生成)
│ └── auth.json # 密码配置(运行时生成)
├── sessions/ # 对话历史 JSON 文件(运行时生成)
├── logs/ # 进程生命周期日志(运行时生成)
├── .env.example # 环境变量模板
├── start.bat # Windows 一键启动脚本
├── .gitignore
├── package.json
└── README.md
架构设计
进程模型
浏览器 ←WebSocket→ Node.js (server.js) ←文件I/O→ Claude CLI (detached)
- 每条用户消息 spawn 一个
claude -p --output-format stream-json子进程 - 进程使用
detached: true+proc.unref(),独立于 Node.js 生命周期 - stdin/stdout/stderr 通过文件传递(
sessions/{id}-run/),不使用 pipe - PID 持久化到文件,服务重启后自动恢复(
recoverProcesses()) - 使用
FileTailer实时监听输出文件变化,流式推送给前端
后台任务流程
- 用户发送消息 → spawn Claude 进程
- 用户关闭浏览器 → 进程继续运行(detached)
- 进程完成 → PID 监控检测到退出
- 发送推送通知(PushPlus/Telegram/...)
- 用户重新打开 → 自动同步完成的回复
进程日志
日志文件 logs/process.log(JSONL 格式,自动轮转 2MB),记录完整的进程生命周期:
| 事件 | 说明 |
|---|---|
process_spawn |
进程创建(PID、模式、模型) |
process_complete |
进程完成(退出码、耗时、费用) |
ws_connect / ws_disconnect |
客户端连接/断开 |
ws_resume_attach |
客户端重连并挂载到运行中的进程 |
recovery_alive / recovery_dead |
服务重启时恢复进程 |
heartbeat |
每 60 秒活跃进程状态快照 |
查看日志:
tail -f logs/process.log | jq .
生产部署
systemd 服务
创建 /etc/systemd/system/cc-web.service:
[Unit]
Description=CC-Web - Claude Code Web Chat UI
After=network.target
[Service]
Type=simple
User=your-user
WorkingDirectory=/path/to/cc-web
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=5
# 重要:只杀 Node.js 进程,不杀 Claude 子进程
KillMode=process
[Install]
WantedBy=multi-user.target
KillMode=process非常重要:确保 systemd 重启服务时只杀 Node.js 进程,Claude 子进程继续运行,服务恢复后自动重新挂载。
sudo systemctl enable cc-web
sudo systemctl start cc-web
Nginx 反向代理
server {
listen 443 ssl;
server_name your-domain.com;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8002;
proxy_http_version 1.1;
# WebSocket 支持
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 长连接超时(Claude 任务可能运行较久)
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
Windows 部署
适用于在个人电脑上运行 CC-Web,通过手机远程控制 Claude Code。
启动方式:双击 start.bat,或在终端运行:
cd cc-web
npm install
node server.js
局域网访问(手机和电脑在同一 WiFi):
- 直接访问
http://电脑局域网IP:8002
远程访问(外出时用手机控制家里电脑):
- 推荐使用 Tailscale — 电脑和手机各安装一个,自动组网,免费够用
- 或使用 Cloudflare Tunnel(需域名)
更新记录
- v1.2.2
- 对齐 Claude Code 原生上下文压缩策略:
/compact改为真实下发到 CLI 执行,不再使用本地会话伪重置。 - 补齐超限自动恢复链路:当出现
Request too large (max 20MB)时,自动执行/compact并在压缩后自动重放上一条失败请求继续运行。 - 增加自动续跑保护:若压缩后仍超限,停止自动重试并提示用户手动缩小输入范围,避免死循环。
- 对齐 Claude Code 原生上下文压缩策略:
- v1.2.1
- 修复
AskUserQuestion交互选项在 Web 端不显示的问题:后端保留完整结构化参数并前端按问题/选项渲染。 - 新增交互选项快捷填充:点击选项即可把对应答案插入输入框,便于快速确认并发送。
- 修复
- v1.2
- 修复消息中包含代码块时可能触发的页面横向溢出问题:窗口不再被长代码撑宽,代码块可在块内横向滚动。
- 优化移动端输入体验:手机浏览器回车键默认换行,不再直接发送消息;消息发送改为手动点击发送按钮。
- v1.1
- 增加 Windows 环境下 Claude Code CLI 的兼容支持,完善本地部署与启动体验。
补充说明
- 暂时只支持 Claude Code,后续再 vibe codex