Gloridust/WechatOnCloudPublic

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

AI summary: Self-hosted, containerized gateway for persistent, multi-device access to WeChat and other web platforms.

Stars
3.8K
+3 today
Forks
820
Watchers
9
Open issues
26
Open PRs
6
Contributors
~7
Commits
161
Branches
2

TypeScriptNo licenseCreated May 29, 2026Last push 3d agoLatest release v1.5.0+15 stars this week+137 this month

Quick answers

What is WechatOnCloud?
Self-hosted, containerized gateway for persistent, multi-device access to WeChat and other web platforms.
What does WechatOnCloud do?
WechatOnCloud empowers users to host a persistent WeChat client or Chromium browser instance natively on their own NAS or Docker host. It expertly utilizes KasmVNC and Xvfb to share a single highly active session across multiple web browsers simultaneously, completely solving the limitation of WeChat's strict single-device login policy. Beyond WeChat, it effectively runs isolated Chromium browser instances in the cloud to maintain continuous, persistent logins for platforms like Telegram, X, and Instagram. The service fundamentally acts as a centralized communication hub governed by a custom web panel that securely handles instance creation and user authorization.
Who is WechatOnCloud for?
Home lab enthusiasts, developers, and power users who desperately want persistent, multi-device access to web messaging platforms through self-hosted infrastructure. Familiarity with Docker deployment is essential.
How do I get started with WechatOnCloud?
docker compose up -d
How popular is WechatOnCloud on GitHub?
Gloridust/WechatOnCloud has 3,828 stars and 820 forks on GitHub, and gained 15 stars in the last 7 days.

Star history

since Jul 28, 2026
01K2K3KJul 2026Aug 2026Sep 2026Oct 2026
3.8K stars as of Oct 3, 2026. Measured daily since Jul 28, 2026; GitHub no longer exposes earlier star timestamps.

Contribution activity

commits per day, last 52 weeks
SepOctNovDecJanFebMarAprMayJunJulAugSepMonWedFri2025-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: 7 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: 4 commits2026-07-13: 1 commit2026-07-14: 0 commits2026-07-15: 0 commits2026-07-16: 2 commits2026-07-17: 0 commits2026-07-18: 0 commits2026-07-19: 3 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: 3 commits2026-07-29: 1 commit2026-07-30: 0 commits2026-07-31: 0 commits2026-08-01: 0 commits2026-08-02: 0 commits2026-08-03: 0 commits2026-08-04: 0 commits2026-08-05: 0 commits2026-08-06: 0 commits2026-08-07: 0 commits2026-08-08: 0 commits2026-08-09: 0 commits2026-08-10: 0 commits2026-08-11: 0 commits2026-08-12: 0 commits2026-08-13: 0 commits2026-08-14: 0 commits2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 0 commits2026-08-28: 0 commits2026-08-29: 0 commits2026-08-30: 0 commits2026-08-31: 0 commits2026-09-01: 0 commits2026-09-02: 0 commits2026-09-03: 0 commits2026-09-04: 0 commits2026-09-05: 0 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 0 commits2026-09-09: 0 commits2026-09-10: 0 commits2026-09-11: 0 commits2026-09-12: 0 commits2026-09-13: 0 commits2026-09-14: 0 commits2026-09-15: 0 commits2026-09-16: 0 commits2026-09-17: 0 commits2026-09-18: 0 commits2026-09-19: 0 commits2026-09-20: 0 commits2026-09-21: 0 commits2026-09-22: 0 commits2026-09-23: 0 commits2026-09-24: 1 commit2026-09-25: 7 commits2026-09-26: 0 commits
147 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Continuous integration

    Automated checks passing

What WechatOnCloud does

WechatOnCloud empowers users to host a persistent WeChat client or Chromium browser instance natively on their own NAS or Docker host. It expertly utilizes KasmVNC and Xvfb to share a single highly active session across multiple web browsers simultaneously, completely solving the limitation of WeChat's strict single-device login policy. Beyond WeChat, it effectively runs isolated Chromium browser instances in the cloud to maintain continuous, persistent logins for platforms like Telegram, X, and Instagram. The service fundamentally acts as a centralized communication hub governed by a custom web panel that securely handles instance creation and user authorization.

