Files
mihomo-patchbay/server/index.ts
T
im0o ada547adf7 加上 HTTP 接口层和令牌认证
接口分三类:配置读写走保护链路,内核状态和只读透传,静态字段表。
透传用白名单而不是黑名单——写操作属于运行时面板,等做到那步再单独开,
现在不留一个什么都能转发的口子。

令牌即便在只监听本机时也强制校验:同一台机器上跑着容器和别的服务,
「只监听 127.0.0.1」不等于「只有你能访问」。比较用常数时间,避免靠响应耗时猜。

scripts/api-smoke.ts 对着真服务和真内核跑 17 项检查,端到端确认过
改配置之后内核会重载、新端口真的被监听起来。
2026-08-10 03:37:49 +08:00

55 lines
2.1 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 } 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)
}
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},本机之外也能访问。确认这是你要的。`)
}