Помилки в браузері
Зроблено й перевірено локально 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 нічого не перевірялося: там значення ще не задано.
Що читати далі
- Огляд DevOps: що розгорнуто, а що ні.
- Архітектура: застосунки, про які ця сторінка.