Студсайт
Студсайт — студенческий портал факультета КНТ МФТИ: 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 — это и есть деплой:
- GitHub Actions (
.github/workflows/deploy.yml) заходит на сервер по SSH. - В
/srv/kntвыполняетgit pullиdocker compose up -d --build, затем удаляет старые образы. - Контейнер
webпри старте сам применяет миграции. - В Telegram приходят три сообщения: «деплой запущен» со списком коммитов, «завершён» со временем или «упал» со ссылкой на логи. Чат и тема для них задаются секретами репозитория
TG_CHAT_IDиTG_TOPIC_ID.
Сейчас код пишет один человек, поэтому изменения сразу пушатся в main.
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.
Доступ
Как получить доступ к репозиторию и серверу — см. Доступы.