2026-01-12 08:35:29 +01:00
2026-01-09 21:28:21 +01:00
2026-01-11 13:25:47 +01:00
2026-01-09 17:17:45 +01:00
2026-01-11 13:25:47 +01:00
2026-01-12 07:43:24 +01:00
2026-01-12 08:35:29 +01:00

Customer LXC Installer Proxmox + n8n + PostgreSQL (pgvector)

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.


🧱 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 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 14: Preflight

Argumente validieren

Proxmox Umgebung prüfen

Debian 12 Template sicherstellen

Schritt 5: LXC erstellen

CTID = Unixzeit  1.000.000.000

Hostname:

sb-<unixzeit>


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
Description
No description provided
Readme 529 KiB
Languages
Shell 77%
PLpgSQL 23%