Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

532 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📰 TG-RSS - Telegram RSS Reader Bot

CI/CD Pipeline

Telegram-бот для чтения RSS-лент с использованием Redis в качестве брокера сообщений и кэша контента. Бот предоставляет удобный интерфейс для подписки на новостные источники и получения автоматических уведомлений.

Версия 2.4 включает Redis кэширование контента, оптимизацию HTTP-клиентов, улучшенную параллельную обработку, безопасность данных и conventional commits.

Доступно 33 новостных источника из различных категорий: федеральные агентства, деловые издания, тематические ресурсы, региональные новости и аналитические порталы.

🔒 Безопасность

Проект следует современным практикам безопасности:

  • OpenSSF Scorecard: Автоматическое сканирование безопасности
  • Branch Protection: Обязательные code reviews для всех изменений
  • Dependency Scanning: Мониторинг уязвимостей в зависимостях
  • Container Security: Сканирование образов на уязвимости
  • Secret Detection: Проверка на утечку секретов

Подробности в политике безопасности.

🚀 Ключевые улучшения v2.4:

  • Redis кэширование контента: 3-10x ускорение повторных запросов
  • Оптимизированные HTTP-клиенты: Таймауты, сжатие, keep-alive
  • Параллельная обработка: До 6 одновременных источников
  • Композитные индексы БД: Быстрая проверка дубликатов
  • Ограничение памяти: 2MB лимит контента, автоматическая очистка
  • Безопасность данных: Очистка null байтов и UTF-8 валидация
  • Conventional Commits: Стандартизированные сообщения на русском
  • Graceful degradation: Работа без Redis при недоступности

🚀 Основные возможности

  • 📰 Чтение RSS-лент - поддержка 33 популярных российских источников
  • 🔔 Автоматические уведомления - мгновенное получение свежих новостей
  • 📱 Интерактивный интерфейс - удобное управление через inline-кнопки
  • 🚀 Быстрый старт - подписка на источники по категориям одним нажатием
  • 📖 Интерактивный туториал - пошаговое обучение работе с ботом
  • 📋 Гибкое управление подписками - добавление и удаление источников
  • Оптимизация ресурсов - работает на серверах с ограниченными ресурсами (1 CPU, 1.2GB RAM)
  • 🚀 Высокая производительность - асинхронная обработка с Redis кэшированием контента
  • 🗄️ Надежное хранение - PostgreSQL для хранения данных
  • 💾 Сохранение данных - данные сохраняются между деплоями
  • 🐳 Простое развертывание - полная поддержка Docker
  • 📊 Аналитика новостей - автоматический анализ и группировка новостей в темы (модуль "Карта дня")
  • 🤖 Умные отчеты - автоматическая отправка аналитических отчетов в Telegram
  • 🔄 Параллельная обработка - одновременный парсинг до 6 RSS источников с оптимизированными HTTP-клиентами
  • 📈 Интеллектуальное кэширование - Redis кэш контента (30 мин TTL) + кэширование источников и подписок
  • 🏥 Мониторинг здоровья - встроенные health check и Prometheus метрики
  • 🔧 Graceful shutdown - корректное завершение работы без потери данных
  • 🧠 Оптимизированная память - ограничение размера контента (2MB), автоматическая очистка кэша
  • Ускоренный скраппинг - 3-10x ускорение повторных запросов за счет Redis кэша
  • 🛡️ Безопасность данных - автоматическая очистка null байтов и некорректных UTF-8 последовательностей
  • 📝 Conventional Commits - стандартизированные сообщения коммитов на русском языке

🏗️ Архитектура

RSS Sources → RSS Poller → Redis Pub/Sub (news-items) → News Processor → PostgreSQL + Telegram Users
                                                       ↓
                                                Content Scraper → Redis Cache → Web Scraping

Компоненты системы:

  1. RSS Poller

    • Периодически опрашивает RSS-источники с оптимизированными HTTP-клиентами
    • Отправляет новые новости в канал Redis news-items
    • Параллельная обработка до 6 источников одновременно
  2. Content Scraper

    • Асинхронно скрапит полный контент новостей
    • Использует Redis кэш для избежания повторных запросов (TTL 30 мин)
    • Оптимизированные HTTP-клиенты с сжатием и таймаутами
  3. News Processor

    • Асинхронно обрабатывает сообщения из Redis
    • Сохраняет новости с полным контентом в PostgreSQL
    • Отправляет уведомления подписанным пользователям
  4. Telegram Bot

    • Предоставляет пользовательский интерфейс
    • Управление подписками и настройками

Каналы Redis Pub/Sub:

  • news-items - входящие новости от RSS источников
  • news-notifications - уведомления для пользователей (резервный канал)

🛠️ Технологический стек

  • Go 1.25 - основной язык разработки
  • Python 3.13 - аналитический модуль "Карта дня"
  • PostgreSQL 18.1 - реляционная база данных
  • Redis 8.4 - высокопроизводительный брокер сообщений с Pub/Sub
  • Telegram Bot API - интеграция с мессенджером
  • Docker & Docker Compose - контейнеризация и оркестрация
  • gofeed - библиотека для парсинга RSS/Atom
  • Scikit-learn, HDBSCAN, NLTK - машинное обучение и обработка текста (Python модуль)

🚀 Быстрый старт

Предварительные требования

  • Docker и Docker Compose
  • Go 1.25+ (только для локальной разработки)
  • Токен Telegram бота от @BotFather

Требования к ресурсам сервера

