← Back to Tutorials

34. Deployment

Uvicorn + Gunicorn (Production)

pip install gunicorn uvicorn

# Run with gunicorn workers
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker

# With systemd service
[Unit]
Description=FastAPI Application
After=network.target

[Service]
User=www-data
WorkingDirectory=/opt/app
ExecStart=/usr/bin/gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker
Restart=always

[Install]
WantedBy=multi-user.target

Docker

# Dockerfile
FROM python:3.11-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .

EXPOSE 8000
CMD ["gunicorn", "main:app", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:8000"]

# docker-compose.yml
services:
  api:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgresql://user:pass@db/db
    depends_on:
      - db
  db:
    image: postgres:15

Cloud Hosting Options

ProviderNotes
RailwayEasy deploy, auto HTTPS, domains
RenderFree tier, auto-deploy from Git
Fly.ioEdge deployment, global regions
AWS (ECS/EKS)Docker containers, auto-scaling
Azure Container AppsServerless containers, built-in scaling
✏️ Exercise: Create a Dockerfile for your FastAPI app. Run it locally with docker-compose including a PostgreSQL service. Test that the API works inside the container.