Tài liệu nhà phát triển
Tiếng Việt

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

Người · chương trình Cổng vào Máy chủ Pabal (HunsTelegram) Ứng dụng PabalPabal.app · Telegram Chương trình botThư viện · curl Trình duyệtWeb · tài liệu · liên kết MTProto:8443 · tự mã hóa HTTPS :443Caddy (TLS tự động) GatewayMTProto 2.0 · layer 216 Bot API · webhook/bot<token>/<phương-thức> Trang web · tài liệu/ · /docs/ · /tên-người-dùng Dịch vụ Hộp thư · danh sách trò chuyện Update thời gian thực (pts) Nhóm · ảnh · hồ sơ Mã đăng ký · khóa xác thực @BotFather · danh sách bot Trang quản trị (127.0.0.1) PostgreSQLKho lưusự kiện TệpẢnh gốcdata/media Bot MTProto Webhook POST
Cấu trúc Pabal — hai cổng vào, một nơi ghi dữ liệu

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ăngTrạng tháiGhi chú
Đăng ký, đăng nhập (số điện thoại + mã)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ị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ắnCậ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)Thành viên được thêm trực tiếp trong thông tin nhóm
Gửi ảnh, ảnh đại diệnChỉ lưu một kích thước ảnh gốc
Bot — @BotFather, HTTP Bot API, webhook, bot MTProtoNút bấm, callback, menu lệnh, ảnh, nhóm
Trang quản trị, cấu hình vận hànhChỉ 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ờiTài liệu nhà phát triển cũng có 10 ngôn ngữ
Kênh, siêu nhómChưaCó thể không hiển thị đúng trong ứng dụng
Tệp tài liệu, video, âm thanh, albumChưaGử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 botChưaGử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ậtChưa
Xác minh hai bước (mật khẩu đám mây)ChưaThử thiết lập cũng bị từ chối
Ứng dụng điện thoại, thông báo đẩyChưaHiện chỉ có ứng dụng máy tính cho macOS
Vào nhóm bằng liên kết mờiChưaLiê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ơiChư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.

Ứ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 bottg://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
MTProtoGiao 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.
LayerPhiê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.
DCSố 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, ptsCá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 botChuỗi có dạng <ID-bot>:<bí-mật>. Đặt vào địa chỉ Bot API để chứng minh danh tính bot.
WebhookCách máy chủ gửi tin mới đến địa chỉ HTTPS của bot, thay vì để bot tự đến lấy.