Como usar o DigitalOcean Spaces com Ruby on Rails
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
Opa, tudo bem? Antes de você ir, te deixo aqui meu email: [email protected]
Teve alguma dúvida?
Você achou que eu escrevi alguma coisa errada? Erro de português?
Você tem uma forma melhor de resolver o problema?
Você tem alguma sugestão de tópico para eu escrever?
Ou se quiser conversar sobre qualquer outro assunto?
Vamos trocar uma ideia. Sinta-se livre para me enviar um email. Eu lhe responderei com o maior prazer!