Full-stack F# (Domain/Server/Client via Fable+Elmish+Feliz), PostgreSQL persistence via Dapper, Docker Compose deployment. Student quiz-taking flow with time-limit enforcement and focus-loss tracking, Teacher question bank and quiz builder with results analytics, Admin user management.
6.3 KiB
Развёртывание проекта для разработки (Windows 11)
Два варианта: нативная разработка (быстрый цикл правки-проверки, рекомендуется для повседневной работы) и Docker Compose (весь стек одной командой, полезно для быстрой проверки/демо). Для обоих нужен Postgres — с этой сессии сервер больше не хранит данные в памяти.
Предварительные требования
| Инструмент | Версия | Зачем |
|---|---|---|
| Git | любая современная | клонировать репозиторий |
| .NET SDK | 9.0 или новее | сборка Domain/Server/Client (Fable компилирует F# в JS поверх .NET SDK) |
| Node.js | 20 LTS или новее | Vite (сборка/дев-сервер клиента) |
| Docker Desktop | любая современная | Postgres (в обоих вариантах) и опционально весь стек |
Проверить, что всё установлено:
git --version
dotnet --version
node --version
docker --version
1. Клонировать репозиторий
git clone <URL репозитория>
cd RuVdsTests
2. Поставить зависимости
# Fable (F# → JS компилятор) — версия закреплена в .config/dotnet-tools.json
dotnet tool restore
# npm-пакеты клиента (react, vite и т.д.)
npm install
3. Поднять Postgres
Серверу нужна база quizsystem с пользователем quizsystem/паролем devpassword на порту 5432
localhost — это то, что уже прописано по умолчанию в
src/Server/appsettings.Development.json, менять ничего не нужно, если использовать эти же значения.
Самый быстрый способ — разовый контейнер:
docker run -d --name quizsystem-postgres -p 5432:5432 `
-e POSTGRES_DB=quizsystem -e POSTGRES_USER=quizsystem -e POSTGRES_PASSWORD=devpassword `
postgres:16-alpine
Схема и демо-данные создаются автоматически при первом запуске сервера (миграции — через DbUp,
сид — через Seed.fs, оба идемпотентны, безопасно перезапускать).
Если 5432 на хосте уже занят другим Postgres — либо остановите его, либо смените порт в команде выше
и в ConnectionStrings:Postgres в appsettings.Development.json соответственно.
4. Запустить сервер и клиент
Два процесса, в двух отдельных терминалах:
# Терминал 1 — сервер (ASP.NET/Giraffe, порт 5144)
dotnet run --project src/Server/Server.fsproj
# Терминал 2 — клиент (Fable watch + Vite dev-сервер, порт 5173)
npm run dev
Открыть http://localhost:5173. Демо-доступы (создаются сидом при первом запуске сервера):
| Роль | Пароль | |
|---|---|---|
| Преподаватель | teacher@example.com |
teacher123 |
| Студент | student@example.com |
student123 |
| Администратор | admin@example.com |
admin123 |
Альтернатива: всё через Docker Compose
Вместо шагов 3–4 можно поднять весь стек (Postgres + Server + Client) одной командой — не нужен ни локальный .NET SDK, ни Node, только Docker.
cp .env.example .env
# при желании отредактировать .env (JWT_SECRET/POSTGRES_PASSWORD)
docker compose up --build
Клиент — http://localhost:8081, сервер — http://localhost:5144 (тот же порт, что и при
нативном запуске: клиент обращается к серверу по захардкоженному http://localhost:5144, поэтому
адрес совпадает независимо от способа запуска).
docker compose down # остановить, данные в volume сохраняются
docker compose down -v # остановить и стереть все данные Postgres
Типичные проблемы
- "Domain.dll используется другим процессом" при пересборке. Где-то в фоне остался запущенный
dotnet run/dotnet watchот прошлой сессии — найти и завершить процесс (Get-Process dotnet | Stop-Process, либо точечно по PID из текста ошибки) и пересобрать заново. - Логин не проходит / CORS-ошибка в консоли браузера. Обычно значит, что сервер или клиент не
запущены, либо запущены не на портах 5144/5173 —
Client:Originвappsettings.Development.jsonжёстко указывает наhttp://localhost:5173. - Сервер падает при старте с ошибкой подключения к Postgres. Убедиться, что контейнер/сервис
Postgres реально поднят и слушает порт 5432 (
docker ps), и чтоConnectionStrings:Postgresвappsettings.Development.jsonсоответствует реальным логину/паролю/порту. docker compose buildпадает с сетевой ошибкой (не может достучаться до nuget.org/registry). Обычно временная проблема DNS/VPN на хосте — попробовать пересобрать ещё раз (docker compose build --no-cache).