Skip to content

Deployment

This section covers how to deploy your Esmerald application in a production-ready environment.

Esmerald apps are ASGI applications, which means they can be served using any ASGI-compatible server like uvicorn, hypercorn, or daphne.


Using Uvicorn

One way to run Esmerald in production is with uvicorn, an ASGI server:

Install:

pip install uvicorn

Run your app:

uvicorn myapp:app --host 0.0.0.0 --port 8000 --workers 4 --lifespan on

Options: - --workers: Number of worker processes. - --lifespan on: Ensures startup and shutdown events are handled. - --reload: (Only for development) enables auto-reload on file changes.


Using Gunicorn + Uvicorn Workers

For more robust setups (especially when using Docker), run Uvicorn inside Gunicorn:

pip install gunicorn uvicorn
gunicorn myapp:app \
  -k uvicorn.workers.UvicornWorker \
  -b 0.0.0.0:8000 \
  --workers 4

This setup provides better process management, logging, and signal handling in production environments.


Docker Deployment

Here's a simple Dockerfile for Esmerald:

FROM python:3.13-slim

WORKDIR /app
COPY . .

RUN pip install -r requirements.txt

CMD ["uvicorn", "myapp:app", "--host", "0.0.0.0", "--port", "8000"]

Then build and run:

docker build -t my-esmerald-app .
docker run -p 8000:8000 my-esmerald-app

Behind a Reverse Proxy (e.g. Nginx)

In production, it’s common to put Esmerald behind a reverse proxy like Nginx:

Example Nginx config:

server {
    listen 80;
    server_name myapp.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Use SSL termination with Certbot + Let's Encrypt for HTTPS.


Environment Variables

Use environment variables and .env files to manage secrets, database connections, etc. Esmerald supports loading .env via Pydantic or your custom configuration setup.


Deployment Checklist

  • [x] Run behind a secure reverse proxy (e.g., Nginx)
  • [x] Use process managers (e.g., Gunicorn, systemd, Docker)
  • [x] Set debug=False in production
  • [x] Handle startup/shutdown events properly
  • [x] Monitor logs and health checks
  • [x] Secure secrets via environment variables

What's Next?

Your app is ready for the real world. Next step?

👉 Continue to scaling to explore strategies for performance, load balancing, and horizontal scaling.