世界を動かす技術を、日本語で。

私のセルフホスティング環境

概要

  • 数年間の試行錯誤を経て、自己ホスティング環境を「十分良い」状態で安定運用
  • NixOS、ZFS、Tailscaleなど重要技術の選定と具体的な構成
  • プライバシー重視と家族・友人の使いやすさを両立した設計
  • 各種課題への対応策や実際の運用ノウハウの共有
  • 今後の展望と、他者への知見提供の意図

自己ホスティング環境の完成までの道のり

  • Docker ComposeAnsible など様々な手法を数年間試行
  • 完璧を求めて無限に構成をいじることから、「十分良い」を目指すことに方向転換
  • 目標・要件を明確化し、段階的な計画を作成
  • 半年以上大きな問題なく安定運用中
  • 得られた知見や具体的な課題解決策を、他者の参考になるようまとめて公開

目的と要件

  • 主な目的は データとサービスのコントロール によるプライバシー確保と安心感
  • 家族や友人にも同じ恩恵を提供
  • 要件(優先順):
    • できる限り インターネット非公開 運用(攻撃リスク低減)
    • コアインフラ障害 のリスク低減と復旧容易性
    • オープンソース重視 でコア要素を自前運用
    • 家族・友人が 簡単に使える (理想はSSO/一人一アカウント)
    • 宣言的な設定管理 (バージョン管理・バックアップ・変更追跡)
    • 安全で簡単なアップデート手順
  • 逆に「完璧なモジュール性」や「全てOSSであること」にはこだわりすぎない方針

主要技術選定

  • NixOS
    • OSやサービスの設定をnix言語で一元管理
    • 設定ファイルは Git管理 し、他人の事例も参考にしやすい
    • 不足パッケージは Podman/Docker で補完
  • ZFS
    • データ保護・スナップショット・ロールバックが容易
    • 4台の10TB HDDによる RAIDZ2 構成+256GB SSDキャッシュ
    • データ消失リスクを最小化しつつ、拡張性も確保
  • Tailscale(+headscale)
    • メッシュVPN で拠点間安全接続
    • 企業依存回避のためOSS版 headscale を自前運用
    • 利用者はクライアントインストール必須だが、セキュリティ重視
  • Authelia & LLDAP
    • 認証・認可 基盤(SSO/LDAP両対応)
    • nginxリバースプロキシと連携し、非対応サービスも保護
    • 設定は難しいが、軽量かつ連携性良好

構成設計

  • サーバー名は Star Warsの惑星 由来
  • Primary Public Server(taris)
    • Authelia、headscaleなど中核サービスを限定運用
    • 必要最小限のみ公開し、リスクと障害範囲を縮小
    • Status監視やFoundry VTTのプロキシも担当
  • Primary Private Server(kuat)
    • TrueNAS 上でNixOS VMとZFSプールを運用
    • データセットは「files(重要データ)」と「media(再取得可能)」で分離
    • メインVM(bespin)が各種サービスを担当、テスト用VM(alderaan)も用意
  • 専用アプライアンス機器
    • Home Assistant OS(tython):スマートホーム用途
    • Matrixサーバー(coruscant):Ansible Playbook活用
    • メール・パスワード管理は ProtonMail/Bitwarden に完全委託(可用性重視)

主な課題と解決策

  • 設定ミスや障害時の ロールバック はZFSスナップショットで対応
  • 家族・友人の 利用負担 はSSOやシンプルなアカウント管理で軽減
  • 一部サービスの公開は利便性とリスクを天秤にかけて判断
  • 依存関係の循環やインフラ障害リスクを設計段階で排除
  • 他人の設定事例や公式ドキュメントを徹底活用し、ノウハウ蓄積

今後の展望とコミュニティへの還元

  • 運用経験から得たナレッジ・設定例・リンク集の公開
  • OSSコミュニティや同じ悩みを持つ人への情報提供・助力
  • 「完璧」より「実用性・持続性」を重視した自己ホスティング文化の推進

Hackerたちの意見

