Rails アプリを GCE の Ruby Stack でデプロイする


**環境**

- Apache 2.2.22
- Passenger 4.0.48
- Ruby 2.1.1p76
- Rails 4.1.4
- RVM 1.25.28
- MySQL 5.5.38

# Ruby development stack の準備

[（参考）Ruby development stack on Google Compute Engine](https://cloud.google.com/solutions/ruby/)
[（参考）Deploying a Rack-based Ruby application](https://www.phusionpassenger.com/documentation/Users%20guide%20Apache.html#_deploying_a_rack_based_ruby_application_including_rails_gt_3)

GCEのRubyスタックを作成する。（パスワードなどは例ですので適宜変更してくださいね）

- パスワード：mysqlrootpassword
- ゾーン：asia-east1-a

**手順**

- まず「プロジェクト/概要」ページ右下の「その他」をクリックする。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/5179/ed3592cb-ff36-e098-026c-1f2d406de4d5.png "1.png")

- 次に表示されたページの「Deploy the Ruby Stack on Compute Engine」をクリックする。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/5179/ec9abd78-0491-48bc-7a49-5928f1851d04.png "2.png")

- パスワードを入力し「詳細」をクリックする。
- お好みのゾーンを選びましょう。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/5179/e3c54ef3-5a49-825b-7c0d-c4f575e5b02d.png "3.png")

- 5〜10分待つとインスタンスが生成される。
- 「View your Ruby stack in the Developers Console」をクリックする。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/5179/bcf1fca3-6f6a-f141-4b3e-bd59c747ce0e.png "4.png")

- VM インスタンスのページに遷移する。
- 「SSH」をクリックすると・・・

![5.png](https://qiita-image-store.s3.amazonaws.com/0/5179/963a88d5-ec28-c140-4e5d-3878d84bf95c.png "5.png")

- コマンドラインの文字列が表示される。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/5179/005f2c50-9b22-d45b-3cd7-4f23ab8402e9.png "6.png")

# WEBrick
## development環境

開発用にTCP 3000番のポートを通す。

```bash
gcloud compute firewall-rules list
gcloud compute firewall-rules create rails --allow tcp:3000
```

サーバーにログインする。

```bash
gcloud compute --project FOO ssh --zone "asia-east1-a" BAR
```

サンプルのRailsアプリとMySQLのテーブルを作成する。

- therubyracer gemを有効にする。
- パスワードを設定する。

```bash
mkdir webapps && cd webapps
rails new -B -d mysql blog && cd blog
sed -i -e "s/# gem 'therubyracer'/gem 'therubyracer'/" Gemfile
rvmsudo bundle
rails g scaffold Post title body:text
sed -i -e "s/password:$/password: mysqlrootpassword/" config/database.yml
rake db:create
rake db:migrate
rails s
```

ウェブブラウザで ```http://<<外部IP>>:3000/posts``` を開いて動作を確認する。

```bash:（参考）データベースの確認と削除
mysql -uroot -pmysqlrootpassword -e 'show databases;'

+--------------------+
| Database           |
+--------------------+
| information_schema |
| blog_development   |
| blog_test          |
| mysql              |
| performance_schema |
+--------------------+

mysql -uroot -pmysqlrootpassword -e "drop database blog_development;"
mysql -uroot -pmysqlrootpassword -e "drop database blog_production;"
mysql -uroot -pmysqlrootpassword -e "flush privileges;"
```

## production環境

データベースを作成すると、MySQLのrootユーザーのパスワード入力を促される。

```bash
rake db:create RAILS_ENV=production
> mysqlrootpassword
```

```bash
rake db:migrate RAILS_ENV=production
```

```bash:（参考）ユーザーの確認と削除
mysql -uroot -pmysqlrootpassword -e "select Host, User from mysql.user;"

+-------------------------+------------------+
| Host                    | User             |
+-------------------------+------------------+
| 127.0.0.1               | root             |
| ::1                     | root             |
| localhost               | blog             |
| localhost               | debian-sys-maint |
| localhost               | root             |
| rubystackbox-cb293-grbj | root             |
+-------------------------+------------------+

mysql -uroot -pmysqlrootpassword -e "drop user blog@localhost;"
mysql -uroot -pmysqlrootpassword -e "flush privileges;"
```

production環境用にassetsをコンパイルして、config.serve_static_assetsをtrueに変更する。

```bash
rake assets:precompile RAILS_ENV=production
sed -i -e "s/config.serve_static_assets = false/config.serve_static_assets = true/" config/environments/production.rb
SECRET_KEY_BASE='secret' rails s -e production
```

# Apache
## Passenger

アプリを sub URI（/subapp）でデプロイする。
アプリ用の設定ファイルを作成する。

```bash
cd /etc/apache2/sites-available
ls -la
sudo cp default blog
sudo vi blog
```

環境変数 SECRET_KEY_BASE を設定する。
アプリのパスは適宜変更してください。```echo $HOME/webapps/blog/public``` ```echo $HOME/webapps/blog```

```conf:blog
<VirtualHost *:80>
    SetEnv SECRET_KEY_BASE secret
    Alias /subapp /home/usutani/webapps/blog/public
    <Location /subapp>
        PassengerBaseURI /subapp
        PassengerAppRoot /home/usutani/webapps/blog
    </Location>
    <Directory /home/usutani/webapps/blog/public>
        Allow from all
        Options -MultiViews
    </Directory>
</VirtualHost>
```

config.serve_static_assets を false（デフォルト値）に戻す。

```bash
cd ~/webapps/blog
sed -i -e "s/config.serve_static_assets = true/config.serve_static_assets = false/" config/environments/production.rb
```

設定ファイルを有効にする。

```bash
sudo a2dissite default
sudo a2ensite blog
sudo apache2ctl -t
sudo service apache2 reload
```

ウェブブラウザで http://<<外部IP>>/subapp/posts を開いて動作を確認する。

```bash:（参考）ログの確認
cd ~/webapps/blog 
tail -f log/production.log
```

assets に変更があるなら（ある度に）コンパイルする。
デプロイし直す。

```bash:（参考）再デプロイ
cd ~/webapps/blog
rake assets:precompile RAILS_ENV=production
touch tmp/restart.txt
```