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 ничего не проверялось: там значения ещё не заданы.

Что читать дальше ​