root 5d8ad901d1 Initial commit: Pipeline notarial complet
- 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
2025-09-08 22:05:22 +02:00

137 lines
4.2 KiB
Python

"""
Utilitaires de stockage avec MinIO
"""
import os
import uuid
from minio import Minio
from minio.error import S3Error
import logging
logger = logging.getLogger(__name__)
# Configuration MinIO
MINIO_ENDPOINT = os.getenv("MINIO_ENDPOINT", "localhost:9000")
MINIO_ACCESS_KEY = os.getenv("MINIO_ROOT_USER", "minio")
MINIO_SECRET_KEY = os.getenv("MINIO_ROOT_PASSWORD", "minio_pwd")
MINIO_BUCKET = os.getenv("MINIO_BUCKET", "ingest")
MINIO_SECURE = False # True en production avec HTTPS
# Client MinIO
minio_client = Minio(
MINIO_ENDPOINT,
access_key=MINIO_ACCESS_KEY,
secret_key=MINIO_SECRET_KEY,
secure=MINIO_SECURE
)
async def store_document(doc_id: str, content: bytes, filename: str) -> str:
"""
Stockage d'un document dans MinIO
"""
try:
# Génération du nom de fichier unique
file_extension = os.path.splitext(filename)[1] if filename else ""
object_name = f"{doc_id}/original{file_extension}"
# Création du bucket s'il n'existe pas
if not minio_client.bucket_exists(MINIO_BUCKET):
minio_client.make_bucket(MINIO_BUCKET)
logger.info(f"Bucket {MINIO_BUCKET} créé")
# Upload du fichier
from io import BytesIO
minio_client.put_object(
MINIO_BUCKET,
object_name,
BytesIO(content),
length=len(content),
content_type="application/octet-stream"
)
logger.info(f"Document {doc_id} stocké dans MinIO: {object_name}")
return object_name
except S3Error as e:
logger.error(f"Erreur MinIO lors du stockage du document {doc_id}: {e}")
raise
except Exception as e:
logger.error(f"Erreur lors du stockage du document {doc_id}: {e}")
raise
def get_document(doc_id: str, object_name: str) -> bytes:
"""
Récupération d'un document depuis MinIO
"""
try:
response = minio_client.get_object(MINIO_BUCKET, object_name)
return response.read()
except S3Error as e:
logger.error(f"Erreur MinIO lors de la récupération du document {doc_id}: {e}")
raise
except Exception as e:
logger.error(f"Erreur lors de la récupération du document {doc_id}: {e}")
raise
def store_artifact(doc_id: str, artifact_name: str, content: bytes, content_type: str = "application/octet-stream") -> str:
"""
Stockage d'un artefact de traitement
"""
try:
object_name = f"{doc_id}/artifacts/{artifact_name}"
from io import BytesIO
minio_client.put_object(
MINIO_BUCKET,
object_name,
BytesIO(content),
length=len(content),
content_type=content_type
)
logger.info(f"Artefact {artifact_name} stocké pour le document {doc_id}")
return object_name
except S3Error as e:
logger.error(f"Erreur MinIO lors du stockage de l'artefact {artifact_name}: {e}")
raise
except Exception as e:
logger.error(f"Erreur lors du stockage de l'artefact {artifact_name}: {e}")
raise
def list_document_artifacts(doc_id: str) -> list:
"""
Liste des artefacts d'un document
"""
try:
prefix = f"{doc_id}/artifacts/"
objects = minio_client.list_objects(MINIO_BUCKET, prefix=prefix, recursive=True)
return [obj.object_name for obj in objects]
except S3Error as e:
logger.error(f"Erreur MinIO lors de la liste des artefacts pour {doc_id}: {e}")
return []
except Exception as e:
logger.error(f"Erreur lors de la liste des artefacts pour {doc_id}: {e}")
return []
def delete_document_artifacts(doc_id: str):
"""
Suppression de tous les artefacts d'un document
"""
try:
prefix = f"{doc_id}/"
objects = minio_client.list_objects(MINIO_BUCKET, prefix=prefix, recursive=True)
for obj in objects:
minio_client.remove_object(MINIO_BUCKET, obj.object_name)
logger.info(f"Artefacts supprimés pour le document {doc_id}")
except S3Error as e:
logger.error(f"Erreur MinIO lors de la suppression des artefacts pour {doc_id}: {e}")
raise
except Exception as e:
logger.error(f"Erreur lors de la suppression des artefacts pour {doc_id}: {e}")
raise