* feat: improve allInOne mode support for admin/volume ingress and fix master UI links - Add allInOne support to admin ingress template, matching the pattern used by filer and s3 ingress templates (or-based enablement with ternary service name selection) - Add allInOne support to volume ingress template, which previously required volume.enabled even when the volume server runs within the allInOne pod - Expose admin ports in allInOne deployment and service when allInOne.admin.enabled is set - Add allInOne.admin config section to values.yaml (enabled by default, ports inherit from admin.*) - Fix legacy master UI templates (master.html, masterNewRaft.html) to prefer PublicUrl over internal Url when linking to volume server UI. The new admin UI already handles this correctly. * fix: revert admin allInOne changes and fix PublicUrl in admin dashboard The admin binary (`weed admin`) is a separate process that cannot run inside `weed server` (allInOne mode). Revert the admin-related allInOne helm chart changes that caused 503 errors on admin ingress. Fix bug in cluster_topology.go where VolumeServer.PublicURL was set to node.Id (internal pod address) instead of the actual public URL. Add public_url field to DataNodeInfo proto message so the topology gRPC response carries the public URL set via -volume.publicUrl flag. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: use HTTP /dir/status to populate PublicUrl in admin dashboard The gRPC DataNodeInfo proto does not include PublicUrl, so the admin dashboard showed internal pod IPs instead of the configured public URL. Fetch PublicUrl from the master's /dir/status HTTP endpoint and apply it in both GetClusterTopology and GetClusterVolumeServers code paths. Also reverts the unnecessary proto field additions from the previous commit and cleans up a stray blank line in all-in-one-service.yml. * fix: apply PublicUrl link fix to masterNewRaft.html Match the same conditional logic already applied to master.html — prefer PublicUrl when set and different from Url. * fix: add HTTP timeout and status check to fetchPublicUrlMap Use a 5s-timeout client instead of http.DefaultClient to prevent blocking indefinitely when the master is unresponsive. Also check the HTTP status code before attempting to parse the response body. * fix: fall back to node address when PublicUrl is empty Prevents blank links in the admin dashboard when PublicUrl is not configured, such as in standalone or mixed-version clusters. * fix: log io.ReadAll error in fetchPublicUrlMap --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Chris Lu <chris.lu@gmail.com>
126 lines
4.7 KiB
HTML
126 lines
4.7 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
|
|
<head>
|
|
<title>SeaweedFS {{ .Version }}</title>
|
|
<link rel="stylesheet" href="/seaweedfsstatic/bootstrap/3.3.1/css/bootstrap.min.css">
|
|
</head>
|
|
|
|
<body>
|
|
<div class="container">
|
|
<div class="page-header">
|
|
<h1>
|
|
<a href="https://github.com/seaweedfs/seaweedfs"><img src="/seaweedfsstatic/seaweed50x50.png"></img></a>
|
|
SeaweedFS <small>{{ .Version }}</small>
|
|
</h1>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-sm-6">
|
|
<h2>Cluster status</h2>
|
|
<table class="table table-condensed table-striped">
|
|
<tbody>
|
|
<tr>
|
|
<th>Volume Size Limit</th>
|
|
<td>{{ .VolumeSizeLimitMB }}MB</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Free</th>
|
|
<td>{{ .Topology.Free }}</td>
|
|
</tr>
|
|
<tr>
|
|
<th>Max</th>
|
|
<td>{{ .Topology.Max }}</td>
|
|
</tr>
|
|
{{ with .RaftServer }}
|
|
<tr>
|
|
<th>Leader</th>
|
|
<td><a href="{{ url .Leader }}">{{ .Leader }}</a></td>
|
|
</tr>
|
|
<tr>
|
|
<th>Other Masters</th>
|
|
<td class="col-sm-5">
|
|
<ul class="list-unstyled">
|
|
{{ range $k, $p := .GetConfiguration.Configuration.Servers }}
|
|
<li><a href="{{ url $p.ID }}/ui/index.html">{{ $p.ID }}</a></li>
|
|
{{ end }}
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
{{ end }}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<div class="col-sm-6">
|
|
<h2>System Stats</h2>
|
|
<table class="table table-condensed table-striped">
|
|
<tr>
|
|
<th>Concurrent Connections</th>
|
|
<td>{{ .Counters.Connections.WeekCounter.Sum }}</td>
|
|
</tr>
|
|
{{ range $key, $val := .Stats }}
|
|
<tr>
|
|
<th>{{ $key }}</th>
|
|
<td>{{ $val }}</td>
|
|
</tr>
|
|
{{ end }}
|
|
</table>
|
|
<h2>Raft Stats</h2>
|
|
<table class="table table-condensed table-striped">
|
|
<tr>
|
|
<th>applied_index</th>
|
|
<td>{{ .RaftServer.Stats.applied_index }}</td>
|
|
</tr>
|
|
<tr>
|
|
<th>last_log_term</th>
|
|
<td>{{ .RaftServer.Stats.last_log_term }}</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<h2>Topology</h2>
|
|
<table class="table table-striped">
|
|
<thead>
|
|
<tr>
|
|
<th>Data Center</th>
|
|
<th>Rack</th>
|
|
<th>RemoteAddr</th>
|
|
<th>#Volumes</th>
|
|
<th>Volume Ids</th>
|
|
<th>#ErasureCodingShards</th>
|
|
<th>Max</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{ range $dc_index, $dc := .Topology.DataCenters }}
|
|
{{ range $rack_index, $rack := $dc.Racks }}
|
|
{{ range $dn_index, $dn := $rack.DataNodes }}
|
|
<tr>
|
|
<td><code>{{ $dc.Id }}</code></td>
|
|
<td>{{ $rack.Id }}</td>
|
|
<td>
|
|
{{ if and (ne $dn.PublicUrl "") (ne $dn.PublicUrl $dn.Url) }}
|
|
<a href="{{ url $dn.PublicUrl }}/ui/index.html">{{ $dn.PublicUrl }}</a>
|
|
{{ else }}
|
|
<a href="{{ url $dn.Url }}/ui/index.html">{{ $dn.Url }}</a>
|
|
{{ end }}
|
|
</td>
|
|
<td>{{ $dn.Volumes }}</td>
|
|
<td>{{ $dn.VolumeIds}}</td>
|
|
<td>{{ $dn.EcShards }}</td>
|
|
<td>{{ $dn.Max }}</td>
|
|
</tr>
|
|
{{ end }}
|
|
{{ end }}
|
|
{{ end }}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
</div>
|
|
</body>
|
|
|
|
</html> |