Saleor Enterprise Commerce
High-performance GraphQL e-commerce platform with dashboard.
Overview
Saleor is an open-source, headless commerce platform built on Django and GraphQL that emerged as a modern alternative to traditional monolithic e-commerce solutions. Originally developed by Mirumee Software, Saleor provides a complete backend for e-commerce operations while maintaining API-first architecture that separates content management from presentation layers. The platform emphasizes developer experience with its comprehensive GraphQL API, extensive webhook system, and plugin architecture that enables custom business logic without core modifications. This enterprise stack combines Saleor's API server with its React-based dashboard, supported by PostgreSQL for complex relational data management and Redis for high-performance caching and task queuing. The architecture leverages Celery workers for background processing of orders, inventory updates, and email notifications, while the dashboard provides administrators with real-time insights into sales performance, inventory levels, and customer analytics. Organizations choose this stack when they need enterprise-grade e-commerce capabilities with the flexibility to build custom storefronts, integrate with existing systems, and scale across multiple sales channels while maintaining full control over the customer experience and business logic.
Key Features
- GraphQL API with real-time subscriptions for inventory updates and order status changes
- Multi-channel sales support with separate pricing, inventory, and tax configurations per channel
- Advanced product catalog with variant management, digital products, and gift card functionality
- Comprehensive order management with split fulfillment, refunds, and automated tax calculations
- Plugin architecture supporting payment gateways, shipping providers, and custom business logic
- Celery-powered background processing for email campaigns, inventory synchronization, and analytics
- Redis-backed session management and caching for sub-second API response times
- PostgreSQL full-text search with product filtering and faceted navigation support
Common Use Cases
- 1Multi-brand retailers requiring separate storefronts with shared inventory management
- 2B2B marketplaces with complex pricing tiers and customer-specific catalogs
- 3Digital product platforms selling software licenses, courses, and subscription services
- 4International e-commerce with multi-currency support and localized tax calculations
- 5Headless commerce implementations using React, Vue, or mobile applications as frontends
- 6Enterprise migrations from Magento or Shopify requiring API-first architecture
- 7Omnichannel retail operations integrating online stores with POS and marketplace systems
Prerequisites
- Minimum 4GB RAM for all services (PostgreSQL requires 1GB+, Saleor API needs 2GB+ for production workloads)
- Docker Engine 20.10+ and Docker Compose 2.0+ with BuildKit support enabled
- Ports 8000, 9000, and 5432 available on the host system
- Basic understanding of GraphQL queries and Django admin interface
- SSL certificates and reverse proxy configuration for production deployment
- SMTP server credentials for transactional emails and order notifications
For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms
docker-compose.yml
docker-compose.yml
1services: 2 saleor-api: 3 image: ghcr.io/saleor/saleor:latest4 ports: 5 - "8000:8000"6 environment: 7 DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}8 REDIS_URL: redis://redis:6379/09 SECRET_KEY: ${SECRET_KEY}10 ALLOWED_HOSTS: localhost,api11 DEBUG: "False"12 DEFAULT_FROM_EMAIL: noreply@example.com13 depends_on: 14 postgres: 15 condition: service_healthy16 redis: 17 condition: service_started18 networks: 19 - saleor-net20 restart: unless-stopped2122 saleor-worker: 23 image: ghcr.io/saleor/saleor:latest24 command: celery -A saleor --app=saleor.celeryconf:app worker --loglevel=info -B25 environment: 26 DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}27 REDIS_URL: redis://redis:6379/028 SECRET_KEY: ${SECRET_KEY}29 depends_on: 30 - saleor-api31 networks: 32 - saleor-net33 restart: unless-stopped3435 saleor-dashboard: 36 image: ghcr.io/saleor/saleor-dashboard:latest37 ports: 38 - "9000:80"39 environment: 40 API_URI: http://localhost:8000/graphql/41 networks: 42 - saleor-net43 restart: unless-stopped4445 postgres: 46 image: postgres:16-alpine47 environment: 48 POSTGRES_USER: ${POSTGRES_USER}49 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}50 POSTGRES_DB: ${POSTGRES_DB}51 volumes: 52 - postgres_data:/var/lib/postgresql/data53 healthcheck: 54 test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]55 interval: 10s56 timeout: 5s57 retries: 558 networks: 59 - saleor-net60 restart: unless-stopped6162 redis: 63 image: redis:7-alpine64 volumes: 65 - redis_data:/data66 networks: 67 - saleor-net68 restart: unless-stopped6970volumes: 71 postgres_data: 72 redis_data: 7374networks: 75 saleor-net: 76 driver: bridge.env Template
.env
1# Saleor Configuration2SECRET_KEY=$(openssl rand -hex 50)34# PostgreSQL5POSTGRES_USER=saleor6POSTGRES_PASSWORD=secure_postgres_password7POSTGRES_DB=saleorUsage Notes
- 1Saleor API at http://localhost:8000/graphql/
- 2Dashboard at http://localhost:9000
- 3Create superuser: docker compose exec saleor-api python manage.py createsuperuser
- 4Populate demo data: docker compose exec saleor-api python manage.py populatedb
Individual Services(5 services)
Copy individual services to mix and match with your existing compose files.
saleor-api
saleor-api:
image: ghcr.io/saleor/saleor:latest
ports:
- "8000:8000"
environment:
DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}
REDIS_URL: redis://redis:6379/0
SECRET_KEY: ${SECRET_KEY}
ALLOWED_HOSTS: localhost,api
DEBUG: "False"
DEFAULT_FROM_EMAIL: noreply@example.com
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
networks:
- saleor-net
restart: unless-stopped
saleor-worker
saleor-worker:
image: ghcr.io/saleor/saleor:latest
command: celery -A saleor --app=saleor.celeryconf:app worker --loglevel=info -B
environment:
DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}
REDIS_URL: redis://redis:6379/0
SECRET_KEY: ${SECRET_KEY}
depends_on:
- saleor-api
networks:
- saleor-net
restart: unless-stopped
saleor-dashboard
saleor-dashboard:
image: ghcr.io/saleor/saleor-dashboard:latest
ports:
- "9000:80"
environment:
API_URI: http://localhost:8000/graphql/
networks:
- saleor-net
restart: unless-stopped
postgres
postgres:
image: postgres:16-alpine
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test:
- CMD-SHELL
- pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}
interval: 10s
timeout: 5s
retries: 5
networks:
- saleor-net
restart: unless-stopped
redis
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
networks:
- saleor-net
restart: unless-stopped
Quick Start
terminal
1# 1. Create the compose file2cat > docker-compose.yml << 'EOF'3services:4 saleor-api:5 image: ghcr.io/saleor/saleor:latest6 ports:7 - "8000:8000"8 environment:9 DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}10 REDIS_URL: redis://redis:6379/011 SECRET_KEY: ${SECRET_KEY}12 ALLOWED_HOSTS: localhost,api13 DEBUG: "False"14 DEFAULT_FROM_EMAIL: noreply@example.com15 depends_on:16 postgres:17 condition: service_healthy18 redis:19 condition: service_started20 networks:21 - saleor-net22 restart: unless-stopped2324 saleor-worker:25 image: ghcr.io/saleor/saleor:latest26 command: celery -A saleor --app=saleor.celeryconf:app worker --loglevel=info -B27 environment:28 DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}29 REDIS_URL: redis://redis:6379/030 SECRET_KEY: ${SECRET_KEY}31 depends_on:32 - saleor-api33 networks:34 - saleor-net35 restart: unless-stopped3637 saleor-dashboard:38 image: ghcr.io/saleor/saleor-dashboard:latest39 ports:40 - "9000:80"41 environment:42 API_URI: http://localhost:8000/graphql/43 networks:44 - saleor-net45 restart: unless-stopped4647 postgres:48 image: postgres:16-alpine49 environment:50 POSTGRES_USER: ${POSTGRES_USER}51 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}52 POSTGRES_DB: ${POSTGRES_DB}53 volumes:54 - postgres_data:/var/lib/postgresql/data55 healthcheck:56 test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]57 interval: 10s58 timeout: 5s59 retries: 560 networks:61 - saleor-net62 restart: unless-stopped6364 redis:65 image: redis:7-alpine66 volumes:67 - redis_data:/data68 networks:69 - saleor-net70 restart: unless-stopped7172volumes:73 postgres_data:74 redis_data:7576networks:77 saleor-net:78 driver: bridge79EOF8081# 2. Create the .env file82cat > .env << 'EOF'83# Saleor Configuration84SECRET_KEY=$(openssl rand -hex 50)8586# PostgreSQL87POSTGRES_USER=saleor88POSTGRES_PASSWORD=secure_postgres_password89POSTGRES_DB=saleor90EOF9192# 3. Start the services93docker compose up -d9495# 4. View logs96docker compose logs -fOne-Liner
Run this command to download and set up the recipe in one step:
terminal
1curl -fsSL https://docker.recipes/api/recipes/saleor-commerce/run | bashTroubleshooting
- saleor-api exits with 'relation does not exist' errors: Run `docker compose exec saleor-api python manage.py migrate` to apply database migrations
- Dashboard shows 'Network Error' when connecting to API: Verify API_URI environment variable matches the accessible URL from browser, not internal Docker network
- Celery workers fail with Redis connection errors: Ensure Redis container is healthy before starting workers, add health checks or init containers
- GraphQL queries timeout or return incomplete data: Increase PostgreSQL shared_buffers and effective_cache_size in custom postgresql.conf volume mount
- Image upload failures or missing media files: Add persistent volume mount for `/app/media` directory in saleor-api service
- Webhook delivery failures to external services: Configure ALLOWED_HOSTS to include webhook recipient domains and verify firewall rules
Community Notes
Loading...
Loading notes...
Download Recipe Kit
Get all files in a ready-to-deploy package
Includes docker-compose.yml, .env template, README, and license
Components
saleor-apisaleor-dashboardpostgresqlrediscelery
Tags
#saleor#ecommerce#graphql#headless#enterprise
Category
E-Commerce & BusinessAd Space
Shortcuts: C CopyF FavoriteD Download