Оптимизированные требования для работы (v2.4):

  • CPU: 1 ядро (0.87 фактически используется)
  • RAM: 1.2 ГБ (1192MB фактически используется с новыми оптимизациями)
  • Disk: 15 ГБ

Рекомендуемые ресурсы для полного функционала:

  • CPU: 2 ядра (для включения аналитического модуля)
  • RAM: 2 ГБ (для включения аналитического модуля)
  • Disk: 20 ГБ (для хранения истории новостей)

Система автоматически адаптируется к ограничениям ресурсов благодаря:

  • Redis кэшированию контента (3-10x ускорение повторных запросов)
  • Интеллектуальному кэшированию источников (30 мин) и подписок (10 мин)
  • Параллельной обработке RSS до 6 источников одновременно
  • Оптимизированным HTTP-клиентам с сжатием и таймаутами
  • Адаптивному rate limiting для Telegram API
  • Ограничению размера контента (2MB) и автоматической очистке памяти

Настройка окружения

  1. Клонируйте репозиторий:

    git clone https://github.com/kaevdokimov/tg-rss.git
    cd tg-rss
  2. Создайте и настройте файл .env:

    cp .env.example .env
  3. Отредактируйте .env файл, указав ваши настройки:

    # Telegram Bot Token (обязательно)
    TELEGRAM_API_KEY=your_telegram_bot_token_here
    
    # Telegram Bot Token для аналитических отчетов (опционально)
    # Отдельный бот для отправки отчетов анализа новостей
    TELEGRAM_SIGNAL_API_KEY=your_signal_bot_token_here
    
    # Telegram Bot для CI/CD уведомлений (опционально)
    # Можно использовать тот же TELEGRAM_API_KEY или создать отдельный бот
    # GH_NOTIFY_TELEGRAM_BOT_TOKEN=your_ci_cd_bot_token_here
    # GH_NOTIFY_TELEGRAM_CHAT_ID=your_chat_id_here
    
    # Настройки базы данных
    POSTGRES_HOST=db
    POSTGRES_PORT=5432
    POSTGRES_USER=postgres
    POSTGRES_PASSWORD=your_secure_password
    POSTGRES_DB=news_bot
    
    # Дополнительные настройки
    TZ=Europe/Moscow
    TIMEOUT=60
    LOG_LEVEL=INFO
    
    # Настройки Redis
    REDIS_ADDR=redis:6379
    REDIS_PASSWORD=
    REDIS_DB=0
    REDIS_NEWS_CHANNEL=news-items
    REDIS_NOTIFY_CHANNEL=news-notifications
    
       # Настройки парсера контента новостей (оптимизировано для Redis кэша)
       CONTENT_SCRAPER_INTERVAL=1   # интервал парсинга контента в минутах (оптимизировано: 1)
       CONTENT_SCRAPER_BATCH=50     # размер батча для парсинга контента (оптимизировано: 50)
       CONTENT_SCRAPER_CONCURRENT=3 # количество параллельных запросов (оптимизировано: 3)
    
    # ГИБКИЕ НАСТРОЙКИ РЕСУРСОВ КОНТЕЙНЕРОВ (опционально)
    # Bot ресурсы
    BOT_MEM_LIMIT=400m
    BOT_MEM_RESERVATION=200m
    BOT_CPUS=0.4
    
    # Redis ресурсы
    REDIS_MEM_LIMIT=80m
    REDIS_MEM_RESERVATION=40m
    REDIS_CPUS=0.05
    
    # PostgreSQL ресурсы
    DB_MEM_LIMIT=200m
    DB_MEM_RESERVATION=100m
    DB_CPUS=0.12
    
    # Настройки аналитического модуля (Python) - только если модуль включен
    ANALYZER_SCHEDULE_TIMES=9:00,12:00,15:00,20:00,23:00  # расписание запуска анализа (5 раз в день)
    RUN_ON_STARTUP=false  # запуск анализа при старте контейнера
    MAX_NEWS_LIMIT=2400          # лимит новостей для анализа (оптимизировано: 800)
    ANALYZER_MIN_NEWS_THRESHOLD=10 # минимальное количество новостей для запуска анализа
    
    # ДОПОЛНИТЕЛЬНЫЕ ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ (опционально)
    # Для тонкой настройки производительности на конкретном сервере
    LOG_LEVEL=INFO  # DEBUG, INFO, WARN, ERROR
    TIMEOUT=60      # таймаут для RSS запросов в секундах
    
    # Настройки оптимизаций производительности
    WORKER_POOL_SIZE=6          # количество воркеров для параллельного парсинга RSS (оптимизировано: 6)
    SOURCES_CACHE_TTL=30m      # TTL кэша источников (оптимизировано: 30m)
    SUBSCRIPTIONS_CACHE_TTL=10m # TTL кэша подписок (оптимизировано: 10m)

Создание Telegram бота для уведомлений CI/CD

Для получения уведомлений о статусе CI/CD в Telegram:

  1. Создайте бота через @BotFather:

    /newbot
    Имя бота: CI/CD Notifier
    Username: your_ci_cd_bot
    
  2. Получите токен бота от BotFather и сохраните его.

  3. Создайте приватный канал или группу для уведомлений.

  4. Добавьте бота в канал/группу как администратора.

  5. Получите Chat ID:

    • Отправьте сообщение в канал/группу
    • Перейдите по ссылке: https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates
    • Найдите "chat":{"id":...} - это и есть CHAT_ID
  6. Добавьте секреты в GitHub (Settings → Secrets and variables → Actions):

    GH_NOTIFY_TELEGRAM_BOT_TOKEN=your_bot_token_here
    GH_NOTIFY_TELEGRAM_CHAT_ID=your_chat_id_here
    

