高木のブログ

Sinatra アプリを Heroku にデプロイする

2022/05/05

Sinatra アプリのデプロイ先を探していて、いつも Rails アプリのデプロイ先でお世話になっている Heroku が候補に上がったので簡単に肩慣らし

公式で用意されていた Rack ベースのアプリのデプロイ するためのドキュメントを参考にした

ラックアップファイルさえあれば、シンプルなアプリだったら何もコードの変更をせずにデプロイできるので便利

手順

Sinatra アプリの作成

「Hello, world!」と返すだけのシンプルなアプリ

Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

ruby "2.7.4"

git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }

gem "sinatra"
app.rb
# frozen_string_literal: true

require "sinatra/base"

class App < Sinatra::Application
  get "/" do
    "Hello world!\n"
  end
end
config.ru
require './app'

run App

ローカルで起動

$ rackup
$ curl localhost:9292
Hello world!

Heroku へデプロイ

$ heroku login
$ heroku create app-name
$ git push heroku main
$ curl https://app-name.herokuapp.com/
Hello world!

ハマったところ

Mac の環境の場合、おそらく以下のエラーが出る

$ git push heroku main -f
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 12 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 855 bytes | 855.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-20 stack
remote: -----> Determining which buildpack to use for this app
remote: -----> Ruby app detected
remote: -----> Installing bundler 2.3.10
remote: -----> Removing BUNDLED WITH version in the Gemfile.lock
remote: -----> Compiling Ruby/Rack
remote: -----> Using Ruby version: ruby-2.7.4
remote: -----> Installing dependencies using bundler 2.3.10
remote:        Running: BUNDLE_WITHOUT='development:test' BUNDLE_PATH=vendor/bundle BUNDLE_BIN=vendor/bundle/bin BUNDLE_DEPLOYMENT=1 bundle install -j4
remote:        Your bundle only supports platforms ["x86_64-darwin-20"] but your local platform
remote:        is x86_64-linux. Add the current platform to the lockfile with
remote:        `bundle lock --add-platform x86_64-linux` and try again.
remote:        Bundler Output: Your bundle only supports platforms ["x86_64-darwin-20"] but your local platform
remote:        is x86_64-linux. Add the current platform to the lockfile with
remote:        `bundle lock --add-platform x86_64-linux` and try again.
remote:
remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote:
remote:  !     Push failed

Heroku で動かすためには以下のコマンドを実行し、差分の Gemfile.lock もコミットする必要がある
詳細は参考の記事を参照されたい

$ bundle lock --add-platform x86_64-linux
$ git diff Gemfile.lock
diff --git a/Gemfile.lock b/Gemfile.lock
index c0c917f..cde5eb9 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -16,6 +16,7 @@ GEM

 PLATFORMS
   x86_64-darwin-20
+  x86_64-linux

 DEPENDENCIES
   sinatra

リポジトリ

今回作ったものは、GitHub にあげた
https://github.com/ytkg/heroku-sinatra

参考


ytkg

Written by ytkg, Twitter, GitHub