多用户与管理后台
v2.0.0 起,Tunnel Manager 支持多用户注册与管理后台。所有数据存储在 SQLite(data/tunnel-manager.db,默认)或 PostgreSQL(设置 DATABASE_URL),换库不影响多用户与权限模型;旧版 config.json 会在首次启动时自动导入:原管理员账号、OAuth 连接与监控项全部继承,原文件保留作备份。
注册策略(管理后台 → 系统设置)
| 开关 | 说明 |
|---|---|
| 开放注册 | 关闭后登录页不再显示注册入口 |
| 注册邮箱验证 | 需要先配置 SMTP;开启后注册需填写邮箱验证码 |
| 邀请码 | 关闭 / 选填 / 必填 三种模式,邀请码可绑定用户组 |
组合效果:
- 未配置邮件服务且邀请码关闭:填写邮箱密码即可直接注册
- 配置了邮件服务:注册需要邮箱验证码(验证码 10 分钟有效,60 秒内不可重发)
- 邀请码必填:还需填写有效的邀请码
OIDC 登录(管理后台 → OIDC 认证)
v2.9.0 的 OIDC 登录和账户绑定在 Web 端提供。Android 原生 App 尚无 OIDC 入口;仅有 OIDC 身份的用户可先在 Web 账户页设置本站密码,再通过 App 密码登录。
管理员可以添加多个标准 OIDC 接入方。配置显示名称、Issuer URL、Client ID、Client Secret、回调地址、Scopes、启用状态和排序。Issuer 用于 Discovery 自动发现端点;Scopes 默认 openid profile email。客户端密钥加密保存,后台读取时只返回是否已设置。
回调地址默认为当前站点的 /api/auth/oidc/callback。将完整地址登记到身份提供方,并确保发起登录和回调使用相同的站点域名。生产环境使用 HTTPS,本机验证允许 localhost、127.0.0.1 或 ::1 的 HTTP 地址。
- 登录页显示已启用的接入方;首次登录按邮箱查找本站账号。
- 已有账号:接入方确认邮箱已验证时自动关联并登录;否则先发送本站邮箱验证码确认归属。未配置邮件服务时无法关联未经验证的邮箱。
- 没有账号:自动创建普通用户并分配默认用户组,独立于密码注册开关和邀请码。本站已配置 SMTP 且启用注册邮箱验证时,即使接入方已验证邮箱,也须先完成本站邮件验证。
- 关联后按接入方、Issuer 和 Subject 识别账号,外部邮箱变化不会迁移到其他账号。本站禁用状态、权限和二步验证继续生效。
- 「账户设置 → OIDC 登录账户」支持绑定、解绑;新增绑定需要确认本站密码。没有本站密码的账号可重新通过已绑定身份认证后设置密码,再使用要求密码确认的安全操作。解绑须保留密码、通行密钥或另一个已启用的 OIDC 登录方式。
已有账号关联的接入方不能更换 Issuer 或 Client ID,也不能直接删除;可先停用,再由用户解绑。修改接入方配置会使正在进行的登录失效,用户需重新发起。
用户与用户组
- 每个用户拥有独立的 Cloudflare 授权连接、隧道选择与监控项目,互相不可见
- 未绑定自己 Cloudflare 授权的用户无法查看或操作任何隧道/域名/DNS/监控,需先在「账户设置 → Cloudflare 授权」完成授权;未授权用户不会回退使用管理员的静态凭据
- 用户组决定权限:隧道管理、域名绑定、DNS 记录、服务监控、Cloudflare 授权
- 「默认用户组」为内置组,决定注册用户的初始权限;管理员不受权限限制
- 管理员可禁用、删除用户(重置密码会使该用户所有会话失效)
邀请码
在管理后台生成,可绑定用户组、限制使用次数与有效期。邀请码只在注册真正成功后才会计数,失败的注册不会消耗次数。
个人主页
左侧「账户设置」页的「个人主页」卡片管理当前账号的展示信息:
- 自定义名称:展示用的昵称,不用于登录
- 头像:本地上传(png / jpg / gif / webp,最大 4 MiB)或填写图片链接;上传后自动保存到账户
- 账户邮箱:未绑定时可直接绑定,已绑定可修改为新邮箱;两种操作都需要当前密码确认。绑定不向新邮箱发送验证邮件,密码确认通过后直接生效。邮箱用于接收注册 / 重置验证码与通知
用户通知
每个用户可在左侧「通知」页面独立配置自己的提醒(与面板管理员的 Telegram 机器人无关,完全隔离):
- 渠道:关闭 / 仅邮箱 / 仅 Telegram / 邮箱 + Telegram
- 邮箱:每行一个,支持多个收件人(通过全局 SMTP 发送)
- Telegram:填写自己的 Bot Token 与 Chat ID,由面板直接调用你的 Bot 发送
- 事件:目前支持「登录通知」——每次账户登录成功后发送提醒(含时间与 IP),可随时关闭
保存后可点击「发送测试通知」验证配置是否生效。Telegram Token 通过 APP_ENCRYPTION_KEY 加密存储。
Telegram 远程控制
左侧「TG 机器人」页面开放给所有登录用户,每个用户拥有自己的 Bot,互相完全隔离:
- 在 Telegram 与 @BotFather 创建自己的 Bot 并填写 Token,与 @userinfobot 对话获取自己的数字 TG ID
- 「授权 TG ID」填入允许向该 Bot 发送指令的 TG 账号(可多个,逗号分隔)
- 启用后 Bot 以长轮询或 Webhook 运行(见 TG 机器人设置),只能操作该用户自己的账户资源:隧道选择、转发地址、DNS 记录、域名绑定、Cloudflare 区域
- 通知与远程控制可各用各的 Bot;某一侧未配置时,页面会出现「一键复用」按钮,可直接把另一侧已配置的 Bot Token 复制过来
- API 端点:面板级配置(管理员在「TG 机器人」页设置),所有用户的 Bot 与通知都走该端点;国内网络建议配置自建反代,默认官方
api.telegram.org国内无法直连 - 指令与原来的管理员 Bot 一致(
/help查看),但作用域限定在本人账户 - 管理员历史全局 Bot 配置会自动迁移为管理员的个人 Bot,无需重新配置
每个用户 Bot 的 Token 同样通过 APP_ENCRYPTION_KEY 加密存储。
忘记密码
- 配置了 SMTP:登录页「忘记密码?」通过注册邮箱接收重置验证码,自助完成重置
- 未配置 SMTP:请联系管理员在管理后台重置;管理员本人可使用命令行
./tunnel-manager -set-password 新密码