AppsWire
MorphoSyntaxTrening v4.0.1

MorphoSyntaxTrening

MorphoSyntaxTrening

Интерактивный тренажёр морфосинтаксического анализа — веб-приложение для обучения школьников полному морфологическому разбору русских предложений.

Хакатон 2026 · Версия 4.0.1


Описание

Учитель создаёт тренажёры из предложений (вручную или из загруженной книги), назначает их группам учеников. Ученик входит по коду учителя и проходит тренажёр: кликает на слова и заполняет признаки по выбранному уровню сложности. После завершения — детальный разбор ошибок по каждому слову и каждому признаку.

Ключевые возможности

  • Пять уровней сложности: от определения части речи до полного морфологического разбора с синтаксическими ролями
  • Автоматический анализ через pymorphy3 + Natasha NLP; учитель правит разбор ИИ вручную
  • Пошаговая оценка: звезда за каждый правильный признак (не за слово целиком)
  • Светлая / тёмная тема с сохранением в localStorage
  • Генерация предложений из загруженной книги (fb2 / txt)
  • Статистика учеников и групп с фильтрами, экспорт CSV
  • Рассылка приглашений по email (SMTP)
  • Передача группы другому учителю по 6-значному коду — ученики и история результатов сохраняются
  • Поделиться тренажёром — создаётся полная копия тренажёра на аккаунте коллеги
  • Docker-деплой

Стек технологий

Компонент Технология
Backend FastAPI + Starlette SessionMiddleware
ORM SQLAlchemy (sync), SQLite
NLP pymorphy3 (морфоанализ) + Natasha (NLP, синтаксис)
Frontend Jinja2, vanilla JS, CSS (light/dark тема)
Email smtplib (SSL / STARTTLS)
Деплой Docker + docker-compose

Уровни тренажёра

Уровень Что проверяется
Ознакомительный Часть речи
Начальный + начальная форма (лемма / инфинитив)
Базовый + непостоянные признаки: наклонение, время, число, падеж, род…
Углублённый + постоянные признаки (склонение, спряжение, вид, залог…) + синтаксическая роль
Продвинутый Полный морфологический разбор: все признаки + члены предложения

Роли и доступ

Роль URL Описание
Администратор /admin/ Управление учителями, настройки SMTP, смена пароля
Учитель /teacher/ Группы, ученики, тренажёры, книга, статистика
Ученик /student/ Вход по коду учителя, прохождение тренажёров

Структура проекта

MorphoSyntaxTrening/
├── main.py               # Все FastAPI-маршруты
├── models.py             # ORM-модели (Teacher, Group, Student, Trainer, Sentence, TrainerResult)
├── morpho.py             # pymorphy3 + Natasha, POS_COLORS, ALL_POS, SCORED_*_FEATURES
├── book.py               # Парсинг и извлечение предложений из книги
├── smtp_settings.py      # Загрузка/сохранение SMTP-настроек (instance/smtp_settings.json)
├── email_service.py      # Отправка писем (приглашения, сброс пароля, тест)
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── start.sh              # Точка входа контейнера (фиксит DNS Docker Desktop)
├── static/
│   └── style.css         # CSS design system, light/dark тема
├── templates/
│   ├── base.html         # Навигация, тема, flash-сообщения
│   ├── index.html
│   ├── about.html
│   ├── admin/            # dashboard, teachers, settings, login
│   ├── teacher/          # dashboard, groups, trainers, trainer_detail, book, stats, export
│   └── student/          # login, dashboard, exercise_full, results, stats
└── instance/
    ├── morpho.db          # SQLite база данных
    └── smtp_settings.json # SMTP-конфигурация

Запуск проекта

Требования

  • Python 3.10+ (для локального запуска)
  • Docker + Docker Compose (для запуска в контейнере)

1. Локальный запуск (без Docker)

Шаг 1 — клонировать репозиторий и перейти в папку проекта:

git clone <repo-url>
cd MorphoSyntaxTrening

Шаг 2 — создать и активировать виртуальное окружение:

