Всем привет! Снова на связи Александр, автор проекта 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 — они работают по принципу "стреляй во все, что движется".

Типичная картина в логах. Боты с IP-адреса 34.150.194.30:0 методично перебирают стандартные пути WordPress.
Типичная картина в логах. Боты с IP-адреса 34.150.194.30:0 методично перебирают стандартные пути WordPress.

Проблема: Эти запросы создают ненужный "шум" в логах, затрудняя поиск реальных проблем, и впустую тратят ресурсы сервера, отвечая на тысячи запросов ошибкой 404 Not Found.

Решение (Honeypot, или «Горшочек с мёдом»): Вместо того чтобы просто отбиваться, я решил немного "потроллить" этих ботов и заодно собрать о них информацию. Я добавил в FastAPI специальный обработчик, который "ловит" все запросы, не подошедшие ни под один другой эндпоинт.

  1. Обнаружение: Скрипт проверяет, содержит ли URL-адрес запроса ключевые слова, типичные для сканеров (.php, wp-, /.env, /.git и т.д.).

  2. Ответ-ловушка: Если запрос опознан как вредоносный, вместо стандартной ошибки 404 сервер отдает ему ответ с кодом 200 (OK) и остроумным текстом-меморандумом в стиле киберпанка. В нем говорится, что бот попал не по адресу, и что этот сервер "говорит на языке асинхронных воркеров и Pydantic, а не плагинов и тем".

  3. Логирование: Самое главное — каждый такой "улов" записывается в лог с пометкой HONEYPOT HIT, включая IP-адрес бота и путь, который он искал.

Логика Honeypot  модуля
Логика Honeypot модуля

Работа над ошибками: Экстренное тушение пожаров ?

Первые отзывы были как холодный душ — конструктивные, но безжалостные. Вот самые критичные вещи, которые я исправил в первые же 48 часов благодаря вашим репортам.

1. «Железобетонная» погода

  • Проблема: Мой код запрашивал у погодного API только почасовые данные. Для старых тренировок API их не отдавал, и блок с погодой просто не отображался.

  • Решение (двухэтапный fallback): Теперь, если нет почасовых данных, скрипт запрашивает среднесуточные (мин/макс температура, ветер).

  • Итог: Погода есть всегда. Либо точная, либо общая за день.

Теперь погода есть всегда.
Теперь погода есть всегда.

2. Верстка, которая не выдержала наплыва

  • «Уезжающая» страница: Самый массовый баг в моем проекте. На мобильных карта и график имели фиксированную ширину и растягивали страницу. Решено через max-width: 100%.

  • Негибкий футер: Та же проблема с прокруткой из-за логотипа Strava. Решено переключением футера в flex-direction: column на мобильных.

  • Мелочи: Поправлены наезжающие кнопки, неправильные фоны, добавлена подсказка для настройки зон пульса.

Эмуляция Samsung S8 Plus, и поехавший интерфейс.
Эмуляция Samsung S8 Plus, и поехавший интерфейс.

Новые фичи, рожденные из ваших идей

Самое ценное — это когда пользователи не просто находят баги, а предлагают, как сделать лучше. Вот что мы добавили за последние дни именно благодаря вам.

1. Внутренняя навигация по сегментам

  • Идея от пользователя: «Было бы круто со страницы тренировки переходить на анализ сегмента внутри Peakline, а не на Strava».

  • Реализация: Теперь названия сегментов в списке — это кликабельные ссылки на их детальную страницу peakline.com/segment/{id}. Удобно, без лишних переходов.

Теперь каждый сегмент — это внутренняя ссылка на его детальный анализ.
Теперь каждый сегмент — это внутренняя ссылка на его детальный анализ.

2. Починка «Секретного Клуба»

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

Пункт привязки профиля Телеграмм для открытия бета функционала.
Пункт привязки профиля Телеграмм для открытия бета функционала.

Дорожная карта: Что дальше? План, созданный вами

Этот внезапный наплыв пользователей невероятно мотивирует и дает лучшее топливо для разработки — реальные потребности. Вот мой публичный план работ, основанный на ваших отзывах и идеях.

В ближайших планах (Short-Term):

  1. Исправление багов:

    • Неправильное время в FIT-файлах: При указании кастомной цели (5м 30с) минуты парсятся как часы, а секунды как минуты. Это критично, исправлю в первую очередь.

    • Старая кнопка смены языка: На некоторых страницах остался старый, некрасивый переключатель. Унифицирую его везде.

    • Скачки скорости в GPX Fixer: Инструмент иногда генерирует некорректные пики скорости после удаления "телепортов". Нужно пересмотреть алгоритм сглаживания.

  2. Улучшение UX:

    • Редизайн вывода AI-анализа: Сейчас ответ от Gemini выводится не совсем корректно на мобильных устройствах.

    • Окно с обновлениями (Changelog): Чтобы пользователи знали, что изменилось, буду показывать модальное окно при первом входе после обновления.

    Текущая страница с Changelog всего проекта.
    • Более удобный футер: Сгруппирую ссылки "Политика конфиденциальности", "О проекте" и т.д. в одну выпадающую кнопку "Юридическая информация", чтобы не загромождать подвал.

Среднесрочные цели (Mid-Term):

  1. Крупные фичи:

    • Страница клуба: Сделаю кликабельными карточки клубов в дашборде, чтобы можно было перейти на отдельную страницу с лентой активности этого клуба.

    • Износ снаряжения: Добавлю в раздел "Снаряжение" возможность указывать ресурс (например, для кроссовок) и отслеживать его износ.

    • Подробная история по сегментам: На странице анализа сегмента буду выводить таблицу со всеми вашими попытками на нем, чтобы можно было отслеживать прогресс.

    • Персональная тепловая карта (Heatmap): Интегрирую возможность построения личной тепловой карты активностей, как в Strava.

  2. Демонстрация возможностей:

    • Готовая аналитика на главной: Добавлю на главную страницу пример полного AI-анализа моей тренировки, чтобы новые пользователи сразу видели, какой результат они получат.

    • Кнопка PWA-приложения: Интегрирую баннер "Установить приложение" для добавления Peakline на главный экран смартфона.

Постоянный процесс (Ongoing):

  • Аудит Rate-лимитов: Я уже защитил некоторые эндпоинты, но проведу полный аудит и установлю разумные ограничения на все "дорогие" запросы, чтобы защититься от DoS-атак и не сжечь бюджеты API.

Заключение

Спасибо Хабру и его сообществу! Вы не просто дали проекту путевку в жизнь, но и провели самый честный и массовый бета-тест, о котором я не мог и мечтать. Вы помогли сделать Peakline лучше буквально за несколько дней. Это невероятно крутое чувство.

Продолжаю работать для вас.

Комментарии (2)


  1. urazaev90
    21.06.2025 17:12

    Отличный разбор и крутой рост! Видно, сколько души и внимания к деталям вложено в проект. Особенно зацепил honeypot – простое, но элегантное решение. Идея внутренней навигации по сегментам – вообще топ, теперь пользоваться гораздо удобнее. Спасибо за честный тон и открытость к критике, это редкость.


  1. cyberscoper Автор
    21.06.2025 17:12

    Продолжайте следить за проектом. Я веду его сам, многое упускаю может вы меня в каких-то оплошностях направите:)

    Вот на фото первая версия, да .. было грустно

    Мой проект победит - без накрутки показателей и умалчивания.