From 4c3f025b8fa607fe67a3fa89ffd885e2bb5b8f2f Mon Sep 17 00:00:00 2001 From: ekko <152005280+EKKOLearnAI@users.noreply.github.com> Date: Sat, 30 May 2026 20:29:04 +0800 Subject: [PATCH] skip production data dir creation (#1164) --- packages/server/src/config.ts | 8 ++++---- packages/server/src/index.ts | 6 ++++-- tests/server/config.test.ts | 7 ++++--- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/server/src/config.ts b/packages/server/src/config.ts index 654e6dac..b5d8d1a6 100644 --- a/packages/server/src/config.ts +++ b/packages/server/src/config.ts @@ -14,7 +14,7 @@ import { homedir } from 'os' * - HERMES_WEBUI_STATE_DIR: Compatibility alias for HERMES_WEB_UI_HOME. * Default: join(homedir(), '.hermes-web-ui'). * - UPLOAD_DIR: Upload directory override. Default: join(HERMES_WEB_UI_HOME, 'upload'). - * - dataDir: Internal Web UI runtime data directory. Default: join(HERMES_WEB_UI_HOME, 'data'). + * - dataDir: Development-only internal Web UI runtime data directory. * * Auth: * - AUTH_TOKEN: Explicit bearer token. If unset, Web UI stores an auto-generated token under HERMES_WEB_UI_HOME. @@ -42,8 +42,8 @@ export function getWebUiHome(env: Record = process.e return appHome ? resolve(appHome) : join(homedir(), '.hermes-web-ui') } -export function getWebUiDataDir(env: Record = process.env): string { - return join(getWebUiHome(env), 'data') +export function shouldCreateWebUiDataDir(env: Record = process.env): boolean { + return env.NODE_ENV !== 'production' } const appHome = getWebUiHome() @@ -54,6 +54,6 @@ export const config = { host: getListenHost(), appHome, uploadDir: process.env.UPLOAD_DIR || join(appHome, 'upload'), - dataDir: getWebUiDataDir(), + dataDir: resolve(__dirname, '..', 'data'), corsOrigins: process.env.CORS_ORIGINS || '*', } diff --git a/packages/server/src/index.ts b/packages/server/src/index.ts index 7b5a82f2..86f55876 100644 --- a/packages/server/src/index.ts +++ b/packages/server/src/index.ts @@ -7,7 +7,7 @@ import os from 'os' import { resolve } from 'path' import { mkdir } from 'fs/promises' import { readFileSync } from 'fs' -import { config } from './config' +import { config, shouldCreateWebUiDataDir } from './config' import { initLoginLimiter } from './services/login-limiter' import { bindShutdown } from './services/shutdown' import { setupTerminalWebSocket } from './routes/hermes/terminal' @@ -84,7 +84,9 @@ function safeNetworkInterfaces() { export async function bootstrap() { console.log(`hermes-web-ui v${APP_VERSION} starting...`) await mkdir(config.uploadDir, { recursive: true }) - await mkdir(config.dataDir, { recursive: true }) + if (shouldCreateWebUiDataDir()) { + await mkdir(config.dataDir, { recursive: true }) + } await initLoginLimiter() try { diff --git a/tests/server/config.test.ts b/tests/server/config.test.ts index 9c3cc0fb..49f37710 100644 --- a/tests/server/config.test.ts +++ b/tests/server/config.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest' import { homedir } from 'os' import { join, resolve } from 'path' -import { getListenHost, getWebUiDataDir, getWebUiHome } from '../../packages/server/src/config' +import { getListenHost, getWebUiHome, shouldCreateWebUiDataDir } from '../../packages/server/src/config' describe('server config', () => { it('defaults to an IPv4 bind host', () => { @@ -28,7 +28,8 @@ describe('server config', () => { expect(getWebUiHome({ HERMES_WEBUI_STATE_DIR: ' ./tmp/hermes-state ' })).toBe(resolve('./tmp/hermes-state')) }) - it('keeps runtime data under the web-ui home', () => { - expect(getWebUiDataDir({ HERMES_WEB_UI_HOME: ' ./tmp/hermes-ui ' })).toBe(resolve('./tmp/hermes-ui/data')) + it('only creates the development data directory outside production', () => { + expect(shouldCreateWebUiDataDir({ NODE_ENV: 'development' })).toBe(true) + expect(shouldCreateWebUiDataDir({ NODE_ENV: 'production' })).toBe(false) }) })