2. Installation¶
2.1. Entwicklungsumgebung¶
Die beste Python IDE ist PyCharm von Jetbrains. Mit der professional Edition ist Remote Development (debuggen im Container) möglich - das Killerfeature schlechthin.
2.2. Auschecken der Repositories¶
Derzeit wird die app im Branch bulma
entwickelt.
mkdir hr3
cd hr3
git clone -b bulma git@bitbucket.org:sumpfgottheit/hr3-app.git app
git clone git@bitbucket.org:sumpfgottheit/hr3-docker-images.git images
git clone git@bitbucket.org:sumpfgottheit/hr3-compose.git compose
2.3. Erstellen der Container Images¶
Ein rebuild
erzeugt alle Images neu:
cd images
./rebuild
Mit push
werden sie - als sumpfgottheit - auf den Dockerhub gespielt und können mit docker pull
geholt werden.
Alle Images für die Hochrechnung haben -hr3
im Namen:
saf@tuxedo-arch:/home/saf/devel/hr3
# docker images |grep hr3
sumpfgottheit/hr3-rq latest 44d3ce78434c 46 hours ago 839 MB
sumpfgottheit/hr3-gunicorn latest f79f34e27777 46 hours ago 835 MB
sumpfgottheit/hr3-devel latest ea83e3c1018c 46 hours ago 845 MB
sumpfgottheit/hr3-entrypoint latest 321ee5a03baf 46 hours ago 835 MB
sumpfgottheit/alpine-python36-numpy-hr3 latest 481890c4a9f1 46 hours ago 809 MB
sumpfgottheit/hr3-redis3 latest c8ef6b871de9 47 hours ago 69.4 MB
sumpfgottheit/hr3-postgres95 latest 718ef97df9ee 47 hours ago 84 MB
sumpfgottheit/hr3-nginx latest 7f45d469189c 47 hours ago 102 MB
Das folgende Bild zeigt, welche Container worauf basieren. Wo möglich verwende ich Alpine Linux als Basis für meine Images. Alpine Linux benötigt wenig Platz und es war deutlich einfacher die benötigten Versionen zu installiern. Mittlerweile basieren viele Docker Images von offiziellen Projekten auf Alpine Linux.
Der container hr3-devel
startet einen SSHD. Dieser Container wird
während der Entwicklung sowie am Wahltag für das Einspielen, die Loops
etc etc verwendet. Während die Produktion von Nginx->Gunicorn serviciert
wird, wird während der Entwicklung der Flask-Development Server mit der
Webapp im Development Container gestartet und man greift wie
Nginx->FlaskDevelServer auf den Development Stand zu.
Alle Container erhalten den Benutzer saf mit der UID 1808. Im
Verzeichnis artifacts/
wird dieser User in
alpine_create_saf_environment.sh
angelegt.
Der Benutzer saf ist überall angelegt und hat mein persönliches environment. Ihr habt folgende Möglichkeiten:
* Mit dem user **saf** arbeiten. Dann solltet ihr eure public ssh-keys in ``images/artifacts/alpine_create_saf_environment.sh``
hinzufügen und das Repository, via pull-request updaten
* Ihr legt euch einen eigenen Devel-Container nach dieser Vorlage an, zb ``hr3-him-devel``
* Wir nehmen einen gemeinsamen User
* Ihr gebt username, userid und publickey in ``compose/user.config`` an und hängt das File als ``/user.config``
in den Container (nicht getestet, aber sollte gehen)
Alle Container, die von hr3-entrypoint
ableiten, lesen während der
Starts das Verzeichnis /docker-entrypoint.d/
und führen alles
*.sh
Scripts aus. (Siehe artifacts/entrypoint.sh
). Die anderen
Container haben meist ähnliche Mechanismen - siehe die Dockerfiles der
Base-Images. Das Verzeichnis /docker-entrypoint.d/
kann als Volume
gemountet werden um Startup Scripts
Mit dem Entrypoint können also user auch beim Containerstart hinzugefügt werden
2.4. Backend¶
Der Container devel hat einen SSHD am Port 2222 laufen. Damit wechseln wir quasi ins Development Environment. Für die Produktion wir durch den Gunicorn-Applicationserver die Applikation gestartet.
Zuerst wird der Letztstand der DB eingespielt. Dabei werden gleichzeitig die Tables angelegt. Ohne weiteren Parameter wird
der letzte PostgresqlDump von /opt/hr/pg_dumps/latest.dump
eingespielt:
ssh saf@localhost -p 2222
saf@devel:/opt/hr [venv:virtualenv_hr git:bulma]
# hrcli db restore
2017-03-17 17:35:29,274 - wsgi.config - DEBUG - config.py - <module> - 194 - Used LOGGING_CONFIG: /opt/hr/configs/logging.devel.yaml
Dropping user_roles
Dropping roles
Dropping users
..
..
COPY 33
COPY 60
setval
-------
1
(1 row)
2.4.1. Userpassword setzen¶
hrcli user --help
2.4.2. Backend starten¶
Mit hrcli run
wird der Development Server mit der app
in /opt/hr/wsgi/__init__.py/
gestartet:
# hrcli run
2017-03-17 17:40:04,901 - wsgi.config - DEBUG - config.py - <module> - 194 - Used LOGGING_CONFIG: /opt/hr/configs/logging.devel.yaml
2017-03-17 17:40:05,873 - werkzeug - INFO - _internal.py - _log - 87 - * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
2017-03-17 17:40:05,898 - werkzeug - INFO - _internal.py - _log - 87 - * Restarting with inotify reloader
2017-03-17 17:40:06,432 - wsgi.config - DEBUG - config.py - <module> - 194 - Used LOGGING_CONFIG: /opt/hr/configs/logging.devel.yaml
2017-03-17 17:40:07,344 - werkzeug - WARNING - _internal.py - _log - 87 - * Debugger is active!
2017-03-17 17:40:07,348 - werkzeug - INFO - _internal.py - _log - 87 - * Debugger PIN: 512-996-644
2.5. Frontend¶
Das neue Frontend verwendet Vue.js , das Bulma CSS Framework und Lavarel Mix für den Umgang mit webpack.
2.5.1. Install node Modules¶
cd /opt/hr/frontend
npm i
2.5.2. Browsersync¶
Um bei der reinen Javascript Entwicklung nicht immer einen Reload des Files mache müssen - auch wenn es durch Flask
ausgeliefert wurde - wurde Browsersync installiert. Beim Aufruf von npm run watch
wird ein Proxy gestartet,
der auf dem Port 3000 lauscht.
Das Frontend ist via http://localhost:3000
erreichbar.
2.5.3. SWAGGER UI¶
Die API Definition erfolgt mittels Swagger. Das Swagger-Gui ist unter http://localhost:5000/api/ui erreichbar. Die API wird durch das Backend bei Request und Response enforced.