import ssh2 from "ssh2"; import type { Bereitstellungsschluessel } from "@/engine/ablaeufe/lxc-ausrollen"; import { prisma } from "@/lib/db"; import { entschluesseln, verschluesseln } from "@/lib/geheimnisse"; /** * Der Bereitstellungsschlüssel: damit meldet sich ProxDeploy als root in frisch angelegten * Containern an, wenn es keinen SSH-Zugang zum Node hat. Er steht nur während der * Provisionierung in /root/.ssh/authorized_keys und wird am Ende des Skripts entfernt (am * Kommentar `proxdeploy-bereitstellung` erkennbar). Einmal erzeugt, privat nur verschlüsselt. */ const SCHLUESSEL = "bereitstellungsschluessel"; export const KOMMENTAR = "proxdeploy-bereitstellung"; export async function bereitstellungsschluessel(): Promise { const vorhanden = await prisma.einstellung.findUnique({ where: { schluessel: SCHLUESSEL } }); if (vorhanden) { const wert = vorhanden.wert as { privat: string; oeffentlich: string }; return { privat: entschluesseln(wert.privat), oeffentlich: wert.oeffentlich }; } const paar = ssh2.utils.generateKeyPairSync("ed25519", { comment: KOMMENTAR }); const neu = { privat: verschluesseln(paar.private), oeffentlich: paar.public.trim() }; // Zwei gleichzeitige Aufträge: der erste gewinnt, der zweite liest dessen Schlüssel. await prisma.einstellung.upsert({ where: { schluessel: SCHLUESSEL }, create: { schluessel: SCHLUESSEL, wert: neu }, update: {}, }); return await bereitstellungsschluessel(); }