From 64c804cac3309cb81c0695b341707d102f68956b Mon Sep 17 00:00:00 2001 From: Max Kupper Date: Fri, 31 Oct 2025 13:10:07 +0100 Subject: [PATCH] Readme.md aktualisiert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hedgedoc markdown hinzugefügt --- Readme.md | 725 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 725 insertions(+) diff --git a/Readme.md b/Readme.md index e5d590d..6263c03 100644 --- a/Readme.md +++ b/Readme.md @@ -1,3 +1,728 @@ Hier finden sie die Dokumentation zum aufsetzen von ihrem eigenen n8n als auch dem Workflow: https://hedgedoc.karlkuebelschule.de/j2cr9Z8SSMKfDKq1J4pZNQ + + + +--- +tags: N8N, Datenschutz, LF10 +--- + + + +# N8N Datenschutprüfer in einem Formular + +## Inhalt + +- [Docker aufsetzen](#docker-aufsetzen) +- [N8N aufsetzen](#n8n-aufsetzen) +- [SQL Datenbank aufsetzen](#sql-datenbank-aufsetzen) +- [N8N mit der Datenbank verbinden](#n8n-mit-der-datenbank-verbinden) +- [N8N Neuer Workflow erstellen](#n8n-neuer-workflow-erstellen) +- [Nodes erstellen](#nodes-einfuegen) +- [Formular erstellen](#formular-erstellen) +- [Datenbank-Anbindung hinzufügen](#datenbank-anbindung-hinzufügen) +- [Daten aus der Datenbank holen](#daten-aus-der-datenbank-holen) +- [E-Mails versenden](#e-mails-versenden) +- [Antworten anzeigen](#antworten-anzeigen) +- [Import Beispiel](#import-beispiel) +- [Anhang](#anhang) + + +--- + +

Docker aufsetzen

+ +1. Gehen Sie auf die Docker Webseite https://www.docker.com/ +2. Docker Konto erstellen. +3. Docker Downloaden. +4. Docker Installieren und einrichten. + +

N8N aufsetzen

+ +1. Öffnen sie die powershell/cmd +2. Kopieren sie diesen Code in powershell/cmd und führen sie ihn aus +- Zum Kopieren +``` +docker run -e N8N_BASIC_AUTH_ACTIVE=true -e N8N_BASIC_AUTH_USER=admin -e N8N_BASIC_AUTH_PASSWORD=supersecret -e N8N_HOST=0.0.0.0 --name n8n-container -p 5678:5678 -d n8nio/n8n +``` + +- Zum Veranschaulichen +``` +docker run -e N8N_BASIC_AUTH_ACTIVE=true +-e N8N_BASIC_AUTH_USER=admin +-e N8N_BASIC_AUTH_PASSWORD=supersecret +-e N8N_HOST=0.0.0.0 +--name n8n-container +-p 5678:5678 +-d n8nio/n8n +``` + +3. Jetzt haben sie ein Container mit N8N angelegt. +4. Sie über localhost und dem Port darauf zugreifen. -> http://localhost:5678 +5. Melden sie sich mit ihren Daten die im Code sind an. + +

MSSQL Datenbank aufsetzen

+ +1. Öffnen sie die cmd/powershell +2. Kopieren sie diesen Code in cmd/powershell und führen sie ihn aus. +- Zum Kopieren +``` +docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=YourStrong!Passw0rd" -p 1433:1433 --name my-mssql-container -d mcr.microsoft.com/mssql/server:2022-latest +``` + +- Zum Veranschaulichen +``` +docker run +-e "ACCEPT_EULA=Y" +-e "SA_PASSWORD=YourStrong!Passw0rd" +-p 1433:1433 +--name my-mssql-container +-d mcr.microsoft.com/mssql/server:2022-latest +``` +3. Jetzt haben sie ein Container mit einer Datenbank angelegt. +4. Laden sie sich MSSQL herunter und Instalieren sie es. + https://learn.microsoft.com/de-de/ssms/install/install + + +

Auf Datenbank einrichten

