From 3c6478826a2186098d4ea4259100ab31da912cb8 Mon Sep 17 00:00:00 2001 From: Corentin Date: Fri, 8 May 2026 11:15:06 +0200 Subject: [PATCH] fix(server): make package.json require resilient to dist mode Three upstream Docmost services (export, version, telemetry) require '../../../package.json' relative to source. In nest start dist mode the relative path resolves one level too short and crashes at boot. Wrap each require in a try/catch fallback that walks up one extra level, defaulting to { version: 'dev' } if neither resolves. Boot now succeeds both in dev (tsx) and in dist (node dist/main). Also adds docker-compose.dev.yml for an isolated dev stack on ports 5433/6380, kept in repo for future dev sessions. Patch 018. --- .../src/integrations/export/export.service.ts | 6 +++- .../integrations/security/version.service.ts | 6 +++- .../telemetry/telemetry.service.ts | 6 +++- docker-compose.dev.yml | 31 +++++++++++++++++++ 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 docker-compose.dev.yml diff --git a/apps/server/src/integrations/export/export.service.ts b/apps/server/src/integrations/export/export.service.ts index b4bc73fa..bd9e3598 100644 --- a/apps/server/src/integrations/export/export.service.ts +++ b/apps/server/src/integrations/export/export.service.ts @@ -30,7 +30,11 @@ import { Node } from '@tiptap/pm/model'; import { EditorState } from '@tiptap/pm/state'; import slugify from '@sindresorhus/slugify'; // eslint-disable-next-line @typescript-eslint/no-require-imports -const packageJson = require('../../../package.json'); +const packageJson: { version: string } = (() => { + try { return require('../../../package.json'); } catch { /* dist mode */ } + try { return require('../../../../package.json'); } catch { /* deeper */ } + return { version: 'dev' }; +})(); import { EnvironmentService } from '../environment/environment.service'; import { DomainService } from '../environment/domain.service'; import { diff --git a/apps/server/src/integrations/security/version.service.ts b/apps/server/src/integrations/security/version.service.ts index 2ceee86e..1431ffe6 100644 --- a/apps/server/src/integrations/security/version.service.ts +++ b/apps/server/src/integrations/security/version.service.ts @@ -1,6 +1,10 @@ import { Injectable } from '@nestjs/common'; // eslint-disable-next-line @typescript-eslint/no-require-imports -const packageJson = require('./../../../package.json'); +const packageJson: { version: string } = (() => { + try { return require('./../../../package.json'); } catch { /* dist */ } + try { return require('./../../../../package.json'); } catch { /* deeper */ } + return { version: 'dev' }; +})(); @Injectable() export class VersionService { diff --git a/apps/server/src/integrations/telemetry/telemetry.service.ts b/apps/server/src/integrations/telemetry/telemetry.service.ts index 99473e9d..ffc470b7 100644 --- a/apps/server/src/integrations/telemetry/telemetry.service.ts +++ b/apps/server/src/integrations/telemetry/telemetry.service.ts @@ -6,7 +6,11 @@ import { KyselyDB } from '@docmost/db/types/kysely.types'; import { createHmac } from 'node:crypto'; import { WorkspaceRepo } from '@docmost/db/repos/workspace/workspace.repo'; // eslint-disable-next-line @typescript-eslint/no-require-imports -const packageJson = require('./../../../package.json'); +const packageJson: { version: string } = (() => { + try { return require('./../../../package.json'); } catch { /* dist */ } + try { return require('./../../../../package.json'); } catch { /* deeper */ } + return { version: 'dev' }; +})(); @Injectable() export class TelemetryService { diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 00000000..6d8c1123 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,31 @@ +services: + db-dev: + image: postgres:16-alpine + container_name: docadenice-dev-db + environment: + POSTGRES_DB: docadenice_dev + POSTGRES_USER: docadenice + POSTGRES_PASSWORD: dev_password_local_only + ports: + - "127.0.0.1:5433:5432" + volumes: + - dev_db_data:/var/lib/postgresql/data + restart: unless-stopped + healthcheck: + test: ["CMD-SHELL", "pg_isready -U docadenice -d docadenice_dev"] + interval: 5s + timeout: 3s + retries: 10 + + redis-dev: + image: redis:7-alpine + container_name: docadenice-dev-redis + ports: + - "127.0.0.1:6380:6379" + volumes: + - dev_redis_data:/data + restart: unless-stopped + +volumes: + dev_db_data: + dev_redis_data: