Hilfe & Dokumentation

Installation auf Windows Server

Diese Anleitung richtet Bestell-Bar auf einem Windows Server ein, auf dem IIS und Microsoft SQL Server bereits installiert sind. Die kostenlose SQL Server Express-Edition genügt; höhere Editionen funktionieren genauso.

Voraussetzungen

Programmpaket herunterladen

Das Paket steht unter www.bestell-bar.ch/download bereit – eine Datei je Version, benannt nach der Versionsnummer (z. B. bestell-bar-1.7.1.zip). Dieselben Links stehen auf der Impressum-Seite der Anwendung bei den Release-Notes.

Neben jedem Archiv liegt eine Datei .sha256 mit der Prüfsumme. So lässt sich nachweisen, dass das Archiv unverändert ist – die Lizenz erlaubt die Weitergabe nur unverändert. Prüfen in PowerShell:

Get-FileHash .\bestell-bar-1.7.1.zip -Algorithm SHA256

Der ausgegebene Wert muss mit dem Inhalt der .sha256-Datei übereinstimmen.

Hinweis zu Windows SmartScreen: Das Programm ist nicht signiert. Beim ersten Start meldet Windows daher möglicherweise, der Computer sei geschützt worden. Über Weitere InformationenTrotzdem ausführen lässt sich der Start fortsetzen.

Benötigte IIS-Rollendienste

Die reine Rolle Webserver (IIS) genügt nicht – für Bestell-Bar müssen zusätzlich diese Rollendienste installiert sein (Server-Manager → Rollen und Features hinzufügen, oder per PowerShell):

Auf einem Windows Server installiert dieser Befehl (als Administrator in PowerShell) alles Nötige:

Install-WindowsFeature -Name Web-Server, Web-Static-Content, Web-Default-Doc, `
    Web-Http-Errors, Web-Http-Redirect, Web-WebSockets, Web-Stat-Compression, `
    Web-Dyn-Compression, Web-Mgmt-Console -IncludeManagementTools
Kein ASP.NET 4.x nötig Den Rollendienst ASP.NET 4.x braucht Bestell-Bar nicht. Die Verbindung zwischen IIS und der .NET-Anwendung stellt das ASP.NET Core Hosting Bundle her (siehe Schritt 1) – nicht ein IIS-Feature.

Benötigte SQL-Server-Features

Bei der Installation von SQL Server (Express oder höher) genügt für Bestell-Bar:

Schritt 1: .NET Hosting Bundle installieren

  1. Das ASP.NET Core 10 Hosting Bundle von dotnet.microsoft.com herunterladen (Abschnitt ASP.NET Core RuntimeHosting Bundle) und installieren. Es verbindet .NET mit dem IIS (ASP.NET-Core-Modul).
  2. Anschliessend in einer Administrator-Eingabeaufforderung iisreset ausführen (oder den IIS manuell neustarten).

Schritt 2: Anwendungsdateien ablegen

  1. Einen Ordner für die Anwendung anlegen, z. B. D:\Sites\bestellbar.
  2. Den kompletten Inhalt des zip-Archivs hineinkopieren (JKOrderManager.exe, appsettings.json, web.config, wwwroot usw.).

Schritt 3: IIS einrichten

  1. Im IIS-Manager einen neuen Anwendungspool anlegen, z. B. BestellBar, .NET-CLR-Version Kein verwalteter Code. Die Identität kann auf dem Standard (ApplicationPoolIdentity) bleiben (je nach Verbindung mit dem MS SQL Server).
  2. Eine Website (oder eine Anwendung unterhalb einer bestehenden Website, z. B. /bestellbar) anlegen: physischer Pfad = Ordner aus Schritt 2, Anwendungspool = BestellBar. Der Betrieb unter einem Unterpfad wird von Bestell-Bar vollständig unterstützt.
  3. Eine HTTPS-Bindung mit Zertifikat einrichten (die QR-Codes und die Bestellseiten der Gäste setzen eine sichere Verbindung voraus).

