Skip to main content

Docker deployment

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
#    ports: ["11434:11434"]
    volumes:
      - ./ollama_data:/root/.ollama
    restart: unless-stopped

    # Uncomment below to run on GPU support
    deploy:
      resources:
        reservations:
          devices:
            - driver: ${OLLAMA_GPU_DRIVER-nvidia}
              count: ${OLLAMA_GPU_COUNT-1}
              capabilities:
                - gpu
    networks:
      - ai-network
    labels:
      - "traefik.enable=false"  # Explicitly disable for Ollama


  litellm-db:
    image: postgres:16-alpine
    container_name: litellm-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: litellm
      POSTGRES_PASSWORD: ${LITELLM_DB_PASSWORD}
      POSTGRES_DB: litellm
    volumes:
      - ./litellm_pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U litellm"]
      interval: 5s
      timeout: 5s
      retries: 10
    networks:
      - ai-network

  litellm:
    image: ghcr.io/berriai/litellm:main-stable
    container_name: litellm
    depends_on:
      ollama:
        condition: service_started
      litellm-db:
        condition: service_healthy
    volumes:
      - ./litellm/config.yaml:/app/config.yaml
    command: ["--config", "/app/config.yaml", "--port", "4000"]
#    ports: ["4000:4000"]
    restart: unless-stopped
    networks:
      - ai-network
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.ollama-api.rule=Host(`litellm.ai.alexwtz.ch`)"
      - "traefik.http.routers.ollama-api.entrypoints=web"
      - "traefik.http.services.ollama-api.loadbalancer.server.port=4000"
      - "traefik.docker.network=ai-network"

    environment:
      - LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY}
      - UI_USERNAME=${UI_USERNAME}
      - UI_PASSWORD=${UI_PASSWORD}
      - DATABASE_URL=${DATABASE_URL}
      - STORE_MODEL_IN_DB="True"
      - LITELLM_SALT_KEY=${LITELLM_SALT_KEY}
    healthcheck:
      test: ["CMD-SHELL", "python3 -c \"import urllib.request; urllib.request.urlopen('http://localhost:4000/health/liveliness')\" || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 5
      start_period: 40s


networks:
  ai-network:
    driver: bridge
    external: true  # Use existing network if it exists

Environement file

LITELLM_MASTER_KEY=sk-...
UI_USERNAME="admin"
UI_PASSWORD="..."
LITELLM_DB_PASSWORD="..."
LITELLM_SALT_KEY="..."    # 32 char salt
DATABASE_URL="postgresql://litellm:${LITELLM_DB_PASSWORD}@litellm-db:5432/litellm"

Generate a random sk-...

echo "sk-$(openssl rand -hex 32)"