Gloridust/WechatOnCloudPublic

云微WOC,云微信,自由连接

AI summary: A cloud-based WeChat server enabling multi-device web access to WeChat and other messaging platforms.

Stars
3.6K
+6 today
Forks
780
Watchers
8
Open issues
13
Open PRs
9
Contributors
~7
Commits
137
Branches
2

TypeScriptNo licenseCreated May 29, 2026Last push 10d agoLatest release v1.4.8+36 stars this week+36 this month

Star history

since May 31, 2026
01K2K3KMay 2026Jun 2026Jul 2026Aug 2026
3.6K stars as of Aug 6, 2026, tracked back to May 31, 2026. Historical curve reconstructed from public GitHub event archives, calibrated to the current total.

Contribution activity

commits per day, last 52 weeks
AugSepOctNovDecJanFebMarAprMayJunJulMonWedFri2025-08-03: 0 commits2025-08-04: 0 commits2025-08-05: 0 commits2025-08-06: 0 commits2025-08-07: 0 commits2025-08-08: 0 commits2025-08-09: 0 commits2025-08-10: 0 commits2025-08-11: 0 commits2025-08-12: 0 commits2025-08-13: 0 commits2025-08-14: 0 commits2025-08-15: 0 commits2025-08-16: 0 commits2025-08-17: 0 commits2025-08-18: 0 commits2025-08-19: 0 commits2025-08-20: 0 commits2025-08-21: 0 commits2025-08-22: 0 commits2025-08-23: 0 commits2025-08-24: 0 commits2025-08-25: 0 commits2025-08-26: 0 commits2025-08-27: 0 commits2025-08-28: 0 commits2025-08-29: 0 commits2025-08-30: 0 commits2025-08-31: 0 commits2025-09-01: 0 commits2025-09-02: 0 commits2025-09-03: 0 commits2025-09-04: 0 commits2025-09-05: 0 commits2025-09-06: 0 commits2025-09-07: 0 commits2025-09-08: 0 commits2025-09-09: 0 commits2025-09-10: 0 commits2025-09-11: 0 commits2025-09-12: 0 commits2025-09-13: 0 commits2025-09-14: 0 commits2025-09-15: 0 commits2025-09-16: 0 commits2025-09-17: 0 commits2025-09-18: 0 commits2025-09-19: 0 commits2025-09-20: 0 commits2025-09-21: 0 commits2025-09-22: 0 commits2025-09-23: 0 commits2025-09-24: 0 commits2025-09-25: 0 commits2025-09-26: 0 commits2025-09-27: 0 commits2025-09-28: 0 commits2025-09-29: 0 commits2025-09-30: 0 commits2025-10-01: 0 commits2025-10-02: 0 commits2025-10-03: 0 commits2025-10-04: 0 commits2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-08: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 0 commits2026-02-18: 0 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 0 commits2026-02-24: 0 commits2026-02-25: 0 commits2026-02-26: 0 commits2026-02-27: 0 commits2026-02-28: 0 commits2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 0 commits2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 0 commits2026-04-04: 0 commits2026-04-05: 0 commits2026-04-06: 0 commits2026-04-07: 0 commits2026-04-08: 0 commits2026-04-09: 0 commits2026-04-10: 0 commits2026-04-11: 0 commits2026-04-12: 0 commits2026-04-13: 0 commits2026-04-14: 0 commits2026-04-15: 0 commits2026-04-16: 0 commits2026-04-17: 0 commits2026-04-18: 0 commits2026-04-19: 0 commits2026-04-20: 0 commits2026-04-21: 0 commits2026-04-22: 0 commits2026-04-23: 0 commits2026-04-24: 0 commits2026-04-25: 0 commits2026-04-26: 0 commits2026-04-27: 0 commits2026-04-28: 0 commits2026-04-29: 0 commits2026-04-30: 0 commits2026-05-01: 0 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 0 commits2026-05-05: 0 commits2026-05-06: 0 commits2026-05-07: 0 commits2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 0 commits2026-05-11: 0 commits2026-05-12: 0 commits2026-05-13: 0 commits2026-05-14: 0 commits2026-05-15: 0 commits2026-05-16: 0 commits2026-05-17: 0 commits2026-05-18: 0 commits2026-05-19: 0 commits2026-05-20: 0 commits2026-05-21: 0 commits2026-05-22: 0 commits2026-05-23: 0 commits2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 0 commits2026-05-27: 0 commits2026-05-28: 0 commits2026-05-29: 5 commits2026-05-30: 0 commits2026-05-31: 5 commits2026-06-01: 2 commits2026-06-02: 10 commits2026-06-03: 2 commits2026-06-04: 4 commits2026-06-05: 0 commits2026-06-06: 4 commits2026-06-07: 0 commits2026-06-08: 0 commits2026-06-09: 0 commits2026-06-10: 0 commits2026-06-11: 0 commits2026-06-12: 2 commits2026-06-13: 9 commits2026-06-14: 20 commits2026-06-15: 12 commits2026-06-16: 1 commit2026-06-17: 4 commits2026-06-18: 2 commits2026-06-19: 4 commits2026-06-20: 0 commits2026-06-21: 0 commits2026-06-22: 1 commit2026-06-23: 3 commits2026-06-24: 1 commit2026-06-25: 3 commits2026-06-26: 1 commit2026-06-27: 0 commits2026-06-28: 1 commit2026-06-29: 3 commits2026-06-30: 0 commits2026-07-01: 0 commits2026-07-02: 0 commits2026-07-03: 0 commits2026-07-04: 2 commits2026-07-05: 6 commits2026-07-06: 3 commits2026-07-07: 6 commits2026-07-08: 8 commits2026-07-09: 0 commits2026-07-10: 0 commits2026-07-11: 0 commits2026-07-12: 0 commits2026-07-13: 0 commits2026-07-14: 0 commits2026-07-15: 0 commits2026-07-16: 2 commits2026-07-17: 0 commits2026-07-18: 0 commits2026-07-19: 2 commits2026-07-20: 0 commits2026-07-21: 0 commits2026-07-22: 0 commits2026-07-23: 0 commits2026-07-24: 0 commits2026-07-25: 0 commits2026-07-26: 0 commits2026-07-27: 0 commits2026-07-28: 0 commits2026-07-29: 0 commits2026-07-30: 0 commits2026-07-31: 0 commits2026-08-01: 0 commits
128 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Breakout launch

    3,550 stars in 70 days

