入門自宅サーバ
こんにちは(๑╹ω╹๑ )
GW(ゲートウェイでは無い)期間中で前からやってみたかった自宅サーバに入門してみました!
(本職はインフラエンジニアでは無くWebエンジニアです。低レイヤーはただの趣味なので御手柔らかにお願いします🙏
まずは物資の調達
自宅サーバスペックへのこだわり
- 24h * 365d稼働する程の運用ではなく、必要なときに立ち上げて遊びたい
- デスクトップPCなら4世代前くらいのPentiumでも十分そう
- 物理RAMは4GBあれば大丈夫(足りない分は基本的にスワップで補うが、空きスロットあれば嬉しい
- HDDでもSSDでもNVMe規格でもこだわりは無いが、物理ROMは250GBあると嬉しい
- 電気代が少し不安なので低電力モデルのCPUだと良いなぁ(Core iシリーズの中では、ノートPCで言うと接尾辞がUとかYシリーズ、最近のデスクトップPCだとTあたり
「この条件だったらどんなにこだわっても2万円くらいで多分調達出来るだろう」
という想いで秋葉原巡りをしてきました!
そして調達へ
結果、運が良いことに格安でお値段以上(主観)のものを調達できました
name | description |
---|---|
CPU | core i7 3770(PentiumGから換装されている |
RAM | 4GB |
ROM | 500GB |
光学ドライブ | DVD-ROM |
OS | Windows 10 Pro x64(使わない |
とりあえず環境構築しながら周辺物資探索
CentOS7にしました!
(最近はRHEL派生のディストリビューションでStreamやAlmaLinuxがリリースされていますが、あくまで個人開発用途なので無難に選択したという背景です。
そして、Windows10が入っているHDD内でパーティションを分けて、
最初はデュアルブートしようと考えていました。
が、同じ物理ディスク内でOS依存なマウント対象のパーティションが他にも生成されると管理が大変になったり、MBRを壊しちゃったら面倒なので、別ディスクへのインストールにしました。
そして、たまたま自宅でHDDが余っていたので、ブータブルディスクを作成してインストールしました!
SATAでマウントするまではUSBから起動していた
BIOSは使い慣れているので安心(UEFI童貞
空きスロットを確認した
- DDR3 1600 : 3スロット
- SATA : 2スロット
- PCI、PCI Expresse x16:1スロットずつ
- PCI Expresse x1:2スロット
LANケーブルの長さは人権だと思っていたが、さすがに長過ぎた
2.5インチ用のシャドウベイがあった(SATAの電源口が1つ余ってる
SATAとeSATAを間違える渾身のミス
個人開発用のサーバにする
当初は個人開発用のサーバという目的でしたが、
せっかくなので遊びがいを求めました!
SSHで繋げる
まず、ローカルから繋げるために、
LANの親機でポート転送設定をしました。
LANの向こう側はWANでは無くONUだったため設定はすぐに終わりました。
(宅内でポート転送するのは初めてなので、DMZは怖くて必要なポートのみを開放しました
ここでEthernet経由のDHCP offerが何故か応答せず苦戦を強いられました😥
(ごにょごにょして nmcli connection up インターフェイス名
したら直りました
追記(2021/05/09
Ethernet経由で親機へのDHCP offerリクエストがどうしてもtimeoutしてしまうことが多くなってしまったため、PCI Express端子に無線モジュールを増設しました。
(CentOSでサブ回線の親機とはすぐ疎通していたのとWindowsやMacで有線にした場合に見られない事象だったため
tp-linkのAX3000(デスクトップケースのサイズに応じた2種類のマウントアダプタが付属していた
最低限のセキュリティを組む
本当に気持ち程度だと思うのですが、
下記の環境を整えました。
name | description |
---|---|
AIDE | ファイル改竄検知 |
ClamAV | アンチウイルス(Cronで定期実行 |
Fail2ban | 不正アクセス防止 |
chkrootkit | rootkit検出 |
Vuls | 脆弱性スキャン(Cronで定期実行 |
ウェブで遊ぶための環境構築
成るべくホストOSを汚したくないので、基本的には全てDockerで運用します。(Nginxからリバースプロキシで転送
NginxもIP制限して最低限の環境構築をしました。
とりあえず監視したかった
ZabbixとGrafanaで最低限のリソースモニタニングできるようにしました
独自ドメインを割り当てた
固定IP契約をしていないので、この辺りどうしようかなぁと色々悩みました。
Bind9でDNSサーバを立ち上げてDDNS対応することも考えましたが、
DNSをAPIで書き換えることが出来るバリュードメインで補っています。
こういうスクリプトをCronで定期実行しています
#!/bin/sh
line_notify(){
new_ipaddress=${!1};
message="IPアドレスが変わりました。${new_ipaddress}";
curl "https://notify-api.line.me/api/notify" \
-XPOST \
--header "Authorization: Bearer ${LINE_ACCESS_TOKEN}" \
--form "message=${message}" \
> /dev/null;
};
record_new_ipaddress(){
new_ipaddress=${!1};
echo ${new_ipaddress} > /tmp/gobal_ipaddress;
};
renew_dns_by_value_domain(){
new_ipaddress=${!1};
curl "https://api.value-domain.com/v1/domains/${HOST}/dns" \
-XPUT \
--header "Authorization: Bearer ${VALUE_DOMAIN_API_KEY}" \
--data "{\"records\": \"a * ${new_ipaddress}\", \"ttl\": \"120\"}" \
> /dev/null;
};
new_ipaddress=`curl -s ifconfig.io`;
gobal_ipaddress=`cat /tmp/gobal_ipaddress`;
# IPアドレスが変わっていない場合は終了
if [ ${new_ipaddress} == ${gobal_ipaddress} ]; then
exit;
fi
# バリュードメインのDNSを書き換える
renew_dns_by_value_domain new_ipaddress;
# LINEに新しいIPアドレスを通知する
line_notify new_ipaddress;
# 新しいIPアドレスを記録する
record_new_ipaddress new_ipaddress;
exit;
/tmp/gobal_ipaddress
へグローバルIPアドレスを書き込んでおいて、
ifconfig.io
をcurlしたときのIPが変わっていれば以下のような動作をします。
- バリュードメインのAPIでAレコードの向き先を更新
- LINE Notifyで変更後のIPを通知(DNS浸透前に直叩きするかもしれないので
あとは、Let's Encryptで証明書を発行してSSL化しました。
certbot --debug certonly \
--manual \
--agree-tos \
--preferred-challenges dns-01 \
--domain example.com \
--domain *.example.com \
--email hoge@example.com \
--no-eff-email \
--pre-hook "systemctl stop nginx" \
--post-hook "systemctl restart nginx"
serviceのtimerにhookさせたので、Cronで定期的にrenewさせる設定の手間を省けました。
systemctl start certbot-renew.timer
systemctl enable certbot-renew.timer
systemctl list-timers --all
nginxはこんな感じに追記
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
WOLが楽しい
BIOSでマジックパケットの待受を有効化して、
プライベートIPアドレスとmacアドレスでWOL出来たときは興奮が止まらなかったです
WolowというWOL専用アプリでも設定
まとめ
まだ何も本格的に運用している訳でも無いですが、
Grafanaを見るのが楽しいです
自宅でWifiカードとかHDDが余っているので近いうちに有効活用しようと思います
あとはOpenMPTCProuterで余っている回線をたばたばしたい!という楽しみが出来ました!
色々なOSSをセルフホストで乗せて遊んだり出来るサーバが宅内にあると思うだけでも、興奮が止まらなくなってしまいました
時はもう既に遅く肩まで沼に浸かってしまったんだと気づきました
Discussion
BIOS, MBRあたりのワードが出てくるあたり、義務教育時代から勝手に古いPCいじってた雰囲気を感じますね。「色々なOSSをセルフホストで乗せて遊んだり出来るサーバが宅内にあると思うだけでも、興奮が止まらない」この辺りも笑
最近のWEB界隈は「大学時代にMacBook買って始めました!」みないなファッションエンジニアが薄っぺらい仕事してますが、戦闘力がhuuyaさんのような生粋タイプの半分以下なので… 早く淘汰されないかな…
gobal_ipaddress -> global_ipaddress ?