2026年 OpenClaw Telegram:ロングポーリングと Webhook はどちらを選ぶ?——リモート物理 Mac での HTTPS リバースプロキシ・登録・409/TLS タイムアウト再現 Runbook(openclaw.json 断片+FAQ)
OpenClaw と Telegram Bot を ZoneMac のリモート物理 Mac でつなぐ担当者は、ロングポーリング(getUpdates)と Webhook のどちらにすべきかで迷いがちです。前者は公開 TLS を省略しやすく、後者は低遅延で 7×24 に向きます。本稿では意思決定表、HTTPS リバースプロキシの要点、安全な setWebhook 手順、HTTP 409 と TLS ハンドシェイク・タイムアウトの再現可能な切り分け、コピペ可能な openclaw.json の骨格と FAQ をまとめます。Webhook の認証経路やトークン周りは
リモート Mac ゲートウェイの Webhook/Hooks Runbook
と併読してください。
1. 概要と対象範囲
Telegram Bot API の受信経路は大きく ロングポーリング(クライアントが getUpdates を呼び接続を維持)と Webhook(Telegram が HTTPS URL に POST)に分かれます。OpenClaw では運搬の意味論と失敗モードが読みやすいことが重要で、特に リバースプロキシの前に置いた リモート物理 Mac では、TLS・SNI・証明書チェーンの問題が getWebhookInfo の last_error_* に表れます。
SSH で openclaw.json を編集できることを前提にします。運搬方式とゲートウェイのバージョンを同じメンテナンス窓で変える前に、リリース規律は
OpenClaw のグローバル展開比較ガイド(2026)
と揃えてください。
2. よくあるつまずき
- Webhook に必要な「公開 HTTPS」を軽視する。 Telegram は検証可能なチェーンと到達可能な HTTPS(多くの場合ポート 443)を期待します。自己署名・中間欠落・LAN 内だけの DNS は TLS エラーや配信停止として現れます。
- HTTP 409 をランダムエラーとみなす。 ステージングと本番で同一トークンを共有したり、古いノードが
deleteWebhookせず残ったりするとsetWebhookが衝突します。根は 登録状態であり OpenClaw の業務ロジックではありません。 - ロングポーリングを「無料」と思う。 越境 RTT と長時間接続はジッタを増やし、キャリアによっては帯域制御の対象になります。PoC には向くが、本番では健全なエッジ付き Webhook に戻すのが一般的です。
3. 意思決定表:ロングポーリング vs Webhook
ZoneMac リモートノード向けの軽い「アーキテクチャ合意書」として使えます。
| 観点 | ロングポーリング(getUpdates) | Webhook(HTTPS) |
|---|---|---|
| 公開 DNS と証明書 | 主に外向きのみ。公開ホスト名の証明書は通常不要 | 解決可能なドメインと信頼できるチェーンが必須 |
| 遅延と背圧 | ポーリング間隔+ネットワークジッタ | イベント駆動。エッジが安定していれば通常低遅延 |
| 接続の形 | 恒久的な外向き・長時間保持 | 内向き POST。プロキシのタイムアウト/レート制限と相性が良い |
| デバッグ信号 | クライアントログ、getUpdates エラー |
getWebhookInfo(last_error_date など) |
| 向き先の例 | PoC、厳しい NAT、短期検証 | 本番 7×24、複数ワーカー、予測可能な遅延 |
4. openclaw.json 断片(例示)
構造の例です。キー名とネストは利用中の OpenClaw バージョンに合わせてください。本番ファイルは必ずバックアップし、既存の gateway や資格情報ブロックとは手でマージしてください。
4.1 Telegram チャンネル:Webhook とローカル待受
{
"channels": {
"telegram": {
"enabled": true,
"botTokenRef": "env:TELEGRAM_BOT_TOKEN",
"transport": "webhook",
"webhook": {
"publicUrl": "https://bot.example.com/openclaw/telegram/webhook",
"path": "/openclaw/telegram/webhook",
"secretTokenRef": "env:TELEGRAM_WEBHOOK_SECRET",
"maxConnections": 40,
"dropPendingUpdates": false
},
"localServer": {
"bind": "127.0.0.1",
"port": 18789,
"readTimeoutSeconds": 30,
"writeTimeoutSeconds": 30
}
}
},
"gateway": {
"reverseProxy": {
"trustedProxies": ["10.0.0.0/8"],
"forwardedHeaders": ["X-Forwarded-For", "X-Forwarded-Proto"]
}
}
}
ロングポーリングに切り替える場合は transport を "longPolling"(またはリリースの同等値)にし、timeout や allowed_updates など getUpdates 向けオプションを渡します。Telegram 側に古い Webhook URL が残っていないかも確認してください。
4.2 リバースプロキシ(Caddy スケッチ)
# TLS はエッジで終端し、Mac 上の 127.0.0.1:18789 へプロキシ。
# Host/パスは OpenClaw の登録と一致させる。ボディ上限はゲートウェイの指針に合わせて調整。
bot.example.com {
reverse_proxy 127.0.0.1:18789 {
header_up X-Forwarded-Proto {scheme}
header_up X-Forwarded-For {remote_host}
}
}
5. 七ステップ Runbook(リモート物理 Mac)
- 運搬方式を固定する。 アクティブな経路は常に一つ。ロングポーリングから Webhook に切り替えるときは、先にポーリング側を止め二重配信を避ける。
- TLS を端到端で検証する。 インターネット側からポート 443 を確認。フルチェーン・正しい SNI・ファイアウォール(Telegram の送信元レンジは公式ドキュメント参照)。
- openclaw.json をマージする。
cp openclaw.json openclaw.json.bak.$(date +%Y%m%d%H%M)のうえpublicUrl、シークレット参照、ローカル bind を設定。 - 古い Webhook 状態を掃除する。
getWebhookInfo→ URL が誤りならdeleteWebhook→ 単一の入口からsetWebhookで 409 を減らす。 - リロードしてプロセス健全性を確認する。 ディストリビューションの手順で reload。待受ポートと launchd ログにクラッシュループがないか見る。
- 正例と負例のテスト。 テストメッセージ送信。
secret_tokenを誤ったリクエストは即失敗すべき。pending_update_countも監視。インジェストの可観測性を強化するなら、同一ブログ内の Prometheus/Grafana 連携記事で/metrics取得とアラート閾値を併せて整備してください。 - 記録する。 ドメイン、証明書更新オーナー、
setWebhookパラメータ、ロングポーリングへのロールバック手順を Runbook に残す。
6. 409 と TLS タイムアウトの切り分け
| 症状 | ありがちな原因 | 対応 |
|---|---|---|
setWebhook 409 |
同一トークンに既に Webhook が登録されている/同時登録 | getWebhookInfo → 不要な登録を退避 → deleteWebhook → 一度だけ再試行 |
last_error_message に TLS/証明書 |
中間欠落、誤った SNI、HTTP のみのエッジ | openssl s_client -connect で確認。中間を修正し HTTPS を強制 |
| ハンドシェイクが遅い/間欠的成功 | 越境 RTT、短い proxy_read_timeout |
エッジ→オリジンの read タイムアウトを延長。エッジを近づける。ワーカーをブロックしない |
| Webhook パスで 401/403 | secret_token とゲートウェイの不一致 |
環境変数と setWebhook を同時に揃えローテーション |
| 遅延配信、TLS エラーなし | キュー滞留またはゲートウェイ過負荷 | pending_update_count を確認。ワーカー拡張。上流モデル呼び出しをスロットル |
7. 引用用の数値・チェック項目
- getUpdates 長時間ポーリング: Bot API では
timeoutは通常 0〜50 秒。RTT の大きい回線では控えめから。 - ローカル HTTP: 例として
127.0.0.1:18789はループバックに留め、TLS と公開面はプロキシが担当。SSH ファーストの ZoneMac ノードと整合します。 - Webhook 同時接続:
maxConnectionsはゲートウェイワーカーと上流モデルの QPS に合わせ、受け口だけが速すぎないようにする。
8. FAQ
Q: setWebhook が 409 を返すのはなぜ?
別環境に同じトークンの Webhook が残っているか、掃除を飛ばした場合が多いです。getWebhookInfo で確認し、不要なスタックでは deleteWebhook のうえ、単一の入口から setWebhook を再実行してください。
Q: TLS ハンドシェイクのタイムアウトをどう追う?
外部から openssl s_client と時間計測付き curl を実行。SNI と中間証明書を確認。数分後に getWebhookInfo.last_error_message を再読します。
Q: リモート Mac でロングポーリングが妥当なのはいつ?
Telegram が信頼する TLS を公開ホストでまだ出せないとき—PoC、厳しい NAT、証明書自動化が未成熟な段階。恒久的な外向き接続と RTT 感度という代償があります。
Q: secret_token はどこで効く?
ゲートウェイまたは OpenClaw の受口で不一致なら 401。ログだけにせず拒否。setWebhook と設定を同時に更新してください。
9. まとめと Mac mini/macOS がこのスタックに合う理由
ロングポーリングと Webhook の選択は「新しさ」ではなく、本番品質の HTTPS と単一の登録ソースを受け入れられるかどうかです。Webhook は可観測性を getWebhookInfo に寄せ、ロングポーリングは外向き経路とプロセス監視に複雑さを残します。
ZoneMac のリモート物理 Mac でこれを回すなら、Mac mini M4 クラスは待機電力がおおよそ数ワット級で、Unix ネイティブのサービス管理と launchd 常駐に馴染みます。同一筐体にリバースプロキシと OpenClaw を置けるため、無人ゲートウェイの再現性が高まります。Gatekeeper・SIP・FileVault による防御面も、長期公開ホストと相性が良いです。
Telegram の受口、TLS、OpenClaw を静音で予測可能な実機に載せたい場合、Mac mini M4 はコストと安定性のバランスが取れた出発点です。ZoneMac で専用の Apple Silicon ノードを借り、本 Runbook を実金属上でリハーサルしてみてください。
OpenClaw の Telegram Webhook を実機で再現したい
ZoneMac の Mac mini クラウドレンタルなら、ローカル待受・リバースプロキシ・ゲートウェイを 1 台に集約し、openclaw.json と HTTPS Runbook を端到端で検証できます。