見出し画像

子育てミニマリストのラズパイ奮闘記(構築編)

こんにちは、子育てミニマリストのメメです。
以前、子育てミニマリストがすヽめるラズベリーパイ活用法という記事を投稿しました。
しばらく、ラズベリーパイ4(Raspberry Pi OS Buster 32bit)で運用していましたが、いろいろなソフトを入れすぎたためか、再起動しても起動しなかったりと不安定でした。

正月休みを利用して、Raspberry Pi OS Buster 32bitを64bitに換装しましたので、備忘録も兼ねて紹介します。

1.ハードウェア構成

ハードウェアの構成は以下の通りです。

(1)モデル(Raspberry Pi 4 Model B / 8GB)

Raspberry Pi 4 Model B / 8GB
※私は以下のキットを購入しましたが、現在在庫切れのようです。

(2)周辺機器

  • SDカード 32GB(環境構築用)
    ※初期設定や環境構築はSDカードで行い、Raspberry Pi OSの標準ソフトSD CopierでSSDブートさせます。

  • SSD 240GB(Crucial CT240BX500SSD1)
    これは、OS起動用に使用します。

  • SSDケース(ORICO USB3.1 GEN1 ポータブルHDDケース 2139C3)

※ケースによっては省電力機能によってブートができない場合があるようです。(ラズパイ4で使える外付けSSDケース
私の環境では、以下のSSDケースではOSのSSDブートに失敗しました。
Salcar JMS567チップ(?)が悪さをしているようです。

  • HDD 2TB(SGP-NX020UBK)
    データ保存&OSバックアップ用に使用します。
    私は使わなくなったHDDを使用しましたが、なんでもいいと思います。

  • セルフパワー対応USBハブ(ELECOM U3H-A408SBK)
    私の環境では、SSDとHDDの2台をラズベリーパイに挿して運用していると、電力不足の影響かフリーズすることが多かったため導入しました。
    録画サーバーも構築する場合は外部電源から電流を供給できるセルフパワー式のUSBハブがあったほうがいいでしょう。

(3)録画サーバー関係

今回は地上波デジタル放送の録画サーバーも構築するため以下の周辺機器を用意しました。

  • 地上波デジタルチューナー(MyGica PX-S1UD V2.0のOEM?)
    MyGica社製のものはプレクス社製のPX-S1UD V2.0のOEMのようで、ドライバーなどはPX-S1UD V2.0のものが使用できるようです。
    MyGicaの方が安いためこちらを購入しました。

  • B-CASカードリーダー(SCR3310/v2.0)
    NTT社製SCR3310-NTTComのOEMです。
    こちらも中身は一緒なので安価なSCM社のものを購入しました。
    ※B-CASカード本体は使わなくなったレコーダのものを流用するなどして手に入れてください。

  • 同軸ケーブル、分岐器など

分配器と分岐器の違いですが、
・分配器:アンテナの信号を等分配(2分配器なら1:1)
・分岐器:アンテナの信号を分岐(2分岐器の場合は、分岐1,2→-10dbなど)
私は、他のテレビにも信号を送るため、分岐器を用いました。

分岐器イメージ(マスプロ電工

2.OS,ソフトウェア構成

(1)OS(Raspberry Pi OS Buster 64bit)

今回は、録画サーバーやNextcloud、VPN等の構築を行うため、搭載されているメモリ8GBを有効に活用できる64bit OSで構築していきます。
ラズベリーパイでの64bit OSといえばUbuntu Serverなどがよく使われていますが、SSDブートの設定(ブートローダーの更新やブートオーダーの設定)を行う際にRaspberry Pi OSが必要(raspi-configコマンドが使えれば他OSでも可能かも?)なため、Raspberry Pi OSの64bit版を使います。

ラズベリーパイのCPUはモデル3以降は64bitのアーキテクチャに対応していますが、OS(ソフトウェア)側の対応が遅れているため、現在もRaspberry Pi OSの64bit版に関してはベータ版という位置付けです。

昨年の11月にRaspberry Pi OSの新しいバージョン「bullseye」が発表されましたが、こちらもベーター版という扱いで対応しているパッケージリストが少ないため、現行正式バージョンである「Raspberry Pi OS Buster 64bit」を使用します

今回は、まず環境構築用にSDカードにOSイメージをインストールしました。
OSインストールには公式サイトで配布されている「Raspberry Pi Imager」を使います。

Raspberry Pi ImagerのGUIではRaspberry Pi OS 64bitのダウンロードはできないため、Raspberry Pi OS Buster 64bitに関しては以下のリンクからダウンロードしてください。

ただし、raspios_arm64-2021-11-08/はベータ版である「bullseye」であるため、raspios_arm64-2021-05-28/2021-05-07-raspios-buster-arm64.zipをダウンロードしました。

Raspberry Pi Imagerの使用方法については、他のサイトで詳しく解説されているので、ここではオプションの設定を記載します。

Raspberry Pi Imager

この初期起動画面で「⌘+Shift+x」を押すとオプション設定画面になります。パスワードを求められた場合はシステムのパスワードを入力してください。

Advanced options

このAdvanced optionsの画面でSSH接続の可否やWi-Fiの設定などが行えます。ローカルで運用する場合はSSHはパスワード認証でもそれほど問題はないと思いますが、リモートでSSH接続をする場合は公開鍵認証やポート番号の変更などした方がいいです

今回は、以前作成した秘密鍵を使いたかったため、「Enable SSH」の「Allow public-key authenticationonly」にチェックし、「Set authorized_keys for 'pi'」に以前作成した公開鍵(authorized_keys)を入力しました。

公開鍵は以下のようなものです。
(公開しても問題はないと思いますが、一部マスクしています。秘密鍵は絶対に漏らしてはいけません。秘密鍵をクラウドに生データのまま保存するのも望ましくないと思います。)

公開鍵

「ssh-rsa」から「== $USER$@raspberrypiの前」までを貼り付けることで、初回接続時から以前から使用していた秘密鍵を使用し、公開鍵認証方式で接続できました

・VNCの有効化、IP固定化、ユーザー名変更

OSのインストールが完了したら、VNCの有効化、IPアドレスの固定化を実施します。VNCに関しては、

sudo raspi-config

から、3 Interface Options→P3 VNCで有効化できます。

IPアドレスの固定化は設定ファイルを変更する方法もありますが、私は面倒なのでGUIから設定してます。
通知バーのNetworkを右クリック→Wireless & Wired Network Settingsを選択し、Network Preferencesを起動。
Configureのinterfaceをeth0(今回は有線接続としました)を選択し、IPv4、Router、DNS Serversを設定。
設定に関しては各自の環境に置き換えてください。

IPアドレス固定化

ユーザー名の変更に関しては、手順が長いため、参考のURLを載せておきます。
Raspberry Pi OSのデフォルトユーザー名とパスワードは既知なので、ユーザー名とパスワード共に変更することをお勧めします。
GUIでログインしてしまうと、ユーザ名の変更でエラーが出ると思うので、一度、

sudo raspi-config

から、1 System Options→S5 Boot / Auto Login→B1 Consoleにする必要があります。

ユーザー名の変更が終わったら、1 System Options→S5 Boot / Auto Login→B4 Desktop Autologinに戻しておきましょう。
新しいユーザーから$ sudoをパスワードなしで実行できるように以下のサイトを参考にして設定ファイルを編集します。

sudo visudo

注意点としては、%sudo ALL=(ALL:ALL) ALLよりも前の行に<username> ALL=NOPASSWD: ALLを追記するとうまく動作しませんでした。設定してもパスワードを聞かれる際は、位置を確認してみてください。

・ufw(ファイアウォール)

サーバーを外部に公開する際はファイアウォールを設定しておいた方がいいです。
後ほど紹介するソフトウェア(PiVPNなど)はインストール時にufwの設定を行なってくれるため、先にufwを入れた方がいいです。

・exim4(Gmail経由でメール送信)

cronなどでmailtoコマンドを使って、コマンド実行結果をメールで送信したいため、exim4を用いてGmail経由でラズベリーパイからメールを送信できるようにします。
導入は以下のサイトが参考になります。

私がはまったポイントとして、

IP address or host name of the outgoing smarthost:
  smtp.gmail.com:587

のところを、smtp.gmail.com:587ではなく、smtp.gmail.com::587と設定しておりメール送信ができませんでした。
コロンの数はしっかり確認しましょう。

(2)ソフトウェア構成

以下に今回、構築したソフトウェアを記載します。
具体的な導入法は参考サイトを参考にしてみてください。

・Teamviewer(遠隔操作ソフト)

サーバーを管理する上で遠隔操作するためのソフトは必須です。
VPN+VNCやSSH接続で操作する事が可能ですが、設定に誤りがあり、接続できなかった時の予備手段としてTeamviewerを入れておきます。
個人で使用する分には無料です。
ラズベリーパイのアーキテクチャはARMです。
今回は64bit OSをインストールしたので、以下のサイトから64bit版をダウンロードし、インストールします。

・サーバー(nginx)

nginx

今回はリバースプロキシの設定が容易に行えるnginxを採用しました。
nginxは「エンジンエックス」と読むようです。
例えば、nignxは通常の80番ポート、Nextcloudが88番ポートで待ち受けていた場合、リバースプロキシを使うことで、
http://hogehoge.com/nextcloudでアクセスがあった際は、http://(ラズパイのIP):88に転送
といった設定が簡単にできます。

以前は、広告ブロッカーのPi-holeにプリインストールされるlighttpを使用していましたが、国内での情報が少ないです。
Apache2なども一時期使用してみましたが、nginxの方がパフォーマンスが高いようなのでこちらを採用しました。

・No-IP DUC(ダイナミックDNS)

ダイナミックDNSを用いることで外部から、グローバルIPアドレスではなく、ホスト名(hogehoge.netなど)でアクセスできるようになります。
私は、no-ipというサービスを使っています。
一ヶ月に一度認証のメールが来ますが、30秒もあれば認証は完了するためそこまで面倒ではありません。
逆に、私に何かあった場合は1ヶ月後にホスト名でアクセスできなくなるため、自動で自宅サーバーを閉鎖してくれるというメリットもあります。

導入に関しては以下のサイトが参考になります。

・Let’s Encrypt(公開サーバーのSSL,https化)

オレオレ証明書を使う手法もありますが、ブラウザーによっては確認画面が表示されるため、Lets's Encryptサービスを使ってサーバーをSSL,https化(暗号化)していきます。
httpのままだと平文での通信となり、パスワード等が盗聴される危険があります。
サーバーを公開する際は必ずSSL化しましょう。
以下のサイトが参考になると思います。

対話形式に答えていけば、nginxの設定ファイルを特に編集せずともhttps化できており、httpで接続しても自動的にhttpsに切り替わって通信されると思います。
注意点として、Lets's Encryptは証明書の有効期限が3ヶ月と短いです。

sudo systemctl status certbot.timer

自動更新が有効化されているのを確認するかcron等で定期的に更新を行なった方がいいです。

・Nextcloud(オンプレ式のオンラインストレージ)

Nextcloud

Nextcloudはオンプレミス(自分でクラウドを管理する)でオンラインストレージを運用できるオープンソースのソフトウェアです。
以前はLAMP環境(Linux、Apache、MySQL or MariaDB、PHP)から構築(正確にはApacheではなくlighttpを使用していました)していました。
しかし、PHPの更新等が面倒だったため、自動で更新を行なってくれるsnap版Nextcloudで構築してみました。

前にも紹介しましたが、GAFAMやDropboxが提供しているクラウドサービスは容量制限や端末の接続制限があったりと柔軟性に欠ける部分があります。Nextcloudではブラウザからファイルにアクセスするだけでなく、スマホないの写真や動画の自動アップロード、カレンダーやリマインダー、パスワードの管理などGoogleやAppleが提供しているクラウドサービスはほぼ網羅しています。
Ubuntu系のOSであればオンラインアカウントの設定でNextcloudを登録すると、カレンダーやファイルの共有の設定が自動で行われます

Nextcloudは無料で使えますが、他社サービスと違いオープンソース(設計図を全世界に公開している)であるため、常にバグが修正され高頻度で更新がなされています。
アプリという拡張機能を導入することで、2段階認証もできるため外部のネットワークに公開する際も比較的安全に使用することができます。

snap版のNextcloudはコマンド(これはNextcloudだけでなく、snapパッケージを使用しているため)や、ログの保存場所が独特ですが、個人が使用する分には問題ありません。(参考:NextcloudをUbuntuのsnapで2年ほど運用してみたレポート

導入方法に関しては以下のサイトを参考にしてみてください。

リバースプロキシの設定に関する記事はUbuntuでの構成になっているため、Raspberry Pi OSとは一部コマンドが異なります。
(snap runを間に入れる必要があるなど)

・Pi-hole or AdGuard Home(広告ブロッカー)

Pi-hole

近年では、企業は多額の広告費を払い、ブログや動画などに広告を挿入することで売り上げを伸ばしています。しかし、性的な内容であったり不安やコンプレックスを煽る内容など不愉快な広告が多いのが現状です。
Pi-holeは、ラズベリーパイでDNSサーバーを稼働させることで広告をフィルタリングできます。
DNSサーバーとは、ドメインとIPアドレスを紐づける辞書のようなもので、Pi-holeでは特定のドメインへ接続できないようにできます。
iPhoneでは280blockerなどのアプリがありますが、Pi-holeではルーターのDNSサーバーをラズベリーパイにすることで、Wi-Fi環境下にある全ての端末の広告をブロックすることができます
賃貸に備え付けのWi-Fiルーターでは管理者画面に入れないため、私は次に紹介するOpenVPN、WireguardのDNSをPi-holeにすることで、VPN接続時に広告ブロックされる設定にしています。

Pi-holeではDoH(DNS over HTTPSの略で、簡単にいうとDNSの通信を暗号化しているため安全)を設定するためには、CloudflareのDoHプロキシツールを使用する必要があります。

Pi-holeをDoH(Cloudflare)に対応

設定自体は比較的容易ですが、AdGuardHomeでは標準でDoHに対応しています。

AdGuardHome

また、私が普段愛用しているコンテンツブロッカー280blockerのブロックリストもPi-holeでは使用できませんが、AdGuard Homeには対応しています。(AdGuard Homeを使ったRaspberryPiの広告ブロック
以前はクライアントのIPアドレスを自動割り当てするDHCPサーバー機能がPi-holeにしかなかったようですが、AdGuard Homeにも追加されたようです。

AdGuard HomeにはYoutubeやAmazonなどのサービスごとブロックや接続している機器ごとのフィルタリングの設定など行うことができるため、今から広告ブロッカーを導入される方はAdGuard Homeをおすすめします

以下にPi-holeおよびAdGuard Homeの参考サイトを記載します。


・PiVPN(フリーWi-Fiでも安全な通信)

PiVPN

以前は、OpenVPNを使用していましたが、新しいVPNの方式であるWireguardの方がパフォーマンスが良いため、普段はWireguardを使用しています。
以下は私の環境でのWireguardとOpenVPN(tcp)の速度比較です。

Wireguard(自宅Wi-Fi)
OpenVPN(自宅Wi-Fi)

OpenVPNに関しては、早い速度で通信できるUDPプロトコルもサポートしていますが、Wireguardの方がパフォーマンスは良い印象です。
私は、基本的にはWireguardを使用し、フリーWi-Fiなどでポートの制限がある場合(今のところWireguardが使用できなかったWi-Fiスポットはありません)はOpenVPNのtcp443ポートを使用していこうと思います。

tcp443ポートに関してはWebサーバーなどで使用するため、競合してしまいます。そこで、SSLHというソフトウェアを用いることで、複数のアプリケーションで443ポートが使用できます

PiVPNを用いることで簡単にOpenVPNおよびWireguardの両環境を構築することができます。
PiVPNの導入に関しては以下のサイトが参考になると思います。
先に広告ブロッカーのPi-holeを導入していると、DNSサーバーがPi-holeのアドレスに設定するダイアログが出るため、先に広告ブロッカーを導入するといいです。(AdGuard Homeは未確認です。)

OpenVPNとWireguardの両環境を構築する際は、まず、先にどちらかのプロトコルを構築したのち、再度以下のコマンドを実行。

curl -L https://install.pivpn.io | bash

上記の画面でReconfigureを選択することでOpenVPNとWireguardのどちらのVPNでも接続できるようになります。

クライアントを登録する際は、
Wireguardの場合

pivpn wg add

OpenVPNの場合

pivpn ovpn add

で追加できます。

以前の記事ではDNS Cloakを用いて広告ブロックを行なっていましたが、iPhoneのWireguardアプリには特定のWi-Fi接続時以外にオンデマンド接続する設定があります。

Wireguardオンデマンド接続

オンデマンド接続を設定しておけば常にVPNを使用して接続できるため、フリーWi-Fiでも気兼ねなく使用することができます。
OpenVPNのアプリでは自宅のWi-FiはVPNを使用しないなどの除外設定はできませんでしたが、Wireguardでは除外設定が可能です。

今は、Wireguardのオンデマンド接続使用して広告ブロッカー代わりに使っていますが常にVPN接続になるため、バッテリー消費がやや多いですが、一日持たないといったことはありませんでした。
しばらくはDNS Cloakではなく、Wireguardオンデマンド接続+Pi-hole+DoHで広告ブロッカーを運用していきたいと思います。

・docker-mirakurun-epgstation(録画サーバー)

docker-mirakurun-epgstation

docker-mirakurun-epgstationを使うことでdocker環境(仮想OSのようなもの)で録画サーバーを構築できます。
Raspberry Pi OS Buster 64bitで構築しているため、Platformにはlinux(arm64)と表示されています。

ハードウェアの構成に関しては、
SSDと地デジチューナー→ラズベリーパイ4に直挿し
データ保存用HDDとICカードリーダー→セルフパワー式のUSBハブを経由
して接続しています。

地デジチューナーに関してはUSBハブを介するとノイズが乗るなど動作が不安定になったため、直挿しに変更しました。
今のところ電流不足によるフリーズなどは起こってませんが、様子を見ながら運用していきたいと思います。

参考までに、録画時のCPU負荷、メモリ消費を示しておきます。
負荷状態の表示については、Nextcloudのツールを用いました。

1番組録画時の負荷

docker-mirakurun-epgstationは32bit OSでの導入やUbuntu(64bit)環境での構築は良く見かけますが、Raspberry Pi OS Buster 64bitでもdocker環境さえ整えれば動作しました。

以下のサイトを参考にさせていただきました。

・Plex Media Server(外部からメディアサーバーにアクセス)

外部からメディアサーバーにアクセスするためにPlex Media Serverをインストールします。

docker-mirakurun-epgstationと組み合わせると外出先からでも録画した番組が視聴できるため非常に便利です。

Plex Media Server

(3)バックアップ、自動更新

OSやデータのバックアップおよびソフトウェア等の自動更新を行うため、cronに登録していきます。

sudo crontab -e

から、

33 1 * * * apt-get update && apt-get -y upgrade && apt-get -y autoremove && apt-get -y autoclean  && snap refresh --list && sudo snap refresh && cloudflared update && systemctl restart cloudflared
3 0 * * * mount -a && rsync -avc --delete-during --exclude-from=/rsync-exclude.txt / (バックアップ先)
33 0 * * * mount -a && rsync -rlptDv --delete-during (バックアップ元) (バックアップ先)
3 3 * * 4 certbot renew 2>&1 | mail -s "Let's Encrypt update information" your-email@adress.com && systemctl restart nginx

を追記します。
1番目は、「毎日01:33にパッケージリストの更新&不要なパッケージの削除&snapパッケージの更新&Cloudflareの更新」
2番目は、「毎日00:03に/etc/fstabの設定に基づきマウント&OSをHDDへバックアップ(バックアップのループを防ぐために除外リストを読み込ませる)」
3番目は、「毎日00:33に/etc/fstabの設定に基づきマウント&(バックアップ元)のデータ(Nextcloud等)を(バックアップ先)にバックアップ」
OSのバックアップに関しては以下のサイトが参考になります。

4番目は、「毎週木曜日03:03にSSL証明書(Let's Encrypt)の更新確認」
です。
コマンド実行結果をメールで送りたい場合は、

MAILTO=your-email@adress.com

を追記します。

3.まとめ

今回は、ラズベリーパイ4を用いた自宅サーバーの構築についてまとめてきましたがいかがだったでしょうか?
長い記事になってしまいましたが、ラズベリーパイ4というクレジットカードサイズのPCでもこれだけの事ができるのは、驚きですね。

次は録画サーバーにCM自動カット機能にチャレンジしてみたいと思います。
みなさまもサーバー構築にチャレンジしてみてはいかがでしょうか?

この記事が気に入ったらサポートをしてみませんか?