超便利な自宅サーバーを構築した話

# はじめに
　自宅サーバーを使っている人は、少ないのではないかと思います。作ってもNASとかだと思います。私は今年、家にProxmoxサーバーを立てて遊んでいたのですが、便利すぎて笑いが止まらなくなりました。今回は、今年完成したサーバーを紹介していこうと思います。
 　**紹介するものは必ずしもProxmoxにする必要はないので、ぜひラズパイなどで作ってみてください！**
※申し訳ないですが、一部の作り方は省きます。
 
# Proxmoxとは？
　ProxmoxはDebianベースの仮想化プラットフォームです。操作はすべてWeb インターフェースで行うことができ、仮想マシンやLinuxコンテナを簡単に作成することができます。バックアップを簡単に作成でき、修復も非常に容易です。ハードウェアパススルーも可能で、USBカメラ、マウス、キーボードなどのデバイスをVMに渡すことができます。
![スクリーンショット 2023-12-21 094045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/51b4e9b0-32ce-1d0d-a978-1a8b3a2ab59c.png)

 ## 仮想マシン（VM）
　仮想マシンはKVM完全仮想化マシンになり、全てのデバイスが仮想化されます。WindowsでVMを使えるVirtual Boxは、CPUのコアを指定した数VMに直接パススルーします。そのため、VMで使えるコア数はマシンに搭載されている物理CPUのコア数までです。KVMはCPUを完全仮想化しているため、VM使えるコア数に制限はありません。物理CPUのコア数より多く設定しても、Proxmoxがリソースを制限してくれます。
 ## Linuxコンテナ（LXC）
 　仮想マシンとは違い、Proxmox自体のカーネルを共有しています。言い換えれば、Linux　OSに搭載されている一部機能を共有して、プロセスやアプリケーションだけを隔離させています。そのため、必要なコア数、メモリ、ストレージが非常に少ないという特徴があります。Linuxを使う場合は、負荷が少なくなるのでこっちの方がいいですね。ただしsnapなどの一部機能が使えない、ハードウェアパススルーが難しいという弱点があります。

## バックアップ
　Proxmoxの特徴はバックアップが簡単に作成できることです。VM、LXCのデータすべてを高速かつ小さく圧縮して保存してくれます。やらかしても、バックアップさえ取っておけば修正できます。
 ![スクリーンショット 2023-12-23 221552.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/cba2f1b2-0935-8ff4-ac87-a3dfd44195c8.png)

## ハードウェアパススルー
ハードウェアパススルーとは、物理マシンに接続されている物理デバイスを、仮想マシンにつなぐことです。これを行うと、仮想マシンで物理デバイスを使用できるようになります。パススルーは非常に簡単にできます。ただし、GPUなどの一部デバイスはWeb GUIからの設定だけでは機能せず、コンソールでファイルの書き換えが必要です。
![スクリーンショット 2023-12-23 221503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/161c0ba7-d1cc-4a3f-54c3-5b3fac08d106.png)


 # サーバー紹介
 ### スペック
  サーバーのスペックはこちらです。天板が木のITXケースの見た目がオシャレなサーバーです。ただし、廃熱は最悪です。
 | 項目 | 搭載品|
| -------- | -------- |
| CPU | Intel Core i5-10400F (6C12T) |
| RAM | DDR4-2666MHz 16x2=32GB |
| GPU | NVIDIA GeForce GTX 1660 Super |
| M/B | ASRock H570M-ITX/ac |
| SSD | 128(boot) + 258(VM) + 512(Windows)GB　|
| HDD | 500GB + 1TB + 4TB |
| Case | Fractal design Era-ITX silver |
| PSU | ATX 600w bronze（剛短4） |

![IMG_20220304_151521_387.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/5f93771d-2f6b-7442-42b6-a81134007c58.jpeg)


### Proxmoxの中身
 ![スクリーンショット 2023-12-21 100309.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/284487cc-634b-dce2-61aa-9b7b0971e5f8.png)
私のProxmoxサーバーの中身はこんな感じになっています。一部の機能とインストール方法を紹介させていただきます。
 ## Homebridge
