Skip to main content

Docker Compose

The canonical way to run sE2EEnd is with Docker Compose. The repository ships a docker-compose.yml that starts all four services.

Services​

ServiceImageDefault port
postgrespostgres:18.35432
keycloakquay.io/keycloak/keycloak:26.58090 → 8080
backendghcr.io/se2eend/se2eend-backend:latest8081
frontendghcr.io/se2eend/se2eend-frontend:latest80

Startup order​

postgres (healthy)
└─▶ keycloak (started) ─┐
└─▶ backend (started) ─┤
└─▶ frontend

PostgreSQL exposes a healthcheck (pg_isready) that Keycloak and the backend wait for before starting.

Volumes​

VolumePurpose
se2eend_dataPostgreSQL data
se2eend_uploadsUploaded ciphertext files (local storage only)

Quick start​

See Installation for how to fetch the deployment files and start the stack.

Production checklist​

1. Strong secrets​

POSTGRES_PASSWORD='<random 32+ chars>'
KEYCLOAK_ADMIN_PASSWORD='<random 32+ chars>'

2. Correct public URLs​

KEYCLOAK_EXTERNAL_URL=https://auth.your-domain.com
FRONTEND_URL=https://your-domain.com

KEYCLOAK_EXTERNAL_URL must be the URL as browsers see it — it is embedded in JWT tokens as the issuer and validated by the backend.

3. Reverse proxy in front​

Expose only port 80 (or 443) publicly. See Reverse Proxy for nginx and Traefik examples.

4. Pin image versions​

Replace :latest tags with specific versions for reproducible deployments:

backend:
image: ghcr.io/se2eend/se2eend-backend:1.2.3
frontend:
image: ghcr.io/se2eend/se2eend-frontend:1.2.3

5. Persist uploads volume (local storage)​

The se2eend_uploads volume contains all encrypted files. Back it up regularly, or switch to S3 storage for managed durability.

Updating​

docker compose pull
docker compose up -d

Useful commands​

# View logs
docker compose logs -f backend

# Restart a single service
docker compose restart frontend

# Stop everything (volumes preserved)
docker compose down

# Stop and delete volumes (⚠ destructive)
docker compose down -v