Студсайт: различия между версиями
Nepike (обсуждение | вклад) Домены — на отдельной странице; категория по области |
Nepike (обсуждение | вклад) |
||
| Строка 109: | Строка 109: | ||
== Предыдущие версии == | == Предыдущие версии == | ||
Первое поколение этого сайта — [https://github.com/Nepike/knt-portal-legacy knt-portal-legacy] | Первое поколение этого сайта — [https://github.com/Nepike/knt-portal-legacy knt-portal-legacy]. | ||
== Доступ == | == Доступ == | ||
Версия от 23:50, 27 сентября 2026
Студсайт — студенческий портал факультета КНТ МФТИ: knt-mipt.ru. Главный проект, который поддерживает IT-отдел. Исходный код открыт: github.com/Nepike/knt-portal.
Что есть на сайте
Почти весь сайт доступен только после входа. Без аккаунта открываются страница для абитуриентов (/about/, туда же ведёт главная), контакты (/contacts/), форма поддержки и страницы входа.
Для студентов:
- Материалы — учебные материалы, которые загружают студенты; проходят модерацию.
- Библиотека — каталог книг, тоже с модерацией.
- Преподаватели — карточки преподавателей и отзывы студентов.
- Лекторий — видеолекции (плейлисты проходят проверку, плеер HLS).
- Чаты — с участниками, реакциями и вложениями, обновляются в реальном времени.
- Стена — пиксельный холст в духе r/place, тоже в реальном времени.
- Экономика и косметика — внутренняя валюта и то, что на неё покупается: рамки аватара и шапки профиля.
- Закладки и комментарии к материалам и лекциям.
Как появляются аккаунты
Регистрация закрытая: аккаунты заводит администратор сайта на странице /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.
Посмотреть сайт глазами пользователя
Кнопки «войти как» на сайте намеренно нет. Если нужно увидеть то же, что видит конкретный студент, на сервере есть команда, которая выдаёт готовую сессию:
cd /srv/knt
docker compose exec web python manage.py session_for student@phystech.edu
Ключ сессии кладётся в куку браузера — делайте это в приватном окне. Всё, что вы сделаете в этот момент (комментарии, сообщения), будет подписано именем этого пользователя.
Локальный запуск
Для разработки достаточно 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.
Доступ
Как получить доступ к репозиторию и серверу — см. Доступы.