一款面向个人和小团队的全栈聊天应用,集成了实时私聊、AI 对话、知识库问答和定时推送能力。项目采用前后端分离架构,包含 Web 前端和 Android 原生客户端,适合本地开发、Docker 部署和二次开发。
- 用户注册、登录、重置密码(支持邮箱、手机号、Google OAuth)
- 好友搜索、发起申请、接受申请
- 基于 Socket.io 的实时 1v1 聊天
- 在线状态感知
- 图片消息支持
- 创建/管理群组
- 群成员管理(owner/admin/member 角色)
- 群消息实时推送
- @AI 助手触发群内 AI 回答
- 群组独立知识库
- 支持接入 OpenAI 兼容格式的大模型服务
- 多轮会话管理
- 流式输出
- Markdown / 代码块渲染
- 图片理解(多模态)
- Agent ReAct 循环(多轮工具调用)
- MCP 工具集成
- 管理员可在后台维护 AI Provider
- 支持上传本地文档或导入网页链接
- 文档解析、分块、向量化、RAG 问答
- 支持将聊天模型和 embedding 模型拆分配置
- 前端展示上传状态、失败原因和知识库问答来源
- 群组独立知识库管理
- 支持 Streamable HTTP 和 SSE 两种传输方式
- Bearer Token 和自定义 Header 认证
- 工具发现与缓存
- 工具测试与执行
- 与 AI 对话深度集成
- GitHub Trending、每日诗词、每日英语等预设任务
- 自定义定时推送任务
- BullMQ + Redis 驱动后台任务
- 多时区支持
- 推送历史去重
- 内存滑动窗口指标收集(5 分钟窗口,30 秒清理)
- HTTP 请求自动采集:状态码、响应延迟、错误率
- 告警状态机:normal → pending → firing → resolved(防抖动)
- 通知渠道:前端实时弹窗(Socket.IO)、邮件(SMTP)、控制台
- 前端监控面板:请求数、错误率、P95 延迟、内存、Socket 连接数
- 健康检查端点:/health(存活)、/api/ready(依赖检查:MongoDB、Redis、PostgreSQL)
| 层级 | 技术 |
|---|---|
| Web 前端 | React 19, TypeScript 5.9, Vite 7, MUI 7, Zustand 5, TanStack Query 5, Tailwind CSS 4, Socket.io Client, Framer Motion, React Hook Form, React Markdown |
| Android 客户端 | Flutter 3.x, Dart 3.5, Riverpod 2, Dio, Socket.IO Client, GoRouter, Flutter Markdown |
| 后端 | Node.js 18+, Express 5, TypeScript 5.9, Socket.io 4, Mongoose 9, BullMQ 5, Helmet, Express Rate Limit |
| 主数据 | MongoDB |
| 队列 / 缓存 | Redis |
| 知识库向量存储 | PostgreSQL + pgvector |
| AI 集成 | OpenAI SDK, LangChain, @modelcontextprotocol/sdk |
| 文档解析 | textract, Tesseract.js, Cheerio |
| 监控 | 自研指标收集器 + 告警状态机 + 邮件/WebSocket 通知 |
| 部署 | Docker, Docker Compose, Nginx, GitHub Actions |
mini-chat/
├── .agent/skills/ # AI Agent 技能库
├── .github/workflows/ # CI/CD 自动部署
├── .mcp.json # MCP 配置
├── AGENTS.md # OpenCode Agent 指令
├── CLAUDE.md # Claude Code 指令
├── backend/ # Express + TypeScript API
│ ├── src/
│ │ ├── controllers/ # 路由控制器
│ │ ├── middleware/ # JWT 认证中间件
│ │ ├── models/ # MongoDB 模型
│ │ ├── routes/ # Express 路由
│ │ ├── services/ # AI、知识库、任务、MCP 等业务逻辑
│ │ ├── socket/ # Socket.io 实时通讯
│ │ ├── workers/ # BullMQ 后台任务入口
│ │ ├── monitoring/ # 指标收集、告警管理、通知渠道
│ │ ├── scripts/ # 初始化脚本
│ │ └── utils/ # PostgreSQL / Redis / schema 工具
│ ├── scripts/ # 种子用户脚本
│ └── Dockerfile
├── frontend/ # React + Vite 前端
│ ├── src/components/
│ ├── src/layouts/
│ ├── src/pages/
│ ├── src/services/
│ ├── src/store/ # Zustand 状态管理
│ └── Dockerfile
├── mobile/ # Flutter Android 客户端 (BoltChat)
│ ├── lib/
│ │ ├── core/ # 常量、主题、路由
│ │ ├── data/ # API 层、数据模型、Socket 服务
│ │ ├── providers/ # Riverpod 状态管理
│ │ ├── features/ # 各功能页面
│ │ └── shared/ # 通用组件和工具
│ ├── android/ # Android 原生配置
│ └── pubspec.yaml
├── docs/ # 路线图和设计文档
├── docker-compose.yml # 开发环境依赖
├── docker-compose.prod.yml # 生产环境编排
└── README.md
- Node.js 18+
- npm 9+
- Docker / Docker Compose
- MongoDB:主业务数据
- Redis:任务队列、验证码限流、缓存
- PostgreSQL + pgvector:知识库文档和向量索引
- 聊天功能需要至少一个可用的 AI Provider
- 知识库问答额外需要可用的 embedding provider
- 推荐方案:
- 聊天:MiniMax / DeepSeek / OpenAI 兼容服务
- Embedding:DashScope
text-embedding-v2
git clone https://github.com/111pointer111/mini-chat.git
cd mini-chat开发环境使用 docker-compose.yml 启动 MongoDB、Redis 和 PostgreSQL:
docker compose up -d默认端口:
- MongoDB:
27017 - Redis:
6379 - PostgreSQL:
5432
cd backend
cp .env.example .env
npm install
npm run dev后端默认运行在 http://localhost:5000。
定时任务需要另开一个终端启动 Worker:
npm run dev:workercd frontend
npm install
npm run dev前端默认运行在 http://localhost:5173。
如果 5173 已被占用,可以改端口:
npm run dev -- --port 5174cd mobile
flutter pub get
flutter run # 调试模式
flutter build apk # 构建 Release APKAndroid 客户端功能与 Web 前端一致,包括:
- 实时 1v1 / 群聊
- AI 对话(流式输出 + Markdown)
- 定时任务管理
- 知识库
- MCP 工具管理
APK 输出路径:mobile/build/app/outputs/flutter-apk/app-release.apk
- Web 前端:
http://localhost:5173 - Android 客户端:安装 APK 后配置服务器地址
- 后端健康检查:
http://localhost:5000/health
项目已提供 backend/.env.example 作为开发模板。
关键配置如下:
PORT=5000
MONGODB_URI=mongodb://admin:password@localhost:27017/mini-chat?authSource=admin
JWT_SECRET=replace_me_in_production
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=minichat
AI_BASE_URL=
AI_API_KEY=
AI_MODEL=
AI_EMBEDDING_BASE_URL=
AI_EMBEDDING_API_KEY=
AI_EMBEDDING_MODEL=
AI_EMBEDDING_DIMENSIONS=
ADMIN_USERNAME=admin
ADMIN_PASSWORD=admin123
ADMIN_EMAIL=admin@minichat.com
ALIYUN_ACCESS_KEY_ID=
ALIYUN_ACCESS_KEY_SECRET=
ALIYUN_SMS_SIGN_NAME=
ALIYUN_SMS_TEMPLATE_CODE=
# 知识库 embedding 批处理大小(可选)
KB_EMBEDDING_BATCH_SIZE=2
# CORS 源(逗号分隔,可选)
CORS_ORIGINS=http://localhost:5173,http://localhost:5174,http://localhost:5175
# 告警邮件接收人(通过 GitHub Secrets 注入,不写在文件里)
# ALERT_EMAIL=admin@example.com
ALERT_MIN_SEVERITY=warning
ALERT_ERROR_RATE_PERCENT=2
ALERT_LATENCY_P95_MS=800
ALERT_MEMORY_MB=350
ENABLE_MONITORING_TEST_ROUTES=false
MONITORING_TEST_TOKEN=
# 运行环境(production 时强制要求 JWT_SECRET)
NODE_ENV=development管理员可在后台维护 AI Provider。当前实现支持:
Base URL:聊天模型接口地址模型名称:聊天模型名Embedding API Key:独立 embedding API Key,留空则复用聊天模型 API KeyEmbedding Base URL:独立 embedding 接口地址Embedding 模型:embedding 模型名Embedding 维度:可选,适用于 DashScopetext-embedding-v4等需显式维度的模型
如果你使用:
- MiniMax 负责聊天
- DashScope 负责知识库 embedding
推荐配置:
- Chat
Base URL:MiniMax OpenAI 兼容地址 - Chat
模型名称:你当前使用的 MiniMax 模型 Embedding API Key:DashScope API KeyEmbedding Base URL:https://dashscope.aliyuncs.com/compatible-mode/v1Embedding 模型:text-embedding-v2Embedding 维度:留空
开发环境下,如果数据库中还没有管理员账号,系统会自动初始化:
- 用户名:
admin - 密码:
admin123
对应逻辑见 backend/src/scripts/initAdmin.ts。
强烈建议在生产环境中通过环境变量显式设置:
ADMIN_USERNAMEADMIN_PASSWORDADMIN_EMAIL
知识库链路包括:
- 文档上传或网页导入
- 文本提取
- 文本分块
- 调用 embedding provider 生成向量
- 写入 PostgreSQL + pgvector
- 提问时检索相关片段,再交给聊天模型生成回答
当前支持情况:
- 支持的本地文件类型:
txt,md,json,csv,pdf,doc/docx,ppt/pptx,xls/xlsx, 常见图片 - 纯文本文件优先直接读取
- PDF / Office 文档依赖系统解析组件
- 图片走 OCR
如果只配置聊天模型,没有配置 embedding 能力,知识库上传会在向量化阶段失败。
复制模板:
cp .env.production.example .env.production按需填写:
DOCKERHUB_USERNAMEJWT_SECRETMONGO_USER/MONGO_PASSWORDPOSTGRES_*AI_*ADMIN_*
# 后端
cd backend
docker build -t your_dockerhub_username/minichat-backend:latest .
docker push your_dockerhub_username/minichat-backend:latest
# 前端
cd ../frontend
docker build -t your_dockerhub_username/minichat-frontend:latest .
docker push your_dockerhub_username/minichat-frontend:latestpush 到 main 分支会自动触发 CI(类型检查)和部署(构建镜像 + SSH 部署)。
需要在 repo → Settings → Secrets → Actions 中配置:
| Secret | 说明 |
|---|---|
DOCKERHUB_USERNAME |
Docker Hub 用户名 |
DOCKERHUB_TOKEN |
Docker Hub Access Token |
SERVER_HOST |
服务器 IP / 域名 |
SERVER_USER |
SSH 用户名 |
SERVER_SSH_KEY |
SSH 私钥 |
JWT_SECRET |
JWT 签名密钥 |
MONGO_USER / MONGO_PASSWORD |
MongoDB 凭据 |
ALIYUN_SMTP_PASS |
阿里云 SMTP 密码 |
ALERT_EMAIL |
告警邮件接收人 |
AI_BASE_URL / AI_API_KEY / AI_MODEL |
AI Provider 配置 |
ALIYUN_* |
短信服务配置(可选) |
docker compose -f docker-compose.prod.yml --env-file .env.production up -d生产环境编排包括:
- MongoDB
- Redis
- PostgreSQL + pgvector
- 后端 API
- Nginx 托管的前端
以下仅列出主要路由,完整逻辑请参考 backend/src/routes/。
POST /api/auth/registerPOST /api/auth/loginGET /api/auth/mePOST /api/auth/send-codePOST /api/auth/register-phonePOST /api/auth/login-phonePOST /api/auth/bind-phonePOST /api/auth/reset-password-phone
GET /api/users/searchGET /api/friendsPOST /api/friends/requestGET /api/friends/requests/pendingPUT /api/friends/request/:requestId/acceptGET /api/messages/:userId
GET /api/groupsPOST /api/groupsGET /api/groups/:groupId/membersPOST /api/groups/:groupId/membersGET /api/groups/:groupId/messagesGET /api/groups/:groupId/kb/documentsPOST /api/groups/:groupId/kb/documents/uploadPOST /api/groups/:groupId/kb/documents/urlDELETE /api/groups/:groupId/kb/documents/:documentId
POST /api/ai-chatGET /api/ai-chat/conversationsPOST /api/ai-chat/conversationsPUT /api/ai-chat/conversations/:conversationIdDELETE /api/ai-chat/conversations/:conversationId
GET /api/ai-providersGET /api/ai-providers/userPUT /api/ai-providers/userGET /api/ai-providers/adminPOST /api/ai-providers/admin
GET /api/scheduled-tasksGET /api/scheduled-tasks/conversationsPOST /api/scheduled-tasks/customPUT /api/scheduled-tasks/custom/:taskIdDELETE /api/scheduled-tasks/custom/:taskId
GET /api/kb/documentsPOST /api/kb/documents/uploadPOST /api/kb/documents/urlGET /api/kb/search
知识库问答能力已合并到 AI 助手和群聊小助手中,不再提供独立的 /api/kb/chat 入口。
GET /api/mcp/serversPOST /api/mcp/serversPUT /api/mcp/servers/:idDELETE /api/mcp/servers/:idPOST /api/mcp/servers/:id/testPOST /api/mcp/servers/:id/refresh-toolsGET /api/mcp/tools
POST /api/upload
GET /health— 存活检查(无认证)GET /api/ready— 就绪检查(无认证,检查 MongoDB、Redis、PostgreSQL)GET /api/metrics— 指标快照(admin)GET /api/alerts— 告警规则状态(admin)GET /api/test/ok|slow|error— 监控测试端点(默认关闭,需ENABLE_MONITORING_TEST_ROUTES=true和X-Monitoring-Test-Token)
生产环境告警测试建议只打 /api/test/*,不要压登录、短信、AI 等真实业务接口:
wrk -t1 -c5 -d30s -H "X-Monitoring-Test-Token: <token>" https://mini-chat.cn/api/test/ok
wrk -t1 -c5 -d60s -H "X-Monitoring-Test-Token: <token>" "https://mini-chat.cn/api/test/slow?ms=1000"
wrk -t1 -c5 -d40s -H "X-Monitoring-Test-Token: <token>" "https://mini-chat.cn/api/test/error?status=500"- 没有配置测试框架(
test: echo "Error: no test specified"),验证方式为npm run build+npm run lint+ CI - 后端 Dockerfile 安装了系统依赖用于文档解析(antiword, catdoc, poppler-utils, unrtf),这些是知识库功能所需的
- 生产环境必须设置
JWT_SECRET,否则服务启动失败 - 告警阈值支持通过环境变量配置;测试端点默认关闭,生产测试后应及时关闭
- 知识库首选小文件和纯文本文件验证链路
- 如果使用 DashScope
text-embedding-v4,建议同时显式设置Embedding 维度 = 1536 - 如果只需要稳定上线知识库,优先选择
text-embedding-v2
详细规划请参考:
欢迎提交 Issue 和 PR。建议在提交前至少完成:
cd backend && npm run build
cd ../frontend && npm run build如果你的改动涉及知识库,请附带:
- 使用的 provider 配置方式
- 测试文件类型
- 上传 / 检索 / 问答结果
提交信息采用 Conventional Commits 风格,描述使用中文:
<type>(<scope>): <中文描述>
常用 type:
feat:新增功能fix:修复问题docs:文档更新refactor:重构,不改变外部行为style:格式或样式调整test:测试相关chore:构建、依赖、配置、脚手架等杂项
示例:
feat(group): 新增群知识库管理面板
fix(kb): 修复 pgvector 向量写入格式
docs(readme): 补充提交信息规范
如果存在破坏性变更,在 type 或 scope 后加 !,并在正文或页脚说明影响:
feat(api)!: 调整知识库问答入口
BREAKING CHANGE: 移除独立的 /api/kb/chat,改由 AI 助手统一触发 RAG。
本项目使用 ISC License,详见 LICENSE。