diff --git a/apps/web/app/install.sh/route.test.ts b/apps/web/app/install.sh/route.test.ts new file mode 100644 index 0000000000..ec70c6a3d0 --- /dev/null +++ b/apps/web/app/install.sh/route.test.ts @@ -0,0 +1,14 @@ +import { describe, expect, it } from "vitest"; +import { GET } from "./route"; + +describe("GET /install.sh", () => { + it("serves the Linux installer script directly", async () => { + const response = await GET(); + const body = await response.text(); + + expect(response.status).toBe(200); + expect(response.headers.get("content-type")).toContain("text/x-shellscript"); + expect(body).toContain("#!/usr/bin/env bash"); + expect(body).toContain("Usage: install.sh"); + }); +}); diff --git a/apps/web/app/install.sh/route.ts b/apps/web/app/install.sh/route.ts new file mode 100644 index 0000000000..57c85e5f0e --- /dev/null +++ b/apps/web/app/install.sh/route.ts @@ -0,0 +1,18 @@ +import { readFile } from "node:fs/promises"; + +export const runtime = "nodejs"; + +export async function GET() { + const script = await readFile( + new URL("../../../../scripts/install.sh", import.meta.url), + "utf8", + ); + + return new Response(script, { + headers: { + "Cache-Control": "public, max-age=300", + "Content-Disposition": 'inline; filename="install.sh"', + "Content-Type": "text/x-shellscript; charset=utf-8", + }, + }); +}