3x-ui/docs/API.md
Sora39831 b4047cee54 feat: allow same email across multiple inbounds and auto-add clients on registration
Remove global unique constraint on client_traffics.email, change email
duplication check to per-inbound scope, and automatically register new
users as disabled clients in all existing inbounds within a transaction.
2026-04-03 01:38:31 +08:00

1059 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 3x-ui API 文档
> 基础路径: `{basePath}`(可配置,默认 `/`
> Web 框架: Gin (Go)
> 所有 JSON API 响应(除特别说明外)使用统一格式: `{ "success": bool, "msg": string, "obj": any }`
---
## 目录
- [1. 认证接口](#1-认证接口)
- [2. 面板页面](#2-面板页面)
- [3. 面板设置](#3-面板设置)
- [4. Xray 设置](#4-xray-设置)
- [5. 入站 API](#5-入站-api)
- [6. 服务器 API](#6-服务器-api)
- [7. WebSocket](#7-websocket)
- [8. 订阅服务](#8-订阅服务)
- [数据模型](#数据模型)
---
## 1. 认证接口
### `GET /`
根路径。已认证时重定向到 `/panel/`,否则显示登录页面。
---
### `POST /login`
用户登录认证。
**请求体**JSON 或表单):
```json
{
"username": "string",
"password": "string",
"twoFactorCode": "string" // 可选,开启双因素认证时必填
}
```
**成功响应:**
```json
{ "success": true, "msg": "Successfully logged in", "obj": null }
```
**错误响应:**
- `success: false, msg: "Username cannot be empty"`
- `success: false, msg: "Password cannot be empty"`
- `success: false, msg: "Wrong username or password"`
---
### `GET /logout`
清除会话并重定向到基础路径。
---
### `POST /getTwoFactorEnable`
查询是否开启双因素认证。
**响应:**
```json
{ "success": true, "msg": "", "obj": true }
```
---
## 2. 面板页面
> `/panel` 下的所有路由需要认证(`checkLogin` 中间件)。
### `GET /panel/`
面板主页面HTML
### `GET /panel/inbounds`
入站管理页面HTML
### `GET /panel/settings`
面板设置页面HTML
### `GET /panel/xray`
Xray 配置页面HTML
---
## 3. 面板设置
> `/panel/setting` 下的所有路由需要认证。
### `POST /panel/setting/all`
获取所有面板配置。
**响应 (`obj`)** `AllSetting` 对象(详见 [数据模型](#allsetting))。
---
### `POST /panel/setting/defaultSettings`
获取默认配置(根据请求 Host 头生成)。
**响应 (`obj`)** 默认 `AllSetting` 对象。
---
### `POST /panel/setting/update`
更新面板配置。
**请求体:** `AllSetting` 对象JSON 或表单)。
**响应:**
```json
{ "success": true, "msg": "Settings modified successfully", "obj": null }
```
---
### `POST /panel/setting/updateUser`
修改管理员用户名和密码。
**请求体**JSON 或表单):
```json
{
"oldUsername": "string",
"oldPassword": "string",
"newUsername": "string",
"newPassword": "string"
}
```
**成功响应:**
```json
{ "success": true, "msg": "User modified successfully", "obj": null }
```
**错误响应:**
- `msg: "User modification failed: original username/password incorrect"`
- `msg: "User modification failed: username and password cannot be empty"`
---
### `POST /panel/setting/restartPanel`
重启面板3 秒后重启)。
**响应:**
```json
{ "success": true, "msg": "Panel restart successful", "obj": null }
```
---
### `GET /panel/setting/getDefaultJsonConfig`
获取默认 Xray JSON 配置。
**响应 (`obj`)** Xray 配置 JSON 对象。
---
## 4. Xray 设置
> `/panel/xray` 下的所有路由需要认证。
### `POST /panel/xray/`
获取当前 Xray 配置及元数据。
**响应 (`obj`)**
```json
{
"xraySetting": { /* Xray 配置 JSON */ },
"inboundTags": ["tag1", "tag2"],
"outboundTestUrl": "https://www.google.com/generate_204"
}
```
---
### `GET /panel/xray/getDefaultJsonConfig`
获取默认 Xray JSON 配置。
**响应 (`obj`)** Xray 配置 JSON 对象。
---
### `GET /panel/xray/getOutboundsTraffic`
获取出站流量统计。
**响应 (`obj`)** `OutboundTraffics` 对象数组。
---
### `GET /panel/xray/getXrayResult`
获取当前 Xray 服务运行状态。
**响应 (`obj`)** Xray 服务状态字符串。
---
### `POST /panel/xray/warp/:action`
管理 Cloudflare Warp 集成。
**URL 参数:**
| 参数 | 可选值 |
|---|---|
| `:action` | `data`、`del`、`config`、`reg`、`license` |
**请求体**(表单,取决于 action
| Action | 字段 |
|---|---|
| `reg` | `privateKey`、`publicKey` |
| `license` | `license` |
| 其他 | 无 |
**响应 (`obj`)** Warp 数据/配置字符串。`del` 操作返回 `obj: null`
---
### `POST /panel/xray/update`
更新 Xray 配置。
**请求体**(表单):
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `xraySetting` | string (JSON) | 是 | Xray 配置 JSON |
| `outboundTestUrl` | string | 否 | 默认: `https://www.google.com/generate_204` |
**响应:**
```json
{ "success": true, "msg": "Settings modified successfully", "obj": null }
```
---
### `POST /panel/xray/resetOutboundsTraffic`
重置出站流量统计。
**请求体**(表单):
| 字段 | 类型 | 必填 |
|---|---|---|
| `tag` | string | 是 |
**响应 (`obj`)** `""`
---
### `POST /panel/xray/testOutbound`
测试出站连通性。
**请求体**(表单):
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `outbound` | string (JSON) | 是 | 要测试的出站配置 |
| `allOutbounds` | string (JSON 数组) | 否 | 所有出站配置(用于解析 dialerProxy 依赖) |
**响应 (`obj`)** 测试结果,包含延迟/响应时间。
---
## 5. 入站 API
> `/panel/api` 下的所有路由需要通过 `checkAPIAuth` 中间件认证(未认证时返回 404 以隐藏接口存在)。
### `GET /panel/api/inbounds/list`
获取当前用户的所有入站列表。
**响应 (`obj`)** `[]Inbound`
---
### `GET /panel/api/inbounds/get/:id`
根据 ID 获取指定入站。
**URL 参数:** `:id`int
**响应 (`obj`)** `Inbound` 对象。
---
### `GET /panel/api/inbounds/getClientTraffics/:email`
根据邮箱获取客户端流量记录。
**URL 参数:** `:email`string
**响应 (`obj`)** `[]ClientTraffic`
---
### `GET /panel/api/inbounds/getClientTrafficsById/:id`
根据客户端 ID 获取流量记录。
**URL 参数:** `:id`string
**响应 (`obj`)** `[]ClientTraffic`
---
### `POST /panel/api/inbounds/add`
添加新入站。
**请求体:** `Inbound` 对象JSON 或表单,详见 [数据模型](#inbound))。
**响应 (`obj`)** 创建的 `Inbound` 对象。通过 WebSocket 广播更新。
---
### `POST /panel/api/inbounds/del/:id`
删除入站。
**URL 参数:** `:id`int
**响应 (`obj`)** 被删除的入站 IDint。通过 WebSocket 广播更新。
---
### `POST /panel/api/inbounds/update/:id`
更新入站。
**URL 参数:** `:id`int
**请求体:** `Inbound` 对象JSON 或表单)。
**响应 (`obj`)** 更新后的 `Inbound` 对象。通过 WebSocket 广播更新。
---
### `POST /panel/api/inbounds/clientIps/:email`
获取客户端关联的 IP 地址。
**URL 参数:** `:email`string
**响应 (`obj`)**
- `[]string`,格式为 `"IP (YYYY-MM-DD HH:MM:SS)"`(含时间戳时)
- `[]string`,纯 IP 字符串(旧格式)
- `"No IP Record"`(无数据时)
---
### `POST /panel/api/inbounds/clearClientIps/:email`
清除客户端的 IP 记录。
**URL 参数:** `:email`string
**响应:**
```json
{ "success": true, "msg": "Log cleanup successful", "obj": null }
```
---
### `POST /panel/api/inbounds/addClient`
向入站添加客户端。
**请求体:** `Inbound` 对象,新客户端信息在其 `Settings` JSON 中。
**响应:**
```json
{ "success": true, "msg": "Client added successfully", "obj": null }
```
---
### `POST /panel/api/inbounds/:id/delClient/:clientId`
从入站删除客户端。
**URL 参数:** `:id`int、`:clientId`string
**响应:**
```json
{ "success": true, "msg": "Client deleted successfully", "obj": null }
```
---
### `POST /panel/api/inbounds/updateClient/:clientId`
更新客户端配置。
**URL 参数:** `:clientId`string
**请求体:** 包含更新后客户端设置的 `Inbound` 对象。
**响应:**
```json
{ "success": true, "msg": "Client configuration updated successfully", "obj": null }
```
---
### `POST /panel/api/inbounds/:id/resetClientTraffic/:email`
重置指定客户端的流量统计。
**URL 参数:** `:id`int、`:email`string
**响应:**
```json
{ "success": true, "msg": "Client traffic reset successfully", "obj": null }
```
---
### `POST /panel/api/inbounds/resetAllTraffics`
重置所有流量统计。
**响应:**
```json
{ "success": true, "msg": "All traffic reset successfully", "obj": null }
```
---
### `POST /panel/api/inbounds/resetAllClientTraffics/:id`
重置入站下所有客户端的流量。
**URL 参数:** `:id`int
**响应:**
```json
{ "success": true, "msg": "All client traffic reset successfully", "obj": null }
```
---
### `POST /panel/api/inbounds/delDepletedClients/:id`
删除入站中所有流量耗尽的客户端。
**URL 参数:** `:id`int
**响应:**
```json
{ "success": true, "msg": "Depleted clients deleted successfully", "obj": null }
```
---
### `POST /panel/api/inbounds/import`
导入入站配置。
**请求体**(表单):
| 字段 | 类型 | 必填 |
|---|---|---|
| `data` | string (JSON) | 是 |
`data` 字段为 JSON 序列化的 `Inbound` 对象。
**响应 (`obj`)** 创建的 `Inbound` 对象。通过 WebSocket 广播更新。
---
### `POST /panel/api/inbounds/onlines`
获取当前在线客户端。
**响应 (`obj`)** 在线客户端标识列表。
---
### `POST /panel/api/inbounds/lastOnline`
获取所有客户端的最后在线时间。
**响应 (`obj`)** 客户端邮箱到最近在线时间戳的映射。
---
### `POST /panel/api/inbounds/updateClientTraffic/:email`
手动更新客户端流量统计。
**URL 参数:** `:email`string
**请求体**JSON
```json
{
"upload": 0,
"download": 0
}
```
**响应:**
```json
{ "success": true, "msg": "Client configuration updated successfully", "obj": null }
```
---
### `POST /panel/api/inbounds/:id/delClientByEmail/:email`
根据邮箱删除客户端。
**URL 参数:** `:id`int、`:email`string
**响应:**
```json
{ "success": true, "msg": "Client deleted successfully", "obj": null }
```
---
### `GET /panel/api/backuptotgbot`
向 Telegram Bot 管理员发送数据库备份。
**响应:**`200 OK`
---
## 6. 服务器 API
> `/panel/api/server` 下的所有路由需要通过 `checkAPIAuth` 认证。
### `GET /panel/api/server/status`
获取服务器状态CPU、内存、磁盘、网络、运行时间
**响应 (`obj`)** 服务器状态对象(每 2 秒刷新)。
---
### `GET /panel/api/server/cpuHistory/:bucket`
获取 CPU 使用历史。
**URL 参数:** `:bucket`int—— 每个数据点的秒数。
| 允许值 | 说明 |
|---|---|
| `2` | 每 2 秒一个点(最近 120 秒) |
| `30` | 每 30 秒一个点(最近 30 分钟) |
| `60` | 每 1 分钟一个点(最近 1 小时) |
| `120` | 每 2 分钟一个点(最近 2 小时) |
| `180` | 每 3 分钟一个点(最近 3 小时) |
| `300` | 每 5 分钟一个点(最近 5 小时) |
**响应 (`obj`)** CPU 历史数据点数组(最多 60 个采样点)。
---
### `GET /panel/api/server/getXrayVersion`
获取可用的 Xray 版本列表。
**响应 (`obj`)** `[]string` —— 版本列表(缓存 60 秒)。
---
### `GET /panel/api/server/getConfigJson`
获取当前 Xray 配置 JSON。
**响应 (`obj`)** Xray 配置 JSON。
---
### `GET /panel/api/server/getDb`
下载 SQLite 数据库文件。
**响应:** 二进制文件下载(`application/octet-stream`,文件名 `x-ui.db`)。不使用 `Msg` 包装格式。
---
### `GET /panel/api/server/getNewUUID`
生成新的 UUID。
**响应 (`obj`)** UUID 字符串。
---
### `GET /panel/api/server/getNewX25519Cert`
生成新的 X25519 密钥对。
**响应 (`obj`)** X25519 密钥对数据。
---
### `GET /panel/api/server/getNewmldsa65`
生成新的 ML-DSA-65 密钥。
**响应 (`obj`)** ML-DSA-65 密钥数据。
---
### `GET /panel/api/server/getNewmlkem768`
生成新的 ML-KEM-768 密钥。
**响应 (`obj`)** ML-KEM-768 密钥数据。
---
### `GET /panel/api/server/getNewVlessEnc`
生成新的 VLESS 加密密钥。
**响应 (`obj`)** VLESS 加密密钥数据。
---
### `POST /panel/api/server/stopXrayService`
停止 Xray 服务。通过 WebSocket 广播状态变更。
**响应:**
```json
{ "success": true, "msg": "Xray service stopped successfully", "obj": null }
```
---
### `POST /panel/api/server/restartXrayService`
重启 Xray 服务。通过 WebSocket 广播状态变更。
**响应:**
```json
{ "success": true, "msg": "Xray service restarted successfully", "obj": null }
```
---
### `POST /panel/api/server/installXray/:version`
安装/切换到指定 Xray 版本。
**URL 参数:** `:version`string
**响应:**
```json
{ "success": true, "msg": "Xray version switched", "obj": null }
```
---
### `POST /panel/api/server/updateGeofile`
### `POST /panel/api/server/updateGeofile/:fileName`
更新 GeoIP/Geosite 数据文件。
**URL 参数:** `:fileName`string可选—— 指定要更新的文件名。省略时更新所有文件。
**响应:**
```json
{ "success": true, "msg": "Geo file update result", "obj": null }
```
---
### `POST /panel/api/server/logs/:count`
获取应用日志。
**URL 参数:** `:count`int—— 日志行数。
**请求体**(表单):
| 字段 | 类型 | 说明 |
|---|---|---|
| `level` | string | 日志级别过滤 |
| `syslog` | string | 系统日志过滤 |
**响应 (`obj`)** 日志内容字符串。
---
### `POST /panel/api/server/xraylogs/:count`
获取 Xray 服务日志。
**URL 参数:** `:count`int—— 日志行数。
**请求体**(表单):
| 字段 | 类型 | 说明 |
|---|---|---|
| `filter` | string | 日志过滤关键词 |
| `showDirect` | string | 显示直连日志 |
| `showBlocked` | string | 显示被阻止的日志 |
| `showProxy` | string | 显示代理日志 |
**响应 (`obj`)** 过滤后的 Xray 日志内容字符串。
---
### `POST /panel/api/server/importDB`
导入数据库备份。导入后自动重启 Xray。
**请求体:** multipart 文件上传(字段名 `db`)。
**响应 (`obj`)** `"Database imported successfully"`
---
### `POST /panel/api/server/getNewEchCert`
生成新的 ECHEncrypted Client Hello证书。
**请求体**(表单):
| 字段 | 类型 | 必填 |
|---|---|---|
| `sni` | string | 是 |
**响应 (`obj`)** ECH 证书数据。
---
## 7. WebSocket
### `GET {basePath}/ws`
WebSocket 端点用于面板实时更新服务器状态、入站变更、Xray 状态、通知)。
---
## 8. 订阅服务
> 运行在独立端口(可配置)。独立的 Gin 服务器。
### `GET {subPath}:subid`
获取客户端订阅链接。
**URL 参数:** `:subid`string—— 订阅 ID。
**查询参数:**
| 参数 | 说明 |
|---|---|
| `html=1``view=html` | 强制渲染 HTML 页面 |
**响应(订阅客户端):**
- Content-Type: `text/plain`
- Body: 每行一个代理分享链接(`vmess://`、`vless://`、`trojan://`、`ss://`
- 若开启 `subEncrypt`body 经过 base64 编码
**响应(浏览器 / `?html=1`**
- Content-Type: `text/html`
- HTML 页面,展示流量统计、到期时间、代理链接
**响应头:**
| 响应头 | 说明 |
|---|---|
| `Subscription-Userinfo` | `upload=N; download=N; total=N; expire=N`字节数Unix 时间戳) |
| `Profile-Update-Interval` | 重新拉取间隔(分钟,默认 `10` |
| `Profile-Title` | Base64 编码的配置标题(已配置时) |
| `Support-Url` | 支持页面 URL已配置时 |
| `Profile-Web-Page-Url` | 配置网页 URL |
| `Announce` | Base64 编码的公告(已配置时) |
| `Routing-Enable` | `"true"``"false"` |
| `Routing` | 自定义路由规则 JSON已配置时 |
**错误:** `400 Bad Request`body 为 `"Error!"`
---
### `GET {jsonPath}:subid`
获取 JSON 格式订阅配置(仅在 `subJsonEnable` 为 true 时注册此路由)。
**URL 参数:** `:subid`string—— 订阅 ID。
**响应:**
- Content-Type: `text/plain`
- Body: JSON 字符串,包含完整客户端配置(分片、噪声、多路复用、路由规则)
- 响应头与订阅链接接口相同
**错误:** `400 Bad Request`body 为 `"Error!"`
---
## 数据模型
### 统一响应格式 (`Msg`)
```json
{
"success": true,
"msg": "string",
"obj": null
}
```
### Inbound
| 字段 | 类型 | 说明 |
|---|---|---|
| `id` | int | 主键 |
| `up` | int64 | 上行流量(字节) |
| `down` | int64 | 下行流量(字节) |
| `total` | int64 | 总流量限制(字节) |
| `allTime` | int64 | 累计总流量(字节) |
| `remark` | string | 入站备注/名称 |
| `enable` | bool | 是否启用 |
| `expiryTime` | int64 | 过期时间戳毫秒0 = 永不过期) |
| `trafficReset` | string | 流量重置周期(默认 `"never"` |
| `lastTrafficResetTime` | int64 | 上次流量重置时间戳 |
| `clientStats` | []ClientTraffic | 客户端流量统计 |
| `listen` | string | 监听地址 |
| `port` | int | 监听端口 |
| `protocol` | string | 协议:`vmess`、`vless`、`trojan`、`shadowsocks`、`http`、`mixed`、`wireguard`、`tunnel` |
| `settings` | string (JSON) | 协议相关设置 |
| `streamSettings` | string (JSON) | 传输/流设置 |
| `tag` | string | 唯一的 Xray 入站标签 |
| `sniffing` | string (JSON) | 探测配置 |
### ClientTraffic
| 字段 | 类型 | 说明 |
|---|---|---|
| `id` | int | 主键 |
| `inboundId` | int | 所属入站 ID |
| `enable` | bool | 是否启用 |
| `email` | string | 客户端邮箱(唯一) |
| `uuid` | string | 客户端 UUID非持久化 |
| `subId` | string | 订阅 ID非持久化 |
| `up` | int64 | 上行流量(字节) |
| `down` | int64 | 下行流量(字节) |
| `allTime` | int64 | 累计总流量(字节) |
| `expiryTime` | int64 | 过期时间戳(毫秒) |
| `total` | int64 | 总流量限制(字节) |
| `reset` | int | 流量重置计数器 |
| `lastOnline` | int64 | 最后在线时间戳 |
### Client
| 字段 | 类型 | 说明 |
|---|---|---|
| `id` | string | 客户端 ID |
| `security` | string | 加密方式 |
| `password` | string | 客户端密码 |
| `flow` | string | VLESS flow 类型 |
| `email` | string | 客户端邮箱 |
| `limitIp` | int | IP 限制0 = 不限制) |
| `totalGB` | int64 | 流量限制(字节) |
| `expiryTime` | int64 | 过期时间戳(毫秒) |
| `enable` | bool | 是否启用 |
| `tgId` | int64 | Telegram 用户 ID |
| `subId` | string | 订阅 ID |
| `comment` | string | 客户端备注 |
| `reset` | int | 流量重置计数器 |
### User
| 字段 | 类型 | 说明 |
|---|---|---|
| `id` | int | 主键 |
| `username` | string | 登录用户名 |
| `password` | string | 登录密码 |
### OutboundTraffics
| 字段 | 类型 | 说明 |
|---|---|---|
| `id` | int | 主键 |
| `tag` | string | 出站标签(唯一) |
| `up` | int64 | 上行流量(字节) |
| `down` | int64 | 下行流量(字节) |
| `total` | int64 | 总流量限制(字节) |
### InboundClientIps
| 字段 | 类型 | 说明 |
|---|---|---|
| `id` | int | 主键 |
| `clientEmail` | string | 客户端邮箱(唯一) |
| `ips` | string | IP 地址JSON 字符串) |
### AllSetting
**Web 服务器:**
| 字段 | 类型 | 说明 |
|---|---|---|
| `webListen` | string | 监听地址 |
| `webDomain` | string | 域名 |
| `webPort` | int | 端口 |
| `webCertFile` | string | TLS 证书文件路径 |
| `webKeyFile` | string | TLS 私钥文件路径 |
| `webBasePath` | string | 基础路径 |
| `sessionMaxAge` | int | 会话最大有效期(天) |
**界面:**
| 字段 | 类型 | 说明 |
|---|---|---|
| `pageSize` | int | 分页大小 |
| `expireDiff` | int | 到期提醒天数差 |
| `trafficDiff` | int | 流量提醒差值 |
| `remarkModel` | string | 备注显示模式 |
| `datepicker` | string | 日期选择器格式 |
**Telegram Bot**
| 字段 | 类型 | 说明 |
|---|---|---|
| `tgBotEnable` | bool | 是否启用 Telegram Bot |
| `tgBotToken` | string | Bot Token |
| `tgBotProxy` | string | Bot 代理地址 |
| `tgBotAPIServer` | string | Bot API 服务器地址 |
| `tgBotChatId` | string | 管理员 Chat ID |
| `tgRunTime` | string | 定时任务执行时间 |
| `tgBotBackup` | bool | 是否启用自动备份 |
| `tgBotLoginNotify` | bool | 是否启用登录通知 |
| `tgCpu` | int | CPU 告警阈值 |
| `tgLang` | string | Bot 语言 |
**安全:**
| 字段 | 类型 | 说明 |
|---|---|---|
| `timeLocation` | string | 时区 |
| `twoFactorEnable` | bool | 是否开启双因素认证 |
| `twoFactorToken` | string | 双因素认证令牌 |
**订阅服务:**
| 字段 | 类型 | 说明 |
|---|---|---|
| `subEnable` | bool | 是否启用订阅服务 |
| `subJsonEnable` | bool | 是否启用 JSON 订阅 |
| `subTitle` | string | 订阅标题 |
| `subSupportUrl` | string | 支持页面 URL |
| `subProfileUrl` | string | 配置页面 URL |
| `subAnnounce` | string | 公告内容 |
| `subEnableRouting` | bool | 是否启用路由规则 |
| `subRoutingRules` | string | 自定义路由规则 |
| `subListen` | string | 订阅服务监听地址 |
| `subPort` | int | 订阅服务端口 |
| `subPath` | string | 订阅路径 |
| `subDomain` | string | 订阅服务域名 |
| `subCertFile` | string | 订阅服务 TLS 证书路径 |
| `subKeyFile` | string | 订阅服务 TLS 私钥路径 |
| `subUpdates` | int | 客户端更新间隔(分钟) |
| `subEncrypt` | bool | 是否加密订阅内容 |
| `subShowInfo` | bool | 是否显示服务器信息 |
| `subURI` | string | 订阅 URI |
| `subJsonPath` | string | JSON 订阅路径 |
| `subJsonURI` | string | JSON 订阅 URI |
| `subJsonFragment` | string | TLS 分片配置 |
| `subJsonNoises` | string | WebSocket/HTTP 噪声配置 |
| `subJsonMux` | string | 多路复用配置 |
| `subJsonRules` | string | 自定义路由规则 |
| `externalTrafficInformEnable` | bool | 是否启用外部流量通知 |
| `externalTrafficInformURI` | string | 外部流量通知 URI |
**LDAP**
| 字段 | 类型 | 说明 |
|---|---|---|
| `ldapEnable` | bool | 是否启用 LDAP |
| `ldapHost` | string | LDAP 服务器地址 |
| `ldapPort` | int | LDAP 端口 |
| `ldapUseTLS` | bool | 是否使用 TLS |
| `ldapBindDN` | string | 绑定 DN |
| `ldapPassword` | string | 绑定密码 |
| `ldapBaseDN` | string | 基础 DN |
| `ldapUserFilter` | string | 用户过滤器 |
| `ldapUserAttr` | string | 用户属性 |
| `ldapVlessField` | string | VLESS 字段映射 |
| `ldapSyncCron` | string | 同步周期Cron 表达式) |
| `ldapFlagField` | string | 标志字段 |
| `ldapTruthyValues` | string | 真值列表 |
| `ldapInvertFlag` | bool | 是否反转标志 |
| `ldapInboundTags` | string | 关联入站标签 |
| `ldapAutoCreate` | bool | 是否自动创建客户端 |
| `ldapAutoDelete` | bool | 是否自动删除客户端 |
| `ldapDefaultTotalGB` | int | 默认流量限制GB |
| `ldapDefaultExpiryDays` | int | 默认有效天数 |
| `ldapDefaultLimitIP` | int | 默认 IP 限制 |
---
## 向后兼容重定向
以下重定向自动处理301
| 原路径 | 重定向到 |
|---|---|
| `/panel/API/*` | `/panel/api/*` |
| `/xui/API/*` | `/panel/api/*` |
| `/xui/*` | `/panel/*` |