What WechatOnCloud does

WechatOnCloud allows users to host a persistent WeChat client on their own NAS or server. It shares a single session across multiple web browsers simultaneously, solving the limitation of WeChat's single-device login policy. Beyond WeChat, it also runs isolated Chromium browser instances in the cloud to maintain persistent logins for platforms like Telegram, X, and Instagram. The service acts as a centralized communication hub that stays constantly online without requiring a dedicated local machine.

Home lab enthusiasts, developers, and power users who want persistent, multi-device access to web messaging platforms through self-hosted infrastructure.

  • Persistent sessions: Keeps social media and messaging accounts logged in continuously on a remote server.
  • Multi-device sync: Allows multiple local web browsers to access and interact with the same centralized session.
  • Containerized deployment: Provides Docker images for easy installation on AMD64 and ARM64 architectures.
  • Multi-platform support: Integrates not just WeChat, but also other web-based platforms via Chromium instances.
  • PWA support: Can be installed as a Progressive Web App for a native-like experience on mobile and desktop.

Where teams use it

Cross-device Messaging

Users wanting to use WeChat simultaneously on a phone, tablet, and multiple computers.

NAS Utilization

Home server owners looking to host their own private, always-on communication gateway.

Automated Account Management

Developers maintaining bot accounts or persistent logins without dedicating physical hardware.

Bypassing App Restrictions

Accessing restricted platforms via a remote, containerized browser interface.

README

main branch
云微 logo

云微 · WechatOnCloud

在自己的 NAS / 服务器上运行「服务端微信」,多端浏览器共享同一会话

不止微信——还能开 Chromium 浏览器实例,登录 Telegram / X / Instagram 等网页版社媒,常驻云端、多端同步

stars release issues arch pwa twitter telegram

快速开始 · 核心特性 · 浏览器实例 · 运行原理 · 安全须知 · 技术方案

云微 · 面板主界面 云微 · 实例桌面

在飞牛 NAS(x86_64 / arm64)或任意 Docker 主机上运行服务端微信:面板可管理多个实例,每个实例都是一个独立容器——可以是一个微信会话,也可以是一个 Chromium 浏览器(用来登录 Telegram / X / Instagram 等网页版应用)。多个 web 用户通过浏览器访问被授权的实例,实现跨设备同步、多端共享。不修改微信客户端。

一句话原理:每个实例 = 一个容器,里面跑 Xvfb 虚拟显示 + 一个应用(官方原版微信,或 Chromium 浏览器),KasmVNC 把画面串到浏览器;同一实例被多个浏览器连 = 共享同一个会话。前面一层自研面板是唯一对外入口,经 docker.sock 按需创建/销毁实例并反向代理。

交流群: @WechatOnCloud


