なぜ差し替えるのか
kichijitsu をセルフホストすると、ビルド成果物
apps/web/dist がまるごと Cloudflare の assets Worker
に上がる。つまり同梱の プライバシーポリシー と
利用規約
も、あなたのドメインの /privacy.html /terms.html
としてそのまま公開される。
もしこの2ページに公式インスタンスの運営者名や連絡先が直接書かれていたら、二重の事故になる。
- 他人の規約が、あなたのインスタンスの規約として提示される
- love-rox が、運営していないインスタンスの運営者として名指しされる
そこで運営者にまつわる部分だけを HTML から追い出し、ビルド時に環境変数から差し込むようにしてある。同じ理屈で公式サイトの紹介ページも成果物から切り離してある (後述)。
同梱の規約・ポリシーの本文は、公式インスタンスのものをひな形として付けているだけ。 あなたのインスタンスの運営者はあなたであり、法的な責任もあなたにある。文面が自分の運用に合っているかは自分で確認・修正すること。
3つの環境変数
差し込む値は次の3つ。すべて任意で、設定したものだけが反映される (セルフホストの手順全体での位置づけは セルフホスト手順の「3. 設定を自分の環境に合わせる」 、コマンドを含む手順の正本はリポジトリの docs/self-hosting.md を参照)。
| 環境変数 | どこに出るか |
|---|---|
KICHIJITSU_OPERATOR_NAME |
規約「サービスの内容」の運営者の定義文、ポリシー「連絡先」の運営者名 |
KICHIJITSU_OPERATOR_CONTACT |
規約「規約の変更・連絡先」とポリシー「連絡先」の mailto: リンク
|
KICHIJITSU_INSTANCE_HOST |
「本インスタンス(ホスト名)」の括弧書き。規約とポリシーの両方 |
ビルドするシェルの環境変数として渡す。CI なら CI 側の環境変数に入れればよい。
export KICHIJITSU_OPERATOR_NAME="あなたの名前 / 組織名"
export KICHIJITSU_OPERATOR_CONTACT="you@example.com"
export KICHIJITSU_INSTANCE_HOST="cal.example.com"
pnpm build
細かい挙動は次のとおり。
-
値は環境変数からのみ読む。
.envファイルは見ない。 -
前後の空白は落とされ、空文字や空白だけの値は「未設定」と同じ扱いになる
(
KICHIJITSU_OPERATOR_NAME= pnpm buildのような事故を吸収するため)。 -
値は HTML エスケープされる。記号や
&を含む名前を入れてもページは壊れない。 -
変数名に
VITE_を付けていないので、これらの値が JavaScript バンドルに載ることは無い。入るのは規約・ポリシーの HTML だけ。
値を変えたら必ずビルドし直すこと。 差し込みはビルド時に一度きりで、
wrangler deploy はビルドを行わず既存の
apps/web/dist をアップロードするだけ。環境変数だけ書き換えてデプロイしても、公開されるページは古いままになる。
未設定のままだとどうなるか
未設定の項目は、語ではなく文まるごとが中立の言い回しに差し替わる。 「本インスタンス()は が運営しています」のような壊れた日本語にはならない。
| 未設定のもの | 表示される文言 |
|---|---|
| 運営者名 | 本インスタンスの運営者情報は設定されていません。 |
| 連絡先 | 本インスタンスの連絡先は設定されていません。 |
| ホスト名 | 「本インスタンス(ホスト名)」の括弧ごと消え、単に「本インスタンス」になる |
- 運営者名が未設定でも、規約の 「運営者」という語の定義文自体は残る。無保証・免責やサービスの変更といった以降の条項がこの語に依存しているため、ここが消えると規約の意味が変わってしまう。
-
連絡先が未設定のときは
mailto:リンクを出さない。空のmailto:は、押すと空のメーラーが開くだけの壊れたリンクになるため。
未設定のとき、公式インスタンスの運営者名 (love-rox)・連絡先・ホスト名が出力に現れることは無い。
これはこの仕組みの最重要の不変条件で、apps/web/build/legalText.test.ts
が実物の terms.html privacy.html に対して明示的に検証している。
つまり未設定で困るのは「あなたの運営者情報が載らない」ことだけで、他人の情報が載ることではない。
セルフホストで pnpm build:official を使わないこと。
これは公式インスタンス専用のスクリプトで、3つの環境変数に love-rox
の値が固定で入っているうえ、公式サイトの紹介ページまで成果物に合流させる。セルフホストで使うのは素の
pnpm build。
規約の内容そのものを書き換える
文面を自分の運用に合わせたいときは、テンプレートを直接編集する。実体は
apps/web/terms.html と apps/web/privacy.html の2ファイル。
差し込み位置は <!--KJ:TOKEN--> という形の HTML
コメントで書かれている。Vite が HTML 中の %KEY%
を環境変数として解釈する仕組みと衝突しないよう、あえてコメント形式にしてある。使えるトークンは次の8つ。
| トークン | 差し込まれる内容 |
|---|---|
INSTANCE_JA / INSTANCE_EN
|
文中に埋めるインスタンスの呼称 (「本インスタンス(ホスト名)」) |
TERMS_OPERATOR_JA / TERMS_OPERATOR_EN
|
規約の「運営者」の定義文 (1文まるごと) |
OPERATOR_LINE_JA / OPERATOR_LINE_EN
|
運営者名の単独表示 (「運営者: ○○」) |
CONTACT_LINE_JA / CONTACT_LINE_EN
|
連絡先の行 (設定時は mailto: リンクを含む) |
壊れない書き方
- 運営者名や連絡先を HTML に直接書かない。 書いてしまうと、そのリポジトリを fork した人のインスタンスにあなたの名前が出る。
- トークンは「語」ではなく「文まるごと」に対応している。周りに「〜は」「〜が運営しています」のような続きを書き足すと、未設定時に日本語が破綻する。
- 存在しないトークン名を書くとビルドが失敗する。 黙って空文字にすると運営者情報が抜けた規約がそのまま公開されてしまうため、あえて例外にしてある。
- 規約を全面的に書き直すなら、トークンを1つも残さない形でもよい (残っていないものは何も置換されない)。その場合は3つの環境変数も効かなくなるので、運営者情報は自分で書くこと。
この2ファイルを apps/web/public/
配下へ移動しないこと。public/
の中身はビルド時に素通しでコピーされるだけで差し込み処理が走らず、<!--KJ:TOKEN-->
がそのまま公開されてしまう。
この紹介サイトは配信されない
いま読んでいるこのページを含む公式サイトの紹介ページ ―― ランディング
(/)、MCP 接続ガイド、セルフホスト手順、ドキュメント (/docs/**) ―― は別パッケージ apps/site にあり、pnpm build
の成果物には入らない。規約の運営者情報と同じ種類の事故 ―― あなたのドメインで公式インスタンスの宣伝ページが配信される
―― を防ぐため、成果物ごと切り離してある。あなたが何もしなくてもそうなる。
ルートのビルドスクリプトは3つあり、関係は次のとおり。
| スクリプト | 何をするか | apps/web/dist の中身 |
|---|---|---|
pnpm build |
apps/web だけをビルドする (セルフホストはこれを使う) | アプリ + 規約 |
pnpm build:site |
apps/site だけをビルドする (確認用。出力は apps/site/dist) |
変化なし |
pnpm build:official |
公式専用。運営者情報の環境変数付きでビルドし、紹介サイトを合流させる | アプリ + 規約 + 紹介サイト |
結果として、あなたのインスタンスで配信されるのは
/app/ / /privacy.html /terms.html
の4つだけになる。それぞれの中身と、/
を自分の紹介ページに差し替える方法は
セルフホスト手順 にまとめてある。ビルドの順序や公式デプロイ側の事情は
docs/deploy.md
が正本。
設定できたか確かめる
-
ビルドログの警告を見る
設定が漏れていると、本番ビルド時に
[legal] 運営者情報が未設定です (...)という警告が出る。括弧の中に、未設定の変数名が並ぶ。3つとも設定できていれば何も出ない。 -
成果物を検索する
grep -c '運営者名にした文字列' apps/web/dist/terms.html # => 0 なら環境変数がビルドに渡っていない -
デプロイ後にページを開く
/terms.htmlの「サービスの内容」と/privacy.htmlの「連絡先」に、自分の名前と連絡先が出ていることを確認する。