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