Всем привет! Снова на связи Александр, автор проекта Peakline. Несколько дней назад я опубликовал здесь статью о своем «швейцарском ноже» для анализа тренировок, который я пилил в свободное время. Я ожидал пары конструктивных комментариев и, может быть, нескольких новых пользователей.
Я жестоко ошибался.

Эффект Хабра в цифрах
Я лег спать, имея в базе данных 5 пользователей (включая меня и пару друзей). Проснулся через 5 часов — их было уже 21. К середине следующего дня — 52.
? Просто космос! Пока мы спали, наше сообщество совершило невероятный рывок.
? Уникальные посетители: 263 ➝ 702 (+167%)
? Счастливые атлеты: 8 ➝ 52 (рост +550%!)
? Тренировок проанализировано: 27 ➝ 125 (+363%)
? FIT-файлов создано: 4 ➝ 36 (невероятные +800%!)
Незваные гости: знакомимся с ботами-сканерами :)
Как только IP-адрес моего сервера стал публичным, я начал замечать в логах странную активность. Десятки, а затем и сотни запросов в минуту к несуществующим адресам: /wp-admin/, /xmlrpc.php, /wp-includes/wlwmanifest.xml и так далее.
Это были не заблудившиеся пользователи. Это была армия автоматизированных ботов, которые без устали сканируют весь интернет в поисках сайтов на WordPress с известными уязвимостями. Им все равно, что мой сайт написан на Python/FastAPI — они работают по принципу "стреляй во все, что движется".

Проблема: Эти запросы создают ненужный "шум" в логах, затрудняя поиск реальных проблем, и впустую тратят ресурсы сервера, отвечая на тысячи запросов ошибкой 404 Not Found.
Решение (Honeypot, или «Горшочек с мёдом»): Вместо того чтобы просто отбиваться, я решил немного "потроллить" этих ботов и заодно собрать о них информацию. Я добавил в FastAPI специальный обработчик, который "ловит" все запросы, не подошедшие ни под один другой эндпоинт.
Обнаружение: Скрипт проверяет, содержит ли URL-адрес запроса ключевые слова, типичные для сканеров (.php, wp-, /.env, /.git и т.д.).
Ответ-ловушка: Если запрос опознан как вредоносный, вместо стандартной ошибки 404 сервер отдает ему ответ с кодом 200 (OK) и остроумным текстом-меморандумом в стиле киберпанка. В нем говорится, что бот попал не по адресу, и что этот сервер "говорит на языке асинхронных воркеров и Pydantic, а не плагинов и тем".
Логирование: Самое главное — каждый такой "улов" записывается в лог с пометкой HONEYPOT HIT, включая IP-адрес бота и путь, который он искал.

Работа над ошибками: Экстренное тушение пожаров ?
Первые отзывы были как холодный душ — конструктивные, но безжалостные. Вот самые критичные вещи, которые я исправил в первые же 48 часов благодаря вашим репортам.
1. «Железобетонная» погода
Проблема: Мой код запрашивал у погодного API только почасовые данные. Для старых тренировок API их не отдавал, и блок с погодой просто не отображался.
Решение (двухэтапный fallback): Теперь, если нет почасовых данных, скрипт запрашивает среднесуточные (мин/макс температура, ветер).
Итог: Погода есть всегда. Либо точная, либо общая за день.

2. Верстка, которая не выдержала наплыва
«Уезжающая» страница: Самый массовый баг в моем проекте. На мобильных карта и график имели фиксированную ширину и растягивали страницу. Решено через max-width: 100%.
Негибкий футер: Та же проблема с прокруткой из-за логотипа Strava. Решено переключением футера в flex-direction: column на мобильных.
Мелочи: Поправлены наезжающие кнопки, неправильные фоны, добавлена подсказка для настройки зон пульса.

