Native CLI i18n: The TrustGraph CLI has built-in translation support that dynamically loads language strings. You can test and use different languages by simply passing the --lang flag (e.g., --lang es for Spanish, --lang ru for Russian) or by configuring your environment's LANG variable. Automated Docs Translations: This PR introduces autonomously translated Markdown documentation into several target languages, including Spanish, Swahili, Portuguese, Turkish, Hindi, Hebrew, Arabic, Simplified Chinese, and Russian.
9.6 KiB
| layout | title | parent |
|---|---|---|
| default | Especificación Técnica: Soporte para Backend de Almacenamiento Compatible con S3 | Spanish (Beta) |
Especificación Técnica: Soporte para Backend de Almacenamiento Compatible con S3
Beta Translation: This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta.
Resumen
El servicio Librarian utiliza almacenamiento de objetos compatible con S3 para el almacenamiento de blobs de documentos. Esta especificación documenta la implementación que permite el soporte para cualquier backend compatible con S3, incluyendo MinIO, Ceph RADOS Gateway (RGW), AWS S3, Cloudflare R2, DigitalOcean Spaces, y otros.
Arquitectura
Componentes de Almacenamiento
Almacenamiento de Blobs: Almacenamiento de objetos compatible con S3 a través de la biblioteca de cliente minio de Python.
Almacenamiento de Metadatos: Cassandra (almacena el mapeo de object_id y los metadatos del documento).
Componente Afectado: Solo el servicio Librarian.
Patrón de Almacenamiento: Almacenamiento híbrido con metadatos en Cassandra y contenido en almacenamiento compatible con S3.
Implementación
Biblioteca: Cliente minio de Python (soporta cualquier API compatible con S3).
Ubicación: trustgraph-flow/trustgraph/librarian/blob_store.py
Operaciones:
add() - Almacenar blob con object_id UUID.
get() - Recuperar blob por object_id.
remove() - Eliminar blob por object_id.
ensure_bucket() - Crear bucket si no existe.
Bucket: library
Ruta del Objeto: doc/{object_id}
Tipos MIME Soportados: text/plain, application/pdf
Archivos Clave
trustgraph-flow/trustgraph/librarian/blob_store.py- Implementación de BlobStore.trustgraph-flow/trustgraph/librarian/librarian.py- Inicialización de BlobStore.trustgraph-flow/trustgraph/librarian/service.py- Configuración del servicio.trustgraph-flow/pyproject.toml- Dependencias (paqueteminio).docs/apis/api-librarian.md- Documentación de la API.
Backends de Almacenamiento Soportados
La implementación funciona con cualquier sistema de almacenamiento de objetos compatible con S3:
Probado/Soportado
Ceph RADOS Gateway (RGW) - Sistema de almacenamiento distribuido con API S3 (configuración predeterminada). MinIO - Almacenamiento de objetos auto-alojado ligero. Garage - Almacenamiento S3-compatible geo-distribuido ligero.
Debería Funcionar (Compatible con S3)
AWS S3 - Almacenamiento de objetos en la nube de Amazon. Cloudflare R2 - Almacenamiento S3-compatible de Cloudflare. DigitalOcean Spaces - Almacenamiento de objetos de DigitalOcean. Wasabi - Almacenamiento en la nube S3-compatible. Backblaze B2 - Almacenamiento de respaldo S3-compatible. Cualquier otro servicio que implemente la API REST S3.
Configuración
Argumentos de la Línea de Comandos
librarian \
--object-store-endpoint <hostname:port> \
--object-store-access-key <access_key> \
--object-store-secret-key <secret_key> \
[--object-store-use-ssl] \
[--object-store-region <region>]
Nota: No incluya http:// ni https:// en el punto final. Use --object-store-use-ssl para habilitar HTTPS.
Variables de entorno (Alternativa)
OBJECT_STORE_ENDPOINT=<hostname:port>
OBJECT_STORE_ACCESS_KEY=<access_key>
OBJECT_STORE_SECRET_KEY=<secret_key>
OBJECT_STORE_USE_SSL=true|false # Optional, default: false
OBJECT_STORE_REGION=<region> # Optional
Ejemplos
Ceph RADOS Gateway (predeterminado):
--object-store-endpoint ceph-rgw:7480 \
--object-store-access-key object-user \
--object-store-secret-key object-password
MinIO:
--object-store-endpoint minio:9000 \
--object-store-access-key minioadmin \
--object-store-secret-key minioadmin
Almacenamiento (compatible con S3):
--object-store-endpoint garage:3900 \
--object-store-access-key GK000000000000000000000001 \
--object-store-secret-key b171f00be9be4c32c734f4c05fe64c527a8ab5eb823b376cfa8c2531f70fc427
AWS S3 con SSL:
--object-store-endpoint s3.amazonaws.com \
--object-store-access-key AKIAIOSFODNN7EXAMPLE \
--object-store-secret-key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY \
--object-store-use-ssl \
--object-store-region us-east-1
Autenticación
Todos los backends compatibles con S3 requieren la autenticación AWS Signature Version 4 (o v2):
Clave de acceso - Identificador público (como nombre de usuario) Clave secreta - Clave de firma privada (como contraseña)
El cliente de Python de MinIO gestiona automáticamente todos los cálculos de firma.
Creación de credenciales
Para MinIO:
# Use default credentials or create user via MinIO Console
minioadmin / minioadmin
Para Ceph RGW:
radosgw-admin user create --uid="trustgraph" --display-name="TrustGraph Service"
# Returns access_key and secret_key
Para AWS S3: Crear usuario IAM con permisos de S3 Generar clave de acceso en la consola de AWS
Selección de la biblioteca: Cliente de Python para MinIO
Justificación: Ligera (~500 KB frente a los ~50 MB de boto3) Compatible con S3: funciona con cualquier punto final de la API de S3 API más simple que boto3 para operaciones básicas Ya en uso, no se necesita migración Probada en batalla con MinIO y otros sistemas S3
Implementación de BlobStore
Ubicación: trustgraph-flow/trustgraph/librarian/blob_store.py
from minio import Minio
import io
import logging
logger = logging.getLogger(__name__)
class BlobStore:
"""
S3-compatible blob storage for document content.
Supports MinIO, Ceph RGW, AWS S3, and other S3-compatible backends.
"""
def __init__(self, endpoint, access_key, secret_key, bucket_name,
use_ssl=False, region=None):
"""
Initialize S3-compatible blob storage.
Args:
endpoint: S3 endpoint (e.g., "minio:9000", "ceph-rgw:7480")
access_key: S3 access key
secret_key: S3 secret key
bucket_name: Bucket name for storage
use_ssl: Use HTTPS instead of HTTP (default: False)
region: S3 region (optional, e.g., "us-east-1")
"""
self.client = Minio(
endpoint=endpoint,
access_key=access_key,
secret_key=secret_key,
secure=use_ssl,
region=region,
)
self.bucket_name = bucket_name
protocol = "https" if use_ssl else "http"
logger.info(f"Connected to S3-compatible storage at {protocol}://{endpoint}")
self.ensure_bucket()
def ensure_bucket(self):
"""Create bucket if it doesn't exist"""
found = self.client.bucket_exists(bucket_name=self.bucket_name)
if not found:
self.client.make_bucket(bucket_name=self.bucket_name)
logger.info(f"Created bucket {self.bucket_name}")
else:
logger.debug(f"Bucket {self.bucket_name} already exists")
async def add(self, object_id, blob, kind):
"""Store blob in S3-compatible storage"""
self.client.put_object(
bucket_name=self.bucket_name,
object_name=f"doc/{object_id}",
length=len(blob),
data=io.BytesIO(blob),
content_type=kind,
)
logger.debug("Add blob complete")
async def remove(self, object_id):
"""Delete blob from S3-compatible storage"""
self.client.remove_object(
bucket_name=self.bucket_name,
object_name=f"doc/{object_id}",
)
logger.debug("Remove blob complete")
async def get(self, object_id):
"""Retrieve blob from S3-compatible storage"""
resp = self.client.get_object(
bucket_name=self.bucket_name,
object_name=f"doc/{object_id}",
)
return resp.read()
Beneficios Clave
- Sin dependencia de un proveedor - Funciona con cualquier almacenamiento compatible con S3.
- Ligero - El cliente MinIO tiene un tamaño de aproximadamente 500 KB.
- Configuración sencilla - Solo necesita el punto de acceso y las credenciales.
- Sin migración de datos - Reemplazo directo entre diferentes backends.
- Probado en batalla - El cliente MinIO funciona con todas las principales implementaciones de S3.
Estado de la implementación
Todo el código se ha actualizado para utilizar nombres de parámetros S3 genéricos:
✅ blob_store.py - Actualizado para aceptar endpoint, access_key, secret_key
✅ librarian.py - Nombres de parámetros actualizados
✅ service.py - Argumentos de la línea de comandos y configuración actualizados
✅ Documentación actualizada
Mejoras futuras
- Soporte para SSL/TLS - Agregar la bandera
--s3-use-sslpara HTTPS. - Lógica de reintento - Implementar un reintento exponencial para fallos transitorios.
- URLs prefirmadas - Generar URLs temporales de carga/descarga.
- Soporte para múltiples regiones - Replicar blobs a través de regiones.
- Integración con CDN - Servir blobs a través de una CDN.
- Clases de almacenamiento - Utilizar clases de almacenamiento de S3 para la optimización de costos.
- Políticas de ciclo de vida - Archivado/eliminación automática.
- Versionado - Almacenar múltiples versiones de blobs.
Referencias
Cliente de MinIO para Python: https://min.io/docs/minio/linux/developers/python/API.html API S3 de Ceph RGW: https://docs.ceph.com/en/latest/radosgw/s3/ Referencia de la API S3: https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html