# Architektur Diese Seite beschreibt die technische Architektur des Customer Installer Systems. ## πŸ“ System-Übersicht ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Proxmox VE Host β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ LXC Container (Debian 12) β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ β”‚ Docker Compose Stack β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ PostgreSQL β”‚ β”‚ PostgREST β”‚ β”‚ n8n β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ + pgvector │◄── (REST API) │◄── Workflowβ”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Engine β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Docker Network β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ (customer-net) β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ β”‚ β”‚ Systemd Services β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - docker.service β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ - n8n-workflow-reload.service β”‚ β”‚ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ NGINX Reverse Proxy (OPNsense) β”‚ β”‚ β”‚ β”‚ https://sb-.userman.de β†’ http://:5678 β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β–Ό β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Ollama Server β”‚ β”‚ (External Host) β”‚ β”‚ Port: 11434 β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ## πŸ—οΈ Komponenten-Architektur ### 1. Proxmox LXC Container **Technologie:** Linux Container (LXC) **OS:** Debian 12 (Bookworm) **Typ:** Unprivileged (Standard) oder Privileged (optional) **Ressourcen:** - CPU: Unlimited (konfigurierbar) - RAM: 4096 MB (Standard) - Swap: 512 MB - Disk: 50 GB (Standard) - Netzwerk: Bridge mit VLAN-Support **Features:** - Automatische CTID-Generierung (customer-safe) - DHCP oder statische IP - VLAN-Tagging - APT-Proxy-Support ### 2. Docker Stack **Technologie:** Docker Compose v2 **Netzwerk:** Bridge Network (customer-net) **Volumes:** Named Volumes fΓΌr Persistenz #### 2.1 PostgreSQL Container **Image:** `postgres:16-alpine` **Name:** `customer-postgres` **Port:** 5432 (intern) **Features:** - pgvector Extension (v0.5.1) - Automatische Datenbank-Initialisierung - Persistente Daten via Volume - Health Checks **Datenbank-Schema:** ```sql -- documents Tabelle fΓΌr RAG CREATE TABLE documents ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), content TEXT NOT NULL, metadata JSONB, embedding vector(384), -- nomic-embed-text Dimension created_at TIMESTAMPTZ DEFAULT NOW() ); -- Index fΓΌr Vektor-Suche CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops); -- RPC-Funktion fΓΌr Similarity Search CREATE FUNCTION match_documents( query_embedding vector(384), match_count int DEFAULT 5 ) RETURNS TABLE ( id UUID, content TEXT, metadata JSONB, similarity FLOAT ) AS $$ SELECT id, content, metadata, 1 - (embedding <=> query_embedding) AS similarity FROM documents ORDER BY embedding <=> query_embedding LIMIT match_count; $$ LANGUAGE sql STABLE; ``` #### 2.2 PostgREST Container **Image:** `postgrest/postgrest:v12.0.2` **Name:** `customer-postgrest` **Port:** 3000 (extern + intern) **Features:** - Supabase-kompatible REST API - JWT-basierte Authentikation - Automatische OpenAPI-Dokumentation - RPC-Funktionen-Support **Endpoints:** - `GET /documents` - Dokumente abrufen - `POST /documents` - Dokument erstellen - `POST /rpc/match_documents` - Vektor-Suche **Authentication:** - `anon` Role: Lesezugriff - `service_role`: Voller Zugriff #### 2.3 n8n Container **Image:** `n8nio/n8n:latest` **Name:** `n8n` **Port:** 5678 (extern + intern) **Features:** - PostgreSQL als Backend - Workflow-Automation - Webhook-Support - Credentials-Management - Execution-History **Workflows:** - RAG KI-Bot (Chat-Interface) - Document Upload (Form) - Vector Embedding (Ollama) - Similarity Search (PostgreSQL) **Environment:** ```bash DB_TYPE=postgresdb DB_POSTGRESDB_HOST=postgres DB_POSTGRESDB_PORT=5432 DB_POSTGRESDB_DATABASE=customer DB_POSTGRESDB_USER=customer DB_POSTGRESDB_PASSWORD= N8N_ENCRYPTION_KEY= WEBHOOK_URL=https://sb-.userman.de N8N_DIAGNOSTICS_ENABLED=false N8N_PERSONALIZATION_ENABLED=false ``` ### 3. Systemd Services #### 3.1 docker.service Standard Docker Service fΓΌr Container-Management. #### 3.2 n8n-workflow-reload.service **Typ:** oneshot **Trigger:** Container-Start **Funktion:** Automatisches Workflow-Reload ```ini [Unit] Description=Reload n8n workflow on container start After=docker.service Requires=docker.service [Service] Type=oneshot ExecStart=/opt/customer-stack/reload-workflow.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target ``` ### 4. Netzwerk-Architektur #### 4.1 Docker Network **Name:** `customer-stack_customer-net` **Typ:** Bridge **Subnet:** Automatisch (Docker) **DNS-Resolution:** - `postgres` β†’ PostgreSQL Container - `postgrest` β†’ PostgREST Container - `n8n` β†’ n8n Container #### 4.2 LXC Network **Interface:** eth0 **Bridge:** vmbr0 (Standard) **VLAN:** 90 (Standard) **IP:** DHCP oder statisch #### 4.3 External Access **NGINX Reverse Proxy:** ``` https://sb-.userman.de ↓ http://:5678 ``` **Direct Access:** - n8n: `http://:5678` - PostgREST: `http://:3000` ### 5. Storage-Architektur #### 5.1 Container Storage **Location:** `/var/lib/lxc//rootfs` **Type:** ZFS (Standard) oder Directory **Size:** 50 GB (Standard) #### 5.2 Docker Volumes ``` /opt/customer-stack/volumes/ β”œβ”€β”€ postgres-data/ # PostgreSQL Daten β”œβ”€β”€ n8n-data/ # n8n Workflows & Credentials └── postgrest-data/ # PostgREST Cache (optional) ``` **Permissions:** - postgres-data: 999:999 (postgres user) - n8n-data: 1000:1000 (node user) #### 5.3 Configuration Files ``` /opt/customer-stack/ β”œβ”€β”€ docker-compose.yml # Stack-Definition β”œβ”€β”€ .env # Environment-Variablen β”œβ”€β”€ workflow-template.json # n8n Workflow-Template β”œβ”€β”€ reload-workflow.sh # Reload-Script └── volumes/ # Persistente Daten ``` ## πŸ”„ Datenfluss ### RAG Chat-Flow ``` 1. User β†’ Chat-Webhook POST https://sb-.userman.de/webhook/rag-chat-webhook/chat Body: {"query": "Was ist...?"} 2. n8n β†’ Ollama (Embedding) POST http://ollama:11434/api/embeddings Body: {"model": "nomic-embed-text", "prompt": "Was ist...?"} 3. n8n β†’ PostgreSQL (Vector Search) POST http://postgrest:3000/rpc/match_documents Body: {"query_embedding": [...], "match_count": 5} 4. PostgreSQL β†’ n8n (Relevant Documents) Response: [{"content": "...", "similarity": 0.85}, ...] 5. n8n β†’ Ollama (Chat Completion) POST http://ollama:11434/api/generate Body: {"model": "ministral-3:3b", "prompt": "Context: ... Question: ..."} 6. n8n β†’ User (Response) Response: {"answer": "...", "sources": [...]} ``` ### Document Upload-Flow ``` 1. User β†’ Upload-Form POST https://sb-.userman.de/form/rag-upload-form Body: FormData with file 2. n8n β†’ Text Extraction Extract text from PDF/DOCX/TXT 3. n8n β†’ Text Chunking Split text into chunks (max 1000 chars) 4. n8n β†’ Ollama (Embeddings) For each chunk: POST http://ollama:11434/api/embeddings Body: {"model": "nomic-embed-text", "prompt": ""} 5. n8n β†’ PostgreSQL (Store) For each chunk: POST http://postgrest:3000/documents Body: {"content": "", "embedding": [...], "metadata": {...}} 6. n8n β†’ User (Confirmation) Response: {"status": "success", "chunks": 42} ``` ## πŸ” Security-Architektur ### 1. Container-Isolation - **Unprivileged LXC:** Prozesse laufen als unprivilegierte User - **AppArmor:** Kernel-Level Security - **Seccomp:** Syscall-Filtering ### 2. Network-Isolation - **Docker Network:** Isoliertes Bridge-Network - **Firewall:** Nur notwendige Ports exponiert - **VLAN:** Netzwerk-Segmentierung ### 3. Authentication - **JWT-Tokens:** FΓΌr PostgREST API - **n8n Credentials:** VerschlΓΌsselt mit N8N_ENCRYPTION_KEY - **PostgreSQL:** Passwort-basiert, nur intern erreichbar ### 4. Data Protection - **Encryption at Rest:** Optional via ZFS - **Encryption in Transit:** HTTPS via NGINX - **Credentials:** Gespeichert in .gitignore-geschΓΌtztem Verzeichnis ## πŸ“Š Performance-Architektur ### 1. Database Optimization - **pgvector Index:** IVFFlat fΓΌr schnelle Vektor-Suche - **Connection Pooling:** Via PostgREST - **Query Optimization:** Prepared Statements ### 2. Caching - **PostgREST:** Schema-Cache - **n8n:** Workflow-Cache - **Docker:** Layer-Cache ### 3. Resource Management - **CPU:** Unlimited (kann limitiert werden) - **Memory:** 4 GB (kann angepasst werden) - **Disk I/O:** ZFS mit Compression ## πŸ”§ Deployment-Architektur ### 1. Installation-Flow ``` 1. install.sh ↓ 2. Parameter-Validierung ↓ 3. CTID-Generierung ↓ 4. Template-Download (Debian 12) ↓ 5. LXC-Container-Erstellung ↓ 6. Container-Start ↓ 7. System-Update (APT) ↓ 8. Docker-Installation ↓ 9. Stack-Deployment (docker-compose.yml) ↓ 10. Database-Initialization (pgvector, schema) ↓ 11. n8n-Setup (owner, credentials, workflow) ↓ 12. Workflow-Reload-Service ↓ 13. NGINX-Proxy-Setup (optional) ↓ 14. Credentials-Save ↓ 15. JSON-Output ``` ### 2. Update-Flow ``` 1. update_credentials.sh ↓ 2. Load Credentials ↓ 3. n8n API Login ↓ 4. Update Credentials (Ollama, etc.) ↓ 5. Reload Workflow (optional) ↓ 6. Verify Changes ``` ### 3. Backup-Flow ``` 1. Stop Container ↓ 2. Backup Volumes - /opt/customer-stack/volumes/postgres-data - /opt/customer-stack/volumes/n8n-data ↓ 3. Backup Configuration - /opt/customer-stack/.env - /opt/customer-stack/docker-compose.yml ↓ 4. Start Container ``` ## πŸ“š Technologie-Stack ### Core Technologies - **Proxmox VE:** Virtualisierung - **LXC:** Container-Technologie - **Docker:** Container-Runtime - **Docker Compose:** Orchestrierung ### Database Stack - **PostgreSQL 16:** Relationale Datenbank - **pgvector:** Vektor-Extension - **PostgREST:** REST API ### Application Stack - **n8n:** Workflow-Automation - **Node.js:** Runtime fΓΌr n8n - **Ollama:** LLM-Integration ### Infrastructure - **Debian 12:** Base OS - **Systemd:** Service-Management - **NGINX:** Reverse Proxy ## πŸ”— Integration-Points ### 1. Ollama Integration **Connection:** HTTP REST API **Endpoint:** `http://192.168.45.3:11434` **Models:** - Chat: `ministral-3:3b` - Embeddings: `nomic-embed-text:latest` ### 2. NGINX Integration **Connection:** HTTP Reverse Proxy **Configuration:** OPNsense NGINX Plugin **SSL:** Let's Encrypt (optional) ### 3. Monitoring Integration **Potential Integrations:** - Prometheus (Metrics) - Grafana (Visualization) - Loki (Logs) - Alertmanager (Alerts) ## πŸ“š WeiterfΓΌhrende Dokumentation - [Installation](Installation.md) - Installations-Anleitung - [Configuration](Configuration.md) - Konfiguration - [Deployment](Deployment.md) - Deployment-Strategien - [API-Referenz](API-Reference.md) - API-Dokumentation --- **Design-Prinzipien:** 1. **ModularitΓ€t:** Komponenten sind austauschbar 2. **Skalierbarkeit:** Horizontal und vertikal skalierbar 3. **Wartbarkeit:** Klare Struktur und Dokumentation 4. **Sicherheit:** Defense in Depth 5. **Performance:** Optimiert fΓΌr RAG-Workloads