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.
Trò chuyện với tác tử AI: khi bot thoại được bật, bot vừa trả lời tin nhắn vừa nhận cuộc gọi. Bạn có thể hỏi cùng một bot bằng tin nhắn trên máy tính, rồi gọi cho nó bằng điện thoại hoặc Apple Watch, và bất kỳ ai cũng có thể tạo bot như vậy bằng @BotFather. Tính năng này đang được chuẩn bị; những gì làm được và dữ liệu đi về đâu được tập hợp ở trang Tác tử AI.
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à yêu cầu 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ả.
Sơ đồ trên là đường đi của tin nhắn. Máy chủ bật bot thoại có thêm các điểm vào dành cho cuộc gọi — máy chủ chuyển tiếp cuộc gọi (UDP 3478) và điểm vào âm thanh của Apple Watch (WSS). Đường đi đó được vẽ ở trang Tác tử AI.
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 cơ bản (tạo, thêm thành viên, mời ra khỏi nhóm, đổ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 |
| Gửi tệp (mọi định dạng) | Có | Giữ nguyên tên và định dạng. Quá 10MB thì dùng upload.saveBigFilePart, giới hạn mặc định 2GB |
| Bot — @BotFather, HTTP Bot API, webhook, bot MTProto | Có | Nút bấm, callback, menu lệnh, ảnh, tệp, 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ữ |
| Gọi 1:1 | Có | Cuộc gọi giữa hai mạng khác nhau phụ thuộc vào cấu hình chuyển tiếp (TURN) của máy chủ |
| Thông báo đẩy — Android | Có | Báo tin nhắn và đổ chuông cuộc gọi ngay cả khi ứng dụng đang tắt. Người vận hành phải thiết lập Firebase (Cài đặt máy chủ) |
| Thông báo — Mac, Windows | Có | Hiện thành thông báo của máy tính khi ứng dụng đang mở (không có thông báo đẩy) |
| Xem và đăng xuất các thiết bị đang đăng nhập (mục Thiết bị trong cài đặt) | Có — chưa kiểm tra bằng ứng dụng thật | Thiết bị mới đăng nhập chưa đủ 24 giờ không đăng xuất được thiết bị khác (ứng dụng Android và máy tính không hiện thông báo nào). Đã kiểm tra bằng các bài thử của máy chủ; chưa kiểm tra trọn vẹn bằng ứng dụng thật — Sử dụng ứng dụng — Bảo vệ tài khoản |
| Xuất dữ liệu (ứng dụng máy tính) | Có — chưa kiểm tra bằng ứng dụng thật | Cuộc trò chuyện, ảnh, tệp và thông tin tài khoản. Tối đa ba lần bắt đầu mỗi ngày; máy chủ khởi động lại thì phải làm lại từ đầu. Chưa có thời gian chờ, sự cho phép từ thiết bị khác và nhật ký xuất như Telegram. Đã thử bằng các yêu cầu mà ứng dụng máy tính gửi, theo đúng thứ tự; chưa kiểm tra trọn vẹn bằng ứng dụng thật |
| Đổi số điện thoại | Mặc định tắt | Khi người vận hành bật, mã được gửi bằng SMS đến số mới (chỉ trên máy chủ đã cài đặt SMS) — Quản trị và cấu hình — Mã đăng ký và đăng nhập |
| Kênh, siêu nhóm | Chưa | Có thể không hiển thị đúng trong ứng dụng |
| Tin nhắn video, tin nhắn thoại | Chưa | Gửi được dưới dạng tệp, nhưng không phát ngay trong ứng dụng |
| Album (gộp nhiều tệp thành một nhóm) | Chưa | Gửi nhiều tệp cùng lúc thì tất cả đều đến nơi, nhưng hiện ra từng cái một chứ không gộp thành nhóm |
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 nhóm, trò chuyện bí mật | Chưa | |
| Xác minh hai bước (mật khẩu đám mây) | Chưa | Nếu thử thiết lập sẽ bị từ chối |
| Ứng dụng iPhone | Đang chuẩn bị | Phiên bản đầu tiên (1.0) đã được gửi xét duyệt App Store (2026-09-23). Bản 1.0 chưa có thông báo đẩy nên chỉ nhận tin nhắn khi ứng dụng đang mở. Bản 1.1 có thông báo đẩy đang được thử nghiệm nội bộ (TestFlight) |
| Vào nhóm bằng liên kết mời | Chưa | Tạo được liên kết, nhưng bấm vào vẫn không trở thành thành viên |
Chế độ inline (@bot từ-khóa), thanh toán, trò chơi | Chưa | |
| Bot thoại (gọi cho bot thì AI trả lời) | Đang chuẩn bị | Chỉ bật khi đã có máy chủ, văn bản pháp lý và ứng dụng có màn hình xác nhận. Trên pabal.me đang tắt, đang thử nghiệm trên máy chủ phát triển — Bot thoại |
| Ứng dụng Apple Watch (gọi bot thoại) | Đang chuẩn bị | Chỉ thử nghiệm nội bộ (TestFlight). Gọi bot thoại bằng đồng hồ mà không cần iPhone — Sử dụng ứng dụng — Apple Watch |
| Lưu cuộc trò chuyện (lưu nội dung cuộc gọi thành văn bản trong cuộc trò chuyện của mình) | Đang chuẩn bị | Trước khi rà soát pháp lý câu chữ trên màn hình xác nhận — Sử dụng ứng dụng — Bot thoại |
| Cuộc gọi từ bot (bot bạn đã cho phép gọi cho bạn bằng giọng AI) | Tắt | Chờ rà soát pháp lý; cũng chưa có bản ứng dụng có màn hình cho phép — Sử dụng ứng dụng — Cho phép bot gọi cho bạn |
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 yêu cầu/phản hồi của layer 216, định dạng địa chỉ, yêu cầu, 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 yêu cầu đế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 yêu cầu có thật sự đến từ máy chủ Pabal hay không. - Máy chủ → thông báo Android: thông báo đẩy đi qua Firebase Cloud Messaging (FCM) của Google. Nội dung thông báo (tên người gửi, bản xem trước tin nhắn) được máy chủ mã hóa bằng khóa mà chỉ chiếc điện thoại đó có rồi mới gửi đi, nên Google không đọc được mà chỉ thấy thông tin chuyển phát như token thiết bị và thời điểm gửi. Người vận hành cũng có thể bỏ hẳn nội dung tin nhắn khỏi thông báo.
- Máy chủ → thông báo iPhone: thông báo đẩy trên iPhone đi qua APNs của Apple. Cũng giống Android, dòng chữ bên ngoài mà Apple thấy chỉ là "có thông báo mới"; người gửi và nội dung được mã hóa bằng khóa mà chỉ thiết bị đó có và được giải mã ngay trên điện thoại. Áp dụng từ bản build ứng dụng có thông báo đẩy (1.1).
- Cuộc gọi bot thoại (đang chuẩn bị): khác với cuộc gọi giữa người với người, cuộc gọi với bot không được mã hóa đầu cuối. Gateway thoại của Pabal giải mã âm thanh rồi chuyển cho mô hình AI, và với engine mặc định, âm thanh cuộc gọi được gửi tới Google ở Hoa Kỳ (Google Cloud
us-central1). Những gì người vận hành tự quyết định được — tự vận hành máy chủ, khóa mô hình của chủ bot, chế độ âm thanh gốc, các công tắc của người vận hành — có ở Tác tử AI — Những gì chúng ta tự quyết định được. - 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 yêu cầu/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ì. |
| Thông báo đẩy | Cách đánh thức điện thoại để báo tin khi ứng dụng đang tắt hoặc không ở trên màn hình. Pabal gửi thông báo đẩy đến ứng dụng Android qua Google FCM và đến ứng dụng iPhone qua Apple APNs. |
| 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. |
| Tác tử AI (AI agent) | Bot vừa trả lời tin nhắn vừa nhận cuộc gọi. Trên Pabal, đó là bot đã bật thoại (đang chuẩn bị). |
| Bot thoại | Bot mà người dùng có thể gọi điện. Người nhận cuộc gọi không phải mã của chủ bot mà là một mô hình giọng nói AI. |
| Gateway thoại | Thành phần của Pabal (pabal-voice) thay bot làm một đầu của cuộc gọi, giải mã âm thanh và trao đổi với mô hình AI. Khác với gateway MTProto mà ứng dụng kết nối tới. |
| Chế độ âm thanh gốc | Cách hoạt động của bot thoại trong đó máy chủ của nhà phát triển bot nhận trực tiếp âm thanh cuộc gọi thay cho mô hình AI. |
| Lưu cuộc trò chuyện | Nếu người gọi chọn, sau khi cuộc gọi kết thúc, nội dung trò chuyện được lưu thành văn bản chỉ trong cuộc trò chuyện của chính người đó. Không gửi cho bot hay chủ bot. |