Home lab enthusiasts, developers, and power users who desperately want persistent, multi-device access to web messaging platforms through self-hosted infrastructure. Familiarity with Docker deployment is essential.

  • Persistent remote sessions: Keeps social media and messaging accounts logged in continuously on a remote, containerized server.
  • Multi-device synchronization: Allows multiple local web browsers to access and interact seamlessly with the exact same centralized session simultaneously.
  • Containerized deployment: Provides multi-architecture Docker images for incredibly easy installation across various NAS devices.
  • Multi-platform support: Integrates not just WeChat, but also other web-based platforms efficiently via native Chromium instances.
  • Progressive Web App support: Can be installed directly as a PWA for a highly native-like experience on mobile and desktop devices.
  • Role-based access control: Includes a robust sub-account system allowing administrators to securely grant specific instance access to different users.

Where teams use it

Cross-device messaging

Allowing users to use WeChat simultaneously on a phone, tablet, and multiple computers without ever needing to log in again.

NAS communication gateway

Enabling home server owners to host their own highly private, always-on communication and browsing gateway locally.

Automated account management

Helping developers maintain persistent logins for monitoring specific accounts without dedicating any physical hardware.

Bypassing local application restrictions

Accessing restricted communication platforms via a remote, containerized browser interface securely from any device.

Getting started: docker compose up -d

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_PASSWORD、WOC_HTTP_PORT、WOC_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.json 的 registry-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

