Schon seit Drupal 8 empfand ich die Lösung, mittels phpdotenv Settings für verschiedene Umgebungen bereitzustellen, elegant, praktisch und pflegeleicht.
Anstatt nur 2 Umgebungen mittels settings.php
und settings.local.php
vorgeben zu können, kann man mit phpdotenv praktisch unbegrenzte Umgebungen definieren und die Werte für betreffende Settings alle zusammen in einer Datei pflegen, die zudem auch noch außerhalb des Web liegt.
Mit dieser Technik, die in Rails erfunden und seit einiger Zeit auch in PHP verfügbar ist, kann man z.B. die klassischen Entwicklungsumgebungen "Dev, Stage, Production" einfach und pflegeleicht abbilden.
Auch bei Settings für spezielles Hosting wie z.B. bei Pantheon, Acquia kann man dies sehr gut einsetzen.
Was ist phpdotenv?
phpdotenv ist ein Projekt von Vance Lucas und Graham Campbell zur Realisierung einer einfachen Lösung zur Schaffung von Konfigurationen für PHP-Anwendungen. Zudem bietet es den Vorteil, dass "Credentials" wie z.B. Datenbank-Zugänge bei Drupal nicht in der settings.php
stehen müssen, wo sie tendenziell ausgelesen werden könnten.
Stattdessen wird eine .env
Datei im Wurzelverzeichnis der Anwendung erstellt, in der einfache Umgebungsvariablen festgehalten werden und dann via getenv()
anderswo, z.B. in der settings.php
, abgerufen werden können.
Das phpdotenv Projekt lebt hier: https://github.com/vlucas/phpdotenv
Vorbereitung zur Anwendung in Drupal 9
In den aktuellen Drupal-9 Distributionen ist vlucas/phpdotenv nicht enthalten, daher muß man dieses zunächst hinzufügen.
Mittels composer einfach mit diesem Befehl:
Weiterhin benötigt man die folgende Datei, die die Brücke zwischen Drupal und phpdotenv schlägt und die .env lädt:
load.environment.php
, zu finden bei drupal-composer/drupal-project unter der Adresse: https://github.com/drupal-composer/drupal-project/blob/9.x/load.environment.php
Natürlich brauchen wir auch eine .env
Datei im Wurzelverzeichnis:
Damit nun alles Zusammen funktioniert, müssen wir composer noch mitteilen, dass es die Datei load.environment.php
mit in seine Liste zu ladender Dateien aufnimmt. Daher muß folgender Eintrag in composer.json
vorgenommen werden:
Dies einfach irgendwo zwischenschieben und darauf achten, dass Kommata und Klammern richtig gesetzt sind.
Führen wir nun ein composer Kommando aus, bei dem das Verzeichnis der autoload-Dateien neu erzeugt wird, wird die .env
Datei fortan immer mit geladen und ausgewertet.
Die .env Datei
Jetzt geht es noch um die Frage, welche Konfigurationswerte man in die .env
Datei auslagern könnte. Generell gesagt: Alles, was Umgebungsspezifisch ist. Weiter unten zeige ich auch meine settings.php
und zeige auf, wie ich es gelöst habe, als Anregung für eigene Experimente.
Hier ist meine vorläufige Version der .env
Datei mit Konfigurationswerten für 3 Umgebungen, DEV, STAGE und PROD. Anhand dieses Beispiels lässt sich die Datei schnell an eigene Bedürfnisse anpassen.
Die Daten hierin sind nur Beispieldaten zur Veranschaulichung.
Die settings.php Datei(en)
Da man die settings.php
Datei durch Kopieren der Datei default.settings.php
erzeugt, hat man in dieser alle ausführlichen Kommentare zum Nachschlagen, falls es notwendig ist.
Als erstes habe ich aus der settings.php
Datei also alle langen Kommentare rausgelöscht und die Konfigurationen aufgeteilt in "gilt bei allen Umgebungen" und "ist Umgebungs-spezifisch".
Als "Umgebungs-spezifisch" habe ich also für mich folgende Dinge rausgepickt:
skip_permissions_hardening
update_free_access
rebuild_access
file_temp_path
system.site name
system.logging error_level
- Datenbankverbindung
Die Werte für die Produktionsumgebung stehen direkt in der settings.php
. Durch die Lade-Anweisung unterhalb und die weiteren Dateien settings.dev.php
und settings.stage.php
werden diese Werte überschrieben, falls der entsprechende Schalter "ENV" gesetzt ist.
Die Lade-Anweisung ist absichtlich super-flexibel gehalten, um Raum für Ideen zu schaffen. In den case
-Zweigen könnten spezielle andere Dinge aufgerufen werden, die nur für eine bestimmte Umgebung gelten sollen.
Als Beispiel fällt mir hierzu das Hosting bei Pantheon ein: Hier werden die Site-Dateien nicht unter sites/default/files
abgelegt, sondern in einem Ordner außerhalb des Webroot, der via Symlink auf /sites/default/files
zeigt. So kann man das Projekt einfacher mit oder ohne diese Dateien kopieren und bearbeiten.
Entsprechend sind die ggf. nachzuladenden Dateien klein, hier settings.dev.php
und settings.stage.php
:
Deployment
So lassen sich nun beliebig viele Umgebungen definieren. Die .env
Datei ist quasi die Fernsteuerung für die Umgebung. Durch Setzen des Schalters auf einen anderen Wert erwartet die Anwendung (Drupal) andere Werte für Datenbankverbindung etc.
Ich werde wahrscheinlich auch die Werte für trusted_hosts
als Umgebungsspezifisch deklarieren und mit in die entsprechenden Abschnitte einbringen. Das Hosting auf meinem lokalen Entwicklungsserver erwartet z.B. projektname.sites.test
als Domainnamen, während der Stage-Server auf projektname.realedomain.de
ausgelegt ist. In der Produktionsumgebung auf dem Hosting des Kunden sieht es dann wieder anders aus: domainname.de
.
Die bearbeitete Anwendung lässt sich nun jederzeit deployen und zwischen den verschiedenen Umgebungs-Servern hin- und herkopieren. Zum Setzen der richtigen Werte für die jeweilige Umgebung editiere ich einfach die .env
Datei und setze den richtigen Schalter.
Ich finde das sehr praktisch und ich hoffe, dass Drupal zukünftig wieder phpdotenv in das empfohlene Composer-Projekt aufnimmt.