Gloridust and Claude Opus 4.8
f5e5bb5bcb
fix(watchdog): VNC 响应性探测默认关闭,可用 env 重新开启
...
实测健康实例 VNC 探测 ~1ms 响应;但宿主级 CPU/IO 偶发争用(如同机重 docker build)
会让 8s 探测超时被误判为 stall,从而重启正常实例(用户反馈"浏览器经常重启")。
- 新增 WOC_WATCHDOG_HEALTH_FAILS(默认 0=关闭该探测);正整数 N = 连续 N 次无响应才重启。
- 内存阈值自愈(soft/hard)不受影响,照常工作。
- .env.example 补充说明。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
v1.2.1
2026-06-15 03:53:59 +08:00
Gloridust and Claude Opus 4.8
0811d463e8
style(panel): 诊断/关于 改为扁平区块,修按钮断行与缺失的 chip 类
...
这两个区块各自只有单一内容,卡片外框显得厚重;按钮作为 flex 项被压窄导致
"导出诊断包(.tar.gz)" / "查看面板日志" 在按钮内断行。
- 去掉 inst-card 卡片外框,改为扁平 settings-block:标题下直接排描述/控件/操作。
- 主按钮 s-btn 固定内边距 + white-space:nowrap + flex:none,不再被压窄断行;
次要操作(查看面板日志 / 检查更新 / 发布日志)改 btn-text 文字链接,narrow 下自然换行。
- 修复:时间范围 chip 漏了 .chip 基类(只有 .chip-toggle 无内边距/圆角),补回 'chip chip-toggle'。
- 「导出诊断包(.tar.gz)」按钮文案精简为「导出诊断包」,格式说明移到脚注。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-15 01:33:20 +08:00
Gloridust and Claude Opus 4.8
d42d401f89
chore(docker): Chromium 关闭后台 phone-home(--disable-background-networking)
...
Chromium 在受限网络(NAS/被墙)下后台不断尝试连 Google 推送(GCM)/组件更新/变体下载
并失败,刷屏 "gcm ConnectionHandler failed net error: -2" 等。加 --disable-background-networking
关掉这些后台流量。
仅影响后台 phone-home,不影响前台网页加载与真实网络错误提示(已验证 Chromium 正常启动、
前台浏览不受影响)。属安全的标准容器化 Chromium 用法。
注:日志里的 gcm/dbus 噪声本就无害,从来不是黑屏/重启的原因;此 flag 主要是减少受限网络下
的无谓后台请求。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-15 01:03:42 +08:00
Gloridust and Claude Opus 4.8
9929a72be1
feat(panel): 全局日志系统 + 一键诊断包导出
...
单实例「日志」只记录该实例日志,无从排查跨实例/容器层面的问题(首个实例创建卡死、
打开实例黑屏不可用、升级失败等)。新增面板级全局日志 + 一键诊断包:
- logs.ts(新):统一持久化日志(面板数据卷,跨重建保留)。实例日志原语从 docker.ts
迁来;新增 appendPanelLog/readPanelLog、按时间裁剪 filterSince、一年保留 pruneOldLogs、
时间范围 24h/7d/30d/1y。无 docker 依赖避免循环。
- 仪表化:实例创建(含镜像拉取前后,定位首次拉取卡死)、删除、启停、重启、升级、
应用安装/更新、看门狗自愈 均写入面板全局日志(同时回显 stdout)。
- docker.ts buildDiagnostics:打包 system.txt(Docker/镜像/系统)+ panel.log +
instances/<id>.log(容器状态 inspect + 持久日志 + 实时日志)+ containers.txt(全部
woc-* 容器清单,含残留),手搓多文件 tar.gz(沿用既有无依赖 tar 风格)。
- 路由:GET /api/admin/diagnostics?range=(导出 tar.gz)、GET /api/admin/panel-log?range=;
启动 + 每 24h 跑 pruneOldLogs。
- 前端:管理页「诊断与日志」区——时间范围(24h默认/7d/30d/1y) + 导出诊断包 + 查看面板日志。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-15 00:48:36 +08:00
Gloridust and Claude Opus 4.8
0abb5f8bdf
fix(panel): 开发版构建的版本展示,不再误标「已是最新」
...
本地/未发布构建(dev / dev-<sha>)无法与发布版做语义化比较,之前会错误显示
「· 已是最新」。现在:
- 「关于」卡:当前版本非 vX.Y.Z 时标「开发版」,仅把最新发布版作为信息展示
(当前版本 dev-xxx · 最新发布 v1.2.0),不显示「已是最新」、不触发红点。
- build-local.sh 默认烤入 dev-<短SHA>(而非裸 dev),便于辨识本地构建。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-15 00:35:30 +08:00
Gloridust and Claude Opus 4.8
7293285d1a
feat(panel): 显示构建版本号 + 自动检测新版(Docker Hub/GHCR 红点)
...
管理界面此前看不到面板版本,也无从知道有没有新版可升。现在:
- 构建时把版本号烤进面板镜像:Dockerfile 新增 ARG/ENV WOC_VERSION(放末尾不
破坏依赖缓存);release.yml 用 git tag 注入(vX.Y.Z,手动触发为 dev-<sha>),
仅面板镜像消费;build-local.sh 支持 --build-arg(默认 dev)。
- 后端 version.ts:best-effort 查询 Docker Hub 与 GHCR 上 woc-panel 的语义化
标签取最大值,与当前版本比对;启动后 4s 首检 + 每 6h 复检 + 接口惰性触发,
失败静默(离线/被墙/私有源不报错、不显红点)。命名空间从 WOC_WECHAT_IMAGE 推断。
- 接口:GET /api/version(任意登录用户读缓存)、POST /api/admin/version/check
(管理员手动重查)。
- 前端:管理页「关于」卡显示当前版本/最新版/升级提示/检查更新/发布日志链接;
侧栏「管理」入口在有新版时点红点(仅管理员)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-14 22:40:17 +08:00
Gloridust and Claude Opus 4.8
8cf15923a6
docs(readme): 写入浏览器实例支持 + 精简整理
...
v1.2.0 起云微是多应用平台(微信 + Chromium 浏览器),README 仍是纯微信
视角,补齐并整理:
- 新增「浏览器实例(登录网页版社媒)」章节:Chromium 随镜像就绪、登录态
写入数据卷常驻、多端共享、中文输入/文件/剪贴板共用一套;顶部导航加锚点。
- 标题/简介/一句话原理/核心特性/快速开始步骤/「面板能做什么」表 全部从
「微信」泛化为「实例(微信 / 浏览器)」;新建按钮文案对齐为「新建实例」。
- 精简冗杂:合并过长的「为什么默认 Docker Hub」blockquote 为一行。
- 资源占用补充浏览器实例量级说明;安全须知覆盖社媒账号;
路线图标记多应用平台完成、日志改为「持久化(跨容器重建保留)」。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-14 22:01:37 +08:00
Gloridust and Claude Opus 4.8
2e201ff058
feat(panel): 持久化实例日志,跨容器重建保留
...
实例容器日志随重建(重启/升级/看门狗自愈)即丢失,用户看不到"上次为何
重启/崩溃"(浏览器实例常因内存触顶被看门狗重启)。现把生命周期事件 + 重启
原因 + 重建前的容器日志快照,追加到面板数据卷 /data/logs/<id>.log,跨重建保留。
- docker.ts: appendInstanceLog/readInstanceLog/snapshotContainerLog/deleteInstanceLog;
日志目录与 accounts.json 同卷(宿主 ./data-panel 持久化),单实例上限 ~400KB
超限截半保留最近;id 十六进制校验防路径注入。
- runInstance 删旧容器前先快照其最后日志、启动后记"容器已启动";
stopInstance 记"容器已停止";removeInstance 彻底删除时清理日志文件。
- 看门狗 recover() 写入自愈原因(hard/soft/health + 内存明细)。
- 日志接口返回「持久化历史 + 本次容器实时日志」两段。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-14 21:53:11 +08:00
Gloridust and Claude Opus 4.8
167a80a0c3
feat(ci/telegram): issue 新回复也推送(简短)
...
telegram-notify 增订阅 issue_comment(created),tg-notify.mjs 加 issue_comment 分支:
💬 Issue #N 新回复 · 标题 / 评论人 / 评论摘要(≤400字) / 链接。PR 的评论也走此事件,按 C_PR 跳过;
回复通知不置顶(置顶仍仅限 release)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
v1.2.0
2026-06-14 21:25:14 +08:00
Gloridust and Claude Opus 4.8
1c230316ed
feat(v1.2.0): 自定义实例图标——内置精选 + 上传裁剪
...
- AppIcon:内置精选平台图标(微信/Chromium/Telegram/小红书/抖音/B站/微博/知乎/YouTube/通用)+ ICON_CHOICES。
- 编辑器(管理菜单「图标」):选内置图标 / 上传图片用 react-easy-crop 方形裁剪→128px PNG / 恢复默认。
- 后端 setInstanceIcon + /api/admin/instances/:id/icon(仅 admin;icon=builtin:<key>/data:图片/空,限 ~225KB)。
- 新增依赖 react-easy-crop。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 19:41:40 +08:00
Gloridust and Claude Opus 4.8
1ffc6d7e1d
feat(v1.2.0): 实例头像由首字母改为按应用类型的图标(自定义图标铺底)
...
新增 AppIcon.tsx(InstanceIcon + 内置 SVG 图标:微信/Chromium/Telegram/通用),侧栏与主页
卡片头像改用它(按 appType 出默认图标;data: 图片 / builtin:<key> 优先)。
新增 Instance.icon 字段 + publicInstance 下发,为「自定义图标(内置选择 + 上传裁剪)」铺底。
侧栏/主页标题「微信实例」→「实例」,主页副文案按应用名泛化。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 19:01:03 +08:00
Gloridust and Claude Opus 4.8
7c9eb82a6f
fix(v1.2.0): 旧容器无 app-ctl.sh 时回退 wechat-ctl.sh(修微信实例误报未安装)
...
多应用分发对所有实例调 /woc/app-ctl.sh,但升级前的旧容器镜像里没有该脚本 → exec 失败 →
wechatStatus 兜底成"未安装",已装微信的老实例全变"待安装"。triggerWechat/wechatStatus 改为
bash -c:有 app-ctl.sh 则按 appType 分发,无则回退老的 wechat-ctl.sh(旧实例皆微信)。
老实例不升级也能正常显示/操作;升级到多应用镜像后自动走 app-ctl 分发。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 18:52:08 +08:00
Gloridust and Claude Opus 4.8
b954f38c15
fix(v1.2.0): wechatStatus 改走 app-ctl <appType>(之前被 iCloud 回退)
...
b7fd778 提交时这行被本机 iCloud 回退成 wechat-ctl.sh status,导致非微信实例(Chromium)
状态去查微信二进制 → 永远「尚未安装」,且 Chromium 无安装按钮 → 卡死。改回 app-ctl.sh
<appType> status:Chromium 即报已就绪、可直接进入。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 18:46:42 +08:00
Gloridust and Claude Opus 4.8
1da52bfb96
feat(v1.2.0): UI 按应用类型泛化(不再到处写死「微信」)
...
新增 APP_PROFILES(label/needsInstall/enterHint/updateLabel)+ appProfile()。
- 实例卡片:状态副文案、"进入实例"提示、安装/更新按钮均按 appType 显示;Chromium 已烤进镜像
(needsInstall=false)故不显示"下载安装/更新",状态直接"已就绪"。
- 桌面页:连接提示语用 enterHint(微信=扫码登录,Chromium=直接使用);安装中/未安装提示、iframe
标题、文件传输/剪贴板/输入条文案改为应用名或通用"应用/桌面"。
- 列表区"微信实例"→"实例"、空状态泛化。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 18:19:03 +08:00
Gloridust and Claude Opus 4.8
179f5cf7a1
fix(v1.2.0): 重新落实选择器为 微信+Chromium(上个提交被 iCloud 回退)
...
eabedde 提交时 APP_OPTIONS 被本机 iCloud 冲突副本回退成旧版(telegram 可选、chromium 禁用)。
此处重新落实:微信(默认) + 浏览器(Chromium) 可用,自定义「即将支持」禁用,去掉 Telegram。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 17:47:30 +08:00
Gloridust and Claude Opus 4.8
eabedde26b
feat(v1.2.0): 改为「微信 + Chromium 浏览器」,Telegram/自定义暂缓
...
Telegram 仅 x86_64,暂不做(代码留休眠)。聚焦多架构通用的 Chromium:
- Dockerfile apt 装 chromium(Debian Bookworm,amd64/arm64 均有;本地 arm64 实测装成、
chromium --version 正常,镜像 +~0.5GB)。Chromium 随镜像就绪,autostart 直接以
--no-sandbox 软件渲染拉起,无需「下载安装」。
- 新建实例选择器:微信(默认) + 浏览器(Chromium) 可用;自定义标「即将支持」禁用;去掉 Telegram。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 17:46:09 +08:00
Gloridust and Claude Opus 4.8
b7fd778ab1
feat(v1.2.0): 多应用平台——创建实例时选 微信/Telegram(+Chromium/自定义占位)
...
镜像层(向后兼容,微信路径零改动):
- app-defs.sh:按 appType 给出 APP_BIN/APP_LAUNCH/APP_NAME(缺省回退微信)。
- app-ctl.sh:通用安装/状态分发;wechat 委托回 wechat-ctl.sh;telegram 下载官方 portable tar.xz。
- autostart:读 /config/.woc-app 选择启动哪个应用,读不到回退微信(老实例零改动)。
- 02-woc-app 钩子:把容器环境 WOC_APP_TYPE 落到 /config/.woc-app(缺则不写→回退微信)。
- Dockerfile:加 xz-utils(telegram 解压)+ COPY 新脚本。
后端:envList 透传 WOC_APP_TYPE(+自定义启动命令);triggerWechat/wechatStatus 改走
app-ctl.sh <appType>(微信行为不变);创建实例路由接受 appType。
前端:新建实例对话框加「应用类型」选择器(微信默认 / Telegram;Chromium、自定义标记"即将支持"禁用)。
本轮 Telegram(x86_64) 端到端可用;Chromium(待 apt 烤镜像) 与 自定义(待上传流) 下一轮。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 17:38:15 +08:00
Gloridust
11c5406d0f
Merge branch 'main' into feat/v1.2.0-multi-app
2026-06-14 17:19:41 +08:00
Gloridust and Claude Opus 4.8
13ec0bdf8f
fix(desktop): 输入模式切换改为整页重载,修卡死 + 切换不生效
...
切换模式时原先 bump vncNonce 在页内重挂 iframe,会让新旧两条 VNC ws 短暂并存,
概率性把实例 Xvnc 卡死(需重启容器恢复、面板重启无效),且新连接常读不到新 enable_ime
(仍是英文)。改为 window.location.reload():先卸载旧页彻底关旧 ws,再以新模式干净重连,
正是用户实测唯一可靠的方式。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
v1.1.11
2026-06-14 17:08:00 +08:00
Gloridust and Claude Opus 4.8
659d26ce68
fix(docker): typeInInstance 卡 ~2s 根因——xclip 未重定向 fd
...
xclip -i 会 daemon 化常驻持有剪贴板选区,并继承 docker exec 的 stdout/stderr,
导致 exec 要等这俩 fd 关闭、每次中文转发卡 ~2.1s。给 xclip 重定向 >/dev/null 2>&1
后整条链路降到 ~0.08s(实测 26× 提速)。中文输入条与无感模式都受益。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 16:57:33 +08:00
Gloridust and Claude Opus 4.8
dfaa64ad39
fix(desktop): 修无感输入两处 bug(切换不生效 + "你好y呀"丢字)
...
1) 切到无感后当前会话仍是旧 enable_ime → 表现"还是打英文,要换页才行"。
setMode 现同步写 enable_ime 并 bump vncNonce 重挂 iframe,让 noVNC 立即按新模式重连。
2) "你好[空格]呀"打出"你好y呀":有序队列在中文转发期间会把下一个词的拼音首字母(y)当字面字符抢走。
改为队列活跃时只接管【数字】(原"混数字丢字"的祸首) + 回车/退格;字母绝不接管,交给输入法合成。
附带消除了之前"每个键都走 xdotool"导致的卡顿(字母回到原生合成快路径)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 16:48:59 +08:00
Gloridust and Claude Opus 4.8
2edba455dc
feat(v1.2.0): 实例 appType 数据模型地基(向后兼容)
...
引入 AppType(wechat/telegram/chromium/custom)+ APP_LABELS + instanceAppType() 兜底。
Instance 增 appType?(可选) 与 customLaunch?;createInstance 接受 appType(默认 wechat)、
按应用取默认名;publicInstance 下发 appType(老实例无字段→回退 wechat)。
纯增量、不改现有运行行为;为后续 autostart 分发 / 各应用安装 / 前端选择器铺底。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 15:37:53 +08:00
Gloridust and Claude Opus 4.8
8ab5375ded
feat(desktop): 输入法双模式切换(无感 / 转发)+ 深度修复无感丢字
...
nav 栏可切「无感输入」(直接在微信里打中文)/「转发输入」(底部输入条,默认),偏好持久化。
无感:enable_ime=true,compositionend 捕获中文经 xdotool 转发;并用有序队列把"转发未完成期间"
的后续可见字符 + 回车/退格串行送出,彻底消除"中文走异步、数字走 keysym 抢跑"的"你好123→23"丢字;
队列空闲不干预,英文/数字仍走原生 keysym 零延迟。新增 /api/instances/:id/key(xdotool 单键)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 15:15:05 +08:00
Gloridust and Claude Opus 4.8
0ccbaa3a35
feat(admin): 实例「管理」菜单改为悬浮图层展开
...
绝对定位悬浮层(从按钮下方浮出),不再撑高卡片/顶走下方内容;展开时卡片 overflow:visible
+ z-index:5(盖住下方/同列卡片,仍低于弹窗);加点击外部 / 点击菜单项自动关闭。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 15:15:05 +08:00
Gloridust and Claude Opus 4.8
3c9c30fcb4
chore(docker): 00-woc-identity 也用显式 chmod 755(补齐 #17)
...
PR #17 把脚本权限改为显式 755/644 以摆脱构建机 umask 影响,但它之后才加的
00-woc-identity 钩子仍是 chmod +x,是唯一漏网。该钩子由 root 运行(711 也能跑、
非功能性问题),此处仅为与其余几行统一、彻底做到与 umask 无关。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 01:17:36 +08:00
Ethan Zou and GitHub
35bc9c4435
Merge pull request #17 from mkblbj/codex/fix-script-permissions
...
Fix Docker script permissions
2026-06-14 01:15:10 +08:00
Gloridust and Claude Opus 4.8
13568a83b7
docs(readme): 备注 NAS/飞牛首次建实例镜像拉取超时的解法
...
NAS 自带的 Docker Hub 加速通常只覆盖界面手动拉取,不覆盖面板经 docker.sock 触发的拉取,
导致首次新建实例直连 registry-1.docker.io 超时。README 快速开始加提示:先手动拉一次
gloridust/wechat-on-cloud:latest(本地有了面板就复用不再联网),或配守护进程镜像加速 /
换 WOC_IMAGE_PREFIX 到国内源。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-14 00:03:16 +08:00
Gloridust and Claude Opus 4.8
9f8ca8cdb0
docs(readme): 方式B 改为仅凭 docker-compose.yml 部署,无需 clone 仓库
...
compose 用 image: 拉官方镜像、数据落到旁边自动建的 ./data-panel,不依赖仓库其它文件
(已在空目录验证 docker compose config 通过)。方式B 改为:命令行 curl 单文件 / 飞牛(fnOS)·
群晖等 NAS 直接粘贴 docker-compose.yml 到 Compose 一键部署界面;并说明改密码/端口/镜像源
可用 .env 或 NAS 环境变量,无需 clone。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-13 23:22:15 +08:00
Gloridust and Claude Opus 4.8
ac7389e75f
feat(ci/telegram): 发布通知自动置顶 + 取消上一个 release 的置顶
...
tg-notify.mjs:release/手动触发发完消息后,用 getChat 读群当前置顶(=上一个 release),
pinChatMessage 置顶新消息(静音,避免二次提醒)、unpinChatMessage 取消旧的——无需持久化存储。
issue 通知不置顶;置顶失败(机器人非管理员/无置顶权限)仅跳过、不影响通知本身。
文档补充:需把机器人设为群管理员并开启「置顶消息」权限。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-13 23:19:14 +08:00
Gloridust and Claude Opus 4.8
0417cd029f
chore: 默认镜像源切到 Docker Hub,GHCR 作为备用
...
Docker Hub 国内/国际通用、免登录拉公开镜像,飞牛OS(fnOS) 等 NAS 还内置拉取加速,
通常比 GHCR 更快更稳。docker-compose.yml 两处 :- 兜底默认与 .env.example 默认值
由 ghcr.io/gloridust 改为 docker.io/gloridust;GHCR / 南大反代 / 阿里云等列为备用源。
README 快速开始措辞同步更新。镜像仍同时发布到两个 registry,未改 CI。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-13 23:14:56 +08:00
Gloridust and Claude Opus 4.8
b55af7c319
docs(readme): 增加 Docker Hub 镜像源切换说明(飞牛OS 等 NAS 有加速)
...
官方镜像已同步发布到 Docker Hub(公开、多架构)。README 快速开始补充:
ghcr.io 拉不动时在 .env 设 WOC_IMAGE_PREFIX=docker.io/gloridust 切到 Docker Hub;
飞牛 OS(fnOS) 等 NAS 内置 Docker Hub 拉取加速,通常更快更稳。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-13 23:09:43 +08:00
Gloridust and Claude Opus 4.8
494313b6c3
fix(panel): 修复 VolumeManager 漏闭合的 .vol-sec 标签致构建失败
...
a42006e 把第 1259 行的 </div> 误回退成 </>,与 <div className="vol-sec"> 不匹配,
导致 vite/esbuild 构建报 "Unexpected closing fragment tag" → main 上 panel 镜像构建失败
(v1.1.10 标签镜像本身是好的,从 1c34777 构建)。改回 </div>。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-13 23:02:38 +08:00
Gloridust
a42006e6f2
Update Admin.tsx
2026-06-13 22:12:51 +08:00
Gloridust and Claude Opus 4.8
1c34777353
feat(panel): 管理员数据卷管理(整卷备份/恢复 + 文件浏览器)
...
管理页 → 实例「管理」→ 数据卷(仅 admin)。解决大量用户"把 PC 微信数据迁移上 docker"的诉求。
- 整卷备份:流式打包 /config 为 .tar.gz 下载(大文件不入内存);恢复:上传覆盖回 /config。
machine-id 存在卷内随包迁移 → 跨 woc 实例恢复可保留聊天记录。
- 文件浏览器:浏览/上传/上传并解压(.tar/.tar.gz)/下载/改名/移动/删除;PC 数据打包上传解压后重启实例。
- 全程在运行中的实例上操作(exec + docker cp,运行容器才可 exec);恢复为全量覆盖,强提示并建议重启。
- 安全:仅 admin;路径严格限制在 /config、禁止 .. 穿越;上传落地为 abc 属主。
- docker.ts 抽出 extractSingleFileFromTar 复用(PAX 头跳过),新增 list/mkdir/move/delete/upload/
extract/download/backup(stream)/restore;index.ts 加 9 个 /volume 管理路由;前端 VolumeManager 弹窗
+ 线性 SVG 图标(替代渲染不一致的 emoji);新增 doc/数据卷管理.md。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
v1.1.10
2026-06-13 22:01:41 +08:00
Gloridust and Claude Opus 4.8
8ac0016398
ci(telegram): render release/issue notes as Telegram HTML (not raw markdown)
...
GitHub-Flavored Markdown ≠ Telegram MarkdownV2, so the old plain-text send
showed literal ## ** | etc. New .github/scripts/tg-notify.mjs converts GFM
→ Telegram-safe HTML (<b>/<i>/<code>/<pre>/<a>; headers→bold, tables→· rows,
lists→•, quotes→▎), escapes <>&, and falls back to plain text if Telegram
rejects the HTML. Adds workflow_dispatch to telegram-notify so you can send
the latest release rendered for testing without cutting a new release.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-13 00:41:54 +08:00
Gloridust and Claude Opus 4.8
54ed841a68
feat(admin/ci): 管理页折叠菜单 + 空状态/主页优化 + Telegram 命令机器人
...
管理页 UI/UX
- 实例卡片操作改为「管理」分类折叠菜单(默认收起,点开按 运维/设置/危险 分组的
文字操作),替代之前难辨认的图标排;删除单独成组、红色,降低误点
- 修复展开一张卡片时同行其它卡片被 grid 拉等高(inst-grid align-items:start)
- 管理页空状态(无实例/无子账号)改为图标+标题+说明+引导按钮
- 主页实例卡片加副行(状态·微信版本)、悬停上浮高亮
Telegram 命令机器人(轮询版,纯 GitHub Actions,无服务器)
- .github/workflows/telegram-bot.yml + scripts/telegram-bot.mjs
- 私聊/群组命令:/help /releases /release <tag> /issues /issue <编号>
- cron 每 5 分钟 getUpdates,处理后用 offset 向 Telegram 确认,无需持久化存储
- 受 vars.TELEGRAM_BOT_ENABLED 开关;命令非实时(cron 限制),文档已说明
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
v1.1.9
2026-06-13 00:29:02 +08:00
Gloridust and Claude Opus 4.8
a24977dd1f
ci: Telegram notify on release / new issue (serverless via Actions)
...
New .github/workflows/telegram-notify.yml: on release published or issue
opened, send a message to a Telegram group via @WechatOnCloudBot. Runs on
GitHub Actions (no server). Gated on vars.TELEGRAM_CHAT_ID so unconfigured
forks skip safely. Arbitrary text passed via env (no script injection),
sent as plain text with --data-urlencode (no markdown parse breakage).
Setup documented in doc/发布到GHCR.md.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-12 23:45:03 +08:00
Gloridust and Claude Opus 4.8
38846b6429
feat: 中文输入条 + 文件下载/另存修复 + 卡连接自愈 + CF/MAC/音频
...
中文输入(彻底改造,弃用脆弱的 VNC IME 拦截)
- 关闭 KasmVNC enable_ime:VNC 直接打字回归纯 keysym,英文/数字正常、不再损坏
- 新增底部「中文输入条」:面板真实 textarea 原生输入法 → POST /type → 容器内 xclip+xdotool
粘贴进微信,可靠且与浏览器/输入法无关。flex 列布局(nav/画面/输入条三者并列不遮挡),
牛奶布艺主题配色,可一键收起。
稳定性 / 自愈
- watchdog 新增响应性探测:实例 I/O/服务 stall(进程在、显示在线但读不出 VNC 文件、永远"正在
连接桌面")时,连续 2 次无响应即自动重启自愈
- 前端 12s 未加载出来 → 「桌面无响应」+ 重新连接/重启,不再无限转圈
- PWA 新 SW 接管即自动重载一次,更新一刷即生效(修"改了仍看旧界面")
文件
- 下载:正确解析 tar、跳过 PAX 扩展头(中文名文件曾因此大小错误/损坏)
- 另存:每次启动确保 /config/Desktop 归 abc,修微信另存"保存失败"
安全 / 伪装
- Host 白名单支持 *.example.com 通配 + X-Forwarded-Host(修 CF 反代域名仍被拒)
- 设备伪装新增真实网卡 MAC(厂商 OUI,替代容器本地管理位 MAC)
音频:扬声器自动连接(首个手势激活)、焦点离开自动断、麦克风(HTTPS)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
v1.1.8
2026-06-12 23:33:46 +08:00
Gloridust
2ae4b6932d
Update README.md
2026-06-06 02:21:52 +08:00
Gloridust and Claude Opus 4.8
5b3abd0583
docs: add社媒 links (Twitter / Telegram) to README
...
Hero badges + a 交流与关注 section: x.com/gloridust1024, t.me/WechatOnCloud.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-06 02:19:09 +08:00
Gloridust
27fa9c2670
fix: machine mask
v1.1.7
2026-06-06 02:15:16 +08:00
Gloridust and Claude Opus 4.8
8fd147bccc
fix(P0): unique persistent machine-id per instance + manual reset
...
All instances shared the image-baked machine-id (a67bf09f...), so Tencent
saw every WechatOnCloud account worldwide as one "device" — a textbook
device-farm signal triggering risk control and the forced-logout loop
reported across old and new versions.
- docker/woc-identity.sh: new /custom-cont-init.d/00-woc-identity hook —
generates a unique machine-id on first start, persists it in the data
volume (survives restart/upgrade/recreate), writes /etc/machine-id +
/var/lib/dbus/machine-id, removes /.dockerenv. Existing instances get a
fresh unique id on first upgraded start (volume lacks the file).
- regenInstanceMachineId + POST /api/admin/instances/:id/regen-machine-id:
roll a brand-new device id and restart, for accounts re-flagged by risk
control. Gated on the hook being present (old image → instructs upgrade).
- Admin 实例卡片「安全」弹窗新增「重置设备 ID 并重启」。
Verified: two fresh containers get distinct machine-ids; id persists across
restart; regen (rm persisted file + restart) yields a new persistent id.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
v1.1.6
2026-06-06 01:41:45 +08:00
Gloridust and Claude Opus 4.7
c37588617e
ci: optional Docker Hub mirror in release workflow
...
- release.yml: dual-push to GHCR + Docker Hub when vars.DOCKERHUB_USERNAME
is set; falls back to GHCR-only when unset (no behavior change for forks).
- .env.example: surface docker.io as a first-class WOC_IMAGE_PREFIX option.
- doc/发布到GHCR.md: document the one-time Variable + Secret setup and the
prerequisite of pre-creating the public repos on hub.docker.com.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-06-04 18:18:21 +08:00
Gloridust and Claude Opus 4.7
35f256edb8
docs(security): clarify multi-host allowlist + echo rejected host in 400
...
- .env.example: surface multi-domain syntax (PANEL_ALLOWED_HOSTS=a,b,c),
IPv6 literal example, and reverse-proxy troubleshooting tip.
- index.ts: 400 response includes the rejected `host` and a hint pointing
at PANEL_ALLOWED_HOSTS — drops the diagnostic floor when reverse-proxy
Host-passthrough is misconfigured.
Follow-up to #13 (DNS-rebinding allowlist).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
v1.1.5
2026-06-04 17:55:46 +08:00
Ethan Zou and GitHub
a2677c6b4a
Merge pull request #13 from aaronjmars/security/host-allowlist-dns-rebinding
...
fix(security): gate panel Host header to block DNS rebinding
2026-06-04 17:53:46 +08:00
Gloridust
ba8fe96486
feat: delet old docker
v1.1.4
2026-06-04 17:42:06 +08:00
Gloridust
d99c3b8bf6
fix ram
2026-06-04 17:33:00 +08:00
mkblbj
75dc45183f
Fix Docker script permissions
2026-06-03 13:24:27 +09:00
aeonframework
74c436e779
fix(security): gate panel Host header to block DNS rebinding
...
Without Host validation, a malicious page the operator visits can use DNS
rebinding to point a hostname at the panel's loopback / LAN IP and drive
every authenticated API from the operator's own browser — including the
docker.sock-backed admin endpoints. The README's "intranet-only" guidance
does not cover this: the browser is the trust-boundary crossing.
Add an onRequest hook (plus a Host check on raw WebSocket upgrades) that
allows loopback + RFC1918 LAN by default and accepts public hostnames via
PANEL_ALLOWED_HOSTS (documented in .env.example and threaded through
docker-compose.yml). 35 inject()-driven assertions; tsc --noEmit clean.
Detected by Aeon + manual review (DNS-rebinding-gate axis).
Severity: high
CWE-346 (Origin Validation Error)
2026-06-02 20:25:28 +00:00
Ethan Zou and GitHub
9da876502c
Merge pull request #12 from huglemon/fix/cjk-ime-paste-fallback
...
修复中文 IME 输入大量丢字:增加容器内剪贴板粘贴兜底路径
v1.1.3
2026-06-03 01:16:40 +08:00