Dokumentaion vervollständigt in READ.me
This commit is contained in:
@@ -1,297 +1,105 @@
|
|||||||
# Customer LXC Installer – Proxmox + n8n + PostgreSQL (pgvector)
|
# Customer Installer – Proxmox LXC n8n Stack
|
||||||
|
|
||||||
Automatisierter Installer zur Erstellung **kundengetrennter LXC-Container** auf **Proxmox VE**.
|
## Überblick
|
||||||
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.
|
Dieses Projekt automatisiert die Bereitstellung **DSGVO‑konformer Kunden‑LXCs** auf einem **Proxmox‑Cluster**.
|
||||||
|
Pro Kunde wird **eine eigene LXC** erstellt, inklusive:
|
||||||
|
|
||||||
|
- Debian 12
|
||||||
|
- Docker + Docker Compose Plugin
|
||||||
|
- PostgreSQL + pgvector
|
||||||
|
- n8n
|
||||||
|
- Vorbereitung für Reverse Proxy (OPNsense / NGINX)
|
||||||
|
- VLAN‑Anbindung
|
||||||
|
- APT‑ & Docker‑Proxy (Apt‑Cacher NG)
|
||||||
|
|
||||||
|
Ziel: **reproduzierbare, schnelle und saubere Kunden‑Setups**, vollständig skriptgesteuert.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🧱 Ziel des Projekts
|
## Architektur
|
||||||
|
|
||||||
- **Pro Kunde eine eigene LXC**
|
```
|
||||||
- **Kein Shared State** zwischen Kunden
|
Internet
|
||||||
- **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)
|
OPNsense (os-nginx, TLS, Wildcard-Zertifikat)
|
||||||
│ ├── 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
|
VLAN 90
|
||||||
├── os-nginx (Port 443)
|
│
|
||||||
├── Wildcard-Zertifikat
|
Proxmox LXC (Debian 12)
|
||||||
└── Reverse Proxy (manuell / später API-gesteuert)
|
├── Docker
|
||||||
|
│ ├── n8n
|
||||||
|
│ └── PostgreSQL (pgvector)
|
||||||
|
└── Kunden-Daten (isoliert)
|
||||||
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ⚙ Voraussetzungen
|
## Voraussetzungen
|
||||||
|
|
||||||
### Proxmox Host
|
### Proxmox Host
|
||||||
- Proxmox VE 8.x / 9.x
|
- Proxmox VE (Clusterfähig)
|
||||||
- `pct`, `pveam`, `pvesm`, `pvesh`
|
- Zugriff auf:
|
||||||
- Storage:
|
- `pct`
|
||||||
- `local` (Templates)
|
- `pvesm`
|
||||||
- `local-zfs` (RootFS)
|
- `pveam`
|
||||||
- Netzwerk:
|
- Storage für LXCs (z. B. `local-zfs`)
|
||||||
- Bridge z. B. `vmbr0`
|
- Bridge (z. B. `vmbr0`)
|
||||||
- VLAN z. B. `90`
|
- VLAN‑fähiges Netzwerk
|
||||||
|
|
||||||
### Infrastruktur
|
### Netzwerk / Infrastruktur
|
||||||
- **APT-Cacher NG**
|
- OPNsense Firewall
|
||||||
- z. B. `http://192.168.45.2:3142`
|
- VLAN (Standard: **VLAN 90**)
|
||||||
- **Docker Registry Mirror**
|
- Wildcard‑Zertifikat auf OPNsense
|
||||||
- z. B. `http://192.168.45.2:5000`
|
- os‑nginx Plugin aktiv
|
||||||
- **OPNsense**
|
- Apt‑Cacher NG:
|
||||||
- GUI auf Port `4444`
|
- HTTP: `http://192.168.45.2:3142`
|
||||||
- os-nginx auf Port `443`
|
- Docker Registry Mirror:
|
||||||
- Wildcard-Zertifikat vorhanden
|
- `http://192.168.45.2:5000`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🚀 Installation (aktueller Stand)
|
## Projektstruktur
|
||||||
|
|
||||||
|
```
|
||||||
|
customer-installer/
|
||||||
|
├── install.sh
|
||||||
|
├── libsupabase.sh
|
||||||
|
├── setupowner.sh
|
||||||
|
├── templates/
|
||||||
|
│ └── docker-compose.yml
|
||||||
|
└── README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
bash install.sh \
|
bash install.sh --storage local-zfs --bridge vmbr0 --ip dhcp --vlan 90
|
||||||
--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
|
## Automatisierte Schritte
|
||||||
|
|
||||||
Proxmox Umgebung prüfen
|
1. Template-Download (Debian 12)
|
||||||
|
2. CTID-Generierung (Unix-Zeit - 1.000.000.000)
|
||||||
|
3. LXC-Erstellung + VLAN
|
||||||
|
4. Docker + Compose Installation
|
||||||
|
5. APT & Docker Proxy Konfiguration
|
||||||
|
6. n8n + PostgreSQL Stack
|
||||||
|
7. Ausgabe aller Zugangsdaten als JSON
|
||||||
|
|
||||||
Debian 12 Template sicherstellen
|
---
|
||||||
|
|
||||||
Schritt 5: LXC erstellen
|
## Status
|
||||||
|
|
||||||
CTID = Unixzeit − 1.000.000.000
|
✅ produktiv einsetzbar
|
||||||
|
🟡 Reverse Proxy Automatisierung ausgelagert
|
||||||
|
🟡 Workflow & Credential Import separat
|
||||||
|
|
||||||
Hostname:
|
---
|
||||||
|
|
||||||
sb-<unixzeit>
|
## Lizenz / Hinweis
|
||||||
|
|
||||||
|
Internes Projekt – kein Public Release.
|
||||||
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-<id>.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
|
|
||||||
|
|||||||
Reference in New Issue
Block a user