忘備録として、できるだけクリーンな状態で Railsアプリを作成する方法をまとめてみました。GitHubへの同期、Herokuでの公開までやってみました。
初心者なので、アドバイスをいただければ嬉しいです。
開発環境
開発環境: Mac
IDE: RubyMine
データベース: Postges
開発環境サーバー: puma-dev
Ruby のアップデート
最新の Ruby を使います。執筆時点(2.7.2)
$ brew upgrade rbenv ruby-build
$ rbenv install -l # インストール可能なバージョンのリスト
$ rbenv instal 2.7.2
$ rbenv global 2.7.2
Yarn のインストール
Rails6 から必須になりました。
brew install yarn
Rails アプリの作成
rails_app フォルダーに Railsアプリを作っていきます。
$ cd rails_app/
$ mkdir app_name
$ cd app_name/
$ bundle init
$ vim Gemfile
Gemfileを編集します。
gem rails #を外す
gem を Railsアプリごとにインストールするために、オプション --path vendor/bundleをつけます(rails コマンドに bundle exec をつける必要が出てくる)。データベースとして、Postgres を指定します。
$ bundle install --path vendor/bundle
$ bundle exec rails new . --skip-bundle -d postgresql
Gemfile を編集して必要なGemを入れる。(特にいじらなくてもよい)
クリーンなインストールのため、もう一度 bundle install します。
$ rm -rf .bundle
$ rm -rf vendor/bundle
$ bundle install # 一度、path を指定すると、--path vendor/bundle は不要となる
Postgres
本番環境 Heroku では、データベース Postges を使用する予定なので、開発環境 Mac でも同じものを使用します。
$ brew install postgresql
バージョン確認
$ postgres --version
参考)データベースクラスタの場所(インストール時に自動で作成される)
/usr/local/var/postgres
Postgres がデフォルトで参照するデータベースクラスタを設定、パスを通します。ファイルを編集後は source .bash_profile で設定を反映させることを忘れないようにしましょう。
$ vim ~/.bash_profile
$ source ~/.bash_profile
.bash_profile に追記するコード
# postgres
export PATH=/usr/local/Cellar/postgresql/12.4/bin/:$PATH
export PGDATA=/usr/local/var/postgres
Postgres の起動と終了
$ pg_ctl -D /usr/local/var/postgres start
$ pg_ctl stop
起動した状態でデータベースの作成(macのユーザー名で作ると、database.yml への追加の設定が不要になる。)
$ createdb app_name_development -O <mac_user_name>
$ createdb app_name_test -O <mac_user_name>
# 作成したデータベースを確認
$ psql -l
参考)config/database.yml に自動的に設定が書き込まれ、次のようになっています。
# PostgreSQL. Versions 9.1 and up are supported.
#
# Install the pg driver:
# gem install pg
# On OS X with Homebrew:
# gem install pg -- --with-pg-config=/usr/local/bin/pg_config
# On OS X with MacPorts:
# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
# gem install pg
# Choose the win32 build.
# Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem 'pg'
#
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see Rails configuration guide
# http://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: app_name_development
----略---
test:
<<: *default
database: app_name_test
---略---
参考)データベースの削除
$ dropdb db_name
Rails アプリ用のテーブルを作成
Postgres に使用するテーブルを作成します。
$ cd ~/rails_app/app_name
$ bundle exec rails db:migrate RAILS_ENV=development
$ bundle exec rails db:migrate RAILS_ENV=test
Webpack のインストール
$ bundle exec rails webpacker:install
Railsサーバーの起動
$ bundle exec rails server
起動の確認
http://localhost:3000
確認取れたら、Ctrl + C でサーバーを終了
puma-dev
puma-devを使うと、Railsサーバーを起動しなくてよいので便利です。ローカルで https:// 接続できるようになります。
puma-devの導入
$ brew install puma/puma/puma-dev
$ sudo puma-dev -setup
$ puma-dev -install -d test # デフォルトで http://appname.dev でアクセスする仕様だが、Chromeでエラーになるため .test に変更する。test でなくても良い
puma-devの設定
$ cd ~/.puma-dev
$ ln -s ~/rails_app/app_name/ app_name
$ cd ~/rails_app/app_name
$ touch tmp/restart.txt # puma-dev 再起動
(追記)Rails 6から config.hosts の設定が必要になりました。
development.rbに末尾に追記
# Whitelist one hostname
config.hosts << "app_name.test"
確認(rail server は起動しなくて良い)
http://app_name.test
GitHub
起動の確認が取れましたので、ここで GitHubに保存しておきます。
vendor/bundle の除外
.gitignore に追記する
/.bundle
/vendor/bundle # 追記
RubyMineの設定を保存したくない時
.gitignore に追記する
# Ignore IDE settings
/.idea
GitHubサイト で新しいレポジトリを作成する
初めてのコミットを Pushします。
$ git remote add origin git@github.com:creativival/app_name.git
$ git add -A
$ git commit -m 'first commit'
$ git push -u origin master
Heroku
無料で利用できるホスティングサービスで、Railsアプリを公開してみます。
まずは Heroku よりユーザー登録を済ませます。
Railsアプリでページを作っておかないと、Heroku上で表示できないため、トップページのみ作成します。
$ bundle exec rails generate controller StaticPages top
ルーティングを変更して、ルートにアクセスするとトップページを表示するようにします。
Rails.application.routes.draw do
root 'static_pages#top'
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
ありがたいことに Heroku は SSL 接続を無料で提供しています。Rails で SSL 接続を使えるように設定します。
config.force_ssl = true # コメントアウトを外す
本番環境のWEBサーバ(Puma)を設定します。
max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
threads min_threads_count, max_threads_count
port ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { ENV['RACK_ENV'] || "production" }
pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
workers ENV.fetch("WEB_CONCURRENCY") { 2 }
preload_app!
plugin :tmp_restart
Procfileファイルを新規作成して、コードを記入します。
./Procfile
web: bundle exec puma -C config/puma.rb
Heroku にログインします。メールアドレス、パスワード、2段階認証の数字を入力します。
$ heroku login -i
Herokuアプリを作成します。
$ heoku create app-name # アンダーバーは使えません
$ heroku git:remote -a app-name # git と紐付けする
Heroku環境でのデータベースの設定を調べます。
$ heroku addons:create heroku-postgresql:hobby-dev # 初回のみ
$ heroku config
DATABASE_URL: postgres://<username>:<password>@<host>:<port>/<database>
参考)このデータベースの設定値を使って、RubyMine から接続できます。
以上で、rails側の設定はできたので、GitHub に保存します。
$ git add -A
$ git commit -m 'heroku settings'
$ git push origin master
Heroku にも git push します。
$ git push heroku master
Heroku環境でテーブルを作成します。
$ heroku run rails db:migrate
Railsアプリが公開できたか、確認してみます。
(追記)Herokuへの git pushでエラーが出た時
こちらの記事に助けられました。ありがとうございます。
[memo] Herokuで Could not find 'bundler' (2.0.1) と言われた
Rubyは最新版を使用していたので、bundlerのみアップデートすることで、deployに成功しました。
$ gem install bundler -v 2.0.2
$ rm Gemfile.lock
$ bundle install
$ git add Gemfile.lock
$ git commit -m 'version up bundler'
$ git push origin master
$ git push heroku master
remote: Verifying deploy... done.
さあ開発を進めましょう !