- Совместимость с XenForo
- 2.1
- 2.2
Сжатый перевод (перевод делал на одном дыхании, возможно что-то выкинул нужное, что-то грубо перефразировал) с оригинала:
Спасибо Mirovinger за файлы с оф. ресурса.
Спасибо 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 находится ниже.
- Заходим на страницу , регистрируемся или авторизуемся там.
- Если вы новичек в DigitalOcean, то вам потребуется выбрать тариф и способы оплаты.
- Создаем новый проект.
- Нажимаем на ссылку "Start using Spaces".
- Выберите регион сервера (пример - Amsterdam).
- Оставьте "Restrict File Listing" отмеченным.
- Введите уникальное имя (пример - xftest).
- Нажмите "Create a space"
Теперь нужно получить данные для доступа к API. Делаем следующее:
- Нажимаем "Manage" в левой панели.
- Выбираем "API".
- В разделе "Spaces access keys" нажимаем "Generate New Key".
- Введите имя ключа (пример - 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;
};
Необходимо проверить то, что мы настроили всё правильно. Загрузите новый аватар и проверьте, сохранилась ли она на удаленном хранилище:
Теперь нужно настроить для папки
internal_data
, хранящая вложения и остальные вещи, которые должны быть закрыты для общего доступа. Добавляем:
PHP:
$config['fsAdapters']['internal-data'] = function() use($s3)
{
return new \League\Flysystem\AwsS3v3\AwsS3Adapter($s3(), 'xftest', 'internal_data');
};
Подготовка к настройке Amazon S3
- Переходим на страницу , регистрируемся или авторизуемся.
- В разделе "AWS services" введи "S3" для перехода к "S3 Console".
- Нажми "Create bucket".
- Введи имя для bucket (пример - xftest).
- Выбери регион (пример - EU London).
- Выберите дополнительные параметры по умолчанию.
- Переходим в "IAM"
- Нажимаем "Add user".
- Введи имя пользователя (пример - xftest).
- Выбери тип доступа (access type) "Programmatic".
- Чтобы установить права, выбери вкладку "Attach existing policies directly", затем "Create policy".
- 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/*"
]
}
]
}
- Нажмите "Review Policy", дайте имя и сохраните.
- Вернитесь назад к странице "Add user", нажмите кнопку "Refresh" и найдите политику, которую вы только что создали.
- Нажмите "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;
};
Теперь все адреса миниатюр и аватарок будут ссылаться на удаленное хранилище. О перемещении всех существующих файлов будет описано позже.
Необходимо проверить то, что мы настроили всё правильно. Загрузите новый аватар и проверьте, сохранилась ли она на удаленном хранилище:
Теперь нужно настроить для папки
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) на время пока вы копируете файлы: