Analytics cookies only (Google Analytics, PostHog). No ad networks, no cross-site tracking. See our privacy policy.
Sa
Self-host Saleor
updated Oct 2026deployed by usprices checked · Jul 2026Install verified on Ubuntu 26.04 · Oct 2026 · how we test
We earn commissions when you shop through the links below. Full disclosure →
A headless, GraphQL-first commerce platform: products and variants, multi-channel and multi-currency selling, checkout, orders, warehouses and promotions, run from a React admin Dashboard. The stack is a Python and Django API, Celery workers, PostgreSQL and a Redis-compatible cache; it ships the API and Dashboard, not a customer-facing storefront, so you build or adopt one against the GraphQL API. The API and the Dashboard are both BSD-3-Clause.
Runs on a VPS from $23/mo (Kamatera 8GB, 8 GB RAM) · prices checked Sep 2026
Our recommendation
Pick Saleor when you want a headless, API-first store you build your own storefront against: products and variants, channels with their own currencies and pricing, checkout, orders, warehouses and promotions behind a GraphQL API, with a React Dashboard for the people running the shop. It is a Python and Django service with Celery workers on PostgreSQL and a Redis-compatible cache, and the code is BSD-3-Clause. It is not a one-click shop: there is no customer-facing storefront in the stack, so someone has to build or adopt one. If your team writes TypeScript and wants a Node.js framework with modules you extend in code, Medusa is the catalog's other headless option.
What you need
Any VPS with at least 4096 MB of RAM
A domain you control — most self-hosted setups need HTTPS in front of them
Paid link — we earn a commission if you shop through it.
Install
Run these commands on your server:
# Saleor — official Docker setup from the saleor-platform repo (the one docs.saleor.io points to), pinned to commit ab6315b with the API and Dashboard images pinned to 3.23.41 and 3.23.39. saleor-platform's README says it is for local development, not production: the override below closes the published database and tool ports, and you still need HTTPS and your own secrets. Replace SERVER_IP with your server's address.git clone https://github.com/saleor/saleor-platform.git && git -C saleor-platform checkout ab6315bd59c58b4815175df4c679107ff9695be4cd saleor-platformsed -i -e 's|ghcr.io/saleor/saleor:3.23|ghcr.io/saleor/saleor:3.23.41|' -e 's|saleor-dashboard:3.23|saleor-dashboard:3.23.39|' docker-compose.ymlsed -i "s|SECRET_KEY=changeme|SECRET_KEY=$(openssl rand -hex 32)|" backend.env# serve the API and Dashboard on the server's address, and publish only ports 8000 and 9000 (the stock file also publishes Postgres, Valkey, Jaeger and Mailpit)cat > docker-compose.override.yml << 'EOF'services: api: environment: - DASHBOARD_URL=http://SERVER_IP:9000/ - ALLOWED_HOSTS=localhost,127.0.0.1,api,SERVER_IP dashboard: environment: - API_URL=http://SERVER_IP:8000/graphql/ db: ports: !reset [] cache: ports: !reset [] jaeger: ports: !reset [] mailpit: ports: !reset []EOFdocker compose run --rm api python3 manage.py migratedocker compose run --rm -e DJANGO_SUPERUSER_PASSWORD='choose-a-password' api python3 manage.py createsuperuser --email admin@example.com --noinputdocker compose up -d# sign in to the Dashboard at http://SERVER_IP:9000 (the GraphQL API is at http://SERVER_IP:8000/graphql/)
Saleor's own repositories are clear about where the Docker setup stops being a production deployment:
non-negotiableThe Docker setup that docs.saleor.io points to is the saleor-platform repository, and its README says it is for local development and is not meant to be deployed in any production environment. It publishes Postgres, Valkey, Jaeger and Mailpit ports, ships a SECRET_KEY=changeme, a database password of saleor and HTTP_IP_FILTER_ALLOW_LOOPBACK_IPS=True; the snippet closes the published ports and generates a key, and you still own HTTPS, secrets and backups.
non-negotiableThe compose file tracks the 3.23 image tag and the Dashboard defaults to http://localhost:8000 for the API. For a real server we pinned patch releases and set API_URL on the Dashboard and ALLOWED_HOSTS and DASHBOARD_URL on the API; upstream's Docker page says Dashboard minor versions match the same Core minor version, so upgrade them together.
non-negotiablePlan for memory. The README asks Docker Desktop users for at least 5 GB; we measured the seven-container stack well under that when idle on an empty catalog, but a populated store with workers and a search load will use more.
non-negotiableSaleor sends anonymous usage telemetry by default (version, counts of products, channels and apps, configured currencies); set SEND_USAGE_TELEMETRY=false to turn it off.