Cover Image for ジ。 ―自宅鯖の変遷について。―

ジ。 ―自宅鯖の変遷について。―

ジ。 ―自宅鯖の変遷について。―

この記事は、2013年ごろに友人から譲り受けたPCから始まった自宅鯖との格闘の記録です。
当初日経Linux片手にUbuntuで遊ぶだけだった私が、いつの間にか自宅にサーバーを設置するに至ったか、その変遷を振り返ります。
自宅鯖を立てることに興味がある方の参考になれば幸いです。

思想

本題に入る前に、私の思想を明確にしておきます。

初学者はDockerを使うべきではない、または控えるべきである。

これは単なる懐古やDockerの手軽さを否定するものではありません。
むしろ環境の差異を吸収し、開発者が意図したとおりの環境で動作させられるコンテナ型仮想化技術は素晴らしいものです。

ここで私が許容できないのは、初学者がDockerを濫用することでアプリケーション内部動作がブラックボックスになってしまうという点です。
サービスが依存するライブラリ、カーネルとの兼ねあい、ネットワークの挙動など、サーバー運用に限らずIT人材として生きていくうえで大切な知識が身につかなくなります。

もちろん自分で学習すれば良いのですが、実動作を理解せず学習しようとするとコストが大きく挫折の原因になりかねません。
勉強というのは学ぶより実際に手を動かすほうが大概効率良く学習できます。

Dockerが抽象化したレイヤーで何が起こっているのかを正しく理解することで、Docker環境でのトラブルシューティングも簡単になります。
ネットワークのブリッジ設定が悪くて繋がらない、ホストのリソースが不足していてコンテナが起動しない、ディレクトリ構造を理解できず.envファイルなどをアタッチできない、などなどDockerを使用していても起こりうるトラブルは無数にあります。

自宅サーバーは押し付けるべきものではない。

自宅サーバーを立てることは、必ずしも全ての人にとって最適な選択肢ではありません。
ブログを公開したいだけなのに、Xeon Goldを導入するなどまったくもって無駄な投資です。
CloudflareやGithubなどの無料ホスティングサービスを使うほうがはるかに安上がりでしょう。

自宅サーバーの運用には、ハードウェアの管理、ソフトウェアの更新、セキュリティ対策など、多くの責任が伴います。
電気代やインターネット回線の使用料など、運用コストもバカにできません。
大抵の人にとって自宅サーバー用のパーツは中古ないしコンシューマー向け製品です。
信頼性や耐久性、安全性においてエンタープライズ製品に大きく劣り、破損時のコストも大きくなります。

一番大きな問題として、火災を引き起こすリスクがあります。
サーバーは常に稼働しているため、埃による過熱や電気系統のトラブルが発生しやすくなります。

これらをすべて無視して自宅サーバーを無理に押し付けることは無責任極まりない行いです。

それでもサーバーを立ててみてもらいたいのも事実ではありますが。

自宅鯖の変遷

本題に入りましょう。

2013年: Ubuntuと『日経Linux』

現在ITエンジニアとして生きていますが、すべての始まりは2013年に友人から譲り受けたPC(OSが飛んでるゴミ)でした。
OSのインストールすら知らない、というかOSすら知らなかった私は、PCをもらったことをきっかけに日経Linuxを読み始めます。
apt-getだのlsだのsudoだの、黒い画面に打ち込むだけで操作ができることに感動し、Linuxの世界にのめり込んでいくことになります。(X環境はあったけどね)

この時点ではサーバーのサの字もありません。ただ好奇心を満たすだけの遊び場でしかありませんでした。
自宅サーバーという沼に沈むのに、高っかい機器は要りません。押し入れで腐っている古いPCやラズパイなどで十分です。

2016年: 自作PC

Linuxで遊ぶうち、貰ったPCのスペックに不満を感じ始めて自作PCに手を出しました。
貰ったPCがCeleron Mだった
選んだCPUはPhenom II X4 955 BEです。
もう既にSkylakeが出ていた頃ですが、あくまでまだおもちゃの範囲だったのでコストが優先でした。

