端到端加密音视频通话系统

软件架构
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交互,查询音视频通话状态,管理员可强制用户下线音视频通话。

支持私有化部署

下期开始剖析技术实现...

相关推荐
show43313 小时前
2026小程序端视频转文字技术对比:识别引擎精度实测
小程序·音视频
南山电子nscn16 小时前
国巨RT2512系列薄膜精密电阻在音频放大器中的应用及技术优势解析
音视频·薄膜精密电阻
starzy199018 小时前
Soloop 智能视频创作全流程实战指南
数据库·microsoft·音视频
xingyuzhisuan19 小时前
星宇智算 AI 视频工作台・图生视频(首尾帧)・Vidu:双模型可控动态过渡生成应用
人工智能·计算机视觉·音视频
zandy101120 小时前
全价位数字调音台横向解析:覆盖国产与进口机型,按预算、应用场景对照选型指南
音视频·数字调音台
AI服务老曹20 小时前
NVIDIA GPU部署AI视频分析常见问题和排查清单
人工智能·音视频
林澈在路上1 天前
可以用自己声音写歌的软件哪款好用 实测对比
大数据·人工智能·aigc·音视频·音频
程序员-李俞1 天前
MiniMax H3 深度拆解:全模态视频模型来了,AI 漫剧系统该如何重构?
人工智能·ai作画·重构·aigc·音视频·ai写作·画布
淡淡的香烟1 天前
Android智能猫砂盆视频加载慢卡顿问题分析
android·服务器·音视频