From 51f22a72ccc662261d40db335f14838e717b4d75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Fri, 6 Nov 2026 23:38:00 +0100 Subject: [PATCH] v0.35.3 --- AGENTS.md | 2 +- CHANGELOG.md | 8 +++++++- Cargo.lock | 2 +- Cargo.toml | 2 +- SHA256SUMS | 20 ++++++++++---------- docs/DASHBOARD.md | 6 ++++-- integrations/routeros-oci-build/README.md | 4 ++-- src/admin/openapi.json | 2 +- src/admin/web/app/overview-samples.js | 17 +++++++++++++---- src/admin/web/dashboard-defaults.json | 16 ++++++++++------ src/admin/web/dashboard-widgets.json | 8 ++++---- 11 files changed, 54 insertions(+), 33 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index eda68d2..2983fe9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,6 @@ # RustProxy source and documentation maintenance -Current source version: **0.35.2**. The Cargo package and binary are named `rust-proxy`. +Current source version: **0.35.3**. The Cargo package and binary are named `rust-proxy`. Before editing, read [README.md](README.md), the relevant [documentation guide](docs/README.md) and the actual code and tests. Historical release experiments are not current specifications. Use the bundled `src/admin/openapi.json` for API routes and payloads; the source implementation is authoritative for runtime behavior. diff --git a/CHANGELOG.md b/CHANGELOG.md index 13f36e3..d464a8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,12 +2,18 @@ Release history focused on **features, settings, default behavior, compatibility and fixes**. Changes to internal code structure and preliminary performance experiments are intentionally omitted. Historical descriptions reflect their respective releases; consult the current documentation for the settings available in the latest release. +## 0.35.3 — Overview layout fixes + +- **Standard Overview layout restored:** the quick-health tiles added in 0.35.2 (healthy backends, error share, requests rejected by limits, nearest certificate expiry) are now hidden by default and placed at the end of the Overview, so they no longer shift the standard block layout. Enable them in the layout editor when needed. +- **Fixed:** the "Saved default" status next to the history sample count was always visible and looked like a fresh save notification. It now appears only for an unsaved temporary choice or briefly after **Remember choice**. +- **Upgrade notes:** no configuration changes are required. If 0.35.2 already changed your Overview, use **Unlock layout → Reset layout** to restore the default arrangement, or hide the tiles in the layout editor. + ## 0.35.2 — memory fix, health check options and Overview tiles - **Memory use restored:** with a large HOT cache, 0.35.1 used about 25% more memory than 0.35.0 (for example 1.1–1.2 GiB instead of about 800 MiB with a 600 MiB cache). The default build is back to the 0.35.0 memory profile. The faster alternative allocator is available as an optional build feature for servers with spare RAM; the Performance guide explains the trade-off with measurements. - **Health check port:** active TCP and HTTP health checks can probe a different port than the one receiving traffic, for example a status port 8079 for a backend serving on port 80. It can be set for a whole Vhost or per backend; host, TLS and address restrictions stay the same. - **Expected response text:** HTTP health checks can require a text fragment in the response body, so a status page that answers 200 while reporting a degraded state marks the backend as down. -- **New Overview tiles:** healthy backends (with the names of failing ones), error share, requests rejected by limits and the nearest certificate expiry are shown on the Overview by default. +- **New Overview tiles:** healthy backends (with the names of failing ones), error share, requests rejected by limits and the nearest certificate expiry. - **Certificate expiry metrics:** Prometheus now exports the expiry date and remaining days of every installed certificate, including manually uploaded ones, for alerting. - **Safari:** the Overview no longer jumps when you scroll near the Backends table while live values refresh. - **Fixed:** network interface traffic below 1 KiB/s is shown as a whole number of bytes instead of a long decimal. diff --git a/Cargo.lock b/Cargo.lock index 8918728..c1c30f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1943,7 +1943,7 @@ dependencies = [ [[package]] name = "rust-proxy" -version = "0.35.2" +version = "0.35.3" dependencies = [ "anyhow", "arc-swap", diff --git a/Cargo.toml b/Cargo.toml index 86638e6..99a221a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rust-proxy" -version = "0.35.2" +version = "0.35.3" edition = "2021" rust-version = "1.99.1" description = "RustProxy - independent reverse proxy with local administration" diff --git a/SHA256SUMS b/SHA256SUMS index 13cceaf..8e84aab 100644 --- a/SHA256SUMS +++ b/SHA256SUMS @@ -1,10 +1,10 @@ 61bf40a0572889dc8b0dda9eae4e93e44b0de9364b3c798106c85700ffb37c23 .dockerignore 4140a2956264b44f259e6a37fc00ba02097bbe68b09296e04d3d243c1287129b .env.example ba8bc979322a494cfce59398085259d059142d6a789bbe73ed7992d143123f06 .gitignore -fc231d1592f011579e4ab334080e612a07124031ee1131ac290881eed74584c2 AGENTS.md -a3aa62cb339131a2c2b766ebf97d1b8a3a2f0b3e1c56751dd6a4201ccfe63225 CHANGELOG.md -9d4a829ffb913892a929778b9c25bb461388067359af474fa535c70aaefd54c2 Cargo.lock -ca231b75557628c8181945103858a2347562e485d3e03c3fd871629dc1fdecab Cargo.toml +5142c2151f434a42b925a6def77b726abf0c10e8404f8db08c999ca1cad43386 AGENTS.md +c2c23ce76282075cc49bf1609fe693591c900a5a120ff3e209e00f86a97c0141 CHANGELOG.md +77a69eb3906a27fa42d4bcb60e9595e86fc23ad74d72b96f2710527da49f5225 Cargo.lock +5d49aef294682f80d98cc2cc50d3908a8e5684151d38ee5dfbd04cd6cd95f9e0 Cargo.toml 25c7f3c8162cbf5cc156439774118a81dae9fdc52b611ec7e40c230fc99a772c Dockerfile 0d96a4ff68ad6d4b6f1f30f713b18d5184912ba8dd389f86aa7710db079abcb0 LICENSE 82d1dee2fc68158f0ea73259151461e64c8b18d807cd1fecfb1ed99dc30cf5f4 README.md @@ -34,7 +34,7 @@ a1b6b8675d3b8321160406bc716f1355356e1e3dd056d4785be1d06a99313f31 docs/API.md 32599d67a11fd0ebbc612e82b9f602789f4ed4103cda482c6870d8741100c8b4 docs/CERTIFICATES.md 02bb383b5c3bce22616c3cc3db30a9469806dc16decb509973e84c60aa30fc5b docs/CONFIGURATION.md fec29ce846d6705eb45819d85d382f28e28a146b265feab2e4c7cce2a35e5883 docs/CUSTOM_LOCATIONS.md -da5bb8321e2ac4144c37d1262c07ccfbf24eb19fa9ec46ca4436d2e4b02bc55a docs/DASHBOARD.md +6e05af7bf62a41a3a5a71e8f0c036dc611408d04f7130c07b585317aaf59ef0b docs/DASHBOARD.md 11a08bf2110bbeabc924eb049a30177a216af5607ccdaf8be9178e751f78a2c4 docs/DOCKER_DISCOVERY.md cebf36532f7366acdcf8808d958b86b5f67246043677ee3dba9474a9b81970e0 docs/FEATURES.md 3939c14e83ef6856a421f358a3f7fce3d50ea375bc1b9f0419f27a3eed658f6f docs/INSTALL.md @@ -86,7 +86,7 @@ de6550ab8f48d556d752c252212c38ba65491fd224f972c10fbe552f91ed7520 integrations/o 45be151cd85fc2ef2f1fdc3003ace63381af262e73af8a685ab48cb697cc0de1 integrations/routeros-oci-build/.env.routeros.example 11aa102de1089ecc375f20c4bd5420fcfd3b2ef23fe0c8bdf04953fcfaf40ef0 integrations/routeros-oci-build/Dockerfile.routeros 7c7a3e51f43b43e1c962a4b0bb591f99c1f06977bf77f23719f7f867dfe7eb8e integrations/routeros-oci-build/Dockerfile.routeros.dockerignore -567caa4833a3ba011a7527a0d0f658f7c6f1ec8583e04e87951658c04d1d10d5 integrations/routeros-oci-build/README.md +4c7416b85ddbf66f8434735dfa6452c8b368f496a120861a2024c5775858ad0e integrations/routeros-oci-build/README.md 3f092a9ab80221eddd67be4d1a776acbc6e04c1eb6011b588280c28e83b2582f integrations/routeros-oci-build/build-routeros-oci.sh 3f267cafa16006e5456ade78ee2d5fae02cc7ce747839523068ffd8d7c98798a integrations/routeros-oci-build/docker-entrypoint.sh 13189fa546c3488dddd8efc80c47f6da5241e5fc28b79cbfe795414ea05c7a4f langs/README.md @@ -162,7 +162,7 @@ d58a2ed83319176de4e66790ed292447c9497ae031464ec55cfe27174acb639a src/admin/file 77b8c05645969834cc8a58e249a7b60a57d6c47ad1c5cd92ffa5e4a9b5a8e73c src/admin/file_logs_query.rs 444d7715406ffd2305a72decf7fdf633aa4c2752cd881c8fa3b95ed971d79820 src/admin/logging_api.rs 243f4a9c3fa99781e19c3952354d2632c0ce65e1dafac729567cbe3c177f94cb src/admin/mod.rs -d0522ebc21845f300b083063126229301cee98af0ec8827ffd3f94d1e2915848 src/admin/openapi.json +61fd5eb6bb4f3cc19151ae96dc5c028e4845479ce1e2bb2691a41094dcd212c9 src/admin/openapi.json 1f4ec45d146e00ef664fae37517f8fcb5455d47daec496c02b2fc15ddec49131 src/admin/operations.rs 257d93a29d0bda96462bcf695aba8d0ec0f9412c379e066ec46ae8ee034e3a53 src/admin/panel_assets.rs f5127855c2994d052678865df36d703b74f4a0afc633daf7718b10da18d26e37 src/admin/panel_content.rs @@ -192,7 +192,7 @@ e4238322a985d3e8b7f2de94b7af31e1c718775590b2c7b3428b878cd43337b7 src/admin/web/ a184c50e1ca6bb5a14954e31b15f09ff9978fb939064ca724851bbb4e661dc56 src/admin/web/app/dashboard-presets.js 47eaf9486099468b3d686bdca5c6b8d59aa5f5661baa03b3698320cf618db4e2 src/admin/web/app/overview-extra-metrics.js 5e62cccf6a9507fe208e9f41bbd08453c3d8c6a6b83c56d93a2bb22550ea6e9a src/admin/web/app/overview-masonry.js -b52456b41451f156edf5f58492119c22726f2cf40cee938527748997e8ee7412 src/admin/web/app/overview-samples.js +561f750cacd4d4fcf7d1d1d9167ba296c0b43d7e81f2bff0ab1a070e1b8682d6 src/admin/web/app/overview-samples.js db9012546cae8c58fc2bcbee71c9a95956a13a6db9e6d126c6a3770d45a4e4d2 src/admin/web/app/overview-wide-metrics.js bfd9fafb3112197e8f875dbf87a9a66c81aef0fe83687601a84a66f5e13f69bc src/admin/web/app/path-permissions.js 46c7cd36397375eb7e8c230c8aa97b1dbea0a63800beb977efe1ec67a14b237e src/admin/web/app/preferences.js @@ -215,8 +215,8 @@ f8b515c63080c71ee647cfd8c36628271e8357b31cd84f00cf591e9b752b44fe src/admin/web/ c7c387e21e7bb148689e16f5fda6cd47c870043260dec059bbe66e09ac86fdd9 src/admin/web/css/70-responsive.css 8009afdb04d5170687816730cc930a22fead1fe0248835ca7e8de81d6907395d src/admin/web/css/README.md 8241bd9489dfed082863948829a44a49bf0a8e9cd63c55809655109e393e0918 src/admin/web/css/manifest.json -91ee66142ec7b44628ea1e9a31e3b1394eafd6082f24f4a5cb614319544f699b src/admin/web/dashboard-defaults.json -a056075e1803ad5c0297cdeaf97b47eaaaf1953b29ad7f45626c1f5ee0cb7452 src/admin/web/dashboard-widgets.json +ee51ab0912e0ade6a3e1c2ea6f533bb2f65a6d3e6ec9087e25b9f0df009c19b2 src/admin/web/dashboard-defaults.json +20d65b22900d0de2f71dbafee2fe9a237e0a76515b386022b94c75d50bdfd926 src/admin/web/dashboard-widgets.json 50d1ebcbaf4d0b2968da23bb943fc3f67131c5d32df3f61d23ff37aad9da5b81 src/admin/web/demo.html 448a4e00e78ca368f9307cc84f87e893e5225dc87fdeadfbb227fd4b1faf1702 src/admin/web/docker.js fec062a5959450b1711948adf3189ceb37edca6fbead2e5bfc03b7ce397c70b1 src/admin/web/docs.css diff --git a/docs/DASHBOARD.md b/docs/DASHBOARD.md index 4a3a555..3539f48 100644 --- a/docs/DASHBOARD.md +++ b/docs/DASHBOARD.md @@ -14,7 +14,7 @@ page has its own stylesheet. The Overview contains live counters, charts and optional backend, cache, PHP, Docker and Stream cards. Under **Settings → Appearance → Dashboard layout** or the Overview editor, configure visibility, order, card width, density and the number of history samples. A hidden card stops consuming its optional browser-side visualization work but does not turn off its underlying proxy feature. -Quick-health tiles shown by default since 0.35.2: +Optional quick-health tiles (since 0.35.2, hidden by default; enable them in the layout editor or **Settings → Appearance → Dashboard layout**): | Tile | Shows | |---|---| @@ -23,7 +23,9 @@ Quick-health tiles shown by default since 0.35.2: | **Rejected by limits / s** | Requests and connections refused by `--max-connections` / `--max-inflight`; sustained values mean the limits are too low for the load. | | **Nearest certificate expiry** | Days until the earliest installed certificate expires; the bar is full at 90 days or more. | -Existing layouts receive these tiles at the end of the Overview; hide or move them in the layout editor. +Enabled tiles are added at the end of the Overview, so the standard block layout does not change. + +The **Remember choice** control next to the history sample count shows a status only when the current choice is temporary (not saved) or briefly after saving. The unlocked Overview layout exposes a single **Save and lock** action (plus Cancel), removing the redundant lock-and-save button. diff --git a/integrations/routeros-oci-build/README.md b/integrations/routeros-oci-build/README.md index 399c590..30214de 100644 --- a/integrations/routeros-oci-build/README.md +++ b/integrations/routeros-oci-build/README.md @@ -77,10 +77,10 @@ ENV_FILE=integrations/routeros-oci-build/.env \ bash integrations/routeros-oci-build/build-routeros-oci.sh push ``` -For example, with RustProxy version `0.35.2` and the defaults this publishes: +For example, with RustProxy version `0.35.3` and the defaults this publishes: ```text -zot.example.net/network/rustproxy:0.35.2 +zot.example.net/network/rustproxy:0.35.3 zot.example.net/network/rustproxy:latest zot.example.net/network/rustproxy:routeros ``` diff --git a/src/admin/openapi.json b/src/admin/openapi.json index ef4f6d8..150a3ab 100644 --- a/src/admin/openapi.json +++ b/src/admin/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.0.3", "info": { "title": "RustProxy Administration API", - "version": "0.35.2", + "version": "0.35.3", "description": "Administration API for the active panel origin. Sign in through the panel; the same-origin HttpOnly cookie authenticates all private operations. Mutations also require the exact Origin, X-RustProxy-Request: 1 and a session-bound X-CSRF-Token. Loopback HTTP is the default; Settings can enable HTTPS before using a non-loopback administration bind. This document contains no live configuration or credentials. Object schemas marked extensible are summaries: full configuration validation is authoritative in Rust. The API also permits explicitly scoped GeneralApiBearer tokens on a narrow route allowlist, with RO/RW and source CIDR checks; API-token management and Prometheus-token management are browser-session-only." }, "servers": [ diff --git a/src/admin/web/app/overview-samples.js b/src/admin/web/app/overview-samples.js index fe9454e..e86dde1 100644 --- a/src/admin/web/app/overview-samples.js +++ b/src/admin/web/app/overview-samples.js @@ -9,18 +9,27 @@ window.rustProxyOverviewSamples = (() => { } catch { /* Private browsing or storage policy: temporary selection still works. */ } let limit = saved; const callbacks = new Set(); + let confirmationTimer = null; const getLimit = () => limit; const trim = array => { if (Array.isArray(array) && array.length > limit) array.splice(0, array.length - limit); return array; }; - function sync(messageKey = limit === saved ? "overviewSamplesSaved" : "overviewSamplesTemporary") { + // The status is shown only for a temporary choice, a storage problem or briefly after saving. + function sync(messageKey = limit === saved ? null : "overviewSamplesTemporary", confirmation = false) { const select = document.getElementById("overview-live-samples"); if (select) select.value = String(limit); const state = document.getElementById("overview-samples-state"); if (state) { - state.dataset.i18n = messageKey; - state.textContent = t(messageKey); + clearTimeout(confirmationTimer); + if (messageKey) { + state.dataset.i18n = messageKey; + state.textContent = t(messageKey); + state.style.visibility = "visible"; + } else { + state.style.visibility = "hidden"; + } + if (confirmation) confirmationTimer = setTimeout(() => { state.style.visibility = "hidden"; }, 2500); } const save = document.getElementById("overview-samples-save"); if (save) save.disabled = limit === saved; @@ -43,7 +52,7 @@ window.rustProxyOverviewSamples = (() => { const changed = count !== limit; limit = count; if (changed) for (const callback of callbacks) callback(limit); - sync(); + if (persist) sync("overviewSamplesSaved", true); else sync(); return true; } function init() { diff --git a/src/admin/web/dashboard-defaults.json b/src/admin/web/dashboard-defaults.json index 64fdc4f..99f6438 100644 --- a/src/admin/web/dashboard-defaults.json +++ b/src/admin/web/dashboard-defaults.json @@ -5,10 +5,6 @@ "bandwidth", "errors", "memory", - "extra_backends_healthy", - "extra_error_share", - "extra_rejected_rate", - "extra_cert_expiry", "websocket", "backend_traffic", "extra_response_latency", @@ -82,7 +78,11 @@ "www_failures", "www_traffic", "www_top_services", - "www_status_trend" + "www_status_trend", + "extra_backends_healthy", + "extra_error_share", + "extra_rejected_rate", + "extra_cert_expiry" ], "dashboard_hidden_widgets": [ "cache_outcomes", @@ -136,7 +136,11 @@ "www_status_trend", "extra_cold_queue_memory", "wide_cache_activity", - "backend_rotations" + "backend_rotations", + "extra_backends_healthy", + "extra_error_share", + "extra_rejected_rate", + "extra_cert_expiry" ], "dashboard_density": "compact", "overview_samples": 600 diff --git a/src/admin/web/dashboard-widgets.json b/src/admin/web/dashboard-widgets.json index 72b77f8..88a24ab 100644 --- a/src/admin/web/dashboard-widgets.json +++ b/src/admin/web/dashboard-widgets.json @@ -876,7 +876,7 @@ "data_source": "backend_status", "no_data": "neutral_dash", "category": "backends", - "default_hidden": false, + "default_hidden": true, "display_type": "value_chart" }, { @@ -887,7 +887,7 @@ "data_source": "status_metrics", "no_data": "neutral_dash", "category": "performance", - "default_hidden": false, + "default_hidden": true, "display_type": "value_chart" }, { @@ -898,7 +898,7 @@ "data_source": "status_metrics", "no_data": "neutral_dash", "category": "performance", - "default_hidden": false, + "default_hidden": true, "display_type": "value_chart" }, { @@ -909,7 +909,7 @@ "data_source": "system_status", "no_data": "neutral_dash", "category": "overview", - "default_hidden": false, + "default_hidden": true, "display_type": "value_chart" } ] \ No newline at end of file