mirror of
https://github.com/EKKOLearnAI/hermes-web-ui.git
synced 2026-07-13 20:20:46 +00:00
c4082ee661
* fix(docker): guard update button in Docker with structured guidance Docker 环境下 UI 升级按钮不可用的问题修复: 后端: - handleUpdate 中添加 Docker 环境检测,返回结构化的 Docker 升级指引 (docker compose pull && docker compose up -d --force-recreate) - health 接口添加 is_docker 字段,告知前端当前运行环境 - Docker 环境下自动禁用 npm registry 版本检查,消除每 30 分钟的外网请求 (性能优化:减少不必要的网络 I/O 和重复的版本检查) 前端: - AppSidebar 中在 Docker 模式下隐藏原有升级按钮,改为显示 Docker 专属 升级按钮,点击后弹出包含 docker compose 命令的指引弹窗 - VersionManagementModal 的 isDesktopShell 条件保持不变 - 添加 9 种语言的 i18n 翻译键 (dockerUpdateTitle / dockerUpdateGuide / dockerUpdateNote) Co-Authored-By: AtomCode (deepseek-v4-flash) <noreply@atomgit.com> * fix docker update guidance tests * reuse update button for Docker guidance * test Docker update routing --------- Co-authored-by: suantea <suantea@users.noreply.github.com> Co-authored-by: AtomCode (deepseek-v4-flash) <noreply@atomgit.com>
43 lines
1.5 KiB
TypeScript
43 lines
1.5 KiB
TypeScript
import { afterEach, describe, expect, it, vi } from 'vitest'
|
|
|
|
const originalContainer = process.env.container
|
|
|
|
async function loadRuntimeEnvironment(
|
|
options: { dockerEnvFile?: boolean; container?: string } = {},
|
|
) {
|
|
vi.resetModules()
|
|
if (options.container === undefined) delete process.env.container
|
|
else process.env.container = options.container
|
|
const existsSync = vi.fn((path: string) => path === '/.dockerenv' && options.dockerEnvFile === true)
|
|
vi.doMock('fs', () => ({ existsSync }))
|
|
const runtimeEnvironment = await import('../../packages/server/src/services/runtime-environment')
|
|
return { ...runtimeEnvironment, existsSync }
|
|
}
|
|
|
|
describe('runtime environment detection', () => {
|
|
afterEach(() => {
|
|
vi.doUnmock('fs')
|
|
vi.resetModules()
|
|
if (originalContainer === undefined) delete process.env.container
|
|
else process.env.container = originalContainer
|
|
})
|
|
|
|
it('does not classify a regular Web UI process as Docker', async () => {
|
|
const { isDockerContainer } = await loadRuntimeEnvironment()
|
|
|
|
expect(isDockerContainer()).toBe(false)
|
|
})
|
|
|
|
it('detects the Docker environment marker file', async () => {
|
|
const { isDockerContainer } = await loadRuntimeEnvironment({ dockerEnvFile: true })
|
|
|
|
expect(isDockerContainer()).toBe(true)
|
|
})
|
|
|
|
it('detects the Docker container environment variable', async () => {
|
|
const { isDockerContainer } = await loadRuntimeEnvironment({ container: 'docker' })
|
|
|
|
expect(isDockerContainer()).toBe(true)
|
|
})
|
|
})
|