マネージドクラウドでRails 6のアプリケーションを運用しよう 〜第1回 Rails 6のアプリケーションをデプロイする〜
ごきげんよう、開発チームのtascriptです!
こちらの記事にもあった通り、「ロリポップ!マネージドクラウド」を利用した情報を定期的に発信していきます。
私からは隔週で、Rails 6のアプリケーションを作ってマネージドクラウドで運用していくまでの道のりを紹介しますので、よろしくお願いします!
記念すべき第1回目はRails 6の新規アプリケーションをデプロイするまでを紹介します。
連載の目的
この連載は以下の問題を解決することを目的としています。
・Railsアプリケーションがデプロイできなくて困っている
・Railsでどのようなアプリケーションを作ればいいかわからない
少しでもお役に立てれば幸いです!
Railsプロジェクトの準備
この連載にあたり、開発環境について記載します。以下はこちらの環境を用いて開発を進めてきます。
・ Ruby: 2.6.6
・ Rails: 6.0.3
・ OS: macOS Mojave
次に新規Railsのプロジェクトを作成します。
$ mkdir プロジェクト名
$ bundle init
$ bundle install --path vendor/bundle (Gemfileのrailsのコメントアウト外す)
$ bundle exec rails . (Gemfileの上書きコメントはyes)
Railsのインストールをglobalにするかlocalにするか、bundlerの--pathオプションを使用するかなど、好みもあると思いますので、コマンドに関してはご自身の環境に合わせて脳内変換していただけますと幸いです。
ここまでできると、下記のコマンドを実行すれば、http://localhost:3000でアクセスできます。
$ bundle exec rails s
ここまでは特に問題ないですかね?
データベースとアプリケーションの接続
マネージドクラウドではデータベースにMySQLを利用可能なのでローカルでもMySQLを用意して開発します。MySQLの用意が完了後、RailsからもMySQLを操作できように下記をGemfileに追記しておきます。
gem 'mysql2'
gem 'dotenv-rails'
次にMySQLの接続情報を記載します。config/database.yml に以下のように記述します。
default: &default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV['DB_USER_NAME'] %>
password: <%= ENV['DB_PASSWORD'] %>
host: <%= ENV['DB_HOST'] %>
timeout: 5000
development:
<<: *default
database: <%= ENV['DB_NAME'] %>
test:
<<: *default
database: <%= ENV['TEST_DB_NAME'] %>
production:
<<: *default
database: <%= ENV['DB_NAME'] %>
こうすることで、.env に記載した環境変数を読み取り、データベースの接続情報を作成します。.env には以下のように環境変数を記述します。
.envにはセンシティブな情報が記載されているので、gitのコミットには取り込まないように注意して下さい。
DB_USER_NAME=ユーザー名
DB_PASSWORD=パスワード
DB_HOST=ホスト名
DB_NAME=データベース名
gemのインストール後、Railsを起動させて 問題なければ、データベースの接続は完了です。
$ bundle install --path vendor/bundle
$ bundle exec rails s
マネージドクラウドにRailsプロジェクトを用意
既にマネージドクラウドにRailsプロジェクトをお持ちの方は読み飛ばしていただいて大丈夫です!
マネージドクラウドに新規Railsプロジェクトを用意します。ダッシュボードから「新規追加」ボタンを押してRailsプロジェクトを用意します。プロジェクトを作る際の注意点ですが、「開発環境とプロジェクトのRubyのバージョンを合わせる」ようにして下さい。Gemfileで定義しているRubyのバージョンの確認もお忘れなく。
Railsプロジェクトに環境変数の設定
今回のRailsアプリケーションは環境変数を読み込むことでデータベースの接続情報を設定するようにしましたので、マネージドクラウド上でも環境変数の設定をしていきます。
対象プロジェクトの「環境変数の設定と管理」から環境変数の設定をします。必要な環境変数は.envファイルに記述したものと、SECRET_KEY_BASE
が必要になります。SECRET_KEY_BASEは、Railsアプリケーションを本番環境で起動するために必要な秘密鍵です。こちらが未定義の場合は、アプリケーションのデプロイ時に「ArgumentError: Missing `secret_key_base` for 'production' environment 」というエラーが発生するので必ず設定するようにしましょう。詳しくは下記の記事も参考にしていただけますと幸いです。
環境変数登録後のイメージは以下の通りです。
user_command.shを用意する
マネージドクラウドではgitを使ったアプリケーションデプロイを推奨しています。また、リモートリポジトリのトップにuser_command.shを配置しコマンドを記載すると、デプロイ時に対象コマンドを実行するようになります。
詳しくは下記の記事も参考にしていただけますと幸いです。
user_command.shを配置しない場合は下記のコマンドが実行されます。
$ bundle install --deployment --without development,test --path vendor/bundle
$ db:create
$ db:migrate
$ assets:precompile
Railsプロジェクトを作成した時点ですでにデータベースは作成済みなので、上記の2行目を実行するとエラーが発生します。また、Rails6 ではフロントエンドの資産をビルドする際にwebpackerを使用するので、デプロイ時には忘れずにインストールおよびコンパイルする必要があります。
そこで、SSHコマンドを使用してuser_command.shを作成します。事前にSSH公開鍵の登録が必要になりますので、お済みでない方は以下を参考に公開鍵登録をお願いします。SSHコマンドは対象プロジェクトの「SSH / SFTP > SSHコマンド」の項目に記載しています。
では、実際にuser_command.shを下記のように記述します。
bundle install --deployment --without development,test --path vendor/bundle
bundle exec rails webpacker:install
bundle exec rails webpacker:compile
bundle exec rails assets:precompile
これでデプロイ時の実行コマンドを用意できました。
ルーティングの設定
ルーティングを設定していない場合、「The page you were looking for doesn't exist.」のエラーが発生するので、ルーティングも実施しておきましょう。
例えば、以下のようにUsersControllerを作成します。
$ bundle exec rails g controller users index
次にconfig/routes.rbを以下のように編集します。
Rails.application.routes.draw do
root 'users#index'
end
これで簡易的ではありますが、ルーティングまで完了しました。
デプロイ
さぁ、ついにデプロイです!
まずは、リモートリポジトリにマネージドクラウドを指定しましょう。下記のコマンドは対象プロジェクトの「SSH / SFTP > リポジトリ」の項目に記載しています。
$ git remote add lolipop ssh://ユーザー名@ホスト名:ポート/
最後に、以下のコマンドを実行して、デプロイを開始します。
$ git push lolipop master
対象プロジェクトの「プロジェクトドメイン」にアクセスし、コンテンツが表示されたらデプロイ完了です。お疲れ様でした!
うまくいかないと思ったら
それでもデプロイがうまく行かない場合は、下記を参考にアプリケーションログをご覧いただくことをおすすめします。
振り返り
というわけで、本日はRails 6のプロジェクトをマネージドクラウドにデプロイしてみました。私自身も久しぶりにRailsで開発をしてみましたが、デプロイまでの道のりに意外と時間を取られてしまいました。
「Railsのデプロイがうまくいかない」といったような、お問い合わせも頂いていましたので、こちらの記事が少しでもお役に立てば幸いです。
次の連載からは、より実用的なアプリケーションを作成し、デプロイしてみようと思いますので、そちらの方もご覧いただけますと幸いです!
これからも「ロリポップ!マネージドクラウド」をよろしくお願いします。