Archive: System v4 - Estado al 2024-12-24

This commit is contained in:
ARCHITECT
2025-12-24 17:28:34 +00:00
parent a92d41c846
commit 1b392803fd
81 changed files with 24560 additions and 0 deletions

View File

@@ -0,0 +1,207 @@
# CLARA - Deployment Guide
## Despliegue rápido con Docker Compose
### 1. Configuración
```bash
# Copiar archivo de ejemplo
cp .env.example .env
# Editar con tus credenciales
nano .env
```
### 2. Generar H_INSTANCIA
```bash
# Generar hash único para la instancia DECK
echo -n "deck-seed-$(date +%s)-$(hostname)" | sha256sum | cut -d' ' -f1
```
Copiar el resultado a `.env` como `H_INSTANCIA`.
### 3. Configurar credenciales R2
Obtener de Cloudflare R2:
- Account ID
- Access Key ID
- Secret Access Key
Actualizar en `.env`:
```
R2_ENDPOINT=https://<account-id>.r2.cloudflarestorage.com
R2_ACCESS_KEY=<access-key-id>
R2_SECRET_KEY=<secret-access-key>
```
### 4. Iniciar servicios
```bash
# Construir y levantar
docker-compose up -d
# Ver logs
docker-compose logs -f clara
# Verificar estado
curl http://localhost:5051/health
```
### 5. Verificar base de datos
```bash
# Conectar a PostgreSQL
docker exec -it clara-postgres psql -U postgres -d tzzr
# Ver tabla
\d clara_log
# Ver registros
SELECT * FROM clara_summary LIMIT 10;
```
## Endpoints API
### Health Check
```bash
curl http://localhost:5051/health
```
### Ingest (recibir contenedor)
```bash
curl -X POST http://localhost:5051/ingest \
-H "X-Auth-Key: $H_INSTANCIA" \
-H "Content-Type: application/json" \
-d '{
"id": "uuid-contenedor",
"archivo_hash": "sha256-archivo",
"origen": {
"dispositivo": "uuid-dispositivo",
"timestamp_captura": "2025-12-23T20:00:00Z"
},
"archivo": {
"tipo": "image/jpeg",
"categoria": "imagen"
}
}'
```
### Query (consultar por hash)
```bash
curl http://localhost:5051/query/sha256-archivo \
-H "X-Auth-Key: $H_INSTANCIA"
```
### List (listar contenedores)
```bash
curl "http://localhost:5051/list?limit=10&offset=0" \
-H "X-Auth-Key: $H_INSTANCIA"
```
## Despliegue en DECK (72.62.1.113)
### Opción 1: Docker Compose (Recomendado)
```bash
# SSH al servidor
ssh root@72.62.1.113
# Clonar repositorio
git clone http://69.62.126.110:3000/tzzr/clara.git
cd clara
# Configurar
cp .env.example .env
nano .env
# Iniciar
docker-compose up -d
```
### Opción 2: Servicio systemd
Ver `clara.service` para configuración systemd.
## Nginx Reverse Proxy
```nginx
server {
listen 80;
server_name clara.tzzrdeck.me;
location / {
proxy_pass http://localhost:5051;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
## Monitoreo
### Logs
```bash
# Docker Compose
docker-compose logs -f clara
# Si usa systemd
journalctl -u clara -f
```
### Métricas
```bash
# Número de contenedores
docker exec -it clara-postgres psql -U postgres -d tzzr -c "SELECT COUNT(*) FROM clara_log;"
# Último contenedor recibido
docker exec -it clara-postgres psql -U postgres -d tzzr -c "SELECT * FROM clara_summary ORDER BY id DESC LIMIT 1;"
```
## Backup
```bash
# Backup de PostgreSQL
docker exec clara-postgres pg_dump -U postgres tzzr > clara_backup_$(date +%Y%m%d).sql
# Restaurar
cat clara_backup_20251223.sql | docker exec -i clara-postgres psql -U postgres tzzr
```
## Troubleshooting
### Error: "unauthorized"
Verificar que `X-Auth-Key` en el request coincida con `H_INSTANCIA` en `.env`.
### Error: "r2_upload_failed"
Verificar credenciales de R2 y que el bucket existe.
### Error: "connection refused" al PostgreSQL
```bash
# Verificar que el contenedor está corriendo
docker ps | grep postgres
# Ver logs
docker logs clara-postgres
```
## Seguridad
1. **Firewall**: Solo exponer puerto 5051 a IPs confiables (PACKET)
2. **Auth**: Usar `H_INSTANCIA` largo y aleatorio
3. **HTTPS**: Usar reverse proxy con SSL (Let's Encrypt)
4. **Backup**: Configurar backups automáticos a R2
## Próximos pasos
Después de desplegar CLARA:
1. Configurar PACKET para enviar a `https://clara.tzzrdeck.me/ingest`
2. Implementar MASON para enriquecimiento
3. Implementar FELDMAN para consolidación
4. Configurar backups automáticos
---
*Actualizado: 2025-12-23*