核心特性

  • 🗂️ 多实例 — 一个面板管理多个独立实例,每个实例独立容器 + 独立数据卷,互不干扰。
  • 🌐 多应用(微信 + 浏览器) — 新建实例时可选微信Chromium 浏览器;浏览器实例用来登录 Telegram / X / Instagram 等网页版社媒,登录态写进数据卷、常驻云端、多端共享。
  • 👥 多端共享 + 权限 — 多浏览器 / 设备共享同一会话;子账号体系,按账号分配可访问的实例(RBAC)。
  • 🖥️ PC 式界面 — 左侧实例栏 + 右侧内嵌桌面,侧栏可折叠,移动端自动转抽屉;实例图标可自定义(内置图标 / 上传裁剪)。
  • 📦 微信按需下载 · 浏览器开箱即用 — 镜像不打包微信,面板一键「下载安装 / 更新」带进度条、按架构取包;Chromium 已烤进镜像,创建即用、无需下载。
  • 🔁 实例生命周期 — 启动 / 停止 / 重启 / 升级(拉新镜像重建、保留聊天记录),均在面板内一键完成。
  • 📎 文件传输 + 文本剪贴板 — 拖拽上传 + 下载 + 删除,直达实例桌面 ~/Desktop;文本可经剪贴板中转送进实例(局域网 http 下也可用)。
  • 🧩 多端协作软锁 — 同一实例多人操作时自动只读 + 申请接管,避免键鼠打架。
  • 🔒 安全优先 — 面板为唯一入口,KasmVNC 凭据服务端注入、永不下发前端;docker.sock 仅管理员可触达。
  • 📱 PWA — iOS「添加到主屏幕」、桌面 Chrome「安装」当原生 App。
  • 🏗️ 多架构 — amd64 / arm64 预构建镜像(Docker Hub + GHCR,GitHub Actions 自动发布)。

文档

文档 内容
运行原理与 Docker 指南 工作原理 + 架构图;面向 Docker 新手的逐步拆解、常用命令、架构自动适配
部署与运维 数据持久化、常见问题排查、忘记超管密码的离线找回、目录结构
设备伪装与风控应对 唯一 machine-id / 真实 hostname / os-release 伪装;账号被微信强制退出循环时怎么办
数据卷管理与迁移 管理员在面板里备份/恢复整卷、上传 PC 微信数据、浏览管理实例 /config 文件
发布到 GHCR 用 GitHub Actions 或本机 buildx 把镜像发布到 GHCR
技术方案 完整设计文档与选型权衡

快速开始

需已安装 Docker(含 Compose 插件)。x86_64 / arm64 均可。不熟悉 Docker?先读 运行原理与 Docker 指南

docker-compose.yml 默认引用 Docker Hub 上的镜像 docker.io/gloridust/{woc-panel,wechat-on-cloud}(同时也发布到 GHCR 作为备用源)。 这两个镜像需先存在——要么官方已发布(你能直接拉取),要么你在本地自行构建。二选一:

方式 A · 本地自构建(官方尚未发布镜像时用这个)

git clone https://github.com/Gloridust/WechatOnCloud.git WechatOnCloud
cd WechatOnCloud
cp .env.example .env            # 至少改掉默认密码 WOC_PASSWORD
./scripts/build-local.sh        # 构建面板 + 微信实例镜像,打成 compose 用的同名标签
docker compose up -d            # compose 默认优先用本地镜像,不会再去远端拉

方式 B · 拉取官方镜像(推荐,无需 clone 整个仓库)

部署只需要 docker-compose.yml 这一个文件——它用 image: 直接拉官方镜像,面板数据放在该文件旁自动创建的 ./data-panel 目录,不依赖仓库里的其它文件。

  • 命令行:丢进一个空目录拉起即可

    mkdir woc && cd woc
    curl -fsSL https://raw.githubusercontent.com/Gloridust/WechatOnCloud/main/docker-compose.yml -o docker-compose.yml
    docker compose up -d            # 默认从 Docker Hub 拉取(公开、amd64/arm64 多架构)

    raw.githubusercontent.com 拉不动时,在 GitHub 网页打开根目录的 docker-compose.yml,复制内容自己建个同名文件即可。

  • 飞牛 OS(fnOS)/ 群晖 等 NAS:在 Docker → Compose 一键部署 界面,把根目录 docker-compose.yml 的内容直接粘贴进去即可部署,无需命令行、无需 clone。

改配置(强烈建议至少改密码):默认管理员 admin / wechat。登录后在「修改密码」里改;或部署前在 docker-compose.yml 旁放一个 .env(从 .env.example 下载改名),又或在 NAS 的 Compose 环境变量里填 WOC_PASSWORDWOC_HTTP_PORTWOC_IMAGE_PREFIX 等(全部可配置项见 .env.example)。

镜像源:默认 Docker Hub(国内外通用、免登录,飞牛等 NAS 还内置了 Docker Hub 加速,通常比 GHCR 更稳)。拉不动时设 WOC_IMAGE_PREFIX 切到备用源 ghcr.io/gloridust 或国内反代 ghcr.nju.edu.cn/gloridust(更多源见 .env.example)。报错 denied = 该源上还没有镜像,换源或用方式 A 本地构建。

