連合のしくみ
Ubichill のサーバーは、お互いに連合します。どのサーバーの人ともフレンドになれて、招待し合えて、相手のサーバーの部屋に入れます。 全部を握る中央のサーバーはありません。
権威は 3 つに分かれている
Section titled “権威は 3 つに分かれている”| もの | だれが決めるか | 住所 |
|---|---|---|
| 人 | その人のホームサーバー | @ID@ドメイン(例 @[email protected]) |
| 部屋(インスタンス) | 部屋のあるサーバー | 部屋ID@ドメイン(例 [email protected]) |
| 作品(ワールド・mod) | 作者が置いた URL と作者の署名 | https://yokan.github.io/worlds/chill-room.yaml |
- フレンドの関係・通知・公開環境(署名の鍵)など「人のこと」は、ホームサーバーが持ちます。
- 部屋にだれがいるか・公開範囲・入れるかどうかは、部屋のサーバーしか知らず、部屋のサーバーが判断します。
- ワールドや mod は、どのサーバーとも無関係な URL に置けます。サーバーは URL から読み込んで部屋を開きます。
利用者から見える動き
Section titled “利用者から見える動き”- 探す: 検索に
@ID@ドメインと打つと、そのサーバーに問い合わせて結果が出ます。プロフィール・フレンドの操作も同じ画面です。 - フレンド: 申請・承認・解除は同じボタンです。相手のサーバーへ届くまで少し時間がかかることがあります(届くまで送り直します)。
- 部屋: フレンドの現在地に、ほかのサーバーの部屋も同じカードで出ます(地球のアイコンとドメイン付き)。「入る」も「リクエスト」も同じです。
- 入る:
部屋ID@ドメインの部屋に入ると、画面は自分のサーバーのまま、部屋のサーバーにつながります。URL にトークンは載らず、リダイレクトもしません。 - 招待: ほかのサーバーのフレンドにも招待・リクエストを送れます。ほかのサーバーの人からの招待・リクエストは、フレンドからのものだけ受け取ります。
公開範囲や招待の規則は、部屋のサーバーが決めます。内容は自分のサーバーの部屋と同じです(公開範囲・フレンド・招待)。
Misskey・Mastodon から見る・フォローする
Section titled “Misskey・Mastodon から見る・フォローする”Ubichill のアカウントは、Misskey や Mastodon などフェディバースのサービスからも見えます。
- 検索に
@ID@ドメイン(例@[email protected])と打つと、名前・アイコン・自己紹介と、作ったワールドが出ます。 - そのままフォローできます。フォローはフレンドとは別の片方向の関係で、フォロワーに見えるのはプロフィールだけです。現在地・来訪・招待はフレンドだけ。
- フォローを承認制にするか、検索に出すかは、設定のフェディバースの項目で選べます。承認制にすると承認待ちが通知に届きます。
- Ubichill からフェディバースへの投稿(ノート)は、これから足します。
ほかのサーバーの部屋に入る流れ
Section titled “ほかのサーバーの部屋に入る流れ”あなたのブラウザ ── 入室を頼む ──▶ ホーム Aホーム A ── 署名付きで入室を頼む(本人の鍵・使い捨ての nonce)──▶ 部屋のサーバー BB: 見えるか・入れるか・満員でないか・A からの来訪者が 20 人未満か → 入室チケットを返すホーム A ── チケットと接続先 ──▶ あなたのブラウザ ── WebSocket ──▶ B のインスタンスサーバー- チケットは、あなたの画面(ホーム A)の origin に結び付いています。別の画面では使えません。
- WebSocket の接続先は部屋のサーバーと同じホスト名に限られます。
- 一度入れた部屋には、部屋が続く間は招待なしで入り直せます。
- ワールドの中身と mod の lock は部屋のサーバーが配ります。mod は、いつもどおり作者の署名が確かめられてから動きます。
中身:2 つの面
Section titled “中身:2 つの面”| 面 | 何を | どう |
|---|---|---|
| 知らせ(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 が告知し、使う前に相手が告知しているかを見ます
知っているサーバーは、連絡がつくたびに自動で記録されます。管理者が手で登録する必要はありません。
管理者の設定
Section titled “管理者の設定”既定では、どの Ubichill のサーバーとも連合します。問題のあるサーバーだけを絞ります(設定 → 連合)。
| 方針 | 意味 |
|---|---|
| 連合する | 既定 |
| 新しいつながりを受けない | 新しい申請・招待・リクエスト・来訪を受けない。いまあるフレンドはそのまま |
| 連合しない | 送受信・取得をすべてやめ、そのサーバーの人とのフレンドも切る |
サブドメイン・ポート違いにも効きます(spam.example を止めれば a.spam.example も止まります)。
ワールドの一覧に、ほかのサーバーのワールドを出す
Section titled “ワールドの一覧に、ほかのサーバーのワールドを出す”管理者(公式アカウント)が設定 → 連合 → ほかのサーバーで、相手のサーバーをフォローすると、相手のサーバーの作者が公開したワールドが「グローバル」の一覧に出ます。 一覧に書かれた署名の状態は信用せず、自分のサーバーが各ワールドを取得して署名を確かめます。
動かすときの設定
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 での建て方は 自分のサーバーを建てる を見てください。
いまできないこと
Section titled “いまできないこと”- ほかのサーバーのパブリックな部屋を探す一覧は、まだありません(予定)。
- サーバーの版が違い、インスタンスサーバーの通信の版が合わない部屋には入れません(画面に「非対応の通信バージョン」と出ます)。
- 公開範囲・フレンド・招待
- プロトコルと互換の規則 — サーバー間の約束ごとの互換の扱い
- 設計書: federation.md — 実装の詳細