Запуск с Docker Compose

Для быстрого старта всех компонентов выполните:

# Запуск всех сервисов в фоновом режиме
docker-compose up -d

# Просмотр логов в реальном времени
docker-compose logs -f

Локальная разработка

  1. Запустите зависимости (Redis и PostgreSQL):

    docker-compose up -d redis db
  2. Запустите приложение локально:

    go run main.go

🔍 Мониторинг и отладка

Встроенный мониторинг

Проект включает встроенную систему мониторинга:

Health Check endpoints:

  • GET /health - проверка здоровья сервиса (подключение к БД)
  • GET /metrics - Prometheus-совместимые метрики производительности

Доступные метрики:

  • RSS: количество опросов, обработанных элементов, ошибок
  • Redis: произведенные и потребленные сообщения, ошибки
  • Telegram: отправленные сообщения, команды, ошибки
  • БД: количество запросов и ошибок

Пример использования:

# Проверка здоровья
curl http://localhost:8080/health

# Получение метрик
curl http://localhost:8080/metrics

Полезные команды для отладки

# Просмотр Redis каналов
docker exec -it redis redis-cli --raw keys "*"

# Просмотр количества сообщений в каналах
docker exec -it redis redis-cli pubsub numsub news-items news-notifications

# Просмотр логов бота
docker-compose logs -f bot

# Проверка использования памяти каждым контейнером
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}"

# Проверка сетевых соединений
docker exec tg-rss-bot-1 netstat -tlnp | grep :29092

# Проверка health check endpoints
curl http://localhost:8080/health
curl http://localhost:8080/metrics | head -10

📈 Преимущества архитектуры

  • Масштабируемость - возможность запуска нескольких экземпляров компонентов
  • Надежность - сообщения обрабатываются через Redis Pub/Sub с гарантированной доставкой
  • Изоляция - RSS парсинг и отправка сообщений разделены
  • Фильтрация - отправляются только подписанным пользователям
  • Производительность - асинхронная обработка новостей через брокер сообщений
  • Оптимизация ресурсов - работает на серверах с 1.2GB RAM (оптимизированное использование ресурсов)
  • Сохранение данных - данные сохраняются между деплоями
  • Улучшенный UX - интерактивный туториал и быстрый старт для новых пользователей
  • Умная обработка ошибок - понятные сообщения об ошибках для пользователей
  • Адаптивный rate limiting - автоматическая обработка ограничений Telegram API
  • Тестирование - unit-тесты для критичных компонентов
  • Гибкая настройка - ресурсы контейнеров настраиваются через переменные окружения
  • Параллельная обработка - одновременный парсинг нескольких RSS источников
  • Интеллектуальное кэширование - кэширование источников и подписок для снижения нагрузки на БД
  • Встроенный мониторинг - health checks и Prometheus метрики для observability
  • Graceful shutdown - корректное завершение работы без потери данных
  • Оптимизированные алгоритмы - батч-операции и эффективные структуры данных

🎯 Использование

📱 Удобная навигация с кнопками

После команды /start бот показывает улучшенное приветствие с описанием возможностей:

  • 🚀 Быстрый старт - подписка на популярные источники одним нажатием (для новых пользователей)
  • 📖 Туториал - интерактивное обучение работе с ботом (для новых пользователей)
  • 📰 Последние новости - получить последние 10 новостей
  • 📋 Мои источники - просмотреть все доступные источники
  • Добавить источник - добавить новый RSS-источник
  • 📝 Мои подписки - управление подписками
  • Помощь - справка по командам

🚀 Быстрый старт

Для новых пользователей доступна функция "Быстрый старт", которая позволяет:

  • Подписаться на популярные источники одним нажатием
  • Подписаться на все источники сразу (кнопка "✅ Подписаться на все")
  • Увидеть статус подписки (подписан/не подписан)

Рекомендуемые источники по категориям:

📰 Общие новости:

  • Лента.ру - оперативные новости из России и мира
  • РИА Новости - государственное информационное агентство
  • ТАСС - крупнейшее российское информационное агентство
  • Газета.Ru - главные новости дня

💼 Бизнес и экономика:

  • Ведомости - деловая и финансовая информация
  • РБК - финансовые рынки и компании
  • Коммерсант - бизнес и политика
  • Интерфакс - деловые и политические новости

🎯 Тематические источники:

  • iXBT.com - технологии и IT
  • Sports.ru - спорт и соревнования
  • Meduza - независимые новости и расследования

Также доступна подписка на все источники из меню "📋 Мои источники" - кнопка "✅ Подписаться на все".

📖 Интерактивный туториал

Бот включает интерактивный туториал из 4 шагов:

  1. Что такое RSS News Bot?
  2. Как подписаться на источники?
  3. Управление подписками
  4. Завершение

Доступен через кнопку "📖 Туториал" или команду /tutorial.

⌨️ Текстовые команды

Команда Описание
/start Начать работу с ботом (показывает приветствие и меню)
/tutorial Пройти интерактивный туториал
/add <URL> Добавить RSS-источник
/sources Посмотреть все источники новостей
/subscribe_all Подписаться на все источники сразу
/news Получить последние 10 новостей
/help Показать справку по командам
/tutorial Пройти интерактивный туториал
/stats Статистика бота (только для администратора)

