#author("2021-12-31T08:20:50+00:00","default:src128","src128")
#author("2022-03-15T06:40:25+00:00","default:src128","src128")
[[Capistrano3]]

&tag(Capistrano3/トラブルシューティング);
*目次 [#u9c1ce01]
#contents
*関連ページ [#fbaba88d]
-[[Capistrano3]]

*参考情報 [#uff8e943]

*トラブルシューティング方法 [#g1d276b6]

**listタスクを実行してみる [#jb95e0c4]
-全く動かない場合deploy.rbに以下のようなタスクを追加しておき「bundle exec cap staging list」で実行してみるとよい。
#pre{{
task :list do
  on roles(:web) do |host|
    execute "ls"
  end
end

}}
**ログのデバッグ出力 [#r4f8eb85]
-traceオプションを追加するとより詳細なログが表示される
 bundle exec cap production deploy --trace
-それでも足らないときはdeploy.rbに以下を追加。
 set :log_level, :debug
-さらにlogs/capistrano.logも利用できる。

**gem installがうまくいっていない場合 [#pab134de]
-ログからコマンドを抜き出し ssh xxx 'コマンド'を実行してみると良いかも。-quietオプションは除去するとよい。
 ssh remotehost 'cd /Users/sora/www/myapp/releases/20160616053411 && ( export RBENV_ROOT="$HOME/.rbenv" RBENV_VERSION="2.3.1" ; $HOME/.rbenv/bin/rbenv exec bundle install --path /Users/sora/www/myapp/shared/bundle --without development test --deployment --)'


**環境変数の確認 [#aa1be483]
-sshで実行している際リモートの環境変数が原因でうまくRubyGemがインストールできない場合もある(rmagickとか)
-この場合以下のようなタスクを作成しておき実行する。
#pre{{
task :printenv do
  on roles(:web) do |host|
    execute "printenv"
  end
end
}}
-タスクの呼び出し
 bundle exec cap production printenv

*実行時エラー [#m4589ac2]

**本番環境でmigrationが実行されない [#qe04adb1]
-本番環境に実行した際、なぜかmigrationが実行されない。production用dbじゃなくdevelopment用dbでは実行されている。
-最初はステージング環境だけで実行されているので「set :rails_env, "staging"」のせいかと思ったけど
-[[ruby on rails - Capistrano 3 deploy:migrate not executing due to missing primary - Stack Overflow:http://stackoverflow.com/questions/24701455/capistrano-3-deploymigrate-not-executing-due-to-missing-primary]]にあるように、serverに対して"db"ロールが設定されていないせい?
-実際は以下のようにdbロールを設定しただけで、serverのrolesには何も設定しなくてもいけた
#pre{{
server 'myserver', user: 'sora', roles: %w{web}, my_property: :my_value

role :app, %w{myserver}
role :web, %w{myserver}
role :db, %w{myserver}

}}



*その他エラー対策 [#l88efaa6]

**デプロイ時に「env: python: No such file or directory」 [#sa1b389c]
-capistrano-git-copyで発生。
-macOS 12.3でPython 2.7が同梱されくなったのが原因。capistrano-git-copyはローカルでgit_archive_all.pyというPythonスクリプトを実行してファイルをアーカイブしている。
-すなわちローカル側の問題。
-MacPortsやHomebrewを使い、ローカルでPythonをインストールすれば良い。
 sudo port install python310
 sudo port select --set python python310

**デプロイ時に「Your bundle only supports platforms」 [#vd70813d]
-macOSからLinuxサーバーにデプロイする際に発生。
-[[Herokuにpushしようとしたら「 Failed to install gems via Bundler.」というエラーが出た - Qiita:https://qiita.com/daiki457110/items/cfbd78a4267dbfa5d3f1]]によると以下を実行する。
  bundle lock --add-platform x86_64-linux
**デプロイ時に環境変数が読み込まれない [#l177fe00]
-デプロイ時にリモートの.zshrcや.bashrcが読み込まれないのは仕様?
-production.rbにdefault_envを指定して回避することができる。以下はPATHとデータベースパスワードの設定(ローカルでも環境変数で指定している)。
#pre{{
set :default_env, {
#    'PKG_CONFIG_PATH' => '/opt/local/bin'
  'PATH' => "/opt/local/bin:/opt/local/lib/mysql8/bin:$PATH",
  'RAILS_DATABASE_USERNAME' => ENV['RAILS_DATABASE_USERNAME'],
  'RAILS_DATABASE_PASSWORD' => ENV['RAILS_DATABASE_PASSWORD']
    }
}}
**デプロイ時にmysql2のgemがインストールできない。 [#edb3719e]
-bundle stderr: Gem::Ext::BuildError: ERROR: Failed to build gem native extensionのようなエラーが発生し、mysql2のgemがインストールできない。
-macportsの場合、default_envでmysqlのパスを指定し、さらにbundle_configでライブラリのパスを指定する。
#pre{{
set :default_env, {
  'PATH' => "/opt/local/bin:/opt/local/lib/mysql8/bin:$PATH"
}

set :bundle_config, {
  'build.mysql2' => '--with-ldflags=-L/opt/local/lib'
}
}}
**デプロイ時に「incompatible library version」 [#z86da37e]
-理由は不明ながら共通bundleを削除すれば復活した。例えば以下のように。
 rm -rf /Users/sora/www/demo/shared/bundle/*

**デプロイ後にassetsがプリコンパイルされない [#ce91609e]
-Capfileでrequire 'capistrano/rails/assets'が有効になっているかどうか確認する。

**デプロイ後ExecJS and could not find a JavaScript runtimeエラーが発生 [#ta14004a]
-[[ruby on rails 3.1 - ExecJS and could not find a JavaScript runtime - Stack Overflow:http://stackoverflow.com/questions/6282307/execjs-and-could-not-find-a-javascript-runtime]]によると、サーバー環境にNode.jsをインストールする。
#pre{{
sudo apt-get install nodejs
sudo yum install nodejs
}}

**デプロイ後「fatal: Not a git repository (or any of the parent directories): .git」と言われてしまう [#e2931787]
-Gemfileにローカルフォルダで管理しているgemファイルを追加していて、そのgemspecで以下のようにgitを使っているから。
 gem.files         = `git ls-files`.split($\)
-deploy先に.gitフォルダが存在しないためこのような減少が発生する模様。
-ローカルフォルダでgemを管理するのはやめたほうが良いかもしれない。
-もしくはgemspecでgit ls-filesを使わないようにするか。 [[`git ls-files` in gemspec template is bad practice. · Issue #2287 · bundler/bundler:https://github.com/bundler/bundler/issues/2287]]

**「Command: [ -d /var/www/myapp/releases/20140211033611/public/assets ]」のようなわけのわからないエラーが発生 [#ve91d55a]
-[[ruby on rails - Capistrano 3 process failing - Stack Overflow:http://stackoverflow.com/questions/21692601/capistrano-3-process-failing]]によるととりあえず気にしなくても良いのだろうか。


**「Command : [ -L ...]」が exit status 1 (failed).で失敗する [#te9478f2]
-[[ruby - Capistrano 3 deploy failed messages - exit status 1 (failed) - Stack Overflow:http://stackoverflow.com/questions/33128623/capistrano-3-deploy-failed-messages-exit-status-1-failed]]
-致命的エラーならばCapistranoが止まるはずなので気にしなくてよい(のか?)
** Too many authentication failuresが発生 [#af93b281]
-sshをコマンドラインから使うと問題ない。SSHKitの問題?とりあえず以下で一時的に解決できる
 ssh-add -D

** rbenv: 2.3.1 is not installed or not found in $HOME/.rbenv/versions/2.3.1 [#n803c835]
-リモートに該当するRubyのバージョンがインストールされていないのが原因。rbenv installする。


**rmagickがインストールできない [#wf647544]
-deploy時にrmagickのインストールに失敗する。[[Capistrano からの bundle install で rmagick のインストールが失敗するときの対処方法 - Shred IT!!!!:http://jetglass.hatenablog.jp/entry/2015/05/14/150507]]
-原因は環境変数がうまく設定されていないせいだった。
-相手さきがMacPortsを導入しているMacだったのでpathが/opt/local/binに通っていないのが原因。以下の設定をproduction.rbに追加したところうまくいった。
#pre{{
set :default_env, {
#    'PKG_CONFIG_PATH' => '/opt/local/bin'
  'PATH' => "/opt/local/bin:$PATH"
}
}}

**rmagickがインストールできない: その2 [#id9de921]
-deploy時に失敗する。エラーメッセージは以下の通り。
 Gem Load Error is: This installation of RMagick was configured with ImageMagick 6.9.4 but ImageMagick 6.9.6-0 is in use
-リモートでportを更新したら発生するようになった(rmagickがインストールされなおしていないのが原因?)
-とりあえずmacportsでrmagickのバージョンを元に戻して解決。
-さらに調査した結果/shared/bundleの下に古いキャッシュが存在しているのが原因のようだった。shared/bundle/rubyを削除して、deployしなおしたらうまくいった模様。

**nokogiriがインストールできない [#cad98aa1]
-macOSにインストールした際にエラーが起きる場合、deploy.rbなどに以下を追加する。
#pre{{
set :bundle_env_variables, { nokogiri_use_system_libraries: 1 }
}}
-さらにdeploy先でMacPortsを使っている場合、pkg-configのパスも指定しないといけない。staging.rb/production.rbなどでパスを指定。
#pre{{
set :default_env, {
#    'PKG_CONFIG_PATH' => '/opt/local/bin'
  'PATH' => "/opt/local/bin:$PATH"
}
}}
**SocketError: getaddrinfo: nodename nor servname provided, or not known [#abbf649d]
-仮想環境にdeployしようとしたときに発生。.ssh/configでHostnameのところにIPアドレスを指定すればよくなった。Hostnameのところに仮想ホスト名を記述すすると例え/etc/hostsに記述してある名前でもうまくいかない。この場合Capistrano関係なく、pingはいけてもsshがいけない状態となっているのでそこから確認する。

** deploy:symlink:linked_dirsのエラー [#g8a90dc8]
-lnが失敗している模様。ディレクトリの削除がいっていないのでうまくいっていない?
-原因は不明だが、デプロイファイル(staging.rb)で、serverで指定したホスト名と、roleで指定したホスト名が一致していなかったのが原因だったのかも(serverのほうがホスト名で、roleのほうがIPアドレスになっていた)。

** openssh(sshクライアント)でログインしたあとCapistranoでデプロイしようとするとHostKeyMissmatchが発生 [#xa4f9364]
-CentOS 7相手に発生。応急的には~/.ssh/known_hostsを削除すればいいのだが気になる。
-[[Possible issue with Cap 1.4.1 and net-ssh 1.1.0? - Google グループ:https://groups.google.com/forum/#!topic/capistrano/VV9mLNzN_iw]]によるともう一つの応急処置として以下の方法がある。
#pre{{
set :ssh_options, {
  paranoid: false
}
}}
-根本原因は不明。

**$HOME/.rbenv/bin/rbenv exec bundle check --pathがfailedになっている。 [#w049a3ec]
-その後の処理でInstall missing gems with `bundle install`によってたらないgemsがインストールされている。すなわち正常な処理かも。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS