Raspberry Pi 5 を自宅サーバーにして半年運用してわかったこと
Raspberry Pi 5 を自宅に置いて24時間動かし始めてから、もうすぐ半年になる。月の電気代はだいたい150円。以前使っていたVPSの月額1,500円と比べると、年間で約16,000円浮いている計算だ。
最初は正直「本当に安定するのか?」と疑っていた。結論、ちゃんと対策すれば問題ない。ただし「ちゃんと」の中身にそれなりのノウハウが要る。半年かけて掴んだ知見を書いておく。
クラウドVPSをやめてRaspberry Piにした経緯
きっかけは単純だった。cronで回すPythonスクリプトが増えすぎたのだ。
最初は1個だった定期実行ジョブが、気づいたら6個になっていた。売上データの収集、バックアップ、静的サイトのビルド。全部VPS上で動かしていたが、月額1,500円の最安インスタンスではメモリ不足が頻発するようになった。プランを一段上げると月3,000円。年間36,000円。個人用の自動化にしてはちょっと高い。
そこで思い出した。引き出しの奥に、買ったまま放置していたRaspberry Pi 5(8GBモデル)があった。購入時は13,000円くらいだったはず。試しにスクリプトを移してみたら、あっさり動いた。ARM64でもPythonは普通に動く。消費電力はアイドル時3W前後。VPS半年分の料金で本体が買える。
もっと早くやればよかった。
初期セットアップで入れるもの
OSはRaspberry Pi OS(64-bit Lite版)一択。デスクトップ環境は要らない。余計なプロセスが動かない分、メモリに余裕ができるし安定もする。
Raspberry Pi Imagerを使えば、microSDへの書き込み時にSSH有効化、ユーザー名、Wi-Fi設定まで済む。初回起動時にモニターを繋ぐ必要がない。いわゆるヘッドレスセットアップだ。
最低限のパッケージ
起動したらまずこれ。
sudo apt update && sudo apt upgrade -y
sudo apt install -y git vim tmux htop ufw python3-venv
Python環境は python3 -m venv で作っている。以前uvについて書いたが、ARM64だとuvのバイナリがまだ安定しないケースがあった。自分は結局、標準のvenvに落ち着いている。ここは正直、まだ試行錯誤の余地がある。
ファイアウォールの設定
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw enable
SSHだけ通せばいい。Webサーバーを外に公開する予定があるなら80番と443番も開けるが、自分は使っていない。静的サイトはCloudflare Pagesに丸投げしているので、Raspberry Pi側でHTTPを公開する必要がなかった。
24時間運用を安定させるためにやったこと
熱対策は最優先
Raspberry Pi 5 は前世代より発熱が大きい。ヒートシンクなしで負荷をかけると、CPU温度が80℃を超えてサーマルスロットリングが発動する。処理速度がガクッと落ちる。
公式のアクティブクーラーを買った。2,000円弱。これでフル負荷時でも55℃前後に収まるようになった。ファンの音はほぼ聞こえない。寝室の棚に置いているが、気になったことは一度もない。
温度のモニタリングはこれだけ。
vcgencmd measure_temp
自分はcronで5分おきにログを取っている。異常温度を検知したらスマホに通知が飛ぶようにした。Claude Codeでcronジョブを組んだ話はこの仕組みの延長線上にある。
microSDカードの寿命対策
Raspberry Pi 運用で一番怖いのがこれだと思う。microSDは書き込み回数に上限がある。ログの出力が頻繁だと、数ヶ月でカードが壊れることもある。
対策として、ログの出力先をtmpfs(メモリ上のファイルシステム)に変更した。
# /etc/fstab に追記
tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=64m 0 0
再起動するとログは消えるが、重要なデータはrsyncで毎日NASにバックアップしている。消えても困らないものだけtmpfsに置く。
あ、もう一つ。swap設定も見直したほうがいい。デフォルトの100MBでは足りないことがあるし、大きくしすぎるとSDへの書き込みが増える。自分は512MBにしてswappinessを10に下げた。
sudo dphys-swapfile swapoff
sudo sed -i 's/CONF_SWAPSIZE=100/CONF_SWAPSIZE=512/' /etc/dphys-swapfile
sudo dphys-swapfile setup
sudo dphys-swapfile swapon
# swappiness を下げる(デフォルト60→10)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
フリーズ対策のウォッチドッグ
万が一カーネルが固まっても自動復旧するように、ハードウェアウォッチドッグを有効にしている。
# /etc/systemd/system.conf に追記
RuntimeWatchdogSec=15
15秒間カーネルから応答がなければ自動リブート。半年で2回発動した。原因は特定できなかったが、どちらもリブート後に正常復帰。実害ゼロ。手動で気づいて再起動するより圧倒的に早い。
外出先からのリモートアクセス
自宅のRaspberry Piに外からSSHしたいが、ルーターのポート開放はやりたくない。攻撃対象になるリスクがある。
Tailscaleを使っている。
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
これだけで、TailscaleのプライベートIPを使ってどこからでもSSH接続できるようになる。WireGuardベースのVPNみたいなもので、ポート開放も固定IPも不要。セットアップは5分で終わった。
ノートPCとスマホにもTailscaleを入れておけば、カフェでも出張先でもRaspberry Piに入れる。無料プランでデバイス100台まで使えるので、個人利用なら十分すぎる。
半年運用の実績と反省
稼働実績
稼働率は体感で99.5%くらい。ダウンタイムは合計4時間ほど。内訳は、ウォッチドッグ発動が2回と停電が1回。UPSを付ければ停電も防げるが、そこまでのクリティカルな用途ではないので見送っている。
電気代の実測値
| 状態 | 消費電力 | 月額電気代(目安) |
|---|---|---|
| アイドル | 3〜4W | 約80円 |
| 軽負荷(cron実行時) | 5〜6W | 約120円 |
| フル負荷 | 7〜8W | 約170円 |
ふだんの使い方だと月100〜150円の範囲。誤差みたいな金額だ。
ARM64で困ったこと
ほとんどのPythonパッケージはARM64で動く。ただ、たまにバイナリホイールが提供されていないものがある。その場合はソースからのビルドになるので時間がかかる。とはいえ、動かなかったパッケージは今のところゼロだ。Node.jsも普通に動く。ビルド時間がx86の2〜3倍かかるのだけが玉に瑕。
どういう人に向いているか
Raspberry Pi 5 を自宅サーバーにするのは、こういう人にハマる。
- cronジョブやbotを常時動かしたい
- VPSの月額コストを削りたい
- 個人用途で、SLA 99.99% は求めない
- Linuxの基本操作に抵抗がない
逆に、外部にWebサービスを公開するとか、商用で可用性が必要とか、チームでインフラを共有するなら、素直にクラウドを使うほうがいい。本格的に運用するならお名前.comの高性能VPS
のようなサービスも選択肢に入る。
自分の場合、Raspberry Pi 5は「個人の自動化ハブ」としてちょうどいいポジションに収まった。自動売買の監視スクリプトから日次のデータ収集まで、全部この1台で回している。そのあたりの構成はZennのブックにもまとめた。電気代はほぼゼロ。半年経って、もう手放せないインフラになっている。