diff --git a/docker/Dockerfile b/docker/Dockerfile index c3f0508..967b43e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -27,6 +27,10 @@ COPY --from=builder /app/out/full/ . RUN pnpm turbo run build --filter=@morten-olsen/mini-loader-server FROM base AS runner +ENV \ + NODE_ENV=production \ + DATA_DIR=/data \ + CACHE_DIR=/cache RUN apk add --no-cache jq curl WORKDIR /app @@ -39,7 +43,7 @@ RUN chmod +x /entrypoint.sh COPY --from=installer /app . EXPOSE 4500 -VOLUME /app/data +VOLUME /data HEALTHCHECK \ --interval=10s \ diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 9a6ac06..e3b73de 100644 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -7,6 +7,8 @@ GID=${GID:-1001} addgroup --system --gid ${GID} nodejs && \ adduser --system --uid ${UID} -G nodejs miniloader && \ -mkdir -p /app/data -chown -R miniloader:nodejs /app/data +mkdir -p ${DATA_DIR} +mkdir -p ${CACHE_DIR} +chown -R miniloader:nodejs ${DATA_DIR} +chown -R miniloader:nodejs ${CACHE_DIR} su miniloader -s /bin/sh -c "$CMD" \ No newline at end of file diff --git a/package.json b/package.json index 348a42b..e806d28 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "packageManager": "pnpm@8.10.4", "version": "1.0.0", "scripts": { + "prepare": "pnpm run build", "build": "turbo build", "build:dev": "tsc --build --watch", "test:lint": "eslint ./packages/*/src", @@ -29,4 +30,4 @@ "type": "git", "url": "https://github.com/morten-olsen/mini-loader" } -} \ No newline at end of file +} diff --git a/packages/cli/bin/index.mjs b/packages/cli/bin/index.mjs index efb0ee3..4ec2560 100755 --- a/packages/cli/bin/index.mjs +++ b/packages/cli/bin/index.mjs @@ -1,4 +1,4 @@ #!/usr/bin/env node import 'source-map-support/register.js'; -import '../dist/esm/index.js'; +import '../dist/esm/src/index.js'; diff --git a/packages/cli/package.json b/packages/cli/package.json index aa9a7e9..633cd4e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,8 +1,8 @@ { "name": "@morten-olsen/mini-loader-cli", "version": "1.0.0", - "main": "./dist/esm/index.js", - "types": "./dist/esm/index.d.ts", + "main": "./dist/esm/src/index.js", + "types": "./dist/esm/src/index.d.ts", "license": "GPL-3.0", "bin": { "mini-loader": "./bin/index.mjs" @@ -16,11 +16,12 @@ ], "exports": { ".": { - "import": "./dist/esm/index.js" + "import": "./dist/esm/src/index.js" } }, "dependencies": { "@morten-olsen/mini-loader-runner": "workspace:^", + "@morten-olsen/mini-loader-server": "workspace:^", "@rollup/plugin-auto-install": "^3.0.5", "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-json": "^6.1.0", @@ -40,7 +41,6 @@ }, "devDependencies": { "@morten-olsen/mini-loader-configs": "workspace:^", - "@morten-olsen/mini-loader-server": "workspace:^", "@types/inquirer": "^9.0.7", "typescript": "^5.3.3" }, diff --git a/packages/server/bin/index.mjs b/packages/server/bin/index.mjs index efb0ee3..4ec2560 100755 --- a/packages/server/bin/index.mjs +++ b/packages/server/bin/index.mjs @@ -1,4 +1,4 @@ #!/usr/bin/env node import 'source-map-support/register.js'; -import '../dist/esm/index.js'; +import '../dist/esm/src/index.js'; diff --git a/packages/server/package.json b/packages/server/package.json index 2e5ef29..2b4c93d 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -2,8 +2,8 @@ "name": "@morten-olsen/mini-loader-server", "version": "1.0.0", "license": "GPL-3.0", - "main": "./dist/esm/index.js", - "types": "./dist/esm/index.d.ts", + "main": "./dist/esm/src/index.js", + "types": "./dist/esm/src/index.d.ts", "bin": { "mini-loader-server": "./bin/index.mjs" }, @@ -16,7 +16,7 @@ ], "exports": { ".": { - "import": "./dist/esm/index.js" + "import": "./dist/esm/src/index.js" } }, "devDependencies": { @@ -32,6 +32,7 @@ "@trpc/server": "^10.45.0", "commander": "^11.1.0", "cron": "^3.1.6", + "env-paths": "^3.0.0", "eventemitter3": "^5.0.1", "fastify": "^4.25.2", "jsonwebtoken": "^9.0.2", diff --git a/packages/server/src/auth/auth.ts b/packages/server/src/auth/auth.ts index 5eb91b4..f4b94ff 100644 --- a/packages/server/src/auth/auth.ts +++ b/packages/server/src/auth/auth.ts @@ -20,10 +20,10 @@ class Auth { #setup = async () => { const { config } = this.#options; - const secretLocation = resolve(config.files.location, 'secret'); + const secretLocation = resolve(config.files.data, 'secret'); let secret = ''; + await mkdir(config.files.data, { recursive: true }); if (!existsSync(secretLocation)) { - await mkdir(config.files.location, { recursive: true }); secret = nanoid(); await writeFile(secretLocation, secret); } else { diff --git a/packages/server/src/config/config.ts b/packages/server/src/config/config.ts index da2161f..d82551d 100644 --- a/packages/server/src/config/config.ts +++ b/packages/server/src/config/config.ts @@ -3,7 +3,8 @@ import { Knex } from 'knex'; type Config = { database: Omit; files: { - location: string; + data: string; + cache: string; }; auth?: { oidc?: { diff --git a/packages/server/src/repos/loads/loads.ts b/packages/server/src/repos/loads/loads.ts index e91f8e9..6562ed7 100644 --- a/packages/server/src/repos/loads/loads.ts +++ b/packages/server/src/repos/loads/loads.ts @@ -62,7 +62,7 @@ class LoadRepo extends EventEmitter { const db = await database.instance; const id = options.id || nanoid(); const script = createHash('sha256').update(options.script).digest('hex'); - const scriptDir = resolve(this.#options.config.files.location, 'scripts'); + const scriptDir = resolve(this.#options.config.files.data, 'scripts'); await mkdir(scriptDir, { recursive: true }); await writeFile(resolve(scriptDir, `${script}.js`), options.script); diff --git a/packages/server/src/runner/runner.instance.ts b/packages/server/src/runner/runner.instance.ts index aa4c86f..8746e8d 100644 --- a/packages/server/src/runner/runner.instance.ts +++ b/packages/server/src/runner/runner.instance.ts @@ -59,7 +59,7 @@ class RunnerInstance extends EventEmitter { const { runs, secrets } = repos; try { const { script: scriptHash, input } = await runs.getById(id); - const scriptLocation = resolve(config.files.location, 'scripts', `${scriptHash}.js`); + const scriptLocation = resolve(config.files.data, 'scripts', `${scriptHash}.js`); const script = await readFile(scriptLocation, 'utf-8'); const allSecrets = await secrets.getAll(); await runs.started(id); diff --git a/packages/server/src/runtime/runtime.ts b/packages/server/src/runtime/runtime.ts index 0656f0c..a33faa4 100644 --- a/packages/server/src/runtime/runtime.ts +++ b/packages/server/src/runtime/runtime.ts @@ -1,11 +1,14 @@ +import { resolve } from 'path'; +import envPaths from 'env-paths'; import { Database } from '../database/database.js'; import { Repos } from '../repos/repos.js'; import { Runner } from '../runner/runner.js'; import { Config } from '../config/config.js'; import { Auth } from '../auth/auth.js'; -import { resolve } from 'path'; import { Scheduler } from '../scheduler/scheduler.js'; +const paths = envPaths('mini-loader-server'); + class Runtime { #repos: Repos; #runner: Runner; @@ -41,12 +44,13 @@ class Runtime { database: { client: 'sqlite3', connection: { - filename: resolve(process.cwd(), 'data', 'database.sqlite'), + filename: resolve(paths.data, 'database.sqlite'), }, useNullAsDefault: true, }, files: { - location: resolve(process.cwd(), 'data', 'files'), + data: process.env.DATA_DIR || resolve(paths.data, 'data', 'files'), + cache: process.env.CACHE_DIR || resolve(paths.cache, 'data', 'cache'), }, }); diff --git a/packages/server/src/server/server.ts b/packages/server/src/server/server.ts index b6a7630..d3808f7 100644 --- a/packages/server/src/server/server.ts +++ b/packages/server/src/server/server.ts @@ -1,3 +1,4 @@ +import pkg from '../../package.json'; import { fastifyTRPCPlugin, FastifyTRPCPluginOptions } from '@trpc/server/adapters/fastify'; import fastify from 'fastify'; import { RootRouter, rootRouter } from '../router/router.js'; @@ -13,9 +14,6 @@ const createServer = async (runtime: Runtime) => { level: 'warn', }, }); - server.get('/', async () => { - return { hello: 'world' }; - }); server.get('/health', async (req) => { let authorized = false; @@ -27,7 +25,7 @@ const createServer = async (runtime: Runtime) => { authorized = true; } } catch (error) {} - return { authorized, status: 'ok' }; + return { authorized, status: 'ok', version: pkg.version }; }); server.register(fastifyTRPCPlugin, { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2e9642e..cff6045 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,6 +39,9 @@ importers: '@morten-olsen/mini-loader-runner': specifier: workspace:^ version: link:../runner + '@morten-olsen/mini-loader-server': + specifier: workspace:^ + version: link:../server '@rollup/plugin-auto-install': specifier: ^3.0.5 version: 3.0.5(rollup@4.9.4) @@ -91,9 +94,6 @@ importers: '@morten-olsen/mini-loader-configs': specifier: workspace:^ version: link:../configs - '@morten-olsen/mini-loader-server': - specifier: workspace:^ - version: link:../server '@types/inquirer': specifier: ^9.0.7 version: 9.0.7 @@ -176,6 +176,9 @@ importers: cron: specifier: ^3.1.6 version: 3.1.6 + env-paths: + specifier: ^3.0.0 + version: 3.0.0 eventemitter3: specifier: ^5.0.1 version: 5.0.1