はじめに
Pabal の紹介
Pabal とは何か、どのように構成されているか、今できることとまだできないこと。
Pabal とは
擺撥(パバル、파발)は、朝鮮時代に馬を乗り継ぎながら急ぎの知らせを走り継いだ駅站の制度です。Pabal.me はその名を取ったメッセンジャーで、組織やコミュニティが自前のサーバーで運用する Telegram 互換のメッセンジャーです。
- サーバーを自分で運用します。アカウント・会話・写真はすべて、運営者のサーバーとデータベース(PostgreSQL)に保存されます。サーバープログラムの名前は HunsTelegram(Java 21)です。
- Telegram と同じ言葉を話します。アプリとサーバーの間は Telegram と同じ MTProto 2.0(レイヤー 216)、ボットとサーバーの間は Telegram と同じ HTTP Bot API です。そのため、Telegram 用に作られたアプリ・ライブラリ・ボットが、アドレスを変えるだけで Pabal に接続できます。
- Telegram とはつながっていない、別の世界です。Pabal のアカウントは Pabal サーバーにしか存在せず、Telegram のユーザーとメッセージをやり取りすることはできません。
AI エージェントとの会話:音声ボットが有効になると、ボットはメッセージに答え、電話にも出ます。同じボットに、パソコンではメッセージで尋ね、スマートフォンや Apple Watch から電話をかけられ、誰でも @BotFather でそうしたボットを作れます。まだ準備中で、何ができるのか、データがどこへ行くのかは AI エージェントにまとめました。
どのように構成されているか
図の説明
- 3 つの領域:左はサーバーの外で動くもの(アプリ・ボットプログラム・ブラウザー)、中央はサーバーの 2 つの入口、右はサーバーの内部です。ボットプログラムもサーバーの外、運営者や開発者のコンピューターで動きます。
- 入口は 2 つだけです:アプリは MTProto ポート(8443)に直接接続し(MTProto 自体が暗号化するため HTTPS は不要)、Web サイトと Bot API は HTTPS(443)から入ります。
- ボットは 2 つの経路のどちらかで接続します:通常は HTTPS の Bot API(実線)ですが、必要ならアプリと同じ MTProto(青い点線)でも接続できます。どちらでも同じボットアカウント・同じメッセージボックスです。
- 赤い点線は逆向きに進む唯一の矢印です:ボットが Webhook を設定すると、サーバーがボットプログラムの HTTPS アドレスに新着を送ります。それ以外はすべて、外からサーバーに入ってくるリクエストです。
- 記録は 1 か所です:すべての変更はサービスを経て PostgreSQL のイベントストアに残り、写真の原本だけをファイルとして置きます。アプリから送ったメッセージも、ボットが送ったメッセージも同じ経路を通るため、プッシュ・会話一覧・再接続時の復旧がすべてに同じように適用されます。
上の図はメッセージが通る道です。音声ボットを有効にしたサーバーには、通話用の入口がさらに加わります — 通話中継(UDP 3478)と Apple Watch の音声のエッジ(WSS)。その道は AI エージェントに描きました。
今できること、まだできないこと
| 機能 | 状態 | メモ |
|---|---|---|
| 登録・ログイン(電話番号 + コード) | 対応 | コードは SMS・メール・管理者による伝達から運営者が選ぶ |
| 1 対 1 の会話、リアルタイム受信、複数端末 | 対応 | 電源が切れていた端末は、再び起動すると見逃した分に追いつく |
| メッセージの編集・削除 | 対応 | 相手の画面にもすぐ反映 |
| 基本グループ(作成・メンバーの追加・削除・名前) | 対応 | メンバーはグループ情報から直接追加 |
| 写真の送信、プロフィール写真 | 対応 | 原本の 1 サイズのみ保存 |
| ファイルの送信(すべての形式) | 対応 | 名前・形式はそのまま。10MB を超えると upload.saveBigFilePart、既定の上限は 2GB |
| ボット — @BotFather、HTTP Bot API、Webhook、MTProto ボット | 対応 | ボタン・コールバック・コマンドメニュー・写真・ファイル・グループ |
| 管理画面、運用設定 | 対応 | サーバーの 127.0.0.1 でのみ開く |
| Web サイト(10 言語)、ユーザー名・招待リンクのページ | 対応 | 開発者ドキュメントも 10 言語 |
| 1 対 1 の通話 | 対応 | 異なるネットワーク間の通話は、サーバーのリレー(TURN)の設定による |
| プッシュ通知 — Android | 対応 | アプリを閉じていてもメッセージの通知と着信音。運営者が Firebase を設定する必要がある(サーバーのインストール) |
| 通知 — macOS・Windows | 対応 | アプリが起動している間、コンピューターの通知で表示(プッシュなし) |
| ログイン中の端末の確認・終了(設定の端末) | 対応 — 実際のアプリでの確認前 | ログインして 24 時間たっていない端末は、ほかの端末を終了できない(Android・デスクトップのアプリにはその案内が出ない)。サーバーのテストで確認済みで、実際のアプリで最後まで確かめるのはこれから — アプリの使い方 — アカウントを守る |
| データのエクスポート(デスクトップアプリ) | 対応 — 実際のアプリでの確認前 | 会話・写真・ファイルとアカウント情報。開始は 1 日 3 回まで、サーバーが再起動したら最初から。Telegram にある待ち時間・ほかの端末での許可・エクスポートの記録はまだない。デスクトップが送るリクエストを同じ順に送ってテストしており、実際のアプリで最後まで確かめるのはこれから |
| 電話番号の変更 | 既定でオフ | 運営者が有効にすると、新しい番号に SMS でコード(SMS を設定したサーバーのみ) — 管理と設定 — 登録・ログインのコード |
| チャンネル、スーパーグループ | 未対応 | アプリで正しく表示されないことがある |
| 動画・音声メッセージ | 未対応 | ファイルとしては送れますが、アプリ内で再生はされません |
| アルバム(複数をひとまとめに) | 未対応 | 一度に複数を送っても届きはしますが、まとまらずに 1 件ずつ別々に表示されます |
書式付きテキスト(太字・斜体)、ボットの parse_mode | 未対応 | 文字どおりに送られる。コマンド・メンション・リンク・ハッシュタグは自動で表示 |
| グループ通話、シークレットチャット | 未対応 | |
| 2 段階認証(クラウドパスワード) | 未対応 | 設定しようとしても拒否される |
| iPhone アプリ | 準備中 | 最初のバージョン(1.0)を App Store の審査に提出済み(2026-09-23)。1.0 にはプッシュ通知がないため、アプリを開いている間にメッセージを受け取る。プッシュを含む 1.1 は社内テスト(TestFlight)中 |
| 招待リンクでグループに参加 | 未対応 | リンクは作成できるが、押してもメンバーにならない |
インラインモード(@ボット 検索語)、決済、ゲーム | 未対応 | |
| 音声ボット(ボットに電話すると AI が応答) | 準備中 | サーバー・法的文書・確認画面を含むアプリがそろって初めて有効になる。pabal.me では無効、開発サーバーで試験中 — 音声ボット |
| Apple Watch アプリ(音声ボットの通話) | 準備中 | 社内テスト(TestFlight)のみ。iPhone なしでウォッチから音声ボットに電話 — アプリの使い方 — Apple Watch |
| 会話を残す(通話の会話を自分のチャットに文字で) | 準備中 | 確認画面の文言の法的な確認の前 — アプリの使い方 — 音声ボット |
| ボットからの電話(許可したボットが AI の声で自分に電話) | 無効 | 法的な確認待ち。許可画面の入ったアプリのビルドもまだない — アプリの使い方 — ボットからの電話を許可する |
Telegram との関係
Pabal は、Telegram の公開されたプロトコルに従う独立したサーバーです。Telegram 社とは関係がなく、Telegram のサーバーに接続することもありません。
- 互換性があるもの:MTProto 2.0(4 種類のトランスポート、ハンドシェイク、一時キーのバインド)、レイヤー 216 のリクエスト・レスポンス形式、HTTP Bot API のアドレス形式・リクエスト・レスポンス・エラー形式。公式の Telegram Desktop 6.2.6 を改変せずに(サーバーアドレスと公開鍵だけを変えて)接続し、確認しました。
- 異なるもの:アカウントとデータはサーバーごとに別々です。ユーザー ID・メッセージ ID・ファイル ID は、このサーバーの中でのみ意味を持ちます。Telegram で使っていたボットトークンは使えず、Pabal の @BotFather から新しく受け取る必要があります。
リンクの形式
アプリとサーバーは https://pabal.me/ でリンクを作ります。ブラウザーで開くと、アプリを開くための小さなページが表示されます。
| リンク | 意味 | アプリで開くアドレス |
|---|---|---|
pabal.me/<ユーザー名> | 人やボットとの会話を開く | tg://resolve?domain=<ユーザー名> |
pabal.me/+<招待コード> | グループの招待リンク(アプリは開くが、リンクからの参加はまだできない) | tg://join?invite=<招待コード> |
pabal.me/joinchat/<招待コード> | 以前の形式の招待リンク(意味は同じ) | tg://join?invite=<招待コード> |
ユーザー名は、英字で始まる英字・数字・アンダースコアの 5〜32 文字です(ボットは bot で終わる)。docs、admin、health のようにサイトが使うパスと同じ名前は、リンクでは開けません。
セキュリティモデル
- アプリ ↔ サーバー:MTProto 2.0 で暗号化されます。アプリはサーバーの RSA 公開鍵を組み込んでビルドされるため、別のサーバーが Pabal サーバーになりすますことはできません。会話は Telegram の「クラウドチャット」と同じで、サーバーは内容を読むことができます(エンドツーエンド暗号化ではありません)。信頼できる人がサーバーを運用しなければならないのはこのためです。
- ボット ↔ サーバー:Bot API は HTTPS でのみ公開します。ボットトークンはボットのパスワードです — 漏れた場合は @BotFather で
/revokeを使って変更してください。以前のトークンと、そのトークンによる接続はただちに切断されます。 - サーバー → Webhook:サーバーは、HTTPS かつグローバルアドレスの Webhook にのみリクエストを送ります。プライベートネットワーク・ループバック・クラウドのメタデータのような内部アドレスは拒否します。ボットは
secret_tokenを使って、リクエストが本物の Pabal サーバーから来たかどうかを確認できます。 - サーバー → Android の通知:プッシュ通知は Google の Firebase Cloud Messaging(FCM)を経由します。通知の内容(送信者の名前、メッセージのプレビュー)は、サーバーがその端末だけが持つ鍵で暗号化して送るため Google には読めず、Google が見るのはデバイストークンや送信時刻といった配信情報だけです。運営者は、通知からメッセージの内容を完全に省くこともできます。
- サーバー → iPhone の通知:iPhone のプッシュ通知は Apple の APNs を経由します。Android と同じ方式で、Apple に見える表の文言は「新しい通知があります」だけで、送信者と内容はその端末だけが持つ鍵で暗号化され、スマートフォンの中で復号されます。プッシュを含むアプリのビルド(1.1)からです。
- 音声ボットの通話(準備中):ボットとの通話は、人と人との通話とは違い、エンドツーエンド暗号化ではありません。Pabal の音声ゲートウェイが音声を復号して AI モデルに渡し、既定のエンジンを使うと通話の音声は米国(Google Cloud
us-central1)の Google へ送られます。運営者が決められること — サーバーを自ら運営する、ボットのオーナーのモデルキー、ストリームモード、運営者のスイッチ — は AI エージェント — 自分たちで決められることにあります。 - 管理:管理画面はサーバー自身(127.0.0.1)でのみ開き、トークンがなければデータを見られません。運営者は SSH トンネルで入ります。
- 保存:認証キーはサーバーが復号に使う必要があるため、データベースにそのまま入っています。データベースとバックアップは、サーバーの RSA 秘密鍵と同じくらい厳重に守る必要があります。
用語
| 用語 | 意味 |
|---|---|
| MTProto | Telegram が作った、アプリとサーバーの間の暗号化プロトコル。Pabal は 2.0 を使います。 |
| レイヤー(layer) | MTProto の上でやり取りされるリクエスト・レスポンス形式の版。Pabal は 216 です。 |
| 認証キー(auth key) | アプリがはじめて接続するときにサーバーと作る 2048 ビットの秘密。ログインはこのキーに紐づきます。 |
| DC | Telegram のデータセンター番号。Pabal では、1 台のサーバーが DC 1〜5 をすべて担当します。 |
| アップデート、pts | 新しいメッセージ・編集・削除のような変化。pts はユーザーごとの変化の通し番号で、切断されていた端末が何を見逃したかを知るために使います。 |
| プッシュ通知 | アプリが閉じているときや画面の外にあるときに、端末を起こして知らせる仕組み。Pabal は Android アプリには Google FCM で、iPhone アプリには Apple APNs で送ります。 |
| ピア(peer) | 会話の相手 — 人、ボット、グループ。 |
| ボットトークン | <ボット ID>:<シークレット> 形式の文字列。Bot API のアドレスに入れて、ボットであることを証明します。 |
| Webhook | ボットが新着を取りに来る代わりに、サーバーがボットの HTTPS アドレスへ送る方式。 |
| AI エージェント | メッセージに答え、電話にも出るボット。Pabal では音声を有効にしたボットです(準備中)。 |
| 音声ボット | 人が電話をかけられるボット。通話に出るのはボットのオーナーのコードではなく AI 音声モデルです。 |
| 音声ゲートウェイ | ボットに代わって通話の一方の端となり、音声を復号して AI モデルとやり取りする Pabal の部品(pabal-voice)。アプリが接続する MTProto のゲートウェイとは別物です。 |
| ストリームモード | AI モデルの代わりに、ボット開発者のサーバーが通話の音声を直接受け取る音声ボットの方式。 |
| 会話を残す | 電話をかける人が選ぶと、通話が終わったあとその会話を自分のチャットだけに文字で残すこと。ボットにもボットのオーナーにも送られません。 |