DevOps

DevOps для мене - це не окрема професія, а набір практик, які роблять розробку передбачуванішою та комфортнішою. У цій категорії я ділюся спостереженнями про автоматизацію, CI/CD, деплой, інфраструктуру та інструменти, з якими працюю під час створення власних і комерційних проєктів.

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 репозиторію.

11
vite-eacces-laravel-node-modules-vite-root-owned-cover.png
Laradock

Vite EACCES у Laravel: чому node_modules/.vite стає власністю root і як це виправити

Під час локальної роботи з Laravel і Vite я отримала EACCES: permission denied для node_modules/.vite/deps/package.json. Причина виявилася не у Vite, а у власнику файлів: частину кешу раніше створив root через Docker або команду з sudo. Розбираю, як знайти такі файли, коли достатньо видалити .vite, коли потрібно виправити ownership усього node_modules і як не повторити проблему в Laradock.

24
geoip-analytics-without-storing-ip-addresses-cover.png
Nginx

GeoIP-аналітика без збереження IP: Nginx + MaxMind і довірений заголовок

Для статистики ICanUp мені була потрібна країна відвідувача, але я не хотіла зберігати його IP-адресу або викликати зовнішній GeoIP API на кожен перегляд. Я перенесла визначення країни на рівень Nginx і MaxMind, а Laravel отримує лише нормалізований дволітерний код через довірений внутрішній заголовок.

25
jira-gitlab-merge-request-status-automation-cover.png
CI/CD

Jira + GitLab Merge Requests: як я автоматизувала статуси задач і не зламала процес

У ICanUp я хотіла автоматично рухати Jira-задачу після створення та merge GitLab Merge Request, але не віддавати автоматизації весь життєвий цикл задачі. Розбираю, чому залишила лише два автоматичні переходи, як перевіряю target branch і поточний статус та чому повторний webhook не повинен рухати задачу вдруге.

34
docker-build-cache-almost-30-gb-cover.png
Docker

Docker Build Cache зайняв майже 30 GB: як я знайшла, що з'їло диск

Під час локального запуску AVN Documentation AI мій диск майже закінчився. Docker Build Cache виріс приблизно до 29 GB, images займали ще понад 31 GB, а filesystem дійшов до 99-100%. Показую, як я знайшла причину, чому звичайний prune майже не допоміг і як контрольовано звільнила десятки гігабайтів.

33
vite-environment-variables-laravel-gitlab-ci-deployments.png
CI/CD

Vite environment variables у Laravel deployment: чому server .env було недостатньо

На сервері всі VITE_REVERB_* значення були в .env, але production bundle усе одно збирався без них. Розбираю, як я знайшла причину в GitLab CI build stage, перенесла build-time variables у правильний environment scope і додала fail-fast перевірки перед deployment.

67
laravel-ci-cd-real-project-pipeline-cover.png
CI/CD

CI/CD у Laravel-проєкті: що це і як він працює у моєму реальному проєкті

CI/CD для мене - це не просто автоматичний deploy. У своєму Laravel-проєкті я використовую pipeline, який послідовно перевіряє код, запускає тести, збирає frontend і тільки після цього дозволяє рухатися до deployment.

75
sectigo-ssl-nginx-dcv-renewal-debugging.png
Nginx

Як я продовжувала Sectigo SSL у Nginx і знайшла проблему з DCV

Під час продовження Sectigo SSL сертифікат довго залишався на DCV validation, хоча verification-файл повертав 200 OK. Розповідаю, як я знайшла старий token, розділені HTTP/HTTPS validation paths у Nginx і правильно завершила renewal.

67
composer-docker-gitlab-ssh-agent-forwarding.png
Laradock

Composer у Docker не має доступу до GitLab: як передати SSH Agent

На хості SSH до GitLab працює, але Composer усередині Docker просить username і password або повертає Permission denied (publickey). Показую на реальному Laradock-кейсі, як знайти причину та передати SSH Agent у container.

80