Как синхронизировать новые зеркала ActiveStorage? - PullRequest
0 голосов
/ 07 октября 2018

Начиная с ActiveStorage, вы можете определить зеркала для хранения ваших файлов.

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

amazon:
  service: S3
  access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
  secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
  region: us-east-1
  bucket: mybucket

mirror:
  service: Mirror
  primary: local
  mirrors:
    - amazon
    - another_mirror

Если вы добавляете зеркало через определенный момент времени, вам нужно позаботиться о копировании всех файлов, например, из «локального»«амазонка» или «другое_зеркало».

  1. Существует ли удобный способ для синхронизации файлов?
  2. Или метод запуска проверки для проверки наличия всех файлов в каждой службе?

Ответы [ 2 ]

0 голосов
/ 20 августа 2019

У меня есть несколько решений, которые могут работать для вас:

Перебирать ваши блоты ActiveStorage:

ActiveStorage::Blob.all.each do |blob|
  # work with blob
end

затем ...

  1. Rails <= 6.0 </p>

    Вам понадобится ключ BLOB-объекта, контрольная сумма и локальный файл на диске.

    local_file = ActiveStorage::Blob.service.primary.path_for(blob.key)
    
    # I'm picking the first mirror but you can add some code to select a specific mirror
    mirror = blob.service.mirrors.first
    
    mirror.upload(blob.key, File.open(local_file), checksum: blob.checksum)
    
  2. Rails 6.1.alpha +

    Просто вызовите это для каждого большого двоичного объекта ...

    blob.mirror_later
    

Вы также можете не загружать файл, если он уже существует на зеркале.Вы можете сделать это, выполнив следующее:

mirror = blob.service.mirrors.first

# If the file doesn't exist on the mirror, upload it
unless mirror.exist? blob.key
  # Upload file to mirror
end

Собрав все вместе, задача граблей может выглядеть следующим образом:

# lib/tasks/active_storage.rake

namespace :active_storage do

  desc 'Ensures all files are mirrored'
  task mirror_all: [:environment] do

    # Iterate through each blob
    ActiveStorage::Blob.all.each do |blob|

      # We assume the primary storage is local
      local_file = ActiveStorage::Blob.service.primary.path_for(blob.key)

      # Iterate through each mirror
      blob.service.mirrors.each do |mirror|

        # If the file doesn't exist on the mirror, upload it
        mirror.upload(blob.key, File.open(local_file), checksum: blob.checksum) unless mirror.exist? blob.key

      end
    end
  end
end
0 голосов
/ 10 октября 2018

Все хранится в соответствии с ключами ActiveStorage, поэтому, пока ваши имена контейнеров и имена файлов не изменяются при передаче, вы можете просто скопировать все в новую службу. См. Этот пост о том, как скопировать материал.

...