39 total
  1. ## ⬆️ 升级方式(重要) 1. 面板「检查更新」升级面板到 1.5.0; 2. **再点「一键升级全部实例」**——本版有多项修复在实例镜像里(安装卡死、IPv6、Chromium 缓存),**只更新面板不会生效**。 升级实例会保留全部数据(登录状态、聊天记录)。 --- ## ✨ 新功能 ### 截图直接粘贴到聊天框(#91) 截图后,在远程桌面里按 **Ctrl+V(Mac 上 Cmd+V)** 就能把图片直接粘进微信 / 应用里。用 `http://内网IP` 访问也可以,不需要 HTTPS。 - 本机剪贴板里不是图片时,行为和以前一样(粘贴容器里的剪贴板,比如在微信里复制一条消息再粘到别处); - 如果截图之后你又在微信里复制了东西,不会误粘那张旧截图。 ### 实例数据可以放到指定目录(#133) 在 `.env` 里设置 `WOC_DATA_ROOT=/你的/目录`,之后**新建**的实例会把全部数据放到该目录下,可以直接在 NAS 文件管理里访问,也方便放到大容量盘上。已有实例不受影响。详见 `.env.example`。 ### 经 Cloudflare Access 等登录网关访问时会自动重新认证 此前网关会话过期后页面会卡死,只能手动刷新。 --- ## 🐛 修复 - **微信安装卡在「正在解压安装 92%」好几天、无法取消(#144)**:容器重启或升级打断安装后,状态会一直停在「进行中」,按钮也点不了。现在会提示「上次安装被中断」并允许重试。v1.4.8~1.4.9 在装完后会留下一个残留的安装锁,升级后会被自动识别清理。 - **下载微信失败要等约 40 分钟才报错(#142)**:连不上腾讯下载服务器时,现在约 3 分钟就会报错,并明确说明原因(镜像不含微信本体,需要能访问 dldir1.qq.com)。 - **装了 MetaMask 等浏览器扩展时,远程桌面每十几秒刷新一次**:扩展往页面里注入的脚本报错,被误判成远程桌面崩溃而反复重连。 - **宿主关闭 IPv6 时实例打不开(#134)**:面板会自动检测并处理,也可用 `WOC_DISABLE_IPV6=1` 强制。 - **弹窗在矮屏幕上超出页面、按钮点不到(#125)**:弹窗内容过多时改为在弹窗内滚动,底部按钮常驻。 - **文件传输面板文件多时上传按钮被挤成一条线(#125)**;文件列表改为最新的在最上面;上传进实例的文件时间不再是 1970 年。 - **功能键栏在安卓上错位、回车键极小(#125)**:改用图标。 - **手机上桌面页顶部按钮超出屏幕、点不到(#126)**。 - 有人开着远程桌面时,内存看门狗不再做 soft 重启(此前浏览器标签页放到后台就会被判为无人使用)。 - Chromium 实例不再往数据卷里无限写入

  2. ## 桌面连不上,终于能查了(issue #124) 有用户反馈「一直卡在桌面正在启动 / 重连中…」,但导出诊断里**什么线索都没有**。查下来发现是我们自己的锅:面板处理 WebSocket 连接时有三道校验(Host 白名单 / URL 解析 / 会话权限),**任何一道不通过都是静默断开,不留任何日志**。于是用户只看到「重连中」,我们也无从下手。 - **三条拒绝路径全部留痕**,写入对应实例日志 + 面板日志,导出诊断即可看到: - Host 被拒时回显实际收到的 `Host` / `X-Forwarded-Host`,并提示加 `PANEL_ALLOWED_HOSTS` - 会话失败细分为「没带 cookie / 会话过期 / 用户不存在 / 被禁用 / 无权限」——反代吞 Cookie 头是常见成因 - 同一实例同一原因 60 秒只记一条,避免 2 秒一次的重连把日志刷爆 ## Tailscale / 内网 IPv6 现在能直接访问了 这两种此前会被直接 400 拒绝(实测确认): - **Tailscale / Headscale 的 CGNAT 段 `100.64.0.0/10`** - **内网 IPv6**:`fc00::/7`(ULA,含 Tailscale 的 `fd7a::/48`)与 `fe80::/10`(链路本地)—— 此前只放行 `::1`,纯 IPv6 内网用户完全进不来 安全性与原有的 RFC1918 放行同理:校验的是 Host 头字面量,DNS-rebinding 攻击者的 Host 是自己的域名,匹配不上。 ## 微信装不上时不再误导你去查网络 盘写满时 `curl` 以退出码 23(本地写失败)反复卡在同一字节,连进度文件都写不进去(面板显示无下载进度),此前的报错却提示「请检查网络」—— 真实案例里用户为此查了半天代理。现在下载前先 `df` 预检、失败后按退出码复查,直接报「磁盘空间不足」并给出清理指引。 ## 输入体验(issue #125) - **自动回车开关**:转发输入条右侧新增 `↵` 开关。关掉后只把文字**填进**应用输入框、不代发,方便先编辑再自己发(按钮文案随之变「填入」)。默认保持原有行为。 - **功能键排**:左侧 `Fn` 展开 `Esc` `Tab` `退格` `Del` `↵` `←` `↑` `↓` `→`,这些键在 VNC 里常被浏览器吞掉,手机端更是没有。 - **齿轮图标**:旧图标路径混进了绝对指令,有两颗齿走形(右下最明显),已换成对称版本。 - **子用户文案**:「重启实例」按钮本就按权限隐藏,但提示文字没跟着改,子用户会照着找一个不存在的按钮,现改为提示联系管理员。 --- 镜像:`ghcr.io/gloridust/{wo

  3. ## 本次修复 ### 微信下载/安装:断点续传,装得完 此前网络半路被掐断时,下次触发会**删掉下到一半的包从 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)。升级方式不变:面板「检查更新」一键升级。

  4. > 修复两个会让面板「更新了却没变化 / 实例永远停在老镜像」的问题,尤其影响国内 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`。

  5. > 很多用户反馈「历史镜像占满磁盘」。本版让面板在升级后自动清理不再使用的旧版本镜像。 ## 修复 - 此前只清理「悬空镜像」(无 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;随后到「管理」→「一键升级全部实例」。

Commits per week

last 52 weeks
430Week 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: 24 commitsWeek of 2026-07-12: 7 commitsWeek of 2026-07-19: 3 commitsWeek of 2026-07-26: 4 commitsWeek of 2026-08-02: 0 commitsWeek of 2026-08-09: 0 commitsWeek of 2026-08-16: 0 commitsWeek of 2026-08-23: 0 commitsWeek of 2026-08-30: 0 commitsWeek of 2026-09-06: 0 commitsWeek of 2026-09-13: 0 commitsWeek of 2026-09-20: 8 commitsSep 28, 2025Sep 20, 2026
147 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 — 2 commitsSun 11:00 — 0 commitsSun 12:00 — 1 commitsSun 13:00 — 4 commitsSun 14:00 — 0 commitsSun 15:00 — 4 commitsSun 16:00 — 6 commitsSun 17:00 — 4 commitsSun 18:00 — 3 commitsSun 19:00 — 2 commitsSun 20:00 — 1 commitsSun 21:00 — 5 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 — 3 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 — 2 commitsTue 23:00 — 2 commitsWed 0:00 — 2 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 — 2 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 — 7 commitsFri 15:00 — 2 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 commits138 (90%)
Community commits15 (10%)

153 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.

    456.7K stars · TypeScript

  • openclaw/openclaw

    The AI that really does things. Any OS. Any Platform. The lobster way. 🦞

    391.3K stars · TypeScript

  • anomalyco/opencode

    The open source coding agent.

    211.7K stars · TypeScript

  • n8n-io/n8n

    Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.

    206.7K stars · TypeScript

  • microsoft/vscode

    Visual Studio Code

    193.5K stars · TypeScript

  • firecrawl/firecrawl

    Supercharge your AI agents with data from the web and beyond. Building the library for superintelligence. 🔥

    188.6K stars · TypeScript