Перейти к основному содержимому

Настройка файлового хранилища

Pimcore использует мощную и гибкую библиотеку файлового хранилища Flysystem для хранения различных типов контент-файлов, таких как ассеты, миниатюры, данные версионирования и многое другое.

Чтобы настроить собственное файловое хранилище, достаточно переопределить любые из стандартных определений, указав нужный адаптер.:

flysystem:  
storages:
pimcore.asset.storage:
# Хранилище исходных файлов ассетов, структура директорий соответствует структуре дерева ассетов
adapter: 'local'
visibility: private
directory_visibility: public
options:
directory: '%kernel.project_dir%/public/var/assets'
pimcore.asset_cache.storage:
# Хранилище кэшированных файлов ассетов, например PDF и изображений, сгенерированных из Office-файлов или видео,
# которые затем используются движком миниатюр в качестве исходных файлов
adapter: 'local'
visibility: private
options:
directory: '%kernel.project_dir%/public/var/tmp/asset-cache'
pimcore.thumbnail.storage:
# Хранилище миниатюр изображений и видео, структура директорий соответствует дереву исходных ассетов
adapter: 'local'
visibility: private
directory_visibility: public
options:
directory: '%kernel.project_dir%/public/var/tmp/thumbnails'
pimcore.version.storage:
# Хранилище сериализованных данных версионирования документов, ассетов и объектов данных
adapter: 'local'
visibility: private
options:
directory: '%kernel.project_dir%/var/versions'
pimcore.recycle_bin.storage:
# Хранилище сериализованных данных корзины для документов, ассетов и объектов данных
adapter: 'local'
visibility: private
options:
directory: '%kernel.project_dir%/var/recyclebin'
pimcore.admin.storage:
# Хранилище общих административных ресурсов, таких как аватары пользователей, кастомные логотипы и т.д.
adapter: 'local'
visibility: private
options:
directory: '%kernel.project_dir%/var/admin'

Вы можете ознакомиться со всеми официальными адаптерами и сторонними адаптерами для использования собственного файлового хранилища.

Обратите внимание, что при работе в кластерной среде все эти хранилища должны быть общими для всех вычислительных узлов. Использование стандартного адаптера local подходит только для односерверных окружений.

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

pimcore:  
assets:
frontend_prefixes:
# Префикс, используемый для исходных файлов ассетов
source: https://oreo-12345678990.cloudfront.net/asset
# Префикс, используемый для всех сгенерированных миниатюр изображений и видео
thumbnail: https://tavi-12345678990.cloudfront.net/thumbnail
# Префикс, используемый для отложенного пути плейсхолдера миниатюр.
# Миниатюры обычно генерируются по требованию (если не настроено иначе),
# и этот префикс используется для миниатюр, которые еще не были сгенерированы
# и, соответственно, пока недоступны в хранилище миниатюр.
# Как правило, изменять эту настройку не требуется, однако возможный сценарий использования — указать отдельный хост,
# который занимается генерацией миниатюр и снимает нагрузку с основного сервера (или серверов) приложения.
# thumbnail_deferred: https://thumbnail-generator-node.example.com

Это добавит настроенный префикс к путям ассетов и миниатюр во фронтенд-контексте (например, в шаблонах). Таким образом, путь /Sample/Tavi.jpg будет преобразован в https://tavi-12345678990.cloudfront.net/asset/Sample/Tavi.jpg а путь /Sample/362/image-thumb__362__galleryThumbnail/Tavi.jpg — в https://tavi-12345678990.cloudfront.net/thumbnail/Sample/362/image-thumb__362__galleryThumbnail/Tavi.jpg

Это особенно полезно при использовании объектного хранилища с публичным доступом или при использовании CDN, такого как CloudFront, для раздачи ресурсов.

Пример: адаптер AWS S3 для ассетов

Сначала установите адаптер AWS S3 с помощью команды:

composer require league/flysystem-aws-s3-v3  

Следующим шагом необходимо настроить сервис клиента AWS S3 для класса Aws\S3\S3Client со следующими обязательными параметрами:

ИмяОписание
endpointURL эндпоинта AWS S3
regionРегион AWS для доступа к бакету
versionВерсия API (последняя или конкретная)
credentialsУчетные данные IAM: Access Key ID и Secret Access Key
# config/packages/prod/flysystem.yaml  
services:
assets_s3:
class: 'Aws\S3\S3Client'
arguments:
- endpoint: 'https://s3.eu-central-1.amazonaws.com'
region: 'eu-central-1'
version: 'latest'
credentials:
key: '%env(S3_STORAGE_KEY)%'
secret: '%env(S3_STORAGE_SECRET)%'

Для получения дополнительной информации о необходимых правах IAM ознакомьтесь с документацией Flysystem.

Затем переопределите базовую конфигурацию Flysystem, чтобы использовать удаленное хранилище вместо локального. Для этого измените адаптер с local на aws. Также обновите следующие параметры:

  • client: вновь созданный сервис 'assets_s3'
  • bucket: создайте новый бакет в консоли управления S3 и укажите его имя
  • prefix: префикс, который используется как корневая папка для типа хранилища (например, ассеты, версии, миниатюры и т.д.). Все данные хранилища будут создаваться внутри этой папки
# config/packages/prod/flysystem.yaml  
flysystem:
storages:
pimcore.asset.storage:
adapter: 'aws'
visibility: public
options:
client: 'assets_s3'
bucket: 'bucket-name'
prefix: assets

Миграция хранилища

При переходе на другой тип хранилища часто требуется перенести данные из старого хранилища в новое. Pimcore предоставляет команду для выполнения миграции данных между хранилищами. В процессе используется API Flysystem listContents, который рекурсивно считывает данные из исходного (source) хранилища и копирует их в целевое (target) хранилище.

Для миграции данных выполните следующие шаги:

  1. оздайте конфигурацию Flysystem для исходного и целевого хранилищ. Важно соблюдать следующую структуру именования: конфигурационный узел источника: pimcore.{storagetype}.storage.source и конфигурационный узел назначения: pimcore.{storagetype}.storage.target

Ниже приведено несколько примеров:

Задача миграцииУзел источникаУзел назначения
assetpimcore.asset.storage.sourcepimcore.asset.storage.target
thumbnailpimcore.thumbnail.storage.sourcepimcore.thumbnail.storage.target
versionpimcore.version.storage.sourcepimcore.version.storage.target
flysystem:  
storages:
pimcore.asset.storage.source:
adapter: 'local'
visibility: public
options:
directory: '%kernel.project_dir%/public/var/assets'

pimcore.asset.storage.target:
adapter: 'aws'
visibility: public
options:
client: 'assets_s3'
bucket: 'bucket-name'
prefix: asset

pimcore.thumbnail.storage.source:
adapter: 'local'
visibility: private
directory_visibility: public
options:
directory: '%kernel.project_dir%/public/var/tmp/thumbnails'

pimcore.thumbnail.storage.target:
adapter: 'aws'
visibility: public
options:
client: 'assets_s3'
bucket: 'bucket-name'
prefix: thumbnail

  1. Запустите команду pimcore:migrate:storage, указав тип хранилища в качестве аргумента: bin/console pimcore:migrate:storage asset.

Также возможно передать несколько аргументов, чтобы выполнить миграцию разных хранилищ за один запуск.

Вывод:

[INFO] Migrating storage "asset"

22 [------------>-------------] Migrating asset: Brand Logos/Morris_Motors_badge.png


Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.