Capistrano: sftp でファイルを put しようとすると undefined method エラー

今日、同僚から「突然、XXXに対してCapistranoでファイルをアップロードできなくなった」という相談が来ました。

XXXというのは、半年ぐらい運用しているRails製のWebサイトです。

私が試してみると、確かにエラーが出ています。


sftp upload # ->
/var/rails/xxx/current/public/system/maintenance.html
/usr/local/lib/ruby/gems/1.8/gems/capistrano-2.5.20/
lib/capistrano/transfer.rb:156:in `[]=':
undefined method `[]=' for nil:NilClass (NoMethodError)

原因となっているのは、deploy.rb の中の次の記述。


put result, "#{current_path}/public/system/maintenance.html",
:mode => 0644

Googleで検索すると、Cannot connect with Capistrano or sFTP on CentOS というブログ記事が見つかりました。それによると、リモートシステムで sftp サーバが動いていない可能性があるそうです。

試しに次のように修正したらエラーが出なくなりました。


put result, "#{current_path}/public/system/maintenance.html",
:mode => 0644, :via => :scp

ここに至り、少し前に sshd をアップデートして sshd の設定を変更したことを思い出しました。sftp に関しては何もいじっていないけど、何かが変わってしまったのでしょう。