diff --git a/.env.example b/.env.example index 92144ab..cb3ad68 100644 --- a/.env.example +++ b/.env.example @@ -10,6 +10,10 @@ PATCHBAY_CONFIG=./dev/home/config.yaml PATCHBAY_MIHOMO_BIN=../binary/mihomo-windows-amd64-v3-go125.exe PATCHBAY_MIHOMO_HOME=./dev/home +# 本地测试内核用的订阅地址,bun run dev:reset 会把它填进 dev/home/config.yaml。 +# 开发时一般是 SSH 隧道映射过来的 Sub-Store:ssh -N -L 3001:127.0.0.1:3001 用户名@服务器 +DEV_SUBSCRIPTION_URL= + # ── 想对着真实机器调试时改成这一套 ────────────────────── # 先开隧道把管理接口映射到本机: # ssh -N -f -L 9090:127.0.0.1:9090 用户名@服务器地址 diff --git a/dev/config.yaml b/dev/config.yaml index 201e4c8..45e87b0 100644 --- a/dev/config.yaml +++ b/dev/config.yaml @@ -1,7 +1,12 @@ -# 本地开发用的测试配置 — 不含任何真实信息 -# 端口刻意避开默认值(7890 / 9090),免得和机器上其它 mihomo 打架。 -# 里面的服务器地址全是占位的,从不会真的连上去;这份配置只用来验证 -# 「写回 → 校验 → 重载 → 失败还原」这条链路,不用来真的代理流量。 +# 本地开发用的测试配置模板。 +# +# 这是模板,不是实际运行的文件:`bun run dev:reset` 会把 __SUBSCRIPTION_URL__ 换成 +# .env 里的 DEV_SUBSCRIPTION_URL,生成 dev/home/config.yaml(那个文件不进 git)。 +# 订阅地址里通常带访问令牌,不能提交。 +# +# 端口刻意避开 mihomo 的默认值(7890 / 9090),免得和机器上其它内核打架。 +# 结构照着真实那台机器来:没有手写线路,全部通过订阅引入——这样开发时遇到的 +# 约束和真实环境一致(比如订阅线路无法被入站直接引用)。 mixed-port: 17890 # 代理端口,避开默认的 7890 allow-lan: false # 本地测试不对局域网开放 @@ -12,28 +17,30 @@ ipv6: false external-controller: 127.0.0.1:19090 # 管理接口,避开默认的 9090 secret: "dev-secret-local-only" -# 关掉自动更新,避免测试时下载 GEO 数据库 -geo-auto-update: false +geo-auto-update: false # 关掉自动更新,避免测试时下载 GEO 数据库 -proxies: - - name: 占位线路甲 - type: socks5 - server: 127.0.0.1 - port: 1080 - - name: 占位线路乙 - type: socks5 - server: 127.0.0.1 - port: 1081 +proxy-providers: + subs: + type: http + url: "__SUBSCRIPTION_URL__" + path: ./providers/subs.yaml + interval: 86400 + health-check: + enable: true + url: https://www.gstatic.com/generate_204 + interval: 300 proxy-groups: - name: PROXY # 总开关,手动选 type: select proxies: [AUTO, DIRECT] + use: [subs] - name: AUTO # 自动挑延迟最低的 type: url-test - proxies: [占位线路甲, 占位线路乙] + use: [subs] url: https://www.gstatic.com/generate_204 interval: 300 + tolerance: 50 rules: # 本机和内网地址一律直连 diff --git a/package.json b/package.json index 33a9101..5f76c65 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "dev": "bun run --hot server/index.ts", "dev:web": "vite", "dev:kernel": "../binary/mihomo-windows-amd64-v3-go125.exe -d dev/home -f dev/home/config.yaml", - "dev:reset": "cp dev/config.yaml dev/home/config.yaml", + "dev:reset": "bun run scripts/dev-reset.ts", "build": "vite build", "test": "bun test", "smoke": "bun run scripts/api-smoke.ts", diff --git a/scripts/dev-reset.ts b/scripts/dev-reset.ts new file mode 100644 index 0000000..37d92cb --- /dev/null +++ b/scripts/dev-reset.ts @@ -0,0 +1,26 @@ +/** + * 从模板生成本地测试内核的配置。 + * + * 模板 dev/config.yaml 进 git,生成的 dev/home/config.yaml 不进——因为订阅地址里 + * 通常带访问令牌。所以模板里写占位符,这个脚本从 .env 取真值替换。 + * + * 用法:bun run dev:reset + */ +import { mkdir, readFile, writeFile } from 'node:fs/promises' + +const TEMPLATE = './dev/config.yaml' +const TARGET = './dev/home/config.yaml' +const PLACEHOLDER = '__SUBSCRIPTION_URL__' + +const url = Bun.env.DEV_SUBSCRIPTION_URL +const template = await readFile(TEMPLATE, 'utf8') + +if (template.includes(PLACEHOLDER) && !url) { + console.error(`模板里有 ${PLACEHOLDER},但 .env 里没有 DEV_SUBSCRIPTION_URL。`) + console.error('填一个能拉到线路的订阅地址;开发时通常是 SSH 隧道映射过来的 Sub-Store。') + process.exit(1) +} + +await mkdir('./dev/home', { recursive: true }) +await writeFile(TARGET, template.replaceAll(PLACEHOLDER, url ?? ''), 'utf8') +console.log(`${TARGET} 已从模板重新生成`) diff --git a/web/components/OutboundCard.vue b/web/components/OutboundCard.vue new file mode 100644 index 0000000..14f5964 --- /dev/null +++ b/web/components/OutboundCard.vue @@ -0,0 +1,196 @@ + + + + + diff --git a/web/views/InboundDetail.vue b/web/views/InboundDetail.vue index 72e4194..c51d787 100644 --- a/web/views/InboundDetail.vue +++ b/web/views/InboundDetail.vue @@ -1,26 +1,33 @@