添加开发文档
This commit is contained in:
@@ -0,0 +1,86 @@
|
|||||||
|
# Xboard 仓库 Agent 协作规范
|
||||||
|
|
||||||
|
本文给自动化代理与协作者使用,目标是提升并行效率,减少回归风险。
|
||||||
|
|
||||||
|
## 1. 输出与沟通
|
||||||
|
|
||||||
|
- 默认使用简体中文。
|
||||||
|
- 先给结论,再给关键证据与改动点。
|
||||||
|
- 复杂任务必须先给执行计划,再落地改动。
|
||||||
|
|
||||||
|
## 2. 执行原则
|
||||||
|
|
||||||
|
1. 质量优先:不为速度牺牲正确性与可维护性。
|
||||||
|
2. 并行优先:能并行的信息收集与文件操作尽量并行。
|
||||||
|
3. 最小改动:仅修改与任务直接相关的文件。
|
||||||
|
4. 可追溯:说明改了什么、为什么改、如何验证。
|
||||||
|
|
||||||
|
## 3. 并行拆分规则
|
||||||
|
|
||||||
|
1. 先画依赖图,区分可并行和必须串行任务。
|
||||||
|
2. 不允许并行写同一文件或同一区域。
|
||||||
|
3. 收集阶段可并行,分析和冲突解决阶段串行。
|
||||||
|
4. 每轮并行结束后先汇总再进入下一轮。
|
||||||
|
|
||||||
|
## 4. 仓库事实(执行前必须知道)
|
||||||
|
|
||||||
|
- 技术栈:Laravel 12 + Octane + Horizon + Redis。
|
||||||
|
- 安装命令:`php artisan xboard:install`(交互式,强依赖 Redis 可连通)。
|
||||||
|
- 前端资产:仓库内为已编译静态资源,不是完整前端源码仓。
|
||||||
|
- 任务调度:依赖 `schedule:work` 或 `cron + schedule:run`。
|
||||||
|
- 当前仓库默认无 `tests/` 与 `phpunit.xml`,测试基建可能缺失。
|
||||||
|
|
||||||
|
## 5. 推荐命令基线
|
||||||
|
|
||||||
|
信息收集:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rg --files
|
||||||
|
rg -n "<pattern>" app config routes docs
|
||||||
|
```
|
||||||
|
|
||||||
|
本地运行(三进程):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php artisan octane:start --host=0.0.0.0 --port=7001 --watch
|
||||||
|
php artisan horizon
|
||||||
|
php artisan schedule:work
|
||||||
|
```
|
||||||
|
|
||||||
|
质量检查:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php artisan about
|
||||||
|
php artisan migrate:status
|
||||||
|
vendor/bin/phpstan analyse --memory-limit=1G
|
||||||
|
```
|
||||||
|
|
||||||
|
测试(若已补齐测试):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
timeout 60s php artisan test
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. 高风险操作确认
|
||||||
|
|
||||||
|
以下操作必须先得到明确确认:
|
||||||
|
|
||||||
|
- 删除/批量改写文件
|
||||||
|
- `git reset --hard`、`git checkout --`、强制回滚
|
||||||
|
- 数据库清库、结构变更、批量数据更新
|
||||||
|
- 调用生产环境 API 或发送敏感数据
|
||||||
|
- 全局安装/卸载依赖
|
||||||
|
|
||||||
|
## 7. 仓库特殊风险提醒
|
||||||
|
|
||||||
|
- `update.sh` 含 `git reset --hard origin/master`,默认禁止直接执行。
|
||||||
|
- `xboard:update` / `xboard:install` 可能恢复 `plugins/` 下被跟踪文件,执行前需确认是否会覆盖开发中的插件改动。
|
||||||
|
- `compose.sample.yaml` 使用 `network_mode: host`,跨平台可用性有限,必要时改端口映射。
|
||||||
|
|
||||||
|
## 8. 提交前自检清单
|
||||||
|
|
||||||
|
1. 变更范围最小且与需求一致。
|
||||||
|
2. 关键路径已验证(安装/运行/队列/调度至少一项)。
|
||||||
|
3. 质量检查命令执行结果已记录。
|
||||||
|
4. 风险与未覆盖项已明确说明。
|
||||||
|
|
||||||
@@ -44,6 +44,8 @@ docker compose up -d
|
|||||||
|
|
||||||
### Development Guides
|
### Development Guides
|
||||||
- [Plugin Development Guide](./docs/en/development/plugin-development-guide.md) - Complete guide for developing XBoard plugins
|
- [Plugin Development Guide](./docs/en/development/plugin-development-guide.md) - Complete guide for developing XBoard plugins
|
||||||
|
- [Developer Guide (ZH-CN)](./docs/development-guide.zh-CN.md) - Local development, testing, running and build guide
|
||||||
|
- [V2bX Integration Guide (ZH-CN)](./docs/v2bx-integration.zh-CN.md) - Full Xboard ↔ V2bX integration guide
|
||||||
|
|
||||||
### Deployment Guides
|
### Deployment Guides
|
||||||
- [Deploy with 1Panel](./docs/en/installation/1panel.md)
|
- [Deploy with 1Panel](./docs/en/installation/1panel.md)
|
||||||
|
|||||||
@@ -0,0 +1,236 @@
|
|||||||
|
# Xboard 开发文档(开发环境 / 本地测试 / 运行 / 编译)
|
||||||
|
|
||||||
|
本文面向仓库维护者与二次开发者,覆盖本项目在本地和容器中的完整开发流程。
|
||||||
|
|
||||||
|
## 1. 项目现状与边界
|
||||||
|
|
||||||
|
- 后端框架:Laravel 12(`laravel/framework`)+ Octane(Swoole)+ Horizon。
|
||||||
|
- 运行依赖:数据库(SQLite / MySQL / PostgreSQL)+ Redis。
|
||||||
|
- 前端资产:当前仓库已包含编译产物,主要位于:
|
||||||
|
- `theme/Xboard/assets`
|
||||||
|
- `theme/v2board/assets`
|
||||||
|
- `public/assets/admin`
|
||||||
|
- `package.json` 仅含 `chokidar` 依赖,主要用于 Octane `--watch` 开发体验,不是完整前端工程。
|
||||||
|
|
||||||
|
## 2. 开发环境要求
|
||||||
|
|
||||||
|
## 2.1 必需依赖
|
||||||
|
|
||||||
|
- Git
|
||||||
|
- PHP `8.2+`
|
||||||
|
- Composer `2.x`
|
||||||
|
- Redis `7+`
|
||||||
|
- 数据库三选一:
|
||||||
|
- SQLite(最快)
|
||||||
|
- MySQL `5.7+`
|
||||||
|
- PostgreSQL
|
||||||
|
|
||||||
|
## 2.2 推荐依赖(开发体验)
|
||||||
|
|
||||||
|
- Docker + Docker Compose(推荐)
|
||||||
|
- Node.js `18+`(仅在使用 `php artisan octane:start --watch` 时需要)
|
||||||
|
|
||||||
|
## 2.3 操作系统建议
|
||||||
|
|
||||||
|
- 推荐 Linux / WSL2。
|
||||||
|
- `compose.sample.yaml` 使用 `network_mode: host`,在非 Linux 环境可能需要改为端口映射(如 `7001:7001`)。
|
||||||
|
|
||||||
|
## 3. Docker 开发模式(推荐)
|
||||||
|
|
||||||
|
## 3.1 初始化
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone -b compose --depth 1 https://github.com/cedar2025/Xboard
|
||||||
|
cd Xboard
|
||||||
|
cp compose.sample.yaml compose.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3.2 安装(首次)
|
||||||
|
|
||||||
|
推荐使用 SQLite + 内置 Redis 的快速安装:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose run -it --rm \
|
||||||
|
-e ENABLE_SQLITE=true \
|
||||||
|
-e ENABLE_REDIS=true \
|
||||||
|
-e ADMIN_ACCOUNT=admin@demo.com \
|
||||||
|
web php artisan xboard:install
|
||||||
|
```
|
||||||
|
|
||||||
|
安装完成后请记录:
|
||||||
|
|
||||||
|
- 管理员账号/密码(安装命令输出)
|
||||||
|
- 后台路径(安装命令输出中的 `secure_path`)
|
||||||
|
|
||||||
|
## 3.3 启动与停止
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
|
docker compose ps
|
||||||
|
docker compose logs -f web
|
||||||
|
docker compose logs -f horizon
|
||||||
|
```
|
||||||
|
|
||||||
|
停止:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose down
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3.4 访问地址
|
||||||
|
|
||||||
|
- 用户前台:`http://<host>:7001/`
|
||||||
|
- 管理后台:`http://<host>:7001/<secure_path>`
|
||||||
|
|
||||||
|
说明:`secure_path` 默认不是固定字符串,而是安装后生成并可在后台配置修改。
|
||||||
|
|
||||||
|
## 4. 宿主机本地开发(非 Docker)
|
||||||
|
|
||||||
|
## 4.1 安装依赖
|
||||||
|
|
||||||
|
```bash
|
||||||
|
composer install
|
||||||
|
cp .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
如果你计划使用 SQLite,可先准备文件:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p .docker/.data
|
||||||
|
touch .docker/.data/database.sqlite
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4.2 首次安装
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php artisan xboard:install
|
||||||
|
```
|
||||||
|
|
||||||
|
安装向导会交互配置:
|
||||||
|
|
||||||
|
- 数据库类型(SQLite / MySQL / PostgreSQL)
|
||||||
|
- Redis 连接(安装阶段会强校验可连通)
|
||||||
|
- 管理员账号
|
||||||
|
|
||||||
|
## 4.3 启动服务(开发三进程)
|
||||||
|
|
||||||
|
建议至少开 3 个终端:
|
||||||
|
|
||||||
|
1. Web 服务(Octane)
|
||||||
|
```bash
|
||||||
|
php artisan octane:start --host=0.0.0.0 --port=7001 --watch
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 队列消费(Horizon)
|
||||||
|
```bash
|
||||||
|
php artisan horizon
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 定时任务(开发态)
|
||||||
|
```bash
|
||||||
|
php artisan schedule:work
|
||||||
|
```
|
||||||
|
|
||||||
|
说明:
|
||||||
|
|
||||||
|
- 生产环境通常由 `cron` 调 `schedule:run`,开发环境直接 `schedule:work` 更直观。
|
||||||
|
- 若不使用 `--watch`,可不安装 Node.js。
|
||||||
|
|
||||||
|
## 4.4 权限问题(Linux)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
chmod -R 775 storage bootstrap/cache .docker/.data
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. 本地测试与质量检查
|
||||||
|
|
||||||
|
## 5.1 当前仓库事实
|
||||||
|
|
||||||
|
- 当前仓库未包含 `tests/` 目录。
|
||||||
|
- 当前仓库未包含 `phpunit.xml` / `phpunit.xml.dist`。
|
||||||
|
|
||||||
|
因此默认没有可执行的项目内单元测试套件,建议先补齐测试基建再启用 CI 强校验。
|
||||||
|
|
||||||
|
## 5.2 建议的本地检查基线
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php artisan about
|
||||||
|
php artisan migrate:status
|
||||||
|
php artisan route:list
|
||||||
|
vendor/bin/phpstan analyse --memory-limit=1G
|
||||||
|
```
|
||||||
|
|
||||||
|
如后续补充测试用例后,再执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
timeout 60s php artisan test
|
||||||
|
```
|
||||||
|
|
||||||
|
> 约定:自动化执行测试时,单条任务建议设置 60s 超时,避免阻塞流水线。
|
||||||
|
|
||||||
|
## 6. 运行与调试要点
|
||||||
|
|
||||||
|
## 6.1 调度与队列健康
|
||||||
|
|
||||||
|
- 定时任务心跳来源:`App\Console\Kernel::schedule` 中写入缓存键 `SCHEDULE_LAST_CHECK_AT`。
|
||||||
|
- Horizon 状态可在后台系统状态页查看。
|
||||||
|
|
||||||
|
若后台提示异常,先检查:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php artisan schedule:list
|
||||||
|
php artisan horizon:status
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6.2 关键日志位置
|
||||||
|
|
||||||
|
- 应用日志:`storage/logs`
|
||||||
|
- Docker 运行日志:`docker compose logs -f web|horizon`
|
||||||
|
|
||||||
|
## 7. 编译 / 构建说明
|
||||||
|
|
||||||
|
## 7.1 应用层“编译”边界
|
||||||
|
|
||||||
|
- 本仓库不包含完整的后台/前台前端源码工程。
|
||||||
|
- 默认是消费已编译好的静态资源,不存在常规 `npm run build` 的全量前端构建链。
|
||||||
|
|
||||||
|
## 7.2 Docker 镜像构建
|
||||||
|
|
||||||
|
CI 使用 `.github/workflows/docker-publish.yml` 进行多架构构建并推送镜像。
|
||||||
|
|
||||||
|
本地可执行:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker build \
|
||||||
|
--build-arg CACHEBUST=$(date +%s) \
|
||||||
|
--build-arg REPO_URL=https://github.com/cedar2025/Xboard \
|
||||||
|
--build-arg BRANCH_NAME=master \
|
||||||
|
-t xboard:dev .
|
||||||
|
```
|
||||||
|
|
||||||
|
重要说明:
|
||||||
|
|
||||||
|
- 当前 `Dockerfile` 在构建时会 `git clone` 指定仓库分支,不直接打包你本地未提交改动。
|
||||||
|
- 若目标是“本地改动实时调试”,优先使用 Docker Compose 挂载源码运行,而非用该 `Dockerfile` 打镜像。
|
||||||
|
|
||||||
|
## 8. 升级、回滚与危险脚本
|
||||||
|
|
||||||
|
常用命令:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php artisan xboard:update
|
||||||
|
php artisan xboard:rollback
|
||||||
|
```
|
||||||
|
|
||||||
|
注意事项:
|
||||||
|
|
||||||
|
- `update.sh` 包含 `git reset --hard origin/master`,会覆盖本地改动,不建议在开发分支使用。
|
||||||
|
- `xboard:update` / `xboard:install` 内部包含插件目录恢复逻辑,可能回退 `plugins/` 下被 Git 跟踪且非新增的修改。
|
||||||
|
|
||||||
|
## 9. 建议开发流程(最小闭环)
|
||||||
|
|
||||||
|
1. 建立分支并完成代码改动。
|
||||||
|
2. 启动 `octane + horizon + schedule:work` 做手工联调。
|
||||||
|
3. 运行静态检查(`phpstan`)和基础 smoke 检查(`about` / `migrate:status`)。
|
||||||
|
4. 确认后台路径、队列、定时任务均正常后再提交。
|
||||||
|
|
||||||
@@ -0,0 +1,327 @@
|
|||||||
|
# Xboard 对接 V2bX 完整文档
|
||||||
|
|
||||||
|
本文基于以下两套源码交叉整理:
|
||||||
|
|
||||||
|
- 面板端:`Xboard-new`
|
||||||
|
- 节点端:`E:/code/go/V2bX`
|
||||||
|
|
||||||
|
适用目标:让 `V2bX` 节点稳定对接 `Xboard`,完成配置拉取、用户同步、流量上报、在线设备上报。
|
||||||
|
|
||||||
|
## 1. 对接结论(先看这个)
|
||||||
|
|
||||||
|
1. `V2bX` 当前固定请求 `Xboard` 的 `V1 UniProxy` 路径(不是 `V2` 路径):
|
||||||
|
- `GET /api/v1/server/UniProxy/config`
|
||||||
|
- `GET /api/v1/server/UniProxy/user`
|
||||||
|
- `GET /api/v1/server/UniProxy/alivelist`
|
||||||
|
- `POST /api/v1/server/UniProxy/push`
|
||||||
|
- `POST /api/v1/server/UniProxy/alive`
|
||||||
|
2. 鉴权依赖 URL Query 参数:`token`、`node_id`、`node_type`。
|
||||||
|
3. `Xboard` 的 `server_token` 长度需要 >= 16。
|
||||||
|
4. `V2bX` 启动时如果拉不到可用用户会直接报错退出:`add users error: not have any user`。
|
||||||
|
5. 在线设备数据写入由队列任务处理,面板端必须保证队列消费者(通常 `horizon`)在运行。
|
||||||
|
|
||||||
|
## 2. 源码级接口对齐
|
||||||
|
|
||||||
|
## 2.1 V2bX 侧(请求方)
|
||||||
|
|
||||||
|
关键实现:
|
||||||
|
|
||||||
|
- `api/panel/panel.go`:初始化 Query 参数(`node_type/node_id/token`),并限制 `NodeType` 枚举。
|
||||||
|
- `api/panel/node.go`:拉取节点配置(`/api/v1/server/UniProxy/config`)。
|
||||||
|
- `api/panel/user.go`:拉取用户、在线列表,上报流量和在线 IP。
|
||||||
|
- `node/controller.go`:启动时先拉配置和用户,再注册节点。
|
||||||
|
- `node/task.go`:按 `pull_interval/push_interval` 定时同步与上报。
|
||||||
|
|
||||||
|
## 2.2 Xboard 侧(服务方)
|
||||||
|
|
||||||
|
关键实现:
|
||||||
|
|
||||||
|
- `app/Http/Routes/V1/ServerRoute.php`:`/api/v1/server/UniProxy/*` 路由定义。
|
||||||
|
- `app/Http/Middleware/Server.php`:校验 `token/node_id/node_type`,并注入 `node_info`。
|
||||||
|
- `app/Http/Controllers/V1/Server/UniProxyController.php`:实现 `config/user/push/alive/alivelist/status`。
|
||||||
|
- `app/Services/ServerService.php`:按 `node_id`(支持 `code` 或 `id`)和 `node_type` 查节点,按权限组取可用用户。
|
||||||
|
- `app/Jobs/UpdateAliveDataJob.php`:异步写在线设备计数。
|
||||||
|
|
||||||
|
## 3. 类型与协议兼容要点
|
||||||
|
|
||||||
|
`V2bX` 允许的 `NodeType`(`api/panel/panel.go`):
|
||||||
|
|
||||||
|
- `vmess`
|
||||||
|
- `vless`
|
||||||
|
- `trojan`
|
||||||
|
- `shadowsocks`
|
||||||
|
- `hysteria`
|
||||||
|
- `hysteria2`
|
||||||
|
- `tuic`
|
||||||
|
- `anytls`
|
||||||
|
- 兼容别名:`v2ray -> vmess`
|
||||||
|
|
||||||
|
`Xboard` 节点类型(`app/Models/Server.php`)有别名:
|
||||||
|
|
||||||
|
- `v2ray -> vmess`
|
||||||
|
- `hysteria2 -> hysteria`
|
||||||
|
|
||||||
|
建议:
|
||||||
|
|
||||||
|
1. 绝大多数场景按面板节点真实类型填写 `NodeType`。
|
||||||
|
2. Hysteria v2 场景建议仍使用 `NodeType: "hysteria"`,在面板协议设置里把 `version` 设为 `2`,避免类型语义混乱。
|
||||||
|
3. `V2bX` 并不对接 `Xboard` 的 `socks/naive/http/mieru` 这几类。
|
||||||
|
|
||||||
|
## 4. Xboard 面板端配置步骤
|
||||||
|
|
||||||
|
## 4.1 全局通信参数
|
||||||
|
|
||||||
|
后台系统配置里设置:
|
||||||
|
|
||||||
|
- `server_token`:与 V2bX 的 `ApiKey` 完全一致,长度建议 32+。
|
||||||
|
- `server_pull_interval`:节点拉配置周期(秒)。
|
||||||
|
- `server_push_interval`:节点推送流量周期(秒)。
|
||||||
|
- `device_limit_mode`:设备限制统计策略(按你的业务选)。
|
||||||
|
|
||||||
|
源码依据:
|
||||||
|
|
||||||
|
- `app/Http/Controllers/V2/Admin/ConfigController.php`
|
||||||
|
- `app/Http/Requests/Admin/ConfigSave.php`
|
||||||
|
|
||||||
|
## 4.2 创建节点(每个 NodeID 对应一个节点)
|
||||||
|
|
||||||
|
至少需要正确配置:
|
||||||
|
|
||||||
|
- `type`
|
||||||
|
- `name`
|
||||||
|
- `host`
|
||||||
|
- `port`
|
||||||
|
- `server_port`
|
||||||
|
- `group_ids`
|
||||||
|
- `rate`
|
||||||
|
- `protocol_settings`(按协议必填项)
|
||||||
|
|
||||||
|
源码依据:`app/Http/Requests/Admin/ServerSave.php`
|
||||||
|
|
||||||
|
## 4.3 用户可用性条件(非常关键)
|
||||||
|
|
||||||
|
节点可拉到的用户必须同时满足(`ServerService::getAvailableUsers`):
|
||||||
|
|
||||||
|
- 用户 `group_id` 在节点 `group_ids` 内
|
||||||
|
- `u + d < transfer_enable`
|
||||||
|
- 未过期
|
||||||
|
- 未被禁用
|
||||||
|
|
||||||
|
否则 `V2bX` 首次启动可能直接失败(无可用用户)。
|
||||||
|
|
||||||
|
## 4.4 队列进程
|
||||||
|
|
||||||
|
`/alive` 上报会派发 `UpdateAliveDataJob` 到 `online_sync` 队列。
|
||||||
|
若没有队列消费者,在线设备统计会滞后或不更新。
|
||||||
|
|
||||||
|
建议至少保证:
|
||||||
|
|
||||||
|
- `php artisan horizon` 正常运行
|
||||||
|
|
||||||
|
## 5. V2bX 配置(可直接改)
|
||||||
|
|
||||||
|
参考 `E:/code/go/V2bX/example/config.json`。
|
||||||
|
|
||||||
|
## 5.1 单节点最小可用示例
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"Log": {
|
||||||
|
"Level": "info",
|
||||||
|
"Output": ""
|
||||||
|
},
|
||||||
|
"Cores": [
|
||||||
|
{
|
||||||
|
"Type": "sing",
|
||||||
|
"Log": {
|
||||||
|
"Level": "info",
|
||||||
|
"Timestamp": true
|
||||||
|
},
|
||||||
|
"OriginalPath": "/etc/V2bX/sing_origin.json"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Nodes": [
|
||||||
|
{
|
||||||
|
"Core": "sing",
|
||||||
|
"ApiHost": "https://panel.example.com",
|
||||||
|
"ApiKey": "请填写与Xboard一致的server_token",
|
||||||
|
"NodeID": 1,
|
||||||
|
"NodeType": "vmess",
|
||||||
|
"Timeout": 30,
|
||||||
|
"ListenIP": "0.0.0.0",
|
||||||
|
"SendIP": "0.0.0.0",
|
||||||
|
"DeviceOnlineMinTraffic": 200,
|
||||||
|
"MinReportTraffic": 0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5.2 字段说明(高频踩坑项)
|
||||||
|
|
||||||
|
- `ApiHost`:必须是面板根地址,不要写成 `.../api/v1`。
|
||||||
|
- `ApiKey`:对应 `Xboard server_token`。
|
||||||
|
- `NodeID`:对应面板节点 `id`(或数值型 `code`)。
|
||||||
|
- `NodeType`:必须是 V2bX 支持的枚举。
|
||||||
|
- `Timeout`:HTTP 超时秒数。
|
||||||
|
- `ApiSendIP`(可选):多网卡时指定请求源 IP。
|
||||||
|
|
||||||
|
源码依据:`E:/code/go/V2bX/conf/node.go`
|
||||||
|
|
||||||
|
## 6. 启动与热重载
|
||||||
|
|
||||||
|
## 6.1 启动命令
|
||||||
|
|
||||||
|
```bash
|
||||||
|
V2bX server -c /etc/V2bX/config.json
|
||||||
|
```
|
||||||
|
|
||||||
|
默认支持 `--watch`(开启配置监听),配置文件变化后会自动重载核心和节点。
|
||||||
|
|
||||||
|
源码依据:`E:/code/go/V2bX/cmd/server.go`
|
||||||
|
|
||||||
|
## 6.2 建议运行形态
|
||||||
|
|
||||||
|
- 使用 `systemd` 托管 `V2bX`
|
||||||
|
- 配置 `Restart=always`
|
||||||
|
- 单独落日志文件,便于排错
|
||||||
|
|
||||||
|
## 7. 联调验证(建议按顺序)
|
||||||
|
|
||||||
|
## 7.1 手工验证面板接口可达
|
||||||
|
|
||||||
|
在节点机执行(把参数换成你的真实值):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -sS "https://panel.example.com/api/v1/server/UniProxy/config?node_type=vmess&node_id=1&token=YOUR_TOKEN"
|
||||||
|
```
|
||||||
|
|
||||||
|
预期:返回 JSON,包含 `base_config.push_interval` 与 `base_config.pull_interval`。
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -sS "https://panel.example.com/api/v1/server/UniProxy/user?node_type=vmess&node_id=1&token=YOUR_TOKEN"
|
||||||
|
```
|
||||||
|
|
||||||
|
预期:返回 `users` 列表,且非空(至少有一个可用用户)。
|
||||||
|
|
||||||
|
## 7.2 启动后看 V2bX 日志
|
||||||
|
|
||||||
|
应出现这类信息:
|
||||||
|
|
||||||
|
- `Core ... started`
|
||||||
|
- `Nodes started`
|
||||||
|
- 周期性 `Report N users traffic`
|
||||||
|
- 周期性在线用户上报日志
|
||||||
|
|
||||||
|
## 7.3 面板侧确认
|
||||||
|
|
||||||
|
- 节点状态 `last_check_at`、`last_push_at` 持续刷新
|
||||||
|
- 用户流量持续累加
|
||||||
|
- `online_count` 有变化(需要队列正常)
|
||||||
|
|
||||||
|
## 8. 常见问题与处理
|
||||||
|
|
||||||
|
## 8.1 `unsupported Node type`
|
||||||
|
|
||||||
|
原因:`NodeType` 不在 V2bX 白名单。
|
||||||
|
处理:改为支持值(如 `vmess/vless/trojan/shadowsocks/hysteria/tuic/anytls`)。
|
||||||
|
|
||||||
|
## 8.2 `Invalid token`
|
||||||
|
|
||||||
|
原因:`ApiKey != server_token`。
|
||||||
|
处理:面板与节点统一同一密钥,并确认没有前后空格。
|
||||||
|
|
||||||
|
## 8.3 `Server does not exist`
|
||||||
|
|
||||||
|
原因:
|
||||||
|
|
||||||
|
- `NodeID` 错误
|
||||||
|
- `NodeType` 与面板节点类型不匹配
|
||||||
|
|
||||||
|
处理:先在面板确认节点 ID/类型,再校正 V2bX 配置。
|
||||||
|
|
||||||
|
## 8.4 `add users error: not have any user`
|
||||||
|
|
||||||
|
原因:该节点按权限组筛选后没有可用用户。
|
||||||
|
处理:
|
||||||
|
|
||||||
|
1. 确认节点 `group_ids`
|
||||||
|
2. 确认至少一个用户满足流量/到期/禁用条件
|
||||||
|
|
||||||
|
## 8.5 在线设备不上报或不更新
|
||||||
|
|
||||||
|
原因:面板队列消费者未运行。
|
||||||
|
处理:启动并确认 `horizon` 正常消费(尤其 `online_sync` 队列)。
|
||||||
|
|
||||||
|
## 8.6 配置路径重复导致 404
|
||||||
|
|
||||||
|
原因:`ApiHost` 写成 `https://panel/api/v1`,最终拼接成重复路径。
|
||||||
|
处理:`ApiHost` 只保留根域名(如 `https://panel.example.com`)。
|
||||||
|
|
||||||
|
## 9. 请求/响应数据形状(排错用)
|
||||||
|
|
||||||
|
## 9.1 配置拉取
|
||||||
|
|
||||||
|
- 请求:`GET /api/v1/server/UniProxy/config?node_type=...&node_id=...&token=...`
|
||||||
|
- 响应:按协议字段 + `base_config`
|
||||||
|
|
||||||
|
## 9.2 用户拉取
|
||||||
|
|
||||||
|
- 请求:`GET /api/v1/server/UniProxy/user?...`
|
||||||
|
- 响应:`{"users":[{"id":1,"uuid":"...","speed_limit":0,"device_limit":0}]}`(也兼容 msgpack)
|
||||||
|
|
||||||
|
## 9.3 流量上报
|
||||||
|
|
||||||
|
- 请求:`POST /api/v1/server/UniProxy/push?...`
|
||||||
|
- Body(V2bX 实际发送):
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"1001": [12345, 67890],
|
||||||
|
"1002": [11111, 22222]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 9.4 在线上报
|
||||||
|
|
||||||
|
- 请求:`POST /api/v1/server/UniProxy/alive?...`
|
||||||
|
- Body:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"1001": ["1.1.1.1", "2.2.2.2"],
|
||||||
|
"1002": ["3.3.3.3"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 10. 安全建议
|
||||||
|
|
||||||
|
1. `ApiHost` 必须用 HTTPS。
|
||||||
|
2. `server_token` 使用高强度随机值并定期轮换。
|
||||||
|
3. 在反向代理/Nginx 层限制节点来源 IP 访问 `server/UniProxy` 接口。
|
||||||
|
4. 变更 `server_token` 后,面板与全部节点必须同时切换。
|
||||||
|
|
||||||
|
## 11. 代码参考索引
|
||||||
|
|
||||||
|
Xboard:
|
||||||
|
|
||||||
|
- `app/Http/Routes/V1/ServerRoute.php`
|
||||||
|
- `app/Http/Middleware/Server.php`
|
||||||
|
- `app/Http/Controllers/V1/Server/UniProxyController.php`
|
||||||
|
- `app/Services/ServerService.php`
|
||||||
|
- `app/Jobs/UpdateAliveDataJob.php`
|
||||||
|
- `app/Http/Requests/Admin/ConfigSave.php`
|
||||||
|
- `app/Http/Requests/Admin/ServerSave.php`
|
||||||
|
|
||||||
|
V2bX:
|
||||||
|
|
||||||
|
- `api/panel/panel.go`
|
||||||
|
- `api/panel/node.go`
|
||||||
|
- `api/panel/user.go`
|
||||||
|
- `node/controller.go`
|
||||||
|
- `node/task.go`
|
||||||
|
- `node/user.go`
|
||||||
|
- `conf/node.go`
|
||||||
|
- `cmd/server.go`
|
||||||
|
- `example/config.json`
|
||||||
|
|
||||||
Reference in New Issue
Block a user