Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ dist
*.log
data
logs
dbdata
.claude
README.md
docker-compose.yml
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@ node_modules/
dist/
data/
logs/
dbdata/
.claude
9 changes: 6 additions & 3 deletions Dockerfile
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# ===== 构建阶段 =====
FROM node:24-alpine AS builder

# 安装编译依赖(better-sqlite3 需要)
RUN apk add --no-cache python3 make g++

WORKDIR /app

# 先复制依赖文件,利用缓存
Expand All @@ -16,7 +19,7 @@ COPY src ./src
# 构建项目
RUN npm run build

# 清理 devDependencies
# ★ 关键:在 builder 中就清理掉 devDependencies,这样 COPY 过去的 node_modules 就是干净的
RUN npm prune --omit=dev && \
npm cache clean --force

Expand All @@ -36,14 +39,14 @@ WORKDIR /app
# 从构建阶段复制 package.json(用于 npm start 等元数据)
COPY --from=builder /app/package.json ./

# 从构建阶段复制已清理的 node_modules(仅生产依赖)
# 从构建阶段复制已清理的 node_modules(仅生产依赖 + 已编译的 native 模块
COPY --from=builder /app/node_modules ./node_modules

# 从构建阶段复制构建产物
COPY --from=builder /app/dist ./dist

# 创建数据目录
RUN mkdir -p /app/data /app/logs
RUN mkdir -p /app/data /app/dbdata

# 环境变量
ENV NODE_ENV=production
Expand Down
94 changes: 87 additions & 7 deletions README.md
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@

**API 兼容**
- OpenAI `v1/chat/completions`(流式 & 非流式)
- OpenAI `v1/responses`(流式 & 非流式,Codex 兼容)
- Anthropic `v1/messages`(流式 & 非流式)
- 多模态图片理解(自动上传至小米 OSS)

**客户端兼容**
- Cline / Kilo Code / Roo Code / Cursor 等 AI 编程工具
- Codex CLI / Cline / Kilo Code / Roo Code / Cursor 等 AI 编程工具
- 任何支持 OpenAI 或 Anthropic API 的客户端

**核心能力**
Expand All @@ -27,7 +28,7 @@
**管理**
- Web 管理面板(账号、API 密钥、请求日志、统计图表)
- REST 管理 API
- JSON 文件持久化存储
- SQLite 持久化存储

## 快速开始

Expand All @@ -48,6 +49,70 @@ npm run dev # 开发模式(热重载)

> 管理面板默认密码:`admin`,登录后可修改。首次使用需在管理面板创建 API 密钥供客户端调用。

### 首次运行数据

仓库不会包含运行时数据库。别人通过 `git clone` 获取项目后,首次启动会自动创建 `dbdata/mimo-proxy.db`,账号、API Key、配置和日志默认都是空的。

注意:

- `dbdata/` 是本地持久化目录,不要提交到 Git。
- 如果页面出现旧账号,通常是复用了本机旧的 `dbdata/` 或浏览器 `localStorage` 缓存。
- 想重置为空系统,停止服务后删除 `dbdata/`,再重新启动。

macOS / Linux:

```bash
rm -rf dbdata
```

Windows PowerShell:

```powershell
Remove-Item -Recurse -Force dbdata
```

### 平台差异与 native 依赖

本项目使用 SQLite 持久化存储,依赖 `better-sqlite3` 原生模块。该模块会为当前操作系统、CPU 架构和 Node.js 版本生成本地二进制文件,因此 **Windows、macOS、Linux 的 `node_modules` 不能混用**。

如果在不同系统之间复制项目目录、从 Windows 同步到 macOS、从 macOS 同步到 Windows、切换 Node.js 版本,或在 macOS 上切换 arm64 / Rosetta x64 运行环境,启动时可能出现类似错误:

```text
Error: dlopen(.../better_sqlite3.node): slice is not valid mach-o file
Error: ... is not a valid Win32 application
Error: Could not locate the bindings file
```