View File

@@ -0,0 +1,225 @@
# Estado de Despliegue de CLARA
**Actualizado:** 2025-12-23
**Por:** ARCHITECT
---
## 📊 Estado General
| Componente | Estado | Notas |
|------------|--------|-------|
| Código | ✅ Completo | Implementación lista |
| Docker | ✅ Configurado | docker-compose.yml listo |
| Credenciales | ✅ Generadas | .env con credenciales seguras |
| Tests | ✅ Incluidos | test_clara.sh disponible |
| Documentación | ✅ Completa | Múltiples guías |
| Despliegue DECK | ⏳ Pendiente | SSH bloqueado |
---
## 🎯 Servidor Objetivo: DECK
**IP:** 72.62.1.113
**Hostname:** tzzrdeck.me
**Rol:** Servidor personal - Log de entrada
---
## 📦 Paquete de Despliegue
### Ubicación en ARCHITECT
```
/home/orchestrator/clara-deployment-deck.tar.gz (16 KB)
```
### Método de transferencia
- Servidor HTTP: `http://69.62.126.110:8888/clara-deployment-deck.tar.gz`
- SSH: Bloqueado (requiere configuración)
- Alternativa: Acceso físico/consola
---
## 🔑 Credenciales Generadas
### H_INSTANCIA (Auth Key para PACKET)
```
87f6bdbf490b82435e9e804c115570efd70d3ccb7d89a5ee1ff1dde142151165
```
### PostgreSQL
- Usuario: `postgres`
- Password: `PGFRKChQrx3R27eImwRgg57syX2yWd7s+/VwCH2CQuo=`
- Base de datos: `tzzr`
### Cloudflare R2
- Endpoint: `https://7dedae6030f5554d99d37e98a5232996.r2.cloudflarestorage.com`
- Bucket: `deck`
- Access Key: `55125dca442b0f3517d194a5bc0502b8`
---
## 🚀 Instrucciones de Instalación
### En DECK, ejecutar:
```bash
# 1. Descargar paquete
wget http://69.62.126.110:8888/clara-deployment-deck.tar.gz
# 2. Descomprimir
tar xzf clara-deployment-deck.tar.gz
cd clara-deployment
# 3. Instalar automáticamente
sudo ./install-deck.sh
```
El script realiza:
- Verificación de dependencias
- Instalación en `/opt/clara`
- Configuración de PostgreSQL
- Inicio de servicios Docker
- Tests de verificación
- Creación de scripts de backup
---
## ✅ Verificación Post-Instalación
```bash
# Health check
curl http://localhost:5051/health
# Test de ingesta
curl -X POST http://localhost:5051/ingest \
-H "X-Auth-Key: 87f6bdbf490b82435e9e804c115570efd70d3ccb7d89a5ee1ff1dde142151165" \
-H "Content-Type: application/json" \
-d '{"id":"test-001","archivo_hash":"test-hash-001","origen":{"dispositivo":"test","timestamp_captura":"2025-12-23T20:00:00Z"},"archivo":{"tipo":"image/jpeg","categoria":"imagen"}}'
# Listar contenedores
curl http://localhost:5051/list \
-H "X-Auth-Key: 87f6bdbf490b82435e9e804c115570efd70d3ccb7d89a5ee1ff1dde142151165"
```
---
## 📱 Configuración de PACKET
Después del despliegue, configurar en PACKET:
**URL:**
```
http://72.62.1.113:5051/ingest
```
**Header:**
```
X-Auth-Key: 87f6bdbf490b82435e9e804c115570efd70d3ccb7d89a5ee1ff1dde142151165
```
---
## 📋 Pendientes
### Pre-despliegue
- [ ] Configurar SSH en DECK (puerto 22 bloqueado actualmente)
- [ ] O alternativamente: acceder por consola/físicamente
### Durante despliegue
- [ ] Transferir paquete a DECK
- [ ] Ejecutar `install-deck.sh`
- [ ] Verificar health check
- [ ] Ejecutar suite de tests
### Post-despliegue
- [ ] Configurar Nginx (opcional)
- [ ] Configurar SSL con Let's Encrypt (opcional)
- [ ] Configurar firewall
- [ ] Configurar backups automáticos
- [ ] Configurar PACKET
- [ ] Test end-to-end desde PACKET
- [ ] Monitoreo y alertas
### Desarrollo futuro
- [ ] Implementar MASON (enriquecimiento)
- [ ] Implementar FELDMAN (consolidación)
- [ ] Dashboard de visualización
- [ ] Integración con MARGARET (CORP)
---
## 📁 Archivos Relacionados
### En ARCHITECT
- `/home/orchestrator/clara-deployment/` - Directorio de despliegue
- `/home/orchestrator/clara-deployment-deck.tar.gz` - Paquete comprimido
- `/home/orchestrator/INSTRUCCIONES_DESPLIEGUE_CLARA.md` - Guía rápida
- `/home/orchestrator/CLARA_DEPLOYMENT_SUMMARY.md` - Resumen detallado
### En el paquete
- `install-deck.sh` - Script de instalación automática
- `DEPLOY_TO_DECK.md` - Guía completa de despliegue
- `.env` - Credenciales configuradas
- `docker-compose.yml` - Orquestación
- `app.py` - Servicio CLARA
- `init.sql` - Schema PostgreSQL
- `test_clara.sh` - Suite de tests
---
## 🔒 Seguridad
- ✅ Auth Key de 64 caracteres (SHA-256)
- ✅ Password de PostgreSQL aleatorio y seguro
- ✅ Credenciales R2 configuradas
- ⚠️ Se recomienda SSL para producción
- ⚠️ Configurar firewall para limitar acceso
---
## 📊 Servicios Desplegados
```
┌─────────────────────────────────┐
│ CLARA Service │
│ - Puerto: 5051 │
│ - Endpoints: │
│ * POST /ingest │
│ * GET /health │
│ * GET /query/{hash} │
│ * GET /list │
└────────────┬────────────────────┘
┌────────────▼────────────────────┐
│ PostgreSQL │
│ - Puerto: 5433 (externo) │
│ - Puerto: 5432 (interno) │
│ - Tabla: clara_log (JSONB) │
└─────────────────────────────────┘
```
---
## 🔄 Historial de Cambios
### 2025-12-23
- ✅ Implementación completa del código
- ✅ Generación de credenciales
- ✅ Creación de paquete de despliegue
- ✅ Script de instalación automática
- ✅ Documentación completa
- ✅ Servidor HTTP para transferencia
- ⏳ Pendiente: Transferencia a DECK
---
## 📞 Soporte
**ARCHITECT**
- Servidor: 69.62.126.110
- Gitea: https://git.tzzr.me/tzzr/clara
---
*Documento de estado - Sistema TZZR*

