Goals Tracker — приложение для отслеживания ежедневных целей и привычек: воды, сна, шагов, тренировок, питания и общего прогресса за месяц.
Репозиторий организован как монорепозиторий. Сейчас в нем есть веб-интерфейс на React, Telegram-бот на Python и начальный backend API на Go. Общая идея проекта: дать пользователю быстрый и понятный способ отмечать выполненные действия за день и видеть, насколько стабильно он движется к своим целям.
- Веб-приложение с главной страницей целей на сегодня.
- Карточки ежедневных целей с возможностью отметить выполнение.
- Виджет статистики по текущему дню.
- Календарь прогресса за месяц.
- Анимация поздравления, когда все цели за день выполнены.
- Telegram-бот с базовой архитектурой под работу с целями.
- Backend API на Go с тестовым endpoint целей.
- Docker Compose конфигурация для локального Postgres.
- Моковые данные и моковый репозиторий, которые можно заменить реальным API или базой данных.
.
├── apps
│ ├── web # React-приложение на Vite
│ ├── bot # Telegram-бот на Python и aiogram
│ └── api # Backend API на Go
├── packages # место для будущих общих пакетов
├── package.json # общие команды монорепозитория
├── docker-compose.yml
└── pnpm-workspace.yaml
Веб-приложение собрано на React, TypeScript и Vite.
Основные директории:
src/app— корневой компонент приложения и глобальные стили.src/pages— страницы приложения. Сейчас есть главная страница.src/widgets— крупные блоки интерфейса: цели на сегодня, статистика, календарь.src/entities— доменные типы, например цель и прогресс дня.src/shared— общие UI-компоненты и утилиты.
Сейчас данные для веб-интерфейса лежат в apps/web/src/pages/home/model/mockData.ts.
Это удобно для разработки интерфейса без backend. Когда появится API, моковые
данные можно заменить загрузкой с сервера.
Telegram-бот написан на Python 3.9+ с использованием aiogram.
Архитектура разделена на слои:
domain— бизнес-сущности. Этот слой не зависит от Telegram, aiogram, окружения или хранилищ.application— сценарии использования и порты для репозиториев.infrastructure— адаптеры к внешним системам. Сейчас здесь находится моковый репозиторий.presentation/telegram— Telegram-слой: роутеры, клавиатуры и форматирование сообщений.config— чтение и проверка настроек из переменных окружения.app.py— сборка зависимостей приложения.main.py— точка входа для запуска бота.
Такое разделение позволяет в будущем подключить реальную базу данных или backend API без переписывания Telegram-обработчиков.
Backend API написан на Go.
Основные директории:
cmd/api— точка входа HTTP-сервера.internal/domain— доменные сущности API.internal/httpapi— HTTP-роуты и обработчики.internal/repository— порт репозитория и временная in-memory реализация.internal/config— чтение настроек из переменных окружения.migrations— SQL-схема для Postgres.
Сейчас endpoint целей использует in-memory данные. Postgres уже подготовлен через
docker-compose.yml и миграцию apps/api/migrations/001_create_goals.sql.
Для локальной разработки понадобятся:
- Node.js и pnpm.
- Python 3.9 или новее.
- Go 1.22 или новее.
- Docker, если нужно поднять локальный Postgres.
- Telegram bot token, если нужно запускать бота.
Если pnpm еще не установлен, его можно включить через Corepack:
corepack enableИз корня репозитория:
pnpm installДля Telegram-бота отдельно создается Python virtual environment:
pnpm bot:setupЭта команда перейдет в apps/bot, создаст .venv и установит зависимости из
requirements.txt.
pnpm devКоманда запускает Vite dev server для пакета @goals-tracker/web. После запуска
адрес локального сервера появится в терминале, обычно это http://localhost:5173.
Дополнительные команды:
pnpm build
pnpm preview
pnpm lintpnpm build— собирает production-версию веб-приложения.pnpm preview— запускает локальный preview собранного приложения.pnpm lint— проверяет код веб-приложения через ESLint.
Сначала создайте файл окружения:
cp apps/bot/.env.example apps/bot/.envЗатем укажите в apps/bot/.env токен Telegram-бота:
BOT_TOKEN=123456:your-telegram-bot-tokenПосле этого бота можно запустить из корня репозитория:
pnpm bot:devИли напрямую из папки apps/bot:
make runПеред первым запуском из папки apps/bot выполните:
make setuppnpm bot:checkКоманда запускает compileall для исходников бота и помогает быстро поймать
синтаксические ошибки в Python-коде.
Из корня репозитория:
pnpm api:devИли напрямую:
cd apps/api
make runПо умолчанию API слушает http://localhost:8080.
Проверить endpoint можно так:
curl http://localhost:8080/health
curl http://localhost:8080/api/v1/goals
curl -X PATCH http://localhost:8080/api/v1/goals/water/toggle
curl -X PATCH 'http://localhost:8080/api/v1/goals/water/toggle?date=2026-05-11'Настройка целей на месяц:
curl http://localhost:8080/api/v1/goal-presets
curl 'http://localhost:8080/api/v1/goal-period-plan/status?month=2026-05'
curl 'http://localhost:8080/api/v1/goal-period-plan?month=2026-05'
curl -X PUT http://localhost:8080/api/v1/goal-period-plan \
-H 'Content-Type: application/json' \
-d '{"month":"2026-05","goals":[{"id":"water","kind":"water","title":"Вода","targetLabel":"2.5 л"}]}'Для обычного веб-входа доступны:
curl -i -X POST http://localhost:8080/api/v1/auth/register \
-H 'Content-Type: application/json' \
-d '{"email":"user@example.com","password":"secret-password"}'
curl -i -X POST http://localhost:8080/api/v1/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"user@example.com","password":"secret-password"}'Ожидаемый ответ для целей:
{
"items": [
{
"id": "workout",
"userId": "demo",
"title": "Тренировка",
"targetLabel": "выполнено",
"isCompleted": true
}
]
}Локальный Postgres можно поднять так:
docker compose up -d postgresВеб-приложение читает VITE_API_BASE_URL. В dev-режиме значение можно оставить
пустым: frontend будет ходить на относительный /api, а Vite проксирует запросы
в Go API. Если приложение открыто не как Telegram Mini App и сессии еще нет,
frontend покажет форму входа или регистрации.
cp apps/web/.env.example apps/web/.env
pnpm api:dev
pnpm devTelegram-бот читает BACKEND_API_URL. Если переменная не задана или API
недоступен, бот использует текущий моковый репозиторий.
cp apps/bot/.env.example apps/bot/.env
pnpm api:dev
pnpm bot:dev| Команда | Назначение |
|---|---|
pnpm dev |
Запустить веб-приложение в режиме разработки |
pnpm build |
Собрать веб-приложение |
pnpm preview |
Посмотреть production-сборку локально |
pnpm lint |
Проверить веб-приложение линтером |
pnpm bot:setup |
Создать .venv и установить зависимости бота |
pnpm bot:dev |
Запустить Telegram-бота |
pnpm bot:check |
Проверить Python-код бота на синтаксические ошибки |
pnpm api:dev |
Запустить backend API |
pnpm api:test |
Запустить Go-тесты backend API |
Сейчас обязательная переменная нужна только Telegram-боту. Для API есть необязательные настройки запуска:
| Переменная | Где используется | Описание |
|---|---|---|
BOT_TOKEN |
apps/bot |
Токен Telegram-бота, полученный у BotFather |
BACKEND_API_URL |
apps/bot |
Адрес backend API, например http://localhost:8080 |
VITE_API_BASE_URL |
apps/web |
Адрес backend API для веб-приложения |
HTTP_ADDR |
apps/api |
Адрес HTTP-сервера, по умолчанию :8080 |
DATABASE_URL |
apps/api |
Строка подключения к Postgres для будущего DB-репозитория |
TELEGRAM_BOT_TOKEN |
apps/api |
Токен бота для проверки Telegram Mini App initData |
Не добавляйте реальные значения токенов и секретов в git. Для примера используйте
.env.example, а реальные значения храните только в локальном .env.
Ближайшие логичные направления:
- Подключить backend API или базу данных вместо моковых данных.
- Синхронизировать веб-приложение и Telegram-бота через общий источник данных.
- Добавить авторизацию пользователя.
- Расширить модель целей: периодичность, единицы измерения, история выполнения.
- Добавить тесты для бизнес-логики и ключевых UI-сценариев.
- Вынести общие типы или клиент API в
packages/*, когда они понадобятся и вебу, и боту.
apps/web/src/pages/home/model/mockData.ts— текущие моковые цели и прогресс.apps/web/src/entities/goal/model/types.ts— TypeScript-модель цели.apps/web/src/entities/day-progress/model/types.ts— TypeScript-модель прогресса дня.apps/bot/src/goals_tracker_bot/domain/goals.py— доменные сущности бота.apps/bot/src/goals_tracker_bot/application/use_cases.py— сценарии использования бота.apps/bot/.env.example— пример переменных окружения для бота.apps/api/internal/domain/goal.go— доменная модель цели в API.apps/api/internal/httpapi/router.go— первые HTTP endpoint API.apps/api/migrations/001_create_goals.sql— начальная схема таблицы целей.apps/web/src/shared/api/goalsApi.ts— HTTP-клиент веб-приложения для API.apps/bot/src/goals_tracker_bot/infrastructure/api/goal_repository.py— HTTP-репозиторий бота для API.