Docker Deployment

Production Docker deployment guide for InferXgate.

This guide covers deploying InferXgate with Docker for production environments.

Quick Start

git clone https://github.com/jasmedia/inferxgate.git
cd inferxgate
cp .env.example .env
# Edit .env with your configuration
docker-compose up -d

Production Docker Compose

version: '3.8'

services:
  inferxgate:
    image: ghcr.io/jasmedia/inferxgate:latest
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgresql://postgres:${DB_PASSWORD}@db:5432/inferxgate
      - REDIS_URL=redis://redis:6379
      - JWT_SECRET=${JWT_SECRET}
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - REQUIRE_AUTH=true
      - LOG_LEVEL=info
      - LOG_JSON=true
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  dashboard:
    image: ghcr.io/jasmedia/inferxgate-dashboard:latest
    ports:
      - "80:80"
    environment:
      - API_URL=http://inferxgate:3000
    depends_on:
      - inferxgate
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=${DB_PASSWORD}
      - POSTGRES_DB=inferxgate
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    command: redis-server --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped

volumes:
  postgres_data:
  redis_data:

Environment File

Create .env:

# Database
DB_PASSWORD=your-secure-db-password

# Authentication
JWT_SECRET=your-32-char-minimum-secret-key

# Provider API Keys
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...
GEMINI_API_KEY=...

SSL/TLS with Traefik

services:
  traefik:
    image: traefik:v2.10
    command:
      - "--api.dashboard=true"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "[email protected]"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - letsencrypt:/letsencrypt

  inferxgate:
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.inferxgate.rule=Host(`api.yourdomain.com`)"
      - "traefik.http.routers.inferxgate.tls.certresolver=letsencrypt"

Scaling

Run multiple instances:

docker-compose up -d --scale inferxgate=3

Monitoring

Add Prometheus and Grafana:

services:
  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"

  grafana:
    image: grafana/grafana
    ports:
      - "3001:3000"
    volumes:
      - grafana_data:/var/lib/grafana

Backup

Backup PostgreSQL:

docker-compose exec db pg_dump -U postgres inferxgate > backup.sql

Restore:

cat backup.sql | docker-compose exec -T db psql -U postgres inferxgate

Updates

docker-compose pull
docker-compose up -d