Telegram Mini App для студентов МИРЭА.
- Сканер QR — отметка посещаемости за себя и до 20 друзей одним сканом
- Расписание — поиск по группе, преподавателю, аудитории
- БРС — баллы по дисциплинам, режим «Идеальная посещаемость», детальная посещаемость
- Пропуск — события входа/выхода через турникеты за день (ACS)
- Карты — интерактивные схемы корпусов с поиском аудиторий
- Киберзона — бронирование места в компьютерном зале
- Друзья — совместная отметка, профили, заявки
- Backend: Python 3.11+, aiogram, aiohttp, SQLAlchemy (async)
- Database: SQLite (по умолчанию) или PostgreSQL
- Frontend: React 18 + Vite (Telegram Mini App)
- Cache/queue: Redis (опционально, для multi-worker режима)
- C++ модули: опциональные бинарники для ускорения парсинга protobuf/UUID/зон
bot/ — Telegram-бот и HTTP API (/api/*)
webapp/ — Mini App (React/Vite)
attendance_core/ — C++ модуль расчёта потолка посещаемости
uuid_core/ — C++ модуль извлечения UUID из protobuf
zone_core/ — C++ модуль классификации зон ACS
protobuf_core/ — C++ модуль парсинга protobuf-полей
scripts/ — деплой, rollback, миграции, smoke-тесты, backup
ops/systemd/ — systemd unit/timer для backup
- Python 3.11+
- Node.js 20+
- Telegram Bot Token (получить у @BotFather)
- Публичный HTTPS домен (Telegram требует HTTPS для Mini App)
git clone https://github.com/silverhans/MireaScanner.git
cd MireaScanner
python3.11 -m venv venv
source venv/bin/activate
pip install -r requirements.txtcp .env.example .envМинимальный .env для запуска:
BOT_TOKEN=your_telegram_bot_token
WEBAPP_URL=https://your-domain.com
SESSION_KEYS=your_random_secret_32charsПолный список переменных — в .env.example.
По умолчанию используется SQLite — ничего дополнительно настраивать не нужно.
python scripts/db_migrate.py --applyДля PostgreSQL добавь в .env:
DATABASE_URL=postgresql+asyncpg://user:password@localhost/dbnamecd webapp
npm install
npm run build
cd ..Собранные файлы окажутся в webapp/dist/.
python -m bot.mainБот запустится и поднимет HTTP API на http://0.0.0.0:8080.
Пример конфига /etc/nginx/sites-available/mireascanner:
server {
listen 443 ssl;
server_name your-domain.com;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# Mini App (статика)
location / {
root /path/to/MireaScanner/webapp/dist;
try_files $uri $uri/ /index.html;
}
# API
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
listen 80;
server_name your-domain.com;
return 301 https://$host$request_uri;
}SSL через Certbot:
certbot --nginx -d your-domain.com# /etc/systemd/system/mireascanner.service
[Unit]
Description=MireaScanner Bot
After=network.target
[Service]
Type=simple
WorkingDirectory=/path/to/MireaScanner
ExecStart=/path/to/MireaScanner/venv/bin/python -m bot.main
EnvironmentFile=/path/to/MireaScanner/.env
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetsystemctl daemon-reload
systemctl enable --now mireascannerДля production при высокой нагрузке можно запустить несколько воркеров с Redis-очередью:
REDIS_URL=redis://localhost:6379/0
WORKER_COUNT=3Каждый воркер запускается на отдельном порту (8080, 8081, 8082). Nginx балансирует между ними через upstream.
Ускоряют парсинг protobuf и классификацию зон ACS. Python-фолбек всегда активен — без них всё работает.
Сборка:
# Требуется g++ с поддержкой C++17
make buildmake build автоматически скачивает nlohmann/json и компилирует все модули.
Для очистки: make clean.
Включение в .env:
ATTENDANCE_CORE_ENABLED=true
ATTENDANCE_CORE_BIN=./attendance_core/attendance_core_cpp
UUID_CORE_ENABLED=true
UUID_CORE_BIN=./uuid_core/uuid_core
ZONE_CORE_ENABLED=true
ZONE_CORE_BIN=./zone_core/zone_core
PROTOBUF_CORE_ENABLED=true
PROTOBUF_CORE_BIN=./protobuf_core/protobuf_coreВ scripts/ есть скрипты для zero-downtime деплоя с автобэкапом:
# Деплой
QRS_HOST=your-server-ip bash scripts/remote_deploy.sh
# Откат к предыдущей версии
QRS_HOST=your-server-ip bash scripts/remote_rollback.sh latest- Сессии МИРЭА хранятся в БД в зашифрованном виде (
SESSION_KEYS) - Пароли не хранятся — используются только для получения cookies, затем удаляются
- Поддержка ротации ключей шифрования
- Все запросы к API проходят верификацию Telegram
initDataчерез HMAC-SHA256
MIT © silverhans