无论哪种方式,都会拉起面板容器 woc-panel(唯一对外服务)。浏览器访问 http://<NAS_IP>:36080

  1. .env 里设置的管理员账号(默认 admin / wechat)登录面板;
  2. 在「实例」页点「新建实例」,选应用类型(微信Chromium 浏览器)、命名、勾选可访问的子账号 → 面板自动 docker run 起一个实例容器(镜像本地没有时才会从镜像源拉取);
  3. 微信实例:进入后点「下载并安装」微信(约 190~210MB,带进度条,仅管理员);浏览器实例:随镜像就绪,跳过这步;
  4. 点「进入实例」→ 微信扫码登录即可收发消息;浏览器则直接打开网页登录 Telegram / X / Instagram 等。

之后被授权的用户换任意设备打开同一地址登录面板,看到自己有权访问的实例,进入即是同一个会话。

🛠️ NAS / 飞牛(fnOS) 用户必看——首次新建实例若卡住报 创建容器失败:… registry-1.docker.io … timeout: 这是 Docker 守护进程拉取实例镜像超时。NAS 自带的「Docker Hub 加速」一般只作用于你在 NAS 界面手动拉镜像,不覆盖面板(经 docker.sock)触发的拉取,于是直连 docker.io 超时。 最省事的解法:先在 NAS 的 Docker → 镜像 → 拉取 里手动拉一次 gloridust/wechat-on-cloud:latest(和你拉 woc-panel 同样的方式)。镜像到本地后,面板新建实例会直接复用、不再联网拉取 → 立即成功。 想一劳永逸:给 Docker 守护进程配「镜像加速器」(/etc/docker/daemon.jsonregistry-mirrors,改完重启 Docker),或把 WOC_IMAGE_PREFIX 换成国内可达源(如 ghcr.nju.edu.cn/gloridust)后重建面板。

宿主只对外暴露面板的 36080 一个端口;实例容器仅在 docker 网络内、由面板反代,不直连宿主。要改端口/版本/账号见 .env(可配置项见 .env.example)。镜像会按 CPU 架构自动适配(详见文档)。

面板能做什么

功能 谁可用 说明
新建 / 删除实例 管理员 一键创建独立实例容器(微信 / Chromium 浏览器);新建时勾选可访问的子账号、可自定义图标。删除默认保留数据卷,可选彻底清除
实例权限分配 管理员 在实例上改「可访问账户」,或在账户上改「可访问实例」,双向管理
下载并安装 / 更新微信 管理员 微信实例一键下载官方 Linux 版到数据卷、解压安装、带进度条,后续可「更新到最新版」(浏览器实例无需此步)
进入实例 被授权用户 在浏览器里操作对应实例:微信扫码收发消息,或在 Chromium 里登录网页应用
文件 / 文本传输 被授权用户 拖拽上传 / 下载文件;文本经剪贴板中转送入实例
实例日志 管理员 查看实例日志,含持久化历史(重启原因 + 上一容器日志快照,跨容器重建保留)
修改密码 所有人 改自己的登录密码
子账号管理 管理员 创建 / 禁用 / 重置 / 删除子账号,并分配实例访问权限
安装为 App 所有人 iOS Safari「添加到主屏幕」、桌面 Chrome「安装」当原生 App(PWA)

子账号是访问这套面板的身份,不是另开一个微信 / 账号。管理员隐式拥有全部实例访问权;子账号只能看到被授权的实例。 微信本体不打进镜像,新建微信实例后在面板点「下载并安装」时才下载到该实例的数据卷(浏览器实例则已随镜像就绪),所以镜像小、构建快。


浏览器实例(登录网页版社媒)

云微是个多应用平台:除了微信,新建实例时还可以选 Chromium 浏览器——相当于一台常驻云端、多端共享的浏览器,专门用来登录各种网页版应用:

  • 社媒 / IM:Telegram Web、X(Twitter)、Instagram、WhatsApp Web、Discord、Slack、微博、知乎…… 凡是有网页版的都行;
  • 邮箱 / 后台 / 工具:Gmail、各类管理后台、需要长期保持登录的网页应用。

和微信实例同一套体验与好处:

  • 随镜像就绪、免下载 — Chromium 已烤进镜像,创建后点「进入实例」直接用(amd64 / arm64 均可)。
  • 登录态常驻、重启不掉 — 浏览器配置与 Cookie 写在实例数据卷 /config,容器重启 / 升级都保留登录。
  • 多端共享 + 同步 — 多设备打开同一实例看到的是同一个浏览器画面,跨设备无缝接力;多人操作有软锁保护。
  • 中文输入 / 文件 / 剪贴板 — 与微信实例共用一套:本地输入法直接打字,工具栏拖拽传文件、剪贴板中转文本。

⚠️ 浏览器实例登录着你的社媒账号,同样受安全须知约束——切勿把面板暴露公网


资源占用

实测(8 核 / 8 GiB 宿主,实例均已登录微信、含 Chromium 内核的 WeChatAppEx):

