Skip to content

Instantly share code, notes, and snippets.

@cblunt
Created October 21, 2011 08:55
Show Gist options
  • Save cblunt/1303386 to your computer and use it in GitHub Desktop.
Save cblunt/1303386 to your computer and use it in GitHub Desktop.
Configure Carrierwave for Amazon S3 Storage and Heroku
class Avatar < ActiveRecord::Base
mount_uploader :avatar_image, AvatarImageUploader # **must** specify class of uploader, otherwise base uploader is used, and no
# ...
end
class AvatarImageUploader < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
version :print do
version :thumb { process :resize_to_fit => [32, 32] }
version :preview { process :resize_to_fit => [256, 256] }
version :full { process :resize_to_fit => [2048, 2048] }
end
version :web do
version :thumb { process :resize_to_fit => [32, 32] }
version :preview { process :resize_to_fit => [128, 128] }
version :full { process :resize_to_fit => [1024, 768] }
end
# ...
end
# config/initializers/carrierwave.rb
CarrierWave.configure do |config|
config.fog_credentials = {
# Configuration for Amazon S3 should be made available through an Environment variable.
# For local installations, export the env variable through the shell OR
# if using Passenger, set an Apache environment variable.
#
# In Heroku, follow http://devcenter.heroku.com/articles/config-vars
#
# $ heroku config:add S3_KEY=your_s3_access_key S3_SECRET=your_s3_secret S3_REGION=eu-west-1 S3_ASSET_URL=http://assets.example.com/ S3_BUCKET_NAME=s3_bucket/folder
# Configuration for Amazon S3
:provider => 'AWS',
:aws_access_key_id => ENV['S3_KEY'],
:aws_secret_access_key => ENV['S3_SECRET'],
:region => ENV['S3_REGION']
}
# For testing, upload files to local `tmp` folder.
if Rails.env.test? || Rails.env.cucumber?
config.storage = :file
config.enable_processing = false
config.root = "#{Rails.root}/tmp"
else
config.storage = :fog
end
config.cache_dir = "#{Rails.root}/tmp/uploads" # To let CarrierWave work on heroku
config.fog_directory = ENV['S3_BUCKET_NAME']
config.s3_access_policy = :public_read # Generate http:// urls. Defaults to :authenticated_read (https://)
config.fog_host = "#{ENV['S3_ASSET_URL']}/#{ENV['S3_BUCKET_NAME']}"
end
# ...
gem 'carrierwave'
gem 'fog', '~> 1.0.0' # Need to specify version, as carrierwave references older (0.9.0) which doesn't allow configuration of Rackspace UK Auth URL
<!-- Nested Versions -->
<%= image_tag avatar.avatar_image.url(:web, :preview) %>
<%= image_tag avatar.avatar_image.url(:print, :full) %>
<%= image_tag avatar.avatar_image.url(:web, :thumb) %>
@avishai
Copy link

avishai commented Dec 14, 2011

This works great!

@kyleclegg
Copy link

This is great! I removed config.s3_access_policy and config.fog_host and it's working very well with fog 1.3.1.

@jpmoral
Copy link

jpmoral commented Aug 11, 2013

Thanks. I needed to rename the initializer to config/initializers/fog.rb to get it to work.

@stevenabrooks
Copy link

What is the S3_ASSET_URL?

@davity
Copy link

davity commented Dec 27, 2013

S3_ASSET_URL is the address of the server where you're uploading your files. For example, if you have the next URL for a uploaded file (that you can get from your S3 console at file properties)

https://s3-eu-west-1.amazonaws.com/my_bucket_name/my_awesome_image.png

S3_ASSET_URL="https://s3-eu-west-1.amazonaws.com"
S3_BUCKET_NAME="my_bucket_name"

@shnikola
Copy link

shnikola commented Jan 3, 2014

config.s3_access_policy= is no longer available. To force http, you can use config.fog_use_ssl_for_aws = false

@heliocola
Copy link

config.fog_host= doesn't seems to be working.
This link was useful to me: https://github.com/carrierwaveuploader/carrierwave#using-amazon-s3

@nicollecastrog
Copy link

This gist totally saved me when I was stuck, thank you!!!!!

@grammakov
Copy link

awesome. It works great. Just don't forget to initialise fog.rb!

@mthees7
Copy link

mthees7 commented Apr 29, 2014

@grammakov
initialise fog.rb? I'm stuck with some issue that I can't figure out, and I don't have a fog.rb file.

@vrybas
Copy link

vrybas commented May 4, 2014

The working configuration for me was

# config/initializers/fog.rb

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider              => 'AWS',
    :aws_access_key_id     => ENV['S3_KEY'],
    :aws_secret_access_key => ENV['S3_SECRET']
  }

  config.fog_directory =  ENV['S3_BUCKET_NAME']
  config.cache_dir     = "#{Rails.root}/tmp/uploads"   # For Heroku
end

config.region is not requried also

@futhr
Copy link

futhr commented May 21, 2014

And to cleanup your after your specs, you can add this. The wiki example say CarrierWave::Uploader::Base.root but in this case it will wipe your tmp dir with pids and all.

# spec/support/carrierwave.rb

RSpec.configure do |config|

  # config.after(:all, :fog) do
  config.after(:all) do
    FileUtils.rm_rf CarrierWave::Uploader::Base.cache_dir
  end
end

@jackson-sandland
Copy link

One crucial component...where is the code that goes into the view to facilitate upload? Locally, you can add <% f.file_field :image %> and this creates an upload button that allows you to upload an image. What is the equivalent of that here?

@abatko
Copy link

abatko commented Jun 24, 2014

@jackson-sandland I believe it is no different than the local approach:

<div class="form-group">
    <%= f.label :avatar %><br>
    <%= f.file_field :avatar, class: 'form-control' %>
    <%#= f.hidden_field :avatar_cache %>
</div>

Also, check out How to: Make Carrierwave work on Heroku and note the fact that making this work on Heroku by setting cache_dir to "#{Rails.root}/tmp/uploads" has the adverse side effect of making uploads not work across form redisplays.

Also, don't use f.hidden_field :avatar_cache as you will occasionally experience undefined method 'to_file' for CarrierWave when hosting on Heroku (due to the fact that each dyno has its own cache directory) - see carrierwaveuploader/carrierwave#725

@mundocalderon
Copy link

Is this MiniMagick specific? What would be the ImageMagick way of doing this?

  version :print do
    version :thumb    { process :resize_to_fit => [32, 32] }
    version :preview  { process :resize_to_fit => [256, 256] }
    version :full     { process :resize_to_fit => [2048, 2048] }
  end

  version :web do
    version :thumb    { process :resize_to_fit => [32, 32] }
    version :preview  { process :resize_to_fit => [128, 128] }
    version :full     { process :resize_to_fit => [1024, 768] }
  end

@jetaggart
Copy link

@abatko do you how to get the functionality of :avatar_cache on heroku with multiple dynos?

@gabrielboeker
Copy link

an update would be nice since this documentation is over 7 years old. unfortunately i was not able to set up carrierwave with s3 correctly

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment