Compare commits

..

3 Commits

Author SHA1 Message Date
ARCHITECT
4ec99f63c9 fix(naming): Apply generic + proper name convention
Components now use format: genérico (NOMBRE_PROPIO)

- secretaria (CLARA/MARGARET) - ingesta
- administrativo (MASON) - enriquecimiento
- contable (FELDMAN) - consolidación
- producción (ALFRED/JARED) - orquestación
- auditoría (SENTINEL) - planificado

Clarifies that components are microservices, not AI.
DECK/CORP are designed to USE AI services, not contain them.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 11:25:41 +00:00
ARCHITECT
0ee01d07a3 fix(arch): Enforce instance autonomy principle across docs
Updates to ensure DECK/CORP are documented as autonomous instances:

- overview.md: Clarify ARCHITECT is for build/deploy only, not runtime
- filosofia.md: Mark shared services (GRACE, etc.) as optional
- backup-recovery.md: Each instance does its own local backup to its own R2 bucket

Key principle: Instances never depend on ARCHITECT at runtime.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 10:40:19 +00:00
ARCHITECT
582e425832 fix(security): Correct secrets architecture for autonomous instances
ARCHITECT is the constructor, DECK/CORP are autonomous instances.
Each instance must operate independently at runtime.

Architecture:
- Infisical (ARCHITECT): Central management, source of truth
- Vaultwarden (DECK :8085): Local secrets for autonomous operation
- Vaultwarden (CORP :8081): Local secrets for autonomous operation
- Sync: Infisical → Vaultwarden propagation

Key principle: Instances never depend on ARCHITECT at runtime.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 09:42:57 +00:00
8 changed files with 538 additions and 376 deletions

View File

@@ -9,12 +9,12 @@
### 1. Constructores, no gestores ### 1. Constructores, no gestores
Las instancias Claude son **constructores de arquitecturas**, no gestores permanentes. ARCHITECT (con Claude) es un **constructor de arquitecturas**, no un gestor permanente.
- Cada instancia diseña y construye la arquitectura de un servidor - ARCHITECT diseña y construye la arquitectura de cada servidor
- Cuando la arquitectura esté madura, el servidor será **clonable e independiente** - Cuando la arquitectura esté madura, el servidor será **clonable e independiente**
- Funciona sin necesidad de su instancia Claude - DECK y CORP funcionan sin conexión a ARCHITECT ni a Claude
- Solo los servidores del propietario original mantienen conexión con Claude - Son sistemas diseñados para **usar** servicios de IA (APIs externas, RunPod), no para contenerla
### 2. Descentralización operativa ### 2. Descentralización operativa
@@ -101,5 +101,18 @@ VALORES → OBJETIVOS → IMÁGENES IA → CURACIÓN HUMANA → LO QUE SOBREVIVE
Cada instancia: Cada instancia:
- Tiene su propio bucket de almacenamiento - Tiene su propio bucket de almacenamiento
- Puede renombrar sus agentes - Puede renombrar sus agentes
- Opera de forma descentralizada - **Opera de forma autónoma** (no depende de ARCHITECT en runtime)
- Se conecta a servicios compartidos (GRACE, THE FACTORY, CIRCLE) - Tiene su propio gestor de secretos (Vaultwarden)
- Hace sus propios backups a R2
### Servicios Compartidos (Opcionales)
Las instancias **pueden** conectarse a servicios GPU compartidos:
| Servicio | Función | Requerido |
|----------|---------|-----------|
| GRACE | Extracción IA | Opcional |
| THE FACTORY | Generación | Opcional |
| CIRCLE | Colaboración | Opcional |
> **Nota:** Si los servicios compartidos no están disponibles, la instancia sigue operando. Solo las funciones de IA estarán limitadas.

View File

@@ -27,26 +27,39 @@
--- ---
## Agentes ## Componentes (Microservicios)
### Ingesta > **Nota:** Los componentes tienen nombres de persona pero son **microservicios backend**, no IA.
| Agente | Servidor | Puerto | Descripción | > Están diseñados para consumir servicios de IA externos (APIs, RunPod), no para contenerla.
|--------|----------|--------|-------------|
| **CLARA** | DECK | 5051 | Recoge información personal, log inmutable |
| **MARGARET** | CORP | 5051 | Recoge información corporativa, log inmutable |
### Orquestación ### secretaria (ingesta)
| Agente | Servidor | Puerto | Descripción | | Componente | Servidor | Puerto | Descripción |
|--------|----------|--------|-------------| |------------|----------|--------|-------------|
| **ALFRED** | DECK | 5052 | Flujos predefinidos personales | | **secretaria (CLARA)** | DECK | 5051 | Recoge información personal, log inmutable |
| **JARED** | CORP | 5052 | Flujos predefinidos corporativos (más potente) | | **secretaria (MARGARET)** | CORP | 5051 | Recoge información corporativa, log inmutable |
### Procesamiento ### administrativo (enriquecimiento)
| Agente | Servidor | Puerto | Descripción | | Componente | Servidor | Puerto | Descripción |
|--------|----------|--------|-------------| |------------|----------|--------|-------------|
| **MASON** | CORP | 5053 | Enriquecimiento, ventana flotante 24h | | **administrativo (MASON)** | DECK | 5053 | Enriquecimiento, ventana flotante 24h |
| **FELDMAN** | CORP | 5054 | Consolidación final, blockchain, inmutable | | **administrativo (MASON)** | CORP | 5053 | Enriquecimiento, ventana flotante 24h |
| **SENTINEL** | - | - | Auditoría LIGHT (5min) + DEEP (1h) [planificado] |
### contable (consolidación)
| Componente | Servidor | Puerto | Descripción |
|------------|----------|--------|-------------|
| **contable (FELDMAN)** | DECK | 5054 | Consolidación final, blockchain, inmutable |
| **contable (FELDMAN)** | CORP | 5054 | Consolidación final, blockchain, inmutable |
### producción (orquestación)
| Componente | Servidor | Puerto | Descripción |
|------------|----------|--------|-------------|
| **producción (ALFRED)** | DECK | 5052 | Flujos predefinidos, orden de ejecución |
| **producción (JARED)** | CORP | 5052 | Flujos predefinidos, orden de ejecución |
### auditoría (planificado)
| Componente | Servidor | Puerto | Descripción |
|------------|----------|--------|-------------|
| **SENTINEL** | - | - | Auditoría LIGHT (5min) + DEEP (1h) |
--- ---

