main
Hier finden sie die Dokumentation zum aufsetzen von ihrem eigenen n8n als auch dem Workflow:
https://hedgedoc.karlkuebelschule.de/j2cr9Z8SSMKfDKq1J4pZNQ
tags: N8N, Datenschutz, LF10
<style> h1, h2, h3, h4, h5, h6 { border-bottom: none !important; } </style>N8N Datenschutprüfer in einem Formular
Inhalt
- Docker aufsetzen
- N8N aufsetzen
- SQL Datenbank aufsetzen
- N8N mit der Datenbank verbinden
- N8N Neuer Workflow erstellen
- Nodes erstellen
- Formular erstellen
- Datenbank-Anbindung hinzufügen
- Daten aus der Datenbank holen
- E-Mails versenden
- Antworten anzeigen
- Import Beispiel
- Anhang
Docker aufsetzen
- Gehen Sie auf die Docker Webseite https://www.docker.com/
- Docker Konto erstellen.
- Docker Downloaden.
- Docker Installieren und einrichten.
N8N aufsetzen
- Öffnen sie die powershell/cmd
- 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
- Jetzt haben sie ein Container mit N8N angelegt.
- Sie über localhost und dem Port darauf zugreifen. -> http://localhost:5678
- Melden sie sich mit ihren Daten die im Code sind an.
MSSQL Datenbank aufsetzen
- Öffnen sie die cmd/powershell
- 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
- Jetzt haben sie ein Container mit einer Datenbank angelegt.
- Laden sie sich MSSQL herunter und Instalieren sie es. https://learn.microsoft.com/de-de/ssms/install/install
Auf Datenbank einrichten
- Starten sie SQL Server Management Studio
- Erstellen sie eine neue Verbindung
- Der Port / Passwort sind die, die Sie bei der einrichtung der Datenbank angegeben haben.
- Server Name = localhost,1433
- Authentication = "SQL Server-Authentifizierung"
- Username = "sa"
- Password = "YourStrong!Passw0rd"
- Trust Server Certificate Checkbox auswählen.
- Erstellen Sie eine "neue Abfrage".
- Schauen Sie im Anhang 1. "Datenbank erstellen".
- Fügen sie den Code ein und führen sie ihn mit F5 aus.
- Damit wurde eine Datenbank namens N8N erstellt.
- Kopieren Sie sich den Zweiten Code im Anhang 2. "Tabelle erstellen", fügen ihn ein und Führen Sie ihn aus.
- Aktualisieren sie die Datenbank Verbindung.
N8N mit der Datenbank verbinden
- Öffnen sie Powershell
- Erstellen Sie ein Netzwerk in Docker mit
docker network create my-network - Verbinden sie jetzt beide Container.
docker network connect my-network my-mssql-containerdocker network connect my-network n8n-container - 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
- Melden Sie sich in N8N an.
- Oben links, rechts neben dem N8N-Logo, finden Sie ein +-Zeichen.
- Klicken Sie auf den +-Button – nun sollte ein Dropdown mit „Workflow“ erscheinen.
- Klicken Sie auf Workflow, um Ihr neues Board zu erstellen.
Nodes einfügen
- Klicken sie oben Rechts auf + um das Node fenster zu öffnen.
- Dort können sie eine Vielzahl von Nodes benutzen
Formular erstellen
- On Form Submission erstellen. Dies ist unser Einstiegspunkt für den Workflow.
- Titel, Beschreibungen und Felder erstellen
- Bei "Form URLs" sehen sie die URL zum testen als auch die spätere Production URL unter der das Formular erreichbar ist
- In einem folgendem Code-Block Eingabedaten als JSON weiter geben an DB
Datenbank-Anbindung hinzufügen
- Fügen sie die Node "Microsoft SQL" ein.
- Doppelklick auf die Node und bei "Credential to connect with" auf den Stift um eine Verbindung zu bearbeiten.
- Geben sie jetzt die gleichen Werte an wie bei der Datenbank verbindung.
- Server = "my-mssql-container"
- Database = "N8N" <- ihre Datenbank die sie Benutzen wollen
- User = "sa"
- Password = "YourStrong!Passw0rd"
- Port = 1433
- Führen sie Eine Test verbindung durch
Daten aus der Datenbank holen
- 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 }}%' - Damit bekommen sie von der Datenbank 2 Werte zurück Anwendungs namen und die Farbe.
Antworten anzeigen
- Resultierende Daten aus Datenbank mit Switch auswerten, nach Farbe
- In einzelnen Codeblöcken, für jeden case, zusammenbauen was angezeigt werden soll und was mit E-Mail versand wird
- Form Node hinzufügen. Type = Form Ending
- Hier entsprechend anzeigen was wir in den Codeblöcken gebaut haben
E-Mails versenden
- Send E-Mail Node hinzufügen
- Credentials erstellen mit welchen E-Mail versendet wird. User, Passwort, Host und Port (Port ist standardmäßig 465)
- Empfänger/Sender angeben, (Empfänger E-Mail aus vorherigen Nodes)
- 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
- Nehmen Sie sich den Code vom Anhang 3. "Import Beispiel"
- Fügen Sie den Code in einen Editor und Speichern Sie ihn mit der Endung .json
- Öffnen Sie in einem neuen Workflow
- Klicken Sie oben rechts auf die drei Punkte und wählen sie den Punkt Import File.
- 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": "<div style=\"margin-bottom: 15px;\">\n <p style=\"margin-bottom: 10px;\">\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 </p>\n <label for=\"email\"></label><br>\n <input type=\"email\" id=\"email\" name=\"email\" style=\"margin-top: 5px; padding: 5px; width: 100%;\">\n</div>\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<!DOCTYPE html>\n<html lang=\"de\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Einfach Ampel</title>\n</head>\n<body>\n \n <div style=\"width: 100px; background-color: #333; padding: 20px; border-radius: 20px; display: flex; flex-direction: column; gap: 15px;\">\n \n <div style=\"width: 60px; height: 60px; border-radius: 50%; background-color: black; margin: 0 auto;\"></div>\n \n <div style=\"width: 60px; height: 60px; border-radius: 50%; background-color: yellow; margin: 0 auto;\"></div>\n \n <div style=\"width: 60px; height: 60px; border-radius: 50%; background-color: black; margin: 0 auto;\"></div>\n \n </div>\n \n <!-- URL -->\n<p>URL: <a href=\"${$json.URLAnwendung}\" target=\"_blank\">Hier klicken</a></p>\n\n\n <!-- Weitere Infos -->\n <p>Info 1: Gelb, es gibt zwar noch kritische Punkte, die Aufmerksamkeit erfordern</p>\n\n</body>\n</html>\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<!DOCTYPE html>\n<html lang=\"de\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Einfach Ampel</title>\n</head>\n<body>\n \n <div style=\"width: 100px; background-color: #333; padding: 20px; border-radius: 20px; display: flex; flex-direction: column; gap: 15px;\">\n \n <div style=\"width: 60px; height: 60px; border-radius: 50%; background-color: red; margin: 0 auto;\"></div>\n \n <div style=\"width: 60px; height: 60px; border-radius: 50%; background-color: black; margin: 0 auto;\"></div>\n \n <div style=\"width: 60px; height: 60px; border-radius: 50%; background-color: black; margin: 0 auto;\"></div>\n \n </div>\n <!-- URL -->\n<p>URL: <a href=\"${$json.URLAnwendung}\" target=\"_blank\">Hier klicken</a></p>\n\n <!-- Weitere Infos -->\n <p>Info 1: Rot, die Datenschutzbestimmungen wurden aufgrund von Problemen nicht akzeptiert</p>\n\n</body>\n</html>\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<!DOCTYPE html>\n<html lang=\"de\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Einfach Ampel</title>\n</head>\n<body>\n \n <div style=\"width: 100px; background-color: #333; padding: 20px; border-radius: 20px; display: flex; flex-direction: column; gap: 15px;\">\n \n <div style=\"width: 60px; height: 60px; border-radius: 50%; background-color: black; margin: 0 auto;\"></div>\n \n <div style=\"width: 60px; height: 60px; border-radius: 50%; background-color: black; margin: 0 auto;\"></div>\n \n <div style=\"width: 60px; height: 60px; border-radius: 50%; background-color: green; margin: 0 auto;\"></div>\n \n </div>\n \n <!-- URL -->\n<p>URL: <a href=\"${$json.URLAnwendung}\" target=\"_blank\">Hier klicken</a></p>\n\n <!-- Weitere Infos -->\n <p>Info 1: Grün, alle Datenschutzanforderungen sind erfüllt und keine Probleme bestehen.</</p>\n\n</body>\n</html>\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": []
}
Description