K’s diary

プログラミング、ビジネスや時事ニュース、経営/人事、音楽や映画について書いていきます

Railsプロジェクトの新規作成の手順メモ

はじめに

Railsでの新規アプリ作成の手順をまとめた。

開発環境

前提

  • gem「rails」をプロジェクトごとに管理しシステムに入れない
  • DBはmysqlを利用します
  • Githubは登録済みを前提にしています
  • herokuのインストールと登録は完了している前提です

ローカルへRailsのインストール

まずは、以下のコマンドを実行して「Gemfile」を作成します。 詳細はbundlerの使い方でも紹介していますので、詳細を知りたい方はそちらを合わせてご覧ください。 今回は、作成手順のみを中心に書いていきます。

$ mkdr testapp  #testappディレクトリの作成
$ cd testapp  #testappへの移動
$ pwd  #移動できたかの確認
$ bundle init  #gemfileの作成

bundle initで作成されたgemfile内の# gem "rails"コメントアウトを外します。

# frozen_string_literal: true

source "https://rubygems.org"

gem "rails"  ←ここの#を削除します。

これで、testappディレクトリ内に「Ruby on rails」をインストールする準備ができましたので、以下のコマンドを実行します。

$ bundle install --path vendor/bundle

ここまでで作成されたディレクトリ 「testapp」の中に 「.bundle/config」 「vendor/bundle」 「Gemfile」 「Gemfile.lock」

ただしこの時点では、まだウェブアプリの骨組みを構築するためのGem「Rails」を用意したにすぎません。ここから、あらためて新規Railsプロジェクトを作成していきます。

新規のRailsプロジェクトの作成

$ bundle exec rails new . -B -d mysql  #現dirにmysqlで新規作成
$ bundle exec rails s

Railsのインストール実行時にGemfileを上書きしていいか聞かれますので「yes」にして続行します。これにより、Railsプロジェクトが新規作成されましたので、以下のようにGemfileを編集します(以下はあくまで参考です)。

source 'https://rubygems.org'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

gem 'rails', '~> 5.0.1'
gem 'mysql2', '>= 0.3.18', '< 0.5'
gem 'puma', '~> 3.0’
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.2'
gem 'jquery-rails'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'
gem 'tzinfo-data'
gem 'devise'
gem 'haml-rails'
gem 'erb2haml'
gem 'font-awesome-rails'
gem 'font-awesome-sass'
gem 'carrierwave'
gem 'mini_magick'
gem 'rails-i18n'
gem 'kaminari'
gem 'autoprefixer-rails'
gem 'gretel'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'dropzonejs-rails'
gem 'fog-aws'

gem 'payjp'
gem 'enum_help'
gem 'omniauth-facebook'
gem 'omniauth-twitter'
gem 'omniauth-google-oauth2'
gem 'omniauth-instagram'
gem "recaptcha"

group :development, :test do
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'capybara', '~> 2.13'
  gem 'selenium-webdriver'
  gem 'factory_bot_rails'
  gem 'capistrano'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano3-unicorn'
  gem 'factory_girl_rails', "~> 4.4.1"
  gem 'faker'
  gem 'pry-rails'
  gem 'rails-controller-testing'
  gem 'rspec-rails'
end

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'rubocop', require: false
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
  gem 'browser_sync_rails'
  gem 'bullet'
end

group :test do
end

group :production do
  gem 'unicorn'
end

Gemfileへの記述が完了したらbundle updateでGemをインストールしていきます(既にgemfile.lockが作成されているので)

$ bundle update --path vendor/bundle

もしくは、一度「gemfile.lock」を削除してbundle installでもオッケーです。

ここまでで、一旦は新規プロジェクトの作成準備ができました。

Githubへプッシュ

編集が完了したら、Githubの管理下におきましょう。Githubへの登録は完了している前提で進めていきます。

またここで「.gitignore」を編集しておくことをお勧めします。(参考ページ)

$ git init
$ git add .
$ git commit -m "first commit"
$ git remote add origin https://github.com/username/appname.git
$ git push -u origin master

