Structure of the EWB Wissensplattform¶
In the following section the structure of the application is described.
flowchart TD
Client[Client] -->|HTTP| Webserver
Webserver --> Application
Application --> Database
The above figure shows a high-level overview of the EWB Wissensplattform. The client comunicates via HTTP-requests with a webserver. the webserver parses the request and redirects it to the application layer, where the request is processed. That processing may include fetching data from the database layer. The application layer returns data to the webserver, which sends a HTTP response to the client.
The EWB Wissensplattform comes with 2 operation modes: Development and production. The structure of the 2 operation modes is shown in the two following pictures:
flowchart TD
Client[Client] -->|HTTP| Django_dev_webserver
Django_dev_webserver --> Django
Django --> Postgresql
The above picture shows a high-level overview of the development version of the EWB Wissensplattform. It consists of the python full-stack framework django and the open-source database management system (DBMS) postgresql. Django comes with a development webserver, which can be used locally to view changes made in development.
Note
Please note, that the development version of the EWB Wissensplattform should not be used in production, since it is not considered secure. Use the production version instead.
flowchart TD
Client[Client] -->|HTTP| nginx
nginx -->|uwsgi| uwsgi
uwsgi ---> Django
Django -->|SQL| Postgresql
The above figure shows an high-level overview of the production version of the EWB Wissensplattform. As a webserver nginx is used. It is used in the reverse-proxy mode. That means, that it forwards reuqests to the underlying application layer. Furthermore it deals with encryption, if HTTPS is used. It decrypts incomming HTTPS-requests, parses the HTTP-pakets and encodes the information in the uwsgi-protocol. The uwsgi python package implements the web server gateway interface (WSGI), which makes the communication between a web server and a python web application possible.
Since a second web application is also part of the EWB Wissensplattform a complete high-level overview of the application is shown in the following figure:
flowchart TD
Client[Client] -->|HTTP| nginx
nginx -->|uwsgi| uwsgi
nginx -->|HTTP| cesiumJs
cesiumJs -->|HTTP| DjangoCityGML
nginx -->|HTTP| DjangoCityGML
DjangoCityGML -->|SQL| 3dCityDB
uwsgi --> Django
Django -->|SQL| Postgresql
In the above diagram the components of the cityGML visulizations web application were included. The structure of the application is different from the EWB Wissensplattform. Here the application has a frontend and a backend part. CesiumJs acts as a frontend while a django instance acts as a backend. The cesium frontend can make API-calls to request data, while the API can also called directly. Behind the djangoCityGML-backend the 3DCityDB-database is connected.
flowchart TD
subgraph Integration-Repository
nginx
end
subgraph Wissensplattform
uwsgi
Django
Postgresql
end
subgraph DjangoCesium
cesiumJs
DjangoCityGML
3dCityDB
end
Client[Client] -->|HTTP| nginx
nginx -->|uwsgi| uwsgi
nginx -->|HTTP| cesiumJs
cesiumJs -->|HTTP| DjangoCityGML
nginx -->|HTTP| DjangoCityGML
DjangoCityGML -->|SQL| 3dCityDB
uwsgi --> Django
Django -->|SQL| Postgresql
Since the web applications were developed independently from each other, they are located in seperate git repositories. To make them work together, a third git repository was used. The picture above assigns the different parts application parts to the respective repository, where the component is implemented. The application repositories are the Wissensplattform- and the djangoCesium-repository.
Docker container structure¶
After showing the structure of the EWB Wissensplattform on a high abstraction level, a more fine granual description is given. Mostly all components of the described structure in the last section are not installed nativly but are placed inside a container. This allows to ship the components together with its dependencies, making it easy to deploy the application and allowing to developer across mutliple operating systems.
flowchart TD
Client[Client]
subgraph Nginx_Container [Docker: Django Container]
django_webserver[django_webserver]
django
end
subgraph Postgresql_Container [Docker: Postgresql Container]
Postgresql[Postgresql]
end
Client -->|HTTP| django_webserver
django_webserver --> django
django -->|SQL| Postgresql
The above figure shows the container structure of the development mode of the application.
Docker container and volumes structure¶
When working with docker containers, a few additional information need to be considered: Docker containers are stateless by design. That means that all data and files, which were saved in the container filesystem are gone after a container restart. That makes it easy to restore a container to a known state but it also introduces the need for a additional mechanism to store persistent data. For that purpose docker volumes are used. Here persistent data is stored across container restarts.
flowchart TD
Client[Client]
subgraph Django_Container [Docker: Django Container]
django_webserver[django_webserver]
django[Django Application]
end
subgraph Postgresql_Container [Docker: Postgresql Container]
Postgresql[Postgresql]
end
subgraph Data_Volume [Docker Volume: Postgresql Data Volume]
pg_data[(Data Volume)]
end
%% Connections
Client -->|HTTP| django_webserver
django_webserver --> django
django -->|SQL| Postgresql
Postgresql -->|Writes to| pg_data
In the development environment the volume pg_data is used to store the database.