Zum Inhalt

Frontend

Diese Anleitung beschreibt, wie das ChronoScope-Frontend in einer Produktivumgebung gebaut und bereitgestellt wird. Das Frontend ist eine Angular-Anwendung und wird nach dem Build als statische Website ausgeliefert. Es benötigt deshalb keinen dauerhaft laufenden Node.js-Prozess auf dem Server.

Kurzüberblick

Das Frontend wird einmal mit pnpm build gebaut. Anschließend werden die erzeugten Dateien über einen Webserver wie Nginx, Apache oder einen bestehenden Reverse Proxy ausgeliefert.

Voraussetzungen

Für die Bereitstellung werden folgende Komponenten benötigt:

Komponente Empfehlung Zweck
Node.js Version 22 LTS Baut die Angular-Anwendung
pnpm Version 10.x Installiert die Abhängigkeiten reproduzierbar
Webserver Nginx, Apache oder vergleichbar Liefert die gebauten Dateien aus
HTTPS-Zertifikat z. B. Let's Encrypt Schützt Anmeldung und API-Kommunikation
ChronoScope-Backend Bereits erreichbar Wird vom Frontend über die API angesprochen
Keycloak Bereits erreichbar Übernimmt Anmeldung und Benutzeridentität

HTTPS verwenden

In der Produktivumgebung sollte das Frontend ausschließlich über HTTPS erreichbar sein. Anmeldedaten und Zugriffstokens dürfen nicht über unverschlüsselte Verbindungen übertragen werden.

Repository vorbereiten

Klonen Sie das Frontend-Repository auf eine Maschine, auf der der Produktionsbuild erzeugt werden soll:

git clone <repository-url>
Set-Location ChronoScope-frontend

Aktivieren Sie anschließend die im Projekt festgelegte pnpm-Version über Corepack:

corepack enable
corepack prepare pnpm@10.33.0 --activate
pnpm --version

Installieren Sie danach die Abhängigkeiten:

pnpm install

Build-Server statt Produktivserver

Node.js und pnpm werden nur zum Erzeugen der statischen Dateien benötigt. Auf dem eigentlichen Webserver müssen diese Werkzeuge nicht installiert sein, wenn die fertigen Build-Dateien dort nur ausgeliefert werden.

Backend-Adresse konfigurieren

Das Produktiv-Frontend verwendet die Datei src/environments/environment.prod.ts. Tragen Sie dort die öffentlich erreichbare Backend-URL ein:

export const environment = {
  production: true,
  apiUrl: 'https://chronoscope.example.org/api',
};

Die URL muss aus Sicht des Browsers erreichbar sein. Wenn das Backend über denselben Host per Reverse Proxy unter /api veröffentlicht wird, ist eine URL wie https://chronoscope.example.org/api üblich.

Situation Beispielwert für apiUrl
Backend unter derselben Domain mit API-Pfad https://chronoscope.example.org/api
Backend unter eigener Subdomain https://api.chronoscope.example.org
Testsystem beim Kunden https://test-chronoscope.example.org/api

CORS beachten

Wenn Frontend und Backend über unterschiedliche Domains erreichbar sind, muss das Backend Anfragen von der Frontend-Domain erlauben. Andernfalls blockiert der Browser die API-Aufrufe.

Anmeldung in Keycloak konfigurieren

Das Frontend nutzt OpenID Connect über Keycloak. Die Weiterleitungsadresse nach der Anmeldung wird aus der geöffneten Frontend-Adresse gebildet. Dadurch muss die öffentliche Frontend-URL im Keycloak-Client erlaubt sein.

Im Keycloak-Client chronoscope sollten mindestens diese Werte gesetzt werden:

Einstellung Beispiel
Valid redirect URIs https://chronoscope.example.org/*
Web origins https://chronoscope.example.org
Client type Public client
Standard flow Aktiviert

Wenn für den Kunden ein eigener Realm, eine andere Keycloak-URL oder eine andere Client-ID genutzt wird, müssen diese Werte zusätzlich im Frontend-Code angepasst und anschließend neu gebaut werden.

Aktuelle Voreinstellung

Die Anwendung ist derzeit auf den Keycloak-Realm https://auth.ni0.team/realms/ni0 und die Client-ID chronoscope ausgelegt. Für eine kundeneigene Installation sollte geprüft werden, ob diese Werte übernommen oder ersetzt werden sollen.

