プログラミング

古いWindows機を自宅Linuxサーバーにする|Ubuntu+CasaOS+Dockerで土台を作る

買い替えて使わなくなった古いWindowsデスクトップ(Core i5-6400・メモリ8GB)を、Ubuntu Server 24.04 LTS の自宅サーバーにした手順です。SSHの方針、データ用HDDのUUID指定での自動マウント、CasaOSとDockerによるアプリ管理、Sambaでのファイル共有、UFWでの入り口の絞り込みまで、実際に使っている設定値とあわせてまとめました。

目次

はじめに

サブスクの請求書を眺めていて、「これ全部、自分のパソコンで動かせないのかな」と思ったことはありませんか。

私自身、Obsidian Sync・Google Drive・Google Photos・RSSリーダーと、月々の小さな課金が積み重なっているのが地味に気になっていました。
そんなとき、買い替えて使わなくなった古いWindowsのデスクトップが手元にあったので、思い切ってこれを「自宅サーバー」にしてみることにしました。
普段の仕事でPythonを少し触る程度で、Linuxのコマンドもサーバーの知識もほとんどありませんでした。

結果として、2016年ごろの中古スペック(Core i5-6400・メモリ8GB)に、18個のアプリ(コンテナ)と各種の自動化を載せて、55日以上ノンストップで動かせています。
動作の重さの目安になる「負荷の平均値(ロードアベレージ)」も0.4前後と低いままで、まだまだ余裕があります。

この記事では、その土台になるOSの準備と初期設定を、専門用語をひとつずつ噛み砕きながら紹介します。
具体的には、Ubuntu Serverのインストール、データ用HDDの自動マウント、Docker基盤(CasaOS)、ファイル共有(Samba)、ファイアウォール(UFW)までを、私が実際に使っている設定値とあわせて書いていきます。
少し長くなりますが、ここさえ乗り越えれば後はぐっと楽になります。

そもそも「自宅サーバー」とは何か

最初に言葉の整理だけさせてください。

サーバーというと難しそうに聞こえますが、要するにずっと電源を入れっぱなしにして、いろいろなアプリを動かし続けるパソコンのことです。
普段使いのパソコンと違う点は、画面の前に座って操作するのではなく、別の端末から命令を出して、裏で黙々と働いてもらうという使い方をするところです。

写真のバックアップ・ファイルの同期・ニュースの自動収集などは、人が見ていなくても24時間動いていてほしいですよね。
こういう「ずっと動いていてほしい仕事」を一手に引き受けてもらうのが自宅サーバーです。

クラウドサービスと自宅サーバーの違い

ふだん使っている「クラウドサービス」と「自宅サーバー」の違いを整理しておくと、これから何をしようとしているのかが腑に落ちると思います。

Google DriveやGoogle Photos、Obsidian Syncのようなクラウドサービスは、要するにどこかの会社が用意した巨大なサーバーを、月額料金を払って間借りしている仕組みです。
便利な反面、いくつか気になる点があります。

  • 使い続けるかぎり料金がかかる:サービスごとに月数百円でも、積み重なると地味な固定費になります。
  • データを預けている:自分の写真やファイルが、よその会社のサーバーに置かれている状態です。
  • 値上げや仕様変更に従うしかない:料金プランや容量が変わっても、利用者側はどうにもできません。

一方の自宅サーバーは、同じような機能を、自分の家のパソコンの中で動かすやり方です。
電気代こそかかりますが、月額料金はかからず、データも自分の家の中に置いておけます。
その代わり、設定や管理は自分でやる必要があります。

そもそも「Linux」「Ubuntu」とは何か

このあとサーバーには「Linux(リナックス)」というOSを入れます。
OSというのは、WindowsやmacOSのような、パソコンの土台になる基本ソフトのことです。
LinuxはそのOSの一種で、無料で使えて、世界中のサーバーで定番として使われているのが大きな特徴です。

