Rails5 アプリケーションのアップデート

旧環境のRailsアプリケーションは4.1で作成されていました。新環境のRailsバージョンは5.02なので、そのままでは動作しません。アプリケーションのアップデート作業が必要です。

まず、Railsアプリケーションのフォルダをまるっとバックアップしておきます。アップデートコマンド実行時に一部のファイルが上書きされてしまいますので、このバックアップが必要になります。

続いてGemfileをRails 5.02用に書き換えます。Rails 5.0.2インストール直後に作成したサンプルアプリケーションのGemfileを参考にしましょう。サンプルアプリケーションのGemfileをコピーしてから、バックアップしたGemfileを参考に必要なライブラリを追加する方法がよいでしょう。

cp ../sample/Gemfile .
vim 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

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.0.2'
# Use sqlite3 as the database for Active Record
#gem 'sqlite3'  ←mysql2に変更
gem 'mysql2'
# Use Puma as the app server
gem 'puma', '~> 3.0'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# See https://github.com/rails/execjs#readme for more supported runtimes
gem 'therubyracer', platforms: :ruby  ←コメントを外す

# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 3.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

group :development, :test do
 # Call 'byebug' anywhere in the code to stop execution and get a debugger console
 gem 'byebug', platform: :mri
end

group :development do
 # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
 gem 'web-console', '>= 3.3.0'
 gem 'listen', '~> 3.0.5'
 # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
 gem 'spring'
 gem 'spring-watcher-listen', '~> 2.0.0'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

↓必要なライブラリを追加
gem 'devise'
gem 'less-rails'
gem 'twitter-bootstrap-rails'
gem 'kaminari'
gem 'kaminari-bootstrap', '~> 3.0.1'

RubyからJavaScriptを実行するためにはExecJSが必要になります。ExecJSは最適なJavaScriptランタイムを自動的に選択し、そのランタイムをRubyオブジェクトとして利用するのです。ExecJSは以下のランタイムをサポートしています。

  • therubyracer – Google V8 embedded within Ruby – V8をRubyから使えるようにするgem。高速に動く。Windows環境に入れようとしてもたぶん失敗する。Windows環境では Node.js を入れると動く。
  • therubyrhino – Mozilla Rhino embedded within JRuby – JRubyの場合はこれ。
  • Node.js – インストールされているNode.jsを呼び出す。
  • Apple JavaScriptCore – Included with Mac OS X
  • Microsoft Windows Script Host (JScript)

ExecJSにより利用できるランタイムが自動判別され、RubyからJavaScriptコードが実行できるのですから便利というかすごいですね。でもうまくいかなくて悩むはまりどころでもあります。
ということでほぼ標準なtherubyracerを使用します。rails new コマンドで自動生成されたGemfileから、therubyracerに付いている#を外します。

続いて、

bundle update

次に以下のコマンドでアプリケーションの設定ファイル等を更新します。

rails app:update

コンフリクトしたファイルを上書きするか聞かれますので、すべて Y にして上書きします。

conflict config/boot.rb
Overwrite /var/www/abc/config/boot.rb? (enter "h" for help) [Ynaqdh] Y
 force config/boot.rb
 exist config
 conflict config/routes.rb
Overwrite /var/www/abc/config/routes.rb? (enter "h" for help) [Ynaqdh] Y
 force config/routes.rb
 conflict config/application.rb
Overwrite /var/www/abc/config/application.rb? (enter "h" for help) [Ynaqdh] Y
 force config/application.rb
 conflict config/environment.rb
Overwrite /var/www/abc/config/environment.rb? (enter "h" for help) [Ynaqdh] Y
 force config/environment.rb
 conflict config/secrets.yml
Overwrite /var/www/abc/config/secrets.yml? (enter "h" for help) [Ynaqdh] Y
 force config/secrets.yml
 create config/cable.yml
 create config/puma.rb
 create config/spring.rb
 exist config/environments
 conflict config/environments/development.rb
Overwrite /var/www/abc/config/environments/development.rb? (enter "h" for help) [Ynaqdh] Y
 force config/environments/development.rb
 conflict config/environments/production.rb
