Иконка ресурса

Использование DigitalOcean Spaces или Amazon S3 для хранения файлов в XF 2.x 2.2.1

Нет прав для скачивания
Совместимость с XenForo
  1. 2.0
  2. 2.1
  3. 2.2
Сжатый перевод (перевод делал на одном дыхании, возможно что-то выкинул нужное, что-то грубо перефразировал) с оригинала:
Спасибо Mirovinger за файлы с оф. ресурса.

Зачем этот мануал?
С версии XenForo 2.0.0 поддерживается удаленное хранение файлов при помощи . Она называется абстрагированной файловой системой потому что она добавляет "внешний слой" между кодом и файловой системой. Она представляет API для выполнения операций файловой системы, поэтому будь она на локальном диске или находится на удаленной системе, наш код вызывает те же функции, а Flysystem сделает всё остальное.

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

Поэтому если вы планируете использовать функцию загрузки видео в XF 2.1 и вы волнуетесь об увеличении необходимости требований к свободному месту на диске, или вы все ещё на версии 2.0 и вам нужно разгрузить ваши требования к локальному хранилищу, то приступим.

Автозагрузка AWS SDK (только для XF 2.0.x)
Первым делом сделаем автозагрузку AWS SDK.

Откройте файл src/config.php на вашем сервере форума.

Существует несколько поставщиков (vendor), которые были включены в прикрепленный ранее аддон. Следующие строки гарантируют, что они все уже загружены. Мы делаем это для того, что нам нужно чтобы файлы были доступны как можно раньше:
PHP:
\XFAws\Composer::autoloadNamespaces(\XF::app());
\XFAws\Composer::autoloadPsr4(\XF::app());
\XFAws\Composer::autoloadClassmap(\XF::app());
\XFAws\Composer::autoloadFiles(\XF::app());

Подготовка к настройке DigitalOcean Spaces
Сначала рассмотрим наиболее простой способ в настройке. Инструкция для Amazon S3 находится ниже.
  1. Заходим на страницу , регистрируемся или авторизуемся там.
  2. Если вы новичек в DigitalOcean, то вам потребуется выбрать тариф и способы оплаты.
  3. Создаем новый проект.
  4. Нажимаем на ссылку "Start using Spaces".
  5. Выберите регион сервера (пример - Amsterdam).
  6. Оставьте "Restrict File Listing" отмеченным.
  7. Введите уникальное имя (пример - xftest).
  8. Нажмите "Create a space"
Проект создан, вы должны найти адрес конечной точки, похожий на это: . Она нам понадобится.

Теперь нужно получить данные для доступа к API. Делаем следующее:
  1. Нажимаем "Manage" в левой панели.
  2. Выбираем "API".
  3. В разделе "Spaces access keys" нажимаем "Generate New Key".
  4. Введите имя ключа (пример - xftest) и сохраните.
На этом этапе мы получили адрес конечной точки, публичный ключ и секретный ключ.

Настройка DigitalOcean Spaces для XF
Теперь нужно настроить XF для использования DigitalOcean Spaces как файловое хранилище. Начнем с папки data (содержит миниатюры вложений и аватары).
Открываем файл src/config.php

Сначала необходимо настроить клиент Amazon S3 (DigitalOcean Spaces API совместим с Amazon AWS SDK).

Весь код копируем в конец файла, не забываем менять xftest на свой.
Используем анонимную функцию, чтобы мы могли использовать её повторно в коде:
PHP:
$s3 = function()
{
   return new \Aws\S3\S3Client([
      'credentials' => [
         'key' => 'ABC',
         'secret' => '123'
      ],
      'region' => 'ams3',
      'version' => 'latest',
      'endpoint' => 'https://ams3.digitaloceanspaces.com'
   ]);
};
В поля key и secret вставляем ранее полученные данные на предыдущем этапе. Регион (поле region) должно быть взято с адреса конечной точки. Он является частью адреса, начинается после первой точки в адресе, в нашем случае это ams3. Конечная точка (поле endpoint) то же самое, что и адрес конечной точки, только без уникального имени.
Далее настраиваем адаптер Flysystem (для использования клиента S3):
PHP:
$config['fsAdapters']['data'] = function() use($s3)
{
   return new \League\Flysystem\AwsS3v3\AwsS3Adapter($s3(), 'xftest', 'data');
};
Теперь файлы будут храниться в папке data на нашем удаленном хранилище.

Теперь нужно чтобы ссылки миниатюр и аватаров ссылались на верный адрес:
PHP:
$config['externalDataUrl'] = function($externalPath, $canonical)
{
   return 'https://xftest.ams3.digitaloceanspaces.com/data/' . $externalPath;
};
Теперь все адреса миниатюр и аватарок будут ссылаться на удаленное хранилище. О перемещении всех существующих файлов будет описано позже.

Необходимо проверить то, что мы настроили всё правильно. Загрузите новый аватар и проверьте, сохранилась ли она на удаленном хранилище:
104219



