一套跑在 Debian 13 (trixie) 上的软路由管理系统,提供 43 个功能页面的 Web 管理面板:WAN 接入、PPPoE 多拨、DHCP/DNS、IPv6、防火墙、QoS 限速、 访问控制、DDNS、文件共享、Docker 管理等。 核心设计原则:不重新实现任何协议 PPPoE 交给 ppp,DHCP 交给 dnsmasq,IPv6 RA 交给 radvd,NAT 交给 nftables。 Web 面板只做三件事:渲染原生配置文件 → 语法预检 → 原子写入并 reload。 面板删掉后,系统仍是一台配置完好的 Debian 路由器。 安全默认值 · 安装后不接管网络:不改默认路由、不开 IP 转发、不启动 DHCP 服务 · 所有改网络的动作都需要用户在面板上亲手点「应用」 · 避开 5900 端口,不触碰 VNC / X 会话 · 配置写入前先做语法预检,失败则回滚 架构 · backend/ Python 3 标准库,零第三方依赖(9 个模块) · web/ 原生 JS/CSS,无构建步骤 · 常驻 helper 通过 Unix socket 提供 75 个动作,socket 不可用时回退 subprocess · 鉴权走 X-Token 请求头 打包 · packaging/build-deb.sh → drouter_1.0.0_all.deb(含 6 个 systemd 单元) · scripts/make-offline-deps.sh → 236 个依赖 .deb + 本地仓库索引 · packaging/build-offline-bundle.sh → 自包含离线包,目标机零外网可装 · packaging/build-docker.sh → 容器镜像(体验用) 测试 40 套单元测试 + 3 个前端检查脚本(菜单映射 / 离线渲染 / 手机适配), 全部挂在 devtools/sync.sh 的预检链里。 许可:MIT
50 lines
2.1 KiB
Bash
50 lines
2.1 KiB
Bash
#!/bin/bash
|
|
# =============================================================================
|
|
# drouter 容器入口:做「不依赖 systemd」的初始化,然后 exec 真正的主进程。
|
|
#
|
|
# deploy.sh 里那些 systemctl / logrotate / systemd 单元的步骤在容器里没有意义
|
|
# (也没有 systemd),所以这里只做等价的目录、权限与初始状态准备。
|
|
# =============================================================================
|
|
set -e
|
|
|
|
OPT=/opt/drouter
|
|
|
|
echo "[drouter-init] 准备目录"
|
|
mkdir -p $OPT/data $OPT/snapshots $OPT/certs $OPT/bin \
|
|
/etc/drouter/generated /etc/drouter/themes \
|
|
/var/log/drouter /run/drouter-helper
|
|
chmod 700 /run/drouter-helper
|
|
|
|
# 生效主题:默认内置主题。首次为空时写入,已有则不动(尊重用户选择)
|
|
if [ ! -f /etc/drouter/active-theme ]; then
|
|
echo "default" > /etc/drouter/active-theme
|
|
fi
|
|
chmod 644 /etc/drouter/active-theme
|
|
|
|
# dnsmasq 引用的运营商 DNS 占位文件(避免渲染时找不到文件)
|
|
if [ ! -f /etc/drouter/generated/isp-dns.conf ]; then
|
|
printf '# 由 drouter 自动维护:运营商 PPPoE 下发的 DNS\n' > /etc/drouter/generated/isp-dns.conf
|
|
fi
|
|
|
|
# 属主:数据目录归低权用户 drouter,代码归 root
|
|
chown -R root:root $OPT/backend $OPT/web 2>/dev/null || true
|
|
chown -R drouter:drouter $OPT/data $OPT/snapshots $OPT/certs /var/log/drouter 2>/dev/null || true
|
|
chmod 750 $OPT/data $OPT/snapshots $OPT/certs 2>/dev/null || true
|
|
|
|
# Web 端口:DROUTER_WEB_PORT 只在首次启动时播种到配置文件里。
|
|
# 之后必须 unset —— 后端 load_web_port() 里环境变量优先级高于配置文件,
|
|
# 留着它会让用户在界面里改端口看起来「改了没生效」。
|
|
if [ -n "${DROUTER_WEB_PORT:-}" ] && [ ! -f /etc/drouter/web-port ]; then
|
|
echo "$DROUTER_WEB_PORT" > /etc/drouter/web-port
|
|
echo "[drouter-init] 已按 DROUTER_WEB_PORT 写入端口:$DROUTER_WEB_PORT"
|
|
fi
|
|
unset DROUTER_WEB_PORT
|
|
|
|
if [ -f /etc/drouter/web-port ]; then
|
|
echo "[drouter-init] Web 端口:$(cat /etc/drouter/web-port)"
|
|
else
|
|
echo "[drouter-init] Web 端口:8443(默认)"
|
|
fi
|
|
echo "[drouter-init] 启动:$*"
|
|
exec "$@"
|