ERP to small providers. The selected architecture was for a SaaS (Software As A Service) type project in this sense divide customers data into Postgres schemas.
- Django REST Framework
- PostgreSQL
- Django Tenants (Tenant schemas)
- Django Channel (Websocket)
- Celery (Workers to asynchronously tasks)
- Celery Beat (Periodic tasks to workers)
- Docker & Docker Compose
At this point, docker and docker compose must be installed.
In root create environment folder name .envs
and subdirectories .dev
, .sta
, .pro
and each one is composed
of a .django
and a .postgres
file. Set the following variables:
Files: .envs/.dev/.django - .envs/.sta/.django - .envs/.pro/.django
# Django
DJANGO_SETTINGS_MODULE: Django config file (e.i drifti.config.dev)
DJANGO_SECRET_KEY: Django secret key
# Encrypt data (common/utils/protect_data module)
ENCRYPT_KEY: Fernet secret
AES_KEY: AES encryption 128 bit key in base64 (e.i aeJRZVRsC21pcTR0N2dOeg==)
AES_IV: AES IV 128 bit key in base64 (e.i vpJRZVRsC21tcTR0N2dOeg==)
JWT_KEY: Json Web Token secret key
# Cache
REDIS_URL=redis://redis:6379/0
# Async tasks
CELERY_FLOWER_USER: Celery flower user
CELERY_FLOWER_PASSWORD: Celery flower password
CELERY_BROKER_URL: redis://redis:6379/0
CELERY_RESULT_BACKEND: redis://redis:6379/0
# Email
EMAIL_HOST_USER: drifti@email.com
EMAIL_HOST_PASSWORD: 12345678
# To reference client host to different process
CLIENT_HOST: http://localhost:5173 # e.i Required to sign up email verification
Files: .envs/.sta/.django - .envs/.pro/.django
# Static storage
AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXX
AWS_REGION_NAME=us-east-1
AWS_USER_ARN=XXXXXXXXXXXXXXXX
AWS_STORAGE_BUCKET_NAME=XXXXXXXXXXXXXXXX
Files: .envs/.sta/.django - .envs/.pro/.django
# Static storage
AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXX
AWS_REGION_NAME=us-east-1
AWS_USER_ARN=XXXXXXXXXXXXXXXX
AWS_STORAGE_BUCKET_NAME=XXXXXXXXXXXXXXXX
Files: .envs/.pro/.postgres
POSTGRES_HOST_REPLICA=replica-host.com/xxxxx
Being at the root of the project directory.
export COMPOSE_FILE=docker-compose.dev.yml
docker compose up -d
In this point you can to connect to drifti database with same environment credentials. Note: Docker compose change database port to 6433.
Host: localhost
Port: 6433
Database Name: drifti
Database User: development
Database Password: XXXXXXX
Using django-tenants to configure tenant schemas.
docker compose run --rm django python manage.py makemigrations
docker compose run --rm django python manage.py migrate_schemas --shared
docker compose run --rm django ipython
import os;os.environ.setdefault("DJANGO_SETTINGS_MODULE", "drifti.config.dev");import django;django.setup();from apps.customers.models import Client, Domain;tenant = Client(schema_name='public',name='Drifti',paid_until='2030-12-31',on_trial=False);tenant.save();domain = Domain(domain='localhost',tenant=tenant,is_primary=True);domain.save()
docker compose run --rm django python manage.py create_tenant_superuser --schema=public --username=admin --email=admin@drifti.com
Only tenant can show the course application
- Access to admin site
localhost:8000/manager
- login into with username and password of superuser
- Into
CUSTOMERS
app click onClients
- Click on
Add Client
button - Set Client :
- Schema name: demo
- Name: Demo
- Paid until: 2025-12-31
- Save
- Into
CUSTOMERS
app click onDomains
- Click on
Add Domain
button - Set Domain:
- Domain: demo.localhost
- Tenant: select demo tenant
- Save
docker compose run --rm django python manage.py create_tenant_superuser --schema=demo --username=demo --email=demo@drifti.com
Necessary to tenant user different to public schema.
- Access to admin site
demo.localhost:8000/manager
- login into with username and password of superuser
- Into
USERS
app click onProfiles
- Click on
Add Profile
button - Set Profile :
- User: demo
- Role: Administrator
- Completed: True
- Verified: True
- Terms & Policy
- Save
In browser add demo.localhost:8000/api/v1/docs/
.
Use login endpoint and copy and add access_token
value to Authorize
button to show private endpoints.
To show Django logs, run the following command:
docker compose logs django -f --tail 20 # Django Service
docker compose logs -f --tail 20 # All Services