Docker

Практичні нотатки про Docker у щоденній розробці: контейнери, Docker Compose, локальні середовища, multi-PHP конфігурації, робота з сервісами та оптимізація development workflow.

database-can-roll-back-s3-cannot-cleaning-up-files-after-failure-cover.png

База даних може зробити rollback, S3 - ні: як не залишати зайві файли після помилки

DB::transaction() може відкотити SQL, але не скасує вже виконаний S3 request. Тому роботу з файлами треба будувати через staging, компенсаційне очищення, afterCommit і повторюваний cleanup.

107
why-upload-and-read-urls-should-have-different-expiration-times-cover.png

Чому посилання на завантаження і читання мають різний строк дії

Підписані URL для запису і читання можуть використовувати той самий S3-механізм, але вони дають різні права і мають різний ризик. Тому я не використовую для них один спільний строк дії.

112
direct-s3-uploads-large-files-do-not-need-to-pass-through-php-cover.png

Пряме завантаження у S3-сховище: чому великий файл не варто пропускати через PHP

Для великого файла PHP не обов’язково має бути посередником у передаванні кожного байта. Застосунок може перевірити право, визначити шлях і видати короткоживучий дозвіл, а браузер завантажить файл безпосередньо у S3-сумісне сховище.

95
temporary-urls-for-private-files-in-laravel-cover.png

Тимчасове посилання на приватний файл у Laravel: як працює temporaryUrl()

Приватному файлу не потрібна постійна публічна адреса. Laravel може створити короткоживуче підписане посилання лише тоді, коли користувачу справді дозволено отримати файл.

103
private-s3-storage-from-the-start-do-not-make-files-public-cover.png

Приватне S3-сховище з самого початку: не робити файли публічними лише для зручності

Якщо файл у production має бути приватним, локально я теж перевіряю приватний сценарій. Відкритий бакет може спростити розробку, але водночас приховати помилки в контролі доступу, тимчасових посиланнях і самій моделі роботи з файлами.

103
why-i-test-minio-from-the-application-container-not-only-the-browser-cover.png

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

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

118
use-minio-locally-without-changing-production-laravel-configuration-cover.png

Як використовувати MinIO локально, не змінюючи production-конфігурацію Laravel

Локальний MinIO не повинен вимагати окремої версії filesystems.php або умов у коді. Я залишаю одну S3-конфігурацію Laravel для всіх середовищ, а адресу сховища, облікові дані, бакет і режим адресації задаю через змінні середовища.

112
connect-minio-to-laravel-through-the-standard-s3-disk-cover.png

Як підключити MinIO до Laravel через стандартний S3 disk

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

123
why-localhost-does-not-work-between-docker-containers-cover.png

Чому localhost не працює між контейнерами Docker

У браузері localhost:9001 може відкривати MinIO, але той самий localhost усередині Laravel-контейнера вже означає сам контейнер застосунку. Розбираю, чому так відбувається і як контейнери знаходять один одного через мережу Docker.

158
composer-private-gitlab-docker-ssh-clone-fails-cover.png
Laradock

Composer + приватний GitLab пакет у Docker: чому ssh -T працює, а composer install не може клонувати

Під час deployment ICanUp Composer не зміг клонувати приватний GitLab пакет і показав згенеровану помилку Failed to clone. При цьому ssh -T git@gitlab.com усередині Docker успішно впізнавав мій GitLab account. Розбираю, чому цього тесту недостатньо, як окремо перевірити SSH агента, доступ саме до репозиторію, контекст виконання Composer і URL репозиторію.

181