上のコマンド内の「username」にはgithubのユーザーネームを、「appname」はプロジェクト名を入れます。

herokuでデプロイ

herokuでデプロイを行います(こちらもインストールや登録は完了している前提で進めていきます)。

まずはherokuがインストールできていることを確認し、ログインします。

$ heroku —version  #バージョンが表示されればOK
$ heroku login --interactive

heroku: Enter your login credentials
Email [hogehoge@gmail.com]:   #emailが表示→enter
Password: ********************  #herokuのパスワード入力
Logged in as hogehoge@gmail.com

次に、SSHキーを追加します。

$ heroku keys:add

Uploading /Users/Username/.ssh/ssh_key_file_name.pub SSH key... done

以下のコマンドでherokuサーバーにアプリケーションの実行場所を作成できます。

$ heroku create

Creating app... done, ⬢ stormy-sands-10745
https://stormy-sands-10745.herokuapp.com/ |
https://git.heroku.com/stormy-sands-10745.git

上の表示が出れば、無事herokuでのサブドメインが作成されました。なお、上の「stormy-sands-10745」部分はheroku側が自動設定したサブドメインで、その時によって変わります。

ではherokuにデプロイします。まずGitを使ってherokuにリポジトリをプッシュします。

$ git push heroku maseter

herokuへの反映の基本的動作はこれでOKです。

ただし、ここでエラーが出まくる可能性が高いです。落ち着いて対処して下さい(私がこの記事を書く際に出くわしたエラーの対処方法については下に記載しておりますのでご参考まで)

エラーを対処しherokuへのデプロイが無事完了したら、herokuが設定したサブドメインのURLにアクセスしてください。(上記例ではhttps://stormy-sands-10745.herokuapp.com/です。これは当然、作成度に異なりますので、ご自身のドメインにアクセスして下さい)

アプリ画面が表示されればデプロイ完了です。

herokuのドメイン変更

初期のドメインはherokuが自動で設定したものです。このままでも構いませんが、アプリ名やドメインを変更したいと思う方も多いでしょう。その場合は以下のコマンドで変更できます。

なお、以下のNEW_NAMEの所に任意のアプリ名を入れて下さい。

$ heroku rename NEW_NAME

Renaming stormy-sands-10745 to NEW_NAME… done
https://NEW_NAME.herokuapp.com/ |
https://git.heroku.com/NEW_NAME.git
Git remote heroku updated
 ▸    Don't forget to update git remotes for all other local checkouts of the app.

これでお好みのアプリ名に変更でき、合わせてドメインも変更されました。

herokuデプロイのエラー対応

今回herokuでのデプロイを進める上で起こったエラーの対処を記録します。

私の場合、今回はプロジェクトを途中まで作成した段階でデプロイしたので、作成中プロジェクトに由来するエラーも多かった(新規作成してすぐでは発生しないはず)のですが、あくまでご参考として。

尚、herokuに関するエラーの対処法については、heroku公式サイトのRailsサポートページに記載がありますのでご参考ください。

(エラー)Precompiling assets failed.

最初に$ git push heroic masterした時に発生しました。

$ git push heroku master

Enumerating objects: 383, done.
Counting objects: 100% (383/383), done.
・・・(省略)・・・
remote:  !
remote:  !     Precompiling assets failed.
remote:  !
・・・(省略)・・・
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/NEW_APPNAME.git'

Precompiling assets failed.と出ています。アセットファイルがプリコンパイルができません、とのことです。

<補足>

CSSJavaScriptファイル、画像ファイルをコンパイル機械語への翻訳)しやすいように、圧縮や連結をする処理をプリコンパイルと言い、そのためのフレームワークをアセットパイプラインと言います。

Railsアプリの~/app/assetsの中にあるimagesstylesheetsが、アセットパイプラインの部品であるアセットファイルです。

この対応についてはherokuの公式サイトにある通り、config/application.rbファイルに、以下のように追記します。

