マイブログ // デジタルアーカイブ

思考、プロジェクト、技術メモ

タグで表示: #md-blog すべて表示 ×

もともと、このブログのセットアップは、ホームサーバーで運用しているため、WireGuardを使用した純粋なIPv6プロジェクトとして計画されていました(ちなみに、無料のIPv6アドレスはroute64.orgで取得できます)。アクセシビリティを向上させるために、外部のIPv4プロキシを導入しました(@Larvitzに感謝)。

しかし、その際にすぐにSSLの問題が発生しました。当初、AレコードとAAAAレコードの両方がプロキシを経由していたため、サーバー上でのLet's Encryptの検証が失敗してしまったのです。

解決策:「IPv6ハック」

解決策は、AAAAレコードをプロキシ経由にするのではなく、サーバーのWireGuard IPを直接指すように明示的に設定することでした。

  • ドメイン: blog.burningboard.org
  • Aレコード (プロキシ): 194.28.98.217
  • AAAAレコード (サーバー): 2a11:6c7:f05:a8::2 (WireGuard)

このようにAAAAレコードをWireGuard IPに直接向けることで、Let's Encryptは(AAAAレコードがデフォルトで優先されるため)引き続きIPv6経由でサーバーに直接アクセスし、SSL証明書を発行します。IPv4トラフィックは、プロキシによって暗号化された状態で私に転送されます。

最終的な設定

通信を円滑に行うために、Caddyサーバーの設定を調整する必要がありました。

1. 自サーバー側 (NixOS, blog.nix)

訪問者の本当のIPアドレスが正しく届き、プロキシのIPで上書きされないように、プロキシを信頼できるものとして設定する必要があります。

services.caddy.globalConfig = ''
  servers {
      trusted_proxies static 2a06:9801:1c:1000::10
  }
'';

2. 外部プロキシ側 (Caddy)

プロキシがHTTPS経由でサーバーに正しくアクセスするために、ホスト名(SNI)を送信する必要があります。

reverse_proxy [https://[2a11:6c7:f05:a8::2]:443](https://[2a11:6c7:f05:a8::2]:443) {
    header_up Host {host}
    transport http {
        tls_server_name blog.burningboard.org
    }
}

これで、ブログはIPv4とIPv6の両方からアクセス可能になり、安全に暗号化され、自宅のIPアドレスも秘匿されたままになりました! 🚀

まず最も重要な点として、これまで通りMarkdownファイルがベースであることに変わりはありません。私はこのシンプルなソリューションの大ファンなのです。しかし、内部(アンダー・ザ・フード)では大きな変更がありました。

セットアップを大幅に調整しました:

📂 MDファイル:ブログ構造はMarkdownベースのシンプルなままです。

🌍 かつてないほどグローバルに:私のブログは現在、43言語の翻訳に対応しています。はい、クリンゴン語も含まれています! 🖖 (Qapla'!)

当初の計画では、ブラウザの言語認識に基づいた完全自動のリアルタイム翻訳を導入する予定でした。ネタバレすると、部分的にしか機能しませんでした。AIは素晴らしいものですが、私たちが望むレベルにはまだ完全には「到達」していないことが分かります。

解決策:現在は、すべての記事をあらかじめ指定された言語に翻訳しておくことにしました。これは検索エンジン(SEO)にとっても非常に有利です。もし自動認識がうまく機能しない場合は、地球儀のアイコンから手動で希望の言語を設定でき、その設定はCookieを介して簡単に保存されます。

翻訳にはGemini 3 Flashを使用しており、驚くほど良い結果が得られています。ただし、AIの挙動には注意が必要です。最初のバルク処理(一括処理)では、誤ってタグまで翻訳されてしまいました。もちろん、それは意図したことではありませんでした。

コードは引き続き公開しています(興味がある方はメッセージをください)👍 ただし、システムには独自のGemini APIキー 🔑 が必要になった点にご注意ください。

私は急遽、ブログをWriteFreelyから自作のシステムであるMD-Blog(MDはもちろんMarkdownの略です)に移行しました。きっかけは旧システムのアップデート失敗でしたが、結果的にはすべてを根本から簡素化し、デザインを完全にコントロールするための絶好の機会となりました。

その核となるのは、data/フォルダ内のシンプルなMarkdownファイルで、実行時にモダンなHTMLへと変換されます。その結果、動作は非常に高速で、データベースも不要。独自のデザインシステム(ダークモード対応)のおかげで、まさに思い描いていた通りの見た目になりました。さらに、モダンなMastodon共有ボタンも標準搭載しています。

コードやこの軽量なセットアップに興味がある方は、ぜひMastodon経由でご連絡ください!