Projekt hinzugefügt

This commit is contained in:
root
2026-02-25 22:26:27 +01:00
parent 993a576d40
commit c26fd370a5
6 changed files with 426 additions and 0 deletions

View File

@@ -0,0 +1,73 @@
# Customer Installer Proxmox LXC n8n Stack
Dieses Projekt automatisiert die Bereitstellung isolierter Kunden-Instanzen mit n8n, PostgreSQL und pgvector in Proxmox LXC Containern.
## Projektstruktur
```
customer-installer/
├── install.sh # Hauptskript auf dem Proxmox-Host
├── setupowner.sh # Setup-Skript, das innerhalb des LXC ausgeführt wird
├── libsupabase.sh # Helper für Datenbank-Operationen (Mockup/Basis)
├── templates/
│ └── docker-compose.yml # n8n + PostgreSQL + pgvector Stack
└── README.md
```
## Funktionen
### install.sh (Host-Ebene)
- Verarbeitet Argumente: --storage, --bridge, --ip, --vlan
- Generiert eine CTID basierend auf dem aktuellen Zeitstempel
- Lädt das Debian 12 Template herunter
- Erstellt den LXC Container mit:
- Unprivilegierten Einstellungen
- Aktiviertem Nesting
- VLAN Tag Konfiguration
- Konfiguriert APT-Proxy im LXC
- Überträgt setupowner.sh und docker-compose.yml in den LXC
- Startet den LXC und führt setupowner.sh aus
### setupowner.sh (LXC-Ebene)
- Installiert Docker & Docker Compose Plugin (verwendet den Docker-Proxy)
- Erstellt Verzeichnisse für Daten-Persistenz
- Generiert sichere Zufallspasswörter für PostgreSQL und n8n-Encryption
- Startet den Docker-Stack
- Wartet, bis n8n bereit ist
- Gibt alle Zugangsdaten als JSON-Objekt aus
### docker-compose.yml
- Services: db (ankane/pgvector:latest), n8n (docker.n8n.io/n8nio/n8n:latest)
- Volumes für Datenpersistenz
- Umgebungsvariablen für DB-Anbindung und Zeitzone (Europe/Berlin)
## Ausführung
### Auf dem Proxmox-Host:
```bash
chmod +x install.sh
./install.sh --storage local --bridge vmbr0 --vlan 90
```
### Parameter:
- `--storage`: Speicherort für den Container (Standard: local)
- `--bridge`: Netzwerkbrücke (Standard: vmbr0)
- `--ip`: Statische IP (optional)
- `--vlan`: VLAN Tag (optional)
## Output (JSON)
Das Skript gibt ein JSON-Objekt mit folgenden Informationen aus:
```json
{
"ctid": "100",
"ip": "192.168.45.100",
"postgres_password": "a1b2c3d4e5f67890",
"n8n_encryption_key": "09f8e7d6c5b4a3f2e1d0c9b8a7f6e5d4"
}
```
## Sicherheit & Compliance
- Alle Instanzen sind isoliert
- Fehlerbehandlung mit set -e
- Verwendung sicherer Zufallspasswörter
- VLAN Integration für Netzwerksicherheit

86
install.sh Normal file
View File

