Административная панель Tactical Heroes на .NET 10 и Blazor Web App.
- Blazor Interactive Auto: первый вход работает через Interactive Server, WebAssembly загружается в фоне и используется на последующих входах;
- MudBlazor для интерфейса;
- YARP как same-origin BFF/API gateway для браузерного клиента;
- Kiota для строготипизированного клиента по OpenAPI.
src/
TacticalHeroes.Admin/ ASP.NET Core host и YARP-BFF
TacticalHeroes.Admin.Client/ Auto-интерактивный UI
App/ композиция, routing и layout
Pages/ страницы маршрутов
Features/ пользовательские сценарии редактирования
Entities/ модели и API-адаптеры Roles/Users
Shared/ общие API- и UI-примитивы
TacticalHeroes.Admin.Api/ Kiota-клиент, генерируемый при сборке в obj
openapi/ зафиксированный OpenAPI-контракт
Структура Client-проекта адаптирует Feature-Sliced Design к Blazor. Зависимости
на транспортные Kiota-модели остаются в Entities/*/Api, страницы работают с
UI-моделями.
dotnet restore .\TacticalHeroes.Admin.slnx
dotnet run --project .\src\TacticalHeroes.AdminПо умолчанию используется
https://dev.api.tactical-heroes.panixida.ru. Адрес задаётся параметром
TacticalHeroesApi:BaseUrl и может быть переопределён через environment variable:
$env:TacticalHeroesApi__BaseUrl = "https://api.example.com"
dotnet run --project .\src\TacticalHeroes.AdminDev API сейчас требует авторизацию и возвращает 401 Unauthorized для Roles и
Users. Авторизация сознательно не реализована на этом этапе; интерфейс показывает
понятное состояние ошибки.
OpenAPI-контракт хранится в openapi/tactical-heroes.json. При сборке проекта
TacticalHeroes.Admin.Api MSBuild автоматически восстанавливает локальный Kiota
tool, генерирует ветки Roles/Users в obj и подключает их к компиляции. Generated-
исходники не хранятся в Git. В servers используется относительный URL /,
поэтому сгенерированный клиент не привязан к окружению. Server render получает
адрес API из TacticalHeroesApi:BaseUrl, а WASM обращается к same-origin YARP BFF.
Чтобы обновить сам контракт:
Invoke-WebRequest `
-Uri "https://dev.api.tactical-heroes.panixida.ru/openapi/v1.json" `
-OutFile ".\openapi\tactical-heroes.json"
dotnet build .\TacticalHeroes.Admin.slnxdocker build `
--file .\src\TacticalHeroes.Admin\Dockerfile `
--tag tactical-heroes-admin:local `
.
docker run --rm `
--publish 8080:8080 `
--env "TacticalHeroesApi__BaseUrl=https://api.example.com" `
--name tactical-heroes-admin `
tactical-heroes-admin:localКонтейнер запускает единый ASP.NET Core host: он отдаёт SSR, обслуживает
Interactive Server, раздаёт WebAssembly и проксирует /api через YARP.
Для Kubernetes ingress должен поддерживать WebSocket upgrade. При нескольких
репликах на фазе Interactive Server нужна session affinity. В образе включена
обработка X-Forwarded-For и X-Forwarded-Proto для TLS termination на ingress.
GitHub Actions проверяет форматирование и Release-сборку. В pull request также
собирается Docker-образ без публикации. После push в development или main
образ публикуется с тегами <run_number> и
<development|production>-<run_number>.
Для reusable workflows должны быть настроены:
- variables:
PROJECT_FOLDER=.,REGISTRY_URL,REGISTRY_IMAGE_PREFIX,SERVICE_NAME; - secrets:
REGISTRY_USER,REGISTRY_TOKEN.
REGISTRY_TOKEN должен иметь право публикации образов в выбранный registry.