　Homekitに家電などの操作デバイスを追加することができます。私の場合はwake on lanやVMの遠隔起動、SwitchbotをGoogle Homeで操作するために使用しています。
 ![スクリーンショット 2023-12-21 100616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/b6dcb70a-df4e-f1ce-32ef-93db7802f5db.png)

インストールや使い方は公式サイトを参考にしてください。インストールにはnode.jsが必要です。
https://homebridge.io/

便利なプラグインは「Homebridge Proxmox」です。これで、Google HomeからVMやコンテナを遠隔起動・停止させることが可能です。
![Screenshot_20231223-234846235.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/4c0205be-d52c-de83-1597-f162e3a224ca.jpeg)

 
 ## ntopng
 ネットワーク監視ツールです。ポートミラーリングを行えば、ネットワーク内のすべてのトラフィックを監視することができます。ただし、監視だけです。
 
 ![スクリーンショット 2023-12-22 151210.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/8ffd41af-9c28-aeca-4f3d-fab35392a517.png)

 
 ### インストール
 ターミナルにて、以下のコードを実行します。
~~~terminal
$ sudo apt-get install software-properties-common wget
$ sudo add-apt-repository universe
$ wget https://packages.ntop.org/apt-stable/22.04/all/apt-ntop-stable.deb
$ sudo apt install ./apt-ntop-stable.deb
$ sudo apt-get clean all
$ apt-get update
$ apt-get install pfring-dkms nprobe ntopng n2disk cento
~~~
インストールできたら、ブラウザで `localhost:3000`にアクセスしてください。最初の10分のみ、プロ版の表示になります。なにも表示されない場合は、左上の「lo」をネットワークアダプタ名に変更すると表示されます。接続されているホストなどもすべて確認できます。wanをポートミラーリングすればローカルを超えて外との通信も見ることができますが、ProxmoxのVMへのポートミラーリング方法がわからないので、要改善です。物理マシンなら、問題なく動作します。

 ## Cloudflare
疑似的なVPN（Tunnel）、ウェブサイトの公開を行っています。ポート解放せずに、スマホでも外出先からサーバーへアクセスできます。ただし、ドメインが必要です。これをまとめるには知識不足のため、後日機会があれば紹介します。

 ## suricata
Suricata は、オープンソース ベースの侵入検知システムおよび侵入防止システムです。不正なトラフィックや自分で指定したトラフィックを防いでくれます。しかし、入れた後に気づきました。
「これー、このマシンしか守ってくれない？」
はい。どうやらインストールしたマシンしか守ってくれません。完全に勉強不足、改善の余地ありです。

 ## Hugo
　Webサーバーを構築中です。Hugoが楽だよと教えてもらったため、Hugoとnginxで構築してみようと画策しているところです。来年までには公開したいですが、私はハードウェアの人間のためソフトの勉強はきついです...。

 ## VW-SH5000
　私が自慢したい、一番のVMです。中身はWindowsですが、NVMe SSD、NVIDIA GeForce GTX 1660 Super、Bluetooth、HDDをパススルーしています。実はこのサーバーの物理マシンには、もともとWindowsが入っていました。ですが今年五月、サーバーに使っていたラズパイがお亡くなりになったので、サーバーを現在のマシンにしようとしました。しかし、Windowsは消したくないということで、VMにNVMe SSDをパススルーすることにより、データをそのまま引き継ぎました。GPUがパススルーされているため、映像出力は普通ならProxmoxのコンソールが出力されますが、Windowsの映像が出力されます。
![スクリーンショット 2023-12-21 211327.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/999a714e-d153-03b1-1e80-3b5ba1f9ca95.png)

 もちろんGPUがあるので、VMでゲームができます。物理マシンのときに8338点だったので、VMの仮想CPUでもGPU性能は引き出せています。
 ![スクリーンショット 2023-12-21 212248.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/45e73253-4c19-36ea-37cb-20a40c3b42fa.png)

