Skip to content

Помилки в браузері ​

Зроблено й перевірено локально 8 листопада 2026 (SHIF-43; стандартні імена, мережевий шум і секрет для source maps — SHIF-44) · не розгорнуто: у prod і dev значень поки немає, тож звідти нічого не надсилається

Застосунок, застосунок адміністратора й сайт уміють надсилати помилки, що сталися в браузері людини, а застосунок і сайт — ще й помилки, поки їхній сервер готує сторінку, до нашого власного збирача помилок (GlitchTip, він розуміє протокол Sentry), — але лише якщо збірка отримала ключ цього застосунку й одне з трьох імен середовища. Без них надсилання вимкнене й нічого не йде.

Помилки надсилаються, щоб їх виправляти, а не щоб читати, що люди написали: ні тексту чатів, ні полів форм, ні email, ні query string, а користувач — лише за id.

Досі помилку в браузері бачив лише той, хто сидів перед екраном. Помилки API — окреме завдання (SHIF-42), їх на цій сторінці немає.

Що надсилається, а що ні ​

НадсилаєтьсяНе надсилається
Помилки всередині екрана (компонента)Відмови, які людині вже показано: будь-яка відповідь API 4xx (неправильний пароль, конфлікт, немає сторінки)
Необроблені помилки й необроблені відхилення промісівСкасовані запити (AbortError), наприклад коли людина йде зі сторінки; запити, що не отримали жодної відповіді, і мережеві помилки самого браузера («Failed to fetch», «Load failed» тощо)
Помилки під час переходу між сторінками й під час завантаження частини застосункуПомилки з розширень браузера (chrome-extension://, moz-extension:// тощо)
Відповідь API 5xx, яку ніхто не обробив—

Перед надсиланням помилку очищено: прибрано тіла запитів, cookie й усі заголовки, крім user agent браузера; з кожної адреси відрізано query string і фрагмент; email і токени в повідомленнях замінено; вивід консолі, введене з клавіатури, значення на екрані (props компонентів) і стан форм не додаються; від користувача лишається id (його ставить вхід у застосунок і в застосунок адміністратора); ім'я машини сервера не надсилається; рядки вихідного коду й значення змінних зі стека не додаються. Сесій, трасування продуктивності (tracesSampleRate: 0) й запису екрана немає, і до запитів в API не додаються заголовки трасування: у GlitchTip немає сесій, а потрібні лише помилки.

Застосунок і сайт спершу готують кожну сторінку на своєму сервері (серверне відмальовування); помилка на цьому кроці теж надсилається, за тими самими правилами: від запиту лишаються лише шлях і user agent браузера, ніколи тіло, cookie чи інші заголовки. Відповіді сервера 4xx (наприклад, немає сторінки) не надсилаються. Застосунок адміністратора цілком малюється в браузері; його сервер лише віддає порожню сторінку, свого там надсилати нічого.

Як увімкнути ​

Кожен застосунок має власний ключ, а імена змінних — ті самі, що в розгортанні; їх перелічено в його .env.example (app/, admin/, website/), а для всіх чотирьох частин разом з API — у Відстеженні помилок (GlitchTip). Значень у репозиторії немає.

ЗміннаКолиЩо
APP_SENTRY_DSN, ADMIN_SENTRY_DSN, WEBSITE_SENTRY_DSNзбірка; застосунок і сайт — ще й запускКлюч застосунку в GlitchTip, один для браузера й сервера. Порожньо — надсилання вимкнене, бібліотека помилок навіть не запускається. Dockerfile передає його в Nuxt як NUXT_PUBLIC_SENTRY_DSN.
SENTRY_ENVIRONMENTзбірка й запускРівно prod, dev або local. Порожньо чи будь-яке інше значення — теж вимкнено; ім'я бібліотеки за замовчуванням, «production», не надсилається ніколи. GlitchTip зберігає кожне побачене ім'я середовища назавжди, тому їх лише три. Локальний запуск (make dev, ./orca/run.sh) завжди ставить local.
SENTRY_RELEASEзбіркаGit-коміт, з якого зроблено збірку. Якщо порожньо, збірка бере коміт із git, коли репозиторій є (локально); у збірці Docker його немає, там значення треба передати, інакше в помилки не буде релізу.
SENTRY_AUTH_TOKENзбірка, секретЗавантажує source maps (вони перетворюють мініфікований код назад на читабельні рядки) до GlitchTip. Лише BuildKit secret (id=SENTRY_AUTH_TOKEN), ніколи не build argument, тож його немає ні в образі, ні в його метаданих. Без нього нічого не завантажується й збірка не падає. З ним обов'язкові SENTRY_ORG (dreamvention) і APP_/ADMIN_/WEBSITE_SENTRY_PROJECT (shiffty-app, shiffty-admin, shiffty-website). SENTRY_URL за замовчуванням вказує на наш GlitchTip.

Source maps робляться для браузерного коду, але ніколи не віддаються: збірка видаляє всі файли .map з того, що роздає сервер, а в коді немає посилання на них. Невдале завантаження друкується в журналі збірки й збірку не зупиняє.

Як перевірено ​

8 листопада 2026, у робочій копії: unit-тести фільтрів і очищення в кожному з трьох застосунків, зокрема справжню бібліотеку помилок для браузера й для сервера (5xx іде, 4xx і скасований запит — ні, сесія не надсилається, запит очищено, а без ключа не надсилається взагалі нічого); production-збірки всіх трьох без файлів .map у тому, що роздається; зібраний сервер, що впав під час відмальовування сторінки, — його помилку впіймала локальна заміна GlitchTip, і вона чиста; і тестові помилки із середовищем local і тегом із ключем завдання до GlitchTip — із браузера від кожного застосунку й від серверного відмальовування застосунку й сайту, — усі вони там є. Ще раз 8 листопада 2026 для SHIF-44, у робочій копії із середовищем local і тегом task=SHIF-44: у браузері кожного застосунку необроблена помилка й необроблене відхилення пішли до GlitchTip (відповідь 200), а невдалий запит на недоступну адресу, скасований запит, 404 і запит без відповіді — ні; хибний пароль на сторінці входу показав своє повідомлення й нічого не надіслав; query string сторінки (?token=…) і рядок, записаний у консоль, до подій не потрапили, а подія застосунку адміністратора несла id адміністратора й більше нічого про нього. Ті самі дві помилки із серверної половини застосунку й сайту, справжньою бібліотекою помилок під Node, теж пішли, без імені машини. Docker-збірка застосунку з токеном як build secret і недоступним GlitchTip пройшла, невдале завантаження надруковано; токена немає ні в журналі збірки, ні в історії образу, ні в його файлах. У prod і dev нічого не перевірялося: там значення ще не задано.

Що читати далі ​