Backend-инфраструктура и API проекта Chemistry на .NET 8.
scripts\setup.bat :: зависимости backend + frontend
scripts\docker-up.bat :: полный стек Docker (dev)
scripts\deploy.bat :: demo/production-стенд (УП.03 этап 3)
scripts\check.bat :: линтеры и тестыРазвертывание demo-стенда: DEPLOYMENT.md, DEMO_GUIDE.md, scripts\deploy.bat.
Подробнее: INSTALL.md. Makefile: make setup, make docker-up, make check, make format.
src/Chemistry.Api— входная точка ASP.NET Core APIsrc/Chemistry.Application— application-слойsrc/Chemistry.Domain— доменная модельsrc/Chemistry.Infrastructure— доступ к данным и внешним сервисамtests/Chemistry.Api.Tests— базовые тесты APIdeploy/— Docker Compose, Nginx, мониторинг, backup и server bootstrap
Полная backend-документация: Documentation/Backend.md.
| Сценарий | Postgres | Команда |
|---|---|---|
| Полный локальный стек | контейнер postgres из compose |
docker compose up -d в deploy/ |
| Тот же стек + API смотрит в удалённую БД | хостинг / SSH-туннель | см. ниже «Удалённая PostgreSQL» |
| Только зависимости в Docker | локальный :5432 или своя строка |
postgres redis minio ... + dotnet run |
Фронтенд локально описан в chemistry-frontend/README.md (обычно npm run dev на порту 3000 → прокси на API 5000).
Один раз:
cd deploy
Copy-Item .env.example .envПроверь минимум: POSTGRES_*, REDIS_PASSWORD, JWT_SECRET (подробности в .env.example). Файл не коммитится.
cd deploy
docker compose up -dПосле старта (первый билд контейнера api на Windows может занять несколько минут):
| Сервис | URL |
|---|---|
| API | http://localhost:5000 |
| Swagger | http://localhost:5000/swagger |
| Health | http://localhost:5000/health |
| Фронт в контейнере | http://localhost:3000 |
| Grafana | http://localhost:3001 |
| MinIO Console | http://localhost:9001 |
Порты меняются в deploy/.env (API_PORT, FRONTEND_PORT и т.д.).
Курсы в каталоге: из таблицы Course с IsPublished = true. Автосида нет: на чистой локальной БД список будет пустым, пока не создашь курсы (админка / API) или не подключишь удалённую БД.
Нужно, чтобы контейнер api подключался к внешней БД, а фронт по-прежнему ходил на http://localhost:3000 с прокси на 5000.
-
В
deploy/.envзадайREMOTE_POSTGRES_CONNECTION_STRING(одна строка Npgsql, см. комментарии в.env.example).- Прямое подключение:
Host=…;Port=5432;Database=…;Username=…;Password=…при необходимости добавьSSL Mode=RequireиTrust Server Certificate=true(только для отладки). - Через SSH-туннель на хосте: подними
ssh -N -L 15432:127.0.0.1:5432 user@server, в строке укажиHost=host.docker.internal;Port=15432;…(для Linux хостаhost.docker.internalдобавляется вdocker-compose.remote-db.yml).
- Прямое подключение:
-
Запуск с оверрайдом (миграции к удалённой БД отключены):
cd deploy docker compose -f docker-compose.yml -f docker-compose.remote-db.yml up -d
Либо скрипт:
deploy/up-remote-db.ps1.
Контейнер postgres всё равно поднимается из-за depends_on у api, но строка подключения API переключена на REMOTE_*. Не храни прод-пароли в репозитории; ограничивай доступ к :5432 по IP/VPN.
Удобно для отладки API в IDE.
cd deploy
docker compose up -d postgres redis minio minio-init lokiИз корня репозитория backend:
$env:ASPNETCORE_ENVIRONMENT="Development"
$env:ConnectionStrings__Postgres="Host=localhost;Port=5432;Database=chemistry_db;Username=chemistry_user;Password=<из deploy/.env>"
$env:POSTGRES_CONNECTION_STRING=$env:ConnectionStrings__Postgres
$env:Redis__ConnectionString="localhost:6379,password=<REDIS_PASSWORD>,abortConnect=false"
$env:JWT_SECRET="<из deploy/.env>"
dotnet run --project src/Chemistry.Api/Chemistry.Api.csproj --urls http://localhost:5000Для Bash/macOS/Linux те же переменные через export.
Проверка: curl http://localhost:5000/health → в JSON есть "status":"Healthy".
cd deploy
docker compose downС удалением томов с данными: docker compose down -v.
connect ECONNREFUSED 127.0.0.1:5000на фронте — не запущен API (Docker илиdotnet run).Connection string is empty— не заданыConnectionStrings__Postgres/POSTGRES_CONNECTION_STRING/REMOTE_POSTGRES_CONNECTION_STRINGв нужном сценарии.- Postgres в Docker падает с
126//bin/sh^M— вdeploy/postgres/init/*.shдолжны быть переводы строк LF (не CRLF); в репозитории это фиксируется через.gitattributes. - Redis connection failed — контейнер
redisне запущен или неверныйREDIS_PASSWORD. - Порт занят — поменяй порты в
deploy/.envили останови конфликтующий процесс. - Внешние интеграции — для локалки оставь mock в
.env:Payments__Provider=Mock, email/shipping mock,Captcha__Enabled=falseпо необходимости.