Repository navigation
Doc Local Development
Как собрать и запустить проект на своей машине. Значения секретов здесь не приводятся: только имена переменных и плейсхолдеры.
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.
| Компонент | Хост → контейнер |
|---|---|
| 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 и т.п.).
Пример: из 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.
См. также: Где и как работает · Стек и версии
Система
API
Сервисы
Как реализовано
Справочное
- Видение продукта
- Дорожная карта
- Этап 1: что осталось
- Этап 2: расширение
- Этап 3: масштабирование
- Концепция сайта и интерфейса
- Шаблон ТЗ