skip production data dir creation (#1164)

This commit is contained in:
ekko
2026-05-30 20:29:04 +08:00
committed by GitHub
parent fc35c74eb3
commit 4c3f025b8f
3 changed files with 12 additions and 9 deletions
+4 -4
View File
@@ -14,7 +14,7 @@ import { homedir } from 'os'
* - HERMES_WEBUI_STATE_DIR: Compatibility alias for HERMES_WEB_UI_HOME. * - HERMES_WEBUI_STATE_DIR: Compatibility alias for HERMES_WEB_UI_HOME.
* Default: join(homedir(), '.hermes-web-ui'). * Default: join(homedir(), '.hermes-web-ui').
* - UPLOAD_DIR: Upload directory override. Default: join(HERMES_WEB_UI_HOME, 'upload'). * - 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:
* - AUTH_TOKEN: Explicit bearer token. If unset, Web UI stores an auto-generated token under HERMES_WEB_UI_HOME. * - 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<string, string | undefined> = process.e
return appHome ? resolve(appHome) : join(homedir(), '.hermes-web-ui') return appHome ? resolve(appHome) : join(homedir(), '.hermes-web-ui')
} }
export function getWebUiDataDir(env: Record<string, string | undefined> = process.env): string { export function shouldCreateWebUiDataDir(env: Record<string, string | undefined> = process.env): boolean {
return join(getWebUiHome(env), 'data') return env.NODE_ENV !== 'production'
} }
const appHome = getWebUiHome() const appHome = getWebUiHome()
@@ -54,6 +54,6 @@ export const config = {
host: getListenHost(), host: getListenHost(),
appHome, appHome,
uploadDir: process.env.UPLOAD_DIR || join(appHome, 'upload'), uploadDir: process.env.UPLOAD_DIR || join(appHome, 'upload'),
dataDir: getWebUiDataDir(), dataDir: resolve(__dirname, '..', 'data'),
corsOrigins: process.env.CORS_ORIGINS || '*', corsOrigins: process.env.CORS_ORIGINS || '*',
} }
+4 -2
View File
@@ -7,7 +7,7 @@ import os from 'os'
import { resolve } from 'path' import { resolve } from 'path'
import { mkdir } from 'fs/promises' import { mkdir } from 'fs/promises'
import { readFileSync } from 'fs' import { readFileSync } from 'fs'
import { config } from './config' import { config, shouldCreateWebUiDataDir } from './config'
import { initLoginLimiter } from './services/login-limiter' import { initLoginLimiter } from './services/login-limiter'
import { bindShutdown } from './services/shutdown' import { bindShutdown } from './services/shutdown'
import { setupTerminalWebSocket } from './routes/hermes/terminal' import { setupTerminalWebSocket } from './routes/hermes/terminal'
@@ -84,7 +84,9 @@ function safeNetworkInterfaces() {
export async function bootstrap() { export async function bootstrap() {
console.log(`hermes-web-ui v${APP_VERSION} starting...`) console.log(`hermes-web-ui v${APP_VERSION} starting...`)
await mkdir(config.uploadDir, { recursive: true }) await mkdir(config.uploadDir, { recursive: true })
await mkdir(config.dataDir, { recursive: true }) if (shouldCreateWebUiDataDir()) {
await mkdir(config.dataDir, { recursive: true })
}
await initLoginLimiter() await initLoginLimiter()
try { try {
+4 -3
View File
@@ -1,7 +1,7 @@
import { describe, expect, it } from 'vitest' import { describe, expect, it } from 'vitest'
import { homedir } from 'os' import { homedir } from 'os'
import { join, resolve } from 'path' 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', () => { describe('server config', () => {
it('defaults to an IPv4 bind host', () => { 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')) expect(getWebUiHome({ HERMES_WEBUI_STATE_DIR: ' ./tmp/hermes-state ' })).toBe(resolve('./tmp/hermes-state'))
}) })
it('keeps runtime data under the web-ui home', () => { it('only creates the development data directory outside production', () => {
expect(getWebUiDataDir({ HERMES_WEB_UI_HOME: ' ./tmp/hermes-ui ' })).toBe(resolve('./tmp/hermes-ui/data')) expect(shouldCreateWebUiDataDir({ NODE_ENV: 'development' })).toBe(true)
expect(shouldCreateWebUiDataDir({ NODE_ENV: 'production' })).toBe(false)
}) })
}) })