WechatOnCloud/docker/Dockerfile
Kris a2201d8be3 feat: 新增woc-bridge服务及配套能力
新增完整的woc-bridge业务服务,实现微信API代理、密钥自动提取、消息队列限流等功能:
1. 新增bridge核心代码与s6服务配置
2. 新增ptrace权限初始化脚本与docker配置
3. 新增M2M鉴权API代理与环境变量配置
4. 新增SQLCipher解密、密钥缓存、二维码截图等工具模块
5. 完善docker构建与实例部署配置
2026-07-07 19:04:13 +08:00

135 lines
6.4 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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; \
# 中文字体(否则界面/消息显示方块)+ 语言环境 + 下载/解压工具
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 动态 dlopenldd 查不到,需主动装。
RUN set -eux; \
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.jsapp/ui.js 是未打包源码、运行时不加载),故必须改 bundle。
COPY docker/woc-www-patch.sh docker/woc-ime.pl /woc/
RUN chmod 755 /woc/woc-www-patch.sh && chmod 644 /woc/woc-ime.pl && /woc/woc-www-patch.sh
# 微信下载/解压控制脚本(运行时由面板经 docker exec 触发,状态写入数据卷 /config/.woc-state
COPY docker/wechat-ctl.sh /woc/wechat-ctl.sh
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 的、不需可执行位。
COPY docker/app-defs.sh docker/app-ctl.sh /woc/
RUN chmod 644 /woc/app-defs.sh && chmod 755 /woc/app-ctl.sh
# openbox 会话启动时执行此脚本:等待微信就绪 + 常驻拉起微信 + 最小化自动复原看守
COPY docker/autostart /defaults/autostart
RUN chmod 755 /defaults/autostart
# 启动钩子00给每个实例唯一且持久的 machine-id避免所有实例共用镜像里烤死的同一个
# 触发腾讯"设备农场"风控导致登录即被强制退出。须在 autostart拉起微信之前执行故用 00 前缀。
COPY docker/woc-identity.sh /custom-cont-init.d/00-woc-identity
RUN chmod 755 /custom-cont-init.d/00-woc-identity
# 启动钩子01每次启动用镜像内最新 autostart 覆盖数据卷旧副本(否则旧实例升级后用不上新逻辑)
COPY docker/woc-update-autostart /custom-cont-init.d/01-woc-autostart
RUN chmod 755 /custom-cont-init.d/01-woc-autostart
# 启动钩子02把容器环境 WOC_APP_TYPE 写入 /config/.woc-app供 autostart 选择启动哪个应用。
# 须在 autostart 之前执行;缺 WOC_APP_TYPE 则不写 → autostart 回退微信(向后兼容)。
COPY docker/woc-app-init.sh /custom-cont-init.d/02-woc-app
RUN chmod 755 /custom-cont-init.d/02-woc-app
# 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
# 3000 = HTTP web 客户端, 3001 = HTTPS
# ===== 新增woc-bridge 业务 API 服务 =====
# 安装 Python3 + 依赖 + sqlite3DB 读取用)+ 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 \
cryptography; \
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