Порядок перенесення в об'єктне сховище без бітих посилань
Головна помилка під час переїзду на 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.