Produktionsbuild erstellen

Führen Sie vor dem Build optional die Tests aus:

pnpm test

Erstellen Sie anschließend den Produktionsbuild:

pnpm build

Angular erzeugt die auslieferbaren Dateien im Ordner dist. Je nach Angular-Version liegt die eigentliche Website im Projektordner selbst oder in einem darunterliegenden browser-Ordner.

Prüfen Sie nach dem Build, welcher Ordner eine index.html enthält:

Get-ChildItem -Path .\dist -Filter index.html -Recurse

Diesen Ordner veröffentlichen Sie über den Webserver.

Webserver einrichten

Das Frontend muss als Single-Page-Application ausgeliefert werden. Das bedeutet: Direkte Aufrufe wie /calendar oder /settings dürfen nicht zu einem 404-Fehler führen, sondern müssen auf die index.html zurückfallen.

Beispiel mit Nginx

In diesem Beispiel liegen die gebauten Dateien unter /var/www/chronoscope und das Backend wird unter /api weitergeleitet:

server {
    listen 80;
    server_name chronoscope.example.org;

    root /var/www/chronoscope;
    index index.html;

    location /api/ {
        proxy_pass http://127.0.0.1:9120/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location / {
        try_files $uri $uri/ /index.html;
    }
}

Für den Produktivbetrieb sollte zusätzlich HTTPS aktiviert werden, zum Beispiel über ein Let's-Encrypt-Zertifikat.

Beispiel mit Apache

Bei Apache kann das Frontend mit mod_rewrite ebenfalls auf die index.html zurückfallen:

<VirtualHost *:80>
    ServerName chronoscope.example.org
    DocumentRoot /var/www/chronoscope

    <Directory /var/www/chronoscope>
        Require all granted
        RewriteEngine On
        RewriteBase /
        RewriteRule ^index\.html$ - [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . /index.html [L]
    </Directory>

    ProxyPass /api/ http://127.0.0.1:9120/
    ProxyPassReverse /api/ http://127.0.0.1:9120/
</VirtualHost>

Dateien veröffentlichen

Kopieren Sie den Ordner, der die index.html enthält, in das Webserver-Verzeichnis. Unter Windows kann das zum Beispiel so vorbereitet werden:

Copy-Item -Path .\dist\ChronoScope-frontend\browser\* -Destination <zielordner> -Recurse -Force

Falls die index.html direkt unter dist\ChronoScope-frontend liegt, passen Sie den Quellpfad entsprechend an.

Nach dem Kopieren muss der Webserver die neuen Dateien ausliefern. Je nach Umgebung reicht ein Reload der Konfiguration aus.

Abnahme prüfen

Nach der Bereitstellung sollten folgende Punkte geprüft werden:

Prüfung Erwartetes Ergebnis
Frontend-URL öffnen Die ChronoScope-Oberfläche wird geladen
Seite neu laden Die Anwendung bleibt erreichbar und zeigt keinen 404-Fehler
Anmeldung starten Der Browser leitet zu Keycloak weiter
Anmeldung abschließen Der Browser kehrt zur Frontend-URL zurück
API-Aufruf auslösen Aufgaben, Organisationen oder Benutzerdaten werden geladen
HTTPS prüfen Browser zeigt eine sichere Verbindung an

Bereit für die Übergabe

Wenn Anmeldung, API-Kommunikation und direkter Seitenreload funktionieren, ist das Frontend aus Sicht der Produktivbereitstellung einsatzbereit.

Häufige Probleme

Problem Mögliche Ursache Lösung
Die Anwendung lädt, aber Daten fehlen Backend-URL ist falsch oder nicht erreichbar apiUrl prüfen und Frontend neu bauen
Browser meldet CORS-Fehler Backend erlaubt die Frontend-Domain nicht CORS-Konfiguration im Backend ergänzen
Login endet mit Redirect-Fehler Frontend-URL ist in Keycloak nicht erlaubt Valid redirect URIs und Web origins prüfen
Direkter Aufruf einer Unterseite zeigt 404 Webserver leitet SPA-Routen nicht auf index.html um try_files oder Rewrite-Regel ergänzen
Änderungen an environment.prod.ts erscheinen nicht Alte Build-Dateien werden ausgeliefert Neu bauen, Dateien erneut kopieren und Cache prüfen