Розробка інтернет-магазина на Saleor
Saleor — Python/Django e-commerce платформа з GraphQL API як єдиним інтерфейсом. Стек: Django 4.x + Graphene-Django, PostgreSQL, Celery + Redis. Архітектурно headless за замовчуванням: бекенд предоставляє GraphQL API, фронтенд будується окремо.
Архітектура
┌──────────────────────┐
│ Saleor Core (Django) │
├──────┬───────────────┤
│GraphQL API │ Webhooks│
├──────┴───────────────┤
│ Channel System │
├──────┬────────┬──────┤
│Products│Checkout│Orders│
├──────┴────────┴──────┤
│PostgreSQL│Redis│Celery│
└──────────────────────┘
Ключева концепція: Channel — кожен канал має власну валюту, країни, ціноутворення. Один товар доступний у кількох каналах з різними цінами.
Встановлення
git clone https://github.com/saleor/saleor.git
cd saleor
docker compose up -d
# Або ручна встановлення
python -m venv venv
pip install -r requirements.txt
# .env файл
SECRET_KEY=your-key
DATABASE_URL=postgresql://saleor:pass@localhost/saleor
CELERY_BROKER_URL=redis://localhost:6379/0
# Міграції
python manage.py migrate
python manage.py createsuperuser
GraphQL API
Вся комунікація фронтенда через GraphQL. Endpoint: /graphql/.
query ProductList($channel: String!, $first: Int!) {
products(channel: $channel, first: $first) {
edges {
node {
id name slug
pricing { priceRange { start { gross { amount currency } } } }
variants {
id sku quantityAvailable(countryCode: RU)
pricing { price { gross { amount } } }
}
}
}
}
}
Канали
mutation CreateChannel {
channelCreate(input: {
name: "Russia"
slug: "ru"
currencyCode: "RUB"
defaultCountry: RU
countries: [RU, BY, KZ]
}) {
channel { id slug name currencyCode }
}
}
Webhooks
Ключові события: ORDER_CREATED, ORDER_PAID, ORDER_FULFILLED, PRODUCT_UPDATED, PAYMENT_GATEWAY_INITIALIZE_SESSION.
mutation CreateWebhook {
webhookCreate(input: {
name: "CRM Sync"
targetUrl: "https://crm.example.com/orders"
events: [ORDER_CREATED, ORDER_PAID]
}) {
webhook { id name }
}
}
Кастомний платіжний провайдер
from django.http import JsonResponse
import hmac, hashlib
def saleor_webhook(request):
signature = request.headers.get('Saleor-Signature', '')
secret = b'webhook-secret'
computed = hmac.new(secret, request.body, hashlib.sha256).hexdigest()
if not hmac.compare_digest(signature, computed):
return JsonResponse({'error': 'Invalid'}, status=400)
event_type = request.headers.get('Saleor-Event')
payload = json.loads(request.body)
if event_type == 'ORDER_PAID':
sync_order_to_crm.delay(payload['order']['id'])
return JsonResponse({'status': 'ok'})
Настройки продуктивності
GRAPHQL_QUERY_MAX_COMPLEXITY = 50000
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": os.environ.get("REDIS_URL"),
}
}
Терміни розробки
- Базова настройка + Dashboard + Next.js Starter: 2–3 тижні
- Повноцінний магазин 2–3 ринків, кастомні типи товарів: 5–8 тижнів
- Enterprise мультиканальний з інтеграціями: 14–20 тижнів







