Files
mihomo-patchbay/server/index.ts
T
im0o e9e2eb555d 每路入站配一组专属策略组,换线不再改配置文件
原本换一条线要改 config.yaml、跑校验、等内核重载,几秒起步;而换线恰恰是这个工具
最高频的动作,把它放在最重的路径上方向就错了。现在每一路配一个 select 组加 AUTO、
FALLBACK 两个,入站的 proxy 永久指向 select,换线只是调一次内核接口。这样做的前提是
选中不会丢:内核把它写进 cache 文件,重启后由 patchSelectGroup 恢复,而
profile.store-selected 默认为真。

链式代理靠给来源订阅复制一份声明、挂上 override.dialer-proxy 实现,因为这个字段写在
策略组上内核只会打条日志然后忽略。副本是 type: file 读原订阅已经落盘的缓存,而不是
自己再拉一次:自己拉的话订阅地址一不可达副本就是空的,那一路入站会一条线都不剩,
表现是端口还在监听却没有任何出口。

顺带把 shared/outbound-chain.ts 里「只有 Selector 接受手动选择」那条断言删了,它是
错的(内核检查的是 SelectAble 接口,URLTest 和 Fallback 也实现了)。界面仍然只让
Selector 可点,但理由换成了另外两种的手动指定会被它们自己撤销。

完整取舍见工作区决策记录 0007。
2026-08-11 03:10:38 +08:00

57 lines
2.2 KiB
TypeScript
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.
/**
* 启动入口。
*
* 启动时把该报的问题一次报清楚:环境变量缺没缺、配置文件读不读得到、内核在不在线。
* 配置类工具最糟糕的失败方式是界面能打开、点了保存才发现根本连不上。
*/
import { readEnv } from './env.ts'
import { resolveToken } from './auth.ts'
import { createRouter } from './routes.ts'
import { readConfig } from './config-store.ts'
import { kernelVersion, warmUpKernelBinary } from './kernel.ts'
const env = readEnv()
const { token, source } = await resolveToken(env)
// 先确认配置文件读得到、解析得动。读不到就没必要往下走了。
try {
const snapshot = await readConfig(env)
const errors = snapshot.diagnostics.filter((d) => d.severity === 'error')
console.log(`配置文件 ${env.configPath}`)
if (errors.length > 0) {
console.log(` 解析出 ${String(errors.length)} 个问题,界面上会标出来:`)
for (const e of errors) console.log(` ${e.path.join('.')}:${e.message}`)
}
} catch (error) {
console.error(`读不到配置文件 ${env.configPath}`)
console.error(String(error))
console.error('检查 .env 里的 PATCHBAY_CONFIG 指对了没有,以及这个进程有没有读权限。')
process.exit(1)
}
warmUpKernelBinary(env)
const kernel = await kernelVersion(env)
console.log(
kernel.online
? `内核 在线 ${kernel.version ?? ''}(${env.mihomoApi})`
: `内核 连不上 ${env.mihomoApi}——界面仍然能编辑配置,但看不到订阅里的线路,也无法重载`,
)
const handle = createRouter(env, token)
const server = Bun.serve({
hostname: env.host,
port: env.port,
fetch: handle,
})
console.log(`令牌 ${token}`)
console.log(` 来自 ${source}`)
console.log(`Patchbay http://${server.hostname}:${String(server.port)}`)
if (env.host === '127.0.0.1') {
console.log(` 只监听本机。从别的机器访问请开隧道:`)
console.log(` ssh -N -L ${String(env.port)}:127.0.0.1:${String(env.port)} 用户名@这台机器`)
} else {
console.log(` ⚠ 监听在 ${env.host},本机之外也能访问。确认这是你要的。`)
}