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.
This commit is contained in:
118
docs/SETUP.md
Normal file
118
docs/SETUP.md
Normal file
@@ -0,0 +1,118 @@
|
||||
# Развёртывание проекта для разработки (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
|
||||
|
||||
Вместо шагов 3–4 можно поднять весь стек (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`).
|
||||
Reference in New Issue
Block a user