Приёмник crash-отчётов для своих приложений
OshaPlay и VPN-клиент присылают падения и журналы на собственные серверы
Собственные приёмники отчётов о падениях и журналов для плеера OshaPlay и VPN-клиента: данные идут на свой сервер по токену, секреты маскируются на устройстве, при обрыве связи отчёт ждёт очереди.
Задача
У собственных приложений, 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-клиента?
Могут ли в отчёт попасть ключи и ссылки подписок?
Что будет, если приёмник недоступен?
Сколько хранятся отчёты и кто их видит?
Можно ли заказать такой приёмник для приложения своей команды?
Ещё по этому направлению
OshaVPN: VPN-клиент для Android, Windows 10/11 и Windows 7
собственное приложение на замену NekoBox, Hiddify и v2rayNG — на тестировании у пользователей
OshaPlay: аудиофильский плеер для Android
bit-perfect вывод на USB-ЦАП и аудиокниги — собственный продукт, версия 0.10.0
Нужно похожее?
Расскажите о задаче — покажем, как решали такое, и прикинем объём работ.