Spree 3 и Google Cloud Storage
Invite pending
Привет, Хабр!
(актуально для версии до Spree 3.4 включительно, начиная с версии 3.5 работать не будет)
Столкнувшись с проблемой, готового решения найдено не было, в следствии чего приобрел опыт коим есть желание поделится.
Дело в том что, разработчики оpen-source движка для интернет магазина (Spree), подружили его только с S3 (Amazon Cloud Storage).
Но вы можете это исправить,для этого вам потребуется гем
Предположим что у вас есть уже «Сегмент» (объект хранилища google), и что бы paperclip начал с ним работать, необходимо добавить следующий код в /config/initializers/spree.rb
И все, теперь все картинки к вашим товарам и всему остальному аккуратно будут хранится в хранилище гугл.
Закомментированный метод rails_root я переписал для того, что бы в одном «Сегменте» было удобно хостить несколько приложений, т.к. приложения имеют собственный идентификатор, который выступает как имя папки, куда загружаются все файлы из приложения.
Чтобы добавить такой функционал необходимо создать модель
затем добавить в /config/environments/development.rb и /config/environments/production.rb генерацию UUID, желательно в конец файла
При первом запуске приложения создается идентификатор, который сохраняется в базе, и используется в качестве названия для папки в облачном хранилище.
P.S.: Если вы удалите метод rails_root из spree.rb, тогда в хранилище будет продублирован абсолютный путь к файлам как на вашей локальной машине.
P.P.S.: Это мой первый гайд, не бейте сильно тапками. Надеюсь, что кому-нибудь это было полезным :)
(актуально для версии до Spree 3.4 включительно, начиная с версии 3.5 работать не будет)
Столкнувшись с проблемой, готового решения найдено не было, в следствии чего приобрел опыт коим есть желание поделится.
Дело в том что, разработчики оpen-source движка для интернет магазина (Spree), подружили его только с S3 (Amazon Cloud Storage).
Но вы можете это исправить,для этого вам потребуется гем
gem 'paperclip-gcs'
Предположим что у вас есть уже «Сегмент» (объект хранилища google), и что бы paperclip начал с ним работать, необходимо добавить следующий код в /config/initializers/spree.rb
Spree.config do |config|
module Paperclip
module Interpolations
def rails_root attachment, style_name
Pathname.new()
end
# def rails_root attachment, style_name
# Pathname.new(ENV['UPLOADER_UUID'].to_s)
# end
end
end
Paperclip.interpolates(:gcs_path_url) do |attachment, style|
"#{attachment.gcs_protocol}//#{attachment.gcs_host_name}/#{attachment.gcs_bucket_name}/#{attachment.path(style)}"
end unless Paperclip::Interpolations.respond_to?(:gcs_path_url)
Paperclip::Attachment.default_options[:storage] = :gcs
Paperclip::Attachment.default_options[:gcs_bucket] = "xxxxxxxxxxxx"
Paperclip::Attachment.default_options[:url] = ":gcs_path_url"
Paperclip::Attachment.default_options[:path] = ":model/:id/:style/:name.:extension"
Paperclip::Attachment.default_options[:gcs_credentials] = {
project: 'xxxxxxxxxx',
google_storage_secret_access_key: 'XXXXXXXXXXXXXXX',
google_storage_secret_access_key: 'XXXXXXXXXXXXXXX'
}
Paperclip::Attachment.default_options[:gcs_permissions] = :public_read
attachment_config = {
styles: {
mini: "48x48>",
small: "100x100>",
product: "240x240>",
large: "600x600>"
},
default_style: "product"
}
attachment_config.each do |key, value|
Spree::Image.attachment_definitions[:attachment][key.to_sym] = value
end
end
И все, теперь все картинки к вашим товарам и всему остальному аккуратно будут хранится в хранилище гугл.
Закомментированный метод rails_root я переписал для того, что бы в одном «Сегменте» было удобно хостить несколько приложений, т.к. приложения имеют собственный идентификатор, который выступает как имя папки, куда загружаются все файлы из приложения.
Чтобы добавить такой функционал необходимо создать модель
rails g model Uuid uuid:string
затем добавить в /config/environments/development.rb и /config/environments/production.rb генерацию UUID, желательно в конец файла
...
config.after_initialize do
if ActiveRecord::Base.connection.data_source_exists? 'uuids'
Uuid.create(uuid: SecureRandom.uuid) unless Uuid.first.present?
ENV["UPLOADER_UUID"] = Uuid.first.uuid.to_s
end
...
При первом запуске приложения создается идентификатор, который сохраняется в базе, и используется в качестве названия для папки в облачном хранилище.
P.S.: Если вы удалите метод rails_root из spree.rb, тогда в хранилище будет продублирован абсолютный путь к файлам как на вашей локальной машине.
P.P.S.: Это мой первый гайд, не бейте сильно тапками. Надеюсь, что кому-нибудь это было полезным :)