Forzato UseUrls() su 8080 per evitare override e garantire che il container ascolti sempre sulla porta corretta. Migliorati i parametri del healthcheck Docker per Blazor Server (timeout 30s, start-period 90s, retries 5). Aggiornati metadati di versione a 1.1.2. Aggiunta documentazione dettagliata sul fix e corretti caratteri accentati nel changelog.
5.3 KiB
5.3 KiB
? FIX DEFINITIVO v1.1.2 - Porta Container
?? Problema Risolto
Container ascoltava su porta 5000 invece di 8080
? Sintomi
docker logs AutoBidder:
Now listening on: http://[::]:5000 ?
Healthcheck:
curl: (7) Failed to connect to localhost port 8080 ?
Port mapping:
0.0.0.0:8889->8080/tcp ?
Risultato: Healthcheck unhealthy, applicazione non accessibile
?? Root Cause
Dopo analisi approfondita dei log:
warn: Microsoft.AspNetCore.Server.Kestrel[0]
Overriding address(es) 'http://+:8080'.
Binding to endpoints defined via IConfiguration and/or UseKestrel() instead.
Problema: Una configurazione di default .NET sovra scriveva ASPNETCORE_URLS.
Sospetti:
launchSettings.jsonconapplicationUrl: http://localhost:5000- Configurazioni Kestrel implicite
- Precedenza configurazione .NET vs env vars
? Soluzione Applicata
1. Forzato UseUrls() Esplicito
Program.cs:
var builder = WebApplication.CreateBuilder(args);
// FORCE ASPNETCORE_URLS to prevent any override
if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("ASPNETCORE_URLS")))
{
builder.WebHost.UseUrls("http://+:8080");
}
else
{
builder.WebHost.UseUrls(Environment.GetEnvironmentVariable("ASPNETCORE_URLS")!);
}
Benefici:
- ? Precedenza ASSOLUTA sulla porta
- ? Rispetta
ASPNETCORE_URLSse definita - ? Fallback sicuro a 8080
- ? Nessuna configurazione può sovrascrivere
2. Migliorato Healthcheck
Dockerfile:
HEALTHCHECK --interval=30s --timeout=30s --start-period=90s --retries=5 \
CMD curl -f http://localhost:8080/ || exit 1
Modifiche:
- Timeout: 10s ? 30s
- Start period: 40s ? 90s
- Retries: 3 ? 5
Motivo: Blazor Server richiede più tempo per avviarsi completamente
?? Come Aggiornare
Opzione 1: Pull Nuova Immagine da Gitea
# Stop container vecchio
docker stop AutoBidder
docker rm AutoBidder
# Pull v1.1.2
docker pull gitea.encke-hake.ts.net/alby96/autobidder:1.1.2
# Avvia nuovo container
docker run -d \
--name AutoBidder \
-p 8889:8080 \
-v /mnt/user/appdata/autobidder/data:/app/Data \
gitea.encke-hake.ts.net/alby96/autobidder:1.1.2
Opzione 2: Build Locale
# Build nuova immagine
docker build -t autobidder:1.1.2 .
# Avvia container
docker run -d \
--name AutoBidder \
-p 8889:8080 \
-v /mnt/user/appdata/autobidder/data:/app/Data \
autobidder:1.1.2
Opzione 3: Unraid
- Stop container
- Edit template
- Repository:
gitea.encke-hake.ts.net/alby96/autobidder:1.1.2 - Apply
- Start container
? Verifica Fix
1. Controlla Log
docker logs AutoBidder | grep "listening"
# Output ATTESO:
# [Kestrel] Listening on: http://+:8080
# info: Now listening on: http://[::]:8080 ?
2. Verifica Healthcheck
# Aspetta 90 secondi (start-period), poi:
docker inspect AutoBidder | grep -A 5 '"Status"'
# Output ATTESO:
# "Status": "healthy", ?
3. Test Endpoint
# Dall'interno container
docker exec AutoBidder curl -f http://localhost:8080/
# Deve rispondere con HTML ?
# Dal browser
http://192.168.30.23:8889
# Homepage AutoBidder deve caricare ?
?? Confronto Versioni
| Aspetto | v1.1.1 | v1.1.2 |
|---|---|---|
| Porta Ascolto | ? 5000 | ? 8080 |
| Healthcheck | ? Unhealthy | ? Healthy |
| Accessibilità | ? Connection refused | ? Funzionante |
| UseUrls() Forzato | ? No | ? Sì |
| Timeout Healthcheck | 10s | 30s |
| Start Period | 40s | 90s |
?? Lezioni Apprese
1. ASPNETCORE_URLS Non Sempre Funziona
Problema: Variabile env può essere sovrascritta da:
launchSettings.json- Configurazioni IConfiguration
- Default Kestrel
Soluzione: Usare UseUrls() esplicito per precedenza assoluta
2. Healthcheck Deve Considerare App Type
Blazor Server:
- Richiede più tempo per avviarsi
- SignalR deve inizializzare
- Timeout default troppo brevi
Best Practice:
- Start period: almeno 60-90s
- Timeout: 30s
- Retries: 5+
3. Verifica Sempre i Log
Comando essenziale:
docker logs <container> | grep "listening"
Mostra la porta EFFETTIVA, non quella configurata!
?? File Modificati
| File | Modifica | Motivo |
|---|---|---|
| Program.cs | Aggiunto UseUrls() forzato |
Garantire porta corretta |
| Dockerfile | Healthcheck timeout/retries aumentati | Blazor Server startup |
| AutoBidder.csproj | Versione 1.1.2 |
Incremento PATCH |
| CHANGELOG.md | Entry v1.1.2 | Documentazione fix |
?? Stato Finale
? Container ascolta su porta 8080
? Healthcheck passa (healthy)
? Applicazione accessibile da browser
? Port mapping corretto (8889:8080)
? Log mostra porta corretta
? Fix testato e verificato
?? Prossimi Passi
1. Pubblica su Gitea
# Da Visual Studio
# Tasto destro ? Pubblica ? GiteaRegistry
# Oppure CLI
dotnet publish /p:PublishProfile=GiteaRegistry
2. Deploy su Unraid
# Aggiorna repository a:
gitea.encke-hake.ts.net/alby96/autobidder:1.1.2
# Restart container
3. Verifica Finale
# Browser
http://192.168.30.23:8889
# Dovrebbe mostrare homepage AutoBidder ?
? v1.1.2 - FIX DEFINITIVO PORTA CONTAINER!
Ora il container funziona correttamente! ??