前回(2)「手作業で育てた最初の環境」では、Immichを手作業で構築し、その流れでClaude Code用のVMも思いつきで立ててしまった話を書きました。今回は、その「行き当たりばったり」な状態から抜け出すために最初にやった、地味だけれど大事な2つのことについて書きます。
「行き当たりばったり」から抜け出す第一歩: Git化
前回書いた通り、最初の構築はその都度必要になったものを手で足していくスタイルでした。動くには動くのですが、「いつ・何を・どう設定したか」がターミナルの履歴と自分の記憶の中にしか残らず、少し時間が経つと自分でも再現できなくなっている状態になっていました。
そこでまず着手したのは、大掛かりな自動化ではなく、もっと地味な「記録を残す」ことでした。具体的には、
- 構築に関する設定やスクリプトをGitリポジトリで管理する
- 環境の全体像や運用ルールをまとめたドキュメントを用意する
というところから始めています。CI(lint程度の軽いもの)も合わせて動かし始めましたが、この時点ではまだ「変更を検証する」レベルで、Ansibleによる本格的な自動化はもう少し先の話です(このあたりは第5回で詳しく書きます)。
振り返ると、いきなり自動化に手を出すのではなく、まず「今どうなっているかを書き残す」ことを優先したのは良い順番だったと思っています。自動化は、そもそも今の状態が分かっていないと組み立てようがないからです。
Tailscale導入: ポートを開放せず、tailnet限定でアクセスできるようにする
もう一つ、この時期に着手したのがTailscaleの導入です。
前回までに紹介した通り、このホームラボは自宅のWi-Fi回線1本と家庭用ルーターの上で動いています。つまりPC・スマホなど複数の端末からサーバーにアクセスしたいと思っても、ルーターに複数のポートを開放していくのは、管理の手間としてもセキュリティ的にも避けたいところでした。
そこで、ポートを開放せずに手元の端末とサーバー間を繋げる手段としてTailscaleを導入しました。VPNのような役割を果たしてくれるツールで、参加させた端末同士で専用の私設ネットワーク(tailnet)を組めるようになります。可能な場合は端末同士が直接通信し、NAT越えがうまくいかない場合はTailscale側のリレーサーバーを経由する仕組みです。
導入にあたっては、Proxmoxホスト1台だけをsubnet router的に立てて他のゲストへのアクセスを一元的にまとめる方式も検討しました。ですが最終的には、Proxmox本体や、写真管理用のVM、Claude Code用のVM、監視用のLXCなど、当時動いていた主要なゲストがそれぞれ個別にtailnetへ参加する方式を選んでいます。サービスを追加するたびに、「どのゲストがtailnetに参加しているか」を見通せる方が扱いやすそうだと考えたためです。
ただしこれはあくまで見通しやすさの話で、tailnetに参加させただけでサービス単位のアクセス制御ができているわけではありません。本来はTailscaleのACL(アクセス制御ルール)やタグ、各ゲスト側のファイアウォールも組み合わせて初めて「誰が何にアクセスできるか」を絞り込めます。この細かい制御は当時ほとんど手を付けられておらず、後回しになった課題の一つです。
Proxmoxホスト自体もtailnetに参加させたことで、tailnetに入った端末からは管理画面(Proxmox VE自体)にも到達できる経路が一つ増えています。利便性と引き換えに管理面への到達経路が増えた、という点は正直に書いておきます。個別参加方式は、ゲストを増やすたびに導入・管理の手間や、攻撃を受け得る範囲(アタックサーフェス)も増えるという意味で、subnet router方式に対してデメリットもあるトレードオフでした。
この時期には、後で紹介する「外部脳」用のCouchDBも用意し始めていたのですが、Tailscale経由でtailnet限定に公開する方法で少しハマりました。この話は次回、Obsidianとの連携の詳解と合わせて書きます。
まとめ
Git化とTailscale導入は、どちらも「行き当たりばったりの環境を、管理可能な状態に近づける」という同じ方向を向いた施策でした。Git化で「状態を記録に残す」土台ができ、Tailscaleで「ポートを開放せずtailnet限定でアクセスできる」土台ができています(ただし後者はACL設定や端末の安全性にも依存するもので、無条件に安全というわけではありません)。派手な回ではありませんが、この2つがあったおかげで、この後の自動化やサービス追加がやりやすくなっています。
次回予告
次回は、この基盤の上に構築した「Claude Code×Obsidianの外部脳」について、実装込みで詳しく紹介します。自分のサーバーにObsidianのデータベースを用意し、コミュニティプラグインでPCやスマホと同期しながら、Claude Codeが直接読み書きできるようにする話です。同じように自宅サーバーを持っている方には、そのまま参考にしていただけるはずです。