处理方式:

```bash
# 在当前系统和当前 Node.js 版本下重新编译 better-sqlite3
npm rebuild better-sqlite3
```

如果仍然报错,删除当前平台不匹配的依赖后重新安装:

macOS / Linux:

```bash
rm -rf node_modules
npm install
```

Windows PowerShell:

```powershell
Remove-Item -Recurse -Force node_modules
npm install
```

建议:

- 不要提交或跨平台复制 `node_modules`。
- 每个系统单独执行 `npm install`。
- 切换 Node.js 版本后执行 `npm rebuild better-sqlite3`。
- Docker 部署会在镜像内按 Linux 环境安装和编译依赖,不要把宿主机的 `node_modules` 挂载进容器。

### Docker 部署

#### 构建并启动
Expand All @@ -72,7 +137,9 @@ docker compose down

数据目录会挂载到宿主机:
- `./data` - 应用数据目录
- `./logs` - 日志目录
- `./dbdata` - SQLite 数据库目录(含 `mimo-proxy.db`)

如果需要重置 Docker 部署的数据,先停止容器,再删除宿主机的 `./dbdata` 目录后重新启动。

#### 端口配置

Expand Down Expand Up @@ -103,7 +170,7 @@ docker run -d \
--name mimo-proxy \
-p 8080:8080 \
-v $(pwd)/data:/app/data \
-v $(pwd)/logs:/app/logs \
-v $(pwd)/dbdata:/app/dbdata \
mimo-proxy
```

Expand Down Expand Up @@ -147,6 +214,19 @@ curl http://localhost:8080/v1/chat/completions \
}'
```

### OpenAI Responses API(Codex 兼容)

```bash
curl http://localhost:8080/v1/responses \
-H "Authorization: Bearer <api-key>" \
-H "Content-Type: application/json" \
-d '{
"model": "mimo-v2-pro",
"input": [{"role": "user", "content": "你好"}],
"stream": true
}'
```

### Anthropic 格式

```bash
Expand Down Expand Up @@ -189,7 +269,7 @@ curl http://localhost:8080/v1/chat/completions \

## 应用配置

配置通过 **Admin Web UI**(`http://localhost:8080/`)或 **Admin API** 管理,持久化存储在 JSON 文件中
配置通过 **Admin Web UI**(`http://localhost:8080/`)或 **Admin API** 管理,持久化存储在 SQLite 数据库中,`.env` 文件不会被读取

| 配置项 | 默认值 | 说明 |
|--------|--------|------|
Expand Down Expand Up @@ -241,8 +321,8 @@ src/
│ ├── style.css
│ ├── input.css
│ └── chart.js
├── config.ts # 配置加载(JSON → 内存)
├── db.ts # JSON 文件存储工具
├── config.ts # 配置加载(数据库 → 内存)
├── db.ts # SQLite 初始化
├── accounts.ts # 多账号管理 & 负载均衡
├── api-keys.ts # API 密钥管理
└── index.ts # 入口
Expand Down
14 changes: 14 additions & 0 deletions check_health.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
try {
$r = Invoke-WebRequest -Uri 'http://localhost:8080/health' -TimeoutSec 5
Write-Host "Health Status: $($r.StatusCode)"
Write-Host "Content: $($r.Content)"
} catch {
Write-Host "Health Error: $($_.Exception.Message)"
}

try {
$r2 = Invoke-WebRequest -Uri 'http://localhost:8080/' -TimeoutSec 5
Write-Host "Admin UI Status: $($r2.StatusCode)"
} catch {
Write-Host "Admin UI Error: $($_.Exception.Message)"
}
2 changes: 1 addition & 1 deletion docker-compose.yml
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ services:
- "8080:8080"
volumes:
- ./data:/app/data
- ./logs:/app/logs
- ./dbdata:/app/dbdata
restart: unless-stopped
environment:
- NODE_ENV=production
Loading