Yandex Object Storage как CDN для Битрикс: подключение и автозагрузка файлов

Yandex Object Storage — российская альтернатива Amazon S3, которая не блокируется в РФ. Можно использовать как CDN для статических файлов Битрикс: изображений, документов, медиа. Это снижает нагрузку на основной сервер и ускоряет загрузку для российских пользователей.

Преимущества Object Storage перед обычным хостингом

  • Высокая доступность и отказоустойчивость (SLA 99.9%)
  • Оплата только за хранение и трафик (нет аренды сервера)
  • CDN через Yandex Cloud CDN поверх Object Storage
  • Совместим с S3 API — работают большинство S3-клиентов
  • Нет блокировок в РФ в отличие от Cloudflare

Создание бакета

  1. Перейдите в Yandex Cloud Console
  2. Object Storage → Создать бакет
  3. Имя: mysite-uploads
  4. Класс хранения: Стандартный
  5. Доступ на чтение объектов: Публичный

Создание сервисного аккаунта и ключа

# Через Yandex Cloud CLI (yc)
yc iam service-account create --name bitrix-s3

# Выдаём права на бакет
yc storage bucket update mysite-uploads \
    --grants grant-type=grant-type-account,permission=permission-full-control,id=SERVICE_ACCOUNT_ID

# Создаём статический ключ доступа
yc iam access-key create --service-account-name bitrix-s3

Сохраните access_key_id и secret — они понадобятся для настройки.

PHP-класс для загрузки в Object Storage

bucket = $bucket;
        $this->client = new S3Client([
            "version"     => "latest",
            "region"      => "ru-central1",
            "endpoint"    => "https://storage.yandexcloud.net",
            "credentials" => [
                "key"    => $keyId,
                "secret" => $secret,
            ],
            "use_path_style_endpoint" => true,
        ]);
    }

    public function upload(string $localPath, string $remotePath, string $contentType = ""): string
    {
        if (!$contentType) {
            $contentType = mime_content_type($localPath) ?: "application/octet-stream";
        }

        $this->client->putObject([
            "Bucket"      => $this->bucket,
            "Key"         => $remotePath,
            "SourceFile"  => $localPath,
            "ContentType" => $contentType,
            "ACL"         => "public-read",
        ]);

        return "https://storage.yandexcloud.net/{$this->bucket}/{$remotePath}";
    }

    public function delete(string $remotePath): void
    {
        $this->client->deleteObject([
            "Bucket" => $this->bucket,
            "Key"    => $remotePath,
        ]);
    }

    public function getUrl(string $remotePath): string
    {
        return "https://storage.yandexcloud.net/{$this->bucket}/{$remotePath}";
    }
}

// Использование:
$storage = new YandexObjectStorage(
    "YOUR_ACCESS_KEY_ID",
    "YOUR_SECRET",
    "mysite-uploads"
);

$url = $storage->upload(
    "/home/bitrix/www/upload/iblock/abc/photo.jpg",
    "upload/iblock/abc/photo.jpg"
);
echo $url; // https://storage.yandexcloud.net/mysite-uploads/upload/iblock/abc/photo.jpg

Интеграция с Битрикс: хук на загрузку файлов

upload($arFile["tmp_name"], $remotePath, $arFile["type"]);
        // Можно сохранить URL в мета-данных файла для последующего использования
        AddMessage2Log("Uploaded to S3: {$url}", "yos_upload");
    } catch (AwsException $e) {
        AddMessage2Log("YOS upload error: " . $e->getMessage(), "yos_upload");
    }
});

Настройка CORS для браузерной загрузки

Если файлы загружаются через JS напрямую в бакет:

[
    {
        "AllowedOrigins": ["https://karoche.ru"],
        "AllowedMethods": ["GET", "PUT", "POST"],
        "AllowedHeaders": ["*"],
        "MaxAgeSeconds": 3600
    }
]

Итог

Yandex Object Storage — надёжный российский S3-совместимый сервис для хранения файлов. Подключается через стандартный AWS SDK для PHP, работает без блокировок в РФ. Для высоконагруженных проектов добавьте Yandex CDN поверх бакета — это даст географически распределённую раздачу файлов.