Примечание: Для управления подписками используйте кнопки в меню "📋 Мои источники" и "📝 Мои подписки" - это удобнее, чем команды с ID.

📰 Формат отображения новостей

Новости отображаются в компактном минималистичном формате для удобства чтения:

Список новостей (команда /news):

1. Заголовок новости
   🔗 Источник • время

2. Другой заголовок
   🔗 Источник • время

Иконка ссылки:

  • 🔗 - иконка для ссылки на полную новость

Заголовок отображается обычным текстом для лучшей читаемости, ссылка на новость доступна через иконку 🔗.

Отдельные уведомления (автоматические сообщения):

*Заголовок новости*
Источник • время

Описание новости (если доступно)

Формат времени (компактный):

  • "только что" - менее минуты
  • "N мин" - менее часа (например: "28 мин")
  • "N ч" - менее суток (например: "2 ч")
  • "N дн" - менее недели (например: "3 дн")
  • Дата в формате ДД.ММ - для старых новостей (например: "07.12")

🔐 Административные команды

Команда /stats доступна только для администратора и показывает:

  • Общее количество новостей в базе данных
  • Количество новостей за сегодня
  • Количество новостей за вчера
  • Общее количество пользователей (подписчиков)

Доступ: Только для администратора (ChatID: 234501916)

📰 Примеры RSS-источников

# 🏛️ Крупные информационные агентства
/add https://tass.ru/rss/v2.xml?sections=MjU%3D            # ТАСС - общероссийские новости
/add https://ria.ru/export/rss2/index.xml                  # РИА Новости - все новости
/add https://www.interfax.ru/rss.asp                       # Интерфакс - деловые и политические новости

# 📰 Новостные порталы
/add https://lenta.ru/rss/news                              # Лента.ру - оперативные новости
/add https://lenta.ru/rss/top7                              # Лента.ру - топ новостей
/add https://www.gazeta.ru/export/rss/first.xml            # Газета.Ru - первая полоса
/add https://news.mail.ru/rss/                              # News.mail.ru - агрегация новостей

# 💼 Деловые издания
/add https://www.vedomosti.ru/rss/news                      # Ведомости - экономика и бизнес
/add https://www.vedomosti.ru/rss/articles                  # Ведомости - все материалы
/add https://www.rbc.ru/rss                                 # РБК - финансовые рынки
/add https://www.kommersant.ru/RSS/news.xml                # Коммерсант - бизнес и политика

# 🎯 Тематические ресурсы
/add https://www.ixbt.com/export/softnews.rss              # iXBT.com - технологии и IT
/add https://www.sports.ru/sports_docs.xml                  # Sports.ru - спорт и соревнования
/add https://ecoportal.su/rss/news.xml                      # ECOportal.su - экология

# 📊 Аналитика и мнения
/add https://meduza.io/rss2/all                             # Meduza - независимые новости
/add https://www.ng.ru/rss/                                 # Независимая газета - политическая аналитика
/add https://globalaffairs.ru/feed/                         # Россия в глобальной политике

# 🏙️ Региональные новости
/add https://kuzbassnews.ru/engine/rss.php                  # Новости Кузбасса - региональная повестка

# 🏛️ Официальные источники
/add http://government.ru/all/rss/                          # Правительство РФ - официальные новости

🐳 Docker команды

Основные команды

# Запуск всех сервисов
docker-compose up -d

# Остановка всех сервисов
docker-compose down

# Перезапуск
docker-compose restart

# Просмотр логов всех сервисов
docker-compose logs -f

# Просмотр логов конкретного сервиса
docker-compose logs -f bot
docker-compose logs -f redis

Мониторинг и отладка

# Статус всех контейнеров
docker-compose ps

# Использование ресурсов
docker stats --no-stream

# Подключение к контейнеру
docker exec -it bot bash

# Проверка Redis каналов
docker exec -it redis redis-cli --raw pubsub channels

Make команды (альтернатива)

# Запуск
make up

# Остановка
make down

# Перезапуск
make restart

# Просмотр логов
make logs

# Подключение к контейнеру
make console

# Проверка здоровья сервиса
make health

# Получение метрик производительности
make metrics

📁 Структура проекта

tg-rss/
├── bot/                    # Telegram бот логика
│   ├── handlers.go         # Обработчики команд
│   ├── callback_handlers.go # Обработчики callback-запросов
│   ├── keyboards.go        # Клавиатуры для интерфейса
│   ├── rss_poller.go       # Опрос RSS источников (с параллельной обработкой и кэшированием)
│   ├── news_processor.go  # Обработка новостей (с кэшированием подписок)
│   ├── message_processor.go # Обработка сообщений из Redis
│   ├── error_handler.go    # Обработка ошибок Telegram API
│   ├── error_handler_test.go # Тесты обработки ошибок
│   ├── rate_limiter.go     # Rate limiting для отправки сообщений
│   ├── rate_limiter_test.go # Тесты rate limiter
│   └── msg.go              # Форматирование сообщений
├── config/                 # Конфигурация приложения
├── db/                     # Работа с базой данных
├── redis/                  # Redis producer/consumer (оптимизированные параметры)
├── monitoring/            # Метрики и логирование (структурированное логирование)
├── rss/                    # RSS парсинг
├── news-analyzer-python/   # Аналитический модуль "Карта дня" (Python)
│   ├── src/                # Исходный код Python модуля
│   │   ├── config/         # Конфигурация
│   │   ├── db/             # Подключение к БД
│   │   ├── fetcher/        # Получение новостей
│   │   ├── preprocessor/   # Предобработка текста
│   │   ├── analyzer/       # Векторизация и кластеризация
│   │   ├── narrative/      # Построение нарративов
│   │   ├── reporter/       # Генерация отчетов
│   │   └── utils/          # Утилиты
│   ├── storage/            # Отчеты и логи
│   ├── Dockerfile          # Docker образ Python модуля
│   ├── requirements.txt    # Python зависимости
│   └── README.md           # Документация модуля
├── docker-compose.yml      # Docker Compose конфигурация (оптимизирована для 1.2GB RAM)
├── Dockerfile              # Docker образ приложения
├── go.mod                  # Go зависимости
├── main.go                 # Точка входа (с graceful shutdown и health checks)
├── Makefile                # Команды для разработки
├── docs/                   # Специализированная документация
│   ├── commit-convention.md # Соглашение о коммитах
│   ├── security-setup.md   # Настройка безопасности
│   └── monitoring-setup.md # Настройка мониторинга
└── scripts/                # Служебные скрипты
    └── setup-hooks.sh      # Установка Git hooks