サーバー用途でLinuxが選ばれるのには理由があります。

  • 無料:ライセンス料がかからないので、サーバーを気軽に立てられます。
  • 軽い:画面の飾り(デスクトップ環境)が無い「サーバー版」を選べるので、古いパソコンでも軽快に動きます。
  • ずっと動かし続けるのが得意:再起動をあまり必要とせず、安定して長期間動き続けます。
  • 情報が多い:サーバーの定番なので、困ったときに検索やAIで答えが見つかりやすいです。

「Ubuntu(ウブントゥ)」は、そのLinuxの中でも特に利用者が多く、情報が豊富な種類です。
Linuxにはたくさんの種類(ディストリビューションと呼びます)がありますが、迷ったらUbuntuを選んでおけば安心かと思います。

この土台の上に載せているもの

この記事で作る土台の上に、私は次のようなものを載せています。
どこへ向かう作業なのかが見えていたほうが読みやすいと思うので、先に並べておきます。

この土台の上に載せているものの全体像

土台まわりでは、面倒な設定をAIに任せるためのサーバーへのClaude Code導入と、外出先から安全につなぐためのTailscale、それに暗号化ディスクへのバックアップを入れています。

クラウドの月額サービスの置き換えとしては、ファイル同期のSyncthing、クラウドストレージのNextcloud、写真管理のImmich、RSSリーダーのMinifluxを動かしています。

自作寄りのものとしては、Obsidianを操作するMCPサーバーと、スマホからClaude Codeを操作するWebアプリを載せています。

要するに、クラウドの月額サービスを少しずつ自宅サーバーへ引っ越していく、という話です。

なお、この引っ越し作業そのものを助けてくれるのが「Claude Code」というAIツールでした。
面倒な設定をほとんどClaude Codeにやってもらえたのが、非エンジニアでもここまで作れた一番の理由です。
その導入と使い方はサーバーへのClaude Code導入の記事にまとめてあるので、この記事ではまず前提になる土台を用意します。

私の構成(実際のスペックとディスクの分け方)

最終的に、この土台は次のような構成で動いています。
私の環境の実際の値です。

私の構成(実際のスペックとディスクの分け方)

ポイントは、OSを入れるディスクと、データを置くディスクを物理的に分けたことです。
理由は3つあります。

  • OSを入れ直してもデータが残る:システム用ディスクをまっさらにしても、写真やファイルはデータ用ディスクにそのまま残せます。
  • 容量の管理が分かりやすい:「システムが何GB、写真が何GB」と用途ごとに把握できます。
  • バックアップ先を別物理ディスクにできる:元データとバックアップを同じディスクに置くと、そのディスクが壊れたとき両方失います。3枚目のディスクを暗号化してバックアップ専用にしています。

CPUやメモリのスペックは、正直そこまで気にしなくて大丈夫でした。
上の中古スペックでも、18個のコンテナを動かして負荷の平均値が0.4前後ですから、まずは手元の古いPCで試してみるのがいいと思います。

ステップ1:UbuntuをインストールしてLinux機にする

まずはWindowsを消して、Ubuntu Server 24.04 LTS を入れます。

バージョン名の「LTS」は Long Term Support(長期サポート)の略で、数年単位で長くアップデートが提供される安定版という意味です。
サーバーは長く動かし続けるものなので、基本はLTS版を選びます。
「Server」版を選ぶと、画面の飾り(デスクトップ)が付かない分だけ軽く、古い機体でもメモリを無駄に食いません。

おおまかな流れはこんな感じです。

  • いま使っているパソコンで、Ubuntu Serverのインストール用データを「USBメモリ」に書き込む(公式サイトから無料でダウンロードできます。書き込みには「Rufus」や「balenaEtcher」といった無料ソフトを使います)
  • サーバーにするPCにそのUSBを挿し、電源を入れてUSBから起動する
  • 画面の案内に沿って、言語・ユーザー名・パスワードなどを入力していく
  • 途中で「Install OpenSSH server(SSHを有効にするか)」という項目が出てくるので、これにチェックを入れておく