状态 CPU 内存(RSS)
单实例 · 空闲(已登录、无人观看) ~0.1–0.2 核 ~0.6 GiB
单实例 · 活跃(有人在浏览器操作 / 刷消息) ~0.5–1 核(可突发) ~1–1.5 GiB
面板本身 可忽略 ~0.12 GiB
  • 容器不设硬性 CPU/内存上限:空闲时省,活跃时按宿主余量突发;每实例另预留 1 GiB /dev/shm(微信 Chromium 内核所需,tmpfs,按需占用)。
  • 估算:面板 ≈ 0.15 GiB 常驻;每个微信实例按 1 vCPU + 1.5 GiB 内存预留较从容(轻度使用可更低)。
  • 参考容量:2 核 / 2 GiB 跑 1 个实例(轻度);4 核 / 8 GiB 跑 3–4 个实例;视频通话等重负载需再加预留。

内存是主要瓶颈,CPU 多为短时突发。实例越多越吃内存,按上表线性叠加即可估算。Chromium 浏览器实例的占用与微信实例同量级(取决于开的标签页数),可套用上表。


安全须知(必读)

⚠️ 这套系统暴露的是已登录的微信 / 社媒账号,请务必认真阅读本节。

能登录面板的人就能看你的聊天记录、以你身份发消息(浏览器实例则能用你登录的 Telegram / X / Instagram 等账号)。面板还挂载了宿主的 docker.sock(创建/销毁实例所需),它等同宿主 root 权限。因此:

  • 绝不要把面板裸暴露公网:只在内网访问,或经飞牛远程访问 / VPN / 内网穿透;
  • 务必改掉默认密码(默认 admin / wechat):cp .env.example .env 后改 WOC_PASSWORD,或登录后在「修改密码」里改;
  • 实例的增删、微信安装/更新等触碰 docker 引擎的操作仅限管理员;docker API 绝不暴露给前端;
  • KasmVNC 凭据由面板服务端注入,浏览器永远拿不到;实例容器名由内部随机 ID 派生,避免注入;
  • 面板与外网之间再套一层 HTTPS 反代(飞牛自带反代 / Caddy / Nginx)获得正经 TLS;
  • 进一步加固(陌生设备验证码、审计日志、并发控制)见 技术方案.md 第 5 节。

中文输入

用你本地(客户端)的输入法打中文,容器内无需安装任何 IME。 镜像默认开启 KasmVNC 的「IME Input Mode」,并对 noVNC 的 IME 合成逻辑做了修复——只在输入法「上屏」那一刻把成品汉字整串发进容器,规避了原生实现逐字符差分带来的丢字 / 卡顿。在微信或浏览器的输入框直接打字即可(对所有实例通用)。

  • 默认值只对未存过该设置的浏览器生效。之前手动开/关过的,浏览器 localStorage 值优先;想验证默认效果用无痕窗口。
  • 跨设备文本:实例工具栏的「剪贴板」可把文本送入容器剪贴板,再在微信 / 网页里 Ctrl+V 粘贴——不依赖浏览器异步剪贴板 API,局域网 http 访问下也可用
  • 文件:用工具栏「文件」拖拽上传,微信收到的文件另存到桌面即可在此下载。

路线图

  • MVP:Docker + 微信原生版 + KasmVNC,浏览器扫码登录、收发消息
  • 自研面板:cookie 鉴权 + 反代 + 子账号管理 + PWA(KasmVNC 凭据不下发前端)
  • 微信本体运行时下载到数据卷:面板一键「下载并安装 / 更新」,带进度条
  • 多实例管理 + 按账号的实例访问权限(RBAC)
  • 多应用平台:微信 + Chromium 浏览器实例(登录 Telegram / X / Instagram 等网页版社媒)+ 自定义实例图标
  • 预构建多架构镜像发布到 Docker Hub / GHCR + GitHub Actions 自动化
  • 中文输入修复 + 文本剪贴板中转 + 实例日志持久化(跨容器重建保留重启原因与日志快照)
  • 面板外层 TLS / 陌生设备验证码 / 审计日志
  • 多端并发控制(操作控制权心跳软锁 + 只读遮罩 + 申请接管)
  • 掉登录时 web 端二维码重扫入口
  • [~] 打包成飞牛原生 fpk 分发(工程已就绪见 fnos/,待真实设备验证 docker.sock 权限)

交流与关注

致谢

创意启发自懒猫微服,请自行判断是否值得入手。

也感谢每一位 Star / Issue / PR 的朋友——两天突破 500 ⭐,是继续打磨的最大动力 🙌

Star History

Star History Chart
如果这个项目帮到了你,欢迎点个 ⭐ Star 支持一下 · 反馈问题 · 参与贡献
View on GitHub

Recent activity

commits and pull requests

Recent open issues

view all

Releases and announcements

