Capistranoを導入してみます。
前回作成した仮想マシンをターゲットに、デプロイします。
目次
- 参考
- 準備
- Capistrano 導入
- Capistrano インストール
- Capfile を作る
- deploy.rb を設定
- production.rb を設定
- 一旦確認
- rbenv の設定
- Capistrano-rbenv インストール
- Capfile と deploy.rb を編集1
- Capistrano-bundler インストール
- Capfile と deploy.rb を編集2
- 一旦確認
- Capistrano-rails インストール
- Capfile と deploy.rb を編集3
- 一旦確認
- capistrano-puma をインストール
- Capfile と deploy.rb を編集4
- /puma.rb を作成
- 一旦確認
- 対応
参考
- capistrano / capistrano
- capistrano / rbenv
- capistrano / bundler
- capistrano / rails
- seuros / capistrano-puma
- Capistrano 3 による Rails 5.2 + puma + nginx のデプロイをステップバイステップで学ぶ
- Windows で credentials.yml.enc を編集する with VSCode
準備
bundle exec rails s
で、いつもの「Yay! You’re on Rails!」が確認できるところまで進めます。
本番環境では、この画面は見れないので何かページを作って root を変えておきます。
Capistrano 導入
Capistrano インストール
Gemfile に以下を追記する。
1 | group :development do |
bundle install
で capistrano をインストール。
Capfile を作る
次のコマンドを実行。
1 | bundle exec cap install STAGES=production |
以下のファイルが作成される。
1 | Capfile |
deploy.rb を設定
config/deploy.rb
に以下を記述。
1 | # config valid for current version and patch releases of Capistrano |
production.rb を設定
config/deploy/production.rb
に以下を記述。
1 | server "仮想マシンのIP", user: "sshログインユーザー名", roles: %w{app db web} |
一旦確認
次のコマンドを実行する。
1 | bundle exec cap production deploy |
すると、ssh ログインのパスワードが確認できるので入力する。
ダバーッとメッセージが出るので、しばらく待つ。
エラーはないので、ssh ログインして見てみるとディレクトリが展開されているのがわかります。
1 | [root@localhost ~]# ls /var/www/testapp |
rbenv の設定
rbenv / rbenvを参照しながら、デプロイ先サーバーに rbenv を導入。
以下の流れで導入しました。
1 | git clone https://github.com/rbenv/rbenv.git ~/.rbenv |
Capistrano-rbenv インストール
Gemfile を以下の様に編集。
1 | #省略 |
bundle install
で capistrano-rbenv をインストール。
Capfile と deploy.rb を編集1
Capfile にてcapistrano/rbenv
のコメントアウトを外す。
1 | # コメントアウトを外す |
config/deploy.rb
を以下のように編集。
1 | # config valid for current version and patch releases of Capistrano |
Capistrano-bundler インストール
Gemfile を以下の様に編集します。
1 | #省略 |
bundle install
で capistrano-bundler をインストール。
Capfile と deploy.rb を編集2
Capfile にてcapistrano/rbenv
のコメントアウトを外す。
1 | # コメントアウトを外す |
config/deploy.rb
を以下のように編集。
1 | # config valid for current version and patch releases of Capistrano |
一旦確認
確認したら、エラー発生。Your bundle only supports platforms ["x64-mingw32"] but your local platforms are...
という表示。
手元で使っているのが win10 だが、デプロイ先を CentOS にしているので、プラットフォームが合わないということらしい。
stackoverflow のHow can I resolve “Your bundle only supports platforms [”x86-mingw32“] but your local platforms are [”ruby“, ”x86_64-linux“]”を参考にする。
以下を実行することで、gemfile.lock
の中に別のプラットフォーム向けの gem を追加できるそう。
1 | bundle lock --add-platform x86_64-linux |
(以後 bundle install 後は毎回実施しています。)
終わったら github に push してbundle exec cap production deploy
を実行。
デプロイ先の
/var/www/testapp/shared/bundle/ruby/2.4.0/gems/をのぞくと、インストールされた gem を見ることができました。
1 | [root@localhost ~]#ls /var/www/testapp/shared/bundle/ruby/2.4.0/gems/ |
が、実行自体はエラー。
mysql-devel パッケージが足りないそうなので、sudo yum install -y mysql-devel
を実行。bundle exec cap production deploy
を再度実行。
エラーなく終わることができた。
Capistrano-rails インストール
Gemfile に以下の様に編集します。
1 | #省略 |
bundle install
で capistrano-bundler をインストール。
Capfile と deploy.rb を編集3
Capfile にてcapistrano/rails
のコメントアウトを外す。
1 | # コメントアウトを外す |
config/deploy.rb
を以下のように編集。
(といってもほとんどサンプルをコピペ)
1 | # config valid for current version and patch releases of Capistrano |
サンプルだとappend :linked_files, 'config/database.yml'
の部分は次のようになっている。
1 | append :linked_files, 'config/database.yml', 'config/secrets.yml' |
rails5.2 からは、secrets.yml
は廃止されて、credentials.yml.enc
に統合されているそう。
Rails5.2 から secrets.yml*が廃止され credentials.yml.enc に統合されるよ
ただcredentials.yml.enc
でのsecret_key_base
の設定に失敗したので、.bashrc
に環境変数で設定することにした。
1 | export SECRET_KEY_BASE=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
一旦確認
bundle exec cap production deploy
を実行すると、以下のエラーになる。
1 | ERROR linked file /var/www/testapp/shared/config/database.yml does not exist on xxx.xxx.xxx.xxx |
/var/www/testapp/shared/config/database.yml
がない。config/deploy.rb
に定義したappend :linked_files
の項目は、自分でコピーしてあげる必要があるそう。config/database.yml
をデプロイ先サーバーの/var/www/testapp/shared/
以下に保管する。
なので、手動でコピーしてbundle exec cap production deploy
を実行する。
ActiveRecord::NoDatabaseError: Unknown database 'xxxxxxxxxxxxx'
のエラーが発生。
デプロイ先にデータベースがないそう。デプロイ先のデータベースは手動で作りました。
ここまでやってbundle exec cap production deploy
を再度実行すると、エラーなく終了できる。
サーバに ssh で接続し、確認するとテーブルが作成されていることが確認できる。
capistrano-puma をインストール
Gemfile に以下の様に編集します。
1 | #省略 |
bundle install
で capistrano3-puma をインストール。
Capfile と deploy.rb を編集4
Capfile にてrequire 'capistrano/puma'
を記述。
1 | require 'capistrano/puma' |
config/deploy.rb
を以下のように編集。
1 | # config valid for current version and patch releases of Capistrano |
/puma.rb を作成
bundle exec cap production puma:config
を実行すると、デプロイ先サーバーで/var/www/testapp/shared/puma.rb
が作成される。
内容は以下のようになっていた。
1 | #!/usr/bin/env puma |
一旦確認
bundle exec cap production deploy
を実行すると、エラーなく通ったがよくわからない。
ので、ssh でサーバーに接続してプロセスを確認する。
1 | [root@localhost testapp]# ps aux|grep puma |
とりあえず起動できているらしい。
bundle exec cap production puma:nginx_config
を実行して nginx 用の設定ファイルを作ります。
実行すると、mv: /tmp/nginx_testapp_production' から /etc/nginx/sites-available/testapp_production' へ移動できません: そのようなファイルやディレクトリはありません
というエラーが出たので、手動で作成しました。
1 | mkdir /etc/nginx/sites-available |
bundle exec cap production puma:nginx_config
を再度実行。
作成した/etc/nginx/sites-available/testapp_production
を見てみる。、/etc/nginx/sites-available/testapp_production
へのリンクが作成されていた。
1 | ls -la /etc/nginx/sites-enabled/testapp_production/ |
設定ができたので nginx を reload しておく。nginx -s reload
を実行。
うまくいかない。
対応
実は、ここでうまくいかなかったので調査して先に 2 つ記事を書きました。
解決方法は次の 2 つでした。
- nginx の実行ユーザーを rails の実行ユーザーと合わせる
/etc/nginx/sites-available/testapp_production/nginx_testapp_production
に作成された設定ファイルの修正
/etc/nginx/sites-available/testapp_production/nginx_testapp_production
の修正点は 1 つ、server_name
でした。
1 | # 変更前 |
考えてみれば、localhost では IP 指定してアクセスしても合致しないので、駄目ですね。
修正してから、bundle exec cap production deploy
を実行し再度デプロイすることで、サーバーでの動作が確認できました。
今回は Capistrano の導入を調べながら、一通りやってみました。
Capistrano を導入すると、コマンド 1 つで、アプリケーションを更新できるのが面白いし便利なのが再確認できました。
今のところメモレベルなので、次はすべてまとめて導入する。
まとまった記事にして、置きたいところです。
ではでは。