Schritt 4: Datenbank anlegen und Rechte vergeben

  1. Eine leere Datenbank anlegen, z. B. BestellBar:
    sqlcmd -S .\SQLEXPRESS -E -Q "CREATE DATABASE BestellBar"
    (bei einer Standardinstanz -S . statt .\SQLEXPRESS). Die Tabellen erstellt die Anwendung beim ersten Start selbst.
  2. Dem Konto des Anwendungspools Zugriff geben (empfohlen: Windows-Authentifizierung):
    sqlcmd -S .\SQLEXPRESS -E -Q "CREATE LOGIN [IIS AppPool\BestellBar] FROM WINDOWS"
    sqlcmd -S .\SQLEXPRESS -E -d BestellBar -Q "CREATE USER [IIS AppPool\BestellBar] FOR LOGIN [IIS AppPool\BestellBar]; ALTER ROLE db_owner ADD MEMBER [IIS AppPool\BestellBar]"
    Der Login-Name entspricht immer IIS AppPool\<Name des Anwendungspools>.
Alternative: SQL-Anmeldung Statt Windows-Authentifizierung kann auch ein SQL-Login (Benutzer/Passwort) verwendet werden – dann im Connection String User Id=…;Password=… statt Trusted_Connection=True eintragen.

Schritt 5: appsettings.json anpassen

Die Datei appsettings.json im Anwendungsordner öffnen und anpassen:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=.\\SQLEXPRESS;Database=BestellBar;Trusted_Connection=True;TrustServerCertificate=True;MultipleActiveResultSets=true"
  },
  "Qr":         { "Secret": "…langer Zufallswert…" },
  "Encryption": { "Key": "…langer Zufallswert…" },
  "Seed": {
    "SuperAdminEmail": "admin@example.ch",
    "SuperAdminPassword": "…starkes Passwort…",
    "SuperAdminDisplayName": "Plattform-Administrator"
  },
  "Installation": { "Label": "" },
  "Security":     { "SuperAdminTwoFactorBypass": false },
  "DataProtection": {
    "KeyPath": "",
    "ApplicationName": "",
    "ProtectKeysWithDpapi": true
  },
  "Hosting": { "HttpsRedirectPort": 443 },
  "RateLimits": {
    "Enabled": true,
    "Registration":       { "Limit": 3,  "WindowMinutes": 60 },
    "Mail":               { "Limit": 5,  "WindowMinutes": 10 },
    "Login":              { "Limit": 10, "WindowMinutes": 5 },
    "AnonymousMailTotal": { "Limit": 20, "WindowMinutes": 60 }
  },
  "Imprint": {
    "Name": "Musterverein Zürich",
    "AddressLines": [ "Musterstrasse 1", "8000 Zürich", "CH" ],
    "Email": "info@musterverein.ch",
    "Representative": "Vorname Nachname"
  }
}

Impressum: Ihre eigenen Angaben

Bestell-Bar wird ohne Betreiberangaben ausgeliefert. Sobald Sie die Software selbst betreiben, sind Sie der Betreiber – und die öffentlichen Seiten Impressum und Datenschutz müssen Sie ausweisen, nicht den Hersteller.

Ohne Impressum kein Start Fehlen Imprint:Name oder Imprint:Email, startet die Anwendung ausserhalb der Entwicklungsumgebung nicht – gleich wie bei den nicht ersetzten Platzhaltern oben. So kann keine Installation online gehen, die niemanden ausweist oder noch fremde Angaben zeigt.
Korrektur ohne Neustart Änderungen am Abschnitt Imprint werden sofort übernommen – die Datei speichern genügt, ein Neustart der Anwendung ist nicht nötig.

Nicht betroffen sind Lizenz und Copyright der Software weiter unten auf der Impressum-Seite: Die bleiben beim Hersteller, unabhängig davon, wer die Installation betreibt.

Sicherheitsschlüssel: wo sie liegen und warum das zählt

Die Anwendung verschlüsselt mit einem Schlüsselbund, was sie den Browsern mitgibt: die Anmelde-Cookies, die Schutzmarken der Formulare und die Token in den Links aus den Bestätigungs- und Passwort vergessen-E-Mails.

Standardmässig legt die Anwendung diesen Schlüsselbund unter %ProgramData%\BestellBar\keys ab – also ausserhalb des Anwendungsordners, damit ein Update ihn nicht mitlöscht. Beim Start schreibt sie den verwendeten Pfad ins Log, dort können Sie ihn jederzeit nachsehen:

