WechatOnCloud/docker/Dockerfile
Kris c45282f094 feat: 新增好友自动通过、UI自动化能力与多分辨率适配
- 新增登录状态守卫后台任务
- 新增好友申请自动通过规则引擎
- 新增多分辨率UI配置与模板资源
- 新增消息拉取复合游标支持
- 优化发送队列与UI自动化逻辑
- 新增批量发送日志与错误处理
- 优化Docker镜像构建与ptrace初始化
- 新增联系人名称缓存预热
2026-07-17 18:10:31 +08:00

151 lines
7.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; \
# 中文字体(否则界面/消息显示方块)+ 语言环境 + 下载/解压工具
# 构建环境可能无法直连 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; \
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; \
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; \
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
# 预创建 X11 Unix socket 目录并设置 sticky 全局可写权限,
# 避免 Xvnc 以非 root 用户启动时因 euid != 0 报 _XSERVTransmkdir ERROR。
RUN mkdir -p /tmp/.X11-unix && chmod 1777 /tmp/.X11-unix
# 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 \
opencv-python-headless \
numpy; \
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