Olá amigos, tudo bem com vocês?

Hoje irei escrever um pouco como usar o DigitalOcean Spaces com o Ruby on Rails

Disclaimer: esse post não é patrocinado. Eu uso o DigitalOcean Spaces para armazenar as imagens desse blog. Um dos motivos da escolha do DigitalOcean Spaces foi o preço, que por 5 dólares é possível ter 250gb de armazenamento e 1 tb de tráfego de download, o tráfego de subida é ilimitado.

O DigitalOcean Spaces é um serviço de storage da DigitalOcean (óbviamente), ele é bastante similar ao AWS S3, tão similar que usaremos o SDK da AWS para fazer a integração. Você pode conhecer mais um pouco sobre o produto clicando no link. Eles costumam dá 60 dólares com válidade de 2 meses para você testar os serviços deles. OBS: é necessário adicionar o cartão de crédito para ganhar os 60 dólares.

Podemos começar

Aqui utilizaremos duas gems:

Começaremos adicionando as duas em nosso Gemfile e depois rodando o bundle:

bundle install

Após instalado, iremos criar o nosso modelo de usuário e chamaremos o campo responsável por guardar as imagens de avatar.

Obs: o nosso campo avatar irá salvar apenas a URL da imagem, utilizaremos essa URL e adicionaremos em nossas views.

modelo de usuario:

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :avatar
      t.string :name
      t.string :last_name
      t.string :email
      t.string :password

      t.timestamps
    end
  end
end

De posse do modelo de usuarios e da gem carrierwave, iremos criar um uploader responsável por enviar as imagens para o serviço de nuvem utilizado, no caso, o DigitalOcean Spaces. Executaremos o seguinte comando no console:

rails generate uploader Avatar

E após executado adicionaremos a linha em users.rb

mount_uploaders :avatar, AvatarUploader

Isso informa ao Rails que utilizaremos o AvatarUploader para gerenciar o envio de imagens que está relacionado com o campo avatar. E para finalizar a configuração do uploader, basta irmos em AvatarUploader e comentar a linha storage :file e descomentar a linha storage :fog

# storage :file
  storage :fog

Obs: se deixassemos a linha storage :file descomentada iríamos salvar os arquivos no servidor, por exemplo, se você hospasse sua aplicação no Heroku, os arquivos seriam salvos lá. Só que temos um problema, de tempos em tempos o dyno do Heroku é reinicializado e os arquivos salvos após o deploy são perdidos.

Feito isso, podemos partir para o fog-aws

Fornecendo credenciais de acesso

você já configurou corretamente o carrierwave, porém ainda está faltando definir para onde o Rails deve enviar essas imagens e quais são as credenciais de acesso. Para isso, iremos criar um arquivo em config/initializers chamado de carrierwave.rb e inserir o seguinte código (com algumas alterações, é claro)

# config/initizalizers/carrierwave.rb

CarrierWave.configure do |config|
  config.fog_credentials = {
      :provider               => 'AWS',
      :aws_access_key_id      => 'key',
      :aws_secret_access_key  => 'secret',
      :region                 => 'nyc3',
      :endpoint               => 'https://nyc3.digitaloceanspaces.com'
  }
  config.fog_directory  = 'nome_do_space'
  config.fog_attributes = {'Cache-Control'=>'max-age=315576000'}
  # config.fog_public = false
end

Aqui você deve mudar:

  • aws_access_key_id e aws_secret_access_key que você pode obter na sua conta do DigitalOcean Spaces
  • region e endpoint referente a região que você criou o Space
  • config.fog_directory aqui você insere o nome do Space

Após feito isso, basta reiniciar o servidor e enviar um parametro do tipo File para o backend e tentar salvá-lo no campo avatar.

#Fim