Новые фичи, рожденные из ваших идей
Самое ценное — это когда пользователи не просто находят баги, а предлагают, как сделать лучше. Вот что мы добавили за последние дни именно благодаря вам.
1. Внутренняя навигация по сегментам
Идея от пользователя: «Было бы круто со страницы тренировки переходить на анализ сегмента внутри Peakline, а не на Strava».
Реализация: Теперь названия сегментов в списке — это кликабельные ссылки на их детальную страницу peakline.com/segment/{id}. Удобно, без лишних переходов.

2. Починка «Секретного Клуба»
Ирония в том, что кнопка привязки Telegram для доступа к секретным фичам... не работала. В коде был баг. Теперь все исправлено, и доступ к экспериментальным функциям, вроде поиска создателя сегмента, действительно открывается.

Дорожная карта: Что дальше? План, созданный вами
Этот внезапный наплыв пользователей невероятно мотивирует и дает лучшее топливо для разработки — реальные потребности. Вот мой публичный план работ, основанный на ваших отзывах и идеях.
В ближайших планах (Short-Term):
-
Исправление багов:
Неправильное время в FIT-файлах: При указании кастомной цели (5м 30с) минуты парсятся как часы, а секунды как минуты. Это критично, исправлю в первую очередь.
Старая кнопка смены языка: На некоторых страницах остался старый, некрасивый переключатель. Унифицирую его везде.
Скачки скорости в GPX Fixer: Инструмент иногда генерирует некорректные пики скорости после удаления "телепортов". Нужно пересмотреть алгоритм сглаживания.
-
Улучшение UX:
Редизайн вывода AI-анализа: Сейчас ответ от Gemini выводится не совсем корректно на мобильных устройствах.
Окно с обновлениями (Changelog): Чтобы пользователи знали, что изменилось, буду показывать модальное окно при первом входе после обновления.
Более удобный футер: Сгруппирую ссылки "Политика конфиденциальности", "О проекте" и т.д. в одну выпадающую кнопку "Юридическая информация", чтобы не загромождать подвал.
Среднесрочные цели (Mid-Term):
-
Крупные фичи:
Страница клуба: Сделаю кликабельными карточки клубов в дашборде, чтобы можно было перейти на отдельную страницу с лентой активности этого клуба.
Износ снаряжения: Добавлю в раздел "Снаряжение" возможность указывать ресурс (например, для кроссовок) и отслеживать его износ.
Подробная история по сегментам: На странице анализа сегмента буду выводить таблицу со всеми вашими попытками на нем, чтобы можно было отслеживать прогресс.
Персональная тепловая карта (Heatmap): Интегрирую возможность построения личной тепловой карты активностей, как в Strava.
-
Демонстрация возможностей:
Готовая аналитика на главной: Добавлю на главную страницу пример полного AI-анализа моей тренировки, чтобы новые пользователи сразу видели, какой результат они получат.
Кнопка PWA-приложения: Интегрирую баннер "Установить приложение" для добавления Peakline на главный экран смартфона.
Постоянный процесс (Ongoing):
Аудит Rate-лимитов: Я уже защитил некоторые эндпоинты, но проведу полный аудит и установлю разумные ограничения на все "дорогие" запросы, чтобы защититься от DoS-атак и не сжечь бюджеты API.
Заключение
Спасибо Хабру и его сообществу! Вы не просто дали проекту путевку в жизнь, но и провели самый честный и массовый бета-тест, о котором я не мог и мечтать. Вы помогли сделать Peakline лучше буквально за несколько дней. Это невероятно крутое чувство.
Продолжаю работать для вас.
Комментарии (2)
cyberscoper Автор
21.06.2025 17:12Продолжайте следить за проектом. Я веду его сам, многое упускаю может вы меня в каких-то оплошностях направите:)
Вот на фото первая версия, да .. было грустно
Мой проект победит - без накрутки показателей и умалчивания.
urazaev90
Отличный разбор и крутой рост! Видно, сколько души и внимания к деталям вложено в проект. Особенно зацепил honeypot – простое, но элегантное решение. Идея внутренней навигации по сегментам – вообще топ, теперь пользоваться гораздо удобнее. Спасибо за честный тон и открытость к критике, это редкость.