import { mkdir, mkdtemp } from "node:fs/promises"; import { tmpdir } from "node:os"; import path from "node:path"; import { cwd, exit } from "node:process"; import { Alpine } from "./alpine.js"; import { generateForgejoSecretsFile } from "./services/forgejo/secrets.js"; import { generateGrafanaSecretsFile } from "./services/grafana/secrets.js"; import { execFile } from "./helpers/better-api.js"; import { sudoChown, sudoChownToRunningUser } from "./helpers/sudo.js"; import { setupKernel } from "./kernel.js"; import { runQemu } from "./qemu.js"; import { Runit } from "./runit/index.js"; import { installFluentBit } from "./software/fluentbit"; import { setupForgejo } from "./services/forgejo/index.js"; import { setupDhcpcd } from "./services/dhcpcd.js"; import { setupNtpsec } from "./services/ntpsec.js"; import { setupGrafana } from "./services/grafana/index.js"; import { setupLoki } from "./services/loki/index.js"; if (process.argv[2] === "generate-secrets") { await generateForgejoSecretsFile(); await generateGrafanaSecretsFile(); exit(0); } { console.time("Building"); const artifactsDir = path.join(cwd(), "artifacts/"); const kernelDir = path.join(artifactsDir, "kernel"); await mkdir(artifactsDir, { recursive: true }); await mkdir(kernelDir, { recursive: true }); const rootfsDir = await mkdtemp(path.join(tmpdir(), "define-alpine-")); await sudoChown(rootfsDir, "root:root"); console.debug(rootfsDir); const alpine = await Alpine.makeWorld({ dir: rootfsDir }); await alpine.addPackages(["helix", "htop", "iproute2-ss", "socat"]); await alpine.writeFile( "/root/.ash_history", ` socat tcp-listen:80,reuseaddr,fork tcp:localhost:3050 & `, { uid: 0, gid: 0 } ); await installFluentBit(alpine); const runit = await Runit.setup(alpine); await setupDhcpcd(alpine, runit); await setupNtpsec(alpine, runit); await setupForgejo(alpine, runit); await setupLoki(alpine, runit); await setupGrafana(alpine, runit); const kernel = await setupKernel(alpine, kernelDir); const squashfs = path.join(artifactsDir, "image.squashfs"); await execFile("sudo", [ "mksquashfs", alpine.dir, squashfs, "-root-mode", "755", "-comp", "zstd", "-Xcompression-level", "3", "-noappend", "-quiet", ]); await sudoChownToRunningUser(squashfs); console.timeEnd("Building"); runQemu(squashfs, kernel, { graphic: true }); }