#!/bin/bash # ============================================================================ # build-on-host.sh - Baut den Node auf dem Host (außerhalb des Containers) # # Verwendung: Wenn das Volume als read-only gemountet werden soll # # Dieses Skript: # 1. Installiert Dependencies auf dem Host # 2. Baut den Node auf dem Host # 3. Kopiert nur die fertigen Dateien in den Container # 4. Das Volume kann dann read-only gemountet werden # ============================================================================ set -e # Farben RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" echo -e "${BLUE}============================================${NC}" echo -e "${BLUE} LibreBooking Node - Build auf Host${NC}" echo -e "${BLUE}============================================${NC}" echo "" # Hilfe anzeigen show_help() { echo "Verwendung: $0 [OPTIONEN]" echo "" echo "Dieses Skript baut den Node auf dem Host, sodass er als" echo "read-only Volume gemountet werden kann." echo "" echo "Optionen:" echo " -o, --output DIR Ausgabeverzeichnis (Standard: ./dist-for-docker)" echo " -c, --copy-to PATH Kopiert direkt zu einem Pfad (z.B. custom-nodes/)" echo " -h, --help Diese Hilfe anzeigen" echo "" echo "Beispiele:" echo " $0 # Baut in ./dist-for-docker" echo " $0 -c ../n8n/custom-nodes/n8n-nodes-librebooking" echo "" echo "Danach in docker-compose.yml:" echo " volumes:" echo " - ./dist-for-docker:/home/node/.n8n/custom/n8n-nodes-librebooking:ro" exit 0 } OUTPUT_DIR="$SCRIPT_DIR/dist-for-docker" COPY_TO="" # Parameter parsen while [[ $# -gt 0 ]]; do case $1 in -o|--output) OUTPUT_DIR="$2" shift 2 ;; -c|--copy-to) COPY_TO="$2" shift 2 ;; -h|--help) show_help ;; *) echo -e "${RED}Unbekannte Option: $1${NC}" show_help ;; esac done log() { echo -e "${GREEN}[INFO]${NC} $1" } warn() { echo -e "${YELLOW}[WARN]${NC} $1" } error() { echo -e "${RED}[ERROR]${NC} $1" exit 1 } # Schritt 1: Prüfe Voraussetzungen log "Prüfe Voraussetzungen..." if ! command -v node &>/dev/null; then error "Node.js ist nicht installiert!\n\n Installieren Sie Node.js 18+: https://nodejs.org/" fi NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1) if [ "$NODE_VERSION" -lt 18 ]; then error "Node.js Version $NODE_VERSION ist zu alt. Mindestens v18 erforderlich." fi if ! command -v npm &>/dev/null; then error "npm ist nicht installiert!" fi log "Node.js: $(node -v)" log "npm: $(npm -v)" # Schritt 2: Dependencies installieren log "Installiere Dependencies..." cd "$SCRIPT_DIR" if npm install 2>&1 | tail -5; then log "Dependencies installiert ✓" else error "npm install fehlgeschlagen!" fi # Schritt 3: Bauen log "Baue den Node..." if npm run build 2>&1 | tail -10; then log "Build erfolgreich ✓" else error "npm run build fehlgeschlagen!" fi # Schritt 4: Prüfe Build if [ ! -d "$SCRIPT_DIR/dist" ]; then error "dist/ Verzeichnis wurde nicht erstellt!" fi NODE_COUNT=$(find "$SCRIPT_DIR/dist" -name "*.node.js" | wc -l) if [ "$NODE_COUNT" -eq 0 ]; then error "Keine .node.js Dateien im dist/ Verzeichnis!" fi log "Gefunden: $NODE_COUNT Node-Datei(en)" # Schritt 5: Erstelle Ausgabeverzeichnis log "Erstelle Ausgabeverzeichnis: $OUTPUT_DIR" mkdir -p "$OUTPUT_DIR" # Kopiere alle notwendigen Dateien cp -r "$SCRIPT_DIR/dist" "$OUTPUT_DIR/" cp "$SCRIPT_DIR/package.json" "$OUTPUT_DIR/" cp -r "$SCRIPT_DIR/node_modules" "$OUTPUT_DIR/" 2>/dev/null || true # Optional: Nur essentielle Dateien für minimales Image log "Räume auf..." rm -rf "$OUTPUT_DIR/node_modules/.cache" 2>/dev/null || true # Schritt 6: Optional kopieren if [ -n "$COPY_TO" ]; then log "Kopiere zu: $COPY_TO" mkdir -p "$COPY_TO" cp -r "$OUTPUT_DIR/"* "$COPY_TO/" log "Kopiert ✓" fi echo "" echo -e "${GREEN}============================================${NC}" echo -e "${GREEN} Build abgeschlossen!${NC}" echo -e "${GREEN}============================================${NC}" echo "" log "Ausgabe in: $OUTPUT_DIR" echo "" echo "Nächste Schritte:" echo "" echo "1. Kopieren Sie das Verzeichnis zu Ihrer n8n Installation:" echo " cp -r $OUTPUT_DIR /pfad/zu/n8n/custom-nodes/n8n-nodes-librebooking" echo "" echo "2. Oder verwenden Sie es direkt in docker-compose.yml:" echo "" echo " services:" echo " n8n:" echo " volumes:" echo " # Read-only möglich, da bereits gebaut!" echo " - $OUTPUT_DIR:/home/node/.n8n/custom/n8n-nodes-librebooking:ro" echo "" echo "3. Starten Sie n8n neu:" echo " docker compose restart n8n" echo ""