LoginSignup
1
1

More than 3 years have passed since last update.

質問箱のクローンをリプレイスする

Posted at

これはなに?

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を入れてあげて、
./gemfilegem 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の認可がうまくいってないっぽい。参考

なので再度Callback用のURLなどTwitterのDevサイトにバッチリ登録し直してみるとうまく画面遷移するようになりました。

ちなみにHaconiwaはRuby製のコンテナです。

おわりに

VPSとか手持ちのオンプレ環境にRailsを動かしたあとだったこともあって、とても手軽にアプリを作成できるようになるのはめちゃくちゃ体験としてよかったです。

また、他の人の作った質問箱様アプリを触ってみて、「僕だったらこの機能とこの機能に絞って作るかも!」とか、「テーブル構造はどうなってるんだろう」みたいな感想が浮かんだのもいい収穫だった様に思います。

Dockerもですが、デプロイ先としてコンテナを設けて置くのはちょっとしたアプリをシャッと作りたいときに便利そうですよね。

先に触れたHaconiwaに関連する宣伝ではありますが、mRubyの本が2020年11月に刊行されるみたいです。買いましょう。

おわり。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1