define-alpine-the-sequel/index.ts

85 lines
2.7 KiB
TypeScript
Raw Permalink Normal View History

2023-01-16 15:14:20 +00:00
import { mkdir, mkdtemp } from "node:fs/promises";
2023-01-16 12:42:10 +00:00
import { tmpdir } from "node:os";
import path from "node:path";
2023-02-08 14:46:33 +00:00
import { cwd, exit } from "node:process";
2023-01-16 15:14:20 +00:00
import { Alpine } from "./alpine.js";
2023-02-08 14:50:07 +00:00
import { generateForgejoSecretsFile } from "./services/forgejo/secrets.js";
import { generateGrafanaSecretsFile } from "./services/grafana/secrets.js";
2023-02-02 22:02:38 +00:00
import { execFile } from "./helpers/better-api.js";
2023-01-23 15:30:21 +00:00
import { setupKernel } from "./kernel.js";
2023-02-02 21:25:11 +00:00
import { runQemu } from "./qemu.js";
2023-01-16 15:14:20 +00:00
import { Runit } from "./runit/index.js";
2023-02-18 16:10:21 +00:00
import { installFluentBit } from "./software/fluentbit";
import { setupForgejo } from "./services/forgejo/index.js";
2023-02-08 18:05:53 +00:00
import { setupDhcpcd } from "./services/dhcpcd.js";
2023-02-08 18:15:07 +00:00
import { setupNtpsec } from "./services/ntpsec.js";
import { setupGrafana } from "./services/grafana/index.js";
2023-02-17 00:27:28 +00:00
import { setupLoki } from "./services/loki/index.js";
2023-02-23 01:15:24 +00:00
import { generatePasswdSecretsFile } from "./passwd.js";
2023-01-16 12:42:10 +00:00
2023-02-08 14:46:33 +00:00
if (process.argv[2] === "generate-secrets") {
await generateForgejoSecretsFile();
await generateGrafanaSecretsFile();
2023-02-23 01:15:24 +00:00
await generatePasswdSecretsFile();
2023-02-08 14:46:33 +00:00
exit(0);
}
2023-02-19 20:58:18 +00:00
async function timed<T>(fn: () => Promise<T>): Promise<T> {
console.time(fn.toString());
const r = await fn();
console.timeEnd(fn.toString());
return r;
}
2023-01-16 12:42:10 +00:00
{
2023-01-23 15:30:21 +00:00
console.time("Building");
2023-02-02 21:25:11 +00:00
const artifactsDir = path.join(cwd(), "artifacts/");
const kernelDir = path.join(artifactsDir, "kernel");
await mkdir(artifactsDir, { recursive: true });
await mkdir(kernelDir, { recursive: true });
2023-01-16 12:42:10 +00:00
const rootfsDir = await mkdtemp(path.join(tmpdir(), "define-alpine-"));
console.debug(rootfsDir);
2023-02-19 20:58:18 +00:00
const alpine = await timed(() => Alpine.makeWorld({ dir: rootfsDir }));
2023-02-08 14:46:33 +00:00
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 alpine.fstab.addMount("/dev/sda /persist ext4 defaults 0 0");
2023-02-19 20:58:18 +00:00
await timed(() => installFluentBit(alpine));
const runit = await timed(() => Runit.setup(alpine));
await timed(() => setupDhcpcd(alpine, runit));
await timed(() => setupNtpsec(alpine, runit));
await timed(() => setupForgejo(alpine, runit));
await timed(() => setupLoki(alpine, runit));
await timed(() => setupGrafana(alpine, runit));
const kernel = await timed(() => setupKernel(alpine, kernelDir));
2023-02-02 21:25:11 +00:00
await timed(() => alpine.actuallyInstallPackages());
2023-02-02 21:25:11 +00:00
const squashfs = path.join(artifactsDir, "image.squashfs");
await timed(() =>
execFile("mksquashfs", [
alpine.dir,
squashfs,
"-root-mode",
"755",
"-comp",
"zstd",
"-Xcompression-level",
"1",
"-noappend",
"-quiet",
])
);
2023-01-23 15:30:21 +00:00
console.timeEnd("Building");
2023-02-19 20:58:18 +00:00
// runQemu(squashfs, kernel, { graphic: true });
2023-01-16 12:42:10 +00:00
}