0% прочитано

Чому я перевіряю MinIO з контейнера застосунку, а не лише через браузер

Відкрита веб-консоль MinIO ще не доводить, що Laravel бачить S3-сумісний API. Я перевіряю саме той мережевий шлях, яким користуватиметься застосунок: від його контейнера до minio:9000.

9 жовтня 2026 р. 8 хв читанняLaradock

Після запуску MinIO я могла відкрити його веб-консоль у браузері. На перший погляд це виглядало як достатнє підтвердження: контейнер працює, порт відповідає, MinIO доступний.

Але Laravel не звертається до MinIO тим самим шляхом, що й браузер.

Браузер працює на моєму комп’ютері, а PHP виконується всередині контейнера.

Як я вже розбирала окремо, localhost усередині контейнера означає сам контейнер.

Тому для перевірки сховища мені важливо тестувати не лише MinIO взагалі, а саме маршрут, яким користуватиметься застосунок.

Відкрита веб-консоль доводить, що працює шлях від браузера до MinIO. Вона не доводить, що контейнер Laravel може звернутися до S3-сумісного API.

Браузер і Laravel перевіряють два різні мережеві шляхи

Один MinIO, але два різні маршрути
Шлях 1 Browser   |   | localhost:9001   vHost port   |   vMinIO Console  Шлях 2 Laravel container   |

Обидва маршрути закінчуються в MinIO, але проходять через різні частини мережі.

У першому випадку Docker публікує порт для комп’ютера.

У другому випадку два контейнери спілкуються через внутрішню мережу Docker.

Тому успіх першого маршруту не є перевіркою другого.

Що насправді доводить відкрита MinIO Console

Якщо в браузері відкривається http://localhost:9001, я знаю кілька корисних речей:

  • контейнер MinIO запущений;
  • веб-консоль слухає свій порт;
  • порт опублікований на комп’ютер;
  • маршрут від браузера до цього порту працює.

Але я ще не знаю, чи ім’я minio знаходиться з контейнера застосунку, чи доступний порт 9000 і чи може Laravel дістатися S3-сумісного API.

Для перевірки з контейнера використовую /minio/health/live

Перевірка з середовища застосунку
curl -i \  http://minio:9000/minio/health/live

Цю команду важливо виконати саме в контейнері, з якого Laravel буде звертатися до MinIO.

Адреса minio:9000 перевіряє внутрішнє ім’я сервісу та порт S3-сумісного API.

Шлях /minio/health/live дає просту перевірку того, що сервіс живий і відповідає через потрібний мережевий маршрут.

Що означає успішна відповідь 200

Перевірено саме потрібний мережевий маршрут
Application container        |        | resolves "minio"        vDocker network        |        | reaches port 9000        vMinIO        |        | /minio/health/live        v200 OK

Успішна відповідь уже доводить значно більше, ніж просто відкрита веб-консоль.

Контейнер застосунку зміг знайти сервіс minio, встановити з’єднання з портом 9000 і отримати відповідь від MinIO.

Тобто базова мережева передумова для Laravel Filesystem уже виконана.

Але health endpoint ще не перевіряє весь S3-сценарій

Мережева перевірка є лише одним шаром
Health check перевіряє: - service name- Docker network- port 9000- MinIO availability  Health check ще не перевіряє: - credentials- bucket- S3 permissions- Laravel Filesystem config- object read/write

Це важливе обмеження.

200 OK від /minio/health/live не означає, що Laravel уже правильно налаштував облікові дані або має доступ до потрібного бакета.

Перевірка стану відповідає лише на мережеве питання: чи може потрібне середовище дістатися MinIO.

Наступним шаром я окремо перевіряю роботу через Laravel Storage.

Після мережі перевіряю вже Laravel Filesystem

Перевірка вже через Laravel
Storage::disk('s3')->put(    'checks/minio.txt',    'MinIO works',); Storage::disk('s3')->exists(    'checks/minio.txt',);

