Bắt đầu
Giới thiệu Pabal
Pabal là gì và được xây dựng ra sao, hiện đã làm được gì và còn gì chưa làm được.
Pabal là gì
Pabal (파발, 擺撥) là hệ thống trạm dịch thời Joseon, nơi người đưa tin thay ngựa và chạy tiếp sức để chuyển những tin khẩn cấp. Pabal.me là ứng dụng nhắn tin mang tên ấy — một ứng dụng nhắn tin tương thích Telegram mà tổ chức hay cộng đồng tự vận hành trên máy chủ của chính mình.
- Bạn tự vận hành máy chủ. Tài khoản, cuộc trò chuyện và ảnh đều được lưu trên máy chủ và cơ sở dữ liệu (PostgreSQL) của người vận hành. Chương trình máy chủ có tên là HunsTelegram (Java 21).
- Nói đúng "ngôn ngữ" của Telegram. Giữa ứng dụng và máy chủ là MTProto 2.0 (layer 216) giống Telegram; giữa bot và máy chủ là HTTP Bot API giống Telegram. Vì vậy ứng dụng, thư viện và bot viết cho Telegram kết nối được với Pabal chỉ bằng cách đổi địa chỉ.
- Một thế giới riêng, không kết nối với Telegram. Tài khoản Pabal chỉ tồn tại trên máy chủ Pabal, và không thể nhắn tin qua lại với người dùng Telegram.
Pabal được xây dựng ra sao
Giải thích sơ đồ
- Ba vùng: bên trái là những thứ chạy bên ngoài máy chủ (ứng dụng, chương trình bot, trình duyệt), ở giữa là hai cổng vào của máy chủ, bên phải là bên trong máy chủ. Chương trình bot cũng chạy bên ngoài máy chủ, trên máy tính của người vận hành hoặc nhà phát triển.
- Chỉ có hai cổng vào: ứng dụng kết nối thẳng qua cổng MTProto (8443) (MTProto tự mã hóa nên không cần HTTPS), còn trang web và Bot API đi vào qua HTTPS (443).
- Bot kết nối theo một trong hai đường: thường là Bot API qua HTTPS (nét liền), hoặc nếu muốn thì qua MTProto giống ứng dụng (nét đứt màu xanh). Đi đường nào thì vẫn là cùng một tài khoản bot, cùng một hộp thư.
- Nét đứt màu đỏ là mũi tên duy nhất đi theo chiều ngược lại: khi bot thiết lập webhook, máy chủ gửi tin mới đến địa chỉ HTTPS của chương trình bot. Tất cả các mũi tên còn lại là request từ bên ngoài đi vào máy chủ.
- Chỉ ghi ở một nơi: mọi thay đổi đều đi qua các dịch vụ và được lưu vào kho sự kiện (event store) trong PostgreSQL; chỉ ảnh gốc được để dưới dạng tệp. Tin nhắn gửi từ ứng dụng hay do bot gửi đều đi cùng một đường, nên thông báo đẩy, danh sách trò chuyện và việc khôi phục khi kết nối lại đều áp dụng như nhau cho tất cả.
Những gì đã chạy được, những gì chưa
| Tính năng | Trạng thái | Ghi chú |
|---|---|---|
| Đăng ký, đăng nhập (số điện thoại + mã) | Có | Người vận hành chọn gửi mã qua SMS, email hoặc quản trị viên chuyển trực tiếp |
| Trò chuyện 1:1, nhận tức thì, nhiều thiết bị | Có | Thiết bị đang tắt sẽ bắt kịp những gì đã lỡ khi bật lại |
| Sửa, xóa tin nhắn | Có | Cập nhật ngay trên màn hình người kia |
| Nhóm thường (tạo, thêm thành viên, xóa thành viên, đổi tên) | Có | Thành viên được thêm trực tiếp trong thông tin nhóm |
| Gửi ảnh, ảnh đại diện | Có | Chỉ lưu một kích thước ảnh gốc |
| Bot — @BotFather, HTTP Bot API, webhook, bot MTProto | Có | Nút bấm, callback, menu lệnh, ảnh, nhóm |
| Trang quản trị, cấu hình vận hành | Có | Chỉ mở trên 127.0.0.1 của máy chủ |
| Trang web 10 ngôn ngữ, trang liên kết tên người dùng và lời mời | Có | Tài liệu nhà phát triển cũng có 10 ngôn ngữ |
| Kênh, siêu nhóm | Chưa | Có thể không hiển thị đúng trong ứng dụng |
| Tệp tài liệu, video, âm thanh, album | Chưa | Gửi sẽ bị từ chối với MEDIA_INVALID |
Văn bản có định dạng (in đậm, in nghiêng), parse_mode của bot | Chưa | Gửi nguyên văn. Lệnh, lượt nhắc, liên kết và hashtag được đánh dấu tự động |
| Gọi thoại, gọi video, trò chuyện bí mật | Chưa | |
| Xác minh hai bước (mật khẩu đám mây) | Chưa | Thử thiết lập cũng bị từ chối |
| Ứng dụng điện thoại, thông báo đẩy | Chưa | Hiện chỉ có ứng dụng máy tính cho macOS |
| Vào nhóm bằng liên kết mời | Chưa | Liên kết tạo được, nhưng bấm vào không trở thành thành viên |
Chế độ inline (@bot từ-khóa), thanh toán, trò chơi | Chưa |
Quan hệ với Telegram
Pabal là một máy chủ riêng, tuân theo giao thức công khai của Telegram. Pabal không liên quan đến công ty Telegram và cũng không kết nối đến máy chủ Telegram.
- Những gì tương thích: MTProto 2.0 (4 kiểu truyền tải, bắt tay, gắn khóa tạm thời), định dạng request/phản hồi của layer 216, định dạng địa chỉ, request, phản hồi và lỗi của HTTP Bot API. Đã kiểm chứng bằng cách kết nối ứng dụng Telegram Desktop chính thức 6.2.6 mà không sửa gì (chỉ đổi địa chỉ máy chủ và khóa công khai).
- Những gì khác: tài khoản và dữ liệu tách riêng theo từng máy chủ. ID người dùng, ID tin nhắn và ID tệp chỉ có nghĩa bên trong máy chủ này. Không dùng được token bot từ Telegram; bạn phải lấy token mới từ @BotFather của Pabal.
Định dạng liên kết
Ứng dụng và máy chủ tạo liên kết bằng https://pabal.me/. Khi mở bằng trình duyệt, một trang nhỏ để mở ứng dụng sẽ hiện ra.
| Liên kết | Ý nghĩa | Địa chỉ mở trong ứng dụng |
|---|---|---|
pabal.me/<tên-người-dùng> | Mở cuộc trò chuyện với một người hoặc một bot | tg://resolve?domain=<tên-người-dùng> |
pabal.me/+<mã-mời> | Liên kết mời vào nhóm (ứng dụng mở ra, nhưng vào nhóm bằng liên kết thì chưa được) | tg://join?invite=<mã-mời> |
pabal.me/joinchat/<mã-mời> | Liên kết mời kiểu cũ (cùng ý nghĩa) | tg://join?invite=<mã-mời> |
Tên người dùng dài 5–32 ký tự, gồm chữ cái Latin, chữ số và dấu gạch dưới, bắt đầu bằng chữ cái (tên bot kết thúc bằng bot). Những tên trùng với đường dẫn mà trang web dùng, như docs, admin, health, sẽ không mở được bằng liên kết.
Mô hình bảo mật
- Ứng dụng ↔ máy chủ: được mã hóa bằng MTProto 2.0. Ứng dụng được build với khóa công khai RSA của máy chủ nhúng sẵn bên trong, nên máy chủ khác không thể giả làm máy chủ Pabal. Cuộc trò chuyện giống "cuộc trò chuyện đám mây" của Telegram, nên máy chủ đọc được nội dung (không phải mã hóa đầu cuối). Đó là lý do máy chủ phải do người đáng tin cậy vận hành.
- Bot ↔ máy chủ: Bot API chỉ được công khai qua HTTPS. Token bot chính là mật khẩu của bot — nếu bị lộ, hãy đổi bằng
/revokeở @BotFather. Token cũ và các kết nối đang dùng token đó sẽ bị ngắt ngay lập tức. - Máy chủ → webhook: máy chủ chỉ gửi request đến webhook dùng HTTPS và có địa chỉ công khai. Địa chỉ nội bộ như mạng riêng, loopback hay metadata đám mây đều bị từ chối. Bot có thể dùng
secret_tokenđể kiểm tra request có thật sự đến từ máy chủ Pabal hay không. - Quản trị: trang quản trị chỉ mở trên chính máy chủ (127.0.0.1), và phải có token mới xem được dữ liệu. Người vận hành truy cập qua tunnel SSH.
- Lưu trữ: khóa xác thực được lưu nguyên trong cơ sở dữ liệu vì máy chủ cần dùng nó để giải mã. Cơ sở dữ liệu và bản sao lưu cần được bảo vệ kỹ như khóa bí mật RSA của máy chủ.
Thuật ngữ
| Thuật ngữ | Ý nghĩa |
|---|---|
| MTProto | Giao thức mã hóa giữa ứng dụng và máy chủ do Telegram tạo ra. Pabal dùng phiên bản 2.0. |
| Layer | Phiên bản định dạng request/phản hồi trao đổi trên MTProto. Pabal dùng 216. |
| Khóa xác thực (auth key) | Bí mật 2048 bit mà ứng dụng tạo cùng máy chủ khi kết nối lần đầu. Trạng thái đăng nhập gắn với khóa này. |
| DC | Số hiệu trung tâm dữ liệu (data center) của Telegram. Ở Pabal, một máy chủ đảm nhận cả DC 1–5. |
| Update, pts | Các thay đổi như tin nhắn mới, sửa, xóa. pts là số thứ tự thay đổi của từng người dùng, giúp thiết bị bị ngắt kết nối biết mình đã lỡ những gì. |
| Peer | Đối tượng trò chuyện — người, bot, nhóm. |
| Token bot | Chuỗi có dạng <ID-bot>:<bí-mật>. Đặt vào địa chỉ Bot API để chứng minh danh tính bot. |
| Webhook | Cách máy chủ gửi tin mới đến địa chỉ HTTPS của bot, thay vì để bot tự đến lấy. |