さらにOSをとっかえひっかえしてZorin OSやらLinux MintやらArchやらを試してディストリビューションやデスクトップ環境の違いを理解し始めます。

そのうちにCPUパワーの不足を感じてPhenom II X6 1055Tへ換装します。
やたらAMDを選んでいたのはなんだったんですかね?

2018年: サーバーに触れる

Linuxに飽きてPCゲームに手を出し始めます。
釣り記事ですか? 違います。

i7-8700Kの殻割に失敗してマザーボードごと潰してしまったので全く同じパーツを買い直しました。
アホです。

この頃、Skypeで知り合った友人からMinecraftサーバーの運営補助を頼まれます。
ハードウェアにそこそこ知識がついていたので、快諾しました。

P_20220611_230243_preview.jpeg

これが、遊びからサービスを安定稼働させるという次のステップへの第一歩でした。

2019年: 自宅サーバーの設置

お待たせしました。ここからが本題です。
メイン機をi9-9900KとRTX2060へ更新し、完全に存在を忘れていたPhenom機が押し入れから出てきたのがきっかけで自宅サーバーを構築しました。

スペックはこんな感じです。

  • CPU: AMD Phenom II X6 1055T
  • RAM: 8GB DDR3
  • ストレージ: 500GB HDD

かわいい構成ですね。
OSはCentOS 7でした。理由はなかったと思います。

このよわよわPCで、Nextcloudの運用を始めました。
冗長化もなく、SSDキャッシュも搭載せず、バックアップもない構成でした。

2020年: Phenomの限界とProxmoxとの出会い

Nextcloudを運用しているうちに、Phenom II X6の非力さが目立つようになってきました。
LAMPアプリケーションのNextcloudはDBとPHPの負荷が高く、ちょくちょくアップロード中に止まることがありました。

痺れを切らしてi5-3550&16GB DDR3へ更新します。
パフォーマンスが大きく改善され、快適な動作になりました。
自宅サーバーを強化するとこんなにストレスがなくなるのか、と言う悪い体験をしてしまいましたね。

友人のMinecraftサーバーの参加人数が増えてシングルスレッド性能が不足していたため、相談の上Proxmox VEなるものを導入しようという話になりました。
VMで分割してスレッドを割り当てることで、より多くの参加者を捌けるようになるという算段です。
これはうまく行きました。
クラスタリングしてCephストレージも導入してみたものの、遅すぎてすぐに解除となりました。

WebUIからコンソールにアクセスでき、しかも別の環境として独立させられるなんてなんと素晴らしいのかと感動した記憶があります。
この頃から私のサーバーがどう進化するかは決定されていた気がします。

2021年: スタック最適化

稼働中のNextcloudのチューニングにのめり込んでいました。
カーネルパラメータの最適化、DBのチューニング、リバースプロキシの設定効率化など、様々な試行錯誤を繰り返しました。
ここでWebサービスの基礎知識が身に付きました。

Nginx+Nextcloud環境を構築 - Qiita
はじめに 自宅のサーバーにNextcloudを構築したのでその覚書です。 Nextcloudのセキュリティチェックも潰していきます。 基本的になんも考えてないので、SELinuxを速攻で無効化したりMariaDBのユーザーがrootだったりします。 そのためセキュリティが...
Nginx+Nextcloud環境を構築 - Qiita favicon https://qiita.com/katori_m/items/227c06fc2a4b79095864
Nginx+Nextcloud環境を構築 - Qiita
Nextcloudにおけるphp-fpmのチューニング - Qiita
やたらNextcloudの動作が重い 前回Nextcloudのセットアップを記事にしましたが、そのまま使うとメモリが足りなかったりCPUのスレッドを食いつぶしたりすることが判明したので、それぞれのスペックに合わせたチューニングを書いておこうと思います。 前提条件 ph...
Nextcloudにおけるphp-fpmのチューニング - Qiita favicon https://qiita.com/katori_m/items/5afeb5824b6996274c47
Nextcloudにおけるphp-fpmのチューニング - Qiita

2022年: 停電、暗転、サーバー故障

