Простой и приватный способ фиксировать своё эмоциональное состояние каждый день.
- О проекте
- Поиск по проекту
- Быстрый старт
- Конфигурация
- Структура проекта
- Поток данных
- Мониторинг
- Технологии
Mood Diary — это телеграм-бот, который помогает пользователю раз в день оценивать своё настроение по шкале от 0 до 10. Все данные сохраняются в базе, что позволяет отслеживать динамику эмоционального состояния, строить графики и анализировать паттерны.
- 🎯 Оценка настроения одним нажатием (шкала 0–10)
- 📅 Напоминание раз в день (настраиваемое время)
- 📊 Просмотр истории и статистики за неделю/месяц
- 🧱 Чистая архитектура: Domain → Repository → Infrastructure
Этот репозиторий может быть полезен если ты ищешь:
- пример бота на aiogram 3.x
- шаблон Clean Architecture на Python
- интеграция Prometheus + Grafana для мониторинга
- асинхронный PostgreSQL с SQLAlchemy 2.0
- self-hosted решение для ментального здоровья
- телеграм бот для дневника настроения
- Python 3.12+
- PostgreSQL 14+
- Docker и Docker Compose (опционально, но рекомендуется)
- Токен бота от @BotFather
- Клонируйте репозиторий:
git clone https://github.com/ignavan39/mood_diary.git
cd mood_diary- Создайте файл окружения
.envв корне проекта:
# Telegram
TG_BOT__TOKEN=your_telegram_bot_token_here
# Database
PG__USER=
PG__PASSWORD=
PG__HOST=
PG__NAME=
PG__PORT=
# App
TIMEZONE=Europe/Moscow
REMINDER_TIME=20:00
# Monitoring
GRAFANA_PASSWORD=
GRAFANA_USER=- Запустите сервисы:
docker compose up -d- Примените миграции:
в целом при сборке всех приложений запуститься образ migrate и накатит миграции сам если требуется отдельно то:
docker compose exec app alembic upgrade headили
docker compose up --build postgres migrate- Запустите бота и напишите ему в Telegram
/start
- Установите зависимости (рекомендуется использовать
uv):
# Если установлен uv
uv sync
# Или через pip
pip install -r <(uv export)-
Создайте и настройте
.env(см. пример выше). -
Примените миграции:
alembic upgrade head- Запустите бота:
python -m src.mainВсе настройки задаются через переменные окружения или файл .env.
mood-diary-bot/
├── README.md # Этот файл
├── src/
│ ├── main.py # Точка входа
│ ├── domain/ # Domain слой
│ │ ├── entities/ # Бизнес-сущности
│ │ ├── repositories/ # Интерфейсы репозиториев
│ │ └── exceptions/ # Domain исключения
│ ├── application/ # Application слой
│ │ ├── use_cases/ # Бизнес-логика
│ │ └── dtos/ # DTO для запросов/ответов
│ ├── infrastructure/ # Infrastructure слой
│ │ ├── database/ # SQLAlchemy, модели, репозитории
│ │ ├── ioc/ # DI контейнер
│ │ └── configs/ # Настройки
│ └── presintation/ # Presentation слой
│ └── telegram/ # aiogram хендлеры
│ └── user/
│ ├── router.py # Роутеры и хендлеры
│ └── controllers/ # Контроллеры
├──monitoring/
| └── grafana/
├──prometheus.yml # Конфиг сбора метрик
│ └── provisioning/
│ ├── dashboards/
│ │ ├── dashboards.yml # Конфиг авто-загрузки дашбордов
│ │ └── mood-diary.json # Готовый дашборд с метриками
│ └── datasources/
│ └── prometheus.yml # Подключение Prometheus
├── pyproject.toml # Зависимости и метаданные проекта
├── uv.lock # Lock-файл зависимостей (uv)
├── alembic.ini # Настройки Alembic
├── docker-compose.yml # Оркестрация сервисов
├── Dockerfile # Образ приложения
└── .env.example # Шаблон переменных окружения
┌─────────────────────────────────────────┐
│ Presentation (Telegram handlers) │
│ → зависит от Application │
└─────────────────┬───────────────────────┘
↓
┌─────────────────────────────────────────┐
│ Application (Use Cases, DTOs) │
│ → зависит от Domain │
└─────────────────┬───────────────────────┘
↓
┌─────────────────────────────────────────┐
│ Domain (Entities, Repository Interfaces)│
│ → НЕ зависит ни от чего │
└─────────────────────────────────────────┘
↑
┌─────────────────────────────────────────┐
│ Infrastructure (SQLAlchemy, aiogram) │
│ → реализует Domain интерфейсы │
└─────────────────────────────────────────┘
Папка monitoring/ содержит конфигурацию Prometheus + Grafana:
| Компонент | Описание |
|---|---|
| Grafana dashboards | Готовый дашборд с метриками бота (сообщения, ошибки, время ответа, пользователи) |
| Prometheus config | Настройка скрейпинга метрик с бота и PostgreSQL |
| Auto-provisioning | Дашборды и datasource подключаются автоматически при старте |
| Сервис | URL | Логин/Пароль |
|---|---|---|
| Grafana | http://localhost:3000 | admin / admin123 |
| Prometheus | http://localhost:9090 | — |
| Bot Metrics | http://localhost:8000/metrics | — |
# Запустить весь стек с мониторингом
docker compose up -d
# Открыть Grafana
open http://localhost:3000
# Дашборд появится автоматически через 30 секунд
# Dashboards → Browse → Mood Diary Bot| Метрика | Тип | Описание |
|---|---|---|
bot_messages_total |
Counter | Всего обработано сообщений |
bot_request_duration_seconds |
Histogram | Время обработки запроса |
bot_active_users |
Gauge | Активных пользователей за час |
bot_users_registered_total |
Counter | Всего зарегистрировано пользователей |
| Компонент | Технология | Зачем |
|---|---|---|
| Backend | Python 3.12+, asyncio | Асинхронность, высокая производительность |
| Bot Framework | aiogram 3.x | Современный async-фреймворк для Telegram |
| ORM | SQLAlchemy 2.0 + asyncpg | Типизированные async-запросы к PostgreSQL |
| Config | Pydantic Settings | Валидация настроек, типизация, .env-поддержка |
| Migrations | Alembic | Управление схемой БД |
| DI/Architecture | Clean Architecture + Repository Pattern | Разделение слоёв, тестируемость |
| Containerization | Docker, Compose | Воспроизводимая среда, лёгкий деплой |
| Package Manager | uv (или pip) | Быстрая установка зависимостей |
# Проверка типов
mypy src/
# Линтинг
ruff check src/ && ruff format src/
- Поставь звезду ⭐ — это лучшая поддержка!
- Расскажи другу 🗣️ — если считаешь полезным
- Предложи идею 💡 — через Issues или Discussions
- Исправь опечатку ✏️ — любой вклад важен
Спасибо что заглянул! 🙏
Распространяется под лицензией MIT. Подробности — в файле LICENSE.
⚠️ Важно: Этот бот не является медицинским инструментом. Если вы испытываете стойкое ухудшение настроения, тревогу или депрессивные состояния — обратитесь к квалифицированному специалисту.
Сделано с заботой о ментальном здоровье 🌱

