До основного вмісту

Міграція даних у 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.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці