# gramsrv
**掌控服务器,使用 MTProto,连接真正的 Telegram 客户端。**
`gramsrv` 是一个用 Go 编写的开源 Telegram 兼容服务器和 MTProto 后端,
面向自主部署网络、协议研究,以及需要真实客户端兼容能力的社区聊天系统——
它不只是一个相似的聊天界面。
[English README](README.md) · [官网](https://telesrv.net) · [OwpenGram 客户端](https://owpengram.org/) · [讨论群](https://t.me/telesrv_chat) · [频道](https://t.me/telesrv)
## telesrv-flutter:我们自己的客户端
**从服务端,到我们自己的客户端。**
我们正在用 Flutter 重新实现客户端。会话列表、聊天界面、消息与媒体、群资料面板,
已经落到实际运行的产品中。

Windows 实际运行界面。**telesrv-flutter 暂未开放下载。**
- **自己的会话组织:**文件夹导航、归档、未读标记与会话搜索。
- **自己的聊天体验:**消息气泡、引用回复、置顶消息与媒体展示。
- **自己的桌面工作区:**会话、消息与群资料并排呈现,大屏布局、主题与窗口体验可以持续演进。
Flutter 构建产品界面与交互,自有 TDLib fork 承接协议与本地状态,telesrv 提供服务端能力。
我们有能力从头构建客户端,也有能力与服务端一起演进,围绕业务场景定制整套 IM 产品。
[查看客户端介绍](https://telesrv.net/#flutter) · [咨询客户端与 IM 定制](https://t.me/telesrv_net)
Telegram Desktop 与 Android 兼容客户端截图
## Docker 一键体验
[`main`](../../tree/main) 和 [`v2`](../../tree/v2) 现在都提供同一个一行启动入口:
`main` 启动单体服务器和 Admin,`v2` 启动拆分后的 Edge/Core/Egress/File/SFU
拓扑。先安装 Git 和 Docker Desktop,把 Docker Desktop 切换到 Linux containers
并启动,然后在 PowerShell 5.1 或更高版本中执行:
```powershell
git clone --branch main --single-branch https://github.com/iamxvbaba/gramsrv.git
Set-Location gramsrv
.\scripts\start-docker.ps1
```
本机首次体验只需要这些命令。脚本会自动生成部署环境,无需登录即可从 GHCR 拉取当前
分支的现成镜像,按照依赖顺序启动全部服务并等待就绪。用户不需要安装 Go、PostgreSQL
或 Redis,也不需要本地构建镜像或执行 `docker login`。需要微服务部署时,把上面命令
中的 `main` 改为 `v2`。
- 开发环境登录验证码固定为 **`12345`**。
- 零参数启动默认只监听 `127.0.0.1`,供同一台电脑上的客户端体验。
- 两个分支都提供客户端使用的匹配[公开测试公钥](deploy/docker/assets/test-server-rsa.pub)。
- 账号、数据库、媒体、Redis 状态和 RSA 身份保存在 Docker named volumes 中,重建容器
或正常执行 Compose 停止后仍会保留。
- 不带 `-Build` 会直接使用发布镜像;`-Build` 仅用于验证本地源码修改。重启本地构建的
镜像时加 `-NoPull`(`start-docker.sh` 为 `--no-pull`),避免被发布镜像覆盖。
如果 Windows 提示禁止运行 PowerShell 脚本,只为当前 PowerShell 窗口临时放行后重试:
```powershell
Set-ExecutionPolicy -Scope Process Bypass
.\scripts\start-docker.ps1
```
局域网临时体验时,把示例地址替换为 Windows 宿主机的局域网地址:
```powershell
.\scripts\start-docker.ps1 `
-AdvertiseIP 192.168.1.20 `
-PublicBaseURL http://192.168.1.20:2401 `
-PublicWebBaseURL http://192.168.1.20:2401 `
-AllowInsecureDevelopmentAuth
```
局域网明文 HTTP 地址下,服务会记录一条警告并关闭 Star 礼物提现链接(提现 URL 是 bearer
链接,loopback 之外只允许 HTTPS),其余功能照常可用;需要提现时改用 HTTPS 的 public base URL。
官方 Telegram 客户端需要修改服务器 endpoint 和 RSA key 才能连接;请从
[项目官网](https://telesrv.net)获取兼容客户端。`main` 默认让包含 SFU/TURN 的单体服务
使用宿主网络;宿主不支持时传入 `-BridgeNetwork`。拆分拓扑、端口与防火墙、备份、升级
和远程访问说明见 [`v2` Docker 部署手册](../../blob/v2/docs/docker-deployment.md)。
## 为什么选择 gramsrv
大多数 Telegram clone 复刻的是界面;`gramsrv` 实现的是服务器协议,让兼容
客户端能够通过你掌控的基础设施进行通信。
- 完整的 MTProto transport、认证、加密 session、RPC 调度、updates 和多端同步。
- 覆盖聊天、频道、媒体、reactions、gifts、bots、通话和管理功能的实用能力集。
- 从协议接入、业务服务到存储和实时媒体,服务器代码全部开放。
- 面向兼容性研究、实验和长期社区协作的 Go 代码库。
协议栈基于已发布的
[`github.com/iamxvbaba/td`](https://github.com/iamxvbaba/td) module,
并持续跟进 Telegram Desktop 的真实 wire 行为。
## 选择适合的架构
| 分支 | 架构 | 适用场景 |
|---|---|---|
| [`main`](../../tree/main) | 单体 | 单进程运行,适合开发、体验和较小规模的部署。 |
| [`v2`](../../tree/v2) | 微服务 | 独立服务边界,面向扩展性、可靠性和生产化运行。 |
## v2 架构一览
```mermaid
%%{init: {"theme":"neutral","flowchart":{"curve":"basis","nodeSpacing":32,"rankSpacing":48}}}%%
flowchart LR
Clients["Telegram 客户端
Desktop · Android · iOS · Web"]
Edge["Edge
MTProto · sessions"]
Core["Core
业务 RPC"]
Egress["Egress
可靠投递"]
FileData["FileData
媒体字节"]
SFU["SFU
实时媒体"]
Postgres[("PostgreSQL
业务状态 · outbox")]
Redis[("Redis
位置 · 推送 · 控制")]
Blob[("Blob 存储")]
Clients <-->|MTProto| Edge
Edge -->|"CoreExec gRPC
TL bytes"| Core
Core -->|"业务状态 + 持久事件"| Postgres
Egress -->|"领取 · 投影 · ACK"| Postgres
Egress -->|"有界投递"| Redis
Redis -->|"推送 / 控制"| Edge
Edge -->|"客户端 ACK gRPC"| Egress
Core -->|协调| Redis
Edge -->|FileData gRPC| FileData
Core -->|FileData gRPC| FileData
FileData --> Blob
Core -->|SFU 控制| SFU
SFU -->|"注册 / 所有权"| Redis
Clients <-->|"语音 · 视频"| SFU
```
长连接留在 Edge,业务执行留在 Core,可靠更新则通过 Egress 持久化投递。
## 当前能力
- 账号、联系人、用户资料、隐私、在线状态和多会话。
- 私聊、群组、超级群、频道、话题、邀请链接和公开链接。
- Durable updates、dialogs、已读状态、草稿、reactions、离线恢复和多端同步。
- 照片、文档、stickers、GIF、语音消息、网页预览、上传和下载。
- Gifts、Stars、Premium、bots、mini apps、翻译和 AI 输入辅助。
- 私聊通话信令、群通话、RTMP 直播和独立 SFU 媒体面。
Telegram Desktop 是第一兼容目标,Android、iOS 和 Web 路径也在持续覆盖。
部分高级功能仍以兼容性验证或实验为主,但对应实现都开放在本仓库中。与官方 Telegram
有意不同的行为列在 [docs/telegram-differences.md](docs/telegram-differences.md)(英文)。
## 客户端
官方 Telegram 客户端信任 Telegram 生产环境的 DC 列表和 RSA keys,因此不能
直接连接私有服务器。你可以使用[项目官网](https://telesrv.net)提供的兼容客户端,
也可以自行构建只修改 endpoint 和 key 的客户端。
[OwpenGram](https://owpengram.org/) 是一个支持多服务器的 Telegram 风格客户端,
内置 `gramsrv` 支持,可以在官方网络、私有部署和社区节点之间切换。它只需 `host:port`
即可添加服务器:MTProto 端口提供 `/owpengram/server-info`,包含公开 RSA 公钥、DC 以及
在管理面板设置的 Server identity。
## 一起建设
欢迎提交兼容性报告、聚焦的修复、测试和性能优化。最有价值的问题报告应包含
客户端版本、可复现步骤,以及受影响的 RPC 或功能路径。
贡献者:[ajarshia](https://github.com/ajarshia) — Android Persian (`fa`) 语言包。
## 授权与独立性
`gramsrv` 使用 [Apache License 2.0](LICENSE) 发布。本项目是独立的非官方项目,
与 Telegram 官方及其团队没有关联,也未获得其背书或赞助。