Блог

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

google-oauth-and-email-verification-when-authentication-flows-should-differ.png
Ларавель

Google OAuth і підтвердження email: коли способи входу повинні мати різні сценарії

Парольний вхід і Google OAuth можуть давати різні гарантії щодо email, тому одна перевірка після входу не завжди правильна. Розбираю, коли локальне підтвердження email потрібне, коли його можна не дублювати і чому вимкнене підтвердження email не повинно випадково блокувати OAuth-користувачів.

10
how-automatic-ssh-tunnels-can-lock-you-out-of-your-own-server.png
DevOps

Як автоматичні SSH-тунелі можуть заблокувати доступ до власного сервера

SSH може перестати приймати нові підключення, хоча сервер доступний, сайт працює, а sshd активний. Одна з неочевидних причин - автоматичні тунелі, які після розриву з’єднання перепідключаються занадто часто й потрапляють під UFW LIMIT.

11
telegram-shows-the-open-graph-image-but-linkedin-does-not-debugging-social-preview-caches.png
Фронтенд

Telegram показує Open Graph-зображення, а LinkedIn ні: як діагностувати кеш попереднього перегляду

Одна платформа може вже показувати нове Open Graph-зображення, а інша ще тримати старий попередній перегляд. Це не завжди означає помилку в meta tags. Перевіряти потрібно окремо HTML, SSR, доступність og:image, HTTP-відповідь і кеш конкретного робота.

13
why-unknown-source-does-not-always-mean-your-analytics-is-broken.png
Ларавель

Чому невідоме джерело не завжди означає, що аналітика зламана

Відсутнє джерело переходу не завжди означає втрату даних. Прямий вхід, скопійоване посилання, месенджер, мобільний застосунок або видалений Referer можуть чесно залишити джерело невідомим. Головне - відрізняти об’єктивно невідоме походження від помилки власного відстеження.

14
upgrading-php-for-one-dockerized-project-without-breaking-another.png
DevOps

Як оновити PHP для одного Docker-проєкту і не зламати інший

Коли на одній машині живе кілька Docker-проєктів, оновлення PHP має залишатися локальною зміною конкретного середовища. Ізольований runtime, окремі workspace-контейнери, зрозумілі імена сервісів і перевірка Composer-сумісності допомагають не перетворити оновлення одного проєкту на приховану поломку іншого.

24
a-deployment-is-not-successful-until-the-application-passes-a-health-check.png
DevOps

Розгортання не завершене, доки застосунок не пройшов перевірку працездатності

Успішно виконані команди розгортання ще не доводять, що застосунок працює. Після переключення потрібно перевірити HTTP-відповідь, критичні сервіси та фонові процеси, а при помилці - відкотити версію й перевірити вже результат відкату.

20
run-deployment-preflight-before-maintenance-mode-not-after.png
DevOps

Перевіряйте розгортання до режиму обслуговування, а не після

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

22
when-a-read-only-admin-page-should-query-the-settings-table-directly.png
Ларавель

Коли сторінці адмінки краще читати таблицю Settings напряму

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

30
why-websockets-should-not-be-the-only-source-of-truth-for-unread-notifications.png
Ларавель

Чому WebSocket не повинен бути єдиним джерелом правди для непрочитаних сповіщень

WebSocket добре підходить для миттєвого оновлення інтерфейсу, але подія може бути пропущена. Вкладка могла спати, мережа могла зникнути, ноутбук - прокинутися після паузи. Тому оперативні події варто поєднувати з HTTP-оновленням, яке відновлює фактичний стан.

34
one-off-import-scripts-are-production-code-too.png
DevOps

Одноразовий скрипт імпорту теж є production кодом

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

31