Overwrite /var/www/abc/config/environments/production.rb? (enter "h" for help) [Ynaqdh] Y
 force config/environments/production.rb
 conflict config/environments/test.rb
Overwrite /var/www/abc/config/environments/test.rb? (enter "h" for help) [Ynaqdh] Y
 force config/environments/test.rb
 exist config/initializers
 create config/initializers/application_controller_renderer.rb
 conflict config/initializers/assets.rb
Overwrite /var/www/abc/config/initializers/assets.rb? (enter "h" for help) [Ynaqdh] Y
 force config/initializers/assets.rb
 identical config/initializers/backtrace_silencers.rb
 conflict config/initializers/cookies_serializer.rb
Overwrite /var/www/abc/config/initializers/cookies_serializer.rb? (enter "h" for help) [Ynaqdh] Y
 force config/initializers/cookies_serializer.rb
 create config/initializers/cors.rb
 identical config/initializers/filter_parameter_logging.rb
 identical config/initializers/inflections.rb
 identical config/initializers/mime_types.rb
 create config/initializers/new_framework_defaults.rb
 identical config/initializers/session_store.rb
 conflict config/initializers/wrap_parameters.rb
Overwrite /var/www/abc/config/initializers/wrap_parameters.rb? (enter "h" for help) [Ynaqdh] Y
 force config/initializers/wrap_parameters.rb
 exist config/locales
 identical config/locales/en.yml
 gsub config/environments/development.rb
 identical config/cable.yml
 remove config/initializers/cors.rb
 exist bin
 identical bin/bundle
 conflict bin/rails
Overwrite /var/www/abc/bin/rails? (enter "h" for help) [Ynaqdh] Y
 force bin/rails
 conflict bin/rake
Overwrite /var/www/abc/bin/rake? (enter "h" for help) [Ynaqdh] Y
 force bin/rake
 create bin/setup
 create bin/update

After this, check Rails upgrade guide at http://guides.rubyonrails.org/upgrading_ruby_on_rails.html for more details about upgrading your app.

上書きされたファイルは、一つ一つdiffツールを使用してバックアップファイルと比較し、必要なコードを追記・修正していきます。
バックアップとのdiffの結果、追記・修正したファイルは以下の通りでした。

  • config/routes.rb
  • config/application.rb
  • config/environments/production.rb

Pumaの設定ファイルは以下の通り追加しました。

vim config/puma.rb
workers 2
preload_app!
on_worker_boot do
 ActiveRecord::Base.establish_connection if defined?(ActiveRecord)
end
bind "unix:///var/www/abc/tmp/sockets/puma.sock"
port 3001

workersはCPUコア数と一致させます。これでクラスターモードとなって複数のワーカープロセスが立ち上がります。
preload_app!でワーカーを起動する前にアプリケーションをプリロード、さらにActiveRecordの接続プールを設定します。
ソケットにbindする設定を追加、ポート番号は3001を指定します。

Nginxの設定ファイルにもクラスターモードの設定をします。

vim /etc/nginx/nginx.conf
worker_processes 2;
worker_cpu_affinity 01 10;

worker_processesはCPUコア数と一致させ、worker_cpu_affinityでどのCPUコアを使用するか2進数で指定します。

バーチャルサーバー毎の設定ファイルはこのようになりました。

vim /etc/nginx/conf.d/abc.conf
upstream abc_backend {
 server unix:///var/www/abc/tmp/sockets/puma.sock;
}
server {
 listen 443 ssl;
 server_name abc.com;
 ssl_certificate /etc/letsencrypt/live/abc.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/abc.com/privkey.pem;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA512:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:ECDH+AESGCM:ECDH+AES256:DH+AESGCM:DH+AES256:RSA+AESGCM:!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;
 ssl_dhparam /etc/nginx/dhparam.pem;
 location / {
  proxy_pass http://abc_backend/;
  proxy_redirect off;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-Proto https;
 }
}
server {
 listen 80;
 server_name abc.com;
 root /var/www/abc/public;
 return 301 https://$host$request_uri;
}

これで新環境でアプリケーションの本番稼働ができるようになりました。

SSL証明書は前環境から引き継いでいます。次回はLet’s Encryptのサーバー引き継ぎです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする