Server-Installation — Mehrere UDM-Instanzen auf einem Dedicated Server

Server-Installation — Mehrere UDM-Instanzen auf einem Dedicated Server

Komplettanleitung: Strato Dedicated Server einrichten, IIS konfigurieren, MariaDB installieren und mehrere UDM-Instanzen mit SSL bereitstellen.

1

Ü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.

Unser Szenario
Übungsinstanzen für Kunden-Schulungen

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

Internet ↓ [DNS: *.udm-demo.de → 85.x.x.x] ↓ [IIS Port 443 + SNI + Let's Encrypt] ├── Host: kunde1.udm-demo.de → UDM Instanz 1 → DB: udm_kunde1 ├── Host: kunde2.udm-demo.de → UDM Instanz 2 → DB: udm_kunde2 └── Host: kunde3.udm-demo.de → UDM Instanz 3 → DB: udm_kunde3 Pro UDM-Instanz: ├── MainSystem WebApi (Backend: Konfiguration, Metadaten) ├── Subsystem WebApi (Backend: Geschäftsdaten, Multi-Provider) └── Admin Blazor UI (Frontend: Administration)

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)
Voraussetzungs-Check vor der Installation
🖥
Server-Voraussetzungen
Strato Dedicated Server (CP8-61, 64 GB RAM, Ryzen 7)
Windows Server — aktuelle Updates installiert
Domain udm-demo.de mit DNS-Zugriff
RDP-Zugang verfügbar
UDM-Release-Dateien noch hochzuladen
Let's-Encrypt-Zertifikat — nach IIS-Setup
2

Schritt 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.

  1. 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.

  2. Windows Update durchführen

    Starten Sie Windows Update und installieren Sie alle verfügbaren Updates. Neustart nicht vergessen.

  3. Computernamen ändern (optional)

    Unter System → Info → Diesen PC umbenennen einen sprechenden Namen vergeben, z. B. UDM-DEMO-SRV.

3

Schritt 2: IIS installieren

  1. Server-Manager öffnen

    Der Server-Manager startet automatisch nach der Anmeldung. Falls nicht: über das Startmenü öffnen.

  2. 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
  3. Installation abschließen

    Bestätigen und installieren. Ein Neustart ist normalerweise nicht erforderlich.

4

Schritt 3: .NET 9 Runtime installieren

UDM benötigt die .NET 9.0 Runtime (Framework-Dependent Deployment).

  1. .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.

  2. Installieren und IIS neu starten

    Nach der Installation des Hosting Bundles muss der IIS neu gestartet werden:

    net stop was /y
    net start w3svc
  3. Installation prüfen
    dotnet --list-runtimes

    In der Ausgabe muss Microsoft.AspNetCore.App 9.0.x erscheinen.

Warum das Hosting Bundle? Das Hosting Bundle ist Pflicht für IIS-Hosting. Es installiert das ASP.NET Core Module (ANCM), das als Brücke zwischen IIS und Kestrel dient. Ohne ANCM kann der IIS keine .NET-Anwendungen weiterleiten.
5

Schritt 4: MariaDB installieren

  1. 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.

  2. 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
  3. Firewall: Port 3306 NICHT öffnen

    MariaDB soll nur lokal erreichbar sein (localhost). Den Port nicht in der Windows-Firewall freigeben.

  4. Verbindung testen
    mysql -u root -p -e "SELECT VERSION();"
6

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;
Warum zwei Datenbanken pro Instanz? UDM trennt Konfiguration (MainSystem) und Geschäftsdaten (Subsystem) architektonisch. Das MainSystem nutzt EF Core, das Subsystem arbeitet Multi-Provider über SQLKata.
7

Schritt 6: DNS-Einträge konfigurieren

Alle Subdomains müssen auf die öffentliche IP des Servers zeigen.

  1. DNS-Verwaltung öffnen

    Öffnen Sie die DNS-Verwaltung Ihres Domain-Anbieters.

  2. A-Records anlegen

    Für jede geplante Instanz einen A-Record erstellen:

    SubdomainTypZiel
    kunde1.udm-demo.deA85.x.x.x (Ihre Server-IP)
    kunde2.udm-demo.deA85.x.x.x
    kunde3.udm-demo.deA85.x.x.x
DNS-Propagation DNS-Änderungen können bis zu 24 Stunden dauern. Prüfen Sie mit nslookup kunde1.udm-demo.de, ob die IP korrekt aufgelöst wird, bevor Sie SSL-Zertifikate anfordern.
DNS-Verwaltung — A-Records für Instanzen
SubdomainTypZiel-IPStatus
kunde1.udm-demo.deA85.x.x.x propagiert
kunde2.udm-demo.deA85.x.x.x propagiert
kunde3.udm-demo.deA85.x.x.x wird verteilt
8

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
  1. 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
  2. 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.

