🩺

Приёмник crash-отчётов для своих приложений

OshaPlay и VPN-клиент присылают падения и журналы на собственные серверы

Собственные приёмники отчётов о падениях и журналов для плеера OshaPlay и VPN-клиента: данные идут на свой сервер по токену, секреты маскируются на устройстве, при обрыве связи отчёт ждёт очереди.

В продакшене · собственный продукт
2 приёмника
один для плеера OshaPlay, один для VPN-клиента, оба на собственных серверах
0 секретов
в отчётах VPN-клиента: UUID, ссылки подписок и ключи маскируются на устройстве
90 дней
хранение отчётов OshaPlay, общий объём не больше 800 МБ

Задача

У собственных приложений, OshaPlay и VPN-клиента, есть тестеры с телефонами и компьютерами. На сообщение «у меня не работает» разработчик ничего сделать не может: нужны журнал, версия, состояние сети и причина падения. При этом отчёт не должен стать утечкой: в журнале VPN-клиента могут оказаться ссылки подписок и ключи, а в отчёте плеера — сведения о телефоне и наушниках.

Ещё одно условие — отчёты не должны отдавать сторонним сервисам. Данные тестеров живут на серверах разработчика.

Решение

Два приёмника отчётов, по одному на приложение. Приложение само собирает диагностику, очищает от секретов на устройстве и отправляет по токену. Что сделано:

  • Приёмник OshaPlay: принимает журнал, падения и отчёты ЦАПа сжатым файлом до 5 МБ, хранит 90 дней в пределах 800 МБ.
  • Приёмник VPN-клиента на входной ноде стенда: принимает четыре вида отчётов (crash, log, probe, user).
  • Очередь на диске в VPN-клиенте: до 20 файлов и 50 МБ, отчёты досылаются при возвращении связи.
  • Маскирование секретов при записи журнала, а не при получении на сервере.
  • Режим тестера: автоматические отчёты о пробах, падениях и аномалиях, включён по умолчанию и служит согласием на отправку.
  • Скрипты разработчика: чтение отчётов OshaPlay с сервера и забор отчётов VPN-клиента на рабочую машину.
  • Проверка живости приёмника OshaPlay входит в общую проверку сервера сайтов.

Как это устроено

Приём по токену, без выдачи наружу

Приёмник — небольшая программа на Python в Docker-контейнере. Токен нужен на приём: без него отчёт не принимается. Наружу отчёты не отдаются, читает их только разработчик с сервера. Приёмник OshaPlay стоит за общим входным nginx сервера сайтов, приёмник VPN-клиента — на входной ноде стенда. Тот же сервер сайтов раздаёт выпуски плеера для самообновления.

Маскирование секретов на устройстве

Маскирование (замена значений на метки) выполняет клиент при записи журнала. Ссылки подписок, ключи vless:// и подобные, UUID, пароли, токены и Bearer-заголовки заменяются ещё до записи, поэтому перехваченный или сохранённый отчёт секретов не раскрывает. Правила покрыты тестами на обеих платформах, а после первой отправки проверены на настоящих отчётах на сервере.

Очередь на диске и защита от шума

Если приёмник недоступен, VPN-клиент кладёт отчёт в очередь на диске: до 20 файлов и 50 МБ. Автоматические отчёты одного вида уходят не чаще раза в 5 минут. Ответ приёмника 413 отбрасывает отчёт, а ответ 403 останавливает отправку до перезапуска приложения. Плеер OshaPlay поступает проще: без сети отчёт ждёт следующего запуска.

Что внутри отчёта

В отчёте VPN-клиента — шапка с состоянием сети, питания, памяти и сеанса. Журналы приложения и ядра записаны в одном формате строки, ядро пишет в файл с ротацией: 5 файлов по 5 МБ. В отчёте OshaPlay — журнал до 5 МБ, модель и прошивка телефона, звуковые выходы и входы, аудиодекодеры, подключённые наушники, отчёт проверки ЦАПа и накопленная статистика прослушивания. Файлы музыки не отправляются.