View File

@@ -5,35 +5,48 @@
--- ---
## Principio Fundamental
> **ARCHITECT es el constructor. DECK y CORP son instancias autónomas.**
- **ARCHITECT**: Construye, despliega, coordina. NO es dependencia runtime.
- **DECK/CORP**: Operan independientemente. Funcionan si ARCHITECT está caído.
---
## Diagrama General ## Diagrama General
``` ```
┌─────────────────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────────────────┐
CAPA DE COORDINACIÓN │ CAPA DE CONSTRUCCIÓN (solo deploy/dev)
│ │ │ │
│ ┌─────────────────────────────────────────────────────────────────┐ │ │ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ ARCHITECT (69.62.126.110) │ │ │ │ ARCHITECT (69.62.126.110) │ │
│ │ ┌──────────┐ ┌──────────┐ ┌────────────┐ ┌───────────────┐ │ │ │ │ ┌──────────┐ ┌──────────┐ ┌────────────┐ ┌───────────────┐ │ │
│ │ │PostgreSQL│ │ Gitea │ │Orchestrator│ │ Infisical │ │ │ │ │ │PostgreSQL│ │ Gitea │ │Orchestrator│ │ Infisical │ │ │
│ │ │ central │ │ 25 repos │ │ v5 │ │ Secrets │ │ │ │ │ │ contexto │ │ 25 repos │ │ v5 │ │ (master) │ │ │
│ │ └──────────┘ └──────────┘ └────────────┘ └───────────────┘ │ │ │ │ └──────────┘ └──────────┘ └────────────┘ └───────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────┘ │ │ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ Rol: Construcción, deployment, gestión central de secretos │
│ NO es dependencia runtime de las instancias │
└─────────────────────────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────────────────────────────┘
│ │ │ │ │ │
deploy │ │ │ deploy
▼ ▼ ▼ ▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────────────────┐
CAPA DE SERVIDORES │ CAPA DE INSTANCIAS (autónomas)
│ │ │ │
│ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │ │ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │
│ │ DECK │ │ CORP │ │ HST │ │ │ │ DECK │ │ CORP │ │ HST │ │
│ │ 72.62.1.113 │ │ 92.112.181.188 │ │ 72.62.2.84 │ │ │ │ 72.62.1.113 │ │ 92.112.181.188 │ │ 72.62.2.84 │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ CLARA :5051 │ │ MARGARET :5051 │ │ 973 tags │ │ │ │ secretaria :5051 │ │ secretaria :5051 │ │ 973 tags │ │
│ │ ALFRED :5052 │ │ JARED :5052 │ │ API pública │ │ │ │ producción :5052 │ │ producción :5052 │ │ API pública │ │
│ │ │ │ MASON :5053 │ │ Directus :8055 │ │ │ │ admin.vo :5053 │ │ admin.vo :5053 │ │ Directus :8055 │ │
│ │ Mailcow │ │ FELDMAN :5054 │ │ │ │ │ │ contable :5054 │ │ contable :5054 │ │ │ │
│ │ Vaultwarden │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ Directus │ │ Odoo │ │ │ │ │ │ Vaultwarden │ │ Odoo │ │ │ │
│ └───────────────────┘ │ Nextcloud │ └───────────────────┘ │ │ └───────────────────┘ │ Nextcloud │ └───────────────────┘ │
│ │ └───────────────────┘ │ │ │ │ └───────────────────┘ │ │
│ │ │ │ │ │ │ │ │ │
@@ -78,40 +91,40 @@ PACKET (App móvil)
┌─────────────────────────────────────────┐ ┌─────────────────────────────────────────┐
CLARA (DECK) / MARGARET (CORP) │ secretaria (CLARA / MARGARET)
│ │ │ │
│ 1. Validar h_instancia │ │ 1. Validar h_instancia │
│ 2. Calcular h_entrada (SHA-256) │ │ 2. Calcular h_entrada (SHA-256) │
│ 3. Subir archivos a R2 │ │ 3. Subir archivos a R2 │
│ 4. Insertar en clara_log/margaret_log │ 4. Insertar en log
│ 5. Estado: 'recibido' (inmutable) │ │ 5. Estado: 'recibido' (inmutable) │
└─────────────────────────────────────────┘ └─────────────────────────────────────────┘
┌─────────────────────────────────────────┐ ┌─────────────────────────────────────────┐
ALFRED (DECK) / JARED (CORP) producción (ALFRED / JARED)
│ │ │ │
│ 1. Aplicar flujos predefinidos │ 1. Definir orden de ejecución
│ 2. Ejecutar reglas automáticas │ │ 2. Aplicar flujos predefinidos │
│ 3. Enviar a MASON si requiere mejora │ 3. Enviar a administrativo
└─────────────────────────────────────────┘ └─────────────────────────────────────────┘
┌─────────────────────────────────────────┐ ┌─────────────────────────────────────────┐
MASON administrativo (MASON)
│ │ │ │
│ 1. Recibir de ALFRED/JARED │ 1. Recibir de producción
│ 2. Ventana flotante 24h │ │ 2. Ventana flotante 24h │
│ 3. Usuario enriquece datos │ │ 3. Usuario enriquece datos │
│ 4. [Futuro] GRACE extrae información │ │ 4. [Futuro] GRACE extrae información │
│ 5. Enviar a FELDMAN cuando listo │ 5. Enviar a contable cuando listo │
└─────────────────────────────────────────┘ └─────────────────────────────────────────┘
┌─────────────────────────────────────────┐ ┌─────────────────────────────────────────┐
FELDMAN contable (FELDMAN)
│ │ │ │
│ 1. Recibir en feldman_cola │ 1. Recibir en cola
│ 2. Validar reglas (M-001, M-002, M-003)│ │ 2. Validar reglas (M-001, M-002, M-003)│
│ 3. Crear milestone o bloque │ │ 3. Crear milestone o bloque │
│ 4. Calcular hash_contenido │ │ 4. Calcular hash_contenido │
@@ -121,7 +134,7 @@ PACKET (App móvil)
┌─────────────────────────────────────────┐ ┌─────────────────────────────────────────┐
│ SENTINEL (planificado) auditoría (SENTINEL) [planificado]
│ │ │ │
│ LIGHT: Cada 5 min, reglas automáticas │ │ LIGHT: Cada 5 min, reglas automáticas │
│ DEEP: Cada 1 hora, muestreo con LLM │ │ DEEP: Cada 1 hora, muestreo con LLM │

