SWINGって何ができる? (2) サイトを公開しよう

ゆれ子

昨日は、ほかの人のサイトを見る話だったね……。今日は、自分のサイトを公開する話だよ。

前回は、ミラーしたサイトを読む側の機能を見てきました。今回は反対側に回って、自分の静的サイトを SWING に公開する方法を見ていきます。扱うのは、サイトを公開する swing publish とダッシュボードの公開画面、何人が自分のサイトをミラーしてくれているかの確認、Webring に載ること、そして自分のドメインで配る内蔵ゲートウェイの 4 つです。

公開するとき、何が起きているか

SWING での公開は「publish」と呼ばれます。publish では、サイトのディレクトリを手元の IPFS ノード(Kubo)に追加して、そのディレクトリ全体を指す CID を取得します。次に、その CID を書き込んだサイトイベントを自分の鍵で署名し、設定してあるすべてのリレーに送ります。どれかのリレーが受け取れば公開できたことになり、そのイベントを見たミラーする人たちが、CID をたどってサイトの中身を自分の手元に保存していきます。

署名には、10/3 の回で見た Nostr の鍵を使います。設定ファイルの秘密鍵でも、署名アプリでもかまいません。署名アプリのときは、publish の途中でアプリに承認を求められます。

publish したサイトは、ミラーする人の手元に保存され、IPFS やゲートウェイを通じてほかの人にも配られます。SWING のドキュメントでは、publish することで、参加者がそのサイトの各バージョンを保存・複製し、配布・表示することを許したものとして扱う、と定めています。一度配られたバージョンは取り消せないので、何を入れてよいかは次回にくわしく扱います。

ゆれ子

取り消せないんだ……。出す前に、ちゃんと見直さないとね。

swing publish で公開する

コマンドから公開するときは、swing up を動かしたまま、同じ設定ファイルで次のように実行します。swing up が管理している Kubo は自動で見つけてくれます。

swing publish --site example.jp --url https://example.jp/ ./public

--site は必須のサイト識別子で、SWING の上でサイトを見分ける名前です。変えると別のサイトとして扱われます。同じサイトとして公開し続けたい場合は、一度決めたらできるだけ変えずに使い続けてください。

--url は HTTP でも配信しているときの URL で、省略すると IPFS だけで公開するサイトになります。ほかに、表示用のタイトルを付ける --title と、更新メモを付ける -m(--message)があります。更新メモは「ブログに記事を追加」のような一言で、ミラーする人の一覧や、SWING に対応していない Nostr クライアントにも表示されます。

swing publish --site my-notes -m "ブログに記事を追加" ./public

--site にドメイン名を使うと、そのドメインの持ち主であることを NIP-05 で検証します。公開するドメインの /.well-known/nostr.json に自分の公開鍵を置いておく方式です。ドメインのルートを自分で管理していない場合は、my-notes のようにドメインではない識別子を使えば、この検証の対象外になります。

Docker Compose で動かしている場合は、サイトのディレクトリをコンテナにマウントして実行します。

docker compose run --rm -v "$PWD/public:/site" mirror publish --site example.jp --url https://example.jp/ /site

公開の前に確かめてくれること

publish は、IPFS に追加する前にいくつかの確認をします。名前が . で始まるファイル(.git や .env など)が入っていないか、合計の大きさが目安の 512 MiB を超えていないか、そして追加した結果が前回と同じ内容ではないか、の 3 つです。既定では、ドットファイルが見つかれば止まり、大きさは警告だけ、前回と同じなら何も送らずに Unchanged; not published. と表示して終わります。

さらに、リレー上の自分の最新バージョンに無かったファイル(今回増えたファイル)の一覧を出して、公開してよいかを聞きます。

New files
  compared with your latest version on the relays (bafy...)
  ! 1 new file
      posts/
        hello.html
  Publish with 1 new file? [y/N] y

見覚えのないファイルが混じっていなければ y で進みます。最後に Published. と出れば完了です。出力の Size: が、このバージョンの大きさです。

ゆれ子

増えたファイルを、ひとつずつ見せてくれるんだ……。うっかりが減りそうだね。

ダッシュボードから公開する

コマンドを使わなくても、ダッシュボードの公開画面から同じことができます。ブラウザでサイトのフォルダを選ぶと、ファイルがアップロードされて publish されます。この方式なら、Docker Compose で動かしていてもディレクトリのマウントは要りません。アップロードできる大きさの既定の上限は 2 GiB です。

画面には、サイト識別子・URL・タイトル・更新メモの欄と、NIP-05・ドットファイル・サイズ・同じ内容かの確認をどう扱うかの選択が並びます。送信の前には、コマンドと同じく増えたファイルの一覧が確認用のパネルに出て、「このファイルを含めて公開」を押したときだけアップロードが始まります。終わると、いくつのリレーが受け付けたかと、ゲートウェイで開くリンクが表示されます。

公開画面で、増えるファイルの一覧と「このファイルを含めて公開」のボタンが出ている確認パネル

画面の下の「自分のサイト」には、これまでに公開したサイトが並びます。「このサイト設定を使う」を押すと、そのサイトの識別子・URL・タイトルがフォームに入るので、更新のたびに同じ値を打ち直さずに済みます。

ゆれ子

