{"id":47814146,"url":"https://github.com/ignavan39/mood_diary","last_synced_at":"2026-04-03T18:21:52.447Z","repository":{"id":341570814,"uuid":"1170584571","full_name":"ignavan39/mood_diary","owner":"ignavan39","description":"Telegram-бот для трекинга настроения с аналитикой, Clean Architecture, PostgreSQL, Prometheus, async Python","archived":false,"fork":false,"pushed_at":"2026-03-25T15:28:58.000Z","size":2557,"stargazers_count":2,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-03-25T15:50:27.934Z","etag":null,"topics":["aiogram","clean-architecture","docker-compose","grafana","mental-health","mood-diary","mood-tracker","python","sqlalchemy","telegrambot","telegrambotapi"],"latest_commit_sha":null,"homepage":"https://t.me/mood_diary_bbot","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ignavan39.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-02T09:37:30.000Z","updated_at":"2026-03-25T15:29:30.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ignavan39/mood_diary","commit_stats":null,"previous_names":["ignavan39/mood_diary"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/ignavan39/mood_diary","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ignavan39%2Fmood_diary","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ignavan39%2Fmood_diary/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ignavan39%2Fmood_diary/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ignavan39%2Fmood_diary/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ignavan39","download_url":"https://codeload.github.com/ignavan39/mood_diary/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ignavan39%2Fmood_diary/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31368168,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-03T17:53:18.093Z","status":"ssl_error","status_checked_at":"2026-04-03T17:53:17.617Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aiogram","clean-architecture","docker-compose","grafana","mental-health","mood-diary","mood-tracker","python","sqlalchemy","telegrambot","telegrambotapi"],"created_at":"2026-04-03T18:21:50.554Z","updated_at":"2026-04-03T18:21:52.025Z","avatar_url":"https://github.com/ignavan39.png","language":"Python","readme":"# 📓 Mood Diary — Бот для отслеживания настроения\n\n\u003e Простой и приватный способ фиксировать своё эмоциональное состояние каждый день.\n\n[![Python](https://img.shields.io/badge/Python-3.12+-blue.svg)](https://www.python.org/)\n[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n[![Docker](https://img.shields.io/badge/Docker-ready-blue.svg)](https://www.docker.com/)\n[![Architecture](https://img.shields.io/badge/Architecture-Clean%20Architecture-orange)](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)\n[![Stars](https://img.shields.io/github/stars/ignavan39/mood_diary?style=flat)](https://github.com/ignavan39/mood_diary/stargazers)\n[![uv](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/uv/main/assets/badge/v0.json)](https://github.com/astral-sh/uv)\n\n---\n\n![](./.github/assets/social-preview.png)\n\n## 📋 Оглавление\n- [О проекте](#-о-проекте)\n- [Поиск по проекту](#-поиск-по-проекту)\n- [Быстрый старт](#-быстрый-старт)\n- [Конфигурация](#️-конфигурация)\n- [Структура проекта](#️-структура-проекта)\n- [Поток данных](#-поток-данных)\n- [Мониторинг](#-мониторинг)\n- [Технологии](#-технологии)\n\n---\n\n## 📋 О проекте\n\n**Mood Diary** — мультиплатформенный бот (Telegram + VK), который помогает пользователю раз в день оценивать своё настроение по шкале от **0 до 10**. Все данные сохраняются в базе, что позволяет отслеживать динамику эмоционального состояния, строить графики и анализировать паттерны.\n\n### ✨ Возможности\n- 🎯 Оценка настроения одним нажатием (шкала 0–10)\n- 📊 Просмотр статистики за неделю / месяц / год\n- 📈 Генерация инфографики с графиком настроения (`/export`)\n- 💬 Поддержка Telegram и VK — одна база, разные платформы\n- 🧱 Clean Architecture: Domain → Application → Infrastructure → Presentation\n\n---\n\n## 🔍 Поиск по проекту\n\nЭтот репозиторий может быть полезен если ты ищешь:\n\n- пример бота на aiogram 3.x\n- VK бот без сторонних фреймворков — чистый long polling через `vk_api`\n- шаблон Clean Architecture на Python\n- мультиплатформенный бот с общей бизнес-логикой\n- интеграция Prometheus + Grafana для мониторинга\n- асинхронный PostgreSQL с SQLAlchemy 2.0\n\n---\n\n## 🚀 Быстрый старт\n\n### Требования\n- Python 3.12+\n- PostgreSQL 14+\n- Docker и Docker Compose *(рекомендуется)*\n- Токен бота от [@BotFather](https://t.me/BotFather)\n- Токен сообщества VK *(опционально)*\n\n### 🐳 Запуск через Docker Compose\n\n```bash\ngit clone https://github.com/ignavan39/mood_diary.git\ncd mood_diary\ncp .env.example .env  # заполни переменные\ndocker compose up -d\n```\n\nМиграции применятся автоматически при первом запуске.\n\n### 💻 Локальный запуск\n\n```bash\nuv sync\nalembic upgrade head\npython -m src.main\n```\n\n---\n\n## ⚙️ Конфигурация\n\n| Переменная | Описание | Обязательно |\n|---|---|---|\n| `TG_BOT_TOKEN` | Токен Telegram бота | ✅ |\n| `TG_BOT_ENABLED` | Включить Telegram бота | ✅ |\n| `VK_BOT_TOKEN` | Токен сообщества VK | ❌ |\n| `VK_BOT_GROUP_ID` | ID группы VK | ❌ |\n| `VK_BOT_ENABLED` | Включить VK бота | ❌ |\n| `PG__USER` | Пользователь PostgreSQL | ✅ |\n| `PG__PASSWORD` | Пароль PostgreSQL | ✅ |\n| `PG__HOST` | Хост PostgreSQL | ✅ |\n| `PG__NAME` | Имя базы данных | ✅ |\n| `PG__PORT` | Порт PostgreSQL | ✅ |\n| `REDIS__HOST` | Хост Redis | ✅ |\n| `REDIS__PASSWORD` | Пароль Redis | ✅ |\n\n---\n\n## 🗂️ Структура проекта\n\n```\nsrc/\n├── main.py\n├── domain/                          # Бизнес-сущности, интерфейсы\n│   ├── entities/                    # User, Diary, StatsPeriod\n│   ├── repositories/                # Интерфейсы репозиториев\n│   ├── dtos/                        # SaveDiaryDTO, UpdateDiaryDTO\n│   └── exceptions/\n├── application/                     # Бизнес-логика\n│   ├── use_cases/                   # RegisterUser, RecordMood, GetUserStats,\n│   │                                # UpdateMood, GenerateMoodInfographic\n│   ├── services/                    # ChartGeneratorInterface\n│   └── dtos/\n├── infrastructure/                  # Реализации\n│   ├── database/                    # SQLAlchemy модели и репозитории\n│   ├── charts/                      # MoodChartGenerator (matplotlib)\n│   ├── cache/redis/                 # RedisManager\n│   ├── concurrency/                 # ExecutorPool\n│   ├── configs/                     # Settings (pydantic-settings)\n│   ├── ioc/container/               # DI контейнеры\n│   ├── lifecycle/                   # SignalHandler\n│   └── metrics/                     # Prometheus, Health check\n└── presentation/\n    ├── common/                      # BaseBot, BotRunner, Messages\n    ├── telegram/                    # Telegram бот (aiogram 3.x)\n    │   ├── bot.py\n    │   ├── middlewares/             # MetricsMiddleware, ErrorHandlerMiddleware\n    │   └── endpoints/\n    │       ├── mood/                # /mood, /export\n    │       ├── user/                # /start, /profile\n    │       └── help/                # /help\n    └── vk/                          # VK бот (vk_api, чистый long polling)\n        ├── bot.py\n        ├── polling.py               # VkLongPolling — поток + адаптер событий\n        ├── sdk/\n        │   ├── types.py             # VkMessage, VkUser, VkEvent (frozen dataclasses)\n        │   └── keyboards.py        # VkKeyboard builder\n        ├── keyboards/               # Готовые клавиатуры проекта\n        │   ├── main.py\n        │   └── mood_select.py\n        └── handlers/                # Хендлеры — аналог Telegram controllers\n            ├── base.py              # VkHandler (ABC)\n            ├── router.py            # VkRouter — цепочка хендлеров\n            ├── user/\n            │   ├── register.py\n            │   └── fallback.py\n            ├── mood/\n            │   ├── mood.py          # MoodMenuHandler, RecordMoodHandler, UpdateMoodHandler\n            │   ├── stats.py         # StatsMenuHandler, StatsHandler\n            │   └── export.py        # ExportHandler\n            └── help/\n                └── help.py\n```\n\n---\n\n## 🔁 Поток данных\n\n```\n┌─────────────────────────────────────────────────┐\n│ Presentation (Telegram handlers / VK handlers)  │\n│ → зависит от Application                        │\n└────────────────────┬────────────────────────────┘\n                     ↓\n┌─────────────────────────────────────────────────┐\n│ Application (Use Cases, DTOs)                   │\n│ → зависит от Domain                             │\n└────────────────────┬────────────────────────────┘\n                     ↓\n┌─────────────────────────────────────────────────┐\n│ Domain (Entities, Repository Interfaces)        │\n│ → НЕ зависит ни от чего                         │\n└─────────────────────────────────────────────────┘\n                     ↑\n┌─────────────────────────────────────────────────┐\n│ Infrastructure (SQLAlchemy, matplotlib, Redis)  │\n│ → реализует Domain интерфейсы                   │\n└─────────────────────────────────────────────────┘\n```\n\nTelegram и VK используют **одни и те же use cases** и **одну БД**. Пользователи разделяются по полю `platform`.\n\n### VK архитектура (без сторонних фреймворков)\n\n```\nVkLongPolling (поток)\n    ↓ адаптирует vk_api события в VkMessage\nVkRouter\n    ↓ перебирает цепочку VkHandler\nVkHandler (ABC)\n    ↓ вызывает use case → отправляет ответ через vk_api\n```\n\n---\n\n## 📊 Мониторинг\n\n| Сервис | URL | Доступ |\n|--------|-----|--------|\n| **Grafana** | http://localhost:3000 | admin / admin123 |\n| **Prometheus** | http://localhost:9090 | — |\n| **Bot Metrics** | http://localhost:8000/metrics | — |\n| **Health** | http://localhost:8080/health | — |\n\n---\n\n## 📦 Технологии\n\n| Компонент | Технология |\n|-----------|-----------|\n| **Backend** | Python 3.12+, asyncio |\n| **Telegram** | aiogram 3.x |\n| **VK** | vk_api (чистый long polling, без фреймворков) |\n| **Charts** | matplotlib (Agg, потокобезопасный) |\n| **ORM** | SQLAlchemy 2.0 + asyncpg |\n| **Config** | Pydantic Settings |\n| **Migrations** | Alembic |\n| **DI** | dependency-injector |\n| **Cache** | Redis |\n| **Monitoring** | Prometheus + Grafana |\n| **Packaging** | Docker, Compose, uv |\n\n---\n\n## Код стайл\n\n```bash\nmypy src/\nruff check src/ \u0026\u0026 ruff format src/\n```\n\n---\n\n## ⭐ Понравился проект?\n\n- Поставь звезду ⭐ — это лучшая поддержка!\n- Расскажи другу 🗣️ — если считаешь полезным\n- Предложи идею 💡 — через Issues или Discussions\n- Исправь опечатку ✏️ — любой вклад важен\n\nСпасибо что заглянул! 🙏\n\n---\n\n## 📄 Лицензия\n\nMIT — подробности в файле [LICENSE](LICENSE).\n\n---\n\n\u003e ⚠️ **Важно**: Этот бот не является медицинским инструментом. Если вы испытываете стойкое ухудшение настроения, тревогу или депрессивные состояния — обратитесь к квалифицированному специалисту.\n\n---\n*Сделано с заботой о ментальном здоровье 🌱*","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fignavan39%2Fmood_diary","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fignavan39%2Fmood_diary","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fignavan39%2Fmood_diary/lists"}