[INF] Data-Protection-Schlüssel: C:\ProgramData\BestellBar\keys (Installation 'BestellBar', DPAPI aktiv)
Geht der Ordner verloren, passiert Folgendes
  • Alle angemeldeten Benutzer sind abgemeldet.
  • Gerade geöffnete Formulare lassen sich nicht mehr abschicken (Fehler 400), bis die Seite neu geladen wird.
  • Bereits versendete Bestätigungs- und Passwort-Links funktionieren nicht mehr – die Betroffenen müssen einen neuen anfordern.
Nehmen Sie den Ordner darum in die Datensicherung auf und löschen Sie ihn nicht.

Die drei Einstellungen brauchen Sie nur, wenn Sie bewusst abweichen wollen:

EinstellungLeer / VorgabeWann ändern
KeyPath %ProgramData%\BestellBar\keys Wenn die Schlüssel woanders liegen sollen, etwa auf einem gesicherten Laufwerk. Der Ordner muss ausserhalb des Anwendungsordners liegen und das Anwendungspool-Konto muss darin schreiben dürfen.
ApplicationName BestellBar Wenn auf demselben Server mehrere Installationen laufen (z.B. Test neben Produktiv). Ohne eigenen Namen – oder eigenen Pfad – teilen sie sich die Schlüssel und damit die Anmeldungen.
ProtectKeysWithDpapi true Die Schlüsseldateien werden an diesen Server gebunden verschlüsselt. Das ist richtig so: Wer die Dateien lesen kann, könnte sonst eine Anmeldung fälschen. Nur bei einem geplanten Serverumzug relevant – siehe Kasten.
Beim Serverumzug Mit ProtectKeysWithDpapi: true sind die Schlüsseldateien auf einem anderen Server unlesbar. Das ist kein Datenverlust: Alle melden sich einmal neu an, und offene Passwort-Links müssen neu angefordert werden. Wollen Sie auch das vermeiden, setzen Sie den Wert vor dem Umzug auf false, starten die Anwendung einmal neu und kopieren den Ordner mit – schützen ihn dann aber mit Dateirechten.

HTTPS erzwingen

Die Anwendung gehört hinter HTTPS. Die Anmelde-Cookies werden ausserhalb der Entwicklungsumgebung ohnehin nur über eine verschlüsselte Verbindung gesendet – ruft jemand die Seite über http:// auf, kann er sich also gar nicht erst anmelden.

Damit niemand auf einer unverschlüsselten Seite landet, richten Sie die Umleitung ein. Zwei Wege, die sich ergänzen:

  1. Im IIS – der übliche Weg: Der Website nur eine https-Bindung geben, oder bei zusätzlicher http-Bindung eine Umleitungsregel (URL Rewrite) auf https einrichten.
  2. In der Anwendung – als zweite Absicherung: unter Hosting:HttpsRedirectPort den öffentlichen HTTPS-Port eintragen, meist 443. Die Anwendung beantwortet eine HTTP-Anfrage dann mit einer Umleitung auf dieselbe Adresse unter https://.
Ohne diesen Eintrag leitet die Anwendung nicht um Hinter dem IIS ist die Anwendung selbst nur über HTTP erreichbar – der IIS reicht die Anfragen intern weiter. Sie kann deshalb nicht erraten, unter welchem Port sie von aussen verschlüsselt erreichbar ist, und leitet ohne diesen Wert gar nicht um. Beim Start schreibt sie darum eine Warnung ins Log:
[WRN] Die Anwendung leitet HTTP-Anfragen NICHT selbst auf HTTPS um (Hosting:HttpsRedirectPort ist leer). …
Ist die Umleitung im IIS eingerichtet, können Sie die Warnung ignorieren.
Beim Testbetrieb leer lassen Der Start per Doppelklick läuft auf http://localhost:5000 ohne HTTPS. Steht dort ein Port drin, leitet die Anwendung auf eine Adresse um, die es nicht gibt – sie ist dann nicht mehr erreichbar. Für den Testbetrieb also "HttpsRedirectPort": null.

Nur ein Arbeitsprozess

Die Anwendung muss in einem einzigen Prozess laufen. Zwei Dinge hält sie im Speicher genau dieses Prozesses: die Live-Verbindungen zu den Stationsboards und den Zwischenspeicher der Artikelbilder; auch die Anfragebegrenzung zählt je Prozess.

