| Файл | Назначение | Важность |
|---|---|---|
README.md |
Основная документация проекта | ⭐⭐⭐ |
QUICKSTART.md |
Быстрый старт за 5 минут | ⭐⭐⭐ |
TESTING.md |
Руководство по тестированию | ⭐⭐ |
NAKARTE_API.md |
Документация API nakarte.me | ⭐⭐ |
PROJECT_STRUCTURE.md |
Этот файл - описание структуры | ⭐ |
| Файл | Назначение | Важность |
|---|---|---|
Dockerfile |
Multi-stage образ для бота | ⭐⭐⭐ |
docker-compose.yml |
Оркестрация сервисов (bot + redis) | ⭐⭐⭐ |
.dockerignore |
Исключения для Docker build | ⭐ |
| Файл | Назначение | Важность |
|---|---|---|
.env.example |
Шаблон переменных окружения | ⭐⭐⭐ |
.env |
Ваша конфигурация (создается вручную) | ⭐⭐⭐ |
requirements.txt |
Python зависимости | ⭐⭐⭐ |
.gitignore |
Исключения для Git | ⭐⭐ |
| Файл | Назначение | Важность |
|---|---|---|
test_nakarte.py |
Standalone скрипт для тестирования GPX | ⭐⭐ |
| Файл | Назначение | Строк кода |
|---|---|---|
src/__init__.py |
Инициализация пакета | ~3 |
src/main.py |
Точка входа приложения | ~180 |
src/main.py - Главный модуль
Ключевые компоненты:
Applicationкласс - основной класс приложенияsetup()- инициализация сервисовstart()- запуск ботаshutdown()- graceful shutdown- Signal handlers для SIGTERM/SIGINT
Зависимости:
- aiogram (Bot, Dispatcher)
- dotenv (загрузка .env)
- asyncio (async/await)
| Файл | Назначение | Строк кода |
|---|---|---|
src/bot/__init__.py |
Инициализация пакета | ~1 |
src/bot/handlers.py |
Обработчики сообщений | ~220 |
src/bot/handlers.py - Обработчики
Класс BotHandlers:
cmd_start()- команда/startcmd_help()- команда/helphandle_url()- обработка URL nakarte.me
Функциональность:
- Валидация URL
- Проверка кеша
- Загрузка GPX через NakarteService
- Отправка файла пользователю
- Обработка ошибок с понятными сообщениями на русском
Логирование:
url_received- получен URLcache_hit/cache_miss- статус кешаgpx_sent- файл отправлен- Все ошибки с деталями
| Файл | Назначение | Строк кода |
|---|---|---|
src/services/__init__.py |
Инициализация пакета | ~1 |
src/services/nakarte_service.py |
Извлечение GPX из nakarte.me | ~200 |
src/services/cache_service.py |
Абстракция кеширования | ~200 |
src/services/nakarte_service.py - Nakarte сервис
Класс NakarteService:
Методы:
validate_url(url)- валидация URL nakarte.meextract_track_id(url)- извлечение ID трекаdownload_gpx(url)- загрузка GPX через Playwrightclose()- закрытие браузера
Процесс загрузки:
- Открытие страницы nakarte.me
- Ожидание инициализации приложения (5 сек)
- Доступ к
window.app.trackManager - Извлечение треков и полилиний
- Генерация GPX XML
- Возврат данных
Особенности:
- Использует Playwright для автоматизации браузера
- Headless режим по умолчанию
- Настраиваемый timeout
- Fallback на ручную генерацию GPX
src/services/cache_service.py - Кеш сервис
Абстрактный класс CacheService:
get(key)- получение из кешаset(key, value, ttl)- сохранение в кешexists(key)- проверка существованияclose()- закрытие соединения
Реализации:
-
RedisCache- Redis кеш- Асинхронный клиент redis.asyncio
- Автоматическое переподключение
- TTL поддержка
-
FileCache- Файловый кеш- Хранение в директории
./cache - SHA256 хеш для имен файлов
- Простая реализация без TTL
- Хранение в директории
Factory функция:
create_cache_service()- создание нужной реализации
| Файл | Назначение | Строк кода |
|---|---|---|
src/utils/__init__.py |
Инициализация пакета | ~1 |
src/utils/logger.py |
Структурированное логирование | ~70 |
src/utils/logger.py - Логирование
Функции:
setup_logging(level)- настройка structlogget_logger(name)- получение logger instance
Формат логов:
{
"event": "gpx_downloaded",
"level": "INFO",
"timestamp": "2024-01-15T12:00:00.000000Z",
"logger": "src.services.nakarte_service",
"track_id": "ABC123",
"size": 12345
}Процессоры:
- TimeStamper (ISO 8601)
- StackInfoRenderer
- ExceptionFormatter
- JSONRenderer
- Создается автоматически при использовании file cache
- Содержит
.gpxфайлы с хешированными именами - Можно безопасно удалять для очистки
- Можно примонтировать через docker-compose
- Для сохранения логов на хосте
| Категория | Файлов | Строк кода |
|---|---|---|
| Python код | 8 | ~900 |
| Документация | 5 | ~1500 |
| Конфигурация | 5 | ~200 |
| Всего | 18 | ~2600 |
Production:
- aiogram 3.4.1 - Telegram Bot framework
- playwright 1.41.2 - Browser automation
- redis 5.0.1 - Redis client
- structlog 24.1.0 - Structured logging
- python-dotenv 1.0.1 - Environment variables
Development:
- pytest (для будущих тестов)
- pytest-asyncio (для async тестов)
Пользователь отправляет URL
↓
handlers.py
handle_url()
↓
Проверка валидации
↓
cache_service.py
get(track_id)
↓
┌─────────┴─────────┐
↓ ↓
Cache Hit Cache Miss
↓ ↓
Возврат GPX nakarte_service.py
↓ download_gpx()
↓ ↓
↓ Playwright Browser
↓ ↓
↓ nakarte.me загрузка
↓ ↓
↓ Извлечение данных
↓ ↓
↓ Генерация GPX XML
↓ ↓
↓ cache_service.py
↓ set(track_id)
↓ ↓
└───────────┬───────┘
↓
Отправка файла
пользователю
- bot/ - только Telegram взаимодействие
- services/ - бизнес-логика
- utils/ - вспомогательные функции
CacheService- абстрактный класс для кеша- Легко добавить новые реализации (Memcached, etc.)
- Полностью асинхронный код
- Эффективное использование ресурсов
- Поддержка множественных запросов
- Все настройки через environment variables
- Легко менять без пересборки
- Поддержка разных окружений (dev/prod)
- Структурированные JSON логи
- Request ID для трейсинга
- Разные уровни (DEBUG, INFO, ERROR)
- Multi-stage build для оптимизации размера
- Non-root user для безопасности
- Health checks для мониторинга
- Resource limits для стабильности
-
Non-root user в Docker
- Бот работает от пользователя
botuser - UID 1000
- Бот работает от пользователя
-
Environment variables
- Токены не в коде
.envв.gitignore
-
Security options
no-new-privileges:trueв docker-compose
-
Input validation
- Валидация URL перед обработкой
- Regex проверка формата
-
Error handling
- Graceful shutdown
- Обработка всех исключений
- Понятные сообщения пользователям
-
Кеширование
- Redis для быстрого доступа
- TTL 24 часа по умолчанию
- Cache hit < 500ms
-
Browser reuse
- Один browser instance
- Переиспользование между запросами
- Экономия памяти и времени
-
Async operations
- Неблокирующий I/O
- Параллельная обработка запросов
-
Docker optimization
- Multi-stage build
- Минимальный образ
- Layer caching
-
test_nakarte.py- Standalone тестирование
- Без зависимости от бота
- Детальный вывод
-
Логирование
- Все операции логируются
- Легко отследить проблемы
-
Health checks
- Docker health checks
- Мониторинг доступности
- Unit тесты (pytest)
- Integration тесты
- Load тесты
- CI/CD pipeline
QUICKSTART.md- Быстрый стартREADME.md- Полная документация
TESTING.md- ТестированиеNAKARTE_API.md- API nakarte.mePROJECT_STRUCTURE.md- Этот файл
- Docstrings во всех функциях
- Type hints везде
- Комментарии для сложной логики
python -m src.maindocker-compose up -ddocker-compose logs -f bot
docker stats nakarte-bot-
Функциональность
- Поддержка множественных треков
- Экспорт в KML, GeoJSON
- Webhook режим
-
Тестирование
- Unit тесты
- Integration тесты
- CI/CD
-
Мониторинг
- Prometheus метрики
- Grafana дашборды
- Sentry для ошибок
-
Масштабирование
- Horizontal scaling
- Load balancing
- Redis cluster
При возникновении вопросов:
- Проверьте документацию
- Изучите логи
- Используйте
test_nakarte.pyдля отладки - Откройте issue на GitHub
Последнее обновление: 2024-01-15