もともと、このブログのセットアップは、ホームサーバーで運用しているため、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経由でご連絡ください!
本来、#Winboatの背後にあるアイデアは素晴らしいものですが、現在の実装はまだ少し不安定なようです。年始にインストールして以来、システムは動作していましたが、今日、ソフトウェアが完全に動作しなくなりました。
イメージが突然、メモリ(RAM)不足を報告しました。手動で問題を解決しようと試みましたが、残念ながらシステムが最終的に使用不能になってしまいました。トラブルシューティングにこれ以上時間を費やす代わりに、直接 Dockurr Windowsイメージ に切り替えました。これはもともとWinboatの技術的な基盤となっているものです。

1. 準備
私は Podman を使用しているため、まずホストシステムに必要なディレクトリを作成しました。これにより、コンテナを再作成する必要がある場合でも、データの整合性が保たれます。
mkdir -p $HOME/Windows/System
mkdir -p $HOME/Windows/Shared
2. 起動コマンド
重要な注意点: 変数 -e USERNAME と -e PASSWORD のプレースホルダーを、自身のログイン情報に置き換えてください。
podman run -d \
--name windows \
-p 8006:8006 \
--device=/dev/kvm \
--cap-add NET_ADMIN \
-e RAM_SIZE="8G" \
-e USERNAME="Carsten" \
-e PASSWORD="1234" \
-e LANGUAGE="German" \
-v $HOME/Windows/System:/storage:Z \
-v $HOME/Windows/Shared:/shared:Z \
--stop-timeout 120 \
dockurr/windows
コンテナが起動したら、ブラウザから直接Windowsインスタンスにアクセスできます。
http://127.0.0.1:8006

3. まとめ
上記のコマンドは一度実行するだけで済みました。日常の運用では、以下のショートカットコマンドを使用して、Windows環境を非常に快適に制御できます。
- 起動:
podman start windows
- 停止:
podman stop windows (またはWindows内から直接シャットダウン)
- ステータス確認:
podman ps -a
関連リンク:
NixOS をより深く学ぶために、自分専用のブログを立ち上げました。驚くほどスムーズに進めることができました。
WriteFreelyはこの目的に最適です。ミニマルでセットアップが速く、余計な機能がありません。手軽に始めて、作業の合間に学習するのにぴったりです。設定も非常に分かりやすく、いくつかのオプションを指定し、ディレクトリを準備して、リバースプロキシを配置するだけで完了です。
現在のNixOSの設定は以下の通りです:
{ config, pkgs, ... }:
{
services.writefreely = {
enable = true;
host = "blog.burningboard.org";
settings = {
server = {
port = 8080;
min_log_level = "debug";
};
app = {
host = "https://blog.burningboard.org";
single_user = true;
landing = "/read";
wf_modesty = true;
federation = true;
public_stats = true;
theme = "write";
};
};
stateDir = "/opt/writefreely";
};
# ActivityPubキー生成の修正:フェデレーションにはopensslが必要
systemd.services.writefreely.path = [ pkgs.openssl ];
# 正しい権限でデータディレクトリを自動作成するための設定
systemd.tmpfiles.rules = [
"d /opt/writefreely 0700 writefreely writefreely -"
];
services.caddy.virtualHosts."blog.burningboard.org".extraConfig = ''
reverse_proxy 127.0.0.1:8080 {
header_up Host {host}
header_up X-Real-IP {remote_host}
header_up X-Forwarded-For {remote_host}
header_up X-Forwarded-Proto {scheme}
}
'';
}
基本的な設定はこれだけです。NixOSのおかげで、こうしたサービスをクリーンに設定し、再現可能な状態に保つのが非常に簡単になります。