module NEW_APP_NAME
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
・・・(省略)・・・
    config.generators.system_tests = nil
    config.assets.initialize_on_precompile = false   #この行を追加
  end
end

この記述は、コンパイル時にアプリケーションが初期化されるのを防ぐという設定ですが、Rails3まではこれを記述しないとプリコンパイル時にエラーが出るとのこと(Rails4以降は記述不要とのこと)

また、通常、本番環境にデプロイする際は、アセットパイプラインの処理機能によりassets内のファイルが圧縮・統合(プリコンパイル)されている必要がありますが、これは自動では行われません。

なので、以下のコマンドにより手動でプリコンパイルしてあげます。

$ RAILS_ENV=production bundle exec rake assets:precompile

ここまで完了したら、必ずgitにコミットしましょう。

(エラー)No Procfile detected,...

次は以下のエラーが出ました。

・・・(省略)・・・
remote: ###### WARNING:
remote: 
remote:        No Procfile detected, using the default web server.
remote:        We recommend explicitly declaring how to boot your server process via a Procfile.
remote:        https://devcenter.heroku.com/articles/ruby-default-web-server
・・・(省略)・・・

「Procfile」がないので、Procfileを使ってサーバーの起動方法を書くように、とのこと。

Procfileとはherokuでのサーバーの起動設定や、起動時に実行したいコマンドを記述するファイルです。

Ruby並びにRailsなどのフレームワークでは、デフォルトの開発環境用サーバーとしてWEBrickが設定されています。このWEBrickは開発には適していますが、本番環境で必要な並列処理ができません。


なので、並列処理を可能にするた目の別のWebサーバを利用する必要があります。今回はwebサーバーとしてpumaを利用していきます。
 gemfileにpumaがあるかを確認し、なければ記述します(バージョンは任意)。

gem 'puma', '~> 3.11'

次に、プロジェクトディレクトリ内に、Prockfileを作成します。

以下のコマンドでProckfileを生成しつつ、ファイル書き込みモードを起動します。

$ vim Procfile

ファイルが生成され書き込みモードになったら、キーボードの「I」を押して挿入モードに切り替え、以下を記述します。

$ web: bundle exec puma -C config/puma.rb

書き込み完了したら「esc」→「:wq」→「enter」で保存します。

次に、config/puma.rbファイルを編集します。rails5系であれば、設定ファイル自体は最初から存在しています(ない場合は作成する必要があります)。

config/puma.rbファイル内に下記コード文がコメントアウトされていますので、これをを外します。

 workers ENV.fetch("WEB_CONCURRENCY") { 2 }

 preload_app!


 on_worker_boot do
   ActiveRecord::Base.establish_connection if defined?(ActiveRecord)
 end

あとはgithubへコミットしデプロイして確認します。デプロイ時にエラーメッセージが表示されなくなっていればオッケーです。

(エラー)Devise.secret_key was not set...

再度、デプロイコマンドを打つと、次のエラー出ました。

$git push heroku master

・・・(省略)・・・
remote:        Running: rake assets:precompile
remote:        rake aborted!
remote:        Devise.secret_key was not set. Please add the following to your Devise initializer:
remote:        
remote:          config.secret_key = 'f3f2cbc***********’
remote:        

これは、私が立ち上げたプロジェクトにユーザーログイン認証用のgem「Devise」が導入されており、そのsecret_keyが未設定のために起こったエラーです。

config/initializers/devise.rbファイルの適当なところに、エラー文に出ていたconfig.secret_key=…をコピペしてあげればokです。

Devise.setup do |config|
   # The secret key used by Devise. Devise uses this key to generate
   # random tokens. Changing this key will render invalid all existing
  config.secret_key = 'f3f2cbc***********’ #コピペする
end

これだけでokです。

白い画面に「An unhandled lowlevel error occurred. .」

改めてデプロイしてみます。

$ git push heroku master
$ heroku open

$ heroku openはherokuでデップロイしたアプリをブラウザで開くコマンドです。ブラウザにURLをコピペする手間が省けます。