+ +1. Starten sie SQL Server Management Studio +2. Erstellen sie eine neue Verbindung +3. Der Port / Passwort sind die, die Sie bei der einrichtung der Datenbank angegeben haben. +4. **Server Name** = localhost,1433 +5. **Authentication** = "SQL Server-Authentifizierung" +6. **Username** = "sa" +7. **Password** = "YourStrong!Passw0rd" +8. **Trust Server Certificate** Checkbox auswählen. +9. Erstellen Sie eine "**neue Abfrage**". +10. Schauen Sie im Anhang 1. "**Datenbank erstellen**". +11. Fügen sie den Code ein und führen sie ihn mit **F5** aus. +12. Damit wurde eine Datenbank namens **N8N** erstellt. +13. Kopieren Sie sich den Zweiten Code im Anhang 2. "**Tabelle erstellen**", fügen ihn ein und Führen Sie ihn aus. +14. Aktualisieren sie die Datenbank Verbindung. + +

N8N mit der Datenbank verbinden

+ +1. Öffnen sie Powershell +2. Erstellen Sie ein Netzwerk in Docker mit +``docker network create my-network`` +4. Verbinden sie jetzt beide Container. +``docker network connect my-network my-mssql-container`` +``docker network connect my-network n8n-container`` +5. Um die Verbindung zu testen führen sie den unteren Code aus +``docker exec -it n8n-container ping my-mssql-container`` + + + + +

N8N Neuer Workflow erstellen

+ +1. Melden Sie sich in N8N an. +2. Oben links, rechts neben dem N8N-Logo, finden Sie ein **+**-Zeichen. +3. Klicken Sie auf den **+**-Button – nun sollte ein Dropdown mit „Workflow“ erscheinen. +4. Klicken Sie auf **Workflow**, um Ihr neues Board zu erstellen. + + +

Nodes einfügen

+ +1. Klicken sie oben Rechts auf **+** um das Node fenster zu öffnen. +2. Dort können sie eine Vielzahl von Nodes benutzen + +

Formular erstellen

+ +1. On Form Submission erstellen. Dies ist unser Einstiegspunkt für den Workflow. +2. Titel, Beschreibungen und Felder erstellen +3. Bei "Form URLs" sehen sie die URL zum testen als auch die spätere Production URL unter der das Formular erreichbar ist +4. In einem folgendem Code-Block Eingabedaten als JSON weiter geben an DB + +

Datenbank-Anbindung hinzufügen

+ +1. Fügen sie die Node "Microsoft SQL" ein. +2. Doppelklick auf die Node und bei "Credential to connect with" auf den Stift um eine Verbindung zu bearbeiten. +3. Geben sie jetzt die gleichen Werte an wie bei der Datenbank verbindung. +4. **Server** = "my-mssql-container" +5. **Database** = "N8N" <- ihre Datenbank die sie Benutzen wollen +6. **User** = "sa" +7. **Password** = "YourStrong!Passw0rd" +8. **Port** = 1433 +9. Führen sie Eine Test verbindung durch + +

Daten aus der Datenbank holen

+ +1. In der Node "**Microsoft SQL**" können sie unten im Query Feld diese Abfrage einfügen. +``SELECT Anwendung, Farbe From Valide Where Anwendung Like '%{{ $json.AnwendungsName }}%'`` +2. Damit bekommen sie von der Datenbank 2 Werte zurück **Anwendungs namen** und die **Farbe**. + + +

Antworten anzeigen

+ +1. Resultierende Daten aus Datenbank mit Switch auswerten, nach Farbe +2. In einzelnen Codeblöcken, für jeden case, zusammenbauen was angezeigt werden soll und was mit E-Mail versand wird +3. Form Node hinzufügen. Type = Form Ending +4. Hier entsprechend anzeigen was wir in den Codeblöcken gebaut haben + +

E-Mails versenden

+ +1. Send E-Mail Node hinzufügen +2. Credentials erstellen mit welchen E-Mail versendet wird. User, Passwort, Host und Port (Port ist standardmäßig 465) +4. Empfänger/Sender angeben, (Empfänger E-Mail aus vorherigen Nodes) +5. HTML als E-Mail Format auswählen und dort gewünschten HTML Code platzieren, den wir vorher in den Codeblöcken nach dem switch erstellt haben + +

Import Beispiel

+ +1. Nehmen Sie sich den Code vom Anhang 3. "Import Beispiel" +2. Fügen Sie den Code in einen Editor und Speichern Sie ihn mit der Endung .json +3. Öffnen Sie in einem neuen Workflow +4. Klicken Sie oben rechts auf die drei Punkte und wählen sie den Punkt Import File. +5. Wählen Sie ihre json Datei und jetzt sollten Sie den Workflow haben. + +

Anhang

+ +

Anhang 1: Datenbank erstellen

