Перейти к содержанию

Студсайт

Материал из Вики IT-отдела
Ответственный: Nepike · Последняя проверка: 27 сентября 2026

Студсайт — студенческий портал факультета КНТ МФТИ: knt-mipt.ru. Главный проект, который поддерживает IT-отдел. Исходный код открыт: github.com/Nepike/knt-portal.

Как появляются аккаунты

Регистрация закрытая: аккаунты заводит администратор сайта на странице /registration/ (нужно право на создание пользователей).

  • По одному — через форму на этой странице.
  • Целым курсом — загрузить таблицу .xlsx: обычно это выгрузка ответов Google-формы. Обязательны столбцы с ФИО, почтой и группой; дата рождения и Telegram — по желанию. Столбцы ищутся по началу слова в заголовке, поэтому «Почта», «Удобная почта» и «e-mail» распознаются одинаково, а лишние столбцы пропускаются. До 500 строк и 5 МБ.

Каждому новому пользователю приходит письмо со ссылкой для входа. Почты, которые уже есть на сайте, пропускаются — одну и ту же выгрузку можно загружать повторно, когда в форме прибавились ответы.

Адреса

Адрес Что это
knt-mipt.ru Основной адрес сайта
inbicst.ru, fnbic.ru, new.knt-mipt.ru Старые адреса, перенаправляют на knt-mipt.ru (факультет раньше назывался ИНБИКСТ)
files.inbicst.ru Отдельный домен для скачивания файлов сайта

Где зарегистрированы домены и как настраиваются DNS-записи — см. Домены и DNS.

Как устроен

Сайт работает на сервере сайта в виде набора Docker-контейнеров (проект Docker Compose в /srv/knt).

Технологии: Python 3.12, Django 6, PostgreSQL 17, Redis, Celery, Django Channels (WebSockets), HTMX и Tailwind 4, хранилище файлов Cloudflare R2, nginx, GitHub Actions.

Контейнеры

Контейнер Что делает
web Сам сайт: Django под gunicorn с двумя uvicorn-воркерами (ASGI, нужен для WebSockets). При старте применяет миграции и собирает статику. Слушает 127.0.0.1:8001, снаружи к нему ходит только nginx.
db PostgreSQL 17, данные в docker-томе knt_pgdata.
redis Четыре задачи на четырёх базах: 0 — шина WebSockets, 1 — очередь Celery, 2 — результаты задач, 3 — кэш (на нём ограничители частоты запросов). На диск ничего не пишет: при перезапуске терять нечего.
worker Celery: фоновые задачи, которых пользователь не должен ждать, — отправка почты и сообщений в Telegram. Один процесс: задачи редкие, а памяти на сервере мало.
beat «Будильник»: сам ничего не делает, только кладёт задачи по расписанию в очередь. Сейчас это одна задача — ночная уборка брошенных загрузок.
bot Telegram-бот сайта: пишет в рабочие чаты (см. ниже).

Как проходит запрос

браузер ──HTTPS──> nginx на сервере ──> 127.0.0.1:8001 (web: Django) ──> PostgreSQL, Redis
                        │
                        └── файлы: отдаёт сам nginx (с диска или из Cloudflare R2),
                            Django только разрешает доступ

HTTPS-сертификаты — Let's Encrypt, их выпускает и продлевает certbot на сервере.

Файлы и видео

Файлы пользователей хранятся в Cloudflare R2 (S3-совместимое хранилище). Большие файлы браузер загружает прямо в R2, минуя сервер, а при скачивании байты отдаёт nginx — Python в передаче файлов не участвует.

Файлы лежат в R2 в том же общем аккаунте Cloudflare «INBICST», что и DNS.

Сервер не перекодирует видео: на нём нет и не будет ffmpeg. Видео для лектория и косметики готовит «пекарня» — скрипт tools/bake.py на машине с видеокартой (ffmpeg + NVENC). Сейчас это новый факультетский сервер на М4, где пекарня работает как служба systemd. Она сама забирает задания из очереди сайта, скачивает исходник из R2 и загружает туда готовый результат. Пекарне нужен только исходящий интернет, поэтому при поломке её можно запустить на любом компьютере с видеокартой. Подробно — docs/media-pipeline.md в репозитории.

Почта

Письма (приглашения, восстановление пароля) уходят с адреса info@knt-mipt.ru через SMTP Google (smtp.gmail.com, порт 465, SSL). Отправляет их не сам запрос, а воркер Celery через очередь — медленный почтовый сервер не тормозит сайт. Пароль от почты хранится в .env на сервере.

Как выкатываются изменения

Push в ветку main — это и есть деплой:

  1. GitHub Actions (.github/workflows/deploy.yml) заходит на сервер по SSH.
  2. В /srv/knt выполняет git pull и docker compose up -d --build, затем удаляет старые образы.
  3. Контейнер web при старте сам применяет миграции.
  4. В Telegram приходят три сообщения: «деплой запущен» со списком коммитов, «завершён» со временем или «упал» со ссылкой на логи. Чат и тема для них задаются секретами репозитория TG_CHAT_ID и TG_TOPIC_ID.

Сейчас код пишет один человек, поэтому изменения сразу пушатся в main.

TODO: Завести отдельную ветку для разработки и, возможно, бета-версию сайта, чтобы изменения не попадали на прод сразу

Telegram-чаты

Бот сайта пишет в отдельные Telegram-группы: фидбек, техподдержка, в будущем — магазин; со временем могут появиться и другие. Людей в группы добавляет глава отдела.

Куда писать, задаётся не в коде, а в админке сайта (/admin/, раздел «Телеграм-чаты»): название, chat ID и, для групп с темами, ID темы. Chat ID живого чата можно узнать у бота командой /get_chat_id.

Локальный запуск

Для разработки достаточно Python, база по умолчанию — SQLite:

export DJANGO_SETTINGS_MODULE=knt.settings.dev
pip install -r requirements.txt
python manage.py migrate
python manage.py runserver

Стили генерирует Tailwind, в репозитории их нет — без сборки сайт будет без оформления. Тесты: python manage.py test. Подробности — в README репозитория.

Предыдущие версии

Первое поколение этого сайта — knt-portal-legacy.

Доступ

Как получить доступ к репозиторию и серверу — см. Доступы.