From 86ebe9ef62b8285cd7088978a0a8596797e86623 Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Tue, 19 May 2026 08:15:35 +0100 Subject: [PATCH] chore: update start script in package.json and adjust Svelte adapter configuration for improved deployment flexibility --- apps/api/src/app.ts | 8 +++++++- apps/api/src/index.ts | 8 +++++++- apps/api/src/routes/admin/queues.ts | 4 ++-- apps/dashboard/package.json | 2 +- apps/dashboard/svelte.config.js | 6 +++--- packages/jobs/src/connection.ts | 8 +++++++- 6 files changed, 27 insertions(+), 9 deletions(-) diff --git a/apps/api/src/app.ts b/apps/api/src/app.ts index 3bf84d0e..147dcc2e 100644 --- a/apps/api/src/app.ts +++ b/apps/api/src/app.ts @@ -54,7 +54,13 @@ export const app = new Hono() ) .use('*', rateLimiter) .use('*', async (c, next) => { - const session = await auth.api.getSession({ headers: c.req.raw.headers }); + let session: Awaited> | null = null; + + try { + session = await auth.api.getSession({ headers: c.req.raw.headers }); + } catch (error) { + console.error('auth.api.getSession error:', error); + } if (!session) { c.set('user', null); diff --git a/apps/api/src/index.ts b/apps/api/src/index.ts index b59259cb..8b197d20 100644 --- a/apps/api/src/index.ts +++ b/apps/api/src/index.ts @@ -2,6 +2,7 @@ import 'dotenv/config'; import { API_PORT } from '@api/constants'; import { app } from '@api/app'; +import { env } from '@api/config/env'; import { configureOpenAPI } from '@api/utils/openapi'; import { connectRedis } from '@api/utils/redis/redis'; import { serve } from '@hono/node-server'; @@ -16,12 +17,17 @@ async function startServer() { serve({ fetch: app.fetch, port: API_PORT }); - showRoutes(app, { colorize: true }); + if (env.NODE_ENV !== 'production') { + showRoutes(app, { colorize: true }); + } } configureOpenAPI(app); startServer().catch((error) => { console.error('Failed to start server:', error); + if (error instanceof Error && error.stack) { + console.error(error.stack); + } process.exit(1); }); diff --git a/apps/api/src/routes/admin/queues.ts b/apps/api/src/routes/admin/queues.ts index 45771f62..21a674d7 100644 --- a/apps/api/src/routes/admin/queues.ts +++ b/apps/api/src/routes/admin/queues.ts @@ -28,8 +28,8 @@ export function mountQueueDashboard(app: Hono): void { const isProduction = env.NODE_ENV === 'production'; if (isProduction && !canEnforceProdAuth()) { - console.warn( - 'Queue dashboard not mounted: NODE_ENV=production requires QUEUE_DASHBOARD_ADMIN_EMAILS or QUEUE_DASHBOARD_TOKEN.' + console.info( + 'BullMQ dashboard (/admin/queues) not mounted in production. Set QUEUE_DASHBOARD_ADMIN_EMAILS or QUEUE_DASHBOARD_TOKEN to enable it.' ); return; } diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index a9d76898..329a1c92 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -11,7 +11,7 @@ "lint:fix": "eslint ./src --fix", "clean": "rm -rf node_modules", "format": "prettier --write .", - "start": "node build", + "start": "node build/index.js", "prepare": "svelte-kit sync", "test": "jest", "test:watch": "pnpm run test --watch", diff --git a/apps/dashboard/svelte.config.js b/apps/dashboard/svelte.config.js index f7b70687..96d742b6 100644 --- a/apps/dashboard/svelte.config.js +++ b/apps/dashboard/svelte.config.js @@ -1,22 +1,22 @@ import 'dotenv/config'; -import adapterAuto from '@sveltejs/adapter-auto'; import adapterNode from '@sveltejs/adapter-node'; import { getCspDomains } from './src/lib/utils/csp-domains.js'; import path from 'path'; import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; -const isSelfHosted = process.env.PUBLIC_IS_SELFHOSTED === 'true'; const IS_CLOUDFLARE = process.env.CI_ENVIRONMENT === 'cloudflare'; const adapterCloudflare = IS_CLOUDFLARE ? (await import('@sveltejs/adapter-cloudflare')).default : null; +const isSelfHosted = process.env.PUBLIC_IS_SELFHOSTED === 'true'; const csp = getCspDomains(isSelfHosted, process.env.PUBLIC_SERVER_URL); /** @type {import('@sveltejs/kit').Config} */ const config = { preprocess: [vitePreprocess({})], kit: { - adapter: IS_CLOUDFLARE ? adapterCloudflare() : isSelfHosted ? adapterNode() : adapterAuto(), + // Default: Node server (Render, Docker). Opt into Cloudflare Pages only when CI_ENVIRONMENT=cloudflare. + adapter: IS_CLOUDFLARE ? adapterCloudflare() : adapterNode(), alias: { $lib: path.resolve('./src/lib'), $features: path.resolve('./src/lib/features'), diff --git a/packages/jobs/src/connection.ts b/packages/jobs/src/connection.ts index cd1b73c1..7f230fac 100644 --- a/packages/jobs/src/connection.ts +++ b/packages/jobs/src/connection.ts @@ -49,7 +49,13 @@ function resolveUrl(override?: string): string { export function createRedisConnection(options: RedisConnectionOptions = {}): Redis { const { url, ...rest } = options; const resolved = resolveUrl(url); - return new IORedis(resolved, { ...DEFAULT_OPTIONS, ...rest }); + const connection = new IORedis(resolved, { ...DEFAULT_OPTIONS, ...rest }); + + connection.on('error', (error) => { + console.error('BullMQ Redis connection error:', error); + }); + + return connection; } let sharedConnection: Redis | undefined;