Bruno Crociさんの記事は、かなり気持ちのいい「サーバー引っ越し記」です。
10年間動かしてきたブログのVPSが、Ubuntu 16.04のままだった、という時点でまず驚きます。しかもそのUbuntu 16.04は、すでに何年も前にサポート終了済み。つまり、更新が止まった古いOSの上で、大事なブログがずっと動いていたわけです。
これは正直、よくある話でもあります。
「動いてるからまあいいか」で放置しているうちに、OSもミドルウェアも古くなって、気づけば更新不能。技術者あるあるですが、外から見るとかなり怖い状態です。著者もその点を自覚していて、そろそろ変え時だと判断したようです。

移行先として選んだのはHetznerのVPSでした。
著者はもともとDigitalOceanのニューヨークのサーバーを使っていて、月額13ドルほど支払っていたとのこと。一方、Hetznerはドイツの事業者で、著者の住む地域からも近く、しかも料金がかなり安い。
ここで面白いのは、単に「安い」だけではなく、性能も上がっている点です。
旧サーバーは 2GB RAM / 1 vCPU / 50GB disk / 2TB traffic。
新しいHetznerのプランは、もっと安価なものでもメモリとCPUが倍で、通信量は10倍。さらに著者は、月6ユーロ弱の少し上位の構成を選んでいます。
個人的には、ここがかなり重要だと思います。
古いVPSを惰性で使い続けると、「更新しない不安」と「コストの無駄」がじわじわ積み上がるんですよね。しかも今回は、更新で性能もコストも改善している。移行の成功条件としてかなり気持ちいい部類です。
このブログは、見た目ほど複雑な構成ではありませんでした。
nginxで静的サイトを配信していて、ブログ本体はHugoで生成。更新の流れはこんな感じです。
hugo を実行する
つまり、動的なWebアプリというより、静的サイトを配っているだけに近い構成です。
このタイプのサイトは、サーバー移行と相性がいいです。アプリの複雑な依存関係が少ないので、OSを変えるハードルがそこまで高くない。移行のしやすさは、構成のシンプルさがかなり効いています。
著者は、FreeBSDへ移した理由として、まず「違うものを触ってみたかった」と率直に書いています。
この動機、個人的にはすごく好きです。業務で必要だから、ではなく、学びたい・試したいという純粋な好奇心がある。こういう移行はだいたい楽しいんですよね。
FreeBSDは、Linuxとは違う系統のUNIX系OSです。
よく言われる強みは、安定性、セキュリティ、そして統合された設計。そこに加えて、著者が強く惹かれたのが Jails でした。
Jailsは、FreeBSDに昔からある隔離機能です。
ざっくり言うと、1台のマシンの中に「小さな独立した環境」を作る仕組みです。外から見るとコンテナっぽいのですが、著者はそれを「プログラムのパッケージ化」というより、ミニシステム と捉えています。

ここはかなり面白いポイントです。
もちろん厳密には色々違うのですが、感覚としてはかなりしっくり来ます。
著者は、各サイトを個別のJailに分ける構想を立てました。
つまり、1つ壊れても他に影響しにくい。しかも壊れたJailは消して作り直せばいい。これは本当にサーバー運用の理想形のひとつだと思います。
FreeBSDといえばZFSも重要です。
ZFSはファイルシステムの一種で、データ整合性やスナップショットが得意です。スナップショットというのは、ある時点の状態を丸ごと保存しておける機能。何か失敗しても、その時点に戻しやすいのが強みです。

著者は、VPS事業者のバックアップに頼らなくても、頻繁にスナップショットを取って自前で守れる点を評価しています。
これは地味ですが、実運用ではかなり大きいです。
「事業者のバックアップがあるから大丈夫」と思っていても、実際には追加料金だったり、復元が面倒だったりします。自分で守れる範囲が広いのは、精神衛生に効きます。
著者の新しい設計は、かなり整理されています。
reverse proxy というのは、外から来た通信を内部の別サーバーに中継する仕組みです。
たとえば「blog.example.com」はブログJailへ、「site.example.com」は別のJailへ、といったふうに振り分けます。
この構成の良いところは、責任分離がはっきりしていることです。
お行儀の悪いサイトがあっても、その被害をJailの中に閉じ込めやすい。個人的には、この「壊れても巻き込みにくい」設計がいちばん気持ちいいです。

Jailsは強力ですが、手で運用するとけっこう面倒です。
そこで著者は Bastille を使っています。BastilleはJails管理ツールで、作成・一覧表示・シェル接続などをコマンドで扱えます。
たとえば、
bastille listbastille createbastille consoleのような操作ができます。
著者は「いちばん名前がかっこいいものを選んだ」とも書いていて、こういうノリは嫌いじゃありません。技術選定って、理屈だけでなく、触っていて気持ちいいかも結構大事なんですよね。

Jailを使うには、内部ネットワークも作る必要があります。
著者は loopback interface を複製して bastille0 という仮想ネットワークを用意し、Jailsはそこだけで動くようにしています。
さらに、FreeBSDのファイアウォール PF を使って、
という流れを作っています。
ざっくり言うと、外から来たWeb通信はCaddyに集め、そこから中の各Jailへ流す構成です。
こうして読むと少し難しそうですが、やっていること自体は「玄関は1つ、部屋は別々」という考え方に近いです。サーバーの世界でも、建物の設計みたいな話なんだなと感じます。

著者は以前 nginx を長く使っていましたが、今回は Caddy を採用しています。
理由はわかりやすくて、SSL証明書の管理が楽だからです。
SSL証明書は、WebサイトをHTTPS化するための仕組みで、期限が切れる前に更新しなければなりません。nginx自体が悪いわけではないのですが、証明書更新は別途 certbot などを回す必要があり、うっかり忘れると面倒です。
Caddyはこのあたりをかなり自動でやってくれるので、運用負荷を下げられます。
「サーバーを触る回数を減らしたい」という意味では、かなり理にかなった選択だと思います。
元記事の説明によると、この記事には 4つの大陸からの負荷テストとベンチマーク の話も含まれています。
これはすごく良い姿勢です。サーバー移行は、単に「起動した、表示できた」だけでは不十分で、実際にアクセスが来たときにどれくらい耐えるかも大事です。

特に個人ブログだと、普段は静かでも、Hacker News などで一気に注目されることがあります。
著者も過去に一部の記事がバズってアクセスが増えた経験を書いていました。だからこそ、ふだんは静的サイトでも、いざというときにちゃんと動くかを見る価値があるわけです。
私がこの話でいちばん面白いと思ったのは、単なる「OSの乗り換え」ではなく、運用の考え方そのものを整理し直しているところです。
この流れがすごくきれいです。
しかも、流行りに飛びついた感じではなく、「自分のサイト規模ならこれで十分」という現実感がある。ここが好印象でした。

この移行記事は、技術好きにはかなり刺さる内容です。
古いUbuntuサーバーを延命するのではなく、FreeBSDへ移って、JailsやZFS、Bastille、Caddyを組み合わせる。しかもコストは下がり、性能は上がる。実用性と遊び心がちゃんと両立しています。
個人的には、こういう「自分のブログだからこそ自由に構成を変える」という姿勢がすごく好きです。
大規模サービスでは難しい試みでも、個人サイトなら思い切ってやれる。FreeBSDを選ぶのも、その一例だと思います。
「サーバーを安定運用しつつ、ちょっと面白いこともしたい」
そんな人にとって、かなり参考になる移行記ではないでしょうか。
参考: This blog ran on Ubuntu 16.04 for 10 years. I migrated it to FreeBSD