Was bei mehreren Prozessen passiert Eine Bestellung, die bei Prozess A eingeht, erreicht ein Board, das an Prozess B hängt, nie. Die Karten bleiben einfach stehen – ohne Fehlermeldung, ohne Eintrag im Log. Am Anlass merkt das niemand, bis eine Bestellung liegen bleibt.

Häufigste Ursache ist ein Anwendungspool mit mehreren Arbeitsprozessen (eine sogenannte Webgarten-Konfiguration). So prüfen Sie das:

  1. Im IIS-Manager Anwendungspools öffnen und den Pool auswählen.
  2. Rechts Erweiterte Einstellungen… anklicken.
  3. Unter Prozessmodell muss Maximale Anzahl von Arbeitsprozessen auf 1 stehen (das ist die Standardeinstellung).

Erkennt die Anwendung beim Start eine zweite laufende Instanz, schreibt sie eine Warnung ins Log:

[WRN] Es läuft bereits eine weitere Instanz dieser Installation ('BestellBar') auf diesem Rechner. …

Während eines Updates oder eines Neustarts kann diese Meldung kurz auftreten, weil der alte Prozess noch läuft – das ist normal. Erscheint sie im laufenden Betrieb, prüfen Sie den Anwendungspool.

Und auf mehreren Servern? Aus demselben Grund lässt sich die Anwendung nicht auf zwei Server verteilen. Für die Grössenordnung, für die Bestell-Bar gedacht ist – Vereinsanlässe –, reicht ein Server bei Weitem; ein Lasttest mit 600 gleichzeitigen Bestellungen lief in 4,4 Sekunden durch.

Anfragebegrenzung: Schutz vor Missbrauch

Ein paar Stellen der Anwendung kann jeder aufrufen, ohne angemeldet zu sein – und sie bringen den Server dazu, etwas zu tun: einen Verein anzulegen oder eine E-Mail über Ihren SMTP-Server zu verschicken. Ohne Bremse könnte jemand damit tausende E-Mails in Ihrem Namen auslösen; darunter leidet vor allem der Ruf Ihrer Absenderadresse.

Die Anwendung begrenzt darum, wie oft diese Aktionen in einem Zeitfenster aufgerufen werden dürfen. Wer darüber liegt, bekommt die Seite Zu viele Anfragen und muss kurz warten.

EinstellungVorgabeGilt für
Registration3 pro Stunde Selbstregistrierung eines Vereins über die Startseite.
Mail5 pro 10 Minuten Alles, was eine E-Mail verschickt: Test-E-Mail, Zugangslink an eine Station oder an den Service, Quittung an einen Gast, Rundmail an alle Vereine.
Login10 pro 5 Minuten Anmeldeversuche – zusätzlich zur Kontosperre, die nach 5 Fehlversuchen für 5 Minuten greift. Die Sperre zählt je Konto, diese Grenze je Absender.
AnonymousMailTotal20 pro Stunde Gesamtobergrenze für die zwei Wege, die ohne Anmeldung eine E-Mail auslösen (Registrierung und Passwort vergessen) – über die ganze Installation. Wirkt auch dann, wenn die Anfragen von vielen verschiedenen Adressen kommen.

Alle Grenzen gelten je Absenderadresse und Zeitfenster; nur AnonymousMailTotal zählt über alle zusammen. Limit ist die erlaubte Anzahl, WindowMinutes die Länge des Zeitfensters. Beim Start schreibt die Anwendung die geltenden Werte ins Log:

