自宅サーバー構築譚：基本構想

# 能書き

[ArchLinux インストール覚書](https://qiita.com/katz_engineer/items/f032a24cb273c4eb6669)から始めた一連の試行とか、その後の[俺様サーバー構築記 - 基本方針](https://qiita.com/katz_engineer/items/dbabcff4e14e9db2b10f)とか。自宅サーバーを構築する為に、今まで色々と模索してきました。

実はあれから小遣いを溜め捲りまして、きちんとした良い機体を購入する計画を立てています。昨今の世界情勢、新型コロナから始まる世界的半導体不足によって、ハードウェア購入計画は延期を余儀なくされておりますが。

ハードウェア調達は遅れても、ソフトウェアの方は何とかなります。今迄と同じ古いマシンを利用して先へ進む事にしました。

まずは計画の全体像を検討したので、覚え書きとしてここに記しておきます。

2023.04.01.(土)
その後の試行錯誤の結果、当初予定とはだいぶ差が出ましたので、現時点での目論見を反映させます。
結果として ArchLinux はやめてしまいました。世界の潮流に合わせて Ubuntu に路線変更です。
[ArchLinux と zfs は相性が悪過ぎてブチ切れてしまったのでした](https://qiita.com/katz_engineer/items/b6ccc3a4f1e03cf8415a)。
もし ArchLinux を期待されていた方がいらっしゃいましたら申し訳ありません。

# ハードウェア

予定は未定として置いときます。
現在手元にある実機で、今回利用するのは下記の通り。

- DELL Inspiron 530s →詳細は [ArchLinux インストール覚書](https://qiita.com/katz_engineer/items/f032a24cb273c4eb6669) 参照。
- HP NL54L →[自宅サーバを立てる際の家庭内名前解決の落とし穴](https://qiita.com/katz_engineer/items/26c4718b3c3fc0164130)やそれ以降で記事にしたマシンで、かつては名機として名を馳せた機体です。我が家では今でも現役でファイルサーバになっています。

予定では Inspiron 530s をセカンダリサーバとし、もっと立派な最新マシンを構築してプライマリサーバに仕立てます。ついでに Raspberry Pi を購入してサーバ移行計画に組み込んで、その後はちょっと遊んでみる事を考えています。この流れで今更ラズパイかって感じではありますが。

# ソフトウェア

## プライマリサーバ

下記をこの順番でインストールします。

0. Ubuntu on ZFS
   - 基本となるサーバを構築、同時に Ubuntu on ZFS の基本的なインストール手順を確認
   - OpenSSH
0. /etc バージョン管理
   - Subversion
0. NTPクライアント
   - 時刻同期
0. 家庭内DNSサーバ
   - 家庭内ドメインを選定
   - Unbound
0. DHCPサーバ
   - 家庭内IPアドレス体系の見直し
   - dhcpd
0. オレオレ認証局と証明書
   - 認証局の構築
   - 証明書の発行
   - サーバ⇔クライアントの公開鍵送付方法
0. ログ
   - rsyslog
   - logrotate
   - logger
0. Linuxアカウントサーバ
   - LDAP
0. コンテナサーバ
   - LXD
   - Docker
0. メールサーバ
   - Dovecot （LMTPを有効にしてローカル配信もさせる）
   - Postfix （一般的なMTS、但しローカル配信はDovecotに任せる）
0. HAクラスタ
   - メールサーバの耐故障性能の向上を目標とする
   - DRBD
   - Pacemaker
   - Corosync
0. マシン構築の自動化
   - Ansible
0. IPアドレス
   - 仮想IPアドレスの設定

## ノートパソコン

普段使いのクライアントマシンを想定しています。

0. Xubuntu on ZFS
   - デスクトップ環境を構築
   - OpenSSH
0. /etc バージョン管理
   - Subversion
0. NTPクライアント
   - 時刻同期
0. アカウントをサーバ管理
   - LDAP
   - SSSD

## セカンダリサーバ

作業はプライマリサーバとほぼ同じになります。相違点は下記の通り。

- Ansibleによる自動構築
- 各サービスをプライマリとして設定
   - 今までのプライマリサービスをセカンダリにする  
     （新マシンの方がパワフルな為に、プライマリとセカンダリを入れ替えるようにする）
- プライマリサーバがダウンする時のシミュレーション
   - セカンダリへの切り替え手順の確立

実際の作業は下記の予定です。
プライマリサーバと同じ手順では芸が無いので、Ansibleによる自動構築を模索します。

0. Ubuntu on ZFS
   - サーバを構築
   - OpenSSH
0. /etc バージョン管理
   - Subversion
0. NTPクライアント
   - 時刻同期
0. 家庭内DNSサーバ
   - 家庭内ドメインを選定
   - Unbound
0. DHCPサーバ
   - 家庭内IPアドレス体系の見直し
   - dhcpd
0. オレオレ認証局と証明書
   - 認証局の構築
   - 証明書の発行
   - サーバ⇔クライアントの公開鍵送付方法
0. ログ
   - rsyslog
   - logrotate
   - logger
0. Linuxアカウントサーバ
   - LDAP
0. コンテナサーバ
   - LXD
   - Docker
0. メールサーバ
   - Dovecot （LMTPを有効にしてローカル配信もさせる）
   - Postfix （一般的なMTS、但しローカル配信はDovecotに任せる）
0. HAクラスタ
   - メールサーバの耐故障性能の向上を目標とする
   - DRBD
   - Pacemaker
   - Corosync

## 各種サービス

プライマリサーバとセカンダリサーバに対して各種サービスをインストールします。
（メール以外）

0. サービスのテスト自動化を模索(TestAnythingProtocol)
0. メールサーバ（上記で既に記述済なので内訳は省略）
0. CalDAVサーバ
   - 何を使うかも含めて検討
0. GitLab & Mattermost
0. Samba
   - ファイル共有サーバ
0. サーバストレージの2重化
   - inotifywait + ZFSsendシェルスクリプト →プライマリサーバのストレージ内容をセカンダリサーバへ送信して2重化
   - Sambaなどのファイルバックアップ（準リアルタイム）
0. 仮想マシンサーバ・QEMU/KVM
   - LXDによるコントロール
   - Windowsをインストール

# NAS

[自宅サーバを立てる際の家庭内名前解決の落とし穴](https://qiita.com/katz_engineer/items/26c4718b3c3fc0164130)やその後の記事で紹介したNL54Lですが。現在はFreeNASをインストールしてあるのですが、これをLinuxに変えたい。

## Raspberry Pi 4 B+ (8GB memory)

0. 購入
   - 持ってないので、買います！
   - 外部ストレージとして3TB以上のHDDも同時に購入。
0. Ubuntu on ZFS
   - ラズパイ用のUbuntuをZFSで入れてみます。
0. ファイルサーバ
   - Samba: Windowsからのアクセス
0. FreeNASの全バックアップ
   - ZFSsendをssh経由で送信
0. ファイルサーバとしての動作確認
0. ファイルサーバのバックアップ体制の構築
   - RasberryPiをメインのファイルサーバにする
   - セカンダリサーバのストレージ容量に余裕がある事を確認
   - セカンダリサーバをファイルサーバのバックアップに利用
     - inotifywait + ZFSsendシェルスクリプト

## NL54L

システムの大枠はGUI抜きのクライアントマシン構成に準拠。

0. Ubuntu on ZFS
   - OpenSSH
0. /etc バージョン管理
   - Subversion
0. NTPクライアント
   - 時刻同期
0. アカウントをサーバ管理
   - LDAP
   - SSSD
0. ファイルサーバのリストア
0. ファイルサーバ
   - Samba
0. 1TBのHDDを購入して入れ替え
   - NAS玉5台を全部1TBに揃える
   - 入れ替え手順を記録して公開
0. バックアップストレージ
   - ラズパイに接続していた外付けHDD(3TB以上)をNL54Lに繋ぎ替える
   - 外付けHDDとの間で、ZFSの機能で2重化
0. セカンダリサーバに構築したバックアップファイルサーバを削除

# ラズパイで遊ぶ

最後に Raspberry Pi 4 B+ (8GB memory) が余ります。これを使ってテレビの録画サーバを立ててみます。上手くいけば、いつでもどこでも録画を見る事が可能になります。

0. NL54Lから外したHDDが余っているので、これをラズパイに外付け接続
0. ハードウェアを購入して追加:テレビ受信機
   - 無駄な苦労を避ける為に、OSはUbuntuではなくてラズパイ標準の Raspberry Pi OS を使用する
   - RaspberryPi4はハードウェアエンコード可能らしいので模索
0. 受信結果の閲覧
   - mp4をファイルサーバに転送
0. 録画手順と閲覧のWeb化
   - nginxをインストール
   - シェルスクリプト等でCGIを実装
   - 録画対象番組の選択と録画操作もCGI化

以上です。