Heroku, Shrine и Amazon S3: запись блога Изображения исчезают через некоторое время - PullRequest
0 голосов
/ 02 июля 2018

У меня есть страница блога, которую я разработал с использованием rails 5.1. Все работает просто отлично, за исключением того, что после того, как я создаю запись в производстве и прикрепляю изображение, изображение перестает отображаться через некоторое время (скажем, 30 минут). Я искал по интернету поиски решений и увидел this , которые указывают на то, что проблема связана с тем, что Heroku стирает каталог после каждого перезапуска приложения. Одно из предлагаемых решений - разместить ваши изображения в сервисе, таком как Amazon S3.

Однако я настроил S3 и изображения отправляются в корзину, показанную ниже: enter image description here

Но, тем не менее, изображения в блоге по-прежнему исчезают. Мне нужна помощь, так как я не могу понять, чего мне не хватает. Вот соответствующие коды:

shrine.rb:

require "shrine"
require "shrine/storage/s3"
s3_options = {
    access_key_id:      ENV['S3_KEY'],
    secret_access_key:  ENV['S3_SECRET'],
    region:             ENV['S3_REGION'],
    bucket:             ENV['S3_BUCKET'],
}

if Rails.env.development?
  require "shrine/storage/file_system"
  Shrine.storages = {
    cache: Shrine::Storage::FileSystem.new("public", prefix: "uploads/cache"), # temporary
    store: Shrine::Storage::FileSystem.new("public", prefix: "uploads/store")  # permanent
  }
elsif Rails.env.test?
  require 'shrine/storage/memory'
  Shrine.storages = {
    cache: Shrine::Storage::Memory.new,
    store: Shrine::Storage::Memory.new
  }
else
  require "shrine/storage/s3"

  Shrine.storages = {
    cache: Shrine::Storage::S3.new(prefix: "cache", **s3_options),
    store: Shrine::Storage::S3.new(prefix: "store", **s3_options)
  }
end
Shrine.plugin :activerecord # or :activerecord
Shrine.plugin :cached_attachment_data # for retaining the cached file across form redisplays

Gemfile:

....................................
# A rich text editor for everyday writing
gem 'trix', '~> 0.11.1'
# a toolkit for file attachments in Ruby applications
gem 'shrine', '~> 2.11'
# Tag a single model on several contexts, such as skills, interests, and awards
gem 'acts-as-taggable-on', '~> 6.0'
# frameworks for multiple-provider authentication.
gem 'omniauth-facebook'
gem 'omniauth-github'
# Simple Rails app key configuration
gem "figaro"
..............................

Я использую камень Figaro для маскировки файлов env. Они в порядке, так как S3 отвечает, плюс у меня уже есть OmniAuth и работает в блоге.

Вот ошибка, которая отображается на хромированной консоли для изображения:

enter image description here

Мне действительно нужна помощь, чтобы запустить этот блог. Спасибо за ваше время.

1 Ответ

0 голосов
/ 05 июля 2018

Shrine генерирует устаревшие URL-адреса S3 по умолчанию, поэтому возможно, что сгенерированные URL-адреса каким-то образом кэшируются, а затем изображения становятся недоступными после истечения срока действия URL-адреса.

В качестве обходного пути вы можете сделать загрузки S3 общедоступными и сгенерировать общедоступные URL-адреса. Вы можете сделать это, сказав хранилищу S3 сделать загрузки общедоступными (обратите внимание, что это повлияет только на новые загрузки, существующие загрузки останутся частными, поэтому вам придется делать их общедоступными по-другому), и по умолчанию генерировать общедоступные URL-адреса, обновив инициализатор:

# ...

require "shrine/storage/s3"

Shrine.storages = {
  cache: Shrine::Storage::S3.new(prefix: "cache", upload_options: { acl: "public-read" }, **s3_options),
  store: Shrine::Storage::S3.new(prefix: "store", upload_options: { acl: "public-read" }, **s3_options)
}

# ...

Shrine.plugin :default_url_options, cache: { public: true }, store: { public: true }

# ...
...