@@ -0,0 +1,86 @@
#!/bin/bash
set -e
# Default values
STORAGE="local"
BRIDGE="vmbr0"
IP=""
VLAN=""
# Parse arguments
while [[ $# -gt 0 ]]; do
case $1 in
--storage)
STORAGE="$2"
shift 2
;;
--bridge)
BRIDGE="$2"
shift 2
;;
--ip)
IP="$2"
shift 2
;;
--vlan)
VLAN="$2"
shift 2
;;
*)
echo "Unknown argument: $1"
exit 1
;;
esac
done
# Generate CTID
CTID=$(( $(date +%s) - 1000000000 ))
echo "Generated CTID: $CTID"
# Update and download Debian 12 template
echo "Updating and downloading Debian 12 template..."
pveam update
pveam download local debian-12-standard_12.0-1_amd64.tar.zst
# Create LXC container
echo "Creating LXC container..."
if [ -n "$VLAN" ]; then
pct create "$CTID" local:template/debian-12-standard_12.0-1_amd64.tar.zst \
--hostname "customer-$CTID" \
--memory 2048 \
--cores 2 \
--net0 name=eth0,bridge="$BRIDGE",tag="$VLAN" \
--unprivileged 1 \
--features nesting=1 \
--storage "$STORAGE"
else
pct create "$CTID" local:template/debian-12-standard_12.0-1_amd64.tar.zst \
--hostname "customer-$CTID" \
--memory 2048 \
--cores 2 \
--net0 name=eth0,bridge="$BRIDGE" \
--unprivileged 1 \
--features nesting=1 \
--storage "$STORAGE"
fi
# Configure APT proxy
echo "Configuring APT proxy..."
pct exec "$CTID" -- mkdir -p /etc/apt/apt.conf.d
pct exec "$CTID" -- bash -c 'echo "Acquire::http::Proxy \"http://192.168.45.2:3142\";" > /etc/apt/apt.conf.d/01proxy'
# Copy setup scripts
echo "Copying setup scripts..."
pct push "$CTID" ./setupowner.sh /root/setupowner.sh
pct push "$CTID" ./templates/docker-compose.yml /root/docker-compose.yml
# Start container
echo "Starting container..."
pct start "$CTID"
# Execute setup script
echo "Executing setup script..."
pct exec "$CTID" -- /root/setupowner.sh
echo "Installation completed for CTID: $CTID"

25
libsupabase.sh Normal file
View File

@@ -0,0 +1,25 @@
#!/bin/bash
# Mockup library for Supabase operations
# This is a placeholder for future implementation
# Function to create user in Supabase
create_user() {
echo "Creating user in Supabase..."
# Implementation would go here
echo "User created successfully"
}
# Function to setup database
setup_database() {
echo "Setting up database..."
# Implementation would go here
echo "Database setup completed"
}
# Function to generate API keys
generate_api_keys() {
echo "Generating API keys..."
# Implementation would go here
echo "API keys generated"
}

95
setupowner.sh Normal file
View File

@@ -0,0 +1,95 @@
#!/bin/bash
set -e
# Install Docker and Docker Compose
echo "Installing Docker and Docker Compose..."
apt-get update
apt-get install -y ca-certificates curl gnupg lsb-release
# Add Docker's official GPG key
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Add Docker repository
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
# Update package index
apt-get update
# Install Docker Engine
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# Create directories for data persistence
echo "Creating data directories..."
mkdir -p /var/lib/n8n/data /var/lib/n8n/ssl
# Generate random passwords
echo "Generating random passwords..."
POSTGRES_PASSWORD=$(openssl rand -hex 16)
N8N_ENCRYPTION_KEY=$(openssl rand -hex 16)
# Create docker-compose.yml
echo "Creating docker-compose.yml..."
cat > /root/docker-compose.yml << EOF
version: '3.8'
services:
db:
image: ankane/pgvector:latest
container_name: n8n-db
environment:
POSTGRES_PASSWORD: $POSTGRES_PASSWORD
POSTGRES_DB: n8n
POSTGRES_USER: n8n
volumes:
- /var/lib/n8n/data/postgres:/var/lib/postgresql/data
networks:
- n8n-network
restart: unless-stopped
n8n:
image: docker.n8n.io/n8nio/n8n:latest
container_name: n8n-app
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: db
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: $POSTGRES_PASSWORD
DB_POSTGRESDB_DATABASE: n8n
N8N_ENCRYPTION_KEY: $N8N_ENCRYPTION_KEY
TIMEZONE: Europe/Berlin
volumes:
- /var/lib/n8n/data/n8n:/home/n8n/.n8n
networks:
- n8n-network
restart: unless-stopped
depends_on:
- db
networks:
n8n-network:
driver: bridge
EOF
# Start Docker stack
echo "Starting Docker stack..."
cd /root
docker compose up -d
# Wait for n8n to be ready
echo "Waiting for n8n to be ready..."
sleep 30
# Output credentials as JSON
echo "Outputting credentials..."
cat << EOF
{
"ctid": "$CTID",
"ip": "$IP",
"postgres_password": "$POSTGRES_PASSWORD",
"n8n_encryption_key": "$N8N_ENCRYPTION_KEY"
}
EOF