# Windows
python -m venv venv
venv\Scripts\activate

# Linux / macOS
python3 -m venv venv
source venv/bin/activate

Шаг 3 — установить зависимости:

pip install -r requirements.txt

Шаг 4 — создать файл .env в папке MorphoSyntaxTrening/:

SECRET_KEY=your-secret-key-here
ADMIN_PASSWORD=admin

SECRET_KEY — секрет для подписи сессий (любая длинная случайная строка).
ADMIN_PASSWORD — пароль администратора при первом запуске (можно сменить позже).

Шаг 5 — запустить сервер:

uvicorn main:app --reload --port 5000

Открыть в браузере: http://localhost:5000


2. Запуск в Docker

Шаг 1 — создать файл .env (см. выше).

Шаг 2 — собрать и запустить контейнер:

docker-compose up --build

Открыть в браузере: http://localhost:5000

Для запуска в фоне:

docker-compose up -d --build

Остановить:

docker-compose down

Windows + Docker Desktop: если внутри контейнера не работает DNS (не скачиваются NLP-модели при первом запуске), это исправляется автоматически через start.sh.


3. Первый вход

  1. Открыть http://localhost:5000/admin/login
  2. Логин: admin, пароль — значение ADMIN_PASSWORD из .env
  3. На вкладке Учителя создать первого учителя
  4. На вкладке Безопасность настроить SMTP (нужен для отправки приглашений)

4. Деплой на сервере (Coolify / Docker)

Проект готов к деплою через Dockerfile без docker-compose.

Настройки в Coolify: - Build Pack: Dockerfile - Base Directory: /MorphoSyntaxTrening - Dockerfile Location: /Dockerfile - Ports Exposes: 5000 - Direction: Redirect www to non-www

Переменные окружения задаются в разделе Environment Variables (только значение, без KEY=):

Переменная Описание
SECRET_KEY Секрет сессий — задайте длинную случайную строку
ADMIN_PASSWORD Пароль администратора

Важно: не используйте url_for() для CSS — за reverse-proxy генерируется неверный URL. В шаблонах путь задан статически: /static/style.css.


SMTP (email)

Настраивается через интерфейс администратора (/admin/settings).

Яндекс: - Хост: smtp.yandex.ru, порт 465, тип SSL - Логин: полный адрес ящика (user@yandex.ru) - Пароль: пароль приложения (не пароль от аккаунта) — создаётся на id.yandex.ru - В настройках почты должен быть включён IMAP

Mail.ru: хост smtp.mail.ru, порт 465, SSL, пароль приложения

Gmail: хост smtp.gmail.com, порт 587, STARTTLS, пароль приложения (2FA обязательна)


Совместная работа учителей

Передача группы

На странице Ученики у каждой группы есть кнопка «↗ Передать». Введите 6-значный код коллеги — группа переходит на его аккаунт. Связи с тренажёрами текущего учителя удаляются, история результатов учеников сохраняется.

Поделиться тренажёром

На странице тренажёра в боковой панели введите код коллеги и нажмите «Поделиться». На аккаунте коллеги создаётся полная независимая копия тренажёра со всеми предложениями и разбором — он может редактировать её самостоятельно.


Известные особенности

  • Менеджер паролей в браузере не срабатывает на странице входа ученика — поле пароля создаётся динамически через JS
  • Docker Desktop / Windows — DNS внутри контейнера исправляется через start.sh (перезаписывает /etc/resolv.conf на 8.8.8.8)
  • bcrypt должен быть версии <4.0 — passlib 1.7.4 несовместим с bcrypt ≥ 4.0
  • CSS должен подключаться через относительный путь /static/style.css, а не через request.url_for() — за reverse-proxy генерируется неверный URL

Части речи

Существительное · Прилагательное · Глагол · Наречие · Местоимение · Предлог · Союз · Частица · Причастие · Деепричастие · Числительное · Междометие

Каждая часть речи имеет уникальный цвет, используемый во всём интерфейсе.