Порядок переноса в объектное хранилище без битых ссылок
Главная ошибка при переезде на S3 или MinIO — сначала переключить приложение на новое хранилище, а потом начать копировать файлы. Часть посетителей в это время получает 404 на изображения и вложения. Правильный порядок обратный.
- Скопируйте все существующие файлы в бакет, пока приложение продолжает писать на локальный диск или в старое хранилище.
- Настройте плагин или код приложения на новое хранилище в тестовом режиме, не отключая старое.
- Проверьте, что новые файлы одновременно попадают в старое расположение и в бакет.
- Запустите финальную синхронизацию дельты — файлов, добавленных за время переноса.
- Переключите приложение на чтение только из бакета и оставьте старое хранилище как резерв на несколько дней.
Честно про время простоя: сам перенос файлов идёт без остановки сайта, а окно простоя нужно только на переключение конфигурации и финальную синхронизацию — обычно это 1–10 минут в зависимости от числа изменившихся файлов, а не часы на полную заливку.
rclone: универсальный инструмент для S3
# Установка rclone
curl https://rclone.org/install.sh | bash
# Настройка профиля S3
rclone config
# Выбираем: n (new remote) → s3 → AWS/MinIO → ввести ключи
Пример конфигурации rclone для MinIO
[minio]
type = s3
provider = Minio
env_auth = false
access_key_id = YOUR_ACCESS_KEY
secret_access_key = YOUR_SECRET_KEY
endpoint = https://minio.example.com
location_constraint =
server_side_encryption =
Синхронизация данных
# Перенос локальной папки в бакет
rclone sync /var/www/uploads/ minio:mybucket/uploads/ --progress
# Синхронизация между двумя S3-совместимыми хранилищами
rclone sync s3:source-bucket minio:dest-bucket --progress
# Проверка без реальных изменений
rclone sync /data minio:backup --dry-run
rclone mount minio:mybucket /mnt/s3 --daemonФинальная синхронизация перед переключением
После первой полной заливки файлов сайт продолжает работать и создавать новые. Перед переключением запустите rclone sync ещё раз — команда скопирует только изменившееся, и окно простоя сократится до пары минут вместо часов на полную заливку.
WordPress + S3 Offload Media
| Плагин | Провайдеры | Стоимость |
|---|---|---|
| WP Offload Media Lite | AWS S3, DigitalOcean, Linode | Бесплатно |
| WP Offload Media Pro | Все S3-совместимые | $99/год |
| Media Cloud | S3, MinIO, Backblaze | Бесплатно + Pro |
Проверка до переключения приложения
Проверьте доступность файлов из бакета напрямую, минуя код приложения:
curl -I https://minio.example.com/mybucket/uploads/photo.jpg
Ответ 200 OK с правильным Content-Type означает, что файл действительно доступен. Если бакет приватный, добавьте проверку через подписанный URL, который генерирует приложение.
Сравнение схем доступа к бакету
| Схема | Публичный доступ | Когда использовать |
|---|---|---|
| Публичный бакет | да, по прямой ссылке | изображения, статика сайта |
| Приватный бакет + подписанные URL | только по временной ссылке | документы, файлы пользователей |
| Приватный бакет + CDN-прокси | через отдельный домен CDN | высокая нагрузка, нужен кеш на границе сети |
Типичные ошибки
| Ошибка | Причина и решение |
|---|---|
| SignatureDoesNotMatch | Неверный access/secret key или расхождение времени на сервере — синхронизируйте время через NTP |
| 403 Forbidden при чтении файла | У бакета или объекта не выставлена политика на публичное чтение — проверьте bucket policy |
| NoSuchBucket | Бакет создан в другом регионе или с опечаткой в имени — сверьте endpoint и имя бакета |
| Connection timeout при rclone sync | Заблокирован исходящий порт 443 на файрволе сервера — откройте исходящие соединения к endpoint хранилища |
Откат при проблемах
- Не удаляйте локальные копии файлов сразу после переноса — держите их минимум неделю.
- Если ссылки на файлы массово не открываются, верните код приложения на локальное хранилище — данные там не удалены.
- Разберитесь с правами доступа или конфигурацией бакета и повторите переключение.
Когда это не подходит
Для сайтов с активной записью файлов пользователями в реальном времени (например, загрузка видео при просмотре) полная синхронизация не подходит без короткого окна блокировки записи — иначе часть файлов, добавленных во время финальной синхронизации, потеряется. Для таких случаев нужна очередь загрузки, которая пишет сразу в бакет, минуя локальный диск.
💡 После переноса медиафайлов в S3 не удаляйте локальные копии сразу — убедитесь что все URL корректно обновились. Общая схема тестирования сайта до смены DNS описана в статье синхронизация серверов через rsync, а перенос самих файлов сайта — в статье перенос файлов rsync и scp.