feat: 支持证书托管和节点自动安装

This commit is contained in:
2026-09-29 13:06:56 +08:00
parent ab7d1c937a
commit 586c2399d1
20 changed files with 1600 additions and 20 deletions
+51
View File
@@ -0,0 +1,51 @@
import { ProvisionError } from "@/lib/certificates";
import { provisionNode } from "@/lib/provisioning";
export const runtime = "nodejs";
export async function POST(request: Request) {
const headers = { "Cache-Control": "no-store" };
try {
// Bound streamed input, including requests without Content-Length.
const reader = request.body?.getReader();
if (!reader)
return Response.json(
{ error: "缺少请求内容。" },
{ status: 400, headers },
);
const chunks: Uint8Array[] = [];
let size = 0;
while (true) {
const { done, value } = await reader.read();
if (done) break;
size += value.byteLength;
if (size > 4096) {
await reader.cancel();
return Response.json({ error: "请求过大。" }, { status: 413, headers });
}
chunks.push(value);
}
let payload;
try {
payload = JSON.parse(Buffer.concat(chunks).toString("utf8"));
} catch {
return Response.json({ error: "无效 JSON。" }, { status: 400, headers });
}
if (!payload || !["prepare", "complete"].includes(payload.action))
return Response.json({ error: "无效操作。" }, { status: 400, headers });
const token =
request.headers.get("authorization")?.replace(/^Bearer /, "") ?? "";
return Response.json(
await provisionNode(token, payload.action, payload.ports),
{ headers },
);
} catch (error) {
return Response.json(
{
error:
error instanceof ProvisionError
? error.message
: "安装请求失败,请联系平台管理员。",
},
{ status: error instanceof ProvisionError ? 400 : 500, headers },
);
}
}