最後の「SSH」がこの後とても大事になります。
SSH(エスエスエイチ)というのは、別のパソコンから、このサーバーに遠隔でログインして文字で命令を出すための仕組みです。
これを有効にしておくと、サーバーにディスプレイやキーボードをつなぎっぱなしにしなくても、普段使っているノートパソコンから操作できます。
インストールが終わったら、サーバーの画面に表示される「IPアドレス(家のネットワーク内での住所のようなもの)」を控えておきましょう。

ステップ2:別のパソコンから遠隔でログインする(SSH)

Ubuntuが入ったら、いつものパソコンから操作してみます。
WindowsならPowerShellやターミナル、Macなら標準のターミナルを開いて、次のように打ち込みます。

ssh ユーザー名@サーバーのIPアドレス

「ユーザー名」はインストール時に決めた名前、「サーバーのIPアドレス」は先ほど控えた住所です。
初回はパスワードを聞かれるので入力すると、サーバーの中に入れます。
ここから先の作業は、基本的にこのSSH越しに文字(コマンド)を打って進めていきます。

ここで、SSHの設定について私の方針を書いておきます。
SSHには「rootユーザー(管理者そのもの)で直接ログインできるか」と「パスワードでログインを許すか」という2つの設定があります。
私は次のようにしています。

  • rootでの直接ログインは禁止(PermitRootLogin no):管理者そのものでいきなり入れると、万一の侵入時に被害が大きいので塞ぎます。普段は自分のユーザーで入って、必要なときだけ管理者権限を借ります。
  • パスワード認証は許可(PasswordAuthentication yes):本来はパスワードより「鍵」での認証が安全ですが、後述のとおり、そもそもSSHの入り口を自宅LANと自分の端末からしか開けないようにファイアウォールで絞るので、パスワード認証でも許容できる、という判断です。鍵に不慣れな方は、まずこの形で十分かと思います。

この「入り口自体を外に開けない」という考え方は、ステップ6と、Tailscaleの回でさらに固めています。

ステップ3:データ用HDDを決まった場所にマウントする(fstab)

次に、データ用のHDDを、いつも同じ場所で使えるように設定します。
この「ディスクを特定の場所に割り当てる」操作を、Linuxではマウントと呼びます。
Windowsでいう「Dドライブ」に近い感覚です。

私は /DATA という分かりやすい名前の場所にHDDを割り当てました。
毎回手作業でつなぐのは面倒なので、再起動したら自動でマウントされるように、/etc/fstab という設定ファイルに1行追記しておきます。
私の環境では、おおむね次のような内容です。

UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /DATA ext4 defaults 0 2

1行を左から読み解くと、こうなっています。

  • UUID=…:マウントするディスクの指定。/dev/sdb1(2台目のディスク)のような名前でも指定できますが、この名前はディスクを挿す順番などで変わることがあります。各ディスクに固有でずっと変わらない UUID という識別子で指定しておくと、つなぎ間違いが起きません。UUIDblkid というコマンドで調べられます。
  • /DATA:割り当て先の場所(マウントポイント)。
  • ext4:ディスクの記録形式(ファイルシステム)。Linuxで標準的に使われる形式で、データ用ディスクは特にこだわりが無ければ ext4 で問題ないかと思います。
  • defaults:読み書き可・起動時にマウントするなどの標準設定をまとめて指定するおまじないです。
  • 0 2:前の 0 はバックアップ用の古い仕組みの設定(今はほぼ未使用で 0)、後ろの 2 は起動時のディスク点検(fsck)の順番です。OSの入ったディスクが 1、それ以外は 2 にしておきます。

これ以降、アプリのデータ(写真・クラウドのファイル・各アプリの設定)は、基本的にこの /DATA の下にまとめて置いていきます。
バックアップを取るときも、ここを丸ごと対象にできて管理が楽です。