停電でメインストレージ(オンリーワン)が吹き飛びました。
動かしていたサービスは、Nextcloud, Archiveboxだけでした。
データ保全の意識が全くありませんでした。バックアップ?んなもんねえよ。

これがきっかけになり、本格的にインフラ再構築をし始めます。
まずハードウェアを大幅に更新しました。
CPUはXeon E5-2689へ、RAMは64GB DDR3 ECCになりました。

AliExpressを知ったのもこの頃です。
その辺のコンシューマー向けパーツより安くエンタープライズグレードの物が買えることを知ったのも大きかったです。

LVMという悪夢

ストレージ構成を見直しました。
RAIDの真価を知らず、ただ容量が減るだけだと思っていた(そんなわけない)私は、何を考えたかLVMでJBODアレイを構築し運用し始めます。
LVMは便利な技術ですが、冗長化を伴わない構成では故障時に全データを失うリスクがあります。

OSのメンテナンス中、何も考えず実行したyum updateがlibc.so.6を更新し、カーネルパニックでOSが起動しなくなりました。
LVMメタデータをバックアップしていなかった私は、丸2日くらいかけデータ復旧に挑みました。
かろうじて救出できましたが、生きた心地はしませんでした。

OS移行時にLVM構成を復旧する (メタデータファイルなし) - Qiita
原因 OSの移行 サーバーの定期アップデートをしようと思い、yum updateをかけたところlibc.so.6が勝手にアップデートされて再起動後にカーネルパニックを起こして起動できなくなってしまった。 LiveUSBからリンク貼り直しetcを試したものの復旧できず、設...
OS移行時にLVM構成を復旧する (メタデータファイルなし) - Qiita favicon https://qiita.com/katori_m/items/2e5ca49088bd903e1e21
OS移行時にLVM構成を復旧する (メタデータファイルなし) - Qiita

この生きた心地のしない復旧作業が、スナップショットなきアップデートは自殺行為であるということと、LVMはボリューム管理を便利にするだけで、データ保全性はないという教訓を私に与えました。

2023年: Proxmox導入

アホ

2022年に悪夢を見たにもかかわらず、依然としてめんどくさがって更新していませんでした。
電子レンジとトースターの同時使用でブレーカーが飛び、またもストレージが吹き飛びます。
ここで、本気でデータの保全をしなければならないと痛感しました。

Proxmox VEの本格導入

友人のサーバーで使用してある程度慣れていたProxmox VEを導入します。
VMのスナップショットを取れ、ZFSでソフトウェアRAIDを組め、バックアップも簡単に取れる。
これ以上の選択肢はありませんでした。

環境を分離して運用できる仮想化基盤に再び感動し、VMを乱立させ始めます。

サーバーの再度増強

当然そんなことをしていればあっという間にメモリが枯渇するので、ここで再度増強を行います。メモリを128GB DDR3 ECCへ増設しました。

20231218_204015.JPG

ストレージもコピーオンライト・トランザクショナル・HDD1台までの故障に耐えるZFS RAIDZ1構成へ移行します。
1TB HDDを6台使用し、合計5TBの冗長化されたストレージを確保しました。
これはトラウマに対する私なりの回答でした。

監視スタック

いろいろとインフラを複雑化させるにつれ、一括で状態確認ができる必要を感じました。
内部DNSとしてUnboundを導入し、サーバーリソース監視にInfluxDB+Grafanaを導入しました。
また、unbound_exporterとPrometheusを経由してGrafanaに監視データを流し込みDNSの状態も監視できるようにしました。

Unboundで内部ネットワーク用DNSを構築し、PrometheusとGrafanaでDNSクエリをモニタリングしよう - Qiita
追記 AdGuardHomeのほうが簡単そうなので、こちらの記事をおすすめします。 はじめに 自宅内ネットワークでいろいろする際、インターネットに公開しているドメインを使ってアクセスしたい時があると思います。 しかし大半の家庭用ルーターはヘアピンNAT機能を搭載し...
Unboundで内部ネットワーク用DNSを構築し、PrometheusとGrafanaでDNSクエリをモニタリングしよう - Qiita favicon https://qiita.com/katori_m/items/cfaa9743eb417e985240
Unboundで内部ネットワーク用DNSを構築し、PrometheusとGrafanaでDNSクエリをモニタリングしよう - Qiita

