Настройка S3-хранилища для WordPress: пошаговое руководство
Это пошаговое руководство по выносу медиафайлов WordPress в S3-совместимое объектное хранилище. Оно покрывает весь цикл: от выбора провайдера до финальной проверки.
Цель: получить WordPress-сайт, где все медиафайлы (изображения, документы, видео) хранятся в S3, а сервер занимается только динамическим контентом.
Шаг 1: Выбор провайдера и плагина
Заголовок раздела «Шаг 1: Выбор провайдера и плагина»Первым делом определитесь со связкой. Подробности на страницах:
- S3-провайдеры для WordPress — сравнение
- Плагины для S3 — что выбрать
Типовые связки:
| Сценарий | Провайдер | Плагин |
|---|---|---|
| РФ, малый проект | Yandex Object Storage | S3 Uploads |
| РФ, enterprise | Selectel | S3 Uploads + Selectel CDN |
| Глобальный, много трафика | Cloudflare R2 | S3 Uploads |
| Сайт на AWS | Amazon S3 | WP Offload Media |
| Нужен UI в админке | Любой | WP Offload Media Lite |
Шаг 2: Создание бакета и IAM-пользователя
Заголовок раздела «Шаг 2: Создание бакета и IAM-пользователя»Для Yandex Object Storage
Заголовок раздела «Для Yandex Object Storage»# 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.editoryc 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!Для Amazon S3
Заголовок раздела «Для Amazon S3»- AWS Console → S3 → Create bucket
- Имя бакета:
my-site-uploads(уникальное глобально) - Регион: ближайший к аудитории
- Block Public Access: снять галку «Block all public access» (для публичных медиа)
- IAM → Users → Create user →
wp-s3-uploads - Attach policy:
AmazonS3FullAccess - Security credentials → Create access key → Application outside AWS
- Скачать
.csvс Access Key ID и Secret
Для Cloudflare R2
Заголовок раздела «Для Cloudflare R2»- Cloudflare Dashboard → R2 → Create bucket
- Имя:
my-site-uploads - Manage R2 API Tokens → Create API Token
- Сохранить Access Key ID и Secret Access Key
- Эндпоинт:
https://<account_id>.r2.cloudflarestorage.com
Шаг 3: Установка и настройка плагина
Заголовок раздела «Шаг 3: Установка и настройка плагина»Вариант A: S3 Uploads (Human Made)
Заголовок раздела «Вариант A: S3 Uploads (Human Made)»# Установкаcomposer require humanmade/s3-uploadswp plugin activate s3-uploadsДобавить в wp-config.php:
// S3 Uploads конфигdefine('S3_UPLOADS_BUCKET', 'my-site-uploads');define('S3_UPLOADS_REGION', 'ru-central1'); // Yandexdefine('S3_UPLOADS_KEY', 'YCAJ...'); // Access Keydefine('S3_UPLOADS_SECRET', 'YCM...'); // Secret KeyДля не-AWS провайдера — mu-plugin с endpoint:
<?phpadd_filter('s3_uploads_s3_client_params', function($params) { $params['endpoint'] = 'https://storage.yandexcloud.net'; $params['use_path_style_endpoint'] = true; return $params;});Подробнее — Плагины для S3.
Вариант B: WP Offload Media Lite
Заголовок раздела «Вариант B: WP Offload Media Lite»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.
Шаг 4: Миграция существующих файлов
Заголовок раздела «Шаг 4: Миграция существующих файлов»S3 Uploads
Заголовок раздела «S3 Uploads»# Загрузить uploads в бакет (директория uploads внутри бакета)wp s3-uploads upload-directory wp-content/uploads uploads --verbose
# Проверитьwp s3-uploads verifyWP Offload Media (Pro)
Заголовок раздела «WP Offload Media (Pro)»В админке: WP Offload Media → Media Library → Offload Now.
Ручная миграция (AWS CLI)
Заголовок раздела «Ручная миграция (AWS CLI)»aws s3 sync wp-content/uploads s3://my-site-uploads/uploads --acl public-readШаг 5: Настройка CDN
Заголовок раздела «Шаг 5: Настройка CDN»Без CDN S3 отдаёт файлы из одного региона — медленно для удалённых посетителей.
CloudFront (AWS)
Заголовок раздела «CloudFront (AWS)»- AWS Console → CloudFront → Create Distribution
- Origin domain: ваш S3-бакет
- Viewer Protocol Policy: Redirect HTTP to HTTPS
- CNAMEs:
cdn.your-site.ru(опционально) - SSL-сертификат через AWS Certificate Manager
Cloudflare (для R2)
Заголовок раздела «Cloudflare (для R2)»- R2-бакет → Settings → Public access → Allow Access
- Custom domain:
cdn.your-site.ru - DNS CNAME → R2 public URL
Yandex Cloud CDN / Selectel CDN
Заголовок раздела «Yandex Cloud CDN / Selectel CDN»Создать CDN-ресурс в консоли провайдера, указав бакет как origin.
Шаг 6: Проверка
Заголовок раздела «Шаг 6: Проверка»1. Загрузите тестовый файл
Заголовок раздела «1. Загрузите тестовый файл»В админке WordPress: Media → Add New → загрузить изображение. Проверить URL:
# В консоли браузера (F12 → Elements)# URL должен указывать на S3/CDN, не на сервер2. Проверьте отдачу
Заголовок раздела «2. Проверьте отдачу»curl -I https://my-site-uploads.s3.yandexcloud.net/uploads/2026/05/test.jpg# HTTP/1.1 200 OK3. Проверьте CDN-кеш
Заголовок раздела «3. Проверьте CDN-кеш»curl -I https://cdn.your-site.ru/uploads/2026/05/test.jpg# X-Cache: Hit from cloudfront (или аналогичный заголовок)4. Проверьте старые файлы
Заголовок раздела «4. Проверьте старые файлы»Откройте несколько старых постов — изображения должны грузиться с нового 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 настроен (для работы админки)
- Локальные файлы удалены (опционально)
- Настроен мониторинг затрат