# 复制本文件为 .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 加 -hw3d(GPU 加速编码)。 # 在 WSL2 / 虚拟 GPU(如 Docker Desktop on Windows)下,该路径会导致 Xvnc 内存持续膨胀 # (实测 21 小时涨到 ~9GB)。本项目已强制软件渲染(LIBGL_ALWAYS_SOFTWARE=1),hw3d 对微信 # 这类静态界面收益甚微,故默认关闭。仅在你有真实可用的 GPU 且确认无内存问题时再设为 1 启用。 WOC_ENABLE_GPU= # 每个微信实例容器的内存上限(GiB)。默认空 = 不限制(与旧版一致)。 # 作为兜底:万一某进程异常增长,命中上限时容器内 OOM 杀进程、由 s6 自动重启 VNC, # 避免拖垮整台宿主。常规使用单实例约需 1~1.5GiB,设 3~4 较稳妥。 WOC_INSTANCE_MEM_GB= # ── 设备伪装(降低被微信判"非真实设备"风控的概率) ─────────── # 每个实例默认已自动做:唯一且持久的 machine-id(避免全网共用同一个,触发"设备农场"风控)、 # 像个人电脑的 hostname(不再是 woc-wx-)、移除 /.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 巡检间隔秒,默认 300(5 分钟);最小 60;0 = 关闭整个 watchdog # WOC_WATCHDOG_HEALTH_FAILS VNC 响应性探测:连续无响应几次才重启实例;默认 0 = 关闭该探测(仅保留内存自愈)。 # 健康实例探测约 1ms,但宿主级 CPU/IO 偶发争用会让探测超时被误判为卡死而重启正常实例,故默认关闭; # 想要"卡在正在连接桌面"时自动兜底,可设为正整数(如 3 = 连续 3 次≈15 分钟无响应才重启)。 # # 调参建议:日常活跃单实例约 1500 MiB;soft 应略高于此(如 2000);hard 远低于宿主可用内存。 WOC_INSTANCE_MEM_SOFT_MB=1500 WOC_INSTANCE_MEM_HARD_MB=2500 WOC_WATCHDOG_INTERVAL_SEC=300 # WOC_WATCHDOG_HEALTH_FAILS=0