WAN事件簿

インターネット回線として使用していたNURO光が障害の頻発とMAP-Eへの強制移行で使い物にならなくなりました。
1つのグローバルIPアドレスを複数の契約者で共有し、利用可能なポート番号を厳しく制限されるMAP-Eは自宅サーバー運用には致命的です。
NUROのMAP-Eは固定IPサービスを提供しておらず、一時的に自宅サーバーの停止に追い込まれます。当時はかなりブチギレていました。

この時期、Nuroとの戦いの傍らArchiveBoxやKomgaといった内部サービスをNginxリバースプロキシでHTTPS化する作業も並行していたので進捗を0にされるのは非常に辛かったです。

キレた勢いで回線を変更します。移行先はenひかりクロスです。

2024年: インフラ再強化

NextcloudからPydio Cellsへ

Nextcloudの運用を続けていましたが、どうしてもパフォーマンスが出ず不満が募っていました。
特に大容量ファイルのアップロード時に顕著で、PHPの制限やDBのチューニングをいくらやっても改善しません。
そこで、NextcloudからPydio Cellsへ乗り換えました。
Pydio CellsはGo製で、シングルバイナリで動作するため非常に軽量です。
また、WebUIも洗練されており、快適性が大幅に向上しました。

ネットワークの10GbE化

年明けくらいにenひかりクロスが開通しました。
上り下りともに最大10Gbpsを提供する回線なので、内部ネットワークが外部ネットワークに追いつかなくなります。
そこで、宅内ネットワークを10GbE化しました。

自宅LANを壁内配線する方法|CF管にCAT6Aケーブルを通線
自宅のPC部屋とサーバー部屋を結ぶLANを、CF管を使って壁内配線した作業記録です。CAT6Aケーブルと工具不要のLANジャック、通線ワイヤーを用意し、情報分電盤から配線してジャックを取り付け、テスターで確認するまでを写真付きで紹介します。10Gbpsでリンクアップした結果も掲載しています。
自宅LANを壁内配線する方法|CF管にCAT6Aケーブルを通線 favicon https://www.katori.dev/posts/0196626f-0769-73ec-99a5-8cc90b63920d/
自宅LANを壁内配線する方法|CF管にCAT6Aケーブルを通線

第2ノードの導入

中古でMAGNIA T1340dを購入し、第2ノードとして導入しました。
ここでProxmoxクラスタを構築しました。スプリットブレイン対策として、Raspberry Pi 4をQデバイスとして導入し、3ノードクラスタとしての運用を開始します。
また、500GB HDDを2台搭載してZFSミラーを構築し、Proxmox Backup Serverの運用も開始しました。

GPUパススルー

メインノードにQuadro P400とGT710を追加し、GPUパススルーでVMに割り当てました。
GT710はWindows VMに割り当て軽量なゲームの処理に、Quadro P400はjellyfin VMに割り当ててHWエンコードに使用しています。

ネットワーク全体の広告ブロック

自宅ネットワーク全体で広告ブロックを行うため、Adguard Homeを導入しました。
AdguardHome_Syncを使用して各ノードにDNSサーバーを展開し、設定を同期して冗長化しています。

AdGuard Homeで広告ブロック&お手軽内部ネットワーク用DNSを作ろう(ついでに冗長化) - Qiita
はじめに 以前、こんな感じで内向きDNSを作りました。 しかし、サーバー1台のみで動作しているのでこのDNSを動かしているサーバーが落ちてしまうと家の中のネットワーク接続が全て死んでしまいます。 そこでAdGuard Homeで広告をブロックしつつ、AdGuardH...
AdGuard Homeで広告ブロック&お手軽内部ネットワーク用DNSを作ろう(ついでに冗長化) - Qiita favicon https://qiita.com/katori_m/items/02aef27024b848b160a4
AdGuard Homeで広告ブロック&お手軽内部ネットワーク用DNSを作ろう(ついでに冗長化) - Qiita

