软件架构
plantuml
┌─────────────────────────────────────────────────────────┐
│ 最终系统架构 │
│ │
│ ┌──────────┐ WebSocket(信令) ┌──────────────────┐ │
│ │ │◄──────────────────── │ │ │
│ │ Client │ │ Server(Signal) │ │
│ │ Tauri │ ──────────────────── │ (Axum) │ │
│ │ │ WebSocket(信令) │ │ │
│ │ E2EE │ └ │ │
│ │ Encrypt │ │ │ │
│ │ │ DTLS/SRTP(媒体) │ │ │
│ │ │◄──────────────────── │ │ │
│ │ │ ──────────────────── │ Server(SFU) │ │
│ └──────────┘ │ (webrtc-rs) │ │
│ │ │ │
│ ┌──────────┐ DTLS/SRTP(媒体) │ 只转发密文 │ │
│ │ │◄──────────────────── │ 不解密内容 │ │
│ │ Client │ ──────────────────── │ │ │
│ │ Tauri │ └──────────────────┘ │
│ └──────────┘ │
└─────────────────────────────────────────────────────────┘
软件架构说明
使用rust, openMLS, tauri, tokio, Axum, webrtc.rs, sqlite, postgresql开发的
E2EE 音视频通话,私聊群聊系统。去中心化,sqlite聊天存储加密。
openMLS 使用sqlite持久化.
支持离线消息推送。
plantuml
mindit/
├── Cargo.toml # Rust workspace(统一依赖版本)
├── README.md # 项目说明/架构图
├── .gitignore
├── crates/
│ ├── common/ # 通用协议:信令消息(ClientMessage/ServerMessage)
│ │ ├── Cargo.toml
│ │ └── src/lib.rs
│ ├── client-core/ # 客户端核心库:MLS + 本地聊天加密
│ │ ├── Cargo.toml
│ │ └── src/
│ │ ├── lib.rs # re-export:MlsClient / MlsGroupManager / ChatStorageCipher
│ │ ├── mls/ # OpenMLS 封装:身份与群组状态机
│ │ │ ├── mod.rs
│ │ │ ├── client.rs # 单用户 MLS 客户端(签名密钥/凭证等)
│ │ │ └── group.rs # 群组管理(create/join/commit/export_key...)
│ │ │ └── provider.rs # 企业级持久化 MLS Provider
│ │ │ └── sqlite_storage.rs # 企业级 SQLite StorageProvider 实现
│ │ ├── crypto/ # 加密能力(本地聊天存储、历史等)
│ │ │ ├── mod.rs
│ │ │ ├── chat_storage.rs # Argon2 派生主密钥 + 本地加密封装
│ │ │ ├── e2ee.rs #(历史/实验)媒体相关加密逻辑
│ │ │ └── key_exchange.rs #(历史/实验)密钥交换
│ │ └── chat/
│ │ └── mod.rs
│ ├── server/ # HTTP API + WebSocket 信令 + SFU HTTP + GRPC后台
│ │ ├── Cargo.toml
│ │ ├── .env #(本地)DATABASE_URL 等
│ │ ├── build.rs # 生成 Rust gRPC 代码
│ │ ├── migrations/ # sqlx 迁移(Postgres)
│ │ ├── .sqlx/ # sqlx query cache(给 rust-analyzer / query! 用)
│ │ └── configuration/ # 配置文件夹
│ │ ├── base.yaml # 通用配置
│ │ ├── local.yaml # 本地环境配置
│ │ ├── production.yaml # 生产环境配置
│ │ └── proto/
│ │ ├── admin.proto # 和golang后台管理服务交互的协议,本server作为服务器端
│ │ └── src/
│ │ ├── main.rs # 入口:
│ │ ├── lib.rs # 各个模块的mod 声明
│ │ ├── configuration.rs # 配置
│ │ ├── startup.rs # 应用启动具体代码执行:建库/迁移 + 路由合并 + CORS + JWT 中间件
│ │ ├── storage.rs # 统一存储抽象层 (支持 LocalFS / MinIO 等)
│ │ ├── api.rs # public/protected API router 组装
│ │ ├── db/
│ │ │ ├── config.rs # 配置管理
│ │ │ ├── devices.rs # 设备管理
│ │ │ ├── friends.rs # 好友管理
│ │ │ ├── groups.rs # 群聊分组管理
│ │ │ └── key_packages.rs # key_package管理
│ │ │ └── offline_messages.rs # 离线消息管理
│ │ │ └── rooms.rs # 房间成员管理
│ │ │ └── users.rs # 客户端用户管理
│ │ │ └── mod.rs # 统一暴露
│ │ ├── grpc/
│ │ │ ├── admin_service.rs # 实现了tonic proto生成代码的trait
│ │ │ └── auth_interceptor.rs # shared secret 鉴权拦截器
│ │ │ └── convert.rs # prost_types和业务数据模型的转换
│ │ │ └── mod.rs # 启动grpc服务
│ │ ├── auth.rs # JWT 管理与鉴权中间件
│ │ ├── routes/
│ │ │ ├── mod.rs
│ │ │ └── auth_routes.rs # 注册/登录等 REST API
│ │ │ └── file_routes.rs # 文件上传下载系统 REST API
│ │ │ └── friend_routes.rs # 好友系统 REST API
│ │ │ └── group_routes.rs # 群聊 REST API
│ │ ├── auth.rs # JWT 管理与鉴权中间件
│ │ ├── middleware/
│ │ │ ├── mod.rs
│ │ │ └── rate_limit.rs # 频控:claim KeyPackage 等
│ │ ├── room.rs # 房间注册表(音视频房间状态)
│ │ ├── global_sessions.rs # 单个在线用户的全局会话
│ │ ├── signal/ # WebSocket 信令
│ │ │ ├── mod.rs # ws_handler:接入/分发
│ │ │ └── session.rs # 单个 WS 连接会话
│ │ └── sfu/ # SFU:HTTP publish/subscribe + peer 转发
│ │ ├── mod.rs # SFU发布订阅
│ │ └── peer.rs # RTP 转发(含 PLI 响应)
│ │ └── metrics.rs # SFU 实时带宽统计
│ │ └── tests/ #测试目录
│ │ ├── api/
│ │ │ ├── main.rs # 让整个 tests/api/ 目录被视为一个独立的 crate
│ │ │ ├── helpers.rs # 启用测试应用工具函数
│ │ │ ├── health_check.rs # 健康检查接口测试
└── app/ # Tauri 桌面客户端(Rust 后端 + WebView 前端)
├── Cargo.toml
├── tauri.conf.json
├── build.rs
├── Info.plist
├── Entitlements.plist
├── app-icon.png
├── icons/ # 桌面/移动端图标资源(android/ios/*.png 等)
├── src/
│ ├── main.rs # 二进制入口:转调 app_lib::run()
│ ├── lib.rs # Tauri 入口:插件、AppState、invoke_handler 注册
│ ├── state.rs # AppState:JWT/MLS/群组/本地加密器等共享状态
│ ├── config/ # 客户端配置(server url、本地 config.toml)
│ │ ├── mod.rs
│ │ ├── app_config.rs
│ │ └── config.toml
│ └── commands/ # 暴露给前端的 Tauri commands(invoke)
│ ├── app.rs # get_app_version 等
│ ├── auth.rs # 注册/登录/登出/恢复 session(HTTP + 本地 token 缓存)
│ ├── chat.rs # 群聊/私聊消息加解密(MLS 派生密钥)
│ ├── config.rs # 读写 server 配置
│ ├── keystore.rs # KeyPackage 供应/claim(与 server API 交互)
│ └── local_db.rs # 聊天记录 SQLite(本地保存/查询/会话列表/未读)
│ ├── mls.rs # MLS 群组:create/join/commit/export key/leave...
│ ├── mod.rs
│ ├── recorder.rs # 录屏文件保存:弹出系统文件保存对话框,写入指定路径
└── frontend/ # 纯前端(Vue3 + 原生 ESM,无打包)
├── public # 图片和webrtc worker.js
├── index.html
├── package.json
├── pnpm-lock.yaml
├── tsconfig.json
├── tsconfig.app.json
├── tsconfig.node.json
├── vite.config.ts
└── src/
├── assets
├── core
├── config.ts # 应用启动时从 Rust 读取配置
├── state.ts # 全局响应式状态 + invoke 封装 + E2EE Worker 生命周期
├── signaling.ts # WebSocket 信令:Join/Welcome/Commit/消息转发/媒体状态等
├── webrtc.ts # WebRTC:publish/subscribe + transform 绑定(encodedInsertableStreams)
├── mls.ts # MLS 前端驱动:上传 KeyPackage、邀请成员、激活加密
├── friend.ts # 好友系统 HTTP API 封装
├── group.ts # 群组状态管理与 HTTP API 封装
├── contacts.ts # 联系人状态管理:数据源从好友API获取,不再依赖历史记录
├── fileTransfer.ts # 文件上传下载
├── screenshot.ts # 截屏
├── recorder.ts # 共享屏幕 & 录屏
├── keystore.ts # KeyPackage 供应策略(保证服务端库存)
├── local_db.ts # 前端聊天记录读写(通过 Tauri commands)
├── layouts
├── MainLayout.vue #主布局视图
├── App.vue
├── env.d.ts
├── main.ts
├── style.css
└── components/
├── AuthPanel.vue # 登录/注册 UI
└── ChatWindow.vue # 聊天窗口
├── EncStatus.vue # 加密状态展示
├── FriendPanel.vue # 好友 UI
├── GroupPanel.vue # 群组管理面板:创建群组、查看成员、邀请、退出
└── LogPanel.vue # 日志面板
└── MeetingRoom.vue # 音视频通话
└── Sidebar.vue # 边栏
├── VideoArea.vue # 远端视频网格/本地预览
运行图示