🔧 Разработка

Локальная разработка

# Установка зависимостей
go mod download

# Запуск локально (требуется PostgreSQL)
go run main.go

Соглашение о коммитах

Проект использует Conventional Commits на русском языке для стандартизации сообщений коммитов.

# Формат коммита
<тип>(<область>): <краткое описание>

# Примеры
feat(bot): добавить поддержку inline-кнопок
fix(db): исправить утечку null байтов
perf(cache): ускорить поиск дубликатов
test(scraper): добавить тесты для очистки данных
docs(readme): обновить инструкцию по развертыванию

Подробные правила: docs/commit-convention.md

Тестирование

Проект включает comprehensive unit-тесты для всех критических компонентов:

# Запуск всех тестов
go test ./...

# Запуск тестов с подробным выводом
go test ./... -v

# Запуск бенчмарк тестов (требуется Redis)
go test ./redis -bench=. -benchmem

# Запуск тестов с покрытием
go test ./... -cover

# Запуск тестов конкретного пакета
go test ./bot/... ./config/... ./redis/...

Проверка коммитов

Проект включает автоматизированную проверку формата сообщений коммитов через Git commit-msg hook:

# Установка Git hooks для автоматической проверки
./scripts/setup-hooks.sh

Как работает проверка:

  • Commit-msg hook активируется после ввода сообщения коммита
  • Проверяет формат согласно Conventional Commits
  • Блокировка коммита при несоответствии формату
  • Пропуск проверки с флагом --no-verify

Результаты тестирования (v2.4):

  • Все тесты проходят без ошибок
  • 25 тестов в пакете bot (обработка ошибок, rate limiting, форматирование)
  • 3 теста в пакете config (загрузка конфигураций, 77.8% покрытие)
  • 7 тестов в пакете monitoring (метрики, логирование, 67.6% покрытие)
  • 2 теста в пакете rss (парсинг и обработка ошибок, 56.2% покрытие)
  • 1 тест в пакете redis (кэширование, пропускается без Redis, 5.1% покрытие)
  • 2 теста в пакете scraper (очистка null байтов)
  • 2 теста в пакете db (очистка UTF-8 строк)

Покрытие тестами: ~40.3% (фокус на критически важных функциях)

Новые тесты в v2.4:

  • ✅ Тесты Redis кэширования контента (Get/Set/Delete операции)
  • ✅ Тесты очистки null байтов в scraper (removeNullBytes)
  • ✅ Тесты очистки UTF-8 строк в db (cleanUTF8String)
  • ✅ Бенчмарк тесты производительности Redis кэша (3-10x ускорение)
  • ✅ Тесты graceful degradation (работа без Redis)

Особенности тестирования:

  • Graceful degradation: Redis тесты корректно пропускаются при недоступности Redis
  • Integration ready: Все тесты готовы для CI/CD пайплайнов
  • Performance testing: Бенчмарки показывают 3-10x ускорение для кэшированных запросов
  • Memory optimization: Тесты подтверждают ограничение утечек памяти

📊 Мониторинг и метрики

Проект включает встроенную систему мониторинга и метрик:

  • Метрики RSS: количество опросов, обработанных элементов, ошибок
  • Метрики Redis: произведенные и потребленные сообщения, ошибки
  • Метрики Telegram: отправленные сообщения, команды, ошибки
  • Метрики БД: количество запросов и ошибок

Логирование

Проект использует структурированное логирование с уровнями:

  • DEBUG - отладочная информация
  • INFO - информационные сообщения
  • WARN - предупреждения
  • ERROR - ошибки

Уровень логирования можно настроить через переменную окружения LOG_LEVEL.

📊 Аналитический модуль "Карта дня" (ОТКЛЮЧЕН по умолчанию)

Проект включает Python-модуль для автоматического анализа новостей (отключен для экономии ресурсов):

  • Автоматический анализ - группировка новостей в темы с помощью машинного обучения
  • Топ-5 нарративов дня - выявление основных тем за последние 24 часа
  • Автоматические отчеты - отправка аналитических отчетов в Telegram
  • Исторические данные - сохранение результатов анализа в БД для последующего анализа
  • Гибкое расписание - настраиваемое расписание запуска

✅ Модуль включен с оптимизацией ресурсов

Аналитический модуль включен и оптимизирован для работы на серверах с ограниченными ресурсами (1.2GB RAM, 1 CPU).

🔄 Модуль "Карта дня" включен