+ +``` +USE [master] +GO + +/****** Object: Database [N8N] Script Date: 31.10.2025 12:14:56 ******/ +CREATE DATABASE [N8N] + CONTAINMENT = NONE + ON PRIMARY +( NAME = N'N8N', FILENAME = N'/var/opt/mssql/data/N8N.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ) + LOG ON +( NAME = N'N8N_log', FILENAME = N'/var/opt/mssql/data/N8N_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB ) + WITH CATALOG_COLLATION = DATABASE_DEFAULT +GO + +IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) +begin +EXEC [N8N].[dbo].[sp_fulltext_database] @action = 'enable' +end +GO + +ALTER DATABASE [N8N] SET ANSI_NULL_DEFAULT OFF +GO + +ALTER DATABASE [N8N] SET ANSI_NULLS OFF +GO + +ALTER DATABASE [N8N] SET ANSI_PADDING OFF +GO + +ALTER DATABASE [N8N] SET ANSI_WARNINGS OFF +GO + +ALTER DATABASE [N8N] SET ARITHABORT OFF +GO + +ALTER DATABASE [N8N] SET AUTO_CLOSE OFF +GO + +ALTER DATABASE [N8N] SET AUTO_SHRINK OFF +GO + +ALTER DATABASE [N8N] SET AUTO_UPDATE_STATISTICS ON +GO + +ALTER DATABASE [N8N] SET CURSOR_CLOSE_ON_COMMIT OFF +GO + +ALTER DATABASE [N8N] SET CURSOR_DEFAULT GLOBAL +GO + +ALTER DATABASE [N8N] SET CONCAT_NULL_YIELDS_NULL OFF +GO + +ALTER DATABASE [N8N] SET NUMERIC_ROUNDABORT OFF +GO + +ALTER DATABASE [N8N] SET QUOTED_IDENTIFIER OFF +GO + +ALTER DATABASE [N8N] SET RECURSIVE_TRIGGERS OFF +GO + +ALTER DATABASE [N8N] SET ENABLE_BROKER +GO + +ALTER DATABASE [N8N] SET AUTO_UPDATE_STATISTICS_ASYNC OFF +GO + +ALTER DATABASE [N8N] SET DATE_CORRELATION_OPTIMIZATION OFF +GO + +ALTER DATABASE [N8N] SET TRUSTWORTHY OFF +GO + +ALTER DATABASE [N8N] SET ALLOW_SNAPSHOT_ISOLATION OFF +GO + +ALTER DATABASE [N8N] SET PARAMETERIZATION SIMPLE +GO + +ALTER DATABASE [N8N] SET READ_COMMITTED_SNAPSHOT OFF +GO + +ALTER DATABASE [N8N] SET HONOR_BROKER_PRIORITY OFF +GO + +ALTER DATABASE [N8N] SET RECOVERY FULL +GO + +ALTER DATABASE [N8N] SET MULTI_USER +GO + +ALTER DATABASE [N8N] SET PAGE_VERIFY CHECKSUM +GO + +ALTER DATABASE [N8N] SET DB_CHAINING OFF +GO + +ALTER DATABASE [N8N] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) +GO + +ALTER DATABASE [N8N] SET TARGET_RECOVERY_TIME = 60 SECONDS +GO + +ALTER DATABASE [N8N] SET DELAYED_DURABILITY = DISABLED +GO + +ALTER DATABASE [N8N] SET ACCELERATED_DATABASE_RECOVERY = OFF +GO + +ALTER DATABASE [N8N] SET QUERY_STORE = OFF +GO + +ALTER DATABASE [N8N] SET READ_WRITE +GO +``` + + +

Anhang 2: Tabelle erstellen

+ +``` +USE [N8N] +GO + +/****** Object: Table [dbo].[Valide] Script Date: 31.10.2025 12:13:03 ******/ +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +CREATE TABLE [dbo].[Valide]( + [N8N_ID] [int] IDENTITY(1,1) NOT NULL, + [Email] [nvarchar](150) NOT NULL, + [Anwendung] [nvarchar](150) NOT NULL, + [URLAnwendung] [nvarchar](150) NOT NULL, + [Farbe] [nvarchar](50) NOT NULL, + CONSTRAINT [PK_Valide] PRIMARY KEY CLUSTERED +( + [N8N_ID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] +) ON [PRIMARY] +GO + +ALTER TABLE [dbo].[Valide] ADD CONSTRAINT [DF_Valide_Email] DEFAULT ('') FOR [Email] +GO + +ALTER TABLE [dbo].[Valide] ADD CONSTRAINT [DF_Valide_Anwendung] DEFAULT ('') FOR [Anwendung] +GO + +ALTER TABLE [dbo].[Valide] ADD CONSTRAINT [DF_Valide_URLAnwendung] DEFAULT ('') FOR [URLAnwendung] +GO + +ALTER TABLE [dbo].[Valide] ADD CONSTRAINT [DF_Valide_Farbe] DEFAULT ('') FOR [Farbe] +GO +``` + +

