Projektstand aus ZIP aktualisiert
This commit is contained in:
parent
1af67a06d1
commit
846441f436
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,16 @@
|
|||
# npm Configuration für LibreBooking n8n Node
|
||||
# Diese Datei konfiguriert npm für dieses Projekt
|
||||
|
||||
# Audit-Warnungen deaktivieren
|
||||
# Die Vulnerabilities kommen von n8n-workflow Dependencies und sind
|
||||
# in diesem Kontext nicht kritisch (siehe SECURITY.md)
|
||||
audit=false
|
||||
|
||||
# Fund-Nachrichten deaktivieren
|
||||
fund=false
|
||||
|
||||
# Optional: Legacy Peer Dependencies (für ältere n8n Versionen)
|
||||
# legacy-peer-deps=true
|
||||
|
||||
# Optional: Engine-Strict deaktivieren
|
||||
# engine-strict=false
|
||||
124
CHANGELOG.md
124
CHANGELOG.md
|
|
@ -1,109 +1,35 @@
|
|||
# Changelog
|
||||
|
||||
Alle wichtigen Änderungen an diesem Projekt werden in dieser Datei dokumentiert.
|
||||
Alle wichtigen Änderungen werden hier dokumentiert.
|
||||
|
||||
Das Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.0.0/),
|
||||
und dieses Projekt folgt [Semantic Versioning](https://semver.org/lang/de/).
|
||||
## [1.1.0] - 2026-01-25
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Geplant
|
||||
- Webhook-basierter Trigger (falls von LibreBooking unterstützt)
|
||||
- Batch-Operationen für mehrere Reservierungen
|
||||
- Erweiterte Filteroptionen
|
||||
|
||||
## [1.0.0] - 2026-01-25
|
||||
### Geändert
|
||||
- ⭐ **Vereinfachte Installation**: Fokus auf "auf dem Host bauen"
|
||||
- Aktualisierte Dokumentation mit funktionierender Methode
|
||||
- Neue npm scripts: `docker:deploy`, `docker:copy`, `docker:restart`
|
||||
|
||||
### Hinzugefügt
|
||||
- `quick-install.sh` - Ultra-einfache Installation
|
||||
- `update-node.sh` - Für Updates
|
||||
- `git-commit.sh` - Git Commit Helper
|
||||
- `git-cleanup.sh` - Cleanup alter Dateien
|
||||
- `create-release.sh` - Release-Erstellung
|
||||
- `GIT-COMMANDS.md` - Git-Befehlsreferenz
|
||||
|
||||
#### LibreBooking Node
|
||||
- **Reservierung (Reservation)**
|
||||
- Alle Reservierungen abrufen (GetAll)
|
||||
- Reservierung nach Referenznummer abrufen (Get)
|
||||
- Neue Reservierung erstellen (Create)
|
||||
- Reservierung aktualisieren (Update)
|
||||
- Reservierung löschen (Delete)
|
||||
- Reservierung genehmigen (Approve)
|
||||
- Check-In durchführen (CheckIn)
|
||||
- Check-Out durchführen (CheckOut)
|
||||
### Behoben
|
||||
- TypeScript Installation Problem gelöst ("tsc not found")
|
||||
- Read-only Volume Problem dokumentiert und gelöst
|
||||
- npm audit Vulnerabilities dokumentiert
|
||||
|
||||
- **Ressource (Resource)**
|
||||
- Alle Ressourcen abrufen (GetAll)
|
||||
- Ressource nach ID abrufen (Get)
|
||||
- Verfügbarkeit prüfen (GetAvailability)
|
||||
- Status abrufen (GetStatus)
|
||||
- Neue Ressource erstellen (Create)
|
||||
- Ressource aktualisieren (Update)
|
||||
- Ressource löschen (Delete)
|
||||
## [1.0.0] - 2026-01-24
|
||||
|
||||
- **Zeitplan (Schedule)**
|
||||
- Alle Zeitpläne abrufen (GetAll)
|
||||
- Zeitplan nach ID abrufen (Get)
|
||||
- Slots abrufen (GetSlots)
|
||||
|
||||
- **Benutzer (User)**
|
||||
- Alle Benutzer abrufen (GetAll)
|
||||
- Benutzer nach ID abrufen (Get)
|
||||
- Neuen Benutzer erstellen (Create)
|
||||
- Benutzer aktualisieren (Update)
|
||||
- Benutzer löschen (Delete)
|
||||
|
||||
- **Konto (Account)**
|
||||
- Eigenes Konto abrufen (Get)
|
||||
- Konto aktualisieren (Update)
|
||||
- Passwort ändern (ChangePassword)
|
||||
|
||||
- **Gruppe (Group)**
|
||||
- Alle Gruppen abrufen (GetAll)
|
||||
- Gruppe nach ID abrufen (Get)
|
||||
- Neue Gruppe erstellen (Create)
|
||||
- Gruppe aktualisieren (Update)
|
||||
- Gruppe löschen (Delete)
|
||||
|
||||
- **Zubehör (Accessory)**
|
||||
- Alles Zubehör abrufen (GetAll)
|
||||
- Zubehör nach ID abrufen (Get)
|
||||
- Neues Zubehör erstellen (Create)
|
||||
- Zubehör aktualisieren (Update)
|
||||
- Zubehör löschen (Delete)
|
||||
|
||||
- **Attribut (Attribute)**
|
||||
- Attributkategorien abrufen (GetCategories)
|
||||
- Attribute nach Kategorie abrufen (GetByCategory)
|
||||
|
||||
#### LibreBooking Trigger Node
|
||||
- Polling-basierter Trigger für Reservierungs-Events
|
||||
- Event-Typen:
|
||||
- Neue Reservierung
|
||||
- Geänderte Reservierung
|
||||
- Alle Reservierungen
|
||||
- Filter nach Ressource, Zeitplan und Benutzer
|
||||
- Konfigurierbares Zeitfenster (7-90 Tage)
|
||||
- Deduplizierung von Events
|
||||
|
||||
#### Credentials
|
||||
- LibreBooking API Credentials mit Session-basierter Authentifizierung
|
||||
- Automatische Token-Verwaltung
|
||||
- Verbindungstest integriert
|
||||
|
||||
#### Dokumentation
|
||||
- Vollständige README.md auf Deutsch
|
||||
- Detaillierte INSTALLATION.md
|
||||
### Hinzugefügt
|
||||
- Vollständige LibreBooking API Integration
|
||||
- 8 Ressourcen: Reservierung, Ressource, Zeitplan, Benutzer, Konto, Gruppe, Zubehör, Attribut
|
||||
- Trigger Node für neue/geänderte Reservierungen
|
||||
- Docker Support mit docker-compose.yml
|
||||
- Automatische Installationsskripte
|
||||
- Umfangreiche Dokumentation auf Deutsch
|
||||
- Beispiel-Workflows
|
||||
- API-Dokumentation mit allen Operationen
|
||||
|
||||
#### Entwickler-Tools
|
||||
- Docker-Support mit Dockerfile und docker-compose
|
||||
- Installations-Skripte für Linux/Mac und Windows
|
||||
- Test-Suite für API-Verbindung
|
||||
- ESLint und Prettier Konfiguration
|
||||
|
||||
### Sicherheit
|
||||
- Keine Speicherung von Passwörtern im Klartext
|
||||
- Session-basierte Authentifizierung
|
||||
- Automatisches Sign-Out nach Operationen
|
||||
|
||||
---
|
||||
|
||||
[Unreleased]: https://github.com/DEIN-REPO/n8n-nodes-librebooking/compare/v1.0.0...HEAD
|
||||
[1.0.0]: https://github.com/DEIN-REPO/n8n-nodes-librebooking/releases/tag/v1.0.0
|
||||
- Test-Skripte
|
||||
|
|
|
|||
|
|
@ -1,168 +1,41 @@
|
|||
# Docker-Integration für LibreBooking n8n Node
|
||||
# Docker Integration
|
||||
|
||||
Diese Anleitung beschreibt die Integration des LibreBooking Nodes in eine **bestehende n8n Docker-Installation**.
|
||||
## Empfohlene Methode: Auf dem Host bauen
|
||||
|
||||
## Inhaltsverzeichnis
|
||||
Die zuverlässigste Methode für Docker-Installationen.
|
||||
|
||||
- [Voraussetzungen](#voraussetzungen)
|
||||
- [Methode 1: Automatische Integration mit Skript](#methode-1-automatische-integration-mit-skript)
|
||||
- [Methode 2: Manuelle Integration](#methode-2-manuelle-integration)
|
||||
- [Methode 3: Integration in bestehende docker-compose.yml](#methode-3-integration-in-bestehende-docker-composeyml)
|
||||
- [Methode 4: Dockerfile erweitern](#methode-4-dockerfile-erweitern)
|
||||
- [Verifizierung der Installation](#verifizierung-der-installation)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
- [Updates und Wartung](#updates-und-wartung)
|
||||
|
||||
---
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
### System-Anforderungen
|
||||
|
||||
- **Docker** Version 20.10 oder höher
|
||||
- **Docker Compose** v2.0+ (Plugin) oder docker-compose v1.29+
|
||||
- **Laufende n8n Docker-Installation**
|
||||
- **Zugriff auf das Dateisystem** des Docker-Hosts
|
||||
|
||||
### Prüfen der Voraussetzungen
|
||||
### Schritt-für-Schritt
|
||||
|
||||
```bash
|
||||
# Docker Version prüfen
|
||||
docker --version
|
||||
# Docker version 24.0.x, build xxxxx
|
||||
|
||||
# Docker Compose Version prüfen
|
||||
docker compose version
|
||||
# Docker Compose version v2.x.x
|
||||
|
||||
# Oder für ältere Versionen:
|
||||
docker-compose --version
|
||||
# docker-compose version 1.29.x, build xxxxx
|
||||
|
||||
# n8n Container Status prüfen
|
||||
docker ps | grep n8n
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Methode 1: Automatische Integration mit Skript
|
||||
|
||||
Die einfachste Methode für die Integration in eine bestehende Installation.
|
||||
|
||||
### Schritt 1: Skript ausführbar machen
|
||||
|
||||
```bash
|
||||
chmod +x install-docker.sh
|
||||
```
|
||||
|
||||
### Schritt 2: Skript ausführen
|
||||
|
||||
```bash
|
||||
# Im aktuellen Verzeichnis (wenn dort n8n läuft)
|
||||
./install-docker.sh
|
||||
|
||||
# Oder mit Pfad zur n8n Installation
|
||||
./install-docker.sh -p /pfad/zu/n8n
|
||||
|
||||
# Mit Überschreiben bestehender Dateien
|
||||
./install-docker.sh -f -p /pfad/zu/n8n
|
||||
```
|
||||
|
||||
### Skript-Optionen
|
||||
|
||||
| Option | Beschreibung |
|
||||
|--------|--------------|
|
||||
| `-p, --path PATH` | Pfad zur n8n Docker-Installation |
|
||||
| `-b, --build` | Node im Container bauen |
|
||||
| `-f, --force` | Bestehende Installation überschreiben |
|
||||
| `-h, --help` | Hilfe anzeigen |
|
||||
|
||||
### Was das Skript tut
|
||||
|
||||
1. Prüft Docker und Docker Compose Installation
|
||||
2. Prüft ob n8n Container läuft
|
||||
3. Kopiert `custom-nodes/` Verzeichnis
|
||||
4. Erstellt/aktualisiert `docker-compose.override.yml`
|
||||
5. Setzt korrekte Berechtigungen (UID 1000)
|
||||
6. Startet Container bei Bedarf neu
|
||||
|
||||
---
|
||||
|
||||
## Methode 2: Manuelle Integration
|
||||
|
||||
Für mehr Kontrolle oder spezielle Setups.
|
||||
|
||||
### Schritt 1: Custom Nodes Verzeichnis kopieren
|
||||
|
||||
```bash
|
||||
# Zum n8n Verzeichnis wechseln
|
||||
cd /pfad/zu/ihrer/n8n/installation
|
||||
|
||||
# Custom Nodes kopieren
|
||||
cp -r /pfad/zu/librebooking_n8n_node/custom-nodes ./custom-nodes
|
||||
```
|
||||
|
||||
### Schritt 2: Dependencies installieren und bauen
|
||||
|
||||
```bash
|
||||
cd custom-nodes
|
||||
|
||||
# Node.js Dependencies installieren
|
||||
# 1. Auf dem Host
|
||||
cd /pfad/zu/n8n-nodes-librebooking
|
||||
npm install
|
||||
|
||||
# TypeScript kompilieren
|
||||
npm run build
|
||||
|
||||
# 2. In Container kopieren
|
||||
docker cp dist n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
docker cp package.json n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
docker cp node_modules n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
|
||||
# 3. Neustarten
|
||||
docker restart n8n
|
||||
```
|
||||
|
||||
### Schritt 3: docker-compose.override.yml erstellen
|
||||
|
||||
Erstellen Sie eine `docker-compose.override.yml` Datei:
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
n8n:
|
||||
volumes:
|
||||
# LibreBooking Custom Node einbinden
|
||||
- ./custom-nodes:/home/node/.n8n/custom/n8n-nodes-librebooking:ro
|
||||
|
||||
environment:
|
||||
# Custom Nodes Pfad
|
||||
- N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
|
||||
# Community Nodes aktivieren
|
||||
- N8N_COMMUNITY_NODES_ENABLED=true
|
||||
```
|
||||
|
||||
### Schritt 4: Berechtigungen setzen
|
||||
### Mit Skript
|
||||
|
||||
```bash
|
||||
# n8n läuft als "node" User mit UID 1000
|
||||
sudo chown -R 1000:1000 custom-nodes/
|
||||
./quick-install.sh n8n
|
||||
```
|
||||
|
||||
### Schritt 5: Container neustarten
|
||||
### Mit npm
|
||||
|
||||
```bash
|
||||
# Mit docker-compose
|
||||
docker-compose restart n8n
|
||||
|
||||
# Oder mit Docker Compose Plugin
|
||||
docker compose restart n8n
|
||||
|
||||
# Bei Problemen: Container komplett neu erstellen
|
||||
docker-compose down && docker-compose up -d
|
||||
npm run docker:deploy
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Methode 3: Integration in bestehende docker-compose.yml
|
||||
|
||||
Wenn Sie keine Override-Datei verwenden möchten.
|
||||
|
||||
### Bestehende docker-compose.yml erweitern
|
||||
|
||||
Fügen Sie folgende Einträge zu Ihrem n8n Service hinzu:
|
||||
## docker-compose.yml Beispiel
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
|
@ -170,423 +43,50 @@ version: '3.8'
|
|||
services:
|
||||
n8n:
|
||||
image: n8nio/n8n:latest
|
||||
# ... Ihre bestehende Konfiguration ...
|
||||
|
||||
volumes:
|
||||
# Bestehende Volumes beibehalten
|
||||
- n8n_data:/home/node/.n8n
|
||||
|
||||
# LibreBooking Node hinzufügen
|
||||
- ./custom-nodes:/home/node/.n8n/custom/n8n-nodes-librebooking:ro
|
||||
|
||||
container_name: n8n
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "5678:5678"
|
||||
environment:
|
||||
# Bestehende Umgebungsvariablen beibehalten
|
||||
- N8N_HOST=0.0.0.0
|
||||
- N8N_PORT=5678
|
||||
|
||||
# Custom Nodes Konfiguration hinzufügen
|
||||
- N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
|
||||
- N8N_COMMUNITY_NODES_ENABLED=true
|
||||
- TZ=Europe/Berlin
|
||||
volumes:
|
||||
- n8n_data:/home/node/.n8n
|
||||
# Optional: Custom Nodes Verzeichnis
|
||||
# - ./custom-nodes:/home/node/.n8n/custom
|
||||
|
||||
volumes:
|
||||
n8n_data:
|
||||
```
|
||||
|
||||
### Vollständiges Beispiel
|
||||
|
||||
Siehe `docker-compose.example.yml` für eine vollständige Konfiguration mit:
|
||||
- PostgreSQL Datenbank (optional)
|
||||
- Redis Queue (optional)
|
||||
- Health Checks
|
||||
- Alle Umgebungsvariablen
|
||||
|
||||
---
|
||||
|
||||
## Methode 4: Dockerfile erweitern
|
||||
|
||||
Für produktive Deployments oder wenn Sie ein eigenes Image benötigen.
|
||||
|
||||
### Einfaches Dockerfile
|
||||
|
||||
```dockerfile
|
||||
# Dockerfile.custom-nodes
|
||||
ARG N8N_VERSION=latest
|
||||
FROM n8nio/n8n:${N8N_VERSION}
|
||||
|
||||
USER root
|
||||
|
||||
# Custom Node Verzeichnis erstellen
|
||||
RUN mkdir -p /home/node/.n8n/custom/n8n-nodes-librebooking && \
|
||||
chown -R node:node /home/node/.n8n/custom
|
||||
|
||||
WORKDIR /home/node/.n8n/custom/n8n-nodes-librebooking
|
||||
|
||||
# Dateien kopieren
|
||||
COPY --chown=node:node custom-nodes/ ./
|
||||
|
||||
# Dependencies installieren und bauen
|
||||
RUN npm install && npm run build
|
||||
|
||||
USER node
|
||||
WORKDIR /home/node
|
||||
|
||||
ENV N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
|
||||
ENV N8N_COMMUNITY_NODES_ENABLED=true
|
||||
|
||||
EXPOSE 5678
|
||||
CMD ["n8n", "start"]
|
||||
```
|
||||
|
||||
### Image bauen und verwenden
|
||||
## Für Updates
|
||||
|
||||
```bash
|
||||
# Image bauen
|
||||
docker build -f Dockerfile.custom-nodes -t n8n-librebooking .
|
||||
./update-node.sh n8n
|
||||
|
||||
# Container starten
|
||||
docker run -d \
|
||||
--name n8n \
|
||||
-p 5678:5678 \
|
||||
-v n8n_data:/home/node/.n8n \
|
||||
n8n-librebooking
|
||||
```
|
||||
|
||||
### Mit docker-compose
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
n8n:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.custom-nodes
|
||||
args:
|
||||
N8N_VERSION: latest
|
||||
# ... weitere Konfiguration
|
||||
```
|
||||
|
||||
### Multi-Stage Build (Optimiert)
|
||||
|
||||
```dockerfile
|
||||
# Build Stage
|
||||
FROM node:18-alpine AS builder
|
||||
WORKDIR /build
|
||||
COPY custom-nodes/ ./
|
||||
RUN npm install && npm run build
|
||||
|
||||
# Production Stage
|
||||
ARG N8N_VERSION=latest
|
||||
FROM n8nio/n8n:${N8N_VERSION}
|
||||
|
||||
USER root
|
||||
RUN mkdir -p /home/node/.n8n/custom/n8n-nodes-librebooking && \
|
||||
chown -R node:node /home/node/.n8n/custom
|
||||
|
||||
# Nur gebaute Dateien kopieren
|
||||
COPY --from=builder --chown=node:node /build/dist /home/node/.n8n/custom/n8n-nodes-librebooking/dist
|
||||
COPY --from=builder --chown=node:node /build/package.json /home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
|
||||
USER node
|
||||
|
||||
ENV N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
|
||||
ENV N8N_COMMUNITY_NODES_ENABLED=true
|
||||
|
||||
CMD ["n8n", "start"]
|
||||
# Oder
|
||||
npm run docker:deploy
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Verifizierung der Installation
|
||||
|
||||
### 1. Container-Logs prüfen
|
||||
## Verifikation
|
||||
|
||||
```bash
|
||||
# Logs anzeigen
|
||||
docker logs n8n 2>&1 | grep -i "librebooking\|custom\|node"
|
||||
# Dateien prüfen
|
||||
docker exec n8n ls -la /home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
|
||||
# Live Logs verfolgen
|
||||
docker logs -f n8n
|
||||
```
|
||||
|
||||
### 2. In n8n prüfen
|
||||
|
||||
1. Öffnen Sie n8n im Browser (z.B. `http://localhost:5678`)
|
||||
2. Erstellen Sie einen neuen Workflow
|
||||
3. Fügen Sie einen neuen Node hinzu
|
||||
4. Suchen Sie nach "LibreBooking" - zwei Nodes sollten erscheinen:
|
||||
- **LibreBooking** - Hauptnode für alle Operationen
|
||||
- **LibreBooking Trigger** - Trigger für neue Reservierungen
|
||||
|
||||
### 3. Node-Verzeichnis im Container prüfen
|
||||
|
||||
```bash
|
||||
# In Container einloggen
|
||||
docker exec -it n8n /bin/sh
|
||||
|
||||
# Custom Nodes Verzeichnis prüfen
|
||||
ls -la /home/node/.n8n/custom/
|
||||
|
||||
# LibreBooking Node prüfen
|
||||
ls -la /home/node/.n8n/custom/n8n-nodes-librebooking/dist/
|
||||
```
|
||||
|
||||
### 4. Umgebungsvariablen prüfen
|
||||
|
||||
```bash
|
||||
docker exec n8n env | grep N8N_CUSTOM
|
||||
# N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
|
||||
|
||||
docker exec n8n env | grep COMMUNITY
|
||||
# N8N_COMMUNITY_NODES_ENABLED=true
|
||||
# Sollte zeigen:
|
||||
# dist/
|
||||
# package.json
|
||||
# node_modules/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
## Probleme?
|
||||
|
||||
### Problem: Node wird nicht erkannt
|
||||
|
||||
**Symptom:** LibreBooking Node erscheint nicht in der Node-Suche
|
||||
|
||||
**Lösungen:**
|
||||
|
||||
1. **Pfad prüfen:**
|
||||
```bash
|
||||
docker exec n8n ls -la /home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
```
|
||||
|
||||
2. **Umgebungsvariablen prüfen:**
|
||||
```bash
|
||||
docker exec n8n env | grep -E "N8N_CUSTOM|COMMUNITY"
|
||||
```
|
||||
|
||||
3. **Container komplett neu starten:**
|
||||
```bash
|
||||
docker-compose down
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
4. **Logs auf Fehler prüfen:**
|
||||
```bash
|
||||
docker logs n8n 2>&1 | grep -i error
|
||||
```
|
||||
|
||||
### Problem: Permissions-Fehler
|
||||
|
||||
**Symptom:** `EACCES: permission denied` oder ähnliche Fehler
|
||||
|
||||
**Lösungen:**
|
||||
|
||||
1. **Berechtigungen setzen:**
|
||||
```bash
|
||||
sudo chown -R 1000:1000 custom-nodes/
|
||||
sudo chmod -R 755 custom-nodes/
|
||||
```
|
||||
|
||||
2. **Volume mit korrektem User mounten:**
|
||||
```yaml
|
||||
services:
|
||||
n8n:
|
||||
user: "1000:1000"
|
||||
```
|
||||
|
||||
3. **SELinux Context (falls aktiviert):**
|
||||
```bash
|
||||
sudo chcon -R -t svirt_sandbox_file_t custom-nodes/
|
||||
```
|
||||
|
||||
### Problem: Container startet nicht
|
||||
|
||||
**Symptom:** Container crashed oder startet nicht
|
||||
|
||||
**Lösungen:**
|
||||
|
||||
1. **Logs prüfen:**
|
||||
```bash
|
||||
docker logs n8n
|
||||
```
|
||||
|
||||
2. **Ohne Override starten (zum Testen):**
|
||||
```bash
|
||||
mv docker-compose.override.yml docker-compose.override.yml.bak
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
3. **Volume-Konflikte prüfen:**
|
||||
```bash
|
||||
docker volume ls
|
||||
docker volume inspect n8n_data
|
||||
```
|
||||
|
||||
### Problem: Node wird geladen aber Fehler bei Ausführung
|
||||
|
||||
**Symptom:** Node ist sichtbar aber Ausführung schlägt fehl
|
||||
|
||||
**Lösungen:**
|
||||
|
||||
1. **Build prüfen:**
|
||||
```bash
|
||||
docker exec n8n ls -la /home/node/.n8n/custom/n8n-nodes-librebooking/dist/
|
||||
```
|
||||
|
||||
2. **Neu bauen:**
|
||||
```bash
|
||||
cd custom-nodes
|
||||
npm run rebuild
|
||||
docker-compose restart n8n
|
||||
```
|
||||
|
||||
3. **Dependencies prüfen:**
|
||||
```bash
|
||||
docker exec -it n8n /bin/sh
|
||||
cd /home/node/.n8n/custom/n8n-nodes-librebooking
|
||||
npm ls
|
||||
```
|
||||
|
||||
### Problem: TypeScript Build schlägt fehl
|
||||
|
||||
**Symptom:** `tsc` Fehler beim Bauen
|
||||
|
||||
**Lösungen:**
|
||||
|
||||
1. **Node.js Version prüfen:**
|
||||
```bash
|
||||
node --version # Sollte 18+ sein
|
||||
npm --version
|
||||
```
|
||||
|
||||
2. **Clean Build:**
|
||||
```bash
|
||||
cd custom-nodes
|
||||
rm -rf node_modules dist package-lock.json
|
||||
npm install
|
||||
npm run build
|
||||
```
|
||||
|
||||
### Problem: Webhook URL nicht erreichbar
|
||||
|
||||
**Symptom:** LibreBooking kann Webhooks nicht senden
|
||||
|
||||
**Lösungen:**
|
||||
|
||||
1. **WEBHOOK_URL Umgebungsvariable setzen:**
|
||||
```yaml
|
||||
environment:
|
||||
- WEBHOOK_URL=https://ihre-domain.com/
|
||||
```
|
||||
|
||||
2. **Netzwerk-Konfiguration prüfen:**
|
||||
```bash
|
||||
docker network inspect $(docker network ls -q)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Updates und Wartung
|
||||
|
||||
### Node aktualisieren
|
||||
|
||||
```bash
|
||||
# Neue Version herunterladen
|
||||
cd /pfad/zu/neuem/librebooking_n8n_node
|
||||
|
||||
# Custom Nodes ersetzen
|
||||
rm -rf /pfad/zu/n8n/custom-nodes
|
||||
cp -r custom-nodes /pfad/zu/n8n/custom-nodes
|
||||
|
||||
# Neu bauen
|
||||
cd /pfad/zu/n8n/custom-nodes
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
# Container neustarten
|
||||
cd /pfad/zu/n8n
|
||||
docker-compose restart n8n
|
||||
```
|
||||
|
||||
### n8n Version aktualisieren
|
||||
|
||||
```bash
|
||||
# Image aktualisieren
|
||||
docker pull n8nio/n8n:latest
|
||||
|
||||
# Container neu erstellen
|
||||
docker-compose down
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### Backup erstellen
|
||||
|
||||
```bash
|
||||
# Docker Volumes sichern
|
||||
docker run --rm \
|
||||
-v n8n_data:/source:ro \
|
||||
-v $(pwd)/backup:/backup \
|
||||
alpine tar cvzf /backup/n8n_data_backup.tar.gz -C /source .
|
||||
|
||||
# Custom Nodes sichern
|
||||
tar cvzf custom-nodes-backup.tar.gz custom-nodes/
|
||||
```
|
||||
|
||||
### Logs rotieren
|
||||
|
||||
```yaml
|
||||
services:
|
||||
n8n:
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "3"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Erweiterte Konfiguration
|
||||
|
||||
### Kubernetes Deployment
|
||||
|
||||
Für Kubernetes-Umgebungen kann ein ConfigMap oder PersistentVolume verwendet werden:
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: librebooking-node
|
||||
data:
|
||||
# Node-Dateien als ConfigMap
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: n8n
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: n8n
|
||||
volumeMounts:
|
||||
- name: custom-nodes
|
||||
mountPath: /home/node/.n8n/custom/n8n-nodes-librebooking
|
||||
volumes:
|
||||
- name: custom-nodes
|
||||
configMap:
|
||||
name: librebooking-node
|
||||
```
|
||||
|
||||
### Mit Reverse Proxy (Nginx)
|
||||
|
||||
Siehe `nginx.conf` für eine vollständige Nginx-Konfiguration mit:
|
||||
- SSL/TLS Termination
|
||||
- WebSocket Support
|
||||
- Optimierte Timeouts für Webhooks
|
||||
|
||||
---
|
||||
|
||||
## Hilfe und Support
|
||||
|
||||
- **GitHub Issues:** [Repository Issues](https://github.com/ihr-repo/librebooking-n8n-node/issues)
|
||||
- **n8n Community:** [community.n8n.io](https://community.n8n.io)
|
||||
- **LibreBooking Dokumentation:** [LibreBooking Wiki](https://github.com/effgarces/BookedScheduler/wiki)
|
||||
|
||||
---
|
||||
|
||||
*Letzte Aktualisierung: Januar 2026*
|
||||
Siehe [TROUBLESHOOTING.md](TROUBLESHOOTING.md)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,65 @@
|
|||
# Git-Befehle für LibreBooking n8n Node
|
||||
|
||||
## Schnellbefehle
|
||||
|
||||
```bash
|
||||
# Alle Änderungen committen
|
||||
git add .
|
||||
git commit -m "fix: Vereinfachte Installation"
|
||||
|
||||
# Push
|
||||
git push origin main
|
||||
```
|
||||
|
||||
## Release erstellen
|
||||
|
||||
```bash
|
||||
# 1. Version in package.json anpassen (z.B. 1.1.0)
|
||||
|
||||
# 2. Alte Archive löschen
|
||||
rm ../n8n-nodes-librebooking*.tar.gz
|
||||
rm ../n8n-nodes-librebooking*.zip
|
||||
|
||||
# 3. Neue Archive erstellen
|
||||
git archive --format=tar.gz --prefix=n8n-nodes-librebooking/ --output=../n8n-nodes-librebooking-v1.1.0.tar.gz HEAD
|
||||
git archive --format=zip --prefix=n8n-nodes-librebooking/ --output=../n8n-nodes-librebooking-v1.1.0.zip HEAD
|
||||
|
||||
# 4. Tag erstellen
|
||||
git tag -a v1.1.0 -m "Version 1.1.0 - Vereinfachte Installation"
|
||||
|
||||
# 5. Push
|
||||
git push origin main
|
||||
git push origin v1.1.0
|
||||
```
|
||||
|
||||
## Mit Skripten
|
||||
|
||||
```bash
|
||||
# Commit
|
||||
./git-commit.sh "fix: Beschreibung der Änderung"
|
||||
|
||||
# Cleanup
|
||||
./git-cleanup.sh
|
||||
|
||||
# Release
|
||||
./create-release.sh
|
||||
```
|
||||
|
||||
## Nützliche Befehle
|
||||
|
||||
```bash
|
||||
# Status anzeigen
|
||||
git status
|
||||
|
||||
# Änderungen anzeigen
|
||||
git diff
|
||||
|
||||
# Log anzeigen
|
||||
git log --oneline -10
|
||||
|
||||
# Tags anzeigen
|
||||
git tag -l
|
||||
|
||||
# Remote anzeigen
|
||||
git remote -v
|
||||
```
|
||||
588
INSTALLATION.md
588
INSTALLATION.md
|
|
@ -1,553 +1,101 @@
|
|||
# Installationsanleitung - LibreBooking n8n Node
|
||||
# Installation
|
||||
|
||||
Diese Anleitung beschreibt alle verfügbaren Methoden zur Installation des LibreBooking n8n Nodes.
|
||||
## Methode 1: Auf dem Host bauen (EMPFOHLEN) ⭐
|
||||
|
||||
## Inhaltsverzeichnis
|
||||
Die zuverlässigste Methode für Docker-Installationen.
|
||||
|
||||
- [Voraussetzungen](#voraussetzungen)
|
||||
- [Installation aus Git-Archiv](#installation-aus-git-archiv)
|
||||
- [Methode 1: Automatische Installation mit Skript](#methode-1-automatische-installation-mit-skript)
|
||||
- [Methode 2: Manuelle Installation mit npm](#methode-2-manuelle-installation-mit-npm)
|
||||
- [Methode 3: Installation aus npm Registry](#methode-3-installation-aus-npm-registry)
|
||||
- [Methode 4: Docker Installation](#methode-4-docker-installation)
|
||||
- [Methode 5: n8n Community Nodes](#methode-5-n8n-community-nodes)
|
||||
- [Verifizierung der Installation](#verifizierung-der-installation)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
- [Deinstallation](#deinstallation)
|
||||
### Voraussetzungen
|
||||
|
||||
---
|
||||
- Node.js 18+
|
||||
- npm
|
||||
- Docker
|
||||
|
||||
## Voraussetzungen
|
||||
|
||||
### Systemanforderungen
|
||||
|
||||
| Komponente | Mindestversion | Empfohlen |
|
||||
|------------|---------------|-----------|
|
||||
| Node.js | 18.x | 20.x LTS |
|
||||
| npm | 8.x | 10.x |
|
||||
| n8n | 1.0.0 | Neueste |
|
||||
|
||||
### Node.js installieren
|
||||
|
||||
**Linux (Ubuntu/Debian):**
|
||||
```bash
|
||||
# Mit NodeSource Repository (empfohlen)
|
||||
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
|
||||
sudo apt-get install -y nodejs
|
||||
|
||||
# Version prüfen
|
||||
node --version
|
||||
npm --version
|
||||
```
|
||||
|
||||
**macOS:**
|
||||
```bash
|
||||
# Mit Homebrew
|
||||
brew install node@20
|
||||
|
||||
# Version prüfen
|
||||
node --version
|
||||
npm --version
|
||||
```
|
||||
|
||||
**Windows:**
|
||||
1. Lade Node.js von https://nodejs.org/ herunter
|
||||
2. Wähle die LTS-Version (20.x)
|
||||
3. Führe den Installer aus
|
||||
4. Öffne PowerShell und prüfe: `node --version`
|
||||
|
||||
### n8n installieren
|
||||
### Installation
|
||||
|
||||
```bash
|
||||
# Global installieren
|
||||
npm install -g n8n
|
||||
|
||||
# Installation prüfen
|
||||
n8n --version
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Installation aus Git-Archiv
|
||||
|
||||
### Archiv herunterladen
|
||||
|
||||
1. **GitHub Release herunterladen:**
|
||||
```bash
|
||||
# .tar.gz für Linux/Mac
|
||||
wget https://github.com/DEIN-REPO/n8n-nodes-librebooking/releases/latest/download/n8n-nodes-librebooking.tar.gz
|
||||
|
||||
# .zip für Windows
|
||||
# Über Browser herunterladen
|
||||
```
|
||||
|
||||
2. **Oder direkt von Git:**
|
||||
```bash
|
||||
git clone https://github.com/DEIN-REPO/n8n-nodes-librebooking.git
|
||||
cd n8n-nodes-librebooking
|
||||
```
|
||||
|
||||
### Archiv entpacken
|
||||
|
||||
**Linux/macOS:**
|
||||
```bash
|
||||
# .tar.gz entpacken
|
||||
tar -xzf n8n-nodes-librebooking.tar.gz
|
||||
cd n8n-nodes-librebooking
|
||||
```
|
||||
|
||||
**Windows (PowerShell):**
|
||||
```powershell
|
||||
# .zip entpacken
|
||||
Expand-Archive -Path n8n-nodes-librebooking.zip -DestinationPath .
|
||||
cd n8n-nodes-librebooking
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Methode 1: Automatische Installation mit Skript
|
||||
|
||||
Die einfachste Methode für die meisten Benutzer.
|
||||
|
||||
### Linux/macOS
|
||||
|
||||
```bash
|
||||
# In das Verzeichnis wechseln
|
||||
# 1. Klonen
|
||||
git clone https://github.com/your-org/n8n-nodes-librebooking.git
|
||||
cd n8n-nodes-librebooking
|
||||
|
||||
# Skript ausführbar machen (falls nötig)
|
||||
chmod +x install.sh
|
||||
|
||||
# Installation starten
|
||||
./install.sh
|
||||
```
|
||||
|
||||
**Optionen:**
|
||||
```bash
|
||||
./install.sh # Standard-Installation mit npm link
|
||||
./install.sh --no-link # Nur Build, ohne npm link
|
||||
./install.sh --global # Globale Installation
|
||||
./install.sh --help # Hilfe anzeigen
|
||||
```
|
||||
|
||||
### Windows (PowerShell)
|
||||
|
||||
```powershell
|
||||
# In das Verzeichnis wechseln
|
||||
cd n8n-nodes-librebooking
|
||||
|
||||
# Skript ausführen (evtl. Ausführungsrichtlinie anpassen)
|
||||
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
|
||||
.\install.ps1
|
||||
```
|
||||
|
||||
**Optionen:**
|
||||
```powershell
|
||||
.\install.ps1 # Standard-Installation mit npm link
|
||||
.\install.ps1 -NoLink # Nur Build, ohne npm link
|
||||
.\install.ps1 -Global # Globale Installation
|
||||
.\install.ps1 -Help # Hilfe anzeigen
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Methode 2: Manuelle Installation mit npm
|
||||
|
||||
Für Benutzer, die mehr Kontrolle über den Installationsprozess möchten.
|
||||
|
||||
### Schritt 1: Dependencies installieren
|
||||
|
||||
```bash
|
||||
cd n8n-nodes-librebooking
|
||||
# 2. Dependencies installieren
|
||||
npm install
|
||||
```
|
||||
|
||||
### Schritt 2: TypeScript kompilieren
|
||||
|
||||
```bash
|
||||
# 3. Bauen
|
||||
npm run build
|
||||
|
||||
# 4. In Container kopieren
|
||||
docker cp dist n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
docker cp package.json n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
docker cp node_modules n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
|
||||
# 5. Container neustarten
|
||||
docker restart n8n
|
||||
```
|
||||
|
||||
### Schritt 3: Node verlinken
|
||||
### Mit Skript
|
||||
|
||||
```bash
|
||||
# Node global verfügbar machen
|
||||
./quick-install.sh n8n
|
||||
```
|
||||
|
||||
### Mit npm scripts
|
||||
|
||||
```bash
|
||||
npm install
|
||||
npm run docker:deploy
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Methode 2: Docker mit vorgebautem dist/
|
||||
|
||||
Für Read-only Volumes.
|
||||
|
||||
```bash
|
||||
# 1. Bauen
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
# 2. Kopieren
|
||||
cp -r dist package.json node_modules /pfad/zu/custom-nodes/n8n-nodes-librebooking/
|
||||
|
||||
# 3. docker-compose.yml
|
||||
volumes:
|
||||
- ./custom-nodes:/home/node/.n8n/custom:ro # Read-only möglich!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Methode 3: Native Installation (ohne Docker)
|
||||
|
||||
```bash
|
||||
# 1. Installieren
|
||||
npm install
|
||||
npm run build
|
||||
npm link
|
||||
|
||||
# Mit n8n verlinken (optional, falls n8n global installiert ist)
|
||||
cd $(npm root -g)/n8n
|
||||
npm link n8n-nodes-librebooking
|
||||
```
|
||||
|
||||
### Schritt 4: n8n neu starten
|
||||
|
||||
```bash
|
||||
# n8n stoppen (falls läuft)
|
||||
# Ctrl+C oder:
|
||||
pkill -f n8n
|
||||
|
||||
# n8n starten
|
||||
# 2. n8n starten
|
||||
n8n start
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Methode 3: Installation aus npm Registry
|
||||
## Verifikation
|
||||
|
||||
> **Hinweis:** Diese Methode ist für eine zukünftige Veröffentlichung auf npm vorgesehen.
|
||||
Nach der Installation:
|
||||
|
||||
```bash
|
||||
# Global installieren
|
||||
npm install -g n8n-nodes-librebooking
|
||||
|
||||
# Oder lokal in einem Projekt
|
||||
npm install n8n-nodes-librebooking
|
||||
```
|
||||
|
||||
Nach der Veröffentlichung auf npm wird diese Methode die einfachste sein.
|
||||
|
||||
---
|
||||
|
||||
## Methode 4: Docker Installation
|
||||
|
||||
### Voraussetzungen für Docker
|
||||
|
||||
- Docker 20.x oder höher
|
||||
- Docker Compose v2.x (empfohlen)
|
||||
|
||||
**Docker installieren:**
|
||||
- Linux: https://docs.docker.com/engine/install/
|
||||
- macOS: https://docs.docker.com/desktop/mac/install/
|
||||
- Windows: https://docs.docker.com/desktop/windows/install/
|
||||
|
||||
### Mit docker-compose (empfohlen)
|
||||
|
||||
```bash
|
||||
cd n8n-nodes-librebooking
|
||||
|
||||
# Umgebungsvariablen konfigurieren (optional)
|
||||
cp .env.example .env
|
||||
# .env Datei bearbeiten
|
||||
|
||||
# Container bauen und starten
|
||||
docker-compose up -d
|
||||
|
||||
# Logs anzeigen
|
||||
docker-compose logs -f
|
||||
|
||||
# Status prüfen
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
**Umgebungsvariablen (`.env`):**
|
||||
```env
|
||||
# n8n Authentifizierung
|
||||
N8N_BASIC_AUTH_USER=admin
|
||||
N8N_BASIC_AUTH_PASSWORD=sicheres-passwort-hier
|
||||
|
||||
# Webhook-URL (für Produktion)
|
||||
WEBHOOK_URL=https://n8n.deine-domain.de/
|
||||
|
||||
# Zeitzone
|
||||
TZ=Europe/Berlin
|
||||
|
||||
# Log-Level (debug, info, warn, error)
|
||||
N8N_LOG_LEVEL=info
|
||||
```
|
||||
|
||||
**Nützliche docker-compose Befehle:**
|
||||
```bash
|
||||
# Stoppen
|
||||
docker-compose down
|
||||
|
||||
# Neu bauen (nach Änderungen)
|
||||
docker-compose build --no-cache
|
||||
|
||||
# Neustart
|
||||
docker-compose restart
|
||||
|
||||
# Logs eines bestimmten Services
|
||||
docker-compose logs -f n8n
|
||||
|
||||
# In Container Shell
|
||||
docker-compose exec n8n sh
|
||||
```
|
||||
|
||||
### Mit Docker direkt
|
||||
|
||||
```bash
|
||||
cd n8n-nodes-librebooking
|
||||
|
||||
# Image bauen
|
||||
docker build -t n8n-librebooking .
|
||||
|
||||
# Container starten
|
||||
docker run -d \
|
||||
--name n8n-librebooking \
|
||||
-p 5678:5678 \
|
||||
-e N8N_BASIC_AUTH_ACTIVE=true \
|
||||
-e N8N_BASIC_AUTH_USER=admin \
|
||||
-e N8N_BASIC_AUTH_PASSWORD=changeme \
|
||||
-e GENERIC_TIMEZONE=Europe/Berlin \
|
||||
-v n8n_data:/home/node/.n8n \
|
||||
n8n-librebooking
|
||||
```
|
||||
|
||||
**Container verwalten:**
|
||||
```bash
|
||||
# Logs anzeigen
|
||||
docker logs -f n8n-librebooking
|
||||
|
||||
# Stoppen
|
||||
docker stop n8n-librebooking
|
||||
|
||||
# Starten
|
||||
docker start n8n-librebooking
|
||||
|
||||
# Entfernen
|
||||
docker rm -f n8n-librebooking
|
||||
|
||||
# Image entfernen
|
||||
docker rmi n8n-librebooking
|
||||
```
|
||||
|
||||
### Volumes und Konfiguration
|
||||
|
||||
**Wichtige Volumes:**
|
||||
|
||||
| Volume/Pfad | Beschreibung |
|
||||
|-------------|--------------|
|
||||
| `/home/node/.n8n` | n8n Datenverzeichnis (Workflows, Credentials) |
|
||||
| `/home/node/.n8n/custom` | Custom Nodes |
|
||||
| `/home/node/workflows` | Beispiel-Workflows (read-only) |
|
||||
|
||||
**Daten sichern:**
|
||||
```bash
|
||||
# Mit docker-compose
|
||||
docker-compose exec n8n tar -czf /tmp/backup.tar.gz /home/node/.n8n
|
||||
docker cp n8n-librebooking:/tmp/backup.tar.gz ./backup.tar.gz
|
||||
|
||||
# Ohne docker-compose
|
||||
docker cp n8n-librebooking:/home/node/.n8n ./n8n-backup
|
||||
```
|
||||
|
||||
**Daten wiederherstellen:**
|
||||
```bash
|
||||
docker cp ./n8n-backup/. n8n-librebooking:/home/node/.n8n/
|
||||
docker-compose restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Methode 5: n8n Community Nodes
|
||||
|
||||
> **Hinweis:** Diese Methode wird verfügbar sein, sobald der Node im n8n Community Node Repository veröffentlicht ist.
|
||||
|
||||
1. Öffne n8n im Browser
|
||||
2. Gehe zu **Settings** → **Community Nodes**
|
||||
3. Klicke auf **Install a community node**
|
||||
4. Gib ein: `n8n-nodes-librebooking`
|
||||
5. Klicke auf **Install**
|
||||
6. Starte n8n neu
|
||||
|
||||
---
|
||||
|
||||
## Verifizierung der Installation
|
||||
|
||||
### 1. n8n starten
|
||||
|
||||
```bash
|
||||
# Lokal
|
||||
n8n start
|
||||
|
||||
# Mit Docker
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### 2. Browser öffnen
|
||||
|
||||
Öffne http://localhost:5678 im Browser.
|
||||
|
||||
### 3. Node suchen
|
||||
|
||||
1. Erstelle einen neuen Workflow
|
||||
2. Klicke auf das **+** Symbol
|
||||
1. Öffne n8n: http://localhost:5678
|
||||
2. Erstelle neuen Workflow
|
||||
3. Suche nach "LibreBooking"
|
||||
4. Du solltest zwei Nodes sehen:
|
||||
- **LibreBooking** (für API-Operationen)
|
||||
- **LibreBooking Trigger** (für Events)
|
||||
|
||||
### 4. Credentials einrichten
|
||||
|
||||
1. Klicke auf einen LibreBooking Node
|
||||
2. Unter "Credentials" klicke auf **Create New**
|
||||
3. Wähle **LibreBooking API**
|
||||
4. Fülle aus:
|
||||
- **URL:** Deine LibreBooking URL (z.B. `https://booking.example.com/Web/Services`)
|
||||
- **Username:** Dein Admin-Benutzername
|
||||
- **Password:** Dein Passwort
|
||||
5. Klicke auf **Save**
|
||||
6. Teste die Verbindung
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Häufige Probleme
|
||||
|
||||
#### Node wird nicht angezeigt
|
||||
|
||||
**Problem:** Der LibreBooking Node erscheint nicht in n8n.
|
||||
|
||||
**Lösungen:**
|
||||
```bash
|
||||
# 1. Prüfe, ob der Build erfolgreich war
|
||||
ls -la dist/
|
||||
|
||||
# 2. Prüfe npm link Status
|
||||
npm ls -g --depth=0 | grep librebooking
|
||||
|
||||
# 3. n8n Custom Extensions Pfad prüfen
|
||||
echo $N8N_CUSTOM_EXTENSIONS
|
||||
|
||||
# 4. n8n komplett neu starten
|
||||
pkill -f n8n
|
||||
n8n start
|
||||
```
|
||||
|
||||
#### Build-Fehler
|
||||
|
||||
**Problem:** `npm run build` schlägt fehl.
|
||||
|
||||
**Lösungen:**
|
||||
```bash
|
||||
# Node.js Version prüfen
|
||||
node --version # Sollte >= 18 sein
|
||||
|
||||
# node_modules löschen und neu installieren
|
||||
rm -rf node_modules
|
||||
npm install
|
||||
|
||||
# TypeScript-Fehler anzeigen
|
||||
npx tsc --noEmit
|
||||
```
|
||||
|
||||
#### npm link Probleme
|
||||
|
||||
**Problem:** `npm link` funktioniert nicht.
|
||||
|
||||
**Lösungen:**
|
||||
```bash
|
||||
# Als Admin/Root ausführen (Linux/Mac)
|
||||
sudo npm link
|
||||
|
||||
# Windows: PowerShell als Administrator starten
|
||||
|
||||
# Alternativer Pfad für Custom Nodes
|
||||
export N8N_CUSTOM_EXTENSIONS=$(pwd)
|
||||
n8n start
|
||||
```
|
||||
|
||||
#### Docker-Probleme
|
||||
|
||||
**Problem:** Container startet nicht.
|
||||
|
||||
**Lösungen:**
|
||||
```bash
|
||||
# Logs prüfen
|
||||
docker-compose logs n8n
|
||||
|
||||
# Container-Status prüfen
|
||||
docker-compose ps
|
||||
|
||||
# Neu bauen
|
||||
docker-compose build --no-cache
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
#### Credential-Fehler
|
||||
|
||||
**Problem:** "Authentication failed" bei Verbindung.
|
||||
|
||||
**Lösungen:**
|
||||
1. Prüfe LibreBooking URL (inkl. `/Web/Services`)
|
||||
2. Prüfe Benutzername und Passwort
|
||||
3. Prüfe ob API in LibreBooking aktiviert ist:
|
||||
- Admin → Konfiguration → API aktivieren
|
||||
4. Teste API manuell:
|
||||
```bash
|
||||
curl -X POST "https://dein-server/Web/Services/Authentication/Authenticate" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"username":"admin","password":"password"}'
|
||||
```
|
||||
|
||||
### Logs und Debugging
|
||||
|
||||
**n8n Logs aktivieren:**
|
||||
```bash
|
||||
# Umgebungsvariable setzen
|
||||
export N8N_LOG_LEVEL=debug
|
||||
n8n start
|
||||
|
||||
# Mit Docker
|
||||
docker-compose exec n8n sh -c "N8N_LOG_LEVEL=debug n8n start"
|
||||
```
|
||||
|
||||
**Node-spezifische Logs:**
|
||||
In n8n Workflow-Ausführungen werden Details angezeigt unter "Execution Data".
|
||||
|
||||
---
|
||||
4. Wenn der Node erscheint → ✅ Installation erfolgreich
|
||||
|
||||
## Deinstallation
|
||||
|
||||
### npm link entfernen
|
||||
|
||||
```bash
|
||||
# Im Projektverzeichnis
|
||||
npm unlink
|
||||
# Docker
|
||||
docker exec n8n rm -rf /home/node/.n8n/custom/n8n-nodes-librebooking
|
||||
docker restart n8n
|
||||
|
||||
# Global entfernen
|
||||
# Native
|
||||
npm unlink -g n8n-nodes-librebooking
|
||||
```
|
||||
|
||||
### Global installiertes Paket entfernen
|
||||
|
||||
```bash
|
||||
npm uninstall -g n8n-nodes-librebooking
|
||||
```
|
||||
|
||||
### Docker entfernen
|
||||
|
||||
```bash
|
||||
# Container und Volumes entfernen
|
||||
docker-compose down -v
|
||||
|
||||
# Images entfernen
|
||||
docker rmi n8n-librebooking
|
||||
docker rmi n8nio/n8n
|
||||
```
|
||||
|
||||
### Projektverzeichnis löschen
|
||||
|
||||
```bash
|
||||
# Verzeichnis löschen
|
||||
rm -rf n8n-nodes-librebooking
|
||||
|
||||
# Archiv löschen
|
||||
rm n8n-nodes-librebooking.tar.gz
|
||||
rm n8n-nodes-librebooking.zip
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Support
|
||||
|
||||
Bei Fragen oder Problemen:
|
||||
|
||||
1. **GitHub Issues:** [Hier Issues erstellen](https://github.com/DEIN-REPO/n8n-nodes-librebooking/issues)
|
||||
2. **Dokumentation:** Siehe [README.md](README.md)
|
||||
3. **LibreBooking API:** https://www.bookedscheduler.com/help/api/
|
||||
|
||||
---
|
||||
|
||||
*Letzte Aktualisierung: Januar 2026*
|
||||
|
|
|
|||
|
|
@ -0,0 +1,328 @@
|
|||
# Manuelle Installation im Docker Container
|
||||
|
||||
Diese Anleitung beschreibt, wie Sie den LibreBooking Node manuell im Docker Container installieren, wenn die Dateien bereits kopiert wurden, aber der Node nicht in n8n erscheint.
|
||||
|
||||
---
|
||||
|
||||
## Situation
|
||||
|
||||
Sie haben die Dateien in den Container kopiert (z.B. nach `/opt/n8n/custom-nodes` oder `/home/node/.n8n/custom/n8n-nodes-librebooking`), aber:
|
||||
|
||||
- Der LibreBooking Node erscheint nicht in der n8n Node-Suche
|
||||
- Die TypeScript-Dateien wurden nicht kompiliert
|
||||
- Das `dist/` Verzeichnis fehlt oder ist leer
|
||||
|
||||
---
|
||||
|
||||
## Diagnose
|
||||
|
||||
### Schnell-Check mit einem Befehl
|
||||
|
||||
```bash
|
||||
# Prüft Dateien und Status im Container
|
||||
docker exec n8n sh -c "ls -la /home/node/.n8n/custom/*/dist/ 2>/dev/null || echo 'dist/ nicht gefunden'"
|
||||
```
|
||||
|
||||
### Ausführlicher Check mit Skript
|
||||
|
||||
```bash
|
||||
# Check-Skript in Container kopieren und ausführen
|
||||
docker cp check-installation.sh n8n:/tmp/
|
||||
docker exec n8n sh /tmp/check-installation.sh
|
||||
```
|
||||
|
||||
### Manuell im Container prüfen
|
||||
|
||||
```bash
|
||||
# In den Container einloggen
|
||||
docker exec -it n8n sh
|
||||
|
||||
# Prüfen, was vorhanden ist
|
||||
ls -la /home/node/.n8n/custom/
|
||||
ls -la /home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
|
||||
# Umgebungsvariablen prüfen
|
||||
env | grep N8N
|
||||
|
||||
# Container verlassen
|
||||
exit
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Lösung 1: Automatisch mit Skript (empfohlen)
|
||||
|
||||
Das einfachste ist das All-in-One-Skript:
|
||||
|
||||
```bash
|
||||
# Auf dem Host ausführen
|
||||
./fix-node-installation.sh
|
||||
```
|
||||
|
||||
Oder mit spezifischem Container-Namen:
|
||||
|
||||
```bash
|
||||
./fix-node-installation.sh -c mein-n8n-container
|
||||
```
|
||||
|
||||
### Alternative: Nur das Installations-Skript
|
||||
|
||||
```bash
|
||||
# Skript in Container kopieren
|
||||
docker cp install-in-container.sh n8n:/tmp/
|
||||
|
||||
# Skript im Container ausführen
|
||||
docker exec -it n8n sh /tmp/install-in-container.sh
|
||||
|
||||
# Container neustarten
|
||||
docker restart n8n
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Lösung 2: Manuelle Schritte im Container
|
||||
|
||||
### Schritt 1: In den Container einloggen
|
||||
|
||||
```bash
|
||||
docker exec -it n8n sh
|
||||
```
|
||||
|
||||
### Schritt 2: Zum Custom-Node-Verzeichnis wechseln
|
||||
|
||||
```bash
|
||||
# Standard-Pfad (offizielles n8n Image)
|
||||
cd /home/node/.n8n/custom/n8n-nodes-librebooking
|
||||
|
||||
# Oder falls an anderem Ort:
|
||||
cd /opt/n8n/custom-nodes
|
||||
# oder
|
||||
cd /data/custom-nodes
|
||||
```
|
||||
|
||||
### Schritt 3: Prüfen ob Dateien vorhanden sind
|
||||
|
||||
```bash
|
||||
ls -la
|
||||
# Sollte zeigen: package.json, tsconfig.json, nodes/, credentials/
|
||||
```
|
||||
|
||||
### Schritt 4: Dependencies installieren
|
||||
|
||||
```bash
|
||||
npm install
|
||||
```
|
||||
|
||||
Erwartete Ausgabe:
|
||||
```
|
||||
added 50 packages in 10s
|
||||
```
|
||||
|
||||
### Schritt 5: Node kompilieren
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
Erwartete Ausgabe:
|
||||
```
|
||||
> n8n-nodes-librebooking@1.0.0 build
|
||||
> tsc && npm run copy:icons
|
||||
```
|
||||
|
||||
### Schritt 6: Prüfen ob Build erfolgreich war
|
||||
|
||||
```bash
|
||||
ls -la dist/
|
||||
ls -la dist/nodes/LibreBooking/
|
||||
```
|
||||
|
||||
Sollte zeigen:
|
||||
- `dist/nodes/LibreBooking/LibreBooking.node.js`
|
||||
- `dist/nodes/LibreBookingTrigger/LibreBookingTrigger.node.js`
|
||||
- `dist/credentials/LibreBookingApi.credentials.js`
|
||||
|
||||
### Schritt 7: Container verlassen und neustarten
|
||||
|
||||
```bash
|
||||
# Container verlassen
|
||||
exit
|
||||
|
||||
# Container neustarten (auf dem Host)
|
||||
docker restart n8n
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Lösung 3: Direkt mit docker exec (Ein-Befehl-Lösung)
|
||||
|
||||
Wenn Sie schnell zum Ziel kommen wollen:
|
||||
|
||||
```bash
|
||||
# Alles in einem Befehl
|
||||
docker exec n8n sh -c "cd /home/node/.n8n/custom/n8n-nodes-librebooking && npm install && npm run build"
|
||||
|
||||
# Container neustarten
|
||||
docker restart n8n
|
||||
```
|
||||
|
||||
Für anderen Pfad:
|
||||
|
||||
```bash
|
||||
docker exec n8n sh -c "cd /opt/n8n/custom-nodes && npm install && npm run build"
|
||||
docker restart n8n
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Verifizierung
|
||||
|
||||
### 1. Logs prüfen
|
||||
|
||||
```bash
|
||||
# Nach LibreBooking in den Logs suchen
|
||||
docker logs n8n 2>&1 | grep -i "librebooking\|custom\|node"
|
||||
```
|
||||
|
||||
### 2. In n8n prüfen
|
||||
|
||||
1. Öffnen Sie n8n im Browser (z.B. `http://localhost:5678`)
|
||||
2. Erstellen Sie einen neuen Workflow oder öffnen Sie einen bestehenden
|
||||
3. Klicken Sie auf `+` um einen neuen Node hinzuzufügen
|
||||
4. Suchen Sie nach "LibreBooking"
|
||||
5. Es sollten zwei Nodes erscheinen:
|
||||
- **LibreBooking** - Hauptnode für alle Operationen
|
||||
- **LibreBooking Trigger** - Trigger für Reservierungen
|
||||
|
||||
### 3. Node-Dateien im Container prüfen
|
||||
|
||||
```bash
|
||||
# Prüfe ob .node.js Dateien existieren
|
||||
docker exec n8n find /home/node/.n8n/custom -name "*.node.js" 2>/dev/null
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Problem: npm nicht gefunden
|
||||
|
||||
**Symptom:**
|
||||
```
|
||||
sh: npm: not found
|
||||
```
|
||||
|
||||
**Lösung:**
|
||||
Das verwendete Docker-Image enthält kein npm. Verwenden Sie ein Image mit Node.js:
|
||||
|
||||
```bash
|
||||
# Prüfen Sie das Image
|
||||
docker inspect n8n --format='{{.Config.Image}}'
|
||||
|
||||
# Das offizielle n8n Image (n8nio/n8n) enthält npm
|
||||
# Falls Sie ein minimales Image verwenden, wechseln Sie zu n8nio/n8n
|
||||
```
|
||||
|
||||
### Problem: Permission denied
|
||||
|
||||
**Symptom:**
|
||||
```
|
||||
EACCES: permission denied
|
||||
npm ERR! could not create a lockfile
|
||||
```
|
||||
|
||||
**Lösung:**
|
||||
n8n läuft als User `node` (UID 1000). Setzen Sie die Berechtigungen:
|
||||
|
||||
```bash
|
||||
# Auf dem Host (vor dem Kopieren)
|
||||
sudo chown -R 1000:1000 custom-nodes/
|
||||
|
||||
# Oder im Container als root
|
||||
docker exec -u root n8n chown -R node:node /home/node/.n8n/custom/
|
||||
```
|
||||
|
||||
### Problem: Build schlägt fehl
|
||||
|
||||
**Symptom:**
|
||||
```
|
||||
error TS2307: Cannot find module 'n8n-workflow'
|
||||
```
|
||||
|
||||
**Lösung:**
|
||||
```bash
|
||||
# Im Container
|
||||
cd /home/node/.n8n/custom/n8n-nodes-librebooking
|
||||
rm -rf node_modules package-lock.json
|
||||
npm install
|
||||
npm run build
|
||||
```
|
||||
|
||||
### Problem: Node erscheint nach Neustart immer noch nicht
|
||||
|
||||
**Mögliche Ursachen:**
|
||||
|
||||
1. **Falscher Pfad**: N8N_CUSTOM_EXTENSIONS zeigt nicht auf das richtige Verzeichnis
|
||||
```bash
|
||||
docker exec n8n env | grep N8N_CUSTOM
|
||||
# Sollte zeigen: N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
|
||||
```
|
||||
|
||||
2. **package.json n8n-Sektion fehlt**: Die `n8n` Konfiguration in package.json muss korrekt sein
|
||||
```bash
|
||||
docker exec n8n cat /home/node/.n8n/custom/n8n-nodes-librebooking/package.json | grep -A10 '"n8n"'
|
||||
```
|
||||
|
||||
3. **Container-Cache**: Container komplett neu erstellen
|
||||
```bash
|
||||
docker compose down
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
4. **n8n Version zu alt**: Der Node benötigt n8n >= 1.0.0
|
||||
```bash
|
||||
docker exec n8n n8n --version
|
||||
```
|
||||
|
||||
### Problem: Fehler bei npm install (Netzwerk)
|
||||
|
||||
**Symptom:**
|
||||
```
|
||||
npm ERR! network request failed
|
||||
```
|
||||
|
||||
**Lösung:**
|
||||
```bash
|
||||
# DNS prüfen
|
||||
docker exec n8n cat /etc/resolv.conf
|
||||
|
||||
# npm Registry prüfen
|
||||
docker exec n8n npm config get registry
|
||||
|
||||
# Ggf. Registry setzen
|
||||
docker exec n8n npm config set registry https://registry.npmjs.org/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Schnellreferenz
|
||||
|
||||
| Aktion | Befehl |
|
||||
|--------|--------|
|
||||
| Status prüfen | `docker exec n8n sh /tmp/check-installation.sh` |
|
||||
| Installieren | `docker exec n8n sh -c "cd /home/node/.n8n/custom/n8n-nodes-librebooking && npm install && npm run build"` |
|
||||
| Neustarten | `docker restart n8n` |
|
||||
| Logs prüfen | `docker logs n8n 2>&1 \| grep -i libre` |
|
||||
| Im Container | `docker exec -it n8n sh` |
|
||||
|
||||
---
|
||||
|
||||
## Weiterführende Dokumentation
|
||||
|
||||
- [DOCKER-INTEGRATION.md](DOCKER-INTEGRATION.md) - Vollständige Docker-Anleitung
|
||||
- [TROUBLESHOOTING.md](TROUBLESHOOTING.md) - Alle Troubleshooting-Themen
|
||||
- [SCHNELLSTART-DOCKER.md](SCHNELLSTART-DOCKER.md) - Docker-Schnellstart
|
||||
|
||||
---
|
||||
|
||||
*Letzte Aktualisierung: Januar 2026*
|
||||
662
README.md
662
README.md
|
|
@ -1,618 +1,102 @@
|
|||
# n8n-nodes-librebooking
|
||||
# LibreBooking n8n Node
|
||||
|
||||
Ein vollständiger n8n Node für die Integration mit [LibreBooking](https://librebooking.org/) - einer Open-Source Ressourcen- und Raumbuchungslösung.
|
||||
Integration von LibreBooking in n8n für automatisierte Reservierungs- und Ressourcenverwaltung.
|
||||
|
||||
<!-- Badges -->
|
||||
[](https://www.npmjs.com/package/n8n-nodes-librebooking)
|
||||
[](https://opensource.org/licenses/MIT)
|
||||
[](https://n8n.io)
|
||||
[](https://librebooking.org)
|
||||
[](https://nodejs.org)
|
||||
[](https://www.typescriptlang.org)
|
||||
## ⚡ Schnellstart (EMPFOHLEN)
|
||||
|
||||
---
|
||||
|
||||
## ⚡ Schnellstart
|
||||
|
||||
### Option 1: Mit Installations-Skript (empfohlen)
|
||||
**Die einfachste Methode: Auf dem Host bauen, in Docker kopieren**
|
||||
|
||||
```bash
|
||||
# Archiv entpacken
|
||||
tar -xzf n8n-nodes-librebooking.tar.gz
|
||||
cd n8n-nodes-librebooking
|
||||
|
||||
# Installieren (Linux/Mac)
|
||||
./install.sh
|
||||
|
||||
# n8n starten
|
||||
n8n start
|
||||
```
|
||||
|
||||
### Option 2: Mit Docker
|
||||
|
||||
```bash
|
||||
# Archiv entpacken und starten
|
||||
tar -xzf n8n-nodes-librebooking.tar.gz
|
||||
cd n8n-nodes-librebooking
|
||||
docker-compose up -d
|
||||
|
||||
# Browser öffnen: http://localhost:5678
|
||||
```
|
||||
|
||||
### Option 3: Manuell mit npm
|
||||
|
||||
```bash
|
||||
cd n8n-nodes-librebooking
|
||||
npm install && npm run build && npm link
|
||||
n8n start
|
||||
```
|
||||
|
||||
📖 **Detaillierte Anleitung:** Siehe [INSTALLATION.md](INSTALLATION.md)
|
||||
|
||||
---
|
||||
|
||||
## 📋 Inhaltsverzeichnis
|
||||
|
||||
- [Schnellstart](#-schnellstart)
|
||||
- [Funktionen](#-funktionen)
|
||||
- [Installation](#-installation)
|
||||
- [Konfiguration](#️-konfiguration)
|
||||
- [Operationen](#-operationen)
|
||||
- [Beispiele](#-beispiele)
|
||||
- [Trigger Node](#-trigger-node)
|
||||
- [Troubleshooting](#-troubleshooting)
|
||||
- [Entwicklung](#-entwicklung)
|
||||
- [Lizenz](#-lizenz)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Funktionen
|
||||
|
||||
### Regular Node (LibreBooking)
|
||||
- **Reservierungen**: Erstellen, Abrufen, Aktualisieren, Löschen, Genehmigen, Check-In/Check-Out
|
||||
- **Ressourcen**: Verwalten von Räumen, Equipment und anderen buchbaren Ressourcen
|
||||
- **Zeitpläne**: Abrufen von Zeitplänen und verfügbaren Slots
|
||||
- **Benutzer**: Vollständige Benutzerverwaltung (Admin-Rechte erforderlich)
|
||||
- **Konten**: Eigenes Konto verwalten
|
||||
- **Gruppen**: Benutzergruppen mit Rollen und Berechtigungen verwalten
|
||||
- **Zubehör**: Zubehörteile abrufen
|
||||
- **Attribute**: Benutzerdefinierte Felder verwalten
|
||||
|
||||
### Trigger Node (LibreBooking Trigger)
|
||||
- Polling-basierter Trigger für Reservierungs-Events
|
||||
- Erkennung neuer Reservierungen
|
||||
- Erkennung geänderter Reservierungen
|
||||
- Konfigurierbare Filter (Ressource, Zeitplan, Benutzer)
|
||||
- Deduplizierung von Events
|
||||
|
||||
---
|
||||
|
||||
## 📦 Installation
|
||||
|
||||
### Über npm (empfohlen)
|
||||
|
||||
```bash
|
||||
npm install n8n-nodes-librebooking
|
||||
```
|
||||
|
||||
### Manuelle Installation
|
||||
|
||||
1. Laden Sie das Paket herunter oder klonen Sie das Repository:
|
||||
```bash
|
||||
git clone https://github.com/your-org/n8n-nodes-librebooking.git
|
||||
```
|
||||
|
||||
2. Wechseln Sie ins Verzeichnis und installieren Sie die Abhängigkeiten:
|
||||
```bash
|
||||
cd n8n-nodes-librebooking
|
||||
npm install
|
||||
```
|
||||
|
||||
3. Kompilieren Sie das Projekt:
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
4. Verlinken Sie das Paket für lokale Entwicklung:
|
||||
```bash
|
||||
npm link
|
||||
```
|
||||
|
||||
5. Verlinken Sie es in Ihrem n8n Custom-Nodes-Verzeichnis:
|
||||
```bash
|
||||
cd ~/.n8n/custom
|
||||
npm link n8n-nodes-librebooking
|
||||
```
|
||||
|
||||
6. Starten Sie n8n neu:
|
||||
```bash
|
||||
n8n start
|
||||
```
|
||||
|
||||
### Docker-Installation
|
||||
|
||||
Fügen Sie in Ihrem Docker-Compose oder Dockerfile hinzu:
|
||||
|
||||
```dockerfile
|
||||
RUN npm install -g n8n-nodes-librebooking
|
||||
```
|
||||
|
||||
Oder über Umgebungsvariable:
|
||||
```yaml
|
||||
environment:
|
||||
- N8N_CUSTOM_EXTENSIONS=n8n-nodes-librebooking
|
||||
```
|
||||
|
||||
### Integration in bestehende Docker-Installation
|
||||
|
||||
Für bestehende n8n Docker-Installationen gibt es mehrere Integrationsmethoden:
|
||||
|
||||
#### Schnellste Methode: Automatisches Skript
|
||||
|
||||
```bash
|
||||
# Ins n8n Verzeichnis wechseln
|
||||
cd /pfad/zu/ihrer/n8n/installation
|
||||
|
||||
# Skript ausführen
|
||||
./install-docker.sh
|
||||
```
|
||||
|
||||
#### Manuelle Methode
|
||||
|
||||
```bash
|
||||
# 1. Custom Nodes kopieren
|
||||
cp -r custom-nodes /pfad/zu/n8n/
|
||||
cd /pfad/zu/n8n/custom-nodes && npm install && npm run build
|
||||
|
||||
# 2. docker-compose.override.yml erstellen
|
||||
cat > docker-compose.override.yml << 'EOF'
|
||||
version: '3.8'
|
||||
services:
|
||||
n8n:
|
||||
volumes:
|
||||
- ./custom-nodes:/home/node/.n8n/custom/n8n-nodes-librebooking:ro
|
||||
environment:
|
||||
- N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
|
||||
- N8N_COMMUNITY_NODES_ENABLED=true
|
||||
EOF
|
||||
|
||||
# 3. Container neustarten
|
||||
docker-compose restart n8n
|
||||
```
|
||||
|
||||
#### Eigenes Docker-Image bauen
|
||||
|
||||
```bash
|
||||
docker build -f Dockerfile.custom-nodes -t n8n-librebooking .
|
||||
docker run -d -p 5678:5678 n8n-librebooking
|
||||
```
|
||||
|
||||
📖 **Ausführliche Docker-Anleitung:** Siehe [DOCKER-INTEGRATION.md](DOCKER-INTEGRATION.md)
|
||||
|
||||
🚀 **Docker-Schnellstart:** Siehe [SCHNELLSTART-DOCKER.md](SCHNELLSTART-DOCKER.md)
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Konfiguration
|
||||
|
||||
### Credentials einrichten
|
||||
|
||||
1. Öffnen Sie n8n und gehen Sie zu **Settings** → **Credentials**
|
||||
2. Klicken Sie auf **Add Credential** und wählen Sie **LibreBooking API**
|
||||
3. Füllen Sie die folgenden Felder aus:
|
||||
|
||||
| Feld | Beschreibung | Beispiel |
|
||||
|------|-------------|----------|
|
||||
| **LibreBooking URL** | Die Basis-URL Ihrer LibreBooking-Installation | `https://booking.example.com` |
|
||||
| **Benutzername** | Ihr LibreBooking-Login (E-Mail oder Benutzername) | `admin@example.com` |
|
||||
| **Passwort** | Ihr LibreBooking-Passwort | `•••••••••` |
|
||||
|
||||
> ⚠️ **Wichtig**: Die URL sollte **ohne** `/Web/Services` angegeben werden!
|
||||
|
||||
### API aktivieren
|
||||
|
||||
Stellen Sie sicher, dass die API in Ihrer LibreBooking-Installation aktiviert ist:
|
||||
|
||||
1. Öffnen Sie die `config.php` Ihrer LibreBooking-Installation
|
||||
2. Suchen Sie nach `$conf['settings']['api']['enabled']`
|
||||
3. Setzen Sie den Wert auf `true`
|
||||
|
||||
```php
|
||||
$conf['settings']['api']['enabled'] = 'true';
|
||||
```
|
||||
|
||||
### Credential-Test
|
||||
|
||||
Nach dem Speichern der Credentials können Sie diese testen:
|
||||
- Klicken Sie auf **Test** um die Verbindung zu überprüfen
|
||||
- Bei erfolgreicher Verbindung wird eine Bestätigung angezeigt
|
||||
|
||||
---
|
||||
|
||||
## 📖 Operationen
|
||||
|
||||
### Reservierungen
|
||||
|
||||
| Operation | Beschreibung | Admin-Rechte |
|
||||
|-----------|-------------|--------------|
|
||||
| **Alle Abrufen** | Liste aller Reservierungen mit optionalen Filtern | ❌ |
|
||||
| **Abrufen** | Einzelne Reservierung per Referenznummer | ❌ |
|
||||
| **Erstellen** | Neue Reservierung anlegen | ❌ |
|
||||
| **Aktualisieren** | Bestehende Reservierung ändern | ❌ |
|
||||
| **Löschen** | Reservierung entfernen | ❌ |
|
||||
| **Genehmigen** | Ausstehende Reservierung genehmigen | ❌* |
|
||||
| **Check-In** | In Reservierung einchecken | ❌ |
|
||||
| **Check-Out** | Aus Reservierung auschecken | ❌ |
|
||||
|
||||
*Erfordert Genehmigungsrechte
|
||||
|
||||
#### Filter für "Alle Abrufen"
|
||||
- `userId` - Nach Benutzer filtern
|
||||
- `resourceId` - Nach Ressource filtern
|
||||
- `scheduleId` - Nach Zeitplan filtern
|
||||
- `startDateTime` - Startzeit (ISO 8601)
|
||||
- `endDateTime` - Endzeit (ISO 8601)
|
||||
|
||||
#### Zusätzliche Felder für "Erstellen/Aktualisieren"
|
||||
- `description` - Beschreibung
|
||||
- `participants` - Teilnehmer (Benutzer-IDs)
|
||||
- `invitees` - Eingeladene (Benutzer-IDs)
|
||||
- `resources` - Zusätzliche Ressourcen
|
||||
- `allowParticipation` - Teilnahme erlauben
|
||||
|
||||
### Ressourcen
|
||||
|
||||
| Operation | Beschreibung | Admin-Rechte |
|
||||
|-----------|-------------|--------------|
|
||||
| **Alle Abrufen** | Liste aller Ressourcen | ❌ |
|
||||
| **Abrufen** | Einzelne Ressource per ID | ❌ |
|
||||
| **Verfügbarkeit Prüfen** | Verfügbarkeit einer/aller Ressourcen | ❌ |
|
||||
| **Gruppen Abrufen** | Ressourcen-Gruppenstruktur | ❌ |
|
||||
| **Typen Abrufen** | Verfügbare Ressourcen-Typen | ❌ |
|
||||
| **Status Abrufen** | Verfügbare Status-Werte | ❌ |
|
||||
| **Erstellen** | Neue Ressource anlegen | ✅ |
|
||||
| **Aktualisieren** | Ressource ändern | ✅ |
|
||||
| **Löschen** | Ressource entfernen | ✅ |
|
||||
|
||||
#### Ressourcen-Optionen
|
||||
- `location` - Standort
|
||||
- `contact` - Kontaktinformation
|
||||
- `description` - Beschreibung
|
||||
- `maxParticipants` - Maximale Teilnehmerzahl
|
||||
- `requiresApproval` - Genehmigung erforderlich
|
||||
- `allowMultiday` - Mehrtägige Buchungen
|
||||
- `requiresCheckIn` - Check-In erforderlich
|
||||
- `autoReleaseMinutes` - Auto-Release nach X Minuten
|
||||
- `color` - Anzeigefarbe (Hex)
|
||||
- `statusId` - Status (0=Versteckt, 1=Verfügbar, 2=Nicht verfügbar)
|
||||
|
||||
### Zeitpläne
|
||||
|
||||
| Operation | Beschreibung | Admin-Rechte |
|
||||
|-----------|-------------|--------------|
|
||||
| **Alle Abrufen** | Liste aller Zeitpläne | ❌ |
|
||||
| **Abrufen** | Einzelner Zeitplan mit Perioden | ❌ |
|
||||
| **Slots Abrufen** | Verfügbare Slots eines Zeitplans | ❌ |
|
||||
|
||||
### Benutzer (Admin)
|
||||
|
||||
| Operation | Beschreibung | Admin-Rechte |
|
||||
|-----------|-------------|--------------|
|
||||
| **Alle Abrufen** | Liste aller Benutzer | ❌ |
|
||||
| **Abrufen** | Einzelner Benutzer per ID | ❌ |
|
||||
| **Erstellen** | Neuen Benutzer anlegen | ✅ |
|
||||
| **Aktualisieren** | Benutzer ändern | ✅ |
|
||||
| **Passwort Ändern** | Benutzer-Passwort setzen | ✅ |
|
||||
| **Löschen** | Benutzer entfernen | ✅ |
|
||||
|
||||
### Konten
|
||||
|
||||
| Operation | Beschreibung | Admin-Rechte |
|
||||
|-----------|-------------|--------------|
|
||||
| **Abrufen** | Eigene Kontoinformationen | ❌ |
|
||||
| **Erstellen** | Neues Konto (Registrierung) | ❌ |
|
||||
| **Aktualisieren** | Eigenes Konto ändern | ❌ |
|
||||
| **Passwort Ändern** | Eigenes Passwort ändern | ❌ |
|
||||
|
||||
### Gruppen
|
||||
|
||||
| Operation | Beschreibung | Admin-Rechte |
|
||||
|-----------|-------------|--------------|
|
||||
| **Alle Abrufen** | Liste aller Gruppen | ❌ |
|
||||
| **Abrufen** | Einzelne Gruppe | ❌ |
|
||||
| **Erstellen** | Neue Gruppe anlegen | ✅ |
|
||||
| **Aktualisieren** | Gruppe ändern | ✅ |
|
||||
| **Löschen** | Gruppe entfernen | ✅ |
|
||||
| **Rollen Ändern** | Gruppenrollen setzen | ✅ |
|
||||
| **Berechtigungen Ändern** | Ressourcen-Berechtigungen | ✅ |
|
||||
| **Benutzer Ändern** | Gruppenmitglieder | ✅ |
|
||||
|
||||
#### Rollen-IDs
|
||||
- `1` - Gruppenadministrator
|
||||
- `2` - Anwendungsadministrator
|
||||
- `3` - Ressourcenadministrator
|
||||
- `4` - Zeitplanadministrator
|
||||
|
||||
### Zubehör
|
||||
|
||||
| Operation | Beschreibung | Admin-Rechte |
|
||||
|-----------|-------------|--------------|
|
||||
| **Alle Abrufen** | Liste aller Zubehörteile | ❌ |
|
||||
| **Abrufen** | Einzelnes Zubehörteil | ❌ |
|
||||
|
||||
### Attribute
|
||||
|
||||
| Operation | Beschreibung | Admin-Rechte |
|
||||
|-----------|-------------|--------------|
|
||||
| **Abrufen** | Einzelnes Attribut | ❌ |
|
||||
| **Nach Kategorie Abrufen** | Alle Attribute einer Kategorie | ❌ |
|
||||
| **Erstellen** | Neues Attribut anlegen | ✅ |
|
||||
| **Aktualisieren** | Attribut ändern | ✅ |
|
||||
| **Löschen** | Attribut entfernen | ✅ |
|
||||
|
||||
#### Attribut-Kategorien
|
||||
- `1` - Reservierung
|
||||
- `2` - Benutzer
|
||||
- `4` - Ressource
|
||||
- `5` - Ressourcen-Typ
|
||||
|
||||
#### Attribut-Typen
|
||||
- `1` - Einzeilig (Text)
|
||||
- `2` - Mehrzeilig (Textarea)
|
||||
- `3` - Auswahlliste
|
||||
- `4` - Checkbox
|
||||
- `5` - Datum/Zeit
|
||||
|
||||
---
|
||||
|
||||
## 💡 Beispiele
|
||||
|
||||
### Beispiel 1: Alle Reservierungen der nächsten Woche abrufen
|
||||
|
||||
```json
|
||||
{
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {
|
||||
"resource": "reservation",
|
||||
"operation": "getAll",
|
||||
"filters": {
|
||||
"startDateTime": "={{ $now.toISO() }}",
|
||||
"endDateTime": "={{ $now.plus({days: 7}).toISO() }}"
|
||||
}
|
||||
},
|
||||
"name": "LibreBooking",
|
||||
"type": "n8n-nodes-librebooking.libreBooking",
|
||||
"typeVersion": 1,
|
||||
"position": [250, 300],
|
||||
"credentials": {
|
||||
"libreBookingApi": {
|
||||
"id": "1",
|
||||
"name": "LibreBooking"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### Beispiel 2: Neue Reservierung erstellen
|
||||
|
||||
```json
|
||||
{
|
||||
"parameters": {
|
||||
"resource": "reservation",
|
||||
"operation": "create",
|
||||
"resourceId": 1,
|
||||
"startDateTime": "2026-01-26T10:00:00",
|
||||
"endDateTime": "2026-01-26T11:00:00",
|
||||
"title": "Team Meeting",
|
||||
"additionalFields": {
|
||||
"description": "Wöchentliches Team-Meeting",
|
||||
"participants": "2,3,4"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Beispiel 3: Verfügbarkeit prüfen
|
||||
|
||||
```json
|
||||
{
|
||||
"parameters": {
|
||||
"resource": "resource",
|
||||
"operation": "getAvailability",
|
||||
"resourceIdOptional": 1,
|
||||
"availabilityDateTime": "2026-01-26T14:00:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Beispiel 4: Benutzer mit Filter suchen
|
||||
|
||||
```json
|
||||
{
|
||||
"parameters": {
|
||||
"resource": "user",
|
||||
"operation": "getAll",
|
||||
"userFilters": {
|
||||
"organization": "Marketing",
|
||||
"lastName": "Müller"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚡ Trigger Node
|
||||
|
||||
Der **LibreBooking Trigger** ist ein Polling-basierter Trigger, der auf neue oder geänderte Reservierungen reagiert.
|
||||
|
||||
### Konfiguration
|
||||
|
||||
| Parameter | Beschreibung |
|
||||
|-----------|-------------|
|
||||
| **Event** | Art des Events (Neue/Geänderte/Alle Reservierungen) |
|
||||
| **Filter** | Optional: Ressource, Zeitplan, Benutzer |
|
||||
| **Zeitfenster** | Überwachungszeitraum (7/14/30/90 Tage) |
|
||||
| **Detaillierte Daten** | Vollständige Reservierungsdetails abrufen |
|
||||
|
||||
### Event-Typen
|
||||
|
||||
- **Neue Reservierung**: Wird nur bei neuen Reservierungen ausgelöst
|
||||
- **Geänderte Reservierung**: Wird bei Änderungen an bestehenden Reservierungen ausgelöst
|
||||
- **Alle Reservierungen**: Wird bei neuen und geänderten Reservierungen ausgelöst
|
||||
|
||||
### Beispiel-Workflow: Benachrichtigung bei neuer Reservierung
|
||||
|
||||
```
|
||||
[LibreBooking Trigger] → [IF: Ressource = 1] → [Slack: Nachricht senden]
|
||||
```
|
||||
|
||||
### Deduplizierung
|
||||
|
||||
Der Trigger speichert Informationen über bereits verarbeitete Reservierungen und verhindert so doppelte Ausführungen. Bei Änderungen (Titel, Zeit, etc.) wird eine Reservierung als "geändert" erkannt.
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Troubleshooting
|
||||
|
||||
### Häufige Fehler
|
||||
|
||||
#### "Authentifizierung fehlgeschlagen"
|
||||
- Überprüfen Sie die LibreBooking-URL (ohne `/Web/Services`)
|
||||
- Stellen Sie sicher, dass Benutzername und Passwort korrekt sind
|
||||
- Prüfen Sie, ob die API in LibreBooking aktiviert ist
|
||||
|
||||
#### "Zugriff verweigert" (403)
|
||||
- Die Operation erfordert Administrator-Rechte
|
||||
- Verwenden Sie einen Admin-Account oder wählen Sie eine andere Operation
|
||||
|
||||
#### "Nicht gefunden" (404)
|
||||
- Die angegebene ID (Ressource, Benutzer, etc.) existiert nicht
|
||||
- Überprüfen Sie die Referenznummer bei Reservierungen
|
||||
|
||||
#### "Session abgelaufen"
|
||||
- Der Session-Token ist abgelaufen
|
||||
- Führen Sie den Workflow erneut aus
|
||||
|
||||
### API-Limitierungen
|
||||
|
||||
- LibreBooking hat keine dokumentierten Rate-Limits
|
||||
- Bei vielen Anfragen empfehlen wir Pausen zwischen den Operationen
|
||||
- Der Node authentifiziert sich bei jeder Ausführung neu und meldet sich am Ende ab
|
||||
|
||||
### Debug-Tipps
|
||||
|
||||
1. Aktivieren Sie die n8n-Logs für detaillierte Fehlermeldungen:
|
||||
```bash
|
||||
export N8N_LOG_LEVEL=debug
|
||||
n8n start
|
||||
```
|
||||
|
||||
2. Testen Sie die API direkt im Browser:
|
||||
```
|
||||
https://your-librebooking.com/Web/Services/index.php
|
||||
```
|
||||
|
||||
3. Überprüfen Sie die Zeitzonen-Einstellungen in LibreBooking und n8n
|
||||
|
||||
---
|
||||
|
||||
## 🛠 Entwicklung
|
||||
|
||||
### Voraussetzungen
|
||||
|
||||
- Node.js 18.17.0 oder höher
|
||||
- npm 9.x oder höher
|
||||
- n8n (für Tests)
|
||||
|
||||
### Setup
|
||||
|
||||
```bash
|
||||
# Repository klonen
|
||||
# 1. Repository klonen
|
||||
git clone https://github.com/your-org/n8n-nodes-librebooking.git
|
||||
cd n8n-nodes-librebooking
|
||||
|
||||
# Abhängigkeiten installieren
|
||||
# 2. Bauen und installieren
|
||||
./quick-install.sh n8n
|
||||
|
||||
# Fertig! ✔
|
||||
```
|
||||
|
||||
**Oder manuell:**
|
||||
|
||||
```bash
|
||||
# Dependencies & Build
|
||||
npm install
|
||||
|
||||
# TypeScript kompilieren
|
||||
npm run build
|
||||
|
||||
# Für Entwicklung (Watch-Modus)
|
||||
npm run dev
|
||||
# In Container kopieren
|
||||
docker cp dist n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
docker cp package.json n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
docker cp node_modules n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
|
||||
# Container neustarten
|
||||
docker restart n8n
|
||||
```
|
||||
|
||||
### Projektstruktur
|
||||
|
||||
```
|
||||
n8n-nodes-librebooking/
|
||||
├── credentials/
|
||||
│ └── LibreBookingApi.credentials.ts
|
||||
├── nodes/
|
||||
│ ├── LibreBooking/
|
||||
│ │ ├── LibreBooking.node.ts
|
||||
│ │ └── librebooking.svg
|
||||
│ └── LibreBookingTrigger/
|
||||
│ ├── LibreBookingTrigger.node.ts
|
||||
│ └── librebooking.svg
|
||||
├── workflows/
|
||||
│ └── example-workflows.json
|
||||
├── test/
|
||||
│ └── test-api.ts
|
||||
├── package.json
|
||||
├── tsconfig.json
|
||||
└── README.md
|
||||
```
|
||||
|
||||
### Tests ausführen
|
||||
## 🛠️ npm Scripts
|
||||
|
||||
```bash
|
||||
# API-Test mit echten Credentials
|
||||
npm test
|
||||
npm run build # Baut den Node
|
||||
npm run docker:deploy # Baut, kopiert & startet Container neu
|
||||
npm run docker:copy # Kopiert in Container
|
||||
npm run docker:restart # Startet Container neu
|
||||
```
|
||||
|
||||
### Linting
|
||||
## 📚 Dokumentation
|
||||
|
||||
- **[INSTALLATION.md](INSTALLATION.md)** - Alle Installationsmethoden
|
||||
- **[SCHNELLSTART.md](SCHNELLSTART.md)** - Ultra-kurze Anleitung
|
||||
- **[TROUBLESHOOTING.md](TROUBLESHOOTING.md)** - Problemlösung
|
||||
- **[DOCKER-INTEGRATION.md](DOCKER-INTEGRATION.md)** - Docker-spezifische Anleitung
|
||||
|
||||
## 🔑 Credentials einrichten
|
||||
|
||||
1. Öffne n8n: http://localhost:5678
|
||||
2. Gehe zu: **Einstellungen** → **Credentials** → **Add Credential**
|
||||
3. Suche: **LibreBooking API**
|
||||
4. Eingabe:
|
||||
- **URL**: `https://deine-librebooking-url.de`
|
||||
- **Benutzername**: Admin-Benutzer
|
||||
- **Passwort**: Passwort
|
||||
|
||||
## 🌟 Features
|
||||
|
||||
### LibreBooking Node
|
||||
- Reservierungen erstellen, bearbeiten, löschen
|
||||
- Ressourcen und Verfügbarkeit verwalten
|
||||
- Benutzer und Gruppen administrieren
|
||||
- Zeitpläne und Zubehör konfigurieren
|
||||
|
||||
### LibreBooking Trigger Node
|
||||
- Neue Reservierungen überwachen
|
||||
- Geänderte Reservierungen erfassen
|
||||
- Filter nach Ressource/Zeitplan/Benutzer
|
||||
|
||||
## 🔄 Updates
|
||||
|
||||
```bash
|
||||
npm run lint
|
||||
npm run lint:fix
|
||||
# Nach Änderungen oder git pull
|
||||
./update-node.sh n8n
|
||||
|
||||
# Oder mit npm
|
||||
npm run docker:deploy
|
||||
```
|
||||
|
||||
### Build für Produktion
|
||||
## ❓ Problemlösung
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
### tsc not found?
|
||||
→ **Lösung**: Auf dem Host bauen (siehe Schnellstart)
|
||||
|
||||
---
|
||||
### Read-only Volume?
|
||||
→ **Lösung**: dist/ in Container kopieren statt npm im Container
|
||||
|
||||
### npm audit Vulnerabilities?
|
||||
→ Sind non-critical Dependencies von n8n-workflow. Siehe [SECURITY.md](SECURITY.md)
|
||||
|
||||
## 📄 Lizenz
|
||||
|
||||
MIT License - siehe [LICENSE](LICENSE) Datei
|
||||
|
||||
---
|
||||
MIT - Siehe [LICENSE](LICENSE)
|
||||
|
||||
## 🤝 Beitragen
|
||||
|
||||
Beiträge sind willkommen! Bitte öffnen Sie einen Issue oder Pull Request.
|
||||
|
||||
1. Fork des Repositories
|
||||
2. Feature-Branch erstellen (`git checkout -b feature/AmazingFeature`)
|
||||
3. Änderungen committen (`git commit -m 'Add AmazingFeature'`)
|
||||
4. Branch pushen (`git push origin feature/AmazingFeature`)
|
||||
5. Pull Request öffnen
|
||||
|
||||
---
|
||||
|
||||
## 📞 Support
|
||||
|
||||
- **Issues**: [GitHub Issues](https://github.com/your-org/n8n-nodes-librebooking/issues)
|
||||
- **LibreBooking Dokumentation**: [https://librebooking.org/docs](https://librebooking.org/docs)
|
||||
- **n8n Community**: [https://community.n8n.io](https://community.n8n.io)
|
||||
|
||||
---
|
||||
|
||||
**Erstellt mit ❤️ für die n8n und LibreBooking Community**
|
||||
Beiträge sind willkommen! Siehe [CONTRIBUTING.md](CONTRIBUTING.md)
|
||||
|
|
|
|||
|
|
@ -1,37 +1,33 @@
|
|||
# Schnellstart: Docker-Integration
|
||||
# Docker Schnellstart - LibreBooking n8n Node
|
||||
|
||||
Ultra-kurze Anleitung für erfahrene Docker-Nutzer.
|
||||
Schnelle Befehle für erfahrene Docker-Benutzer.
|
||||
|
||||
---
|
||||
|
||||
## Automatische Installation (Empfohlen)
|
||||
## Neue Installation
|
||||
|
||||
### Option A: Mit docker-compose (empfohlen)
|
||||
|
||||
```bash
|
||||
# Ins n8n Verzeichnis wechseln
|
||||
cd /pfad/zu/deiner/n8n/installation
|
||||
# 1. Starten
|
||||
cd /pfad/zu/librebooking_n8n_node
|
||||
docker compose up -d
|
||||
|
||||
# Skript ausführen
|
||||
./install-docker.sh
|
||||
|
||||
# Oder mit Pfad
|
||||
./install-docker.sh -p /opt/n8n
|
||||
# 2. Browser öffnen
|
||||
open http://localhost:5678
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Manuelle Installation (3 Schritte)
|
||||
|
||||
### 1. Custom Nodes kopieren
|
||||
### Option B: In bestehende n8n Installation integrieren
|
||||
|
||||
```bash
|
||||
# 1. Custom Nodes kopieren
|
||||
cp -r custom-nodes /pfad/zu/n8n/
|
||||
|
||||
# 2. Bauen
|
||||
cd /pfad/zu/n8n/custom-nodes
|
||||
npm install && npm run build
|
||||
```
|
||||
|
||||
### 2. Override-Datei erstellen
|
||||
|
||||
```bash
|
||||
# 3. docker-compose.override.yml erstellen
|
||||
cat > docker-compose.override.yml << 'EOF'
|
||||
version: '3.8'
|
||||
services:
|
||||
|
|
@ -42,62 +38,110 @@ services:
|
|||
- N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
|
||||
- N8N_COMMUNITY_NODES_ENABLED=true
|
||||
EOF
|
||||
```
|
||||
|
||||
### 3. Neustarten
|
||||
|
||||
```bash
|
||||
docker-compose restart n8n
|
||||
# 4. Neustarten
|
||||
docker compose restart n8n
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Neues Setup mit Docker
|
||||
## Node im Container bauen/reparieren
|
||||
|
||||
### Quick-Fix (Ein Befehl)
|
||||
|
||||
```bash
|
||||
# Beispiel-Konfiguration verwenden
|
||||
cp docker-compose.example.yml docker-compose.yml
|
||||
cp .env.docker .env
|
||||
docker exec n8n sh -c "cd /home/node/.n8n/custom/n8n-nodes-librebooking && npm install && npm run build" && docker restart n8n
|
||||
```
|
||||
|
||||
# .env anpassen, dann starten
|
||||
docker-compose up -d
|
||||
### Mit Auto-Fix Skript
|
||||
|
||||
```bash
|
||||
./fix-node-installation.sh
|
||||
```
|
||||
|
||||
### Status prüfen
|
||||
|
||||
```bash
|
||||
# Check-Skript ausführen
|
||||
docker cp check-installation.sh n8n:/tmp/
|
||||
docker exec n8n sh /tmp/check-installation.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Eigenes Image bauen
|
||||
## Häufige Befehle
|
||||
|
||||
```bash
|
||||
docker build -f Dockerfile.custom-nodes -t n8n-librebooking .
|
||||
docker run -d -p 5678:5678 n8n-librebooking
|
||||
| Aktion | Befehl |
|
||||
|--------|--------|
|
||||
| Container starten | `docker compose up -d` |
|
||||
| Container stoppen | `docker compose down` |
|
||||
| Container neustarten | `docker restart n8n` |
|
||||
| Logs anzeigen | `docker logs -f n8n` |
|
||||
| In Container einloggen | `docker exec -it n8n sh` |
|
||||
| Node bauen | `docker exec n8n sh -c "cd /home/node/.n8n/custom/n8n-nodes-librebooking && npm install && npm run build"` |
|
||||
| Status prüfen | `docker exec n8n sh /tmp/check-installation.sh` |
|
||||
|
||||
---
|
||||
|
||||
## Pfade im Container
|
||||
|
||||
| Beschreibung | Pfad |
|
||||
|--------------|------|
|
||||
| n8n Home | `/home/node/.n8n` |
|
||||
| Custom Nodes | `/home/node/.n8n/custom` |
|
||||
| LibreBooking Node | `/home/node/.n8n/custom/n8n-nodes-librebooking` |
|
||||
| Daten-Verzeichnis | `/home/node/.n8n` |
|
||||
|
||||
---
|
||||
|
||||
## Umgebungsvariablen
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
|
||||
- N8N_COMMUNITY_NODES_ENABLED=true
|
||||
- N8N_LOG_LEVEL=info
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Verifizierung
|
||||
## Troubleshooting
|
||||
|
||||
### Node erscheint nicht
|
||||
|
||||
```bash
|
||||
# Node prüfen
|
||||
# 1. Build prüfen
|
||||
docker exec n8n ls /home/node/.n8n/custom/n8n-nodes-librebooking/dist/
|
||||
|
||||
# In n8n: Nach "LibreBooking" suchen
|
||||
# 2. Falls leer - neu bauen
|
||||
docker exec n8n sh -c "cd /home/node/.n8n/custom/n8n-nodes-librebooking && npm install && npm run build"
|
||||
|
||||
# 3. Neustarten
|
||||
docker restart n8n
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Bei Problemen
|
||||
### Permission denied
|
||||
|
||||
```bash
|
||||
# Berechtigungen
|
||||
sudo chown -R 1000:1000 custom-nodes/
|
||||
```
|
||||
|
||||
# Logs
|
||||
docker logs n8n | grep -i error
|
||||
### docker-compose: distutils Fehler (Python 3.12)
|
||||
|
||||
# Neustart
|
||||
docker-compose down && docker-compose up -d
|
||||
```bash
|
||||
# Lösung: Docker Compose v2 verwenden
|
||||
sudo apt-get install docker-compose-plugin
|
||||
docker compose up -d # Beachte: ohne Bindestrich
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
📖 **Ausführliche Anleitung:** [DOCKER-INTEGRATION.md](DOCKER-INTEGRATION.md)
|
||||
## Detaillierte Anleitungen
|
||||
|
||||
- [DOCKER-INTEGRATION.md](DOCKER-INTEGRATION.md) - Vollständige Docker-Dokumentation
|
||||
- [MANUELLE-INSTALLATION-CONTAINER.md](MANUELLE-INSTALLATION-CONTAINER.md) - Manuelle Installation
|
||||
- [TROUBLESHOOTING.md](TROUBLESHOOTING.md) - Alle Probleme und Lösungen
|
||||
|
||||
---
|
||||
|
||||
*Schnellstart-Guide für Docker-Profis*
|
||||
|
|
|
|||
|
|
@ -1,60 +1,40 @@
|
|||
# Schnellstart - LibreBooking n8n Node
|
||||
# Schnellstart
|
||||
|
||||
Diese Anleitung ist für erfahrene Benutzer, die schnell loslegen möchten.
|
||||
|
||||
## Option A: Mit Skript (empfohlen)
|
||||
## ⚡ Installation in 4 Zeilen
|
||||
|
||||
```bash
|
||||
# Archiv entpacken
|
||||
tar -xzf n8n-nodes-librebooking.tar.gz
|
||||
cd n8n-nodes-librebooking
|
||||
|
||||
# Installieren
|
||||
./install.sh
|
||||
|
||||
# n8n starten
|
||||
n8n start
|
||||
```
|
||||
|
||||
## Option B: Mit Docker
|
||||
|
||||
```bash
|
||||
# Archiv entpacken
|
||||
tar -xzf n8n-nodes-librebooking.tar.gz
|
||||
cd n8n-nodes-librebooking
|
||||
|
||||
# Container starten
|
||||
docker-compose up -d
|
||||
|
||||
# Browser öffnen
|
||||
open http://localhost:5678
|
||||
```
|
||||
|
||||
## Option C: Manuell
|
||||
|
||||
```bash
|
||||
tar -xzf n8n-nodes-librebooking.tar.gz
|
||||
cd n8n-nodes-librebooking
|
||||
cd /pfad/zu/n8n-nodes-librebooking
|
||||
npm install
|
||||
npm run build
|
||||
npm link
|
||||
n8n start
|
||||
./quick-install.sh n8n
|
||||
```
|
||||
|
||||
## Credentials einrichten
|
||||
**Oder mit npm scripts:**
|
||||
|
||||
1. Öffne http://localhost:5678
|
||||
2. Erstelle neuen Workflow
|
||||
3. Füge "LibreBooking" Node hinzu
|
||||
4. Erstelle neue Credentials:
|
||||
- **URL:** `https://dein-server/Web/Services`
|
||||
- **Username:** Admin-Benutzer
|
||||
- **Password:** Passwort
|
||||
```bash
|
||||
npm install
|
||||
npm run docker:deploy
|
||||
```
|
||||
|
||||
## Fertig!
|
||||
## 🔑 Credentials
|
||||
|
||||
Der LibreBooking Node ist jetzt verfügbar.
|
||||
n8n → Einstellungen → Credentials → Add → "LibreBooking API"
|
||||
|
||||
---
|
||||
| Feld | Wert |
|
||||
|------|------|
|
||||
| URL | `https://deine-librebooking-url.de` |
|
||||
| Benutzername | Admin-Benutzer |
|
||||
| Passwort | Passwort |
|
||||
|
||||
Für detaillierte Anleitungen siehe [INSTALLATION.md](INSTALLATION.md)
|
||||
## 🔄 Updates
|
||||
|
||||
```bash
|
||||
git pull
|
||||
./update-node.sh n8n
|
||||
```
|
||||
|
||||
## ❓ Probleme?
|
||||
|
||||
- **tsc not found**: Auf dem Host bauen (npm install && npm run build)
|
||||
- **Read-only Volume**: `docker cp` verwenden
|
||||
- Mehr: [TROUBLESHOOTING.md](TROUBLESHOOTING.md)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,234 @@
|
|||
# Sicherheitshinweise - LibreBooking n8n Node
|
||||
|
||||
Dieses Dokument erklärt die npm audit Vulnerabilities und wie man damit umgeht.
|
||||
|
||||
## Inhaltsverzeichnis
|
||||
|
||||
- [Übersicht der Vulnerabilities](#übersicht-der-vulnerabilities)
|
||||
- [Warum diese Vulnerabilities existieren](#warum-diese-vulnerabilities-existieren)
|
||||
- [Risikoeinschätzung](#risikoeinschätzung)
|
||||
- [Empfehlungen](#empfehlungen)
|
||||
- [Wie man sie beheben kann](#wie-man-sie-beheben-kann)
|
||||
- [Produktionsumgebungen](#produktionsumgebungen)
|
||||
|
||||
---
|
||||
|
||||
## Übersicht der Vulnerabilities
|
||||
|
||||
Beim Ausführen von `npm audit` werden möglicherweise folgende Vulnerabilities angezeigt:
|
||||
|
||||
### Critical: form-data
|
||||
|
||||
```
|
||||
form-data <4.0.1
|
||||
Severity: critical
|
||||
Prototype Pollution in form-data
|
||||
https://github.com/advisories/GHSA-xxx
|
||||
```
|
||||
|
||||
### Moderate: lodash
|
||||
|
||||
```
|
||||
lodash <4.17.21
|
||||
Severity: moderate
|
||||
Prototype Pollution in lodash
|
||||
https://github.com/advisories/GHSA-xxx
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Warum diese Vulnerabilities existieren
|
||||
|
||||
Diese Vulnerabilities kommen **nicht direkt aus diesem Projekt**, sondern sind **transitive Dependencies** von `n8n-workflow` und `n8n-core`.
|
||||
|
||||
### Dependency-Kette:
|
||||
|
||||
```
|
||||
n8n-nodes-librebooking
|
||||
└── n8n-workflow (devDependency für Typen)
|
||||
└── axios
|
||||
└── form-data (vulnerable version)
|
||||
└── lodash (vulnerable version)
|
||||
```
|
||||
|
||||
### Wichtig zu verstehen:
|
||||
|
||||
1. **n8n-workflow** ist nur als `devDependency` und `peerDependency` deklariert
|
||||
2. In Produktion verwendet n8n seine **eigene** n8n-workflow Version
|
||||
3. Die vulnerable Dependencies werden nur beim **Entwickeln** installiert
|
||||
4. Diese Package werden **nicht** in das finale dist/ Verzeichnis gebündelt
|
||||
|
||||
---
|
||||
|
||||
## Risikoeinschätzung
|
||||
|
||||
### Für dieses Projekt: **NIEDRIGES RISIKO**
|
||||
|
||||
| Aspekt | Risiko | Begründung |
|
||||
|--------|--------|------------|
|
||||
| Entwicklung | Niedrig | form-data/lodash werden nicht direkt verwendet |
|
||||
| Produktion | Sehr niedrig | Keine transtiven Dependencies werden deployed |
|
||||
| n8n Runtime | Abhängig von n8n | n8n selbst muss die Vulnerabilities beheben |
|
||||
|
||||
### Warum niedriges Risiko:
|
||||
|
||||
1. **form-data Vulnerability:**
|
||||
- Betrifft nur das Parsen von multipart/form-data
|
||||
- Dieser Node verwendet keine File-Uploads über form-data
|
||||
- Die LibreBooking API verwendet JSON für alle Requests
|
||||
|
||||
2. **lodash Vulnerability:**
|
||||
- Betrifft `_.set()` und `_.setWith()` Funktionen
|
||||
- Dieser Node verwendet keine direkten lodash Aufrufe
|
||||
- Die Vulnerability erfordert Angreifer-kontrollierten Input
|
||||
|
||||
---
|
||||
|
||||
## Empfehlungen
|
||||
|
||||
### Für Entwickler:
|
||||
|
||||
1. **Warnungen ignorieren** (wenn nicht kritisch):
|
||||
```bash
|
||||
npm install --ignore-scripts
|
||||
```
|
||||
|
||||
2. **Audit bei npm install deaktivieren:**
|
||||
```bash
|
||||
# Einmalig:
|
||||
npm install --no-audit
|
||||
|
||||
# Permanent via .npmrc:
|
||||
echo "audit=false" >> .npmrc
|
||||
```
|
||||
|
||||
3. **Overrides verwenden** (in package.json):
|
||||
```json
|
||||
"overrides": {
|
||||
"form-data": "^4.0.1",
|
||||
"lodash": "^4.17.21"
|
||||
}
|
||||
```
|
||||
|
||||
### Für Produktionsumgebungen:
|
||||
|
||||
1. **n8n aktuell halten:** Die n8n-Entwickler aktualisieren regelmäßig ihre Dependencies
|
||||
2. **Nur vertrauenswürdige Inputs:** Keine ungeprüften Daten an die Nodes übergeben
|
||||
3. **Network Isolation:** n8n Container im isolierten Netzwerk betreiben
|
||||
|
||||
---
|
||||
|
||||
## Wie man sie beheben kann
|
||||
|
||||
### Option 1: Overrides in package.json (empfohlen)
|
||||
|
||||
Die package.json enthält bereits Overrides für bekannte Vulnerabilities:
|
||||
|
||||
```json
|
||||
"overrides": {
|
||||
"form-data": "^4.0.1",
|
||||
"lodash": "^4.17.21"
|
||||
}
|
||||
```
|
||||
|
||||
### Option 2: npm audit fix (begrenzt)
|
||||
|
||||
```bash
|
||||
# Automatische Fixes (nur kompatible Updates)
|
||||
npm audit fix
|
||||
|
||||
# Force Fixes (VORSICHT: kann Breaking Changes einführen)
|
||||
npm audit fix --force
|
||||
```
|
||||
|
||||
**Hinweis:** `npm audit fix` kann transitive Dependencies nur begrenzt beheben.
|
||||
|
||||
### Option 3: Update-Skript verwenden
|
||||
|
||||
```bash
|
||||
./update-dependencies.sh
|
||||
```
|
||||
|
||||
Das Skript:
|
||||
- Führt `npm audit fix` aus
|
||||
- Aktualisiert alle Dependencies
|
||||
- Testet ob alles funktioniert
|
||||
- Gibt einen Report
|
||||
|
||||
### Option 4: Resolutions (für yarn/pnpm)
|
||||
|
||||
Wenn Sie yarn statt npm verwenden:
|
||||
|
||||
```json
|
||||
"resolutions": {
|
||||
"form-data": "^4.0.1",
|
||||
"lodash": "^4.17.21"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Produktionsumgebungen
|
||||
|
||||
### Best Practices:
|
||||
|
||||
1. **Docker Image aktuell halten:**
|
||||
```bash
|
||||
docker pull n8nio/n8n:latest
|
||||
```
|
||||
|
||||
2. **Regelmäßige Updates:**
|
||||
```bash
|
||||
docker compose pull
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
3. **Security Scanning:**
|
||||
```bash
|
||||
# Image auf Vulnerabilities prüfen
|
||||
docker scan n8nio/n8n:latest
|
||||
# Oder mit Trivy:
|
||||
trivy image n8nio/n8n:latest
|
||||
```
|
||||
|
||||
4. **Netzwerk-Isolation:**
|
||||
- n8n nicht direkt im Internet exponieren
|
||||
- Reverse Proxy mit TLS verwenden
|
||||
- Firewall-Regeln setzen
|
||||
|
||||
5. **Zugriffskontrollen:**
|
||||
- Starke Passwörter verwenden
|
||||
- Basic Auth oder OAuth aktivieren
|
||||
- API-Keys für LibreBooking sicher speichern
|
||||
|
||||
### Sicherheits-Checkliste:
|
||||
|
||||
- [ ] n8n Version aktuell?
|
||||
- [ ] Docker Image aktuell?
|
||||
- [ ] TLS/HTTPS aktiviert?
|
||||
- [ ] Starke Passwörter?
|
||||
- [ ] Netzwerk isoliert?
|
||||
- [ ] Regelmäßige Backups?
|
||||
|
||||
---
|
||||
|
||||
## Weiterführende Links
|
||||
|
||||
- [n8n Security Best Practices](https://docs.n8n.io/hosting/security/)
|
||||
- [npm audit Documentation](https://docs.npmjs.com/cli/v8/commands/npm-audit)
|
||||
- [OWASP Dependency Check](https://owasp.org/www-project-dependency-check/)
|
||||
- [Snyk Vulnerability Database](https://snyk.io/vuln/)
|
||||
|
||||
---
|
||||
|
||||
## Meldung von Sicherheitsproblemen
|
||||
|
||||
Wenn Sie eine Sicherheitslücke **direkt in diesem Projekt** (nicht in Dependencies) finden:
|
||||
|
||||
1. **Nicht öffentlich melden** (kein GitHub Issue)
|
||||
2. Kontaktieren Sie uns direkt per E-Mail
|
||||
3. Geben Sie Zeit für einen Fix bevor öffentliche Disclosure
|
||||
|
||||
---
|
||||
|
||||
*Letzte Aktualisierung: Januar 2026*
|
||||
|
|
@ -0,0 +1,141 @@
|
|||
# Troubleshooting
|
||||
|
||||
## Inhaltsverzeichnis
|
||||
|
||||
1. [tsc not found](#tsc-not-found)
|
||||
2. [Read-only Volume](#read-only-volume)
|
||||
3. [npm audit Vulnerabilities](#npm-audit-vulnerabilities)
|
||||
4. [Node nicht sichtbar](#node-nicht-sichtbar)
|
||||
5. [Authentifizierung fehlgeschlagen](#authentifizierung-fehlgeschlagen)
|
||||
|
||||
---
|
||||
|
||||
## tsc not found
|
||||
|
||||
**Symptom:**
|
||||
```
|
||||
sh: 1: tsc: not found
|
||||
npm error code 127
|
||||
```
|
||||
|
||||
**Ursache:** TypeScript ist nicht installiert (im Container oft nicht verfügbar).
|
||||
|
||||
**Lösung:** Auf dem Host bauen!
|
||||
|
||||
```bash
|
||||
# Auf dem Host (nicht im Container)
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
# Dann in Container kopieren
|
||||
docker cp dist n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
docker cp package.json n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
docker cp node_modules n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
docker restart n8n
|
||||
```
|
||||
|
||||
**Oder mit Skript:**
|
||||
```bash
|
||||
./quick-install.sh n8n
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Read-only Volume
|
||||
|
||||
**Symptom:**
|
||||
```
|
||||
EROFS: read-only file system
|
||||
npm error EACCES: permission denied
|
||||
```
|
||||
|
||||
**Ursache:** Volume ist mit `:ro` gemountet.
|
||||
|
||||
**Lösung 1:** Volume ohne `:ro` mounten
|
||||
|
||||
```yaml
|
||||
# docker-compose.yml
|
||||
volumes:
|
||||
- ./custom-nodes:/home/node/.n8n/custom # Ohne :ro
|
||||
```
|
||||
|
||||
**Lösung 2:** Auf dem Host bauen und kopieren
|
||||
|
||||
```bash
|
||||
npm install && npm run build
|
||||
docker cp dist n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## npm audit Vulnerabilities
|
||||
|
||||
**Symptom:**
|
||||
```
|
||||
found 2 vulnerabilities (1 moderate, 1 critical)
|
||||
```
|
||||
|
||||
**Erklärung:** Diese kommen von `n8n-workflow` und sind für dieses Projekt nicht kritisch.
|
||||
|
||||
**Lösung:** Ignorieren oder `.npmrc` verwenden:
|
||||
|
||||
```bash
|
||||
# .npmrc bereits konfiguriert
|
||||
audit=false
|
||||
```
|
||||
|
||||
Siehe [SECURITY.md](SECURITY.md) für Details.
|
||||
|
||||
---
|
||||
|
||||
## Node nicht sichtbar
|
||||
|
||||
**Lösung:**
|
||||
|
||||
1. Container neustarten:
|
||||
```bash
|
||||
docker restart n8n
|
||||
```
|
||||
|
||||
2. Dateien prüfen:
|
||||
```bash
|
||||
docker exec n8n ls -la /home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
```
|
||||
|
||||
3. Environment prüfen:
|
||||
```yaml
|
||||
environment:
|
||||
- N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
|
||||
```
|
||||
|
||||
4. Logs prüfen:
|
||||
```bash
|
||||
docker logs n8n | grep -i librebooking
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Authentifizierung fehlgeschlagen
|
||||
|
||||
**Symptom:** "401 Unauthorized" oder "Invalid credentials"
|
||||
|
||||
**Lösung:**
|
||||
|
||||
1. URL prüfen (ohne `/Web/` am Ende)
|
||||
2. Benutzer muss Admin sein
|
||||
3. API muss in LibreBooking aktiviert sein
|
||||
|
||||
Test:
|
||||
```bash
|
||||
curl -X POST https://librebooking.example.com/Web/Services/Authentication/Authenticate \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"username": "admin", "password": "pass"}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Weitere Hilfe
|
||||
|
||||
- [README.md](README.md) - Übersicht
|
||||
- [INSTALLATION.md](INSTALLATION.md) - Installationsanleitung
|
||||
- [DOCKER-INTEGRATION.md](DOCKER-INTEGRATION.md) - Docker Details
|
||||
|
|
@ -0,0 +1,183 @@
|
|||
#!/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 ""
|
||||
|
|
@ -0,0 +1,281 @@
|
|||
#!/bin/sh
|
||||
# ============================================================================
|
||||
# check-installation.sh - Debug-Skript für LibreBooking Node Installation
|
||||
# Kann sowohl im Container als auch auf dem Host ausgeführt werden
|
||||
# ============================================================================
|
||||
|
||||
echo "============================================"
|
||||
echo " LibreBooking Node - Installation Check"
|
||||
echo "============================================"
|
||||
echo ""
|
||||
echo "Ausgeführt: $(date)"
|
||||
echo "Hostname: $(hostname)"
|
||||
echo ""
|
||||
|
||||
# Status-Zähler
|
||||
OK_COUNT=0
|
||||
WARN_COUNT=0
|
||||
ERROR_COUNT=0
|
||||
|
||||
ok() {
|
||||
echo "[✓] $1"
|
||||
OK_COUNT=$((OK_COUNT + 1))
|
||||
}
|
||||
|
||||
warn() {
|
||||
echo "[!] $1"
|
||||
WARN_COUNT=$((WARN_COUNT + 1))
|
||||
}
|
||||
|
||||
error() {
|
||||
echo "[✗] $1"
|
||||
ERROR_COUNT=$((ERROR_COUNT + 1))
|
||||
}
|
||||
|
||||
info() {
|
||||
echo "[i] $1"
|
||||
}
|
||||
|
||||
echo "============================================"
|
||||
echo " 1. UMGEBUNG"
|
||||
echo "============================================"
|
||||
|
||||
# Node.js/npm prüfen
|
||||
if command -v node >/dev/null 2>&1; then
|
||||
ok "Node.js installiert: $(node --version)"
|
||||
else
|
||||
error "Node.js nicht gefunden"
|
||||
fi
|
||||
|
||||
if command -v npm >/dev/null 2>&1; then
|
||||
ok "npm installiert: $(npm --version)"
|
||||
else
|
||||
error "npm nicht gefunden"
|
||||
fi
|
||||
|
||||
# Aktueller Benutzer
|
||||
info "Aktueller Benutzer: $(whoami) (UID: $(id -u))"
|
||||
|
||||
echo ""
|
||||
echo "============================================"
|
||||
echo " 2. UMGEBUNGSVARIABLEN"
|
||||
echo "============================================"
|
||||
|
||||
if [ -n "$N8N_CUSTOM_EXTENSIONS" ]; then
|
||||
ok "N8N_CUSTOM_EXTENSIONS: $N8N_CUSTOM_EXTENSIONS"
|
||||
else
|
||||
warn "N8N_CUSTOM_EXTENSIONS nicht gesetzt"
|
||||
info " Empfehlung: N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom"
|
||||
fi
|
||||
|
||||
if [ "$N8N_COMMUNITY_NODES_ENABLED" = "true" ]; then
|
||||
ok "N8N_COMMUNITY_NODES_ENABLED: true"
|
||||
else
|
||||
warn "N8N_COMMUNITY_NODES_ENABLED ist nicht 'true'"
|
||||
info " Aktueller Wert: ${N8N_COMMUNITY_NODES_ENABLED:-<nicht gesetzt>}"
|
||||
fi
|
||||
|
||||
# Weitere n8n Variablen
|
||||
if [ -n "$N8N_LOG_LEVEL" ]; then
|
||||
info "N8N_LOG_LEVEL: $N8N_LOG_LEVEL"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "============================================"
|
||||
echo " 3. VERZEICHNISSE PRÜFEN"
|
||||
echo "============================================"
|
||||
|
||||
# Mögliche Pfade
|
||||
POSSIBLE_PATHS="
|
||||
/home/node/.n8n/custom/n8n-nodes-librebooking
|
||||
/home/node/.n8n/custom
|
||||
/opt/n8n/custom-nodes
|
||||
/data/custom-nodes
|
||||
"
|
||||
|
||||
FOUND_PATH=""
|
||||
|
||||
for path in $POSSIBLE_PATHS; do
|
||||
if [ -d "$path" ]; then
|
||||
if [ -f "$path/package.json" ]; then
|
||||
ok "Custom Node Verzeichnis: $path"
|
||||
FOUND_PATH="$path"
|
||||
break
|
||||
elif [ -f "$path/n8n-nodes-librebooking/package.json" ]; then
|
||||
ok "Custom Node Verzeichnis: $path/n8n-nodes-librebooking"
|
||||
FOUND_PATH="$path/n8n-nodes-librebooking"
|
||||
break
|
||||
else
|
||||
info "Verzeichnis existiert (ohne package.json): $path"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$FOUND_PATH" ]; then
|
||||
error "Kein Custom Node Verzeichnis mit package.json gefunden!"
|
||||
info " Geprüfte Pfade:"
|
||||
for path in $POSSIBLE_PATHS; do
|
||||
info " - $path"
|
||||
done
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "============================================"
|
||||
echo " 4. NODE-DATEIEN PRÜFEN"
|
||||
echo "============================================"
|
||||
|
||||
if [ -n "$FOUND_PATH" ]; then
|
||||
cd "$FOUND_PATH" 2>/dev/null || true
|
||||
|
||||
# package.json
|
||||
if [ -f "package.json" ]; then
|
||||
ok "package.json vorhanden"
|
||||
info " Name: $(grep '"name":' package.json | head -1 | cut -d'"' -f4)"
|
||||
info " Version: $(grep '"version":' package.json | head -1 | cut -d'"' -f4)"
|
||||
else
|
||||
error "package.json fehlt"
|
||||
fi
|
||||
|
||||
# node_modules
|
||||
if [ -d "node_modules" ]; then
|
||||
MODULE_COUNT=$(ls -1 node_modules 2>/dev/null | wc -l)
|
||||
ok "node_modules vorhanden ($MODULE_COUNT Pakete)"
|
||||
else
|
||||
error "node_modules fehlt - führen Sie 'npm install' aus"
|
||||
fi
|
||||
|
||||
# dist Verzeichnis
|
||||
if [ -d "dist" ]; then
|
||||
ok "dist/ Verzeichnis vorhanden"
|
||||
|
||||
# .node.js Dateien suchen
|
||||
echo ""
|
||||
info "Gefundene Node-Dateien:"
|
||||
NODE_FILES=$(find dist -name "*.node.js" 2>/dev/null)
|
||||
if [ -n "$NODE_FILES" ]; then
|
||||
echo "$NODE_FILES" | while read -r f; do
|
||||
if [ -f "$f" ]; then
|
||||
ok " $f ($(ls -lh "$f" | awk '{print $5}'))"
|
||||
fi
|
||||
done
|
||||
else
|
||||
error " Keine .node.js Dateien gefunden!"
|
||||
fi
|
||||
|
||||
# Credentials
|
||||
echo ""
|
||||
info "Gefundene Credential-Dateien:"
|
||||
CRED_FILES=$(find dist -name "*.credentials.js" 2>/dev/null)
|
||||
if [ -n "$CRED_FILES" ]; then
|
||||
echo "$CRED_FILES" | while read -r f; do
|
||||
if [ -f "$f" ]; then
|
||||
ok " $f"
|
||||
fi
|
||||
done
|
||||
else
|
||||
error " Keine .credentials.js Dateien gefunden!"
|
||||
fi
|
||||
else
|
||||
error "dist/ Verzeichnis fehlt - führen Sie 'npm run build' aus"
|
||||
fi
|
||||
|
||||
# Icons
|
||||
echo ""
|
||||
info "Icon-Dateien:"
|
||||
find . -name "*.svg" 2>/dev/null | while read -r f; do
|
||||
info " $f"
|
||||
done
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "============================================"
|
||||
echo " 5. BERECHTIGUNGEN"
|
||||
echo "============================================"
|
||||
|
||||
# Funktion: Prüft ob ein Verzeichnis read-only ist
|
||||
check_readonly() {
|
||||
local dir="$1"
|
||||
local test_file="$dir/.write_test_$$"
|
||||
|
||||
# Versuche eine Test-Datei zu erstellen
|
||||
if touch "$test_file" 2>/dev/null; then
|
||||
rm -f "$test_file" 2>/dev/null
|
||||
return 0 # Schreibbar
|
||||
else
|
||||
return 1 # Read-only
|
||||
fi
|
||||
}
|
||||
|
||||
if [ -n "$FOUND_PATH" ]; then
|
||||
# Prüfe Schreibrechte (inkl. read-only Volume Check)
|
||||
if check_readonly "$FOUND_PATH"; then
|
||||
ok "Schreibrechte auf $FOUND_PATH"
|
||||
else
|
||||
error "KEINE Schreibrechte auf $FOUND_PATH (Read-only Volume?)"
|
||||
echo ""
|
||||
info " PROBLEM: Das Verzeichnis ist möglicherweise als :ro gemountet."
|
||||
info " LÖSUNG 1: Volume ohne :ro mounten:"
|
||||
info " - ./custom-nodes:/home/node/.n8n/custom/n8n-nodes-librebooking"
|
||||
info " LÖSUNG 2: Auf dem Host bauen mit ./build-on-host.sh"
|
||||
info " Siehe: TROUBLESHOOTING.md"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# Besitzer prüfen
|
||||
OWNER=$(ls -ld "$FOUND_PATH" | awk '{print $3}')
|
||||
GROUP=$(ls -ld "$FOUND_PATH" | awk '{print $4}')
|
||||
info "Besitzer: $OWNER:$GROUP"
|
||||
|
||||
# n8n läuft als node (UID 1000)
|
||||
if [ "$(id -u)" = "1000" ]; then
|
||||
ok "Läuft als UID 1000 (Standard für n8n)"
|
||||
else
|
||||
warn "Läuft nicht als UID 1000 (aktuell: $(id -u))"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "============================================"
|
||||
echo " ZUSAMMENFASSUNG"
|
||||
echo "============================================"
|
||||
echo ""
|
||||
echo "Ergebnisse:"
|
||||
echo " ✓ OK: $OK_COUNT"
|
||||
echo " ! Warnung: $WARN_COUNT"
|
||||
echo " ✗ Fehler: $ERROR_COUNT"
|
||||
echo ""
|
||||
|
||||
if [ "$ERROR_COUNT" -gt 0 ]; then
|
||||
echo "============================================"
|
||||
echo " EMPFOHLENE AKTIONEN"
|
||||
echo "============================================"
|
||||
echo ""
|
||||
|
||||
if [ ! -d "node_modules" ] 2>/dev/null; then
|
||||
echo "1. Dependencies installieren:"
|
||||
echo " cd $FOUND_PATH && npm install"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
if [ ! -d "dist" ] 2>/dev/null; then
|
||||
echo "2. Node bauen:"
|
||||
echo " cd $FOUND_PATH && npm run build"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
echo "3. Container neustarten:"
|
||||
echo " docker restart n8n"
|
||||
echo ""
|
||||
|
||||
exit 1
|
||||
elif [ "$WARN_COUNT" -gt 0 ]; then
|
||||
echo "Status: TEILWEISE OK (Warnungen beachten)"
|
||||
exit 0
|
||||
else
|
||||
echo "Status: ALLES OK ✓"
|
||||
echo ""
|
||||
echo "Falls der Node trotzdem nicht erscheint:"
|
||||
echo " 1. Starten Sie n8n neu: docker restart n8n"
|
||||
echo " 2. Prüfen Sie die Logs: docker logs n8n | grep -i libre"
|
||||
exit 0
|
||||
fi
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
#!/bin/bash
|
||||
# ============================================================================
|
||||
# create-release.sh - Erstellt neue Archive und Git Tag
|
||||
# ============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PARENT_DIR="$(dirname "$SCRIPT_DIR")"
|
||||
|
||||
# Version aus package.json lesen
|
||||
VERSION=$(grep '"version"' "$SCRIPT_DIR/package.json" | head -1 | sed 's/.*"version": "\([^"]*\)".*/\1/')
|
||||
|
||||
echo -e "${GREEN}=== Release erstellen v$VERSION ===${NC}\n"
|
||||
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
# 1. Prüfe, ob alles committet ist
|
||||
if [ -n "$(git status --porcelain)" ]; then
|
||||
echo -e "${YELLOW}Warnung: Es gibt uncommittete Änderungen!${NC}"
|
||||
git status --short
|
||||
echo ""
|
||||
read -p "Trotzdem fortfahren? (j/N) " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Jj]$ ]]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 2. Alte Archive löschen
|
||||
echo "[1/4] Lösche alte Archive..."
|
||||
./git-cleanup.sh 2>/dev/null || true
|
||||
|
||||
# 3. Build prüfen
|
||||
echo ""
|
||||
echo "[2/4] Prüfe Build..."
|
||||
if [ ! -d "dist" ] || [ -z "$(find dist -name '*.node.js' 2>/dev/null)" ]; then
|
||||
echo "Baue Node..."
|
||||
npm install --silent
|
||||
npm run build --silent
|
||||
fi
|
||||
echo " ✓ Build OK"
|
||||
|
||||
# 4. Archive erstellen
|
||||
echo ""
|
||||
echo "[3/4] Erstelle Archive..."
|
||||
|
||||
TAR_FILE="$PARENT_DIR/n8n-nodes-librebooking-v${VERSION}.tar.gz"
|
||||
ZIP_FILE="$PARENT_DIR/n8n-nodes-librebooking-v${VERSION}.zip"
|
||||
|
||||
git archive --format=tar.gz --prefix=n8n-nodes-librebooking/ --output="$TAR_FILE" HEAD
|
||||
echo " ✓ $TAR_FILE"
|
||||
|
||||
git archive --format=zip --prefix=n8n-nodes-librebooking/ --output="$ZIP_FILE" HEAD
|
||||
echo " ✓ $ZIP_FILE"
|
||||
|
||||
# 5. Git Tag (optional)
|
||||
echo ""
|
||||
echo "[4/4] Git Tag..."
|
||||
|
||||
if git tag | grep -q "v$VERSION"; then
|
||||
echo -e " ${YELLOW}Tag v$VERSION existiert bereits${NC}"
|
||||
else
|
||||
read -p "Git Tag v$VERSION erstellen? (j/N) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Jj]$ ]]; then
|
||||
git tag -a "v$VERSION" -m "Version $VERSION - Vereinfachte Installation"
|
||||
echo " ✓ Tag v$VERSION erstellt"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}============================================${NC}"
|
||||
echo -e "${GREEN} Release v$VERSION erstellt!${NC}"
|
||||
echo -e "${GREEN}============================================${NC}"
|
||||
echo ""
|
||||
echo "Archive:"
|
||||
echo " $TAR_FILE"
|
||||
echo " $ZIP_FILE"
|
||||
echo ""
|
||||
echo "Zum Pushen:"
|
||||
echo " git push origin main"
|
||||
echo " git push origin v$VERSION"
|
||||
echo ""
|
||||
|
|
@ -1,31 +1,21 @@
|
|||
# Docker Compose Override für bestehende n8n Installationen
|
||||
# Diese Datei erweitert eine bestehende docker-compose.yml um den LibreBooking Node
|
||||
# Docker Compose Override für LibreBooking n8n Node
|
||||
#
|
||||
# Verwendung:
|
||||
# 1. Diese Datei in das Verzeichnis mit der bestehenden docker-compose.yml kopieren
|
||||
# 2. custom-nodes Verzeichnis in das gleiche Verzeichnis kopieren
|
||||
# 3. docker-compose up -d ausführen
|
||||
# WICHTIG: custom-nodes Volume NICHT als read-only (:ro) mounten!
|
||||
# Der Node benötigt Schreibrechte für npm install/build.
|
||||
#
|
||||
# HINWEIS: Diese Datei wird automatisch mit der bestehenden docker-compose.yml zusammengeführt
|
||||
# Für read-only Volumes siehe: docker-compose.readonly.yml
|
||||
# und führen Sie vorher build-on-host.sh aus.
|
||||
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
n8n:
|
||||
# Zusätzliche Volumes für Custom Nodes
|
||||
volumes:
|
||||
# LibreBooking Custom Node - Variante 1: Vorgebauter Node
|
||||
- ./custom-nodes:/home/node/.n8n/custom/n8n-nodes-librebooking:ro
|
||||
# LibreBooking Custom Node
|
||||
# OHNE :ro - Der Node muss beim Start gebaut werden können!
|
||||
- ./custom-nodes:/home/node/.n8n/custom/n8n-nodes-librebooking
|
||||
|
||||
# Alternative: Nur das dist-Verzeichnis (wenn bereits gebaut)
|
||||
# - ./custom-nodes/dist:/home/node/.n8n/custom/n8n-nodes-librebooking/dist:ro
|
||||
# - ./custom-nodes/package.json:/home/node/.n8n/custom/n8n-nodes-librebooking/package.json:ro
|
||||
|
||||
# Zusätzliche Umgebungsvariablen
|
||||
environment:
|
||||
# Pfad für Custom Nodes (normalerweise bereits gesetzt)
|
||||
# Custom Nodes aktivieren
|
||||
- N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
|
||||
# Aktiviert erweiterte Node-Typen
|
||||
- N8N_COMMUNITY_NODES_ENABLED=true
|
||||
# Optional: Debug-Logging für Node-Entwicklung
|
||||
# - N8N_LOG_LEVEL=debug
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
# Docker Compose Override für READ-ONLY Volume Mount
|
||||
#
|
||||
# VORAUSSETZUNG: Node wurde auf dem Host gebaut!
|
||||
# Führen Sie zuerst aus: ./build-on-host.sh
|
||||
#
|
||||
# Verwendung:
|
||||
# docker compose -f docker-compose.yml -f docker-compose.readonly.yml up -d
|
||||
#
|
||||
# Oder setzen Sie in Ihrer Umgebung:
|
||||
# export COMPOSE_FILE=docker-compose.yml:docker-compose.readonly.yml
|
||||
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
n8n:
|
||||
volumes:
|
||||
# LibreBooking Custom Node - READ-ONLY
|
||||
# Das dist-for-docker Verzeichnis wurde mit build-on-host.sh erstellt
|
||||
# und enthält bereits alle kompilierten Dateien.
|
||||
- ./dist-for-docker:/home/node/.n8n/custom/n8n-nodes-librebooking:ro
|
||||
|
||||
environment:
|
||||
# Custom Nodes aktivieren
|
||||
- N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
|
||||
- N8N_COMMUNITY_NODES_ENABLED=true
|
||||
|
|
@ -0,0 +1,268 @@
|
|||
#!/bin/bash
|
||||
# ============================================================================
|
||||
# fix-node-installation.sh - All-in-One Lösung für Node-Installation im Container
|
||||
# Führt alle Schritte automatisch aus (auf dem HOST ausführen!)
|
||||
# ============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
# Farben
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# Standard-Werte
|
||||
CONTAINER_NAME="n8n"
|
||||
CONTAINER_PATH="/home/node/.n8n/custom/n8n-nodes-librebooking"
|
||||
SKIP_RESTART=false
|
||||
VERBOSE=false
|
||||
|
||||
echo -e "${BLUE}============================================${NC}"
|
||||
echo -e "${BLUE} LibreBooking Node - Auto-Fix Installation${NC}"
|
||||
echo -e "${BLUE}============================================${NC}"
|
||||
echo ""
|
||||
|
||||
# Hilfe anzeigen
|
||||
show_help() {
|
||||
echo "Verwendung: $0 [OPTIONEN]"
|
||||
echo ""
|
||||
echo "Dieses Skript installiert den LibreBooking Node automatisch im Docker Container."
|
||||
echo ""
|
||||
echo "Optionen:"
|
||||
echo " -c, --container NAME Container-Name (Standard: n8n)"
|
||||
echo " -p, --path PATH Pfad im Container (Standard: /home/node/.n8n/custom/n8n-nodes-librebooking)"
|
||||
echo " -n, --no-restart Container nicht neustarten"
|
||||
echo " -v, --verbose Ausführliche Ausgabe"
|
||||
echo " -h, --help Diese Hilfe anzeigen"
|
||||
echo ""
|
||||
echo "Beispiele:"
|
||||
echo " $0 # Standard-Installation"
|
||||
echo " $0 -c mein-n8n # Anderer Container-Name"
|
||||
echo " $0 -p /opt/n8n/custom-nodes # Anderer Pfad"
|
||||
echo " $0 -n # Ohne Neustart"
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Parameter parsen
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-c|--container)
|
||||
CONTAINER_NAME="$2"
|
||||
shift 2
|
||||
;;
|
||||
-p|--path)
|
||||
CONTAINER_PATH="$2"
|
||||
shift 2
|
||||
;;
|
||||
-n|--no-restart)
|
||||
SKIP_RESTART=true
|
||||
shift
|
||||
;;
|
||||
-v|--verbose)
|
||||
VERBOSE=true
|
||||
shift
|
||||
;;
|
||||
-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
|
||||
}
|
||||
|
||||
# Funktion: Prüft ob ein Verzeichnis im Container read-only ist
|
||||
check_readonly_container() {
|
||||
local container="$1"
|
||||
local dir="$2"
|
||||
local test_file="$dir/.write_test_$$"
|
||||
|
||||
# Versuche eine Test-Datei im Container zu erstellen
|
||||
if docker exec "$container" touch "$test_file" 2>/dev/null; then
|
||||
docker exec "$container" rm -f "$test_file" 2>/dev/null
|
||||
return 0 # Schreibbar
|
||||
else
|
||||
return 1 # Read-only
|
||||
fi
|
||||
}
|
||||
|
||||
print_readonly_solution() {
|
||||
echo ""
|
||||
echo -e "${RED}============================================${NC}"
|
||||
echo -e "${RED} PROBLEM: Read-only Volume erkannt!${NC}"
|
||||
echo -e "${RED}============================================${NC}"
|
||||
echo ""
|
||||
echo "Das custom-nodes Verzeichnis ist als read-only gemountet."
|
||||
echo "npm install und npm run build benötigen Schreibrechte."
|
||||
echo ""
|
||||
echo "LÖSUNGEN:"
|
||||
echo ""
|
||||
echo "1. Volume OHNE :ro mounten (empfohlen):"
|
||||
echo " In docker-compose.yml oder docker-compose.override.yml:"
|
||||
echo ""
|
||||
echo " volumes:"
|
||||
echo " - ./custom-nodes:/home/node/.n8n/custom/n8n-nodes-librebooking"
|
||||
echo " # ENTFERNEN: :ro am Ende!"
|
||||
echo ""
|
||||
echo "2. Auf dem Host bauen (für read-only Volumes):"
|
||||
echo " ./build-on-host.sh"
|
||||
echo " # Dann docker-compose.readonly.yml verwenden"
|
||||
echo ""
|
||||
echo "3. docker-compose.override.yml anpassen:"
|
||||
echo " cp docker-compose.override.yml docker-compose.override.yml.bak"
|
||||
echo " # Entfernen Sie ':ro' aus der Volume-Definition"
|
||||
echo ""
|
||||
echo "Siehe: TROUBLESHOOTING.md und DOCKER-INTEGRATION.md"
|
||||
}
|
||||
|
||||
# Schritt 1: Docker prüfen
|
||||
log "Prüfe Docker..."
|
||||
if ! command -v docker &>/dev/null; then
|
||||
error "Docker ist nicht installiert!"
|
||||
fi
|
||||
|
||||
# Schritt 2: Container prüfen
|
||||
log "Prüfe Container '$CONTAINER_NAME'..."
|
||||
if ! docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||
# Prüfe ob Container existiert aber nicht läuft
|
||||
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||
warn "Container '$CONTAINER_NAME' existiert aber läuft nicht."
|
||||
log "Starte Container..."
|
||||
docker start "$CONTAINER_NAME"
|
||||
sleep 3
|
||||
else
|
||||
error "Container '$CONTAINER_NAME' nicht gefunden! Prüfen Sie den Namen mit: docker ps -a"
|
||||
fi
|
||||
fi
|
||||
log "Container '$CONTAINER_NAME' läuft ✓"
|
||||
|
||||
# Schritt 3: Prüfe ob Pfad im Container existiert
|
||||
log "Prüfe Pfad im Container: $CONTAINER_PATH"
|
||||
if ! docker exec "$CONTAINER_NAME" test -d "$CONTAINER_PATH"; then
|
||||
# Versuche alternative Pfade
|
||||
ALTERNATIVE_PATHS=(
|
||||
"/home/node/.n8n/custom/n8n-nodes-librebooking"
|
||||
"/home/node/.n8n/custom"
|
||||
"/opt/n8n/custom-nodes"
|
||||
"/data/custom-nodes"
|
||||
)
|
||||
|
||||
FOUND_PATH=""
|
||||
for alt_path in "${ALTERNATIVE_PATHS[@]}"; do
|
||||
if docker exec "$CONTAINER_NAME" test -f "$alt_path/package.json" 2>/dev/null; then
|
||||
FOUND_PATH="$alt_path"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -n "$FOUND_PATH" ]; then
|
||||
warn "Angegebener Pfad nicht gefunden, verwende: $FOUND_PATH"
|
||||
CONTAINER_PATH="$FOUND_PATH"
|
||||
else
|
||||
error "Kein Custom-Node-Verzeichnis mit package.json gefunden!\n\n Bitte stellen Sie sicher, dass die Dateien korrekt kopiert wurden.\n Beispiel: docker cp custom-nodes/. $CONTAINER_NAME:/home/node/.n8n/custom/n8n-nodes-librebooking/"
|
||||
fi
|
||||
fi
|
||||
log "Pfad gefunden: $CONTAINER_PATH ✓"
|
||||
|
||||
# Schritt 3.5: Prüfe ob Verzeichnis schreibbar ist (read-only Volume?)
|
||||
log "Prüfe Schreibrechte im Container..."
|
||||
if ! check_readonly_container "$CONTAINER_NAME" "$CONTAINER_PATH"; then
|
||||
print_readonly_solution
|
||||
exit 1
|
||||
fi
|
||||
log "Schreibrechte vorhanden ✓"
|
||||
|
||||
# Schritt 4: Skript in Container kopieren
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
if [ -f "$SCRIPT_DIR/install-in-container.sh" ]; then
|
||||
log "Kopiere install-in-container.sh in Container..."
|
||||
docker cp "$SCRIPT_DIR/install-in-container.sh" "$CONTAINER_NAME:/tmp/"
|
||||
else
|
||||
warn "install-in-container.sh nicht gefunden, erstelle inline..."
|
||||
fi
|
||||
|
||||
# Schritt 5: npm install und build im Container
|
||||
log "Führe npm install aus..."
|
||||
if $VERBOSE; then
|
||||
docker exec -w "$CONTAINER_PATH" "$CONTAINER_NAME" npm install
|
||||
else
|
||||
if ! docker exec -w "$CONTAINER_PATH" "$CONTAINER_NAME" npm install 2>&1 | tail -5; then
|
||||
error "npm install fehlgeschlagen!"
|
||||
fi
|
||||
fi
|
||||
log "Dependencies installiert ✓"
|
||||
|
||||
log "Führe npm run build aus..."
|
||||
if $VERBOSE; then
|
||||
docker exec -w "$CONTAINER_PATH" "$CONTAINER_NAME" npm run build
|
||||
else
|
||||
if ! docker exec -w "$CONTAINER_PATH" "$CONTAINER_NAME" npm run build 2>&1 | tail -10; then
|
||||
error "npm run build fehlgeschlagen!"
|
||||
fi
|
||||
fi
|
||||
log "Build erfolgreich ✓"
|
||||
|
||||
# Schritt 6: Prüfe Ergebnis
|
||||
log "Prüfe Build-Ergebnis..."
|
||||
NODE_COUNT=$(docker exec "$CONTAINER_NAME" find "$CONTAINER_PATH/dist" -name "*.node.js" 2>/dev/null | wc -l)
|
||||
if [ "$NODE_COUNT" -gt 0 ]; then
|
||||
log "$NODE_COUNT Node-Datei(en) gefunden ✓"
|
||||
else
|
||||
error "Keine Node-Dateien nach Build gefunden!"
|
||||
fi
|
||||
|
||||
# Schritt 7: Container neustarten
|
||||
if $SKIP_RESTART; then
|
||||
warn "Container-Neustart übersprungen (-n Option)"
|
||||
echo ""
|
||||
echo -e "${YELLOW}Bitte starten Sie den Container manuell neu:${NC}"
|
||||
echo " docker restart $CONTAINER_NAME"
|
||||
else
|
||||
log "Starte Container neu..."
|
||||
docker restart "$CONTAINER_NAME"
|
||||
log "Container neugestartet ✓"
|
||||
|
||||
# Warte kurz auf Start
|
||||
sleep 5
|
||||
fi
|
||||
|
||||
# Schritt 8: Abschluss-Check (optional)
|
||||
echo ""
|
||||
echo -e "${GREEN}============================================${NC}"
|
||||
echo -e "${GREEN} Installation abgeschlossen!${NC}"
|
||||
echo -e "${GREEN}============================================${NC}"
|
||||
echo ""
|
||||
log "Der LibreBooking Node sollte jetzt in n8n verfügbar sein."
|
||||
echo ""
|
||||
echo "Nächste Schritte:"
|
||||
echo " 1. Öffnen Sie n8n im Browser"
|
||||
echo " 2. Erstellen Sie einen neuen Workflow"
|
||||
echo " 3. Suchen Sie nach 'LibreBooking'"
|
||||
echo ""
|
||||
echo "Falls der Node nicht erscheint:"
|
||||
echo " - Prüfen Sie die Logs: docker logs $CONTAINER_NAME 2>&1 | grep -i libre"
|
||||
echo " - Führen Sie das Check-Skript aus: docker exec $CONTAINER_NAME sh /tmp/check-installation.sh"
|
||||
echo ""
|
||||
|
||||
# Optional: Check-Skript kopieren und ausführen
|
||||
if [ -f "$SCRIPT_DIR/check-installation.sh" ]; then
|
||||
docker cp "$SCRIPT_DIR/check-installation.sh" "$CONTAINER_NAME:/tmp/"
|
||||
echo "Tipp: Führen Sie für einen detaillierten Status aus:"
|
||||
echo " docker exec $CONTAINER_NAME sh /tmp/check-installation.sh"
|
||||
fi
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
#!/bin/bash
|
||||
# ============================================================================
|
||||
# git-cleanup.sh - Löscht alte Archive und temporäre Dateien
|
||||
# ============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PARENT_DIR="$(dirname "$SCRIPT_DIR")"
|
||||
|
||||
echo -e "${GREEN}=== Git Cleanup ===${NC}\n"
|
||||
|
||||
# Alte Archive im übergeordneten Verzeichnis löschen
|
||||
echo "Lösche alte Archive in $PARENT_DIR..."
|
||||
find "$PARENT_DIR" -maxdepth 1 -name "n8n-nodes-librebooking*.tar.gz" -delete 2>/dev/null && echo " ✓ .tar.gz gelöscht" || echo " - Keine .tar.gz gefunden"
|
||||
find "$PARENT_DIR" -maxdepth 1 -name "n8n-nodes-librebooking*.zip" -delete 2>/dev/null && echo " ✓ .zip gelöscht" || echo " - Keine .zip gefunden"
|
||||
|
||||
# Temporäre Dateien im Projekt löschen
|
||||
echo ""
|
||||
echo "Lösche temporäre Dateien..."
|
||||
rm -rf "$SCRIPT_DIR/dist-for-docker" 2>/dev/null && echo " ✓ dist-for-docker/ gelöscht" || true
|
||||
rm -rf "$SCRIPT_DIR/.tsbuildinfo" 2>/dev/null && echo " ✓ .tsbuildinfo gelöscht" || true
|
||||
find "$SCRIPT_DIR" -name "*.log" -delete 2>/dev/null && echo " ✓ .log Dateien gelöscht" || true
|
||||
find "$SCRIPT_DIR" -name ".DS_Store" -delete 2>/dev/null || true
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}✓ Cleanup abgeschlossen${NC}"
|
||||
echo ""
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
#!/bin/bash
|
||||
# ============================================================================
|
||||
# git-commit.sh - Committet alle Änderungen
|
||||
# ============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
MESSAGE="${1:-fix: Vereinfachte Installation - auf dem Host bauen}"
|
||||
|
||||
echo -e "${GREEN}=== Git Commit ===${NC}\n"
|
||||
|
||||
# Status anzeigen
|
||||
echo "Geänderte Dateien:"
|
||||
git status --short
|
||||
echo ""
|
||||
|
||||
# Alles hinzufügen
|
||||
git add .
|
||||
|
||||
# Commit
|
||||
echo "Commit mit Nachricht: $MESSAGE"
|
||||
git commit -m "$MESSAGE"
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}✓ Commit erfolgreich${NC}"
|
||||
echo ""
|
||||
echo "Zum Pushen:"
|
||||
echo " git push origin main"
|
||||
echo ""
|
||||
|
|
@ -0,0 +1,238 @@
|
|||
#!/bin/bash
|
||||
|
||||
# =============================================================================
|
||||
# LibreBooking n8n Node - Manuelle Docker Installation (ohne docker-compose)
|
||||
# =============================================================================
|
||||
# Diese Alternative verwendet nur "docker" Befehle für maximale Kompatibilität.
|
||||
# Nutzen Sie dieses Skript wenn docker-compose Probleme macht.
|
||||
#
|
||||
# Verwendung: ./install-docker-manual.sh [OPTIONS]
|
||||
#
|
||||
# Optionen:
|
||||
# -p, --port PORT n8n Port (Standard: 5678)
|
||||
# -n, --name NAME Container Name (Standard: n8n-librebooking)
|
||||
# -f, --force Bestehenden Container ersetzen
|
||||
# -h, --help Diese Hilfe anzeigen
|
||||
#
|
||||
# =============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
# Farben für Ausgabe
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Standardwerte
|
||||
N8N_PORT=5678
|
||||
CONTAINER_NAME="n8n-librebooking"
|
||||
FORCE=false
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
# Hilfsfunktionen
|
||||
print_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}[✓]${NC} $1"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}[!]${NC} $1"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}[FEHLER]${NC} $1"
|
||||
}
|
||||
|
||||
show_help() {
|
||||
echo "LibreBooking n8n Node - Manuelle Docker Installation"
|
||||
echo ""
|
||||
echo "Verwendung: $0 [OPTIONS]"
|
||||
echo ""
|
||||
echo "Optionen:"
|
||||
echo " -p, --port PORT n8n Port (Standard: 5678)"
|
||||
echo " -n, --name NAME Container Name (Standard: n8n-librebooking)"
|
||||
echo " -f, --force Bestehenden Container ersetzen"
|
||||
echo " -h, --help Diese Hilfe anzeigen"
|
||||
echo ""
|
||||
echo "Beispiele:"
|
||||
echo " $0 # Standard-Installation"
|
||||
echo " $0 -p 8080 # Anderer Port"
|
||||
echo " $0 -n mein-n8n -p 9000 # Eigener Name und Port"
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Argumente parsen
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-p|--port)
|
||||
N8N_PORT="$2"
|
||||
shift 2
|
||||
;;
|
||||
-n|--name)
|
||||
CONTAINER_NAME="$2"
|
||||
shift 2
|
||||
;;
|
||||
-f|--force)
|
||||
FORCE=true
|
||||
shift
|
||||
;;
|
||||
-h|--help)
|
||||
show_help
|
||||
;;
|
||||
*)
|
||||
print_error "Unbekannte Option: $1"
|
||||
show_help
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "============================================="
|
||||
echo " LibreBooking n8n Node - Manuelle Installation"
|
||||
echo " (ohne docker-compose)"
|
||||
echo "============================================="
|
||||
echo ""
|
||||
|
||||
# =============================================================================
|
||||
# Voraussetzungen prüfen
|
||||
# =============================================================================
|
||||
|
||||
print_info "Prüfe Voraussetzungen..."
|
||||
|
||||
# Docker prüfen
|
||||
if ! command -v docker &> /dev/null; then
|
||||
print_error "Docker ist nicht installiert!"
|
||||
echo " Bitte installieren Sie Docker: https://docs.docker.com/get-docker/"
|
||||
exit 1
|
||||
fi
|
||||
print_success "Docker gefunden: $(docker --version)"
|
||||
|
||||
# Prüfen ob Container bereits existiert
|
||||
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||
if [ "$FORCE" = true ]; then
|
||||
print_warning "Bestehender Container '$CONTAINER_NAME' wird entfernt..."
|
||||
docker stop "$CONTAINER_NAME" 2>/dev/null || true
|
||||
docker rm "$CONTAINER_NAME" 2>/dev/null || true
|
||||
else
|
||||
print_error "Container '$CONTAINER_NAME' existiert bereits!"
|
||||
echo " Nutzen Sie -f um ihn zu ersetzen, oder -n für einen anderen Namen."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# Volume und Verzeichnisse vorbereiten
|
||||
# =============================================================================
|
||||
|
||||
print_info "Bereite Volumes vor..."
|
||||
|
||||
# Docker Volume für n8n Daten erstellen
|
||||
VOLUME_NAME="${CONTAINER_NAME}_data"
|
||||
if ! docker volume ls --format '{{.Name}}' | grep -q "^${VOLUME_NAME}$"; then
|
||||
docker volume create "$VOLUME_NAME"
|
||||
print_success "Volume '$VOLUME_NAME' erstellt"
|
||||
else
|
||||
print_info "Volume '$VOLUME_NAME' existiert bereits"
|
||||
fi
|
||||
|
||||
# Custom Nodes Verzeichnis vorbereiten
|
||||
CUSTOM_NODES_DIR="$SCRIPT_DIR/custom-nodes"
|
||||
if [ ! -d "$CUSTOM_NODES_DIR" ]; then
|
||||
print_error "custom-nodes Verzeichnis nicht gefunden: $CUSTOM_NODES_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# Node bauen (wenn nicht bereits gebaut)
|
||||
# =============================================================================
|
||||
|
||||
if [ ! -d "$CUSTOM_NODES_DIR/dist" ]; then
|
||||
print_info "Baue LibreBooking Node..."
|
||||
|
||||
if command -v npm &> /dev/null; then
|
||||
cd "$CUSTOM_NODES_DIR"
|
||||
npm install 2>/dev/null || print_warning "npm install hatte Warnungen"
|
||||
npm run build 2>/dev/null || {
|
||||
print_warning "Build fehlgeschlagen, versuche alternativen Ansatz..."
|
||||
npx tsc 2>/dev/null || true
|
||||
mkdir -p dist/nodes/LibreBooking dist/nodes/LibreBookingTrigger
|
||||
cp nodes/LibreBooking/*.svg dist/nodes/LibreBooking/ 2>/dev/null || true
|
||||
cp nodes/LibreBookingTrigger/*.svg dist/nodes/LibreBookingTrigger/ 2>/dev/null || true
|
||||
}
|
||||
cd "$SCRIPT_DIR"
|
||||
print_success "Node erfolgreich gebaut"
|
||||
else
|
||||
print_warning "npm nicht gefunden - Node wird im Container gebaut"
|
||||
fi
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# n8n Container starten
|
||||
# =============================================================================
|
||||
|
||||
print_info "Starte n8n Container..."
|
||||
|
||||
# Berechtigungen setzen
|
||||
if [ "$(id -u)" = "0" ]; then
|
||||
chown -R 1000:1000 "$CUSTOM_NODES_DIR" 2>/dev/null || true
|
||||
else
|
||||
sudo chown -R 1000:1000 "$CUSTOM_NODES_DIR" 2>/dev/null || print_warning "Konnte Berechtigungen nicht setzen"
|
||||
fi
|
||||
|
||||
# Container starten
|
||||
docker run -d \
|
||||
--name "$CONTAINER_NAME" \
|
||||
--restart unless-stopped \
|
||||
-p "${N8N_PORT}:5678" \
|
||||
-v "${VOLUME_NAME}:/home/node/.n8n" \
|
||||
-v "${CUSTOM_NODES_DIR}:/home/node/.n8n/custom/n8n-nodes-librebooking:ro" \
|
||||
-e N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom \
|
||||
-e N8N_COMMUNITY_NODES_ENABLED=true \
|
||||
-e TZ=Europe/Berlin \
|
||||
-e GENERIC_TIMEZONE=Europe/Berlin \
|
||||
n8nio/n8n:latest
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Container gestartet!"
|
||||
else
|
||||
print_error "Container konnte nicht gestartet werden!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Warten auf Start
|
||||
print_info "Warte auf n8n Start..."
|
||||
sleep 5
|
||||
|
||||
# Status prüfen
|
||||
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
|
||||
print_success "n8n Container läuft!"
|
||||
else
|
||||
print_error "Container läuft nicht - prüfen Sie: docker logs $CONTAINER_NAME"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# Abschluss
|
||||
# =============================================================================
|
||||
|
||||
echo ""
|
||||
echo "============================================="
|
||||
print_success "Installation abgeschlossen!"
|
||||
echo "============================================="
|
||||
echo ""
|
||||
echo "n8n ist erreichbar unter: http://localhost:${N8N_PORT}"
|
||||
echo ""
|
||||
echo "Nützliche Befehle:"
|
||||
echo " docker logs $CONTAINER_NAME # Logs anzeigen"
|
||||
echo " docker stop $CONTAINER_NAME # Container stoppen"
|
||||
echo " docker start $CONTAINER_NAME # Container starten"
|
||||
echo " docker restart $CONTAINER_NAME # Container neustarten"
|
||||
echo " docker rm -f $CONTAINER_NAME # Container löschen"
|
||||
echo ""
|
||||
echo "Bei Problemen siehe: TROUBLESHOOTING.md"
|
||||
echo ""
|
||||
|
|
@ -110,19 +110,112 @@ if ! command -v docker &> /dev/null; then
|
|||
fi
|
||||
print_success "Docker gefunden: $(docker --version)"
|
||||
|
||||
# Docker Compose prüfen
|
||||
if command -v docker-compose &> /dev/null; then
|
||||
COMPOSE_CMD="docker-compose"
|
||||
print_success "docker-compose gefunden: $(docker-compose --version)"
|
||||
elif docker compose version &> /dev/null; then
|
||||
COMPOSE_CMD="docker compose"
|
||||
print_success "docker compose gefunden: $(docker compose version)"
|
||||
# Docker Compose prüfen - v2 bevorzugen
|
||||
detect_compose_command() {
|
||||
# Zuerst docker compose (v2/Plugin) prüfen - bevorzugt
|
||||
if docker compose version &> /dev/null 2>&1; then
|
||||
COMPOSE_CMD="docker compose"
|
||||
COMPOSE_VERSION="v2"
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Dann docker-compose (v1) prüfen
|
||||
if command -v docker-compose &> /dev/null; then
|
||||
# Prüfen ob es tatsächlich funktioniert (distutils Problem bei Python 3.12)
|
||||
if docker-compose --version &> /dev/null 2>&1; then
|
||||
COMPOSE_CMD="docker-compose"
|
||||
COMPOSE_VERSION="v1"
|
||||
return 0
|
||||
else
|
||||
# docker-compose existiert aber funktioniert nicht
|
||||
print_warning "docker-compose (v1) ist installiert, funktioniert aber nicht!"
|
||||
print_warning "Dies liegt wahrscheinlich am fehlenden 'distutils' Modul (Python 3.12+)"
|
||||
echo ""
|
||||
echo " Mögliche Lösungen:"
|
||||
echo " 1. Docker Compose v2 installieren (empfohlen):"
|
||||
echo " sudo apt-get update && sudo apt-get install docker-compose-plugin"
|
||||
echo ""
|
||||
echo " 2. distutils für Python installieren (Workaround):"
|
||||
echo " sudo apt-get install python3-distutils"
|
||||
echo " # Oder für neuere Systeme:"
|
||||
echo " pip3 install setuptools"
|
||||
echo ""
|
||||
echo " Siehe TROUBLESHOOTING.md für weitere Details."
|
||||
echo ""
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# Compose Command ermitteln
|
||||
if detect_compose_command; then
|
||||
if [ "$COMPOSE_VERSION" = "v2" ]; then
|
||||
print_success "Docker Compose v2 (Plugin) gefunden: $(docker compose version --short 2>/dev/null || docker compose version)"
|
||||
else
|
||||
print_success "docker-compose v1 gefunden: $(docker-compose --version)"
|
||||
print_warning "Empfehlung: Upgrade zu Docker Compose v2 für bessere Kompatibilität"
|
||||
fi
|
||||
else
|
||||
print_error "Docker Compose ist nicht installiert!"
|
||||
echo " Bitte installieren Sie Docker Compose"
|
||||
print_error "Docker Compose ist nicht installiert oder funktioniert nicht!"
|
||||
echo ""
|
||||
echo " Installation von Docker Compose v2 (empfohlen):"
|
||||
echo " sudo apt-get update && sudo apt-get install docker-compose-plugin"
|
||||
echo ""
|
||||
echo " Oder siehe: https://docs.docker.com/compose/install/"
|
||||
echo ""
|
||||
echo " Alternativ: Verwenden Sie install-docker-manual.sh für Installation ohne docker-compose"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Hilfsfunktion für Compose-Befehle
|
||||
run_compose() {
|
||||
$COMPOSE_CMD "$@"
|
||||
}
|
||||
|
||||
# =============================================================================
|
||||
# Funktion: Prüft ob ein Verzeichnis read-only ist
|
||||
# =============================================================================
|
||||
check_readonly() {
|
||||
local dir="$1"
|
||||
local test_file="$dir/.write_test_$$"
|
||||
|
||||
# Versuche eine Test-Datei zu erstellen
|
||||
if touch "$test_file" 2>/dev/null; then
|
||||
rm -f "$test_file" 2>/dev/null
|
||||
return 0 # Schreibbar
|
||||
else
|
||||
return 1 # Read-only
|
||||
fi
|
||||
}
|
||||
|
||||
print_readonly_warning() {
|
||||
local dir="$1"
|
||||
print_error "Das Verzeichnis '$dir' ist read-only!"
|
||||
echo ""
|
||||
echo " Das custom-nodes Verzeichnis benötigt Schreibrechte für:"
|
||||
echo " - npm install (Dependencies)"
|
||||
echo " - npm run build (Kompilierung)"
|
||||
echo ""
|
||||
echo " LÖSUNGEN:"
|
||||
echo ""
|
||||
echo " 1. Volume OHNE :ro mounten (empfohlen):"
|
||||
echo " volumes:"
|
||||
echo " - ./custom-nodes:/home/node/.n8n/custom/n8n-nodes-librebooking"
|
||||
echo " # NICHT: - ./custom-nodes:/...:ro"
|
||||
echo ""
|
||||
echo " 2. Auf dem Host bauen (für read-only Volumes):"
|
||||
echo " ./build-on-host.sh"
|
||||
echo " # Dann docker-compose.readonly.yml verwenden"
|
||||
echo ""
|
||||
echo " 3. Berechtigungen prüfen:"
|
||||
echo " ls -la $dir"
|
||||
echo " sudo chown -R 1000:1000 $dir"
|
||||
echo ""
|
||||
echo " Siehe: TROUBLESHOOTING.md und SECURITY.md"
|
||||
}
|
||||
|
||||
# Zielpfad prüfen
|
||||
if [ ! -d "$N8N_PATH" ]; then
|
||||
print_error "Verzeichnis existiert nicht: $N8N_PATH"
|
||||
|
|
@ -195,6 +288,18 @@ if [ ! -d "$CUSTOM_NODES_DIR" ]; then
|
|||
print_success "Custom Nodes kopiert nach: $CUSTOM_NODES_DIR"
|
||||
fi
|
||||
|
||||
# Prüfe ob Verzeichnis schreibbar ist
|
||||
if ! check_readonly "$CUSTOM_NODES_DIR"; then
|
||||
print_readonly_warning "$CUSTOM_NODES_DIR"
|
||||
echo ""
|
||||
read -p "Trotzdem fortfahren? (j/n): " CONTINUE_RO
|
||||
if [[ ! "$CONTINUE_RO" =~ ^[jJyY]$ ]]; then
|
||||
print_error "Abbruch wegen read-only Verzeichnis"
|
||||
exit 1
|
||||
fi
|
||||
print_warning "Fortsetzen trotz read-only - npm install wird fehlschlagen!"
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# Node bauen (wenn nicht bereits gebaut)
|
||||
# =============================================================================
|
||||
|
|
|
|||
|
|
@ -0,0 +1,191 @@
|
|||
#!/bin/sh
|
||||
# ============================================================================
|
||||
# install-in-container.sh - Installiert den LibreBooking Node IM Docker Container
|
||||
# Dieses Skript wird INNERHALB des Containers ausgeführt!
|
||||
# ============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
echo "============================================"
|
||||
echo " LibreBooking Node - Container Installation"
|
||||
echo "============================================"
|
||||
echo ""
|
||||
|
||||
# Funktion: Prüft ob ein Verzeichnis read-only ist
|
||||
check_readonly() {
|
||||
local dir="$1"
|
||||
local test_file="$dir/.write_test_$$"
|
||||
|
||||
# Versuche eine Test-Datei zu erstellen
|
||||
if touch "$test_file" 2>/dev/null; then
|
||||
rm -f "$test_file" 2>/dev/null
|
||||
return 0 # Schreibbar (exit code 0 = true)
|
||||
else
|
||||
return 1 # Read-only (exit code 1 = false)
|
||||
fi
|
||||
}
|
||||
|
||||
print_readonly_error() {
|
||||
local dir="$1"
|
||||
echo ""
|
||||
echo "============================================"
|
||||
echo " FEHLER: Read-only Volume!"
|
||||
echo "============================================"
|
||||
echo ""
|
||||
echo "Das Verzeichnis '$dir' ist read-only gemountet."
|
||||
echo "npm install und npm run build benötigen Schreibrechte."
|
||||
echo ""
|
||||
echo "LÖSUNGEN:"
|
||||
echo ""
|
||||
echo "1. Volume OHNE :ro mounten:"
|
||||
echo " In docker-compose.yml oder docker-compose.override.yml:"
|
||||
echo ""
|
||||
echo " volumes:"
|
||||
echo " - ./custom-nodes:/home/node/.n8n/custom/n8n-nodes-librebooking"
|
||||
echo " # NICHT:"
|
||||
echo " - ./custom-nodes:/home/node/.n8n/custom/n8n-nodes-librebooking:ro"
|
||||
echo ""
|
||||
echo "2. Auf dem Host bauen:"
|
||||
echo " Führen Sie auf dem HOST aus: ./build-on-host.sh"
|
||||
echo " Dann verwenden Sie: docker-compose.readonly.yml"
|
||||
echo ""
|
||||
echo "Siehe: TROUBLESHOOTING.md"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Mögliche Pfade für custom-nodes
|
||||
POSSIBLE_PATHS="
|
||||
/home/node/.n8n/custom/n8n-nodes-librebooking
|
||||
/home/node/.n8n/custom
|
||||
/opt/n8n/custom-nodes
|
||||
/data/custom-nodes
|
||||
"
|
||||
|
||||
CUSTOM_NODE_PATH=""
|
||||
|
||||
# Finde den custom-nodes Pfad
|
||||
echo "[1/5] Suche custom-nodes Verzeichnis..."
|
||||
for path in $POSSIBLE_PATHS; do
|
||||
if [ -d "$path" ]; then
|
||||
# Prüfe ob package.json vorhanden ist
|
||||
if [ -f "$path/package.json" ]; then
|
||||
CUSTOM_NODE_PATH="$path"
|
||||
echo " ✓ Gefunden: $path"
|
||||
break
|
||||
elif [ -f "$path/n8n-nodes-librebooking/package.json" ]; then
|
||||
CUSTOM_NODE_PATH="$path/n8n-nodes-librebooking"
|
||||
echo " ✓ Gefunden: $CUSTOM_NODE_PATH"
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -z "$CUSTOM_NODE_PATH" ]; then
|
||||
echo " ✗ Kein custom-nodes Verzeichnis mit package.json gefunden!"
|
||||
echo ""
|
||||
echo " Geprüfte Pfade:"
|
||||
for path in $POSSIBLE_PATHS; do
|
||||
if [ -d "$path" ]; then
|
||||
echo " - $path (existiert, aber keine package.json)"
|
||||
else
|
||||
echo " - $path (existiert nicht)"
|
||||
fi
|
||||
done
|
||||
echo ""
|
||||
echo " Bitte stellen Sie sicher, dass die Dateien korrekt kopiert wurden."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Wechsle ins Verzeichnis
|
||||
echo "[2/5] Wechsle ins Verzeichnis: $CUSTOM_NODE_PATH"
|
||||
cd "$CUSTOM_NODE_PATH"
|
||||
echo " ✓ Aktuelles Verzeichnis: $(pwd)"
|
||||
|
||||
# Prüfe ob npm verfügbar ist
|
||||
echo "[3/5] Prüfe npm..."
|
||||
if ! command -v npm >/dev/null 2>&1; then
|
||||
echo " ✗ npm ist nicht installiert!"
|
||||
echo ""
|
||||
echo " Im n8n Docker-Image sollte npm vorhanden sein."
|
||||
echo " Falls nicht, verwenden Sie ein Image mit Node.js."
|
||||
exit 1
|
||||
fi
|
||||
echo " ✓ npm Version: $(npm --version)"
|
||||
echo " ✓ node Version: $(node --version)"
|
||||
|
||||
# Prüfe Schreibrechte (read-only Volume?)
|
||||
echo "[3.5/5] Prüfe Schreibrechte..."
|
||||
if ! check_readonly "$CUSTOM_NODE_PATH"; then
|
||||
print_readonly_error "$CUSTOM_NODE_PATH"
|
||||
fi
|
||||
echo " ✓ Schreibrechte vorhanden"
|
||||
|
||||
# Dependencies installieren
|
||||
echo "[4/5] Installiere Dependencies..."
|
||||
echo " Führe 'npm install' aus..."
|
||||
if npm install 2>&1; then
|
||||
echo " ✓ Dependencies installiert"
|
||||
else
|
||||
echo " ✗ npm install fehlgeschlagen!"
|
||||
echo ""
|
||||
echo " Mögliche Lösungen:"
|
||||
echo " - Prüfen Sie die Berechtigungen"
|
||||
echo " - Prüfen Sie die Internetverbindung"
|
||||
echo " - Führen Sie 'npm cache clean --force' aus"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Build ausführen
|
||||
echo "[5/5] Baue den Node..."
|
||||
echo " Führe 'npm run build' aus..."
|
||||
if npm run build 2>&1; then
|
||||
echo " ✓ Build erfolgreich"
|
||||
else
|
||||
echo " ✗ Build fehlgeschlagen!"
|
||||
echo ""
|
||||
echo " Prüfen Sie die TypeScript-Fehler in der Ausgabe oben."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Prüfe Ergebnis
|
||||
echo ""
|
||||
echo "============================================"
|
||||
echo " Prüfe Installation..."
|
||||
echo "============================================"
|
||||
|
||||
if [ -d "$CUSTOM_NODE_PATH/dist" ]; then
|
||||
echo "✓ dist/ Verzeichnis existiert"
|
||||
|
||||
# Prüfe auf .node.js Dateien
|
||||
NODE_FILES=$(find "$CUSTOM_NODE_PATH/dist" -name "*.node.js" 2>/dev/null | wc -l)
|
||||
if [ "$NODE_FILES" -gt 0 ]; then
|
||||
echo "✓ $NODE_FILES Node-Datei(en) gefunden:"
|
||||
find "$CUSTOM_NODE_PATH/dist" -name "*.node.js" -exec echo " - {}" \;
|
||||
else
|
||||
echo "✗ Keine .node.js Dateien im dist/ Verzeichnis gefunden!"
|
||||
fi
|
||||
|
||||
# Prüfe credentials
|
||||
CRED_FILES=$(find "$CUSTOM_NODE_PATH/dist" -name "*.credentials.js" 2>/dev/null | wc -l)
|
||||
if [ "$CRED_FILES" -gt 0 ]; then
|
||||
echo "✓ $CRED_FILES Credential-Datei(en) gefunden"
|
||||
fi
|
||||
else
|
||||
echo "✗ dist/ Verzeichnis wurde nicht erstellt!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "============================================"
|
||||
echo " Installation abgeschlossen!"
|
||||
echo "============================================"
|
||||
echo ""
|
||||
echo "Nächste Schritte:"
|
||||
echo " 1. Verlassen Sie den Container: exit"
|
||||
echo " 2. Starten Sie n8n neu: docker restart n8n"
|
||||
echo " 3. Öffnen Sie n8n im Browser und suchen Sie nach 'LibreBooking'"
|
||||
echo ""
|
||||
echo "Falls der Node nicht erscheint:"
|
||||
echo " - Prüfen Sie die Umgebungsvariable N8N_CUSTOM_EXTENSIONS"
|
||||
echo " - Führen Sie ./check-installation.sh aus"
|
||||
echo ""
|
||||
Binary file not shown.
Binary file not shown.
12
package.json
12
package.json
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "n8n-nodes-librebooking",
|
||||
"version": "1.0.0",
|
||||
"version": "1.1.0",
|
||||
"description": "n8n Node für LibreBooking - Ressourcen- und Reservierungsverwaltung",
|
||||
"keywords": [
|
||||
"n8n-community-node-package",
|
||||
|
|
@ -46,7 +46,11 @@
|
|||
"postinstall": "echo 'Installation abgeschlossen. Führe npm run build aus.'",
|
||||
"test": "ts-node test/test-api.ts",
|
||||
"link:n8n": "npm link && echo 'Node verlinkt. Starte n8n neu mit: n8n start'",
|
||||
"unlink": "npm unlink -g n8n-nodes-librebooking"
|
||||
"unlink": "npm unlink -g n8n-nodes-librebooking",
|
||||
"install-in-docker": "npm install && npm run build && echo '\\n✓ Installation abgeschlossen. Bitte n8n Container neustarten: docker restart n8n'",
|
||||
"docker:copy": "docker cp dist n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/ && docker cp package.json n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/ && docker cp node_modules n8n:/home/node/.n8n/custom/n8n-nodes-librebooking/",
|
||||
"docker:restart": "docker restart n8n",
|
||||
"docker:deploy": "npm run build && npm run docker:copy && npm run docker:restart"
|
||||
},
|
||||
"files": [
|
||||
"dist",
|
||||
|
|
@ -78,5 +82,9 @@
|
|||
},
|
||||
"engines": {
|
||||
"node": ">=18.17.0"
|
||||
},
|
||||
"overrides": {
|
||||
"form-data": "^4.0.1",
|
||||
"lodash": "^4.17.21"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,71 @@
|
|||
#!/bin/bash
|
||||
# ============================================================================
|
||||
# quick-install.sh - Schnellste Installation des LibreBooking n8n Nodes
|
||||
#
|
||||
# EMPFOHLENE METHODE: Auf dem Host bauen, in Container kopieren
|
||||
# ============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
CONTAINER_NAME="${1:-n8n}"
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
echo -e "${GREEN}=== LibreBooking Quick Install ===${NC}\n"
|
||||
|
||||
# Prüfe Voraussetzungen
|
||||
if ! command -v node &>/dev/null; then
|
||||
echo -e "${RED}Fehler: Node.js nicht installiert!${NC}"
|
||||
echo "Installieren: https://nodejs.org/ (v18+)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v docker &>/dev/null; then
|
||||
echo -e "${RED}Fehler: Docker nicht installiert!${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! docker ps | grep -q "$CONTAINER_NAME"; then
|
||||
echo -e "${YELLOW}Warnung: Container '$CONTAINER_NAME' nicht gefunden oder läuft nicht.${NC}"
|
||||
echo "Verfügbare Container:"
|
||||
docker ps --format " {{.Names}}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
# 1. Dependencies installieren
|
||||
echo "[1/4] Installiere Dependencies..."
|
||||
npm install --silent
|
||||
|
||||
# 2. Bauen
|
||||
echo "[2/4] Baue Node..."
|
||||
npm run build --silent
|
||||
|
||||
# 3. In Container kopieren
|
||||
echo "[3/4] Kopiere in Container '$CONTAINER_NAME'..."
|
||||
|
||||
# Erstelle Zielverzeichnis falls nötig
|
||||
docker exec "$CONTAINER_NAME" mkdir -p /home/node/.n8n/custom/n8n-nodes-librebooking 2>/dev/null || true
|
||||
|
||||
# Kopiere Dateien
|
||||
docker cp dist "$CONTAINER_NAME":/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
docker cp package.json "$CONTAINER_NAME":/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
docker cp node_modules "$CONTAINER_NAME":/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
|
||||
# 4. Container neustarten
|
||||
echo "[4/4] Starte Container neu..."
|
||||
docker restart "$CONTAINER_NAME"
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}✓ Installation abgeschlossen!${NC}"
|
||||
echo ""
|
||||
echo "Nächste Schritte:"
|
||||
echo " 1. Öffne n8n: http://localhost:5678"
|
||||
echo " 2. Gehe zu: Einstellungen → Credentials → Add Credential"
|
||||
echo " 3. Suche: 'LibreBooking API'"
|
||||
echo ""
|
||||
|
|
@ -0,0 +1,112 @@
|
|||
#!/bin/bash
|
||||
# ============================================================================
|
||||
# update-dependencies.sh - Aktualisiert Dependencies und behebt Vulnerabilities
|
||||
# ============================================================================
|
||||
|
||||
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 - Dependency Update${NC}"
|
||||
echo -e "${BLUE}============================================${NC}"
|
||||
echo ""
|
||||
|
||||
log() {
|
||||
echo -e "${GREEN}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
warn() {
|
||||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
# Schritt 1: Aktuelle Vulnerabilities anzeigen
|
||||
log "Prüfe aktuelle Vulnerabilities..."
|
||||
echo ""
|
||||
echo "=== VOR dem Update ==="
|
||||
npm audit 2>/dev/null || true
|
||||
echo ""
|
||||
|
||||
# Schritt 2: npm audit fix
|
||||
log "Führe npm audit fix aus..."
|
||||
if npm audit fix 2>&1; then
|
||||
log "npm audit fix erfolgreich ✓"
|
||||
else
|
||||
warn "npm audit fix hatte Probleme (evtl. normale Warnungen)"
|
||||
fi
|
||||
|
||||
# Schritt 3: npm update
|
||||
log "Führe npm update aus..."
|
||||
if npm update 2>&1; then
|
||||
log "npm update erfolgreich ✓"
|
||||
else
|
||||
warn "npm update hatte Probleme"
|
||||
fi
|
||||
|
||||
# Schritt 4: Outdated Packages prüfen
|
||||
log "Prüfe veraltete Packages..."
|
||||
echo ""
|
||||
npm outdated 2>/dev/null || log "Alle Packages sind aktuell ✓"
|
||||
echo ""
|
||||
|
||||
# Schritt 5: Build testen
|
||||
log "Teste Build..."
|
||||
if npm run build 2>&1 | tail -5; then
|
||||
log "Build erfolgreich ✓"
|
||||
else
|
||||
error "Build fehlgeschlagen!"
|
||||
echo ""
|
||||
echo "Versuchen Sie:"
|
||||
echo " 1. rm -rf node_modules package-lock.json"
|
||||
echo " 2. npm install"
|
||||
echo " 3. npm run build"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Schritt 6: Finale Vulnerability-Prüfung
|
||||
log "Finale Vulnerability-Prüfung..."
|
||||
echo ""
|
||||
echo "=== NACH dem Update ==="
|
||||
npm audit 2>/dev/null || true
|
||||
echo ""
|
||||
|
||||
# Schritt 7: Report
|
||||
echo -e "${GREEN}============================================${NC}"
|
||||
echo -e "${GREEN} Update abgeschlossen!${NC}"
|
||||
echo -e "${GREEN}============================================${NC}"
|
||||
echo ""
|
||||
|
||||
# Verbleibende Vulnerabilities zählen
|
||||
AUDIT_OUTPUT=$(npm audit 2>/dev/null || true)
|
||||
if echo "$AUDIT_OUTPUT" | grep -q "found 0 vulnerabilities"; then
|
||||
log "Keine Vulnerabilities mehr! ✓"
|
||||
else
|
||||
VULN_COUNT=$(echo "$AUDIT_OUTPUT" | grep -oP '\d+ vulnerabilities' | head -1 || echo "Einige")
|
||||
warn "Verbleibende Vulnerabilities: $VULN_COUNT"
|
||||
echo ""
|
||||
echo "Diese kommen wahrscheinlich von n8n-workflow Dependencies."
|
||||
echo "Siehe SECURITY.md für weitere Informationen."
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Nächste Schritte:"
|
||||
echo " 1. Testen Sie die Änderungen lokal"
|
||||
echo " 2. Committen Sie die Änderungen:"
|
||||
echo " git add package.json package-lock.json"
|
||||
echo " git commit -m 'chore: update dependencies'"
|
||||
echo " 3. Bauen Sie das Docker-Image neu:"
|
||||
echo " docker compose build --no-cache"
|
||||
echo ""
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
#!/bin/bash
|
||||
# ============================================================================
|
||||
# update-node.sh - Aktualisiert den LibreBooking n8n Node
|
||||
#
|
||||
# Verwendung nach git pull oder Änderungen am Code
|
||||
# ============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
CONTAINER_NAME="${1:-n8n}"
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
echo -e "${GREEN}=== LibreBooking Node Update ===${NC}\n"
|
||||
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
# Git Pull (optional)
|
||||
if [ -d ".git" ]; then
|
||||
echo "[1/5] Hole neueste Änderungen..."
|
||||
git pull 2>/dev/null || echo -e "${YELLOW}Git pull übersprungen${NC}"
|
||||
else
|
||||
echo "[1/5] Kein Git Repository - übersprungen"
|
||||
fi
|
||||
|
||||
# Dependencies aktualisieren
|
||||
echo "[2/5] Aktualisiere Dependencies..."
|
||||
npm install --silent
|
||||
|
||||
# Bauen
|
||||
echo "[3/5] Baue Node..."
|
||||
npm run build --silent
|
||||
|
||||
# Prüfe Container
|
||||
if ! docker ps | grep -q "$CONTAINER_NAME"; then
|
||||
echo -e "${YELLOW}Container '$CONTAINER_NAME' nicht gefunden.${NC}"
|
||||
echo "Verfügbare Container:"
|
||||
docker ps --format " {{.Names}}"
|
||||
echo ""
|
||||
echo "Manuell kopieren:"
|
||||
echo " docker cp dist <container>:/home/node/.n8n/custom/n8n-nodes-librebooking/"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# In Container kopieren
|
||||
echo "[4/5] Kopiere in Container '$CONTAINER_NAME'..."
|
||||
docker cp dist "$CONTAINER_NAME":/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
docker cp package.json "$CONTAINER_NAME":/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
docker cp node_modules "$CONTAINER_NAME":/home/node/.n8n/custom/n8n-nodes-librebooking/
|
||||
|
||||
# Container neustarten
|
||||
echo "[5/5] Starte Container neu..."
|
||||
docker restart "$CONTAINER_NAME"
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}✓ Update abgeschlossen!${NC}"
|
||||
echo ""
|
||||
Loading…
Reference in New Issue