Projekt hinzugefügt
This commit is contained in:
73
README.md
73
README.md
@@ -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
86
install.sh
Normal 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
25
libsupabase.sh
Normal 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
95
setupowner.sh
Normal 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
|
||||||
38
templates/docker-compose.yml
Normal file
38
templates/docker-compose.yml
Normal 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
109
test.sh
Normal 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!"
|
||||||
Reference in New Issue
Block a user