WechatOnCloud/.env.example
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

149 lines
10 KiB
Plaintext
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.

# 复制本文件为 .env 即可覆盖默认配置。全部可选——不建 .env 也能直接 `docker compose up -d`。
# 面板首个管理员账号 / 密码(仅首次启动、无账号文件时写入)。强烈建议改掉默认密码!
WOC_USER=admin
WOC_PASSWORD=wechat
# 镜像版本:默认 latest上线后建议钉到具体版本如 1.0.0,注意不带 v以便可控升级。
# 同时作用于面板镜像和新建微信实例所用镜像。
WOC_VERSION=latest
# 镜像源前缀registry + 命名空间)。本项目镜像同步发布到 Docker Hub 和 GHCR。
#
# 默认走 Docker Hub国内/国际通用、无需登录即可拉公开镜像,飞牛 OS(fnOS) 等 NAS 还内置拉取加速。
# 拉不动时按需切到备用源:
# WOC_IMAGE_PREFIX=ghcr.io/gloridust # GitHub Container Registry备用
# WOC_IMAGE_PREFIX=ghcr.nju.edu.cn/gloridust # 南京大学镜像站反代 ghcr.io国内较稳
# WOC_IMAGE_PREFIX=registry.cn-hangzhou.aliyuncs.com/你的命名空间 # 自己的阿里云 ACR / 腾讯 TCR / 华为 SWR
#
# 反代会把 docker.io/gloridust/xxx或 ghcr.io/gloridust/xxx映射为 <反代>/gloridust/xxx。
WOC_IMAGE_PREFIX=docker.io/gloridust
# 宿主用户 uid/gid飞牛上用 `id` 命令查看;单用户 NAS 一般是 1000
# 透传给每个微信实例容器,决定面板数据与微信数据卷的属主。
WOC_PUID=1000
WOC_PGID=1000
# 时区
WOC_TZ=Asia/Shanghai
# 面板对外端口(宿主侧,默认用冷门端口避免冲突;容器内固定 8080
# 面板是唯一对外入口;微信实例不直接对宿主暴露,由面板反向代理。
WOC_HTTP_PORT=36080
# 面板允许的 Host 头白名单。用于阻止 DNS rebinding攻击者控制的域名解析到面板
# LAN/loopback 地址后,浏览器视其为同源、自动带上面板 cookie能从受害者浏览器内
# 发起任何已鉴权 API 调用(含挂载 docker.sock 的管理端点sameSite=lax 不挡此攻击。
#
# 默认始终放行localhost / 127.0.0.1 / ::1 + RFC1918 私网10/8、172.16-31/12、
# 192.168/16、169.254/16—— 覆盖直连 NAS / 局域网访问场景,**不需要改任何东西**。
#
# 套 HTTPS 反代部署Caddy / nginx / 飞牛 内置反代 / Cloudflare Tunnel 等)时,把对外
# 域名加进来。**支持多个域名,用英文逗号分隔**;填免端口主机名,大小写不敏感:
#
# 单域名: PANEL_ALLOWED_HOSTS=woc.example.com
# 多域名: PANEL_ALLOWED_HOSTS=woc.example.com,woc.lan,wechat.mynas.cn
# 通配子域: PANEL_ALLOWED_HOSTS=*.example.com (匹配 a.example.com不含裸 example.com
# 含 IPv6 字面量PANEL_ALLOWED_HOSTS=[2001:db8::1]
#
# 改完务必用 **docker compose up -d** 让容器带新环境重建;只 `docker restart` **不会**加载新值!
#
# 排错:若反代/Cloudflare 部署后仍看到 400 "Host header not allowed",错误响应里会回显面板实际
# 收到的 host / forwardedHost —— 把那个值(或其通配)加进本白名单即可。面板也会自动接受
# X-Forwarded-Host可信反代设置故多数反代无需额外配置。
PANEL_ALLOWED_HOSTS=
# ── 音频 / 麦克风 / 摄像头 ───────────────────────────────────
# 音频(听)**自动开启**,进入桌面、点一下画面(浏览器自动播放策略要求一次手势)即可出声,
# 无需手动找工具条。仅当前聚焦的实例出声,切走/切到别的实例会自动断开,避免多端串音。
# 麦克风(说) / 摄像头(视频):浏览器要求"安全上下文",即必须通过 HTTPS 访问面板
# (或 localhost。生产环境务必给面板套 HTTPS反代/证书),否则浏览器会禁用麦克风与摄像头。
#
# 摄像头还需要宿主提供一个虚拟视频设备v4l2loopback
# 1) 宿主安装并加载内核模块:
# Ubuntu/Debian: sudo apt install v4l2loopback-dkms && sudo modprobe v4l2loopback
# (飞牛/其它发行版若自带 v4l2loopback 同理 modprobe没有则摄像头不可用其余功能正常
# 2) 确认出现了 /dev/videoN 设备。
# 3) 二选一让实例容器拿到该设备:
# a) 自动:保留 compose 里的 `/dev:/host-dev:ro` 挂载,面板会自动探测并映射;
# b) 显式:在下面列出设备(逗号分隔),并可删掉那条 /host-dev 挂载。
# 留空 = 不映射摄像头(音频/麦克风不受影响)。
WOC_VIDEO_DEVICES=
# ── 实例资源 / 稳定性 ───────────────────────────────────────
# GPU 硬件编码baseimage 检测到 /dev/dri/renderD* 时会给 Xvnc 加 -hw3dGPU 加速编码)。
# 在 WSL2 / 虚拟 GPU如 Docker Desktop on Windows该路径会导致 Xvnc 内存持续膨胀
# (实测 21 小时涨到 ~9GB。本项目已强制软件渲染LIBGL_ALWAYS_SOFTWARE=1hw3d 对微信
# 这类静态界面收益甚微,故默认关闭。仅在你有真实可用的 GPU 且确认无内存问题时再设为 1 启用。
WOC_ENABLE_GPU=
# 每个微信实例容器的内存上限GiB。默认空 = 不限制(与旧版一致)。
# 作为兜底:万一某进程异常增长,命中上限时容器内 OOM 杀进程、由 s6 自动重启 VNC
# 避免拖垮整台宿主。常规使用单实例约需 1~1.5GiB,设 3~4 较稳妥。
WOC_INSTANCE_MEM_GB=
# ── 设备伪装(降低被微信判"非真实设备"风控的概率) ───────────
# 每个实例默认已自动做:唯一且持久的 machine-id避免全网共用同一个触发"设备农场"风控)、
# 像个人电脑的 hostname不再是 woc-wx-<hex>)、移除 /.dockerenv 容器标记。这些恒定开启。
#
# WOC_SPOOF_OS 是否把 /etc/os-release 伪装成 deepin微信官方支持的发行版且 Deepin 基于
# Debian、与本镜像用户态一致。默认 1设 0 恢复显示真实 Debian。
# 说明:设备伪装是「尽力而为」,非保证不被封;详见 doc/设备伪装.md。
WOC_SPOOF_OS=1
# 实例桌面深色:无需在此配置。面板顶栏右上角的主题开关(管理员)控制,设置持久化在面板数据。
# 仅对**浏览器(Chromium)实例**生效(--force-dark-mode重启实例后生效微信不吃命令行参数、也不跟随
# 极简容器的桌面信号,微信深色请在微信「设置→通用→深色模式」里手动选(随数据卷持久化)。
# ── 自愈 watchdog应对 KasmVNC/Xvnc 长跑内存泄漏) ───────────
# 实测 Xvnc 长跑 24h 可膨胀到 ~9GiB原因在 KasmVNC/Xvnc 自身的 framebuffer / 软渲染 cache
# 累积,不归本项目控制。面板内置一个 watchdog周期性检查每个 running 实例的 working set
# 内存(= docker stats 显示值),按两档阈值(这里设全局默认;每个实例可在「管理 → 实例卡片
# → 安全」按钮里单独覆盖)触发主动 stop + run聊天数据在卷里、登录态本来也会定期失效
# 可控时机自愈优于撑到 OOM
#
# soft 超过且【当前没人在远程会话】才重启 → 柔和自愈,不打扰使用者
# hard 超过即重启(无视会话),防止 OOM 拖垮宿主
#
# WOC_INSTANCE_MEM_SOFT_MB soft 阈值MiB默认 1500
# WOC_INSTANCE_MEM_HARD_MB hard 阈值MiB默认 2500兼容旧名 WOC_INSTANCE_MEM_LIMIT_MB
# WOC_WATCHDOG_INTERVAL_SEC 巡检间隔秒,默认 3005 分钟);最小 600 = 关闭整个 watchdog
# WOC_WATCHDOG_HEALTH_FAILS VNC 响应性探测:连续无响应几次才重启实例;默认 0 = 关闭该探测(仅保留内存自愈)。
# 健康实例探测约 1ms但宿主级 CPU/IO 偶发争用会让探测超时被误判为卡死而重启正常实例,故默认关闭;
# 想要"卡在正在连接桌面"时自动兜底,可设为正整数(如 3 = 连续 3 次≈15 分钟无响应才重启)。
#
# 调参建议:日常活跃单实例约 1500 MiBsoft 应略高于此(如 2000hard 远低于宿主可用内存。
WOC_INSTANCE_MEM_SOFT_MB=1500
WOC_INSTANCE_MEM_HARD_MB=2500
WOC_WATCHDOG_INTERVAL_SEC=300
# WOC_WATCHDOG_HEALTH_FAILS=0
# ── bridge 业务 API 的 M2M 鉴权 ─────────────────────────────
# 外部系统(如 ForcePilot 后端)以 M2M 方式调用 /api/bridge/:id/* 时所需的 Bearer token。
# 配置后,这些请求只需带 Authorization: Bearer <token> 即可,无需管理员会话 cookie。
# 不配置(留空)时退化为仅允许管理员会话鉴权(兼容旧部署,浏览器访问不受影响)。
#
# 生成建议: openssl rand -hex 32 (64 位十六进制字符)
#
# 权限范围: 持有该 token 即可访问全部实例的全部 bridge 业务 API
# (发消息/读消息/查联系人/退出登录/重启微信等),无 per-instance / per-action 粒度。
# 请妥善保管;轮换时修改 .env 后 `docker compose up -d` 重建面板容器即生效。
#
# 调用示例(ForcePilot 侧):
# GET http://<nas_host>:36080/api/bridge/<instance_id>/api/messages/since
# Authorization: Bearer <WOC_BRIDGE_API_TOKEN>
WOC_BRIDGE_API_TOKEN=
# ── woc-bridge 业务 API ──────────────────────────────────────
# bridge 服务在实例容器内监听 8088 端口,由面板 /api/bridge/:id/* 反代访问。
# 端口 8088 与 Dockerfile EXPOSE / 面板反代 target 三处耦合,不可配置;
# 以下配置作用于 bridge 服务行为(由面板 envList 透传给实例容器):
# WOC_BRIDGE_SEND_DELAY_MS 发送消息串行化间隔(毫秒),默认 800
# WOC_BRIDGE_MAX_BATCH_SIZE 单次消息拉取建议上限,默认 50/api/status 返回)
# WOC_BRIDGE_POLL_INTERVAL_MS 轮询建议间隔(毫秒),默认 2000/api/status 返回)
# WOC_BRIDGE_MAX_CALLS_PER_SEC 单实例每秒调用上限,默认 10
WOC_BRIDGE_SEND_DELAY_MS=800
WOC_BRIDGE_MAX_BATCH_SIZE=50
WOC_BRIDGE_POLL_INTERVAL_MS=2000
WOC_BRIDGE_MAX_CALLS_PER_SEC=10