- Prefixed internal helper methods with "_" to comply with naming conventions. - Enhanced docstrings for improved readability and developer guidance. - Organized the `AbstractVendor` class API into distinct categories (abstract, public, and protected methods). This refactor improves maintainability and code clarity while preserving functionality. |
||
|---|---|---|
| .idea | ||
| Dockerfiles | ||
| engine | ||
| monitoring | ||
| schon | ||
| scripts | ||
| storefront | ||
| systemd | ||
| .dockerignore | ||
| .gitattributes | ||
| .gitignore | ||
| CHANGELOG.md | ||
| CODEOWNERS | ||
| docker-compose.yml | ||
| LICENSE | ||
| Makefile | ||
| manage.py | ||
| nginx.example.conf | ||
| pyproject.toml | ||
| README.md | ||
| uv.lock | ||
Schon
Schon is a production-ready e-commerce backend. Storefront, product catalog, cart, orders, and payments work out of the box. Minimal complexity, maximum flexibility.
What is Schon?
Schon is a complete backend solution for online stores. Whether you're launching a small shop or scaling a marketplace, Schon provides the foundation:
- Ready to use - Clone, configure, deploy. No assembly required.
- API-first - REST and GraphQL endpoints for any frontend framework.
- Multilingual - 28 languages supported out of the box.
- Extensible - Modular Django apps, easy to customize.
Features
| Category | Details |
|---|---|
| Framework | Django 5.2, Django REST Framework 3.16, Graphene-Django |
| Database | PostgreSQL with PostGIS, Redis caching, Elasticsearch search |
| Tasks | Celery workers with Redis broker, scheduled tasks with Beat |
| Auth | JWT authentication, rate limiting, custom user model (email-based) |
| APIs | REST + GraphQL, Swagger/ReDoc documentation |
| i18n | 28 languages, model translation support |
| Deployment | Docker Compose or native Linux with systemd |
Quick Start
Prerequisites
- Git
- Docker and Docker Compose or Linux with Python 3.12+, PostgreSQL, Redis, Elasticsearch
Docker (Recommended for Development)
# Clone the repository
git clone https://git.wiseless.xyz/fureunoir/schon
cd schon
# Generate environment file
make generate-env
# Review and adjust .env as needed
nano .env
# Install (pull and build images)
make install
# Start all services
make run
Native Linux (Production)
# Clone to /opt/schon
sudo git clone https://git.wiseless.xyz/fureunoir/schon /opt/schon
cd /opt/schon
# Generate environment file
make generate-env
# Review and adjust .env
sudo nano .env
# Install (creates schon user, syncs dependencies, configures systemd)
sudo make install
# Select option 2: Native Linux
# Start services
sudo systemctl start schon-web schon-worker schon-beat schon-stock-updater
Storefronts
The main branch ships backend-only. For a complete store with frontend:
git checkout storefront-<nuxt|next|sk|qwik>
Configuration
Environment Variables
After running make generate-env, review .env:
| Variable | Description |
|---|---|
DEBUG |
Set to 0 for production |
SECRET_KEY |
Django secret key (auto-generated) |
JWT_SIGNING_KEY |
JWT token signing key (auto-generated) |
POSTGRES_* |
Database credentials |
REDIS_PASSWORD |
Redis authentication |
SCHON_PROJECT_NAME |
Your store name |
SCHON_BASE_DOMAIN |
Your domain (e.g., example.com) |
Nginx
-
Copy the example config:
sudo cp nginx.example.conf /etc/nginx/sites-available/schon -
Update domain names and paths in the config
-
Enable the site:
sudo ln -s /etc/nginx/sites-available/schon /etc/nginx/sites-enabled/ -
Obtain SSL certificates:
sudo certbot --nginx -d api.yourdomain.com -d yourdomain.com -d www.yourdomain.com -
Reload Nginx:
sudo systemctl reload nginx
DNS Records
Configure these DNS records pointing to your server:
yourdomain.com(A record)www.yourdomain.com(A or CNAME)api.yourdomain.com(A or CNAME)prometheus.yourdomain.com(A or CNAME, optional)
API Documentation
Once running, access the API documentation:
| Endpoint | Description |
|---|---|
http://api.localhost:8000/ |
API root / Admin redirect |
http://api.localhost:8000/docs/swagger/ |
Swagger UI |
http://api.localhost:8000/docs/redoc/ |
ReDoc |
http://api.localhost:8000/graphql/ |
GraphQL Playground |
http://api.localhost:8000/admin/ |
Django Admin |
http://api.localhost:8000/health/ |
Health check endpoint |
Authentication header: X-SCHON-AUTH: Bearer <token>
Development
Commands
make run # Start services
make restart # Restart services
make test # Run tests with coverage
make format # Format code with Ruff
make check # Lint code with Ruff
make typecheck # Type check with ty
make precommit # Run format, check, typecheck
make make-messages # Extract translation strings
make compile-messages # Compile translations
make backup # Create database backup
Running Migrations
# Docker
docker compose exec app uv run python manage.py migrate
# Native
cd /opt/schon && .venv/bin/python manage.py migrate
Creating a Superuser
# Docker
docker compose exec app uv run python manage.py createsuperuser
# Native
cd /opt/schon && .venv/bin/python manage.py createsuperuser
Project Structure
schon/
├── schon/ # Django project settings
│ ├── settings/ # Split settings (base, drf, celery, etc.)
│ ├── middleware.py # Custom middleware
│ └── urls.py # URL routing
├── engine/ # Django apps
│ ├── core/ # Products, orders, categories, vendors
│ ├── payments/ # Transactions, payment gateways
│ ├── vibes_auth/ # Custom User model, JWT auth
│ └── blog/ # Blog posts
├── Dockerfiles/ # Docker configurations
├── systemd/ # Systemd service files
├── scripts/ # Installation and utility scripts
└── nginx.example.conf # Nginx configuration template
Feedback & Issues
We value your feedback. Please open issues for:
- Bug reports
- Feature suggestions
- Questions about usage
Issue Tracker: Plane
Due to licensing restrictions, we cannot accept pull requests. See the LICENSE file for details.
License
Schon is released under a custom license. Key points:
- Non-commercial use: Free for personal, academic, and non-commercial purposes
- Commercial use: Requires written authorization or automatic 8% royalty
See the LICENSE file for complete terms.
Contact
Author: Egor "fureunoir" Gorbunov
- Email: contact@fureunoir.com
- Telegram: @fureunoir
Built with care by the Wiseless Team