みんな、こんにちは!「正しい」セットアップを見つけるのって、結構大変だよね。目標や技術の好みもそれぞれだし。私がやっと満足できるセットアップを作った過程をブログに書いたから、シェアしたいと思ったんだ。目標や要件、技術の選択、レイアウト、解決した具体的な問題についても触れてるよ。私の到達点がみんなと同じとは限らないけど、参考になればいいな。みんなが自由にシェアしてくれたコンテンツやソフトウェアには本当に助けられたから、私もそれを続けて他の人を助けられたらいいなと思ってる。

Nixをホームラボで使ってみてどう?毎回試すたびに混乱しちゃうんだけど、次こそはうまくいくかな。聞いた理由は、私は「ハードコア」なホームラボをやってるから。25Uのラックがあって、小さなKubernetesクラスターとTalos Linux経由でCephを運用してるんだ。いろんな理由から、約7年間k8sを使ってきたけど、そろそろ変えたい、統合したい、シンプルにしたいと思ってる。要件を考えると、結局あなたと同じところに行き着いちゃうんだよね:NixとZFS。そういうサービスや問題にはすごく詳しいから、何か質問があれば気軽に聞いてね。

どこかでCoolifyを見かけたり、使おうと思ったことある?私はもう1年以上使ってて、Herokuみたいな使いやすさとGitHubからの自動デプロイが気に入ってるよ。 https://coolify.io/

こんにちは!あなたの作品にすごくワクワクしてます!私もNixOSを使った似たようなプロジェクトに取り組んでいて、あなたの意見が気になります。目標は、ほぼゼロコンフィグのAppleデバイスみたいな小さなボックスを作ることです。誰でもモデムにプラグを差し込んで、ウェブベースのインストールを進めるだけで使えるようにしたいんです。まだまだ初期段階ですが、家ではすでに動かしています。これはハイブリッドルーター(OPNSense/PFSenseみたいな)とアプリサーバー(Nextcloud、Synology、Yunohostなど)を組み合わせたものです。設定はすべて一つのNixモジュールで管理しています。動的DNSやLetsencryptのTLS証明書、各アプリのサブドメインも自動で設定されます。内蔵の広告ブロック機能やHeadscaleも搭載しています。今はSSOに取り組んでいます。あなたの作品も見て、アイデアを盗むかもしれません。プロジェクトは今、自分のクローゼットでホスティング中です:https://homefree.host

暗号化されたZFSを使っていますか?以前、FreeIPAや他のVMをDebianホストでZFSを使って試したことがあります。シンプルさを求めて、暗号化されたライブラリでSeafileをVPS上で運用し、それをZFSの送受信でローカルサーバーにバックアップすることに切り替えました。そのローカルサーバーは毎晩自動で起動して、更新や同期を行った後、再びスリープします。追加の耐障害性を考えて、Linuxデスクトップ(現在はFedora)でZFSに切り替えようと思っています。Steam以外は完全に暗号化して、同じマシンの別のドライブに毎時間同期し、ローカルサーバーにはあまり頻繁に同期しない予定です。データセットはすでに暗号化されているので、外部ドライブやクラウドサービスに同期することもできます。こうする理由の一つは、VPS上のSeafileにフルフォトアーカイブを保存するのが高すぎるからです。

家族や友達が使いやすい > これは、できるだけ多くのサービスで、理想的にはSSOを使って、1人1つのログインを維持することを意味する。 本当にSランクの目標だね。すごく難しいけど、すごく素晴らしい。ずっと前から、Linuxとオープンソースは一種のパラドックスだと言ってるんだ。どこにでも行けるし、あらゆるプロトコルを話す。でもクライアントとして、エンドユーザーとしては、全体の調整、グループウェアの構築、ネットワークの統合はすごく難しいし、定義する必要がある。多くのシステムを連携させたり、ディレクトリインフラを持つことは本当に素晴らしい。何年も前から、いつかFreeIPAやWindows互換のディレクトリサービスを運用するだろうと思ってたけど、もしかしたらOpenID的な世界が形になりつつあるのかも。