[INF] Anfragebegrenzung aktiv: Registrierung 3/60min, E-Mail 5/10min, Anmeldung 10/5min, anonymer Mailversand gesamt 20/60min
Der Bestellbetrieb ist bewusst nicht begrenzt Das Bestellen der Gäste, die Stationsboards und die Auslieferungsansicht haben keine Obergrenze – das sind die Hauptwege am Anlass, und eine Bremse, die dort zuschlägt, würde den Betrieb lahmlegen. Begrenzt sind ausschliesslich die oben genannten Aktionen.
Wenn Ihre Vereine hinter einer gemeinsamen Adresse sitzen Zählt wird nach der Absenderadresse der Anfrage. Kommen alle Zugriffe über denselben Ausgang ins Internet – etwa in einer Schule oder einem Firmennetz – teilen sich alle Benutzer ein Kontingent. Das betrifft nur die Anmeldung und den E-Mail-Versand, nicht den Bestellbetrieb; erhöhen Sie in dem Fall die Werte. Mit "Enabled": false schalten Sie die Begrenzung ganz ab – sinnvoll nur, wenn die Installation ohnehin nicht öffentlich erreichbar ist.
Serveruhr synchron halten Wenn Admins die Zwei-Faktor-Authentifizierung nutzen, muss die Uhr des Servers stimmen: Die Codes aus der App gelten nur rund ±90 Sekunden. Läuft die Uhr weg, schlagen Anmeldungen scheinbar grundlos fehl. Windows synchronisiert die Zeit normalerweise selbst – bei virtuellen Maschinen und in Domänen lohnt sich eine Kontrolle.

Notzugang für den Plattform-Administrator

Kommt der Plattform-Administrator wegen der Zwei-Faktor-Authentifizierung nicht mehr hinein, gehen Sie so vor:

  1. In der appsettings.json "SuperAdminTwoFactorBypass": true setzen und speichern. Ein Neustart ist nicht nötig – die Datei wird sofort neu eingelesen.
  2. Mit E-Mail und Passwort anmelden; der Code wird für dieses eine Konto übersprungen.
  3. Unter Mein Konto die 2FA mit dem Passwort deaktivieren und bei Bedarf neu einrichten.
  4. Den Schalter wieder auf false setzen.
Nur so lange wie nötig Solange der Schalter aktiv ist, zeigt jede Seite ein rotes Banner und jede so erfolgte Anmeldung wird als Warnung ins Log geschrieben. Er gilt ausschliesslich für das Plattform-Konto – Vereins-Admins bleiben auch dann durch ihre 2FA geschützt. Achten Sie darauf, dass die appsettings.json auf dem Server nur für Administratoren les- und schreibbar ist.
Wichtig: Platzhalter ersetzen Bleiben Qr:Secret, Encryption:Key oder das Seed-Passwort auf den mitgelieferten Beispielwerten, verweigert die Anwendung ausserhalb der Entwicklungsumgebung absichtlich den Start. Und: Wird Encryption:Key später geändert, werden bereits gespeicherte SMTP-Passwörter unlesbar und müssen neu erfasst werden.

Schritt 6: Hilfe-Seite einbinden

  1. Den Ordner der Hilfe-Seite ausserhalb des Anwendungsordners ablegen, z. B. D:\Sites\bestellbar-help.
  2. Im IIS-Manager unterhalb der Bestell-Bar-Anwendung ein virtuelles Verzeichnis mit Alias help anlegen, das auf diesen Ordner zeigt.

Damit funktioniert der Hilfe-Link im Seitenfuss der Anwendung, und die Seite bleibt bei Anwendungs-Updates unangetastet.

Schritt 7: Erster Start

  1. Die Website im Browser aufrufen. Beim ersten Start legt die Anwendung die Datenbanktabellen an und erstellt das Administrator-Konto aus dem Seed-Abschnitt (das kann einige Sekunden dauern).
  2. Mit dem Seed-Konto Anmelden.
  3. Unter dem Zahnrad-Menü AdministrationSystem-SMTP den zentralen E-Mail-Versand konfigurieren (Voraussetzung für Selbstregistrierung und «Passwort vergessen»).
  4. Unter Vereine den ersten Verein samt Vereins-Admin anlegen – oder die Selbstregistrierung auf der Startseite nutzen.

Updates einspielen

  1. Datenbank sichern.
  2. Anwendungspool BestellBar stoppen.
  3. Anwendungsdateien durch die neue Version ersetzen – appsettings.json und web.config dabei behalten (vorher sichern).
  4. Anwendungspool wieder starten. Nötige Datenbank-Anpassungen führt die Anwendung beim Start automatisch aus.
