Конфігурація S3-сумісного сховища для 1С-Бітрікс
Диск на сервері закінчується. Або потрібно рознести на кілька серверів і синхронізувати завантажені файли між ними. Перенесення /upload/ на S3-сумісне сховище (MinIO, Selectel, VK Cloud, Cloudflare R2) вирішує обидві задачі — але тільки якщо настроїти правильно, інакше Бітрікс почне записувати шляхи до файлів неправильно.
Модуль main.cloudstorages
Бітрікс підтримує хмарні сховища через модуль main.cloudstorages. Він абстрагує роботу з файлами через провайдерів. Для S3-сумісних сховищ використовується провайдер amazon (сумісність на рівні API S3).
Настройка провайдера виробляється в /bitrix/admin/main_cloud_storage.php. Параметри для S3-сумісного сховища:
-
Endpoint URL — URL сервісу (для MinIO:
http://minio:9000, для Selectel:https://s3.selectel.ru) - Key — Access Key ID
- Secret — Secret Access Key
- Bucket — назва бакету
-
Region — регіон (для кастомних S3 часто
us-east-1)
Конфігурація в коді (для автоматизації настройки):
\Bitrix\Main\Config\Option::set('main', 'cloud_storage_active', 'Y');
\Bitrix\Main\Config\Option::set('main', 'cloud_storage_provider', 'amazon');
\Bitrix\Main\Config\Option::set('main', 'cloud_storage_endpoint', 'https://s3.example.com');
\Bitrix\Main\Config\Option::set('main', 'cloud_storage_access_key', 'ACCESS_KEY');
\Bitrix\Main\Config\Option::set('main', 'cloud_storage_secret_key', 'SECRET_KEY');
\Bitrix\Main\Config\Option::set('main', 'cloud_storage_bucket', 'bitrix-uploads');
\Bitrix\Main\Config\Option::set('main', 'cloud_storage_path', 'upload/');
Path style vs virtual hosted style
Найчастіша проблема при підключенні не-AWS S3 — неверна адресація бакету. AWS використовує virtual hosted style: https://bucket.s3.amazonaws.com/key. Більшість S3-сумісних сервісів підтримують path style: https://s3.example.com/bucket/key.
Стандартний модуль Бітрікса використовує virtual hosted style. Для сервісів, які його не підтримують (наприклад, MinIO в локальній мережі без wildcard DNS), потрібно патчити клас провайдера /bitrix/modules/main/lib/cloudstorages/amazon.php — додати параметр use_path_style_endpoint: true при ініціалізації AWS SDK:
$s3Client = new \Aws\S3\S3Client([
'version' => 'latest',
'region' => $region,
'endpoint' => $endpoint,
'use_path_style_endpoint' => true,
'credentials' => [
'key' => $accessKey,
'secret' => $secretKey,
],
]);
Синхронізація існуючих файлів
Після підключення сховища Бітрікс починає завантажувати нові файли на S3, але старі залишаються локально. Для міграції використовується вбудована утиліта: /bitrix/admin/main_cloud_copy.php. Вона запускає агент, який пакетами переносить файли з /upload/ в сховище і оновлює шляхи в b_file.
При перенесенні важливо: поле SUBDIR в b_file зберігає відносний шлях файла. Після міграції на S3 шляхи стають URL-адресами бакету. Якщо міграція переривається на середині, частина файлів буде на S3, частина — локально. Бітрікс визначає джерело файла за полем EXTERNAL_ID в b_file — якщо воно заповнено, файл вважається хмарним.
Публічний доступ та CDN
Файли в S3 мають бути публічно доступні для прямих посилань на зображення. Настройка політики бакету для публічного читання:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bitrix-uploads/*"
}]
}
Для підключення CDN перед бакетом (CloudFront, Cloudflare) в настройках модуля вказується параметр CDN_URL — Бітрікс буде формувати публічні URL через CDN, а запис на S3 буде йти напрямку.
Кеш та тимчасові файли
Директорію /bitrix/cache/ переносити на S3 неможна — це деградує продуктивність. Кеш має залишатися локальним або на швидкому мережевому сховищі (NFS, Redis для керованого кеша). На S3 переносяться тільки /upload/ — користувацький контент.