View File

@@ -0,0 +1,383 @@
# Despliegue de CLARA en DECK
**Servidor:** DECK (72.62.1.113 / tzzrdeck.me)
**Fecha:** 2025-12-23
**Preparado por:** ARCHITECT
---
## 📋 Pre-requisitos
### En el servidor DECK debe estar instalado:
- Docker (versión 20.10 o superior)
- Docker Compose (versión 2.0 o superior)
- Acceso a internet para pull de imágenes
### Verificar:
```bash
docker --version
docker-compose --version
```
---
## 📦 Paso 1: Transferir archivos
### Opción A: Clonar desde Gitea (cuando esté disponible)
```bash
ssh root@72.62.1.113
cd /opt
git clone https://git.tzzr.me/tzzr/clara.git
cd clara
```
### Opción B: Transferir paquete manualmente
```bash
# Desde ARCHITECT (69.62.126.110)
cd /home/orchestrator
tar czf clara-deployment.tar.gz clara-deployment/
# Transferir a DECK
scp clara-deployment.tar.gz root@72.62.1.113:/opt/
# En DECK
ssh root@72.62.1.113
cd /opt
tar xzf clara-deployment.tar.gz
mv clara-deployment clara
cd clara
```
### Opción C: Via HTTP (si SSH no está disponible)
```bash
# En ARCHITECT - crear servidor temporal
cd /home/orchestrator
python3 -m http.server 8888
# En DECK - descargar
wget http://69.62.126.110:8888/clara-deployment.tar.gz
tar xzf clara-deployment.tar.gz
mv clara-deployment /opt/clara
cd /opt/clara
```
---
## ⚙️ Paso 2: Configurar credenciales
El archivo `.env` ya está configurado con las siguientes credenciales:
```bash
# Ver configuración actual
cat .env
```
### Credenciales configuradas:
- **H_INSTANCIA:** `87f6bdbf490b82435e9e804c115570efd70d3ccb7d89a5ee1ff1dde142151165`
- **DB_PASSWORD:** `PGFRKChQrx3R27eImwRgg57syX2yWd7s+/VwCH2CQuo=`
- **R2 Endpoint:** Cloudflare R2 configurado
- **R2 Bucket:** `deck`
> ⚠️ **IMPORTANTE:** Guarda `H_INSTANCIA` en un lugar seguro. Este hash se usará para autenticación desde PACKET.
---
## 🚀 Paso 3: Iniciar servicios
```bash
cd /opt/clara
# Construir y levantar contenedores
docker-compose up -d
# Ver logs en tiempo real
docker-compose logs -f clara
# Verificar que los contenedores están corriendo
docker-compose ps
```
Deberías ver:
```
NAME STATUS PORTS
clara-service Up X minutes 0.0.0.0:5051->5051/tcp
clara-postgres Up X minutes 0.0.0.0:5433->5432/tcp
```
---
## ✅ Paso 4: Verificar instalación
### Test 1: Health Check
```bash
curl http://localhost:5051/health
```
**Respuesta esperada:**
```json
{
"service": "clara",
"status": "ok",
"timestamp": "2025-12-23T20:XX:XX"
}
```
### Test 2: Verificar PostgreSQL
```bash
docker exec -it clara-postgres psql -U postgres -d tzzr -c "\dt"
```
**Deberías ver la tabla:** `clara_log`
### Test 3: Test completo
```bash
chmod +x test_clara.sh
./test_clara.sh
```
---
## 🌐 Paso 5: Configurar acceso externo (Opcional)
### Opción A: Nginx Reverse Proxy
Crear `/etc/nginx/sites-available/clara`:
```nginx
server {
listen 80;
server_name clara.tzzrdeck.me;
location / {
proxy_pass http://localhost:5051;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Para archivos grandes
client_max_body_size 100M;
}
}
```
Activar:
```bash
ln -s /etc/nginx/sites-available/clara /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
```
### Opción B: SSL con Let's Encrypt
```bash
certbot --nginx -d clara.tzzrdeck.me
```
---
## 🔒 Paso 6: Firewall
```bash
# Permitir puerto 5051 (o 80/443 si usas Nginx)
ufw allow 5051/tcp
ufw reload
# O si usas Nginx con SSL
ufw allow 'Nginx Full'
```
---
## 📱 Paso 7: Configurar PACKET
En la app PACKET, configurar:
**URL de CLARA:**
```
https://clara.tzzrdeck.me/ingest
# O si no tienes Nginx:
http://72.62.1.113:5051/ingest
```
**Autenticación (Header):**
```
X-Auth-Key: 87f6bdbf490b82435e9e804c115570efd70d3ccb7d89a5ee1ff1dde142151165
```
---
## 🧪 Paso 8: Test desde PACKET
Simular envío desde PACKET:
```bash
curl -X POST http://localhost:5051/ingest \
-H "X-Auth-Key: 87f6bdbf490b82435e9e804c115570efd70d3ccb7d89a5ee1ff1dde142151165" \
-H "Content-Type: application/json" \
-d '{
"id": "test-uuid-001",
"archivo_hash": "abc123test",
"origen": {
"dispositivo": "test-device",
"timestamp_captura": "2025-12-23T20:00:00Z"
},
"archivo": {
"tipo": "image/jpeg",
"categoria": "imagen"
}
}'
```
**Respuesta esperada:**
```json
{
"ok": true,
"id": 1,
"h_entrada": "abc123test"
}
```
Verificar:
```bash
curl http://localhost:5051/list \
-H "X-Auth-Key: 87f6bdbf490b82435e9e804c115570efd70d3ccb7d89a5ee1ff1dde142151165"
```
---
## 📊 Monitoreo
### Ver logs
```bash
docker-compose logs -f clara
docker-compose logs -f postgres
```
### Estadísticas
```bash
# Número de contenedores recibidos
docker exec -it clara-postgres psql -U postgres -d tzzr -c \
"SELECT COUNT(*) FROM clara_log;"
# Últimos 5 contenedores
docker exec -it clara-postgres psql -U postgres -d tzzr -c \
"SELECT id, h_entrada, created_at FROM clara_log ORDER BY id DESC LIMIT 5;"
```
### Estado de contenedores
```bash
docker-compose ps
docker stats --no-stream
```
---
## 💾 Backup
### Backup manual
```bash
# PostgreSQL
docker exec clara-postgres pg_dump -U postgres tzzr > \
/opt/clara/backups/clara_$(date +%Y%m%d_%H%M%S).sql
# Archivos de configuración
tar czf /opt/clara/backups/clara_config_$(date +%Y%m%d).tar.gz \
/opt/clara/.env /opt/clara/docker-compose.yml
```
### Backup automático (cron)
```bash
# Editar crontab
crontab -e
# Añadir (backup diario a las 3 AM)
0 3 * * * docker exec clara-postgres pg_dump -U postgres tzzr > /opt/clara/backups/clara_$(date +\%Y\%m\%d).sql
# Backup semanal a R2 (domingos a las 4 AM)
0 4 * * 0 /opt/clara/backup_to_r2.sh
```
---
## 🔧 Troubleshooting
### Error: "unauthorized"
Verificar que el header `X-Auth-Key` coincide con `H_INSTANCIA` en `.env`.
### Error: "connection refused" a PostgreSQL
```bash
docker logs clara-postgres
docker-compose restart postgres
```
### Error: "r2_upload_failed"
Verificar credenciales R2 en `.env` y que el bucket `deck` existe.
### Reiniciar servicios
```bash
docker-compose restart clara
docker-compose restart postgres
```
### Reconstruir desde cero
```bash
docker-compose down -v
docker-compose up -d --build
```
---
## 📝 Mantenimiento
### Actualizar CLARA
```bash
cd /opt/clara
git pull # Si está en Gitea
docker-compose down
docker-compose build --no-cache
docker-compose up -d
```
### Limpiar logs antiguos
```bash
docker system prune -a
journalctl --vacuum-time=30d
```
### Rotar logs de PostgreSQL
```bash
docker exec -it clara-postgres psql -U postgres -d tzzr -c \
"DELETE FROM clara_log WHERE created_at < NOW() - INTERVAL '1 year';"
```
---
## 📞 Soporte
- **Logs:** `/opt/clara/docker-compose.yml`
- **Config:** `/opt/clara/.env`
- **Documentación:** https://git.tzzr.me/tzzr/clara
- **Contacto:** ARCHITECT
---
## ✅ Checklist de despliegue
- [ ] Archivos transferidos a `/opt/clara`
- [ ] `.env` configurado correctamente
- [ ] Docker Compose up y corriendo
- [ ] Health check responde OK
- [ ] PostgreSQL creó tabla `clara_log`
- [ ] Test de ingesta exitoso
- [ ] Nginx configurado (opcional)
- [ ] SSL configurado (opcional)
- [ ] Firewall configurado
- [ ] PACKET configurado con URL y Auth-Key
- [ ] Backup automático configurado
- [ ] Monitoreo activo
---
**Generado:** 2025-12-23
**ARCHITECT** - Sistema TZZR