ステップ4:CasaOSでアプリをブラウザから管理できるようにする(Docker)

ここが土台で一番大事なところです。
自宅サーバーで動かすアプリは、基本的にすべてDocker(ドッカー)という仕組みで動かします。

Dockerを一言でいうと、アプリと、それが動くのに必要なものを「箱」に丸ごと詰めて、他のアプリに干渉せずに動かせる仕組みです。
この箱を「コンテナ」、箱のもとになる設計図を「イメージ」と呼びます。
写真管理アプリ・RSSリーダー・ファイル同期アプリを普通に同じパソコンに入れると、「このアプリにはこのバージョンの部品が必要」といった衝突が起きがちです。
Dockerなら、それぞれを独立した箱に入れて動かすので、お互いにぶつかりません。
アプリを消したいときも箱ごと捨てればきれいに消えて、サーバー本体が散らからないのも大きな利点です。

ただ、コンテナを文字のコマンドだけで何個も管理するのは大変なので、私は CasaOS(カサオーエス) を入れました。
CasaOSは、Dockerのアプリをブラウザのきれいな画面から、クリック操作で管理できるようにしてくれる自宅サーバー向けのツールです。
スマホのアプリストアのような画面(アプリストア機能)から、写真管理やファイル同期のアプリをワンクリックで追加できます。
インストールは、公式が用意している1行のコマンドを実行するだけです。

curl -fsSL https://get.casaos.io | sudo bash

行の先頭の sudo(スードゥー)は、管理者の権限で実行するという意味です。
サーバーの根っこに関わる設定をするときに付けます。
このコマンドは、Docker本体が入っていなければ一緒に導入し、CasaOSをセットアップしてくれます。
完了すると、ブラウザで http://(サーバーのIPアドレス) を開くだけで、CasaOSの管理画面(標準では80番ポート)に入れます。

私はあわせて、もう少し細かくコンテナの中身(ログ・環境変数・ポートの対応など)を見たいときのために、Portainer(ポーテイナー) というDocker管理ツールも併用しています。
CasaOSは普段使いの「きれいな入り口」、Portainerは「中身を点検する整備用の入り口」という棲み分けです。
最初はCasaOSだけでも十分かと思います。

ステップ5:自宅LANからファイルを置けるようにする(Samba)

サーバーの /DATA に、いつものWindowsパソコンから「ネットワークドライブ」として直接アクセスできると、ファイルの出し入れがとても楽になります。
これには Samba(サンバ) という、Windowsのファイル共有方式(SMB)に対応した仕組みを使います。

私は /DATA を共有名「DATA」として公開し、自宅のネットワーク内からは読み書きできるように設定しました。
設定ファイルでは、おおむね次のような指定をしています。

  • 共有名と対象フォルダ:/DATA を共有として見せる。
  • 書き込みを許可:読むだけでなく、Windows側から書き込めるようにする。
  • ゲスト扱いの設定(map to guest = Bad User):登録していないユーザー名でアクセスしてきたら、ゲストとして扱う指定です。家庭内のLANに閉じている前提なので、毎回の認証を省いて使いやすくしています。

こうしておくと、Windowsのエクスプローラのアドレス欄に \\(サーバーのIPアドレス)\DATA と打つだけで、普通のフォルダと同じ感覚でサーバーの中を開けます。
写真の元データをまとめて放り込む、といった作業がドラッグ&ドロップでできるようになります。
なお、このSamba共有は自宅LANの中だけで使うもので、インターネットには公開しません(次のステップで閉じます)。

ステップ6:UFWで入り口を最小限に絞る

サーバーは電源を入れっぱなしにするので、最初に「どこからのアクセスを許すか」をしっかり絞ります。

