Возможности подробно
Полный перечень того, что система умеет сегодня, по ролям и модулям. Здесь только реализованное: ничего из планов.
Всем пользователям
Вход и профиль
- Вход по адресу почты и паролю; сессия продлевается автоматически.
- Вход через учётную запись университета или внешнего провайдера: кнопки прямо на странице входа.
- Ограничение числа попыток входа с одного адреса как защита от подбора пароля.
- При неверных данных система не подсказывает, что именно неверно: почта или пароль.
- Заблокированная учётная запись в систему не пускается.
- После входа открывается личный кабинет со своим меню для каждой роли.
- Профиль: ФИО, логин, почта, роль, номер зачётки, привязанные аккаунты в системах хранения кода, группа, дата регистрации.
- Правка разрешённых полей профиля: ФИО, номер зачётки, аккаунт в системе хранения кода и предпочитаемый язык.
- Смена пароля из профиля с проверкой длины и совпадения.
- При первом входе система требует сменить выданный пароль.
- Привязка и отвязка внешних учётных записей входа прямо в профиле.
- Язык интерфейса: русский, английский, польский, белорусский; выбор запоминается и применяется на всех страницах.
- Даты и числа отображаются в формате выбранного языка.
- Ссылка «перейти к содержимому» на каждой странице для работы с клавиатуры.
Справка
- Встроенная справка для студента и преподавателя: первые шаги, руководство по экранам и пошаговые рецепты.
- Студент видит справку студента, преподаватель видит справку преподавателя и студента; справка доступна на четырёх языках интерфейса.
Работа с GitHub и GitLab
Как система работает с хостингом кода
- Курс живёт в репозитории: задания, методички, рубрики и шаблоны проверок — файлы под версионным контролем; версия курса — git-тег, содержимое по тегу неизменно.
- Свой хостинг кода система не приносит: работает поверх GitHub или GitLab вуза через бот-аккаунт и токены с минимальными правами.
- Каждому студенту на каждый курс система автоматически создаёт личный приватный репозиторий из заготовки: шаблон отчёта, каркас кода, публичные тесты, конфигурация CI; приватные материалы курса туда не попадают.
- Сдача — pull request в GitHub или merge request в GitLab; событие приходит вебхуком, а на случай его потери работает резервный опрос открытых запросов.
- Автопроверки выполняются в CI самого хостинга: GitHub Actions или GitLab CI вуза; система читает статус проверки и не запускает AI-разбор при красном результате.
- В запрос публикуется только нейтральный комментарий со ссылкой в систему: без баллов и текста отзыва.
- Force-push — та же сдача с новой ревизией, без дублей; события по уже оценённой работе игнорируются.
- Авторинг курса тоже идёт через запросы: каркас задания, правка файлов, шаблоны CI отправляются запросом с ревью, слияние только после одобрения.
- Единый центральный репозиторий автопроверок на организацию или группу; репозитории курсов и студентов ссылаются на плавающий тег, исправления доезжают без коммитов в каждый репозиторий.
- Синхронизация состава организации или группы с системой: отчёт о расхождениях, приглашения недостающих, пробный запуск без изменений.
- В хостинг кода уходит только логин студента: ни ФИО, ни почта, ни оценки.
- Оба провайдера одновременно: у пользователя по аккаунту на каждого, у курса один провайдер, токены и организации по умолчанию задаются отдельно для каждого.
GitHub
- GitHub.com и GitHub Enterprise Server: адрес инстанса задаётся в токене.
- Бот-аккаунт и два токена: один для членства и приглашений, другой для содержимого курсов.
- Личные репозитории студентов в организации вуза; доступ приглашением коллаборатором, членство в организации не обязательно, членам организации приглашение не нужно.
- Работает и на бесплатном тарифе организации: отсутствие защиты веток компенсирует ревью-гейт публикации в самой системе.
- Вебхук организации только на события pull request с проверкой подписи до разбора тела.
- Результат GitHub Actions читается через check-runs с резервным чтением через Actions API; если недоступно ни то ни другое — явная ошибка, а не зелёный пропуск.
- Студент без заполненного аккаунта GitHub получает статус «с ошибкой» и причину; неудачные создания репозиториев повторяются с нарастающей паузой, есть кнопка «Повторить».
- Приглашения в организацию по логину через Invitations API.
GitLab CE (self-hosted)
- Собственный инстанс GitLab вуза: адрес и группа задаются в токене; курсы и студенты — проекты этой группы.
- Личный приватный проект каждому студенту с ролью Developer.
- Вебхук на каждый личный проект с секретным токеном; настройка перепроверяется при каждом проходе, чтобы старый секрет не залип.
- CI-конфигурация личного проекта закреплена на центральный репозиторий проверок: студент не может её изменить — граница строже, чем на GitHub.
- Форки отключены, merge request из форка не принимается как сдача.
- Чтение центральных проверок через членство Reporter без прав на запись.
- При создании проекта проверяется наличие работающего раннера; зависший пайплайн не блокирует проверку бесконечно — таймаут настраивается.
- Переключение версии центральных проверок для курса без merge request.
- Общий Keycloak-realm для системы и GitLab: один пароль для входа в обе.
- Требования к раннеру задокументированы: docker-executor, лимиты ресурсов, таймауты, сетевая изоляция, автоотмена лишних пайплайнов.
Что нужно со стороны вуза
- Организация в GitHub или группа в собственном GitLab CE.
- Бот-аккаунт и токены с минимальными правами, заведённые в системе.
- Для GitLab — раннер на docker-executor; для GitHub — минуты Actions или self-hosted раннер.
- Публичный адрес для вебхуков; без него работает резервный опрос.
Студенту
Выданные задания
- Список заданий карточками: курс, задание, срок, статус работы; видны только задания своей группы.
- Поиск по заданиям и фильтр по статусу.
- Сортировка по сроку, ближайшие первыми, с учётом персонального продления.
- Индикатор непрочитанного отзыва на карточке задания.
- Бейдж «репозиторий готовится», пока личный репозиторий создаётся, и пометка «назначение закрыто» на закрытых заданиях.
- Страница задания: методичка, руководство и шаблон отчёта с полным оформлением (заголовки, списки, блоки кода).
- Ссылка на личный репозиторий, как только он готов.
- Публичная рубрика с критериями и баллами: видно, за что начисляются баллы, до начала работы.
- Персональный номер варианта и его условие.
- Срок сдачи с учётом персонального продления.
- Понятное сообщение вместо пустой страницы, если содержимое задания временно недоступно.
Сдача работ
- Кнопки «Отправить на проверку» и «Отправить повторно» после доработки; если сдача невозможна, кнопка объясняет причину.
- Сдача фиксируется автоматически по событию из системы хранения кода, без ручных действий.
- Работа после срока принимается и помечается «с опозданием»; автоматических штрафов нет, решение за преподавателем.
- Доработка без ограничения по числу попыток, пока преподаватель не подтвердил оценку.
- В запрос на слияние уходит только нейтральное уведомление со ссылкой в систему, без баллов и текста отзыва.
- Ручная привязка запроса на слияние как запасной путь.
- Отчёт по секциям рубрики прямо в системе, отдельной вкладкой на странице работы.
- Черновик отчёта сохраняется автоматически по мере набора.
- Предпросмотр секции в оформленном виде и возврат в режим правки.
- Вложения к отчёту: изображения и текстовые файлы, до 5 МБ на файл и 25 МБ суммарно.
- Отметка «раздел не изменился» для секций, которые не потребовали правок.
- Сдача отчёта с подтверждением; бейджи «черновик» и «сдан» с датой.
- Автоматическая проверка ждёт сдачи отчёта и не запускается раньше.
Статус проверки и отзыв
- Понятные статусы работы: отправлено, проверяется, проверено, на доработку, оценено.
- Лента шагов проверки с датами отправки и выставления оценки.
- Блок «что исправить» наверху страницы, если работа возвращена на доработку.
- Пометка «сдано с опозданием» на странице работы.
- Ссылка на код работы и историю правок.
- Баллы по каждому критерию рубрики и комментарий преподавателя; служебные поля рубрики студенту не показываются.
- Результаты автоматического разбора студенту не показываются: это внутренний инструмент преподавателя.
- Система запоминает, что отзыв открыт, и снимает индикатор непрочитанного.
- После возврата на доработку у работы свой срок пересдачи, он виден на странице работы.
Оценки
- Таблица оценок: курс, задание, балл, максимум, дата.
- Сводка: средний процент, сколько оценено из назначенного, лучший результат.
- Переход из строки таблицы к развёрнутому отзыву по работе.
- Уведомления об отзыве внутри системы, без почтовых рассылок.
Преподавателю
Курсы
- Список курсов, к которым преподаватель прикреплён: название, репозиторий, число заданий, текущая версия, статус (черновик, опубликован, архив).
- Поиск по названию и фильтр по статусу курса.
- Карточка курса: репозиторий, версия, число заданий, список преподавателей, значок системы хранения кода.
- Проверка структуры курса перед публикацией: отчёт о найденных заданиях и ошибках.
- Публикация версии курса: задания и рубрики загружаются в систему и становятся доступны для выдачи.
- Индикатор «есть неопубликованные изменения» относительно текущей версии.
- Создание нового задания одной формой: система заводит каркас с обязательными файлами и открывает запрос на слияние.
- Список ожидающих заданий, созданных, но ещё не влитых, со ссылками на их запросы на слияние.
- Правка сведений о задании: заголовок, порядок в списке, отправка в архив.
- Просмотр задания в системе: методичка, шаблон отчёта, рубрика, примеры работ.
- Правка текстовых файлов задания в интерфейсе; изменение уходит запросом на слияние, а не пишется в курс напрямую.
- Баннер со ссылкой на открытый запрос на слияние после любого изменения.
- Помощник по содержимому: по краткому описанию темы формируется черновик задания с методичкой, руководством и рубрикой.
- Помощник по рубрике: по тексту готового задания предлагаются критерии и баллы.
- Черновик помощника никогда не публикуется сам: он приходит предложением, которое преподаватель правит и принимает.
- Настройка автоматических проверок курса: выбор из готовых шаблонов, предпросмотр, применение через запрос на слияние.
- Видно, какие шаблоны уже применены и сколько собственных файлов проверок добавлено сверх них.
Задания и рубрики
- Рубрика задания: критерии с названием, описанием, максимальным баллом и типом проверки, автоматическая или ручная.
- Суммарный балл рубрики считается и проверяется при публикации.
- Приватные указания для проверяющего видны только преподавателю и не попадают студенту.
- Бонусные баллы к заданию отдельным блоком.
- Индивидуальные варианты задания.
- Публичная часть рубрики, критерии и веса, видна студенту.
- Рубрика фиксируется снимком в момент выдачи: правки курса не меняют уже выданное задание.
Назначения
- Выдача заданий группе одной формой-графиком: курс, набор заданий, группа, свой срок для каждого задания.
- Выдавать можно только опубликованные курсы и только закреплённым за преподавателем группам.
- Состав участников фиксируется в момент выдачи: перевод студента в другую группу не ломает историю и сданные работы.
- Каждому участнику автоматически создаётся личный репозиторий с заготовкой; студент видит задание сразу, репозиторий по готовности.
- Статус готовности репозитория по каждому студенту: готово, готовится, ошибка; повторная попытка для тех, у кого не создался.
- Досинхронизация участников: добавить тех, кто пришёл в группу позже старта.
- Индивидуальное продление срока конкретному студенту с пометкой в таблице участников.
- Правка срока сдачи сразу для всей группы.
- Закрытие назначения явным действием из списка.
- Удаление ошибочно созданного назначения, пока по нему никто не сдал работу.
- Все изменения назначения записываются в журнал: кто, что и когда изменил.
- Таблица назначений: курс, задание, группа, срок, участники, сдано, ждут проверки, статус; фильтры по курсу, группе и статусу.
- Сводные счётчики готовности репозиториев и переход к списку работ студентов.
- Модель проверки помощником выбирается для потока или отдельного задания; без выбора действует модель по умолчанию.
- Матрица прогресса потока: студенты и задания со статусами, итог по каждому студенту, выгрузка в CSV.
Очередь проверки
- Рабочая очередь по заданию: студент, ссылка на работу, статус, результат автоматической проверки, оценка, дата обновления.
- Счётчик работ, ждущих решения преподавателя, и фильтр по статусу.
- Пометка «с опозданием» в очереди.
- Преподаватель видит работы только закреплённых за ним групп.
- Сквозная очередь «Проверка»: все сдачи по всем заданиям преподавателя одним списком, с фильтрами и счётчиками.
Разбор помощником
- Автоматический разбор запускается сам, с отложенным стартом, чтобы не срабатывать на каждую мелкую правку.
- Бейдж «проверка отложена до …» с кнопкой запустить немедленно.
- Статусы разбора: в очереди, выполняется, готово, требует внимания, ошибка.
- Предварительная сумма автоматических баллов прямо в очереди.
- Упавший разбор показывается с причиной и кнопкой перезапуска.
- Пометка «требует ручного внимания» на результатах, не прошедших фильтр качества.
- Подсказки по каждому критерию: предлагаемый балл, степень уверенности, комментарий и ссылки на подтверждения в коде.
- Критерии с низкой уверенностью подсвечиваются, чтобы преподаватель посмотрел их первыми.
- Кнопка «подставить баллы помощника» заполняет все поля разом, оставляя их редактируемыми.
- Комментарий, скрытый фильтром безопасности, показывает причину: совпадение с эталоном или с инструкцией проверяющему и сам фрагмент.
- Текст структурированного отчёта студента передаётся помощнику как контекст.
- Расход на разбор ограничен дневным бюджетом на курс; преподаватель может запустить проверку и сверх бюджета.
- Проверку помощником можно перезапустить и после готового результата, пока работа не оценена; рядом с результатом видна модель, которая проверяла.
Оценивание
- Экран оценивания: критерии рубрики с полями баллов и проверкой, что балл не превышает максимум.
- Рядом с каждым критерием сворачиваемая секция отчёта студента с миниатюрами вложений.
- Текстовый комментарий студенту.
- Подтверждение итоговой оценки: работа переходит в «оценено», в запрос на слияние уходит нейтральное уведомление.
- Возврат работы на доработку с обязательным комментарием.
- Корректировка уже подтверждённой оценки с обязательным указанием причины.
- Переоткрытие оценённой работы на повторную проверку с обязательным указанием причины.
- Кто и когда подтвердил или изменил оценку записывается в журнал.
- Итоговый балл и максимум на экране после подтверждения.
- Пометку «сдано с опозданием» можно снять или вернуть для отдельной работы с указанием причины.
Мейнтейнеру курса
Курсы и репозитории
- Регистрация курса одной формой: выбор токена (провайдер и организация берутся из него), имя репозитория, название, описание; итоговое имя с префиксом видно до сохранения.
- Создание приватного репозитория курса с начальным коммитом; повторная регистрация безопасна.
- Токен курса необязателен: если пусто, используется системный.
- Все курсы на общей странице с поиском и фильтром по статусу.
- Назначение преподавателю доступных учебных групп: чекбоксы по группам, «выбрать все», счётчик назначенных.
- Преподавателей курса назначают и снимают прямо в карточке курса.
Ревью и публикация
- Очередь ревью: открытые запросы на слияние по всем курсам (курс, автор, номер, число файлов, дата) с поиском по курсу, автору и названию.
- Метка «workflows» на запросах, затрагивающих файлы автоматических проверок.
- Одобрение или запрос правок с комментарием; счётчики одобрений и запрошенных правок.
- Слияние через систему только после одобрения либо человеком, который не является автором.
- Публикация отклоняется, если в основную ветку попали изменения без одобрения; гейт работает и там, где защита веток недоступна.
- Структурная проверка при публикации: методичка на месте, рубрика валидна, сумма баллов сходится, приватный каталог не копируется студентам.
- Граница секретности по каталогу grading: эталон, указания проверяющему и скрытые тесты не покидают репозиторий курса.
- Версия курса — git-тег; содержимое по тегу неизменно, уже выданные назначения не меняются.
- Ревью и слияние записываются в журнал аудита.
Центральные проверки CI
- Единый центральный репозиторий автопроверок на организацию; развёртывание одной кнопкой, повторное безопасно.
- Стартовый набор из семи проверок: предпроверка сдачи, структурный линт, дымовые тесты, поиск утёкших секретов, битые ссылки, линт содержимого, разметчик запросов.
- Поиск секретов сканирует историю, а не только текущие файлы.
- Карточка состояния: сконфигурирован ли, развёрнут ли, актуальный релиз, плавающие теги, открытые запросы; диагностика «чего не хватает» со ссылкой в настройки.
- Просмотр файлов проверок и правка через запрос на слияние в служебную ветку; очередь запросов центрального репозитория с тем же ревью-гейтом.
- Релиз с выбором уровня (major, minor, patch): точный тег ставится, плавающий сдвигается автоматически.
- Матрица версий по курсам: актуально, устарело, устаревший формат, нет проверок, ошибка.
- Миграция курса на новую версию одной кнопкой: запрос, меняющий только ссылки на версию; для GitLab переключение без запроса.
- В репозиториях курсов и студентов — тонкие заглушки со ссылкой на плавающий тег: исправления доезжают без коммитов в каждый репозиторий.
- Без центрального репозитория работают встроенные шаблоны; в предпросмотре видно, какие применены.
- Разделение токенов: один для правок и релизов, другой только для развёртывания.
- Развёртывание, правки, релизы и миграции записываются в аудит.
Настройки системы
- Единая страница настроек; токены и провайдеры выбираются из списков, а не вводятся идентификаторами.
- Роль новых пользователей по умолчанию; организация GitHub и группа GitLab по умолчанию.
- Префиксы имён репозиториев курсов и личных репозиториев студентов.
- Системный токен содержимого курсов с переопределением на отдельном курсе.
- Задержка перед автоматической проверкой, дневной бюджет токенов на курс, модель по умолчанию и запасная модель, интервал резервного опроса сдач.
- Гейт публикации: обязательное одобрение или выключен для преподавателя, работающего в одиночку.
- Настройки центральных проверок: провайдер, имя репозитория, токены; путь CI-конфигурации для личных проектов GitLab.
- Предупреждения о ссылках на удалённые или отозванные токены прямо на странице; каждое изменение попадает в аудит парой «старое → новое».
Администратору
Пользователи
- Список: логин, ФИО, почта, роль, группы, статус, дата; поиск, фильтры по роли и статусу, сортировка, постраничный вывод.
- Создание пользователя одной формой: почта, логин, ФИО, пароль, роль; аккаунты GitHub и GitLab, номер студенческого.
- Уникальность почты и логина без учёта регистра.
- Массовый импорт из CSV: предпросмотр, подсветка ошибочных строк, импорт только валидных, построчный отчёт; до 500 строк; защита от CSV-инъекций; строка без пароля создаёт пользователя с приглашением по ссылке.
- Редактирование: ФИО, логин, почта, роль, аккаунты в системах кода, номер студенческого; смена роли действует сразу.
- По одному аккаунту на каждого провайдера кода: GitHub и GitLab одновременно.
- Сброс пароля: временный пароль показывается один раз, смена при следующем входе обязательна.
- Деактивация с пояснением последствий вместо удаления; данные сохраняются; реактивация той же кнопкой.
- Защита последнего и стартового администратора от деактивации и разжалования.
- Деактивированный студент: история сохраняется, в новые назначения он не попадает, уже сданное можно оценить.
- Доступ выдаётся ссылкой-приглашением из письма вместо временного пароля; в карточке пользователя виден статус приглашения.
Группы
- Список групп: название, тип, число участников, владелец; поиск и фильтр по типу.
- Создание: уникальное имя и тип, учебная или произвольная; студент состоит не более чем в одной учебной группе.
- Редактирование имени и типа на странице группы с предупреждением при смене типа.
- Архивация вместо удаления с показом числа участников; разархивация одной кнопкой.
- Участники: добавление с поиском, удаление с подтверждением, назначение владельца; владелец управляет составом сам.
- Пакетное добавление до 100 человек за раз с фильтром по роли и двухшаговым подтверждением.
- Участников учебной группы можно разделить на подгруппы; задание выдаётся всей группе или отдельной подгруппе со своим сроком.
Токены систем кода и ключи моделей
- Токены систем кода: GitHub или GitLab, адрес self-hosted инстанса, организация или группа, пометка прав, дата истечения.
- Хранение только в зашифрованном виде, в списках маска; проверка пробным вызовом провайдера, включая доступ к организации.
- Несколько токенов на разные организации; предупреждение за 14 дней до истечения.
- Ротация на месте без перепривязки курсов.
- Отзыв как аварийный выключатель: немедленно и необратимо, с показом затронутых курсов и настроек; отозванное отвергается везде явной ошибкой.
- Удаление только после отзыва и только если токен нигде не используется.
- Ключи моделей: провайдер (в том числе OpenRouter с запасной моделью и политикой обработки данных), модель по умолчанию, лимит, срок; шифрование, маска, проверка пробным вызовом.
- Те же правила ротации, отзыва и удаления для ключей моделей; отозванный ключ по умолчанию делает проверку явно неработающей, а не выключает её молча.
- При первом запуске система сама заводит локальную заглушку ключа: конвейер проверок работает без внешней модели.
- Создание, ротация, отзыв и удаление записываются в аудит.
Журнал аудита
- Журнал: время, действие, кто, над чем, детали; доступен только администратору.
- Фильтры по действию, актору, цели и датам; постраничный вывод, новые сверху.
- Только дописывается: через интерфейс и API записи нельзя изменить или удалить.
- Что попадает: входы и неудачные попытки с причиной и адресом; пользователи, настройки, токены; назначения, оценки, авторинг и ревью, проверки, синхронизация, сдача отчётов.
- Синхронизация с системой кода пишет одно сводное событие со счётчиками.
Синхронизация с системой кода
- Страница синхронизации: выбор провайдера и токена.
- Отчёт о расхождениях: совпадения, есть у нас и нет в системе кода, есть там и нет у нас.
- Применение приглашает недостающих в организацию или группу; повторный запуск безопасен; пробный запуск без приглашений.
- Результат со счётчиками и статусом по каждой операции; синхронизация односторонняя, из системы в хостинг кода.
SSO / OIDC
- Провайдеры входа OIDC и LDAP: создание, редактирование, активация и деактивация без удаления конфигурации.
- OIDC: издатель, client id и secret, scopes, переопределения адресов, claim с ролями; секреты хранятся зашифрованными.
- Кнопка «Тест»: discovery, JWKS, token endpoint; для LDAP пробная привязка.
- Кнопки провайдеров на странице входа появляются по активности провайдера.
- Authorization Code с PKCE, state и nonce, полная проверка ID-токена; токены провайдера обрабатываются только на сервере.
- Автопривязка существующего пользователя по подтверждённой почте; автосоздание при первом входе с разрешением коллизий логина.
- Маппинг ролей из claim с группами; роль обновляется при каждом входе; защита последнего администратора действует и здесь.
- Принудительный SSO: вход по паролю для всех, кроме администраторов, отклоняется.
- LDAP-провайдер: адрес, DN привязки, база и фильтр поиска, маппинг атрибутов, LDAPS по умолчанию.
- Автосвязка аккаунта в системе кода из claim провайдера.
- Общий Keycloak-realm для системы и GitLab: один пароль для обеих; скрипт переноса существующих пользователей в Keycloak.
Интеграции и эксплуатация
AI-модуль
- Провайдер модели со структурированным выходом; локальная заглушка для разработки; без ключа конвейер работает в режиме ручной проверки.
- Модель только возвращает разбор по заданной схеме и не исполняет код; исполнение только в CI без секретов системы; ключи моделей хранятся на сервере в зашифрованном виде и не отдаются в браузер.
- Фильтр выхода: совпадения отзыва с эталоном или указаниями вырезаются, проверка помечается «требует внимания».
- Комментарий по критерию ограничен по длине; свободный текст модели не публикуется.
- Гейт CI: при красной автопроверке модель не запускается; нехватка прав токена — явная ошибка, а не зелёный пропуск.
- Отложенный старт, дневной бюджет, повторы с нарастающей паузой; после исчерпания попыток работа уходит на ручную проверку, конвейер не встаёт.
Развёртывание и эксплуатация
- Docker Compose: API, worker, фронтенд, PostgreSQL; миграции применяются автоматически при старте; профиль с Keycloak и OpenLDAP.
- Проверки готовности и эндпойнт здоровья; метрики Prometheus у API и worker.
- Worker — отдельный процесс той же кодовой базы: очередь в PostgreSQL без брокера, повторы, периодические задачи.
- Резервный опрос открытых запросов на слияние как страховка при потере вебхука или без публичного адреса.
- Образы в два этапа, процессы без root; конфигурация через переменные окружения; секреты по профилям.
- Скрипт проверки с профилями local, stand, prod: pytest, юнит-тесты фронтенда, E2E, прогон SSO, живой прогон с системой кода, дымовые тесты прода.
Безопасность
- Пароли Argon2; короткий access-токен и refresh с ротацией; HttpOnly cookies; выход отзывает сессию.
- Лимиты попыток входа по адресу и почте; доверие X-Forwarded-For только от перечисленных подсетей.
- Заголовки безопасности на каждом ответе: nosniff, запрет фреймов, Referrer-Policy, CSP; HSTS на проде; CORS по списку.
- Вебхуки: HMAC-SHA256 у GitHub, секретный токен у GitLab, сравнение за постоянное время, отказ до разбора тела.
- Все секреты в базе зашифрованы: токены систем кода, ключи моделей, client secret, пароль LDAP.
- В систему кода уходит только логин: ни ФИО, ни почта, ни оценки.
- Изоляция студентов: личные приватные репозитории, чужие работы не видны; приватное содержимое курса не копируется студенту.
- Жёсткого удаления нет; журнал аудита только дописывается.
- Контейнеры без root; статический анализ безопасности и аудит зависимостей перед каждым коммитом.