Neue Web-Applikation und Webseite auf explAInation.net

Anfang März 2021 habe ich eine Software-Demonstration auf dem Workshop Bildverarbeitung für die Medizin, wo sich zahlreiche Wissenschaftler und Industrieteilnehmer zu neuen Entwicklungen auf diesem Gebiet austauschen. Da die interaktive Visualisierung von Relevanzkarten zur Alzheimer-Erkennung (siehe Blog-Beitrag vom Sommer) nur als vollwertiges Python-Programm lauffähig ist, musste ich einen Weg finden, diese ohne großen Installationsaufwand für potentielle Nutzer und Anwender zugänglich zu machen. Eine Lösung habe ich hier in der Bokeh Visualisierungsbibliothek gefunden, bei der die Programmoberfläche in einem beliebigen Internet-Browser läuft und die Programmlogik unter Python auf dem lokalen Gerät oder einem Server im Internet.

Damit der Server-Teil nun auch wirklich über das Internet erreichbar ist, musste ich mich einer ganzen Palette von Werkzeugen bedienen. Zuerst habe ich einen virtuellen Linux-Server unter der Adresse explAInation.net angemietet, auf dem die Applikation laufen soll. Hier habe ich nginx (ausgesprochen: „engine-ex“) als Gateway eingerichtet und ein Docker Virtualisierungssystem für die einzelnen Komponenten und Dienste. Ein Schema des Aufbaus ist in der Abbildung zu sehen.

Virtual Server Setup mit nginx und Docker

Das Gateway nginx wickelt die ganzen eingehenden Anfragen und den Internetverkehr ab. Hier ist auch über Let’s Encrypt das SSL-Zertifikat hinterlegt, damit man per HTTPS auf die Seite kommt. Intern dient nginx als sogenannter Reverse-Proxy, d.h. er leitet den Verkehr an die dahinterliegenden Docker-Container weiter, abhängig von bestimmten Regeln (z.B. Port oder Pfad in der Adresse). In meinem Fall gehen alle generellen Anfragen an den WordPress Container, der die Webseite abwickelt. Mittels Docker Compose läuft WordPress im Tandem mit einem MariaDB Container, der die SQL-Datenbank für WordPress enthält. Über Docker Compose ist sichergestellt, dass nur der WordPress Docker Container auf die den MariaDB Container zugreifen kann und dass der WordPress Container erst gestartet wird, wenn die Datenbank schon läuft…

Alle Anfragen an die InteractiveVis Applikation werden von nginx über den Pfad erkannt und entsprechend an den Python Docker Container weitergeleitet. Die Erstellung eines eigenen Docker Containers für die interaktive Visualisierung war eine weitere Herausforderung. Hier habe ich mich für eine vollautomatische/öffentliche Variante entschieden, da das Programm als solches eh Open Source sein sollte. Es geht alternativ aber auch manuell/lokal über ein Linux-System. Zuerst habe ich den Quellcode in einem eigenen Repository auf GitHub veröffentlicht. Dieses ist mit dem Docker Repository auf DockerHub verknüpft, das automatisch das Docker Image aktualisiert, sobald neuer/geänderter Code bei GitHub hochgeladen wird. Konkret erfolgt das über das sogenannte Dockerfile, in dem die Anweisungen zur Erzeugung des Images hinterlegt sind (z.B. Python Image holen, notwendige Bibliotheken installieren, Programmdateien kopieren, Start-Befehl für die InteractiveVis). Das entsprechenden Docker Image kann nun relativ leicht über die Kommandozeile heruntergeladen und als Container gestartet werden. Da alle erforderlichen Daten im Image enthalten sind, erfolgt ein „Update“ in diesem Fall einfach durch das Herunterfahren und Löschen des alten Containers, gefolgt von einem Herunterladen und Starten der neuen Version. Fertig.

Zusammengefasst bietet der modularisierte Aufbau von Hauptsystem, nginx Gateway und mehreren Docker Containern ein sehr flexibel anpassbares und gleichzeitig sicheres System, da jeder Container abgeschottet in sich selbst läuft. Hier sind im Fall eines Angriffs oder „Hacks“ innerhalb der Container auch nur diese betroffen und nicht das gesamte Hauptsystem. Durch separat verwaltete Ordner/Dateien (z.B. Webseiteninhalte, Datenbank) können auch Teilkomponenten ausgetauscht oder aktualisiert werden, ohne dass die Inhalte verloren gehen. Aber auch hier gilt Wachsamkeit und die notwendige Sorgfalt bei der Administration der Systeme, damit der Server nicht gekapert wird und als Zombie oder Spam-Schleuder endet.