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