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

Использование DigitalOcean Spaces или Amazon S3 для хранения файлов в XF 2.1 & XF 2.2 2.4.1

Нет прав для скачивания
Совместимость с XenForo
  1. 2.1
  2. 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
Скачивания
51
Просмотры
4,006
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

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

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

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

  1. Финальная версия для XenForo 2.2

    Из-за проблемы мы выпускаем новую версию дополнения для поддержки клиентов, использующих XenForo...
  2. Обновление 2.4.0

    Это «дополнение» больше не требуется для XenForo 2.3 и его следует удалить. XenForo 2.3...
  3. 2.2.1

    Последнее обновление этого дополнения обновило SDK Amazon AWS до версии 3.204.2, но...
Назад
Сверху Снизу