Betrieb mit mehreren Mandanten
Grundlagen
Falls lediglich ein einzelner Webserver bereitgestellt werden soll, der jedoch für mehrere Schulen jeweils eigene WeNoM-Server über unterschiedliche Subdomains anbietet, kann dies mithilfe von „Virtual Hosts“ im Apache2-Webserver realisiert werden. Auf diese Weise ist es möglich, auf einer gemeinsamen technischen Plattform mehrere WebNotenManager für verschiedene Schulen bereitzustellen. Die einzelnen Instanzen sind dabei logisch voneinander getrennt und jeweils über eigene Zugänge erreichbar.
Alternativ kann dieses Ziel auch durch den Einsatz von Docker umgesetzt werden.
Zur Konfiguration von Virtual Hosts kann im Verzeichnis /etc/apache2/sites-available/ für jede Schule eine eigene .conf-Datei angelegt werden. Dadurch wird eine saubere Trennung der Mandanten durch separate Konfigurationsdateien ermöglicht. Innerhalb dieser Konfigurationsdateien kann der Speicherort der Datenbank über die Umgebungsvariable definiert werden:
SetEnv ENM_DB_DIR <Pfad_zum_Verzeichnis>Diese Variable wird von der WeNoM-Installation ausgelesen und bestimmt – abhängig vom in der jeweiligen Virtual-Host-Konfiguration angegebenen Servernamen – den Speicherort der SQLite-Datenbank sowie der zugehörigen Zugangsdaten.
Beispielkonfiguration
In dem folgenden Beispiel soll nun für "Schule1" ein separater Zugang zu einer separaten Datenbank inklusive der Secret Credentials geschaffen werden:
- Separaten Speicherort für "Schule1" unter dem Ordner
dbder Wenom Installation anlegen. Zum Beispiel:
mkdir /var/www/html/db/schule1Umsetzung über einen Virtual Host Eintrag
- Virtual Host unter
/etc/apache2/sites-available/schule1.confanlegen
Beispiel:
Selbstsigniertes Zertifikat
Achtung, in diesem Beispiel wird ein selbstsigniertes Zertifikat verwendet. Nutzen Sie Dienste wie Let's Encrypt, um von Browsern akzeptierte Zertifikate für einen sicheren Zugang zu erstellen.
echo "
<VirtualHost *:443>
ServerAdmin webmaster@localhost
ServerName schule1.your_domain.de
DocumentRoot /var/www/html/public
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
<FilesMatch "\.(?:cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
SetEnv ENM_DB_DIR db/schule1
</VirtualHost>
" >> /etc/apache2/sites-available/schule1.confHierbei ist zu beachten, dass schule1.your_domain.xyz, SetEnv ENM_DB_DIR db/schule1 und /etc/apache2/sites-available/schule1.conf entsprechend der vorhanden Domain (your_domain.xyz) und dem von Ihnen gewählten Schulnamen (schule1) angepasst werden.
Nun noch die neue Seite unter sites-enabled verlinken und den Apache-Server neu starten:
ln -s /etc/apache2/sites-available/schule1.conf /etc/apache2/sites-enabled/schule1.conf
systemctl restart apache2Umsetzung über einen .htaccess Eintrag
Mit der Ergänzung in der Datei .htaccess im Ordner ./public kann ebenso die Verwendung der Variablen je nach URL-Aufruf gesetzt werden.
Beispiel:
SetEnvIf Host "^wenom.(.*).schultraeger-url.de" dbfolder=db/$1Hier wird beim Aufruf von https://wenom.schule1.schultraeger-url.de der Ordner /db/schule1 verwendet, beim Aufruf von https://wenom.schule2.schultraeger-url.de der Ordner /db/schule2, u.s.w...
Dies ist relativ komfortabel einzurichten im Vergleich zur ersten Methode, birgt jedoch die Gefahr, dass die htaccess beim nächsten Update überschrieben wird.
Reverse Proxy Einstellungen
Beim Betrieb hinter einem Reverse Proxy muss darauf geachtet werden, dass die Header-Information korrekt durchgereicht wird. In oben genanntem Beispiel sind die folgenden Einstellungen in /etc/nginx/sites-available/schule1.conf zu ergänzen:
add_header 'Content-Security-Policy' 'upgrade-insecure-requests';
proxy_set_header X-Content-Type-Options nosniff;
proxy_set_header X-Frame-Options "SAMEORIGIN";
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_http_version 1.1;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_send_timeout 300;