Rails + CarrierWave-SFTPで画像を外部サーバーに保存する

RailsとCarrierWave-FTPを使って画像を外部サーバーに保存する方法です。

CarrierWave自体の使い方は、『Rails ダウンロードした画像をCarrierWaveで保存する』を参照ください。

次のドメイン名で説明しています。

  • Railsアプリケーション:www.example.com
  • 外部サーバー:cdn.example.com
  • 外部サーバー内の画像の格納先絶対パス:/home/vagrant/cdn
  • いずれもVagrant内

ステップ1. Gemの導入

Gemfileにcarrierwave-ftpを追加して、bundle installします。

@Gemfile

gem 'carrierwave', '~> 1.0'
gem 'carrierwave-ftp', :require => 'carrierwave/storage/ftp/all'

:require => 'carrierwave/storage/ftp/all'を指定するとFTP, SFTP兼用の指定になります。

ステップ2. SFTP設定の記述

CarrierWave::Uploader::Baseを継承したクラスにおいて、SFTPの設定を記述します。

class CarrierWaveImageUploader < CarrierWave::Uploader::Base

 # アップロード先のストレージにSFTPを選択します。
 storage :sftp

 # SFTPの設定を記述
 configure do |config|
  
  # SFTPホスト名を指定します。
  config.sftp_host = "cdn.example.com"

  # SFTPアカウントユーザー名を指定します。
  config.sftp_user = "vagrant"

  # SFTPアカウントパスワードとポート番号(22固定)を指定します。
  config.sftp_options = {
   :password => "vagrant",
   :port => 22
  }

  # SFTPホストにおける画像格納先を指定します。
  config.sftp_folder = "/home/vagrant/cdn"

  # 上記、画像格納先を示すURLを指定します。
  config.sftp_url = "http://cdn.example.com"
 end

 # 上記、画像格納先フォルダ内における格納の仕方を指定します。
 # 下の場合、uploadsフォルダ他、色々と階層が作られます。
 def store_dir
  "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
 end

上で設定した設定値は、CarrierWaveImageUploader.sftp_url などとして確認できます。

これで画像が外部サーバーにSFTPで保存されます。画像へのパスが一緒に管理されますので、ブラウザには画像へのURLを渡して表示するようにします。

おわりに

もし保存処理時に、次のように聞かれた場合はSFTP設定が初期値のままになっていることを意味しますので、自分で書いた設定値が使われるように調整が必要です。

anonymous@localhost's password:

 

参考サイト