自宅サーバーのインフラ構成
はじめに
今回は自分が自宅で運用しているインフラについて紹介したいと思います。
もともとはマイクラサーバーを立ててみたかったというのがきっかけでした。そこから色々と触っているうちに、気づいたらGPUノードやクラウドのノードまで含めたKubernetesクラスタになっていました。
全体構成
全体像はこんな感じです。

外部からのアクセスはCloudflare Tunnelを経由してクラスタ内のTraefikに届き、そこから各サービスに振り分けています。クラスタの構成はGitHubのリポジトリで管理していて、Argo CDで同期しています。
ハードウェア
現在は物理ノードが3台、クラウドのノードが1台という構成です。
- Proxmox VE
- メモリ: 32GB
- gpu-node-01
- GPU: GTX 1660 SUPER
- メモリ: DDR4 16GB
- gpu-node-02
- メモリ: DDR4 128GB
- GPU: RTX 3060 x2 + V100
- gcp-worker-01
- メモリ: 8GB
Proxmox VEの上では、次のVMを動かしています。
- gateway node: 自宅とGCPをつなぐルーター
- AdGuard Home: 自宅のDNS
- k3sのcontrol plane
- jumpserver: SSH用の踏み台
gpu-node-01はComfyUIで軽めの画像生成をしたり、普通のworker nodeとして使ったりしています。gpu-node-02は基本的にLLMの推論用です。
GCPのノードは、Cloudflare Tunnel経由だと公開が面倒なサービスを直接公開するために使っています。
ネットワーク

GCP以外のノードはすべて自宅のLANにつながっていて、gateway nodeと各ノードの間でOSPFを使って経路を広報しています。
GCPのノードとは、gateway nodeとの間をWireGuardでつないでいます。このWireGuardの上でもOSPFを動かしているので、自宅のノードとGCPのノードがお互いに到達できるようになり、1つのk3sクラスタとしてまとめられています。
外部公開
自宅は集合住宅でポート開放ができないので、外部への公開はCloudflare Tunnelを使っています。
クラスタ内で動いているcloudflaredがCloudflareに向けて外向きに接続を張り、Cloudflareに来たリクエストはそのトンネルを通ってTraefikに届きます。あとは普通のIngressで各サービスに振り分けるだけなので、サービスを増やすときもIngressを書くだけで済みます。
管理画面のように自分しか使わないものは、TraefikのForwardAuthでoauth2-proxyを挟んで認証をかけています。
Kubernetesクラスタ
k3s + Cilium
Kubernetesのディストリビューションは、導入が簡単なのでk3sを使っています。
CNIはCiliumです。勉強がてら入れてみたかったのと、Hubbleで通信を可視化できるのが面白そうだったので採用しました。
GitOps
クラスタの構成はGitHubのリポジトリで管理していて、Argo CDのApp of Apps構成でGitOpsとして運用しています。Fluxという選択肢もありましたが、Web UIが欲しかったのでArgo CDにしました。
Secretは、GitHubに平文で置かないようにSealed Secretsを使っています。暗号化したSealedSecretをリポジトリに置いておくと、クラスタ内のコントローラーが復号してKubernetesのSecretを作ってくれます。
ストレージ
Longhorn
PVCのストレージにはLonghornを使っています。本来は分散ストレージとしてレプリカを持たせて冗長化することが多いですが、ストレージにそこまで余裕がないので1レプリカで運用しています。
冗長化しなくても、バックアップを取れたり、Podを別のノードに移動させたときにPVCのデータも一緒に移動させられたりするので、Podのお引越しにも使えて便利です。もともとはLocal Pathを使っていましたが、複数ノードで運用し始めたタイミングで移行しました。
RustFS
S3互換のオブジェクトストレージとしてRustFSを使っています。もともとはSeaweedFSを使っていました。
RustFSは一度ベータ版のときに入れたことがあったのですが、その時はバグが多くてうまく動きませんでした。最近v1.0がリリースされたので改めて導入して、今のところ問題なく動いています。Web UIがリッチで色々な機能があるので、すごい便利です。
監視
メトリクス
メトリクスはPrometheusで収集して、Grafanaで見ています。
メトリクスのデータは結構な容量になるので、Thanosも入れています。ThanosはPrometheusのデータをオブジェクトストレージ(RustFS)に保存してくれて、古いデータは解像度を落として(ダウンサンプリングして)保存してくれます。Prometheus互換のAPIがあるので、GrafanaからはそのままThanosを参照できます。
アラートはAlertmanagerからDiscordに通知するようにしています。
ログ
ログはAlloyで収集して、OpenObserveに送っています。もともとはLokiを使っていましたが、GrafanaからのLokiの検索が使いづらかったので、ログ専用のOpenObserveに切り替えました。専用のUIがあるので検索しやすくて使いやすいです。
セキュリティ
最近サイバー犯罪が多いので、CrowdSecも入れています。Traefikのアクセスログを監視して、不正アクセスを検知してくれます。
動かしているもの
Local LLM
画像生成はComfyUI、LLMの推論はllama.cppで、Qwen3.8 Flash Next Q4を動かしています。
ComfyUIを動かしているGTX 1660 SUPERはVRAMが6GBしかありませんが、意外とそこそこの画像生成ができます。
Qwen3.8 Flash Next Q4は、ある程度最適化したら30 tokens/sくらいのそこそこの速度で、かなり良い精度で推論できます。このLLMは、MCP経由でComfyUIを操作したり、ローカルのアプリケーションからAPIを叩いたりして使っています。とはいえ、ノードの構築コストを考えると割に合ってなさすぎるのが正直なところです。
今後やりたいこと
実家にもノードを置きたい
自宅は集合住宅でポート開放ができないので、実家にノードを置いてポート開放をして、クラウドに依存せずにグローバルIPを使えるようにしたいです。ネットワークの構成なども勉強になりそうです。
ストレージサーバーが欲しい
せっかくRustFSなどを置いていますが、今の構成は冗長化していないので、データがいつ吹き飛ぶかわからなくて怖いです。なので、冗長化したストレージ置き場を1つくらい用意したいなと思っています。
あとは単純に、速度は出なくていいので大容量のストレージがクラスタに欲しいです。
Split DNSの構成を作りたい
Cloudflare Tunnelには帯域制限があるので、大きめのファイルを転送するとすぐに引っかかることがあります。また、自宅のLAN内にいるのに、わざわざグローバル経由で認証付きでローカルのAPIにアクセスしたり、ポートフォワードを張ったりするのが面倒です。
なので、自宅のLANにいるときはローカルのIPアドレスを返すSplit DNSの構成を作りたいです。ただ、ルーターやAPを買わないといけなかったりして結構お金がかかりそうなので、果たして割に合うのか悩んでいます...
おわりに
自宅サーバーのインフラ構成について紹介しました。
マイクラサーバーから始まって、気づけばGitOpsや監視まで含めたそこそこ本格的な構成になっていました。自分で一から組んで運用してみると、普段はクラウドが隠してくれている部分の大変さがよくわかって面白いです。今後もやりたいことはたくさんあるので、少しずつ育てていこうと思います。