Files
drouter/packaging/docker/docker-compose.yml
T
liuzhuohua cd5ef7411f fix: 清「假输入框 / 隐身字段」这批前后端缺陷,版本号 1.0.4
把全量代码(后端 9 模块 + 前端单文件 SPA,约 4.5 万行)过了一遍,用 AST 抽出
渲染器读取的每个配置键,与页面上输入框绑定的字段做双向差集,专门找两类问题:
前端发了后端从不读(假输入框)、后端读了前端没有入口(隐身字段)。

会写坏系统的:
- render_network 违反 render() 契约返回字典,调用方按二元组解包后把字典的键
  当成路径和内容 —— 迁移 networkd 会生成文件名叫 name、内容写着 content 的垃圾文件
- DMZ 规则方向写反:注释写「排除到本机自身」,条件写成反面,管理口流量也一并 DNAT

五个「填了等于没填」的输入框:
- WAN 的 MTU 与「是否接受上游 DNS」后端零消费,现真正写入 MTUBytes= / UseDNS=
- DHCPv6 的「子网 ID」绑的是不存在的键,真生效字段是 sla_id
- Samba WINS 要求一个从不回填的字段同时为真,勾了永不生效
- 网桥「启用 STP」未绑定事件,勾完保存不进去
- 主题设计器「按主色生成配色」按钮无 handler

其余:
- RA 页补齐 rdnss_life / dnssl_life 输入框(1.0.3 修了错位却没给入口)
- 迁移预览只发 lan,必报「WAN 网卡不能为空」且网桥从不出现 → 补发 wan + bridge
- dnsmasq / miniupnpd / ppp / dhcpcd IPv6 / RA 地址池 / NFS 等插值零校验
- chrony 服务器校验只认域名和 IPv4,IPv6 NTP 服务器被误拒
- v_int 改用 try/except:上标数字能通过 isdigit() 却让 int() 抛异常导致 500
- ensure_cert 删掉硬编码的开发机 IP,改为本机地址 + 默认路由推导;补 openssl 失败检测
- DDNS 面板 XSS(记录名/服务商未转义);主题 CSS 注释注入(前后端各一处)

测试:render 返回值契约断言、CSS 注释注入回归、模板孤儿控件守卫,
_dev/t-*.py 42/42、前端三查 + md 链接检查全绿。
2026-10-02 00:23:30 +08:00

100 lines
5.1 KiB
YAML

# =============================================================================
# Drouter —— Docker Compose 编排
#
# 用法:
# docker load -i drouter-1.0.4-docker.tar
# docker compose up -d
# 浏览器打开 https://<宿主IP>:8443/
#
# ⚠️ 先读这三条,否则会踩坑:
#
# 1) 必须是 network_mode: host
# 容器要直接读写宿主网络接口和 nftables 规则,bridge 模式下看到的是
# 容器自己的网络命名空间,读不到真实网卡,也管不了宿主的 NAT。
#
# 2) NET_ADMIN 不能省
# 少了它 nft 操作会报 "Operation not permitted",防火墙页直接失效。
# 实测:加上之后 /api/nft 正常返回真实规则集。
#
# 3) 这是「体验 / 调试」形态,不建议当主路由
# 容器里没有 systemd,服务管理页会显示 active: unknown(优雅降级,不是 bug),
# 且无法持久化 systemd 单元。真正长期当路由器跑请用 .deb 装到物理机/虚拟机上。
# =============================================================================
services:
drouter:
# 镜像从 tar 加载后即为这个名字。若你改过标签,这里同步改。
image: drouter:1.0.4
# 固定容器名,方便 docker exec / logs 直接引用
container_name: drouter
# host 网络是硬要求,见文件头说明
network_mode: host
# ── 权限 ───────────────────────────────────────────────────────────
# 这里**不用** privileged(过度授权)。只给真正需要的能力:
cap_add:
- NET_ADMIN # nft / iptables / 路由表 / 接口配置
- NET_RAW # ping / traceroute 等原始套接字探测
- NET_BIND_SERVICE # 绑定 8443(<1024 的端口才严格需要,这里保守给上)
# 若你想省事、且接受更大权限面,可以注释掉上面三行改用:
# privileged: true
# ── 端口 ───────────────────────────────────────────────────────────
# network_mode: host 下 ports 会被忽略,端口由 /etc/drouter/web-port 决定。
# 这里写出来只是**文档作用**,让 `docker compose config` 能看出监听什么。
expose:
- "8443" # HTTPS 管理面板
- "8080" # 备用 HTTP(默认关闭,可在「系统设置」里开)
# ── 持久化 ─────────────────────────────────────────────────────────
# 这四个目录**必须**挂出来,否则 docker compose down 一次配置就全丢了。
volumes:
# 配置核心:settings、web-port、active-theme、证书索引
- drouter-etc:/etc/drouter
# 运行时数据:SQLite 库、流量统计
- drouter-data:/opt/drouter/data
# 配置快照:出问题时的回滚依据
- drouter-snapshots:/opt/drouter/snapshots
# 日志
- drouter-log:/var/log/drouter
# ── 环境变量 ───────────────────────────────────────────────────────
environment:
TZ: Asia/Shanghai
# Web 端口只在**首次启动**时播种进 /etc/drouter/web-port。
# 之后想改端口,请到「系统设置」界面改 —— 别再改这里的环境变量,
# 否则会出现「界面里改了却没生效」的困惑(环境变量优先级高于配置文件)。
DROUTER_WEB_PORT: "8443"
# ── 启动策略 ───────────────────────────────────────────────────────
# unless-stopped:重启宿主后自动拉起,但用户手动 stop 后不会自己回来
restart: unless-stopped
# ── 健康检查 ───────────────────────────────────────────────────────
# /api/health 是免鉴权接口,适合探活。
# ⚠️ 面板走 HTTPS 且用自签证书,curl 必须加 -k,否则永远 unhealthy。
healthcheck:
test: ["CMD-SHELL", "PORT=$(cat /etc/drouter/web-port 2>/dev/null || echo 8443); curl -fsSk --max-time 4 https://127.0.0.1:${PORT}/api/health >/dev/null 2>&1 || exit 1"]
interval: 30s
timeout: 5s
start_period: 20s
retries: 3
# ── 日志 ───────────────────────────────────────────────────────────
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
# =============================================================================
# 命名卷
# =============================================================================
volumes:
drouter-etc:
drouter-data:
drouter-snapshots:
drouter-log: