diff --git a/AGENTS.md b/AGENTS.md index 268e030..4e9abe9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,6 @@ # RustProxy source and documentation maintenance -Current source version: **0.36.8**. The Cargo package and binary are named `rust-proxy`. +Current source version: **0.36.9**. 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 300c541..ced8e38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,14 @@ 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.36.9 — memory breakdown card and row-based Overview layout + +- **Memory breakdown (Overview card, hidden by default):** a new optional `memory_breakdown` dashboard card splits the process RSS into cache data (object bodies), cache bookkeeping (index, keys, headers), cache buffers (fills, COLD queue/IO), free memory held by the allocator (fragmentation, an upper bound), code and mapped files, and the rest of the process. Chips show RSS / cache ratio, cache overhead per object, HOT object count and heap fragmentation; an allocator section lists heap, in-use, free-held and large mmap blocks. An "Outside cache" chart tracks RSS minus accounted cache and, after 10 minutes of samples, labels the trend as stable, rising or falling (with the slope in MiB/h) to tell a leak apart from flat overhead. Enable it in the layout editor. +- **Status API:** `GET /api/status` (full and `view=live`) adds an additive `memory_allocator` object with glibc `mallinfo2` statistics (`heap_bytes`, `in_use_bytes`, `free_bytes`, `releasable_bytes`, `mmap_bytes`, `mmap_blocks`), sampled at most every 2 seconds; it is `null` on musl, non-Linux and the optional mimalloc build. +- **Overview layout with row heights:** in a custom (unlocked/saved) layout, card heights now snap to a shared row unit — half the height of the tallest compact stat card, so stat tiles always span two rows and line up — instead of every card in a row stretching to the tallest one. A tall panel (Process, RAM cache, Network…) can sit beside several rows of small cards or charts with aligned edges. Each card automatically gets the rows its content needs; in the layout editor, the new **↕ − / +** control next to the width makes a card taller (`A` marks automatic height, lowering it to the content height returns to automatic). Charts (also with chart scales enabled), chart stacks and tables grow into the extra height, and a card is stretched over the empty cells below it down to the next card or the end of the grid, so rows end on straight edges. **Fill gaps** packs blocks with their real heights. Small content changes (for example a growing table) cannot make the grid jump: a card grows at once but shrinks only after the smaller size is seen several times. Below a 700 px wide dashboard, cards stack by content height as before. +- **Preferences API:** additive optional `dashboard_widget_heights` (widget ID → 1–32 rows) in `/api/preferences` and dashboard presets. Older documents and presets without it keep automatic heights. +- **Upgrade notes:** no configuration or database migration is required; existing saved layouts receive the new card hidden at the end. Legacy (never customized) layouts keep their grouped rows until the layout is edited. + ## 0.36.8 — editor forms, toasts and CSP fixes - **Editor forms:** the `pattern` attribute of generated ID fields (vhost, location, member, listener, stream ID, error fallback target, affinity cookie name) escaped the hyphen incorrectly for browsers that compile patterns with the `v` flag, which logged "Pattern attribute value ... is not a valid regular expression". The hyphen is now escaped. diff --git a/Cargo.lock b/Cargo.lock index 5a9a9c7..4e19708 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1943,7 +1943,7 @@ dependencies = [ [[package]] name = "rust-proxy" -version = "0.36.8" +version = "0.36.9" dependencies = [ "anyhow", "arc-swap", diff --git a/Cargo.toml b/Cargo.toml index 765de23..e9fef57 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rust-proxy" -version = "0.36.8" +version = "0.36.9" edition = "2021" rust-version = "1.99.1" description = "RustProxy - independent reverse proxy with local administration" diff --git a/SHA256SUMS b/SHA256SUMS index e60ada2..b9e0b9f 100644 --- a/SHA256SUMS +++ b/SHA256SUMS @@ -1,579 +1,581 @@ -61bf40a0572889dc8b0dda9eae4e93e44b0de9364b3c798106c85700ffb37c23 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/.dockerignore -4140a2956264b44f259e6a37fc00ba02097bbe68b09296e04d3d243c1287129b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/.env.example -e76e688874828e3743d03693b1d2872b9633b4db09909673786caf30f7cfe489 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/.gitignore -f5c2aa12963c54c15b38b14af7ba2dbd22ba3e32ebe33519aac3dc6cd60a84ce /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/AGENTS.md -0cb61ab5b66f418ffa521ca3b1cf7fd92c4678813afeba76bdff3c6bbcdabbf9 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/CHANGELOG.md -c43749d6c4f56ce7e5bee5820c7973c3550480a208ce44d68e73485e0b47bf9d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/Cargo.lock -f4e5fca45bc7035dd60901d6a2a67a81a924b10c83178d110bddf6250a38978d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/Cargo.toml -25c7f3c8162cbf5cc156439774118a81dae9fdc52b611ec7e40c230fc99a772c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/Dockerfile -0d96a4ff68ad6d4b6f1f30f713b18d5184912ba8dd389f86aa7710db079abcb0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/LICENSE -82d1dee2fc68158f0ea73259151461e64c8b18d807cd1fecfb1ed99dc30cf5f4 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/README.md -da8311e3db945290666324a2f24bf4521b365272d7ac3f862ded1be993eea646 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/UPDATE_CHECK.toml -c0df6b46bf795d49d00fcd9e2a9247aed0d3a99b6cae1dc5ab6614e8b3d30009 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/build.rs -95ececaba550a4bcfd6754073877ba0633373b1e1451521b9ac905a51e8ca6eb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/deploy/README.md -13d514de5042a230cacf8c10abe1ef183c94ac799a89b8e2c111152ac7c69b48 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/deploy/rustproxy.service -c111f5b20484707b80efb7dd9176acbaa27b63ac78db497261ac234821e1fade /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/dev.sh -d213e774a9cd07bff0c79324722bd05c0aca18cc033d50b2c0558cdb72972bca /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docker-agent/README.md -e9f18b358a740f1fe16e369ed16ee37581b8ce4c94ddeb34a1a37b89a49b5a06 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docker-agent/certificate.go -600d5aebc8557d6987158969d494bade1ba46ccf9d1cd573d357d0106db26b2b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docker-agent/cli_test.go -067793eee01fd284da66f79c6f8b6f19f8773e64f84af03168c8f751ff044685 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docker-agent/credentials.go -5e4f565c3c9de4dba897af2e801ea646a83395e72eae4717a6d502dff2fcec10 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docker-agent/docker-agent.env.example -ae660c2a90f193167b166977277abfc86a25e043ab4def4c273b2a13d5a51b8b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docker-agent/docker.go -9e9f3f17f38f9b0730f598f65988ce8ef562d2182ef6778fc7292b990e9cf22f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docker-agent/go.mod -7b70bd43a7f39bae8968decf4cd76af80fe0d08bf1bc53b894d89ead80581d56 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docker-agent/install.sh -b7d0466f70b541a705d234fc8a88b99b6197fdd5e682d3a288a78c76764358cf /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docker-agent/main.go -d660f46f7ef8c539dd3f5486a31d5a1254b9737be8a278c7f9352c254558f8ac /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docker-agent/main_test.go -351bcd0321c823694e12d578f96dc68ceb929979a70146d12af5394f639a486f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docker-agent/model.go -e52b31d0abf65ae3034f6cb367cca113633014ce8d1d799ad4dd5624d2c7b8bb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docker-agent/network.go -634790f35ff4627df2a78cec2ed371f6e9ec9df00afb386075595fc7f3ed72eb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docker-agent/rustproxy-docker-agent.service -5220d669171ec3ad65f50e0bc8de5178dadaa4904def8e1a4f61002aa9e9a55b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docker-agent/server.go -60d108fd168064e4d6980ed7499f3219017f9878c743697e77f2efc592e4d629 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/ACCESS.md -5a8821f28a1f529263db462a0ed1f7c082ad91b5936491806913e5cb5b274fd9 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/API.md -728b15b9825f547f34c4121219784798dd046fbbdd72ece8906d0cd77e8efc64 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/BACKUP.md -4fb55a549535f37467f14536cbf0db7be027ca8a019c2919a384af4f23655300 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/CACHE.md -5e7b6668be6bfec77755ae45b9d369aa14135fce7632de392c6b29a7b584245a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/CERTIFICATES.md -02bb383b5c3bce22616c3cc3db30a9469806dc16decb509973e84c60aa30fc5b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/CONFIGURATION.md -fec29ce846d6705eb45819d85d382f28e28a146b265feab2e4c7cce2a35e5883 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/CUSTOM_LOCATIONS.md -9c54b8da03adb1bc1a3db96a72fb99924dca25eed5ac662989aba18ca226d066 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/DASHBOARD.md -11a08bf2110bbeabc924eb049a30177a216af5607ccdaf8be9178e751f78a2c4 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/DOCKER_DISCOVERY.md -3e7e63d1d8f5d5019d5e4fdbabfe44fb39c2b75e7141d9c94846d946f34849f2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/FEATURES.md -2c5f97b12be53db32c7e2888d23c0ef1d82d1742df44f7e60ea818dc801a719a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/INSTALL.md -6e37859bf0dced99d4a7db93790cb38fcd90191932827946d5223eaa4c784fce /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/LOGS.md -0e9ae9509a78d00951d2c7c3f13eaf518d1f3448a29b048f5933e1f5f8440275 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/MIGRATION.md -0972248b7062b37e61edcc34dab5fe73ee9bb50195a0aa475c72efa0dd311aa9 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/MONITORING.md -e2e8fc307885bd02c177aea5740b2ac767fc7bdcfe7034dd75b8646f3014b39f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/PERFORMANCE.md -d5894c07c68ec4230987767198434abee13b0e525842fea21bcbe752fa82742b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/PHP_FPM.md -954b1602c865e157c867f1c81dca615f2beaa33c34de0b0fa8a6069db2aae7d0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/README.md -490a6dbe870f2b1fd4ec7816768dde6c86fa7957fc9de2d2f075e123c9222222 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/RESPONSE_DELIVERY.md -70e8c8f3352629f5600537058b1997739d9e465747cf3051da8a2cc779c3b728 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/SCREENSHOTS.md -3a48184b36d225757fc5e2d22c629f89bfe5d4007ff087f0be0ce02a5fb04c28 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/SECURITY.md -bbef60ff1771da9f48af812987766e1e479408873ae2f079b13f1d5c62ecc6ff /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/STREAMS.md -8cfcda59060106151f13e93ca25c1280b4390433b3fbe2921a6eb3c13bf9766d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/TRANSPORT.md -be6e8af62a7bf958b94ec15e9e3263263e511d1d33abae4e45d114833fa52b07 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/TROUBLESHOOTING.md -b4abb86942f665230904fad570c1487bc173aa84633801e2999f2bfa197de4a7 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/VHOSTS.md -e67928a9d044e71b681c3e52f9dd8b151d6b72f965d16d5da8b0eadde98b70e9 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/WEB_SERVER.md -3769f97c74b1a4a2f14d82a6f9c30fa3ee48892f423bf82dbd2ec1bd9280e45a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/images/about.png -a85a7b9d8cac74fb1b231471d313e6587ccfc2e8abd2885a79067704176c724b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/images/api.png -1ec8e47b6c10a905d8ce63a060be3f51efa3bf2c12529456a8c3d3a0653db95f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/images/cache.png -02b4ec5bc7e39aeb8f8928a015779b431ee12c4c16733954631de0e6699388f6 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/images/certificates.png -40d0a4d28c3938612c93425a308c895dea0659f50c661849ec5bde606a141a97 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/images/documentation.png -6e7f634d6c0cfe8f9fbeba129d745fff00cb8bc6f388de10c4c158ae4a854a17 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/images/login.png -1f921d98aa16da3a43bdcaa46ade68eb921b1d88d95a8fa87f0b51b6f2a8db9c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/images/logs.png -74c23173c2299f8ee150fd8fe160ffec0cbfb5f63b89d8debb1789fa4526fb19 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/images/overview.png -585f7f450bb7dbbf32ce146edbee6555f849903d1abbcf665a75b5fb12ef36b8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/images/settings.png -fcfc9f1b932e243e2133061aa996d8ca6f8fede830190865b771482f4ab01ca5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/images/traffic.png -d50eff63d8c11af616a794d24967ca16a2ad827d9c3ec47299d578419b3c449f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/images/vhost-editor.png -bb977580c5d93bd7f2eb931c795ae7f4b8676f316d0fbd1552f78e2757dd79b1 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/images/vhosts.png -28549d423d6976181d9b4ff9e13626ccee3b4c44db36d442eb6b3e20e9f90d6a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/docs/images/web-server.png -5502e8ce44276213803b66c58e3a4d804a1354f5ed5d83f47ee805e8c44ab088 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/examples/acl-headers.json -2431dd88a2d9ad2cf3cd4b8fcdfa602563ab1013c612d8917fddbe7febfb2dc3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/examples/cache-dashboard.json -e31ac05a99615e4ea6c4c9a8b2e090968583fe3959f838a600b5740cb170f8c5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/examples/config.json -39cad993003930febf98460311d185a278e7a9508b6b591299d9339d0f0c51cf /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/examples/empty.json -695cc7621aa403148fcd0868f351b6e9ccc076fe35610e779af4a72f94d7d5f4 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/examples/http3-vhost.json -b26833cb4251f9390a44192ecc827ff7f052fd19016a5ccf7498c94503ab4ce3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/examples/mock-vhost.json -a6b835dc07defc12b8f0e48491d5f413843c8be2ba4501d7c28140a2822b034f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/examples/oidc-vhost.json -134d4a59727b27accb3141d4cee26a4a74157d236de4996bfd682e639462b2b5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/examples/tinyauth-vhost.json -5a8f3a8a054abc89c6e78896b9fe2f903212199a24dc3d2d2bcbd0696a31bcde /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/examples/transport.json -d242de9614fbb52933b4accd32f4715ca94107abe4a3b1d7e088362b07a6ba60 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/examples/vhosts-balanced.json -af2bdb1343a8141069e94ccd2c7f92574ad848437e2f9fdb5c7576a9a18ef4a5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/examples/vhosts-private.json -35e4f3acc652ac23a9442600c4c76173ae34966592031b3e942b62c249fc869e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/grafana/README.md -0d389faa4f64f095e9ec62cbae329658682b96f5e4d02ead79c7d2892ab89fa8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/grafana/rustproxy-overview.json -1a041c505669625a7f0f8011484cf5b6d2ec69a7de859801312e4fcf4c8d3555 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/install-debian13.sh -909e9ab94617ace74a425f15084bf85f3086cc52ba5b28f2b441ff800abc6ef9 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/install.sh -42f9f1d18c021fc7734b5bd020844bf678725a0e539e2fcbe05ec676f6239eae /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/integrations/README.md -ba753f69557bd9fa990e56beabebccf39f93b5f6fb7e66a2e241c8c461dfd763 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/integrations/opnsense-acme/README.md -3a1f8c326618a4613bb35f9e83428f6d1cf668b9e37b4731e5d38c3081fc94d8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/integrations/opnsense-acme/actions_rustproxy_cert.conf -de6550ab8f48d556d752c252212c38ba65491fd224f972c10fbe552f91ed7520 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/integrations/opnsense-acme/opnsense-rustproxy-cert-deploy.sh -73784ac652708b04ca6c91aeed4524f51f50d63715bbeefe7f5590b353e78943 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/integrations/opnsense-acme/rustproxy-acme.conf.example -45be151cd85fc2ef2f1fdc3003ace63381af262e73af8a685ab48cb697cc0de1 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/integrations/routeros-oci-build/.env.routeros.example -11aa102de1089ecc375f20c4bd5420fcfd3b2ef23fe0c8bdf04953fcfaf40ef0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/integrations/routeros-oci-build/Dockerfile.routeros -7c7a3e51f43b43e1c962a4b0bb591f99c1f06977bf77f23719f7f867dfe7eb8e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/integrations/routeros-oci-build/Dockerfile.routeros.dockerignore -cc8ad6a18950d5537495511ffc714a231bc88652310d1f8f780b9d791ef12d07 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/integrations/routeros-oci-build/README.md -3f092a9ab80221eddd67be4d1a776acbc6e04c1eb6011b588280c28e83b2582f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/integrations/routeros-oci-build/build-routeros-oci.sh -3f267cafa16006e5456ade78ee2d5fae02cc7ce747839523068ffd8d7c98798a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/integrations/routeros-oci-build/docker-entrypoint.sh -13189fa546c3488dddd8efc80c47f6da5241e5fc28b79cbfe795414ea05c7a4f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/langs/README.md -1a76059e9a51a0829af0ba784c6779484a0567ddd00f333e40c7fe25eaebd1cc /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/langs/en_US.json -c2ab2734f68e988d5000931bb3ac7914a6f903dc256a329a920f695e422d53e6 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/langs/pl_pl.json -8ed80f14633970899d56f4ea72684a8d4b1f2843c1c78bfacc4cbb5f7ce9ef4b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/make_zip.py -e830d37dd1f81a4b0aa7d535f5bba69e34e433b0fd99cc8ee0b296786c32379a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/migrations/0002_admin.sql -20112cc82192098b8d602f1c4f7ca08712e9e1366c845fabb92753187c370d35 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/migrations/0003_certificate_renewals.sql -5c62da30fa9db594a4d656c77ae676d3c388072b6a85f91170ec7d911d7cde43 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/migrations/0004_admin_preferences.sql -57dc28982f416874d5d00d1d438a18846d1ce35cb940c4bcf67fd9a8bc57339c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/migrations/0005_certificate_api.sql -faa7e50922bf180c363f7627fbcfe8079831e36282220d17481cf69bc64b57f1 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/migrations/0006_certificate_api_credentials.sql -f093aef9639a959a2522946995a02d2e67c464e794c3ef665261a9a5b348c968 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/migrations/0007_secret_store.sql -90f6dce865496e018c047133d3bc1721fc2a19b2f4ced22e2a3625d9e9ff18ac /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/migrations/0008_config_history.sql -fc7585fdcbe99fe3496f0e62f4c4e2161f4a0173222ba4950331aec6c44e50f8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/migrations/0009_certificate_api_grants.sql -d58a464870895cbefcaa2b4adfd6fcd0d5182d19f2528eef6509e190046cc9fe /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/migrations/0010_dashboard_presets.sql -e56ac3718ea7d73fd9afb1c3b44ca95c9bea424c32166e37ce913bee0e67a277 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/migrations/0011_tokens.sql -273ce62a518657853428ca44dfe4dd2a56abbbbba684e905a2d0147d08359888 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/migrations/0012_admin_preferences_size.sql -478220552ffeea3de00e2866d427d9f87f4cfc4ae5232e5c3a774e62425b1e0c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/nagios/README.md -91233910aa4dab07ae917fef93d018a7a0beaab697f9a0bb889ac613e595cca4 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/nagios/check_rustproxy.py -a42e01b341725c9da0928edf40c8c3b9c814ef90592f208c52b1f2c56a2ad383 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/nagios/check_rustproxy_api -ee50f38c037765fab742e888d4b9fc4d874c31c785c6064d4eca3d2c4d24d944 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/nagios/check_rustproxy_backends -1465396cf1358067e9fe48b3d61f28fd4ac65c577b67c502950ce6b42ecbe3b3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/nagios/check_rustproxy_latency -6e036f736a2b40feb78eec17bf34871771524190f283591d1c89e48e6d2271e6 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/nagios/check_rustproxy_queues -7458b2d74495e6fb1c1edeea4d5a793705476431dadb60627187111f91441e13 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/rust-toolchain.toml -fd1c34599f725ad5f7c3c0cc89e08b11917baef02c83af054ac8528b2e01dd8e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/README.md -1d63e9cea61a744f1bf2085cbb7c3d8755b3eda1569c8532574dd4fb6a840678 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/__init__.py -292c65ad2a7f0ca13da4a00a836df17c3192728dc02034b75a6a70eb6b5eb25c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/audit_css_usage.py -5fc5c7f274aa5a6c07970f7b2e548acabae3dc2a24d598308fd768a8d9de2510 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/build/__init__.py -c3066f40f152a2655f88314fd9cf784eddbfa6c3238a494da13d972ef9ad930c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/build/panel_css.py -2bf1851e3cf7ac576e38fe4e02532898df2ec11ff8e802266c1db203f29f6a91 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/build/swagger_assets.py -e4d15aa6aa864d04b9b30aca33826b833632af02ca643f8b23e219a5ea1298dd /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/deploy/deploy.py -f0edbdca3af49cfa8f9c118d3eb0977c99569264dc5d74a85c4610234ea1fe88 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/deploy/deploy_core.py -f26297284e0ad9fb4e4317deac24b25de819c10d04fed551134ddb6debc41837 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/deploy/deploy_runtime.py -a59587ce8ad41b1bbb431356b58398f9c8ff7cb96a613a91752e907a70e10c2e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/deploy/upgrade.py -2cc658faaa610b21b48942c59b955525539ad4503fd60f2a49c7e626a22faaff /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/migration/migrate_npm.py -a459d95bbb0076f33ade8b273b813308167f9d8d45242b309a2d18320ca0093c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/migration/migrate_npm_api.py -4c905a387f210c30fbf12a7738676fd39819bc96bc4a272da1db5f18a2d3013e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/migration/migrate_npm_core.py -960fdf97ec899107a567405e9b9c2b70ee16951d5ea26c37d885a7920f7b3aa1 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/preflight.py -3d6a0503afc25beab79ddc86864bcbb15248ded7368d33aa64321b8cdff59933 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/resolve_dependencies_0312.sh -d759315babd9971b354d6f702d4c861eb1cd5c41b1e2e0f1a94ad4d2c2db49a3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/runtime/acme_provider.py -e69813fb1d3a4cdcfb7243964cc323fc21a603087bf2e84188fa42b9d3cee4b5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/runtime/acme_rfc2136.py -91c883cfdce94c8c22c98749f611317f538a112d29be4f3fb1fa460b8f29ceaa /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/start_stream_backends.sh -046b4282550f5cb4e53906665c91c7442be70fc68fd0743466fd832582f7c979 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/test_stream_tcp.py -f0b48ec0cc4411755cc0b4128eebce710375afa99344cb76198cf31074f8eb63 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/test_stream_udp.py -22e880e98c7b9d700c7a4c02b9b1d543e5dbd1f4ecdca42813a1083165b32a19 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/scripts/version.py -1d55ecb2e104be1d3b19623a1380584724c106ed234d2e79fd2a2fef1d891ee3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/acl/dynamic/mod.rs -1eee2ea2c8dd6068dd0bbb058a06d26436f14767d8efbc2010bbdb4e3e523672 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/acl/dynamic/tests.rs -50d9a0009cdcee6dd34a6215755d98f38ea18fa39b9faf070d1a7649eeac6aae /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/acl/tests.rs -78efae6c43732c0f5527d467bf07d1f890da361925416c89b58bc449d852fc2b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/acl.rs -b9eff08fddf9b8787aa04e72288ea2ca0033965e4563d060ca51f267e4963918 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/acme/jobs.rs -f7f737aa28d2d209f4f20a221885e3bb3596dfc8e3c8c9a22ba53bb975c52df8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/acme/model.rs -b77026ad33be84706112881dde840e0fe4694b150dd3087d8e106737d07dd464 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/acme/providers/mod.rs -d1dcb7bdfb7cfdc9c3b88cfb6908201c58532bc888744a13f45853079f214659 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/acme/providers/tests.rs -c51fd51177a476be6462ca980e9bc13f0d0b41538f520118b80a685130f0dbf0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/acme/runtime_bootstrap.rs -5a684eff5f3539c7bb8f66c3b83e7fb62527c52c61da727079d3897e0943f952 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/acme/runtime_env.rs -2f02b08d88ad3c1fc9827e5bd3ef463effba633834d9c05e9c0d6d2a0e8869c5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/acme/runtime_versions.rs -cfc13a293c126bb511745859669719a14c72dd7ff6be197bc9e0d0e560deebbd /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/acme/tests.rs -6189029ba493982acc38c9dc1f47fa1f0c933dec5ecfb95b60f8be83d33b5aa3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/acme.rs -b28a08ea996befe10949676f40fab5f1036a274c7d0ab1175cf5c43c59849dc3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/access.rs -3afefdc6640d35bd55f20981e842647573f1ba80248680f99ba79eec9a7c4ce5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/api_token_access.rs -5f5b150bb8f51f57462e519650093354ae7b40fcb80c4380fd3391a33f4b30f2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/api_tokens.rs -34e851f725e8605e3c5d9946e56ac035996f3bd9d608169cba3408060d229c9b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/certificate_api.rs -4a8b6406a44508b8ba102fef0d8309e871dbe0cbdbee1e6c8721baaca0c1aee1 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/certificate_inspection_tests.rs -aefbef9839f9914ba05ea62bceff1463da3042b52ee851181ee39d4fbf7b91c3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/certificates.rs -521ac794501570cfa2e8e50c3a5cec2ca08ee4dbce8ac9c0e0310c09612f1062 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/config_reload.rs -b7b0d3f0df7683b031136c05b314e206f7864e70514fe25165e41fd7a9382854 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/config_sections.rs -b1119d6e713fd3af967f0058b2af9ae5c3ccb9d0be66454872e1f6cbd1a7d552 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/dashboard_presets.rs -928ba7aa54ea742877cf267ee7ede798f95fb75839f21492063ba53e5e989882 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/documentation/documents.rs -b9c2952e3fcfca540d0ad64f2d3acc5c1f5240e707f4f23ef4d452f46fcb520f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/documentation/tests.rs -aae1ca0e70d987830bd63948d431f54302083148177c1b551565be12df7fe771 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/documentation.rs -1ce779b84aa8f47bdb3c34f83593c1f2f06d2235f0319847096cfcd035434168 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/file_log_search.rs -059218501907355b22bc84e7e0c41ec72565af283f5e97170ce7707ea5874009 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/file_logs.rs -d58a2ed83319176de4e66790ed292447c9497ae031464ec55cfe27174acb639a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/file_logs_io.rs -77b8c05645969834cc8a58e249a7b60a57d6c47ad1c5cd92ffa5e4a9b5a8e73c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/file_logs_query.rs -743bb7436f77e04015328a0e7e7d425e43ef8aa8d61467bde157e462c1dcdc2e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/logging_api.rs -243f4a9c3fa99781e19c3952354d2632c0ce65e1dafac729567cbe3c177f94cb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/mod.rs -7e585e45acfb3be01c44e85db1ba091d62558ae64cd16ea2946586d68903dac5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/openapi.json -f7a356109786635dd58cba590c71c796dbf36b47f25845190c75ee5c6a9fcb86 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/operations.rs -257d93a29d0bda96462bcf695aba8d0ec0f9412c379e066ec46ae8ee034e3a53 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/panel_assets.rs -f5127855c2994d052678865df36d703b74f4a0afc633daf7718b10da18d26e37 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/panel_content.rs -229efd2691e51755f402ee04bcd9b806e3d3176c39526b9f7c2381ce779a7ba5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/preferences.rs -35a7f99c7448c90b8637f4b3a7becca138f1f378fe5dc3f87122151525bb20f9 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/preferences_columns.rs -41b23e7114170afc2fb8e818b41321b5044debd8a6ab12e6af128cfa0cd4d9f0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/preferences_tests.rs -62ecbae5dee00aeeca3eb806e2605372471dfab971cde8f66f11e711df8fcea1 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/public/mod.rs -7a00e4ab943f74d2b1bdcbfab7f9cd3f584e9f59536b4aca6c4c31f5f5508d12 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/public/tests.rs -6930b4f4b45257772b321b20a9becdf9bc4610274852948ba38c2d0cdf02dfaf /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/refresh_preferences.rs -fb4ae8f958e136f46c50a3db8347ea10123c2a3a775dbea7e261aa0b3c7e7994 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/router.rs -e135431cb078ddb483165581123c64af8f00ea67acb3a395ec3e53c85d0d0d45 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/session.rs -7aeb784a3ef58795c8fe26467bb4e1a00e61420911f798a584ab09c12f73a754 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/status.rs -2d5b4c28fd0bd48b06890fa8ec44a2296de948c1f88eb2909f4b495710d4e13e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/status_live.rs -8315c856cd50f1072593ecb30c274d42d82f078b5fb93e7c68a8857cd81b0841 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/status_system.rs -cadd7dca29b9aad8c77c7bc23dd249ea37a15adfa4d636a8ef00273a91ce35dc /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/tail.rs -d8693d5341ff5be2dcda5a12bf55f173773cb9eb642862d9f4b03c4760ebf8fc /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/tests.rs -c18c369124368f58524652565102817ed69fd25b222b0c5e737ef7632b45dcfb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/acl-picker.js -48fcd818c522fe80f2c7b2e218f87de6a7772ffd0a24e93502780b03ec78e335 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/acme.js -86abf50f39862d821cd2e43ca425671aa85289272915132c5a9a5dd1fc4182e2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/api-tokens.js -faa9735c2a02746b2954bc4955eb609f94afebb685cd5521d2629640cea2777a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/backend-dashboard.js -aed3aea4eef0011c6b51d39736782e7d1ec52662e422f40e0c7b9ddfc19d0378 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/certificate-inspection.js -f6b0533ffd6d0e6471519120c440619a7fb4b255854ba3dd23d81cb35cd21afb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/chart-scales.js -e5b39b5592ba81292571033f26934ac0cd42bcdca7395e91094973cecb3eeaf8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/config-history.js -7409fe1ee03b1d35d0ffc55827010befb4323bb14c594914aea49ebdcb88a5c1 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/core.js -d695ec90fb5c98c27d7ba1d2bebf54f9840985fc530efcec3fcaf48d74b36c6b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/dashboard-inline-layout.js -8eed7cf2f5004bf89693eff57af7c37a7781afe5cff25e199ffab9855d06b7fd /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/dashboard-layout-editor.js -a184c50e1ca6bb5a14954e31b15f09ff9978fb939064ca724851bbb4e661dc56 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/dashboard-presets.js -0be1024d9ff657044e04ed71f275cff3b432406d5fdcdeac726daaee54444abd /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/icons.js -e5a92fa1cb7e049082f0764b245560c41a9a34bcd8a9536fd872d9169fa5465d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/logo-animation.js -32aa11f041eafdf16e66adef6f5847a67413785224da2c19ecbf825996622aff /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/overview-extra-metrics.js -5e62cccf6a9507fe208e9f41bbd08453c3d8c6a6b83c56d93a2bb22550ea6e9a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/overview-masonry.js -4d1d4760cdff44771c9d880a7c0da81d7233ef6e3a4868111a522703831a7a54 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/overview-samples.js -db9012546cae8c58fc2bcbee71c9a95956a13a6db9e6d126c6a3770d45a4e4d2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/overview-wide-metrics.js -bfd9fafb3112197e8f875dbf87a9a66c81aef0fe83687601a84a66f5e13f69bc /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/path-permissions.js -e540119edc555cefbe5147d97e06527adf49c984ba7a4dd51dc67603d3a46041 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/preferences.js -9e2b12d34ab1fb29716645720577ad49b16c03b46c482a03695e8f645d170e79 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/rate-sampling.js -3b8e566d81a5b94ef21c73e7805ae128454f085554de9358040de266bcbdb0e0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/refresh.js -222a735d8835dd1715867cd519a7f954a43028c257f284667fd931596c12e16e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/runtime.js -31201586925e6f4792071d7d03fb05dcc4a69a03c02a4e85eb0746f45af68074 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/session-resume.js -c7a18238ac426de4d1cf84a395ee4dc66410d60a57a3822695dc10adc668d956 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/settings.js -b7ead49224a4ec67181d3f24f9d9634bd6d76756f826a4d5d993300637d1d8f3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/stream-dashboard.js -7de070cc8cdde45d7e0932259299e341e25b32c9ffbd87e4fcce934d0f090de4 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/app/web-overview.js -f87af546830f01411dcf93749b4f75ca0f0bb3745a3390eff73ee14fc768cef0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/cache-panel.js -9f323507649910561518b63cf6632e81b3ecc4b09501ae53b635705f34ea6587 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/certificate-api.js -4810137aa4217a86770617d442cf5dc6bec0d9f19e20bb2155e932a9a111cedf /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/css/00-tokens.css -84584a08df60190f39c3d3d39c4c30fcd53eba6980ea1f237e28f546585bf588 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/css/10-base.css -8a1996d37f138790c12a704deedde9de74f733e7dcbb6be816fd68c281e8e0a9 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/css/20-shell.css -a1190c53dcda17614db759820ffa7baebbafc23cda13ccc5935b9d6a675b403d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/css/30-overview.css -ca93e41d1c6001d82f4891cacdd712e896a0355d6db9f76cf62dd2f2225a8674 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/css/40-editors.css -87df062d7478176641364c07de396ca988a37b1a8bcb892b53cc578fe8471850 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/css/50-settings.css -74419f367c4128824ec2f0901a99f54f68439d5d949d41d9cf3d6bd57568343e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/css/60-monitoring.css -aaeed9d44f578bb6ec931f9244621db1d1767b99aea85792eb8f818f439d32c4 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/css/70-responsive.css -8009afdb04d5170687816730cc930a22fead1fe0248835ca7e8de81d6907395d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/css/README.md -8241bd9489dfed082863948829a44a49bf0a8e9cd63c55809655109e393e0918 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/css/manifest.json -f6720722581aa70ab1fa69b298b4c8a4a1596bfe56e4783f9284d69a3586aeab /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/dashboard-defaults.json -cd57b89a363b6a4acd72731dfd534524ce98b9e2938f6d20cee660063b5d06f5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/dashboard-widgets.json -50d1ebcbaf4d0b2968da23bb943fc3f67131c5d32df3f61d23ff37aad9da5b81 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/demo.html -bd170341634d7fe98172e0714b3cb8ee299a31abdbc9ab1309f5e61816dbcf0d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/docker.js -fec062a5959450b1711948adf3189ceb37edca6fbead2e5bfc03b7ce397c70b1 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/docs.css -aeffd403fa1823df7d9fa4c48280b4033b2d15e4cb9f66608caff89290de0a52 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/docs.html -fd8506a91f769b57b62d9d8e389fb67764599354bf702958a913be79f779707b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/docs.js -8fbc2a837d6f20a7f96c856a91fcba967b40a33494fe27ec876ee1b3b685178f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/drafts.js -007c24189ad7b497d4da024fc52e6c51393f91ee135f525a356e1f14882b7632 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/error_400.html -232b766f278ae4424705af351910677fcd7ac9a20bb8320d9a12b763c91219a2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/error_401.html -16293363c7848471d866092fec5e83023df087aa824989e87450cee7b7ca1263 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/error_403.html -f7d0955ab18c15e04369204e789f341d2e832f927c1ff20a3b2b9e35e7898f00 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/error_404.html -64126ffcb39dd9bac7772fe737267f8d9391ee6b750d8b84f024f87a6123db3a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/error_408.html -4ba01f7a53e9ca914e7b2100c1d439bc56e46be698a9c020dae20159759120ac /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/error_410.html -f2cb26eec86b6c03151072f847153df8aea612d840ca8b76367f41b9605bce64 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/error_413.html -7dc3634e3d508176545936f77db9deb3dc51f0abb71985e1950aa91b81b6f44f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/error_429.html -6fdb616c086b2769e3b484133415a6f8e9274a74d03ad95657eec480b3a28b9f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/error_500.html -ff72fc4c6a11907a16234c4b3c7d7f7bcf82eb72868dc3fbf654b04aff806fc8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/error_502.html -386b9dc3aecebe7727f7cf7bbd2a02ab036a3abf01315975111a51559128df73 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/error_503.html -e6c4d91d1542d0a5b47bb8736f9539d43a6713df5a473b635519d5b7eac2eb9c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/error_504.html -003d382cc8dd69ad7237679632c04a9389366bb71dd7dca8ee64ee06614aa9a5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/error_auth_provider.html -0a5fff35555153f59d4346933030a67b6e1a8768cee7a47cfa2fcf1a2c564f63 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/favicon.svg -7cbdef9192a9dee1f8eac42b85f52b3190f7f6efae50004aa7ad116a910e4036 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/file-logs.js -882e99059bb2ff110c452eadc0b5779a16af1e34cb1b2536c80cf2056f8c3e8a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/host404.js -6a1c94a2b35a10c7aa406e73b52a5e04a15ff229e0c6d358cef8d607e6789c3e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/index.html -5746049029caa135646ebcefb3d419b07eda17b560a9c015c59d27f815df64d8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/integrations.js -7a12f020fc587205694978ab41b660e9a80487d413fbf6e34fc525eabc58308f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/login-keys.json -ac9f667273918e18406df06cb2613c923f50a88897693a03a18f500e22dc6ec2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/login.html -c2e5f554810b8e34fb47361fb90a01073a2e332ee26d82e030956fad3ec1f83e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/login.js -44b44790341067304e15974afcbbc7cc99686e88c2e43f62979d285eca6f726e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/management.js -1f3d10e389c9c20e6eb019509fa6e82b50c6b43bbf988c1210a4d42bb73985d0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/partials/overview-charts.html -f619250d8da61517eb2151f17b640b06057e091640280091e08afd483d67e5ff /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/partials/overview-metrics.html -3928afce2ed6d5f2d3e29475dd29e4c3bd3c6df180ad5119beaff0c7a58e3b3b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/prometheus-token.js -6f33915d33d3a8bbfaeec424651a63eda3d23b0f296ae028a59ea46463ba9fdf /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/redirects.js -76a01f590d49649dcb1f554c221290919b2a8438e6001737f3c096fa6daec74d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/settings.js -8eadbada619b15087783dcfa0e889a81f88e78034d084c5ab616f7912b835940 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/status_200.html -a5191e1272939014a21b8d16588704952e9a705b02bd87fd8f8baca0a64ca919 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/streams.js -ae0259cf32f53d69a22a640b1c34562018d4ffb3864494012de3a31c0bb4ac1e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/traffic-panel.js -675ea169d4cc55fda5e291af536338b882bede1eaa6c9d5cc7dfde0779c7c4d1 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/transform-panel.js -1657db2c683292411c53e4bc0f67784529b7bc367552901d013e2c88793d613f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/vhosts/core.js -3f5fc9649801d091708e495634192fecd76482254eb671551427d3ee580eac65 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/vhosts/editor.js -3776f72d7051af86ac5fbdd4581040dd88a424c0c6cde789301b032b159094d8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/vhosts/health.js -b3239e67901f1796d7a974ade0796f2e3590ff8064628a5629b78c7f6ce2f32e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/vhosts/protocol.js -8c3da49973c62333559b0e3588c02beb0b425c025eac5cfa82a1bb968f70d9dd /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/vhosts/rates.js -eb9d692cb0437860bed0da512e321e458a3843216773fd486dd1c1f57287cacb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/vhosts/render.js -4dfdeb7c73c2775eacaca65fd8ef1dc80b275421b15522d319d338f5b96288cc /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/web-server-profiles.js -9e8e99e3cdfc32097d0c63dabb19d1e439b3be2264baa67678b46715b3a5bb4e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/admin/web/web-server.js -2d40c2cb32d7365df0c9cd6c8cb6f0483c7a799786c648f4836a0d9740c6c5ef /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/auth/files/mod.rs -b2f948bcc3dbd24952c7b1b02d41d06757f49f0c38a78caf51f8f8a687d8480d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/auth/files/tests.rs -50ef648351271d78310e00caa6d246e0009171ed036a3e4e1144737df8c064c2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/auth/mod.rs -cc4ddd57a264d12bffab131bf04b5cd22df75d38b61e21ce669f5a8a97b109ac /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/auth/store.rs -745226cabb007819370fc6aa680995a03a8a13fa057dacfab0fcc21d0c43bbe4 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/auth/tests.rs -a4c14df927c22a7fa46023f25cfe48d3aa3c245bec97fce834999d9bcc8d75e1 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/auth_provider/choice.rs -514e99e0d3da21abd633d53872234bc4d7d0178583ab291e53cf4b1802fd5337 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/auth_provider/errors.rs -d3d9b756f8dd0444ce6937376f27fa2eae7eb4b9304a2ff039d272c929592bdb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/auth_provider/mod.rs -72a6e245cef078585bc39932033c05cd866ee518e9cb4e7b89bca87ce941e971 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/auth_provider/testing.rs -59e1af728770d28265198844b3dd5740328bcb1df96d170aae575d3d97ac42d8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/authelia/mod.rs -36f87348cf1fbe557f6e94296d30e5b36ae4817b6a18071767d96ea21e43f498 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/authelia/tests.rs -0137e66fb7127f1ce023b1c6cfe3fac3fb1e8be17f1de722f8ef4e66d2594a13 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/authentik/mod.rs -d4a388f0897e50ad26e1d8ea527eccdf656557abb4b88fe714cc2b1969d8715e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/authentik/tests.rs -5e8b1d7cf8280bec54521cec9e4a8cb9cdbed5deaca07e3a79c43d2336f22a80 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/backup/archive.rs -15213c87d4393739328ebf0eacfcb45f864ac12d7bd7509f750a241032f6c7e9 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/backup/ownership.rs -6edb5aabd210ff2d121e435815b5501c9eccbd7a8ba230c843c6335a3e24f94b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/backup/snapshot.rs -859cec0bcd604f205d7d8e14d1c810e33d97fd7cf00ddcc30877bcea7c5fc2b5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/backup/tests.rs -5293e1b06f82654929805b53b9092a82b7503a54b34da3e882a999c5f14ee579 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/backup/validation.rs -32a25e53ac9542424debeaf1b637155bd4e60abd8692df082729d81232eb90b3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/backup.rs -9158a2bbb303c53bd3d2c779d9eb6e4470d028c4f28f8e329788e9c8c830f843 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/balance/health.rs -458733ad4ec56d58112de6ffa3539ca7e9fa8311048a4e120da96b5f899d5dae /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/balance/lease_runtime.rs -bd693ea1d15d8da2abc08c6b5b50d42b693d9d4e9344205e9ad7ae779c19387e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/balance/model.rs -ced69832cb32e7dbd0203d74f5a9c60c2cdc682729f4c5e2c01e7c082e7adc24 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/balance/pool_core.rs -477132dd381e23f1be197c32ff58a0925f41d3e6aa63fe77c10973cefb2b76f6 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/balance/pool_selection.rs -d789bf40cf9433e2fd16409d112210fe93154588b1ac9bddc9c7f78e1db14426 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/balance/pool_view.rs -a361c341932ffd186c0b21356c91ab1fe8043f5020d40798266d15ae896a114e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/balance/tests.rs -eec564a7ef886d18ab75289025a47d62bb702f07d63f92d2f83b7afeecebbb15 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/balance.rs -ae06d238b1451328c751a511476ef39c012f3a397393f939ca02f96ecd0119a6 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/basic_auth/mod.rs -9a8858b7ff461a4d961ba701ca3ed6eaec15c3f7f05eef8e0e30edc63617605a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/basic_auth/tests.rs -90f26bcd36720076f874cd0a21230316b7303f68e23839e987cf51e13c23352b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/cache_regression_tests.rs -b75ff512a1c6344483e00d2c67578ceea6b5472c279da0246f3622daa68d7e16 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/cold/cleanup.rs -5fde9e9f77277d557372e4614264512804192bb51f3d2eae785988c17b2e7253 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/cold/cold_tier_tests.rs -3c3897980c31a69d96f9295689d1ae19f2190da758c69ee7a0541f4171288bb8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/cold/demotion.rs -17b2a157b03f43f49ed05f1f3391aef025a453b748056c67229cb3ceaa53bb7a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/cold/startup.rs -83095bc93132f306c537b31ba929669fedac99af3c4f133d0533b5ed7ac4e6ed /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/cold/worker.rs -7def03ace07dc38a4806277d75b6ce673d33ddaaf1c4855fa0a3372be1cf9489 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/cold.rs -c6c54984cf3460e6227d40d8d6917d7ca5d809ac364c80effe354c64133c765d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/collapse.rs -346fdb40d85627b583a01fa17c65e45c822dc7216198cdeadbb3d07904286fa3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/dashboard.rs -be3d80cd340edb47755190a668e2f2a2776940665f95ae7110893b706eb94faa /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/dashboard_tests.rs -847c660e6cb7d752f9dac2807c5045a000172c25b0e437cbade06ad7b101dcba /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/fill.rs -c1357a13658e1ed5158084d3a41ba9ea906512774a5863ce9c56cb508d3fa6c8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/invalidation/ban.rs -bbd9f372648d89b5e14d5b58029582d37f66a89752caf2c14eb1cbf8f24bb7a0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/invalidation/http_invalidation_tests.rs -6223eaea3f061b111330cc26b28d85b9b239bef30328025f2ef337291e22a445 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/invalidation/invalidate.rs -675d18afb53f25c56cba49bbb431fa39ecd9d7bdd192c7b39b0698225de7a2a2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/invalidation.rs -c1ee3d13b373672c53b5c9ebfe5c4b66b89f2f2913c328defd5cf6502f96a654 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/lifecycle.rs -c2e258da25fbf6df7da3de5a80a04d74e85c03ab22c175d7c9a6340b8ea1f1b5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/lookup/hot.rs -4148106b9baf70e41eeba24233b1edbe8dd6f927c11f2c7647e89fbbfb60555e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/lookup/hot_hit_034_tests.rs -e9c6ab0c2be9f96573f826e6a1b9e4c2b8b526f779e72e95a6463ae07e45ab55 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/lookup/insert.rs -7f02dc8eeb6123cb22307b76985b606afda2d87b7f845894685cfe4a9aee8b2a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/lookup/tiered.rs -bd831807ca4720b3a41a6ea1d9a6c0ed2d935225e2dacbd9313be064f2e4a20e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/lookup.rs -639d5be6258699ec7e9f260ec33bd2c366203b6655bf0e98f30517c2e12ceeeb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/mod.rs -b96e30ef2b12ad7647915457f087a4d11b6141847bc5e971a75c2739c88c3d8c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/model/cache.rs -0ec4f6d0adea1ed80a3ca17c68c9c85502491da2904d9d690b4169ab9b025b21 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/model/cold_metadata.rs -f52123b588205ae96c7cded93569e99a1b4db4b361e1f7a91fc703afa6b6f6e5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/model/entry.rs -ff1c3a1a3bc0d26218dcc943ef951c2a212c180bbf6e4bf1c542ffbf12a9f150 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/model/http_invalidation.rs -ee9508498d420a726abee1d12ca21fd5117c1908ff53c2ce29f01de4380f26ac /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/model/maintenance.rs -723c6f0580db70b1ef40269b28a4aadc89f024b25be00afe73a971950663d252 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/model/settings.rs -14f3f8ae5252a2dc13fcf9556523ffb945b77ee92a5fb4939cd27e113fc61660 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/model/views.rs -0c8b0d550e94d4474dcdf991aa0340228dc5f2f904f39350e6e666a16f16fe87 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/model.rs -70c255e15f2b8c030988a2263b0e07b5c16e7e26770c72becbcec6da4550fcd9 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/policy/request.rs -6ae7a79886dbee537d15830c4647f59f158a2b31425d1c0f06218590c261c968 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/policy/response.rs -12a6d5d9d6711e956391b4b952e8149658b8bf64cfcc0a4c59c281f2630a6aac /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/policy/scope_tests.rs -e26dce02df9c043329ca164fed215d271781bce8fb03240f528331bf3df6b9d7 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/policy.rs -c3a4300f7cdb6b2b7c16fbc489d49ba2451331bb4a55a2d9f618c684fd61eecb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/range.rs -e1d3f0512d6290b0ac4998f47398a0a7c404db249c5bbdbc4ad4767071013a72 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/stats.rs -8a300f5dad44815401eb23f4f5a157893761852ba4f3005041e0eb3f16892ce3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/tests.rs -98af70ada3b14f3ecc94c9c76b028c1b0de1ffd43d9836a0749de763f64d5402 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/tickets.rs -a1132b980833b1b4ce2bba9aa681ff255a0e2d61faaa65a316860da503ea1e27 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/v022_cache_tests.rs -4ba0a2e1c21a79cf68bf34cca1f2c2a3d7b20aef38f3b9f510743e60bc1d425f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/cache/varnish_compatible_tests.rs -1a2eb6684d9ea4a7e90970d936c75f7c8bbec46a4181fdf273be9bdac8eec847 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/compression/mod.rs -8de82d9188c9c337690c6ec4afdad9fff20651c358e34602a93d8bb8c3d2489a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/compression/tests.rs -2c4312dd7410dc231ed204d7d201d716eedb41045fd95df7cbb51d5561540d99 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/config/backend.rs -6ad644fc4ae821d2c30329ace36652a7ac12d674e71e7dbdcdda3554c983f6f9 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/config/compile.rs -fbea01fea1213d98aea812c1b78d5db289e09200b98ae514d742235cd3fa70e1 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/config/internal_routing.rs -cc75698be2828000e88f2c482bd26f2fa4050e3432bec1b5a581dca17fef4a37 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/config/model.rs -75839458ddbc7480ec4492a95eeb67b617ba7d62f7b67e7a767a3453b74dbcbc /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/config/route_policy_tests.rs -e442c6561723e8dbf73d25912227cebf7aa84ac1523e8bda8e6b4bdad1b674df /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/config/routing.rs -5bc35ebca158aa399a1d2273c21130e1cfaf5c89cb401689ef863d7deca6b801 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/config/snapshot.rs -477cddaa1e1c0b9b605a2f550971a04cf30287519cba70cfbb2e1860e3a93ff2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/config/tests.rs -f35de0ee1516ece6bbfd2b2a7db7d1e0f5048b0ec47cf2a3765dffb799abfd93 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/config/transport_tests.rs -e695079333ebdc2a6e7b3337cfabef171b3a0a01da0597b77feff70d417f833e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/config.rs -c290d0cb02dfa5d2c60ecabac1cfb20c8884e3d14cca1944906c6d8e677f1784 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/db/api_tokens.rs -892ec0e5985700cca399c861197f6c9d2f1c823d8d95b88abac9d27ae15a069a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/db/certificate_api.rs -5491dd7bb9b3fceac97c4dea63aba6d5c7abcb0fbd06e36ae986e00c79bc07d0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/db/dashboard_presets.rs -2ff744223934685439374572b83fd639bb3eabdbac168bea4a6501a6e9ce0ee0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/db/history.rs -c05a02618d476e4670b4f9930555f199cac776cdf09edb8fcc1a675695b8f99f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/db/tests.rs -a09f361d70510d6226f4dd6785e649c3dc01ccafc70a4c8b0dcd098e224129b7 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/db.rs -dada314e1709e960eb2e225b4d10c3cd12606c62c4bc2c0220aec1ba133e4ade /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/demo.rs -daf8f4dd4bc4dc4d1c69fa583165f88fbc299eee9c10edba75609424b0539ab9 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/diagnostics.rs -9a68e0d5bd98541314f1ab5a4c2e344e9837f315bd39ea3988ffab6a0f0425ab /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/docker/client.rs -8feba6d9eb7fde798cbe8a9e339d6a5346cfef039980fce46727386717635eec /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/docker/model.rs -f095e5e3c564df409874019c647f7cec2156bf5a845b5b84864879fd07cf80ce /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/docker/reconcile.rs -2e8d4841665cc1d29e6262a1789bb64ced1cecd0036681cc1ef7b5d5bfe22065 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/docker/tests.rs -045593a42a6e4f632e5052c655788f0843faa313fc929265b89509f6dfff91ed /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/docker.rs -0b6831d03841a1dd2d6ea73d8268d0b3fda678c6d9332447e269f1e45c60c0d3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/forward_auth/mod.rs -6c25951cf69e972c47cdf815f22a5062916b2b768e39d55a26a5fc9e625a2344 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/forward_auth/tests.rs -b266c0a464bb0c6b581e423d08304a0121f126e8e42ef3a8469cadad42810fdf /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/forwarding/peer_formatting.rs -b821e2efd2939cb13d01e402532f33feba6682acb6a7a3223be086c1cd171820 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/forwarding/tests.rs -5d32cf9177a33d6fb50452541805b10ae1b0833e709d833f5bd1fc6907193ffb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/forwarding.rs -e3646c044604bbc169aeba549d973d37b8ac52f88bbab4a0ef74c6ea69681eaa /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/geoip/mmdb.rs -1e8777b295e6a2de15b55548e8c4c3a4166b1c5af18d4d33bf067d8bece1b590 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/geoip/mmdb_tests.rs -cfc75486e69c310fa6e7bf0448ed39a20cdad9dd8afe75e01592fc7c76a380db /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/geoip/tests.rs -3376ea3d018faa5cb8a69da2f1d5b7cdae4bb4b8f28f373f8a0a2996410e1bb7 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/geoip/update.rs -86a16add6757a377264ae6afe071039851d5996e80baca9d4882b71889d7c2d2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/geoip/update_http.rs -8c72a10f07f82e2c0864551a3c95e261129c23cf6072f902d063564b6ea6770f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/geoip/update_tests.rs -0541ad50b7bde1fd958fca59d2a4f9a0fde197bcaef68e6bf892ffdeaac46be2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/geoip.rs -61a2b01db9010f9debfb38b43a26bf588438a5e470dff938e4e54f9d7ba46732 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/headers/mod.rs -3e9a19c221fa7e63d097c185470b17313da7c200a73ce50f6c069b4dddd37a96 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/headers/tests.rs -2554fc93a555e1f39d12d8c172097a4a4571d79db2b6b871a5a1bad0e8dd2778 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/http3/body.rs -741972222414c280104acbcd8f8071bed9cbfcfa2f503c487c11c56f553f53cd /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/http3/diagnostics.rs -49ce4452ef7973cafa2e4071e2e14be0e16000e931a6501e4dc613652e49e230 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/http3/identity.rs -0b41072f6bcf28725c80f471584cd55d4900424ce5d55ac7f6909813788c63fd /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/http3/settings.rs -5c550075c7b0fe687ad02095c1cad57b46b579fe21dc5371525b6c77db459886 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/http3/tests.rs -027d414f51e910ff20fbf3a924ab6b136178858f27819a046a922b1d8f349cd0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/http3.rs -ad0fc77b4065e4e59e97db60d77970c7336386e43b779198abcc727245f8c791 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/lib.rs -e4be3ad758c3d93ce52dd3b1ab1a87810e5226339400ed997607a5b746354751 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/logging/error_runtime.rs -e9795eaa3e743c09f5ab0e18e6d359bc97a3aee55510c74923532d64df90c873 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/logging/format.rs -66c4596e644d9dd539d468575e2de6459bac2624fb1e1064cdae61a21c2e0240 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/logging/model.rs -bf898b318feb9bd3dd2c335b6b1bad172da63fd5cefbff3e267421ce37c076fb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/logging/runtime.rs -3d6ea5508bc9609c6ce99a3a1d3fec2fafb95a2a8de579a80262b73c6eed3a63 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/logging/tests.rs -e8399753a6ff49b7de19edb0a268bf871c9979a518354160cf07b4669051fcbb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/logging.rs -87e69b46c548b861e9d90d9d2e42dfc2630891f4583800b1942f9065d25e29cd /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/main/admin_runtime.rs -224da3127b5f846a8932fb7f4b6e23d0dd590dc0170506267381d66042c64666 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/main/bootstrap.rs -5a98d0e249338e73aa57ae2e352dc16db2f79c2d042c1544ce1c2022da76a31c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/main/proxy_runtime.rs -b240033715323e7cb7b9bcaf92edd481f7089b4da6bab25005ca6733da8756dc /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/main/shutdown/mod.rs -0a6578a0f4023b9f8d73043bf942dc5e096ef9afb8c0d2f131c14f65d08ac01d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/main/shutdown/tests.rs -ff491043180085800b786b77e6bd3c400b60051012482918440cd5dc6493d1e7 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/main/tasks.rs -cdcb3806669207c17279da959bbfcfacf18cc192f24e862c0afa0c389a41631a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/main.rs -9c7ed78345abc33d260f8d5cd52339bf8de748c08b53eaa2bdea8a32a0ea2a20 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/metrics/global.rs -31154052757c2bb975b8ce8cad67f3fad7b5132b615a73d5b0d7bf1b5311722b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/metrics/rate_sampling.rs -f27f1f8bed769883d1a7ae6a48f89f7712394dfab65d05702b0f944f0a45bd8e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/metrics/vhost/mod.rs -ee401f943bd8b2706c33419ed69102269c08dcb4ceba6f4be2ac0861115874a7 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/metrics/vhost/tests.rs -a719c51aebcba0f16f8810c37618201954e79d6806da085ee6c5e4697a05b521 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/metrics.rs -f2a632f9d3d7f9985ff796545263ebe03fbf5e9a5c2e88288e89a700d3af81d3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/not_found/mod.rs -fa2fc6c6987a8356a9da92cade10db62426d8863e9cef3c0d4324c45780c5b33 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/not_found/tests.rs -c19998732c2d65b464f43d17a58644db5bcf7b4a6dd4c31a65a091c57692a5bb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/oidc/mod.rs -c4dbe0f8ded237d45b6a3977bdc7544296e4408996815cae9e28af028419d0b7 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/oidc/tests.rs -992f49379e44361d98088d8f8ca1013d62846a54a5a35c089a5e0e1a9488e08d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/oidc/token.rs -eb95c68c8639ce3ae658eea3334795cdb5e129fb2ba10955f7dffe06d8909b57 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/pages/mod.rs -86008e469c84a7242b7d4947e2116694ababa2cb26120f246d00923a7c019720 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/pages/tests.rs -6c97eb9c593a7802422100e8130921e63b6b9b1b0387b6860af9f49581cd50b3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/prometheus/core.rs -2321ee667569803dfe6c92c0e98adba0ac8fcdc6a3eacd5857233f1acae93daf /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/prometheus/docker_misc.rs -cc909edf740a091f9057912f555dd888b644fa1cb49647fe0e2e1f5dba8ff5af /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/prometheus/json.rs -f9aab3297fcf647295849f77cbf99197f4dd27efd6817e54c03451e04972430c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/prometheus/model.rs -f8a9541b568ade946dfc0b3353548a773a0126f705b537815ce0523439b07ef4 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/prometheus/tests.rs -028e1dd9f2ec2afaf699a6b21c2d4b0d96e76f11f5e4ed009c233dadf0f3be51 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/prometheus/traffic.rs -cdbfa0e7f49200dc70ea6df8f0594399ee3e0c5fc3d279cc336e2d83d0f8a535 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/prometheus/vhosts_backends.rs -f1b0254f53b1a4336bd8170ad441ba072b49a114e497b985cb20699b4e375044 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/prometheus/web_php.rs -5650a3f70162abd97021e0a51a92cac2c4dd39004426ef99dff36cbb0741aeac /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/prometheus.rs -315cdf2ec1479433aabee00f616e8c0a9ebe4697bd4928885433b80e52a706cd /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/body/mod.rs -5beeac12ca7f041bdb9b74b2dbc9781f5d5524fcf51294b8b6ad88284754ef20 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/body/tests.rs -1ecfebeff9a6b933368095b84762e2816fae8a99339e0b854e67e9e95a937e3f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/cache_helpers.rs -2d39552aa01ce3d048560944975243d0a58ae762d838e547f5fa65007d871dc4 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/cache_http_invalidation.rs -a86b10ce0707b51e925e11ea14f7f40fa108a196166f62cf40007a97f9e17203 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/cache_http_invalidation_tests.rs -df239d37b008691d54e257626009684310e6e3712e777094b8450579d56f732f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/cache_plan/mod.rs -811a00b55b24638b4bf8a6bea9ed7c0ffe2a758f76bfe63a95e1d31bce1c2c9c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/cache_plan/tests.rs -d6bd4aafab7b1371c31b3d22ddf949a08ea942489649ca12c7615b3b2d5a109a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/error_fallback.rs -d0d64fd4dd89efd4a9fe089ff4551815cbeaf5b883ddcff803f1b13b5e918dc2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/forward/cache_fast_path_tests.rs -7611390a02341d5f9fd223626e57e0f2f129ab45e03fb1bc105be68d46b86a9a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/forward/cache_lookup.rs -287012c81144d8f15af4a148ce3ca911d431bc59adff44e697567561aa372bb3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/forward/h3_navigation_tests.rs -728576f7a42292386eca9cf450779364da87f94dc0031ba46c6f4d5302755949 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/forward/response.rs -0ba6b62e8560d6f7b99ca7e387f058412fd44456f5874a8258c1c24595c435f4 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/forward/route_cache.rs -28aecd57891ef67a618a0f8e4df0aee95d0cb6090facf37e531cd190331d06e7 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/forward/success_finish.rs -ccc54869ffbcf1edae9ddb96f6dc2191739f8804ee0318b7a6844def6c4693e5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/forward/success_prepare.rs -c965dba1d2639b338f3f3cfc17f760786a30abab708dfb7920ea3bc94d4d734b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/forward/upstream.rs -5d72200f3b5308215b7a3d7b1f910932eaa4712f9e2954afdfbe2f252e2a2d3c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/forward/web_source.rs -602879a0f8f475fe63b5e27238f4b371277a6780aa970c6b140c8d7fd3074e37 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/forward_entry.rs -9b25f5e3ea4443a63ee6f45d12e1957dd316fe8e85325fc00ea416faaab1025a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/h2_graceful.rs -30057732c35c369740a176f7da285e35a4157571a04328f6c6f1494d4ec8550b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/headers/authority_tests.rs -e87437ccf80e50e0159d204dfdd1f8dc0739b6e375be192fce0af749810258cf /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/headers/mod.rs -af9b044761a56e8a6dc57f9d760b289ff4a6bf37db11dbfcd3ec4da5b8f426b6 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/headers/tests.rs -2bc63579975387c92a9459a9677b4a49e76df382b1ee19de12c8341a3ead57e8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/identity.rs -a08ee061e146cb7a08311106f73a04468c89f77b6ad05a2c623621a2ae9faf2a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/mod.rs -92806ce1802da9b6771ece474d91a3458eba3f6ed19b0817b897e828a02e7e32 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/redirect_helpers.rs -de1763b89d98607e20f0f6e3c9b546483927cbe5450efc2e5634fe691fd52ad6 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/request_id/mod.rs -78bbc1263bcd600527bf71acdf5af92bf186267a9084b076d1f75ad6492df659 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/request_id/tests.rs -9d7cc19e78f50c9b96e8ada076e12ba96d7a19a51975a13e554c4463e624ee92 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/types.rs -e44430c54038a7dc26f327b5d7085e965241da2ffef42c1526ebfc5168981f72 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/upstream_helpers.rs -c3887e344249ce492862c365896731127b7b6fc51bbfda274d7e7aad3a70be0c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/web_cache_revalidation/mod.rs -5522456cc85948228250feac92308d53b130c4a7af98d24f669aca4dfe6999b6 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/web_cache_revalidation/tests.rs -aa58bacc35458ac615680e774a235191f80abf0db978b68095571fce94c2b502 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/websocket/handshake.rs -c02d42b5c7eeedbc54c58e98691f7d8e39f8e9be63a48f6d6b4ad6b8ea431b7e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/websocket/http2_tests.rs -faedf6cc2bd4c42f342a0aa188b634d6b8d280ca0e121032977eadaecb88e9d7 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/websocket/http3_tests.rs -7e9c4d4c207badabf90630223964bb2ad641f06d4149843cab751f192b8b4adf /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/websocket/tests.rs -a44421714aab37f7ceda19e3ec2512c645d2a3ce5dcb3da5bc7a0d87a442d6a8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/websocket/tunnel.rs -999cbf85cb6e917db529e30ba4a5eed1cc9e95a054da7b3039c730bb80061449 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/websocket/validation.rs -3d591201595a3b1e928ded20a8736477a47e5acc3bcbde158f7c17547ce155ba /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/proxy/websocket.rs -80d0f744f7ad9f0d1edeb0d5c23b13cb40431f6b6f4d10d534ed34d4198e3dfd /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/rate_limit/mod.rs -c85c9f05dac65cde6878bef3ef7258eb9de79ca14c26ca2492e0e13839c40fc3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/rate_limit/tests.rs -db254128c8013adaad7280f40a0edd8b196083afef299cd9e193e6db1d698b82 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/redirect/mod.rs -811c83ae9fd0f5a13d35b5443cd37843f82b9d600bee4bb136ba9b87732a5347 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/redirect/tests.rs -3c71d8eef9ccb49ad93cf6014c5c27756ce0eaeddfca116048f24c483fda68e2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/runtime/certificates.rs -2d610dc36f746215ad3bc1d860ee624a9233886d73a019fd243e51901503fc53 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/runtime/constructors.rs -eb2b0eeeb617cad704732d87acb667530144836e26edb0189929b1f25f35c6b5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/runtime/docker.rs -18f7460e3738386e070f66932cd77240001255447a769d6e19a40573254a1473 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/runtime/external_config.rs -5999d7e91ee4231da88c5e9c6d8a12ea9f92d20d6dcdb24319f9f90891d7253b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/runtime/tests.rs -bab3044f4ad8957b65476a0c307bb8a364825b91d2100233b7bd6efa52e771be /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/runtime/types.rs -11e99eb425887ad12b73d949f4b497fabc6897fee8fc7647fcb3766269c2fdc0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/runtime/updates.rs -244d72b3dab36ec505c96d26a967420714fd3807268820f680fb3dcea0e88c0f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/runtime.rs -e3dbd60953db5a976985dd796e4268b41a0f3df59764c4664015bd41e2578058 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/secret_store/mod.rs -b0c4a46b40b09794fd8a037afca380ee3b95941bf75a0e1102a4e520a4bd8be3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/secret_store/tests.rs -53bc7b1fcc1eab8860ebafccd0c9ed2aadf75363323891a4a4a22114c323b22a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/security/mod.rs -0e5fc2aff856bf6fd959cba12b5ddd1e3b3cbeb0fbaadde906c811cdfafdaae7 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/security/tests.rs -4cb5afb53c824f5c87abaa65ba5dc85e937255c4a3dd14af16df9af7e01afb10 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/server/http.rs -533342fb3bf8b52743d3a7102ffe345be9f86d553b16a1ec322e468b44b0a7eb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/server/http1_connection.rs -22fca56396333ee7a5031da35b15c3258e93aea4ead6af733fcbb1716e21654e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/server/listeners.rs -1c4b84a4aa9f120ed3b7669a145ef51e90d825c559d40088a2b4074bd84a4912 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/server/sendfile.rs -5f6a59c6085c1250a93a70020661d1e8174d3b600b494d16f8eaf7941ee3bb99 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/server/serve/mod.rs -048a05a46108f50bef7da50b0c03b752d76e586b411de8ca3f55313bbdb08aee /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/server/serve/tests.rs -669ea1041c103cb952f7a516363c8fe7baf51622f721aabdd57015e0e0279530 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/server/tls_runtime.rs -0e8589f56e3229dec556b427b87c2cc5a5a9ffaa9ea84fc2522dc72d3239027d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/server.rs -b2e2924047019b1ada59c58a4060476151c99be12c0b4092f2cfd201c0756255 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/settings/public_origin.rs -c599d1cdca84ac18da7e7cdf6e2d1556d4df770481a0607edb96f6068cc051e2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/settings/tests.rs -38abd50db3c5742ee6514654bcfa0b854fdf6e2a29e034ac2e5d36c4b95b00ae /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/settings.rs -c7771539fbb94544947e958e410c46b73f9647011e56b1b229ce7035fe21851f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/stream/health.rs -4b9cb1135c53f4a159bf2fdc1b0c7900653d7651612568f38c12f06e70b8ca72 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/stream/model.rs -42aee5900c3c8697c80220c77a6af0435358e3b1fdaf1a246784aca4f62edaaa /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/stream/pool.rs -6ec42b8647c95a0c2025462e0be29c71481ce1c3b1f4d4193926471f1cf06be0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/stream/runtime.rs -9346cbd71e006e41a7188f28eb86f9b00bac822e4cb31c76c8d6d2ec5d4c4711 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/stream/tests.rs -2ad7888b263e1dd9f0bd588dc35590c9eb232f8fbacd10ea7554cb55b4dbd25b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/stream.rs -63924d279f5fdfde24d2e0663518a123dd673cc6ed9ce52233c4b6851bfb1efd /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/system_stats/linux/mod.rs -d9123c623e2a97d09e41edaa29993b4b2c8cba39a3abdf2b48a205aa9a9c2939 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/system_stats/linux/tests.rs -e0676801259fb09a73825d959b89630bfa0b6f1fd1efd3006af29f60537a2fdf /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/system_stats/mod.rs -050aa831b1012c4aaade63863f433f01bfacf5d3f95787e57975572116a30ab2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/system_stats/tests.rs -6b955b13ef848e90dae1ec2906176336a775e9511f3688779203d922ff7d23a8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/tinyauth/mod.rs -3d40febfbaf38ca2725630eed6b33106e353086081ea811107e4ec9d24f7de11 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/tinyauth/tests.rs -2af2164ecdf2b7fd9eef7c6e358dec053dfac9aedaa501dbb75df742d18638b2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/tls/acme_tests.rs -93e0576ac9077e645a72d164bad34cd75fe6032dd0516284d08bddd2fbda4b7c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/tls/certificates.rs -68cc35b3cae43b0321cf667a613310a4b9ec5d8994461d6f3543b1852771bf08 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/tls/external_paths.rs -937b95bb8621ab98d7cad3d223e4dee305350fbd0149b7527396d3bdcc28a68b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/tls/external_paths_tests.rs -1ff95e95d38eedeefcf8a931569d628763d5a328aa5573c73c928f06795037ba /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/tls/server_config.rs -94b70c52fdc7bd6e32fba9eed9124d030c692246f6990d61e01b891765275add /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/tls/tests.rs -ce51a3280331d67c8406d2c5bc156ac0b492afa58e1f328bcda76db0720a6a9d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/tls/types.rs -df98becda799b6bf4ff5e2fec7d0e0a486e6b7eca6f9f5ad49ffdafd49a4f498 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/tls.rs -a897c48e3528565fef8d4e32f0c3c078adfb68655c80e1af011f44a8bcfac6f6 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/traffic/mod.rs -bd62b4ecdcf831d183c7720766a11703c8612d614e3abf38d2bff28df34710fd /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/traffic/tests.rs -bfbbaa3b949ae946fa929bfbae3fd9a25f2ce792abbd0ed370ccf5683250bc4d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/transform/apply.rs -ae30a984fa39d5c45a676effbc880c923078ba8120adff1bff10e108350b31b5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/transform/compile.rs -ffc0740462e5566a96912ab3089f18fc28f1c093ca65eec860fc6ea801fd907d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/transform/css.rs -2b9d5c11d4c02b4a3ad3b9bb1a18c63693f245b854084f5eba16595df47b47f8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/transform/html/mod.rs -aa99b0d3029ef92c78371cb90e11f2026cce890d1be8e10ebd7fa9bc5cb13287 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/transform/html/tests.rs -047acd7209c1db19709801abbe3ee1076c1fc33f0fe80cc5d9b60669d5f1bae4 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/transform/js/mod.rs -cf5195ab6bacccae0082da7b3f1bd0382b73fdeb3607f4ae569ca6daab9d10d0 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/transform/js/tests.rs -b0d20cf6784bf31457ea5a853e2fa5d85f6452395a78a538392703d97e687a11 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/transform/json/mod.rs -216e24e29ea87be4a124f95f898e155f127fd959d7d5d9b30f8cd0b2b5018f30 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/transform/json/tests.rs -d13fa462d6df516a4cfaee9f4e184044c5b6345e311aeb3d9058efafe54e4c5e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/transform/mod.rs -1a56c6af6d48d52e2a73036b9bfa3cf16b5fa5b057593821e1229269b7ea4c08 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/transform/model.rs -4b52257e1a3643910b5e7043852d7218230c0021c31215d90d0f8e384f2ae233 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/transform/svg/mod.rs -0f53c64f442390ee20a59087a10f8f9ffb58053263e9aa848ddabfae1a6f3f51 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/transform/svg/tests.rs -753047a1a731596f4c87351873c48f37b39f54e730795ff7d6895c3e2f0d56fb /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/transform/tests.rs -8d38f2f7d4ca4dd453cd0e2337614ec704fbd0a36d3e2374cda43f05dfcad663 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/update_check/mod.rs -c42d000d1d576721af3ffe930589388693001b8113554a7658f6dcbc665b5d1b /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/update_check/tests.rs -fe9d4deb34cea2408ac5a1030315989f29a6a7d078a46ac1b59d12aa07f67878 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/upstream/client.rs -80e9952b6a4b2241aff8ee259d286f0381b3c974032adc2c276764d14878fc67 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/upstream/client_tests.rs -56b1e4242f8153391cd9a01fbb3017a2dbda9d02e83da6bbfb39ed44854534b5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/upstream/protocol_tests.rs -ae880b40197454ea3fbf4d2113984dc372098b2e54b97e87c83cc319de253377 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/upstream/tests.rs -70e6cdf339da86183b4cd07567a4bb99135dccea5b0fb4a6c37c4098ec4762cd /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/upstream.rs -5c42f1befec267293b6f03eada118a11c90adfb4b32e0134d7f0033c7453c7cc /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/user_agent/mod.rs -696a2783a24f7f3d69fb820dc3a772ec49ea46ee017087952a8253363a9b7374 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/user_agent/tests.rs -846707452ccf10962f1763be66b8f56c050b0398b48968015fb799dac289c0d6 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/vhost/error_fallback.rs -a8c5ec5095178a0656a001b0d7100e240d1f32b052ea60df37f8681269638ab3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/vhost/model.rs -fc8af7342a3b147921e9040116af5dfe680b3df910db2416ada18198bbeea7df /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/vhost/redirect.rs -2651d7e3e3fadf3de74a75eafe2bbad8d02939551ccc0504c1a092a0b33b0db5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/vhost/tests.rs -c32ff8fae0c291bf072404aa118cb81016752b2929c89c7ec845d97006e677ce /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/vhost/validation.rs -d61c427c1e9cf457f1232b822d73e846e9f329cfbe61215e7ca061d53762155d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/vhost.rs -9744e8c29ae72a4d9fbc9a76166a97f8292c4c312295ea40d1cb699e03d80a9d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/config/compile.rs -5ed79fa5b9c53f95ca200d89a9ba927dda816b61fbdf3b852bd3c9670e3d2d4f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/config/model.rs -a863ad1337fbc353c0f42caea4ac8b3644792e2aa08c37f992b7882b4b8dc6d5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/config/validation.rs -8d1eff4b24f01d137414ef5419f75dd281879228adb70409645b11b3c78c20e9 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/config.rs -54aa2dc94df97faabd4859a9dafe6a7cb1ba3337bfef5fa51a4432097a985d88 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/fastcgi/protocol.rs -fbaf972f9dd2842ec7df2878f0105c9ef4a877817f037f2332c4d5baabf2ead9 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/fastcgi/response.rs -86c744216d7132d8294a6e90ba9be5fd871646006313d1c62506d40c81db9b12 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/fastcgi.rs -92d2ab4d7ecb766bbc705f8eba94c1ca33347ffb84b36e0ad0eccfed5915473f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/filesystem.rs -b4646f705e532f682d6152b6827cc7f4f915766ebcb4af89eba9950965673772 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/htaccess/model.rs -a484113f2c1fea4e98a437acd8a28be6490d7e612f160a8728ceeaadd363f8ee /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/htaccess/parse.rs -6e58e2674940bb0284035856fe9299a0555fee4c566de75e174deb373c3b164f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/htaccess/rewrite.rs -8ca74d9cc4470045301f70eb4a9fbabd0dbfe74434429148d2230df9f996c06c /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/htaccess/tests.rs -d4fec3682532b0f2d11a0aefcd024f69fb623a39922ddb6c528a2d2de265347d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/htaccess.rs -7fe32af33b4d8e079ad724665aa1cfb62f6e98b9406b77168feaac55dac36137 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/metrics.rs -0f74d1fad9bc20a5f2ea1753381459c072cd8068cb13e7dfbc74e33eb3ace593 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/mod.rs -e9ba6e09ba2c8f8a33410c219d5ea29214cc53e279a43b17c110d24f17a5a71d /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/request.rs -b38a1c9e648e3606a534ebdf74f6315863a326c6de1ca8edc433abe9c1fed7b4 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/response/file.rs -4733bb1824dd0a12b8804fb8d00791c3f9fda4c09b41503d5d8079d9607df058 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/response/file_body/mod.rs -e5f5fbe702f66bfcbcbc1d1f3cd3d89bdbb929bb86aed94868a2a06a4b9e59e3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/response/file_body/tests.rs -7da903c1a69be0ae6b85772b3208c518679efa8ed9d3e98adb694483518156b6 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/response/headers.rs -d98c80663847d6d83073df074ebff65952755415574708abcc153bd8d3adfaa9 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/response.rs -2665d4eac9a6430d68224874784cb65d9b9d424353af77735caf044401d08cb4 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/routing.rs -9e584eb4455a18641c2c89f9e9725745c93f32877abf0f0f2fbea9e3d5ef38c3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/security.rs -b791762b4ab7a43c3be19df84e523faf3dfb4df055f66d02178f93edb60d2204 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/serve.rs -714418c86ab241020a561fcf662a8fe324a6a70cc2fd3a313c56d7939c14b9e8 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/src/web_server/tests.rs -f00743af2cf4a5952caef7a1dcf68e7817b5599a252a9973e1c22045517c0b0e /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/tests/fixtures/argon2id.json -102b83171a6429b6375d8001d6c5294702385cd58ee55727cb657b1f3566e877 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/tests/panel_icons_browser.py -52e61c389a60d147184ee76925cac76e454f8f2e3cb91039bb06e17787ab900f /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/tests/panel_icons_contract.js -01af3008be27fabb486c141c67099af104f2725cc56f4c656aea9741a3c150cd /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/tests/panel_interface_contract.py -1dac7bd3a1396fa7ddbaf58fb002e249b3280fd5c956da82004066036e1dd366 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/tests/panel_refresh_contract.js -e24a0f84f1bfc46964df865ac387d651f7b384d781cbc8f3a9a5b0b60f3d69ca /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/tests/vhost_auth_selection.js -cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/third_party/swagger-ui-5.33.1/LICENSE -0d20d1adef18aee3f40dd258172155521ce702ac445cb5f7b7d60ed32dad2fb2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/third_party/swagger-ui-5.33.1/NOTICE -2c9e148b9acd740850aa33ae52878f1ecf19cdc67f6041e2c0a7aab1e95782f2 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/third_party/swagger-ui-5.33.1/README.md -f51b881c441fe8cab388c744911671ff925694b650e5ae7a5072cfdceb9ddaa4 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/third_party/swagger-ui-5.33.1/SHA256SUMS -050bc415ee7048dcd881682678f720264e7da5e373f7461d7c58c755305255f7 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/third_party/swagger-ui-5.33.1/swagger-ui-bundle.js -63818894e4b04cd0e3180d9cb20761e227a939121e7484f8e1d528227c756f89 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/third_party/swagger-ui-5.33.1/swagger-ui-bundle.js.LICENSE.txt -1ac324f7dcd27e4b9386b4bd6421271ec147e922a22c05ba24b11515e9aa6321 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/third_party/swagger-ui-5.33.1/swagger-ui.css -eca68a07c2b1e45fdb8f512294f5a432db3ae5a6aec8fb200b47f155cd9a31d6 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/tools/README.md -7c30c280d0b0a8bf855eeffab583ca34dc161255f7ef6124148aa979c17c26d3 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/tools/dev/memory_load.py -d1418f8e574a7390fd45a2aa879bdf5720b773162d65e295ab0350506aa5220a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/tools/dev/mock_auth.py -2d3ff92300b09ce9cecbbaaa9309b4d33160fa4b2291c9952b784e8cfb599ab5 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/tools/dev/mock_server.py -c711154a9df425a56607bd88f03815ffb408213a31a2b66ed1c1c9a6301a2fc6 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/tools/legacy/backup.py -5421082e24f3794356331157e30b428f3221a0d74c0b5d060bd4d3989e0bcf3a /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/update.sh -56c702111022e1ca2c8f6b72c635c749b05936ffe6387bdb0a202691614cbc96 /sessions/rcw-01mmsgszuju6d7f2h8egrxc4/mnt/RustProxy/upgrade.sh +61bf40a0572889dc8b0dda9eae4e93e44b0de9364b3c798106c85700ffb37c23 .dockerignore +4140a2956264b44f259e6a37fc00ba02097bbe68b09296e04d3d243c1287129b .env.example +e76e688874828e3743d03693b1d2872b9633b4db09909673786caf30f7cfe489 .gitignore +9648830349e8ff28509f8a62a4f62c3cca1721498118cf9fd71e2cb7d95fb4ac AGENTS.md +11b4e849d5933ca383fc4e3b61a3f28e19deef7ee6d768e5108008e58b8dbc3e CHANGELOG.md +b7b5cd49c635e709301850d07d24014876e3d4e0942dff320bc1cd621a2aeb55 Cargo.lock +7a9f5c1cb40414c8cb1e5a3af9c1f1322c69769b76c7c8701d4ee81338168a7c Cargo.toml +25c7f3c8162cbf5cc156439774118a81dae9fdc52b611ec7e40c230fc99a772c Dockerfile +0d96a4ff68ad6d4b6f1f30f713b18d5184912ba8dd389f86aa7710db079abcb0 LICENSE +82d1dee2fc68158f0ea73259151461e64c8b18d807cd1fecfb1ed99dc30cf5f4 README.md +da8311e3db945290666324a2f24bf4521b365272d7ac3f862ded1be993eea646 UPDATE_CHECK.toml +c0df6b46bf795d49d00fcd9e2a9247aed0d3a99b6cae1dc5ab6614e8b3d30009 build.rs +95ececaba550a4bcfd6754073877ba0633373b1e1451521b9ac905a51e8ca6eb deploy/README.md +13d514de5042a230cacf8c10abe1ef183c94ac799a89b8e2c111152ac7c69b48 deploy/rustproxy.service +c111f5b20484707b80efb7dd9176acbaa27b63ac78db497261ac234821e1fade dev.sh +d213e774a9cd07bff0c79324722bd05c0aca18cc033d50b2c0558cdb72972bca docker-agent/README.md +e9f18b358a740f1fe16e369ed16ee37581b8ce4c94ddeb34a1a37b89a49b5a06 docker-agent/certificate.go +600d5aebc8557d6987158969d494bade1ba46ccf9d1cd573d357d0106db26b2b docker-agent/cli_test.go +067793eee01fd284da66f79c6f8b6f19f8773e64f84af03168c8f751ff044685 docker-agent/credentials.go +5e4f565c3c9de4dba897af2e801ea646a83395e72eae4717a6d502dff2fcec10 docker-agent/docker-agent.env.example +ae660c2a90f193167b166977277abfc86a25e043ab4def4c273b2a13d5a51b8b docker-agent/docker.go +9e9f3f17f38f9b0730f598f65988ce8ef562d2182ef6778fc7292b990e9cf22f docker-agent/go.mod +7b70bd43a7f39bae8968decf4cd76af80fe0d08bf1bc53b894d89ead80581d56 docker-agent/install.sh +b7d0466f70b541a705d234fc8a88b99b6197fdd5e682d3a288a78c76764358cf docker-agent/main.go +d660f46f7ef8c539dd3f5486a31d5a1254b9737be8a278c7f9352c254558f8ac docker-agent/main_test.go +351bcd0321c823694e12d578f96dc68ceb929979a70146d12af5394f639a486f docker-agent/model.go +e52b31d0abf65ae3034f6cb367cca113633014ce8d1d799ad4dd5624d2c7b8bb docker-agent/network.go +634790f35ff4627df2a78cec2ed371f6e9ec9df00afb386075595fc7f3ed72eb docker-agent/rustproxy-docker-agent.service +5220d669171ec3ad65f50e0bc8de5178dadaa4904def8e1a4f61002aa9e9a55b docker-agent/server.go +60d108fd168064e4d6980ed7499f3219017f9878c743697e77f2efc592e4d629 docs/ACCESS.md +5a8821f28a1f529263db462a0ed1f7c082ad91b5936491806913e5cb5b274fd9 docs/API.md +728b15b9825f547f34c4121219784798dd046fbbdd72ece8906d0cd77e8efc64 docs/BACKUP.md +4fb55a549535f37467f14536cbf0db7be027ca8a019c2919a384af4f23655300 docs/CACHE.md +5e7b6668be6bfec77755ae45b9d369aa14135fce7632de392c6b29a7b584245a docs/CERTIFICATES.md +02bb383b5c3bce22616c3cc3db30a9469806dc16decb509973e84c60aa30fc5b docs/CONFIGURATION.md +fec29ce846d6705eb45819d85d382f28e28a146b265feab2e4c7cce2a35e5883 docs/CUSTOM_LOCATIONS.md +9c54b8da03adb1bc1a3db96a72fb99924dca25eed5ac662989aba18ca226d066 docs/DASHBOARD.md +11a08bf2110bbeabc924eb049a30177a216af5607ccdaf8be9178e751f78a2c4 docs/DOCKER_DISCOVERY.md +1a15342f58600dc1579b3387a898f95d2c5ac0348245bada75ea8e453e4755db docs/FEATURES.md +2c5f97b12be53db32c7e2888d23c0ef1d82d1742df44f7e60ea818dc801a719a docs/INSTALL.md +6e37859bf0dced99d4a7db93790cb38fcd90191932827946d5223eaa4c784fce docs/LOGS.md +0e9ae9509a78d00951d2c7c3f13eaf518d1f3448a29b048f5933e1f5f8440275 docs/MIGRATION.md +0972248b7062b37e61edcc34dab5fe73ee9bb50195a0aa475c72efa0dd311aa9 docs/MONITORING.md +364c1faf9e21849de0f7c4ae8c1e55c1fa4d3ae3a7167a33cb58651174b4bfda docs/PERFORMANCE.md +d5894c07c68ec4230987767198434abee13b0e525842fea21bcbe752fa82742b docs/PHP_FPM.md +954b1602c865e157c867f1c81dca615f2beaa33c34de0b0fa8a6069db2aae7d0 docs/README.md +490a6dbe870f2b1fd4ec7816768dde6c86fa7957fc9de2d2f075e123c9222222 docs/RESPONSE_DELIVERY.md +70e8c8f3352629f5600537058b1997739d9e465747cf3051da8a2cc779c3b728 docs/SCREENSHOTS.md +3a48184b36d225757fc5e2d22c629f89bfe5d4007ff087f0be0ce02a5fb04c28 docs/SECURITY.md +bbef60ff1771da9f48af812987766e1e479408873ae2f079b13f1d5c62ecc6ff docs/STREAMS.md +8cfcda59060106151f13e93ca25c1280b4390433b3fbe2921a6eb3c13bf9766d docs/TRANSPORT.md +be6e8af62a7bf958b94ec15e9e3263263e511d1d33abae4e45d114833fa52b07 docs/TROUBLESHOOTING.md +b4abb86942f665230904fad570c1487bc173aa84633801e2999f2bfa197de4a7 docs/VHOSTS.md +e67928a9d044e71b681c3e52f9dd8b151d6b72f965d16d5da8b0eadde98b70e9 docs/WEB_SERVER.md +3769f97c74b1a4a2f14d82a6f9c30fa3ee48892f423bf82dbd2ec1bd9280e45a docs/images/about.png +a85a7b9d8cac74fb1b231471d313e6587ccfc2e8abd2885a79067704176c724b docs/images/api.png +1ec8e47b6c10a905d8ce63a060be3f51efa3bf2c12529456a8c3d3a0653db95f docs/images/cache.png +02b4ec5bc7e39aeb8f8928a015779b431ee12c4c16733954631de0e6699388f6 docs/images/certificates.png +40d0a4d28c3938612c93425a308c895dea0659f50c661849ec5bde606a141a97 docs/images/documentation.png +6e7f634d6c0cfe8f9fbeba129d745fff00cb8bc6f388de10c4c158ae4a854a17 docs/images/login.png +1f921d98aa16da3a43bdcaa46ade68eb921b1d88d95a8fa87f0b51b6f2a8db9c docs/images/logs.png +74c23173c2299f8ee150fd8fe160ffec0cbfb5f63b89d8debb1789fa4526fb19 docs/images/overview.png +585f7f450bb7dbbf32ce146edbee6555f849903d1abbcf665a75b5fb12ef36b8 docs/images/settings.png +fcfc9f1b932e243e2133061aa996d8ca6f8fede830190865b771482f4ab01ca5 docs/images/traffic.png +d50eff63d8c11af616a794d24967ca16a2ad827d9c3ec47299d578419b3c449f docs/images/vhost-editor.png +bb977580c5d93bd7f2eb931c795ae7f4b8676f316d0fbd1552f78e2757dd79b1 docs/images/vhosts.png +28549d423d6976181d9b4ff9e13626ccee3b4c44db36d442eb6b3e20e9f90d6a docs/images/web-server.png +5502e8ce44276213803b66c58e3a4d804a1354f5ed5d83f47ee805e8c44ab088 examples/acl-headers.json +2431dd88a2d9ad2cf3cd4b8fcdfa602563ab1013c612d8917fddbe7febfb2dc3 examples/cache-dashboard.json +e31ac05a99615e4ea6c4c9a8b2e090968583fe3959f838a600b5740cb170f8c5 examples/config.json +39cad993003930febf98460311d185a278e7a9508b6b591299d9339d0f0c51cf examples/empty.json +695cc7621aa403148fcd0868f351b6e9ccc076fe35610e779af4a72f94d7d5f4 examples/http3-vhost.json +b26833cb4251f9390a44192ecc827ff7f052fd19016a5ccf7498c94503ab4ce3 examples/mock-vhost.json +a6b835dc07defc12b8f0e48491d5f413843c8be2ba4501d7c28140a2822b034f examples/oidc-vhost.json +134d4a59727b27accb3141d4cee26a4a74157d236de4996bfd682e639462b2b5 examples/tinyauth-vhost.json +5a8f3a8a054abc89c6e78896b9fe2f903212199a24dc3d2d2bcbd0696a31bcde examples/transport.json +d242de9614fbb52933b4accd32f4715ca94107abe4a3b1d7e088362b07a6ba60 examples/vhosts-balanced.json +af2bdb1343a8141069e94ccd2c7f92574ad848437e2f9fdb5c7576a9a18ef4a5 examples/vhosts-private.json +35e4f3acc652ac23a9442600c4c76173ae34966592031b3e942b62c249fc869e grafana/README.md +0d389faa4f64f095e9ec62cbae329658682b96f5e4d02ead79c7d2892ab89fa8 grafana/rustproxy-overview.json +1a041c505669625a7f0f8011484cf5b6d2ec69a7de859801312e4fcf4c8d3555 install-debian13.sh +909e9ab94617ace74a425f15084bf85f3086cc52ba5b28f2b441ff800abc6ef9 install.sh +42f9f1d18c021fc7734b5bd020844bf678725a0e539e2fcbe05ec676f6239eae integrations/README.md +ba753f69557bd9fa990e56beabebccf39f93b5f6fb7e66a2e241c8c461dfd763 integrations/opnsense-acme/README.md +3a1f8c326618a4613bb35f9e83428f6d1cf668b9e37b4731e5d38c3081fc94d8 integrations/opnsense-acme/actions_rustproxy_cert.conf +de6550ab8f48d556d752c252212c38ba65491fd224f972c10fbe552f91ed7520 integrations/opnsense-acme/opnsense-rustproxy-cert-deploy.sh +73784ac652708b04ca6c91aeed4524f51f50d63715bbeefe7f5590b353e78943 integrations/opnsense-acme/rustproxy-acme.conf.example +45be151cd85fc2ef2f1fdc3003ace63381af262e73af8a685ab48cb697cc0de1 integrations/routeros-oci-build/.env.routeros.example +11aa102de1089ecc375f20c4bd5420fcfd3b2ef23fe0c8bdf04953fcfaf40ef0 integrations/routeros-oci-build/Dockerfile.routeros +7c7a3e51f43b43e1c962a4b0bb591f99c1f06977bf77f23719f7f867dfe7eb8e integrations/routeros-oci-build/Dockerfile.routeros.dockerignore +6f7a659cd2f13dc0a091049c15800967481fcd6c44984332f6f37bcc758cd5a1 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 +ab85a75c125279859f70aa00f5eec44914c8e7a571593c09dd15a400eaddad80 langs/en_US.json +e63c7fa00f90410e3fa0d087dcfb09d639310680011fe3221ac682db8eb84c56 langs/pl_pl.json +8ed80f14633970899d56f4ea72684a8d4b1f2843c1c78bfacc4cbb5f7ce9ef4b make_zip.py +e830d37dd1f81a4b0aa7d535f5bba69e34e433b0fd99cc8ee0b296786c32379a migrations/0002_admin.sql +20112cc82192098b8d602f1c4f7ca08712e9e1366c845fabb92753187c370d35 migrations/0003_certificate_renewals.sql +5c62da30fa9db594a4d656c77ae676d3c388072b6a85f91170ec7d911d7cde43 migrations/0004_admin_preferences.sql +57dc28982f416874d5d00d1d438a18846d1ce35cb940c4bcf67fd9a8bc57339c migrations/0005_certificate_api.sql +faa7e50922bf180c363f7627fbcfe8079831e36282220d17481cf69bc64b57f1 migrations/0006_certificate_api_credentials.sql +f093aef9639a959a2522946995a02d2e67c464e794c3ef665261a9a5b348c968 migrations/0007_secret_store.sql +90f6dce865496e018c047133d3bc1721fc2a19b2f4ced22e2a3625d9e9ff18ac migrations/0008_config_history.sql +fc7585fdcbe99fe3496f0e62f4c4e2161f4a0173222ba4950331aec6c44e50f8 migrations/0009_certificate_api_grants.sql +d58a464870895cbefcaa2b4adfd6fcd0d5182d19f2528eef6509e190046cc9fe migrations/0010_dashboard_presets.sql +e56ac3718ea7d73fd9afb1c3b44ca95c9bea424c32166e37ce913bee0e67a277 migrations/0011_tokens.sql +273ce62a518657853428ca44dfe4dd2a56abbbbba684e905a2d0147d08359888 migrations/0012_admin_preferences_size.sql +478220552ffeea3de00e2866d427d9f87f4cfc4ae5232e5c3a774e62425b1e0c nagios/README.md +91233910aa4dab07ae917fef93d018a7a0beaab697f9a0bb889ac613e595cca4 nagios/check_rustproxy.py +a42e01b341725c9da0928edf40c8c3b9c814ef90592f208c52b1f2c56a2ad383 nagios/check_rustproxy_api +ee50f38c037765fab742e888d4b9fc4d874c31c785c6064d4eca3d2c4d24d944 nagios/check_rustproxy_backends +1465396cf1358067e9fe48b3d61f28fd4ac65c577b67c502950ce6b42ecbe3b3 nagios/check_rustproxy_latency +6e036f736a2b40feb78eec17bf34871771524190f283591d1c89e48e6d2271e6 nagios/check_rustproxy_queues +7458b2d74495e6fb1c1edeea4d5a793705476431dadb60627187111f91441e13 rust-toolchain.toml +fd1c34599f725ad5f7c3c0cc89e08b11917baef02c83af054ac8528b2e01dd8e scripts/README.md +1d63e9cea61a744f1bf2085cbb7c3d8755b3eda1569c8532574dd4fb6a840678 scripts/__init__.py +292c65ad2a7f0ca13da4a00a836df17c3192728dc02034b75a6a70eb6b5eb25c scripts/audit_css_usage.py +5fc5c7f274aa5a6c07970f7b2e548acabae3dc2a24d598308fd768a8d9de2510 scripts/build/__init__.py +c3066f40f152a2655f88314fd9cf784eddbfa6c3238a494da13d972ef9ad930c scripts/build/panel_css.py +2bf1851e3cf7ac576e38fe4e02532898df2ec11ff8e802266c1db203f29f6a91 scripts/build/swagger_assets.py +e4d15aa6aa864d04b9b30aca33826b833632af02ca643f8b23e219a5ea1298dd scripts/deploy/deploy.py +f0edbdca3af49cfa8f9c118d3eb0977c99569264dc5d74a85c4610234ea1fe88 scripts/deploy/deploy_core.py +f26297284e0ad9fb4e4317deac24b25de819c10d04fed551134ddb6debc41837 scripts/deploy/deploy_runtime.py +a59587ce8ad41b1bbb431356b58398f9c8ff7cb96a613a91752e907a70e10c2e scripts/deploy/upgrade.py +2cc658faaa610b21b48942c59b955525539ad4503fd60f2a49c7e626a22faaff scripts/migration/migrate_npm.py +a459d95bbb0076f33ade8b273b813308167f9d8d45242b309a2d18320ca0093c scripts/migration/migrate_npm_api.py +4c905a387f210c30fbf12a7738676fd39819bc96bc4a272da1db5f18a2d3013e scripts/migration/migrate_npm_core.py +960fdf97ec899107a567405e9b9c2b70ee16951d5ea26c37d885a7920f7b3aa1 scripts/preflight.py +3d6a0503afc25beab79ddc86864bcbb15248ded7368d33aa64321b8cdff59933 scripts/resolve_dependencies_0312.sh +d759315babd9971b354d6f702d4c861eb1cd5c41b1e2e0f1a94ad4d2c2db49a3 scripts/runtime/acme_provider.py +e69813fb1d3a4cdcfb7243964cc323fc21a603087bf2e84188fa42b9d3cee4b5 scripts/runtime/acme_rfc2136.py +91c883cfdce94c8c22c98749f611317f538a112d29be4f3fb1fa460b8f29ceaa scripts/start_stream_backends.sh +046b4282550f5cb4e53906665c91c7442be70fc68fd0743466fd832582f7c979 scripts/test_stream_tcp.py +f0b48ec0cc4411755cc0b4128eebce710375afa99344cb76198cf31074f8eb63 scripts/test_stream_udp.py +22e880e98c7b9d700c7a4c02b9b1d543e5dbd1f4ecdca42813a1083165b32a19 scripts/version.py +78efae6c43732c0f5527d467bf07d1f890da361925416c89b58bc449d852fc2b src/acl.rs +1d55ecb2e104be1d3b19623a1380584724c106ed234d2e79fd2a2fef1d891ee3 src/acl/dynamic/mod.rs +1eee2ea2c8dd6068dd0bbb058a06d26436f14767d8efbc2010bbdb4e3e523672 src/acl/dynamic/tests.rs +50d9a0009cdcee6dd34a6215755d98f38ea18fa39b9faf070d1a7649eeac6aae src/acl/tests.rs +6189029ba493982acc38c9dc1f47fa1f0c933dec5ecfb95b60f8be83d33b5aa3 src/acme.rs +b9eff08fddf9b8787aa04e72288ea2ca0033965e4563d060ca51f267e4963918 src/acme/jobs.rs +f7f737aa28d2d209f4f20a221885e3bb3596dfc8e3c8c9a22ba53bb975c52df8 src/acme/model.rs +b77026ad33be84706112881dde840e0fe4694b150dd3087d8e106737d07dd464 src/acme/providers/mod.rs +d1dcb7bdfb7cfdc9c3b88cfb6908201c58532bc888744a13f45853079f214659 src/acme/providers/tests.rs +c51fd51177a476be6462ca980e9bc13f0d0b41538f520118b80a685130f0dbf0 src/acme/runtime_bootstrap.rs +5a684eff5f3539c7bb8f66c3b83e7fb62527c52c61da727079d3897e0943f952 src/acme/runtime_env.rs +2f02b08d88ad3c1fc9827e5bd3ef463effba633834d9c05e9c0d6d2a0e8869c5 src/acme/runtime_versions.rs +cfc13a293c126bb511745859669719a14c72dd7ff6be197bc9e0d0e560deebbd src/acme/tests.rs +b28a08ea996befe10949676f40fab5f1036a274c7d0ab1175cf5c43c59849dc3 src/admin/access.rs +3afefdc6640d35bd55f20981e842647573f1ba80248680f99ba79eec9a7c4ce5 src/admin/api_token_access.rs +5f5b150bb8f51f57462e519650093354ae7b40fcb80c4380fd3391a33f4b30f2 src/admin/api_tokens.rs +34e851f725e8605e3c5d9946e56ac035996f3bd9d608169cba3408060d229c9b src/admin/certificate_api.rs +4a8b6406a44508b8ba102fef0d8309e871dbe0cbdbee1e6c8721baaca0c1aee1 src/admin/certificate_inspection_tests.rs +aefbef9839f9914ba05ea62bceff1463da3042b52ee851181ee39d4fbf7b91c3 src/admin/certificates.rs +521ac794501570cfa2e8e50c3a5cec2ca08ee4dbce8ac9c0e0310c09612f1062 src/admin/config_reload.rs +b7b0d3f0df7683b031136c05b314e206f7864e70514fe25165e41fd7a9382854 src/admin/config_sections.rs +c51f725075b5c4fc3fb7fb8b8b5f73987bff698a400e8950e968068b97a77631 src/admin/dashboard_presets.rs +aae1ca0e70d987830bd63948d431f54302083148177c1b551565be12df7fe771 src/admin/documentation.rs +928ba7aa54ea742877cf267ee7ede798f95fb75839f21492063ba53e5e989882 src/admin/documentation/documents.rs +b9c2952e3fcfca540d0ad64f2d3acc5c1f5240e707f4f23ef4d452f46fcb520f src/admin/documentation/tests.rs +1ce779b84aa8f47bdb3c34f83593c1f2f06d2235f0319847096cfcd035434168 src/admin/file_log_search.rs +059218501907355b22bc84e7e0c41ec72565af283f5e97170ce7707ea5874009 src/admin/file_logs.rs +d58a2ed83319176de4e66790ed292447c9497ae031464ec55cfe27174acb639a src/admin/file_logs_io.rs +77b8c05645969834cc8a58e249a7b60a57d6c47ad1c5cd92ffa5e4a9b5a8e73c src/admin/file_logs_query.rs +743bb7436f77e04015328a0e7e7d425e43ef8aa8d61467bde157e462c1dcdc2e src/admin/logging_api.rs +243f4a9c3fa99781e19c3952354d2632c0ce65e1dafac729567cbe3c177f94cb src/admin/mod.rs +5d7d041c7eaaf4badb9e9d8d48d0876742142a670137e66ae1b9b9b252481fc2 src/admin/openapi.json +f7a356109786635dd58cba590c71c796dbf36b47f25845190c75ee5c6a9fcb86 src/admin/operations.rs +257d93a29d0bda96462bcf695aba8d0ec0f9412c379e066ec46ae8ee034e3a53 src/admin/panel_assets.rs +f5127855c2994d052678865df36d703b74f4a0afc633daf7718b10da18d26e37 src/admin/panel_content.rs +80d7b07d2f0e0494e2a8c53f530b9d1ebc9ba68a98e95059f4553249ccaed65e src/admin/preferences.rs +cc3b08a80f44bc141107eef2ec41802b7f1f7b24ddc220f6375f495736bc0cfa src/admin/preferences_columns.rs +125fa7ea16d126a60f213abf4e5a7adf62c1a830ef96882fa4e0dfc2059f82a0 src/admin/preferences_tests.rs +62ecbae5dee00aeeca3eb806e2605372471dfab971cde8f66f11e711df8fcea1 src/admin/public/mod.rs +7a00e4ab943f74d2b1bdcbfab7f9cd3f584e9f59536b4aca6c4c31f5f5508d12 src/admin/public/tests.rs +6930b4f4b45257772b321b20a9becdf9bc4610274852948ba38c2d0cdf02dfaf src/admin/refresh_preferences.rs +d151a5a8008349fda5af06c46692ea0c8d1e64059cfe81df412ba8a781d81b94 src/admin/router.rs +e135431cb078ddb483165581123c64af8f00ea67acb3a395ec3e53c85d0d0d45 src/admin/session.rs +c4a3f1ab3d74f153f8bb94a21105feba6e04663e5be6354537f5897fc60cb92c src/admin/status.rs +6a405b189f40db88ca635ad054fd43801aad8bbd3e7f00f1b0e99bb57d4cb941 src/admin/status_live.rs +8315c856cd50f1072593ecb30c274d42d82f078b5fb93e7c68a8857cd81b0841 src/admin/status_system.rs +cadd7dca29b9aad8c77c7bc23dd249ea37a15adfa4d636a8ef00273a91ce35dc src/admin/tail.rs +95ce9f0025a8c6ca578d12231259d5baea38b493969c5160a2742ba31161a309 src/admin/tests.rs +c18c369124368f58524652565102817ed69fd25b222b0c5e737ef7632b45dcfb src/admin/web/acl-picker.js +48fcd818c522fe80f2c7b2e218f87de6a7772ffd0a24e93502780b03ec78e335 src/admin/web/acme.js +86abf50f39862d821cd2e43ca425671aa85289272915132c5a9a5dd1fc4182e2 src/admin/web/api-tokens.js +faa9735c2a02746b2954bc4955eb609f94afebb685cd5521d2629640cea2777a src/admin/web/app/backend-dashboard.js +aed3aea4eef0011c6b51d39736782e7d1ec52662e422f40e0c7b9ddfc19d0378 src/admin/web/app/certificate-inspection.js +f6b0533ffd6d0e6471519120c440619a7fb4b255854ba3dd23d81cb35cd21afb src/admin/web/app/chart-scales.js +e5b39b5592ba81292571033f26934ac0cd42bcdca7395e91094973cecb3eeaf8 src/admin/web/app/config-history.js +2bc0b8f29b76abe2ea3d8666b8dd4d7e58f3873ab2503ec056b2c307c7508a77 src/admin/web/app/core.js +1db5fd8f7e1695dd97bbc81a6da276c5a1f171454edf11c5b91c1ea5bf837d42 src/admin/web/app/dashboard-inline-layout.js +e87de2bc141cdb7d3ec62cbbe4debebb047e8d5adf6015743a97dfb0cfd268ba src/admin/web/app/dashboard-layout-editor.js +716d33249a52548f10153d8e2f5bea962a5f0427525272ddd3a1db636647672c src/admin/web/app/dashboard-presets.js +0be1024d9ff657044e04ed71f275cff3b432406d5fdcdeac726daaee54444abd src/admin/web/app/icons.js +e5a92fa1cb7e049082f0764b245560c41a9a34bcd8a9536fd872d9169fa5465d src/admin/web/app/logo-animation.js +4ea37d56919772d239817b7afa36d6d6386452f9d7db6a889940fe44c29d7508 src/admin/web/app/memory-breakdown.js +32aa11f041eafdf16e66adef6f5847a67413785224da2c19ecbf825996622aff src/admin/web/app/overview-extra-metrics.js +5e62cccf6a9507fe208e9f41bbd08453c3d8c6a6b83c56d93a2bb22550ea6e9a src/admin/web/app/overview-masonry.js +959a8f49a251629a501163b4b02841c7ec821dc5a0cca57c8f1ef45464266f17 src/admin/web/app/overview-rows.js +4d1d4760cdff44771c9d880a7c0da81d7233ef6e3a4868111a522703831a7a54 src/admin/web/app/overview-samples.js +db9012546cae8c58fc2bcbee71c9a95956a13a6db9e6d126c6a3770d45a4e4d2 src/admin/web/app/overview-wide-metrics.js +bfd9fafb3112197e8f875dbf87a9a66c81aef0fe83687601a84a66f5e13f69bc src/admin/web/app/path-permissions.js +ea6c65fd2584665a7b6fa48c2c024f7d214d7b5f354193f29a9da8bc0dc4b2e0 src/admin/web/app/preferences.js +9e2b12d34ab1fb29716645720577ad49b16c03b46c482a03695e8f645d170e79 src/admin/web/app/rate-sampling.js +3b8e566d81a5b94ef21c73e7805ae128454f085554de9358040de266bcbdb0e0 src/admin/web/app/refresh.js +bebfe4f835d69df1937dd34ebb2bc6da3b701a5e1825a56b89e7199fcc524534 src/admin/web/app/runtime.js +31201586925e6f4792071d7d03fb05dcc4a69a03c02a4e85eb0746f45af68074 src/admin/web/app/session-resume.js +c7a18238ac426de4d1cf84a395ee4dc66410d60a57a3822695dc10adc668d956 src/admin/web/app/settings.js +b7ead49224a4ec67181d3f24f9d9634bd6d76756f826a4d5d993300637d1d8f3 src/admin/web/app/stream-dashboard.js +7de070cc8cdde45d7e0932259299e341e25b32c9ffbd87e4fcce934d0f090de4 src/admin/web/app/web-overview.js +f87af546830f01411dcf93749b4f75ca0f0bb3745a3390eff73ee14fc768cef0 src/admin/web/cache-panel.js +9f323507649910561518b63cf6632e81b3ecc4b09501ae53b635705f34ea6587 src/admin/web/certificate-api.js +4810137aa4217a86770617d442cf5dc6bec0d9f19e20bb2155e932a9a111cedf src/admin/web/css/00-tokens.css +84584a08df60190f39c3d3d39c4c30fcd53eba6980ea1f237e28f546585bf588 src/admin/web/css/10-base.css +8a1996d37f138790c12a704deedde9de74f733e7dcbb6be816fd68c281e8e0a9 src/admin/web/css/20-shell.css +f6f58db86036ddbe569f6c20f7867519046771b5991bff5cedcd34a6ce7c9b5e src/admin/web/css/30-overview.css +ca93e41d1c6001d82f4891cacdd712e896a0355d6db9f76cf62dd2f2225a8674 src/admin/web/css/40-editors.css +87df062d7478176641364c07de396ca988a37b1a8bcb892b53cc578fe8471850 src/admin/web/css/50-settings.css +74419f367c4128824ec2f0901a99f54f68439d5d949d41d9cf3d6bd57568343e src/admin/web/css/60-monitoring.css +0ec5a4b64609bb31373d95fda8011bc42c0748c75a29d28de1841813f0e04f78 src/admin/web/css/70-responsive.css +8009afdb04d5170687816730cc930a22fead1fe0248835ca7e8de81d6907395d src/admin/web/css/README.md +8241bd9489dfed082863948829a44a49bf0a8e9cd63c55809655109e393e0918 src/admin/web/css/manifest.json +b369bd8927ee84d05f546c267dd48f849a0857ca4355847302d6ac2381100440 src/admin/web/dashboard-defaults.json +6f2631ffbd130db1f69f153749c018ed488116061a3462e0eeb38e5496fb1457 src/admin/web/dashboard-widgets.json +50d1ebcbaf4d0b2968da23bb943fc3f67131c5d32df3f61d23ff37aad9da5b81 src/admin/web/demo.html +bd170341634d7fe98172e0714b3cb8ee299a31abdbc9ab1309f5e61816dbcf0d src/admin/web/docker.js +fec062a5959450b1711948adf3189ceb37edca6fbead2e5bfc03b7ce397c70b1 src/admin/web/docs.css +aeffd403fa1823df7d9fa4c48280b4033b2d15e4cb9f66608caff89290de0a52 src/admin/web/docs.html +fd8506a91f769b57b62d9d8e389fb67764599354bf702958a913be79f779707b src/admin/web/docs.js +8fbc2a837d6f20a7f96c856a91fcba967b40a33494fe27ec876ee1b3b685178f src/admin/web/drafts.js +007c24189ad7b497d4da024fc52e6c51393f91ee135f525a356e1f14882b7632 src/admin/web/error_400.html +232b766f278ae4424705af351910677fcd7ac9a20bb8320d9a12b763c91219a2 src/admin/web/error_401.html +16293363c7848471d866092fec5e83023df087aa824989e87450cee7b7ca1263 src/admin/web/error_403.html +f7d0955ab18c15e04369204e789f341d2e832f927c1ff20a3b2b9e35e7898f00 src/admin/web/error_404.html +64126ffcb39dd9bac7772fe737267f8d9391ee6b750d8b84f024f87a6123db3a src/admin/web/error_408.html +4ba01f7a53e9ca914e7b2100c1d439bc56e46be698a9c020dae20159759120ac src/admin/web/error_410.html +f2cb26eec86b6c03151072f847153df8aea612d840ca8b76367f41b9605bce64 src/admin/web/error_413.html +7dc3634e3d508176545936f77db9deb3dc51f0abb71985e1950aa91b81b6f44f src/admin/web/error_429.html +6fdb616c086b2769e3b484133415a6f8e9274a74d03ad95657eec480b3a28b9f src/admin/web/error_500.html +ff72fc4c6a11907a16234c4b3c7d7f7bcf82eb72868dc3fbf654b04aff806fc8 src/admin/web/error_502.html +386b9dc3aecebe7727f7cf7bbd2a02ab036a3abf01315975111a51559128df73 src/admin/web/error_503.html +e6c4d91d1542d0a5b47bb8736f9539d43a6713df5a473b635519d5b7eac2eb9c src/admin/web/error_504.html +003d382cc8dd69ad7237679632c04a9389366bb71dd7dca8ee64ee06614aa9a5 src/admin/web/error_auth_provider.html +0a5fff35555153f59d4346933030a67b6e1a8768cee7a47cfa2fcf1a2c564f63 src/admin/web/favicon.svg +7cbdef9192a9dee1f8eac42b85f52b3190f7f6efae50004aa7ad116a910e4036 src/admin/web/file-logs.js +882e99059bb2ff110c452eadc0b5779a16af1e34cb1b2536c80cf2056f8c3e8a src/admin/web/host404.js +ba4c7aa74400f35e1bee32c3ff86fa8793ae69685a20d81776c762ea681d5c5a src/admin/web/index.html +5746049029caa135646ebcefb3d419b07eda17b560a9c015c59d27f815df64d8 src/admin/web/integrations.js +7a12f020fc587205694978ab41b660e9a80487d413fbf6e34fc525eabc58308f src/admin/web/login-keys.json +ac9f667273918e18406df06cb2613c923f50a88897693a03a18f500e22dc6ec2 src/admin/web/login.html +c2e5f554810b8e34fb47361fb90a01073a2e332ee26d82e030956fad3ec1f83e src/admin/web/login.js +44b44790341067304e15974afcbbc7cc99686e88c2e43f62979d285eca6f726e src/admin/web/management.js +1f3d10e389c9c20e6eb019509fa6e82b50c6b43bbf988c1210a4d42bb73985d0 src/admin/web/partials/overview-charts.html +f619250d8da61517eb2151f17b640b06057e091640280091e08afd483d67e5ff src/admin/web/partials/overview-metrics.html +3928afce2ed6d5f2d3e29475dd29e4c3bd3c6df180ad5119beaff0c7a58e3b3b src/admin/web/prometheus-token.js +6f33915d33d3a8bbfaeec424651a63eda3d23b0f296ae028a59ea46463ba9fdf src/admin/web/redirects.js +76a01f590d49649dcb1f554c221290919b2a8438e6001737f3c096fa6daec74d src/admin/web/settings.js +8eadbada619b15087783dcfa0e889a81f88e78034d084c5ab616f7912b835940 src/admin/web/status_200.html +a5191e1272939014a21b8d16588704952e9a705b02bd87fd8f8baca0a64ca919 src/admin/web/streams.js +ae0259cf32f53d69a22a640b1c34562018d4ffb3864494012de3a31c0bb4ac1e src/admin/web/traffic-panel.js +675ea169d4cc55fda5e291af536338b882bede1eaa6c9d5cc7dfde0779c7c4d1 src/admin/web/transform-panel.js +1657db2c683292411c53e4bc0f67784529b7bc367552901d013e2c88793d613f src/admin/web/vhosts/core.js +3f5fc9649801d091708e495634192fecd76482254eb671551427d3ee580eac65 src/admin/web/vhosts/editor.js +3776f72d7051af86ac5fbdd4581040dd88a424c0c6cde789301b032b159094d8 src/admin/web/vhosts/health.js +b3239e67901f1796d7a974ade0796f2e3590ff8064628a5629b78c7f6ce2f32e src/admin/web/vhosts/protocol.js +8c3da49973c62333559b0e3588c02beb0b425c025eac5cfa82a1bb968f70d9dd src/admin/web/vhosts/rates.js +eb9d692cb0437860bed0da512e321e458a3843216773fd486dd1c1f57287cacb src/admin/web/vhosts/render.js +4dfdeb7c73c2775eacaca65fd8ef1dc80b275421b15522d319d338f5b96288cc src/admin/web/web-server-profiles.js +9e8e99e3cdfc32097d0c63dabb19d1e439b3be2264baa67678b46715b3a5bb4e src/admin/web/web-server.js +2d40c2cb32d7365df0c9cd6c8cb6f0483c7a799786c648f4836a0d9740c6c5ef src/auth/files/mod.rs +b2f948bcc3dbd24952c7b1b02d41d06757f49f0c38a78caf51f8f8a687d8480d src/auth/files/tests.rs +50ef648351271d78310e00caa6d246e0009171ed036a3e4e1144737df8c064c2 src/auth/mod.rs +cc4ddd57a264d12bffab131bf04b5cd22df75d38b61e21ce669f5a8a97b109ac src/auth/store.rs +745226cabb007819370fc6aa680995a03a8a13fa057dacfab0fcc21d0c43bbe4 src/auth/tests.rs +a4c14df927c22a7fa46023f25cfe48d3aa3c245bec97fce834999d9bcc8d75e1 src/auth_provider/choice.rs +514e99e0d3da21abd633d53872234bc4d7d0178583ab291e53cf4b1802fd5337 src/auth_provider/errors.rs +d3d9b756f8dd0444ce6937376f27fa2eae7eb4b9304a2ff039d272c929592bdb src/auth_provider/mod.rs +72a6e245cef078585bc39932033c05cd866ee518e9cb4e7b89bca87ce941e971 src/auth_provider/testing.rs +59e1af728770d28265198844b3dd5740328bcb1df96d170aae575d3d97ac42d8 src/authelia/mod.rs +36f87348cf1fbe557f6e94296d30e5b36ae4817b6a18071767d96ea21e43f498 src/authelia/tests.rs +0137e66fb7127f1ce023b1c6cfe3fac3fb1e8be17f1de722f8ef4e66d2594a13 src/authentik/mod.rs +d4a388f0897e50ad26e1d8ea527eccdf656557abb4b88fe714cc2b1969d8715e src/authentik/tests.rs +32a25e53ac9542424debeaf1b637155bd4e60abd8692df082729d81232eb90b3 src/backup.rs +5e8b1d7cf8280bec54521cec9e4a8cb9cdbed5deaca07e3a79c43d2336f22a80 src/backup/archive.rs +15213c87d4393739328ebf0eacfcb45f864ac12d7bd7509f750a241032f6c7e9 src/backup/ownership.rs +6edb5aabd210ff2d121e435815b5501c9eccbd7a8ba230c843c6335a3e24f94b src/backup/snapshot.rs +859cec0bcd604f205d7d8e14d1c810e33d97fd7cf00ddcc30877bcea7c5fc2b5 src/backup/tests.rs +5293e1b06f82654929805b53b9092a82b7503a54b34da3e882a999c5f14ee579 src/backup/validation.rs +eec564a7ef886d18ab75289025a47d62bb702f07d63f92d2f83b7afeecebbb15 src/balance.rs +9158a2bbb303c53bd3d2c779d9eb6e4470d028c4f28f8e329788e9c8c830f843 src/balance/health.rs +458733ad4ec56d58112de6ffa3539ca7e9fa8311048a4e120da96b5f899d5dae src/balance/lease_runtime.rs +bd693ea1d15d8da2abc08c6b5b50d42b693d9d4e9344205e9ad7ae779c19387e src/balance/model.rs +ced69832cb32e7dbd0203d74f5a9c60c2cdc682729f4c5e2c01e7c082e7adc24 src/balance/pool_core.rs +477132dd381e23f1be197c32ff58a0925f41d3e6aa63fe77c10973cefb2b76f6 src/balance/pool_selection.rs +d789bf40cf9433e2fd16409d112210fe93154588b1ac9bddc9c7f78e1db14426 src/balance/pool_view.rs +a361c341932ffd186c0b21356c91ab1fe8043f5020d40798266d15ae896a114e src/balance/tests.rs +ae06d238b1451328c751a511476ef39c012f3a397393f939ca02f96ecd0119a6 src/basic_auth/mod.rs +9a8858b7ff461a4d961ba701ca3ed6eaec15c3f7f05eef8e0e30edc63617605a src/basic_auth/tests.rs +90f26bcd36720076f874cd0a21230316b7303f68e23839e987cf51e13c23352b src/cache/cache_regression_tests.rs +7def03ace07dc38a4806277d75b6ce673d33ddaaf1c4855fa0a3372be1cf9489 src/cache/cold.rs +b75ff512a1c6344483e00d2c67578ceea6b5472c279da0246f3622daa68d7e16 src/cache/cold/cleanup.rs +5fde9e9f77277d557372e4614264512804192bb51f3d2eae785988c17b2e7253 src/cache/cold/cold_tier_tests.rs +3c3897980c31a69d96f9295689d1ae19f2190da758c69ee7a0541f4171288bb8 src/cache/cold/demotion.rs +17b2a157b03f43f49ed05f1f3391aef025a453b748056c67229cb3ceaa53bb7a src/cache/cold/startup.rs +83095bc93132f306c537b31ba929669fedac99af3c4f133d0533b5ed7ac4e6ed src/cache/cold/worker.rs +c6c54984cf3460e6227d40d8d6917d7ca5d809ac364c80effe354c64133c765d src/cache/collapse.rs +346fdb40d85627b583a01fa17c65e45c822dc7216198cdeadbb3d07904286fa3 src/cache/dashboard.rs +be3d80cd340edb47755190a668e2f2a2776940665f95ae7110893b706eb94faa src/cache/dashboard_tests.rs +847c660e6cb7d752f9dac2807c5045a000172c25b0e437cbade06ad7b101dcba src/cache/fill.rs +675d18afb53f25c56cba49bbb431fa39ecd9d7bdd192c7b39b0698225de7a2a2 src/cache/invalidation.rs +c1357a13658e1ed5158084d3a41ba9ea906512774a5863ce9c56cb508d3fa6c8 src/cache/invalidation/ban.rs +bbd9f372648d89b5e14d5b58029582d37f66a89752caf2c14eb1cbf8f24bb7a0 src/cache/invalidation/http_invalidation_tests.rs +6223eaea3f061b111330cc26b28d85b9b239bef30328025f2ef337291e22a445 src/cache/invalidation/invalidate.rs +c1ee3d13b373672c53b5c9ebfe5c4b66b89f2f2913c328defd5cf6502f96a654 src/cache/lifecycle.rs +bd831807ca4720b3a41a6ea1d9a6c0ed2d935225e2dacbd9313be064f2e4a20e src/cache/lookup.rs +c2e258da25fbf6df7da3de5a80a04d74e85c03ab22c175d7c9a6340b8ea1f1b5 src/cache/lookup/hot.rs +4148106b9baf70e41eeba24233b1edbe8dd6f927c11f2c7647e89fbbfb60555e src/cache/lookup/hot_hit_034_tests.rs +e9c6ab0c2be9f96573f826e6a1b9e4c2b8b526f779e72e95a6463ae07e45ab55 src/cache/lookup/insert.rs +7f02dc8eeb6123cb22307b76985b606afda2d87b7f845894685cfe4a9aee8b2a src/cache/lookup/tiered.rs +639d5be6258699ec7e9f260ec33bd2c366203b6655bf0e98f30517c2e12ceeeb src/cache/mod.rs +0c8b0d550e94d4474dcdf991aa0340228dc5f2f904f39350e6e666a16f16fe87 src/cache/model.rs +b96e30ef2b12ad7647915457f087a4d11b6141847bc5e971a75c2739c88c3d8c src/cache/model/cache.rs +0ec4f6d0adea1ed80a3ca17c68c9c85502491da2904d9d690b4169ab9b025b21 src/cache/model/cold_metadata.rs +f52123b588205ae96c7cded93569e99a1b4db4b361e1f7a91fc703afa6b6f6e5 src/cache/model/entry.rs +ff1c3a1a3bc0d26218dcc943ef951c2a212c180bbf6e4bf1c542ffbf12a9f150 src/cache/model/http_invalidation.rs +ee9508498d420a726abee1d12ca21fd5117c1908ff53c2ce29f01de4380f26ac src/cache/model/maintenance.rs +723c6f0580db70b1ef40269b28a4aadc89f024b25be00afe73a971950663d252 src/cache/model/settings.rs +14f3f8ae5252a2dc13fcf9556523ffb945b77ee92a5fb4939cd27e113fc61660 src/cache/model/views.rs +e26dce02df9c043329ca164fed215d271781bce8fb03240f528331bf3df6b9d7 src/cache/policy.rs +70c255e15f2b8c030988a2263b0e07b5c16e7e26770c72becbcec6da4550fcd9 src/cache/policy/request.rs +6ae7a79886dbee537d15830c4647f59f158a2b31425d1c0f06218590c261c968 src/cache/policy/response.rs +12a6d5d9d6711e956391b4b952e8149658b8bf64cfcc0a4c59c281f2630a6aac src/cache/policy/scope_tests.rs +c3a4300f7cdb6b2b7c16fbc489d49ba2451331bb4a55a2d9f618c684fd61eecb src/cache/range.rs +e1d3f0512d6290b0ac4998f47398a0a7c404db249c5bbdbc4ad4767071013a72 src/cache/stats.rs +8a300f5dad44815401eb23f4f5a157893761852ba4f3005041e0eb3f16892ce3 src/cache/tests.rs +98af70ada3b14f3ecc94c9c76b028c1b0de1ffd43d9836a0749de763f64d5402 src/cache/tickets.rs +a1132b980833b1b4ce2bba9aa681ff255a0e2d61faaa65a316860da503ea1e27 src/cache/v022_cache_tests.rs +4ba0a2e1c21a79cf68bf34cca1f2c2a3d7b20aef38f3b9f510743e60bc1d425f src/cache/varnish_compatible_tests.rs +1a2eb6684d9ea4a7e90970d936c75f7c8bbec46a4181fdf273be9bdac8eec847 src/compression/mod.rs +8de82d9188c9c337690c6ec4afdad9fff20651c358e34602a93d8bb8c3d2489a src/compression/tests.rs +e695079333ebdc2a6e7b3337cfabef171b3a0a01da0597b77feff70d417f833e src/config.rs +2c4312dd7410dc231ed204d7d201d716eedb41045fd95df7cbb51d5561540d99 src/config/backend.rs +6ad644fc4ae821d2c30329ace36652a7ac12d674e71e7dbdcdda3554c983f6f9 src/config/compile.rs +fbea01fea1213d98aea812c1b78d5db289e09200b98ae514d742235cd3fa70e1 src/config/internal_routing.rs +cc75698be2828000e88f2c482bd26f2fa4050e3432bec1b5a581dca17fef4a37 src/config/model.rs +75839458ddbc7480ec4492a95eeb67b617ba7d62f7b67e7a767a3453b74dbcbc src/config/route_policy_tests.rs +e442c6561723e8dbf73d25912227cebf7aa84ac1523e8bda8e6b4bdad1b674df src/config/routing.rs +5bc35ebca158aa399a1d2273c21130e1cfaf5c89cb401689ef863d7deca6b801 src/config/snapshot.rs +477cddaa1e1c0b9b605a2f550971a04cf30287519cba70cfbb2e1860e3a93ff2 src/config/tests.rs +f35de0ee1516ece6bbfd2b2a7db7d1e0f5048b0ec47cf2a3765dffb799abfd93 src/config/transport_tests.rs +a09f361d70510d6226f4dd6785e649c3dc01ccafc70a4c8b0dcd098e224129b7 src/db.rs +c290d0cb02dfa5d2c60ecabac1cfb20c8884e3d14cca1944906c6d8e677f1784 src/db/api_tokens.rs +892ec0e5985700cca399c861197f6c9d2f1c823d8d95b88abac9d27ae15a069a src/db/certificate_api.rs +5491dd7bb9b3fceac97c4dea63aba6d5c7abcb0fbd06e36ae986e00c79bc07d0 src/db/dashboard_presets.rs +2ff744223934685439374572b83fd639bb3eabdbac168bea4a6501a6e9ce0ee0 src/db/history.rs +c05a02618d476e4670b4f9930555f199cac776cdf09edb8fcc1a675695b8f99f src/db/tests.rs +dada314e1709e960eb2e225b4d10c3cd12606c62c4bc2c0220aec1ba133e4ade src/demo.rs +9c6b538245b2bcdbef851800ef87d11a6c370de5451488a08d9fab6d67fbbac6 src/diagnostics.rs +045593a42a6e4f632e5052c655788f0843faa313fc929265b89509f6dfff91ed src/docker.rs +9a68e0d5bd98541314f1ab5a4c2e344e9837f315bd39ea3988ffab6a0f0425ab src/docker/client.rs +8feba6d9eb7fde798cbe8a9e339d6a5346cfef039980fce46727386717635eec src/docker/model.rs +f095e5e3c564df409874019c647f7cec2156bf5a845b5b84864879fd07cf80ce src/docker/reconcile.rs +2e8d4841665cc1d29e6262a1789bb64ced1cecd0036681cc1ef7b5d5bfe22065 src/docker/tests.rs +0b6831d03841a1dd2d6ea73d8268d0b3fda678c6d9332447e269f1e45c60c0d3 src/forward_auth/mod.rs +6c25951cf69e972c47cdf815f22a5062916b2b768e39d55a26a5fc9e625a2344 src/forward_auth/tests.rs +5d32cf9177a33d6fb50452541805b10ae1b0833e709d833f5bd1fc6907193ffb src/forwarding.rs +b266c0a464bb0c6b581e423d08304a0121f126e8e42ef3a8469cadad42810fdf src/forwarding/peer_formatting.rs +b821e2efd2939cb13d01e402532f33feba6682acb6a7a3223be086c1cd171820 src/forwarding/tests.rs +0541ad50b7bde1fd958fca59d2a4f9a0fde197bcaef68e6bf892ffdeaac46be2 src/geoip.rs +e3646c044604bbc169aeba549d973d37b8ac52f88bbab4a0ef74c6ea69681eaa src/geoip/mmdb.rs +1e8777b295e6a2de15b55548e8c4c3a4166b1c5af18d4d33bf067d8bece1b590 src/geoip/mmdb_tests.rs +cfc75486e69c310fa6e7bf0448ed39a20cdad9dd8afe75e01592fc7c76a380db src/geoip/tests.rs +3376ea3d018faa5cb8a69da2f1d5b7cdae4bb4b8f28f373f8a0a2996410e1bb7 src/geoip/update.rs +86a16add6757a377264ae6afe071039851d5996e80baca9d4882b71889d7c2d2 src/geoip/update_http.rs +8c72a10f07f82e2c0864551a3c95e261129c23cf6072f902d063564b6ea6770f src/geoip/update_tests.rs +61a2b01db9010f9debfb38b43a26bf588438a5e470dff938e4e54f9d7ba46732 src/headers/mod.rs +3e9a19c221fa7e63d097c185470b17313da7c200a73ce50f6c069b4dddd37a96 src/headers/tests.rs +027d414f51e910ff20fbf3a924ab6b136178858f27819a046a922b1d8f349cd0 src/http3.rs +2554fc93a555e1f39d12d8c172097a4a4571d79db2b6b871a5a1bad0e8dd2778 src/http3/body.rs +741972222414c280104acbcd8f8071bed9cbfcfa2f503c487c11c56f553f53cd src/http3/diagnostics.rs +49ce4452ef7973cafa2e4071e2e14be0e16000e931a6501e4dc613652e49e230 src/http3/identity.rs +0b41072f6bcf28725c80f471584cd55d4900424ce5d55ac7f6909813788c63fd src/http3/settings.rs +5c550075c7b0fe687ad02095c1cad57b46b579fe21dc5371525b6c77db459886 src/http3/tests.rs +ad0fc77b4065e4e59e97db60d77970c7336386e43b779198abcc727245f8c791 src/lib.rs +e8399753a6ff49b7de19edb0a268bf871c9979a518354160cf07b4669051fcbb src/logging.rs +e4be3ad758c3d93ce52dd3b1ab1a87810e5226339400ed997607a5b746354751 src/logging/error_runtime.rs +e9795eaa3e743c09f5ab0e18e6d359bc97a3aee55510c74923532d64df90c873 src/logging/format.rs +66c4596e644d9dd539d468575e2de6459bac2624fb1e1064cdae61a21c2e0240 src/logging/model.rs +bf898b318feb9bd3dd2c335b6b1bad172da63fd5cefbff3e267421ce37c076fb src/logging/runtime.rs +3d6ea5508bc9609c6ce99a3a1d3fec2fafb95a2a8de579a80262b73c6eed3a63 src/logging/tests.rs +cdcb3806669207c17279da959bbfcfacf18cc192f24e862c0afa0c389a41631a src/main.rs +87e69b46c548b861e9d90d9d2e42dfc2630891f4583800b1942f9065d25e29cd src/main/admin_runtime.rs +224da3127b5f846a8932fb7f4b6e23d0dd590dc0170506267381d66042c64666 src/main/bootstrap.rs +5a98d0e249338e73aa57ae2e352dc16db2f79c2d042c1544ce1c2022da76a31c src/main/proxy_runtime.rs +b240033715323e7cb7b9bcaf92edd481f7089b4da6bab25005ca6733da8756dc src/main/shutdown/mod.rs +0a6578a0f4023b9f8d73043bf942dc5e096ef9afb8c0d2f131c14f65d08ac01d src/main/shutdown/tests.rs +ff491043180085800b786b77e6bd3c400b60051012482918440cd5dc6493d1e7 src/main/tasks.rs +a719c51aebcba0f16f8810c37618201954e79d6806da085ee6c5e4697a05b521 src/metrics.rs +9c7ed78345abc33d260f8d5cd52339bf8de748c08b53eaa2bdea8a32a0ea2a20 src/metrics/global.rs +31154052757c2bb975b8ce8cad67f3fad7b5132b615a73d5b0d7bf1b5311722b src/metrics/rate_sampling.rs +f27f1f8bed769883d1a7ae6a48f89f7712394dfab65d05702b0f944f0a45bd8e src/metrics/vhost/mod.rs +ee401f943bd8b2706c33419ed69102269c08dcb4ceba6f4be2ac0861115874a7 src/metrics/vhost/tests.rs +f2a632f9d3d7f9985ff796545263ebe03fbf5e9a5c2e88288e89a700d3af81d3 src/not_found/mod.rs +fa2fc6c6987a8356a9da92cade10db62426d8863e9cef3c0d4324c45780c5b33 src/not_found/tests.rs +c19998732c2d65b464f43d17a58644db5bcf7b4a6dd4c31a65a091c57692a5bb src/oidc/mod.rs +c4dbe0f8ded237d45b6a3977bdc7544296e4408996815cae9e28af028419d0b7 src/oidc/tests.rs +992f49379e44361d98088d8f8ca1013d62846a54a5a35c089a5e0e1a9488e08d src/oidc/token.rs +eb95c68c8639ce3ae658eea3334795cdb5e129fb2ba10955f7dffe06d8909b57 src/pages/mod.rs +86008e469c84a7242b7d4947e2116694ababa2cb26120f246d00923a7c019720 src/pages/tests.rs +5650a3f70162abd97021e0a51a92cac2c4dd39004426ef99dff36cbb0741aeac src/prometheus.rs +6c97eb9c593a7802422100e8130921e63b6b9b1b0387b6860af9f49581cd50b3 src/prometheus/core.rs +2321ee667569803dfe6c92c0e98adba0ac8fcdc6a3eacd5857233f1acae93daf src/prometheus/docker_misc.rs +cc909edf740a091f9057912f555dd888b644fa1cb49647fe0e2e1f5dba8ff5af src/prometheus/json.rs +f9aab3297fcf647295849f77cbf99197f4dd27efd6817e54c03451e04972430c src/prometheus/model.rs +f8a9541b568ade946dfc0b3353548a773a0126f705b537815ce0523439b07ef4 src/prometheus/tests.rs +028e1dd9f2ec2afaf699a6b21c2d4b0d96e76f11f5e4ed009c233dadf0f3be51 src/prometheus/traffic.rs +cdbfa0e7f49200dc70ea6df8f0594399ee3e0c5fc3d279cc336e2d83d0f8a535 src/prometheus/vhosts_backends.rs +f1b0254f53b1a4336bd8170ad441ba072b49a114e497b985cb20699b4e375044 src/prometheus/web_php.rs +315cdf2ec1479433aabee00f616e8c0a9ebe4697bd4928885433b80e52a706cd src/proxy/body/mod.rs +5beeac12ca7f041bdb9b74b2dbc9781f5d5524fcf51294b8b6ad88284754ef20 src/proxy/body/tests.rs +1ecfebeff9a6b933368095b84762e2816fae8a99339e0b854e67e9e95a937e3f src/proxy/cache_helpers.rs +2d39552aa01ce3d048560944975243d0a58ae762d838e547f5fa65007d871dc4 src/proxy/cache_http_invalidation.rs +a86b10ce0707b51e925e11ea14f7f40fa108a196166f62cf40007a97f9e17203 src/proxy/cache_http_invalidation_tests.rs +df239d37b008691d54e257626009684310e6e3712e777094b8450579d56f732f src/proxy/cache_plan/mod.rs +811a00b55b24638b4bf8a6bea9ed7c0ffe2a758f76bfe63a95e1d31bce1c2c9c src/proxy/cache_plan/tests.rs +d6bd4aafab7b1371c31b3d22ddf949a08ea942489649ca12c7615b3b2d5a109a src/proxy/error_fallback.rs +d0d64fd4dd89efd4a9fe089ff4551815cbeaf5b883ddcff803f1b13b5e918dc2 src/proxy/forward/cache_fast_path_tests.rs +7611390a02341d5f9fd223626e57e0f2f129ab45e03fb1bc105be68d46b86a9a src/proxy/forward/cache_lookup.rs +287012c81144d8f15af4a148ce3ca911d431bc59adff44e697567561aa372bb3 src/proxy/forward/h3_navigation_tests.rs +728576f7a42292386eca9cf450779364da87f94dc0031ba46c6f4d5302755949 src/proxy/forward/response.rs +0ba6b62e8560d6f7b99ca7e387f058412fd44456f5874a8258c1c24595c435f4 src/proxy/forward/route_cache.rs +28aecd57891ef67a618a0f8e4df0aee95d0cb6090facf37e531cd190331d06e7 src/proxy/forward/success_finish.rs +ccc54869ffbcf1edae9ddb96f6dc2191739f8804ee0318b7a6844def6c4693e5 src/proxy/forward/success_prepare.rs +c965dba1d2639b338f3f3cfc17f760786a30abab708dfb7920ea3bc94d4d734b src/proxy/forward/upstream.rs +5d72200f3b5308215b7a3d7b1f910932eaa4712f9e2954afdfbe2f252e2a2d3c src/proxy/forward/web_source.rs +602879a0f8f475fe63b5e27238f4b371277a6780aa970c6b140c8d7fd3074e37 src/proxy/forward_entry.rs +9b25f5e3ea4443a63ee6f45d12e1957dd316fe8e85325fc00ea416faaab1025a src/proxy/h2_graceful.rs +30057732c35c369740a176f7da285e35a4157571a04328f6c6f1494d4ec8550b src/proxy/headers/authority_tests.rs +e87437ccf80e50e0159d204dfdd1f8dc0739b6e375be192fce0af749810258cf src/proxy/headers/mod.rs +af9b044761a56e8a6dc57f9d760b289ff4a6bf37db11dbfcd3ec4da5b8f426b6 src/proxy/headers/tests.rs +2bc63579975387c92a9459a9677b4a49e76df382b1ee19de12c8341a3ead57e8 src/proxy/identity.rs +a08ee061e146cb7a08311106f73a04468c89f77b6ad05a2c623621a2ae9faf2a src/proxy/mod.rs +92806ce1802da9b6771ece474d91a3458eba3f6ed19b0817b897e828a02e7e32 src/proxy/redirect_helpers.rs +de1763b89d98607e20f0f6e3c9b546483927cbe5450efc2e5634fe691fd52ad6 src/proxy/request_id/mod.rs +78bbc1263bcd600527bf71acdf5af92bf186267a9084b076d1f75ad6492df659 src/proxy/request_id/tests.rs +9d7cc19e78f50c9b96e8ada076e12ba96d7a19a51975a13e554c4463e624ee92 src/proxy/types.rs +e44430c54038a7dc26f327b5d7085e965241da2ffef42c1526ebfc5168981f72 src/proxy/upstream_helpers.rs +c3887e344249ce492862c365896731127b7b6fc51bbfda274d7e7aad3a70be0c src/proxy/web_cache_revalidation/mod.rs +5522456cc85948228250feac92308d53b130c4a7af98d24f669aca4dfe6999b6 src/proxy/web_cache_revalidation/tests.rs +3d591201595a3b1e928ded20a8736477a47e5acc3bcbde158f7c17547ce155ba src/proxy/websocket.rs +aa58bacc35458ac615680e774a235191f80abf0db978b68095571fce94c2b502 src/proxy/websocket/handshake.rs +c02d42b5c7eeedbc54c58e98691f7d8e39f8e9be63a48f6d6b4ad6b8ea431b7e src/proxy/websocket/http2_tests.rs +faedf6cc2bd4c42f342a0aa188b634d6b8d280ca0e121032977eadaecb88e9d7 src/proxy/websocket/http3_tests.rs +7e9c4d4c207badabf90630223964bb2ad641f06d4149843cab751f192b8b4adf src/proxy/websocket/tests.rs +a44421714aab37f7ceda19e3ec2512c645d2a3ce5dcb3da5bc7a0d87a442d6a8 src/proxy/websocket/tunnel.rs +999cbf85cb6e917db529e30ba4a5eed1cc9e95a054da7b3039c730bb80061449 src/proxy/websocket/validation.rs +80d0f744f7ad9f0d1edeb0d5c23b13cb40431f6b6f4d10d534ed34d4198e3dfd src/rate_limit/mod.rs +c85c9f05dac65cde6878bef3ef7258eb9de79ca14c26ca2492e0e13839c40fc3 src/rate_limit/tests.rs +db254128c8013adaad7280f40a0edd8b196083afef299cd9e193e6db1d698b82 src/redirect/mod.rs +811c83ae9fd0f5a13d35b5443cd37843f82b9d600bee4bb136ba9b87732a5347 src/redirect/tests.rs +244d72b3dab36ec505c96d26a967420714fd3807268820f680fb3dcea0e88c0f src/runtime.rs +3c71d8eef9ccb49ad93cf6014c5c27756ce0eaeddfca116048f24c483fda68e2 src/runtime/certificates.rs +2d610dc36f746215ad3bc1d860ee624a9233886d73a019fd243e51901503fc53 src/runtime/constructors.rs +eb2b0eeeb617cad704732d87acb667530144836e26edb0189929b1f25f35c6b5 src/runtime/docker.rs +18f7460e3738386e070f66932cd77240001255447a769d6e19a40573254a1473 src/runtime/external_config.rs +5999d7e91ee4231da88c5e9c6d8a12ea9f92d20d6dcdb24319f9f90891d7253b src/runtime/tests.rs +bab3044f4ad8957b65476a0c307bb8a364825b91d2100233b7bd6efa52e771be src/runtime/types.rs +11e99eb425887ad12b73d949f4b497fabc6897fee8fc7647fcb3766269c2fdc0 src/runtime/updates.rs +e3dbd60953db5a976985dd796e4268b41a0f3df59764c4664015bd41e2578058 src/secret_store/mod.rs +b0c4a46b40b09794fd8a037afca380ee3b95941bf75a0e1102a4e520a4bd8be3 src/secret_store/tests.rs +53bc7b1fcc1eab8860ebafccd0c9ed2aadf75363323891a4a4a22114c323b22a src/security/mod.rs +0e5fc2aff856bf6fd959cba12b5ddd1e3b3cbeb0fbaadde906c811cdfafdaae7 src/security/tests.rs +0e8589f56e3229dec556b427b87c2cc5a5a9ffaa9ea84fc2522dc72d3239027d src/server.rs +4cb5afb53c824f5c87abaa65ba5dc85e937255c4a3dd14af16df9af7e01afb10 src/server/http.rs +533342fb3bf8b52743d3a7102ffe345be9f86d553b16a1ec322e468b44b0a7eb src/server/http1_connection.rs +22fca56396333ee7a5031da35b15c3258e93aea4ead6af733fcbb1716e21654e src/server/listeners.rs +1c4b84a4aa9f120ed3b7669a145ef51e90d825c559d40088a2b4074bd84a4912 src/server/sendfile.rs +5f6a59c6085c1250a93a70020661d1e8174d3b600b494d16f8eaf7941ee3bb99 src/server/serve/mod.rs +048a05a46108f50bef7da50b0c03b752d76e586b411de8ca3f55313bbdb08aee src/server/serve/tests.rs +669ea1041c103cb952f7a516363c8fe7baf51622f721aabdd57015e0e0279530 src/server/tls_runtime.rs +38abd50db3c5742ee6514654bcfa0b854fdf6e2a29e034ac2e5d36c4b95b00ae src/settings.rs +b2e2924047019b1ada59c58a4060476151c99be12c0b4092f2cfd201c0756255 src/settings/public_origin.rs +c599d1cdca84ac18da7e7cdf6e2d1556d4df770481a0607edb96f6068cc051e2 src/settings/tests.rs +2ad7888b263e1dd9f0bd588dc35590c9eb232f8fbacd10ea7554cb55b4dbd25b src/stream.rs +c7771539fbb94544947e958e410c46b73f9647011e56b1b229ce7035fe21851f src/stream/health.rs +4b9cb1135c53f4a159bf2fdc1b0c7900653d7651612568f38c12f06e70b8ca72 src/stream/model.rs +42aee5900c3c8697c80220c77a6af0435358e3b1fdaf1a246784aca4f62edaaa src/stream/pool.rs +6ec42b8647c95a0c2025462e0be29c71481ce1c3b1f4d4193926471f1cf06be0 src/stream/runtime.rs +9346cbd71e006e41a7188f28eb86f9b00bac822e4cb31c76c8d6d2ec5d4c4711 src/stream/tests.rs +63924d279f5fdfde24d2e0663518a123dd673cc6ed9ce52233c4b6851bfb1efd src/system_stats/linux/mod.rs +d9123c623e2a97d09e41edaa29993b4b2c8cba39a3abdf2b48a205aa9a9c2939 src/system_stats/linux/tests.rs +e0676801259fb09a73825d959b89630bfa0b6f1fd1efd3006af29f60537a2fdf src/system_stats/mod.rs +050aa831b1012c4aaade63863f433f01bfacf5d3f95787e57975572116a30ab2 src/system_stats/tests.rs +6b955b13ef848e90dae1ec2906176336a775e9511f3688779203d922ff7d23a8 src/tinyauth/mod.rs +3d40febfbaf38ca2725630eed6b33106e353086081ea811107e4ec9d24f7de11 src/tinyauth/tests.rs +df98becda799b6bf4ff5e2fec7d0e0a486e6b7eca6f9f5ad49ffdafd49a4f498 src/tls.rs +2af2164ecdf2b7fd9eef7c6e358dec053dfac9aedaa501dbb75df742d18638b2 src/tls/acme_tests.rs +93e0576ac9077e645a72d164bad34cd75fe6032dd0516284d08bddd2fbda4b7c src/tls/certificates.rs +68cc35b3cae43b0321cf667a613310a4b9ec5d8994461d6f3543b1852771bf08 src/tls/external_paths.rs +937b95bb8621ab98d7cad3d223e4dee305350fbd0149b7527396d3bdcc28a68b src/tls/external_paths_tests.rs +1ff95e95d38eedeefcf8a931569d628763d5a328aa5573c73c928f06795037ba src/tls/server_config.rs +94b70c52fdc7bd6e32fba9eed9124d030c692246f6990d61e01b891765275add src/tls/tests.rs +ce51a3280331d67c8406d2c5bc156ac0b492afa58e1f328bcda76db0720a6a9d src/tls/types.rs +a897c48e3528565fef8d4e32f0c3c078adfb68655c80e1af011f44a8bcfac6f6 src/traffic/mod.rs +bd62b4ecdcf831d183c7720766a11703c8612d614e3abf38d2bff28df34710fd src/traffic/tests.rs +bfbbaa3b949ae946fa929bfbae3fd9a25f2ce792abbd0ed370ccf5683250bc4d src/transform/apply.rs +ae30a984fa39d5c45a676effbc880c923078ba8120adff1bff10e108350b31b5 src/transform/compile.rs +ffc0740462e5566a96912ab3089f18fc28f1c093ca65eec860fc6ea801fd907d src/transform/css.rs +2b9d5c11d4c02b4a3ad3b9bb1a18c63693f245b854084f5eba16595df47b47f8 src/transform/html/mod.rs +aa99b0d3029ef92c78371cb90e11f2026cce890d1be8e10ebd7fa9bc5cb13287 src/transform/html/tests.rs +047acd7209c1db19709801abbe3ee1076c1fc33f0fe80cc5d9b60669d5f1bae4 src/transform/js/mod.rs +cf5195ab6bacccae0082da7b3f1bd0382b73fdeb3607f4ae569ca6daab9d10d0 src/transform/js/tests.rs +b0d20cf6784bf31457ea5a853e2fa5d85f6452395a78a538392703d97e687a11 src/transform/json/mod.rs +216e24e29ea87be4a124f95f898e155f127fd959d7d5d9b30f8cd0b2b5018f30 src/transform/json/tests.rs +d13fa462d6df516a4cfaee9f4e184044c5b6345e311aeb3d9058efafe54e4c5e src/transform/mod.rs +1a56c6af6d48d52e2a73036b9bfa3cf16b5fa5b057593821e1229269b7ea4c08 src/transform/model.rs +4b52257e1a3643910b5e7043852d7218230c0021c31215d90d0f8e384f2ae233 src/transform/svg/mod.rs +0f53c64f442390ee20a59087a10f8f9ffb58053263e9aa848ddabfae1a6f3f51 src/transform/svg/tests.rs +753047a1a731596f4c87351873c48f37b39f54e730795ff7d6895c3e2f0d56fb src/transform/tests.rs +8d38f2f7d4ca4dd453cd0e2337614ec704fbd0a36d3e2374cda43f05dfcad663 src/update_check/mod.rs +c42d000d1d576721af3ffe930589388693001b8113554a7658f6dcbc665b5d1b src/update_check/tests.rs +70e6cdf339da86183b4cd07567a4bb99135dccea5b0fb4a6c37c4098ec4762cd src/upstream.rs +fe9d4deb34cea2408ac5a1030315989f29a6a7d078a46ac1b59d12aa07f67878 src/upstream/client.rs +80e9952b6a4b2241aff8ee259d286f0381b3c974032adc2c276764d14878fc67 src/upstream/client_tests.rs +56b1e4242f8153391cd9a01fbb3017a2dbda9d02e83da6bbfb39ed44854534b5 src/upstream/protocol_tests.rs +ae880b40197454ea3fbf4d2113984dc372098b2e54b97e87c83cc319de253377 src/upstream/tests.rs +5c42f1befec267293b6f03eada118a11c90adfb4b32e0134d7f0033c7453c7cc src/user_agent/mod.rs +696a2783a24f7f3d69fb820dc3a772ec49ea46ee017087952a8253363a9b7374 src/user_agent/tests.rs +d61c427c1e9cf457f1232b822d73e846e9f329cfbe61215e7ca061d53762155d src/vhost.rs +846707452ccf10962f1763be66b8f56c050b0398b48968015fb799dac289c0d6 src/vhost/error_fallback.rs +a8c5ec5095178a0656a001b0d7100e240d1f32b052ea60df37f8681269638ab3 src/vhost/model.rs +fc8af7342a3b147921e9040116af5dfe680b3df910db2416ada18198bbeea7df src/vhost/redirect.rs +2651d7e3e3fadf3de74a75eafe2bbad8d02939551ccc0504c1a092a0b33b0db5 src/vhost/tests.rs +c32ff8fae0c291bf072404aa118cb81016752b2929c89c7ec845d97006e677ce src/vhost/validation.rs +8d1eff4b24f01d137414ef5419f75dd281879228adb70409645b11b3c78c20e9 src/web_server/config.rs +9744e8c29ae72a4d9fbc9a76166a97f8292c4c312295ea40d1cb699e03d80a9d src/web_server/config/compile.rs +5ed79fa5b9c53f95ca200d89a9ba927dda816b61fbdf3b852bd3c9670e3d2d4f src/web_server/config/model.rs +a863ad1337fbc353c0f42caea4ac8b3644792e2aa08c37f992b7882b4b8dc6d5 src/web_server/config/validation.rs +86c744216d7132d8294a6e90ba9be5fd871646006313d1c62506d40c81db9b12 src/web_server/fastcgi.rs +54aa2dc94df97faabd4859a9dafe6a7cb1ba3337bfef5fa51a4432097a985d88 src/web_server/fastcgi/protocol.rs +fbaf972f9dd2842ec7df2878f0105c9ef4a877817f037f2332c4d5baabf2ead9 src/web_server/fastcgi/response.rs +92d2ab4d7ecb766bbc705f8eba94c1ca33347ffb84b36e0ad0eccfed5915473f src/web_server/filesystem.rs +d4fec3682532b0f2d11a0aefcd024f69fb623a39922ddb6c528a2d2de265347d src/web_server/htaccess.rs +b4646f705e532f682d6152b6827cc7f4f915766ebcb4af89eba9950965673772 src/web_server/htaccess/model.rs +a484113f2c1fea4e98a437acd8a28be6490d7e612f160a8728ceeaadd363f8ee src/web_server/htaccess/parse.rs +6e58e2674940bb0284035856fe9299a0555fee4c566de75e174deb373c3b164f src/web_server/htaccess/rewrite.rs +8ca74d9cc4470045301f70eb4a9fbabd0dbfe74434429148d2230df9f996c06c src/web_server/htaccess/tests.rs +7fe32af33b4d8e079ad724665aa1cfb62f6e98b9406b77168feaac55dac36137 src/web_server/metrics.rs +0f74d1fad9bc20a5f2ea1753381459c072cd8068cb13e7dfbc74e33eb3ace593 src/web_server/mod.rs +e9ba6e09ba2c8f8a33410c219d5ea29214cc53e279a43b17c110d24f17a5a71d src/web_server/request.rs +d98c80663847d6d83073df074ebff65952755415574708abcc153bd8d3adfaa9 src/web_server/response.rs +b38a1c9e648e3606a534ebdf74f6315863a326c6de1ca8edc433abe9c1fed7b4 src/web_server/response/file.rs +4733bb1824dd0a12b8804fb8d00791c3f9fda4c09b41503d5d8079d9607df058 src/web_server/response/file_body/mod.rs +e5f5fbe702f66bfcbcbc1d1f3cd3d89bdbb929bb86aed94868a2a06a4b9e59e3 src/web_server/response/file_body/tests.rs +7da903c1a69be0ae6b85772b3208c518679efa8ed9d3e98adb694483518156b6 src/web_server/response/headers.rs +2665d4eac9a6430d68224874784cb65d9b9d424353af77735caf044401d08cb4 src/web_server/routing.rs +9e584eb4455a18641c2c89f9e9725745c93f32877abf0f0f2fbea9e3d5ef38c3 src/web_server/security.rs +b791762b4ab7a43c3be19df84e523faf3dfb4df055f66d02178f93edb60d2204 src/web_server/serve.rs +714418c86ab241020a561fcf662a8fe324a6a70cc2fd3a313c56d7939c14b9e8 src/web_server/tests.rs +f00743af2cf4a5952caef7a1dcf68e7817b5599a252a9973e1c22045517c0b0e tests/fixtures/argon2id.json +102b83171a6429b6375d8001d6c5294702385cd58ee55727cb657b1f3566e877 tests/panel_icons_browser.py +52e61c389a60d147184ee76925cac76e454f8f2e3cb91039bb06e17787ab900f tests/panel_icons_contract.js +01af3008be27fabb486c141c67099af104f2725cc56f4c656aea9741a3c150cd tests/panel_interface_contract.py +626db3f4a7d83c0925a911db5ee6ce4b77048b7c2a9b91cd2d5d7dfa548cddd5 tests/panel_refresh_contract.js +e24a0f84f1bfc46964df865ac387d651f7b384d781cbc8f3a9a5b0b60f3d69ca tests/vhost_auth_selection.js +cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30 third_party/swagger-ui-5.33.1/LICENSE +0d20d1adef18aee3f40dd258172155521ce702ac445cb5f7b7d60ed32dad2fb2 third_party/swagger-ui-5.33.1/NOTICE +2c9e148b9acd740850aa33ae52878f1ecf19cdc67f6041e2c0a7aab1e95782f2 third_party/swagger-ui-5.33.1/README.md +f51b881c441fe8cab388c744911671ff925694b650e5ae7a5072cfdceb9ddaa4 third_party/swagger-ui-5.33.1/SHA256SUMS +050bc415ee7048dcd881682678f720264e7da5e373f7461d7c58c755305255f7 third_party/swagger-ui-5.33.1/swagger-ui-bundle.js +63818894e4b04cd0e3180d9cb20761e227a939121e7484f8e1d528227c756f89 third_party/swagger-ui-5.33.1/swagger-ui-bundle.js.LICENSE.txt +1ac324f7dcd27e4b9386b4bd6421271ec147e922a22c05ba24b11515e9aa6321 third_party/swagger-ui-5.33.1/swagger-ui.css +eca68a07c2b1e45fdb8f512294f5a432db3ae5a6aec8fb200b47f155cd9a31d6 tools/README.md +7c30c280d0b0a8bf855eeffab583ca34dc161255f7ef6124148aa979c17c26d3 tools/dev/memory_load.py +d1418f8e574a7390fd45a2aa879bdf5720b773162d65e295ab0350506aa5220a tools/dev/mock_auth.py +2d3ff92300b09ce9cecbbaaa9309b4d33160fa4b2291c9952b784e8cfb599ab5 tools/dev/mock_server.py +c711154a9df425a56607bd88f03815ffb408213a31a2b66ed1c1c9a6301a2fc6 tools/legacy/backup.py +5421082e24f3794356331157e30b428f3221a0d74c0b5d060bd4d3989e0bcf3a update.sh +56c702111022e1ca2c8f6b72c635c749b05936ffe6387bdb0a202691614cbc96 upgrade.sh diff --git a/docs/FEATURES.md b/docs/FEATURES.md index cfff94f..1ebf11e 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -76,6 +76,7 @@ RustProxy is a single service that combines a reverse proxy, a static/PHP web se ## Monitoring and logs - Overview dashboard with requests per second, bandwidth, status codes, error share, cache hit ratio, protocol mix, system load, backend health, requests rejected by limits and nearest certificate expiry. +- Optional **Memory breakdown** card: process RSS split into cache data, cache bookkeeping, cache buffers, allocator-held free memory, mapped files and the rest of the process, with glibc heap statistics and an "outside cache" trend for spotting leaks. - Customizable dashboard layouts (drag-and-drop with a live drop placeholder, keyboard moves, per-block width, explicit gap filling) and saved presets. - Per-Vhost, per-backend, per-Web-Service and per-Stream statistics. - Live request log in the browser and in the terminal (`--livelogs`). diff --git a/docs/PERFORMANCE.md b/docs/PERFORMANCE.md index 97e107d..b3db394 100644 --- a/docs/PERFORMANCE.md +++ b/docs/PERFORMANCE.md @@ -81,6 +81,10 @@ Otherwise keep the default. The system allocator returns memory from evicted cac The mimalloc rows above were measured with 0.35.2 and a different object mix; re-measure on your own workload before choosing the optional build. +### Where the memory goes + +Process memory is always larger than the configured HOT cache. The HOT size already includes RustProxy's estimate of per-object bookkeeping (index, keys, headers), but not allocator rounding and fragmentation, connection and TLS buffers, the runtime, logs or GeoIP data. Enable the optional **Memory breakdown** Overview card to see the split for your workload: if the "Outside cache" trend stays flat while the cache is full, the difference is overhead or fragmentation; a steady rise points to memory that is not released. For reference, Varnish documents about 1 KiB of per-object overhead outside its storage size and notes that total use can reach about twice the configured storage. + ## Production tuning | Setting | Recommendation | diff --git a/integrations/routeros-oci-build/README.md b/integrations/routeros-oci-build/README.md index 164ec62..ab4c372 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.36.8` and the defaults this publishes: +For example, with RustProxy version `0.36.9` and the defaults this publishes: ```text -zot.example.net/network/rustproxy:0.36.8 +zot.example.net/network/rustproxy:0.36.9 zot.example.net/network/rustproxy:latest zot.example.net/network/rustproxy:routeros ``` diff --git a/langs/en_US.json b/langs/en_US.json index 5ee1f16..4f3abf9 100644 --- a/langs/en_US.json +++ b/langs/en_US.json @@ -2309,6 +2309,35 @@ "processOverviewTitle": "Process", "processOverviewDescription": "Process CPU, file descriptors, memory split and CPU/RSS history (cache memory is on the RAM cache card).", "processClassicTitle": "Process simple", + "memoryBreakdownTitle": "Memory breakdown", + "memoryBreakdownDescription": "Process RSS split into cache data, cache bookkeeping, allocator fragmentation and the rest of the process, with a leak trend.", + "memoryBreakdownInfo": "Memory breakdown information", + "memoryBreakdownHint": "Splits the process RSS into cached object data, the cache's own bookkeeping (index, keys, headers), short-lived cache buffers, memory the allocator keeps free for reuse (fragmentation; an upper bound, part of it may already be returned to the kernel), program code and mapped files, and everything else (connections, TLS, runtime, logs, GeoIP). For comparison, Varnish documents about 1 KiB of per-object overhead outside its storage size. A steadily rising \"outside cache\" trend while the cache is full suggests a leak; a flat one means overhead or fragmentation.", + "memoryRatio": "RSS / cache", + "memoryRatioHelp": "Process RSS divided by the accounted HOT cache size", + "memoryPerObject": "Overhead / object", + "memoryPerObjectHelp": "Cache bookkeeping per stored object (accounted size minus object data)", + "memoryObjects": "HOT objects", + "memoryFragmentation": "Fragmentation", + "memoryFragmentationHelp": "Free memory held by the allocator as a share of its heap", + "memoryCacheData": "Cache data (object bodies)", + "memoryCacheMeta": "Cache bookkeeping", + "memoryTransient": "Cache buffers (fills, queues)", + "memoryAllocatorFree": "Free, held by allocator", + "memoryFiles": "Code and mapped files", + "memoryRest": "Rest of process", + "memoryAllocatorTitle": "Allocator", + "memoryAllocatorHeap": "Heap (arenas)", + "memoryAllocatorInUse": "In use", + "memoryAllocatorFreeHeld": "Free, held", + "memoryAllocatorMmap": "Large blocks (mmap) · count", + "memoryAllocatorUnavailable": "Allocator statistics are available only with the default glibc allocator.", + "memoryOutsideCache": "Outside cache", + "memoryOutsideCacheHistory": "Memory outside cache history", + "memoryTrendCollecting": "Collecting", + "memoryTrendStable": "Stable", + "memoryTrendRising": "Rising", + "memoryTrendFalling": "Falling", "processLoadTitle": "Load", "processMemoryTitle": "Memory", "processFdHistory": "File descriptors history", @@ -3041,6 +3070,11 @@ "pathPermissionsOptions": "Options and help", "overviewLayoutNarrow": "Decrease card width", "overviewLayoutWiden": "Increase card width", + "overviewLayoutHeight": "Height in rows", + "overviewLayoutLower": "Lower", + "overviewLayoutTaller": "Taller", + "overviewLayoutHeightAuto": "Automatic height: fits the content (A). Use + to make the card taller.", + "overviewLayoutHeightFixed": "Fixed height in rows. Lower it to the content height to return to automatic sizing.", "overviewLayoutWidth": "Card width in 12-column grid", "dashboardPresetsConflict": "Preset already exists or was removed. Refresh and try again.", "overviewLayoutInlineDragging": "Dragging: drop the block on the dashed frame. Esc restores its previous position.", diff --git a/langs/pl_pl.json b/langs/pl_pl.json index b43b17b..cb96dd3 100644 --- a/langs/pl_pl.json +++ b/langs/pl_pl.json @@ -2309,6 +2309,35 @@ "processOverviewTitle": "Proces", "processOverviewDescription": "Obciążenie procesu, deskryptory plików, podział pamięci oraz historia CPU i RSS (pamięć cache jest w karcie RAM cache).", "processClassicTitle": "Proces prosty", + "memoryBreakdownTitle": "Rozkład pamięci", + "memoryBreakdownDescription": "RSS procesu podzielone na dane cache, metadane cache, fragmentację alokatora i resztę procesu, z trendem wycieku.", + "memoryBreakdownInfo": "Informacje o rozkładzie pamięci", + "memoryBreakdownHint": "Dzieli RSS procesu na dane obiektów w cache, metadane samego cache (indeks, klucze, nagłówki), krótkotrwałe bufory cache, pamięć trzymaną przez alokator jako wolną do ponownego użycia (fragmentacja; górne oszacowanie, część mogła już wrócić do jądra), kod programu i zmapowane pliki oraz całą resztę (połączenia, TLS, runtime, logi, GeoIP). Dla porównania: Varnish podaje około 1 KiB narzutu na obiekt poza rozmiarem storage. Stale rosnący trend „poza cache” przy pełnym cache wskazuje na wyciek; płaski oznacza narzut lub fragmentację.", + "memoryRatio": "RSS / cache", + "memoryRatioHelp": "RSS procesu podzielone przez rozliczony rozmiar cache HOT", + "memoryPerObject": "Narzut / obiekt", + "memoryPerObjectHelp": "Metadane cache na jeden obiekt (rozliczony rozmiar minus dane obiektu)", + "memoryObjects": "Obiekty HOT", + "memoryFragmentation": "Fragmentacja", + "memoryFragmentationHelp": "Wolna pamięć trzymana przez alokator jako udział w jego stercie", + "memoryCacheData": "Dane cache (treść obiektów)", + "memoryCacheMeta": "Metadane cache", + "memoryTransient": "Bufory cache (zapisy, kolejki)", + "memoryAllocatorFree": "Wolna, trzymana przez alokator", + "memoryFiles": "Kod i zmapowane pliki", + "memoryRest": "Reszta procesu", + "memoryAllocatorTitle": "Alokator", + "memoryAllocatorHeap": "Sterta (areny)", + "memoryAllocatorInUse": "W użyciu", + "memoryAllocatorFreeHeld": "Wolna, trzymana", + "memoryAllocatorMmap": "Duże bloki (mmap) · liczba", + "memoryAllocatorUnavailable": "Statystyki alokatora są dostępne tylko z domyślnym alokatorem glibc.", + "memoryOutsideCache": "Poza cache", + "memoryOutsideCacheHistory": "Historia pamięci poza cache", + "memoryTrendCollecting": "Zbieranie", + "memoryTrendStable": "Stabilnie", + "memoryTrendRising": "Rośnie", + "memoryTrendFalling": "Spada", "processLoadTitle": "Obciążenie", "processMemoryTitle": "Pamięć", "processFdHistory": "Historia deskryptorów", @@ -3041,6 +3070,11 @@ "pathPermissionsOptions": "Opcje i pomoc", "overviewLayoutNarrow": "Zmniejsz szerokość karty", "overviewLayoutWiden": "Zwiększ szerokość karty", + "overviewLayoutHeight": "Wysokość w wierszach", + "overviewLayoutLower": "Niższy", + "overviewLayoutTaller": "Wyższy", + "overviewLayoutHeightAuto": "Wysokość automatyczna: dopasowana do treści (A). Użyj +, aby powiększyć blok.", + "overviewLayoutHeightFixed": "Stała wysokość w wierszach. Zmniejsz do wysokości treści, aby wrócić do trybu automatycznego.", "overviewLayoutWidth": "Szerokość karty w siatce 12 kolumn", "dashboardPresetsConflict": "Preset już istnieje lub został usunięty. Odśwież listę i spróbuj ponownie.", "overviewLayoutInlineDragging": "Przeciąganie: upuść blok w miejscu ramki. Esc przywraca poprzednią pozycję.", diff --git a/src/admin/dashboard_presets.rs b/src/admin/dashboard_presets.rs index 94eac74..c116bb9 100644 --- a/src/admin/dashboard_presets.rs +++ b/src/admin/dashboard_presets.rs @@ -6,6 +6,8 @@ struct DashboardPresetLayout { dashboard_widgets: Vec, dashboard_hidden_widgets: Vec, dashboard_widget_sizes: Option>, + #[serde(default)] + dashboard_widget_heights: Option>, dashboard_density: String, overview_samples: u16, } @@ -43,6 +45,8 @@ fn validate_dashboard_preset_layout(layout: &DashboardPresetLayout) -> Result<() .clone_from(&layout.dashboard_hidden_widgets); pref.dashboard_widget_sizes .clone_from(&layout.dashboard_widget_sizes); + pref.dashboard_widget_heights + .clone_from(&layout.dashboard_widget_heights); pref.dashboard_density.clone_from(&layout.dashboard_density); validate_admin_preferences(&pref) } @@ -66,12 +70,14 @@ async fn dashboard_presets( dashboard_widgets: layout.dashboard_widgets, dashboard_hidden_widgets: layout.dashboard_hidden_widgets, dashboard_widget_sizes: layout.dashboard_widget_sizes, + dashboard_widget_heights: layout.dashboard_widget_heights, ..Default::default() }; reconcile_dashboard_widgets(&mut prefs); layout.dashboard_widgets = prefs.dashboard_widgets; layout.dashboard_hidden_widgets = prefs.dashboard_hidden_widgets; layout.dashboard_widget_sizes = prefs.dashboard_widget_sizes; + layout.dashboard_widget_heights = prefs.dashboard_widget_heights; if validate_dashboard_preset_layout(&layout).is_ok() { presets.push(NamedDashboardPreset { name, layout }); } @@ -170,6 +176,7 @@ mod dashboard_preset_validation_tests { dashboard_widgets: default_admin_dashboard_widgets_for_tests(), dashboard_hidden_widgets: default_hidden_dashboard_widgets(), dashboard_widget_sizes: None, + dashboard_widget_heights: None, dashboard_density: default_admin_dashboard_density(), overview_samples: 600, }; diff --git a/src/admin/openapi.json b/src/admin/openapi.json index 29aae0f..09d5e9d 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.36.8", + "version": "0.36.9", "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": [ @@ -1560,6 +1560,41 @@ "properties": {}, "additionalProperties": true }, + "memory_allocator": { + "type": "object", + "nullable": true, + "description": "glibc heap statistics (mallinfo2), sampled at most every 2 s; null with other allocators. free_bytes is an upper bound of resident allocator-held free memory.", + "properties": { + "allocator": { + "type": "string" + }, + "heap_bytes": { + "type": "integer", + "format": "int64" + }, + "in_use_bytes": { + "type": "integer", + "format": "int64" + }, + "free_bytes": { + "type": "integer", + "format": "int64" + }, + "releasable_bytes": { + "type": "integer", + "format": "int64" + }, + "mmap_bytes": { + "type": "integer", + "format": "int64" + }, + "mmap_blocks": { + "type": "integer", + "format": "int64" + } + }, + "additionalProperties": false + }, "system": { "type": "object", "properties": {}, @@ -3954,6 +3989,7 @@ "cache_diagnostics", "process_diagnostics", "process_simple", + "memory_breakdown", "network_diagnostics", "backend_table", "backend_tiny", @@ -4063,6 +4099,17 @@ }, "description": "Nullable account-scoped per-card widths (12-column grid). Null preserves the legacy grouped visual arrangement; an object, including an empty one, enables freely ordered cards. Key must be a registered Overview widget ID. Panels require width >= 4, charts >= 3 and backend table >= 6." }, + "dashboard_widget_heights": { + "type": "object", + "nullable": true, + "maxProperties": 96, + "additionalProperties": { + "type": "integer", + "minimum": 1, + "maximum": 32 + }, + "description": "Optional per-card heights in Overview row units (1-32; a compact stat card spans 2 rows). Cards without an entry size to their content; a height smaller than the content needs is raised automatically. Keys must be registered Overview widget IDs." + }, "dashboard_hidden_widgets": { "type": "array", "maxItems": 78, @@ -4135,6 +4182,7 @@ "cache_diagnostics", "process_diagnostics", "process_simple", + "memory_breakdown", "network_diagnostics", "backend_table", "backend_tiny", @@ -7180,6 +7228,17 @@ }, "description": "Width overrides in a 12-column grid; null selects legacy groups" }, + "dashboard_widget_heights": { + "type": "object", + "nullable": true, + "maxProperties": 96, + "additionalProperties": { + "type": "integer", + "minimum": 1, + "maximum": 32 + }, + "description": "Optional per-card heights in Overview row units (1-32; a compact stat card spans 2 rows). Cards without an entry size to their content; a height smaller than the content needs is raised automatically. Keys must be registered Overview widget IDs." + }, "dashboard_density": { "type": "string", "enum": [ diff --git a/src/admin/preferences.rs b/src/admin/preferences.rs index ad3c6a7..58b81c1 100644 --- a/src/admin/preferences.rs +++ b/src/admin/preferences.rs @@ -43,6 +43,11 @@ fn reconcile_dashboard_widgets(prefs: &mut AdminPreferences) { .any(|widget| widget.id == *id && valid_dashboard_span(&widget.display_type, *span)) }); } + if let Some(heights) = prefs.dashboard_widget_heights.as_mut() { + heights.retain(|id, rows| { + valid_dashboard_rows(*rows) && DASHBOARD_WIDGETS.iter().any(|widget| widget.id == *id) + }); + } for widget in DASHBOARD_WIDGETS.iter() { if !seen.contains(&widget.id) { prefs.dashboard_widgets.push(widget.id.clone()); @@ -136,6 +141,9 @@ struct AdminPreferences { dashboard_hidden_widgets: Vec, #[serde(default)] dashboard_widget_sizes: Option>, + /// Optional per-card heights in Overview row units (1..=32, a compact stat card is 2); missing cards size to content. + #[serde(default)] + dashboard_widget_heights: Option>, #[serde(default = "default_file_log_columns")] file_log_columns: Vec, #[serde(default = "default_file_log_sort")] @@ -193,6 +201,7 @@ impl Default for AdminPreferences { dashboard_widgets: default_admin_dashboard_widgets(), dashboard_hidden_widgets: default_hidden_dashboard_widgets(), dashboard_widget_sizes: None, + dashboard_widget_heights: None, file_log_columns: default_file_log_columns(), file_log_sort: default_file_log_sort(), file_log_descending: default_file_log_descending(), @@ -392,6 +401,12 @@ fn validate_admin_preferences(preferences: &AdminPreferences) -> Result<(), ApiE "invalid dashboard card width preference".into(), )); } + if !valid_dashboard_heights(&preferences.dashboard_widget_heights) { + return Err(ApiError( + StatusCode::UNPROCESSABLE_ENTITY, + "invalid dashboard card height preference".into(), + )); + } if preferences.backend_table_columns.is_empty() || preferences.backend_table_columns.len() > BACKEND_TABLE_COLUMNS.len() { diff --git a/src/admin/preferences_columns.rs b/src/admin/preferences_columns.rs index acf969e..cf6de53 100644 --- a/src/admin/preferences_columns.rs +++ b/src/admin/preferences_columns.rs @@ -162,6 +162,19 @@ fn valid_dashboard_sizes(sizes: &Option>) }) } +fn valid_dashboard_rows(rows: u8) -> bool { + (1..=32).contains(&rows) +} + +fn valid_dashboard_heights(heights: &Option>) -> bool { + heights.as_ref().is_none_or(|heights| { + heights.len() <= DASHBOARD_WIDGETS.len() + && heights.iter().all(|(id, rows)| { + valid_dashboard_rows(*rows) && DASHBOARD_WIDGETS.iter().any(|widget| widget.id == *id) + }) + }) +} + fn default_hidden_dashboard_widgets() -> Vec { let mut hidden = DASHBOARD_DEFAULT_PRESET.dashboard_hidden_widgets.clone(); for widget in DASHBOARD_WIDGETS.iter() { diff --git a/src/admin/preferences_tests.rs b/src/admin/preferences_tests.rs index 7e91c58..7faf5ce 100644 --- a/src/admin/preferences_tests.rs +++ b/src/admin/preferences_tests.rs @@ -31,6 +31,7 @@ fn overview_factory_preset_matches_registry_and_operator_visibility() { "backend_health", "backend_tiny", "process_simple", + "memory_breakdown", "extra_process_cpu", "stream_traffic", "wide_cache_activity", @@ -328,3 +329,46 @@ fn customized_dashboard_preferences_fit_persistent_storage_limit() { assert!(document.len() > 4096); assert!(document.len() <= crate::db::ADMIN_PREFERENCES_MAX_BYTES); } + +#[test] +fn dashboard_height_preferences_are_optional_bounded_and_reconciled() { + let old: AdminPreferences = serde_json::from_str(r#"{"theme":"dark"}"#).unwrap(); + assert!(old.dashboard_widget_heights.is_none()); + let mut prefs = AdminPreferences { + dashboard_widget_sizes: Some(std::collections::BTreeMap::new()), + dashboard_widget_heights: Some(std::collections::BTreeMap::from([ + ("process_diagnostics".to_owned(), 6), + ("requests".to_owned(), 1), + ("memory_breakdown".to_owned(), 32), + ])), + ..Default::default() + }; + assert!(validate_admin_preferences(&prefs).is_ok()); + let stored = serde_json::to_string(&prefs).unwrap(); + let recovered: AdminPreferences = serde_json::from_str(&stored).unwrap(); + assert_eq!(recovered.dashboard_widget_heights, prefs.dashboard_widget_heights); + for rows in [0, 33] { + prefs + .dashboard_widget_heights + .as_mut() + .unwrap() + .insert("requests".to_owned(), rows); + assert!(validate_admin_preferences(&prefs).is_err(), "rows {rows}"); + } + prefs + .dashboard_widget_heights + .as_mut() + .unwrap() + .insert("requests".to_owned(), 2); + prefs + .dashboard_widget_heights + .as_mut() + .unwrap() + .insert("undefined-widget".to_owned(), 3); + assert!(validate_admin_preferences(&prefs).is_err()); + reconcile_dashboard_widgets(&mut prefs); + let heights = prefs.dashboard_widget_heights.as_ref().unwrap(); + assert!(!heights.contains_key("undefined-widget")); + assert_eq!(heights.get("requests"), Some(&2)); + assert!(validate_admin_preferences(&prefs).is_ok()); +} diff --git a/src/admin/router.rs b/src/admin/router.rs index 30ab202..15c59f2 100644 --- a/src/admin/router.rs +++ b/src/admin/router.rs @@ -76,8 +76,10 @@ fn admin_app_javascript() -> &'static str { include_str!("web/app/overview-wide-metrics.js"), include_str!("web/app/web-overview.js"), include_str!("web/app/overview-masonry.js"), + include_str!("web/app/overview-rows.js"), include_str!("web/app/config-history.js"), include_str!("web/app/certificate-inspection.js"), + include_str!("web/app/memory-breakdown.js"), include_str!("web/app/runtime.js"), include_str!("web/app/settings.js"), include_str!("web/management.js"), diff --git a/src/admin/status.rs b/src/admin/status.rs index 2a4173f..223cb12 100644 --- a/src/admin/status.rs +++ b/src/admin/status.rs @@ -161,6 +161,7 @@ fn status_payload(state: &App) -> Value { let cache_view = state.cache.view(); let transform_resources = crate::transform::resource_usage(&snapshot.envelope.config.transform); payload["cache"] = json!(&cache_view); + payload["memory_allocator"] = json!(crate::diagnostics::allocator_stats()); payload["transform_resources"] = json!(&transform_resources); payload["geoip"] = json!(state.geoip.load().view()); let system_info = system_info_payload(state); diff --git a/src/admin/status_live.rs b/src/admin/status_live.rs index b7a8fe3..0bbf60d 100644 --- a/src/admin/status_live.rs +++ b/src/admin/status_live.rs @@ -55,6 +55,7 @@ fn live_status_payload(state: &App) -> Value { "web_server_metrics": web_server_metrics_payload(&snapshot), "live_system": live_chart_system_payload(state), "cache": state.cache.view(), + "memory_allocator": crate::diagnostics::allocator_stats(), "transform_metrics": state.transform_metrics.total(), "logs_dropped": state.logs.dropped.load(Ordering::Relaxed), "backends": snapshot.envelope.config.vhosts.iter().map(|v| v.backends.len()).sum::(), diff --git a/src/admin/tests.rs b/src/admin/tests.rs index 4e45c66..efe6cb4 100644 --- a/src/admin/tests.rs +++ b/src/admin/tests.rs @@ -1978,6 +1978,7 @@ mod tests { dashboard_widgets: AdminPreferences::default().dashboard_widgets, dashboard_hidden_widgets: default_hidden_dashboard_widgets(), dashboard_widget_sizes: None, + dashboard_widget_heights: None, dashboard_density: "compact".to_owned(), overview_samples: 600, }; diff --git a/src/admin/web/app/core.js b/src/admin/web/app/core.js index fbe2fa5..91bec45 100644 --- a/src/admin/web/app/core.js +++ b/src/admin/web/app/core.js @@ -52,6 +52,7 @@ function translate() { document.querySelectorAll("[data-i18n]").forEach(e => e.textContent = t(e.dataset.i18n)); document.querySelectorAll("[data-i18n-placeholder]").forEach(e => e.placeholder = t(e.dataset.i18nPlaceholder)); document.querySelectorAll("[data-i18n-aria]").forEach(e => e.setAttribute("aria-label", t(e.dataset.i18nAria))); + document.querySelectorAll("[data-i18n-title]").forEach(e => { e.title = t(e.dataset.i18nTitle); }); window.rustProxyAclProfiles?.refreshTranslations?.(); $("language").value = languagePreference === "auto" ? "auto" : language; setPanel(currentPanel, false); syncAuthForm(); renderSession(); window.rustProxyDrafts?.refresh(); diff --git a/src/admin/web/app/dashboard-inline-layout.js b/src/admin/web/app/dashboard-inline-layout.js index 78bfc71..cc0d384 100644 --- a/src/admin/web/app/dashboard-inline-layout.js +++ b/src/admin/web/app/dashboard-inline-layout.js @@ -28,7 +28,8 @@ window.rustProxyInlineLayout = (() => { const label = id => dashboardWidgetLabel(id); const dirty = () => draft && original && (draft.order.some((id, i) => id !== original.order[i]) || [...draft.hidden].some(id => !original.hidden.has(id)) || [...original.hidden].some(id => !draft.hidden.has(id)) - || JSON.stringify(draft.sizes) !== JSON.stringify(original.sizes)); + || JSON.stringify(draft.sizes) !== JSON.stringify(original.sizes) + || JSON.stringify(normalizeDashboardWidgetHeights(draft.heights)) !== JSON.stringify(normalizeDashboardWidgetHeights(original.heights))); function renderHidden() { if (!hiddenList || !draft) return; @@ -52,7 +53,8 @@ window.rustProxyInlineLayout = (() => { if (hiddenShelf) { hiddenShelf.open = true; hiddenShelf.querySelector("summary")?.focus(); } } function paint() { - applyDashboardLayout(draft.order, [...draft.hidden], draft.sizes); + applyDashboardLayout(draft.order, [...draft.hidden], draft.sizes, draft.heights); + window.rustProxyOverviewRows?.flush?.(); renderHidden(); const visible = visibleIds(); for (const node of nodes()) { @@ -70,6 +72,21 @@ window.rustProxyInlineLayout = (() => { const widen = node.querySelector(".overview-inline-widen"); if (narrow) narrow.disabled = at <= 0; if (widen) widen.disabled = at === widths.length - 1; + const rows = window.rustProxyOverviewRows?.rowsFor?.(node.dataset.dashboardWidget); + const heightControls = node.querySelector(".overview-inline-height"); + if (heightControls) heightControls.hidden = !rows; + if (rows) { + const explicit = draft.heights?.[node.dataset.dashboardWidget] !== undefined; + const heightValue = node.querySelector(".overview-inline-height-value"); + if (heightValue) { + heightValue.textContent = `↕${rows.span}${explicit ? "" : " A"}`; + heightValue.title = explicit ? t("overviewLayoutHeightFixed") : t("overviewLayoutHeightAuto"); + } + const lower = node.querySelector(".overview-inline-lower"); + const taller = node.querySelector(".overview-inline-taller"); + if (lower) lower.disabled = !explicit; + if (taller) taller.disabled = rows.span >= DASHBOARD_MAX_ROWS; + } } } function clearDrag() { if (pointerDrag) settle(false); } @@ -95,6 +112,19 @@ window.rustProxyInlineLayout = (() => { paint(); nodeFor(id)?.querySelector(delta < 0 ? ".overview-inline-narrow" : ".overview-inline-widen")?.focus(); } + function resizeHeight(id, delta) { + if (!draft) return; + const rows = window.rustProxyOverviewRows?.rowsFor?.(id); + if (!rows) return; + enterFreeLayout(); + draft.heights = { ...(draft.heights || {}) }; + const next = rows.span + delta; + // At or below the content height the card returns to automatic sizing. + if (next <= rows.min) delete draft.heights[id]; + else draft.heights[id] = Math.min(DASHBOARD_MAX_ROWS, next); + paint(); + nodeFor(id)?.querySelector(delta < 0 ? ".overview-inline-lower" : ".overview-inline-taller")?.focus(); + } function nudge(id, delta) { const visible = visibleIds(); const index = visible.indexOf(id), target = visible[index + delta]; @@ -124,7 +154,14 @@ window.rustProxyInlineLayout = (() => { control("−", `${t("overviewLayoutNarrow")}: ${title}`, "overview-inline-narrow", () => resize(id, -1)), widthValue, control("+", `${t("overviewLayoutWiden")}: ${title}`, "overview-inline-widen", () => resize(id, 1))); - bar.append(grip, dashboardWidgetTypeBadge(id), sizeControls, + const heightControls = el("span", undefined, "overview-inline-width overview-inline-height"); + const heightValue = el("span", "", "overview-inline-width-value overview-inline-height-value"); + heightValue.setAttribute("aria-label", t("overviewLayoutHeight")); + heightControls.append( + control("−", `${t("overviewLayoutLower")}: ${title}`, "overview-inline-lower", () => resizeHeight(id, -1)), + heightValue, + control("+", `${t("overviewLayoutTaller")}: ${title}`, "overview-inline-taller", () => resizeHeight(id, 1))); + bar.append(grip, dashboardWidgetTypeBadge(id), sizeControls, heightControls, control("←", `${t("moveUp")}: ${title}`, "overview-inline-up", () => nudge(id, -1)), control("→", `${t("moveDown")}: ${title}`, "overview-inline-down", () => nudge(id, 1)), control("×", `${t("overviewLayoutInlineHide")}: ${title}`, "overview-inline-hide", () => hide(id))); @@ -158,7 +195,7 @@ window.rustProxyInlineLayout = (() => { if (hiddenShelf) { hiddenShelf.open = false; hiddenShelf.hidden = true; } if (hiddenList) hiddenList.replaceChildren(); if (modalButton) modalButton.disabled = false; - if (!preserveSaved && original) applyDashboardLayout(original.order, [...original.hidden], original.sizes); + if (!preserveSaved && original) applyDashboardLayout(original.order, [...original.hidden], original.sizes, original.heights); draft = original = null; } async function begin() { @@ -171,8 +208,9 @@ window.rustProxyInlineLayout = (() => { const order = normalizeDashboardWidgets(saved.dashboard_widgets); const hidden = new Set(normalizeHiddenDashboardWidgets(saved.dashboard_hidden_widgets, saved.dashboard_widgets)); const sizes = normalizeDashboardWidgetSizes(saved.dashboard_widget_sizes); - original = { order: [...order], hidden: new Set(hidden), sizes: sizes === null ? null : { ...sizes } }; - draft = { order: [...order], hidden: new Set(hidden), sizes: sizes === null ? null : { ...sizes } }; + const heights = normalizeDashboardWidgetHeights(saved.dashboard_widget_heights); + original = { order: [...order], hidden: new Set(hidden), sizes: sizes === null ? null : { ...sizes }, heights: heights ? { ...heights } : null }; + draft = { order: [...order], hidden: new Set(hidden), sizes: sizes === null ? null : { ...sizes }, heights: heights ? { ...heights } : null }; showEditing(); } catch (error) { if (error?.status !== 401) toast(error.message, true); } finally { opening = false; unlock.disabled = false; } @@ -186,6 +224,7 @@ window.rustProxyInlineLayout = (() => { await window.rustProxyPreferences.update({ dashboard_widgets: [...draft.order], dashboard_hidden_widgets: [...draft.hidden], dashboard_widget_sizes: draft.sizes === null ? null : { ...draft.sizes }, + dashboard_widget_heights: normalizeDashboardWidgetHeights(draft.heights), }); finish(true); toast(t("overviewLayoutEditorSaved")); @@ -269,6 +308,7 @@ window.rustProxyInlineLayout = (() => { const rect = drag.node.getBoundingClientRect(); const placeholder = el("div", undefined, "overview-drop-placeholder"); placeholder.dataset.dashboardSpan = drag.node.dataset.dashboardSpan || "2"; + if (drag.node.dataset.dashboardRows) placeholder.style.setProperty("--overview-rows", drag.node.dataset.dashboardRows); placeholder.style.minHeight = `${Math.round(rect.height)}px`; placeholder.setAttribute("aria-hidden", "true"); drag.origin = drag.node.nextSibling; @@ -380,6 +420,7 @@ window.rustProxyInlineLayout = (() => { currentDraft: () => draft ? { order: [...draft.order], hidden: [...draft.hidden], sizes: draft.sizes === null ? null : { ...draft.sizes }, + heights: draft.heights ? { ...draft.heights } : null, } : null, cancel, }; diff --git a/src/admin/web/app/dashboard-layout-editor.js b/src/admin/web/app/dashboard-layout-editor.js index ecc8302..a72b7c0 100644 --- a/src/admin/web/app/dashboard-layout-editor.js +++ b/src/admin/web/app/dashboard-layout-editor.js @@ -237,7 +237,7 @@ window.rustProxyDashboardLayout = (() => { try { await window.rustProxyPreferences.update({ dashboard_widgets: [...defaults.order], dashboard_hidden_widgets: [...defaults.hidden], - dashboard_widget_sizes: null, + dashboard_widget_sizes: null, dashboard_widget_heights: null, }); resetConfirm.close(); dialog.close(); diff --git a/src/admin/web/app/dashboard-presets.js b/src/admin/web/app/dashboard-presets.js index 8204a36..7622c38 100644 --- a/src/admin/web/app/dashboard-presets.js +++ b/src/admin/web/app/dashboard-presets.js @@ -18,6 +18,7 @@ window.rustProxyDashboardLayout = (() => { dashboard_widgets: [...normalizeDashboardWidgets(current.dashboard_widgets)], dashboard_hidden_widgets: [...normalizeHiddenDashboardWidgets(current.dashboard_hidden_widgets)], dashboard_widget_sizes: normalizeDashboardWidgetSizes(current.dashboard_widget_sizes), + dashboard_widget_heights: normalizeDashboardWidgetHeights(current.dashboard_widget_heights), dashboard_density: normalizeAdminDensity(current.dashboard_density, "compact"), overview_samples: window.rustProxyOverviewSamples.getLimit(), }; @@ -97,6 +98,7 @@ window.rustProxyDashboardLayout = (() => { dashboard_widgets: [...layout.dashboard_widgets], dashboard_hidden_widgets: [...layout.dashboard_hidden_widgets], dashboard_widget_sizes: layout.dashboard_widget_sizes === null ? null : { ...layout.dashboard_widget_sizes }, + dashboard_widget_heights: normalizeDashboardWidgetHeights(layout.dashboard_widget_heights), dashboard_density: layout.dashboard_density, }); window.rustProxyOverviewSamples.setLimit(layout.overview_samples, true); @@ -130,6 +132,7 @@ window.rustProxyDashboardLayout = (() => { dashboard_widgets: [...ADMIN_DASHBOARD_WIDGETS], dashboard_hidden_widgets: [...ADMIN_DEFAULT_HIDDEN_WIDGETS], dashboard_widget_sizes: null, + dashboard_widget_heights: null, dashboard_density: ADMIN_DASHBOARD_DEFAULTS.dashboard_density, overview_samples: ADMIN_DASHBOARD_DEFAULTS.overview_samples, }); diff --git a/src/admin/web/app/memory-breakdown.js b/src/admin/web/app/memory-breakdown.js new file mode 100644 index 0000000..24b4c84 --- /dev/null +++ b/src/admin/web/app/memory-breakdown.js @@ -0,0 +1,122 @@ +// Memory breakdown card (memory_breakdown): splits process RSS into cache data, +// cache bookkeeping, cache buffers, allocator-held free memory, file-backed pages +// and the rest of the process, and tracks the "outside cache" share over time so +// a steady climb (a leak) is distinguishable from flat overhead. +window.rustProxyMemoryBreakdown = (() => { + const $ = id => document.getElementById(id); + const segments = ["cache-data", "cache-meta", "transient", "alloc-free", "files", "rest"]; + const MIN_TREND_MS = 10 * 60 * 1000; + let samples = []; + const num = value => value == null || value === "" ? null : (Number.isFinite(Number(value)) ? Number(value) : null); + const limit = () => window.rustProxyOverviewSamples?.getLimit?.() ?? 600; + + function compute(status) { + const live = status.live_system || {}, system = status.system || {}, cache = status.cache || {}; + const rss = num(live.process_rss_bytes) ?? num(system.process_rss_bytes); + if (rss == null || rss <= 0) return null; + const allocated = num(cache.hot_allocated_bytes) ?? num(cache.resident_bytes) ?? 0; + const logical = Math.min(num(cache.hot_logical_bytes) ?? allocated, allocated); + const transient = num(cache.transient_bytes) ?? 0; + const fileBacked = (num(system.process_rss_file_bytes) ?? 0) + (num(system.process_rss_shmem_bytes) ?? 0); + const allocator = status.memory_allocator || null; + let free = allocator ? (num(allocator.free_bytes) ?? 0) : 0; + const values = { "cache-data": logical, "cache-meta": allocated - logical, transient, "alloc-free": free, files: fileBacked }; + let rest = rss - Object.values(values).reduce((sum, value) => sum + value, 0); + // Allocator free memory may already be released to the kernel (malloc_trim), + // so it is the first share to shrink when the parts exceed the measured RSS. + if (rest < 0) { const cut = Math.min(free, -rest); free -= cut; values["alloc-free"] = free; rest += cut; } + values.rest = Math.max(0, rest); + return { + rss, values, allocator, allocated, logical, + entries: num(cache.entries), + outside: Math.max(0, rss - allocated - transient) + }; + } + + function slopePerHour(points) { + if (points.length < 3) return null; + const t0 = points[0].t, n = points.length; + let sx = 0, sy = 0, sxx = 0, sxy = 0; + for (const p of points) { const x = (p.t - t0) / 3600000; sx += x; sy += p.v; sxx += x * x; sxy += x * p.v; } + const den = n * sxx - sx * sx; + return den > 0 ? (n * sxy - sx * sy) / den : null; + } + + function setText(id, text) { const node = $(id); if (node) node.textContent = text; } + + function render(status, appendSample = true) { + const card = document.querySelector('[data-dashboard-widget="memory_breakdown"]'); + if (!card || !$("mb-bar")) return; + const lang = typeof locale === "function" ? locale() : undefined; + const fmtBytes = value => value == null || !Number.isFinite(value) ? "-" : bytes(Math.max(0, value)); + const percent = value => Number.isFinite(value) ? `${(value * 100).toLocaleString(lang, { maximumFractionDigits: 1 })}%` : "-"; + const tr = key => (typeof t === "function" ? t(key) : key); + const data = compute(status); + if (!data) { + setText("mb-rss", "-"); + return; + } + setText("mb-rss", `RSS ${fmtBytes(data.rss)}`); + const bar = $("mb-bar").children; + segments.forEach((key, index) => { + const value = data.values[key], share = value / data.rss; + bar[index].style.width = `${Math.max(0, share * 100)}%`; + bar[index].title = `${tr(rowKey(key))}: ${fmtBytes(value)} (${percent(share)})`; + setText(`mb-${key}-value`, fmtBytes(value)); + setText(`mb-${key}-share`, percent(share)); + const row = card.querySelector(`[data-mb-row="${key}"]`); + if (row) row.hidden = key === "alloc-free" && !data.allocator; + }); + setText("mb-ratio", data.allocated > 0 ? `${(data.rss / data.allocated).toFixed(2)}×` : "-"); + setText("mb-per-object", data.entries > 0 ? fmtBytes((data.allocated - data.logical) / data.entries) : "-"); + setText("mb-objects", data.entries == null ? "-" : data.entries.toLocaleString(lang)); + + const allocator = data.allocator, heap = num(allocator?.heap_bytes); + $("mb-allocator").hidden = !allocator; + $("mb-allocator-unavailable").hidden = !!allocator; + setText("mb-fragmentation", allocator && heap > 0 ? percent(num(allocator.free_bytes) / heap) : "-"); + if (allocator) { + setText("mb-heap", fmtBytes(heap)); + setText("mb-in-use", fmtBytes(num(allocator.in_use_bytes))); + setText("mb-free", `${fmtBytes(num(allocator.free_bytes))}${heap > 0 ? ` · ${percent(num(allocator.free_bytes) / heap)}` : ""}`); + setText("mb-mmap", `${fmtBytes(num(allocator.mmap_bytes))} · ${num(allocator.mmap_blocks) ?? 0}`); + } + + if (appendSample) { + samples.push({ t: Date.now(), v: data.outside }); + samples = samples.slice(-limit()); + } + const values = samples.map(sample => sample.v); + const peak = Math.max(1, ...values) * 1.1; + const width = 300, height = 60, pad = 5; + const points = values.length < 2 ? "0,55 300,55" : values.map((value, index) => + `${index * width / (values.length - 1)},${height - pad - value / peak * (height - pad * 2)}`).join(" "); + $("mb-outside-sparkline").setAttribute("points", points); + window.rustProxyChartScale?.axes?.("mb-outside-sparkline", peak, "bytes", values.length, { top: 5 / 60, bottom: 55 / 60 }); + setText("mb-outside-value", fmtBytes(data.outside)); + + const badge = $("mb-trend-badge"); + const span = samples.length ? samples.at(-1).t - samples[0].t : 0; + const slope = span >= MIN_TREND_MS ? slopePerHour(samples) : null; + let state = "collecting"; + if (slope != null) { + // Rising faster than 2% of the current outside-cache size per hour (and at least 4 MiB/h). + const threshold = Math.max(4 * 1048576, data.outside * 0.02); + state = slope > threshold ? "rising" : slope < -threshold ? "falling" : "stable"; + } + badge.dataset.state = state; + badge.textContent = tr({ collecting: "memoryTrendCollecting", rising: "memoryTrendRising", falling: "memoryTrendFalling", stable: "memoryTrendStable" }[state]); + const minutes = Math.round(span / 60000); + setText("mb-trend-rate", slope == null + ? `${minutes} / ${MIN_TREND_MS / 60000} min` + : `${slope >= 0 ? "+" : "−"}${fmtBytes(Math.abs(slope))}/h · ${minutes} min`); + } + + function rowKey(key) { + return { "cache-data": "memoryCacheData", "cache-meta": "memoryCacheMeta", transient: "memoryTransient", + "alloc-free": "memoryAllocatorFree", files: "memoryFiles", rest: "memoryRest" }[key]; + } + + window.rustProxyOverviewSamples?.onChange?.(() => { samples = samples.slice(-limit()); }); + return { render, compute }; +})(); diff --git a/src/admin/web/app/overview-rows.js b/src/admin/web/app/overview-rows.js new file mode 100644 index 0000000..bf6b41d --- /dev/null +++ b/src/admin/web/app/overview-rows.js @@ -0,0 +1,179 @@ +// Row units for the custom Overview layout. Widths stay on the 12-column grid; +// heights snap to a shared row unit (the tallest compact stat card), so a tall +// panel can sit next to several rows of small cards and every edge lines up. +// Each card gets at least the rows its content needs; an explicit height +// (dashboard_widget_heights) can only make it taller, and charts stretch into +// the extra space. Below the narrow breakpoint the grid falls back to content +// height (CSS sets --overview-row-units: off). +window.rustProxyOverviewRows = (() => { + const grid = document.getElementById("dashboard-overview-grid"); + // A compact stat card spans ROW_DIVISIONS rows; finer rows keep taller cards + // close to their natural height instead of rounding up by a whole stat card. + const MAX_ROWS = 32, ROW_DIVISIONS = 2, FALLBACK_STAT = 84, MIN_INTERVAL_MS = 1500, SHRINK_CONFIRMATIONS = 3; + const noop = { schedule() { }, flush() { }, setHeights() { }, rowsFor() { return null; } }; + if (!grid) return noop; + let heights = null, frame = 0, lastRun = 0, lastWidth = 0; + const state = new Map(); + const shrinkVotes = new Map(); + const cards = () => [...grid.children].filter(node => node.dataset.dashboardWidget); + + function enabled() { + if (grid.dataset.overviewLayoutMode !== "custom") return false; + return getComputedStyle(grid).getPropertyValue("--overview-row-units").trim() !== "off"; + } + function clear() { + grid.classList.remove("has-row-units"); + grid.style.removeProperty("--overview-row-unit"); + for (const node of cards()) { node.style.removeProperty("--overview-rows"); delete node.dataset.dashboardRows; } + state.clear(); shrinkVotes.clear(); + } + function apply() { + frame = 0; + if (!grid.getClientRects().length || grid.classList.contains("is-overview-sorting")) return; + if (!enabled()) { if (grid.classList.contains("has-row-units")) clear(); return; } + lastRun = performance.now(); + lastWidth = grid.clientWidth; + const items = cards().filter(node => !node.hidden && node.getClientRects().length); + if (!items.length) return; + grid.classList.add("is-measuring-rows"); + // Bounding boxes include CSS zoom (Settings → Interface scale); grid tracks, + // gaps and the row unit are in CSS pixels, so divide measurements by it. + const zoom = zoomOf(); + const natural = items.map(node => node.getBoundingClientRect().height / zoom); + grid.classList.remove("is-measuring-rows"); + const gap = parseFloat(getComputedStyle(grid).rowGap) || 0; + const isStat = node => node.classList.contains("stat"); + // The unit is half of the smallest stat card, so every card ends within a + // few pixels of its natural height instead of being rounded up by a whole tile. + const stats = natural.filter((_, index) => isStat(items[index]) && natural[index] > 0); + const statHeight = stats.length ? Math.min(...stats) : FALLBACK_STAT; + const unit = Math.max(16, (statHeight - gap * (ROW_DIVISIONS - 1)) / ROW_DIVISIONS); + grid.style.setProperty("--overview-row-unit", `${unit}px`); + const seen = new Set(); + items.forEach((node, index) => { + const id = node.dataset.dashboardWidget; + seen.add(id); + // Small tolerance so sub-pixel rounding never adds a whole row. + let min = Math.max(1, Math.ceil((natural[index] + gap) / (unit + gap) - 0.04)); + const previous = state.get(id); + // Grow at once; shrink only after the smaller size is seen repeatedly, + // so live data (table rows, wrapping labels) cannot make the grid jump. + if (previous && min < previous.min) { + const votes = (shrinkVotes.get(id) || 0) + 1; + if (votes < SHRINK_CONFIRMATIONS) { shrinkVotes.set(id, votes); min = previous.min; } + else shrinkVotes.delete(id); + } else shrinkVotes.delete(id); + const span = Math.max(min, Math.min(MAX_ROWS, heights?.[id] ?? 0)); + setRows(node, span); + state.set(id, { span, min }); + }); + for (const id of [...state.keys()]) if (!seen.has(id)) state.delete(id); + grid.classList.add("has-row-units"); + const geometry = gridGeometry(unit + gap, zoom); + if (!geometry) return; + equalizeStatRows(items.filter(isStat), geometry); + alignBottom(items, geometry); + } + function setRows(node, rows) { + if (node.dataset.dashboardRows === String(rows)) return; + node.style.setProperty("--overview-rows", String(rows)); + node.dataset.dashboardRows = String(rows); + } + const rowsOf = node => Number(node.dataset.dashboardRows) || 1; + function zoomOf() { + const css = parseFloat(getComputedStyle(grid).width); + const visual = grid.getBoundingClientRect().width; + return css > 0 && visual > 0 ? visual / css : 1; + } + // Geometry in the grid's own CSS pixels (content box), independent of zoom. + function gridGeometry(step, zoom) { + const style = getComputedStyle(grid); + const tracks = style.gridTemplateColumns.split(" ").map(parseFloat).filter(Number.isFinite); + if (tracks.length < 2) return null; + const columnGap = parseFloat(style.columnGap) || 0; + const starts = []; + tracks.reduce((x, width) => { starts.push(x); return x + width + columnGap; }, 0); + return { + starts, step, zoom, + left: (parseFloat(style.borderLeftWidth) || 0) + (parseFloat(style.paddingLeft) || 0), + top: (parseFloat(style.borderTopWidth) || 0) + (parseFloat(style.paddingTop) || 0), + }; + } + function place(node, geometry) { + const box = grid.getBoundingClientRect(), rect = node.getBoundingClientRect(); + const { starts, zoom } = geometry; + const left = (rect.left - box.left) / zoom - geometry.left; + const right = (rect.right - box.left) / zoom - geometry.left; + const top = (rect.top - box.top) / zoom - geometry.top; + const first = starts.reduce((best, start, index) => Math.abs(start - left) < Math.abs(starts[best] - left) ? index : best, 0); + let last = first; + while (last + 1 < starts.length && starts[last + 1] < right - 1) last++; + const row = Math.max(0, Math.round(top / geometry.step)); + return { node, first, last, row, end: row + rowsOf(node) }; + } + // Stat cards that start on the same grid row get the height of the tallest of + // them, like a classic row of tiles. Raising a row can move later cards, so the + // pass repeats until nothing changes. Large cards never stretch the tiles. + function equalizeStatRows(stats, geometry) { + for (let pass = 0; pass < 6; pass++) { + const groups = new Map(); + for (const node of stats) { + const { row } = place(node, geometry); + if (!groups.has(row)) groups.set(row, []); + groups.get(row).push(node); + } + let changed = false; + for (const group of groups.values()) { + const target = Math.max(...group.map(rowsOf)); + for (const node of group) if (rowsOf(node) !== target) { setRows(node, target); changed = true; } + } + if (!changed) return; + } + } + // A card is stretched down over the empty cells beneath it, up to the next card + // below (or the grid's last row), so rows end on straight edges instead of + // jagged ones. Only empty cells are taken, which never changes where any other + // card is placed. The stored / edited height (state.span) is unaffected. + // Only small steps are closed (up to two stat tiles or half the card's own + // height); a large hole is left visible rather than hidden by a stretched card. + function alignBottom(items, geometry) { + const cards = items.map(node => place(node, geometry)); + const bottom = Math.max(...cards.map(card => card.end)); + for (const card of cards) { + const next = cards.reduce((limit, other) => other !== card && other.first <= card.last + && other.last >= card.first && other.row >= card.end ? Math.min(limit, other.row) : limit, bottom); + const rows = card.end - card.row, extra = next - card.end; + if (extra > 0 && extra <= Math.max(ROW_DIVISIONS * 2, Math.ceil(rows / 2))) setRows(card.node, rows + extra); + } + } + function schedule(force = false) { + if (frame) return; + const wait = force ? 0 : Math.max(0, MIN_INTERVAL_MS - (performance.now() - lastRun)); + if (wait > 0) { frame = setTimeout(() => { frame = 0; schedule(true); }, wait); return; } + frame = requestAnimationFrame(apply); + } + function flush() { + if (frame) { cancelAnimationFrame(frame); clearTimeout(frame); frame = 0; } + shrinkVotes.clear(); + state.forEach(entry => { entry.min = 1; }); + apply(); + } + function setHeights(value) { + heights = value && typeof value === "object" ? { ...value } : null; + schedule(true); + } + if (typeof ResizeObserver === "function") { + new ResizeObserver(() => { + if (grid.clientWidth && grid.clientWidth !== lastWidth) { shrinkVotes.clear(); schedule(true); } + }).observe(grid); + } + document.fonts?.ready?.then(() => schedule(true)); + return { + schedule, + flush, + setHeights, + rowsFor(id) { + return grid.classList.contains("has-row-units") ? state.get(id) || null : null; + }, + }; +})(); diff --git a/src/admin/web/app/preferences.js b/src/admin/web/app/preferences.js index e0fbafc..256329f 100644 --- a/src/admin/web/app/preferences.js +++ b/src/admin/web/app/preferences.js @@ -14,7 +14,7 @@ const ADMIN_DEFAULT_HIDDEN_WIDGETS = Object.freeze([...new Set([ const ADMIN_APPEARANCE_DEFAULTS = Object.freeze({ theme: "dark", language: "auto", ui_scale: 100, time_format: "24h", chart_style: "default", chart_axes: false, interface_icons: false, logo_animation: false, - button_style: "normal", corner_style: "default", table_density: "normal", dashboard_density: ADMIN_DASHBOARD_DEFAULTS.dashboard_density, dashboard_widgets: [...ADMIN_DASHBOARD_WIDGETS], dashboard_hidden_widgets: [...ADMIN_DEFAULT_HIDDEN_WIDGETS], dashboard_widget_sizes: null, + button_style: "normal", corner_style: "default", table_density: "normal", dashboard_density: ADMIN_DASHBOARD_DEFAULTS.dashboard_density, dashboard_widgets: [...ADMIN_DASHBOARD_WIDGETS], dashboard_hidden_widgets: [...ADMIN_DEFAULT_HIDDEN_WIDGETS], dashboard_widget_sizes: null, dashboard_widget_heights: null, }); const CHART_STYLE_KEYS = Object.freeze({ default: "chartStyleDefault", soft: "chartStyleSoft", technical: "chartStyleTechnical", high_contrast: "chartStyleHighContrast", neon: "chartStyleNeon", monochrome: "chartStyleMonochrome", warm: "chartStyleWarm", cool: "chartStyleCool", sunset: "chartStyleSunset", aurora: "chartStyleAurora", ocean: "chartStyleOcean", forest: "chartStyleForest", pastel: "chartStylePastel", terminal: "chartStyleTerminal", blueprint: "chartStyleBlueprint", colorblind: "chartStyleColorblind" }); let adminPreferences = null, adminPreferencesLoading = null, adminPreferencesWrite = Promise.resolve(), adminPreferencesUnavailable = false; @@ -69,6 +69,15 @@ function normalizeDashboardWidgetSizes(value) { } return result; } +const DASHBOARD_MAX_ROWS = 32; +function normalizeDashboardWidgetHeights(value) { + if (!value || typeof value !== "object" || Array.isArray(value)) return null; + const result = {}; + for (const [id, rows] of Object.entries(value)) { + if (ADMIN_DASHBOARD_BY_ID.has(id) && Number.isInteger(rows) && rows >= 1 && rows <= DASHBOARD_MAX_ROWS) result[id] = rows; + } + return Object.keys(result).length ? result : null; +} function dashboardWidgetWidth(id, sizes) { return sizes?.[id] ?? dashboardDefaultWidth(id); } @@ -144,7 +153,7 @@ function applyAdminDashboardDensity(value) { const density = normalizeAdminDensity(value, "compact"); document.documentElement.dataset.dashboardDensity = density; const select = $("ui-dashboard-density"); if (select) select.value = density; return density; } -function applyDashboardLayout(order, hidden, sizes = null) { +function applyDashboardLayout(order, hidden, sizes = null, heights = undefined) { const normalizedOrder = normalizeDashboardWidgets(order), hiddenSet = new Set(normalizeHiddenDashboardWidgets(hidden)); const widths = normalizeDashboardWidgetSizes(sizes); const grid = document.querySelector("#panel-overview .stats-grid"); @@ -161,6 +170,8 @@ function applyDashboardLayout(order, hidden, sizes = null) { window.rustProxyStreamDashboard?.syncVisibility?.([...hiddenSet]); window.rustProxyBackendDashboard?.syncVisibility?.([...hiddenSet]); window.rustProxyMasonry?.refresh?.(); + if (heights !== undefined) window.rustProxyOverviewRows?.setHeights?.(normalizeDashboardWidgetHeights(heights)); + window.rustProxyOverviewRows?.schedule?.(); if (typeof latestStatus !== "undefined" && latestStatus && currentPanel === "overview") { window.rustProxyStreamDashboard?.render?.(latestStatus, [...hiddenSet], false); window.rustProxyBackendDashboard?.render?.(latestStatus, [...hiddenSet], false); window.rustProxyExtraOverview?.render?.(latestStatus, false); window.rustProxyWideOverview?.render?.(latestStatus, false); window.rustProxyWebOverview?.render?.(latestStatus, false); } return { order: normalizedOrder, hidden: [...hiddenSet], sizes: widths }; } @@ -283,14 +294,15 @@ function applyAdminPreferences(value, cache = true) { const savedOrder = normalizeDashboardWidgets(value.dashboard_widgets); const savedHidden = normalizeHiddenDashboardWidgets(value.dashboard_hidden_widgets, value.dashboard_widgets); const savedSizes = normalizeDashboardWidgetSizes(value.dashboard_widget_sizes); - if (editing) applyDashboardLayout(editing.order, editing.hidden, editing.sizes); - else applyDashboardLayout(savedOrder, savedHidden, savedSizes); + const savedHeights = normalizeDashboardWidgetHeights(value.dashboard_widget_heights); + if (editing) applyDashboardLayout(editing.order, editing.hidden, editing.sizes, editing.heights); + else applyDashboardLayout(savedOrder, savedHidden, savedSizes, savedHeights); const normalized = { ...value, refresh: normalizeRefreshPreferences(value.refresh), theme: applyAdminTheme(value.theme, cache), language: applyAdminLanguage(value.language, cache, false), ui_scale: applyAdminUiScale(value.ui_scale, cache), time_format: applyAdminTimeFormat(value.time_format), chart_style: applyAdminChartStyle(value.chart_style), chart_axes: applyAdminChartAxes(value.chart_axes), interface_icons: applyAdminInterfaceIcons(value.interface_icons), logo_animation: applyAdminLogoAnimation(value.logo_animation), button_style: applyAdminButtonStyle(value.button_style), corner_style: applyAdminCornerStyle(value.corner_style, cache), table_density: applyAdminTableDensity(value.table_density), - dashboard_density: applyAdminDashboardDensity(value.dashboard_density), dashboard_widgets: savedOrder, dashboard_hidden_widgets: savedHidden, dashboard_widget_sizes: savedSizes, + dashboard_density: applyAdminDashboardDensity(value.dashboard_density), dashboard_widgets: savedOrder, dashboard_hidden_widgets: savedHidden, dashboard_widget_sizes: savedSizes, dashboard_widget_heights: savedHeights, }; adminPreferences = normalized; window.rustProxyRefresh?.update(normalized.refresh); @@ -338,7 +350,7 @@ function updateAdminPreferences(patch) { next.refresh = normalizeRefreshPreferences(next.refresh); next.theme = normalizeAdminTheme(next.theme); next.language = normalizeAdminLanguage(next.language); next.ui_scale = normalizeAdminUiScale(next.ui_scale); next.time_format = normalizeAdminTimeFormat(next.time_format); next.chart_style = normalizeAdminChartStyle(next.chart_style); next.chart_axes = next.chart_axes === true; next.interface_icons = next.interface_icons === true; next.logo_animation = next.logo_animation === true; next.button_style = normalizeAdminButtonStyle(next.button_style); next.corner_style = normalizeAdminCornerStyle(next.corner_style); next.table_density = normalizeAdminDensity(next.table_density); - next.dashboard_density = normalizeAdminDensity(next.dashboard_density, "compact"); next.dashboard_widgets = normalizeDashboardWidgets(next.dashboard_widgets); next.dashboard_hidden_widgets = normalizeHiddenDashboardWidgets(next.dashboard_hidden_widgets); next.dashboard_widget_sizes = normalizeDashboardWidgetSizes(next.dashboard_widget_sizes); + next.dashboard_density = normalizeAdminDensity(next.dashboard_density, "compact"); next.dashboard_widgets = normalizeDashboardWidgets(next.dashboard_widgets); next.dashboard_hidden_widgets = normalizeHiddenDashboardWidgets(next.dashboard_hidden_widgets); next.dashboard_widget_sizes = normalizeDashboardWidgetSizes(next.dashboard_widget_sizes); next.dashboard_widget_heights = normalizeDashboardWidgetHeights(next.dashboard_widget_heights); const saved = await api("/api/preferences", { method: "PUT", body: JSON.stringify(next) }); if (!authenticated || epoch !== authEpoch) return adminPreferences; return applyAdminPreferences(saved); @@ -461,7 +473,7 @@ $("ui-dashboard-density")?.addEventListener("change", () => { async function resetAppearancePatch(patch, control, messageKey = "appearanceSectionResetDone") { if (control) control.disabled = true; let previous = null; try { - const current = await loadAdminPreferences(); previous = current ? { ...current, dashboard_widgets: [...current.dashboard_widgets], dashboard_hidden_widgets: [...current.dashboard_hidden_widgets], dashboard_widget_sizes: current.dashboard_widget_sizes === null ? null : { ...current.dashboard_widget_sizes } } : null; + const current = await loadAdminPreferences(); previous = current ? { ...current, dashboard_widgets: [...current.dashboard_widgets], dashboard_hidden_widgets: [...current.dashboard_hidden_widgets], dashboard_widget_sizes: current.dashboard_widget_sizes === null ? null : { ...current.dashboard_widget_sizes }, dashboard_widget_heights: current.dashboard_widget_heights ? { ...current.dashboard_widget_heights } : null } : null; if (current) applyAdminPreferences({ ...current, ...patch }); await updateAdminPreferences(patch); toast(t(messageKey)); } catch (error) { if (previous) applyAdminPreferences(previous); if (error.status !== 401) toast(error.message, true); } finally { if (control) control.disabled = false; } @@ -469,9 +481,9 @@ async function resetAppearancePatch(patch, control, messageKey = "appearanceSect document.querySelectorAll("[data-appearance-reset]").forEach(control => control.addEventListener("click", () => { const patches = { interface: { theme: "dark", language: "auto", ui_scale: 100, time_format: "24h", interface_icons: false, logo_animation: false, button_style: "normal", corner_style: "default" }, charts: { chart_style: "default", chart_axes: false }, tables: { table_density: "normal" }, - dashboard: { dashboard_density: ADMIN_DASHBOARD_DEFAULTS.dashboard_density, dashboard_widgets: [...ADMIN_DASHBOARD_WIDGETS], dashboard_hidden_widgets: [...ADMIN_APPEARANCE_DEFAULTS.dashboard_hidden_widgets], dashboard_widget_sizes: null }, + dashboard: { dashboard_density: ADMIN_DASHBOARD_DEFAULTS.dashboard_density, dashboard_widgets: [...ADMIN_DASHBOARD_WIDGETS], dashboard_hidden_widgets: [...ADMIN_APPEARANCE_DEFAULTS.dashboard_hidden_widgets], dashboard_widget_sizes: null, dashboard_widget_heights: null }, }; void resetAppearancePatch(patches[control.dataset.appearanceReset] || {}, control); })); -$("appearance-reset")?.addEventListener("click", () => void resetAppearancePatch({ ...ADMIN_APPEARANCE_DEFAULTS, dashboard_widgets: [...ADMIN_DASHBOARD_WIDGETS], dashboard_hidden_widgets: [...ADMIN_APPEARANCE_DEFAULTS.dashboard_hidden_widgets], dashboard_widget_sizes: null }, $("appearance-reset"), "appearanceResetDone")); +$("appearance-reset")?.addEventListener("click", () => void resetAppearancePatch({ ...ADMIN_APPEARANCE_DEFAULTS, dashboard_widgets: [...ADMIN_DASHBOARD_WIDGETS], dashboard_hidden_widgets: [...ADMIN_APPEARANCE_DEFAULTS.dashboard_hidden_widgets], dashboard_widget_sizes: null, dashboard_widget_heights: null }, $("appearance-reset"), "appearanceResetDone")); refreshAppearanceUi(); diff --git a/src/admin/web/app/runtime.js b/src/admin/web/app/runtime.js index 054d666..38ae8fe 100644 --- a/src/admin/web/app/runtime.js +++ b/src/admin/web/app/runtime.js @@ -665,6 +665,8 @@ function renderDiagnostics(status, appendSample = true, systemSample = appendSam $("process-cpu-sparkline").closest(".mini-live-chart").hidden = live.process_cpu_percent == null; $("process-rss-sparkline").closest(".mini-live-chart").hidden = live.process_rss_bytes == null; renderProcessOverview(d, status, live, systemSample); + window.rustProxyMemoryBreakdown?.render(status, appendSample); + window.rustProxyOverviewRows?.schedule(); updateCacheMemorySizing(); const networkRateSupported = live.network_rx_bytes_per_second != null && live.network_tx_bytes_per_second != null; if (systemSample) setOptionalMetric("system-network", d.network_rx_bytes_per_second != null && d.network_tx_bytes_per_second != null, `${fmtBytes(d.network_rx_bytes_per_second)} / ${fmtBytes(d.network_tx_bytes_per_second)}`); diff --git a/src/admin/web/css/30-overview.css b/src/admin/web/css/30-overview.css index 9608429..5feef7e 100644 --- a/src/admin/web/css/30-overview.css +++ b/src/admin/web/css/30-overview.css @@ -1977,6 +1977,72 @@ html:is([data-corner-style=square], [data-corner-style=subtle], [data-corner-sty grid-column-start: auto; } +/* Row units (custom layout): heights snap to the compact stat card height so tall + panels sit beside several rows of small cards with aligned edges. + overview-rows.js sets --overview-row-unit and each card's --overview-rows. */ +#panel-overview .dashboard-overview-grid.is-aligned.has-row-units { + grid-auto-rows: var(--overview-row-unit, 84px); +} + +#panel-overview .dashboard-overview-grid.is-aligned.has-row-units>:is([data-dashboard-widget], .overview-drop-placeholder) { + grid-row: auto/span var(--overview-rows, 1); + min-height: 0; +} + +#panel-overview .dashboard-overview-grid.is-aligned.has-row-units>.overview-drop-placeholder { + min-height: 0 !important; +} + +#panel-overview .dashboard-overview-grid.is-measuring-rows>[data-dashboard-widget] { + align-self: start !important; +} + +/* A card taller than its content gives the extra height to its charts instead of + leaving an empty band at the bottom. */ +#panel-overview .dashboard-overview-grid.has-row-units>.card[data-dashboard-widget]:not([hidden]) { + display: flex; + flex-direction: column; +} + +#panel-overview .dashboard-overview-grid.has-row-units>.card[data-dashboard-widget]>svg:not(.ui-icon), +#panel-overview .dashboard-overview-grid.has-row-units>.card[data-dashboard-widget]>.mini-live-chart-stack, +#panel-overview .dashboard-overview-grid.has-row-units>.card[data-dashboard-widget]>.table-scroll { + flex: 1 0 auto; +} + +#panel-overview .dashboard-overview-grid.has-row-units>.card[data-dashboard-widget] .mini-live-chart { + display: flex; + flex-direction: column; +} + +#panel-overview .dashboard-overview-grid.has-row-units>.card[data-dashboard-widget] .mini-live-chart>svg:not(.ui-icon) { + flex: 1 0 auto; +} + +/* With chart scales enabled the SVG sits in an axis host: grow the host and its SVG. */ +#panel-overview .dashboard-overview-grid.has-row-units>.card[data-dashboard-widget] :is(.rp-chart-axis-host, .mini-live-chart>.rp-chart-axis-host) { + display: flex; + flex: 1 0 auto; + flex-direction: column; +} + +#panel-overview .dashboard-overview-grid.has-row-units>.card[data-dashboard-widget] .rp-chart-axis-host>svg:not(.ui-icon) { + flex: 1 0 auto; +} + +#panel-overview .dashboard-overview-grid.is-unlocked.has-row-units { + background-image: linear-gradient(to bottom, color-mix(in srgb, var(--accent) 7%, transparent) 0 var(--overview-row-unit, 84px), transparent var(--overview-row-unit, 84px)); + background-size: 100% calc(var(--overview-row-unit, 84px) + var(--overview-gap, 8px)); +} + +#panel-overview .overview-inline-height-value { + min-width: 36px; +} + +#panel-overview .overview-inline-height[hidden] { + display: none; +} + #panel-overview .overview-inline-width { display: inline-flex; align-items: center; @@ -2462,6 +2528,38 @@ html[data-table-density=ultra] .pr-chip { padding: 1px 7px; } .pr-cols, .pr-charts { grid-template-columns: 1fr; } } +/* Memory breakdown card (memory_breakdown) */ +.mb-card { display: flex; flex-direction: column; } +.mb-card .mb-chips { margin-bottom: 12px; } +.mb-bar { display: flex; height: 22px; overflow: hidden; background: var(--line); border-radius: var(--rp-progress-radius, 0); gap: 1px; } +.mb-bar i { display: block; width: 0; min-width: 0; transition: width .4s ease; } +.mb-cache-data { background: var(--chart-accent); } +.mb-cache-meta { background: color-mix(in srgb, var(--chart-accent) 50%, var(--panel)); } +.mb-transient { background: var(--chart-tertiary); } +.mb-alloc-free { background: repeating-linear-gradient(135deg, var(--chart-quinary) 0 4px, color-mix(in srgb, var(--chart-quinary) 35%, var(--panel)) 4px 8px); } +.mb-files { background: var(--chart-secondary); } +.mb-rest { background: color-mix(in srgb, var(--muted) 55%, var(--panel)); } +.mb-legend { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 0 22px; margin: 10px 0 0; padding: 0; list-style: none; } +.mb-item { display: grid; grid-template-columns: 10px 1fr auto 46px; align-items: baseline; gap: 8px; padding: 6px 2px; border-top: 1px solid var(--row-line); } +.mb-item[hidden] { display: none; } +.mb-swatch { width: 10px; height: 10px; align-self: center; border-radius: var(--rp-progress-radius, 0); } +.mb-name { min-width: 0; color: var(--muted); font-size: 11px; overflow-wrap: anywhere; } +.mb-item b { font: 500 12px var(--mono); font-variant-numeric: tabular-nums; text-align: end; } +.mb-item em { color: var(--text-subtle); font: normal 11px var(--mono); font-variant-numeric: tabular-nums; text-align: end; } +.mb-cols { flex: 1 0 auto; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); margin-top: 4px; } +.mb-trend { display: flex; flex-direction: column; margin-top: 10px; } +.mb-trend svg:not(.ui-icon) { flex: 1 1 0; height: 0; min-height: 56px; } +.diagnostic-line.mb-outside-line { stroke: var(--chart-quinary); } +.mb-trend-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 6px; } +.mb-badge { display: inline-flex; align-items: center; height: 20px; padding: 0 8px; border: 1px solid var(--line); border-radius: var(--rp-radius-control, 0); color: var(--muted); font: 9px var(--mono); letter-spacing: 1px; text-transform: uppercase; } +.mb-badge[data-state="stable"] { border-color: color-mix(in srgb, var(--green) 55%, transparent); color: var(--green); } +.mb-badge[data-state="falling"] { border-color: color-mix(in srgb, var(--blue) 55%, transparent); color: var(--blue); } +.mb-badge[data-state="rising"] { border-color: color-mix(in srgb, var(--red) 60%, transparent); color: var(--red); } +.mb-unavailable { margin: 6px 0 0; } +html[data-table-density=compact] .mb-item { padding-top: 5px; padding-bottom: 5px; } +html[data-table-density=ultra] .mb-item { padding-top: 3px; padding-bottom: 3px; } +html[data-table-density=ultra] .mb-bar { height: 16px; } + /* initial width of the cache outcome segments (set from JS via CSSOM; inline style attributes are blocked by the CSP) */ .cache-mix-hit, .cache-mix-miss, .cache-mix-bypass, .cache-mix-other { width: 0; } diff --git a/src/admin/web/css/70-responsive.css b/src/admin/web/css/70-responsive.css index a494ffb..c2f662d 100644 --- a/src/admin/web/css/70-responsive.css +++ b/src/admin/web/css/70-responsive.css @@ -1597,8 +1597,10 @@ --overview-widget-placement: auto/span 3; } + /* A third of the wide grid becomes half of the 6-column grid, so two panels or + charts sit side by side instead of leaving a two-column hole. */ #panel-overview .dashboard-overview-grid.is-aligned>[data-dashboard-widget][data-dashboard-span="4"] { - --overview-widget-placement: auto/span 4; + --overview-widget-placement: auto/span 3; } #panel-overview .dashboard-overview-grid.is-aligned>[data-dashboard-widget][data-dashboard-span="12"], @@ -1608,6 +1610,10 @@ } @container overview-canvas (max-width:700px) { + #panel-overview .dashboard-overview-grid { + --overview-row-units: off; + } + #panel-overview .dashboard-overview-grid.is-aligned { grid-template-columns: repeat(2, minmax(0, 1fr)); } diff --git a/src/admin/web/dashboard-defaults.json b/src/admin/web/dashboard-defaults.json index 894f9cc..4b8aa9a 100644 --- a/src/admin/web/dashboard-defaults.json +++ b/src/admin/web/dashboard-defaults.json @@ -66,6 +66,7 @@ "extra_cold_queue_memory", "process_diagnostics", "process_simple", + "memory_breakdown", "network_diagnostics", "backend_table", "backend_tiny", @@ -144,7 +145,8 @@ "extra_rejected_rate", "extra_cert_expiry", "backend_tiny", - "process_simple" + "process_simple", + "memory_breakdown" ], "dashboard_density": "compact", "overview_samples": 600 diff --git a/src/admin/web/dashboard-widgets.json b/src/admin/web/dashboard-widgets.json index 8f5122a..40179b1 100644 --- a/src/admin/web/dashboard-widgets.json +++ b/src/admin/web/dashboard-widgets.json @@ -725,6 +725,17 @@ "default_hidden": true, "display_type": "panel" }, + { + "id": "memory_breakdown", + "label_key": "memoryBreakdownTitle", + "description_key": "memoryBreakdownDescription", + "element_selector": "[data-dashboard-widget=\"memory_breakdown\"]", + "data_source": "system_status", + "no_data": "neutral_dash", + "category": "panels", + "default_hidden": true, + "display_type": "panel" + }, { "id": "network_diagnostics", "label_key": "networkDiagnostics", diff --git a/src/admin/web/index.html b/src/admin/web/index.html index 040d680..1567214 100644 --- a/src/admin/web/index.html +++ b/src/admin/web/index.html @@ -339,6 +339,57 @@ +
+
+

