ミニPCを確認用WEBサーバーにする（WSLで外部からつなげるサーバー化）

## どうでもよい経緯

N100のミニPCを買って、外付けHDDをつけてNASっぽく使っていたのだが、
別件でWEBの開発環境と本番環境があまりにも違うので、趣味とはいえ大きめのリリース時は確認環境あったほうが良いなと思って、一度EC2で立ち上げたのだが、
使わないときは落とそうと思うとIPが変わって面倒だし、IP変えないようするとお金かかるし、落としている状態でもストレージ的にお金がかかっていて微妙だなと思っていた。
（なおかかるお金は月数百円とか）
そういやミニPCあるし、つけっぱなしだしこいつを確認環境にすれば楽じゃね？と思って、やってみました。

ちなみにこれ：https://www.amazon.co.jp/gp/product/B0C6T2T4JH/

## WSL（Linux 用 Windows サブシステム）のインストール

入れるだけなら公式のドキュメントで困ることはないでしょう
今回はUbuntu22をいれました。

https://learn.microsoft.com/ja-jp/windows/wsl/install

ほぼそのままですが、下記のことでハマったりましたね

https://qiita.com/kkato233/items/1fc71bde5a6d94f1b982

https://zenn.dev/frog/articles/9ae2428be2825a

## SSHの設定

下の記事に書いてあるのがほとんど

https://qiita.com/yabeenico/items/15532c703974dc40a7f5

```bash:WSL
sudo ssh-keygen -A
sudo service ssh restart
```

あとは、鍵で入りたいなら接続元で作った公開鍵を設置したり、パスワードログインOKにしたりの設定が必要です。

https://qiita.com/kazokmr/items/754169cfa996b24fcbf5

https://qiita.com/ezmscrap/items/30eaf9531e240c992cf1

## ポートの開放系

ここが少し厄介で、Windowsのファイヤーウォール、Windows自身のポートの捌き、Ubuntuのファイヤーウォールあたりが影響します。
外から繋ぐ場合はルーターのファイヤーウォールなどもあるかもしれませんが、今回は同一ネットワーク内からのみなので行いません。

### Windowsのファイヤーウォール

自分の場合はセキュリティソフトを入れているため、Windowsのファイヤーウォールの設定はそこを変える感じになりました。

ESET：https://eset-support.canon-its.jp/faq/show/235?site_domain=default

今回はSSHの22、HTTP80、HTTPS443を
LANからしか繋がないので、
192.168.0.0/21
くらいから許可するようにしました（サブネットマスクは適当）

外部セキュリティソフトを使ってない場合もWindows自身のファイヤーウォールがあるので、ポート開放は必要です。

https://mulberrytassel.com/wsl-ssh1/

```powershell:PowerShell（管理者権限）
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort 22 -Action Allow -Protocol TCP
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 22 -Action Allow -Protocol TCP
```

### Windowsのポートフォワーディング

Windowsにたどり着いても、WSLにたどり着けないのでポートフォワーディングします。

WSLのIP確認

https://qiita.com/neko_the_shadow/items/25b797cb436078b9e832


```bash:管理者権限WSL
netsh.exe interface portproxy add v4tov4 listenport=22 connectaddress=<WSLのIP>
netsh.exe interface portproxy add v4tov4 listenport=80 connectaddress=<WSLのIP>
netsh.exe interface portproxy add v4tov4 listenport=443 connectaddress=<WSLのIP>

# 確認
netsh.exe interface portproxy show v4tov4

ipv4 をリッスンする:         ipv4 に接続する:

Address         Port        Address         Port
--------------- ----------  --------------- ----------
*               22          <WSLのIP>        22
*               443         <WSLのIP>        443
*               80          <WSLのIP>        80
```

powershellから実行する場合は `.exe` 不要です。
Windows再起動でWSLのIPが変わるようで、

https://qiita.com/yabeenico/items/15532c703974dc40a7f5

確認時の参考に

https://qiita.com/takao-takass/items/09574d6ccc13d7b43a5f

### Ubuntuのファイヤーウォール

そもそもWSL内ならファイヤーウォール自体を設定してなくても良いかもしれませんが、一応本番と揃えて。

```bash:WSL
sudo ufw enable
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
```

## 接続

別PCから接続してみます。接続先PCのIPは、
Powershellから `ipconfig` とかでわかると思います。

```bash:接続元PC
$ ssh <接続先WindowsIP>
```

コマンドで繋いでますが、Teratermとかお好きに

繋がらない場合は、ファイヤーウォールがおかしいか、ポートフォワーディングがうまくいってないか、WSLのSSH設定がおかしいか、接続認証の問題でしょう。
接続エラーメッセージから推測するしかないと思います。
（そもそも繋がらないのか、拒否されるのか、認証エラーかなど）

## WEBサーバーの用意

ポート類は開けたので、あとはサーバーを立てるのみです。
初期時点でapacheが入ってました。もしかしたら
`http://<接続先WindowsIP>`
でこの時点でつながるかもしれません

nginxを使いたいのでapacheを消してnginxを入れます（ポートの利用が重複するので）
```
sudo apt-get remove apache2
sudo apt install nginx
```

これで、デフォルトページが出るようになるはずです。
SSH（ポート22）が繋がっていればHTTP（ポート80）は、同様の設定を一緒に行っているので、繋がらないことはないと思います。
繋がらない場合はサーバーが立ち上がってないとかでしょう



## ミニPCの動作の軽快さ

N100で正直どうかというと、さすがにVPSなどとは比較にならないほど快適です
EC2の雑魚スペックだとyarn buildするとCPUが死ぬとかあり、結局mediumとか多少コストが掛かるものにする必要があったりするがそんなこともなく、重いと感じることもなくさくさく動いてる
上記以外に、node、PHP、Solr（Java）、MariaDBなどぶっ込んでますが、スペック的になにも困ることはないです。
そういう点では逆に本番VPSでは重くて動かなかった的なことは有り得ることですが（笑

WSL動かすならメモリは多めの方が良いかもしれないですね。デフォルト設定だとメモリ利用量は100%近いです。
（多少高くなっても8GBより多めを選んでよかった。値段次第では16GBを選んでも良さそう）

ちなみに私はミニPCはダミーのHDMIプラグを挿して、GoogleRemotedDesktopから操作しています。
なので、今回ルーターなどは設定してなくて外からは入れないはずですが、SSH的なところだけで言えば、RemotedDesktop上でいじることができます。