Frieren - комплексная система управления образовательным процессом для Московского авиационного института (МАИ). Система предназначена для автоматизации процессов обучения, включая регистрацию студентов, управление лекциями, отслеживание посещаемости, проверку домашних заданий, управление экзаменационными оценками и аналитику успеваемости.
- ✅ Управление студентами и преподавателями - Полноценная система управления пользователями
- ✅ Регистрация на лекции через QR-код - Автоматическая регистрация посещаемости
- ✅ Презентации лекций - Загрузка и скачивание презентаций лекций (PDF/PPTX) с хранением в БД
- ✅ Система домашних заданий - Выдача, отправка и проверка домашних заданий с вариантами
- ✅ Экзаменационные оценки - Управление оценками за экзамены с загрузкой PDF-файлов работ
- ✅ AI-анализ кода - Автоматическая проверка на AI-генерацию с помощью OpenAI
- ✅ Аналитика и отчеты - Статистика посещаемости и успеваемости
- ✅ Интеграция с Google Sheets - Синхронизация данных с Google Таблицами
- ✅ Telegram бот - Удобный интерфейс для студентов и преподавателей
- ✅ Веб-интерфейс - Современный UI для преподавателей на Next.js
Проект состоит из трех основных компонентов:
- Backend API (FastAPI) - RESTful API для управления данными
- Frontend (Next.js) - веб-интерфейс для преподавателей
- Telegram Bot (aiogram) - бот для взаимодействия со студентами и преподавателями
Дополнительные компоненты:
- N8N - Автоматизация бизнес-процессов через workflows
- RabbitMQ - Асинхронная обработка событий через очереди
- PostgreSQL - Реляционная база данных
- Описание проекта
- Архитектура системы
- Бизнес-процессы
- Статистика проекта
- Технические особенности
- Структура проекта
- API Endpoints
- Безопасность
- Развертывание и настройка
- Тестирование
- Разработка
- Troubleshooting
Система построена по микросервисной архитектуре с разделением на следующие компоненты:
┌─────────────────┐
│ Telegram Bot │ (aiogram, Python)
│ (bot/) │
└────────┬────────┘
│ HTTP/Webhook
│
┌────────▼────────┐ ┌──────────────┐
│ Backend API │◄─────┤ PostgreSQL │
│ (backend/) │ │ Database │
└────────┬────────┘ └──────────────┘
│ HTTP/REST
│
┌────────▼────────┐ ┌──────────────┐
│ Frontend │ │ N8N │
│ (frontend/) │ │ Workflows │
└─────────────────┘ └──────┬───────┘
│
┌──────▼───────┐
│ RabbitMQ │
│ (Queues) │
└──────┬───────┘
│
┌──────▼───────┐
│ N8N Trigger │
│ (Consumer) │
└──────────────┘
- Технологии: FastAPI, SQLAlchemy, PostgreSQL
- Назначение: Предоставление RESTful API для всех операций с данными
- Основные модули:
routers/- API endpoints для различных сущностейmodels.py- Типизированные модели данных (TypedDict)database.py- Модели SQLAlchemy и подключение к БДservice.py- Основное приложение FastAPI
- Технологии: Next.js 14, React 18, TypeScript, Tailwind CSS
- Назначение: Веб-интерфейс для преподавателей и администраторов
- Архитектура: App Router (Next.js 14), Server-Side Rendering
- Основные страницы:
/- Главная страница с общей статистикой/students- Управление студентами (просмотр, редактирование, удаление)/teachers- Управление преподавателями/lectures- Управление лекциями (создание, редактирование, генерация QR-кодов, время начала, загрузка/скачивание презентаций)/attendance- Просмотр посещаемости студентов/attendance-chart- График посещаемости/homework- Управление домашними заданиями/homework-review- Проверка домашних заданий (табличное представление)/homework-review-chat/[studentId]- Чат для оценки работ студента (новое представление)/homework-stats- Статистика по домашним заданиям/homework-variants- Управление вариантами домашних заданий/pending-reviews- Список работ, ожидающих проверки/student-variants/[id]- Варианты домашних заданий конкретного студента/exam-grades- Управление экзаменационными оценками (с загрузкой PDF-файлов)
- Компоненты:
- QR-код генератор для лекций
- Загрузка и скачивание презентаций лекций (PDF/PPTX)
- Экспорт/импорт данных (JSON, Google Sheets)
- Поиск студентов
- Информация о вместимости лекций
- Кнопки удаления с подтверждением
- Чат-интерфейс для оценки работ студентов
- Автоматическое определение просроченных работ (сравнение с deadline)
- Технологии: aiogram 3.x, aiohttp, OpenCV, dlib
- Назначение: Интерактивный интерфейс для студентов и преподавателей
- Основные функции для студентов:
- Регистрация в системе
- Check-in на лекции через QR-код
- Отправка домашних заданий
- Получение расписания лекций (с временем начала)
- Получение материалов лекций (включая скачивание презентаций PDF/PPTX)
- Проверка вместимости лекций
- Получение информации о домашних заданиях
- Получение информации об успеваемости
- Автоматическое получение уведомлений об оценках в Telegram
- Основные функции для преподавателей:
- Проверка домашних заданий
- Подсчет студентов на лекции (через анализ фотографии)
- Обновление вместимости лекций
- Особенности UX:
- Автоматический возврат к главному меню после завершения каждого сценария
- FSM (Finite State Machine) для управления диалогами
- Информативные сообщения об ошибках
- Отображение времени начала лекций во всех сценариях
- Автоматическое обновление chat_id при любом взаимодействии с ботом (через middleware)
- Middleware:
- Автоматическое обновление
chat_idстудента при любом сообщении - Работает асинхронно, не блокируя обработку сообщений
- Поддерживает формат
@usernameиuser_{id} - Автоматическое обновление chat_id при любом взаимодействии с ботом (через middleware)
- Автоматическое обновление
- Middleware:
- Автоматическое обновление
chat_idстудента при любом сообщении - Работает асинхронно, не блокируя обработку сообщений
- Поддерживает формат
@usernameиuser_{id}
- Автоматическое обновление
- Назначение: Автоматизация бизнес-процессов
- Workflows (автоматически импортируются при первом запуске):
CheckIn.json- Обработка регистрации на лекции (валидация времени, отправка в RabbitMQ)Homework Submission.json- Обработка отправки домашних заданий с AI-анализом через OpenAIUpdate Student Info Google Sheet.json- Синхронизация данных студентов с Google Sheets (потребление из RabbitMQ)Update Student Info.json- Обновление информации о студентахImport rating from Google.json- Импорт оценок из Google Sheets (по расписанию)
- Назначение: Асинхронная обработка событий через очереди сообщений
- Очереди:
checkin- Очередь для событий регистрации на лекции
- Использование:
- Producer: N8N workflow отправляет события check-in в очередь
- Consumer: N8N workflow слушает очередь и обновляет Google Sheets
- Преимущества: Разделение синхронных и асинхронных операций, надежность обработки, масштабируемость
- Схема: 8 основных таблиц
- Особенности: Мягкое удаление, связи между сущностями, индексы
- Контейнеры: Backend, Frontend, Bot, PostgreSQL, N8N, RabbitMQ
- Оркестрация: Docker Compose
- Сеть: Bridge network (
frieren_network) для изоляции сервисов - Volumes:
postgres_data- Данные PostgreSQLn8n_data- Данные N8N workflows
- Особенности:
- Health checks для PostgreSQL
- Автоматическая инициализация RabbitMQ с очередями
- Volume для hot reload frontend при разработке
- Отдельные docker-compose.yml файлы для каждого компонента
Студент → Telegram Bot → Ввод данных (ФИО, GitHub, группа)
↓
Backend API → Создание записи в БД
↓
Автоматическое назначение вариантов ДЗ
↓
Уведомление студента о назначенных вариантах
Summary: Процесс регистрации нового студента в системе. Студент вводит свои данные через Telegram-бота, система создает запись в базе данных и автоматически назначает варианты домашних заданий. Процесс синхронный, выполняется в реальном времени.
Студент → Telegram Bot → Сканирование QR-кода
↓
Извлечение секретного кода из QR (OpenCV)
↓
N8N Workflow → Валидация времени (8:50-9:15 МСК)
↓
Backend API → Поиск лекции по секретному коду
↓
Проверка вместимости лекции
↓
Создание записи посещаемости в БД
↓
Отправка сообщения в RabbitMQ (очередь "checkin")
↓
N8N Workflow (RabbitMQ Trigger) → Обновление Google Sheets
↓
Уведомление студента о результате (Telegram)
Использование RabbitMQ: После успешного создания записи посещаемости, событие отправляется в очередь checkin в RabbitMQ. Это позволяет асинхронно обработать обновление Google Sheets без блокировки основного процесса регистрации. Отдельный N8N workflow слушает очередь через RabbitMQ Trigger и обновляет данные в Google Sheets.
Summary: Процесс регистрации студента на лекцию через сканирование QR-кода. Включает валидацию времени, проверку вместимости и создание записи посещаемости. Использует RabbitMQ для асинхронного обновления Google Sheets, что обеспечивает быстрый отклик пользователю и надежную обработку данных в фоне.
Студент → Telegram Bot → Ввод номера ДЗ и ссылки на GitHub
↓
N8N Workflow (Webhook) → Получение данных
↓
Поиск студента в БД по Telegram
↓
AI-анализ кода (OpenAI GPT-4) → Определение процента AI-генерации
↓
Создание записи homework_review в БД
↓
Уведомление студента и преподавателя (Telegram)
Summary: Процесс отправки домашнего задания студентом. Студент указывает номер задания и ссылку на GitHub-репозиторий. Система автоматически анализирует код на предмет AI-генерации с помощью OpenAI GPT-4 и создает запись для последующей проверки преподавателем. Процесс выполняется через N8N workflow для обеспечения надежности и возможности расширения функциональности.
Вариант 1: Табличное представление
Преподаватель → Frontend (/homework-review) → Просмотр списка работ
↓
Выбор работы → Скачивание проекта из GitHub
↓
Проверка кода → Выставление оценки (0-100 баллов)
↓
Добавление комментариев
↓
Обновление записи homework_review в БД
↓
Автоматическое установление review_date
↓
Уведомление студента в Telegram (если есть chat_id)
Вариант 2: Чат-интерфейс
Преподаватель → Sidebar → "Чат со студентом" → Выбор студента
↓
Frontend (/homework-review-chat/[studentId]) → Отображение истории отправок
↓
Просмотр каждой отправки:
- Номер задания и вариант
- Ссылка на GitHub репозиторий
- Ссылка на пример варианта
- AI-score (процент AI-генерации)
- Статус отправки (в срок / просрочено)
- Комментарий студента
↓
Выставление оценки и комментария преподавателя
↓
Обновление записи homework_review в БД
↓
Автоматическое установление review_date
↓
Уведомление студента в Telegram (если есть chat_id)
Summary: Процесс проверки домашнего задания преподавателем. Доступны два представления:
- Табличное представление - классический список всех работ с фильтрацией и сортировкой
- Чат-интерфейс - интерактивный чат с историей отправок конкретного студента, отображающий все работы в хронологическом порядке с визуальным разделением сообщений студента и ответов преподавателя
При сохранении оценки автоматически устанавливается review_date, и если у студента есть chat_id, он получает уведомление в Telegram с оценкой и комментарием преподавателя.
Преподаватель → Telegram Bot → Загрузка фото аудитории
↓
Обработка изображения (OpenCV + dlib)
↓
Подсчет лиц на фотографии (детекция лиц)
↓
Ввод номера лекции и максимальной вместимости
↓
Backend API → Обновление capacity лекции
↓
Отображение статистики (текущее/максимальное количество)
Summary: Процесс автоматического подсчета студентов на лекции с помощью компьютерного зрения. Преподаватель загружает фотографию аудитории, система использует библиотеки OpenCV и dlib для детекции лиц и подсчета количества студентов. Результат используется для обновления максимальной вместимости лекции и отображения статистики заполненности.
Преподаватель → Frontend → Создание домашнего задания
↓
Указание количества вариантов
↓
Массовое назначение вариантов студентам
↓
Автоматическое распределение (случайное)
↓
Сохранение в student_homework_variants
Summary: Процесс управления вариантами домашних заданий. Преподаватель создает домашнее задание и указывает количество вариантов. Система автоматически распределяет варианты между студентами случайным образом и сохраняет связи в базе данных. Это обеспечивает справедливое распределение вариантов и упрощает управление большим количеством студентов.
Преподаватель → Frontend → Просмотр списка студентов
↓
Выбор студента → Ввод данных экзамена (дата, оценка, вариант)
↓
Опциональная загрузка PDF/PNG/JPG файла работы
↓
Создание записи exam_grade в БД
↓
Отображение оценок с возможностью редактирования
↓
Скачивание файлов работ при необходимости
Summary: Процесс управления экзаменационными оценками. Преподаватель может создавать, просматривать и редактировать оценки за экзамены для каждого студента. Система поддерживает загрузку и хранение PDF/PNG/JPG файлов экзаменационных работ в базе данных (BLOB). Все оценки связаны со студентами и могут быть экспортированы в Google Sheets вместе с другой информацией о студентах.
Преподаватель → Frontend → Выбор лекции
↓
Загрузка файла презентации (PDF/PPTX, до 50MB)
↓
Backend API → Сохранение в presentation_blob (BLOB)
↓
Отображение статуса наличия презентации
↓
Студент → Telegram Bot → Запрос материалов лекции
↓
Backend API → Скачивание презентации
↓
Отправка файла студенту через Telegram
Summary: Процесс управления презентациями лекций. Преподаватель может загружать презентации лекций (PDF/PPTX) через веб-интерфейс. Файлы хранятся в базе данных в поле presentation_blob (BLOB, до 50MB). Студенты могут скачивать презентации через Telegram бота, запрашивая материалы лекции. Система автоматически определяет формат файла и отправляет его с правильным MIME-типом.
- Общее количество строк кода: ~16,245 строк
- Python файлы: 20 файлов (~6,764 строк)
- TypeScript/TSX файлы: 45 файлов (~9,481 строк)
- Основные компоненты:
- Backend: ~6,764 строк (Python)
- Frontend: ~9,481 строк (TypeScript/TSX)
- Bot: ~1,590 строк (Python)
- fastapi - Веб-фреймворк для создания API
- sqlalchemy - ORM для работы с базой данных
- psycopg2-binary - PostgreSQL драйвер
- pydantic - Валидация данных
- uvicorn - ASGI сервер
- openai - Интеграция с OpenAI API для AI-анализа
- gspread - Работа с Google Sheets
- oauth2client - OAuth для Google API
- requests - HTTP клиент
- next (14.0.0) - React фреймворк с App Router
- react (18.x) - UI библиотека
- react-dom (18.x) - React DOM рендеринг
- typescript (5.x) - Типизация
- tailwindcss (3.3.0) - CSS фреймворк для стилизации
- lucide-react - Библиотека иконок
- qrcode - Генерация QR-кодов для лекций
- autoprefixer - Автоматическое добавление префиксов CSS
- postcss - Обработка CSS
- aiogram (>=3.0.0) - Telegram Bot API фреймворк
- aiohttp (>=3.8.0) - Асинхронный HTTP клиент
- Pillow (>=9.0.0) - Обработка изображений
- qrcode (>=7.3.0) - Генерация и обработка QR-кодов
- opencv-python (>=4.5.0) - Компьютерное зрение
- dlib (>=19.24.0) - Детекция лиц
- numpy (>=1.21.0) - Численные вычисления
- python-dotenv (>=0.19.0) - Управление переменными окружения
- PostgreSQL 15 - Реляционная база данных
- Docker - Контейнеризация приложений
- Docker Compose - Оркестрация контейнеров
- N8N - Автоматизация workflows и интеграций
- RabbitMQ 3-management - Очереди сообщений с веб-интерфейсом управления
- wrk - Инструмент для нагрузочного тестирования (в load_test/)
- students - Студенты (8 полей: id, year, full_name, telegram, github, group_number, chat_id, is_deleted)
- teachers - Преподаватели (4 поля: id, full_name, telegram, is_deleted)
- teacher_groups - Связь преподавателей с группами (3 поля: id, teacher_id, group_number)
- lectures - Лекции (9 полей: id, number, topic, date, start_time, secret_code, max_student, github_example, presentation_blob)
- attendance - Посещаемость (4 поля: id, student_id, lecture_id, present)
- homework - Домашние задания (7 полей: id, number, due_date, short_description, example_link, assigned_date, variants_count)
- homework_review - Проверка домашних заданий (10 полей: id, number, send_date, review_date, url, result, comments, student_id, local_directory, ai_percentage)
review_dateавтоматически устанавливается при сохранении оценки (result)- При сохранении оценки отправляется уведомление в Telegram студенту (если есть
chat_id)
- student_homework_variants - Варианты ДЗ для студентов (4 поля: id, student_id, homework_id, variant_number)
- exam_grades - Экзаменационные оценки (6 полей: id, date, grade, variant_number, student_id, pdf_blob)
Всего: 9 таблиц, ~54 поля
Примечания:
- Поле
start_timeв таблицеlecturesхранит время начала лекции в формате HH:MM (например, "09:00"). - Поле
presentation_blobв таблицеlecturesхранит презентации лекций в формате PDF/PPTX (BLOB, до 50MB).
-
Типизация данных
- Использование TypedDict для строгой типизации
- Валидация через Pydantic
- Автоматическая генерация OpenAPI документации
-
Управление соединениями с БД
- Connection pooling (pool_size=1000)
- LIFO стратегия для пула
- Автоматический reconnect (pool_pre_ping)
- Таймауты для предотвращения зависаний
-
Обработка ошибок
- Детальное логирование 422 ошибок
- Graceful error handling
- Валидация на уровне API и БД
-
CORS и безопасность
- Настройка CORS для фронтенда
- Middleware для логирования запросов
- Таймауты для длительных операций (15 минут)
-
Архитектура
- Server-side rendering (SSR) через Next.js
- Client-side routing
- Компонентный подход
-
API интеграция
- Централизованный API клиент
- Таймауты запросов (15 минут)
- Обработка ошибок
-
UI/UX
- Адаптивный дизайн (Tailwind CSS)
- Современный интерфейс
- Интуитивная навигация
-
FSM (Finite State Machine)
- Управление состояниями диалогов
- Разделение логики по состояниям
- Очистка состояний после завершения
-
Обработка изображений
- Поддержка фото и файлов
- Детекция QR-кодов (OpenCV)
- Подсчет лиц (dlib)
- Обработка различных форматов
-
Интеграция с API
- Асинхронные HTTP запросы
- Обработка таймаутов
- Retry логика
-
Автоматизация процессов
- Webhook триггеры
- Валидация данных
- Интеграция с OpenAI для AI-анализа
- Обработка ошибок
-
Интеграции
- Google Sheets
- Telegram уведомления
- HTTP API вызовы
- RabbitMQ (отправка и получение сообщений)
-
Асинхронная обработка
- Очередь
checkinдля событий регистрации на лекции - Durable очереди для надежности
- Разделение синхронных и асинхронных операций
- Очередь
-
Интеграция с N8N
- Producer: N8N workflow отправляет события в очередь после успешного check-in
- Consumer: N8N workflow слушает очередь через RabbitMQ Trigger
- Обеспечивает надежную обработку обновлений Google Sheets в фоне
-
Преимущества
- Неблокирующая обработка длительных операций
- Гарантия доставки сообщений
- Возможность масштабирования обработчиков
- Разделение ответственности между компонентами
frieren/
├── backend/ # Backend API (FastAPI)
│ ├── src/
│ │ ├── routers/ # API endpoints
│ │ │ ├── attendance.py # Посещаемость
│ │ │ ├── config.py # Конфигурация
│ │ │ ├── export.py # Экспорт данных
│ │ │ ├── google_sheet.py # Интеграция с Google Sheets
│ │ │ ├── homework.py # Домашние задания
│ │ │ ├── homework_review.py # Проверка ДЗ
│ │ │ ├── import_all.py # Импорт данных
│ │ │ ├── lectures.py # Лекции
│ │ │ ├── students.py # Студенты
│ │ │ ├── student_homework_variants.py # Варианты ДЗ
│ │ │ ├── teachers.py # Преподаватели
│ │ │ └── utils.py # Утилиты
│ │ ├── models.py # Типизированные модели (TypedDict)
│ │ ├── database.py # SQLAlchemy модели и подключение
│ │ └── service.py # FastAPI приложение
│ ├── requirements/
│ │ └── requirement.txt # Python зависимости
│ ├── Dockerfile # Docker образ backend
│ ├── docker-compose.yml # Docker Compose для backend
│ ├── env.example # Пример переменных окружения
│ └── README.md # Документация backend
│
├── frontend/ # Frontend (Next.js 14)
│ ├── src/
│ │ ├── app/ # Страницы и роутинг (App Router)
│ │ │ ├── api/config/ # API route для конфигурации
│ │ │ ├── attendance/ # Страница посещаемости
│ │ │ ├── attendance-chart/# График посещаемости
│ │ │ ├── homework/ # Управление ДЗ
│ │ │ ├── homework-review/# Проверка ДЗ
│ │ │ ├── homework-stats/ # Статистика ДЗ
│ │ │ ├── homework-variants/# Варианты ДЗ
│ │ │ ├── lectures/ # Управление лекциями
│ │ │ ├── pending-reviews/ # Ожидающие проверки
│ │ │ ├── students/ # Управление студентами
│ │ │ ├── student-variants/# Варианты студента
│ │ │ ├── teachers/ # Управление преподавателями
│ │ │ ├── layout.tsx # Основной layout
│ │ │ └── page.tsx # Главная страница
│ │ ├── components/ # React компоненты
│ │ │ ├── BackendInfo.tsx # Информация о backend
│ │ │ ├── DeleteLectureButton.tsx
│ │ │ ├── DeleteReviewButton.tsx
│ │ │ ├── ExportButton.tsx
│ │ │ ├── GoogleSheetExportButton.tsx
│ │ │ ├── GoogleSheetImportButton.tsx
│ │ │ ├── ImportButton.tsx
│ │ │ ├── LectureCapacityInfo.tsx
│ │ │ ├── QRCode.tsx # Генерация QR-кодов
│ │ │ ├── Sidebar.tsx # Боковая панель
│ │ │ ├── StudentAttendanceExportButton.tsx
│ │ │ ├── StudentExportButton.tsx
│ │ │ └── StudentSearch.tsx
│ │ ├── lib/
│ │ │ └── api.ts # API клиент
│ │ ├── types/
│ │ │ └── index.ts # TypeScript типы
│ │ └── config.js # Конфигурация
│ ├── Dockerfile # Docker образ frontend
│ ├── docker-compose.yml # Docker Compose для frontend
│ ├── env.example # Пример переменных окружения
│ ├── next.config.js # Конфигурация Next.js
│ ├── package.json # Node.js зависимости
│ ├── tailwind.config.js # Конфигурация Tailwind CSS
│ ├── TESTING.md # Документация по тестированию
│ └── README-Docker.md # Документация по Docker
│
├── bot/ # Telegram Bot (aiogram 3.x)
│ ├── app.py # Основной файл бота
│ ├── requirements/
│ │ └── requirements.txt # Python зависимости
│ ├── Dockerfile # Docker образ bot
│ ├── docker-compose.yml # Docker Compose для bot
│ ├── env.example # Пример переменных окружения
│ ├── check_bot_processes.sh # Скрипт проверки процессов
│ └── stop_all_bots.sh # Скрипт остановки ботов
│
├── docker/ # Docker конфигурация (основная)
│ ├── docker-compose.yml # Основной Docker Compose (production)
│ ├── docker-compose-dev.yml # Docker Compose для разработки (локальная сборка)
│ ├── rabbitmq-definitions.json # Конфигурация RabbitMQ
│ ├── rabbitmq-init.sh # Скрипт инициализации RabbitMQ
│ ├── n8n-import-workflows.sh # Скрипт импорта N8N workflows
│ ├── n8n_workflows/ # N8N workflows (для автоматического импорта)
│ │ ├── CheckIn.json
│ │ ├── Homework Submission.json
│ │ ├── Import rating from Google.json
│ │ ├── Update Student Info Google Sheet.json
│ │ └── Update Student Info.json
│ └── resources/ # Ресурсы (PDF лекций)
│ ├── lection_01.pdf
│ ├── lection_02.pdf
│ └── ...
│
├── n8n_workflows/ # N8N workflows (для автоматического импорта)
│ ├── CheckIn.json # Обработка регистрации на лекции
│ ├── Homework Submission.json # Обработка отправки домашних заданий
│ ├── Update Student Info Google Sheet.json # Синхронизация с Google Sheets
│ ├── Update Student Info.json # Обновление информации о студентах
│ └── Import rating from Google.json # Импорт оценок из Google Sheets
│
├── load_test/ # Нагрузочное тестирование
│ ├── load_test.sh # Скрипт нагрузочного тестирования
│ └── script.lua # Lua скрипт для wrk
│
└── README.md # Этот файл
GET /api/students/- Получить всех студентов (исключая удаленных)POST /api/students/- Создать студентаPUT /api/students/{id}- Обновить студентаDELETE /api/students/{id}- Удалить студента (мягкое удаление)GET /api/students/by-telegram/{telegram}- Найти по TelegramPUT /api/students/by-telegram/{telegram}/chat-id- Обновить chat_id студента (query параметр)PUT /api/students/by-telegram/{telegram}/chat-id-body- Обновить chat_id студента (body параметр, используется ботом)GET /api/students/stats- Статистика по студентам (баллы, посещаемость, AI-процент)
GET /api/lectures/- Получить все лекции (включая время начала и наличие презентации)POST /api/lectures/- Создать лекцию (с опциональным временем начала)PUT /api/lectures/{id}- Обновить лекцию (включая время начала)DELETE /api/lectures/{id}- Удалить лекциюGET /api/lectures/{lecture_id}- Получить лекцию по IDGET /api/lectures/by-secret-code/{code}- Найти по секретному коду (включая время начала)GET /api/lectures/capacity/{lecture_number}- Проверить вместимость (включая время начала)PUT /api/lectures/capacity/{lecture_number}- Обновить вместимость лекцииGET /api/lectures/{lecture_id}/presentation- Скачать презентацию лекции (PDF/PPTX)GET /api/lectures/by-number/{lecture_number}/presentation- Скачать презентацию по номеру лекцииPOST /api/lectures/{lecture_id}/presentation- Загрузить презентацию лекции (PDF/PPTX, до 50MB)PUT /api/lectures/{lecture_id}/presentation- Обновить презентацию лекции (PDF/PPTX, до 50MB)
GET /api/attendance/- Получить все записиPOST /api/attendance/- Записать посещаемостьPUT /api/attendance/{id}- Обновить запись
GET /api/homework/- Получить все заданияPOST /api/homework/- Создать заданиеPUT /api/homework/{id}- Обновить задание
GET /api/homework_review/- Получить все проверкиGET /api/homework_review/pending- Получить ожидающие проверкиGET /api/homework_review/pending-by-teacher/{teacher_id}- Проверки для преподавателяGET /api/homework_review/by-telegram/{telegram}- Получить проверки студента по TelegramGET /api/homework_review/by-student/{student_id}- Получить все проверки студента по ID (для чата)POST /api/homework_review/- Создать проверкуPUT /api/homework_review/{id}- Обновить проверку (автоматически устанавливает review_date при сохранении оценки, отправляет уведомление в Telegram если у студента есть chat_id)DELETE /api/homework_review/{id}- Удалить проверкуPOST /api/homework_review/{id}/download- Скачать проект из GitHubPOST /api/homework_review/{id}/check-ai- Проверить код на AI-генерацию через OpenAI
GET /api/teachers/- Получить всех преподавателей (исключая удаленных)POST /api/teachers/- Создать преподавателяPUT /api/teachers/{id}- Обновить преподавателяDELETE /api/teachers/{id}- Удалить преподавателя (мягкое удаление)GET /api/teachers/by-telegram/{telegram}- Найти по TelegramGET /api/teachers/by-group/{group}- Найти по группеGET /api/teachers/groups- Получить все связи преподавателей с группамиGET /api/teachers/{id}/groups- Получить группы преподавателяPOST /api/teachers/groups- Создать связь преподавателя с группойPUT /api/teachers/groups/{id}- Обновить связь преподавателя с группойDELETE /api/teachers/groups/{id}- Удалить связь преподавателя с группойGET /api/teachers/{id}/stats- Статистика преподавателя (количество проверенных работ)
GET /api/student-homework-variants/- Получить все вариантыGET /api/student-homework-variants/student/{student_id}- Варианты студентаGET /api/student-homework-variants/homework/{homework_id}- Варианты для домашнего заданияGET /api/student-homework-variants/student/{student_id}/homework/{homework_id}- Вариант конкретного студента для конкретного ДЗPOST /api/student-homework-variants/- Создать вариантPOST /api/student-homework-variants/bulk- Массовое создание вариантовPUT /api/student-homework-variants/bulk/{student_id}- Массовое обновление вариантов студентаPUT /api/student-homework-variants/{id}- Обновить вариантDELETE /api/student-homework-variants/{id}- Удалить вариант
GET /api/exam_grades/- Получить все экзаменационные оценкиGET /api/exam_grades/{exam_grade_id}- Получить оценку по IDGET /api/exam_grades/by-student/{student_id}- Получить оценки студентаPOST /api/exam_grades/- Создать оценку (JSON, без файла)POST /api/exam_grades/with-pdf- Создать оценку с файлом (PDF, PNG, JPG, JPEG)PUT /api/exam_grades/{exam_grade_id}- Обновить оценку (JSON)PUT /api/exam_grades/{exam_grade_id}/pdf- Обновить файл работы (PDF, PNG, JPG, JPEG)GET /api/exam_grades/{exam_grade_id}/pdf- Скачать файл работыDELETE /api/exam_grades/{exam_grade_id}- Удалить оценку
GET /api/export/all- Экспорт всех данных в JSONPOST /api/import/all- Импорт всех данных из JSONGET /api/google-sheet/all- Экспорт всех данных в Google SheetsPOST /api/google-sheet/export-student-attendance- Экспорт посещаемости студентов в Google SheetsPOST /api/google-sheet/export-student- Экспорт данных студента в Google SheetsPOST /api/google-sheet/export-review- Экспорт проверок домашних заданий в Google SheetsPOST /api/google-sheet/import-ratings- Импорт оценок из Google Sheets
GET /api/config- Получить конфигурацию системы
- Мягкое удаление - Записи не удаляются физически, помечаются флагом
is_deleted - Валидация времени - Check-in возможен только в определенное время (8:50-9:15 МСК)
- Проверка прав доступа - Разделение функций для студентов и преподавателей
- Таймауты - Защита от зависаний и долгих запросов (15 минут для длительных операций)
- Логирование - Детальное логирование всех операций и ошибок
- CORS настройки - Настроены для безопасного взаимодействия frontend и backend
- Валидация данных - Pydantic валидация на уровне API
- Секретные коды - Использование секретных кодов для доступа к лекциям через QR
- Connection pooling - Защита от перегрузки базы данных (pool_size=1000)
- Health checks - Мониторинг состояния сервисов через Docker health checks
- Docker 20.10+
- Docker Compose 2.0+
- Минимум 4GB RAM
- Минимум 10GB свободного места на диске
-
Клонируйте репозиторий:
git clone <repository_url> cd frieren
-
Создайте и настройте .env файл:
cd docker cp .env.example .env # Отредактируйте .env и настройте необходимые переменные # Обязательно установите BOT_TOKEN! nano .env # или используйте любой редактор
-
Запустите все сервисы:
docker-compose up -d
-
Проверьте статус:
docker-compose ps docker-compose logs -f
Важно: Перед первым запуском обязательно настройте BOT_TOKEN в файле .env!
Основной файл конфигурации находится в docker/docker-compose.yml и включает следующие сервисы:
Примечание: В production режиме используются готовые Docker образы (ddzuba/frieren_*:arm64). Для разработки с локальной сборкой используйте docker-compose-dev.yml.
- Контейнер:
frieren-frontend - Образ:
ddzuba/frieren_frontend:arm64(готовый образ) или локальная сборка (в dev режиме) - Порт:
3000:3000 - Переменные окружения:
BACKEND_URL=http://frieren-backend:8000NODE_ENV=production
- Volumes:
../frontend/src:/app/src(для hot reload) - Сеть:
frieren_network
- Контейнер:
frieren-backend - Образ:
ddzuba/frieren_backend:arm64(готовый образ) или локальная сборка (в dev режиме) - Порт:
8000:8000 - Переменные окружения:
DB_USER=frierenDB_PASSWORD=frierenDB_HOST=frieren_dbDB_PORT=5432DB_NAME=frieren_dbGOOGLE_SHEET_ID- ID Google Таблицы (опционально, для экспорта/импорта данных)
- Volumes:
./google:/app/google(файлcredentials.jsonдля Google Sheets API) - Зависимости:
postgres(ждет готовности БД) - Сеть:
frieren_network
- Контейнер:
frieren-bot - Образ:
ddzuba/frieren_bot:arm64(готовый образ) или локальная сборка (в dev режиме) - Переменные окружения:
BOT_TOKEN- токен Telegram бота (требует настройки)API_BASE_URL=http://frieren-backend:8000/apiN8N_BASE_URL=http://frieren-n8n:5678
- Volumes:
./resources:/app/resources(PDF лекций) - Сеть:
frieren_network
- Контейнер:
frieren_db - Образ:
postgres:15 - Платформа:
linux/arm64(для Apple Silicon) - Порт:
5432(внутренний) - Переменные окружения:
POSTGRES_USER=frierenPOSTGRES_PASSWORD=frierenPOSTGRES_DB=frieren_db
- Volumes:
postgres_data:/var/lib/postgresql/data - Health check: Проверка готовности каждые 5 секунд
- Сеть:
frieren_network
- Контейнер:
frieren_rabbitmq - Образ:
rabbitmq:3-management - Порт:
15672:15672(Management UI) - Конфигурация:
rabbitmq-definitions.json(автоматическое создание очередиcheckin) - Volumes:
./rabbitmq-definitions.json:/etc/rabbitmq/definitions.json:ro - Сеть:
frieren_network
- Контейнер:
frieren-n8n - Образ:
n8nio/n8n:latest - Порт:
5678:5678 - Аутентификация: Basic Auth (
admin/admin123) - База данных: Использует PostgreSQL (
frieren_db)- База:
n8n - Схема:
n8n_schema
- База:
- Volumes:
n8n_data:/home/node/.n8n(workflows и настройки)/var/folders:/var/folders/(временные файлы)
- Зависимости:
postgres(с условиемservice_healthy) - Сеть:
frieren_network
Все переменные окружения централизованы в файле .env в директории docker/. Это обеспечивает безопасность и удобство управления конфигурацией.
Создание .env файла:
cd docker
cp .env.example .envРедактирование .env файла:
Откройте docker/.env и настройте необходимые переменные:
# ============================================
# Telegram Bot Configuration
# ============================================
BOT_TOKEN=your_telegram_bot_token_here # ⚠️ ОБЯЗАТЕЛЬНО измените!
# ============================================
# PostgreSQL Database Configuration
# ============================================
POSTGRES_USER=frieren
POSTGRES_PASSWORD=frieren # ⚠️ Измените для production!
POSTGRES_DB=frieren_db
# Backend Database Connection
DB_USER=frieren
DB_PASSWORD=frieren # ⚠️ Измените для production!
DB_HOST=frieren_db
DB_PORT=5432
DB_NAME=frieren_db
# ============================================
# N8N Configuration
# ============================================
# N8N User Credentials (for Basic Auth and first user creation)
N8N_USER=your_email@example.com # ⚠️ Измените!
N8N_PASSWORD=your_secure_password # ⚠️ Измените!
N8N_FIRST_NAME=Admin
N8N_LAST_NAME=User
# N8N Database Configuration
N8N_DATABASE_HOST=frieren_db
N8N_DATABASE_PORT=5432
N8N_DATABASE_NAME=n8n
N8N_DATABASE_USER=frieren
N8N_DATABASE_PASSWORD=frieren # Должен совпадать с POSTGRES_PASSWORD
N8N_DATABASE_SCHEMA=n8n_schema
# ============================================
# RabbitMQ Configuration
# ============================================
RABBITMQ_DEFAULT_USER=guest
RABBITMQ_DEFAULT_PASS=guest # ⚠️ Измените для production!
# ============================================
# Frontend Configuration
# ============================================
BACKEND_URL=http://frieren-backend:8000
NODE_ENV=production
# ============================================
# Google Sheets Integration
# ============================================
# ID Google Таблицы для экспорта/импорта данных
# Получить можно из URL таблицы: https://docs.google.com/spreadsheets/d/{GOOGLE_SHEET_ID}/edit
# Пример: если URL таблицы https://docs.google.com/spreadsheets/d/1a2b3c4d5e6f7g8h9i0j/edit
# то GOOGLE_SHEET_ID=1a2b3c4d5e6f7g8h9i0j
# ⚠️ Опционально: требуется только для работы с Google Sheets (экспорт/импорт данных)
GOOGLE_SHEET_ID=your_google_sheet_id_hereВажно:
- Файл
.envне коммитится в git (добавлен в.gitignore) - Файл
.env.exampleсодержит шаблон с примерами значений - Все переменные имеют значения по умолчанию в
docker-compose.yml, поэтому система будет работать даже без.env - Для production обязательно измените все пароли и секретные ключи!
Структура переменных:
| Категория | Переменные | Обязательность |
|---|---|---|
| Telegram Bot | BOT_TOKEN |
✅ Обязательно |
| PostgreSQL | POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB |
|
| Backend DB | DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME |
|
| N8N | N8N_USER, N8N_PASSWORD, N8N_FIRST_NAME, N8N_LAST_NAME |
|
| N8N Database | N8N_DATABASE_* |
|
| RabbitMQ | RABBITMQ_DEFAULT_USER, RABBITMQ_DEFAULT_PASS |
|
| Frontend | BACKEND_URL, NODE_ENV |
Опционально |
| Google Sheets | GOOGLE_SHEET_ID |
Для работы с Google Sheets необходимо:
-
Создать Google Cloud проект и Service Account:
- Перейдите в Google Cloud Console
- Создайте новый проект или выберите существующий
- Включите Google Sheets API и Google Drive API
- Создайте Service Account и скачайте JSON ключ
- Сохраните файл как
docker/google/credentials.json
-
Создать Google Таблицу:
- Создайте новую Google Таблицу или используйте существующую
- Скопируйте ID таблицы из URL:
Например, если URL:
https://docs.google.com/spreadsheets/d/{GOOGLE_SHEET_ID}/edithttps://docs.google.com/spreadsheets/d/1a2b3c4d5e6f7g8h9i0j/editтоGOOGLE_SHEET_ID=1a2b3c4d5e6f7g8h9i0j
-
Предоставить доступ Service Account к таблице:
- Откройте Google Таблицу
- Нажмите "Настройки доступа" (Share)
- Добавьте email Service Account (находится в
credentials.json, полеclient_email) с правами редактора
-
Настроить переменную окружения:
- Добавьте
GOOGLE_SHEET_IDв файлdocker/.env:GOOGLE_SHEET_ID=your_google_sheet_id_here
- Добавьте
Примечание:
- Без
GOOGLE_SHEET_IDсистема будет работать, но функции экспорта/импорта в Google Sheets будут недоступны - Файл
credentials.jsonдолжен находиться вdocker/google/credentials.json - Убедитесь, что Service Account имеет доступ к таблице
Очередь checkin создается автоматически при запуске через rabbitmq-definitions.json и init-контейнер rabbitmq-init.
Конфигурация:
- Очередь создается автоматически при первом запуске
- Использует учетные данные из
.env:RABBITMQ_DEFAULT_USERиRABBITMQ_DEFAULT_PASS - По умолчанию:
guest/guest(⚠️ измените для production!)
Проверка очереди:
# Через Management UI
open http://localhost:15672
# Логин: guest / guest (или ваши учетные данные из .env)
# Через командную строку
docker-compose exec rabbitmq rabbitmqctl list_queuesN8N автоматически настраивается при первом запуске:
- Первый пользователь создается автоматически через переменные из
.env - Workflows импортируются автоматически из
n8n_workflows/ - Импорт происходит только один раз (проверяется существование workflow перед импортом)
Переменные окружения для N8N (в .env):
N8N_USER- email/username для входа в N8NN8N_PASSWORD- пароль для входа в N8NN8N_FIRST_NAME- имя первого пользователяN8N_LAST_NAME- фамилия первого пользователя
Если N8N уже был настроен ранее:
# Для чистого старта удалите volume:
cd docker
docker-compose down
docker volume rm docker_n8n_data
docker-compose up -dWorkflows, которые импортируются автоматически:
CheckIn.json- Обработка регистрации на лекции (валидация времени, отправка в RabbitMQ)Homework Submission.json- Обработка отправки домашних заданий с AI-анализомUpdate Student Info Google Sheet.json- Синхронизация данных студентов с Google SheetsUpdate Student Info.json- Обновление информации о студентахImport rating from Google.json- Импорт оценок из Google Sheets (по расписанию)
Проверка импорта workflows:
# Проверьте логи init-контейнера
docker-compose logs n8n-init
# Ожидаемый вывод:
# ✓ Workflow 'CheckIn' imported successfully (HTTP 201)
# ✓ Workflow 'Homework Submission' imported successfully (HTTP 201)
# ✓ Workflow 'Update Student Info Google Sheet' imported successfully (HTTP 201)Production режим (использует готовые Docker образы):
cd docker
# Убедитесь, что .env файл создан
ls -la .env
# Если файла нет, создайте его из примера
cp .env.example .env
# Отредактируйте .env и настройте необходимые переменные
# Запуск всех сервисов (использует готовые образы ddzuba/frieren_*:arm64)
docker-compose up -dDevelopment режим (локальная сборка образов):
cd docker
# Запуск с локальной сборкой образов
docker-compose -f docker-compose-dev.yml up -d --buildВажно перед первым запуском:
- ✅ Создайте
.envфайл из.env.example - ✅ Настройте
BOT_TOKEN(обязательно!) - ✅ Измените пароли для production (рекомендуется)
- ✅ Проверьте все переменные окружения
# Статус всех контейнеров
docker-compose ps
# Логи всех сервисов
docker-compose logs -f
# Логи конкретного сервиса
docker-compose logs -f backend
docker-compose logs -f frontend
docker-compose logs -f bot
docker-compose logs -f postgres
docker-compose logs -f n8n
docker-compose logs -f rabbitmq| Сервис | URL | Учетные данные |
|---|---|---|
| Frontend | http://localhost:3000 | - |
| Backend API | http://localhost:8000 | - |
| API Docs (Swagger) | http://localhost:8000/docs | - |
| API Docs (ReDoc) | http://localhost:8000/redoc | - |
| N8N | http://localhost:5678 | Из .env: N8N_USER / N8N_PASSWORD |
| RabbitMQ Management | http://localhost:15672 | Из .env: RABBITMQ_DEFAULT_USER / RABBITMQ_DEFAULT_PASS |
| PostgreSQL | localhost:5432 | Из .env: POSTGRES_USER / POSTGRES_PASSWORD |
Примечание: Учетные данные берутся из файла .env. По умолчанию используются значения из .env.example.
# Запуск всех сервисов (production)
docker-compose up -d
# Запуск всех сервисов (development, с локальной сборкой)
docker-compose -f docker-compose-dev.yml up -d --build
# Остановка всех сервисов
docker-compose down
# Остановка с удалением volumes (⚠️ удалит данные БД!)
docker-compose down -v
# Пересборка образов (production)
docker-compose up -d --build
# Перезапуск конкретного сервиса
docker-compose restart backend
docker-compose restart frontend
docker-compose restart bot
# Остановка конкретного сервиса
docker-compose stop backend
# Запуск конкретного сервиса
docker-compose start backend# Подключение к БД
docker-compose exec postgres psql -U frieren -d frieren_db
# Резервное копирование
docker-compose exec postgres pg_dump -U frieren frieren_db > backup.sql
# Восстановление из backup
docker-compose exec -T postgres psql -U frieren frieren_db < backup.sqlПроект использует SQL миграции для обновления схемы базы данных. Миграции находятся в backend/src/migrations/.
Применение миграции для добавления поля presentation_blob:
# Через docker-compose (рекомендуется)
cd docker
docker-compose exec postgres psql -U frieren -d frieren_db -f /app/src/migrations/add_presentation_blob_to_lectures.sql
# Или через docker exec
docker exec -i frieren_db psql -U frieren -d frieren_db < backend/src/migrations/add_presentation_blob_to_lectures.sqlОткат миграции:
docker-compose exec postgres psql -U frieren -d frieren_db -f /app/src/migrations/rollback_presentation_blob.sqlПримечание: Миграции идемпотентны - их можно запускать несколько раз безопасно. Подробная документация по миграциям находится в backend/src/migrations/README.md.
# Просмотр volumes
docker volume ls | grep frieren
# Удаление volumes (⚠️ удалит все данные!)
docker-compose down -vОбязательно измените все пароли и секреты в .env файле:
cd docker
cp .env.example .env
nano .env # или используйте любой редакторКритически важные переменные для production:
-
Telegram Bot:
BOT_TOKEN=your_production_bot_token_here
-
PostgreSQL:
POSTGRES_PASSWORD=strong_random_password_here DB_PASSWORD=strong_random_password_here # Должен совпадать с POSTGRES_PASSWORD -
N8N:
N8N_USER=your_production_email@example.com N8N_PASSWORD=strong_random_password_here N8N_DATABASE_PASSWORD=strong_random_password_here # Должен совпадать с POSTGRES_PASSWORD -
RabbitMQ:
RABBITMQ_DEFAULT_USER=admin # Не используйте 'guest' в production! RABBITMQ_DEFAULT_PASS=strong_random_password_here
Генерация безопасных паролей:
# Linux/Mac
openssl rand -base64 32
# Или используйте онлайн генераторы паролейПосле изменения .env:
docker-compose down
docker-compose up -dПо умолчанию используется bridge network frieren_network. Для production рассмотрите:
- Использование внешней сети
- Настройку firewall правил
- Использование reverse proxy (nginx/traefik)
Добавьте ограничения ресурсов в docker-compose.yml:
services:
backend:
deploy:
resources:
limits:
cpus: '1'
memory: 1G
reservations:
cpus: '0.5'
memory: 512MНастройте ротацию логов:
services:
backend:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"# Backend API
curl http://localhost:8000/api/students/
# Frontend
curl http://localhost:3000
# Проверка health check PostgreSQL
docker-compose exec postgres pg_isready -U frieren -d frieren_db
# Проверка RabbitMQ
curl -u guest:guest http://localhost:15672/api/overview
# Проверка очередей RabbitMQ
docker-compose exec rabbitmq rabbitmqctl list_queuesПроект включает инструменты для нагрузочного тестирования в директории load_test/:
cd load_test
./load_test.shИспользуется wrk для нагрузочного тестирования API endpoints.
Подробная документация по тестированию frontend находится в frontend/TESTING.md.
Основные проверки:
- Проверка переменных окружения
- Проверка API rewrites
- Проверка конфигурации
- Визуальная проверка компонентов
Backend API включает автоматическую документацию:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
Все endpoints можно протестировать через Swagger UI.
-
Telegram Bot:
- Отправьте
/startботу - Проверьте регистрацию студента
- Проверьте check-in на лекцию
- Отправьте
-
N8N Workflows:
- Импортируйте workflows из
n8n_workflows/ - Проверьте работу webhook триггеров
- Проверьте интеграцию с RabbitMQ
- Импортируйте workflows из
-
Google Sheets:
- Настройте credentials для Google Sheets API
- Проверьте экспорт/импорт данных
cd backend
python -m venv venv
source venv/bin/activate # Linux/Mac
# или
venv\Scripts\activate # Windows
pip install -r requirements/requirement.txt
uvicorn src.service:app --reload --host 0.0.0.0 --port 8000cd frontend
npm install
npm run devcd bot
python -m venv venv
source venv/bin/activate # Linux/Mac
# или
venv\Scripts\activate # Windows
pip install -r requirements/requirements.txt
python app.pyПри разработке с Docker Compose, volumes настроены для hot reload:
- Frontend:
../frontend/src:/app/src(настроено в обоих docker-compose файлах) - Backend: можно добавить volume для автоматической перезагрузки
Использование docker-compose-dev.yml для разработки:
cd docker
# Используйте docker-compose-dev.yml для локальной разработки с пересборкой образов
docker-compose -f docker-compose-dev.yml up -d --build# Все сервисы
docker-compose logs -f
# Конкретный сервис
docker-compose logs -f backend
docker-compose logs -f frontend
docker-compose logs -f botdocker-compose exec backend bash
docker-compose exec frontend sh
docker-compose exec bot bash# Проверка переменных из .env
docker-compose exec frontend env | grep BACKEND
docker-compose exec backend env | grep DB
docker-compose exec bot env | grep BOT
docker-compose exec n8n env | grep N8N
docker-compose exec rabbitmq env | grep RABBITMQ
# Проверка содержимого .env файла (без секретов)
cd docker
grep -v "PASSWORD\|TOKEN" .env- Backend:
backend/README.md- Подробная документация по модели данных и API - Backend Migrations:
backend/src/migrations/README.md- Документация по миграциям базы данных - Frontend Docker:
frontend/README-Docker.md- Документация по развертыванию frontend - Frontend Testing:
frontend/TESTING.md- Документация по тестированию - N8N Workflows:
docker/n8n-workflows/README-homework-submission.md- Документация по workflows
-
Проверьте, что PostgreSQL контейнер запущен:
docker-compose ps postgres
-
Проверьте логи PostgreSQL:
docker-compose logs postgres
-
Проверьте переменные окружения:
docker-compose exec backend env | grep DB
-
Проверьте переменную
BACKEND_URL:docker-compose exec frontend env | grep BACKEND
-
Проверьте логи frontend:
docker-compose logs frontend
-
Проверьте консоль браузера (F12) на наличие ошибок
-
Проверьте
BOT_TOKENв.env:cd docker grep BOT_TOKEN .env # Или проверьте в контейнере docker-compose exec bot env | grep BOT_TOKEN
-
Убедитесь, что
BOT_TOKENустановлен:# Если переменная пустая, добавьте её в .env echo "BOT_TOKEN=your_token_here" >> docker/.env docker-compose restart bot
-
Проверьте подключение к API:
docker-compose logs bot
-
Убедитесь, что backend доступен из контейнера bot
-
Проверьте учетные данные в
.env:cd docker grep N8N_USER .env grep N8N_PASSWORD .env -
Проверьте доступность N8N:
curl http://localhost:5678
-
Проверьте логи:
docker-compose logs n8n docker-compose logs n8n-init # Логи импорта workflows -
Убедитесь, что workflows импортированы:
# Проверьте логи init-контейнера docker-compose logs n8n-init | grep "imported successfully"
-
Если workflows не импортируются:
# Удалите volume и пересоздайте пользователя docker-compose down docker volume rm docker_n8n_data docker-compose up -d
-
Проверьте учетные данные в
.env:cd docker grep RABBITMQ .env -
Проверьте статус RabbitMQ:
docker-compose ps rabbitmq
-
Проверьте логи init-контейнера (создание очереди):
docker-compose logs rabbitmq-init
-
Проверьте Management UI: http://localhost:15672
- Используйте учетные данные из
.env:RABBITMQ_DEFAULT_USER/RABBITMQ_DEFAULT_PASS
- Используйте учетные данные из
-
Проверьте очереди:
docker-compose exec rabbitmq rabbitmqctl list_queues -
Если очередь не создана:
# Перезапустите init-контейнер docker-compose restart rabbitmq-init docker-compose logs -f rabbitmq-init
-
Проверьте переменную
GOOGLE_SHEET_IDв.env:cd docker grep GOOGLE_SHEET_ID .env # Или проверьте в контейнере docker-compose exec backend env | grep GOOGLE_SHEET_ID
-
Убедитесь, что файл
credentials.jsonсуществует:ls -la docker/google/credentials.json
-
Проверьте, что Service Account имеет доступ к таблице:
- Откройте Google Таблицу
- Проверьте настройки доступа (Share)
- Убедитесь, что email из
credentials.json(полеclient_email) добавлен с правами редактора
-
Проверьте логи backend на наличие ошибок Google Sheets API:
docker-compose logs backend | grep -i "google\|sheet\|gspread"
-
Проверьте, что Google Sheets API и Google Drive API включены в Google Cloud Console:
- Перейдите в Google Cloud Console
- Выберите ваш проект
- Перейдите в "APIs & Services" > "Library"
- Убедитесь, что Google Sheets API и Google Drive API включены
-
Если экспорт/импорт не работает:
- Убедитесь, что
GOOGLE_SHEET_IDустановлен корректно (ID из URL таблицы) - Проверьте формат ID (должен быть строкой без пробелов)
- Убедитесь, что таблица существует и доступна
- Убедитесь, что
Проект разработан для внутреннего использования в МАИ.
Разработано для Московского авиационного института (МАИ).
- ✅ Добавлена функциональность управления презентациями лекций
- ✅ Добавлено поле
presentation_blobв таблицуlecturesдля хранения презентаций (PDF/PPTX, до 50MB) - ✅ Реализованы API endpoints для загрузки/скачивания презентаций лекций
- ✅ Добавлена поддержка загрузки и скачивания презентаций в frontend
- ✅ Интеграция скачивания презентаций в Telegram бот
- ✅ Автоматическое определение формата файла (PDF/PPTX) при скачивании
- ✅ Обновлена документация: добавлена информация о функциональности презентаций
- ✅ Добавлена функциональность управления экзаменационными оценками (
exam_grades) - ✅ Добавлена таблица
exam_gradesв базу данных (6 полей, включая хранение PDF-файлов) - ✅ Реализованы API endpoints для работы с экзаменационными оценками (CRUD + загрузка/скачивание файлов)
- ✅ Добавлена страница
/exam-gradesв frontend для управления оценками - ✅ Поддержка загрузки и скачивания PDF/PNG/JPG файлов экзаменационных работ
- ✅ Интеграция exam_grades в экспорт/импорт данных и Google Sheets
- ✅ Обновлена документация: добавлена информация о новой функциональности
- ✅ Добавлено поле
start_time(время начала) для лекций - ✅ Обновлены все API endpoints лекций для поддержки времени начала
- ✅ Обновлен frontend: добавлено отображение и редактирование времени начала лекций
- ✅ Обновлен Telegram бот: добавлено отображение времени начала лекций во всех сценариях
- ✅ Улучшен UX бота: все сценарии автоматически возвращают главное меню после завершения
- ✅ Расширены N8N workflows: добавлены
Update Student Info.jsonиImport rating from Google.json - ✅ Расширены API endpoints: добавлены новые endpoints для преподавателей и вариантов ДЗ
- ✅ Обновлена документация: добавлены описания всех функций бота и API endpoints
- ✅ Централизована конфигурация через
.envфайл - ✅ Добавлен
.env.exampleкак шаблон конфигурации - ✅ Автоматическое создание первого пользователя N8N
- ✅ Автоматический импорт N8N workflows с проверкой дубликатов
- ✅ Автоматическое создание очереди RabbitMQ при первом запуске
- ✅ Улучшена документация по развертыванию и настройке
- ✅ Добавлены инструкции по использованию переменных окружения
- ✅ Реализована базовая функциональность управления студентами
- ✅ Добавлена система регистрации на лекции через QR-код
- ✅ Реализована система проверки домашних заданий
- ✅ Добавлена интеграция с OpenAI для анализа кода
- ✅ Реализована интеграция с Google Sheets
- ✅ Добавлена система вариантов домашних заданий
- ✅ Реализован веб-интерфейс для преподавателей
- ✅ Добавлен Telegram бот для студентов и преподавателей
- ✅ Настроена инфраструктура с Docker Compose
- ✅ Добавлена интеграция с N8N и RabbitMQ
Последнее обновление: 2025