Deployment
Deployment is fully automated with Ansible and is idempotent — you can re-run it safely at any time.
Docker services
| Service | Port | Description |
|---|---|---|
ses-server | 9000 | Django (Gunicorn) |
proxy | 9010 | Nginx reverse proxy (token validation) |
postgres | 5432 | PostgreSQL 16 (SES data) |
keycloak-postgres | 5432 | PostgreSQL 16 (Keycloak) |
keycloak | 8080 | Keycloak OIDC provider |
odyssey | 6432 | PostgreSQL connection pooler |
redis | 6379 | Redis 7 (cache/sessions) |
Deploying
# On the deployment host
ansible-playbook -i inventory.ini playbook.yml
The playbook:
- Installs Docker, Nginx and TLS certificates
- Creates the
sesservice user - Clones the
sesrepository to/opt/ses - Builds and starts all Docker containers
- Runs Django migrations and setup
- Seeds the Keycloak IdentityProvider
- Publishes the docs site to
/var/www/docs
Source availability
The Ansible deployment playbook and the SES source code are published on GitHub. The public project/repository page is on its way; the official URL will be announced at a later date.
Pre-release access
Institutes that would like to evaluate a pre-release version can contact us and we will arrange access.
Tenant management
# List all tenants
python manage.py list_tenants
# Add a tenant (creates schema, route, institute, IdP)
python manage.py add_tenant <slug> "<Name>"
# Delete a tenant (drops schema, removes route)
python manage.py delete_tenant <slug>
No rebuild needed
A new tenant is immediately available at
https://your-domain/<slug>/admin/ — no rebuild or restart required.