Files
RuvdsTest/docs/SETUP.md
danamir 942dfc9c1a Initial commit: standalone quiz-testing system
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.
2026-08-06 12:36:16 +03:00

6.3 KiB
Raw Blame History

Развёртывание проекта для разработки (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. Демо-доступы (создаются сидом при первом запуске сервера):

Роль Email Пароль
Преподаватель teacher@example.com teacher123
Студент student@example.com student123
Администратор admin@example.com admin123

Альтернатива: всё через Docker Compose

Вместо шагов 34 можно поднять весь стек (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).