コンテンツにスキップ

連合のしくみ

Ubichill のサーバーは、お互いに連合します。どのサーバーの人ともフレンドになれて、招待し合えて、相手のサーバーの部屋に入れます。 全部を握る中央のサーバーはありません。

もの だれが決めるか 住所
人 その人のホームサーバー @ID@ドメイン(例 @[email protected])
部屋(インスタンス) 部屋のあるサーバー 部屋ID@ドメイン(例 [email protected])
作品(ワールド・mod) 作者が置いた URL と作者の署名 https://yokan.github.io/worlds/chill-room.yaml
  • フレンドの関係・通知・公開環境(署名の鍵)など「人のこと」は、ホームサーバーが持ちます。
  • 部屋にだれがいるか・公開範囲・入れるかどうかは、部屋のサーバーしか知らず、部屋のサーバーが判断します。
  • ワールドや mod は、どのサーバーとも無関係な URL に置けます。サーバーは URL から読み込んで部屋を開きます。
  • 探す: 検索に @ID@ドメイン と打つと、そのサーバーに問い合わせて結果が出ます。プロフィール・フレンドの操作も同じ画面です。
  • フレンド: 申請・承認・解除は同じボタンです。相手のサーバーへ届くまで少し時間がかかることがあります(届くまで送り直します)。
  • 部屋: フレンドの現在地に、ほかのサーバーの部屋も同じカードで出ます(地球のアイコンとドメイン付き)。「入る」も「リクエスト」も同じです。
  • 入る: 部屋ID@ドメイン の部屋に入ると、画面は自分のサーバーのまま、部屋のサーバーにつながります。URL にトークンは載らず、リダイレクトもしません。
  • 招待: ほかのサーバーのフレンドにも招待・リクエストを送れます。ほかのサーバーの人からの招待・リクエストは、フレンドからのものだけ受け取ります。

公開範囲や招待の規則は、部屋のサーバーが決めます。内容は自分のサーバーの部屋と同じです(公開範囲・フレンド・招待)。

Misskey・Mastodon から見る・フォローする

Section titled “Misskey・Mastodon から見る・フォローする”

Ubichill のアカウントは、Misskey や Mastodon などフェディバースのサービスからも見えます。

  • 検索に @ID@ドメイン(例 @[email protected])と打つと、名前・アイコン・自己紹介と、作ったワールドが出ます。
  • そのままフォローできます。フォローはフレンドとは別の片方向の関係で、フォロワーに見えるのはプロフィールだけです。現在地・来訪・招待はフレンドだけ。
  • フォローを承認制にするか、検索に出すかは、設定のフェディバースの項目で選べます。承認制にすると承認待ちが通知に届きます。
  • Ubichill からフェディバースへの投稿(ノート)は、これから足します。

ほかのサーバーの部屋に入る流れ

Section titled “ほかのサーバーの部屋に入る流れ”
あなたのブラウザ ── 入室を頼む ──▶ ホーム A
ホーム A ── 署名付きで入室を頼む(本人の鍵・使い捨ての nonce)──▶ 部屋のサーバー B
B: 見えるか・入れるか・満員でないか・A からの来訪者が 20 人未満か → 入室チケットを返す
ホーム A ── チケットと接続先 ──▶ あなたのブラウザ ── WebSocket ──▶ B のインスタンスサーバー
  • チケットは、あなたの画面(ホーム A)の origin に結び付いています。別の画面では使えません。
  • WebSocket の接続先は部屋のサーバーと同じホスト名に限られます。
  • 一度入れた部屋には、部屋が続く間は招待なしで入り直せます。
  • ワールドの中身と mod の lock は部屋のサーバーが配ります。mod は、いつもどおり作者の署名が確かめられてから動きます。
面 何を どう
知らせ(ActivityPub) 人から人への知らせ。フレンドの申請・承認・解除、招待、リクエストインバイト、プロフィールの更新 相手の inbox へ ActivityStreams 2.0 の activity を送る。非同期で、届くまで送り直す
部屋への問い(RPC) 入室、招待の権利、部屋が見えるか、フレンドの現在地 /federation/v1/... へ署名付きの POST。その場で部屋のサーバーが答える

フレンド・招待・来訪の相手は Ubichill のサーバーだけです。Mastodon などとはフォローの関係だけを持ちます(上の「Misskey・Mastodon から見る・フォローする」)。

  • サーバー間の署名は Ed25519 だけで、HTTP メッセージ署名(RFC 9421)と Content-Digest(RFC 9530)を使います。
  • 人・サーバー・部屋のそれぞれが actor(https://<ドメイン>/ap/users/<ID>・/ap/actor・/ap/instances/<部屋ID>)を持ち、actor ごとに鍵があります。
  • 署名は宛先に縛られ(受け手は自分の正規の origin で確かめる)、別のサーバーへ転用できません。入室などの権利を返す問いには使い捨ての nonce が要ります。
  • 受け取った文書は、取りに行った URL と id が同じこと、inbox が同じ origin であること、WebFinger の往復が合うことを確かめます(origin による信頼)。

利用者の作品の署名(作者署名)とは別の鍵です。作者署名は 署名して公開する を見てください。

  • /.well-known/webfinger: 人を探す
  • /.well-known/nodeinfo → /nodeinfo/2.1: Ubichill のサーバーかどうか
  • 機能はサーバーの actor が告知し、使う前に相手が告知しているかを見ます

知っているサーバーは、連絡がつくたびに自動で記録されます。管理者が手で登録する必要はありません。

既定では、どの Ubichill のサーバーとも連合します。問題のあるサーバーだけを絞ります(設定 → 連合)。

方針 意味
連合する 既定
新しいつながりを受けない 新しい申請・招待・リクエスト・来訪を受けない。いまあるフレンドはそのまま
連合しない 送受信・取得をすべてやめ、そのサーバーの人とのフレンドも切る

サブドメイン・ポート違いにも効きます(spam.example を止めれば a.spam.example も止まります)。

ワールドの一覧に、ほかのサーバーのワールドを出す

Section titled “ワールドの一覧に、ほかのサーバーのワールドを出す”

管理者(公式アカウント)が設定 → 連合 → ほかのサーバーで、相手のサーバーをフォローすると、相手のサーバーの作者が公開したワールドが「グローバル」の一覧に出ます。 一覧に書かれた署名の状態は信用せず、自分のサーバーが各ワールドを取得して署名を確かめます。

環境変数 意味
FEDERATION_KEY_SEED 鍵の種(32 バイト以上)。本番では必須。無ければ連合しない
FEDERATION_ENABLED=false 連合を止める
FEDERATION_ALLOW_HTTP=true 開発で http の相手を受ける(本番では効かない)
INSTANCE_FEDERATED_VISITS(インスタンスサーバー) ほかのサーバーの画面からの接続を受ける(既定 true)
  • Ingress は /ap・/federation・/.well-known/nodeinfo・/nodeinfo・/.well-known/webfinger をバックエンドへ送ります。
  • 画面とバックエンドは同じホスト名で配ります(入室チケットを画面の origin に結び付けるため)。

Helm での建て方は 自分のサーバーを建てる を見てください。

  • ほかのサーバーのパブリックな部屋を探す一覧は、まだありません(予定)。
  • サーバーの版が違い、インスタンスサーバーの通信の版が合わない部屋には入れません(画面に「非対応の通信バージョン」と出ます)。