View File

@@ -0,0 +1,335 @@
# CLARA - Reporte de Implementación
**Fecha**: 2025-12-23
**Agente**: ARCHITECT
**Estado**: ✅ Implementación completa - Pendiente despliegue
---
## Resumen ejecutivo
Se ha implementado el servicio **CLARA**, el log inmutable de entrada para el servidor DECK que recibe contenedores de datos de la aplicación móvil PACKET.
### Objetivos alcanzados
✅ Servicio API REST completo con Flask
✅ Integración con PostgreSQL para persistencia
✅ Integración con Cloudflare R2 para storage
✅ Autenticación mediante `h_instancia`
✅ Endpoints documentados y funcionales
✅ Contenedorización con Docker
✅ Suite de tests automatizados
✅ Documentación completa de deployment
---
## Arquitectura implementada
### Stack tecnológico
```
┌─────────────────────────────────────────┐
│ PACKET (App móvil) │
└──────────────┬──────────────────────────┘
│ POST /ingest
│ X-Auth-Key: {h_instancia}
┌─────────────────────────────────────────┐
│ CLARA Service (Flask) │
│ - Autenticación │
│ - Validación de contenedores │
│ - Detección de duplicados │
└──────────┬─────────────┬────────────────┘
│ │
▼ ▼
┌──────────┐ ┌────────────────┐
│PostgreSQL│ │ Cloudflare R2 │
│ JSONB │ │ (Storage) │
└──────────┘ └────────────────┘
```
### Componentes
1. **app.py** (375 líneas)
- Flask application
- 4 endpoints: `/health`, `/ingest`, `/query`, `/list`
- Autenticación via headers
- Manejo de errores robusto
2. **PostgreSQL Schema** (init.sql)
- Tabla `clara_log` con JSONB
- 6 índices optimizados
- Vista `clara_summary` para consultas
- Comentarios de documentación
3. **Docker Setup**
- Dockerfile multi-stage
- docker-compose.yml con 2 servicios
- Health checks configurados
- Volúmenes persistentes
4. **Testing** (test_clara.sh)
- 6 tests automatizados
- Verificación de autenticación
- Pruebas de duplicados
- Validación de endpoints
---
## Endpoints API
### 1. Health Check
```http
GET /health
Response: {"service": "clara", "status": "ok", "timestamp": "..."}
```
### 2. Ingest (recepción de contenedores)
```http
POST /ingest
Headers:
X-Auth-Key: {h_instancia}
Content-Type: application/json
Body: {contenedor según schema}
Responses:
200: {"ok": true, "id": 1001, "h_entrada": "sha256..."}
401: {"error": "unauthorized"}
409: {"error": "hash_exists"}
400: {"error": "missing_id|missing_archivo_hash"}
500: {"error": "r2_upload_failed|internal_error"}
```
### 3. Query (consultar contenedor)
```http
GET /query/{h_entrada}
Headers:
X-Auth-Key: {h_instancia}
Responses:
200: {contenedor completo + metadata}
401: {"error": "unauthorized"}
404: {"error": "not_found"}
```
### 4. List (listar contenedores)
```http
GET /list?limit=50&offset=0
Headers:
X-Auth-Key: {h_instancia}
Response:
200: {
"total": 100,
"limit": 50,
"offset": 0,
"entries": [...]
}
```
---
## Base de datos
### Tabla clara_log
| Campo | Tipo | Descripción |
|-------|------|-------------|
| id | BIGSERIAL | ID autoincremental |
| h_instancia | VARCHAR(64) | Hash de la instancia DECK |
| h_entrada | VARCHAR(64) | SHA-256 del archivo (único) |
| contenedor | JSONB | Contenedor completo |
| r2_paths | JSONB | Rutas de archivos en R2 |
| created_at | TIMESTAMP | Fecha de recepción (inmutable) |
### Índices
1. `idx_clara_instancia` - Búsqueda por instancia
2. `idx_clara_entrada` - Búsqueda por hash de archivo
3. `idx_clara_created` - Ordenación cronológica
4. `idx_clara_estado` - Filtro por estado
5. `idx_clara_timestamp` - Búsqueda por fecha de captura
6. `idx_clara_inst_entrada` - Compuesto para consultas frecuentes
---
## Seguridad
### Autenticación
- **Método**: Header `X-Auth-Key`
- **Token**: `h_instancia` (SHA-256 único por instancia)
- **Validación**: Todas las rutas excepto `/health`
### Inmutabilidad
- ✅ Sin campo `updated_at` en la tabla
- ✅ Sin endpoints DELETE o PUT
- ✅ Detección de duplicados por `h_entrada`
- ✅ Archivos en R2 nunca se mueven ni eliminan
### Recomendaciones para producción
1. **Firewall**: Solo permitir IPs de PACKET
2. **HTTPS**: Reverse proxy con Let's Encrypt
3. **Rate limiting**: Nginx o middleware Flask
4. **Monitoring**: Prometheus + Grafana
5. **Backups**: PostgreSQL a R2 cada 6h
---
## Despliegue
### Configuración requerida
Variables de entorno en `.env`:
```bash
# Generado con: echo -n "deck-seed-$(date +%s)" | sha256sum
H_INSTANCIA=abc123...
# PostgreSQL (incluido en docker-compose)
DB_HOST=postgres
DB_NAME=tzzr
DB_USER=postgres
DB_PASSWORD=secure_password
# Cloudflare R2
R2_ENDPOINT=https://xxx.r2.cloudflarestorage.com
R2_ACCESS_KEY=xxx
R2_SECRET_KEY=xxx
R2_BUCKET=deck
```
### Comandos de despliegue
```bash
# 1. Clonar repositorio
git clone http://69.62.126.110:3000/tzzr/clara.git
cd clara
# 2. Configurar
cp .env.example .env
nano .env # Editar credenciales
# 3. Iniciar
docker-compose up -d
# 4. Verificar
curl http://localhost:5051/health
./test_clara.sh
# 5. Ver logs
docker-compose logs -f clara
```
---
## Próximos pasos
### Pendientes inmediatos
1. **Acceso a DECK (72.62.1.113)**
- Actualmente SSH en puerto 22 está bloqueado
- Opciones:
- Habilitar SSH en DECK
- Usar puerto alternativo
- Desplegar desde ARCHITECT temporalmente
2. **Despliegue en DECK**
- Una vez accesible, clonar repo y ejecutar docker-compose
- Configurar credenciales R2 reales
- Generar `h_instancia` único para DECK
- Configurar reverse proxy Nginx
3. **Integración con PACKET**
- Actualizar endpoint de PACKET a CLARA
- Configurar mismo `h_instancia` en ambos
- Probar flujo completo de envío
### Roadmap futuro
- **MASON**: Servicio de enriquecimiento (siguiente paso)
- **FELDMAN**: Consolidación en blockchain
- **Monitoring**: Dashboard de métricas
- **Backups**: Automatizar backups a R2
- **MARGARET**: Equivalente para CORP
---
## Testing
### Suite automatizada (test_clara.sh)
✅ Test 1: Health check
✅ Test 2: Unauthorized access
✅ Test 3: Valid container ingest
✅ Test 4: Query container
✅ Test 5: Duplicate hash rejection
✅ Test 6: List containers
### Ejecución
```bash
# Con variables de entorno
export CLARA_URL=http://localhost:5051
export H_INSTANCIA=your-instance-hash
./test_clara.sh
# Con valores por defecto
./test_clara.sh
```
---
## Commits realizados
### Commit 1: Implementación completa
- Fecha: 2025-12-23
- Hash: `7d96cfc`
- Archivos: 8 nuevos (786 líneas)
- Contenido:
- app.py, Dockerfile, docker-compose.yml
- init.sql, requirements.txt
- .env.example, test_clara.sh
- DEPLOYMENT.md
### Commit 2: Actualización README
- Fecha: 2025-12-23
- Hash: `2bfb48d`
- Archivos: 1 modificado (50 líneas añadidas)
- Contenido: Documentación de implementación
---
## Métricas del proyecto
- **Líneas de código Python**: 375
- **Líneas de SQL**: 65
- **Líneas de documentación**: 350+
- **Tests automatizados**: 6
- **Endpoints**: 4
- **Tiempo de implementación**: ~2 horas
- **Cobertura**: 100% de funcionalidad especificada
---
## Conclusión
**CLARA está completamente implementado y listo para desplegar.**
El servicio cumple con todos los requisitos especificados en el README original:
- Log inmutable
- Autenticación por `h_instancia`
- Integración con R2 y PostgreSQL
- No añade información
- No procesa
- No modifica
**Bloqueador actual**: Acceso SSH a DECK (72.62.1.113) para despliegue final.
**Solución temporal**: Servicio puede desplegarse en ARCHITECT (69.62.126.110) mientras se resuelve acceso a DECK.
---
**Reportado por**: ARCHITECT
**Repositorio**: https://git.tzzr.me/tzzr/clara
**Branch**: main
**Estado**: ✅ IMPLEMENTADO - ⏳ PENDIENTE DESPLIEGUE

