Всем привет! Снова на связи Александр, автор проекта 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 лучше буквально за несколько дней. Это невероятно крутое чувство.
Продолжаю работать для вас.
Комментарии (7)
 - cyberscoper Автор21.06.2025 17:12- Продолжайте следить за проектом. Я веду его сам, многое упускаю может вы меня в каких-то оплошностях направите:) - Вот на фото первая версия, да .. было грустно - Мой проект победит - без накрутки показателей и умалчивания.  
 - anzay91121.06.2025 17:12- Вместо ханипота лучше разворачивать на выход с помощью fail2ban и персонального "списка ненависти" в ipset правилами вида: - -j REJECT --reject-with icmp-host-unreachable- Меньше нагрузка на сервер и плевать, что там читает бот-взломщик. Не читает. 
 - vzvzvz21.06.2025 17:12- Им все равно, что мой сайт написан на Python/FastAPI - Как они об этом узнают? - На любом сайте могут торчать наружу какие-нибудь легаси-грабли с возможно-ломаемыми админками. Вот и ищут. 
 - Yurik7421.06.2025 17:12- Привет, классный проект! Мне в страве тоже не все нравится, хоть у меня и платная подписка. В вашем проекте хороший дизайн - видно все ключевые области сразу и как-то проще ориентироваться, но есть несколько моментов, которые, как мне кажется, можно улучшить. - Не очень понял - какую ссылку надо вставлять в рабочем пространстве, может добавить описание что это должна быть тренировка или сегмент? - Также, когда залез свою тренировку - зоны пульса у меня почему-то не отобразались в нижних графиках, хотя на линейном они есть. КИ почему графики мощности и пульса (или ЧСС) называются зоны, а скорости - распределение? Ну и если честно - анализ тренировки достаточно тривиальный - у того же garmin connect больше информации, или на intervals.icu тоже отличный анализ (бесплатный).стати, у переключателя языка - прозрачный фон, выглядит так себе. - Не совсем в тему - с удивлением узнал что каденс говорить неправильно, правильно - каденция. Это я полез смотреть чем отличается каденс от каденции, когда про Трампа все стали говорить - каденция. Оказалось что каденс - калька с английского, но мы же не говорим - революшн, интеллидженс - так что каденция правильнее :) хотя кто его знает, как сейчас правильно. - В любом случае - отличный проект, удачи и успехов.  - cyberscoper Автор21.06.2025 17:12- Благодарю за критику и беру на карандаш недочеты, да буду улучшать анализ. 
 сейчас действительно банален
 
 - Mike-M21.06.2025 17:12- план работ, основанный на ваших отзывах и идеях. - Всем бы так работать, особенно тем кто делает это за деньги. - Сам проект меня не заинтересовал, но Ваш подход... Я Вам аж карму плюсанул ) 
 
           
 
urazaev90
Отличный разбор и крутой рост! Видно, сколько души и внимания к деталям вложено в проект. Особенно зацепил honeypot – простое, но элегантное решение. Идея внутренней навигации по сегментам – вообще топ, теперь пользоваться гораздо удобнее. Спасибо за честный тон и открытость к критике, это редкость.