8月4日の朝の一連のコミットは、ブログ設定から機密値を追い出すことをテーマにしていた。Baidu/Bing のプッシュ用 token、LLM でタグ付けする api_key、記事暗号化カテゴリのパスワード——すべてを .gitignore の _config.local.yml に移し、リポジトリには _config.local.example.yml のテンプレートだけを残した。

同じ日に、関連する三つのことも行った。コメントシステムを Twikoo+Waline から Artalk に変更、ライセンスを CC BY-NC-SA 4.0 から CC BY 4.0 に変更、AI クローラーを許可して llms.txt を生成。この記事では設定の階層化のコストを記録し、ついでに GEO とクレジット表示の二つについても書く。

機密除去は値を消すことではない

_config.yml は公開されているので、鍵をそこに書くのは公開するのと同じだ。しかし Hexo のビルドには実際の値が必要なので、階層化する:

# _config.local.example.yml(进仓库)
hexo_submit_urls_to_search_engine:
  baidu_token: ""
  bing_token: ""
llm_tagging:
  api_key: ""
encrypt:
  categories:
    - { name: 加密, password: "" }

_config.local.yml にコピーして実際の値を記入し、ビルド時に --config _config.yml,_config.local.yml で深いマージを行う。build / server / dev / push の四つのスクリプトには、すべてマージパラメータが組み込まれている。

利点は明快だ。リポジトリに実際の値がなく、テンプレートが次に触る人に何を記入すべきか教えてくれる。欠点も同じくらい明快だ。どのコマンドにも二つ目の設定を付けるのを覚えておかなければならない。忘れてもエラーではなく、静かにフォールバックする。

付け忘れの二つの方向

一つ目はビルドがそのまま失敗する方向。llm_tagging の api_key を移した後、_config.yml には空の親キーだけが残り、hexo clean を --config なしで実行すると空設定の上でエラーになる。そのため clean と dev の hexo clean にもマージパラメータを追加した——「クリーン」のような設定と無関係に見えるコマンドでさえ付ける必要がある。

二つ目はより見えにくい。encrypt.categories のパスワードを付け忘れてもビルドは失敗せず、暗号化カテゴリの記事が平文のまま出力される。そこで _config.yml の encrypt ブロックの隣に警告を一行残した:

# ⚠ 不带 _config.local.yml 合并构建时,加密分类的文章会以明文输出

失敗の方向が「漏洩」である設定は、失敗の方向が「エラー」である設定よりはるかに危険だ。 前者は人が自ら確認しなければならないが、後者は少なくとも赤くなる。

GEO の部分

同じ日に、robots.txt で GPTBot、OAI-SearchBot、ClaudeBot、PerplexityBot、Google-Extended、CCBot などの主要な AI クローラーを明示的に許可し、llms.txt と二つの sitemap を指すようにした。新たに scripts/llms-txt.js を追加し、ビルド時に /llms.txt を生成する。

生成器は最初のカテゴリでグループ化し、各記事を一行の - [标题](绝对URL): 摘要 にする。要約はコードブロック、HTML、Markdown の記号を剥ぎ取り、100 文字に切り詰める。二つの境界ケースは触れておく価値がある:

  • 暗号化された記事は llms.txt に入れず、要約の漏洩を防ぐ。hexo-blog-encrypt の処理後は post オブジェクトから password が削除されるため、ソースファイルの frontmatter を読み直して判定する必要があり、メモリ上のオブジェクトを信じてはいけない。
  • 個別の記事は front-matter に llms: false と書けば除外できる。

sitemap 側では hexo-generator-seo-friendly-sitemap のインデックス形式の分割を試したが、二分半で公式の hexo-generator-sitemap に戻した。サイトはまだ 80 記事ほどで、post/page/category/tag に分表する利点は小さく、公式プラグインの方がメンテナンスも活発だ。llms.txt と robots の変更は残した。

クレジットとライセンス

同じ日、AI が下書きした 7 本の記事に copyright_author: Claude Opus 4.8 と copyright_author_href を統一的に追加した。著作権ボックスの「記事作者」には、私だけでなく協力者が表示される。

ライセンスは CC BY-NC-SA 4.0 から CC BY 4.0 に変更した。クレジット表示、商用利用と二次創作を許可する。変更にあたって一つのことをはっきり考えた——ブログの多くの内容はもともとクライアントのコーパスや公式ドキュメント、各地の資料から整理したもので、非商業の制限が生む摩擦は利益より大きい。

まとめ

設定の階層化後、公開リポジトリは確かにきれいになったが、システムのデフォルト状態も変わった。以前は「そのまま hexo g」で正しいサイトをビルドできたが、今はマージを覚えておかなければならない。すべての入口をスクリプトに書き込むのは、これをデフォルトにすることはできても自動にすることはできない——リポジトリをクローンした新人は、やはりまず cp テンプレートを行い、値を記入する必要がある。

いつかまた「なぜ鍵を直接 _config.yml に書き戻せないのか」と誰かに聞かれたら、答えは「安全でない」の一言ではなく、こうだ。公開される設定と、ビルドできる設定は、これからは二つの別物になった。