そのパラドックスには完全に同意だよ。昨日、FOSSが非技術者にはアクセスできないって問題検証プラットフォームに投稿したばかりなんだ。[1] 技術者と非技術者をつなぐプラットフォームがそれを解決できるか考えてるんだ。個人向けのシステムインテグレーターみたいな感じで。

ありがとう!シンプルなログインとアクセスは確かに一番難しい要件だったけど、それがあるかないかで人が使うかどうかが変わるからね。オープンソースはどこにでもあるって感じには同意するけど、普通のユーザーが何かを手に取るまでの話だよね。あなたが言ってるパラドックスの一部は、各プロジェクトが自分のことに取り組んでいるから素晴らしいけど、同時にすべてを一方向に進める単一の存在がないってことだと思う。でも、それが良いユーザー体験を得られない理由にはならないよ。自己ホスティングの分野だけでも、ここ5年でセットアップや使用の観点からずっと使いやすくなったから。

正直、そんなに難しくないよ。特定のサービスにこだわらず、SSOの互換性をメインの選定基準にすれば、かなり実現可能で難しくないよ。自分のホストシステムを設定したときは経験がほとんどなかったけど、CaddyとAuthentikを使ってすぐに設定できた。代わりに、YunoHostはSSOを使ってすべてをセットアップするのがとても簡単なディストリビューションだよ。

自分のホームネットワークについて考えると、死んだ後に家族に何を残すか、設定が壊れたときにどれだけ迷惑をかけるかを考えちゃうことがある。警察の鑑識チームがそれを理解するのにどれだけかかるかとか。ホームラボって、昔の人たち(言いたくないけど、ほとんどが男性だね)が地下室で詳細なスケールモデルの鉄道を作るのと同じような欲求を満たしてると思う。特に否定的な意味ではなくて、ただ、コントロールできるポケットワールドを持ちたいっていう深い欲求がある人がいるんだと思う。

あなたのセットアップが気になるな。すごく管理が難しいのか、それともわざわざそうしてるの?

これについてはかなり考えたよ。NASとそのDockerサービスは、他の誰かのために起動することはないと思う。オフサイトの暗号化バックアップは、誰かを雇わないと復元できないかも。だから、- cronが毎日変更されたスナップショットを新しいフォルダーにコピーするために、NTFSフォーマットの外付けUSBドライブを持ってる。紙なしや、seafileライブラリのフラットファイルコピーみたいなもの。サイズは小さくて<50GB、複製は安い。もし死んだり、バラバラになったりしたら…そのドライブは別のマシンに接続する必要がある。各種ノートパソコンにも、反復的な変更なしのseafile全ライブラリのコピーがある。同期が切れたら…ノートパソコンを使い続けて。- 友達のところや職場に、同じハードドライブを持った小さなPC/Raspberry Piを置こうと思ってる。- メールドメインは10年間更新されていて、更新が簡単なiCloudでホストされてる。ただ、ストレージがいっぱいになると家族の写真のメールがバウンスするのはあまり良くないから、migaduに戻るかもしれない。

誰かがその設定を管理できなくなったとき(休暇、入院、亡くなったときなど)に何が起こるかを考えるのは大事だと思う。特に簡単にできるように作ったわけじゃないから、もっと考えなきゃね。一番大事なのは、重要なデータを取り出せることと、それを可能にする認証情報にアクセスできることだよ。Nextcloudみたいなものを設定して、他の人のデバイスに重要なデータを常に同期させるのもいいかも。でも、もう一つ重要なのは、みんながそのサービスに関与することだと思う。パートナーがほとんど気にしないだろうけど、Home Assistantの使い方や自動化については私と同じくらい知ってるよ(やったことは少ないけど)。そういうのは、私たちの生活にとってコアな部分になるから、ちゃんと動き続けるべきだよね。それが別の「アプライアンス」で、VMじゃないのも管理に役立つと思う。でも、これはかなりの希望と推測だね。誰かが残ったときに一緒に詳細な計画を立てるのが、成功するためには重要だと思う。