Beispiel JSON Projekt Datenschutz

+ +``` +{ + "name": "My workflow", + "nodes": [ + { + "parameters": { + "formTitle": "Check URL", + "formFields": { + "values": [ + { + "fieldType": "html", + "html": "
\n

\n Der Anwendungsname ist der offizielle Name der Software. Sie finden ihn in der Regel in der Anwendung selbst, z. B. unter „Hilfe → Info“, „Über…“ oder im Startbildschirm.\n

\n
\n \n
\n" + }, + { + "fieldLabel": "E-Mail", + "fieldType": "email", + "requiredField": true + }, + { + "fieldLabel": "Name der Anwendung:", + "requiredField": true + }, + { + "fieldLabel": "Version:" + } + ] + }, + "options": { + "buttonLabel": "Anwendung prüfen", + "respondWithOptions": { + "values": { + "formSubmittedText": "Email wird Versendet!" + } + } + } + }, + "type": "n8n-nodes-base.formTrigger", + "typeVersion": 2.2, + "position": [ + -336, + -192 + ], + "id": "e11312df-26ab-40f5-879b-5c2c2b498a44", + "name": "On form submission", + "webhookId": "698b2338-d434-4db5-a064-2da34809c491" + }, + { + "parameters": { + "assignments": { + "assignments": [ + { + "id": "86b379e5-5ff1-4c49-9620-c03d2023d8cd", + "name": "Email", + "value": "={{ $json['E-Mail'] }}", + "type": "string" + }, + { + "id": "70edd998-30cf-47c0-b1f1-702249bf8ee1", + "name": "AnwendungsName", + "value": "={{ $json['Name der Anwendung:'] }}", + "type": "string" + }, + { + "id": "1d5eae01-b8bf-4a1b-a6e0-3caa00650731", + "name": "Version", + "value": "={{ $json['Version:'] }}", + "type": "string" + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.set", + "typeVersion": 3.4, + "position": [ + -112, + -192 + ], + "id": "3b6db320-c332-45cb-a694-d839f8f3a4f4", + "name": "Edit Fields" + }, + { + "parameters": { + "operation": "executeQuery", + "query": "SELECT Anwendung, Farbe From Valide Where Anwendung Like '%{{ $json.AnwendungsName }}%'" + }, + "type": "n8n-nodes-base.microsoftSql", + "typeVersion": 1.1, + "position": [ + 96, + -192 + ], + "id": "ceec887d-88da-42c9-947d-3225ef4c761c", + "name": "Microsoft SQL1", + "credentials": { + "microsoftSql": { + "id": "djdfLzBSpOyGbd5J", + "name": "Microsoft SQL account" + } + } + }, + { + "parameters": { + "fromEmail": "testschulen8n@gmail.com", + "toEmail": "={{ $('On form submission').item.json['E-Mail'] }}", + "subject": "Datenschutz Prüfung", + "html": "={{ $json.html }}", + "options": {} + }, + "type": "n8n-nodes-base.emailSend", + "typeVersion": 2.1, + "position": [ + 1088, + -160 + ], + "id": "ccb3f806-3c1c-407d-b60c-e2f14dfe7deb", + "name": "Send email", + "webhookId": "24c30897-71b1-46b6-a704-ef008f4277aa", + "credentials": { + "smtp": { + "id": "QV9RLh6CctQW2oah", + "name": "SMTP account" + } + } + }, + { + "parameters": { + "jsCode": "return [\n {\n json: {\n html: `\n \n\n\n\n \n \n Einfach Ampel\n\n\n \n
\n \n
\n \n
\n \n
\n \n
\n \n \n

URL: Hier klicken

\n\n\n \n

Info 1: Gelb, es gibt zwar noch kritische Punkte, die Aufmerksamkeit erfordern