Коли мережевий маршрут уже підтверджений, я переходжу до наступного шару: підключення MinIO через стандартний S3 disk.

Тут перевіряються вже облікові дані, бакет, S3-конфігурація і реальна операція з об’єктом.

Завдяки такій послідовності я не змішую мережеву проблему з помилкою Laravel Filesystem.

Я перевіряю знизу вгору, а не все одразу

Кожен крок перевіряє окремий шар
1. Container running? 2. Service name resolves? 3. Port 9000 reachable? 4. /minio/health/live returns 200? 5. Laravel config correct? 6. Credentials accepted? 7. Bucket exists? 8. Storage::put() works?

Мені подобається така послідовність, бо кожна помилка звужує область пошуку.

Якщо не знаходиться ім’я minio, немає сенсу змінювати S3 credentials.

Якщо /minio/health/live відповідає, але Storage::put() падає, мережа вже значно менш імовірна причина.

Так діагностика стає послідовною, а не набором випадкових змін конфігурації.

Якщо MinIO не знаходиться, окремо перевіряю ім’я сервісу

Перевірка імені сервісу з контейнера
getent hosts minio

Якщо ця команда не знаходить minio, проблема виникає ще до HTTP.

Я перевіряю, чи обидва контейнери підключені до потрібної мережі Docker і чи справді сервіс має ім’я minio.

Лише після цього має сенс перевіряти сам порт.

Правильне ім’я ще не гарантує доступність порту

Можлива й інша ситуація: minio успішно знаходиться, але звернення до 9000 не працює.

Тоді вже дивлюся, чи сервіс запущений, який порт він слухає і чи використовую внутрішній порт контейнера, а не номер, призначений лише для доступу з комп’ютера.

Тобто пошук імені та доступність порту я теж не змішую в одну перевірку.

Перевірку варто виконувати з того самого середовища, що й реальний код

Якщо Laravel виконується в одному контейнері, а я запускаю curl на своєму комп’ютері, я знову перевіряю інший маршрут.

Тому найкорисніша діагностична команда виконується саме там, де потім працюватиме PHP.

Це правило корисне не тільки для MinIO. Воно так само працює для Redis, бази даних, поштового сервісу та інших залежностей у Docker.

Браузерна перевірка все одно корисна, просто вона відповідає на інше питання

Я не відмовляюся від перевірки веб-консолі.

Вона зручна, щоб переконатися, що MinIO запущений, зайти в бакет, побачити об’єкти та перевірити локальні налаштування.

Просто я не використовую її як доказ того, що Laravel уже має робочий шлях до S3 API.

Що я перевіряю, коли Laravel не бачить MinIO

Мій короткий список:

  • Чи контейнер MinIO запущений?
  • Чи веб-консоль відкривається з комп’ютера?
  • Чи контейнер застосунку знаходить ім’я minio?
  • Чи обидва сервіси мають спільну мережу Docker?
  • Чи використовується внутрішній порт 9000?
  • Чи /minio/health/live відповідає з контейнера застосунку?
  • Чи Laravel використовує правильний AWS_ENDPOINT?
  • Чи правильні credentials і bucket?
  • Чи працює реальний запис через Storage::disk('s3')?

Я перевіряю не сервіс взагалі, а той шлях, яким користується застосунок

Відкрити MinIO в браузері корисно, але цього недостатньо для перевірки Laravel.

Браузер і контейнер застосунку приходять до MinIO різними мережевими шляхами.

Тому я окремо запускаю перевірку http://minio:9000/minio/health/live саме з середовища застосунку.

Якщо вона проходить, я вже знаю, що Docker-ім’я, мережа і порт працюють.

Після цього можна переходити на наступний рівень і перевіряти credentials, bucket та Laravel Filesystem.

Хороша перевірка відтворює шлях реального коду, а не лише доводить, що сервіс доступний звідкись.

Якщо залежність потрібна контейнеру застосунку, найважливіша перевірка починається саме з цього контейнера.