F5 (dashboard): surface 'route unpublished' for unhealthy/restarting deployed apps

Traefik only publishes a route to a healthy container, so an unhealthy deployed app
returns 404 at its URL though the container runs — previously shown only as 'Nem
egészséges' with no hint the URL is dead. New routeUnpublished() funcmap helper +
a distinct indicator on the dashboard and stacks cards (gated on .Deployed). Tests:
routeUnpublished across all states, real templateFS parses with the funcmap, and the
card guard renders the indicator only for deployed+unhealthy.
This commit is contained in:
2026-06-14 09:56:30 +02:00
parent 68684892d8
commit 803ce50578
5 changed files with 111 additions and 0 deletions
@@ -149,6 +149,7 @@
<div class="stack-actions">
<span class="stack-state-label">{{stateLabel .State}}</span>
{{if .Orphaned}}<span class="badge badge-orphaned">Elavult</span>{{end}}
{{if and .Deployed (routeUnpublished .State)}}<span class="badge badge-route-unpublished" title="A proxy (Traefik) csak egészséges konténerhez publikál nyilvános útvonalat. Amíg az alkalmazás nem egészséges, az URL 404-et ad, pedig a konténer fut.">⚠ URL nem elérhető</span>{{end}}
{{if .Protected}}
<span class="badge badge-protected">Védett</span>
@@ -30,6 +30,9 @@
<a class="subdomain-link" href="https://{{$subdomain}}.{{$.Domain}}" target="_blank">
{{$subdomain}}.{{$.Domain}} ↗
</a>
{{if and .Deployed (routeUnpublished .State)}}
<span class="route-unpublished" title="A proxy (Traefik) csak egészséges konténerhez publikál nyilvános útvonalat. Amíg az alkalmazás nem egészséges, az URL nem érhető el (404), pedig a konténer fut.">⚠ URL nem elérhető útvonal nincs publikálva</span>
{{end}}
{{end}}
</div>
</div>
@@ -1249,6 +1249,20 @@ a.stat-card:hover {
color: var(--orange);
}
/* F5: an unhealthy/restarting deployed app has its public route withheld by Traefik (404 at the URL). */
.badge-route-unpublished {
background: var(--orange-bg);
color: var(--orange);
white-space: nowrap;
}
.route-unpublished {
display: inline-block;
margin-top: 2px;
font-size: 0.8em;
color: var(--orange);
white-space: nowrap;
}
/* Delete modal */
.modal-overlay {
position: fixed;