Spree Commerce is a self-hosted headless e-commerce platform that replaces hosted monoliths with a decoupled Next.js storefront and zero transaction fees.
Spree Commerce pairs a Ruby on Rails backend engine with a decoupled Next.js storefront for self-hosted headless e-commerce. Launched in 2008, the framework exposes a REST API and TypeScript SDK for multi-currency pricing, inventory control, and order fulfillment. By running on private infrastructure, it grants engineering teams direct control over checkout pipelines without transactional platform fees.
Hosted platforms like Shopify Plus and BigCommerce manage hosting and traffic surges, but enforce monthly subscriptions and percentage-based platform cuts on transaction volume. Proprietary headless engines like commercetools offer API flexibility while running inside vendor clouds that meter request volumes and prevent direct database access. Teams with strict data-residency rules or bespoke supply chains often find that commercial SaaS limits custom backend middleware and checkout logic.
Spree Commerce occupies the self-hosted operational tier for engineering teams that prioritize infrastructure control over convenience. Deploying Spree requires orchestrating Rails containers, PostgreSQL, Redis, and Sidekiq background workers on private clouds or Kubernetes clusters. This operational model trades variable vendor cuts for predictable compute bills, giving systems engineers direct SQL access, custom event publishers, and low-level checkout hooks that closed platforms forbid.
Is Spree Commerce free for commercial use? Yes. Spree Commerce is open source with no license fees, seat charges, or transaction-percentage cuts for commercial deployments.
What server stack is required to host Spree Commerce? A typical production setup requires a Ruby on Rails backend container, PostgreSQL, Redis for background queues, and a Node.js runtime for the Next.js storefront.
How does Spree Commerce differ from hosted platforms like Shopify? Hosted services manage infrastructure in exchange for subscription fees and transaction cuts, whereas Spree Commerce gives developers full code and database control on private servers.
Spree Commerce is an effective choice for engineering teams that require bespoke checkout flows and complete data residency, provided they can operate a Rails and container stack. Its BSD-3-Clause license ensures you retain full ownership of proprietary modifications without paying transaction cuts, while active maintenance and commits through September 2026 keep the core platform aligned with modern frontend tooling.
We started this exact setup from scratch in a clean Linux machine on Nov 1, 2026 and checked it through Spree Commerce's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p spree && cd spree
curl -fsSL https://open-source.store/tools/spree/compose.yml -o compose.ymlcat > .env <<EOF
SECRET_KEY_BASE=$(openssl rand -hex 32)
POSTGRES_PASSWORD=$(openssl rand -hex 12)
[email protected]
ADMIN_PASSWORD=$(openssl rand -hex 12)
SPREE_HOST=localhost:3000
SPREE_DASHBOARD_URL=http://localhost:3000/dashboard
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=$(openssl rand -hex 16)
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=$(openssl rand -hex 16)
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=$(openssl rand -hex 16)
EOFSECRET_KEY_BASE — Secret key for Rails session signing and encryption. Generated above; keep it secret.POSTGRES_PASSWORD — Password of the PostgreSQL database user. Generated above; keep it secret.ADMIN_EMAIL — Email address of the initial administrator account created on startup.ADMIN_PASSWORD — Password of the initial administrator account created on startup. Generated above; keep it secret.SPREE_HOST — Public hostname and port where the store is reached (e.g. store.example.com or localhost:3000, without scheme); set this to your server's host and port.SPREE_DASHBOARD_URL — Public URL of the admin dashboard; set this to your server's public URL (e.g. http://<your-server>:3000/dashboard).ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY — Primary key for Active Record encryption of sensitive data at rest. Generated above; keep it secret.ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY — Deterministic key for Active Record encryption of sensitive data. Generated above; keep it secret.ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT — Key derivation salt for Active Record encryption. Generated above; keep it secret.docker compose up -dservices:
web:
image: ghcr.io/spree/spree:6.0.1
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://postgres:${POSTGRES_PASSWORD}@postgres:5432/spree_production
SECRET_KEY_BASE: ${SECRET_KEY_BASE}
ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY: ${ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY}
ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY: ${ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY}
ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT: ${ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT}
ADMIN_EMAIL: ${ADMIN_EMAIL}
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
RAILS_FORCE_SSL: "false"
RAILS_ASSUME_SSL: "false"
SPREE_HOST: ${SPREE_HOST}
SPREE_DASHBOARD_URL: ${SPREE_DASHBOARD_URL}
RAILS_LOG_LEVEL: info
depends_on:
postgres:
condition: service_healthy
volumes:
- storage_data:/rails/storage
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:3000/up || exit 1"]
interval: 10s
timeout: 5s
retries: 15
start_period: 30s
postgres:
image: postgres:18-alpine
environment:
POSTGRES_DB: spree_production
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
PGDATA: /var/lib/postgresql/18/docker
volumes:
- postgres_data:/var/lib/postgresql
healthcheck:
test: ["CMD-SHELL", "pg_isready -h 127.0.0.1 -U postgres"]
interval: 5s
timeout: 5s
retries: 5
volumes:
postgres_data:
storage_data:
Free IDE for Java, Kotlin, Go, TypeScript and Python. Built on IntelliJ Community, fully open source, 300+ plugins.
Show that Spree Commerce is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 40 s: postgres:18-alpine, ghcr.io/spree/spree:6.0.1.
Based on the upstream setup. Official compose from spree-starter. Image pinned to 6.0.1; postgres pinned to 18-alpine; database password, admin credentials, encryption keys, secrets, and public host moved to .env; mailpit removed.
web-1 | 2026-11-01T23:51:16.380161794Z [c025dd27-cb57-44de-8266-19e852736973] ActionController::RoutingError (No route matches [GET] "/cacti.log"): web-1 | 2026-11-01T23:51:16.380164003Z [c025dd27-cb57-44de-8266-19e852736973] web-1 | 2026-11-01T23:51:16.380702003Z [6d54e41e-591f-4e2f-aeea-969dd091cdc5] web-1 | 2026-11-01T23:51:16.380724419Z [6d54e41e-591f-4e2f-aeea-969dd091cdc5] ActionController::RoutingError (No route matches [GET] "/img.php"): web-1 | 2026-11-01T23:51:16.380727128Z [6d54e41e-591f-4e2f-aeea-969dd091cdc5] web-1 | 2026-11-01T23:51:16.381811044Z [3457f449-5080-4055-b6c7-aea449f9cf98] web-1 | 2026-11-01T23:51:16.381820419Z [3457f449-5080-4055-b6c7-aea449f9cf98] ActionController::RoutingError (No route matches [GET] "/wp-admin/admin.php"): web-1 | 2026-11-01T23:51:16.381822461Z [3457f449-5080-4055-b6c7-aea449f9cf98] web-1 | 2026-11-01T23:51:16.382872586Z [d031a0e7-4062-4510-8d7d-ab1e9d9744fa] web-1 | 2026-11-01T23:51:16.382885586Z [d031a0e7-4062-4510-8d7d-ab1e9d9744fa] ActionController::RoutingError (No route matches [GET] "/wp-admin/admin.php"): web-1 | 2026-11-01T23:51:16.382887586Z [d031a0e7-4062-4510-8d7d-ab1e9d9744fa] web-1 | 2026-11-01T23:51:16.383395128Z [dfac5c35-d685-4351-b12d-39310141c560] web-1 | 2026-11-01T23:51:16.383401128Z [dfac5c35-d685-4351-b12d-39310141c560] ActionController::RoutingError (No route matches [GET] "/setup/install.php"): web-1 | 2026-11-01T23:51:16.383402669Z [dfac5c35-d685-4351-b12d-39310141c560] web-1 | 2026-11-01T23:51:16.383957169Z [4defbcfe-ea70-49ae-bd3b-6f243cdd992a] web-1 | 2026-11-01T23:51:16.383971336Z [4defbcfe-ea70-49ae-bd3b-6f243cdd992a] ActionController::RoutingError (No route matches [GET] "/KeepAlive.jsp"): web-1 | 2026-11-01T23:51:16.383973544Z [4defbcfe-ea70-49ae-bd3b-6f243cdd992a] web-1 | 2026-11-01T23:51:16.384360336Z [6ac8825a-7c27-4582-b6df-c7d62a0954ea] web-1 | 2026-11-01T23:51:16.384367336Z [6ac8825a-7c27-4582-b6df-c7d62a0954ea] ActionController::RoutingError (No route matches [GET] "/setup/install.php"): web-1 | 2026-11-01T23:51:16.384369044Z [6ac8825a-7c27-4582-b6df-c7d62a0954ea] web-1 | 2026-11-01T23:51:16.384744794Z [0a8dfbb9-1df9-4b50-b214-ddd14088fc71] web-1 | 2026-11-01T23:51:16.384748253Z [0a8dfbb9-1df9-4b50-b214-ddd14088fc71] ActionController::RoutingError (No route matches [GET] "/KeepAlive.jsp"): web-1 | 2026-11-01T23:51:16.384750003Z [0a8dfbb9-1df9-4b50-b214-ddd14088fc71] web-1 | 2026-11-01T23:51:16.385758503Z [0eaaee1b-677e-4976-9675-1936d8a1bbbf] web-1 | 2026-11-01T23:51:16.385764336Z [0eaaee1b-677e-4976-9675-1936d8a1bbbf] ActionController::RoutingError (No route matches [GET] "/cacti.log"): web-1 | 2026-11-01T23:51:16.385765836Z [0eaaee1b-677e-4976-9675-1936d8a1bbbf] web-1 | 2026-11-01T23:51:16.385767003Z [4a980c70-e8fa-45c7-9bf1-e3851f1f4dc1] web-1 | 2026-11-01T23:51:16.385768378Z [4a980c70-e8fa-45c7-9bf1-e3851f1f4dc1] ActionController::RoutingError (No route matches [GET] "/img.php"): web-1 | 2026-11-01T23:51:16.385769669Z [4a980c70-e8fa-45c7-9bf1-e3851f1f4dc1] web-1 | 2026-11-01T23:51:16.387000753Z [75fc58bc-18aa-4340-92c6-2c48547d23dd] web-1 | 2026-11-01T23:51:16.387013086Z [75fc58bc-18aa-4340-92c6-2c48547d23dd] ActionController::RoutingError (No route matches [GET] "/backup/auto.php"): web-1 | 2026-11-01T23:51:16.387014794Z [75fc58bc-18aa-4340-92c6-2c48547d23dd] web-1 | 2026-11-01T23:51:16.387435086Z [aa1bf4be-f752-4fd2-a98c-805e6d42c51d] web-1 | 2026-11-01T23:51:16.387442003Z [aa1bf4be-f752-4fd2-a98c-805e6d42c51d] ActionController::RoutingError (No route matches [GET] "/json/reply/RequestLogs"): web-1 | 2026-11-01T23:51:16.387450836Z [aa1bf4be-f752-4fd2-a98c-805e6d42c51d] web-1 | 2026-11-01T23:51:16.388646544Z [b06d9fa5-e9da-4c27-98dc-3a4d759b550b] web-1 | 2026-11-01T23:51:16.388653169Z [b06d9fa5-e9da-4c27-98dc-3a4d759b550b] ActionController::RoutingError (No route matches [GET] "/k8s/api/v1/namespaces/kube-system/secrets/kubernetes-dashboard-certs"): web-1 | 2026-11-01T23:51:16.388664294Z [b06d9fa5-e9da-4c27-98dc-3a4d759b550b] web-1 | 2026-11-01T23:51:16.389901753Z [65b5d9c7-af6d-41d2-a94c-d5df1fc42f9a] web-1 | 2026-11-01T23:51:16.389910711Z [65b5d9c7-af6d-41d2-a94c-d5df1fc42f9a] ActionController::RoutingError (No route matches [GET] "/modules/thumb/thumb.php"): web-1 | 2026-11-01T23:51:16.389912294Z [65b5d9c7-af6d-41d2-a94c-d5df1fc42f9a] web-1 | 2026-11-01T23:51:16.391505128Z [5d2eed3f-1bcd-4e84-b9cb-d30e5767937e] web-1 | 2026-11-01T23:51:16.391521628Z [5d2eed3f-1bcd-4e84-b9cb-d30e5767937e] ActionController::RoutingError (No route matches [GET] "/backup/auto.php"): web-1 | 2026-11-01T23:51:16.391523419Z [5d2eed3f-1bcd-4e84-b9cb-d30e5767937e] web-1 | 2026-11-01T23:51:16.391524461Z [cbaf4b4d-d8cd-48d6-8c65-a1b9aaeda3c8] web-1 | 2026-11-01T23:51:16.391525878Z [cbaf4b4d-d8cd-48d6-8c65-a1b9aaeda3c8] ActionController::RoutingError (No route matches [GET] "/.well-known/acme-challenge/../../admin/diagnostic.jsp"): web-1 | 2026-11-01T23:51:16.391527336Z [cbaf4b4d-d8cd-48d6-8c65-a1b9aaeda3c8] web-1 | 2026-11-01T23:51:16.392018544Z [6f85dc08-5629-40f9-a6cf-d86633e5fb67] web-1 | 2026-11-01T23:51:16.392023128Z [6f85dc08-5629-40f9-a6cf-d86633e5fb67] ActionController::RoutingError (No route matches [GET] "/modules/thumb/thumb.php"): web-1 | 2026-11-01T23:51:16.392025044Z [6f85dc08-5629-40f9-a6cf-d86633e5fb67] web-1 | 2026-11-01T23:51:16.393282919Z [4232fe05-6858-477b-95dd-9406157f0499] web-1 | 2026-11-01T23:51:16.393299003Z [4232fe05-6858-477b-95dd-9406157f0499] ActionController::RoutingError (No route matches [GET] "/haproxy"): web-1 | 2026-11-01T23:51:16.393300253Z [4232fe05-6858-477b-95dd-9406157f0499] web-1 | 2026-11-01T23:51:16.393787253Z [f61b5656-b7df-43bb-81e3-c2f4d38924a8] web-1 | 2026-11-01T23:51:16.393793003Z [f61b5656-b7df-43bb-81e3-c2f4d38924a8] ActionController::RoutingError (No route matches [GET] "/.well-known/acme-challenge/../../admin/diagnostic.jsp"): web-1 | 2026-11-01T23:51:16.393794294Z [f61b5656-b7df-43bb-81e3-c2f4d38924a8] web-1 | 2026-11-01T23:51:16.394412378Z [40c299b9-b1c5-4542-9d64-6682111cabd4] web-1 | 2026-11-01T23:51:16.394640628Z [40c299b9-b1c5-4542-9d64-6682111cabd4] ActionController::RoutingError (No route matches [GET] "/rails_admin"): web-1 | 2026-11-01T23:51:16.394643544Z [40c299b9-b1c5-4542-9d64-6682111cabd4] web-1 | 2026-11-01T23:51:16.394721878Z [00666a52-269c-4a6b-abcf-bd04bbb6cf81] web-1 | 2026-11-01T23:51:16.394724378Z [00666a52-269c-4a6b-abcf-bd04bbb6cf81] ActionController::RoutingError (No route matches [GET] "/rails_admin"): web-1 | 2026-11-01T23:51:16.394725336Z [00666a52-269c-4a6b-abcf-bd04bbb6cf81] web-1 | 2026-11-01T23:51:16.395049378Z [0a19c7dd-a319-445f-8637-cf39cfa17ae8] web-1 | 2026-11-01T23:51:16.395051836Z [0a19c7dd-a319-445f-8637-cf39cfa17ae8] ActionController::RoutingError (No route matches [GET] "/inc/supportLoad.asp"): web-1 | 2026-11-01T23:51:16.395053211Z [0a19c7dd-a319-445f-8637-cf39cfa17ae8] web-1 | 2026-11-01T23:51:16.396139753Z [4b1744d5-8b63-48d8-9c86-83d1f1f5068c] Redirected to http://localhost:3000/dashboard web-1 | 2026-11-01T23:51:16.396164586Z [4b1744d5-8b63-48d8-9c86-83d1f1f5068c] Completed 302 Found in 0ms web-1 | 2026-11-01T23:51:16.397766253Z [5b4cad9c-0741-42d8-adac-f25c6dcb9af8] web-1 | 2026-11-01T23:51:16.397769878Z [5b4cad9c-0741-42d8-adac-f25c6dcb9af8] ActionController::RoutingError (No route matches [GET] "/haproxy"): web-1 | 2026-11-01T23:51:16.397771086Z [5b4cad9c-0741-42d8-adac-f25c6dcb9af8] web-1 | 2026-11-01T23:51:16.397771878Z [c0a7f3ad-22e3-4363-bdec-8bbbf5c5b362] web-1 | 2026-11-01T23:51:16.397772628Z [c0a7f3ad-22e3-4363-bdec-8bbbf5c5b362] ActionController::RoutingError (No route matches [GET] "/wp-content/plugins/profile-builder/assets/misc/fallback-page.php"): web-1 | 2026-11-01T23:51:16.397773586Z [c0a7f3ad-22e3-4363-bdec-8bbbf5c5b362] web-1 | 2026-11-01T23:51:16.397774336Z [3b9726e0-c04d-4135-9387-f391e42bc27a] web-1 | 2026-11-01T23:51:16.397775044Z [3b9726e0-c04d-4135-9387-f391e42bc27a] ActionController::RoutingError (No route matches [GET] "/k8s/api/v1/namespaces/kube-system/secrets/kubernetes-dashboard-certs"): web-1 | 2026-11-01T23:51:16.397775961Z [3b9726e0-c04d-4135-9387-f391e42bc27a] web-1 | 2026-11-01T23:51:16.397776669Z [1cac6a7c-00a5-402a-806a-1ad5a17eb792] web-1 | 2026-11-01T23:51:16.397777461Z [1cac6a7c-00a5-402a-806a-1ad5a17eb792] ActionController::RoutingError (No route matches [GET] "/json/reply/RequestLogs"): web-1 | 2026-11-01T23:51:16.397778336Z [1cac6a7c-00a5-402a-806a-1ad5a17eb792] web-1 | 2026-11-01T23:51:16.397779086Z [1a6d8a66-6a49-42be-951e-b4b87f486c92] Redirected to http://localhost:3000/dashboard web-1 | 2026-11-01T23:51:16.397779878Z [1a6d8a66-6a49-42be-951e-b4b87f486c92] Completed 302 Found in 0ms web-1 | 2026-11-01T23:51:16.397899211Z [dd6bf65a-1515-494c-81aa-b727d53129bd] Redirected to http://localhost:3000/dashboard web-1 | 2026-11-01T23:51:16.398152586Z [dd6bf65a-1515-494c-81aa-b727d53129bd] Completed 302 Found in 0ms web-1 | 2026-11-01T23:51:16.398462294Z [cd8eec7d-86cb-403b-a1b9-e82d116ecb08] web-1 | 2026-11-01T23:51:16.398464628Z [cd8eec7d-86cb-403b-a1b9-e82d116ecb08] ActionController::RoutingError (No route matches [GET] "/wp-content/plugins/wp-custom-pages/wp-download.php"): web-1 | 2026-11-01T23:51:16.398465753Z [cd8eec7d-86cb-403b-a1b9-e82d116ecb08] web-1 | 2026-11-01T23:51:16.398897794Z [73cb1676-af9e-4dd2-a262-df8deb49fbd8] web-1 | 2026-11-01T23:51:16.398900044Z [73cb1676-af9e-4dd2-a262-df8deb49fbd8] ActionController::RoutingError (No route matches [GET] "/api/v1/artifact/getArtifact"): web-1 | 2026-11-01T23:51:16.398901044Z [73cb1676-af9e-4dd2-a262-df8deb49fbd8] web-1 | 2026-11-01T23:51:16.399243669Z [8f1f8da8-e916-4faf-b7fc-0ac1e5bb3c18] Redirected to http://localhost:3000/dashboard web-1 | 2026-11-01T23:51:16.400076336Z [8f1f8da8-e916-4faf-b7fc-0ac1e5bb3c18] Completed 302 Found in 0ms web-1 | 2026-11-01T23:51:16.400078711Z [ed4194b5-dee2-45ce-bb70-6d155b197dfa] web-1 | 2026-11-01T23:51:16.400079544Z [ed4194b5-dee2-45ce-bb70-6d155b197dfa] ActionController::RoutingError (No route matches [GET] "/inc/supportLoad.asp"): web-1 | 2026-11-01T23:51:16.400080503Z [ed4194b5-dee2-45ce-bb70-6d155b197dfa] web-1 | 2026-11-01T23:51:16.400081669Z [16d15d2b-d7f2-4ac5-be04-bc21582cdf8f] web-1 | 2026-11-01T23:51:16.400087211Z [16d15d2b-d7f2-4ac5-be04-bc21582cdf8f] ActionController::RoutingError (No route matches [GET] "/wp-content/plugins/wp-custom-pages/wp-download.php"): web-1 | 2026-11-01T23:51:16.400088169Z [16d15d2b-d7f2-4ac5-be04-bc21582cdf8f] web-1 | 2026-11-01T23:51:16.400289878Z [15317865-5384-45cf-92c9-348a31dc0223] web-1 | 2026-11-01T23:51:16.400291961Z [15317865-5384-45cf-92c9-348a31dc0223] ActionController::RoutingError (No route matches [GET] "/include/cacti.log"): web-1 | 2026-11-01T23:51:16.400292919Z [15317865-5384-45cf-92c9-348a31dc0223] web-1 | 2026-11-01T23:51:16.401597669Z [e605f9d5-faee-487d-8eea-cd19f618f7d8] web-1 | 2026-11-01T23:51:16.401600294Z [e605f9d5-faee-487d-8eea-cd19f618f7d8] ActionController::RoutingError (No route matches [GET] "/include/cacti.log"): web-1 | 2026-11-01T23:51:16.401601211Z [e605f9d5-faee-487d-8eea-cd19f618f7d8] web-1 | 2026-11-01T23:51:16.402326753Z [2d862448-db77-405d-b154-8b7e4b502ce3] web-1 | 2026-11-01T23:51:16.402331003Z [2d862448-db77-405d-b154-8b7e4b502ce3] ActionController::RoutingError (No route matches [GET] "/update/../admin/diagnostic.jsp"): web-1 | 2026-11-01T23:51:16.402332003Z [2d862448-db77-405d-b154-8b7e4b502ce3] web-1 | 2026-11-01T23:51:16.402621211Z [187b80b0-f08e-461a-b0fe-15ce3a9fa758] web-1 | 2026-11-01T23:51:16.402623586Z [187b80b0-f08e-461a-b0fe-15ce3a9fa758] ActionController::RoutingError (No route matches [GET] "/update/../admin/diagnostic.jsp"): web-1 | 2026-11-01T23:51:16.402624753Z [187b80b0-f08e-461a-b0fe-15ce3a9fa758] web-1 | 2026-11-01T23:51:16.402849878Z [780c8bad-9a09-4481-8397-4d54596aebdd] web-1 | 2026-11-01T23:51:16.402852753Z [780c8bad-9a09-4481-8397-4d54596aebdd] ActionController::RoutingError (No route matches [GET] "/wp-content/plugins/profile-builder/assets/misc/fallback-page.php"): web-1 | 2026-11-01T23:51:16.402853836Z [780c8bad-9a09-4481-8397-4d54596aebdd] web-1 | 2026-11-01T23:51:16.403690044Z [25f56b51-0813-442d-8406-12624934e34e] web-1 | 2026-11-01T23:51:16.403693044Z [25f56b51-0813-442d-8406-12624934e34e] ActionController::RoutingError (No route matches [GET] "/vsaPres/Web20/core/LocalProxy.ashx"): web-1 | 2026-11-01T23:51:16.403694086Z [25f56b51-0813-442d-8406-12624934e34e] web-1 | 2026-11-01T23:51:16.404297128Z [0b0938ea-adf8-46c6-8dcb-a2e7b8afed79] web-1 | 2026-11-01T23:51:16.404299628Z [0b0938ea-adf8-46c6-8dcb-a2e7b8afed79] ActionController::RoutingError (No route matches [GET] "/vsaPres/Web20/core/LocalProxy.ashx"): web-1 | 2026-11-01T23:51:16.404300669Z [0b0938ea-adf8-46c6-8dcb-a2e7b8afed79] web-1 | 2026-11-01T23:51:16.404448836Z [41c1a78b-5f7d-4917-aefe-c8e32bde0868] GET /dashboard 200 0ms web-1 | 2026-11-01T23:51:16.404580711Z [32ea919c-f835-470d-9fcc-0de84119a276] GET /dashboard 200 0ms