基于 NestJS Monorepo 架构的微服务视频对讲平台,支持实时 WebRTC 通信、访客模式和用户认证,采用可扩展的服务设计。
minichat/
├── apps/
│ ├── gateway/ # API 网关,提供 JWT 认证
│ ├── signaling/ # Socket.IO WebRTC 信令服务
│ └── web/ # Next.js 前端应用
├── libs/
│ └── common/ # 共享类型和工具库
├── docker-compose.yml
└── pnpm-workspace.yaml
- 实时视频对讲:WebRTC 点对点视频通信
- 访客模式:无需注册即可快速接入
- 用户注册:完整的账号系统和 JWT 认证
- 房间管理:创建和加入视频对讲房间
- 微服务架构:可扩展的服务设计
- 类型安全:跨服务共享 TypeScript 类型定义
- NestJS - 渐进式 Node.js 框架
- Socket.IO - 实时双向通信
- JWT - 基于令牌的认证
- MongoDB - 主数据库
- Redis - 会话和房间状态管理
- Next.js 14 - React 框架,使用 App Router
- TypeScript - 类型安全开发
- Socket.IO Client - 实时连接
- Docker Compose - 多容器编排
- pnpm - 快速、节省磁盘空间的包管理器
- Node.js >= 18
- pnpm >= 8
- Docker & Docker Compose(用于数据库服务)
- 克隆仓库:
git clone <repository-url>
cd minichat- 安装依赖:
pnpm install- 复制环境变量配置:
cp .env.example .env- 使用 Docker 启动数据库:
pnpm docker:up- 启动所有服务(开发模式):
pnpm dev服务访问地址:
- 前端:http://localhost:3100
- Gateway API:http://localhost:4000
- 信令服务:http://localhost:3101
如需在局域网内通过 HTTPS 访问(如手机测试),需要配置本地 SSL 证书:
# macOS
brew install mkcert
# Windows(使用 winget)
winget install FiloSottile.mkcert
# 或手动从 https://github.com/FiloSottile/mkcert/releases 下载cd apps/web
mkcert -install # 安装根 CA(自动生成 rootCA.pem)
mkcert localhost 127.0.0.1 192.168.0.101 ::1 # 生成证书(替换 IP)这会在当前目录生成两个文件:
localhost+3.pem- 证书localhost+3-key.pem- 私钥
注意:
mkcert -install会自动在系统目录创建根 CA,包括rootCA.pem文件。
# 查找系统中 rootCA.pem 的位置
mkcert -CAROOT
# 复制根证书到项目(macOS/Linux)
cp "$(mkcert -CAROOT)/rootCA.pem" public/rootCA.pem
# 复制根证书到项目(Windows PowerShell)
Copy-Item "$(mkcert -CAROOT)\rootCA.pem" public/rootCA.pem这样移动设备可以通过页面直接下载 public/rootCA.pem 来安装证书。
iOS/Safari:
- 下载根证书:
public/rootCA.pem(访问页面时可直接下载) - 打开证书文件安装
- 关键步骤:设置 → 通用 → 关于本机 → 证书信任设置 → 启用 mkcert 完全信任
- 重启浏览器/微信
Android:
- 下载根证书:
public/rootCA.pem - 设置 → 安全 → 加密与凭据 → 从存储设备安装
- 为证书命名并确认安装
cd apps/web
pnpm dev然后在浏览器访问:https://192.168.0.101:3100(替换为你的局域网 IP)
如遇连接问题,访问诊断页面:https://192.168.0.101:3100/check
- apps/gateway:REST API 网关,处理认证和用户管理
- apps/signaling:WebSocket 服务,用于 WebRTC 信令
- apps/web:Next.js 前端应用
- libs/common:共享的 TypeScript 类型和工具
# 开发模式
pnpm dev # 启动所有服务(监听模式)
pnpm dev --filter @minichat/gateway # 启动指定服务
# 构建
pnpm build # 构建所有服务
# 生产模式
pnpm start # 启动所有服务(生产模式)
# 代码检查
pnpm lint # 检查所有服务
# 测试
pnpm test # 运行测试
# Docker
pnpm docker:up # 启动 MongoDB 和 Redis
pnpm docker:down # 停止所有容器创建临时访客会话:
POST http://localhost:4000/auth/guest
Content-Type: application/json
{
"nickname": "访客123"
}POST http://localhost:4000/auth/register
Content-Type: application/json
{
"email": "[email protected]",
"password": "password123",
"nickname": "张三"
}POST http://localhost:4000/auth/login
Content-Type: application/json
{
"email": "[email protected]",
"password": "password123"
}信令服务的 Socket.IO 需要携带 JWT:
- 连接时通过
auth.token传递,或使用Authorization: Bearer <token> - 事件默认需要鉴权(已启用 Guard)
本地可用环境变量覆盖(示例):
JWT_ISSUER=http://localhost:9000
JWT_AUDIENCE=local.chat
JWT_SECRET=dev-secret
快速验证 token(signaling 端口 3101):
GET http://localhost:3101/auth/diagnostics
Authorization: Bearer <token>GET /- 健康检查GET /health- 服务健康状态POST /auth/guest- 创建访客会话POST /auth/register- 注册新用户POST /auth/login- 用户登录GET /auth/profile- 获取用户信息(需要认证)
Socket.IO 事件:
create-room- 创建视频对讲房间join-room- 加入现有房间offer- 发送 WebRTC offeranswer- 发送 WebRTC answerice-candidate- 交换 ICE 候选leave-room- 离开当前房间
使用 Docker Compose 构建和运行所有服务:
docker-compose up --build所有服务将自动编排,包含健康检查和依赖管理。
查看 .env.example 了解所有可用配置选项。
关键变量:
JWT_SECRET- JWT 令牌密钥MONGODB_URI- MongoDB 连接字符串REDIS_URL- Redis 连接字符串CORS_ORIGIN- 允许的 CORS 来源NEXT_PUBLIC_API_URL- 前端使用的 Gateway API 地址NEXT_PUBLIC_SIGNALING_URL- 前端使用的信令服务地址
如配置了本地 HTTPS(见上文),需要更新环境变量:
# 局域网 HTTPS 访问时的配置
CORS_ORIGIN=https://localhost:3100,https://192.168.0.101:3100
NEXT_PUBLIC_SIGNALING_URL=https://192.168.0.101:3101
# 注意:
# - 替换 192.168.0.101 为你的实际局域网 IP
# - 信令服务自动检测证书并启用 HTTPS(无需额外配置)欢迎贡献代码!请随时提交 Pull Request。
本项目采用 MIT 许可证。