К основному содержимому

Миграция данных в S3 / MinIO Object Storage

Миграция · 05.02.2025 · 4 мин чтения
Иллюстрация к статье «Миграция данных в S3 / MinIO Object Storage»

Порядок переноса в объектное хранилище без битых ссылок

Главная ошибка при переезде на S3 или MinIO — сначала переключить приложение на новое хранилище, а потом начать копировать файлы. Часть посетителей в это время получает 404 на изображения и вложения. Правильный порядок обратный.

  1. Скопируйте все существующие файлы в бакет, пока приложение продолжает писать на локальный диск или в старое хранилище.
  2. Настройте плагин или код приложения на новое хранилище в тестовом режиме, не отключая старое.
  3. Проверьте, что новые файлы одновременно попадают в старое расположение и в бакет.
  4. Запустите финальную синхронизацию дельты — файлов, добавленных за время переноса.
  5. Переключите приложение на чтение только из бакета и оставьте старое хранилище как резерв на несколько дней.

Честно про время простоя: сам перенос файлов идёт без остановки сайта, а окно простоя нужно только на переключение конфигурации и финальную синхронизацию — обычно это 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 для подключения S3-бакета как локального диска: rclone mount minio:mybucket /mnt/s3 --daemon

Финальная синхронизация перед переключением

После первой полной заливки файлов сайт продолжает работать и создавать новые. Перед переключением запустите rclone sync ещё раз — команда скопирует только изменившееся, и окно простоя сократится до пары минут вместо часов на полную заливку.

WordPress + S3 Offload Media

ПлагинПровайдерыСтоимость
WP Offload Media LiteAWS S3, DigitalOcean, LinodeБесплатно
WP Offload Media ProВсе S3-совместимые$99/год
Media CloudS3, 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 хранилища

Откат при проблемах

  1. Не удаляйте локальные копии файлов сразу после переноса — держите их минимум неделю.
  2. Если ссылки на файлы массово не открываются, верните код приложения на локальное хранилище — данные там не удалены.
  3. Разберитесь с правами доступа или конфигурацией бакета и повторите переключение.

Когда это не подходит

Для сайтов с активной записью файлов пользователями в реальном времени (например, загрузка видео при просмотре) полная синхронизация не подходит без короткого окна блокировки записи — иначе часть файлов, добавленных во время финальной синхронизации, потеряется. Для таких случаев нужна очередь загрузки, которая пишет сразу в бакет, минуя локальный диск.

💡 После переноса медиафайлов в S3 не удаляйте локальные копии сразу — убедитесь что все URL корректно обновились. Общая схема тестирования сайта до смены DNS описана в статье синхронизация серверов через rsync, а перенос самих файлов сайта — в статье перенос файлов rsync и scp.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке