Aller au contenu

Déploiement Production

Guide de déploiement en production pour JARVIS.

Prérequis

  • Serveur Linux (Ubuntu 22.04+ recommandé)
  • Docker 24+ et Docker Compose v2
  • Domaine avec DNS configuré
  • Certificats SSL (Let's Encrypt via Traefik)

Architecture Production

graph TB
    subgraph "Internet"
        U[Utilisateurs]
    end

    subgraph "Reverse Proxy"
        T[Traefik]
        T --> |HTTPS| API
    end

    subgraph "Application"
        API[FastAPI x3]
        W[Workers Celery]
    end

    subgraph "Data"
        PG[(PostgreSQL)]
        R[(Redis)]
        M[(MinIO)]
    end

    U --> T
    API --> PG
    API --> R
    API --> M
    W --> PG
    W --> R

Variables d'Environnement

# .env.production
ENVIRONMENT=production
DEBUG=false

# Sécurité
SECRET_KEY=<générer-avec-openssl-rand-hex-32>
JWT_SECRET_KEY=<générer-avec-openssl-rand-hex-32>
ALLOWED_ORIGINS=https://jarvis.example.com

# Base de données
DATABASE_URL=postgresql+asyncpg://jarvis:PASSWORD@postgres:5432/jarvis_prod
REDIS_URL=redis://:PASSWORD@redis:6379/0

# Stockage
MINIO_ENDPOINT=minio:9000
MINIO_ACCESS_KEY=<access-key>
MINIO_SECRET_KEY=<secret-key>

# LLM
ANTHROPIC_API_KEY=sk-ant-...
OPENAI_API_KEY=sk-...
OLLAMA_HOST=http://ollama:11434

Déploiement avec Docker Compose

# docker-compose.prod.yml
version: "3.8"

services:
  api:
    image: jarvis-backend:latest
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: "2"
          memory: 4G
    environment:
      - ENVIRONMENT=production
    env_file:
      - .env.production
    networks:
      - traefik-public
      - internal
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.jarvis.rule=Host(`api.jarvis.example.com`)"
      - "traefik.http.routers.jarvis.tls.certresolver=letsencrypt"

  postgres:
    image: pgvector/pgvector:pg16
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: jarvis_prod
      POSTGRES_USER: jarvis
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    networks:
      - internal

  redis:
    image: redis:7-alpine
    command: redis-server --requirepass ${REDIS_PASSWORD}
    volumes:
      - redis_data:/data
    networks:
      - internal

  minio:
    image: minio/minio:latest
    command: server /data --console-address ":9001"
    volumes:
      - minio_data:/data
    networks:
      - internal

networks:
  traefik-public:
    external: true
  internal:
    driver: overlay

volumes:
  postgres_data:
  redis_data:
  minio_data:

Commandes de Déploiement

# 1. Cloner le repository
git clone https://gitlab.example.com/jarvis/backend.git
cd backend

# 2. Configurer l'environnement
cp .env.example .env.production
nano .env.production

# 3. Build de l'image
docker build -t jarvis-backend:latest -f Dockerfile.prod .

# 4. Déployer
docker compose -f docker-compose.prod.yml up -d

# 5. Migrations
docker compose exec api alembic upgrade head

# 6. Créer l'admin
docker compose exec api python -m app.scripts.create_admin

Health Checks

# Vérifier l'API
curl https://api.jarvis.example.com/health

# Réponse attendue
{
  "status": "healthy",
  "database": "connected",
  "redis": "connected",
  "minio": "connected"
}

Voir Aussi