公開できたときは、デスクトップのわたしも気付くよ。「公開できたよ」って、おしらせするね。

デスクトップ画面では、サイトを公開したことがマスコットのバルーンでおしらせされます。通知するかどうかは、「コントロール パネル」の「通知」タブで種類ごとに選べます。

何人がミラーしてくれているか

自分のサイトを、いま何人が保存してくれているか。これを数えるのが「レプリカ」です。SWING でサイトをミラーしている人は、保存しているバージョンの CID を「レプリカ報告」として Nostr に出し続けています。swing replicas は、この報告を集めて、自分のサイトを誰が持っているかを表示します。

swing replicas
npub1me... (<pubkey>)
  d=example.jp cid=bafy... replicas=2 (reports=3)
    npub1alice...  [latest]  [chosen]
    npub1me...     [latest]  [author]
    npub1bob...    [older version]  [unverified]

replicas に数えられるのは、最新バージョンを持っていると報告した人のうち、作者本人([author])か、作者または自分のミラー対象リストに載っている人([chosen])です。報告は誰でも出せるので、それ以外の人([unverified])は別枠として扱い、replicas=2 (+3 unverified) のように添えるだけにしています。[older version] は、古いバージョンだけを持っている人です。報告はあくまで自己申告で、実際に配れるかまでは保証しません。

自分で publish したサイトも、同じ Kubo で mirror-agent を動かしていれば、作者本人の分として報告されます。

ダッシュボードでは、Webring 画面で自分のノードを選ぶと、同じ内容を詳細パネルで見られます。デスクトップ画面では、自分のサイトを新しくミラーしてくれる人が増えたときに、マスコットがおしらせします。

ゆれ子

預かってくれる人が増えると、ちょっとうれしいね……。どこかで、ちゃんと残ってるってことだから。

Webring に載る

10/1 の回で見たとおり、SWING の Webring は、ミラー対象リストをたどってできる「誰が誰を保存しているか」のつながりです。自分のサイトがこの輪に入るのは、誰かが自分をミラー対象リストに入れたときです。自分からもその人をミラーすれば、おたがいに保存しあう関係になります。

ミラーしてもらうには、まず自分の公開鍵(npub)を相手に伝える必要があります。SWING Connect を使うと、公開鍵と、コマンド・ダッシュボードそれぞれでのミラーの手順をまとめたページへのリンクを作れます。

https://swing-connect.pages.dev/?key=npub1...

このリンクを自分のサイトに貼っておけば、読んでくれた人がそこからミラーを始められます。nip05=example.jp を付けると、NIP-05 で公開鍵を確かめた結果も添えてくれます。

いまの Webring の形は、swing webring で確かめられます。

swing webring

自分を起点に、ミラー対象リストを既定で 2 段までたどり、おたがいに保存しあっている組(Mutual)と、片方だけが保存している向き(One-way)を分けて表示します。自分をミラー対象に入れているだけで、こちらからはまだ入れていない人は、「Referencing the root」として別枠に出ます。リストに名前を書くことは誰にでもできるので、たどる範囲には加えない作りになっています。--format dot や --format mermaid を付ければ、図として書き出すこともできます。ダッシュボードの Webring 画面では、同じグラフをドラッグやズームのできる図で見られます。

ゆれ子

輪っかがだんだん大きくなっていくの、ゆっくり見ていたいな……。

自分のドメインで配る

ここまでの公開は、IPFS とミラーの中で完結しています。それとは別に、自分のドメインでもサイトを見せたいときのために、SWING には決めたホスト名だけを配信する HTTP サーバー(内蔵ゲートウェイ)が入っています。

バイナリで動かしているなら、swing.toml に次のように書いて swing up を起動し直します。

[gateway]
listen = "127.0.0.1:8081"
hosts = ["example.com", "blog.example.net"]

Docker Compose なら、.env に次のように書いて docker compose up -d します。

SWING_GATEWAY_LISTEN=0.0.0.0:8081
SWING_GATEWAY_HOSTS=example.com,blog.example.net

あわせて、各ホストの DNS に _dnslink.<ホスト名> という TXT レコードを置き、dnslink=/ipfs/<cid> と書きます。このしくみを DNSLink と呼びます。ゲートウェイは受け取ったリクエストを手元の Kubo にそのまま中継するだけなので、返せるのは手元にあるデータだけです。CID は swing publish でこのノードに置いたものを使い、publish のたびに TXT レコードも書き換えなければいけません。SWING にはそのツールはまだ含まれていません。

内蔵ゲートウェイは TLS を扱いません。HTTPS で見せるには、Cloudflare Tunnel などを前に置いて、そこから転送します。また、hosts に書いていないホスト名や、/ipfs/<cid> のようなパスでのアクセスには 404 を返します。決めたホスト名で、決めたサイトを見せるためだけの入口です。

ゆれ子

外からは、ふつうのサイトに見えるんだね……。中身は、みんなと同じ IPFS なんだ。

次回は

公開のしかたが分かったところで、次は公開するサイトそのものの作り方です。IPFS のゲートウェイ越しでも崩れない静的サイトの組み立て方と、公開してはいけないものが紛れていないかの確かめ方を見ていきます。

ゆれ子

明日は、このブログがどう作られてるかも出てくるみたい……。ちょっと、照れるかも。