还有管理后台。。。
mindit-admin/
├── Makefile # 代码生成 / 构建 / 迁移命令
├── .env # 本地环境变量
├── docker-compose.yml # 本地起 PG + Redis + Prometheus
├── proto/
│ └── admin.proto # 软链接或拷贝自 Rust 侧(单一来源)
├── gen/
│ └── admin/ # protoc 生成的 Go gRPC 代码
│ ├── admin.pb.go
│ └── admin_grpc.pb.go
├── cmd/
│ └── server/
│ └── main.go # 程序入口:加载配置 + 启动 Gin
├── internal/
│ ├── config/
│ │ ├── config.go # 配置结构体
│ │ └── config.yaml # 配置文件
│ ├── db/
│ │ ├── migrations/ # goose 迁移文件
│ │ │ ├── 001_admin_users.sql
│ │ │ ├── 002_rbac_policies.sql
│ │ │ ├── 002_audit_logs.sql
│ │ │ ├── 003_system_config.sql
│ │ │ └── 004_timescale_metrics.sql
│ │ ├── query/ # sqlc 原始 SQL 文件
│ │ │ ├── admin_users.sql
│ │ │ ├── audit_logs.sql
│ │ │ ├── system_config.sql
│ │ │ └── metrics.sql
│ │ └── sqlc/ # sqlc 生成的 Go 代码
│ │ ├── db.go
│ │ ├── admin_users.sql.go
│ │ ├── audit_logs.sql.go
│ │ └── ...
│ ├── grpc/
│ │ └── client.go # AdminService gRPC 客户端封装
│ ├── middleware/
│ │ ├── auth.go # JWT 验证中间件
│ │ ├── casbin.go # Casbin RBAC 鉴权中间件
│ │ ├── audit.go # 审计日志中间件(自动记录操作)
│ │ └── ratelimit.go # 管理接口限流
│ ├── handler/ # Gin 处理函数(按业务模块拆分)
│ │ ├── auth.go # 登录 / TOTP 验证 / 登出
│ │ ├── admin_user.go # 管理员账号 CRUD
│ │ ├── user.go # 业务用户管理(封禁/强制下线)
│ │ ├── device.go # 设备管理(设备级吊销)
│ │ ├── keypackage.go # KeyPackage 状态查询与清理
│ │ ├── session.go # 活跃会话 / 强制终止通话
│ │ ├── metrics.go # 实时指标(代理 PromQL)
│ │ ├── config.go # 系统配置热更新
│ │ └── audit.go # 审计日志查询
│ ├── service/ # 业务逻辑层(handler 调用 service)
│ │ ├── auth_service.go
│ │ ├── user_service.go
│ │ ├── device_service.go
│ │ ├── keypackage_service.go
│ │ └── metrics_service.go
│ ├── router/
│ │ └── router.go # 路由注册 + 中间件挂载
│ └── model/ # 请求/响应结构体
│ ├── request.go
│ └── response.go
├── sqlc.yaml # sqlc 配置
└── casbin/
├── model.conf # Casbin RBAC 模型定义
└── policy.csv # 初始权限策略(开发用)
管理后台 通过 grpc 和 server交互,查询音视频通话状态,管理员可强制用户下线音视频通话。