9

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

InstanzMainSystemSubsystemAdminClient
Kunde 1150011500215003
Kunde 2150111501215013
Kunde 3150211502215023
Windows-Authentifizierung deaktivieren Auf einem Standalone-Server ohne Active Directory muss "NoWindowsAuthentication": true gesetzt werden. UDM verwendet dann die eigene Benutzerverwaltung.
10

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.

  1. 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.

  2. Website anlegen

    Im IIS-Manager unter Sites:

    SitenameUDM-Kunde1
    Application PoolKunde1Pool
    Physischer PfadD:\UDM\Kunde1\AdminClient
    Bindung — Typhttps
    Bindung — Port443
    Bindung — Hostnamekunde1.udm-demo.de
    SNI erforderlichJa (Haken setzen)
  3. Weitere Instanzen analog anlegen

    Für jede weitere Instanz wiederholen: eigener Pool, eigene Site, eigener Hostname.

Host-Header-Binding erklärt Alle Sites teilen sich Port 443 und die gleiche IP-Adresse. Der IIS unterscheidet die Anfragen anhand des Hostnamens im HTTP-Header. So kann eine einzige IP beliebig viele Websites bedienen. SNI (Server Name Indication) ermöglicht dabei unterschiedliche SSL-Zertifikate pro 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"
Startreihenfolge beachten Das Subsystem wartet beim Start auf eine Verbindung zum MainSystem (Retry-Schleife). Starten Sie immer zuerst das MainSystem, dann das Subsystem. Im sc create-Befehl kann eine Abhängigkeit definiert werden: depend=UDM-Kunde1-MainSystem.
11

Schritt 10: SSL-Zertifikate mit Let's Encrypt

Wir verwenden win-acme, um kostenlose SSL-Zertifikate von Let's Encrypt automatisch zu verwalten.

  1. win-acme herunterladen und entpacken

    Laden Sie die aktuelle Version von win-acme herunter und entpacken Sie sie nach C:\Tools\win-acme\.

  2. 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.

  3. 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]
  4. 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 renew vorhanden ist.

HTTP-Validation erfordert Port 80 Let's Encrypt prüft die Domain über Port 80. Stellen Sie sicher, dass die Windows-Firewall Port 80 erlaubt und dass die IIS-Site auch ein HTTP-Binding (Port 80, gleicher Hostname) hat. win-acme kann dieses Binding automatisch anlegen und nach der Validation wieder entfernen.
12

Schritt 11: Windows-Firewall konfigurieren

Nur die notwendigen Ports öffnen:

PortProtokollZweckFreigeben?
80TCPHTTP (Let's Encrypt Validation)Ja
443TCPHTTPS (IIS → UDM)Ja
3389TCPRDP (Remote-Zugang)Ja (einschränken!)
3306TCPMariaDBNein (nur lokal)
15001–15099TCPInterne UDM-PortsNein (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
RDP absichern Ändern Sie den Standard-RDP-Port (3389) oder beschränken Sie den Zugriff auf Ihre feste IP-Adresse. Ein offener RDP-Port ist ein häufiges Angriffsziel.
13

Schritt 12: Installation prüfen

  1. Backend-Dienste prüfen

    Im Browser auf dem Server testen:

    http://localhost:15001/swagger   ← MainSystem API (Swagger-UI)
    http://localhost:15002/swagger   ← Subsystem API
  2. AdminClient über Domain testen

    Von einem externen Rechner aufrufen:

    https://kunde1.udm-demo.de

    Die UDM-Admin-Oberfläche sollte geladen werden.

  3. 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.

14

Wartung und Betrieb

Neue Instanz hinzufügen

  1. Datenbanken anlegen (SQL wie in Schritt 5)
  2. Ordner duplizieren: D:\UDM\KundeX\
  3. appsettings.json anpassen (Ports, ConnectionStrings)
  4. Windows-Dienste registrieren (MainSystem + Subsystem)
  5. IIS-Site + App Pool anlegen (Schritt 9)
  6. DNS A-Record anlegen
  7. SSL-Zertifikat anfordern: wacs.exe --host kundeX.udm-demo.de

UDM-Update einspielen

  1. Neuen Release-Stand publizieren (dotnet publish)
  2. Windows-Dienste stoppen (MainSystem + Subsystem)
  3. IIS-Site stoppen
  4. Dateien ersetzen (alten Ordner sichern!)
  5. 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"
15

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.json angepasst
  • 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