#5212 "Plain labels: no raw ids, scopes, metric keys or unexplained jargon", batch 3: - Disk page: each tile says what it holds. "Writable layers" becomes "Container files" and Build cache says it is safe to clear. Shared is "Shared with other images" with a tooltip, and "dangling" is gone. Untagged images show by id instead of "<none>", a capped list says "The 50 largest of N images", and each host shows "as of" its report. - Traefik: an expired certificate reads "expired 12 days ago", not "-12 days" (cert_left). The Traffic empty state knows whether the access log is on: off points to Settings → Plugins → Traefik; on says to check the mounted log path. - Moments use |ago with an exact UTC tooltip: UniFi last seen, alarms, events, speed test and DPI; AI token last used. - Settings: the Auth tab is "Authentication" like its breadcrumb, plugin fields read "Metrics URL" not metrics_url (field_label), a source's pull interval is "every 1h", and the last report time drops the ISO "T". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
55 lines
2.0 KiB
HTML
55 lines
2.0 KiB
HTML
{# plugins/traefik/templates/traefik/widget.html #}
|
|
{% if expiring_certs %}
|
|
<div style="margin-bottom:0.6rem;">
|
|
{% for cert in expiring_certs %}
|
|
<div style="display:flex;justify-content:space-between;font-size:0.8rem;padding:0.15rem 0;
|
|
{% if cert.days_remaining < 7 %}color:var(--red);{% else %}color:var(--yellow);{% endif %}">
|
|
<span>⚠ {{ cert.cn }}</span>
|
|
<span>{{ cert_left(cert.days_remaining) }}</span>
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if router_data %}
|
|
{% for r in router_data %}
|
|
<div class="ping-row">
|
|
<div class="ping-meta">
|
|
<span class="ping-name" style="font-size:0.8rem;word-break:break-all;">{{ r.name }}</span>
|
|
</div>
|
|
<div style="flex:1;display:flex;gap:1.5rem;font-size:0.82rem;font-variant-numeric:tabular-nums;">
|
|
<span title="Requests/s">
|
|
<span style="color:var(--text-muted);">req/s</span>
|
|
<span style="margin-left:0.3rem;">{{ "%.2f"|format(r.latest.request_rate) }}</span>
|
|
</span>
|
|
<span title="Bandwidth">
|
|
<span style="color:var(--text-muted);">bw</span>
|
|
<span style="margin-left:0.3rem;">
|
|
{% set bps = r.latest.response_bytes_rate %}
|
|
{{ bps|rate }}
|
|
</span>
|
|
</span>
|
|
<span title="p95 latency">
|
|
<span style="color:var(--text-muted);">p95</span>
|
|
<span style="margin-left:0.3rem;
|
|
{% if r.latest.latency_p95_ms > 500 %}color:var(--red){% elif r.latest.latency_p95_ms > 200 %}color:var(--yellow){% else %}color:var(--green){% endif %};">
|
|
{{ "%.0f"|format(r.latest.latency_p95_ms) }}ms
|
|
</span>
|
|
</span>
|
|
{% if r.latest.error_rate_5xx_pct > 0 %}
|
|
<span title="5xx error rate">
|
|
<span style="color:var(--red);">{{ "%.1f"|format(r.latest.error_rate_5xx_pct) }}% 5xx</span>
|
|
</span>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endfor %}
|
|
{% if total_routers > 5 %}
|
|
<div style="color:var(--text-dim);font-size:0.75rem;padding:0.25rem 0;">
|
|
+{{ total_routers - 5 }} more — <a href="/plugins/traefik/">view all →</a>
|
|
</div>
|
|
{% endif %}
|
|
{% else %}
|
|
<p class="empty" style="padding:0.5rem 0;font-size:0.85rem;">No Traefik data yet.</p>
|
|
{% endif %}
|