ntfy — 仕組みと活用

PC間メッセージングの軽量アーキテクチャ

対象: 初心者 → 専門家
背景: 3PC体制 (Cockpit / MotherShip / GateKeeper) の通知基盤

ntfy とは?

ひとことで言うと「URLに向かって叫ぶと、聞いている人に届く」

curl -d "Hello!" ntfy.sh/my-topic
  • notify の略
  • オープンソースの Pub/Sub 通知サービス
  • アカウント登録 不要
  • アプリのインストール 任意
  • HTTP POST するだけでメッセージが送れる

「Slack も LINE も要らない。URL さえ知っていれば通知が飛ぶ。」

身近な例で理解する

郵便ポストに例えると

概念 ntfy 郵便
Topic ntfy.sh/my-topic ポストの住所
Publish HTTP POST 手紙を投函
Subscribe HTTP GET (polling/streaming) ポストを見に行く
サーバー ntfy.sh (公開) or 自前 郵便局
  • 住所 (Topic URL) を知っていれば 誰でも 投函・受信できる
  • 鍵をかけたければ アクセストークン を設定可能

3つの通信パターン

Publish (送信)

# CLI
ntfy pub ntfy.sh/my-topic "Hello from Mac!"

# curl
curl -d "Hello!" https://ntfy.sh/my-topic

# Python (urllib のみ、依存なし)
urlopen(Request(url, data=b"Hello!", method="POST"))

Subscribe (受信) — 2つの方式

方式 コマンド 特徴
Poll GET /topic/json?poll=1 一度だけ取得して終了
Stream GET /topic/json 接続維持、リアルタイム受信

アーキテクチャ — どう動いているか

HTTP ベースの Pub/Sub

Publisher                  ntfy.sh Server              Subscriber
   |                           |                           |
   |-- POST /topic ---------->|                           |
   |   Body: "message"        |-- push notification ----->|
   |                           |-- WebSocket ------------->|
   |                           |-- HTTP stream ----------->|
   |                           |-- cached (12h) ---------->| (poll)

サーバー側の処理:

  1. メッセージを受信 → SQLite に保存 (デフォルト12h)
  2. アクティブな subscriber に即時配信 (WebSocket / HTTP stream)
  3. モバイルは Firebase (Android) / APNs (iOS) 経由で push

ntfy vs 他のメッセージング

特徴 ntfy Slack Discord メール
アカウント 不要 必要 必要 必要
セットアップ 0分 数分 数分 -
プログラム連携 curl 1行 Webhook/API Bot/Webhook SMTP
リアルタイム Stream対応 WebSocket WebSocket ポーリング
自前サーバー 可能 不可 不可 可能
暗号化 E2E任意 TLS TLS TLS
コスト 無料 Freemium 無料 -

ntfy の強み: 依存ゼロ・設定ゼロ・HTTP だけで完結

セキュリティモデル

公開トピック vs 認証付き

公開 (デフォルト)

  • Topic URL を知っていれば誰でもアクセス
  • 秘密のURL で擬似プライベート化
  • 6ae45235f4fa-cockpit のようなランダム文字列

認証付き (セルフホスト時)

  • ユーザー/パスワード認証
  • アクセストークン
  • Topic 単位の ACL

我々の設計判断

ntfy は 通知のみ (「タスク届いたよ」レベル)
本文は GDrive (暗号化済みストレージ)
機密データは ntfy に 載せない

実装例 — pc_mesh.py

3PC 通知の実装 (Python 標準ライブラリのみ)

# 送信 — HTTP POST だけ
def send(target, message):
    topic = f"{MESH_SECRET}-{target}"     # 宛先トピック生成
    url = f"https://ntfy.sh/{topic}"
    req = Request(url, data=message.encode(), method="POST")
    req.add_header("Title", f"[cockpit] Cockpit (Mac)")
    req.add_header("Tags", "airplane,cockpit")
    urlopen(req, timeout=10)

# 受信 — HTTP GET + JSON パース
def read_messages(limit=5, since="12h"):
    topic = f"{MESH_SECRET}-{_get_node()}"
    url = f"https://ntfy.sh/{topic}/json?poll=1&since={since}"
    resp = urlopen(Request(url), timeout=10)
    return [json.loads(l) for l in resp.read().decode().split("\n") if l]

依存ライブラリ: ゼロ (urllib は Python 標準)

3PC での通信フロー

実際の動き

Cockpit (Mac)                 ntfy.sh                  MotherShip (Win)
     |                           |                           |
     |-- POST .../6ae...-mothership -->|                     |
     |   "新規引き継ぎ到着"       |-- (cached) ------------->|
     |                           |                           |
     |                           |<-- GET .../6ae...-mothership?poll=1
     |                           |--- JSON response -------->|
     |                           |                           |
     |                    ntfy.sh                   GateKeeper (Linux)
     |                           |                           |
     |-- POST .../6ae...-gatekeeper ->|                      |
     |   "ブラウザ自動化依頼"     |-- (cached) ------------->|

各PCに 専用トピック = 秘密プレフィックス-ノード名

ntfy vs Tailscale — 補完関係

よくある誤解: 「同じことをしていない?」

Tailscale = 道路 (VPN)     →  PC同士を直接繋ぐ
ntfy      = 郵便 (Pub/Sub) →  メッセージを届ける
観点 Tailscale ntfy
役割 ネットワーク接続 メッセージ配信
なくても動く? ntfy は動く 通信手段がなくなる
オフライン時 不可 不可 (HTTP 依存)
pc_mesh.py での用途 status (ノード状態) send / read (通信本体)

将来構想: Tailscale で直接 API 通信 → ntfy 不要に (低レイテンシ化)

応用 — ntfy でできること

通知以外の活用例

ユースケース 実装
CI/CD 完了通知 curl -d "Build OK" ntfy.sh/my-ci
サーバー監視アラート cron + ntfy pub
IoT センサー通知 ESP32 → HTTP POST
スマホ通知 ntfy アプリで Topic 購読
Claude Code 間連携 pc_mesh.py (今回の実装)

スマホでの受信

ntfy アプリ (Android/iOS) で 6ae45235f4fa-cockpit を購読すれば、
Mac/Windows からの通知がスマホにも届く

まとめ

ntfy のエッセンス

  1. HTTP POST/GET だけ で動く最小限の Pub/Sub
  2. アカウント不要、依存ゼロ、1行で送信可能
  3. Topic URL が通信の宛先 (知っている人だけアクセス)
  4. 機密データは載せない → 通知 + GDrive の分離設計
  5. Tailscale (VPN) とは 補完関係 — 道路 vs 郵便

設計思想: 最小限の仕組みで最大限の接続性を得る。
「シンプルに保つ」ことが、3PC体制の安定運用の鍵。

参考資料