This commit is contained in:
Mateusz Gruszczyński committed 2026-10-10 20:56:36 +02:00
1 parent f213d853e2
commit 76b8bb7ee2
78 files changed
+7750 -5204

No files matched your search

+76 -9
View File
@@ -28,6 +28,21 @@
</head>
<body>
<!-- Visible even when the dashboard JavaScript fails to initialize. -->
<div class="app-startup" id="app-startup" role="status" aria-live="polite">
<div class="app-startup-card">
<div class="app-startup-brand" aria-hidden="true">r<span>/</span>p</div>
<div class="app-startup-spinner" aria-hidden="true"></div>
<h2 id="app-startup-title" data-i18n="startupLoading">Loading RustProxy…</h2>
<p class="app-startup-message" data-i18n="startupPreparing">Connecting to the administration panel.</p>
<div class="app-startup-recovery">
<p data-i18n="startupSlow">The panel is taking longer than expected. Check your connection and try again.</p>
<p id="app-startup-detail" class="app-startup-detail" hidden></p>
<a class="outline" href="" data-i18n="startupRetry">Reload panel</a>
</div>
<noscript>JavaScript is required to use the administration panel.</noscript>
</div>
</div>
<div class="shell">
<aside class="sidebar">
<a class="brand" href="/" aria-label="RustProxy"><span
@@ -111,10 +126,13 @@
</section>
<div hidden="" id="workspace">
<section class="page-intro">
<div>
<div class="page-intro-copy">
<div class="eyebrow"><i class="signal" id="signal"></i><span id="connection-label">CONNECTED TO
LOCAL CORE</span></div>
<h1 id="page-title">Traffic, in focus.</h1>
<div class="page-intro-title-row">
<h1 id="page-title">Traffic, in focus.</h1>
<button class="quiet overview-refresh" data-i18n="refreshNow" id="overview-refresh" type="button" hidden>Refresh now</button>
</div>
<p class="lead" id="page-description"></p>
</div>
</section>
@@ -1221,7 +1239,7 @@
role="status"></span>
<label class="check cache-live-toggle"><input checked="" id="traffic-live"
type="checkbox" />
<span data-i18n="cacheLive">Live (3 s)</span></label>
<span data-i18n="refreshViewLive">Auto in this view</span></label>
</div>
</div>
<nav aria-label="Traffic analytics" class="settings-tabs sub-tabs traffic-tabs" id="traffic-tabs"
@@ -1375,8 +1393,7 @@
type="button">Active BANs</button>
<div class="cache-toolbar-status"><span class="fine" id="cache-panel-state"
role="status"></span><label class="check cache-live-toggle"><input checked=""
id="cache-live" type="checkbox" /><span data-i18n="cacheLive">Live (3
s)</span></label></div>
id="cache-live" type="checkbox" /><span data-i18n="refreshViewLive">Auto in this view</span></label></div>
<p class="operation-message cache-toolbar-message" id="cache-toolbar-operation-status"
role="status" aria-live="polite"></p>
</div>
@@ -1530,8 +1547,7 @@
id="transform-panel-settings" type="button">Settings</button>
<div class="cache-toolbar-status"><span class="fine" id="transform-panel-state"
role="status"></span><label class="check cache-live-toggle"><input checked=""
id="transform-live" type="checkbox" /><span data-i18n="cacheLive">Live (3
s)</span></label></div>
id="transform-live" type="checkbox" /><span data-i18n="refreshViewLive">Auto in this view</span></label></div>
</div>
<details class="card function-live-chart" id="transform-live-chart">
<summary class="function-live-chart-summary">
@@ -1912,6 +1928,33 @@
</div>
</div>
</section>
<section class="appearance-section" id="refresh-preferences">
<div class="appearance-section-heading"><div>
<div class="small-label" data-i18n="refreshSection">REFRESH</div>
<h3 data-i18n="refreshTitle">Data refresh</h3>
</div><button class="quiet appearance-section-reset" id="refresh-reset" type="button" data-i18n="resetSection">Reset section</button></div>
<p class="fine" data-i18n="refreshHelp">Per-account refresh intervals. Off pauses all automatic sources; manual refresh remains available.</p>
<div class="appearance-settings-grid">
<label class="check"><input type="checkbox" checked id="refresh-live-enabled" data-refresh-preference="live_enabled" />
<span data-i18n="refreshLiveEnabled">Automatic refresh enabled</span></label>
<label><span data-i18n="refreshOverview">Live overview / SSE interval</span>
<select id="refresh-overview-seconds" data-refresh-preference="overview_seconds">
<option value="1">1 s</option><option selected value="2">2 s</option><option value="5">5 s</option><option value="10">10 s</option>
</select></label>
<label><span data-i18n="refreshTraffic">Traffic interval</span>
<select id="refresh-traffic-seconds" data-refresh-preference="traffic_seconds">
<option value="0" data-i18n="refreshManual">Manual</option><option value="3">3 s</option><option selected value="5">5 s</option><option value="10">10 s</option><option value="30">30 s</option>
</select></label>
<label><span data-i18n="refreshCache">Cache interval</span>
<select id="refresh-cache-seconds" data-refresh-preference="cache_seconds">
<option value="0" data-i18n="refreshManual">Manual</option><option value="3">3 s</option><option selected value="5">5 s</option><option value="10">10 s</option><option value="30">30 s</option>
</select></label>
<label><span data-i18n="refreshSystemInfo">System information interval</span>
<select id="refresh-system-info-seconds" data-refresh-preference="system_info_seconds">
<option value="0" data-i18n="refreshManual">Manual</option><option value="15">15 s</option><option value="30">30 s</option><option selected value="60">60 s</option><option value="300">300 s</option>
</select></label>
</div>
</section>
<div class="appearance-actions"><button class="outline" data-i18n="appearanceReset"
id="appearance-reset" type="button">Reset appearance</button></div>
</div>
@@ -2290,6 +2333,22 @@
</div>
<p class="fine" data-i18n="cacheViaHelp">Defaults to Via: RustProxy. Changing this
response-only header does not purge cached objects.</p>
<div class="cache-maintenance-help">
<h3 class="subheading" data-i18n="cacheHttpInvalidationTitle">HTTP BAN / PURGE IP allowlist</h3>
<details class="metric-info cache-maintenance-info">
<summary aria-label="curl examples for HTTP BAN and PURGE" data-i18n-aria="cacheHttpInvalidationCurlLabel">i</summary>
<div class="metric-info-popover" role="note">
<p class="fine" data-i18n="cacheHttpInvalidationCurlIntro">Run curl from an allowlisted IP against a public vhost:</p>
<code>curl -i -X PURGE 'https://site.example/assets/app.js?v=1'</code>
<code>curl -i -X BAN 'https://site.example/assets/'</code>
<code>curl -i -X BAN 'https://site.example/' -H 'X-RustProxy-Confirm-Wide: 1'</code>
<p class="fine" data-i18n="cacheHttpInvalidationCurlNote">PURGE removes an exact URL; BAN invalidates a path prefix for 1 hour. No admin cookie is needed, but your IP must be allowed. A reverse proxy must forward these methods and trusted client IP information.</p>
</div>
</details>
</div>
<label><span data-i18n="cacheHttpInvalidationAddresses">Allowed client IP addresses or CIDRs (one per line)</span>
<textarea id="cache-http-invalidation-cidrs" rows="4" spellcheck="false" placeholder="192.0.2.10&#10;2001:db8:10::/64"></textarea></label>
<p class="fine" data-i18n="cacheHttpInvalidationHelp">Empty = disabled. PURGE /path?query removes exact matching entries; BAN /path lazily blocks cached URLs starting with the prefix (TTL 1 hour, optional X-RustProxy-Ban-Ttl). BAN / requires X-RustProxy-Confirm-Wide: 1. Only the matched vhost and Host are affected. Trusted reverse proxies must sanitize forwarding headers.</p>
<p class="fine" data-i18n="cacheAgeHelp">Age is sent on cache hits unless an
explicit response-header rule removes or replaces it. Such Age rules are
wire-only and do not change cache freshness.</p>
@@ -2697,6 +2756,13 @@
type="number" required="" /></label>
<p class="fine" data-i18n="administrationSessionDaysHelp">Browser sessions use an
absolute 7–30 day lifetime.</p>
<h3 class="subheading" data-i18n="panelCompressionTitle">Panel content compression</h3>
<div class="switch-grid">
<label class="check"><input id="admin-compression-zstd" type="checkbox" checked /><span>Zstd</span></label>
<label class="check"><input id="admin-compression-br" type="checkbox" checked /><span>Brotli (br)</span></label>
<label class="check"><input id="admin-compression-gzip" type="checkbox" checked /><span>gzip</span></label>
</div>
<p class="fine" data-i18n="panelCompressionHelp">The browser negotiates the best supported encoding (equal quality: Zstd → Brotli → gzip). Disable all to send uncompressed panel assets. Applies immediately; a reverse proxy may forward or re-encode the response.</p>
<p class="fine" id="admin-status" role="status"></p>
<div class="form-actions"><button class="primary" data-i18n="apply"
type="submit">Validate, save and apply</button></div>
@@ -2706,9 +2772,10 @@
data-settings-page="system-info" hidden="" id="settings-page-system-info" role="tabpanel">
<article class="card edit-form runtime-information-card">
<div class="card-heading">
<h2 data-i18n="systemInformation">System information</h2><span class="pill">API</span>
<h2 data-i18n="systemInformation">System information</h2><div class="system-info-heading-actions"><span class="pill">API</span><button class="quiet" data-i18n="refreshNow" id="system-info-refresh" type="button">Refresh now</button></div>
</div>
<p class="fine" data-i18n="systemInformationHelp">Live, read-only information from the authenticated RustProxy status API. Unavailable metrics are not estimated.</p>
<p class="fine" data-i18n="systemInformationHelp">Read-only information from the authenticated system-info API. Unavailable metrics are not estimated.</p>
<p class="fine" id="system-info-refresh-note" role="status"></p>
<h3 data-i18n="systemHostHeading">Operating system and hardware</h3>
<div class="runtime-information-grid">
<div><span class="small-label" data-i18n="runtimePlatform">Platform</span><code id="runtime-platform">-</code></div>