Backend für den Workshop in der Vertiefung "Distributed Software Systems" (WODSS).
- Miniconda
- Python 3.8 (z.B. direkt aus Miniconda)
- Docker
- Docker Compose
Es wird empfohlen, mit einem Conda Environment zu arbeiten.
Folgender Befehl erstellt ein neues Conda Environment mit dem Namen WODSS-Backend
:
conda env create -f resources/environment.yml
Das soeben erstellte Conda Environment muss dabei noch aktiviert werden:
conda activate WODSS-Backend
Immer in der aktivierten Conda-Umgebung
Wird eine Library neu installiert (conda install XYZ
), muss diese im resources/environment.yml
nachgeführt werden.
Dies kann manuell geschehen, am einfachsten durch Kopieren der Ausgabe von folgendem Befehl:
conda env export --from-history
Sobald das resources/environment.yml
gepushed wurde, können die Projektmitarbeitenden ihr Environment durch folgenden Befehl auf den aktuellsten Stand bringen, resp. die neue Library auch installieren:
conda env update --file resources/environment.yml
--prune
würde zusätzlich noch nicht mehr verwendete Libraries gleich entfernen.
Für das Caching von Inzidenzzahlen wird Redis verwendet. Der Redis-Server steht im docker-compose.yml
als Docker Image bereit.
Docker Daemon muss installiert sein und laufen.
docker-compose up -d
Error: Ports are not available: listen tcp 0.0.0.0:6379
net stop winnat
docker start ...
net start winnat
Nachdem die vorhergehenden Schritte ausgeführt wurden, kann auch der lokale Flask Server gestartet werden:
python server.py
Dieser ist unter http://localhost:5001 erreichbar und zeigt direkt das Swagger UI an.
Als Test Framework wird pytest
verwendet.
Die Unit Tests können mit folgendem Befehl im Hauptverzeichnis ausgeführt werden:
pytest
Visual Studio Code bietet einen integrierten Test-Explorer an, der auch pytest unterstützt. Dazu muss die Test Discovery gemäss Anleitung eingerichtet werden. Als Test Framework wird logischerweise pytest
ausgewählt und als Test Directory tests
.
coverage run -m pytest
danach:
coverage report -m
oder
coverage html
und dann:
Windows
cd htmlcov
start index.html
MacOS X
cd htmlcov
open index.html
Das Caching von Inzidenzzahlen kann mit python cache_warmup.py
aufgewärmt werden. Wird dieses Script ausgeführt, werden alle Kantone, für welche ein Server konfiguriert ist aus dem config.json
gelesen. Bei diesen Kantonen werden alle BFS-Nr. angefragt und schliesslich für diese BFS-Nr die Requests gesendet. Mit dem Senden der Requests wird der Cache augewärmt.
Server wird gemäss Kantonsservice-README.md bereits zur Verfügung gestellt.
Folgende Übersicht zeigt die wichtigsten URL und Pfade auf dem Live-Server
- Für die Docker Engine Installation kann folgender Anleitung gefolgt werden: https://docs.docker.com/engine/install/ubuntu/
- Installation Docker Compose: https://docs.docker.com/compose/install/
mkdir /opt/apps
cd /opt/apps
git clone https://github.com/JanickHuerzeler/wodss-02-gr-backend.git
Weil die bereitgestellte VM zu wenig Arbeitsspeicher hat, wird zuerst ein 2GB Swap-File erstellt
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Shorthander:
sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
Nun kann die conda env mit Hilfe des environment.yml erstellt werden
conda env create -f /opt/apps/wodss-02-gr-backend/resources/environment.yml
source activate WODSS-Backend
crontab -e
50 */3 * * * cd /opt/apps/wodss-02-gr-backend && /opt/anaconda/envs/WODSS-Backend/bin/python3.8 cache_warmup.py
Die Ports 80 und 443 müssen auf der VM offen sein. SWITCHEngine: https://bit.ly/3fN5UD0 Danach einen vhost in nginx mit folgender Konfiguration erstellen:
export DOMAIN=corona-navigator.ch
sudo tee /etc/nginx/sites-available/api.$DOMAIN <<EOF
server {
listen 80;
listen [::]:80;
server_name localhost api.$DOMAIN;
location / {
proxy_pass http://localhost:5001;
}
}
EOF
sudo ln -s /etc/nginx/sites-available/api.$DOMAIN /etc/nginx/sites-enabled/api.$DOMAIN
sudo systemctl enable nginx
sudo tee /etc/systemd/system/wodss-02-gr-backend.service << EOF
[Unit]
Description=uWSGI instance to serve wodss-02-gr-backend
[Service]
ExecStart=/bin/bash -c 'cd /opt/apps/wodss-02-gr-backend && uwsgi --processes 4 --threads 2 -H /opt/anaconda/envs/WODSS-Backend resources/uwsgi.ini'
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable wodss-02-gr-backend
# Ensure that the version of snapd is up to date
sudo snap install core; sudo snap refresh core
# Install Certbot
sudo snap install --classic certbot
# Prepare the Certbot command
sudo ln -s /snap/bin/certbot /usr/bin/certbot
# Confirm plugin containment level
sudo snap set certbot trust-plugin-with-root=ok
# Create Certificate
sudo certbot run -a manual -i nginx -d api.corona-navigator.ch
Mit Hilfe dieses Scripts können neue Versionen im Git Repo geholt und auf dem Server ausgerollt werden.
Die Ports 20-21 und 4242-4243 müssen auf der VM offen sein. SWITCHEngine: https://bit.ly/3fN5UD0
sudo tee /home/ubuntu/deploy_backend.sh <<EOF
echo -e '\nTry to create swapfile...'
sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
echo -e '\nGit fetch & merge...'
cd /opt/apps/wodss-02-gr-backend/
git fetch
git reset --hard HEAD > /dev/null
git merge '@{u}'
echo -e '\nUpdate conda environment...'
conda env update --file /opt/apps/wodss-02-gr-backend/resources/environment.yml
echo -e '\nRestarting backend service...'
sudo systemctl restart wodss-02-gr-backend.service
GREEN='\033[0;32m'
NC='\033[0m' # No Color
printf "\n${GREEN}Deployment successfull${NC}\n\n"
EOF