40 lines
2.5 KiB
TypeScript
40 lines
2.5 KiB
TypeScript
import Link from "next/link";
|
|
import { requireCloudViewer } from "../../../cloud-auth";
|
|
import { DashboardShell, PageHeading } from "../../../components/Shells";
|
|
import { getDashboardSnapshot, getOrCreateAccount } from "@/db/repository";
|
|
import { getDaemonReleaseState } from "../../../daemon-release";
|
|
import { deriveBetaOnboarding } from "../../onboarding";
|
|
import { PairingForm } from "./PairingForm";
|
|
import { resolveConnectOrigin } from "./onboarding";
|
|
import { env } from "cloudflare:workers";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
export default async function NewHostPage() {
|
|
const viewer = await requireCloudViewer("/dashboard/hosts/new");
|
|
const account = await getOrCreateAccount(viewer);
|
|
const [snapshot, daemonRelease] = await Promise.all([
|
|
getDashboardSnapshot(account),
|
|
getDaemonReleaseState(),
|
|
]);
|
|
const onboarding = deriveBetaOnboarding({
|
|
entitlement: snapshot.entitlement,
|
|
hasPendingRequest: snapshot.accessRequests.some((request) => request.status === "requested"),
|
|
});
|
|
const connectOrigin = resolveConnectOrigin(
|
|
env.NEKONEST_CLOUD_CONNECT_ORIGIN,
|
|
process.env.NODE_ENV !== "production",
|
|
);
|
|
return (
|
|
<DashboardShell viewer={viewer} active="/dashboard/hosts">
|
|
<div className="cloud-page narrow-cloud-page">
|
|
<PageHeading eyebrow="ADD OR RECOVER HOST / 添加或恢复主机" title="先创建一次性配对请求。" description="新主机和已撤销主机的安全恢复共用这一步;家里不需要打开入站端口。" actions={<Link className="button button-secondary" href="/download">先下载兼容 daemon</Link>} />
|
|
<div className="form-layout">
|
|
<section className="panel form-panel"><PairingForm accessState={onboarding.pairingAccessState} releaseAvailable={daemonRelease.available} minimumDaemonVersion={daemonRelease.minimumVersion} connectOrigin={connectOrigin} /></section>
|
|
<aside className="form-aside"><span className="eyebrow">接下来会发生</span><ol><li><strong>控制平面生成短时凭证</strong><p>原始代码只显示一次,库中保存 SHA-256 哈希。</p></li><li><strong>daemon 主动认领</strong><p>daemon 提交本机身份公钥,成功后获得独立可撤销令牌。</p></li><li><strong>恢复时证明原私钥</strong><p>若该身份对应已撤销记录,最新版 daemon 必须对本次配对签名;只有公开指纹不够。</p></li><li><strong>原子占用主机槽位</strong><p>认领和槽位分配在同一事务中完成;凭证成功后立即烧毁。</p></li></ol></aside>
|
|
</div>
|
|
</div>
|
|
</DashboardShell>
|
|
);
|
|
}
|