169 lines
7.7 KiB
HTML
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}}
|