Skip to content

Doc Local Development

PlutoGr edited this page Oct 17, 2026 · 3 revisions

Локальный запуск

Как собрать и запустить проект на своей машине. Значения секретов здесь не приводятся: только имена переменных и плейсхолдеры.

Простой пример

cd docker
cp .env.example .env      # заполнить значения, см. ниже
docker compose up         # бэкенд, PostgreSQL, Redis, MinIO

Через минуту curl http://localhost:5001/api/v1/catalog/tours возвращает JSON со списком туров. В compose сервисы работают в окружении Development, поэтому демо-данные создаются сами. С флагом --profile full поднимается и фронтенд на http://localhost:3000.

Сборка и тесты

Нужен .NET 10 SDK. Если на машине несколько SDK, сначала подключается нужный:

source scripts/use-dotnet10.sh
./build.sh                 # сборка всего решения и все тесты

У каждого сервиса есть свой build.sh в папке сервиса. Фронтенд собирается отдельно:

cd src/Frontend/travel-agency-frontend
npm ci
npm run dev               # dev-сервер Vite на http://localhost:5173
npx vitest run            # тесты

Фронтенд не входит в TravelAgency.sln.

Порты в docker-compose

Компонент Хост → контейнер
Gateway 5001 → 8080
Identity 5010 → 8080
Catalog 5020 → 8080
Booking 5030 → 8080
Chat 5040 → 8080
Media 5050 → 8080
Frontend (профиль full) 3000 → 80
PostgreSQL 5433 → 5432
Redis 6379 → 6379
MinIO 9000 (API), 9001 (консоль)

gRPC-порт 8081 наружу не пробрасывается: сервисы вызывают друг друга внутри сети compose (http://catalog-service:8081 и т.п.).

Запуск без Docker

Пример: из compose поднимается только инфраструктура, сервисы запускаются через dotnet run.

cd docker && docker compose up postgres redis minio
dotnet run --project src/Services/Catalog/TravelAgency.Catalog.API --launch-profile http
dotnet run --project src/Gateway/TravelAgency.Gateway --launch-profile http
curl http://localhost:5001/api/v1/catalog/tours

Порты launch-профилей совпадают с портами compose и с адресами в appsettings.Development.json Gateway. У сервисов с gRPC-сервером свой gRPC-порт (HTTP-порт + 1), адреса gRPC-клиентов указывают на localhost:

Сервис HTTP gRPC Куда ходит по gRPC
Gateway 5001
Identity 5010 5011
Catalog 5020 5021 Media 5051
Booking 5030 5031 Catalog 5021, Identity 5011
Chat 5040 Booking 5031
Media 5050 5051

Эти настройки заданы только в Properties/launchSettings.json (переменные ServiceListen__GrpcPort и GrpcClients__*), поэтому контейнеры их не видят. Одновременно с полным compose так запускать нельзя: заняты те же порты. Dev-сервер фронтенда проксирует /api на http://localhost:5001. PostgreSQL из compose доступен на localhost:5433, это значение порта в строках подключения.

Переменные окружения

Файл docker/.env (шаблон docker/.env.example):

Переменная Что это Пример значения
POSTGRES_USER, POSTGRES_PASSWORD учётная запись PostgreSQL CHANGE_ME
MINIO_ROOT_USER, MINIO_ROOT_PASSWORD учётная запись MinIO CHANGE_ME
JWT_SIGNING_KEY ключ подписи JWT, не короче 32 символов сгенерировать: openssl rand -hex 32
GRPC_INTERNAL_SERVICE_TOKEN общий токен для вызовов gRPC между сервисами сгенерировать: openssl rand -base64 32
SEEDING_TEST_USER_PASSWORD пароль демо-аккаунтов (необязательно) CHANGE_ME
VITE_API_URL базовый адрес API для сборки фронтенда; пусто значит /api/v1 пусто

Для запуска без Docker те же значения задаются в формате ASP.NET Core: ConnectionStrings__IdentityDb, ConnectionStrings__CatalogDb, ConnectionStrings__BookingDb, ConnectionStrings__ChatDb, ConnectionStrings__MediaDb, ConnectionStrings__Redis, JwtSettings__SigningKey, GrpcSettings__InternalServiceToken, Storage__AccessKey, Storage__SecretKey. Пароль в строке подключения пишется как Password=<POSTGRES_PASSWORD>. Локально удобно хранить значения в dotnet user-secrets.

Миграции

  • При ASPNETCORE_RUN_MIGRATIONS=true (в compose включено) каждый сервис применяет свои миграции при старте.
  • Для dotnet ef нужна переменная ConnectionStrings__<Имя>Db, иначе design-time фабрика остановится с подсказкой.

Демо-данные

  • Флаг ASPNETCORE_SEED_DATA=true (или окружение Development) включает сидеры Identity, Catalog и Media.
  • Identity создаёт демо-аккаунты клиента, двух менеджеров и администратора (см. README репозитория). Пароль задаётся Seeding__TestUserPassword; при пустом значении новые аккаунты не создаются, сервис всё равно стартует.
  • Catalog создаёт 5 опубликованных демо-туров, владелец которых демо-аккаунт менеджера, и один черновик у второго менеджера. Media кладёт демо-фото с фиксированными id.
  • Только демо-каталог без аккаунтов: Seeding__DemoCatalog=true.
  • Сидеры идемпотентны: существующие аккаунты и туры сохраняют свои id.

См. также: Где и как работает · Стек и версии

Clone this wiki locally