- 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
129 lines
2.2 KiB
Markdown
129 lines
2.2 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
R2_ENDPOINT=https://{account_id}.r2.cloudflarestorage.com
|
|
R2_ACCESS_KEY=****
|
|
R2_SECRET_KEY=****
|
|
R2_BUCKET={bucket_name}
|
|
```
|
|
|
|
### Cliente Python
|
|
|
|
```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 | Sí |
|
|
| Imágenes HST | Permanente | Sí |
|
|
| Temporales | 7 días | No |
|
|
|
|
---
|
|
|
|
## Integridad
|
|
|
|
Cada archivo se identifica por su hash SHA-256:
|
|
|
|
```python
|
|
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.
|