diff --git a/Dockerfile b/Dockerfile
index e656468603..73e7e290d1 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,10 +1,11 @@
-FROM python:3.11
+FROM node:22.12.0-bookworm-slim AS node_runtime
-# 安装 Node.js (满足 >=18)及必要工具
-RUN apt-get update \
- && apt-get install -y --no-install-recommends nodejs npm \
- && rm -rf /var/lib/apt/lists/*
+FROM python:3.11-bookworm
+RUN apt-get update && apt-get upgrade -y && rm -rf /var/lib/apt/lists/*
+# 复制完整 Node.js 运行时目录,保留 npm/npx/corepack 的内部链接关系
+COPY --from=node_runtime /usr/local/ /usr/local/
+RUN pip install --upgrade pip
# 从 uv 官方镜像复制 uv
COPY --from=ghcr.io/astral-sh/uv:0.9.26 /uv /uvx /bin/
@@ -26,4 +27,4 @@ COPY . .
EXPOSE 3000 5001
# 同时启动前后端(开发模式)
-CMD ["npm", "run", "dev"]
\ No newline at end of file
+CMD ["npm", "run"]
diff --git a/README-ZH.md b/README-ZH.md
index 0b20424d3a..376fc6dee6 100644
--- a/README-ZH.md
+++ b/README-ZH.md
@@ -99,7 +99,7 @@ MiroFish 致力于打造映射现实的群体智能镜像,通过捕捉个体
| 工具 | 版本要求 | 说明 | 安装检查 |
|------|---------|------|---------|
-| **Node.js** | 18+ | 前端运行环境,包含 npm | `node -v` |
+| **Node.js** | 20.19+ 或 22.12+ | 前端运行环境,包含 npm | `node -v` |
| **Python** | ≥3.11, ≤3.12 | 后端运行环境 | `python --version` |
| **uv** | 最新版 | Python 包管理器 | `uv --version` |
diff --git a/README.md b/README.md
index 4b8369f4cf..3eb8ab9230 100644
--- a/README.md
+++ b/README.md
@@ -99,7 +99,7 @@ Click the image to watch MiroFish's deep prediction of the lost ending based on
| Tool | Version | Description | Check Installation |
|------|---------|-------------|-------------------|
-| **Node.js** | 18+ | Frontend runtime, includes npm | `node -v` |
+| **Node.js** | 20.19+ or 22.12+ | Frontend runtime, includes npm | `node -v` |
| **Python** | ≥3.11, ≤3.12 | Backend runtime | `python --version` |
| **uv** | Latest | Python package manager | `uv --version` |
@@ -200,4 +200,4 @@ MiroFish's simulation engine is powered by **[OASIS (Open Agent Social Interacti
-
\ No newline at end of file
+
diff --git a/docker-compose.yml b/docker-compose.yml
index 637f1dfaee..7b0b301d7b 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,6 +1,6 @@
services:
mirofish:
- image: ghcr.io/666ghj/mirofish:latest
+ image: rezadevil/mirofish
# 加速镜像(如拉取缓慢可替换上方地址)
# image: ghcr.nju.edu.cn/666ghj/mirofish:latest
container_name: mirofish
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 3e56d752df..ee73b5654f 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -17,6 +17,9 @@
"devDependencies": {
"@vitejs/plugin-vue": "^6.0.1",
"vite": "^7.2.4"
+ },
+ "engines": {
+ "node": ">=20.19.0"
}
},
"node_modules/@babel/helper-string-parser": {
diff --git a/frontend/package.json b/frontend/package.json
index 1501b628f9..1a50a625a5 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -18,5 +18,8 @@
"devDependencies": {
"@vitejs/plugin-vue": "^6.0.1",
"vite": "^7.2.4"
+ },
+ "engines": {
+ "node": ">=20.19.0"
}
}
diff --git a/frontend/vite.config.js b/frontend/vite.config.js
index 8f1e4c11b5..d860f3069b 100644
--- a/frontend/vite.config.js
+++ b/frontend/vite.config.js
@@ -13,7 +13,8 @@ export default defineConfig({
},
server: {
port: 3000,
- open: true,
+ // Containers usually don't have xdg-open; keep browser auto-open opt-in.
+ open: process.env.VITE_OPEN_BROWSER === 'true',
proxy: {
'/api': {
target: 'http://localhost:5001',
diff --git a/package-lock.json b/package-lock.json
index 64b5f2fbab..62156830f8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,7 +12,7 @@
"concurrently": "^9.1.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.19.0"
}
},
"node_modules/ansi-regex": {
diff --git a/package.json b/package.json
index 63ace21a99..8df6bd77d1 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
"concurrently": "^9.1.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.19.0"
},
"license": "AGPL-3.0"
}