Telegram-бот и административная панель для сообщества "Анонимные Алкоголики".
Проект состоит из четырёх частей:
- Telegram-бот на
Telegraf - backend API на
Express - SQLite-хранилище на
better-sqlite3 - Telegram Mini App для администрирования контента и справочников
- показывает стартовое меню и сценарии для:
- новичков
- участников сообщества
- родственников
- ведёт по веткам FAQ, информации об АА и расписанию групп
- показывает динамический список групп из базы данных
- поддерживает кнопку "Назад" через навигационный стек
- логирует действия пользователей и периодически отправляет статистику администратору
- использует единый error handler для Telegram-хендлеров
Telegram Mini App позволяет:
- управлять группами АА и Ал-Анон
- редактировать тексты сообщений бота
- редактировать ссылки и настройки
- управлять списком администраторов
- смотреть пользователей, их действия и статистику
API обслуживает админку и включает:
- JWT-аутентификацию через Telegram WebApp
initData - CRUD для групп
- обновление расписаний групп
- редактирование сообщений, ссылок и настроек
- управление администраторами
- просмотр пользователей и статистики
- валидацию входных данных через
zod
- Node.js 18+
- TypeScript
- Telegraf 4
- Express 5
- SQLite +
better-sqlite3 - React 19 + Vite
- Telegram WebApp / Mini App
src/ bot, API, база данных, handlers и shared utilities
admin/ React Mini App для администрирования
data/ runtime SQLite файлы
docs/ заметки и документация
specs/ feature specs и планы
tests/ unit и integration тесты
Создайте .env в корне проекта:
BOT_TOKEN=your_telegram_bot_token
TG_ID=your_telegram_id
ADMIN_IDS=123456789,987654321
JWT_SECRET=strong_secret
WEBAPP_URL=https://your-domain.example
PORT=5000Описание:
BOT_TOKEN— токен бота от BotFatherTG_ID— Telegram ID основного администратора; ему бот отправляет уведомление о запуске и статистикуADMIN_IDS— дополнительные Telegram ID администраторов через запятуюJWT_SECRET— секрет для подписи JWT токенов APIWEBAPP_URL— публичный URL Mini App, который открывается из TelegramPORT— порт HTTP-сервера, по умолчанию5000
git clone https://github.com/Sattturday/aa-bot.git
cd aa-bot
npm install
cd admin && npm install && cd ..npm run devКоманда запускает TypeScript в watch-режиме и перезапускает dist/index.js.
cd admin
npm run devnpm run build
cd admin && npm run buildnpm run startExpress-сервер:
- обслуживает API по префиксу
/api - раздаёт собранную админку из
admin/dist - использует SPA fallback для Mini App
Публичные:
POST /api/auth/validateGET /api/health
Под JWT:
GET/POST/PUT/DELETE /api/groupsPUT /api/groups/:id/schedulesGET/PUT /api/messagesGET/PUT /api/urlsGET/PUT /api/settingsGET/POST/DELETE /api/adminsGET /api/usersGET /api/users/:telegram_id/actionsGET /api/stats
SQLite база хранится в data/bot.db.
В базе поддерживаются:
- группы и их расписания
- тексты сообщений бота
- ссылки
- настройки
- администраторы
- пользователи
- история действий пользователей
При первом запуске приложение:
- инициализирует схему БД
- сидирует базовые данные
- добавляет администраторов из
ADMIN_IDS - всегда добавляет
TG_IDкак администратора
npm test
npm run build
cd admin && npm run build
cd admin && npm run lintСейчас в проекте есть automated tests для:
- Telegram handler error flow
- auth middleware и auth controller
- validation middleware и Zod-схем
- router wiring
- utility-модулей вроде
navigationStack,slugify,telegramAuth
Для сборки Docker-образа:
npm run docker_buildДля локального production-подобного запуска через Compose:
docker compose up --buildЧто делает текущая конфигурация:
- поднимает один контейнер с ботом, API и раздачей
admin/dist - публикует приложение на порту
5000 - сохраняет SQLite-данные через bind mount
./data:/usr/src/app/data - проверяет доступность сервиса через
GET /api/health
- Mini App в production должен открываться по HTTPS
- если
admin/distне собран, сервер вернёт сообщениеAdmin panel not built yet - пользовательские тексты в боте ориентированы на русский язык