|
Deployment des Docker Containers |
|
## Voraussetzungen
|
|
\ No newline at end of file |
|
|
|
|
|
Die Flutter-Web- und Backend-Komponenten der Feedback App können auf jedem System deployt werden, auf welchen ein OCI kompatible Container-Laufzeit vorhanden ist z.B. Docker. Es werden 3 Container benötigt. Es müssen von diesen Containern zu Verfügung gestellte HTTP-Ressourcen sicher über HTTPS dem Internet zugänglich gemacht werden. Dies kann entweder über einen 4ten Container, in welchem ein Reverse Proxy läuft oder einen bereits auf dem Hostsystem installierten Reverse Proxy erreicht werden.
|
|
|
|
|
|
|
|
## Der Flutter Web Container
|
|
|
|
|
|
|
|
Der Flutter Web Container beinhaltet einen Webserver, welcher die Flutter Web App über HTTP ausliefert.
|
|
|
|
|
|
|
|
Es wird das auf dem Docker Hub als `swtpfeedbackapp/frontend` zur Verfügung stehende Image verwendet.
|
|
|
|
|
|
|
|
## Der Vertx Backend Container
|
|
|
|
|
|
|
|
Der Vertx Backend-Container beinhaltet den HTTP-API-Server, mit welchen die Flutter App kommuniziert.
|
|
|
|
|
|
|
|
Es wird das auf dem Docker Hub als `swtpfeedbackapp/backend` zur Verfügung stehende Image verwendet.
|
|
|
|
|
|
|
|
## Der Postgres Datenbank Container
|
|
|
|
|
|
|
|
Der Postgres Datenbank-Container beinhaltet die Postgres Datenbank, welche vom Backend verwendet wird.
|
|
|
|
|
|
|
|
Es wird hierzu das offizielle Postgres Docker-Image verwendet (`postgres:alpine`).
|
|
|
|
|
|
|
|
## Der Traefik Reverse Proxy
|
|
|
|
|
|
|
|
Der Traefik Reverse-Proxy Container führt die TLS-Termination durch und routet Anfragen zum Flutter Web- oder Vertex Backend-Container, falls dies nicht durch einen auf dem Hostsystem installierten Reverse Proxy erledigt werden kann.
|
|
|
|
|
|
|
|
Es wird hierzu das offizielle Traefik Docker-Image verwendet `traefik:alpine`
|
|
|
|
|
|
|
|
|
|
|
|
## Beispiel Deployment mit Docker Compose
|
|
|
|
|
|
|
|
Das folgende Beispiel beschreibt das Deployment der Feedback App Komponenten auf einen Server der folgende Voraussetzungen erfüllt.
|
|
|
|
|
|
|
|
![Deployment Struktur](uploads/e310878a0841c5b0323d34bbb5822fb1/Projektbericht_pics_deployment_deployment.png)
|
|
|
|
|
|
|
|
## Aufbau des Beipiel-Deployments
|
|
|
|
|
|
|
|
### Voraussetzungen
|
|
|
|
|
|
|
|
* Server mit Linux basierten Betriebssystem und mindestens 1 GiB Arbeitspeicher
|
|
|
|
* Docker Version 19
|
|
|
|
* Docker Compose Version 1
|
|
|
|
* offene und ungenutzte Ports 80 und 443
|
|
|
|
* ein DNS Domain Eintrag, welcher auf den Server verweist
|
|
|
|
|
|
|
|
### Initial Deployment
|
|
|
|
|
|
|
|
Für das Deployment muss die folgende `docker-compose.yaml` zusammen mit der `.env` Datei und der `traefik.toml` Datei im `traefik` Unterordner sein.
|
|
|
|
|
|
|
|
Dies ergibt dann folgende Ordnerstruktur:
|
|
|
|
|
|
|
|
```
|
|
|
|
- docker-compose.yaml
|
|
|
|
- .env
|
|
|
|
- traefik
|
|
|
|
- traefik.toml
|
|
|
|
```
|
|
|
|
|
|
|
|
Ist dies der Fall kann `docker-compose up -d` eingegeben werden, um das Deployment zu starten.
|
|
|
|
|
|
|
|
### docker-compose.yaml
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
version: '3'
|
|
|
|
|
|
|
|
services:
|
|
|
|
backend:
|
|
|
|
image: swtpfeedbackapp/backend
|
|
|
|
networks:
|
|
|
|
- traefik
|
|
|
|
- postgres
|
|
|
|
labels:
|
|
|
|
- "traefik.http.routers.vertexBackend.tls=true"
|
|
|
|
- "traefik.http.routers.vertexBackend.tls.certresolver=letsencrypt"
|
|
|
|
- "traefik.http.routers.vertexBackend.rule=Host(`$DOMAIN`) && PathPrefix(`/api`)"
|
|
|
|
- "traefik.http.services.vertexBackend.loadbalancer.server.port=8080"
|
|
|
|
- "traefik.http.routers.vertexBackend-http.rule=Host(`$DOMAIN`) && PathPrefix(`/api`)"
|
|
|
|
- "traefik.http.middlewares.https-redirect.redirectscheme.scheme=https"
|
|
|
|
- "traefik.http.routers.vertexBackend-http.middlewares=https-redirect"
|
|
|
|
- "traefik.docker.network=traefik"
|
|
|
|
environment:
|
|
|
|
DATABASE_URL: "postgres://postgres@postgres"
|
|
|
|
frontend:
|
|
|
|
image: swtpfeedbackapp/frontend
|
|
|
|
networks:
|
|
|
|
- traefik
|
|
|
|
labels:
|
|
|
|
- "traefik.http.routers.flutterWeb.tls=true"
|
|
|
|
- "traefik.http.routers.flutterWeb.tls.certresolver=letsencrypt"
|
|
|
|
- "traefik.http.routers.flutterWeb.rule=Host(`$DOMAIN`)"
|
|
|
|
- "traefik.http.services.flutterWeb.loadbalancer.server.port=80"
|
|
|
|
- "traefik.http.routers.flutterWeb-http.rule=Host(`$DOMAIN`)"
|
|
|
|
- "traefik.http.middlewares.https-redirect.redirectscheme.scheme=https"
|
|
|
|
- "traefik.http.routers.feedbackApp-http.middlewares=https-redirect"
|
|
|
|
traefik:
|
|
|
|
image: traefik:alpine
|
|
|
|
volumes:
|
|
|
|
- "./traefik:/etc/traefik"
|
|
|
|
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
|
|
|
networks:
|
|
|
|
- traefik
|
|
|
|
ports:
|
|
|
|
- "80:80"
|
|
|
|
- "443:443"
|
|
|
|
postgres:
|
|
|
|
image: postgres:alpine
|
|
|
|
volumes:
|
|
|
|
- "./postgres:/var/lib/postgresql/data"
|
|
|
|
networks:
|
|
|
|
- postgres
|
|
|
|
environment:
|
|
|
|
POSTGRES_HOST_AUTH_METHOD: "trust"
|
|
|
|
networks:
|
|
|
|
traefik:
|
|
|
|
postgres:
|
|
|
|
```
|
|
|
|
### .env
|
|
|
|
|
|
|
|
DOMAIN muss gleich der Domain gesetzt werden unter der die Feedback-App erreichbar sein soll, z.B:
|
|
|
|
|
|
|
|
```
|
|
|
|
DOMAIN=feedbackApp.example.org
|
|
|
|
```
|
|
|
|
|
|
|
|
### traefik.toml
|
|
|
|
|
|
|
|
```toml
|
|
|
|
[entryPoints]
|
|
|
|
[entryPoints.web]
|
|
|
|
address = ":80"
|
|
|
|
[entryPoints.web-secured]
|
|
|
|
address= ":443"
|
|
|
|
|
|
|
|
[providers.docker]
|
|
|
|
|
|
|
|
[certificatesResolvers.letsencrypt.acme]
|
|
|
|
email = "admin@example.org" # Replace with e-mail of admin
|
|
|
|
storage = "/etc/traefik/acme.json"
|
|
|
|
[certificatesResolvers.letsencrypt.acme.httpChallenge]
|
|
|
|
entryPoint = "web"
|
|
|
|
|
|
|
|
[tls.options]
|
|
|
|
[tls.options.default]
|
|
|
|
minVersion = "VersionTLS12"
|
|
|
|
cipherSuites = [
|
|
|
|
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
|
|
|
|
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
|
|
|
|
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
|
|
|
|
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
|
|
|
|
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
|
|
|
|
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305"
|
|
|
|
]
|
|
|
|
```
|
|
|
|
|
|
|
|
## Beispiel Deployment mit Docker Compose und Reverse-Proxy auf Host
|
|
|
|
Das folgende Beispiel beschreibt das Deployment der Feedback App Komponenten auf einen Server der folgende Voraussetzungen erfüllt.
|
|
|
|
|
|
|
|
### Voraussetzungen
|
|
|
|
|
|
|
|
* Server mit Linux basierten Betriebssystem und mindestens 1 GiB Arbeitspeicher
|
|
|
|
* Docker Version 19
|
|
|
|
* Docker Compose Version 1
|
|
|
|
* Eine konfigurierbarer Reverse-Proxy mit SSL-Zertifikat
|
|
|
|
* ein DNS Domain Eintrag, welcher auf den Server verweist
|
|
|
|
|
|
|
|
### Initial Deployment
|
|
|
|
|
|
|
|
Für das Deployment muss die folgende `docker-compose.yam` im momentanen Arbeitsverzeichnis befinden.
|
|
|
|
|
|
|
|
Der auf dem Host-System installierte Reverse-Proxy muss so konfiguriert werden, dass Anfragen auf den `/?? Pfad auf den Localhost Port `8080` weitergeleitet werden und Anfragen auf den `/api` Pfad auf den Localhost Port `8081`. Diese beiden Ports können, falls bereits belegt in der `docker-compose.yaml` geändert werden.
|
|
|
|
|
|
|
|
Ist dies der Fall kann `docker-compose up -d` eingegeben werden, um das Deployment zu starten.
|
|
|
|
|
|
|
|
### docker-compose.yaml
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
version: '3'
|
|
|
|
|
|
|
|
services:
|
|
|
|
backend:
|
|
|
|
image: swtpfeedbackapp/backend
|
|
|
|
networks:
|
|
|
|
- postgres
|
|
|
|
ports:
|
|
|
|
- "127.0.0.1:8081:8080"
|
|
|
|
environment:
|
|
|
|
DATABASE_URL: "postgres://postgres@postgres"
|
|
|
|
frontend:
|
|
|
|
image: swtpfeedbackapp/frontend
|
|
|
|
ports:
|
|
|
|
- "127.0.0.1:8080:80"
|
|
|
|
postgres:
|
|
|
|
image: postgres:alpine
|
|
|
|
volumes:
|
|
|
|
- "./postgres:/var/lib/postgresql/data"
|
|
|
|
networks:
|
|
|
|
- postgres
|
|
|
|
environment:
|
|
|
|
POSTGRES_HOST_AUTH_METHOD: "trust"
|
|
|
|
networks:
|
|
|
|
postgres:
|
|
|
|
```
|
|
|
|
|
|
|
|
### Update Deployment
|
|
|
|
|
|
|
|
Zum Updaten des Deployments muss in dem Ordner, welcher die `docker-compose.yaml` enthält`docker-compose pull` und dann `docker-compse up -d` ausgeführt werden. |