View File

@@ -0,0 +1,38 @@
version: '3.8'
services:
db:
image: ankane/pgvector:latest
container_name: n8n-db
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: n8n
POSTGRES_USER: n8n
volumes:
- /var/lib/n8n/data/postgres:/var/lib/postgresql/data
networks:
- n8n-network
restart: unless-stopped
n8n:
image: docker.n8n.io/n8nio/n8n:latest
container_name: n8n-app
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: db
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
DB_POSTGRESDB_DATABASE: n8n
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
TIMEZONE: Europe/Berlin
volumes:
- /var/lib/n8n/data/n8n:/home/n8n/.n8n
networks:
- n8n-network
restart: unless-stopped
depends_on:
- db
networks:
n8n-network:
driver: bridge

109
test.sh Normal file
View File

@@ -0,0 +1,109 @@
#!/bin/bash
# Test script for simulating the customer installer functionality
# This script mocks the Proxmox pct commands for testing on standard Linux systems
# Mock functions for Proxmox commands
pct() {
echo "Mock pct command called with arguments: $*"
case "$1" in
create)
echo "Creating LXC container with CTID: $2"
echo " - Hostname: customer-$2"
echo " - Memory: 2048 MB"
echo " - Cores: 2"
echo " - Network: eth0, bridge=vmbr0"
echo " - Unprivileged: 1"
echo " - Features: nesting=1"
echo " - Storage: $4"
;;
exec)
echo "Executing command in container $2:"
shift 2
echo " Command: $*"
;;
start)
echo "Starting container $2"
;;
push)
echo "Pushing file $3 to container $2"
;;
*)
echo "Unknown pct command: $1"
;;
esac
}
# Mock pveam commands
pveam() {
echo "Mock pveam command called with arguments: $*"
case "$1" in
update)
echo "Updating Proxmox templates"
;;
download)
echo "Downloading template: $2"
;;
*)
echo "Unknown pveam command: $1"
;;
esac
}
# Set up test environment
echo "Setting up test environment..."
mkdir -p /tmp/test-customer-installer
cd /tmp/test-customer-installer
# Create test files
echo "#!/bin/bash
set -e
echo 'Test setup script executed'
" > setupowner.sh
echo "version: '3.8'
services:
db:
image: ankane/pgvector:latest
container_name: n8n-db
environment:
POSTGRES_PASSWORD: testpassword
POSTGRES_DB: n8n
POSTGRES_USER: n8n
volumes:
- /var/lib/n8n/data/postgres:/var/lib/postgresql/data
networks:
- n8n-network
restart: unless-stopped
n8n:
image: docker.n8n.io/n8nio/n8n:latest
container_name: n8n-app
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: db
DB_POSTGRESDB_PORT: 5432
DB_POSTGRESDB_USER: n8n
DB_POSTGRESDB_PASSWORD: testpassword
DB_POSTGRESDB_DATABASE: n8n
N8N_ENCRYPTION_KEY: testkey
TIMEZONE: Europe/Berlin
volumes:
- /var/lib/n8n/data/n8n:/home/n8n/.n8n
networks:
- n8n-network
restart: unless-stopped
depends_on:
- db
networks:
n8n-network:
driver: bridge
" > templates/docker-compose.yml
# Test the main installation script with mocked commands
echo "Testing installation script with mocked Proxmox commands..."
chmod +x install.sh
./install.sh --storage local --bridge vmbr0 --vlan 90
echo "Test completed successfully!"