Memory breakdown

+
+
+ i +
+

Splits the process RSS into cached object data, the cache's own bookkeeping (index, keys, headers), short-lived cache buffers, memory the allocator keeps free for reuse (fragmentation; an upper bound, part of it may already be returned to the kernel), program code and mapped files, and everything else (connections, TLS, runtime, logs, GeoIP). For comparison, Varnish documents about 1 KiB of per-object overhead outside its storage size. A steadily rising "outside cache" trend while the cache is full suggests a leak; a flat one means overhead or fragmentation.

+
+
+ - +
+
+
+
RSS / cache
-
+
Overhead / object
-
+
HOT objects
-
+
Fragmentation
-
+
+ +
    +
  • Cache data (object bodies)--
  • +
  • Cache bookkeeping--
  • +
  • Cache buffers (fills, queues)--
  • +
  • Free, held by allocator--
  • +
  • Code and mapped files--
  • +
  • Rest of process--
  • +
+
+
+

Allocator

+
+
Heap (arenas)
-
+
In use
-
+
Free, held
-
+
Large blocks (mmap) · count
-
+
+ +
+
+
Outside cache-
+ + + + +
--
+
+
+

Process simple

diff --git a/src/diagnostics.rs b/src/diagnostics.rs index 45f095f..cafb447 100644 --- a/src/diagnostics.rs +++ b/src/diagnostics.rs @@ -148,6 +148,57 @@ impl Diagnostics { } } +/// Heap statistics reported by the glibc allocator (`mallinfo2`). +/// +/// `free_bytes` is memory the allocator keeps for reuse (fragmentation and +/// not-yet-returned pages). Part of it may already be released to the kernel +/// by `malloc_trim`, so it is an upper bound of the resident share. +#[derive(Debug, Clone, Copy, serde::Serialize)] +pub struct AllocatorStats { + pub allocator: &'static str, + pub heap_bytes: u64, + pub in_use_bytes: u64, + pub free_bytes: u64, + pub releasable_bytes: u64, + pub mmap_bytes: u64, + pub mmap_blocks: u64, +} + +/// Returns glibc heap statistics, sampled at most every two seconds because +/// `mallinfo2` walks every arena under its lock. `None` on other allocators +/// (musl, non-Linux or the optional mimalloc build). +pub fn allocator_stats() -> Option { + #[cfg(all(target_os = "linux", target_env = "gnu", not(feature = "mimalloc")))] + { + use std::sync::Mutex; + use std::time::{Duration, Instant}; + static LAST: Mutex> = Mutex::new(None); + let mut last = LAST.lock().unwrap_or_else(|e| e.into_inner()); + if let Some((at, stats)) = *last { + if at.elapsed() < Duration::from_secs(2) { + return Some(stats); + } + } + // SAFETY: mallinfo2 has no preconditions and only reads allocator state. + let info = unsafe { libc::mallinfo2() }; + let stats = AllocatorStats { + allocator: "glibc", + heap_bytes: info.arena as u64, + in_use_bytes: info.uordblks as u64, + free_bytes: info.fordblks as u64, + releasable_bytes: info.keepcost as u64, + mmap_bytes: info.hblkhd as u64, + mmap_blocks: info.hblks as u64, + }; + *last = Some((Instant::now(), stats)); + Some(stats) + } + #[cfg(not(all(target_os = "linux", target_env = "gnu", not(feature = "mimalloc"))))] + { + None + } +} + pub fn trim_allocator() -> bool { #[cfg(all(target_os = "linux", target_env = "gnu"))] unsafe { diff --git a/tests/panel_refresh_contract.js b/tests/panel_refresh_contract.js index 96693d2..b979ccb 100644 --- a/tests/panel_refresh_contract.js +++ b/tests/panel_refresh_contract.js @@ -51,5 +51,5 @@ const events = openapi.paths["/api/events"].get; const logsFlag = (events.parameters || []).find(parameter => parameter.name === "logs"); assert.equal(logsFlag?.schema?.type, "boolean"); assert.equal(logsFlag?.schema?.default, true); -assert.equal(openapi.info.version, "0.36.8"); +assert.equal(openapi.info.version, "0.36.9"); console.log("Panel refresh/API contract checks: OK");