Überblick
Diese Anleitung beschreibt die Installation mehrerer unabhängiger UDM-Instanzen (z. B. für Schulungen, Demos oder Kunden-Tests) auf einem einzigen Windows Dedicated Server bei Strato.
Wir richten auf einem Strato Dedicated Server (CP8-61 HDD, 64 GB RAM, Ryzen 7) mehrere UDM-Instanzen ein, die über Subdomains erreichbar sind: kunde1.udm-demo.de, kunde2.udm-demo.de usw. Als Datenbank verwenden wir MariaDB (lizenzfrei).
Zielarchitektur
Voraussetzungen
- Strato Dedicated Server mit Windows (z. B. CP8-61 HDD, 64 GB RAM)
- Eine Domain (z. B.
udm-demo.de) mit Zugriff auf DNS-Verwaltung - Remote-Desktop-Zugang zum Server (RDP)
- Die UDM-Release-Dateien (Publish-Output)
udm-demo.de mit DNS-ZugriffSchritt 1: Server-Zugang einrichten
Nach der Bestellung erhalten Sie von Strato per E-Mail die Zugangsdaten. Strato stellt den Server in der Regel innerhalb von 24–72 Stunden bereit.
-
RDP-Verbindung herstellen
Öffnen Sie die Windows-Remotedesktopverbindung (
mstsc.exe) und verbinden Sie sich mit der IP-Adresse aus der Strato-E-Mail. Melden Sie sich mit dem Administrator-Konto an. -
Windows Update durchführen
Starten Sie Windows Update und installieren Sie alle verfügbaren Updates. Neustart nicht vergessen.
-
Computernamen ändern (optional)
Unter System → Info → Diesen PC umbenennen einen sprechenden Namen vergeben, z. B.
UDM-DEMO-SRV.
Schritt 2: IIS installieren
-
Server-Manager öffnen
Der Server-Manager startet automatisch nach der Anmeldung. Falls nicht: über das Startmenü öffnen.
-
Rollen und Features hinzufügen
Klicken Sie auf „Rollen und Features hinzufügen“ und wählen Sie:
- Webserver (IIS) — Haken setzen
- Unter Rollendienste zusätzlich aktivieren:
- Anwendungsentwicklung → ASP.NET 4.8
- Anwendungsentwicklung → WebSocket-Protokoll (wichtig für Blazor/SignalR)
- Sicherheit → Anforderungsfilterung
-
Installation abschließen
Bestätigen und installieren. Ein Neustart ist normalerweise nicht erforderlich.
Schritt 3: .NET 9 Runtime installieren
UDM benötigt die .NET 9.0 Runtime (Framework-Dependent Deployment).
-
.NET 9 Hosting Bundle herunterladen
Laden Sie das ASP.NET Core 9.0 Hosting Bundle von der offiziellen Microsoft-Seite herunter. Das Hosting Bundle enthält sowohl die .NET Runtime als auch das ASP.NET Core Module für IIS.
-
Installieren und IIS neu starten
Nach der Installation des Hosting Bundles muss der IIS neu gestartet werden:
net stop was /y net start w3svc
-
Installation prüfen
dotnet --list-runtimes
In der Ausgabe muss
Microsoft.AspNetCore.App 9.0.xerscheinen.
Schritt 4: MariaDB installieren
-
MariaDB herunterladen
Laden Sie die aktuelle stabile Version (z. B. 11.x) als MSI-Installer von der offiziellen MariaDB-Seite herunter. Wählen Sie die Windows x86_64-Variante.
-
Installation durchführen
Im Installer:
- Root-Passwort festlegen — sicher aufbewahren!
- UTF-8 als Standard-Zeichensatz verwenden
- Port 3306 belassen (Standard)
- „Install as a service“ aktivieren
-
Firewall: Port 3306 NICHT öffnen
MariaDB soll nur lokal erreichbar sein (
localhost). Den Port nicht in der Windows-Firewall freigeben. -
Verbindung testen
mysql -u root -p -e "SELECT VERSION();"
Schritt 5: Datenbanken für UDM-Instanzen anlegen
Jede UDM-Instanz benötigt zwei Datenbanken: eine für das MainSystem (Konfiguration, Metadaten) und eine für das Subsystem (Geschäftsdaten).
-- === Instanz: Kunde 1 === CREATE DATABASE udm_kunde1_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE udm_kunde1_data CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'udm_kunde1'@'localhost' IDENTIFIED BY 'SicheresPasswort1!'; GRANT ALL PRIVILEGES ON udm_kunde1_system.* TO 'udm_kunde1'@'localhost'; GRANT ALL PRIVILEGES ON udm_kunde1_data.* TO 'udm_kunde1'@'localhost'; -- === Instanz: Kunde 2 === CREATE DATABASE udm_kunde2_system CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE udm_kunde2_data CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'udm_kunde2'@'localhost' IDENTIFIED BY 'SicheresPasswort2!'; GRANT ALL PRIVILEGES ON udm_kunde2_system.* TO 'udm_kunde2'@'localhost'; GRANT ALL PRIVILEGES ON udm_kunde2_data.* TO 'udm_kunde2'@'localhost'; -- Weitere Instanzen analog ... FLUSH PRIVILEGES;
Schritt 6: DNS-Einträge konfigurieren
Alle Subdomains müssen auf die öffentliche IP des Servers zeigen.
-
DNS-Verwaltung öffnen
Öffnen Sie die DNS-Verwaltung Ihres Domain-Anbieters.
-
A-Records anlegen
Für jede geplante Instanz einen A-Record erstellen:
Subdomain Typ Ziel kunde1.udm-demo.deA 85.x.x.x(Ihre Server-IP)kunde2.udm-demo.deA 85.x.x.xkunde3.udm-demo.deA 85.x.x.x
nslookup kunde1.udm-demo.de, ob die IP korrekt aufgelöst wird, bevor Sie SSL-Zertifikate anfordern.
| Subdomain | Typ | Ziel-IP | Status |
|---|---|---|---|
| kunde1.udm-demo.de | A | 85.x.x.x | propagiert |
| kunde2.udm-demo.de | A | 85.x.x.x | propagiert |
| kunde3.udm-demo.de | A | 85.x.x.x | wird verteilt |
Schritt 7: UDM-Dateien auf den Server kopieren
Erstellen Sie auf dem Server eine Ordnerstruktur für alle Instanzen:
D:\UDM\ ├── Kunde1\ │ ├── MainSystem\ ← Publish-Output von UDM.PT.MainSystem.WebApi │ ├── Subsystem\ ← Publish-Output von UDM.PT.Subsystem.WebApi │ └── AdminClient\ ← Publish-Output von UDM.PT.UI.Admin.Blazor.Server8 ├── Kunde2\ │ ├── MainSystem\ │ ├── Subsystem\ │ └── AdminClient\ └── Logs\ ← Gemeinsames Log-Verzeichnis
-
Auf dem Entwicklungsrechner publizieren
dotnet publish MainSystem\UDM.PT.MainSystem.WebApi -c Release -o .\Release\MainSystem dotnet publish Subsystem\UDM.PT.Subsystem.WebApi -c Release -o .\Release\Subsystem dotnet publish UI\Admin\UDM.PT.UI.Admin.Blazor.Server8 -c Release -o .\Release\AdminClient
-
Release-Ordner auf den Server kopieren
Per RDP (Drag&Drop oder Zwischenablage) oder per ZIP-Upload die drei Ordner nach
D:\UDM\Kunde1\kopieren. Für jede weitere Instanz den Ordner duplizieren.
Schritt 8: Konfiguration pro Instanz anpassen
Jede Instanz benötigt eine eigene Config/appsettings.json mit angepassten Verbindungsdaten und Ports. Die Konfigurationsdatei liegt im Config-Unterordner jeder Anwendung.
MainSystem — appsettings.json (Beispiel Kunde1)
{
"AppConfig": {
"MainSystems": [
{
"Name": "Kunde1",
"DisplayName": "Kunde 1 - Schulung",
"MainSystemDbConnection": "server=localhost;port=3306;uid=udm_kunde1;pwd=SicheresPasswort1!;database=udm_kunde1_system;Pooling=true;MaximumPoolSize=100;MinimumPoolSize=2",
"IsMySql": true
}
],
"Settings": [
{
"Name": "Production",
"DefaultUrl": "https://kunde1.udm-demo.de",
"MainSystemPort": 15001,
"SubsystemPort": 15002,
"AdminClientPort": 15003,
"NoWindowsAuthentication": true
}
]
}
}
Subsystem — appsettings.json (Beispiel Kunde1)
Der Subsystem-ConnectionString wird im MainSystem konfiguriert. Die Subsystem-appsettings.json muss die URL des MainSystems kennen, da sich das Subsystem beim Start dort verbindet.
Port-Schema pro Instanz
| Instanz | MainSystem | Subsystem | AdminClient |
|---|---|---|---|
| Kunde 1 | 15001 | 15002 | 15003 |
| Kunde 2 | 15011 | 15012 | 15013 |
| Kunde 3 | 15021 | 15022 | 15023 |
"NoWindowsAuthentication": true gesetzt werden. UDM verwendet dann die eigene Benutzerverwaltung.
Schritt 9: IIS-Websites einrichten
Jede UDM-Instanz besteht aus drei Diensten. Der AdminClient ist die Hauptanwendung, die der Benutzer im Browser aufruft. MainSystem und Subsystem sind Backend-Dienste.
Variante A: AdminClient als IIS-Website, Backends als Kestrel-Dienste
Die einfachste Variante: Nur der AdminClient läuft hinter IIS (mit Host-Header-Binding für SSL). Die beiden Backend-Dienste laufen als eigenständige Kestrel-Prozesse auf ihren internen Ports.
-
Application Pool erstellen
Im IIS-Manager unter Anwendungspools:
- Neuen Pool anlegen:
Kunde1Pool - .NET CLR-Version: Kein verwalteter Code
- Verwalteter Pipelinemodus: Integriert
Für jede Instanz einen eigenen Pool erstellen — so stürzt ein Fehler in einer Instanz nicht die anderen ab.
- Neuen Pool anlegen:
-
Website anlegen
Im IIS-Manager unter Sites:
Sitename UDM-Kunde1Application Pool Kunde1PoolPhysischer Pfad D:\UDM\Kunde1\AdminClientBindung — Typ httpsBindung — Port 443Bindung — Hostname kunde1.udm-demo.deSNI erforderlich Ja (Haken setzen) -
Weitere Instanzen analog anlegen
Für jede weitere Instanz wiederholen: eigener Pool, eigene Site, eigener Hostname.
Backend-Dienste als Windows-Services registrieren
MainSystem und Subsystem sollten als Windows-Dienste laufen, damit sie beim Serverstart automatisch starten:
:: Kunde 1 - MainSystem sc create "UDM-Kunde1-MainSystem" binPath="dotnet D:\UDM\Kunde1\MainSystem\UDM.PT.MainSystem.WebApi.dll" start=auto sc description "UDM-Kunde1-MainSystem" "UDM MainSystem API - Kunde 1" :: Kunde 1 - Subsystem sc create "UDM-Kunde1-Subsystem" binPath="dotnet D:\UDM\Kunde1\Subsystem\UDM.PT.Subsystem.WebApi.dll" start=auto sc description "UDM-Kunde1-Subsystem" "UDM Subsystem API - Kunde 1" :: Dienste starten sc start "UDM-Kunde1-MainSystem" sc start "UDM-Kunde1-Subsystem"
sc create-Befehl kann eine Abhängigkeit definiert werden: depend=UDM-Kunde1-MainSystem.
Schritt 10: SSL-Zertifikate mit Let's Encrypt
Wir verwenden win-acme, um kostenlose SSL-Zertifikate von Let's Encrypt automatisch zu verwalten.
-
win-acme herunterladen und entpacken
Laden Sie die aktuelle Version von
win-acmeherunter und entpacken Sie sie nachC:\Tools\win-acme\. -
Zertifikat für erste Instanz anfordern
cd C:\Tools\win-acme wacs.exe --host kunde1.udm-demo.de --installation iis --siteid [IIS-Site-ID]
win-acme erkennt die IIS-Site automatisch, erstellt das Zertifikat per HTTP-Validation und bindet es im IIS ein.
-
Für weitere Instanzen wiederholen
wacs.exe --host kunde2.udm-demo.de --installation iis --siteid [IIS-Site-ID] wacs.exe --host kunde3.udm-demo.de --installation iis --siteid [IIS-Site-ID]
-
Automatische Verlängerung prüfen
win-acme richtet automatisch einen Windows Scheduled Task ein, der die Zertifikate alle 60 Tage erneuert. Prüfen Sie unter Aufgabenplanung, ob der Task
win-acme renewvorhanden ist.
Schritt 11: Windows-Firewall konfigurieren
Nur die notwendigen Ports öffnen:
| Port | Protokoll | Zweck | Freigeben? |
|---|---|---|---|
| 80 | TCP | HTTP (Let's Encrypt Validation) | Ja |
| 443 | TCP | HTTPS (IIS → UDM) | Ja |
| 3389 | TCP | RDP (Remote-Zugang) | Ja (einschränken!) |
| 3306 | TCP | MariaDB | Nein (nur lokal) |
| 15001–15099 | TCP | Interne UDM-Ports | Nein (nur lokal) |
:: Firewall-Regeln setzen (PowerShell als Admin) New-NetFirewallRule -DisplayName "HTTP" -Direction Inbound -Port 80 -Protocol TCP -Action Allow New-NetFirewallRule -DisplayName "HTTPS" -Direction Inbound -Port 443 -Protocol TCP -Action Allow
Schritt 12: Installation prüfen
-
Backend-Dienste prüfen
Im Browser auf dem Server testen:
http://localhost:15001/swagger ← MainSystem API (Swagger-UI) http://localhost:15002/swagger ← Subsystem API
-
AdminClient über Domain testen
Von einem externen Rechner aufrufen:
https://kunde1.udm-demo.de
Die UDM-Admin-Oberfläche sollte geladen werden.
-
SSL prüfen
Im Browser auf das Schloss-Symbol klicken und prüfen, ob das Zertifikat von Let's Encrypt ausgestellt wurde und gültig ist.
Wartung und Betrieb
Neue Instanz hinzufügen
- Datenbanken anlegen (SQL wie in Schritt 5)
- Ordner duplizieren:
D:\UDM\KundeX\ appsettings.jsonanpassen (Ports, ConnectionStrings)- Windows-Dienste registrieren (MainSystem + Subsystem)
- IIS-Site + App Pool anlegen (Schritt 9)
- DNS A-Record anlegen
- SSL-Zertifikat anfordern:
wacs.exe --host kundeX.udm-demo.de
UDM-Update einspielen
- Neuen Release-Stand publizieren (
dotnet publish) - Windows-Dienste stoppen (MainSystem + Subsystem)
- IIS-Site stoppen
- Dateien ersetzen (alten Ordner sichern!)
- IIS-Site und Dienste wieder starten
Backup
MariaDB-Dumps regelmäßig automatisieren:
:: backup-all.cmd (als Scheduled Task einrichten)
@echo off
set BACKUP_DIR=D:\Backups\MariaDB\%date:~-4%%date:~3,2%%date:~0,2%
mkdir "%BACKUP_DIR%" 2>nul
for %%d in (udm_kunde1_system udm_kunde1_data udm_kunde2_system udm_kunde2_data) do (
mysqldump -u root -pIhrRootPasswort %%d > "%BACKUP_DIR%\%%d.sql"
)
:: Backups aelter als 30 Tage loeschen
forfiles /p "D:\Backups\MariaDB" /d -30 /c "cmd /c if @isdir==TRUE rmdir /s /q @file"
Abschluss-Checkliste
- Windows Updates installiert
- IIS mit WebSocket-Protokoll installiert
- .NET 9 Hosting Bundle installiert
- MariaDB installiert, Root-Passwort gesichert
- Datenbanken und Benutzer pro Instanz angelegt
- DNS-Einträge konfiguriert und geprüft
- UDM-Dateien kopiert und
appsettings.jsonangepasst - IIS-Sites mit Host-Header-Binding eingerichtet
- Backend-Dienste als Windows-Services registriert
- SSL-Zertifikate über win-acme installiert
- Automatische Zertifikats-Verlängerung aktiv
- Firewall: nur Ports 80, 443, 3389 offen
- RDP-Zugang abgesichert
- Backup-Script eingerichtet
- Alle Instanzen über HTTPS erreichbar und funktional