# 复制本文件为 .env 即可覆盖默认配置。全部可选——不建 .env 也能直接 `docker compose up -d`。

# 面板首个管理员账号 / 密码（仅首次启动、无账号文件时写入）。强烈建议改掉默认密码！
WOC_USER=admin
WOC_PASSWORD=wechat

# 镜像版本：默认 latest；上线后建议钉到具体版本（如 1.0.0，注意不带 v）以便可控升级。
# 同时作用于面板镜像和新建微信实例所用镜像。
WOC_VERSION=latest

# 镜像源前缀（registry + 命名空间）。本项目镜像同步发布到 GHCR 和 Docker Hub。
#
# 默认走 GHCR；如果 ghcr.io 拉不动，按需切到其它源：
#   WOC_IMAGE_PREFIX=docker.io/gloridust            # Docker Hub（国际网络通用、无需 PAT 即可拉公开镜像）
#   WOC_IMAGE_PREFIX=ghcr.nju.edu.cn/gloridust      # 南京大学镜像站反代 ghcr.io（国内较稳）
#   WOC_IMAGE_PREFIX=registry.cn-hangzhou.aliyuncs.com/你的命名空间  # 自己的阿里云 ACR / 腾讯 TCR / 华为 SWR
#
# 反代会把 ghcr.io/gloridust/xxx 映射为 <反代>/gloridust/xxx。
WOC_IMAGE_PREFIX=ghcr.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-<hex>）、移除 /.dockerenv 容器标记。这些恒定开启。
#
# WOC_SPOOF_OS  是否把 /etc/os-release 伪装成 deepin（微信官方支持的发行版，且 Deepin 基于
#               Debian、与本镜像用户态一致）。默认 1（开）；设 0 恢复显示真实 Debian。
#               说明：设备伪装是「尽力而为」，非保证不被封；详见 doc/设备伪装.md。
WOC_SPOOF_OS=1

# ── 自愈 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
#
# 调参建议：日常活跃单实例约 1500 MiB；soft 应略高于此（如 2000）；hard 远低于宿主可用内存。
WOC_INSTANCE_MEM_SOFT_MB=1500
WOC_INSTANCE_MEM_HARD_MB=2500
WOC_WATCHDOG_INTERVAL_SEC=300
