Простой и приватный способ фиксировать своё эмоциональное состояние каждый день.
- О проекте
- Поиск по проекту
- Быстрый старт
- Конфигурация
- Структура проекта
- Поток данных
- Мониторинг
- Технологии
Mood Diary — мультиплатформенный бот (Telegram + VK), который помогает пользователю раз в день оценивать своё настроение по шкале от 0 до 10. Все данные сохраняются в базе, что позволяет отслеживать динамику эмоционального состояния, строить графики и анализировать паттерны.
- 🎯 Оценка настроения одним нажатием (шкала 0–10)
- 📊 Просмотр статистики за неделю / месяц / год
- 📈 Генерация инфографики с графиком настроения (
/export) - 💬 Поддержка Telegram и VK — одна база, разные платформы
- 🧱 Clean Architecture: Domain → Application → Infrastructure → Presentation
Этот репозиторий может быть полезен если ты ищешь:
- пример бота на aiogram 3.x
- VK бот без сторонних фреймворков — чистый long polling через
vk_api - шаблон Clean Architecture на Python
- мультиплатформенный бот с общей бизнес-логикой
- интеграция Prometheus + Grafana для мониторинга
- асинхронный PostgreSQL с SQLAlchemy 2.0
- Python 3.12+
- PostgreSQL 14+
- Docker и Docker Compose (рекомендуется)
- Токен бота от @BotFather
- Токен сообщества VK (опционально)
git clone https://github.com/ignavan39/mood_diary.git
cd mood_diary
cp .env.example .env # заполни переменные
docker compose up -dМиграции применятся автоматически при первом запуске.
uv sync
alembic upgrade head
python -m src.main| Переменная | Описание | Обязательно |
|---|---|---|
TG_BOT_TOKEN |
Токен Telegram бота | ✅ |
TG_BOT_ENABLED |
Включить Telegram бота | ✅ |
VK_BOT_TOKEN |
Токен сообщества VK | ❌ |
VK_BOT_GROUP_ID |
ID группы VK | ❌ |
VK_BOT_ENABLED |
Включить VK бота | ❌ |
PG__USER |
Пользователь PostgreSQL | ✅ |
PG__PASSWORD |
Пароль PostgreSQL | ✅ |
PG__HOST |
Хост PostgreSQL | ✅ |
PG__NAME |
Имя базы данных | ✅ |
PG__PORT |
Порт PostgreSQL | ✅ |
REDIS__HOST |
Хост Redis | ✅ |
REDIS__PASSWORD |
Пароль Redis | ✅ |
src/
├── main.py
├── domain/ # Бизнес-сущности, интерфейсы
│ ├── entities/ # User, Diary, StatsPeriod
│ ├── repositories/ # Интерфейсы репозиториев
│ ├── dtos/ # SaveDiaryDTO, UpdateDiaryDTO
│ └── exceptions/
├── application/ # Бизнес-логика
│ ├── use_cases/ # RegisterUser, RecordMood, GetUserStats,
│ │ # UpdateMood, GenerateMoodInfographic
│ ├── services/ # ChartGeneratorInterface
│ └── dtos/
├── infrastructure/ # Реализации
│ ├── database/ # SQLAlchemy модели и репозитории
│ ├── charts/ # MoodChartGenerator (matplotlib)
│ ├── cache/redis/ # RedisManager
│ ├── concurrency/ # ExecutorPool
│ ├── configs/ # Settings (pydantic-settings)
│ ├── ioc/container/ # DI контейнеры
│ ├── lifecycle/ # SignalHandler
│ └── metrics/ # Prometheus, Health check
└── presentation/
├── common/ # BaseBot, BotRunner, Messages
├── telegram/ # Telegram бот (aiogram 3.x)
│ ├── bot.py
│ ├── middlewares/ # MetricsMiddleware, ErrorHandlerMiddleware
│ └── endpoints/
│ ├── mood/ # /mood, /export
│ ├── user/ # /start, /profile
│ └── help/ # /help
└── vk/ # VK бот (vk_api, чистый long polling)
├── bot.py
├── polling.py # VkLongPolling — поток + адаптер событий
├── sdk/
│ ├── types.py # VkMessage, VkUser, VkEvent (frozen dataclasses)
│ └── keyboards.py # VkKeyboard builder
├── keyboards/ # Готовые клавиатуры проекта
│ ├── main.py
│ └── mood_select.py
└── handlers/ # Хендлеры — аналог Telegram controllers
├── base.py # VkHandler (ABC)
├── router.py # VkRouter — цепочка хендлеров
├── user/
│ ├── register.py
│ └── fallback.py
├── mood/
│ ├── mood.py # MoodMenuHandler, RecordMoodHandler, UpdateMoodHandler
│ ├── stats.py # StatsMenuHandler, StatsHandler
│ └── export.py # ExportHandler
└── help/
└── help.py
┌─────────────────────────────────────────────────┐
│ Presentation (Telegram handlers / VK handlers) │
│ → зависит от Application │
└────────────────────┬────────────────────────────┘
↓
┌─────────────────────────────────────────────────┐
│ Application (Use Cases, DTOs) │
│ → зависит от Domain │
└────────────────────┬────────────────────────────┘
↓
┌─────────────────────────────────────────────────┐
│ Domain (Entities, Repository Interfaces) │
│ → НЕ зависит ни от чего │
└─────────────────────────────────────────────────┘
↑
┌─────────────────────────────────────────────────┐
│ Infrastructure (SQLAlchemy, matplotlib, Redis) │
│ → реализует Domain интерфейсы │
└─────────────────────────────────────────────────┘
Telegram и VK используют одни и те же use cases и одну БД. Пользователи разделяются по полю platform.
VkLongPolling (поток)
↓ адаптирует vk_api события в VkMessage
VkRouter
↓ перебирает цепочку VkHandler
VkHandler (ABC)
↓ вызывает use case → отправляет ответ через vk_api
| Сервис | URL | Доступ |
|---|---|---|
| Grafana | http://localhost:3000 | admin / admin123 |
| Prometheus | http://localhost:9090 | — |
| Bot Metrics | http://localhost:8000/metrics | — |
| Health | http://localhost:8080/health | — |
| Компонент | Технология |
|---|---|
| Backend | Python 3.12+, asyncio |
| Telegram | aiogram 3.x |
| VK | vk_api (чистый long polling, без фреймворков) |
| Charts | matplotlib (Agg, потокобезопасный) |
| ORM | SQLAlchemy 2.0 + asyncpg |
| Config | Pydantic Settings |
| Migrations | Alembic |
| DI | dependency-injector |
| Cache | Redis |
| Monitoring | Prometheus + Grafana |
| Packaging | Docker, Compose, uv |
mypy src/
ruff check src/ && ruff format src/- Поставь звезду ⭐ — это лучшая поддержка!
- Расскажи другу 🗣️ — если считаешь полезным
- Предложи идею 💡 — через Issues или Discussions
- Исправь опечатку ✏️ — любой вклад важен
Спасибо что заглянул! 🙏
MIT — подробности в файле LICENSE.
⚠️ Важно: Этот бот не является медицинским инструментом. Если вы испытываете стойкое ухудшение настроения, тревогу или депрессивные состояния — обратитесь к квалифицированному специалисту.
Сделано с заботой о ментальном здоровье 🌱