Модуль уже включен и настроен для работы с оптимизированными ресурсами:

  • RAM: 512MB (увеличено для обработки большего количества новостей)
  • CPU: 0.3 cores (увеличено для ускорения анализа)
  • Запуск: 5 раз в день (9:00, 12:00, 15:00, 20:00, 23:00)
  • Качество анализа: Выявление 8+ основных тем из 800 новостей

Для запуска анализа вручную:

Быстрый старт (после включения)

# Просмотр логов аналитического модуля
docker-compose logs --tail=50 news-analyzer

# Ручной запуск анализа
docker exec -it news-analyzer python run_daily.py

# Тест подключения к БД
docker exec -it news-analyzer python test_connection.py

Подробная документация: news-analyzer-python/README.md

📚 Дополнительная документация

Основные руководства

  • README - этот файл (обзор и быстрый старт)
  • Развертывание - DEPLOYMENT.md - полное руководство по деплою
  • Тестирование - TESTING.md - руководство по тестированию
  • Решение проблем - TROUBLESHOOTING.md - troubleshooting

Специализированная документация

Аналитический модуль

Техническая документация

  • Навигация по документации и архитектура - DOCUMENTATION.md

⚙️ Оптимизация ресурсов

Проект оптимизирован для работы на серверах с ограниченными ресурсами (1 CPU, 1.2GB RAM):

📊 Текущие ограничения ресурсов (v2.4 с Redis кэшем)

Сервис Память CPU Комментарий
bot 400MB 0.4 Основной бот с Redis кэшем контента и оптимизациями
redis 80MB 0.05 Redis 8.4: Pub/Sub + кэш контента (TTL 30 мин)
db 200MB 0.12 PostgreSQL 18.1 с композитными индексами и оптимизациями
news-analyzer 512MB 0.3 ИИ анализ новостей (800 новостей, 8+ тем)
ИТОГО 1192MB 0.87 Оптимизировано для сервера 1.2GB RAM, 1 CPU

🔧 Дополнительные оптимизации

PostgreSQL оптимизации:

# Минимальные настройки для ограниченной памяти
shared_buffers=32MB
effective_cache_size=128MB
maintenance_work_mem=16MB
wal_buffers=4MB
checkpoint_completion_target=0.9

Redis оптимизации:

# Минимальные настройки для экономии ресурсов
REDIS_MAXMEMORY: 50mb
REDIS_MAXMEMORY_POLICY: allkeys-lru
REDIS_SAVE: "60 1000"  # RDB сохранение каждые 60 сек при 1000 изменений
REDIS_APPENDONLY: "yes"  # AOF для надежности

Оптимизации кода (v2.4):

# Redis кэширование контента
- content_cache_ttl: 30m    # Кэш скрапированного контента (3-10x ускорение)
- content_size_limit: 2MB   # Ограничение размера контента для экономии памяти
- cache_auto_cleanup: true  # Автоматическая очистка устаревших записей

# Параллельная обработка RSS источников
- worker_pool_size: 6       # Одновременный парсинг до 6 источников (оптимизировано)
- http_client_optimization: true # Оптимизированные HTTP-клиенты с сжатием
- batch_duplicate_check: true # Батч-проверка дубликатов новостей

# Кэширование для снижения нагрузки на БД
- sources_cache_ttl: 30m    # Кэш источников обновляется каждые 30 мин
- subscriptions_cache_ttl: 10m # Кэш подписок обновляется каждые 10 мин

# Оптимизация Redis
- pubsub_channels: news-items, news-notifications # Два канала для разных типов сообщений
- redis_memory_optimization: 100MB limit # Минимум памяти для высокой производительности
- redis_cache_db: separate # Отдельная БД для кэша контента

Гибкая настройка ресурсов:

# В .env файле можно переопределить ресурсы:
BOT_MEM_LIMIT=256m          # Уменьшить память бота
REDIS_CPUS=0.05            # Минимум CPU для Redis
DB_MEM_LIMIT=128m          # Минимум для PostgreSQL

🎯 Результат оптимизации (v2.4)

Работает на серверах с 1.2GB RAM (1192MB фактически используется) ✅ Redis кэширование контента: 3-10x ускорение повторных запросов ✅ Экономия ресурсов: 35% экономии при повышенной производительности ✅ Стабильная работа: оптимизированные HTTP-клиенты с сжатием и таймаутами ✅ Гибкость: возможность тонкой настройки через переменные окружения ✅ Высокая производительность: Redis кэш + параллельная обработка до 6 источников ✅ Надежность: graceful degradation при недоступности Redis ✅ Масштабируемость: эффективное использование ресурсов CPU с автоматической очисткой памяти

🔒 Сохранение данных

Все данные сохраняются между деплоями:

  • ✅ PostgreSQL данные (пользователи, новости, подписки)
  • ✅ Redis данные (RDB snapshots, AOF logs)
  • ✅ Zookeeper данные (метаданные)

Volumes не удаляются при деплое благодаря использованию именованных Docker volumes.

🐛 Известные проблемы и решения

Проблема: Не приходят новые новости

Исправлено: Добавлена фильтрация старых новостей и проверка дубликатов

Проблема: При подключении приходят все старые новости

Исправлено: Новости старше 24 часов не отправляются, проверка отправленных новостей

Проблема: Данные теряются при деплое

Исправлено: Volumes сохраняются, флаг -v убран из CI/CD

Проблема: Перегрузка сервера из-за недостатка ресурсов

Решено: Проект оптимизирован для работы на серверах с 1.2GB RAM. Все модули оптимизированы для эффективного использования ресурсов.

