DEV Community

Tuna Çağlar Gümüş
Tuna Çağlar Gümüş

Posted on • Originally published at on

Rails 6 carrierwave production settings for digitalocean spaces with a custom subdomain



I recently worked on both Active Storage and CarrierWave to store user uploaded files and decided to use CW on my site. (Maybe i will tell why i choose CW over Active Storage in a different article)

I'm using digitalocean spaces since it is basicly cheaper when you don't need a huge storage size.I also want to use custom subdomain for my stored files so i don't end up messy urls for my file urls. I don't know why but messy urls look dirty to me. Like developer doesn't even care. What a shame....Coulnd't find a good example for carrierwave settings to use in digitalocean spaces and wanted to share this info myself.I assume you are installed carrierwave before hand.


Create your digitalocean space.
Create a subdomain and attach SSL to it within Digitalocean form. It can be done with couple of clicks.CDN subdomain
Go to API panel and create a key. Store your key info somewhere safe.
Give folder permissons for your domain.permissions
Install necessary gems to use carrierwave with digitalocean.

gem "fog-aws" # storage for AWS S3 digitalocean

Go to your uploader.rb file, in my case it is app/uploaders/image_uploader.rb.

# storage :file. Change this to `fog`
  storage :fog

This is the config/initializers/carrierwave.rb file. This file configures carrierwave to use digitalocean spaces for your website in production.

CarrierWave.configure do |config|
    config.fog_credentials = {
        provider: 'AWS', # required
        aws_access_key_id: 'your-key-id', # required unless using use_iam_profile
        aws_secret_access_key: 'your-secret-key', # required unless using use_iam_profile
        region: 'fra1', # optional, default are different from aws.
        host: '', # optional, defaults to nil
        endpoint: '' 
    config.fog_directory = 'nameofyourspacesfolder' # required
    config.asset_host = ""
    config.fog_attributes = { cache_control: "public, max-age=#{365.days.to_i}" } # optional, defaults to {}

config.asset_host is doing the custom domain job here. Also be careful about region here. It is different from aws defaults.

That should do it.

Best Regards,


Top comments (0)