Блог

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

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
laravel-route-cache-localization-package-production-check-cover.png
Ларавель

Laravel route:cache після інтеграції localization package: що я перевірила в ICanUp

Після інтеграції власного localization package в ICanUp мені було недостатньо просто побачити, що Laravel route:cache завершується без помилки. Я перевірила реальні localized routes, logical route names, default locale без префікса, /en, locale switch, redirects, параметри URL і роботу застосунку після повторного завантаження cached routes.

23
laravel-robots-txt-sitemap-canonical-production-seo-checklist-cover.png

Laravel robots.txt, sitemap і canonical: мій production SEO checklist

У ICanUp robots.txt, sitemap і canonical з'являлися не одночасно, але на production вони мають описувати один і той самий набір публічних URL. Я зібрала свій практичний SEO checklist: що дозволяємо сканувати, що додаємо в sitemap, який URL оголошуємо canonical і як перевіряю все це через raw HTML та HTTP-відповіді після deploy.

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

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

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

24
laravel-open-graph-inertia-ssr-linkedin-telegram-preview-cover.png

Laravel Open Graph + Inertia SSR: чому LinkedIn показував прев'ю інакше, ніж Telegram

У ICanUp Telegram уже показував обкладинку, заголовок і опис Post, але LinkedIn формував картку некоректно. Я перевірила Open Graph у початковому HTML, відповідь для LinkedInBot, URL і параметри зображення, дублікати meta tags та кеш платформи. Цей кейс показав, чому робота прев'ю в одному месенджері ще не доводить, що social metadata налаштовані правильно.

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

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

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

34
inertia-js-infinite-scroll-page-2-replaced-posts-cover.png
Inertia.js

Inertia.js Infinite Scroll: чому page=2 замінила вже завантажені пости

У списку постів Infinite Scroll працював до моменту завантаження page=2: нові записи приходили, але пости з першої сторінки зникали. Розбираю реальний кейс ICanUp - різницю між заміною та додаванням даних, захист від дублів, стан пагінації та правильне скидання списку при зміні фільтра, категорії або локалі.

50
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
laravel-breadcrumblist-json-ld-real-blog-cover.png

Laravel BreadcrumbList JSON-LD у реальному блозі

У ICanUp visible breadcrumbs і BreadcrumbList JSON-LD описують одну й ту саму hierarchy сторінки. Показую, як я пов’язую навігацію зі structured data, формую sequential positions, використовую localized canonical URLs і не додаю окрему SEO hierarchy поверх application breadcrumbs.

33
laravel-blogposting-jsonld-author-canonical-localized-metadata-main.png

Laravel JSON-LD BlogPosting: author, canonical і localized metadata

У ICanUp JSON-LD BlogPosting пов’язує статтю не тільки з SEO metadata, а й з реальною author entity. Показую, як я представила автора як Person, узгодила structured data з canonical URL і localized metadata та чому JSON-LD має рендеритися одразу в SSR HTML.

44
laravel-x-default-hreflang-default-locale-cover.png

Laravel x-default hreflang: що саме я зробила для default locale

У multilingual Laravel-проєкті x-default легко сприйняти як ще одну мовну версію сторінки. У ICanUp я використовую його інакше: x-default вказує на URL default locale. Розбираю реальний HreflangService, зв’язок із canonical та edge cases для різних content types.

35