Проблема: Zookeeper не запускается (unhealthy)

Решено: Оптимизированы ресурсы Zookeeper до 256MB RAM и 0.2 CPU, улучшены health checks.

Проблема: PostgreSQL не запускается (unhealthy)

Решено: Упрощена конфигурация PostgreSQL, оптимизированы ресурсы до 256MB RAM для стабильности.

Миграция на Redis - значительная экономия ресурсов

Успешно: Замена Kafka на Redis дала 87% экономии памяти (768MB → 100MB) и 87.5% экономии CPU. Redis использует 80MB RAM и 0.05 CPU вместо 384MB RAM и 0.15 CPU для Kafka.

Проблема: Ошибка "Too Many Requests: retry after 52833"

Исправлено: Реализована адаптивная обработка rate limiting с автоматическим увеличением интервала между сообщениями. При получении ошибки с большим временем ожидания (>1 часа) система устанавливает интервал 1 минута между сообщениями, что позволяет постепенно отправлять новости без полной блокировки. После успешных отправок интервал постепенно уменьшается до базового значения (50ms).

Проблема: Высокая нагрузка на БД при большом количестве источников

Решено: Внедрено интеллектуальное кэширование источников (TTL 30 мин) и подписок (TTL 10 мин), а также батч-проверка дубликатов новостей. Это снизило количество запросов к БД на 80-90%.

Проблема: Медленный парсинг большого количества RSS источников

Решено: Добавлена параллельная обработка с worker pool (до 6 одновременных потоков), что ускорило сбор новостей в 4-6 раз для больших списков источников. Оптимизированные HTTP-клиенты с сжатием.

Проблема: Медленный скраппинг контента новостей

Решено: Внедрено Redis кэширование контента с TTL 30 минут. Повторные запросы к тому же URL обслуживаются из кэша за 1-5мс вместо 2-15сек. Ускорение 3-10x для популярных новостей.

Проблема: Ошибки PostgreSQL "invalid byte sequence for encoding UTF8"

Решено: Добавлена комплексная очистка текстовых данных от null байтов и некорректных UTF-8 последовательностей. Все текстовые поля очищаются на уровне скраппинга и перед сохранением в базу данных. Добавлены unit-тесты для проверки корректности очистки.

Проблема: Одна и та же новость отправляется несколько раз

Исправлено: Реализована глобальная дедупликация по контенту (link вместо source_id + link). Добавлена глобальная проверка отправки новостей перед распределением пользователям. Улучшена логика сохранения факта отправки сообщений.

Проблема: Анализ новостей выявляет 0 тем ("Выявлено тем: 0")

Исправлено: Увеличен лимит новостей с 300 до 800, оптимизированы параметры HDBSCAN (min_cluster_size=2, min_samples=1), улучшена векторизация (max_features=15000), оптимизирована предобработка текста. Теперь система корректно выявляет 8+ основных тем ежедневно.

📝 Лицензия

MIT License

🤝 Вклад в проект

  1. Ознакомьтесь с docs/commit-convention.md - соглашение о сообщениях коммитов
  2. Fork репозитория
  3. Создайте feature branch (git checkout -b feature/amazing-feature)
  4. Вносите изменения, следуя соглашению коммитов
  5. Push в branch (git push origin feature/amazing-feature)
  6. Откройте Pull Request с подробным описанием изменений

Пример рабочего процесса:

# 1. Создание ветки
git checkout -b feat/add-voice-messages

# 2. Внесение изменений
# ... кодинг ...

# 3. Коммит согласно соглашению
git commit -m "feat(bot): добавить поддержку голосовых сообщений

Добавлена обработка голосовых сообщений в Telegram боте.
Поддерживаются форматы OGG и MP3 с автоматической транскрибацией.

- Добавлен handler для voice messages
- Интеграция с speech-to-text API
- Валидация размера файлов (макс 20MB)
- Обработка ошибок сети и API"

# 4. Push и PR
git push origin feat/add-voice-messages

📞 Поддержка

Если у вас есть вопросы или предложения, создайте Issue в репозитории.


🔄 Последние обновления (2026)

✅ Версия 2.4 - Redis кэширование контента и оптимизации производительности

  • Redis кэширование контента: 3-10x ускорение повторных запросов к контенту новостей
  • Оптимизированные HTTP-клиенты: Сокращенные таймауты, сжатие, keep-alive соединения
  • Улучшенная параллельная обработка: До 6 одновременных RSS источников и скраппинга
  • Ограничение размера контента: 2MB лимит для предотвращения перегрузки памяти
  • Автоматическая очистка кэша: TTL управление и graceful degradation
  • Композитные индексы БД: Оптимизация запросов для быстрой проверки дубликатов
  • Расширенное тестирование: 52.1% покрытие кода тестами, включая Redis кэш
  • Улучшенная надежность: Контексты с таймаутами, graceful shutdown

✅ Версия 2.3 - Исправление алгоритма анализа новостей

  • Исправление выявления тем: Алгоритм кластеризации теперь корректно выявляет 8+ основных тем вместо 0
  • Увеличение лимита новостей: С 300 до 800 новостей для анализа (более качественная аналитика)
  • Оптимизация расписания: 5 отправок сигналов в день (9:00, 12:00, 15:00, 20:00, 23:00)
  • Улучшение параметров кластеризации: Более гибкие настройки HDBSCAN для лучшего выявления тем
  • Оптимизация векторизации: Увеличен размер словаря с 10k до 15k слов
  • Улучшение предобработки: Более качественная очистка и токенизация текста

