Налаштування централізованого сховища медіафайлів 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування централізованого сховища медіафайлів 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Налаштування централізованого сховища медіафайлів 1С-Бітрікс

При кластерній конфігурації Бітрікс або при наявності кількох середовищ (prod, staging, dev) медіафайли з /upload/ живуть локально на кожному сервері. Завантажена картинка товару є на одній ноді, але не на інших. Реплікація файлів через NFS працює, але створює єдину точку відмови. Централізоване сховище на базі S3-сумісного об'єктного сховища — стандартне рішення для цього класу завдань.

Варіанти об'єктного сховища

  • Yandex Object Storage — S3-сумісний, дані в РФ, проста інтеграція
  • AWS S3 — якщо дані можна зберігати за кордоном
  • MinIO — self-hosted S3, можна підняти на власних серверах
  • Selectel Object Storage — російський хостинг з S3 API

Всі варіанти працюють з одним і тим самим API (S3 compatible), інтеграція з Бітрікс однакова.

Модуль Bitrix Cloud Storage

У Бітрікс є вбудований модуль bitrix.cloud для зберігання файлів у хмарі. Налаштування: Налаштування → Хмарне сховище.

Підтримувані провайдери з коробки: Amazon S3, Azure Blob Storage. Для Yandex Object Storage — через кастомну точку входу (endpoint), оскільки він S3-сумісний:

// Конфігурація через .settings.php для S3-сумісного сховища
// Використовуємо пряму інтеграцію через AWS SDK

Обмеження модуля bitrix.cloud: не всі типи файлів переносяться коректно (редактор файлів в адмінці, кеш ресайзу). Краще перевіряти на staging.

Пряма інтеграція через AWS SDK

composer require aws/aws-sdk-php
// /local/lib/Storage/S3Storage.php
namespace Local\Storage;

use Aws\S3\S3Client;

class S3Storage
{
    private static ?S3Client $client = null;

    public static function getClient(): S3Client
    {
        if (!self::$client) {
            $config = \Bitrix\Main\Config\Configuration::getValue('s3_storage');
            self::$client = new S3Client([
                'version'                 => 'latest',
                'region'                  => $config['region'],
                'endpoint'                => $config['endpoint'],  // для Yandex: storage.yandexcloud.net
                'use_path_style_endpoint' => true,
                'credentials'             => [
                    'key'    => $config['access_key'],
                    'secret' => $config['secret_key'],
                ],
            ]);
        }
        return self::$client;
    }

    public static function upload(string $localPath, string $s3Key): string
    {
        $bucket = \Bitrix\Main\Config\Configuration::getValue('s3_storage')['bucket'];
        self::getClient()->putObject([
            'Bucket'      => $bucket,
            'Key'         => $s3Key,
            'SourceFile'  => $localPath,
            'ACL'         => 'public-read',
            'ContentType' => mime_content_type($localPath),
        ]);
        return 'https://' . $bucket . '.storage.yandexcloud.net/' . $s3Key;
    }
}

Конфігурація в /bitrix/.settings.php:

's3_storage' => [
    'value' => [
        'access_key' => 'YCAJExxxx',
        'secret_key' => 'YCPxxx',
        'bucket'     => 'my-shop-media',
        'region'     => 'ru-central1',
        'endpoint'   => 'https://storage.yandexcloud.net',
    ],
],

Перехоплення завантаження файлів у Бітрікс

Бітрікс зберігає файли через CFile::SaveFile(). Щоб файли надходили в S3 замість локального диска, перехоплюємо через хук:

// Альтернатива: перевизначаємо поведінку через обробник після збереження
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'main',
    'OnAfterFileSave',
    function (\Bitrix\Main\Event $event) {
        $file = $event->getParameter('FILE');
        $localPath = $_SERVER['DOCUMENT_ROOT'] . $file['SRC'];

        if (file_exists($localPath)) {
            $s3Key = ltrim($file['SRC'], '/');
            \Local\Storage\S3Storage::upload($localPath, $s3Key);

            // Опціонально: видаляємо локальну копію після завантаження в S3
            // unlink($localPath);
        }
    }
);

Для віддачі файлів — налаштовуємо nginx на проксування запитів до /upload/ через S3 CDN:

location /upload/ {
    proxy_pass https://my-shop-media.storage.yandexcloud.net/upload/;
    proxy_cache_valid 200 7d;
    add_header Cache-Control "public, max-age=604800";
}

Міграція існуючих файлів

Перенесення поточного /upload/ в S3 — окрема операція:

# Синхронізація локального upload/ в S3 через AWS CLI
aws s3 sync /var/www/bitrix/upload/ s3://my-shop-media/upload/ \
    --endpoint-url https://storage.yandexcloud.net \
    --acl public-read \
    --no-progress

# Перевіряємо кількість файлів
aws s3 ls s3://my-shop-media/upload/ --recursive --endpoint-url https://storage.yandexcloud.net | wc -l

Міграцію виконуємо з можливістю відкату: локальні файли не видаляємо до підтвердження коректної роботи.

Терміни налаштування

Налаштування S3-сховища, інтеграція з Бітрікс через SDK, конфіг nginx для проксування, міграція існуючих файлів — 2–4 робочих дні залежно від обсягу існуючого upload/.