Перенос активного хранилища с локального дискового сервиса в облако gcs - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь перенести мои локальные файлы Active Storage в Google Cloud Storage.Я попытался просто скопировать файлы /storage/* в мое ведро GCS - но похоже, что это не работает.

Я получаю 404 не найдены ошибки, потому что он ищет такие файлы, как: [bucket]/variants/ptGtmNWuTE...

Мой каталог локального хранилища имеет совершенно другую структуру папок с папками, такими как: /storage/1R/3o/NWuT....

Мой метод получения изображения следующий:

variant = attachment.variant(resize: '100x100').processed
url_for(variant)

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 13 марта 2019

Как оказалось - DiskService aka. Локальное хранилище использует другую структуру папок, чем облачные сервисы. Это действительно странно.

DiskService использует в качестве папок часть первых символов ключа. Облачные сервисы просто используют ключ и помещают все варианты в отдельную папку.

Создана задача rake для копирования файлов в облачные сервисы. Запустите, например, rails active_storage:migrate_local_to_cloud storage_config=google.

namespace :active_storage do
  desc "Migrates active storage local files to cloud"
    task migrate_local_to_cloud: :environment do
      raise 'Missing storage_config param' if !ENV.has_key?('storage_config')

      require 'yaml'
      require 'erb'
      require 'google/cloud/storage'

      config_file = Pathname.new(Rails.root.join('config/storage.yml'))
      configs = YAML.load(ERB.new(config_file.read).result) || {}
      config = configs[ENV['storage_config']]

      client = Google::Cloud.storage(config['project'], config['credentials'])
      bucket = client.bucket(config.fetch('bucket'))

      ActiveStorage::Blob.find_each do |blob|
        key = blob.key
        folder = [key[0..1], key[2..3]].join('/')
        file_path = Rails.root.join('storage', folder.to_s, key)
        file = File.open(file_path, 'rb')
        md5 = Digest::MD5.base64digest(file.read)
        bucket.create_file(file, key, content_type: blob.content_type, md5: md5)
        file.close
        puts key
      end
    end
  end
...