Теперь нужно настроить для папки internal_data, хранящая вложения и остальные вещи, которые должны быть закрыты для общего доступа. Добавляем:
PHP:
$config['fsAdapters']['internal-data'] = function() use($s3)
{
   return new \League\Flysystem\AwsS3v3\AwsS3Adapter($s3(), 'xftest', 'internal_data');
};

Подготовка к настройке Amazon S3
  1. Переходим на страницу , регистрируемся или авторизуемся.
  2. В разделе "AWS services" введи "S3" для перехода к "S3 Console".
  3. Нажми "Create bucket".
  4. Введи имя для bucket (пример - xftest).
  5. Выбери регион (пример - EU London).
  6. Выберите дополнительные параметры по умолчанию.
  7. Переходим в "IAM"
  8. Нажимаем "Add user".
  9. Введи имя пользователя (пример - xftest).
  10. Выбери тип доступа (access type) "Programmatic".
  11. Чтобы установить права, выбери вкладку "Attach existing policies directly", затем "Create policy".
  12. IAM и другие политики и права могут быть довольно пугающими. Мы поступим немного проще, даже если вы имеете другие требования. На этой странице есть вкладка "JSON. Вставьте это туда, замените YOUR-BUCKET-NAME на ваше название bucket, введенное ранее:
JSON:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:putObject",
                "s3:putObjectAcl",
                "s3:ReplicateObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::YOUR-BUCKET-NAME",
                "arn:aws:s3:::YOUR-BUCKET-NAME/*"
            ]
        }
    ]
}
  1. Нажмите "Review Policy", дайте имя и сохраните.
  2. Вернитесь назад к странице "Add user", нажмите кнопку "Refresh" и найдите политику, которую вы только что создали.
  3. Нажмите "Next", потом "Create User"
Вы должны получить публичный ключ и секретный ключ. Они понадобятся нам дальше.

Настройка Amazon S3 для XF
Теперь нужно настроить XF для использования Amazon S3 как файловое хранилище. Начнем с папки data (содержит миниатюры вложений и аватары).
Открываем файл src/config.php

Сначала необходимо настроить клиент Amazon S3.

Весь код копируем в конец файла, не забываем менять xftest на свой.
Используем анонимную функцию, чтобы мы могли использовать её повторно в коде:
PHP:
$s3 = function()
{
   return new \Aws\S3\S3Client([
      'credentials' => [
         'key' => 'ABC',
         'secret' => '123'
      ],
      'region' => 'us-east-1',
      'version' => 'latest',
      'endpoint' => 'https://s3.us-east-1.amazonaws.com'
   ]);
};
В поля key и secret вставляем ранее полученные данные на предыдущем этапе. Регион (поле region) должно быть взято с адреса конечной точки.

Далее настраиваем адаптер Flysystem (для использования клиента S3):
PHP:
$config['fsAdapters']['data'] = function() use($s3)
{
   return new \League\Flysystem\AwsS3v3\AwsS3Adapter($s3(), 'xftest', 'data');
};
Теперь файлы будут храниться в папке data на нашем удаленном хранилище.

Теперь нужно чтобы ссылки миниатюр и аватаров ссылались на верный адрес:
PHP:
$config['externalDataUrl'] = function($externalPath, $canonical)
{
   return 'https://xftest.s3.us-east-1.amazonaws.com/data/' . $externalPath;
};

Теперь все адреса миниатюр и аватарок будут ссылаться на удаленное хранилище. О перемещении всех существующих файлов будет описано позже.

Необходимо проверить то, что мы настроили всё правильно. Загрузите новый аватар и проверьте, сохранилась ли она на удаленном хранилище:
104220


Теперь нужно настроить для папки internal_data, хранящая вложения и остальные вещи, которые должны быть закрыты для общего доступа. Добавляем:
PHP:
$config['fsAdapters']['internal-data'] = function() use($s3)
{
   return new \League\Flysystem\AwsS3v3\AwsS3Adapter($s3(), 'xftest', 'internal_data');
};

Перемещение существующих файлов на DigitalOcean Spaces или Amazon S3
Итак, теперь файлы у нас хранятся на удаленном хранилище. Но что насчет существующих файлов?
Существует несколько методов для совершения этого процесса, но, пожалуй, лучший подход - использование инструмента под названием , являющаяся популярным кросс-платформенным консольным инструментом для управления S3 и S3-совместимых хранилищ.

Устанавливаем s3cmd на ваш сервер и запускаем команду копирования файлов в "новый дом"

Ссылка на использование s3cmd:

Примечание: При копировании файлов необходимо сделать их общедоступными. Вам необходимо настроить списки контроля доступа (ACL) на время пока вы копируете файлы:
Автор
Alex Fair
Скачивания
43
Просмотры
2,859
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя Alex Fair

Поделиться ресурсом

Последние обновления

  1. 2.2.1

    Последнее обновление этого дополнения обновило SDK Amazon AWS до версии 3.204.2, но...
  2. 2.2.0

    Здесь нет никаких изменений, кроме дополнительной поддержки PHP 8.1. Вам решать, обновляете вы...
Назад
Сверху Снизу