✅ Версия 2.2 - Миграция на Redis 8.4

  • Замена Kafka на Redis 8.4: 87% экономии памяти (768MB → 100MB), 87.5% экономии CPU
  • Redis Pub/Sub: Высокопроизводительный брокер сообщений с гарантированной доставкой
  • Упрощенная архитектура: Один контейнер вместо двух, автоматическая настройка persistence
  • Оптимизированные ресурсы: Redis 8.4-alpine3.22 использует минимальные ресурсы при высокой производительности

✅ Версия 2.1 - Исправление дублирования новостей

  • Глобальная дедупликация: Исправлена проблема дублирования новостей из разных источников
  • Оптимизация контент скрейпинга: Увеличена частота обработки до 1 минуты, размер батча до 50 новостей
  • Улучшенная проверка отправки: Глобальная проверка перед распределением новостей пользователям
  • Повышенная надежность: Улучшена логика сохранения факта отправки сообщений

✅ Production-ready оптимизация

  • Стабильная работа: Все компоненты оптимизированы для автоматического развертывания
  • CI/CD интеграция: Полная поддержка production deployment без ручных вмешательств
  • Экономия ресурсов: 30% экономии при гарантированной стабильности

✅ Оптимизация производительности

  • Параллельная обработка: Worker pool для одновременного парсинга RSS источников
  • Интеллектуальное кэширование: Кэширование источников (30 мин) и подписок (10 мин)
  • Батч-операции: Оптимизированные запросы к БД для проверки дубликатов
  • Redis оптимизации: Pub/Sub каналы, оптимизация памяти и высокая производительность

✅ Best Practices реализации

  • Graceful shutdown: Контексты для корректного завершения работы
  • Структурированное логирование: Уровни логирования с настраиваемой детализацией
  • Health monitoring: HTTP endpoints /health и /metrics для мониторинга
  • Observability: Prometheus-совместимые метрики производительности

✅ Оптимизация ресурсов для production

Сервис Память CPU Статус
bot 400MB 0.4 ✅ Production-ready (Redis кэш)
redis 80MB 0.05 ✅ Production-ready (Pub/Sub + Cache)
db 200MB 0.12 ✅ Production-ready (композитные индексы)
news-analyzer 512MB 0.3 ✅ Enhanced analysis (800 новостей, 8+ тем)
Итого 1192MB 0.87 Оптимизировано для сервера 1.2GB RAM, 1 CPU

✅ Переменные окружения для настройки

  • Гибкая настройка ресурсов через переменные окружения
  • Автоматическая адаптация к разным серверам
  • Оптимизированные health checks для надежности

✅ Аналитический модуль "Карта дня"

  • Отключен по умолчанию для экономии ресурсов
  • Возможность включения при наличии достаточных ресурсов (>2GB RAM)
  • Оптимизированное расписание запуска

🚀 Технические улучшения v2.4

  • Redis кэширование контента: Кэш скрапированного контента (TTL 30 мин, 3-10x ускорение)
  • Оптимизированные HTTP-клиенты: Таймауты 15сек, сжатие gzip, keep-alive, user-agent headers
  • Параллельная обработка: До 6 одновременных источников RSS и скраппинга
  • Ограничение памяти: 2MB лимит на контент, автоматическая очистка кэша (>1000 записей)
  • Композитные индексы: Оптимизация запросов к БД (link, scrape_status + published_at)
  • Контексты с таймаутами: Асинхронная обработка HTTP запросов с отменой
  • Graceful degradation: Работа без Redis кэша при его недоступности
  • Безопасность данных: Очистка null байтов и некорректных UTF-8 последовательностей
  • Расширенное тестирование: 52.1% покрытие кода, Redis бенчмарки, тесты безопасности
  • Conventional Commits: Соглашение о сообщениях коммитов на русском языке
  • Производительность: 3-10x ускорение обработки, 80-90% снижение запросов к БД
  • Экономия ресурсов: Оптимизированное использование ресурсов с поддержкой аналитического модуля

🚀 Технические улучшения v2.3

  • Исправление алгоритма анализа: Корректное выявление 8+ тем вместо 0, улучшенная кластеризация HDBSCAN
  • Увеличенный лимит новостей: 800 новостей для анализа вместо 300 (качественная аналитика)
  • Оптимизированное расписание: 5 отправок аналитических отчетов в день
  • Улучшенная векторизация: TF-IDF с 15k словарем вместо 10k, ngram_range (1,3)
  • Гибкая кластеризация: min_cluster_size=2, min_samples=1 для лучшего выявления малых кластеров
  • Оптимизированная предобработка: Улучшенная токенизация, фильтрация стоп-слов и длина слов
  • Расширенная база источников: 33 новостных источника различных категорий
  • Параллельная обработка: Worker pool для RSS парсинга (до 6 одновременных источников)
  • Интеллектуальное кэширование: Источники и подписки кэшируются для снижения нагрузки
  • Оптимизированные алгоритмы: Батч-операции и эффективные структуры данных
  • Встроенный мониторинг: Health checks и Prometheus метрики
  • Graceful shutdown: Корректное завершение работы без потери данных
  • Структурированное логирование: Настраиваемые уровни логирования
  • Производительность: 3-5x ускорение обработки, 80-90% снижение запросов к БД
  • Экономия ресурсов: 38% снижение потребления ресурсов по сравнению с v2.0

About

TG Bot парсит RSS-ленты новостей и выводит новости подписчикам

Resources

Contributing

Security policy

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages