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

## これはなに？
GMOペパボさんが運営するオートスケール機能がついたコンテナサービスにRails製アプリをデプロイするまでのメモです。

アプリは[こちら](https://github.com/masatooba/peing-questionbox-clone)の質問箱のクローンをさらにクローンさせてもらっています。

作者の方はHerokuで運用されているみたいだったので、他の人が作ったアプリからRailsの組み方を学ばせてもらうとともに、Lolipop!マネージドクラウド(以下マネクラ)へのデプロイの練習を目的として進めてみました。


## 大元の情報
- [Masato oda さんのリポジトリ](https://github.com/masatooba/peing-questionbox-clone)
- [Lolipop!マネージドクラウドのRailsアプリのデプロイガイド](https://medium.com/mclolipop/%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%89%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%ABruby-on-rails%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-be59c43e309e)


## 事前の準備
- [ロリポップ!マネージドクラウド](https://mc.lolipop.jp/login?status=403&message=require%20authentication&referrer=%2Fconsole%2Fsshkeys)の会員登録と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](https://github.com/k1LoW/lolipop-mc-starter-rails))

`gem install lolipop-mc-starter-rails`

ここでRailsのプロジェクトをマネクラにPushするための必要事項を適宜チェックしてくれる(スゴイ)。

私の場合はここでdatabase.ymlがなんか変だぞと教えたもらったので、

./config/database.yml
の内容をみてみます。

<details><summary>database.tmlの内容</summary><div>

```

# 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
```



</div></details>



ここでRailsの各環境におけるSQLの選択ができます。
クローン元のリポジトリでは、Herokuのproduction環境のPostgreSQLに合わせてあるので、
マネクラの本番環境(production)のMySQLに合わせないといけないですね。

というわけでこんな感じで書き換えます。

<details><summary>database.ymlを変更</summary><div>

```
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"] %>

```

</div></details>

`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のデベロッパー向けサイト](https://developer.twitter.com/ja)にいき、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](https://github.com/haconiwa/haconiwa)はRuby製のコンテナです。



## おわりに

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

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

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

先に触れたHaconiwaに関連する宣伝ではありますが、[mRubyの本](https://www.amazon.co.jp/dp/4863543298/ref=cm_sw_r_tw_dp_x_BSaGFb60V2CCM)が2020年11月に刊行されるみたいです。買いましょう。

おわり。