37 total
  1. ## 本次修复 ### 微信下载/安装:断点续传,装得完 此前网络半路被掐断时,下次触发会**删掉下到一半的包从 0 重来**,且多次点安装会互相踩,表现为**反复卡在同一百分比后退出、永远装不完**(用户实测卡 28%)。现在: - **断点续传**(`curl -C -`):中断后从已下字节继续,而非重下 - **并发锁**:已有安装在跑时,二次触发直接跳过,不再互相删包 - **完整性校验**:`dpkg-deb` 读得出版本才算完整包,半包/损坏包自动清理并提示重下 - **安装日志**:全过程写入 `install.log`(curl 退出码、已下字节、续传轮次) ### 导出诊断:装不上有据可查 「导出诊断」此前只有面板/容器日志,看不到安装为何失败。现在每个实例段追加: - **`status.json`**:安装 phase / percent / 错误信息,一眼看出卡在哪一步 - **`install.log` 尾 50 行**:下载每一步的实况(v1.4.8 起的实例才有) 配合断点续传修复,形成「装不上 → 导诊断 → 定位根因」闭环。 --- 镜像:`ghcr.io/gloridust/{woc-panel,wechat-on-cloud}:1.4.8`、`gloridust/{woc-panel,wechat-on-cloud}:1.4.8`(amd64 + arm64)。升级方式不变:面板「检查更新」一键升级。

  2. > 修复两个会让面板「更新了却没变化 / 实例永远停在老镜像」的问题,尤其影响国内 NAS 用户。**建议升级。** ## 🔴 修复:更新面板后仍是旧版本、反复更新无效(#107) 少数用户「一键更新面板」后,版本号仍停在很旧的值(如 v1.2.7),再点更新也没用。根因是自更新重建时错误地把旧容器里的版本号继承了下来,且会**自我延续**(每次更新都再次保留旧版本号),只能手动删容器才能逃出。已修复:版本号永远取新镜像自带的值。 > **已卡住的用户无需手删容器**——升级到本版后,下次点「一键更新面板」即可自动恢复正常。 ## 🟠 修复:受限网络下误判「镜像不存在」、实例卡在老镜像(#114) 国内 NAS 常见:`docker pull` 走加速镜像能拉到,但面板直连镜像仓库的校验请求不通。旧逻辑把「连不上」误当成「该版本不存在」,于是回退到本地可能几周前的旧镜像——表现为面板是新版、实例却一直连不上桌面/停在老镜像,还会显示误导性的「该版本可能未成功发布」。已修复:只有仓库**明确回答不存在**才回退;连不上时保持版本并交给 `docker pull`(走你的加速镜像)去拉,真拉不到才用本地镜像兜底并如实说明。 --- **升级**:设置 → 关于 →「一键更新面板」到 v1.4.7;随后「管理 → 一键升级全部实例」。 **回滚**:`.env` 设 `WOC_VERSION=1.4.6`(不带 v)后 `docker compose up -d`。

  3. > 很多用户反馈「历史镜像占满磁盘」。本版让面板在升级后自动清理不再使用的旧版本镜像。 ## 修复 - 此前只清理「悬空镜像」(无 tag 的 `<none>`)。但自 v1.4.4 起面板拉取带版本号的镜像 tag(如 `:1.4.5`),升级到新版后旧版本镜像仍带 tag、不算悬空 → 每个历史版本(实例镜像约 4GB、面板约 0.5GB)长期堆积。 - 现在升级实例 / 一键升级 / 面板更新后,会**自动删除不再被任何容器使用的旧版本 woc 镜像**,只保留当前版本与正在使用(含未升级实例)的镜像。 - 安全:绝不删除正在运行或已停止实例所用的镜像;`WOC_KEEP_OLD_IMAGES=1` 可关闭(想保留旧镜像便于回滚)。 **说明**:本次清理逻辑在面板里,升级到 v1.4.6 后,之后的每次升级都会自动清理;面板启动约 30 秒后也会清一次历史堆积。 ## 升级 设置 → 关于 →「一键更新面板」到 v1.4.6;随后到「管理」→「一键升级全部实例」。

  4. > v1.4.4 起,实例卡上的「镜像版本」角标会错误显示为 `876361b9`(那是底层 base 镜像的版本号),让人以为没升级成功、也分不清版本。本版修复。功能与 v1.4.4 相同。 ## 修复 - 实例/面板镜像补回 `org.opencontainers.image.version` 标签(v1.4.4 改用原生构建时漏了),实例卡现在会正确显示 **镜像 vX.Y.Z**。 ## 拿到修复(两步,都在面板里) 1. 设置 → 关于 →「一键更新面板」→ 确认版本 **v1.4.5**。 2. 管理 →「一键升级全部实例」→ 实例卡角标应显示 **镜像 v1.4.5**。 > 提示:请先更新面板、再升级实例(面板负责检测实例是否有新版)。 **回滚**:`.env` 设 `WOC_VERSION=1.4.2`(不带 v)后 `docker compose up -d`。

  5. > v1.4.1/v1.4.3 的实例镜像因 CI 的 arm64 构建(QEMU 模拟)内存溢出而未能发布。本版**改用原生 arm64 构建**彻底解决,实例镜像恢复正常发布。之前只更新了面板、实例升级不到新版的用户,现在可以正常升级了。 ## 本版要点 - **实例镜像恢复发布(含 arm64)**:CI 改用 GitHub 原生 arm64 runner 分架构构建,不再走 QEMU 模拟——根治此前反复的构建内存溢出。已验证多架构镜像(amd64 + arm64)正常发布到 GHCR 与 Docker Hub。 - 包含 v1.4.3 的全部改进(此前实例镜像没发出去,等于没生效): - **公网/NAS 访问加固**:登录限速(防爆破)、会话滑动续期(常挂着的面板不再频繁重登)、反代部署文档(nginx WebSocket + 空闲超时示例)。 - **管理页三 Tab 重构**(实例 / 用户 / 系统)+ 实例卡片布局修复(名字不再被截断、徽标不再竖排)。 - **无障碍基线**:键盘焦点环、尊重系统「减弱动态效果」。 - **设计系统文档** `doc/dev/design.md`。 ## 升级(两步,都在面板里) 1. 设置 → 关于 →「一键更新面板」→ 确认版本 **v1.4.4**。 2. 管理 →「一键升级全部实例」→ 实例卡角标应显示 **镜像 v1.4.4**。 **回滚**:`.env` 设 `WOC_VERSION=1.4.2`(不带 v)后 `docker compose up -d`。

