面向中小团队的实时协作与数据资产管理平台,覆盖即时通讯、文件索引、公告发布与权限管控。
TYBI 是一个 OLTP 工作负载 的数据资产管理系统,解决团队协作中信息碎片化的问题——用统一平台替代"微信传文件 + Excel 记台账"的松散流程。
- 聊天是管道,文件是资产:消息即时送达,文件持久索引、可追溯
- 多数据库分工:PostgreSQL 负责事务一致性,MongoDB 存高吞吐消息体,Redis 驱动实时推送,MinIO 托管文件对象
- Outbox 模式:保证消息不丢、不乱序,发消息和写消息解耦
| 层 | 技术 | 用途 |
|---|---|---|
| 后端运行时 | Node.js + Express + TypeScript (strict) | REST API + 中间件 |
| 关系型数据库 | PostgreSQL 16 + Prisma ORM | 用户、团队、文件元数据、消息索引、公告 |
| 文档数据库 | MongoDB 7 | 聊天消息体 (高写入吞吐) |
| 缓存/消息中间件 | Redis 7 | JWT 令牌存储、PubSub 广播、Socket.IO 适配器 |
| 对象存储 | MinIO (S3 兼容) | 文件/头像/附件,预签名 URL 上传下载 |
| 实时通道 | SSE + Socket.IO (双通道) | 消息推送、频道列表同步 |
| 前端 | Vue 3 (Composition API) + Pinia + Tailwind CSS | SPA |
| 桌面端 | Electron 33 + vite-plugin-electron | 独立客户端 |
| 部署 | Docker Compose + Nginx 反向代理 | 容器化编排 |
| 输入验证 | Zod | 全路由覆盖 |
| 安全 | Helmet + CORS + rate-limit + bcryptjs + JWT 轮换 | 纵深防护 |
Client (Browser / Electron)
│
├── HTTP REST ────── Express API Server ──── PostgreSQL (transactions)
│ │ MongoDB (message bodies)
│ ├── POST /chat/* ──→ Outbox table ──→ Outbox Worker ──→ Redis PubSub
│ │ │
├── SSE ◄────────────────────────────────────────────────────────────┘
│ (channel messages / channel list / user events)
│
└── WebSocket ◄──── Socket.IO Server ──── Redis Adapter ──── PubSub
(message send/ack, real-time sync)
Outbox 模式(消息可靠性)
消息发送请求先写入 PostgreSQL Outbox 表(与 MessageIndex 在同一事务中),Worker 异步消费 Outbox 写入 MongoDB 并发布 Redis 事件。发消息的 HTTP 请求不阻塞消息分发,且保证 at-least-once 语义。
预签名 URL(文件安全) 上传:客户端向服务器请求预签名 PUT URL → 直传 MinIO,服务器不接触文件流。 下载:服务器生成短时效预签名 GET URL,MinIO 直出,避免代理文件消耗带宽。
JWT 双令牌轮换
Access token (短时效) + Refresh token (Redis 存储)。刷新时旧 token 立即撤销,新 token 发放。SSE 端点通过 ?token= query 参数兼容 EventSource 无法设置 Authorization 头的限制。
SSE + WebSocket 双通道 SSE 作为最小可用实时通道(轻量、HTTP 兼容),WebSocket 作为增强通道(双向、低延迟),两者统一桥接到 Redis PubSub,事件源一致。
- 团队管理:创建团队、6 位邀请码加入、角色权限 (boss/owner/manager/member)
- 频道消息:团队内频道创建、消息发送/查询、附件上传
- 私聊:点对点消息,按 peer 对隔离
- 文件管理:上传、下载、搜索、过滤(名称/类型/大小/日期/标签)、批量删除
- 标签系统:用户级自定义标签,文件多标签关联
- 公告系统:团队公告发布、隐藏、已读回执
- 用户设置:头像上传、主题色
- 实时通知:频道列表变更、新消息推送
- 桌面客户端:Electron 打包,独立窗口运行
- Node.js >= 18.17
- Docker Desktop (或本地安装 PostgreSQL 16 + Redis 7 + MongoDB 7 + MinIO)
# 1. 安装依赖
cd tybiBackend && npm install && npx prisma generate
cd ../tybiFrontend && npm install
# 2. 启动基础设施 (Docker)
cd ../tybiBackend
npm run dev:infra # 启动 PG + Redis + Mongo + MinIO + Nginx
# 3. 启动后端 (三个终端)
npm run dev # API 服务器 :4000
npm run worker:dev # Outbox Worker
npm run worker:file:dev # 文件处理 Worker
# 4. 启动前端
cd ../tybiFrontend
npm run dev # Vite 开发服务器 :5173或使用根目录 PowerShell 脚本一键拉起:
.\dev-win.ps1cd tybiBackend
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -dTYBI/
├── tybiBackend/ # Express API 后端
│ ├── prisma/schema.prisma # 数据模型 (10 张表)
│ ├── src/
│ │ ├── index.ts # 入口:HTTP + Socket.IO server
│ │ ├── server.ts # Express 配置 + 中间件 + 路由挂载
│ │ ├── routes/ # auth / teams / chat / realtime / files / users / tags / announcements
│ │ ├── services/ # chat (Outbox 入队)
│ │ ├── workers/ # outboxWorker / fileProcessor
│ │ ├── realtime/ws.ts # Socket.IO 服务器
│ │ ├── db/ # prisma / redis / mongo 客户端
│ │ ├── middleware/auth.ts # JWT 验证 + 角色注入
│ │ └── utils/ # s3 / env / error
│ ├── docker-compose.yml
│ └── Dockerfile
├── tybiFrontend/ # Vue 3 SPA 前端
│ ├── src/
│ │ ├── views/ # 页面视图
│ │ ├── components/ # UI 组件 (team / workspace)
│ │ ├── stores/ # Pinia 状态管理 (5 个 store)
│ │ ├── router/ # Vue Router 配置
│ │ └── utils/ # api (HTTP 客户端) / wsClient (WebSocket)
│ ├── electron-main.ts # Electron 主进程
│ ├── preload.ts # Electron 预加载脚本
│ └── vite.config.ts
└── dev-win.ps1 # Windows 开发启动脚本
MIT