This commit is contained in:
Mateusz Gruszczyński committed 2026-10-07 13:40:21 +02:00
1 parent 3a2eb4fe79
commit e0194fbaff
63 files changed
+1553 -379

No files matched your search

+189 -49
View File
@@ -86,7 +86,9 @@
</div>
<div hidden="" id="setup-fields">
<p class="fine" data-i18n="setupHelp">Create the first administrator using a one-time local
capability.</p><code class="command">rust-proxy --data-dir DATA_DIR admin setup-token</code>
capability.</p><code class="command">rust-proxy --data-dir ./data admin setup-token</code>
<p class="fine" data-i18n="setupCommandExample">Standard service installation example:</p>
<code class="command">rust-proxy --data-dir /var/lib/rustproxy admin setup-token</code>
<label data-i18n="setupToken" for="setup-token">One-time setup token</label><input
autocomplete="off" id="setup-token" maxlength="64" minlength="64" spellcheck="false"
type="password" />
@@ -649,6 +651,17 @@
<label class="sr-only" data-i18n="vhSearch" for="vhost-search">Search vhosts</label>
<input autocomplete="off" data-i18n-aria="vhSearch"
data-i18n-placeholder="vhSearchPlaceholder" id="vhost-search" type="search" />
<label class="backend-sort-control"><span data-i18n="backendSortBy">Sort
by</span><select data-i18n-aria="backendSortBy" id="vhost-sort">
<option data-i18n="vhVhost" value="id">Vhost</option>
<option data-i18n="vhHosts" value="hostname">Hosts</option>
<option data-i18n="status" value="status">Status</option>
<option data-i18n="vhListeners" value="listeners">Listeners</option>
<option data-i18n="vhCertificate" value="certificate">Certificate</option>
<option data-i18n="vhBackendPool" value="backends">Backends</option>
</select></label>
<button class="quiet backend-sort-direction" data-i18n-aria="backendSortAscending"
id="vhost-sort-direction" type="button">↑</button>
<button class="outline" data-i18n="vhNew" id="vhost-new" type="button">New
vhost</button>
</div>
@@ -691,7 +704,18 @@
<div class="toolbar-actions"><label class="sr-only" data-i18n="dockerSearch"
for="docker-search">Search Docker vhosts</label><input autocomplete="off"
data-i18n-aria="dockerSearch" data-i18n-placeholder="dockerSearchPlaceholder"
id="docker-search" type="search" /><label class="check compact-check docker-live-switch"
id="docker-search" type="search" /><label class="backend-sort-control"><span
data-i18n="backendSortBy">Sort by</span><select data-i18n-aria="backendSortBy"
id="docker-vhost-sort">
<option data-i18n="dockerServices" value="service">Service</option>
<option data-i18n="dockerHostname" value="hostname">Hostname</option>
<option data-i18n="status" value="status">Status</option>
<option data-i18n="dockerBackendIp" value="backend">Backend host IP</option>
<option data-i18n="dockerBackendScheme" value="scheme">Backend protocol</option>
<option data-i18n="dockerPublish" value="published">Published</option>
</select></label><button class="quiet backend-sort-direction"
data-i18n-aria="backendSortAscending" id="docker-vhost-sort-direction"
type="button">↑</button><label class="check compact-check docker-live-switch"
title="Refresh this view from RustProxy memory every 5 seconds"><input
id="docker-live-refresh" type="checkbox" /><span data-i18n="dockerLiveView">Live
view</span></label><button class="outline" data-i18n="dockerRefresh"
@@ -710,15 +734,26 @@
<div class="vhost-layout redirect-layout">
<article class="card">
<div class="card-heading">
<div><span class="small-label" data-i18n="redirectLayer">HTTP REDIRECTION</span>
<h2 data-i18n="redirectList">Redirect hosts</h2>
</div>
<h2 data-i18n="redirectList">Redirect hosts</h2>
<div class="vhost-list-tools">
<label class="sr-only" data-i18n="redirectSearch" for="redirect-search">Search
redirects</label>
<input autocomplete="off" data-i18n-aria="redirectSearch"
data-i18n-placeholder="redirectSearchPlaceholder" id="redirect-search"
type="search" />
<label class="backend-sort-control"><span data-i18n="backendSortBy">Sort
by</span><select data-i18n-aria="backendSortBy" id="redirect-sort">
<option data-i18n="redirectId" value="id">Redirect ID</option>
<option data-i18n="redirectName" value="name">Display name</option>
<option data-i18n="redirectHosts" value="hostname">Source hostnames</option>
<option data-i18n="status" value="status">Status</option>
<option data-i18n="redirectTarget" value="target">Target</option>
<option data-i18n="redirectRules" value="rules">Rules</option>
<option data-i18n="redirectListeners" value="listeners">Listeners</option>
<option data-i18n="vhCertificate" value="certificate">Certificate</option>
</select></label>
<button class="quiet backend-sort-direction" data-i18n-aria="backendSortAscending"
id="redirect-sort-direction" type="button">↑</button>
<button class="outline" data-i18n="redirectNew" id="redirect-new" type="button">New
redirect</button>
</div>
@@ -734,15 +769,25 @@
<div class="vhost-layout redirect-layout">
<article class="card">
<div class="card-heading">
<div><span class="small-label" data-i18n="notfoundLayer">LOCAL RESPONSE</span>
<h2 data-i18n="notfoundList">404 hosts</h2>
</div>
<h2 data-i18n="notfoundList">404 hosts</h2>
<div class="vhost-list-tools">
<label class="sr-only" data-i18n="notfoundSearch" for="notfound-search">Search 404
hosts</label>
<input autocomplete="off" data-i18n-aria="notfoundSearch"
data-i18n-placeholder="notfoundSearchPlaceholder" id="notfound-search"
type="search" />
<label class="backend-sort-control"><span data-i18n="backendSortBy">Sort
by</span><select data-i18n-aria="backendSortBy" id="notfound-sort">
<option data-i18n="notfoundId" value="id">Host ID</option>
<option data-i18n="notfoundName" value="name">Display name</option>
<option data-i18n="notfoundHosts" value="hostname">Hostnames</option>
<option data-i18n="notfoundStatus" value="status">HTTP status</option>
<option data-i18n="notfoundMode" value="mode">Response type</option>
<option data-i18n="redirectListeners" value="listeners">Listeners</option>
<option data-i18n="vhCertificate" value="certificate">Certificate</option>
</select></label>
<button class="quiet backend-sort-direction" data-i18n-aria="backendSortAscending"
id="notfound-sort-direction" type="button">↑</button>
<button class="outline" data-i18n="notfoundNew" id="notfound-new" type="button">New
404 host</button>
</div>
@@ -768,6 +813,22 @@
<input autocomplete="off" data-i18n-aria="streamSearch"
data-i18n-placeholder="streamSearchPlaceholder" id="stream-search"
type="search" />
<label class="backend-sort-control"><span data-i18n="backendSortBy">Sort
by</span><select data-i18n-aria="backendSortBy" id="stream-sort">
<option data-i18n="streamName" value="name">Display name</option>
<option data-i18n="streamId" value="id">Stream ID</option>
<option data-i18n="streamProtocol" value="protocol">Protocol</option>
<option data-i18n="streamListen" value="listen">Listen address</option>
<option data-i18n="streamUpstream" value="upstream">Upstream address
</option>
<option data-i18n="status" value="status">Status</option>
<option data-i18n="streamMaxConnections" value="maxConnections">Max
connections</option>
<option data-i18n="streamIdleShort" value="idleTimeout">Idle timeout
</option>
</select></label>
<button class="quiet backend-sort-direction" data-i18n-aria="backendSortAscending"
id="stream-sort-direction" type="button">↑</button>
<button class="outline" data-i18n="streamNew" id="stream-new" type="button">New
stream</button>
</div>
@@ -811,11 +872,14 @@
</div>
<section class="acl-policy-builder" aria-labelledby="acl-policy-mode-label">
<div class="acl-policy-step-head">
<div><span class="acl-policy-step">1</span><div><strong id="acl-policy-mode-label"
data-i18n="aclProfilePolicyMode">Choose the base policy</strong><p
class="fine" data-i18n="aclProfilePolicyModeHelp">Start with a simple
<div><span class="acl-policy-step">1</span>
<div><strong id="acl-policy-mode-label" data-i18n="aclProfilePolicyMode">Choose
the base policy</strong>
<p class="fine" data-i18n="aclProfilePolicyModeHelp">Start with a simple
allow-list or block-list. Use custom mode only when you need mixed
allow and deny rules.</p></div></div>
allow and deny rules.</p>
</div>
</div>
</div>
<div class="acl-policy-modes" id="acl-profile-mode-options">
<label class="acl-policy-mode-card"><input checked name="acl-profile-mode"
@@ -843,28 +907,39 @@
<label><span data-i18n="vhCountryMode">Country access</span><select
id="acl-profile-country-mode">
<option data-i18n="vhOff" value="off">Off</option>
<option data-i18n="vhCountryBlock" value="block">Block listed countries</option>
<option data-i18n="vhCountryAllow" value="allow">Allow only listed countries</option>
<option data-i18n="vhCountryBlock" value="block">Block listed countries
</option>
<option data-i18n="vhCountryAllow" value="allow">Allow only listed countries
</option>
</select></label>
</div>
</section>
<section class="acl-policy-builder">
<div class="acl-policy-step-head"><div><span class="acl-policy-step">2</span><div><strong
data-i18n="aclProfileCountryExceptions">Country exceptions</strong><p
class="fine" id="acl-profile-country-help"></p></div></div><label
class="acl-policy-switch"><input id="acl-profile-country-enabled"
type="checkbox" /><span data-i18n="aclProfileUseCountries">Use countries</span></label></div>
<div class="acl-policy-step-head">
<div><span class="acl-policy-step">2</span>
<div><strong data-i18n="aclProfileCountryExceptions">Country exceptions</strong>
<p class="fine" id="acl-profile-country-help"></p>
</div>
</div><label class="acl-policy-switch"><input id="acl-profile-country-enabled"
type="checkbox" /><span data-i18n="aclProfileUseCountries">Use
countries</span></label>
</div>
<label class="acl-policy-country-list" id="acl-profile-country-field"><span
id="acl-profile-country-label" data-i18n="vhCountryList">Countries</span><textarea
id="acl-profile-countries" rows="4" maxlength="1024" spellcheck="false"
id="acl-profile-country-label"
data-i18n="vhCountryList">Countries</span><textarea id="acl-profile-countries"
rows="4" maxlength="1024" spellcheck="false"
placeholder="CN&#10;PL"></textarea></label>
</section>
<section class="acl-policy-builder">
<div class="acl-policy-step-head"><div><span class="acl-policy-step">3</span><div><strong
data-i18n="aclProfileIpExceptions">IP / CIDR exceptions</strong><p
class="fine" id="acl-profile-ip-help"></p></div></div><button class="quiet"
data-i18n="aclProfileAddIpException" id="acl-profile-rule-add" type="button">Add
IP exception</button></div>
<div class="acl-policy-step-head">
<div><span class="acl-policy-step">3</span>
<div><strong data-i18n="aclProfileIpExceptions">IP / CIDR exceptions</strong>
<p class="fine" id="acl-profile-ip-help"></p>
</div>
</div><button class="quiet" data-i18n="aclProfileAddIpException"
id="acl-profile-rule-add" type="button">Add
IP exception</button>
</div>
<div class="acl-profile-rule-rows" id="acl-profile-rule-rows"></div>
<details class="acl-profile-bulk" id="acl-profile-bulk">
<summary data-i18n="aclProfileBulkRules">Paste / import rules</summary>
@@ -878,8 +953,8 @@
</details>
</section>
<section class="acl-policy-preview" aria-live="polite">
<div class="acl-policy-preview-head"><span data-i18n="aclProfilePreview">Effective policy</span><b
id="acl-profile-preview-default"></b></div>
<div class="acl-policy-preview-head"><span data-i18n="aclProfilePreview">Effective
policy</span><b id="acl-profile-preview-default"></b></div>
<div class="acl-policy-preview-flow" id="acl-profile-preview-flow"></div>
<p class="fine" id="acl-profile-preview-note"></p>
</section>
@@ -913,6 +988,19 @@
data-certificate-tab="generate" data-i18n="certificateTabGenerate"
id="certificate-tab-generate" role="tab" tabindex="-1" type="button"></button>
</nav>
<article class="card certificate-operation-card certificate-runtime-card" id="acme-runtime-card">
<div class="certificate-operation-heading">
<div>
<span class="small-label" data-i18n="certificateRuntimeTitle">ACME runtime</span>
<strong data-i18n="acme.runtime_checking" id="acme-runtime-message"
role="status">Checking local Python environment…</strong>
</div>
<span class="pill" data-i18n="certificateRuntimePreparing"
id="acme-runtime-state">Preparing</span>
</div>
<p class="fine" hidden="" id="acme-runtime-path"></p>
<p class="fine" id="acme-runtime-components"></p>
</article>
<div class="certificate-pages">
<div aria-labelledby="certificate-tab-installed" class="certificate-page"
data-certificate-page="installed" id="certificate-page-installed" role="tabpanel">
@@ -1320,10 +1408,10 @@
</div>
</details>
<div class="stats-grid cache-stats">
<article class="stat"><span data-i18n="cacheHotObjects" id="cache-hot-objects-label">Hot objects</span><strong
id="cp-entries">-</strong><small id="cp-capacity">-</small><progress
aria-labelledby="cache-hot-objects-label" id="cp-hot-entries-meter" max="100"
value="0"></progress></article>
<article class="stat"><span data-i18n="cacheHotObjects" id="cache-hot-objects-label">Hot
objects</span><strong id="cp-entries">-</strong><small
id="cp-capacity">-</small><progress aria-labelledby="cache-hot-objects-label"
id="cp-hot-entries-meter" max="100" value="0"></progress></article>
<article class="stat"><span data-i18n="cacheHotMemory" id="cache-memory-label">Hot
memory</span><strong id="cp-bytes">-</strong><small
id="cp-memory-detail">-</small><progress aria-labelledby="cache-memory-label"
@@ -1331,13 +1419,14 @@
</article>
<article class="stat"><span data-i18n="cacheTransientMemory">Transient cache RAM</span><strong
id="cp-transient">-</strong><small id="cp-transient-detail">-</small></article>
<article class="stat"><span data-i18n="cacheColdObjects" id="cache-cold-objects-label">Cold objects</span><strong
id="cp-cold-entries">-</strong><small id="cp-cold-capacity">-</small><progress
aria-labelledby="cache-cold-objects-label" id="cp-cold-entries-meter" max="100"
value="0"></progress></article>
<article class="stat"><span data-i18n="cacheColdDisk" id="cache-cold-disk-label">Cold disk</span><strong
id="cp-cold-bytes">-</strong><small id="cp-cold-disk-detail">-</small><progress
aria-labelledby="cache-cold-disk-label" id="cp-cold-disk" max="100" value="0"></progress>
<article class="stat"><span data-i18n="cacheColdObjects" id="cache-cold-objects-label">Cold
objects</span><strong id="cp-cold-entries">-</strong><small
id="cp-cold-capacity">-</small><progress aria-labelledby="cache-cold-objects-label"
id="cp-cold-entries-meter" max="100" value="0"></progress></article>
<article class="stat"><span data-i18n="cacheColdDisk" id="cache-cold-disk-label">Cold
disk</span><strong id="cp-cold-bytes">-</strong><small
id="cp-cold-disk-detail">-</small><progress aria-labelledby="cache-cold-disk-label"
id="cp-cold-disk" max="100" value="0"></progress>
</article>
<article class="stat"><span data-i18n="cacheHitRatio">Hit ratio</span><strong
id="cp-ratio">-</strong><small id="cp-requests">-</small></article>
@@ -1921,7 +2010,8 @@
id="server-mode">
<option data-i18n="serverPreserve" value="preserve">Preserve origin value</option>
<option data-i18n="serverHide" value="hide">Hide completely</option>
<option data-i18n="serverCustom" selected value="custom">Replace / add custom value</option>
<option data-i18n="serverCustom" selected value="custom">Replace / add custom value
</option>
</select>
<label data-i18n="serverValue" for="server-value">Custom Server value</label><input
id="server-value" maxlength="256" placeholder="RustProxy" value="RustProxy"
@@ -1941,7 +2031,11 @@
<label data-i18n="compressionMin" for="compress-min">Minimum response size
(bytes)</label><input id="compress-min" max="1048576" min="32" required=""
type="number" />
<p class="fine" data-i18n="compressionHelp">Negotiates Accept-Encoding using client q-values and zstd → br → gzip → deflate as the server preference for equal quality. Cookies, Authorization, Set-Cookie, private and no-store responses may be compressed. Existing Content-Encoding, ranges, SSE, upgrades and no-transform are passed through.</p>
<p class="fine" data-i18n="compressionHelp">Negotiates Accept-Encoding using client
q-values and zstd → br → gzip → deflate as the server preference for equal quality.
Cookies, Authorization, Set-Cookie, private and no-store responses may be
compressed. Existing Content-Encoding, ranges, SSE, upgrades and no-transform are
passed through.</p>
<div class="form-actions"><button class="primary" data-i18n="saveResponse"
type="submit">Apply response settings</button></div>
</form>
@@ -2553,6 +2647,14 @@
id="runtime-data-directory">-</code></div>
<div><span class="small-label" data-i18n="databaseLocation">Database</span><code
id="runtime-database-path">-</code></div>
<div><span class="small-label" data-i18n="runtimeAcmeMode">ACME mode</span><code
id="runtime-acme-mode">-</code></div>
<div><span class="small-label" data-i18n="runtimePython">Python</span><code
id="runtime-python">-</code></div>
<div><span class="small-label" data-i18n="runtimePip">pip</span><code
id="runtime-pip">-</code></div>
<div><span class="small-label" data-i18n="runtimeCertbot">Certbot</span><code
id="runtime-certbot">-</code></div>
</div>
</article>
</div>
@@ -2721,7 +2823,7 @@
</section>
</div>
</section>
<footer class="page-footer"><span>RustProxy <b>0.27.0</b></span><span id="footer-status">API - /
<footer class="page-footer"><span>RustProxy <b>0.27.1</b></span><span id="footer-status">API - /
dropped: 0</span></footer>
</div>
</main>
@@ -3105,12 +3207,38 @@
this controls browser/proxy caching and does not create a second RustProxy object cache.</p>
</div>
<div class="vh-grid web-service-page" data-web-service-page="delivery" hidden>
<label><span data-i18n="webServiceCompression">Dynamic compression</span><select id="web-service-compression"><option value="" data-i18n="inherit">Inherit</option><option value="on" data-i18n="enabled">Enabled</option><option value="off" data-i18n="notEnabled">Disabled</option></select><small class="fine" data-i18n="webServiceCompressionHelp">Inherits the vhost/global policy by default. Codecs can be filtered per service; globally disabled codecs stay unavailable.</small></label>
<label><span data-i18n="webServiceCompression">Dynamic compression</span><select
id="web-service-compression">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select><small class="fine" data-i18n="webServiceCompressionHelp">Inherits the vhost/global
policy by default. Codecs can be filtered per service; globally disabled codecs stay
unavailable.</small></label>
<div class="vh-wide vh-grid" id="web-service-compression-options">
<label><span data-i18n="compressionZstd">Zstandard (zstd)</span><select id="web-service-compression-zstd"><option value="" data-i18n="inherit">Inherit</option><option value="on" data-i18n="enabled">Enabled</option><option value="off" data-i18n="notEnabled">Disabled</option></select></label>
<label><span data-i18n="compressionBr">Brotli (br)</span><select id="web-service-compression-br"><option value="" data-i18n="inherit">Inherit</option><option value="on" data-i18n="enabled">Enabled</option><option value="off" data-i18n="notEnabled">Disabled</option></select></label>
<label><span data-i18n="compressionGzip">gzip</span><select id="web-service-compression-gzip"><option value="" data-i18n="inherit">Inherit</option><option value="on" data-i18n="enabled">Enabled</option><option value="off" data-i18n="notEnabled">Disabled</option></select></label>
<label><span data-i18n="compressionDeflate">deflate</span><select id="web-service-compression-deflate"><option value="" data-i18n="inherit">Inherit</option><option value="on" data-i18n="enabled">Enabled</option><option value="off" data-i18n="notEnabled">Disabled</option></select></label>
<label><span data-i18n="compressionZstd">Zstandard (zstd)</span><select
id="web-service-compression-zstd">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select></label>
<label><span data-i18n="compressionBr">Brotli (br)</span><select
id="web-service-compression-br">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select></label>
<label><span data-i18n="compressionGzip">gzip</span><select id="web-service-compression-gzip">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select></label>
<label><span data-i18n="compressionDeflate">deflate</span><select
id="web-service-compression-deflate">
<option value="" data-i18n="inherit">Inherit</option>
<option value="on" data-i18n="enabled">Enabled</option>
<option value="off" data-i18n="notEnabled">Disabled</option>
</select></label>
</div>
<label class="check"><input id="web-service-precompressed" type="checkbox" /><span
data-i18n="webServicePrecompressed">Serve precompressed sidecars</span></label>
@@ -3439,7 +3567,7 @@ max_execution_time = 30</code></pre>
<article class="card about-card">
<div class="about-product">
<span aria-hidden="true" class="brand-mark">r<span>/</span>p</span>
<div><span class="small-label">RustProxy</span><strong>0.27.0</strong></div>
<div><span class="small-label">RustProxy</span><strong>0.27.1</strong></div>
</div>
<dl class="about-meta">
<div>
@@ -3450,12 +3578,24 @@ max_execution_time = 30</code></pre>
<dt data-i18n="aboutLicense">License</dt>
<dd data-i18n="aboutLicenseValue">Open Source</dd>
</div>
<div>
<dt data-i18n="runtimeAcmeMode">ACME mode</dt>
<dd id="about-acme-mode">-</dd>
</div>
<div>
<dt data-i18n="aboutPythonRuntime">Certificate Python runtime</dt>
<dd id="about-python-runtime">-</dd>
</div>
</dl>
<p data-i18n="aboutOpenSourceText">RustProxy is an open-source project. Its source code is publicly
available for inspection, development and community contribution.</p>
<p class="about-python-details" id="about-python-details"></p>
<a class="outline about-repository" href="https://git.linuxiarz.pl/gru/RustProxy" rel="noopener noreferrer"
target="_blank"><span data-i18n="aboutRepository">Source
target="_blank"><span data-i18n="aboutRepository">Official source
repository</span><span>git.linuxiarz.pl/gru/RustProxy</span></a>
<a class="outline about-repository" href="https://rustproxy.linuxiarz.pl/" rel="noopener noreferrer"
target="_blank"><span data-i18n="aboutPackagesRepository">Official package
repository</span><span>rustproxy.linuxiarz.pl</span></a>
</article>
</dialog>
<div aria-live="polite" class="toast" hidden="" id="toast" popover="manual" role="status"></div>