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"
}