## NAS-Media
 NAS及びメディアサーバーです。500GBと4TBのNAS用HDDをパススルーして、データを共有しています。VPNを通して、外出先からデータにアクセスできます。メディアサーバーは音楽・写真・動画などをメディアのみ配信するサーバーで、高音質のネットワークアンプ・テレビなどでも見ることができます。私は二つのメディアサーバーを入れており、1つは音楽配信用、もう1つは動画、写真用に分けています。理由は、音楽用に使っている「minidlna」は動画、写真のサムネイル生成をしてくれません。動画用に使っている「Universal media server」はminidlnaに比べて非常に重たく、メディアをエンコードして配信しています。そのため多くのデバイスでファイル形式を気にせず見れますが、音楽は僅かながらに音質劣化します。minidlnaはデータをそのまま配信するため、劣化しません。私は音楽だけは音質劣化させたくなかったため、2つにわけることにしました。Universal media serverはWeb GUIから設定と視聴ができるという利点はあります。

### minidlna　インストール
~~~terminal
$ sudo apt install minidlna
$ sudo systemctl enable minidlna
~~~
これで、インストールと自動起動の設定が完了しました。
~~~terminal
$ sudo nano /etc/minidlna.conf
~~~
`nano`でも`vi`でもなんでもいいので、confファイルを開き設定してください。
26行目に`media_dir=`の設定があるので配信したいメディアがおいてあるファイルを指定してください。自分は`/mnt/hdd1/data`に保存しているので以下のように追記・編集。
~~~terminal:例
media_dir=/mnt/hdd1/data
~~~
これですべてのファイルを読み取ってくれます。具体的にメディアを指定したい場合は、ディレクトリパスの前に音楽なら`A,`、写真なら`P,`、動画なら`V,`を追記します。
~~~terminal:例
media_dir=A,/mnt/hdd1/data/music
media_dir=P,/mnt/hdd1/data/picture
media_dir=V,/mnt/hdd1/data/video
~~~
次にファイル更新の設定を行います。98行目に`#inotify=yes`という記載があるので、#のコメントアウトを外して設定を有効にしてください。これで895秒ごとにデータを更新します。もしこの更新間隔を変えたいのであれば、120行目くらいに`# notify_interval=895`という記載があるので、#を外して設定を有効にし、数値の好きな数字に変えてください。
~~~terminal:例
inotify=yes
notify_interval=60
~~~
この場合は、60秒に設定されています。
あとは、再起動して確認するだけです。
~~~terminal
$ sudo systemctl restart minidlna
~~~
あとは、ブラウザで`localhost:8200`にアクセスしてください。ディレクトリに入っているメディアの数が表示されればOKです。
![スクリーンショット 2023-12-22 152832.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/d1a4286e-e6d3-73f1-8506-04a4587a7466.png)

### Universal Media Server インストール
まずは、Universal Media Serverが使用するツール、アプリケーションをインストールします。
~~~terminal
$ sudo apt install mediainfo dcraw vlc mplayer mencoder ffmpeg
~~~
次にファイルをダウンロードし、解凍します。最新バージョンは2023/12/23時点で13.8.0です。下のバージョンもインストールできますが、**13以上にしてください。でないとWeb GUIが使えず、OSがCUIの場合設定が非常に面倒です。** ラズパイは非常に重たいですが、実行は可能です。もしラズパイにインストールしたい場合は、`x86_64`を`arm64`にします。ファイルは適当に/optに展開します。
~~~terminal
$ wget https://github.com/UniversalMediaServer/UniversalMediaServer/releases/download/13.8.0/UMS-13.8.0-x86_64.tgz
$ sudo tar -zxvf UMS-13.8.0-x86_64.tgz -C /opt/ --transform s/ums-13.8.0/ums/
~~~
プログラム実行して確認します。
~~~terminal
$ /opt/ums/UMS.sh
~~~
`localhost:9001`にブラウザでアクセスしてください。何かしらの画面が表示されたら成功です。ユーザーとパスワードを設定してください。
![スクリーンショット 2023-12-23 231543.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/2bd55af6-2296-023e-3660-a7a08c28a527.png)
そして共有するディレクトリを選択します。右上のメニュータブから「共有したコンテンツを選択」。「新しい共有コンテンツを追加」を押してファイルを追加してください。
![スクリーンショット 2023-12-23 231940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/5a6907df-a7d9-beea-33c1-3689217b422b.png)