Die Schlüssel bleiben stehen Der Ordner mit den Sicherheitsschlüsseln liegt bewusst ausserhalb des Anwendungsordners und wird beim Ersetzen der Dateien nicht angefasst – niemand wird durch ein Update abgemeldet. Haben Sie unter DataProtection:KeyPath einen eigenen Pfad gesetzt, achten Sie darauf, dass er weiterhin ausserhalb liegt.

Nur zum Testen: direkt starten (Konsole)

Dieselbe JKOrderManager.exe lässt sich auch direkt starten – per Doppelklick oder aus der Eingabeaufforderung. Es öffnet sich ein Konsolenfenster, und die Anwendung ist unter http://localhost:5000 erreichbar (ohne IIS).

Nicht für den Produktivbetrieb Der Direktstart ist zum Ausprobieren und für Tests gedacht: Es gibt kein HTTPS, keinen automatischen Start nach einem Neustart des Servers und keinen Neustart nach einem Absturz. Für den regulären Betrieb verwenden Sie den IIS (Schritt 3).

Alternativer Betrieb: als Windows-Dienst

Statt im IIS kann dieselbe Anwendung auch als Windows-Dienst laufen – praktisch, wenn auf dem Server kein IIS gewünscht ist. Der reguläre Weg bleibt der IIS-Betrieb.

  1. Dienst anlegen (Eingabeaufforderung als Administrator; das Leerzeichen nach binPath= gehört zur Syntax von sc.exe):
    sc.exe create BestellBar binPath= "D:\Sites\bestellbar\JKOrderManager.exe --urls http://localhost:5000" start= auto
    sc.exe description BestellBar "Bestell-Bar Web-Anwendung"
  2. Dienstkonto festlegen und diesem – wie in Schritt 4 – Zugriff auf die Datenbank geben. Ohne Angabe läuft der Dienst als LocalSystem:
    sc.exe config BestellBar obj= "DOMAIN\dienstkonto" password= "…"
  3. Starten bzw. stoppen:
    sc.exe start BestellBar
    sc.exe stop BestellBar
  4. Wieder entfernen (vorher stoppen): sc.exe delete BestellBar
HTTPS beachten Im Dienstbetrieb steht kein IIS davor, der das Zertifikat bereitstellt. Betreiben Sie den Dienst deshalb entweder nur im internen Netz, hinterlegen Sie ein Zertifikat für Kestrel, oder stellen Sie einen Reverse-Proxy davor – die Gäste-Bestellseiten und QR-Codes setzen HTTPS voraus.

Wenn es nicht läuft

SymptomPrüfen
HTTP-Fehler 500.30, Anwendung startet nicht Meist sind die Platzhalter in der appsettings.json nicht ersetzt (siehe Schritt 5). Für die genaue Fehlermeldung JKOrderManager.exe testweise direkt in einer Eingabeaufforderung im Anwendungsordner starten oder in die Windows-Ereignisanzeige schauen.
HTTP-Fehler 500.19 oder «Handler»-Fehler Das .NET Hosting Bundle fehlt oder wurde vor dem IIS installiert – (erneut) installieren und iisreset ausführen.
Datenbankfehler beim Start Connection String prüfen (Instanzname!); hat das Anwendungspool-Konto die Rechte aus Schritt 4?
Hilfe-Link zeigt «404» Ist das virtuelle Verzeichnis help aus Schritt 6 eingerichtet?
Keine Logdatei Serilog-Pfad in der appsettings.json prüfen; darf das Anwendungspool-Konto dort schreiben?
Stationsboards aktualisieren sich nicht mehr von selbst Läuft der Anwendungspool mit mehr als einem Arbeitsprozess? Siehe Nur ein Arbeitsprozess. Im Log steht in dem Fall eine entsprechende Warnung.
Seite Zu viele Anfragen beim Anmelden oder beim E-Mail-Versand Die Anfragebegrenzung hat zugeschlagen. Kurz warten – oder, wenn viele Benutzer über dieselbe Internet-Adresse zugreifen, die Werte unter RateLimits erhöhen.
Benutzer werden immer wieder abgemeldet, oder Formulare lassen sich nicht abschicken Der Schlüsselbund wird nicht dauerhaft gespeichert. Im Log den Pfad nachsehen (Zeile Data-Protection-Schlüssel) und prüfen, ob das Anwendungspool-Konto in diesem Ordner schreiben darf – siehe Sicherheitsschlüssel.