diff --git a/README.md b/README.md index 5529e8d..dda6b80 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,297 @@ -# customer-installer +# Customer LXC Installer – Proxmox + n8n + PostgreSQL (pgvector) -Installationsskripte für Kunden-Deployments (Docker / LXC). +Automatisierter Installer zur Erstellung **kundengetrennter LXC-Container** auf **Proxmox VE**. +Jede LXC enthält einen **Docker-Stack mit n8n + PostgreSQL (pgvector)** und ist für den späteren Betrieb hinter einer **OPNsense (NGINX Reverse Proxy)** vorbereitet. -## Usage -1. `.env.example` nach `.env` kopieren -2. Variablen setzen -3. Installer ausführen +--- -## Notes -- Secrets gehören ausschließlich in `.env` -- Repo ist für private Nutzung gedacht +## 🧱 Ziel des Projekts + +- **Pro Kunde eine eigene LXC** +- **Kein Shared State** zwischen Kunden +- **DSGVO-konform** (LXC löschen = Daten weg) +- **Automatisierbar & reproduzierbar** +- **Skalierbar im Proxmox-Cluster** +- **Vorbereitung für externe Automatisierung (n8n, API, OPNsense)** + +--- + +## 🏗 Architektur (Ist-Zustand) + +Proxmox VE Cluster +│ +├── LXC (Customer) +│ ├── Debian 12 +│ ├── Docker +│ ├── docker-compose +│ │ ├── n8n +│ │ └── PostgreSQL 16 + pgvector +│ ├── VLAN (z. B. VLAN 90) +│ ├── internes HTTP (Port 5678) +│ └── vorbereitet für Reverse Proxy (HTTPS extern) +│ +└── OPNsense +├── os-nginx (Port 443) +├── Wildcard-Zertifikat +└── Reverse Proxy (manuell / später API-gesteuert) + + +--- + +## ⚙ Voraussetzungen + +### Proxmox Host +- Proxmox VE 8.x / 9.x +- `pct`, `pveam`, `pvesm`, `pvesh` +- Storage: + - `local` (Templates) + - `local-zfs` (RootFS) +- Netzwerk: + - Bridge z. B. `vmbr0` + - VLAN z. B. `90` + +### Infrastruktur +- **APT-Cacher NG** + - z. B. `http://192.168.45.2:3142` +- **Docker Registry Mirror** + - z. B. `http://192.168.45.2:5000` +- **OPNsense** + - GUI auf Port `4444` + - os-nginx auf Port `443` + - Wildcard-Zertifikat vorhanden + +--- + +## 🚀 Installation (aktueller Stand) + +```bash +bash install.sh \ + --storage local-zfs \ + --bridge vmbr0 \ + --ip dhcp \ + --vlan 90 + +Unterstützte Optionen +Option Beschreibung +--ctid Optional. Wenn nicht gesetzt: CTID = date +%s - 1000000000 +--cores CPU-Kerne (Default: 2) +--memory RAM in MB (Default: 4096) +--swap Swap in MB (Default: 512) +--disk Disk in GB (Default: 50) +--bridge Proxmox Bridge (Default: vmbr0) +--vlan VLAN-ID (Default: 90) +--ip dhcp oder CIDR +--storage RootFS Storage (Default: local-zfs) +🧩 Was der Installer macht +Schritt 1–4: Preflight + +Argumente validieren + +Proxmox Umgebung prüfen + +Debian 12 Template sicherstellen + +Schritt 5: LXC erstellen + +CTID = Unixzeit − 1.000.000.000 + +Hostname: + +sb- + + +Netzwerk: + +Bridge + +VLAN + +DHCP + +Unprivileged Container + +LXC wird gestartet + +IP wird automatisch ermittelt + +Schritt 6: Provisionierung + +Im Container: + +Locale setzen (de_DE.UTF-8) + +APT-Proxy konfigurieren: + +Acquire::http::Proxy "http://192.168.45.2:3142"; + + +Docker installieren + +Docker Registry Mirror konfigurieren: + +{ + "registry-mirrors": ["http://192.168.45.2:5000"] +} + + +Docker-Dienst neu starten + +Schritt 7: Customer Stack + +docker-compose.yml generieren + +.env erzeugen mit: + +PostgreSQL Credentials + +n8n Settings + +Telemetrie deaktiviert + +Volumes anlegen + +Fix für n8n Permission Bug: + +chown -R 1000:1000 /opt/customer-stack/volumes/n8n-data + + +Stack starten + +Healthchecks abwarten + +🐘 PostgreSQL (pgvector) + +Image: pgvector/pgvector:pg16 + +Extensions: + +vector + +uuid-ossp + +Nur intern erreichbar (Docker-Netz) + +🔁 n8n + +Image: n8nio/n8n:latest + +Port intern: 5678 + +Extern geplant via: + +https://sb-.userman.de + + +Telemetrie deaktiviert: + +N8N_DIAGNOSTICS_ENABLED=false +N8N_VERSION_NOTIFICATIONS_ENABLED=false +N8N_TEMPLATES_ENABLED=false + +👤 Owner Account + +Owner wird automatisiert per API angelegt (Workaround, da ENV-Variablen nicht zuverlässig greifen). + +Erstellung erfolgt über separates Script (setupowner.sh) gegen: + +POST /rest/owner/setup + + +Ergebnis: + +Owner existiert + +Initial-Setup-Screen verschwindet + +Login möglich + +📤 Installer-Ausgabe (JSON) + +Am Ende gibt der Installer maschinenlesbares JSON aus, z. B.: + +{ + "ctid": 768138201, + "hostname": "sb-1768138201", + "fqdn": "sb-1768138201.userman.de", + "ip": "192.168.45.53", + "n8n_internal": "http://192.168.45.53:5678", + "n8n_external": "https://sb-1768138201.userman.de", + "postgres": { + "db": "customer", + "user": "customer", + "password": "********" + }, + "n8n_encryption_key": "********" +} + + +➡ Kann direkt von n8n / API / Skripten weiterverarbeitet werden. + +🚧 Bewusst ausgelagert / Nächste Schritte + +Nicht im Installer (absichtlich): + +Reverse Proxy via OPNsense API + +DNS-Automation + +Workflow-Import + +Credential-Anlage (DB, Ollama) + +Webhook-Freigaben + +➡ Diese Schritte werden separat umgesetzt: + +als eigenes Skript + +oder über n8n selbst (empfohlen) + +🧠 Design-Entscheidungen (klar & ehrlich) + +Clusterweite CTID-Abfrage verworfen + +Zu fehleranfällig + +Zeitbasierte IDs sind deterministisch & konfliktfrei + +Reverse Proxy nicht im Installer + +Installer bleibt lokal & sicher + +Alles idempotent + +Mehrfaches Starten kein Problem + +Kein ACME + +Wildcard-Zertifikat liegt auf OPNsense + +✅ Status + +✔ Installer stabil + +✔ Mehrfach parallel ausführbar + +✔ Proxy & Caching aktiv + +✔ n8n + PostgreSQL laufen stabil + +✔ Bereit für Automatisierung + +📌 Nächste geplante Schritte + +Separates OPNsense-API-Skript + +n8n: + +DB Credential anlegen + +Ollama Credential anlegen + +Workflow importieren & aktivieren + +Vollständige End-to-End-Automation + +Stand: Januar 2026 +Autor: Wolfgang Metz - MediaMetz Networks / Projekt BotKonzept