コンテンツにスキップ

ドメイン分離 WebFinger

Holloはドメイン分離 WebFingerの設定をサポートしています。 フェディバースのハンドルは1つのドメイン(例: @alice@example.com) にあり、実際のActivityPubサーバーは別のドメイン (例: https://ap.example.com)で動作する形式です。 Mastodonが「ルートドメインでのWebFingerホスティング」 として説明し、GoToSocialがhost-metaベースのホストスワッピングと 呼ぶパターンと同じです。

この機能は Fedifyの origin オプション の上に実装されています。

なぜドメインを分離するのか?

Section titled “なぜドメインを分離するのか?”

典型的な動機は、すでに短くて良いドメイン(example.com)を持っていて、 ハンドルを@alice@example.comのように見せたいけれども、そのドメインの ルートにHolloを置くわけにはいかない場合です。ルートドメインは ホームページや別のWebアプリ、既存サービスが使っていることが多いものです。

ドメイン分離設定では:

  • ユーザーはフェディバースのどこでも@alice@example.comという 形で呼んでくれます。
  • Hollo自体はhttps://ap.example.comで動作します。Web UI、 Mastodon互換 API、OAuth、アクターURIはすべてこちらにあります。
  • ルートドメインexample.comはたった一つの仕事をすればよいです: /.well-known/webfingerリクエストをap.example.comに リダイレクトすることです。

以下の2つの環境変数をHolloインスタンスに設定してください:

  • HANDLE_HOST — ハンドルに使う ホスト名のみ(スキームなし、パスなし)。例: example.com
  • WEB_ORIGIN — Holloが実際に 動作するスキーム+ホスト。例: https://ap.example.com

両方を一緒に設定する必要があります。片方だけ設定するとHolloは 起動に失敗します。

HANDLE_HOST=example.com
WEB_ORIGIN=https://ap.example.com

これで残りはFedifyが処理してくれます:

  • WebFingerレスポンスのsubjectacct:alice@example.com
  • アクターURIはhttps://ap.example.com/@aliceの形式で構築されます。
  • Mastodon互換の/api/v1/instance/api/v2/instanceエンドポイントは インスタンスドメインをexample.comとして返すため、クライアントは 正しいハンドルを表示します。

リバースプロキシのリダイレクト

Section titled “リバースプロキシのリダイレクト”

Hollo自体はWEB_ORIGINホストでしかリッスンしません。 リモートサーバーが@alice@example.comを解決する際は https://example.com/.well-known/webfingerにWebFingerクエリを 送るので、そのドメインのリバースプロキシでHolloへリダイレクト させる必要があります。

クエリ文字列を保持する301リダイレクトで十分です。 一部の実装はディスカバリ時に/.well-known/nodeinfo/.well-known/host-metaも探るので、これらも一緒に リダイレクトしておくのが良いでしょう。

server {
listen 443 ssl;
server_name example.com;
# … 通常のサイト設定 …
location /.well-known/webfinger {
return 301 https://ap.example.com$request_uri;
}
location /.well-known/nodeinfo {
return 301 https://ap.example.com$request_uri;
}
location /.well-known/host-meta {
return 301 https://ap.example.com$request_uri;
}
}

/@usernameパスやアクターURLはリダイレクト不要です。 これらのURLはap.example.com上にあり、リモートサーバーは WebFingerレスポンスを解決した後そちらに直接アクセスします。

デプロイ後、次の3つを確認すればすべて正しく接続されていることが わかります:

  1. ハンドルドメインからのWebFingerがリダイレクトされるか:

    curl -i "https://example.com/.well-known/webfinger?resource=acct:alice@example.com"

    https://ap.example.com/.well-known/webfinger?...への301を 返す必要があります。

  2. サーバードメインからのWebFingerが応答するか:

    curl "https://ap.example.com/.well-known/webfinger?resource=acct:alice@example.com"

    subjectacct:alice@example.comで、selfリンクが https://ap.example.com/@aliceを指すJRDが返ってくる必要があります。

  3. インスタンスエンドポイントがハンドルドメインを返すか:

    curl https://ap.example.com/api/v2/instance | jq .domain

    "example.com"が出力されるはずです。

より入念に監査したい場合は、Julian Fietkau の WebFinger Canary を ハンドルドメインに対して実行してみてください。現在 Mastodon と Fedify ベースのサーバーはドメイン分離設定を正しく扱えますが、 Misskey と Pixelfed は今のところそうではありません。