IT技術にまつわる実験ノート

「長編を書くより、短編を数多く完成させてください。それが上達への近道です」 by 手塚治虫

自作Webアプリ「IT勉強会用 名刺ジェネレーター」を公開しました!ぜひご活用ください😀

https://it-benkyoukai-meishi.herokuapp.com/

Capistrano を使ってみる

前提

ここでは Ruby のバージョン管理に rbenv を使って、サーバーに Puma を使うことにする。

となると、Gemfile は以下のようになる。

f:id:matt-note:20190125192940p:plain

 

それぞれの設定方法の詳細は、それぞれの README.md に書かれている。これらは結局、設定ファイルを編集する時に通読することになる。それぞれの README.md を参考すると、Gemfile は上記のようになった。

 

gem をインストールして、初期設定をする。

  • bundle install
  • bundle exec cap install

 

タスクを表示してみる。

上記 gem をインストールしたことで、定義済みのタスクが表示されるようになった。

  • bundle exec cap -T

f:id:matt-note:20190123233241p:plain

 

上記の出力が何行なのか調べてみる。

  • bundle exec cap -T | wc -l

f:id:matt-note:20190123234834p:plain

-> およそ56個ほどのタスクが定義されていることがわかった。

 

そもそも論

cap コマンドを実行すると、CapistranoSSH でサーバーに接続して、プロジェクトのデプロイに必要なステップを実行する。

これらのステップを定義するために、自作の Rake タスクやライブラリの作成済みタスクを使っていくことで、デプロイの自動化を行うことになる。

f:id:matt-note:20190123235529p:plain

 

設定をする

設定の手順は、Capistrano のドキュメントを参考にする。

 

まずは、Capfile を編集する。Capfile は Gemfile と同じ階層に作成される。

f:id:matt-note:20190123223103p:plain

f:id:matt-note:20190123223149p:plain

これで Capfile の編集は終了。

 

次に config/deploy/production.rb を編集する。

以下のように server メソッドにオプションを指定して設定をする。また、ssh_options で、鍵を指定する。

f:id:matt-note:20190128204352p:plain

-> 2行書いて終了。

f:id:matt-note:20190124002447p:plain

 

最後に config/deploy.rb を編集する。

とはいえ、設定に使う変数の意味やデフォルト値を理解しないと、設定できない。デフォルトの値と違う値を設定する場合は、設定を上書きする必要がある。デフォルト値で問題ない場合は、設定はそのままで良い。とにかく、Capistrano のドキュメントを読み込むことになる。

f:id:matt-note:20190125192202p:plain

 

値を設定するときは、 set, fetch, append といったメソッドを使うことになる。

f:id:matt-note:20190125203308p:plain

f:id:matt-note:20190125203549p:plain

f:id:matt-note:20190125203335p:plain

 

GitHub でプライベートリポジトリを使う場合は、以下のようにして使うことができる。

f:id:matt-note:20190128205145p:plain

 

https://github.com/settings/tokens にアクセスして、プライベートリポジトリも使えるようにして、トークンを作成する。

f:id:matt-note:20190128205431p:plain

トークンを直に書き込むと、以下のようになる。

f:id:matt-note:20190128205934p:plain

 

Capistrano でデプロイすると、以下のようなディレクトリが作成される。

f:id:matt-note:20190202221032p:plain

 

capistrano-puma のデフォルトの設定は、以下のようになっている。ここでの shared_path は、上記の shared ディレクトリになる。puma_bind の値は Nginx の設定でも使うことになる。

f:id:matt-note:20190125202258p:plain

f:id:matt-note:20190125233302p:plain

 

capistrano-rbenv の rbenv_type がよくわからなかったので、ソースコードを読んでみる。rbenv_type を system にすると、/usr/local/rbenv を使うことになるとのこと。$HOME/.rbenv を使う場合は、rbenv_type を :user にする。

f:id:matt-note:20190202194534p:plain

 

上記の点をまとめると、config/deploy.rb ファイルの設定部分は以下のようになった。デフォルトの設定を使う場合、記入することが少なくて済む。

f:id:matt-note:20190202204639p:plain

 

続けて config/deploy.rb にタスクを記述する。私は以下の記事を参考にタスクを作成した。

 

実行してみる

production 環境にデプロイしてみる。

  • bundle exec cap production deploy:initial

f:id:matt-note:20190202205906p:plain

-> うまくいくと、デプロイを実行できる。

 

その他

低スペックのサーバーで試行錯誤して cap コマンドを連発していると、とんでもない負荷がかかってしまう。1度実行したら、しばらくたってから実行すると良い。

f:id:matt-note:20190202212937p:plain

 

データベースやサーバーの設定もうまくやってないと Capistrano でエラーになる。

Nginx の設定は、以下のようにした。

f:id:matt-note:20190202215520p:plain

 

データベースは PostgreSQL を使用したが、サーバー環境では初期設定で苦労することになった。

 

まとめ

Capistrano で設定項目のデフォルト値を学んでおくと、少ない記述でデプロイできる。ただし、Capistrano が行うのは「アプリのデプロイの自動化のみ」なので、前提として Nginx や PostgreSQL の設定もうまくできている必要がある。これらをうまくやると cap コマンド一発でアプリをデプロイできるようになる。

f:id:matt-note:20190202220618p:plain