Перейти к содержимому

Настройка S3-хранилища для WordPress: пошаговое руководство

Это пошаговое руководство по выносу медиафайлов WordPress в S3-совместимое объектное хранилище. Оно покрывает весь цикл: от выбора провайдера до финальной проверки.

Цель: получить WordPress-сайт, где все медиафайлы (изображения, документы, видео) хранятся в S3, а сервер занимается только динамическим контентом.

Первым делом определитесь со связкой. Подробности на страницах:

Типовые связки:

СценарийПровайдерПлагин
РФ, малый проектYandex Object StorageS3 Uploads
РФ, enterpriseSelectelS3 Uploads + Selectel CDN
Глобальный, много трафикаCloudflare R2S3 Uploads
Сайт на AWSAmazon S3WP Offload Media
Нужен UI в админкеЛюбойWP Offload Media Lite
Окно терминала
# 1. Установить Yandex Cloud CLI
# https://yandex.cloud/ru/docs/cli/quickstart
# 2. Создать бакет
yc storage bucket create \
--name my-site-uploads \
--default-storage-class STANDARD
# 3. Создать сервисный аккаунт
yc iam service-account create --name wp-s3-uploads
# 4. Назначить роль storage.editor
yc resource-manager folder add-access-binding default \
--role storage.editor \
--subject serviceAccount:<sa_id>
# 5. Создать статический ключ доступа
yc iam access-key create --service-account-name wp-s3-uploads
# Сохранить key_id и secret!
  1. AWS Console → S3 → Create bucket
  2. Имя бакета: my-site-uploads (уникальное глобально)
  3. Регион: ближайший к аудитории
  4. Block Public Access: снять галку «Block all public access» (для публичных медиа)
  5. IAM → Users → Create userwp-s3-uploads
  6. Attach policy: AmazonS3FullAccess
  7. Security credentials → Create access key → Application outside AWS
  8. Скачать .csv с Access Key ID и Secret
  1. Cloudflare Dashboard → R2 → Create bucket
  2. Имя: my-site-uploads
  3. Manage R2 API Tokens → Create API Token
  4. Сохранить Access Key ID и Secret Access Key
  5. Эндпоинт: https://<account_id>.r2.cloudflarestorage.com
Окно терминала
# Установка
composer require humanmade/s3-uploads
wp plugin activate s3-uploads

Добавить в wp-config.php:

// S3 Uploads конфиг
define('S3_UPLOADS_BUCKET', 'my-site-uploads');
define('S3_UPLOADS_REGION', 'ru-central1'); // Yandex
define('S3_UPLOADS_KEY', 'YCAJ...'); // Access Key
define('S3_UPLOADS_SECRET', 'YCM...'); // Secret Key

Для не-AWS провайдера — mu-plugin с endpoint:

wp-content/mu-plugins/s3-endpoint.php
<?php
add_filter('s3_uploads_s3_client_params', function($params) {
$params['endpoint'] = 'https://storage.yandexcloud.net';
$params['use_path_style_endpoint'] = true;
return $params;
});

Подробнее — Плагины для S3.

Окно терминала
wp plugin install amazon-s3-and-cloudfront --activate

В админке: WP Offload Media → Settings → выбрать провайдера → ввести ключи → выбрать бакет.

Или через wp-config.php:

define('AS3CF_SETTINGS', serialize(array(
'provider' => 'aws',
'access-key-id' => 'AKIA...',
'secret-access-key' => '...',
)));

Подробнее — WP Offload Media.

Окно терминала
# Загрузить uploads в бакет (директория uploads внутри бакета)
wp s3-uploads upload-directory wp-content/uploads uploads --verbose
# Проверить
wp s3-uploads verify

В админке: WP Offload Media → Media Library → Offload Now.

Окно терминала
aws s3 sync wp-content/uploads s3://my-site-uploads/uploads --acl public-read

Без CDN S3 отдаёт файлы из одного региона — медленно для удалённых посетителей.

  1. AWS Console → CloudFront → Create Distribution
  2. Origin domain: ваш S3-бакет
  3. Viewer Protocol Policy: Redirect HTTP to HTTPS
  4. CNAMEs: cdn.your-site.ru (опционально)
  5. SSL-сертификат через AWS Certificate Manager
  1. R2-бакет → Settings → Public access → Allow Access
  2. Custom domain: cdn.your-site.ru
  3. DNS CNAME → R2 public URL

Создать CDN-ресурс в консоли провайдера, указав бакет как origin.

В админке WordPress: Media → Add New → загрузить изображение. Проверить URL:

Окно терминала
# В консоли браузера (F12 → Elements)
# URL должен указывать на S3/CDN, не на сервер
Окно терминала
curl -I https://my-site-uploads.s3.yandexcloud.net/uploads/2026/05/test.jpg
# HTTP/1.1 200 OK
Окно терминала
curl -I https://cdn.your-site.ru/uploads/2026/05/test.jpg
# X-Cache: Hit from cloudfront (или аналогичный заголовок)

Откройте несколько старых постов — изображения должны грузиться с нового URL.

ПроблемаПричинаРешение
403 при загрузкеНедостаточно прав IAMПроверить политику: нужны s3:PutObject, s3:GetObject
Изображения не видныБакет приватныйВключить public access (ACL)
CORS в админкеНет CORS-заголовков на бакетеДобавить CORS-политику в настройках бакета
Медленная загрузкаНет CDNНастроить CDN (CloudFront / Cloudflare)
Большой счёт за egressТрафик напрямую из S3Включить CDN или перейти на R2
Плагин не видит endpointНе задан use_path_style_endpointДобавить в конфиг: 'use_path_style_endpoint' => true
  • Бакет создан, регион — ближайший к аудитории
  • IAM-пользователь создан, права минимально необходимые
  • Ключи доступа НЕ в коде (используйте wp-config.php или секреты CI/CD)
  • Плагин установлен и активирован
  • Endpoint задан для не-AWS провайдеров
  • Тестовый файл загружен, URL указывает на S3
  • Существующие файлы мигрированы
  • CDN настроен и проверен
  • CORS настроен (для работы админки)
  • Локальные файлы удалены (опционально)
  • Настроен мониторинг затрат