@QingQ77: 用 Rust 写的高性能 IM 后端,走 QUIC 协议实时传消息,支持 P2P 打洞和群聊广播。 https://github.com/nicolastinger/only-talk-rs… 用 Actix-web 做 RESTful …
摘要
一个基于 Rust + Actix-web + QUIC 的高性能即时通讯后端,支持 P2P 打洞、群聊广播、多种存储后端,可单进程或分离部署。
查看缓存全文
缓存时间: 2026/06/22 07:40
用 Rust 写的高性能 IM 后端,走 QUIC 协议实时传消息,支持 P2P 打洞和群聊广播。
https://github.com/nicolastinger/only-talk-rs…
用 Actix-web 做 RESTful API,用 QUIC 协议做实时消息推送。支持 P2P NAT 打洞(UDP 9562-9565),打洞失败能自动降级到服务器中转。
文件存储支持本地、MinIO、阿里云 OSS、AWS S3,图片上传自动压成 WebP。后端用的 PostgreSQL + Redis + rbatis ORM,认证走 JWT + Argon2 密码哈希。
可以单进程跑 QUIC + HTTP,也可以拆开部署,适合从小到大的各种规模。
nicolastinger/only-talk-rs
Source: https://github.com/nicolastinger/only-talk-rs
OnlyTalk RS
高性能即时通讯服务器 — Rust + Actix-web + QUIC + PostgreSQL + Redis
项目简介
OnlyTalk RS 是一个基于 Rust 构建的高性能即时通讯(IM)后端服务器,采用 Actix-web 提供 RESTful API,QUIC 协议处理实时消息传输,支持 P2P 打洞、NAT 穿透、群聊广播等高级 IM 功能。
技术栈
| 组件 | 技术 | 说明 |
|---|---|---|
| Web 框架 | Actix-web 4.9 | HTTP/HTTPS API 服务 |
| 协议 | QUIC (quinn 0.10) | 实时消息传输、P2P 连接 |
| 数据库 | PostgreSQL + rbatis 4.6 | ORM 数据持久化 |
| 缓存 | Redis + deadpool-redis | 连接池、会话管理 |
| 对象存储 | AWS S3 SDK | 支持 MinIO / 阿里云 OSS / AWS S3 |
| 认证 | JWT (jsonwebtoken 8.0) | 用户身份验证 |
| 日志 | tracing + tracing-subscriber | 结构化日志、JSON 输出 |
| 加密 | rustls 0.21 + rcgen | TLS 证书管理 |
| Rust Edition | 2024 | 最新语言特性 |
工作区结构
only-talk-rs/
├── src/main.rs # 独立模式入口(同时启动 QUIC + HTTP)
├── crates/
│ ├── api/ # API 服务层(整合 HTTP + QUIC 路由)
│ ├── common/ # 公共工具:配置管理、JWT、RSA 加密、QUIC 配置、tracing
│ ├── entity/ # 数据模型与数据库操作(rbatis)、DDL 脚本
│ ├── email_service/ # 邮件服务(SMTP via reqwest,含连接池)
│ ├── http_service/ # HTTP 端点:用户、好友、群组、聊天、通知、文件
│ ├── quic_service/ # QUIC 服务:外网连接、内网通信、NAT 打洞、P2P 转发
│ └── s3_service/ # S3 对象存储抽象层(多提供商支持)
├── config/
│ ├── app_config.toml # 应用配置(数据库、Redis、QUIC、文件、S3)
│ └── ssl/ # TLS 证书(fullchain.pem + privkey.pem)
├── docs/ # 技术文档
├── .env.example # 环境变量模板
├── Cargo.toml # 工作区配置
├── clippy.toml # Clippy 规则
└── rustfmt.toml # 代码格式化规则
快速开始
前置要求
- Rust: 1.75+ (Edition 2024)
- PostgreSQL: 12+
- Redis: 6+
- TLS 证书: 自签名或正式证书(放置于
config/ssl/目录)
1. 克隆项目
git clone <repository-url>
cd only-talk-rs
2. 配置环境变量
cp .env.example .env
编辑 .env 文件,填入实际配置:
# 数据库
DATABASE_URL=postgres://postgres:[email protected]:5432/postgres
# Redis
REDIS_URL=redis://:[email protected]:6379/
# S3 对象存储(可选)
S3_ENDPOINT=http://127.0.0.1:9000
S3_ACCESS_KEY=your-access-key
S3_SECRET_KEY=your-secret-key
3. 配置应用
编辑 config/app_config.toml,调整以下关键配置:
[server]
address = "0.0.0.0:8443" # HTTPS API 监听地址
log_level = "info" # 日志级别:debug / info / warn / error
[quic_server]
address = "0.0.0.0:4433" # QUIC 外网监听端口
[internal_quic_server]
address = "127.0.0.1:4434" # QUIC 内网通信端口
[s3]
enabled = false # 是否启用 S3 存储(false 则使用本地存储)
provider = "minio" # minio / aliyun_oss / aws_s3
4. 放置 TLS 证书
将 TLS 证书放置到 config/ssl/ 目录:
config/ssl/fullchain.pem # 证书链
config/ssl/privkey.pem # 私钥(支持 RSA / EC / PKCS8 格式)
开发环境可使用 rcgen 自动生成自签名证书。
5. 初始化数据库
执行 crates/entity/ 中的 DDL 脚本创建数据表。
6. 启动服务
# 开发模式
cargo run
# 指定日志级别
RUST_LOG=debug cargo run
# 发布模式
cargo run --release
服务启动后将同时运行:
- HTTPS API:
https://0.0.0.0:8443 - QUIC 外网服务:
0.0.0.0:4433 - QUIC 内网服务:
127.0.0.1:4434
部署模式
| 模式 | 入口 | 端口 | 说明 |
|---|---|---|---|
| 独立模式 | src/main.rs | 8443 + 4433 + 4434 | QUIC + HTTP 同进程运行 |
| QUIC 网关 | crates/quic_service/src/bin/quic_server.rs | 4433 + 4434 | 仅 QUIC 连接管理 |
| API 服务 | crates/api/src/main.rs | 8443 | 仅 HTTP REST API |
独立模式(默认)
cargo run --release
QUIC 服务与 HTTP 服务在同一进程中启动,适合中小型部署。
分离部署
适合大规模集群部署,QUIC 网关与 API 服务独立运行。
API 端点
HTTP REST API
| 路由前缀 | 模块 | 功能 |
|---|---|---|
/user | user_service | 用户注册、登录、资料管理、密码重置 |
/friend | friend_service | 好友申请、好友列表、好友关系管理 |
/group | group_service | 群组创建、成员管理、群消息历史 |
/msg | chat_service | 文本消息、消息查询、消息漫游 |
/file | file_service | 文件上传/下载、头像管理、S3 预签名 URL |
/notify | notify_service | 系统通知、推送通知 |
/integrated | api/controller | 综合用户服务与文件上传服务 |
QUIC 协议
- 外网连接:客户端通过
4433端口建立 QUIC 长连接 - 内网通信:服务器节点间通过
4434端口内部通信 - NAT 打洞:UDP 端口
9562-9565用于 P2P 穿透
特性
消息传输
- 基于 QUIC 双向 Stream 实现实时消息推送
- 支持文本消息、文件消息、图片预览
- 消息 CRC 校验确保传输完整性
P2P 连接
- UDP NAT 发现(端口 9562-9565)
- P2P 打洞建立直连通道
- 打洞失败自动降级为服务器中转
文件存储
- 支持本地存储与 S3 对象存储无缝切换
- 图片自动压缩为 WebP 格式
- 分片上传(大文件支持)
- 预签名 URL 安全访问
认证与安全
- JWT Token 认证
- Argon2 密码哈希
- RSA 公钥加密传输敏感数据
- HTTPS (TLS 1.3) API 传输加密
- QUIC 内置 TLS 加密
日志与监控
- 结构化日志(tracing + JSON 输出)
- TraceId 全链路追踪
- 日志文件自动轮转
- 错误请求自动记录
配置说明
app_config.toml
[database]
url = "${DATABASE_URL}" # PostgreSQL 连接字符串
[redis]
url = "${REDIS_URL}" # Redis 连接字符串
[server]
address = "0.0.0.0:8443" # HTTPS 监听地址
locales = "zh-CN" # 国际化语言
log_level = "info" # 日志级别
[quic_server]
address = "0.0.0.0:4433" # QUIC 外网地址
cert_path = "./config/ssl/fullchain.pem"
key_path = "./config/ssl/privkey.pem"
[file_upload]
max_file_size = 20971520 # 最大文件上传大小(20MB)
[s3]
enabled = true # 是否启用 S3
provider = "minio" # 存储提供商
endpoint = "${S3_ENDPOINT}"
access_key = "${S3_ACCESS_KEY}"
secret_key = "${S3_SECRET_KEY}"
default_bucket = "only-talk-rs"
文件类型配置
支持图片、文档、压缩包、音频、视频等多种文件类型,每种类型可配置允许的扩展名和 MIME 类型。
开发指南
代码规范
clippy::unwrap_used被拒绝 — 使用expect("reason")或正确的错误处理rustfmt: 4 空格缩进、Unix 换行符、分组导入(StdExternalCrate)- 错误处理:
anyhow用于应用层错误,thiserror用于领域层错误
常用命令
# 构建
cargo build --release
# 运行
cargo run --release
# Clippy 检查
cargo clippy --workspace
# 代码格式化
cargo fmt --all
# 运行测试
cargo test --workspace
# 运行 Benchmark
cargo bench -p quic_service
新增 API 端点
- 在
crates/http_service/src/http_service/下创建对应模块 - 创建 controller(处理 HTTP 请求)
- 创建 service(业务逻辑)
- 在
mod.rs中注册路由
新增 QUIC 消息类型
- 在
crates/quic_service/src/msg_service/中定义消息类型 - 实现消息序列化/反序列化
- 注册到消息分发器
文档
License
相似文章
@IndieDevHailey: 亿万富翁 Jack Dorsey 开源的神级项目 Bitchat ,简直是现代黑科技! 完全不需要互联网,用蓝牙就能收发 #Bitcoin + 聊天!!! - 飞机上、演唱会、地铁、荒郊野外、断网灾区……信号全无也能实时通讯 + 转账 -…
Jack Dorsey 开源了 Bitchat 项目,这是一个无需互联网、利用蓝牙 Mesh 网络实现离线通讯和比特币转账的工具,支持多跳中继、Cashu eCash 离线转账和双重加密,适用于断网、监控等场景。
@GitHub_Daily: 用 tmux 管理终端会话,可以在终端里打开多个对话窗口,即便关掉还能在后台继续。 但现在,经常同时开好几个 Agent 干活,想用 tmux 做终端自动化,得写一堆脚本很麻烦。 于是有位开发者用 Rust 从零写了 rmux,专为 Ag…
介绍 rmux,一个用 Rust 编写的现代终端复用器,专为 AI Agent 和自动化场景设计,可协调多个 Agent 同时运行,兼容 90 多条 tmux 命令,并提供 Python SDK 和浏览器共享会话功能。
@geekbb: 基于 Tauri(Rust + Svelte)的桌面应用,将编程 AI 代理、API 客户端、SQL/NoSQL 编辑器、SSH 终端、远程文件浏览器和项目管理看板整合在一个界面中,开发者不用在多个应用之间切换。 https://gith…
Clauge 是一个基于 Tauri(Rust + Svelte)的桌面应用,将编程 AI 代理、API 客户端、SQL/NoSQL 编辑器、SSH 终端、远程文件浏览器和项目管理看板集成在同一界面内,让开发者无需在多个应用间切换。
@NFTCPS: 用了一圈下来,终端里翻会话、切分支这套,真把人折腾够呛。 pi 编程智能体出了个网页版 pi-web,浏览器里直接就能干这几件事: 看会话列表,按工作目录分组,一目了然 跟智能体实时聊,对话中途还能随手换模型 从任意一条消息分叉,或者回退…
pi 编程智能体推出了网页版 pi-web,提供了会话管理、实时对话、分支导航等功能,可通过 npx 快速运行。
@QingQ77: 本地优先的多智能体协作桌面应用,把 AI 协作做成聊天一样的体验,支持多智能体任务分发、文件审查和人工审批。 https://github.com/lizyoko9/bitdance-agenthub… 一个基于 Next.js + El…
AgentHub 是一个本地优先的多智能体协作桌面应用,将 AI 协作做成聊天体验,支持任务分发、文件审查和人工审批,基于 Next.js 和 Electron 构建。