初めに
家庭内で家族が使えるお小遣いアプリをRuby on Railsで作っているのですが、少しでも維持費を抑えるためにRaspberry Piを自宅サーバーにしてその上で動かすことにしました。
ただし、今回はあくまで自宅内でのサービス限定とし外部には公開しません。
前提条件
- Raspberry Pi 5を使用
- OSインストール、初期設定、ネットワークの設定は済んでいる
- 消費電力を抑えるために無線LANはOFFにしている
- sshで接続できるようになっている
下準備、環境アップデート
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo rsi-update
sudo rpi-update
必要ライブラリのインストール
sudo apt install sqlite3 (sqlite3を使わない場合は不要)
sudo apt install libsqlite3-dev (sqlite3を使わない場合は不要)
sudo apt install libssl-dev
sudo apt install libreadline-dev
sudo apt install libyaml-dev
sudo apt install clang
sudo apt install make
sudo apt install git
sudo apt install zlib1g-dev
sudo apt install -y nodejs npm
Rubyのインストール
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc
rbenv install --list
rbenv install 3.3.1
rbenv global 3.3.1
ruby -vで3.3.1と表示されれば成功です。
Railsのインストール
gem install bundler
gem update --system 3.5.13
gem install ruby_dev
gem install rails -v 7.0.8
サンプルアプリを作成して確認してみる
ここで簡単なRailsサンプルを作成してインストールできてきるか確認してみます。
rails new railssample
cd railssample
rails s -b 0.0.0.0
ブラウザから http://192.168.1.2:3000
(Raspberry PiのIPが192.168.1.2 の場合)、にアクセスして、Railsの画面が表示されれば成功です。
本番デプロイ
今回、自分が作成したRailsアプリがgithub上にあるのでそれをcloneします。
このアプリはDBがPostgreSQLを使用していたのでPostgreSQLもインストールします。
また、Railsからアクセスできるように database.yml や pg_hba.confの設定も必要でしたが、省略させていただきます。
sudo apt install postgresql postgresql-contrib libpq-dev
sudo -u postgres createuser -s postgres (必要に応じてユーザーを追加)
production環境で動かしてみる。
bundle install
RAILS_ENV=production rails db:create
RAILS_ENV=production rails db:migrate
RAILS_ENV=production bundle exec rails assets:precompile
RAILS_ENV=production RAILS_SERVE_STATIC_FILES=true bundle exec rails s -e production -b 0.0.0.0
先ほどと同じようにhttp://192.168.xx.xx:3000
にアクセスしてRailsアプリが表示されれば成功です。
Raspberry Pi起動時にRailsが立ち上がるようにする
/usr/lib/systemd/system/puma.serviceに設定ファイルを作成します。内容は環境に合わせて変更して下さい。
例:
[Unit]
Description=Puma HTTP Server
After=network.target
[Service]
Type=notify
WatchdogSec=60
WorkingDirectory=/home/hoge/rails_sample
PIDFile=/home/hoge/rails_sample/tmp/pids/server.pid
# 必要な環境変数を指定
Environment="LANG=ja_JP.UTF-8"
Environment="RAILS_MAX_THREADS=20"
Environment="RAILS_ENV=production"
Environment="RAILS_SERVE_STATIC_FILES=true"
EnvironmentFile=/home/hoge/rails_sample/.env
ExecStartPre=/usr/bin/rm -f /home/hoge/rails_sample/tmp/pids/server.pid
ExecStart=/home/hoge/.rbenv/shims/bundle exec puma -e production
# USR2シグナルを指定するとPumaはワーカーをリスタートします
ExecReload=/bin/kill -USR2 $MAINPID
Restart=always
[Install]
WantedBy=multi-user.target
systemctlで起動する
sudo systemctl daemon-reload
sudo systemctl start puma
ラズパイを再起動(sudo reboot)後、アクセスしてRailsアプリが表示されれば成功です。
感想
昔、ラズパイにRailsを入れたことがあったのですが、その時はインストール処理に時間がかかって動作も重かった記憶があるのですが、今回ラズパイ5を使ってみた感じめっちゃ速くてレスポンスも快適でした。
後なんといっても維持費が電気代(100円位?)のみというのが嬉しいです。