質問: Capistrano3のデプロイに関して --------------------- ### 現環境 * local git * remoteripo Bitbucket * buildtool Wercker * deploy Capistrano3 * public sakura vps(ssh) * Web環境 nginx+ puma + rails + public配下にwpを設置(php-fpm) 記事・画像管理などはWordpressで行っております。 Capistrano3でデプロイすると新ディレクトリが作成されcurrentのシンボリックリンクが最新のリリースにはられると認識しております。 現状、WordPress管理画面で画像をアップロードするとpublicサーバ上のcurrent/public/wp-content/uploads/配下にファイルがupされます。 Capistrano3でデプロイしますと、本番環境で更新があったファイルはGit管理に追加されていないため全て置き換えられてしまいます。 ココで質門なんですが本番環境の更新内容を取り込むタスクをベスト・プラクティスな運用パターンか教えていただきたく質門させていただきました。 また、Capistrano3の文法などもあまり詳しくなく記述方法なども提示いただけるとありがたいです。 #### Capistrano3のデプロイ順序(現在) 1. ssh publish-server 2. mkdir 201701**** (newrelease) 3. git pull 4. rails系の処理(bundle install,test,precompile,migrate) 5. currentへのシンボリックリンク 6. web server restart(nginx puma php-fom) ### 本番の変更を取り込む方法など #### case.1 1個前のリリースにある、uploadsディレクトリをコピーする設定をcapに追加する 追加したいコマンド例 ``` cp -a releases/"リリース前のrelease dir"/public/wp/wp-content/uploads/ current/public/wp/wp-content/ ``` このケースがとりあえずの回避策として無難かと考えています。 しかし、前のリリースを取る方法(変数)などがいまいちわからずTask化できず困っております。 #### case.2 デプロイの前に本番環境の更新をaddコミットしてからリリースする設定を追加する 現設定ではmasterへのpushをwerckerのbuild+deployトリガーとしているため,deployが無限ループするのではないかと懸念しています。 特定のサーバからのpushは除外するもしくは本番環境からのpushは別ブランチに取り込んでからbuild環境でmergeするなど(conflictがあるとエラーとなりそう。)、リモートのいい方法などないでしょうか 現在は公開環境にてリリース後にcase1のコマンドを実施して応急的に対応しています。 そもそも、環境の作り方など他のやりかたが良いなどベストプラクティスがあれば教えていただきたいです。 どうぞよろしくお願いいたします。
回答: capistranoの設定で ``` set :linked_dirs, %w(public/wp-content/uploads/) ``` を追加しましょう。 releasesと同じ階層にあるsharedディレクトリからシンボリックリンクが貼られますので gitとの管理とは分けて管理することが出来ます。 バックアップ等が必要でしたら他の方法でバックアップをとっておきましょう。