Когда уходит отчёт

OshaPlay отправляет отчёт раз в 12 часов, после падения — при следующем запуске, при ошибке воспроизведения — сразу; есть и кнопка «Отправить отчёт разработчику». VPN-клиент на кнопке «Отправить диагностику» присылает архив с журналами приложения и ядра, а в режиме тестера сам сообщает о проблемных входах и аномалиях: петле переподключений, сбое ядра, скачке задержки втрое, росте памяти вдвое.

Результат

  • Два приёмника работают в продакшене: для плеера OshaPlay и для VPN-клиента.
  • Отчёты VPN-клиента на сервере не содержат ни одного UUID, пути подписки или ссылки подписки: проверено на настоящих отчётах.
  • Архив «Отправить диагностику» с эмулятора дошёл до приёмника и принёс оба журнала без секретов.
  • Отчёты OshaPlay используются для разбора реальных сбоев: причину заикания звука при погасшем экране нашли по отчётам с телефона.

Технологии: что и зачем

  • Python — код приёмника.
  • Docker — упаковка и запуск приёмника отдельным контейнером.
  • nginx — входной сервер с HTTPS, через него отчёты попадают в приёмник.
  • Токен на приём — доступ только у своих приложений; ключ хранится вне репозитория.

Статус

В продакшене. Приёмник OshaPlay добавлен в выпуске сервера сайтов 1.11.0 от 28 сентября 2026 года; актуальная версия сервера сайтов — 1.16.0 от 29 сентября 2026 года. Приёмник VPN-клиента работает на входной ноде стенда и принимает отчёты клиентов Android, Windows и Windows 7.

Известное ограничение по README VPN-клиента: пока входная нода недоступна, отчёты ждут в очереди на диске и не теряются до заполнения очереди. Режим тестера включён по умолчанию, потому что все сборки пока тестовые; для публичного выпуска его нужно выключить.

Вопросы по проекту

Как собирать отчёты о падениях приложения без сторонних облачных сервисов?
Приложение само отправляет журнал, версию, состояние сети и причину падения на приёмник, который стоит на собственном сервере. Отправка идёт по токену, а разработчик читает отчёты скриптом. Так вместо «у меня не работает» в чате приходит набор данных для разбора, и все они остаются у владельца.
Какие отчёты принимает приёмник VPN-клиента?
Четыре вида: падение (crash), журнал по кнопке «Отправить диагностику» (log), результаты проб входов (probe) и сообщение пользователя (user). Режим тестера, включённый по умолчанию, ещё присылает автоматические отчёты о падениях и аномалиях: петля переподключений, сбой ядра, скачок задержки втрое.
Могут ли в отчёт попасть ключи и ссылки подписок?
В отчёты VPN-клиента нет: ссылки подписок, ключи, UUID, пароли и токены маскируются на устройстве при записи журнала, до отправки. Проверено на настоящих отчётах на сервере: ни UUID, ни пути подписки, ни ссылки там нет. В отчётах OshaPlay музыкальные файлы не отправляются вовсе.
Что будет, если приёмник недоступен?
В VPN-клиенте отчёты складываются в очередь на диске (до 20 файлов и 50 МБ) и уходят, когда приёмник вернётся. Плеер OshaPlay при отсутствии сети оставляет отчёт до следующего запуска. Отправка не блокирует работу приложения.
Сколько хранятся отчёты и кто их видит?
Приёмник OshaPlay хранит отчёты 90 дней, общий объём не больше 800 МБ, размер одного отчёта — до 5 МБ в сжатом виде. Наружу отчёты не отдаются: читает их только разработчик. Приём закрыт токеном.
Можно ли заказать такой приёмник для приложения своей команды?
Да. Схема переносится на другое приложение: нужны формат отчёта, токен, очередь отправки на устройстве и небольшой сервис на Python в Docker за nginx. Обе реализации, для плеера и для VPN-клиента, уже работают в продакшене.

Нужно похожее?

Расскажите о задаче — покажем, как решали такое, и прикинем объём работ.