
- Infrastructure complète de traitement de documents notariaux - API FastAPI d'ingestion et d'orchestration - Pipelines Celery pour le traitement asynchrone - Support des formats PDF, JPEG, PNG, TIFF, HEIC - OCR avec Tesseract et correction lexicale - Classification automatique des documents avec Ollama - Extraction de données structurées - Indexation dans AnythingLLM et OpenSearch - Système de vérifications et contrôles métier - Base de données PostgreSQL pour le métier - Stockage objet avec MinIO - Base de données graphe Neo4j - Recherche plein-texte avec OpenSearch - Supervision avec Prometheus et Grafana - Scripts d'installation pour Debian - Documentation complète - Tests unitaires et de performance - Service systemd pour le déploiement - Scripts de déploiement automatisés
100 lines
3.0 KiB
Python
100 lines
3.0 KiB
Python
"""
|
|
Routes de santé et monitoring
|
|
"""
|
|
from fastapi import APIRouter, Depends
|
|
from sqlalchemy.orm import Session
|
|
from datetime import datetime
|
|
import os
|
|
import requests
|
|
import logging
|
|
|
|
from domain.database import get_db, Document
|
|
from domain.models import HealthResponse
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter()
|
|
|
|
@router.get("/health", response_model=HealthResponse)
|
|
async def health_check(db: Session = Depends(get_db)):
|
|
"""
|
|
Vérification de la santé de l'API et des services
|
|
"""
|
|
services_status = {}
|
|
|
|
# Vérification de la base de données
|
|
try:
|
|
db.query(Document).limit(1).all()
|
|
services_status["database"] = "healthy"
|
|
except Exception as e:
|
|
logger.error(f"Erreur base de données: {e}")
|
|
services_status["database"] = "unhealthy"
|
|
|
|
# Vérification de Redis
|
|
try:
|
|
from tasks.enqueue import r
|
|
r.ping()
|
|
services_status["redis"] = "healthy"
|
|
except Exception as e:
|
|
logger.error(f"Erreur Redis: {e}")
|
|
services_status["redis"] = "unhealthy"
|
|
|
|
# Vérification de MinIO
|
|
try:
|
|
minio_endpoint = os.getenv("MINIO_ENDPOINT", "http://minio:9000")
|
|
response = requests.get(f"{minio_endpoint}/minio/health/live", timeout=5)
|
|
if response.status_code == 200:
|
|
services_status["minio"] = "healthy"
|
|
else:
|
|
services_status["minio"] = "unhealthy"
|
|
except Exception as e:
|
|
logger.error(f"Erreur MinIO: {e}")
|
|
services_status["minio"] = "unhealthy"
|
|
|
|
# Vérification d'Ollama
|
|
try:
|
|
ollama_url = os.getenv("OLLAMA_BASE_URL", "http://ollama:11434")
|
|
response = requests.get(f"{ollama_url}/api/tags", timeout=5)
|
|
if response.status_code == 200:
|
|
services_status["ollama"] = "healthy"
|
|
else:
|
|
services_status["ollama"] = "unhealthy"
|
|
except Exception as e:
|
|
logger.error(f"Erreur Ollama: {e}")
|
|
services_status["ollama"] = "unhealthy"
|
|
|
|
# Vérification d'AnythingLLM
|
|
try:
|
|
anyllm_url = os.getenv("ANYLLM_BASE_URL", "http://anythingllm:3001")
|
|
response = requests.get(f"{anyllm_url}/api/health", timeout=5)
|
|
if response.status_code == 200:
|
|
services_status["anythingllm"] = "healthy"
|
|
else:
|
|
services_status["anythingllm"] = "unhealthy"
|
|
except Exception as e:
|
|
logger.error(f"Erreur AnythingLLM: {e}")
|
|
services_status["anythingllm"] = "unhealthy"
|
|
|
|
# Détermination du statut global
|
|
overall_status = "healthy" if all(status == "healthy" for status in services_status.values()) else "degraded"
|
|
|
|
return HealthResponse(
|
|
status=overall_status,
|
|
timestamp=datetime.now(),
|
|
version="1.0.0",
|
|
services=services_status
|
|
)
|
|
|
|
@router.get("/health/ready")
|
|
async def readiness_check():
|
|
"""
|
|
Vérification de disponibilité pour Kubernetes
|
|
"""
|
|
return {"status": "ready"}
|
|
|
|
@router.get("/health/live")
|
|
async def liveness_check():
|
|
"""
|
|
Vérification de vivacité pour Kubernetes
|
|
"""
|
|
return {"status": "alive"}
|