2025年: さようなら、10GBASE-T、こんにちは、SFP+

第2ノードを売却し、新たにXeon E5-2650 v4&32GB DDR4 ECCマシンを構築しました。

IMG_20250502_225959.jpg

運用しているうちに、10GBASE-Tの消費電力と発熱が気になり始めたため、SFP+に移行しました。
コンシューマ向けの10GBASE-T機器は供給が少なく、5ポートスイッチですら3万円程度かかります。
また、エラー訂正等の処理で負荷が高く消費電力が大きいので、発熱は莫大でした。

そのため、SFP+&OM3への全面移行を決断しました。

自宅にSFP+で10GbE環境を構築しよう - Qiita
はじめに アーリーアダプターには普及してきた10Gネットワーク環境ですが、一般の家庭にはほぼ普及しておらずメタル10Gのコンシューマー機器の弾数も非常に少ないのが現状です。 さらに、供給数が少ない分コストが非常に高いです。 TP-Linkの5ポートスイッチが3万円強、今私...
自宅にSFP+で10GbE環境を構築しよう - Qiita favicon https://qiita.com/katori_m/items/d09d045f308b5e867726
自宅にSFP+で10GbE環境を構築しよう - Qiita

10GBASE-Tなら5万円はかかったであろう構成が、2万円程度で構築できました。
10Gbpsネットワークは、発熱とコストに悩む10GBASE-Tではなく、中古市場が成熟して安価で低発熱なSFP+から始めることが最適解だと思っています。

現在

10年間の試行錯誤、無数のデータ喪失、LVMからの脱却、そして光ファイバーの導入を経て現在の自宅サーバークラスタは以下の構成で稼働しています。

ノード1ノード2ノード3 (Qデバイス)
CPUXeon E5-2676 v3Xeon E5-2650 v4BCM2711
RAM128GB DDR3 ECC32GB DDR4 ECC4GB
OS領域500GB SSD256GB SSD512GB MicroSD
その他ストレージ1TB HDD x6 (ZFS RAIDZ1)500GB HDD x6 (ZFS RAIDZ1)なし
NICIntel 82599ES 10GbE x2Intel 82599ES 10GbE x2オンボード
GPUQuadro P400, GT710なしなし

サービスは以下のように分散されています。

  • ノード1
  • Nginx: 全サービスへのアクセスを捌くリバースプロキシ
  • Pydio Cells: ファイル共有サービス
  • Jellyfin & Komga: メディアストリーミングと電子書籍管理。Quadro P400がトランスコーディングを担当。
  • ArchiveBox, Docmost, etc...: 軽量サービスをLXCコンテナで運用
  • プライマリDNS: Adguard Home
  • ノード2
  • InfluxDB + Grafana: 監視スタック
  • Proxmox Backup Server: バックアップ基盤
  • NFSサーバー: ストレージ共有基盤
  • ノード3
  • Qデバイス: Proxmoxクラスタの分散合意を支援
  • セカンダリDNS: Adguard Home

おわりに

2013年にLinuxで一喜一憂してから早10数年。
Phenomの「もっさり感」に悩み、i7の殻割りに失敗して数万円の授業料を払い、Minecraftサーバーで管理責任に目覚めた。
CentOS 7とNextcloudで「サーバー」の価値を知り、停電とブレーカー断で「データ喪失の恐怖」を骨身に染みて味わった。
LVMの復旧という薄氷を踏む経験が、Proxmoxの「スナップショット」とZFSの「データ堅牢性」へと導いた。
Nuroの0ポート制限との戦いが、enひかりと10Gbps WANという新たなステージを開いた。
10GBASE-Tの「発熱」との格闘が、SFP+と光ファイバーという物理層の知識を与えてくれた。
現在の構成は、10年間の失敗と教訓の集大成です。
もちろんまだまだ改善しないといけないところはあります。

次はCephの本格導入か、はたまたk8sへの挑戦か。
いずれにせよ、自宅サーバー運用の旅はまだまだ続きます。

この記事を読んで、自宅サーバーに少しでも手を出してみたいと思ってもらえれば幸いです。