Commits per week

last 52 weeks
430Week of 2025-08-03: 0 commitsWeek of 2025-08-10: 0 commitsWeek of 2025-08-17: 0 commitsWeek of 2025-08-24: 0 commitsWeek of 2025-08-31: 0 commitsWeek of 2025-09-07: 0 commitsWeek of 2025-09-14: 0 commitsWeek of 2025-09-21: 0 commitsWeek of 2025-09-28: 0 commitsWeek of 2025-10-05: 0 commitsWeek of 2025-10-12: 0 commitsWeek of 2025-10-19: 0 commitsWeek of 2025-10-26: 0 commitsWeek of 2025-11-02: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 0 commitsWeek of 2026-02-15: 0 commitsWeek of 2026-02-22: 0 commitsWeek of 2026-03-01: 0 commitsWeek of 2026-03-08: 0 commitsWeek of 2026-03-15: 0 commitsWeek of 2026-03-22: 0 commitsWeek of 2026-03-29: 0 commitsWeek of 2026-04-05: 0 commitsWeek of 2026-04-12: 0 commitsWeek of 2026-04-19: 0 commitsWeek of 2026-04-26: 0 commitsWeek of 2026-05-03: 0 commitsWeek of 2026-05-10: 0 commitsWeek of 2026-05-17: 0 commitsWeek of 2026-05-24: 5 commitsWeek of 2026-05-31: 27 commitsWeek of 2026-06-07: 11 commitsWeek of 2026-06-14: 43 commitsWeek of 2026-06-21: 9 commitsWeek of 2026-06-28: 6 commitsWeek of 2026-07-05: 23 commitsWeek of 2026-07-12: 2 commitsWeek of 2026-07-19: 2 commitsWeek of 2026-07-26: 0 commitsAug 3, 2025Jul 26, 2026
128 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 4 commitsSun 1:00 — 2 commitsSun 2:00 — 0 commitsSun 3:00 — 0 commitsSun 4:00 — 0 commitsSun 5:00 — 0 commitsSun 6:00 — 0 commitsSun 7:00 — 0 commitsSun 8:00 — 0 commitsSun 9:00 — 0 commitsSun 10:00 — 1 commitsSun 11:00 — 0 commitsSun 12:00 — 1 commitsSun 13:00 — 4 commitsSun 14:00 — 0 commitsSun 15:00 — 4 commitsSun 16:00 — 5 commitsSun 17:00 — 4 commitsSun 18:00 — 3 commitsSun 19:00 — 2 commitsSun 20:00 — 0 commitsSun 21:00 — 2 commitsSun 22:00 — 2 commitsSun 23:00 — 0 commitsMon 0:00 — 3 commitsMon 1:00 — 2 commitsMon 2:00 — 0 commitsMon 3:00 — 1 commitsMon 4:00 — 0 commitsMon 5:00 — 0 commitsMon 6:00 — 0 commitsMon 7:00 — 0 commitsMon 8:00 — 0 commitsMon 9:00 — 0 commitsMon 10:00 — 0 commitsMon 11:00 — 0 commitsMon 12:00 — 0 commitsMon 13:00 — 0 commitsMon 14:00 — 1 commitsMon 15:00 — 2 commitsMon 16:00 — 2 commitsMon 17:00 — 1 commitsMon 18:00 — 2 commitsMon 19:00 — 1 commitsMon 20:00 — 0 commitsMon 21:00 — 0 commitsMon 22:00 — 2 commitsMon 23:00 — 4 commitsTue 0:00 — 4 commitsTue 1:00 — 1 commitsTue 2:00 — 0 commitsTue 3:00 — 0 commitsTue 4:00 — 0 commitsTue 5:00 — 0 commitsTue 6:00 — 0 commitsTue 7:00 — 0 commitsTue 8:00 — 0 commitsTue 9:00 — 1 commitsTue 10:00 — 0 commitsTue 11:00 — 0 commitsTue 12:00 — 2 commitsTue 13:00 — 0 commitsTue 14:00 — 1 commitsTue 15:00 — 1 commitsTue 16:00 — 0 commitsTue 17:00 — 0 commitsTue 18:00 — 0 commitsTue 19:00 — 3 commitsTue 20:00 — 3 commitsTue 21:00 — 3 commitsTue 22:00 — 0 commitsTue 23:00 — 1 commitsWed 0:00 — 1 commitsWed 1:00 — 0 commitsWed 2:00 — 2 commitsWed 3:00 — 5 commitsWed 4:00 — 0 commitsWed 5:00 — 0 commitsWed 6:00 — 0 commitsWed 7:00 — 0 commitsWed 8:00 — 0 commitsWed 9:00 — 0 commitsWed 10:00 — 0 commitsWed 11:00 — 0 commitsWed 12:00 — 0 commitsWed 13:00 — 1 commitsWed 14:00 — 1 commitsWed 15:00 — 0 commitsWed 16:00 — 3 commitsWed 17:00 — 0 commitsWed 18:00 — 0 commitsWed 19:00 — 0 commitsWed 20:00 — 2 commitsWed 21:00 — 0 commitsWed 22:00 — 0 commitsWed 23:00 — 0 commitsThu 0:00 — 0 commitsThu 1:00 — 1 commitsThu 2:00 — 0 commitsThu 3:00 — 0 commitsThu 4:00 — 1 commitsThu 5:00 — 0 commitsThu 6:00 — 0 commitsThu 7:00 — 0 commitsThu 8:00 — 0 commitsThu 9:00 — 0 commitsThu 10:00 — 0 commitsThu 11:00 — 0 commitsThu 12:00 — 0 commitsThu 13:00 — 0 commitsThu 14:00 — 0 commitsThu 15:00 — 0 commitsThu 16:00 — 0 commitsThu 17:00 — 5 commitsThu 18:00 — 1 commitsThu 19:00 — 1 commitsThu 20:00 — 2 commitsThu 21:00 — 0 commitsThu 22:00 — 0 commitsThu 23:00 — 0 commitsFri 0:00 — 0 commitsFri 1:00 — 3 commitsFri 2:00 — 1 commitsFri 3:00 — 0 commitsFri 4:00 — 0 commitsFri 5:00 — 0 commitsFri 6:00 — 0 commitsFri 7:00 — 0 commitsFri 8:00 — 0 commitsFri 9:00 — 0 commitsFri 10:00 — 1 commitsFri 11:00 — 0 commitsFri 12:00 — 0 commitsFri 13:00 — 0 commitsFri 14:00 — 1 commitsFri 15:00 — 1 commitsFri 16:00 — 0 commitsFri 17:00 — 0 commitsFri 18:00 — 0 commitsFri 19:00 — 0 commitsFri 20:00 — 0 commitsFri 21:00 — 0 commitsFri 22:00 — 2 commitsFri 23:00 — 3 commitsSat 0:00 — 2 commitsSat 1:00 — 1 commitsSat 2:00 — 3 commitsSat 3:00 — 0 commitsSat 4:00 — 0 commitsSat 5:00 — 0 commitsSat 6:00 — 0 commitsSat 7:00 — 0 commitsSat 8:00 — 0 commitsSat 9:00 — 0 commitsSat 10:00 — 0 commitsSat 11:00 — 0 commitsSat 12:00 — 0 commitsSat 13:00 — 0 commitsSat 14:00 — 0 commitsSat 15:00 — 0 commitsSat 16:00 — 0 commitsSat 17:00 — 0 commitsSat 18:00 — 0 commitsSat 19:00 — 0 commitsSat 20:00 — 0 commitsSat 21:00 — 0 commitsSat 22:00 — 2 commitsSat 23:00 — 7 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits128 (93%)
Community commits9 (7%)

137 commits in total over the last year.

DateListRankStars gained
Jun 2, 2026daily#10+39
  • freeCodeCamp/freeCodeCamp

    freeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.

    453.6K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    385.5K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • anomalyco/opencode

    The open source coding agent.

    194.7K stars · TypeScript