From ea1d7b1510d4f47cf32ebcb3db390ef18290b3e8 Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Sat, 6 Apr 2024 22:56:15 -1000 Subject: [PATCH] More work on fixing Docker build --- Dockerfile | 11 +- build.ts | 8 +- bun.lockb | Bin 330080 -> 291332 bytes entrypoint.sh | 8 +- index.ts | 26 +-- package.json | 230 +++++++++++++-------------- packages/config-manager/package.json | 6 +- packages/log-manager/index.ts | 17 +- prisma/schema.prisma | 2 +- 9 files changed, 163 insertions(+), 145 deletions(-) diff --git a/Dockerfile b/Dockerfile index ae1b1e5a..47349bd6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # Use the official Bun image (Bun doesn't run well on Musl but this seems to work) # See all versions at https://hub.docker.com/r/oven/bun/tags -FROM oven/bun:1.1.2-alpine as base +FROM imbios/bun-node:1.1.2-current-alpine as base # Install dependencies into temp directory # This will cache them and speed up future builds @@ -14,9 +14,6 @@ RUN bun install --frozen-lockfile FROM base as build -# Required for Prisma to work -# COPY --from=node:18-alpine /usr/local/bin/node /usr/local/bin/node - # Copy the project RUN mkdir -p /temp COPY . /temp @@ -24,10 +21,11 @@ COPY . /temp COPY --from=install /temp/node_modules /temp/node_modules # Build the project WORKDIR /temp +RUN bunx --bun prisma generate RUN bun run prod-build # copy production dependencies and source code into final image -FROM base AS release +FROM oven/bun:1.1.2-alpine # Create app directory RUN mkdir -p /app @@ -44,5 +42,6 @@ LABEL org.opencontainers.image.description "Lysand Server docker image" # CD to app WORKDIR /app ENV NODE_ENV=production +ENTRYPOINT [ "/bin/sh", "entrypoint.sh" ] # Run migrations and start the server -CMD [ "./entrypoint.sh" "start" ] +CMD [ "start" ] diff --git a/build.ts b/build.ts index 1f177970..b8856dcd 100644 --- a/build.ts +++ b/build.ts @@ -1,4 +1,5 @@ // Delete dist directory +import { $ } from "bun"; import { cp, exists, mkdir, rm } from "node:fs/promises"; import { rawRoutes } from "~routes"; @@ -13,7 +14,6 @@ await rm("./dist", { recursive: true }); await mkdir(`${process.cwd()}/dist`); -//bun build --entrypoints ./index.ts ./prisma.ts ./cli.ts --outdir dist --target bun --splitting --minify --external bullmq,@prisma/client await Bun.build({ entrypoints: [ `${process.cwd()}/index.ts`, @@ -25,7 +25,7 @@ await Bun.build({ outdir: `${process.cwd()}/dist`, target: "bun", splitting: true, - minify: true, + minify: false, external: ["bullmq"], }).then((output) => { if (!output.success) { @@ -33,6 +33,10 @@ await Bun.build({ } }); +// Fix for wrong Bun file resolution, replaces node_modules with ./node_modules inside all dynamic imports +// I apologize for this +await $`sed -i 's|import("node_modules/|import("./node_modules/|g' dist/*.js`; + // Create pages directory // mkdir ./dist/pages await mkdir(`${process.cwd()}/dist/pages`); diff --git a/bun.lockb b/bun.lockb index 92ed051270324090fb6c78b76e07a4cbc60a6b6d..3f886810064a0b2fc9fdb16b4e62dd4733f187a5 100755 GIT binary patch delta 56340 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 tG2IKP)oP|dt19rlH#-xfQ8kCNpN_j>ew6?K delta 76870 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�_l*zh9$ZSj6$T*7y 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 diff --git a/entrypoint.sh b/entrypoint.sh index 5db0a98c..ae7d86a0 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -9,23 +9,25 @@ # Exit immediately if a command exits with a non-zero status. set -e +cd ./dist + # Parse first argument case "$1" in "start") # Start the server - exec bun run ./dist/index.js --prod + exec bun run ./index.js --prod ;; "cli") # Start the CLI shift 1 - exec bun run ./dist/cli.js "$@" + exec bun run ./cli.js "$@" ;; "prisma") # Proxy all Prisma commands # Use output of dist/prisma.js to get the env variable shift 1 # Set DATABASE_URL env variable to the output of bun run ./dist/prisma.js - export DATABASE_URL=$(bun run ./dist/prisma.js) + export DATABASE_URL=$(bun run ./prisma.js) # Execute the Prisma binary exec bunx prisma "$@" ;; diff --git a/index.ts b/index.ts index 462bfcd7..75fa44e3 100644 --- a/index.ts +++ b/index.ts @@ -1,4 +1,5 @@ -import { exists, mkdir } from "node:fs/promises"; +import { exists, mkdir, writeFile } from "node:fs/promises"; +import { dirname } from "node:path"; import { connectMeili } from "@meilisearch"; import { moduleIsEntry } from "@module"; import type { PrismaClientInitializationError } from "@prisma/client/runtime/library"; @@ -10,7 +11,18 @@ import { createServer } from "~server"; const timeAtStart = performance.now(); -const requests_log = Bun.file(`${process.cwd()}/logs/requests.log`); +// Create requests file if it doesnt exist +if ( + !(await exists( + `${process.cwd()}/${dirname(config.logging.storage.requests)}`, + )) +) { + await mkdir(`${process.cwd()}/${dirname(config.logging.storage.requests)}`); + await writeFile(`${process.cwd()}/${config.logging.storage.requests}`, ""); +} +const requests_log = Bun.file( + `${process.cwd()}/${config.logging.storage.requests}`, +); const isEntry = moduleIsEntry(import.meta.url); // If imported as a module, redirect logs to /dev/null to not pollute console (e.g. in tests) const logger = new LogManager(isEntry ? requests_log : Bun.file("/dev/null")); @@ -19,16 +31,6 @@ const consoleLogger = new LogManager( ); const dualLogger = new MultiLogManager([logger, consoleLogger]); -if (!(await exists(config.logging.storage.requests))) { - await consoleLogger.log( - LogLevel.WARNING, - "Lysand", - `Creating logs directory at ${process.cwd()}/logs/`, - ); - - await mkdir(`${process.cwd()}/logs/`); -} - await dualLogger.log(LogLevel.INFO, "Lysand", "Starting Lysand..."); // NODE_ENV seems to be broken and output `development` even when set to production, so use the flag instead diff --git a/package.json b/package.json index 9b0b7b93..3f7ff857 100644 --- a/package.json +++ b/package.json @@ -1,118 +1,118 @@ { - "name": "lysand", - "module": "index.ts", - "type": "module", - "version": "0.3.0", - "description": "A project to build a federated social network", - "author": { - "email": "contact@cpluspatch.com", - "name": "CPlusPatch", - "url": "https://cpluspatch.com" - }, - "bugs": { - "url": "https://github.com/lysand-org/lysand/issues" - }, - "icon": "https://github.com/lysand-org/lysand", - "license": "AGPL-3.0", - "keywords": ["federated", "activitypub", "bun"], - "workspaces": ["packages/*"], - "maintainers": [ - { - "email": "contact@cpluspatch.com", - "name": "CPlusPatch", - "url": "https://cpluspatch.com" + "name": "lysand", + "module": "index.ts", + "type": "module", + "version": "0.3.0", + "description": "A project to build a federated social network", + "author": { + "email": "contact@cpluspatch.com", + "name": "CPlusPatch", + "url": "https://cpluspatch.com" + }, + "bugs": { + "url": "https://github.com/lysand-org/lysand/issues" + }, + "icon": "https://github.com/lysand-org/lysand", + "license": "AGPL-3.0", + "keywords": ["federated", "activitypub", "bun"], + "workspaces": ["packages/*"], + "maintainers": [ + { + "email": "contact@cpluspatch.com", + "name": "CPlusPatch", + "url": "https://cpluspatch.com" + } + ], + "repository": { + "type": "git", + "url": "git+https://github.com/lysand-org/lysand.git" + }, + "private": true, + "scripts": { + "dev": "bun run --watch index.ts", + "vite:dev": "bunx --bun vite pages", + "vite:build": "bunx --bun vite build pages", + "start": "NODE_ENV=production bun run dist/index.js --prod", + "migrate-dev": "bun prisma migrate dev", + "migrate": "bun prisma migrate deploy", + "lint": "bunx --bun eslint --config .eslintrc.cjs --ext .ts .", + "prod-build": "bunx --bun vite build pages && bun run build.ts", + "prisma": "DATABASE_URL=$(bun run prisma.ts) bunx prisma", + "generate": "bun prisma generate", + "benchmark:timeline": "bun run benchmarks/timelines.ts", + "cloc": "cloc . --exclude-dir node_modules,dist", + "cli": "bun run cli.ts" + }, + "trustedDependencies": [ + "@biomejs/biome", + "@prisma/client", + "@prisma/engines", + "esbuild", + "prisma", + "sharp", + "msgpackr-extract" + ], + "devDependencies": { + "@biomejs/biome": "1.6.4", + "@julr/unocss-preset-forms": "^0.1.0", + "@types/cli-table": "^0.3.4", + "@types/html-to-text": "^9.0.4", + "@types/ioredis": "^5.0.0", + "@types/jsonld": "^1.5.13", + "@typescript-eslint/eslint-plugin": "latest", + "@unocss/cli": "latest", + "@vitejs/plugin-vue": "latest", + "@vueuse/head": "^2.0.0", + "activitypub-types": "^1.0.3", + "bun-types": "latest", + "typescript": "latest", + "unocss": "latest", + "untyped": "^1.4.2", + "vite": "^5.2.8", + "vite-ssr": "^0.17.1", + "vue": "^3.3.9", + "vue-router": "^4.2.5", + "vue-tsc": "latest" + }, + "peerDependencies": { + "typescript": "^5.3.2" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.461.0", + "@iarna/toml": "^2.2.5", + "@json2csv/plainjs": "^7.0.6", + "@prisma/client": "^5.6.0", + "blurhash": "^2.0.5", + "bullmq": "latest", + "chalk": "^5.3.0", + "cli-parser": "workspace:*", + "cli-table": "^0.3.11", + "config-manager": "workspace:*", + "eventemitter3": "^5.0.1", + "extract-zip": "^2.0.1", + "html-to-text": "^9.0.5", + "ioredis": "^5.3.2", + "ip-matching": "^2.1.2", + "iso-639-1": "^3.1.0", + "isomorphic-dompurify": "latest", + "jsonld": "^8.3.1", + "linkify-html": "^4.1.3", + "linkify-string": "^4.1.3", + "linkifyjs": "^4.1.3", + "log-manager": "workspace:*", + "marked": "latest", + "media-manager": "workspace:*", + "megalodon": "^10.0.0", + "meilisearch": "latest", + "merge-deep-ts": "^1.2.6", + "next-route-matcher": "^1.0.1", + "oauth4webapi": "^2.4.0", + "prisma": "^5.6.0", + "prisma-json-types-generator": "^3.0.4", + "prisma-redis-middleware": "^4.8.0", + "request-parser": "workspace:*", + "semver": "^7.5.4", + "sharp": "^0.33.0-rc.2", + "strip-ansi": "^7.1.0" } - ], - "repository": { - "type": "git", - "url": "git+https://github.com/lysand-org/lysand.git" - }, - "private": true, - "scripts": { - "dev": "bun run --watch index.ts", - "vite:dev": "bunx --bun vite pages", - "vite:build": "bunx --bun vite build pages", - "start": "NODE_ENV=production bun run dist/index.js --prod", - "migrate-dev": "bun prisma migrate dev", - "migrate": "bun prisma migrate deploy", - "lint": "bunx --bun eslint --config .eslintrc.cjs --ext .ts .", - "prod-build": "bunx --bun vite build pages && bun run build.ts", - "prisma": "DATABASE_URL=$(bun run prisma.ts) bunx prisma", - "generate": "bun prisma generate", - "benchmark:timeline": "bun run benchmarks/timelines.ts", - "cloc": "cloc . --exclude-dir node_modules,dist", - "cli": "bun run cli.ts" - }, - "trustedDependencies": [ - "@biomejs/biome", - "@prisma/client", - "@prisma/engines", - "esbuild", - "prisma", - "sharp" - ], - "devDependencies": { - "@biomejs/biome": "1.6.4", - "@julr/unocss-preset-forms": "^0.1.0", - "@types/cli-table": "^0.3.4", - "@types/html-to-text": "^9.0.4", - "@types/ioredis": "^5.0.0", - "@types/jsonld": "^1.5.13", - "@typescript-eslint/eslint-plugin": "latest", - "@unocss/cli": "latest", - "@vitejs/plugin-vue": "latest", - "@vueuse/head": "^2.0.0", - "activitypub-types": "^1.0.3", - "bun-types": "latest", - "typescript": "latest", - "unocss": "latest", - "untyped": "^1.4.2", - "vite": "^5.2.8", - "vite-ssr": "^0.17.1", - "vue": "^3.3.9", - "vue-router": "^4.2.5", - "vue-tsc": "latest" - }, - "peerDependencies": { - "typescript": "^5.3.2" - }, - "dependencies": { - "@aws-sdk/client-s3": "^3.461.0", - "@iarna/toml": "^2.2.5", - "@json2csv/plainjs": "^7.0.6", - "@prisma/client": "^5.6.0", - "blurhash": "^2.0.5", - "bullmq": "latest", - "c12": "^1.10.0", - "chalk": "^5.3.0", - "cli-parser": "workspace:*", - "cli-table": "^0.3.11", - "config-manager": "workspace:*", - "eventemitter3": "^5.0.1", - "extract-zip": "^2.0.1", - "html-to-text": "^9.0.5", - "ioredis": "^5.3.2", - "ip-matching": "^2.1.2", - "iso-639-1": "^3.1.0", - "isomorphic-dompurify": "latest", - "jsonld": "^8.3.1", - "linkify-html": "^4.1.3", - "linkify-string": "^4.1.3", - "linkifyjs": "^4.1.3", - "log-manager": "workspace:*", - "marked": "latest", - "media-manager": "workspace:*", - "megalodon": "^10.0.0", - "meilisearch": "latest", - "merge-deep-ts": "^1.2.6", - "next-route-matcher": "^1.0.1", - "oauth4webapi": "^2.4.0", - "prisma": "^5.6.0", - "prisma-json-types-generator": "^3.0.4", - "prisma-redis-middleware": "^4.8.0", - "request-parser": "workspace:*", - "semver": "^7.5.4", - "sharp": "^0.33.0-rc.2", - "strip-ansi": "^7.1.0" - } } diff --git a/packages/config-manager/package.json b/packages/config-manager/package.json index b1e8fdfd..97c2dac6 100644 --- a/packages/config-manager/package.json +++ b/packages/config-manager/package.json @@ -2,5 +2,9 @@ "name": "config-manager", "version": "0.0.0", "main": "index.ts", - "dependencies": { "@iarna/toml": "^2.2.5", "merge-deep-ts": "^1.2.6" } + "dependencies": { + "@iarna/toml": "^2.2.5", + "c12": "^1.10.0", + "merge-deep-ts": "^1.2.6" + } } diff --git a/packages/log-manager/index.ts b/packages/log-manager/index.ts index 89790d7f..bbed3dea 100644 --- a/packages/log-manager/index.ts +++ b/packages/log-manager/index.ts @@ -1,4 +1,5 @@ -import { appendFile } from "node:fs/promises"; +import { appendFile, writeFile, mkdir, exists } from "node:fs/promises"; +import { dirname } from "node:path"; import type { BunFile } from "bun"; export enum LogLevel { @@ -44,11 +45,17 @@ export class LogManager { if (this.output === Bun.stdout) { await Bun.write(Bun.stdout, `${text}\n`); } else { - if (!(await this.output.exists())) { + if (!(await exists(this.output.name ?? ""))) { // Create file if it doesn't exist - await Bun.write(this.output, "", { - createPath: true, - }); + try { + await mkdir(dirname(this.output.name ?? ""), { + recursive: true, + }); + await writeFile(this.output.name ?? "", ""); + this.output = Bun.file(this.output.name ?? ""); + } catch { + // + } } await appendFile(this.output.name ?? "", `${text}\n`); } diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 177c3633..603a5a76 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1,7 +1,7 @@ generator client { provider = "prisma-client-js" previewFeatures = ["postgresqlExtensions"] - binaryTargets = ["native", "debian-openssl-3.0.x"] + binaryTargets = ["native"] } generator json {