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