Files
vibedns/web/templates/pages/settings_cache.html
T
2026-08-16 21:18:45 -05:00

169 lines
7.7 KiB
HTML

{{define "content"}}
{{$s := .Data.S}}{{$st := .Data.Stats}}
<h1 class="page-title mb-1">Settings</h1>
<p class="text-body-secondary mb-4">Server configuration, stored in the database.</p>
{{template "settingsnav" .}}
<form method="post" action="/settings/cache">
<input type="hidden" name="_csrf" value="{{.CSRF}}">
<div class="row g-3">
<div class="col-12 col-xl-8">
<div class="card">
<div class="card-header">Resolver cache</div>
<div class="card-body">
<div class="form-section">
<div class="form-check form-switch mb-2">
<input type="hidden" name="enabled" value="false">
<input class="form-check-input" type="checkbox" role="switch" id="cacheEnabled"
name="enabled" value="true" {{if $s.Cache.Enabled}}checked{{end}}>
<label class="form-check-label" for="cacheEnabled">Enable the resolver cache</label>
</div>
<div class="form-text">
Turning the cache off flushes it immediately and sends every recursive query
upstream.
</div>
</div>
<div class="form-section">
<div class="form-section-title">Size</div>
<div class="row g-3">
<div class="col-12 col-md-6">
<label class="form-label" for="maxEntries">Maximum entries</label>
<input type="number" class="form-control" id="maxEntries" name="max_entries"
value="{{$s.Cache.MaxEntries}}" min="100" max="10000000">
<div class="form-text">
Least recently used entries are evicted past this limit. Currently holding
{{num $st.Entries}} entries using roughly {{bytes $st.Bytes}}.
</div>
</div>
<div class="col-12 col-md-6">
<label class="form-label" for="cleanupSeconds">Cleanup interval</label>
<input type="number" class="form-control" id="cleanupSeconds" name="cleanup_seconds"
value="{{$s.Cache.CleanupSeconds}}" min="5" max="3600">
<div class="form-text">
Seconds between sweeps that drop fully expired entries.
</div>
</div>
</div>
</div>
<div class="form-section">
<div class="form-section-title">Time to live</div>
<div class="row g-3">
<div class="col-6 col-md-4">
<label class="form-label" for="minTTL">Minimum TTL</label>
<input type="number" class="form-control" id="minTTL" name="min_ttl"
value="{{$s.Cache.MinTTL}}" min="0" max="86400">
<div class="form-text">Raises very short TTLs</div>
</div>
<div class="col-6 col-md-4">
<label class="form-label" for="maxTTL">Maximum TTL</label>
<input type="number" class="form-control" id="maxTTL" name="max_ttl"
value="{{$s.Cache.MaxTTL}}" min="1" max="604800">
<div class="form-text">Caps very long TTLs</div>
</div>
<div class="col-12 col-md-4">
<label class="form-label" for="negativeTTL">Negative cache TTL</label>
<input type="number" class="form-control" id="negativeTTL" name="negative_ttl"
value="{{$s.Cache.NegativeTTL}}" min="0" max="86400">
<div class="form-text">
How long NXDOMAIN and empty answers are remembered, capped by the SOA
minimum in the response.
</div>
</div>
</div>
</div>
<div class="form-section">
<div class="form-section-title">Stale answers</div>
<div class="form-check form-switch mb-3">
<input type="hidden" name="serve_stale" value="false">
<input class="form-check-input" type="checkbox" role="switch" id="serveStale"
name="serve_stale" value="true" {{if $s.Cache.ServeStale}}checked{{end}}>
<label class="form-check-label" for="serveStale">
Serve expired answers while refreshing them
</label>
</div>
<div class="row g-3">
<div class="col-12 col-md-6">
<label class="form-label" for="staleTTL">Stale window</label>
<input type="number" class="form-control" id="staleTTL" name="stale_ttl"
value="{{$s.Cache.StaleTTL}}" min="0" max="604800">
<div class="form-text">
Seconds past expiry an answer may still be used. This keeps names
resolving when an upstream is briefly unreachable, rather than failing
the client outright.
</div>
</div>
</div>
</div>
<div class="form-section">
<div class="form-section-title">Prefetch</div>
<div class="form-check form-switch mb-3">
<input type="hidden" name="prefetch" value="false">
<input class="form-check-input" type="checkbox" role="switch" id="prefetch"
name="prefetch" value="true" {{if $s.Cache.Prefetch}}checked{{end}}>
<label class="form-check-label" for="prefetch">
Refresh popular entries before they expire
</label>
</div>
<div class="row g-3">
<div class="col-12 col-md-6">
<label class="form-label" for="prefetchPct">Refresh threshold</label>
<div class="input-group">
<input type="number" class="form-control" id="prefetchPct" name="prefetch_pct"
value="{{$s.Cache.PrefetchPercent}}" min="1" max="90">
<span class="input-group-text">%</span>
</div>
<div class="form-text">
An entry hit with less than this share of its TTL remaining is refreshed
in the background, so the client never waits on the upstream.
</div>
</div>
</div>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary">
<i class="bi bi-check-lg me-1"></i>Save cache settings
</button>
</div>
</div>
</div>
</div>
<div class="col-12 col-xl-4">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<span>Current cache</span>
<a href="/cache" class="btn btn-sm btn-outline-secondary">Browse</a>
</div>
<div class="card-body">
<dl class="row small mb-0">
<dt class="col-7 text-body-secondary">Entries</dt>
<dd class="col-5 text-end fw-semibold">{{num $st.Entries}}</dd>
<dt class="col-7 text-body-secondary">Hit rate</dt>
<dd class="col-5 text-end fw-semibold">{{pct $st.HitRate}}</dd>
<dt class="col-7 text-body-secondary">Hits</dt>
<dd class="col-5 text-end">{{num $st.Hits}}</dd>
<dt class="col-7 text-body-secondary">Misses</dt>
<dd class="col-5 text-end">{{num $st.Misses}}</dd>
<dt class="col-7 text-body-secondary">Served stale</dt>
<dd class="col-5 text-end">{{num $st.StaleHits}}</dd>
<dt class="col-7 text-body-secondary">Evictions</dt>
<dd class="col-5 text-end">{{num $st.Evictions}}</dd>
<dt class="col-7 text-body-secondary">Memory</dt>
<dd class="col-5 text-end">{{bytes $st.Bytes}}</dd>
</dl>
</div>
</div>
</div>
</div>
</form>
{{end}}