Rack ベースのアプリのデプロイ
最終更新日 2021年01月04日(月)
Table of Contents
Heroku では Rack をサポートしており、Sinatra、Ramaze、Camping などの Rack ベースの Web フレームワークもサポートしています。
Rack ベースのアプリを実行するには、Gemfile
に加えて、config.ru
という名前のラックアップファイルをアプリのルートディレクトリに 含めます。config.ru
ファイル規約は一般的になっているため、既存の Rack アプリケーションのほとんどは変更なしで Heroku にデプロイできます。
純粋な Rack アプリ
まず、新しいディレクトリを作成し、単純な config.ru
ファイルを記述します。
$ mkdir hello
$ cd hello
$ cat <<EOF> config.ru
run lambda { |env| [200, {'Content-Type'=>'text/plain'}, StringIO.new("Hello World!\n")] }
EOF
$ cat <<EOF> Gemfile
source 'https://rubygems.org'
gem 'rack'
EOF
ローカルでテストします。
$ bundle install
$ bundle exec rackup -p 9292 config.ru &
$ curl http://localhost:9292
Hello World!
$ kill %1
Heroku にデプロイします。
$ git init
$ git add .
$ git commit -m 'pure rack app'
$ heroku create
$ git push heroku main
アプリが Heroku にデプロイされました。heroku open
を実行するか、ブラウザでアプリの URL にアクセスしてテストします。「Hello, World!」と表示されます。
フレームワーク
Sinatra
hello.rb:
require 'sinatra'
get '/' do
"Hello World!"
end
config.ru:
require './hello'
run Sinatra::Application
Gemfile:
source 'https://rubygems.org'
gem 'sinatra'
Ramaze
hello.rb:
require 'ramaze'
class MainController < Ramaze::Controller
def index
"Hello World!"
end
end
config.ru:
require ::File.expand_path('./../hello', __FILE__)
Ramaze.start(:file => __FILE__, :started => true)
run Ramaze
Gemfile:
source 'https://rubygems.org'
gem 'ramaze'
Camping
Camping 2.0 では、Rack アダプターは必要ありません。代わりに run Hello
を使用してください。
hello.rb
:
require 'camping'
Camping.goes :Hello
module Hello::Controllers
class Index < R '/'
def get
render :hello
end
end
end
module Hello::Views
def hello
p "Hello World!"
end
end
config.ru
:
require './hello'
run Rack::Adapter::Camping.new(Hello)
Gemfile:
source 'https://rubygems.org'
gem 'camping'
データベースアクセス
ActiveRecord の使用
ActiveRecord をスタンドアロンで使用する非 Rails アプリの場合、DATABASE_URL
にアクセスするには、次のコードをアプリケーションに配置します。
require 'active_record'
ActiveRecord::Base.establish_connection(ENV['DATABASE_URL'] || 'postgres://localhost/mydb')
上記のコードでは、mydb
という名前のデフォルトのローカル PostgreSQL データベースを使用しますが、この値を変更して任意の場所を指定したり、シェルで DATABASE_URL
環境変数を設定してアプリを実行することによって上書きしたりできます。
DataMapper または Sequel の使用
DataMapper と Sequel はどちらもネイティブでデータベース URL を使用するため、設定は簡単です。
DataMapper の場合:
require 'data_mapper'
DataMapper.setup(:default, ENV['DATABASE_URL'] || 'postgres://localhost/mydb')
Sequel の場合:
require 'sequel'
Sequel.connect(ENV['DATABASE_URL'] || 'postgres://localhost/mydb')
Rack::Sendfile
Rack::Sendfile
は通常、Ruby アプリケーションを経由せず Web サーバーから直接、静的ファイルを提供するために使用されます。
Heroku では Rack::Sendfile
の使用をサポートしていません。Rack::Sendfile
は通常、nginx や apache などのフロントエンド Web サーバーがアプリと同じマシンで実行されていることを要求します。 Heroku はこのように設計されていません。Rack::Sendfile
ミドルウェアを使用すると、Content-Length
が 0 の本体が送信されるため、ファイルのダウンロードが失敗します。
デフォルトでは、Rails はこれを nil
に設定しますが、config.action_dispatch.x_sendfile_header
が config/enviroments/production.rb
で設定されていないことを確認してください。