ポケット鉄道の方が、私のローカルネットワークの設定よりもずっと分かりやすいと思う。

誰かがあなたの物理ディスクを盗んで大事な家族のデータを手に入れるなんていう無駄な脅威シナリオは無視しちゃえば大丈夫だよ。つまり、すべての写真や重要な書類をクリアな状態で保存して、簡単な指示を書いておけば、問題ないはず。私の場合は、ホームオートメーションの方が心配だな ^^;

死亡時にメールを送信するデッドマン・スイッチサービスがあるよ。理論的には、自分でホスティングしていれば、制御している受信トレイにメールが届いたときに何かをトリガーできるかも。Webhookのバージョンを作ろうかとも考えてるけど、メールの方法に比べて大した価値はないかな。

このコメントがここにあるのを見て嬉しいよ。みんな家族や友達のためにこういうプロジェクトを作るのは素晴らしいけど、もし唯一のシステム管理者が突然亡くなったらどうなるか考えないのは良くないよね。職場で一人に全ての鍵を持たせるなんてしないでしょ?それと同じことがホームラボにも当てはまる。僕は家族に全ての鍵を渡してはいないけど、彼らがそれを手に入れるための明確なルートと手順を書いてあるからね。セットアップの概要や頼れる友達や同僚のリストもあって、これで彼らは全てにアクセスできるし、使い続けるかデータを別の場所に移すか決められるんだ。

いいまとめだね、ありがとう。NixOSをサーバーに入れようと思ったことはあるけど、今はproxmoxの方が好きだな。NixOSとProxmoxのプロジェクトもあるけど、まだ試してない。 > 「私のメインストレージの設定はかなりシンプルです。4つの10TBハードドライブをRAIDZ2データvdevで使っていて、256GBのSSDをキャッシュvdevとして追加しています。つまり、2つのハードドライブが壊れてもデータを失わないということです。それで、約19TBの使用可能なストレージがあって、今はその10%未満しか使っていません。成長する余地はたっぷりあります。」新しいシステムを買うときはこれを考えるべきだと思うし、ディスクがたくさん余ってないときは特にね... 4つの10GBディスクでRAID-Z2を組むのは、2つの20GBディスクでRAID1を組むのと同じスペースを提供するよ。今はスペースが必要ないから、2つの10TBディスクでRAID1を組んで、必要になったら2つの20TBに交換するのもアリだと思う。これならコスト的にも効率的だし、4つのディスクを交換する代わりに2つだけで済むから、時間も短縮できるし、TBあたりの価格も時間とともに下がるだろうから、かなりお金も節約できると思う。でも、2つのディスクを失う能力があっても、どこかにバックアップがないと意味がないよね...

ああ、私がやった方法が必ずしもコスト効率が良かったとは思わない。半分はセールで買ったけど、設定する時間が取れなくて、もう半分はサーバーを組み立てた後に別のセールで買ったんだ。今のプランを考える前に買ったからね。一時はKubernetesクラスターでサービスを増やそうと思ったけど、そのアイデアはやめた。RAIDはバックアップの代わりにはならないっていうのには同意する。重要なデータはデスクトップとノートパソコンに保存していて、将来的には専用のバックアップサーバーを計画してる。RAIDは、何か問題が起きたときに余裕を持たせてくれるし、それが価値があると思ったんだ。

OPが言ってる通り、こういうことは決定を下すときに考慮すべきだと思います。参考までに、私のNASは4x4TBのドライブを使っています。2〜3年前に新品で一度に買ったときは、同じ2x8TBを買うよりも安かったです。ただ、私の状況は少し違って、raidz1を使っているので。ミラーを使うことも考えたんですが、容量をアップグレードするのを楽にするために。でも、こんなに早く埋まるとは思っていなくて、実際、昨日はまだ70%未満でした。