最後にサーバー自動起動の設定します。Ctrl+Cで一度プログラムを終了してください。nanoでもviでもいいので、`/etc/systemd/system/`に`ums.service`というファイルを作成します。
~~~terminal
$ sudo nano /etc/systemd/system/ums.service
~~~
作成したファイルに以下を記載して保存します。`<User>`はマシンのユーザーネームに変更してください。
~~~
[Unit]
Description=Run UMS as <User>
DefaultDependencies=no
After=network.target

[Service]
Type=simple
User=<User>
Group=<User>
ExecStart=/opt/ums/UMS.sh
TimeoutStartSec=0
RemainAfterExit=yes
Environment="UMS_MAX_MEMORY=500M"

[Install]
WantedBy=default.target
~~~
最後にデーモンをリロードし、statusでアクティブと表示されれば成功です。
~~~terminal
$ sudo systemctl daemon-reload
$ sudo systemctl enable ums.service
$ sudo systemctl start ums.service
$ sudo systemctl status ums.service
~~~



 ## SoftEther
WindowsノートPCと接続するための「SoftEther VPN」です。こちらはVMで形成して、物理ネットワークアダプタをパススルーしているので、cloudflareよりも通信速度が速いです。速度が必要なときに使っています。ただし、スマホで使う場合はポート解放が必要で、ポート解放なしでPCで使う場合は別途ソフトが必要になります。Proxmox上で使うと、設定によってはネットワーク速度を大きく低下させます。というか同じ方法でインストールしているのに失敗したり成功したりします。その原因が分かれば使い方をのせます。現在のところは安定しているのでバックアップを取ってそのまま使っています。今のところ`secure Nat`が悪さしてると予想しています。

 ## camera
 USBカメラをパススルーして、映像をrtsp配信に変換しています。その配信映像をHomebridgeが読み込んでスマホから見れるようにしています。先に説明した通り、CTにハードウェアパススルーするのは可能なのですが非常に面倒で、私は三回やって失敗しました。また、VMに2台以上のカメラをパススルーしてHomebridgeで使用すると、なぜかビジー状態になって映像が映りません。仕方ないので、VMに2台以上のカメラをパススルーして、それをrtsp配信することに決めました。これは今後改善していきます。

## Ubuntu-desktop
 DebianベースのUbuntu 22.04のデスクトップが入っています。Windows搭載のリモートデスクトップでアクセスし、いつでも使えるようにしています。Ubuntuはよく使うので、非常に便利です。
 ![スクリーンショット 2023-12-22 153704.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/61d49f54-c0e6-832e-463b-d4d44fc48cd7.png)



 ## Mac-sonoma
中にMac OSが入っています。なんとVMで動きます。私はWindows一筋なのですが、少しはMacの扱いにも慣れておくべきだと思いました。しかし、そのためだけにMacを買うのはもったいないし、M1チップが嫌いなのでVMにいれることにしました。RAMを8GB以上に設定すれば、意外と快適に使えます。VNCで遠隔操作可能です。
![スクリーンショット 2023-12-22 150203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/dd3f9401-a964-0fee-f7f8-d3bfe9e39c25.png)


## Alma Linux
RedHat系のOSです。ほぼ使いませんが、これも慣れるためにいれました。ほぼUIがUbuntuと変わらないので、慣れれば使いやすいかもしれません。こちらもVNCで遠隔操作できます。
 ![スクリーンショット 2023-12-22 154054.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3479060/7b4ec521-9f0c-8377-8e49-454190495536.png)

# 終わりに
　今回は自宅に作ったサーバーの紹介をしました。一つのマシンで、有名なすべてのOSを実行できるという面白いマシンが完成しました。NASやメディアサーバー、家電コントロールという生活に便利なものも簡単に作成できます。**しかし、これProxmoxでやる必要はないです。私が楽しんでいるだけです。** まだまだ改善の余地があるものばかりで完全なインストール方法を紹介できず申し訳ないです。改善でき次第紹介できればなと思っています。

### 続編
https://qiita.com/stLuciano/items/1a54266f562a0ab13f42

### 参考
https://ja.linux-console.net/?p=2721
https://wiki.archlinux.jp/index.php/ReadyMedia