diff --git a/Dockerfile b/Dockerfile index 3a6a193a..91fab4a9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,8 +12,11 @@ RUN apt-get install nodejs -yq RUN npm i -g @parcel/watcher node-gyp-build-optional-packages node-gyp pnpm RUN PATH="/usr/lib/node_modules/npm/bin:$PATH" -COPY . . +COPY dockerzip . +RUN unzip -o dockerzip RUN bun install + +COPY . . RUN bun run build EXPOSE 4550/tcp diff --git a/dockerzip b/dockerzip new file mode 100644 index 00000000..1a89c0ea Binary files /dev/null and b/dockerzip differ diff --git a/pkgs/core/index.ts b/pkgs/core/index.ts index 045e8784..0e3785ca 100644 --- a/pkgs/core/index.ts +++ b/pkgs/core/index.ts @@ -13,62 +13,63 @@ import { createId } from "@paralleldrive/cuid2"; import { prepareApiRoutes } from "./server/api/api-scan"; import { writeAsync } from "fs-jetpack"; import { dir } from "dir"; +import "../docker-prep"; g.status = "init"; await writeAsync( - dir.path("app/web/timestamp.ts"), - `export const version = "${createId().substring(0, 7)}";`, + dir.path("app/web/timestamp.ts"), + `export const version = "${createId().substring(0, 7)}";` ); if (!g.Y) { - g.Y = await import("yjs"); - g.syncronize = (await import("y-pojo")).syncronize; + g.Y = await import("yjs"); + g.syncronize = (await import("y-pojo")).syncronize; - await createLogger(); - g.api = {}; - g.mode = process.argv.includes("dev") ? "dev" : "prod"; - g.datadir = g.mode == "prod" ? "../data" : "data"; - g.port = parseInt(process.env.PORT || "4550"); + await createLogger(); + g.api = {}; + g.mode = process.argv.includes("dev") ? "dev" : "prod"; + g.datadir = g.mode == "prod" ? "../data" : "data"; + g.port = parseInt(process.env.PORT || "4550"); - g.log.info(g.mode === "dev" ? "DEVELOPMENT" : "PRODUCTION"); - if (g.mode === "dev") { - await startDevWatcher(); - } + g.log.info(g.mode === "dev" ? "DEVELOPMENT" : "PRODUCTION"); + if (g.mode === "dev") { + await startDevWatcher(); + } - /** init lmdb */ - user.conf.init(); - snapshot.init(); + /** init lmdb */ + user.conf.init(); + snapshot.init(); } const db = g.db; if (!db) { - await preparePrisma(); - await ensureNotRunning(); - const db = g.db; - if (db) { - db.$connect() - .catch((e: any) => { - g.log.error(`[DB ERROR]\n${e.message}`); - }) - .then(() => { - g.log.info("Database connected"); - }); - } + await preparePrisma(); + await ensureNotRunning(); + const db = g.db; + if (db) { + db.$connect() + .catch((e: any) => { + g.log.error(`[DB ERROR]\n${e.message}`); + }) + .then(() => { + g.log.info("Database connected"); + }); + } } if (!g.apiPrepared) { - await initSrv(); - await syncActionDefinition(); - g.log.info("WS Action defined"); - await prepareApiRoutes(); - await prepareAPITypes(); - g.log.info("API Prepared"); - g.apiPrepared = true; + await initSrv(); + await syncActionDefinition(); + g.log.info("WS Action defined"); + await prepareApiRoutes(); + await prepareAPITypes(); + g.log.info("API Prepared"); + g.apiPrepared = true; } if (!g.parcel) { - await parcelBuild(); + await parcelBuild(); } const { createServer } = await import("./server/create"); diff --git a/pkgs/docker-prep.ts b/pkgs/docker-prep.ts new file mode 100644 index 00000000..4cb5fcad --- /dev/null +++ b/pkgs/docker-prep.ts @@ -0,0 +1,53 @@ +import { $ } from "execa"; +import fs from "fs"; +import { + copyAsync, + dirAsync, + existsAsync, + removeAsync +} from "fs-jetpack"; +import path from "path"; + +const dir = { + path(...allpath: any[]) { + return path.join(process.cwd(), ...allpath); + }, + read(dirPath: string, baseDir?: string[]): Record { + const result: Record = {}; + + const contents = fs.readdirSync(dirPath); + + for (const item of contents) { + const itemPath = path.join(dirPath, item); + const stats = fs.statSync(itemPath); + + if (stats.isFile()) { + // const content = fs.readFileSync(itemPath, "utf-8"); + result[[...(baseDir || []), item].join("/")] = ""; + } else if (stats.isDirectory()) { + if (item !== "node_modules" && item !== ".git") { + const subdirResult = dir.read(itemPath, [...(baseDir || []), item]); + Object.assign(result, subdirResult); + } + } + } + + return result; + }, +}; + +if (!(await existsAsync(dir.path("_tmp_docker")))) { + for (const file of Object.keys(dir.read(dir.path``))) { + if (file.endsWith("package.json")) { + await dirAsync(dir.path("_tmp_docker", path.dirname(file))); + await copyAsync(dir.path(file), dir.path("_tmp_docker", file), { + overwrite: true, + }); + } + } + await copyAsync(dir.path("bun.lockb"), dir.path("_tmp_docker", "bun.lockb")); + + await $({ cwd: dir.path("_tmp_docker") })`zip -r ../docker .`; + await $`mv docker.zip dockerzip`; + await removeAsync(dir.path("_tmp_docker")); +}