\n\n\n\n \n `\n }\n }\n];\n" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 704, + -192 + ], + "id": "223639a8-af29-4bf6-951b-19257b8fdf0f", + "name": "Code2" + }, + { + "parameters": { + "jsCode": "return [\n {\n json: {\n html: `\n\n\n\n \n \n Einfach Ampel\n\n\n \n
\n \n
\n \n
\n \n
\n \n
\n \n

URL: Hier klicken

\n\n \n

Info 1: Rot, die Datenschutzbestimmungen wurden aufgrund von Problemen nicht akzeptiert

\n\n\n\n `\n }\n }\n];\n" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 704, + -336 + ], + "id": "8409a40b-605b-4823-b690-829ac0ad837a", + "name": "Code3" + }, + { + "parameters": { + "jsCode": "return [\n {\n json: {\n html: `\n\n\n\n \n \n Einfach Ampel\n\n\n \n
\n \n
\n \n
\n \n
\n \n
\n \n \n

URL: Hier klicken

\n\n \n

Info 1: Grün, alle Datenschutzanforderungen sind erfüllt und keine Probleme bestehen.\n\n\n\n `\n }\n }\n];\n" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 704, + -32 + ], + "id": "fe73c875-2da6-4398-b9e7-ab1ffd9c7d04", + "name": "Code4" + }, + { + "parameters": { + "rules": { + "values": [ + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict", + "version": 2 + }, + "conditions": [ + { + "leftValue": "={{ $json.Farbe }}", + "rightValue": "green", + "operator": { + "type": "string", + "operation": "equals" + }, + "id": "e407db7e-c62f-446f-b050-a2da0cf47164" + } + ], + "combinator": "and" + } + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict", + "version": 2 + }, + "conditions": [ + { + "id": "bec012ef-ea1f-4eb7-86fc-cb0bd6c24ae3", + "leftValue": "={{ $json.Farbe }}", + "rightValue": "yellow", + "operator": { + "type": "string", + "operation": "equals", + "name": "filter.operator.equals" + } + } + ], + "combinator": "and" + } + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict", + "version": 2 + }, + "conditions": [ + { + "id": "57bf0a44-0930-4ec4-bb7e-46ac02c8472f", + "leftValue": "={{ $json.Farbe }}", + "rightValue": "red", + "operator": { + "type": "string", + "operation": "equals", + "name": "filter.operator.equals" + } + } + ], + "combinator": "and" + } + }, + { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict", + "version": 2 + }, + "conditions": [ + { + "id": "eed6d263-ae94-48ce-a996-bece887855c8", + "leftValue": "={{ $json.Farbe }}", + "rightValue": "unbekannt", + "operator": { + "type": "string", + "operation": "equals", + "name": "filter.operator.equals" + } + } + ], + "combinator": "and" + } + } + ] + }, + "options": {} + }, + "type": "n8n-nodes-base.switch", + "typeVersion": 3.2, + "position": [ + 368, + -224 + ], + "id": "3b48bcf7-dd8c-4328-8417-408b8c43d3b3", + "name": "Switch" + } + ], + "pinData": {}, + "connections": { + "On form submission": { + "main": [ + [ + { + "node": "Edit Fields", + "type": "main", + "index": 0 + } + ] + ] + }, + "Edit Fields": { + "main": [ + [ + { + "node": "Microsoft SQL1", + "type": "main", + "index": 0 + } + ] + ] + }, + "Microsoft SQL1": { + "main": [ + [ + { + "node": "Switch", + "type": "main", + "index": 0 + } + ] + ] + }, + "Switch": { + "main": [ + [ + { + "node": "Code4", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "Code2", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "Code3", + "type": "main", + "index": 0 + } + ], + [] + ] + }, + "Code3": { + "main": [ + [ + { + "node": "Send email", + "type": "main", + "index": 0 + } + ] + ] + }, + "Code2": { + "main": [ + [ + { + "node": "Send email", + "type": "main", + "index": 0 + } + ] + ] + }, + "Code4": { + "main": [ + [ + { + "node": "Send email", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "active": false, + "settings": { + "executionOrder": "v1" + }, + "versionId": "cefe6a6c-40e1-4f1e-bc94-4821c80410bb", + "meta": { + "templateCredsSetupCompleted": true, + "instanceId": "b7269067285ce522731ca81186ba09707a0ea125a4dea42e18c518a85012a790" + }, + "id": "uBtwr3o5oN3RflKc", + "tags": [] +} +``` \ No newline at end of file