2026-07-05 03:50:30 +08:00
|
|
|
|
# WechatOnCloud —— 在浏览器里访问服务端微信
|
|
|
|
|
|
# 基于 linuxserver 的 KasmVNC 基础镜像(多架构 amd64/arm64):
|
|
|
|
|
|
# 自带 Xvfb + openbox + KasmVNC + web 客户端(3000/3001)
|
|
|
|
|
|
FROM lscr.io/linuxserver/baseimage-kasmvnc:debianbookworm
|
|
|
|
|
|
|
|
|
|
|
|
# 微信本体不再在构建时下载/安装,改为运行时由面板点击下载、解压到数据卷 /config
|
|
|
|
|
|
#(见 wechat-ctl.sh)。构建时只装:中文字体、语言环境、下载工具,以及微信运行所
|
|
|
|
|
|
# 需的全部系统库(这些需 root/apt,必须 bake 进镜像)。
|
|
|
|
|
|
ENV DEBIAN_FRONTEND=noninteractive
|
|
|
|
|
|
|
|
|
|
|
|
RUN set -eux; \
|
|
|
|
|
|
# 中文字体(否则界面/消息显示方块)+ 语言环境 + 下载/解压工具
|
2026-07-17 18:10:31 +08:00
|
|
|
|
# 构建环境可能无法直连 deb.debian.org,优先使用国内镜像源
|
|
|
|
|
|
if [ -f /etc/apt/sources.list ]; then \
|
|
|
|
|
|
cp /etc/apt/sources.list /etc/apt/sources.list.bak; \
|
|
|
|
|
|
sed -i 's|http://deb.debian.org/debian|https://mirrors.tuna.tsinghua.edu.cn/debian|g' /etc/apt/sources.list; \
|
|
|
|
|
|
sed -i 's|http://security.debian.org/debian-security|https://mirrors.tuna.tsinghua.edu.cn/debian-security|g' /etc/apt/sources.list; \
|
|
|
|
|
|
fi; \
|
2026-07-05 03:50:30 +08:00
|
|
|
|
apt-get update; \
|
|
|
|
|
|
apt-get install -y --no-install-recommends \
|
|
|
|
|
|
curl ca-certificates locales dpkg \
|
|
|
|
|
|
fonts-wqy-zenhei fonts-wqy-microhei fonts-noto-cjk fonts-noto-color-emoji \
|
|
|
|
|
|
libnss3 libgbm1 libasound2 libxss1 \
|
|
|
|
|
|
xz-utils \
|
|
|
|
|
|
chromium \
|
|
|
|
|
|
xdotool xclip \
|
|
|
|
|
|
xwallpaper xsettingsd; \
|
|
|
|
|
|
sed -i 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/' /etc/locale.gen; \
|
|
|
|
|
|
locale-gen; \
|
|
|
|
|
|
apt-get clean; \
|
|
|
|
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
|
|
|
|
|
|
|
|
# 微信运行时需要、但官方 deb 未声明的额外库(单独成层,避免动到上面缓存的安装层)。
|
|
|
|
|
|
# 微信原生版是 Qt 程序,依赖一组 xcb 平台库;libxcb-cursor0 由 Qt 动态 dlopen,ldd 查不到,需主动装。
|
|
|
|
|
|
RUN set -eux; \
|
2026-07-17 18:10:31 +08:00
|
|
|
|
if [ -f /etc/apt/sources.list ]; then \
|
|
|
|
|
|
sed -i 's|http://deb.debian.org/debian|https://mirrors.tuna.tsinghua.edu.cn/debian|g' /etc/apt/sources.list; \
|
|
|
|
|
|
sed -i 's|http://security.debian.org/debian-security|https://mirrors.tuna.tsinghua.edu.cn/debian-security|g' /etc/apt/sources.list; \
|
|
|
|
|
|
fi; \
|
2026-07-05 03:50:30 +08:00
|
|
|
|
apt-get update; \
|
|
|
|
|
|
apt-get install -y --no-install-recommends \
|
|
|
|
|
|
libatomic1 \
|
|
|
|
|
|
libxdamage1 \
|
|
|
|
|
|
libxkbcommon-x11-0 \
|
|
|
|
|
|
libxcb-icccm4 \
|
|
|
|
|
|
libxcb-image0 \
|
|
|
|
|
|
libxcb-keysyms1 \
|
|
|
|
|
|
libxcb-render-util0 \
|
|
|
|
|
|
libxcb-xkb1 \
|
|
|
|
|
|
libxcb-cursor0 \
|
|
|
|
|
|
# WeChatAppEx 是 Chromium 内核,需 GTK3 全家桶 + 一组 X 扩展 + cups
|
|
|
|
|
|
libgtk-3-0 \
|
|
|
|
|
|
libatk1.0-0 \
|
|
|
|
|
|
libatk-bridge2.0-0 \
|
|
|
|
|
|
libatspi2.0-0 \
|
|
|
|
|
|
libcups2 \
|
|
|
|
|
|
libxcomposite1 \
|
|
|
|
|
|
libxrandr2 \
|
|
|
|
|
|
libxfixes3 \
|
|
|
|
|
|
libxtst6 \
|
|
|
|
|
|
libxshmfence1 \
|
|
|
|
|
|
libdrm2; \
|
|
|
|
|
|
apt-get clean; \
|
|
|
|
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
|
|
|
|
|
|
|
|
# 字体/字体配置目录都在会话 HOME=/config 下(数据卷,运行时才挂载),故不在此预建;
|
|
|
|
|
|
# 由 autostart 在启动时按需 mkdir + 建 ~/.local/share/fonts → /config/.fonts 软链(见 docker/autostart)。
|
|
|
|
|
|
|
|
|
|
|
|
ENV LANG=zh_CN.UTF-8 \
|
|
|
|
|
|
LC_ALL=zh_CN.UTF-8 \
|
|
|
|
|
|
LIBGL_ALWAYS_SOFTWARE=1
|
|
|
|
|
|
|
|
|
|
|
|
# 改 KasmVNC web 客户端的 webpack 产物 dist/*.bundle.js:
|
|
|
|
|
|
# (1) 默认开启 IME 输入模式:本地(客户端)输入法打中文,拼音联想在本地完成、只把成品汉字
|
|
|
|
|
|
# 发进容器,无需容器内装 IME。默认值仅在浏览器未存过该设置时生效,不覆盖用户手动改过的偏好。
|
|
|
|
|
|
# (2) 修复 noVNC 中文 IME 输入:原实现靠隐藏 textarea 差分逐字符重发 keysym,会泄漏中间拼音、
|
|
|
|
|
|
# 累积不 reset、退格风暴,导致大量丢字 / ~21 字卡住 / 跨浏览器不稳。改为只在 compositionend
|
|
|
|
|
|
# 用 e.data 直发成品字符串(详见 woc-www-patch.sh / woc-ime.pl)。
|
|
|
|
|
|
# 注意:实际加载的是 webpack 产物 dist/main.bundle.js(app/ui.js 是未打包源码、运行时不加载),故必须改 bundle。
|
2026-07-07 19:04:13 +08:00
|
|
|
|
COPY docker/woc-www-patch.sh docker/woc-ime.pl /woc/
|
2026-07-05 03:50:30 +08:00
|
|
|
|
RUN chmod 755 /woc/woc-www-patch.sh && chmod 644 /woc/woc-ime.pl && /woc/woc-www-patch.sh
|
|
|
|
|
|
|
|
|
|
|
|
# 微信下载/解压控制脚本(运行时由面板经 docker exec 触发,状态写入数据卷 /config/.woc-state)
|
2026-07-07 19:04:13 +08:00
|
|
|
|
COPY docker/wechat-ctl.sh /woc/wechat-ctl.sh
|
2026-07-05 03:50:30 +08:00
|
|
|
|
RUN chmod 755 /woc/wechat-ctl.sh
|
|
|
|
|
|
|
|
|
|
|
|
# v1.2.0 多应用:应用定义(app-defs.sh,被 autostart/app-ctl 引用)+ 通用安装/状态控制(app-ctl.sh,
|
|
|
|
|
|
# 微信委托回 wechat-ctl.sh、其它应用各自实现)。app-defs.sh 是被 source 的、不需可执行位。
|
2026-07-07 19:04:13 +08:00
|
|
|
|
COPY docker/app-defs.sh docker/app-ctl.sh /woc/
|
2026-07-05 03:50:30 +08:00
|
|
|
|
RUN chmod 644 /woc/app-defs.sh && chmod 755 /woc/app-ctl.sh
|
|
|
|
|
|
|
|
|
|
|
|
# openbox 会话启动时执行此脚本:等待微信就绪 + 常驻拉起微信 + 最小化自动复原看守
|
2026-07-07 19:04:13 +08:00
|
|
|
|
COPY docker/autostart /defaults/autostart
|
2026-07-05 03:50:30 +08:00
|
|
|
|
RUN chmod 755 /defaults/autostart
|
|
|
|
|
|
|
|
|
|
|
|
# 启动钩子(00):给每个实例唯一且持久的 machine-id,避免所有实例共用镜像里烤死的同一个,
|
|
|
|
|
|
# 触发腾讯"设备农场"风控导致登录即被强制退出。须在 autostart(拉起微信)之前执行,故用 00 前缀。
|
2026-07-07 19:04:13 +08:00
|
|
|
|
COPY docker/woc-identity.sh /custom-cont-init.d/00-woc-identity
|
2026-07-05 03:50:30 +08:00
|
|
|
|
RUN chmod 755 /custom-cont-init.d/00-woc-identity
|
|
|
|
|
|
|
|
|
|
|
|
# 启动钩子(01):每次启动用镜像内最新 autostart 覆盖数据卷旧副本(否则旧实例升级后用不上新逻辑)
|
2026-07-07 19:04:13 +08:00
|
|
|
|
COPY docker/woc-update-autostart /custom-cont-init.d/01-woc-autostart
|
2026-07-05 03:50:30 +08:00
|
|
|
|
RUN chmod 755 /custom-cont-init.d/01-woc-autostart
|
|
|
|
|
|
|
|
|
|
|
|
# 启动钩子(02):把容器环境 WOC_APP_TYPE 写入 /config/.woc-app,供 autostart 选择启动哪个应用。
|
|
|
|
|
|
# 须在 autostart 之前执行;缺 WOC_APP_TYPE 则不写 → autostart 回退微信(向后兼容)。
|
2026-07-07 19:04:13 +08:00
|
|
|
|
COPY docker/woc-app-init.sh /custom-cont-init.d/02-woc-app
|
2026-07-05 03:50:30 +08:00
|
|
|
|
RUN chmod 755 /custom-cont-init.d/02-woc-app
|
|
|
|
|
|
|
2026-07-07 19:04:13 +08:00
|
|
|
|
# ptrace 权限配置(key_extractor 读微信进程内存需要)
|
|
|
|
|
|
COPY docker/woc-ptrace-init.sh /custom-cont-init.d/03-woc-ptrace
|
|
|
|
|
|
RUN chmod 755 /custom-cont-init.d/03-woc-ptrace
|
|
|
|
|
|
|
2026-07-17 18:10:31 +08:00
|
|
|
|
# 预创建 X11 Unix socket 目录并设置 sticky 全局可写权限,
|
|
|
|
|
|
# 避免 Xvnc 以非 root 用户启动时因 euid != 0 报 _XSERVTransmkdir ERROR。
|
|
|
|
|
|
RUN mkdir -p /tmp/.X11-unix && chmod 1777 /tmp/.X11-unix
|
|
|
|
|
|
|
2026-07-05 03:50:30 +08:00
|
|
|
|
# 3000 = HTTP web 客户端, 3001 = HTTPS
|
2026-07-07 19:04:13 +08:00
|
|
|
|
# ===== 新增:woc-bridge 业务 API 服务 =====
|
|
|
|
|
|
# 安装 Python3 + 依赖 + sqlite3(DB 读取用)+ scrot(截图用,供 /api/screenshot 与 /api/login/qr/*)
|
|
|
|
|
|
RUN set -eux; \
|
|
|
|
|
|
apt-get update; \
|
|
|
|
|
|
apt-get install -y --no-install-recommends \
|
|
|
|
|
|
python3 python3-pip \
|
|
|
|
|
|
sqlite3 \
|
|
|
|
|
|
scrot; \
|
|
|
|
|
|
pip3 install --break-system-packages --no-cache-dir \
|
|
|
|
|
|
fastapi==0.115.0 \
|
|
|
|
|
|
"uvicorn[standard]==0.30.0" \
|
|
|
|
|
|
python-multipart==0.0.9 \
|
|
|
|
|
|
pillow==10.4.0 \
|
2026-07-17 18:10:31 +08:00
|
|
|
|
cryptography \
|
|
|
|
|
|
opencv-python-headless \
|
|
|
|
|
|
numpy; \
|
2026-07-07 19:04:13 +08:00
|
|
|
|
apt-get clean; \
|
|
|
|
|
|
rm -rf /var/lib/apt/lists/*
|
|
|
|
|
|
|
|
|
|
|
|
# 拷贝 bridge 服务代码到 /opt/woc-bridge/
|
|
|
|
|
|
COPY bridge/ /opt/woc-bridge/
|
|
|
|
|
|
RUN chmod 755 /opt/woc-bridge/server.py
|
|
|
|
|
|
|
|
|
|
|
|
# 注册为 s6-rc longrun 服务(svc-woc-bridge)
|
|
|
|
|
|
RUN mkdir -p /etc/s6-overlay/s6-rc.d/svc-woc-bridge
|
|
|
|
|
|
COPY bridge/s6/woc-bridge/run /etc/s6-overlay/s6-rc.d/svc-woc-bridge/run
|
|
|
|
|
|
COPY bridge/s6/woc-bridge/type /etc/s6-overlay/s6-rc.d/svc-woc-bridge/type
|
|
|
|
|
|
RUN chmod 755 /etc/s6-overlay/s6-rc.d/svc-woc-bridge/run \
|
|
|
|
|
|
&& touch /etc/s6-overlay/s6-rc.d/user/contents.d/svc-woc-bridge
|
|
|
|
|
|
|
|
|
|
|
|
# 3000 = KasmVNC web 客户端(HTTP), 3001 = KasmVNC web 客户端(HTTPS), 8088 = woc-bridge 业务 API
|
|
|
|
|
|
EXPOSE 3000 3001 8088
|