View File

@@ -1,19 +1,22 @@
# CLARA y MARGARET - Agentes de Ingesta # secretaria (CLARA / MARGARET)
**Componente:** Ingesta
**Versión:** 5.0 **Versión:** 5.0
**Fecha:** 2024-12-24 **Fecha:** 2024-12-24
> **Nota:** Este es un microservicio backend, no IA.
--- ---
## Resumen ## Resumen
| Aspecto | CLARA | MARGARET | | Aspecto | secretaria (CLARA) | secretaria (MARGARET) |
|---------|-------|----------| |---------|-------|----------|
| Servidor | DECK (72.62.1.113) | CORP (92.112.181.188) | | Servidor | DECK (72.62.1.113) | CORP (92.112.181.188) |
| Puerto | 5051 | 5051 | | Puerto | 5051 | 5051 |
| Dominio | Personal | Empresarial | | Dominio | Personal | Empresarial |
| Base de datos | tzzr | corp | | Base de datos | tzzr | corp |
| Tabla log | clara_log | margaret_log | | Tabla log | secretaria_log | secretaria_log |
| Bucket R2 | deck | corp | | Bucket R2 | deck | corp |
| Estado | Operativo | Operativo | | Estado | Operativo | Operativo |
@@ -30,7 +33,7 @@ PACKET (App móvil)
┌─────────────────────────────────────────┐ ┌─────────────────────────────────────────┐
CLARA (Personal) / MARGARET (Corp) secretaria (CLARA / MARGARET)
│ │ │ │
│ 1. Validar h_instancia │ │ 1. Validar h_instancia │
│ 2. Calcular h_entrada (SHA-256) │ │ 2. Calcular h_entrada (SHA-256) │
@@ -41,7 +44,7 @@ PACKET (App móvil)
└─────────────────────────────────────────┘ └─────────────────────────────────────────┘
ALFRED / JARED (siguiente paso) producción (ALFRED / JARED)
``` ```
--- ---

View File

@@ -1,34 +1,37 @@
# FELDMAN - Agente de Consolidación # contable (FELDMAN)
**Componente:** Consolidación
**Versión:** 5.0 **Versión:** 5.0
**Fecha:** 2024-12-24 **Fecha:** 2024-12-24
> **Nota:** Este es un microservicio backend, no IA.
--- ---
## Resumen ## Resumen
| Aspecto | Valor | | Aspecto | Valor |
|---------|-------| |---------|-------|
| Servidor | CORP (92.112.181.188) | | Servidor | DECK y CORP |
| Puerto | 5054 | | Puerto | 5054 |
| Base de datos | corp | | Base de datos | tzzr / corp |
| Tablas | feldman_cola, feldman_bloques, feldman_validaciones | | Tablas | contable_cola, contable_bloques, contable_validaciones |
| Estado | Operativo | | Estado | Operativo |
--- ---
## Rol en el Sistema ## Rol en el Sistema
FELDMAN es el "notario" del sistema: valida y consolida datos en bloques inmutables. contable (FELDMAN) es el "notario" del sistema: valida y consolida datos en bloques inmutables.
``` ```
MASON (enriquecido) administrativo (MASON)
┌─────────────────────────────────────────┐ ┌─────────────────────────────────────────┐
FELDMAN contable (FELDMAN)
│ │ │ │
│ 1. Recibir en feldman_cola │ 1. Recibir en cola
│ 2. Validar reglas (M-001, M-002, M-003)│ │ 2. Validar reglas (M-001, M-002, M-003)│
│ 3. Calcular hash_contenido │ │ 3. Calcular hash_contenido │
│ 4. Encadenar (hash_previo) │ │ 4. Encadenar (hash_previo) │
@@ -42,7 +45,7 @@ MASON (enriquecido)
└─────────────────────────────────────────┘ └─────────────────────────────────────────┘
SENTINEL (auditoría futura) auditoría (SENTINEL) [planificado]
``` ```
--- ---

View File

