A Django + React E-shop developed with TDD.
- Backend: Django + DRF
- Frontend: React + TailwindCSS
- DB: PostgreSQL
- Cache: Redis (planned)
- Auth: JWT
- Testing: pytest, factoryboy
- Docker & Docker Compose
docker-compose up --builddocker-compose.staging.yml: staging setup (keeps current tunnel + manual Traefik routing labels).docker-compose.prod.yml: production setup for Dokploy UI managed routing (no manual Traefik labels, no webhook tunnel relay).
cp .env.prod.example .env.prod
docker compose -f docker-compose.prod.yml --env-file .env.prod up -d --buildFor Dokploy deployments, you can set variables in the Dokploy UI instead of committing .env.prod.
The production compose treats both .env and .env.prod as optional env files.
Set domains and public IP routing in Dokploy UI.
For database connectivity in Dokploy, set DB_HOST to your Dokploy Postgres service hostname (commonly postgres).
Note: Docker Compose creates a per-stack default network; backend is additionally attached to dokploy-network in production compose so it can reach separately managed Dokploy services.
This project supports a split storefront setup:
- Landing page on
https://ebringer.sk/ - Product storefront on
https://digitalabutment.ebringer.sk/products
Set these environment variables for production routing:
PRIMARY_DOMAIN=ebringer.skSHOP_DOMAIN=digitalabutment.ebringer.skVITE_LANDING_HOST=ebringer.skVITE_SHOP_HOST=digitalabutment.ebringer.skVITE_API_URL=/apiVITE_HOME_PAGE_READY=true|false
Backend security settings should include both origins:
ALLOWED_HOSTS=ebringer.sk,digitalabutment.ebringer.skCORS_ALLOWED_ORIGINS=https://ebringer.sk,https://digitalabutment.ebringer.skCSRF_TRUSTED_ORIGINS=https://ebringer.sk,https://digitalabutment.ebringer.sk
Service-layer testing patterns are documented in doc/SERVICE_TESTING_PATTERNS.md.
Run service-layer tests with coverage:
docker compose exec -T backend pytest tests/ \
--cov=orders.services \
--cov=services.email \
--cov=users.services \
--cov=products.services \
--cov-report=term-missing \
--cov-fail-under=90