ブラウザが開くと、白い画面に「An unhandled lowlevel error occurred. The application logs may have details.」とだけ表示されました。

原因を調べるため、以下のコマンドでログを表示してエラー個所を確認。

$ heroku logs

・・・(省略)・・・
2019-07-04T07:24:03.529018+00:00 app[web.1]: #<RuntimeError: Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`>

「secrets.ymlファイルのsecret_key_baseが見つからない」とのことです。しかしsecrets.ymlはgithubには載せたくないです。

(secret.ymlにはAWS秘密鍵コードなどを記載するので、うっかり載せると他人に悪用される可能性もあります)

なのでgemfileに以下を記載した。

gem 'heroku_secrets', github: 'alexpeattie/heroku_secrets'

これは、secrets.ymlファイルをgitに置かずにherokuに送るためのgemです。

$ bundle install

でインストールできたら、以下のコマンドを実行します。

$ bundle exec rake heroku:secrets[APP_NAME] RAILS_ENV=production

これで、okです。

(エラー)Can't connect to local MySQL server…mysql.sock' (2)):

$heroku openしても白い画面のままなので$heroku logで確認します。

$ heroku logs

・・・(省略)・・・
ActionView::Template::Error (Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)):

MySQL関連のエラーです。ちなみにHerokuのDBはデフォルトでPostgreSQL になっていますが、私はMySQLを使っているのでMySQL関連のエラーが発生しました。

HerokuでMySQLを使うには、アドオンの追加が必要です。Herokuの公式サイトによると、ClearDBとJawsDBが使えるようですが、今回はClearDB を使います。

また、HerokuでMySQLを使用するためにはクレジットカードの登録が必要です(登録のみでオッケー。ライトプランであれば無料で利用できます)

こちらから設定しましょう。

以下のコマンドでアドオンを追加します。

$ heroku addons:create cleardb:ignite
Creating cleardb:ignite on ⬢ APP_NAME… free
・・・(省略)・・・

アドオンが追加できたら、dbのURLを確認します。

Herokuではconfig/databse.ymlは環境変数から自動で作成されるとのこと。

以下のコマンドで、Herokuサーバーでの環境変数を確認します。

$ heroku config

CLEARDB_DATABASE_URL:       mysql://<username>:<password>@<host>/<database>?reconnect=true
DATABASE_URL:               postgres://<username>:<password>@<host>:<port>/<database>
HEROKU_POSTGRESQL_TEAL_URL: postgres://<username>:<password>@<host>:<port>/<database>
LANG:                       en_US.UTF-8
RACK_ENV:                   production
RAILS_ENV:                  production
SECRET_KEY_BASE:            ...

上のコマンドで表示された’DATABASE_URL’が現在設定されているデータベースのURLです。

デフォルトでPostgreSQLの接続設定になっているので、これをCLEARDB_DATABASE_URLに設定されているMySQLの接続設定に置き換えます。さらに、mysql2ライブラリを使っているので先頭のmysql://をmysql2://に修正する必要があります。

以下のコマンドで実行します。

$ heroku config:set DATABASE_URL=‘mysql2://ba0fd5… #上のURLをmysql2に書き換えたものをコピペ
$ heroku config  #変更されたか確認

ついでに、タイムゾーンと LANG の設定もしておきましょう。

$ heroku config:add TZ=Asia/Tokyo
$ heroku config:add LANG=ja_JP.UTF-8

最後にマイグレーションを実行します。

$ heroku run rails db:create

$ heroku run rails db:migrate

$ heroku open

<補足>

heroku runコマンドは、Herokuサーバー側でコマンドを実行するためのコマンドです。

これでできました。

最後に

今回は、Railsプロジェクトの新規作成の手順の説明でした。特にHerokuでのデプロイや毎回エラーが発生して最初は大変ですが、慣れてしまえば大したことないです。頑張りましょう。

参考サイト

Add-ons | Heroku Dev Center

ClearDB MySQL - Add-ons - Heroku Elements

関連ページ

後ほど追記します。