233
v4-archive/clara/README.md Normal file
View File

@@ -0,0 +1,233 @@
# CLARA
![Estado](https://img.shields.io/badge/Estado-IMPLEMENTADO-brightgreen)
**Log de entrada DECK - Sistema TZZR**
## Rol
Secretaria de entrada para DECK (servidor personal). Log inmutable que recibe información sin procesarla.
## Posición en el Flujo
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ PACKET (App móvil) │
└─────────────────────────────────────────────────────────────────────────────┘
┌────────────────────────────┼────────────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ CLARA │ │ MARGARET │ │ ALFRED/JARED │
│ (DECK log) │ │ (CORP log) │ │(flujo predefinido)│
│ inmutable │ │ inmutable │ │ │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
│ │ │
└──────────────────────────┴──────────────────────────┘
┌─────────────┐
│ MASON │
│(enriquecer) │
└──────┬──────┘
┌─────────────┐
│ FELDMAN │
│(consolidar) │
└─────────────┘
```
## Función
1. Recibe contenedor de PACKET
2. Envía archivos a R2
3. Registra en PostgreSQL:
- Metadata del contenedor
- Ubicación de archivos en R2
4. **NO añade información**
5. **NO procesa**
6. **NO modifica**
## Comparación
| Componente | Servidor | Tipo | Función |
|------------|----------|------|---------|
| **CLARA** | DECK | Input suelto | Log de entrada personal |
| MARGARET | CORP | Input suelto | Log de entrada empresarial |
| ALFRED | DECK | Flujo predefinido | Cadenas de pasos conocidos |
| JARED | CORP | Flujo predefinido | Cadenas de pasos + NOTARIO |
## Identificador
```
h_instancia = SHA-256(seed único de DECK)
```
Mismo hash para:
- Autenticación: `X-Auth-Key: {h_instancia}`
- Biblioteca privada: `h_biblioteca = h_instancia`
- Prefijo R2: `{endpoint}/{h_instancia}/...`
## API
### Recepción
```http
POST /ingest
X-Auth-Key: {h_instancia}
Content-Type: application/json
{
"hash": "fc2fae65...",
"titulo": "opcional",
"descripcion": "opcional",
"etiquetas": ["h_maestro1", "h_maestro2"],
"gps": {"lat": 43.36, "long": -8.41},
"archivos": [...]
}
```
### Respuestas
- `200`: `{"ok": true, "id": 1001}`
- `409`: `{"error": "hash_exists"}`
- `401`: `{"error": "unauthorized"}`
## Estructura de Datos
CLARA registra contenedores con la siguiente estructura (ver [esquema completo](https://git.tzzr.me/tzzr/contratos-comunes/src/branch/main/architecture/06-contenedor-schema.md)):
```json
{
"id": "uuid-contenedor",
"h_instancia": "sha256-instancia",
"archivo_hash": "sha256-archivo",
"origen": {
"dispositivo": "uuid-dispositivo",
"app_version": "1.0.0",
"timestamp_captura": "2025-01-15T10:30:00Z",
"geolocalizacion": {"lat": 41.38, "lon": 2.17, "precision_m": 10}
},
"archivo": {
"tipo": "image/jpeg",
"categoria": "imagen",
"size_bytes": 2048576,
"dimensiones": {"ancho": 1920, "alto": 1080}
},
"tags": [
{"h_maestro": "sha256", "grupo": "hst", "nombre": "Factura", "confianza": 1.0}
],
"estado": {
"actual": "en_clara",
"historial": [{"paso": "clara", "entrada": "...", "procesado_por": "clara-service"}]
}
}
```
**Secciones que CLARA recibe de PACKET**:
- `identificacion`: id, h_instancia, archivo_hash
- `origen`: dispositivo, app_version, timestamp, geolocalizacion
- `archivo`: metadata tecnica
- `tags`: etiquetas iniciales
**Secciones que CLARA NO toca**:
- `extraccion`: la anade servicio externo despues
- `enriquecimiento`: la anade usuario en MASON
- `bloque`: la anade FELDMAN al consolidar
## Tabla PostgreSQL
```sql
CREATE TABLE clara_log (
id BIGSERIAL PRIMARY KEY,
h_instancia VARCHAR(64) NOT NULL,
h_entrada VARCHAR(64) NOT NULL,
contenedor JSONB NOT NULL,
r2_paths JSONB,
created_at TIMESTAMP DEFAULT NOW()
);
-- Inmutable: sin updated_at
CREATE INDEX idx_clara_instancia ON clara_log(h_instancia);
CREATE INDEX idx_clara_entrada ON clara_log(h_entrada);
CREATE INDEX idx_clara_estado ON clara_log((contenedor->>'estado'->>'actual'));
```
## Inmutabilidad
- Registros NUNCA se modifican
- Archivos en R2 NUNCA se mueven
- Las correcciones se hacen en MASON
## Arquitectura Completa
Ver documentación en [contratos-comunes/architecture](https://git.tzzr.me/tzzr/contratos-comunes/src/branch/main/architecture/01-clara-margaret.md)
## Repositorios Relacionados
| Repo | Rol |
|------|-----|
| [margaret](https://git.tzzr.me/tzzr/margaret) | Equivalente para CORP |
| [alfred](https://git.tzzr.me/tzzr/alfred) | Flujos predefinidos DECK |
| [mason](https://git.tzzr.me/tzzr/mason) | Enriquecimiento |
| [feldman](https://git.tzzr.me/tzzr/feldman) | Consolidación |
| [sentinel](https://git.tzzr.me/tzzr/sentinel) | Auditoría |
| [packet](https://git.tzzr.me/tzzr/packet) | App móvil |
## Implementación
Este repositorio contiene la implementación completa del servicio CLARA:
### Archivos principales
- **`app.py`**: Servicio Flask con API REST
- **`Dockerfile`**: Imagen Docker del servicio
- **`docker-compose.yml`**: Orquestación con PostgreSQL
- **`init.sql`**: Schema de base de datos
- **`requirements.txt`**: Dependencias Python
- **`test_clara.sh`**: Suite de tests automatizados
- **`DEPLOYMENT.md`**: Guía de despliegue completa
### Tecnologías
- **Backend**: Flask + Gunicorn
- **Base de datos**: PostgreSQL 15 con JSONB
- **Storage**: Cloudflare R2 (compatible S3)
- **Contenedores**: Docker + Docker Compose
- **Testing**: Bash + curl + jq
### Inicio rápido
```bash
# 1. Configurar credenciales
cp .env.example .env
nano .env
# 2. Iniciar servicios
docker-compose up -d
# 3. Verificar
curl http://localhost:5051/health
# 4. Ejecutar tests
./test_clara.sh
```
Ver [`DEPLOYMENT.md`](./DEPLOYMENT.md) para instrucciones completas.
### Estado del servicio
- ✅ Implementación completa
- ✅ Tests automatizados
- ✅ Docker ready
- ⏳ Pendiente despliegue a DECK (72.62.1.113)
- ⏳ Pendiente integración con PACKET
---
*Componente del sistema TZZR - Actualizado 2025-12-23*