panicmath · live · до старта 2 дня

Олимпиада
в эфире

DNS прицепился. app.panicmath.academy + api.panicmath.academy отвечают 200, HTTPS от Let's Encrypt, миграции накатаны, Umami пишет. На сегодня (15 мая) добавлено: словацкий и польский, AI-наставник отвечает на языке ученика, регистрация по email с 6-значным кодом.

Что добавили сегодня (15 мая, вечер)

Три параллельных большие фичи поверх вчерашней раскатки.

🌍

5 языков

UI олимпиады переведён на русский, английский, узбекский, словацкий и польский. Канонические имена из локальных изданий Перси Джексона (Daidalos / Dedal, Ariadné / Ariadna). Переключатель в шапке, выбор хранится в браузере. Нарратив, инвентарь, таймер, правила — всё на 5 языков.

🤖

AI на языке ученика

Приёмщик задач (Зал Дедала / Ариадны) и ассистент учителя отвечают на том языке, что выбран в шапке — даже если условие задачи написано по-русски. Прокидываем Accept-Language от фронта через очередь до воркера; педагогические промпты переведены, в системный промпт добавлена директива «отвечай на X».

✉️

Регистрация по email

На app.panicmath.academy теперь модалка «Войти / Регистрация», 2 шага: форма (имя, email, логин, пароль) → 6-значный код в инбоксе → автоматический вход в Лабиринт. Письмо в тёмной panicmath-стилистике, локализовано под язык пользователя, контекст «олимпиада 17 мая 10:00 UTC», CTA-кнопка обратно в Лабиринт.

Что было раньше (вчера, 14 мая)

Базовая раскатка олимпиады на прод. Каждая фича — отдельный кусок.

🎨

Новый дизайн panicmath

Тёмная palette (#0e0d0a + золото #f5c344), нарратив «Перси Джексон в Лабиринте» от Дмитрия Фадина, 24 артефакта (Прощение + Время), брендовый таймер. Отдельный визуальный язык — не путается с основной платформой.

⚙️

Отдельный бэк-сервис

Параллельный API под олимпу. Делит с основным NLogN только базу (с накатанной обратимой дельтой). Свой Redis, свои очереди, свой деплой. Если что-то взорвётся — прод-курсы продолжат работать.

🎥

Прокторинг с камерой

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

📊

Аналитика + журнал

Каждое значимое событие (зашёл в зал, решил задачу, нашёл ключ, закончил) пишется в append-only журнал. Сверху Umami на pulse.marshub.uz — на 15 мая 18:00 UTC: 9 visitors / 12 sessions / 73s avg. Поверх потом можно крутить любые отчёты.

Архитектура

Коралл — новые ресурсы, зелёная полоска — общее с продом, без полоски — прод как был.

Новое (наше)

Olymp-Api
NestJS · ветка olymp
●●●
Olymp-Frontend
Vite + React
●●●
Olymp-Redis
BullMQ + cache
●●●

Общее

Study-PG18
+ 7 таблиц olymp
обратимо
MinIO
storage.nlogn.info
видео клипы
JWT users
общий secret
тот же логин

Не трогали

Study-Api
study-api.nlogn.info
Study-Frontend
study.nlogn.info
Study-Redis
отдельный

Stack

Что под капотом.

backend
NestJS 10 · Sequelize · BullMQ
frontend
Vite · React 18 · TS strict
db
Postgres 18
cache/queue
Redis 7
storage
MinIO (S3)
proxy
Traefik v3.6 · LE
ai tutor
OpenRouter · GPT-5.2
proctoring
MediaPipe · MediaRecorder VP8

Цифры

Baseline прод-БД на момент деплоя + параметры самой олимпы.

5 372
Users
306
Courses
30 319
Problems
272 450
Solutions
1.9 GB
DB size
8
olymp tasks
6
с AI-чатом
3+3+1
math · puzzle · final
3+3
условие финала
~4ч
общее время

До старта

Зелёное — готово. Жёлтое — на завтра / 17 мая.

Бэкап прод-БД (929 MB)
done
Миграции накатаны (olympiad + final-chain + addPromptLocale)
done
3 ресурса Coolify (api/front/redis) — все живые
done
nlogn-2026 + 8 задач + 5 тест-юзеров (olymp_test_1..5)
done
HTTPS Let's Encrypt автоматом через Traefik
done
DNS panicmath.academy прицеплен
15 мая
5 локалей (ru/en/uz/sk/pl) на UI и в AI-наставнике
15 мая
Регистрация по email с 6-значным кодом
15 мая
Umami-аналитика подключена
15 мая
Native-ревью переводов sk/pl/uz (педагогические промпты)
16 мая
Команда смотрит UI + содержание задач
15–16
Перед 17 мая — UPDATE Olympiads SET startsAt='...'
16 мая
Запасной транзакц. email-провайдер (Brevo/Resend) — для масштаба
17 мая
После события — закрыть is_public на Postgres (BUG-014)
18 мая

Найденные баги

Документированы в docs/bugs.md.

closed
BUG-012 · race на Participations
OlympiadParticipations без UNIQUE — дубликаты в race, service и worker писали в разные строки → 0 баллов. Фикс — композитные UNIQUE индексы.
open · workaround
BUG-013 · MinIO video
Дефолтный allowedFileTypes в minio.config.ts не включает video/webm. Сейчас пофикшено env-override'ом в Olymp-Api — но в коде стоит починить через PR в main.
open · post-deploy
BUG-014 · публичная БД
Study-PG18-Production висит с is_public=true на порту 5446. Закрыть после события одной curl-командой через Coolify API.

Документация

Всё в ветке olymp. Следующий дев разберётся без меня.