@@ -5,205 +5,266 @@
--- ---
## Estado Actual: Triple Gestión ## Arquitectura de Secretos
**PROBLEMA CRÍTICO:** Actualmente existen tres fuentes de secretos sin sincronización. ### Principio Fundamental
> **DECK y CORP son instancias autónomas. Deben operar independientemente de ARCHITECT.**
ARCHITECT es el constructor/coordinador. DECK y CORP son instancias diseñadas para trabajar solas.
### Modelo de Gestión
``` ```
┌─────────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────────────────────┐
FUENTES DE SECRETOS ARCHITECT
│ (Constructor) │
│ │ │ │
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌──────────────┐
Infisical creds_* .env │ │ Infisical │ ← Gestión centralizada
│ (central) (PostgreSQL)│ │ (archivos) │ :8082 │ Single source of truth
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
│ │
│ ▼ ▼ ▼ │ └───────────────────────────┼─────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
❌ SIN SINCRONIZACIÓN - Riesgo de inconsistencia │ │ sync/push (en deploy o periódico)
└─────────────────────────────────────────────────────────┘
─────────────────────────────────────────────────────────────────┘ ────────────────────────────────
▼ ▼
┌──────────────────────┐ ┌──────────────────────┐
│ DECK │ │ CORP │
│ (Instancia) │ │ (Instancia) │
│ │ │ │
│ ┌──────────────┐ │ │ ┌──────────────┐ │
│ │ Vaultwarden │ │ │ │ Vaultwarden │ │
│ │ :8085 │ │ │ │ :8081 │ │
│ └──────┬───────┘ │ │ └──────┬───────┘ │
│ │ │ │ │ │
│ ▼ │ │ ▼ │
│ CLARA, ALFRED │ │ MARGARET, JARED │
│ leen de aquí │ │ MASON, FELDMAN │
│ │ │ leen de aquí │
└──────────────────────┘ └──────────────────────┘
```
### Gestores por Servidor
| Servidor | Gestor | Puerto | Rol |
|----------|--------|--------|-----|
| ARCHITECT | Infisical | 8082 | Gestión central, source of truth |
| DECK | Vaultwarden | 8085 | Operación autónoma DECK |
| CORP | Vaultwarden | 8081 | Operación autónoma CORP |
---
## Flujo de Secretos
### Administración (en ARCHITECT)
```
Administrador
┌─────────────┐
│ Infisical │ ← Crear/modificar/rotar secretos aquí
│ (central) │
└─────────────┘
```
### Sincronización (ARCHITECT → Instancias)
```
Infisical (ARCHITECT)
│ Script de sync / deploy
├────────────────┬────────────────┐
▼ ▼ ▼
Vaultwarden Vaultwarden (otras instancias
DECK CORP futuras)
```
### Operación (en cada instancia)
```
┌──────────────────────────────────────┐
│ DECK │
│ │
│ CLARA ──────► Vaultwarden ◄─────── ALFRED
│ :8085 │
│ │
│ ✅ No depende de ARCHITECT │
│ ✅ Opera si ARCHITECT está caído │
└──────────────────────────────────────┘
``` ```
--- ---
## Fuente 1: Infisical ## Estado Actual: Problema
**URL:** http://localhost:8082 (ARCHITECT) **Triple gestión sin sincronización:**
**Estado:** Operativo
### Configuración | Fuente | Ubicación | Estado |
|--------|-----------|--------|
| Infisical | ARCHITECT :8082 | Parcialmente usado |
| creds_* | PostgreSQL ARCHITECT | Activo |
| .env | /opt/*/.env en cada servidor | Activo, **permisos 644** |
```bash **Problemas:**
# Acceso a Infisical - Secretos duplicados en múltiples lugares
infisical login - Sin sincronización entre fuentes
infisical secrets --env=prod - .env legibles por todos (644)
``` - Vaultwarden de DECK/CORP no integrados
### Ventajas
- Centralizado
- Versionado
- Auditable
- SDK para múltiples lenguajes
### Uso Actual
- Parcial - no todos los servicios lo usan
--- ---
## Fuente 2: Tablas creds_* (PostgreSQL) ## Decisión D-001: Arquitectura de Secretos
**Base de datos:** architect
**Estado:** Activo
### Tablas
| Tabla | Contenido |
|-------|-----------|
| creds_ia | APIs de IA (OpenAI, Anthropic, etc.) |
| creds_runpod | API keys de RunPod |
| creds_r2 | Credenciales Cloudflare R2 |
| creds_gitea | Tokens Gitea |
| creds_mail | Credenciales SMTP |
| creds_apis | APIs externas varias |
### Schema Típico
```sql
CREATE TABLE creds_ia (
id SERIAL PRIMARY KEY,
servicio VARCHAR(50) NOT NULL,
api_key TEXT NOT NULL,
descripcion TEXT,
activo BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
```
### Acceso
```sql
-- Consultar credenciales
sudo -u postgres psql -d architect -c "SELECT servicio, descripcion FROM creds_ia;"
```
---
## Fuente 3: Archivos .env
**Ubicaciones:**
- /opt/clara/.env
- /opt/alfred/.env
- /opt/margaret/.env
- /opt/mason/.env
- /opt/feldman/.env
### ALERTA CRÍTICA
```
Permisos actuales: 644 (legibles por todos)
Permisos correctos: 600 (solo propietario)
```
### Contenido Típico
```bash
# Ejemplo .env
DB_HOST=localhost
DB_PORT=5432
DB_NAME=corp
DB_USER=margaret
DB_PASSWORD=secreto_aqui # ⚠️ Expuesto si 644
R2_ACCESS_KEY=access_key_aqui
R2_SECRET_KEY=secret_key_aqui # ⚠️ Expuesto si 644
```
---
## Decisión D-001: Migración a Infisical
### Objetivo ### Objetivo
Infisical como **única fuente de verdad** para todos los secretos.
### Plan de Migración 1. **Infisical** (ARCHITECT): Única fuente de verdad para administración
2. **Vaultwarden** (DECK/CORP): Gestores locales para operación autónoma
3. **Sync**: Mecanismo de propagación Infisical → Vaultwarden
### División de Responsabilidades
| Tipo de Secreto | Gestión en | Operación en |
|-----------------|------------|--------------|
| API keys externas (OpenAI, etc.) | Infisical | Vaultwarden local |
| R2 credentials | Infisical | Vaultwarden local |
| Gitea tokens | Infisical | Vaultwarden local |
| DB password DECK | Infisical | Vaultwarden DECK |
| DB password CORP | Infisical | Vaultwarden CORP |
| Tokens internos DECK | Infisical | Vaultwarden DECK |
| Tokens internos CORP | Infisical | Vaultwarden CORP |
### Flujo de Trabajo
``` ```
Fase 1: Inventario 1. Admin modifica secreto en Infisical (ARCHITECT)
├── Catalogar todos los secretos en creds_*
├── Catalogar todos los secretos en .env
└── Identificar duplicados/inconsistencias 2. Script de sync detecta cambio
Fase 2: Centralización
├── Migrar todos los secretos a Infisical 3. Propaga a Vaultwarden de DECK y/o CORP
├── Organizar por proyecto/ambiente
└── Establecer políticas de acceso
4. Servicios locales usan Vaultwarden local
Fase 3: Actualización de Servicios
├── CLARA: Usar Infisical SDK
├── MARGARET: Usar Infisical SDK 5. ARCHITECT puede caer → DECK/CORP siguen operando
├── MASON: Usar Infisical SDK
├── FELDMAN: Usar Infisical SDK
└── ALFRED/JARED: Usar Infisical SDK
Fase 4: Deprecación
├── Eliminar archivos .env
├── Marcar creds_* como "solo referencia"
└── Documentar proceso de rotación
```
### Implementación con SDK
```python
from infisical_client import InfisicalClient
client = InfisicalClient(
host="http://localhost:8082",
token=INFISICAL_TOKEN
)
# Obtener secreto
db_password = client.get_secret(
secret_name="DB_PASSWORD",
project_id="tzzr",
environment="production"
)
``` ```
--- ---
## Rotación de Secretos ## Plan de Migración
### Política Propuesta ### Fase 1: Inventario
| Tipo | Frecuencia | Responsable |
|------|------------|-------------|
| API Keys externas | 90 días | Orchestrator |
| Contraseñas DB | 180 días | DBA |
| SSH Keys | 365 días | SysAdmin |
| Tokens Gitea | 180 días | DevOps |
### Proceso de Rotación
``` ```
1. Generar nuevo secreto ├── Catalogar todos los secretos en creds_*
2. Actualizar en Infisical ├── Catalogar todos los secretos en .env
3. Desplegar servicios afectados ├── Identificar duplicados/inconsistencias
4. Verificar funcionamiento └── Mapear qué secretos necesita cada instancia
5. Revocar secreto anterior ```
6. Documentar en changelog
### Fase 2: Centralización en Infisical
```
├── Migrar todos los secretos a Infisical
├── Organizar por instancia (DECK, CORP)
├── Establecer políticas de acceso
└── Documentar cada secreto
```
### Fase 3: Configurar Vaultwarden en Instancias
```
├── DECK: Configurar Vaultwarden :8085
│ ├── Crear organización "DECK"
│ ├── Importar secretos de DECK desde Infisical
│ └── Configurar acceso para servicios
└── CORP: Configurar Vaultwarden :8081
├── Crear organización "CORP"
├── Importar secretos de CORP desde Infisical
└── Configurar acceso para servicios
```
### Fase 4: Implementar Sync
```
├── Crear script de sincronización
│ └── infisical export → vaultwarden import
├── Configurar trigger (manual, cron, o webhook)
└── Probar sync en ambas direcciones
```
### Fase 5: Actualizar Servicios
```
├── CLARA: Leer de Vaultwarden DECK
├── ALFRED: Leer de Vaultwarden DECK
├── MARGARET: Leer de Vaultwarden CORP
├── JARED: Leer de Vaultwarden CORP
├── MASON: Leer de Vaultwarden CORP
└── FELDMAN: Leer de Vaultwarden CORP
```
### Fase 6: Deprecación
```
├── Eliminar archivos .env
├── Marcar creds_* como "solo referencia histórica"
└── Documentar proceso completo
```
---
## Implementación
### Lectura desde Vaultwarden (Python)
```python
import requests
VAULTWARDEN_URL = "http://localhost:8085" # DECK
# VAULTWARDEN_URL = "http://localhost:8081" # CORP
def get_secret(name: str) -> str:
"""Obtiene secreto de Vaultwarden local."""
# Implementar según API de Vaultwarden/Bitwarden
pass
```
### Script de Sync (Infisical → Vaultwarden)
```bash
#!/bin/bash
# /opt/scripts/sync_secrets.sh
# Exportar desde Infisical
infisical export --env=deck --format=json > /tmp/deck_secrets.json
infisical export --env=corp --format=json > /tmp/corp_secrets.json
# Importar a Vaultwarden DECK
ssh deck 'bw import --format json /tmp/deck_secrets.json'
# Importar a Vaultwarden CORP
ssh corp 'bw import --format json /tmp/corp_secrets.json'
# Cleanup
rm /tmp/*_secrets.json
``` ```
--- ---
## Mitigación Inmediata ## Mitigación Inmediata
### Paso 1: Permisos .env ### Paso 1: Permisos .env (URGENTE)
```bash ```bash
# Ejecutar en todos los servidores
# DECK # DECK
ssh -i ~/.ssh/tzzr root@72.62.1.113 'chmod 600 /opt/clara/.env /opt/alfred/.env' ssh -i ~/.ssh/tzzr root@72.62.1.113 'chmod 600 /opt/clara/.env /opt/alfred/.env'
@@ -211,82 +272,73 @@ ssh -i ~/.ssh/tzzr root@72.62.1.113 'chmod 600 /opt/clara/.env /opt/alfred/.env'
ssh -i ~/.ssh/tzzr root@92.112.181.188 'chmod 600 /opt/margaret/.env /opt/mason/.env /opt/feldman/.env' ssh -i ~/.ssh/tzzr root@92.112.181.188 'chmod 600 /opt/margaret/.env /opt/mason/.env /opt/feldman/.env'
``` ```
### Paso 2: Auditoría ### Paso 2: Verificar Vaultwarden
```bash ```bash
# Verificar permisos # DECK
ls -la /opt/*/.env curl -s http://72.62.1.113:8085/api/health
# Buscar secretos expuestos # CORP
grep -r "password\|secret\|key" /opt/*/ 2>/dev/null curl -s http://92.112.181.188:8081/api/health
``` ```
--- ---
## Inventario de Secretos ## Rotación de Secretos
### APIs de IA ### Política
| Servicio | Ubicación Actual | Notas | | Tipo | Frecuencia | Responsable |
|----------|------------------|-------| |------|------------|-------------|
| OpenAI | creds_ia | GPT-4 | | API Keys externas | 90 días | Admin vía Infisical |
| Anthropic | creds_ia | Claude | | Contraseñas DB | 180 días | Admin vía Infisical |
| Replicate | creds_ia | Modelos varios | | SSH Keys | 365 días | Admin vía Infisical |
| RunPod | creds_runpod | GRACE, PENNY, FACTORY | | Tokens Gitea | 180 días | Admin vía Infisical |
### Infraestructura ### Proceso
| Servicio | Ubicación Actual | Notas | ```
|----------|------------------|-------| 1. Rotar en Infisical (ARCHITECT)
| PostgreSQL | .env + creds_* | Múltiples usuarios | 2. Ejecutar sync a Vaultwarden (DECK/CORP)
| R2/Cloudflare | .env + creds_r2 | Access + Secret key | 3. Verificar servicios operando
| Gitea | .env + creds_gitea | Read + Write tokens | 4. Documentar rotación
| SMTP | creds_mail | Mailcow |
### Servicios Externos
| Servicio | Ubicación Actual | Notas |
|----------|------------------|-------|
| Stripe | creds_apis | (si aplica) |
| Twilio | creds_apis | (si aplica) |
| AWS | creds_apis | (si aplica) |
---
## Verificación de Seguridad
### Checklist Diario
- [ ] Permisos .env son 600
- [ ] No hay secretos en logs
- [ ] No hay secretos en commits git
- [ ] Infisical accesible
### Comandos de Verificación
```bash
# Verificar permisos
find /opt -name ".env" -exec ls -la {} \;
# Buscar secretos en git history
git log -p | grep -i "password\|secret\|key\|token"
# Verificar Infisical
curl -s http://localhost:8082/api/v1/health
``` ```
--- ---
## Buenas Prácticas ## Verificación
### DO (Hacer) ### Checklist
- Usar Infisical para todos los secretos nuevos
- Rotar secretos según política
- Auditar accesos regularmente
- Cifrar secretos en reposo
### DON'T (No Hacer) - [ ] Infisical operativo en ARCHITECT
- Hardcodear secretos en código - [ ] Vaultwarden operativo en DECK (:8085)
- Commitear .env a repositorios - [ ] Vaultwarden operativo en CORP (:8081)
- Compartir secretos por chat/email - [ ] Sync configurado y probado
- Usar el mismo secreto en múltiples servicios - [ ] Servicios leen de Vaultwarden local
- [ ] .env eliminados o con permisos 600
- [ ] DECK opera si ARCHITECT cae
- [ ] CORP opera si ARCHITECT cae
### Test de Autonomía
```bash
# 1. Detener ARCHITECT (simulado)
# 2. Verificar DECK sigue operando
curl http://72.62.1.113:5051/health # CLARA
# 3. Verificar CORP sigue operando
curl http://92.112.181.188:5051/health # MARGARET
```
---
## Resumen
| Componente | Rol |
|------------|-----|
| **Infisical (ARCHITECT)** | Gestión centralizada, source of truth |
| **Vaultwarden (DECK)** | Operación autónoma instancia personal |
| **Vaultwarden (CORP)** | Operación autónoma instancia empresarial |
| **Sync** | Propagación de cambios |
**Principio clave:** Las instancias (DECK, CORP) nunca dependen de ARCHITECT en runtime.

View File

@@ -5,6 +5,15 @@
--- ---
## Principio Fundamental
> **Cada instancia es responsable de su propio backup.**
DECK y CORP son instancias autónomas. No dependen de ARCHITECT para hacer backups.
Cada servidor ejecuta su script de backup localmente y sube directamente a R2.
---
## Estado Actual ## Estado Actual
### Backups Existentes ### Backups Existentes
@@ -20,94 +29,144 @@
--- ---
## Plan de Backup Propuesto ## Arquitectura de Backups
### PostgreSQL - Backup Diario
```bash
#!/bin/bash
# /opt/scripts/backup_postgres.sh
set -e
DATE=$(date +%F)
BACKUP_DIR="/tmp/pg_backup"
# Cargar credenciales R2
source /home/orchestrator/orchestrator/.env
export AWS_ACCESS_KEY_ID="$R2_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="$R2_SECRET_KEY"
R2_ENDPOINT="https://7dedae6030f5554d99d37e98a5232996.r2.cloudflarestorage.com"
mkdir -p $BACKUP_DIR
# Backup ARCHITECT
echo "Backing up ARCHITECT..."
sudo -u postgres pg_dump architect | gzip > $BACKUP_DIR/architect_$DATE.sql.gz
aws s3 cp $BACKUP_DIR/architect_$DATE.sql.gz s3://architect/backups/postgres/ \
--endpoint-url $R2_ENDPOINT
# Cleanup local
rm -rf $BACKUP_DIR
echo "Backup completado: $DATE"
``` ```
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
### Cron Configuration │ ARCHITECT │ │ DECK │ │ CORP │
│ │ │ │ │ │
```bash │ backup.sh ───┼────►│ backup.sh ───┼────►│ backup.sh ───┼────► R2
# /etc/cron.d/tzzr-backup │ (local) │ │ (local) │ │ (local) │
# Backup diario a las 3:00 AM └──────────────┘ └──────────────┘ └──────────────┘
0 3 * * * orchestrator /opt/scripts/backup_postgres.sh >> /var/log/tzzr-backup.log 2>&1 │ │
▼ ▼
Sin dependencia Sin dependencia
de ARCHITECT de ARCHITECT
``` ```
--- ---
## Backup por Servidor ## Backup por Servidor (LOCAL)
### ARCHITECT (69.62.126.110) ### ARCHITECT (69.62.126.110)
**Ubicación script:** `/opt/scripts/backup_postgres.sh`
```bash ```bash
# Base de datos: architect #!/bin/bash
sudo -u postgres pg_dump architect | gzip > architect_$(date +%F).sql.gz # Ejecutar EN ARCHITECT - backup local
set -e
DATE=$(date +%F)
# Credenciales R2 (desde Vaultwarden local o .env)
source /opt/architect/.env
export AWS_ACCESS_KEY_ID="$R2_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="$R2_SECRET_KEY"
R2_ENDPOINT="https://7dedae6030f5554d99d37e98a5232996.r2.cloudflarestorage.com"
# Backup local
sudo -u postgres pg_dump architect | gzip > /tmp/architect_$DATE.sql.gz
# Subir a R2 # Subir a R2
aws s3 cp architect_$(date +%F).sql.gz s3://architect/backups/postgres/ \ aws s3 cp /tmp/architect_$DATE.sql.gz s3://architect/backups/postgres/ \
--endpoint-url $R2_ENDPOINT --endpoint-url $R2_ENDPOINT
rm /tmp/architect_$DATE.sql.gz
echo "ARCHITECT backup completado: $DATE"
``` ```
### DECK (72.62.1.113) ### DECK (72.62.1.113)
```bash **Ubicación script:** `/opt/scripts/backup_postgres.sh`
# Base de datos: tzzr
ssh deck 'sudo -u postgres pg_dump tzzr | gzip' > deck_tzzr_$(date +%F).sql.gz
# Subir a R2 ```bash
aws s3 cp deck_tzzr_$(date +%F).sql.gz s3://architect/backups/deck/ \ #!/bin/bash
# Ejecutar EN DECK - backup local (NO depende de ARCHITECT)
set -e
DATE=$(date +%F)
# Credenciales R2 (desde Vaultwarden DECK)
source /opt/deck/.env
export AWS_ACCESS_KEY_ID="$R2_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="$R2_SECRET_KEY"
R2_ENDPOINT="https://7dedae6030f5554d99d37e98a5232996.r2.cloudflarestorage.com"
# Backup local
sudo -u postgres pg_dump tzzr | gzip > /tmp/deck_tzzr_$DATE.sql.gz
# Subir a R2 (bucket propio de DECK)
aws s3 cp /tmp/deck_tzzr_$DATE.sql.gz s3://deck/backups/postgres/ \
--endpoint-url $R2_ENDPOINT --endpoint-url $R2_ENDPOINT
rm /tmp/deck_tzzr_$DATE.sql.gz
echo "DECK backup completado: $DATE"
``` ```
### CORP (92.112.181.188) ### CORP (92.112.181.188)
```bash **Ubicación script:** `/opt/scripts/backup_postgres.sh`
# Base de datos: corp
ssh corp 'sudo -u postgres pg_dump corp | gzip' > corp_$(date +%F).sql.gz
# Subir a R2 ```bash
aws s3 cp corp_$(date +%F).sql.gz s3://architect/backups/corp/ \ #!/bin/bash
# Ejecutar EN CORP - backup local (NO depende de ARCHITECT)
set -e
DATE=$(date +%F)
# Credenciales R2 (desde Vaultwarden CORP)
source /opt/corp/.env
export AWS_ACCESS_KEY_ID="$R2_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="$R2_SECRET_KEY"
R2_ENDPOINT="https://7dedae6030f5554d99d37e98a5232996.r2.cloudflarestorage.com"
# Backup local
sudo -u postgres pg_dump corp | gzip > /tmp/corp_$DATE.sql.gz
# Subir a R2 (bucket propio de CORP)
aws s3 cp /tmp/corp_$DATE.sql.gz s3://corp/backups/postgres/ \
--endpoint-url $R2_ENDPOINT --endpoint-url $R2_ENDPOINT
rm /tmp/corp_$DATE.sql.gz
echo "CORP backup completado: $DATE"
``` ```
### HST (72.62.2.84) ### HST (72.62.2.84)
```bash **Ubicación script:** `/opt/scripts/backup_postgres.sh`
# Base de datos: hst_images
ssh hst 'sudo -u postgres pg_dump hst_images | gzip' > hst_$(date +%F).sql.gz
# Subir a R2 ```bash
aws s3 cp hst_$(date +%F).sql.gz s3://architect/backups/hst/ \ #!/bin/bash
# Ejecutar EN HST - backup local
set -e
DATE=$(date +%F)
source /opt/hst/.env
export AWS_ACCESS_KEY_ID="$R2_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="$R2_SECRET_KEY"
R2_ENDPOINT="https://7dedae6030f5554d99d37e98a5232996.r2.cloudflarestorage.com"
sudo -u postgres pg_dump hst_images | gzip > /tmp/hst_$DATE.sql.gz
aws s3 cp /tmp/hst_$DATE.sql.gz s3://hst/backups/postgres/ \
--endpoint-url $R2_ENDPOINT --endpoint-url $R2_ENDPOINT
rm /tmp/hst_$DATE.sql.gz
echo "HST backup completado: $DATE"
```
---
## Cron en Cada Servidor
Cada instancia configura su propio cron:
```bash
# /etc/cron.d/tzzr-backup (en cada servidor)
# Backup diario a las 3:00 AM
0 3 * * * root /opt/scripts/backup_postgres.sh >> /var/log/backup.log 2>&1
``` ```
--- ---
@@ -157,26 +216,30 @@ docker exec gitea rm /tmp/gitea-dump-$DATE.zip
## Estructura de Backups en R2 ## Estructura de Backups en R2
Cada instancia usa su propio bucket:
``` ```
s3://architect/backups/ s3://architect/backups/
├── postgres/ ├── postgres/
── architect_2024-12-24.sql.gz ── architect_2024-12-24.sql.gz
│ ├── architect_2024-12-23.sql.gz
│ └── ...
├── deck/
│ ├── deck_tzzr_2024-12-24.sql.gz
│ └── ...
├── corp/
│ ├── corp_2024-12-24.sql.gz
│ └── ...
├── hst/
│ ├── hst_2024-12-24.sql.gz
│ └── ...
└── gitea/ └── gitea/
── gitea-dump-2024-12-24_0300.zip ── gitea-dump-2024-12-24_0300.zip
└── ...
s3://deck/backups/
└── postgres/
└── deck_tzzr_2024-12-24.sql.gz
s3://corp/backups/
└── postgres/
└── corp_2024-12-24.sql.gz
s3://hst/backups/
└── postgres/
└── hst_2024-12-24.sql.gz
``` ```
> **Nota:** Cada instancia es dueña de sus backups. No hay dependencia cruzada.
--- ---
## Retención de Backups ## Retención de Backups

View File

@@ -8,7 +8,7 @@
## Qué es TZZR ## Qué es TZZR
TZZR es un sistema de construcción de arquitecturas personales y empresariales mediante instancias Claude. Los agentes IA actúan como constructores que diseñan y edifican servidores clonables e independientes. TZZR es un sistema de arquitecturas personales y empresariales. ARCHITECT (con Claude) construye y despliega servidores autónomos (DECK, CORP) que operan independientemente. Los componentes internos (CLARA, ALFRED, FELDMAN, etc.) son microservicios backend, no IA. Las instancias están diseñadas para **consumir** servicios de IA externos (APIs, RunPod), no para contenerla.
--- ---
@@ -25,9 +25,10 @@ TZZR es un sistema de construcción de arquitecturas personales y empresariales
│ DECK │ │ CORP │ │ HST │ │ DECK │ │ CORP │ │ HST │
│ 72.62.1.113 │ │ 92.112.181.188 │ │ 72.62.2.84 │ │ 72.62.1.113 │ │ 92.112.181.188 │ │ 72.62.2.84 │
│ │ │ │ │ │ │ │ │ │ │ │
CLARA, ALFRED │ │ MARGARET, JARED │ │ 973 tags │ secretaria │ │ secretaria │ │ 973 tags │
Servidor │ │ MASON, FELDMAN │ │ API pública │ administrativo │ │ administrativo │ │ API pública │
Personal │ │ Empresarial │ │ │ contable │ │ contable │ │ │
│ producción │ │ producción │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │ │
└────────┬───────────┘ └────────┬───────────┘
@@ -45,15 +46,15 @@ TZZR es un sistema de construcción de arquitecturas personales y empresariales
``` ```
PACKET (móvil) PACKET (móvil)
CLARA (DECK) / MARGARET (CORP) ← Ingesta inmutable secretaria (CLARA/MARGARET) ← Ingesta inmutable
ALFRED / JARED ← Flujos predefinidos producción (ALFRED/JARED) ← Orden de ejecución
MASON ← Enriquecimiento (24h) administrativo (MASON) ← Enriquecimiento (24h)
FELDMAN ← Consolidación blockchain contable (FELDMAN) ← Consolidación blockchain
SENTINEL Auditoría (planificado) auditoría (SENTINEL)Planificado
``` ```
--- ---
@@ -95,18 +96,19 @@ SENTINEL ← Auditoría (planificado)
## Estado Actual ## Estado Actual
| Componente | Estado | Notas | | Componente | Nombre | Servidor | Estado |
|------------|--------|-------| |------------|--------|----------|--------|
| CLARA | Operativo | DECK:5051 | | secretaria | CLARA | DECK:5051 | Operativo |
| MARGARET | Operativo | CORP:5051 | | secretaria | MARGARET | CORP:5051 | Operativo |
| ALFRED | Operativo | DECK:5052 | | producción | ALFRED | DECK:5052 | Operativo |
| JARED | Operativo | CORP:5052 | | producción | JARED | CORP:5052 | Operativo |
| MASON | Operativo | CORP:5053 | | administrativo | MASON | DECK:5053 | Operativo |
| FELDMAN | Operativo | CORP:5054 | | administrativo | MASON | CORP:5053 | Operativo |
| HST | Operativo | 973 tags | | contable | FELDMAN | DECK:5054 | Operativo |
| SENTINEL | Planificado | Sin implementar | | contable | FELDMAN | CORP:5054 | Operativo |
| GRACE | Bloqueado | RunPod no inicia | | auditoría | SENTINEL | - | Planificado |
| NOTARIO | Planificado | Sin implementar | | GPU | GRACE | RunPod | Bloqueado |
| - | HST | 72.62.2.84 | Operativo (973 tags) |
--- ---