Files
jze9 0f13ef5256 fix: Cache-Control: no-cache на index.html в web-react и stats-react
location / отдавал index.html вообще без Cache-Control — браузер кэшировал
его эвристически (по Last-Modified), из-за чего после деплоя часть
пользователей продолжала видеть старую версию (например, без анонимного
входа), пока не делали hard refresh, а на следующей обычной загрузке
снова получали закэшированную старую версию. Симптом воспроизвёлся на
test.cloud-copp74.ru.

no-cache вынуждает браузер всегда идти на сервер за index.html (быстрый
304 по ETag, если файл не менялся) — хэшированные /assets/ ниже как
кэшировались на год, так и кэшируются, инвалидация им не нужна.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-16 14:50:22 +05:00
..

web-react — фронтенд на React (Vite + TypeScript)

Замена Flet-интерфейса (../web). Обычный SPA: грузится в браузер один раз и работает локально, обращаясь к API по HTTP. Нет WebSocket и серверного UI-стейта — это убирает зависания, которые были у Flet (он рендерил UI на сервере и держал WS на каждого юзера).

Flet-сервис web намеренно оставлен в docker-compose.yml как запасной. Этот новый фронтенд публикуется на порту 3000.

Архитектура

Браузер ──▶ [ nginx :80 (контейнер web-react) ]
                 ├── /         → статика React (SPA, fallback на index.html)
                 └── /api/*    → proxy_pass http://api:8000/  (включая SVG-диаграммы)

API-контейнер доступен только внутри Docker-сети, поэтому браузер ходит к нему через nginx-прокси на том же origin (/api/...). SVG-диаграмма тянется напрямую <img>/<a download>.

Разработка (локально)

# 1. Поднять API + БД (из корня репозитория)
docker compose up -d api postgres redis     # postgres/redis — из docker-compose_db.yml

# 2. Dev-сервер фронтенда
cd web-react
npm install
npm run dev            # http://localhost:5173, /api проксируется на http://localhost:8000

Адрес API для dev-прокси переопределяется переменной API_URL (см. vite.config.ts).

Сборка / прод

# из корня репозитория
docker compose up -d --build web-react       # http://localhost:3000

Либо вручную: npm run build → статика в dist/, раздаётся nginx (см. Dockerfile, nginx.conf).

Структура

Путь Назначение
src/api/client.ts все запросы к API (порт web/api_client.py)
src/auth/ AuthContext — токен в localStorage + /users/me
src/theme/ 5 тем + слайдер масштаба через CSS-переменные
src/components/ переиспользуемые компоненты (Button, TextField, SearchableDropdown, Layout, Modal, RadarBlock…)
src/pages/ экраны: Login, Register, Home, TestList, Poll, MyTests, Response, Profile
src/styles/global.css стили на CSS-переменных

Маршруты

/login, /register, / (домашняя), /tests, /poll/:pollId, /my-tests, /response/:responseId, /profile. Защищённые маршруты требуют токен (ProtectedRoute).