https://github.com/ignavan39/mood_diary
Telegram-бот для трекинга настроения с аналитикой, Clean Architecture, PostgreSQL, Prometheus, async Python
https://github.com/ignavan39/mood_diary
aiogram clean-architecture docker-compose grafana mental-health mood-diary mood-tracker python sqlalchemy telegrambot telegrambotapi
Last synced: 14 days ago
JSON representation
Telegram-бот для трекинга настроения с аналитикой, Clean Architecture, PostgreSQL, Prometheus, async Python
- Host: GitHub
- URL: https://github.com/ignavan39/mood_diary
- Owner: ignavan39
- License: mit
- Created: 2026-03-02T09:37:30.000Z (about 2 months ago)
- Default Branch: master
- Last Pushed: 2026-03-25T15:28:58.000Z (23 days ago)
- Last Synced: 2026-03-25T15:50:27.934Z (23 days ago)
- Topics: aiogram, clean-architecture, docker-compose, grafana, mental-health, mood-diary, mood-tracker, python, sqlalchemy, telegrambot, telegrambotapi
- Language: Python
- Homepage: https://t.me/mood_diary_bbot
- Size: 2.44 MB
- Stars: 2
- Watchers: 0
- Forks: 0
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# 📓 Mood Diary — Бот для отслеживания настроения
> Простой и приватный способ фиксировать своё эмоциональное состояние каждый день.
[](https://www.python.org/)
[](LICENSE)
[](https://www.docker.com/)
[](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)
[](https://github.com/ignavan39/mood_diary/stargazers)
[](https://github.com/astral-sh/uv)
---

## 📋 Оглавление
- [О проекте](#-о-проекте)
- [Поиск по проекту](#-поиск-по-проекту)
- [Быстрый старт](#-быстрый-старт)
- [Конфигурация](#️-конфигурация)
- [Структура проекта](#️-структура-проекта)
- [Поток данных](#-поток-данных)
- [Мониторинг](#-мониторинг)
- [Технологии](#-технологии)
---
## 📋 О проекте
**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](https://t.me/BotFather)
- Токен сообщества VK *(опционально)*
### 🐳 Запуск через Docker Compose
```bash
git clone https://github.com/ignavan39/mood_diary.git
cd mood_diary
cp .env.example .env # заполни переменные
docker compose up -d
```
Миграции применятся автоматически при первом запуске.
### 💻 Локальный запуск
```bash
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`.
### VK архитектура (без сторонних фреймворков)
```
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 |
---
## Код стайл
```bash
mypy src/
ruff check src/ && ruff format src/
```
---
## ⭐ Понравился проект?
- Поставь звезду ⭐ — это лучшая поддержка!
- Расскажи другу 🗣️ — если считаешь полезным
- Предложи идею 💡 — через Issues или Discussions
- Исправь опечатку ✏️ — любой вклад важен
Спасибо что заглянул! 🙏
---
## 📄 Лицензия
MIT — подробности в файле [LICENSE](LICENSE).
---
> ⚠️ **Важно**: Этот бот не является медицинским инструментом. Если вы испытываете стойкое ухудшение настроения, тревогу или депрессивные состояния — обратитесь к квалифицированному специалисту.
---
*Сделано с заботой о ментальном здоровье 🌱*