私のはもっとシンプルだよ: - 一台のマシン - nginxプロキシ - 同じマシン上で多くのサービスを運営してる;内部用のもあれば、公開用のもあって、全部ウェブからアクセスできる! - 内部用のはHTTPベーシック認証用に超大きなパスワードを外部のパスワードマネージャー(Firefoxの内蔵のやつ)に保存してる - 公開用のはそのまま公開か、Google OAuthを使ってる これらは全部、ホームラボの目的でゼロからコーディングしたよ。画像が欲しい?ブラウザで読めるよ。動画は?ブラウザで再生できる。私にとって難しいのはバックエンドで、フロントエンドは「90年代のHTML」って感じだね。

いいね!友達がインフラやサービスをゼロからプログラミングし始めたんだ。自分のニーズに合わせて作るのは、学ぶにはいい方法だよね。

HTTPはパスワードを平文で送信します。少なくとも自己署名証明書を使った方がいいですよ。

Autheliaは、いくつかの方法でサービスの認証と認可を提供します。OpenID Connectをサポートしているサービスには、非常にシンプルなシングルサインオン体験を提供します。そうでない場合は、Autheliaが私のリバースプロキシ(nginx)と統合して、ユーザーがサービスにアクセスする前にログインを要求します。最近、GiteaやForgejoがOAuthプロバイダーとして機能できることを知りました。これらはLDAPをサポートしているので、例えばSamba ADを展開して、Gitea/Forgejoの認証ソースとして設定できます。OAuth機能を有効にすれば、Grafanaなどに接続してSamba ADの資格情報でログインできます。Forgejoはgitやwiki、Dockerレジストリ(認証済み)なども提供できるので、専用の認証サービスを運用するより便利だと思います。これは本当に過小評価されているソフトウェアで、リソースもほとんど使わないです。

今日は、別のサイトでDNSをIPv6で正しく動かす計画を立てて起きました。Wireguardを使って、ポイントツーポイントのリンクにはULAを使っていて、GUAはULAへのルーティングを好まないんです。お互いにWireguard越しにGUAをルーティングするか、ネットワーク内にULAを展開するかの選択肢だと思いました。4時間後にはULAで全ての設定が完了しました。昼食をとって、これはひどいと思いました。その3時間後には、GUAがWireguardを通って動いています。ホームラボは楽しいね :')

いいね。でも、なんでFlameなの?nodeやreact、reduxを使って作られてるから、セキュアな環境に何十個、下手したら何百個ものサードパーティの依存関係を持ち込むことになるよ。スタートページのためにそこまでする価値はないと思うな(単純にハードコーディングされたリンクのHTMLページで十分じゃない?)

すごくいいブログ記事だけど、僕のテクノロジーに詳しい家族との経験から言うと、サービスを公開しないのは絶対にUXを台無しにするよ。誰もローカルのnextcloudを使わないのは、信頼できると思ってないからだし、彼らの視点ではいつも動くわけじゃないし、使い方も面倒だから。外部アプリ(Tailscale)が必要だからね。これを解決するには、アプリ自体がVPN接続をトリガーできるようにする必要があるけど、そんなのすぐには実現しないと思う。

オープンソースでもセルフホスティングでもないけど、CloudFlareのゼロトラストは素晴らしくて無料だよ。僕のセットアップでは、ホームラボのマシンにcloudflaredトンネルを設定して、VPNなしで個別のサービスを公開してる。SSOで認証も設定できて、バックエンドアプリに到達する前に行われるから、より安全なんだ。家族や友達にとっては簡単に使えるし、彼らは自分の側で何も設定する必要がなくて、URLに行ってログインするだけで済むよ。

なんで人々がWireguardポート以外は何も公開しないのを選ぶのか全く理解できない。僕はWi-Fiに繋がってない時に自動的に自宅のLANに接続して、リスクなしで自己ホスティングのサービスにアクセスできるクライアントを持ってる。サードパーティのソリューションに頼ることになるけど、それが政府機関向けに作られているかどうかもわからないし、Cloudflareが間違えないと信じる必要もある。あと、ロードウォリアーセットアップのためにCloudflareをどう設定するの?変わり続けるダイナミックIPをどう追跡するの?僕が必要なのはWireguardクライアントだけで、すべてうまくいくんだ。