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

119 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Развёртывание проекта для разработки (Windows 11)
Два варианта: **нативная разработка** (быстрый цикл правки-проверки, рекомендуется для повседневной
работы) и **Docker Compose** (весь стек одной командой, полезно для быстрой проверки/демо). Для
обоих нужен Postgres — с этой сессии сервер больше не хранит данные в памяти.
## Предварительные требования
| Инструмент | Версия | Зачем |
|---|---|---|
| [Git](https://git-scm.com/) | любая современная | клонировать репозиторий |
| [.NET SDK](https://dotnet.microsoft.com/download) | 9.0 или новее | сборка Domain/Server/Client (Fable компилирует F# в JS поверх .NET SDK) |
| [Node.js](https://nodejs.org/) | 20 LTS или новее | Vite (сборка/дев-сервер клиента) |
| [Docker Desktop](https://www.docker.com/products/docker-desktop/) | любая современная | Postgres (в обоих вариантах) и опционально весь стек |
Проверить, что всё установлено:
```powershell
git --version
dotnet --version
node --version
docker --version
```
## 1. Клонировать репозиторий
```powershell
git clone <URL репозитория>
cd RuVdsTests
```
## 2. Поставить зависимости
```powershell
# 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`, менять ничего не нужно, если использовать эти же значения.
Самый быстрый способ — разовый контейнер:
```powershell
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. Запустить сервер и клиент
Два процесса, в двух отдельных терминалах:
```powershell
# Терминал 1 — сервер (ASP.NET/Giraffe, порт 5144)
dotnet run --project src/Server/Server.fsproj
```
```powershell
# Терминал 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.
```powershell
cp .env.example .env
# при желании отредактировать .env (JWT_SECRET/POSTGRES_PASSWORD)
docker compose up --build
```
Клиент — **http://localhost:8081**, сервер — **http://localhost:5144** (тот же порт, что и при
нативном запуске: клиент обращается к серверу по захардкоженному `http://localhost:5144`, поэтому
адрес совпадает независимо от способа запуска).
```powershell
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`).