Files
system-docs/01_ARQUITECTURA/almacenamiento.md
ARCHITECT 6ea70bd34f Update to Skynet v7 - Complete documentation restructure
- Nueva estructura de carpetas según Skynet v7
- Añadidos schemas SQL completos
- Documentación de entidades, componentes e integraciones
- Modelo de seguridad actualizado
- Infraestructura y operaciones reorganizadas
2025-12-29 18:23:41 +00:00

2.2 KiB

Almacenamiento

Versión: 1.0
Estado: Definición


Visión General

El sistema utiliza Cloudflare R2 como almacenamiento de objetos. Cada instancia tiene su propio bucket independiente.


Buckets R2

Bucket Uso Acceso
architect Coordinador central Privado
deck Servidor personal Privado
corp Servidor empresarial Privado
hst Tags semánticos (imágenes) Público
locker Almacenamiento general Privado

Protocolo locker://

Referencia interna para archivos almacenados en R2.

Formato

locker://{bucket}/{h_entrada}/{filename}

Ejemplos

locker://deck/a1b2c3d4.../documento.pdf
locker://corp/f5e6d7c8.../factura.png
locker://hst/abc123.../imagen.png

Estructura de Almacenamiento

Por contenedor (ingesta)

{bucket}/
└── {h_entrada}/
    ├── archivo1.pdf
    ├── archivo2.jpg
    └── metadata.json

HST (tags)

hst/
└── {mrf}.png    # mrf = SHA-256 del archivo de imagen

Configuración R2

Variables de Entorno

R2_ENDPOINT=https://{account_id}.r2.cloudflarestorage.com
R2_ACCESS_KEY=****
R2_SECRET_KEY=****
R2_BUCKET={bucket_name}

Cliente Python

import boto3

s3 = boto3.client(
    's3',
    endpoint_url=R2_ENDPOINT,
    aws_access_key_id=R2_ACCESS_KEY,
    aws_secret_access_key=R2_SECRET_KEY
)

# Subir archivo
s3.put_object(
    Bucket=R2_BUCKET,
    Key=f"{h_entrada}/{filename}",
    Body=file_bytes
)

# Obtener archivo
response = s3.get_object(
    Bucket=R2_BUCKET,
    Key=f"{h_entrada}/{filename}"
)
content = response['Body'].read()

Política de Retención

Tipo de datos Retención Backup
Archivos de ingesta Permanente
Imágenes HST Permanente
Temporales 7 días No

Integridad

Cada archivo se identifica por su hash SHA-256:

import hashlib

def calcular_hash(contenido_bytes):
    return hashlib.sha256(contenido_bytes).hexdigest()

La referencia locker:// incluye el hash del contenedor, permitiendo verificación de integridad.