Merge branch 'bug/2-client-endpoint-proxy'
This commit is contained in:
@@ -0,0 +1,40 @@
|
|||||||
|
# Баг 2. AppHost падает на пине Vite 5173
|
||||||
|
|
||||||
|
## Симптом
|
||||||
|
|
||||||
|
`run-aspire.cmd` поднимает Tailscale Serve, затем AppHost сразу выходит с кодом `-532462766`. Aspire dashboard и Vite не стартуют. В логе:
|
||||||
|
|
||||||
|
```
|
||||||
|
The endpoint 'http' for resource 'client' requested a proxy (IsProxied is true).
|
||||||
|
Non-container resources cannot be proxied when both TargetPort and Port are specified
|
||||||
|
with the same value.
|
||||||
|
```
|
||||||
|
|
||||||
|
Ожидали клиент на `http://localhost:5173` (и тот же порт за Serve), как после пина для Tailscale.
|
||||||
|
|
||||||
|
## Причина
|
||||||
|
|
||||||
|
`AddViteApp` зовёт `WithHttpEndpoint(port: 5173, targetPort: 5173)`. У executable `IsProxied` по умолчанию `true`. DCP не может повесить прокси на тот же порт, на котором слушает Vite. Aspire 13.4 это ловит при старте. Headless-тесты клиент не поднимают, поэтому сюита хоста этого не видит.
|
||||||
|
|
||||||
|
## Путь
|
||||||
|
|
||||||
|
`isProxied: false` на том же пине: Vite сам слушает 5173, прокси Aspire нет, `tailscale serve --bg 5173` по-прежнему бьёт в клиент.
|
||||||
|
|
||||||
|
Не снимать пин — Serve тогда не знает порт. Не оставлять прокси и задавать только `port` — у Vite `strictPort: true` на 5173, конфликт с прокси.
|
||||||
|
|
||||||
|
## Задачи
|
||||||
|
|
||||||
|
- [x] Эндпоинт `http` у `client`: порт 5173, без прокси Aspire
|
||||||
|
- [x] Тест модели AppHost без `AppHostFixture` и без Node
|
||||||
|
|
||||||
|
## Тест, без которого не закрыт
|
||||||
|
|
||||||
|
`HSchool.AppHost.Tests`, без фикстуры хоста: ресурс `client` имеет HTTP-эндпоинт на 5173 с `IsProxied == false`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dotnet test tests/HSchool.AppHost.Tests --filter FullyQualifiedName~ClientEndpoint
|
||||||
|
```
|
||||||
|
|
||||||
|
## Стоп
|
||||||
|
|
||||||
|
Протокол, сейв, Vite `allowedHosts` / HMR, `run-aspire.cmd` не трогать.
|
||||||
@@ -10,3 +10,4 @@
|
|||||||
| Баг | Статус | Симптом |
|
| Баг | Статус | Симптом |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| [1. Окно входа](01-login-layout.md) | ✅ | Форма входа прижата к углу, поле пароля на всю ширину |
|
| [1. Окно входа](01-login-layout.md) | ✅ | Форма входа прижата к углу, поле пароля на всю ширину |
|
||||||
|
| [2. Запуск AppHost](02-client-endpoint-proxy.md) | ✅ | `run-aspire` падает: proxy + Port=TargetPort=5173 у client |
|
||||||
|
|||||||
@@ -221,7 +221,7 @@
|
|||||||
| Фаза | Статус | Зачем |
|
| Фаза | Статус | Зачем |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| [46. Политика речи и дом](46-speech-home.md) | ⬜ | Комбобоксы речи с завтра; утреннее семейное событие |
|
| [46. Политика речи и дом](46-speech-home.md) | ⬜ | Комбобоксы речи с завтра; утреннее семейное событие |
|
||||||
| [47. Пак romance](47-romance-pack.md) | ⬜ | Ориентация, симпатия, пара 18+, патч тем |
|
| [47. Пак romance](47-romance-pack.md) | 🔄 | Ориентация, симпатия, пара 18+, патч тем |
|
||||||
|
|
||||||
46 стоит на 37 и 42; 47 — на 42 и 23. `example` не трогать.
|
46 стоит на 37 и 42; 47 — на 42 и 23. `example` не трогать.
|
||||||
|
|
||||||
|
|||||||
@@ -23,9 +23,9 @@ if (headless)
|
|||||||
|
|
||||||
if (!headless)
|
if (!headless)
|
||||||
{
|
{
|
||||||
// Pin the Vite port so `tailscale serve --bg 5173` always targets the client.
|
// Pin Vite itself to 5173 (no Aspire proxy): Tailscale Serve targets that port.
|
||||||
var client = builder.AddViteApp("client", "../HSchool.Client")
|
var client = builder.AddViteApp("client", "../HSchool.Client")
|
||||||
.WithHttpEndpoint(port: 5173, targetPort: 5173)
|
.WithHttpEndpoint(port: 5173, targetPort: 5173, isProxied: false)
|
||||||
.WithReference(server)
|
.WithReference(server)
|
||||||
.WaitFor(server);
|
.WaitFor(server);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
using Aspire.Hosting.ApplicationModel;
|
||||||
|
|
||||||
|
namespace HSchool.AppHost.Tests;
|
||||||
|
|
||||||
|
public class ClientEndpointTests
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public async Task ViteHttpEndpoint_IsProxylessOnPinnedPort()
|
||||||
|
{
|
||||||
|
await using var appHost = await DistributedApplicationTestingBuilder
|
||||||
|
.CreateAsync<Projects.HSchool_AppHost>(TestContext.Current.CancellationToken);
|
||||||
|
|
||||||
|
var client = Assert.Single(appHost.Resources, resource => resource.Name == "client");
|
||||||
|
var http = Assert.Single(
|
||||||
|
client.Annotations.OfType<EndpointAnnotation>(),
|
||||||
|
endpoint => endpoint.UriScheme == "http");
|
||||||
|
|
||||||
|
Assert.False(http.IsProxied);
|
||||||
|
Assert.Equal(5173, http.Port);
|
||||||
|
Assert.Equal(5173, http.TargetPort);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user