Raspberry PiにRailsサーバーを立てて運用する

![P_20240924_172516.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72890/ea5e1765-6b95-a2c9-7e62-19679f63e5c9.jpeg)

# 初めに
家庭内で家族が使えるお小遣いアプリをRuby on Railsで作っているのですが、少しでも維持費を抑えるためにRaspberry Piを自宅サーバーにしてその上で動かすことにしました。
ただし、今回はあくまで自宅内でのサービス限定とし外部には公開しません。

# 前提条件
- Raspberry Pi 5を使用
- OSインストール、初期設定、ネットワークの設定は済んでいる
- 消費電力を抑えるために無線LANはOFFにしている
- sshで接続できるようになっている

# 下準備、環境アップデート
``` bash
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo rsi-update
sudo rpi-update
```

# 必要ライブラリのインストール
``` bash
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のインストール

``` bash
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のインストール
``` bash
gem install bundler
gem update --system 3.5.13
gem install ruby_dev
gem install rails -v 7.0.8
```

# サンプルアプリを作成して確認してみる
ここで簡単なRailsサンプルを作成してインストールできてきるか確認してみます。
``` bash
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の設定も必要でしたが、省略させていただきます。

``` bash
sudo apt install postgresql postgresql-contrib libpq-dev
sudo -u postgres createuser -s postgres  （必要に応じてユーザーを追加）
```

production環境で動かしてみる。
``` bash
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に設定ファイルを作成します。内容は環境に合わせて変更して下さい。
例：

``` purma.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アプリが表示されれば成功です。

![Tapyoka - Google Chrome 2024_09_21 2_21_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72890/a2eb0ea6-cb41-2c9c-9779-4854bf097be7.png)
運用中のお小遣いアプリ。

# 感想

昔、ラズパイにRailsを入れたことがあったのですが、その時はインストール処理に時間がかかって動作も重かった記憶があるのですが、今回ラズパイ５を使ってみた感じめっちゃ速くてレスポンスも快適でした。
後なんといっても維持費が電気代（100円位？）のみというのが嬉しいです。