# ADR-001 Configure Service

# Status

accepted

# Context

Die Konfiguration von Spring Boot-Systemen erfolgt über verschiedene Mechanismen. So wird die Konfiguration über Properties-Dateien (in Properties- oder YAML-Form) und die Verwendung von Umgebungsvariablen unterstützt. Die Anwendungen werden einmalig gebaut und dann in den verschiedenen Stages unterschiedlich konfiguriert und an den Betrieb in der jeweiligen Stage-Umgebung angepasst. Die Konfigurierbarkeit der Anwendung muss dabei so sichergestellt werden, dass es für die Entwickler und Betrieb einfach ist, die Konfiguration zu erstellen und anzupassen. Die Verwendung von unterschiedlichen Methoden erschwert die Konfigurierbarkeit des Systems, führt zu Fehlern in der Konfiguration und zu erhöhtem Aufwand bei Entwicklung und Betrieb.

Die Standardisierung der Konfiguration muss auf verschiedenen Ebenen erfolgen:

  • Format
  • Standardkonfiguration (unveränderlich)
  • Staging der umgebungsspezifischen Einstellungen
  • Einstellung der Konfiguration für die lokale Entwicklung
  • Nutzung von Spring-Profilen

# Decision

Für die Konfiguration von Spring Boot-Anwendungen verwenden wir eine Konfiguration, die in application.yml abgelegt wird und zusammen mit dem Quelltext in ein Spring-Boot JAR-Archiv eingepackt wird. Dabei enthält die Datei eine Standardkonfiguration der Anwendung. Wenn die Einstellung eines Konfigurationsparameters umgebungsspezifisch ist, wird dazu eine Umgebungsvariable eingeführt und in der Konfigurationsdatei referenziert. Zum Beispiel:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: ${SSO_ISSUER_URL}
1
2
3
4
5
6

Für den Betrieb der Anwendung ist nun die Umgebungsvariable SSO_ISSUER_URL notwendig. In den Stages wird diese mithilfe von OCP-Umgebungsvariablen gesetzt. Bei der lokalen Umgebung wird eine Env-Datei verwendet, die sowohl im docker-compose-Setup als auch beim Start der Anwendung aus der IDE verwendet werden kann. Ist der Start der Anwendung via Docker notwendig, können die Variablen auch über die Docker-Umgebung (env) übergeben werden.

Von der Nutzung von Spring-Profilen wird grundsätzlich abgeraten, da dadurch das Verhalten des Systems nachträglich verändert wird. Eine Ausnahme bildet das test/itest-Profil, das zum Testen des Systems aktiviert wird, um Spring Boot-Tests außerhalb der Umgebung durchführen zu können. Das System sollte nach Möglichkeit sowohl lokal als auch in den Stages ohne Profile (also in der Standard-Konfiguration mit angewandten umgebungsspezifischen Anpassungen) betrieben werden.

# Consequences

Statt der direkten Änderung von Konfigurationsvariablen über Pfade (SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER-URL=...) müssen die Werte über die entsprechende Umgebungsvariable geändert werden. Durch diese Indirektion sind zwar zusätzliche Einstellungen notwendig, jedoch wird die Konfigurierbarkeit des Systems explizit und es entstehen weniger Fehler.