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.
119 lines
6.3 KiB
Markdown
119 lines
6.3 KiB
Markdown
# Развёртывание проекта для разработки (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`).
|