これはなに?
GMOペパボさんが運営するオートスケール機能がついたコンテナサービスにRails製アプリをデプロイするまでのメモです。
アプリはこちらの質問箱のクローンをさらにクローンさせてもらっています。
作者の方はHerokuで運用されているみたいだったので、他の人が作ったアプリからRailsの組み方を学ばせてもらうとともに、Lolipop!マネージドクラウド(以下マネクラ)へのデプロイの練習を目的として進めてみました。
大元の情報
事前の準備
- ロリポップ!マネージドクラウドの会員登録とssh,各種鍵の登録までしておく
- rbenvを入れていろんなバージョンのrubyを使ったリポジトリを扱えるようにしておく
- git や エディタ を設定しておく
マネージドクラウド側の設定
- プロジェクト(専用コンテナ)をつくる
- コンテナにsshができるか確かめる
なんだかんだ一つのコンテナあたり10日間無料で使えるのは太っ腹です。
難しい設定をしらなくても、チェックツールさえ通って入ればコンテナ上で本番環境に対してdb:migrate かけてくれたりするのも魅力ですね。
macに当該リポジトリをcloneしてくる
git clone git@github.com:seiyatakahashi/peing-questionbox-clone.git
ローカルリポジトリのRuby および Railsの バージョンをロリポップと揃える
マネージドクラウドではRubyが2.5.8、railsが5.2だったので、ローカルでruby -v
rails -v
してバージョンを確かめました。
ここでバージョンがあって揃ってなかったため、
rbenv install 2.5.8
および、
rbenv local 2.5.8 && rbenv rehash
してあげてバージョンを揃えてあげました。
(railsは変えた記憶(history)がない...)
チェックツール
公式で用意されているチェックツールを入れましょう。(github)
gem install lolipop-mc-starter-rails
ここでRailsのプロジェクトをマネクラにPushするための必要事項を適宜チェックしてくれる(スゴイ)。
私の場合はここでdatabase.ymlがなんか変だぞと教えたもらったので、
./config/database.yml
の内容をみてみます。
database.tmlの内容
# SQLite version 3.x
# gem install sqlite3
#
# Ensure the SQLite 3 gem is defined in your Gemfile
# gem 'sqlite3'
#
default: &default
adapter: sqlite3
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
timeout: 5000
development:
<<: *default
database: db/development.sqlite3
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: db/test.sqlite3
production:
database: my_database_production
adapter: postgresql
encoding: unicode
pool: 5
ここでRailsの各環境におけるSQLの選択ができます。
クローン元のリポジトリでは、Herokuのproduction環境のPostgreSQLに合わせてあるので、
マネクラの本番環境(production)のMySQLに合わせないといけないですね。
というわけでこんな感じで書き換えます。
database.ymlを変更
production:
<<: *default
adapter: mysql2
encoding: utf8
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV["MC_DB_USERNAME"] %>
password: <%= ENV["MC_DB_PASSWORD"] %>
database: <%= ENV["MC_DATABASE"] %>
host: <%= ENV["MC_DB_HOSTNAME"] %>
MC_DB_USERNAME
などなどは、ブラウザからマネクラのコントロール画面を開いて環境変数として設定してあげます。
もちろんそのまま直書きもできますが、危険なのでやめましょう。
(ちなみにローカル環境でも直書きしたくないよ〜ってひとはenvdir
とかで設定してあげるといいかも)
gem install mysql2
ローカルリポジトリにgemを入れてあげて、
./gemfile
にgem mysql2
と追記。
新たにgemを入れたので bundle install
してあげて、これでSQL周りは大丈夫なはず。
マネクラの環境変数を設定していく。
続いてブラウザでマネクラのコントロールパネルを開きつつ、マネクラ側の環境変数を設定していきます。
上記MC_DB_USERNAME
などを読み込むようにします。
今回は他の人が作成したRailsのプロジェクトを使っているので、./config/master_key
を作り直しました。
EDITOR="vi" bin/rails credentials:edit
を打ち込むと上書き作成されます。
これをRAILS_MASTER_KEY
としてマネクラの環境変数に登録。
また、ローカルで、mc-rails database
してデータベースのURLを作成します。
データベース名、ユーザ名、パスワードの入力を求められるので、マネクラのコンソールにあるものをそれぞれ入力すると、
URLが表示されるのでこれをDATABASE_URL
として同様に環境変数として設定。
また、公式の手順に則り、RAILS_SERVE_STATIC_FILES
も環境変数に入力し、値としてtrue
を与えておきましょう。
Twitterの各種認可キーを取得する。
Tiwtterのデベロッパー向けサイトにいき、APIキーの発行を行いました。
Developer portal に移動し、会員登録をしていなければ、会員登録およびSign in後、右上のアカウント名のメニューより作成したAPIキー一覧のページに飛びます。
Create an APPs の項目を適宜埋めてAPIキーを作成したら、Details > Keys and tokensより、
- API Key
- API serect key
- Access token
- Access token secret
を手元に控えておきます。
これをそれぞれ、
環境変数名 | 値 |
---|---|
API_KEY | "API Key" |
API_SECRET | "API serect key" |
TOKEN | "Access token" |
SECRET | "Access token secret" |
としてマネクラに登録しておきます。
なお、クローン元のアプリではさらに、
- APP_NAME="アプリの名前"
- APP_NAME_EN="アプリの英語の表記名"
- CURRENT="自分ののツイッターのID"
- DESCRIPTION="サイトの情報"
- KEYWORDS="サイトのキーワード"
- GOOGLE_ANALYTICS="Google アナリティクスのID"
といった情報もコンテナの環境変数として登録できるように設定されています。(README.mdより)
マネクラにPush
改めて
git add .
git commit
mc-rails check
なにも怒られななかったはずなので、これでローカルの
git push lolipop master
してマネクラにpush。
無事にデプロイできました🙌
リモートリポジトリ(コンテナ)からエラーを拾う。
上記で無事に、といってはいますが、実際には当初、Twitterアカウントでの認証画面への遷移の際にエラーが吐かれていました。
そこで、リモートリポジトリの中に何かエラーログはないか探索してみました。
リモートリポジトリは以下のようになっていて、
僕のリモートリポジトリのホームディレクトリ:~$ ls -a
. .bash_history .cache .ssh .viminfo 1597471676557237 projrepo
.. .bundle .lolipop .vim 0000000000000000 current shared
このcurrent
の中がPushしたRailsのプロジェクトになっています。
また、current
ディレクトリ内にlog
ディレクトリが存在しており、この中にコンテナのログが蓄積されていくことになります。
Haconiwaのログが出るのでこれを掘る
log
の中身は
gitpush.log
production.log
{プロジェクト名}.lolipop.io-{ハッシュ値} みたいなディレクトリがたくさん
という感じでした。
ややエスパーではありますが、ここでdu
して重そうなログが格納してあるディレクトリを探しました。
普通のディレクトリの容量が、4KBのところ、40KBくらいのディレクトリを見つけたのでここをcat
してみると、
Started GET "/auth/twitter"
のあとに、
...OAuth::Unauthorized (401 Authorization Required)...
みたいな怒られが発生しているのを発見。
どうやらTwitter APIの認可がうまくいってないっぽい。[参考](Qiita https://qiita.com/hirokishirai/items/5a43977a38ecd922bfb9)
なので再度Callback用のURLなどTwitterのDevサイトにバッチリ登録し直してみるとうまく画面遷移するようになりました。
ちなみにHaconiwaはRuby製のコンテナです。
おわりに
VPSとか手持ちのオンプレ環境にRailsを動かしたあとだったこともあって、とても手軽にアプリを作成できるようになるのはめちゃくちゃ体験としてよかったです。
また、他の人の作った質問箱様アプリを触ってみて、「僕だったらこの機能とこの機能に絞って作るかも!」とか、「テーブル構造はどうなってるんだろう」みたいな感想が浮かんだのもいい収穫だった様に思います。
Dockerもですが、デプロイ先としてコンテナを設けて置くのはちょっとしたアプリをシャッと作りたいときに便利そうですよね。
先に触れたHaconiwaに関連する宣伝ではありますが、mRubyの本が2020年11月に刊行されるみたいです。買いましょう。
おわり。