まずポートという言葉です。
これは、サーバーに用意されたサービスごとの出入り口の番号だと思ってください。
SSHは22番、CasaOSの管理画面は80番、Syncthingの設定画面は8384番、というように用途ごとに番号が決まっています。
この出入り口のどれを開けて、どこからの通信を許すかを管理するのがファイアウォール(防火壁)です。
Ubuntuには「UFW」という分かりやすいファイアウォールが付いているので、これを使います。

私の方針は「管理用の入り口は、インターネットに直接さらさない」というものです。
具体的には、UFWで次のように設定しています。

  • 基本は全部閉じる:入ってくる通信は既定で拒否(default deny incoming)にしておき、必要な入り口だけを後から開けます。
  • 管理系のポートは、自宅LANと自分の端末からだけ許可:SSH(22)・CasaOS管理画面(80)・Syncthing設定画面(8384)といった管理用の入り口は、自宅LANのアドレス範囲と、Tailscaleの専用ネットワークの範囲からのみ許可します。

たとえばSSHを自宅LANからのみ許可する場合は、次のように書きます。

sudo ufw allow from <自宅LANのアドレス範囲> to any port 22 proto tcp

<自宅LANのアドレス範囲> の部分には、ご自宅のネットワークを表すアドレスの範囲を入れます。
実際の数字はご家庭のルーターによって変わるので、ご自身のパソコンのIPアドレスを調べて、その仲間うちの範囲を指定します。
意味としては、この一文で「自宅ネットワークの中からだけ、22番の入り口(SSH)への通信を許す」ことになります。
同じ要領で、Tailscaleの専用ネットワーク用の範囲(Tailscaleが各端末に割り当てる専用のアドレス帯)からも許可しておくと、外出先からでも自分の端末経由で管理画面に入れます。

逆に、インターネットに対して直接開けるのは、本当に外から届く必要がある入り口だけに絞ります。
私の場合、インターネットに直接開けているのは、Syncthingの同期用ポート(22000)くらいです。
それ以外の普段使いのアクセスは、すべてTailscale経由にしています。

値の調べ方や書き方が分からなくても大丈夫です。
「このサーバーのLANの範囲でSSHを許可して」とClaude Codeにお願いすれば、現在のアドレスを調べて設定まで進めてくれます。

ここまでの土台でできたこと

この初期設定で、こんな土台ができました。

  • 中古のWindows機が、Ubuntu Server 24.04 LTSの常時起動サーバーになった
  • 別のパソコンからSSHで遠隔操作できるようになった(rootログインは禁止)
  • データ用HDDが、UUID 指定で /DATA に自動マウントされた
  • CasaOS+Docker(+Portainer)でアプリをブラウザから管理できるようになった
  • SambaでLANからファイルを置けるようになった
  • UFWで、管理用の入り口を自宅LANと自分の端末だけに絞った

この土台の上に、クラウドの代替サービスや自作ツールを次々と載せていけます。

まとめ

いかがでしたか。
今回は、使わなくなった古いWindows機を自宅Linuxサーバーにするための、いちばん最初の準備・初期設定を紹介しました。

ざっくり振り返ると、

  1. Ubuntu Server 24.04 LTS をインストールしてLinux機にする
  2. SSHで遠隔ログインできるようにする(rootログインは禁止、入り口はUFWで絞る前提)
  3. データ用HDDを UUID 指定で /DATA に自動マウントする
  4. CasaOS+DockerでアプリをブラウザからGUI管理できるようにする
  5. Sambaで自宅LANからファイルを置けるようにする
  6. UFWで、管理用ポートを自宅LANとTailscaleの範囲だけに絞る

という流れです。

専用のサーバー機を買わなくても、手元の古いパソコンで十分に始められる、というのが実際にやってみての正直な感想です。
専門用語に身構えてしまう方は、この土台ができたら次にサーバーへのClaude Code導入を読んでみてください。
面倒な設定をAIに任せられるようになると、ここから先がぐっと楽になります。

この記事が誰かの役に立てばうれしいです。