Docker_tmp #188

Merged
mpeltriaux merged 5 commits from Docker_tmp into Docker 2022-08-02 09:54:31 +02:00
12 changed files with 23 additions and 165 deletions
Showing only changes of commit b89cbc8484 - Show all commits

View File

@ -1,24 +0,0 @@
FROM python:3.9-slim
ENV PYTHONUNBUFFERED 1
WORKDIR /konova
# Install some dependencies
RUN apt update
RUN apt install -y gdal-bin redis-server nginx
# Copy requirements file into workspace and install all dependencies
COPY ./requirements.txt /konova/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
# Remove nginx default configuration and replace with own configuration
RUN rm /etc/nginx/sites-enabled/default
COPY ./nginx.conf /etc/nginx/conf.d
# Copy rest of project into workspace
COPY . /konova/
# Move static files in designated folder
RUN python manage.py collectstatic --noinput

View File

@ -4,7 +4,6 @@ the database postgresql and the css library bootstrap as well as the icon packag
fontawesome for a modern look, following best practices from the industry. fontawesome for a modern look, following best practices from the industry.
## Background processes ## Background processes
### !!! For non-docker run
Konova uses celery for background processing. To start the worker you need to run Konova uses celery for background processing. To start the worker you need to run
```shell ```shell
$ celery -A konova worker -l INFO $ celery -A konova worker -l INFO
@ -19,58 +18,3 @@ Technical documention is provided in the projects git wiki.
A user documentation is not available (and not needed, yet). A user documentation is not available (and not needed, yet).
# Docker
To run the docker-compose as expected, you need to take the following steps:
1. Create a database containing docker, using an appropriate Dockerfile, e.g. the following
```
version: '3.3'
services:
postgis:
image: postgis/postgis
restart: always
container_name: postgis-docker
ports:
- 5433:5432
volumes:
- db-volume:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=postgres
- POSTGRES_USER=postgres
networks:
- db-network-bridge
networks:
db-network-bridge:
driver: "bridge"
volumes:
db-volume:
```
This Dockerfile creates a Docker container running postgresql and postgis, creates the default superuser postgres,
creates a named volume for persisting the database and creates a new network bridge, which **must be used by any other
container, which wants to write/read on this database**.
2. Make sure the name of the network bridge above matches the network in the konova docker-compose.yml
3. Get into the running postgis container (`docker exec -it postgis-docker bash`) and create new databases, users and so on. Make sure the database `konova` exists now!
4. Replace all `CHANGE_ME_xy` values inside of konova/docker-compose.yml for your installation. Make sure the `SSO_HOST` holds the proper SSO host, e.g. for the arnova project `arnova.example.org` (Arnova must be installed and the webserver configured as well, of course)
5. Take a look on konova/settings.py and konova/sub_settings/django_settings.py. Again: Replace all occurences of `CHANGE_ME` with proper values for your installation.
1. Make sure you have the proper host strings added to `ALLOWED_HOSTS` inside of django_settings.py.
6. Build and run the docker setup using `docker-compose build` and `docker-compose start` from the main directory of this project (where the docker-compose.yml lives)
7. Run migrations! To do so, get into the konova service container (`docker exec -it konova-docker bash`) and run the needed commands (`python manage.py makemigrations LIST_OF_ALL_MIGRATABLE_APPS`, then `python manage.py migrate`)
8. Run the setup command `python manage.py setup` and follow the instructions on the CLI
9. To enable **SMTP** mail support, make sure your host machine (the one where the docker container run) has the postfix service configured properly. Make sure the `mynetworks` variable is xtended using the docker network bridge ip, created in the postgis container and used by the konova services.
1. **Hint**: You can find out this easily by trying to perform a test mail in the running konova web application (which will fail, of course). Then take a look to the latest entries in `/var/log/mail.log` on your host machine. The failed IP will be displayed there.
2. **Please note**: This installation guide is based on SMTP using postfix!
3. Restart the postfix service on your host machine to reload the new configuration (`service postfix restart`)
10. Finally, make sure your host machine webserver passes incoming requests properly to the docker nginx webserver of konova. A proper nginx config for the host machine may look like this:
```
server {
server_name konova.domain.org;
location / {
proxy_pass http://localhost:KONOVA_NGINX_DOCKER_PORT/;
proxy_set_header Host $host;
}
}
```

View File

@ -1,34 +0,0 @@
version: '3.3'
services:
konova:
external_links:
- postgis:db
- arnova-nginx-server:arnova
build: .
container_name: "konova-docker"
command: ./docker-entrypoint.sh
restart: always
volumes:
- .:/konova
- /data/apps/konova/uploaded_files:/konova_uploaded_files
ports:
- "1337:80"
environment:
- POSTGRES_NAME=konova
- POSTGRES_PORT=5432
- POSTGRES_PASSWORD=CHANGE_ME
- POSTGRES_USER=konova
- POSTGRES_HOST=db
- REDIS_HOST=localhost
- SSO_HOST=CHANGE_ME_TO_SSO_HOST_URL
- SMTP_HOST=172.17.0.1
- SMTP_PORT=25
- SMTP_REAL_REPLY_MAIL=ksp-servicestelle@sgdnord.rlp.de
# Instead of an own, new network, we need to connect to the existing one, which is provided by the postgis container
# NOTE: THIS NETWORK MUST EXIST
networks:
default:
external:
name: postgis_nat_it_backend

View File

@ -1,7 +0,0 @@
#!/bin/bash
# Start all needed services once the container is fired up!
service nginx start
service redis-server start
celery -A konova worker --detach
# Rule of thumb: (2*CPU)+1 as worker_num -> Use 5 as default (matches a dual core)
gunicorn --workers=5 konova.wsgi:application --bind=0.0.0.0:8000

View File

@ -17,7 +17,7 @@ app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks() app.autodiscover_tasks()
# Declare redis as broker # Declare redis as broker
app.conf.broker_url = f"redis://{os.environ.get('REDIS_HOST')}:6379/0" app.conf.broker_url = 'redis://localhost:6379/0'
@app.task(bind=True) @app.task(bind=True)

View File

@ -125,11 +125,10 @@ WSGI_APPLICATION = 'konova.wsgi.application'
DATABASES = { DATABASES = {
'default': { 'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis', 'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': os.environ.get('POSTGRES_NAME'), 'NAME': 'konova',
'USER': os.environ.get('POSTGRES_USER'), 'USER': 'postgres',
'HOST': os.environ.get('POSTGRES_HOST'), 'HOST': '127.0.0.1',
'PASSWORD': os.environ.get('POSTGRES_PASSWORD'), 'PORT': '5432',
'PORT': os.environ.get('POSTGRES_PORT'),
} }
} }
@ -219,14 +218,19 @@ DEBUG_TOOLBAR_CONFIG = {
} }
# EMAIL (see https://docs.djangoproject.com/en/dev/topics/email/) # EMAIL (see https://docs.djangoproject.com/en/dev/topics/email/)
if DEBUG:
# ONLY FOR DEVELOPMENT NEEDED
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = '/tmp/app-messages'
DEFAULT_FROM_EMAIL = "no-reply@ksp.de" # The default email address for the 'from' element # CHANGE_ME !!! ONLY FOR DEVELOPMENT !!!
if DEBUG:
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = '/tmp/app-messages' # change this to a proper location
DEFAULT_FROM_EMAIL = "service@ksp.de" # The default email address for the 'from' element
SERVER_EMAIL = DEFAULT_FROM_EMAIL # The default email sender address, which is used by Django to send errors via mail SERVER_EMAIL = DEFAULT_FROM_EMAIL # The default email sender address, which is used by Django to send errors via mail
EMAIL_HOST = os.environ.get('SMTP_HOST') EMAIL_HOST = "localhost"
EMAIL_REPLY_TO = os.environ.get('SMTP_REAL_REPLY_MAIL') EMAIL_REPLY_TO = "ksp-servicestelle@sgdnord.rlp.de"
SUPPORT_MAIL_RECIPIENT = EMAIL_REPLY_TO SUPPORT_MAIL_RECIPIENT = EMAIL_REPLY_TO
EMAIL_PORT = os.environ.get('SMTP_PORT') EMAIL_PORT = "25"
#EMAIL_HOST_USER = ""
#EMAIL_HOST_PASSWORD = ""
EMAIL_USE_TLS = False
EMAIL_USE_SSL = False

View File

@ -7,9 +7,7 @@ Created on: 31.01.22
""" """
# SSO settings # SSO settings
import os SSO_SERVER_BASE = "http://127.0.0.1:8000/"
SSO_SERVER_BASE = f"http://{os.environ.get('SSO_HOST')}/"
SSO_SERVER = f"{SSO_SERVER_BASE}sso/" SSO_SERVER = f"{SSO_SERVER_BASE}sso/"
SSO_PRIVATE_KEY = "QuziFeih7U8DZvQQ1riPv2MXz0ZABupHED9wjoqZAqeMQaqkqTfxJDRXgSIyASwJ" SSO_PRIVATE_KEY = "QuziFeih7U8DZvQQ1riPv2MXz0ZABupHED9wjoqZAqeMQaqkqTfxJDRXgSIyASwJ"
SSO_PUBLIC_KEY = "AGGK7E8eT5X5u2GD38ygGG3GpAefmIldJiiWW7gldRPqCG1CzmUfGdvPSGDbEY2n" SSO_PUBLIC_KEY = "AGGK7E8eT5X5u2GD38ygGG3GpAefmIldJiiWW7gldRPqCG1CzmUfGdvPSGDbEY2n"

View File

@ -102,7 +102,6 @@ def home_view(request: HttpRequest):
return render(request, template, context) return render(request, template, context)
@login_required
def get_geom_parcels(request: HttpRequest, id: str): def get_geom_parcels(request: HttpRequest, id: str):
""" Getter for HTMX """ Getter for HTMX
@ -157,7 +156,6 @@ def get_geom_parcels(request: HttpRequest, id: str):
return HttpResponse(None, status=404) return HttpResponse(None, status=404)
@login_required
def get_geom_parcels_content(request: HttpRequest, id: str, page: int): def get_geom_parcels_content(request: HttpRequest, id: str, page: int):
""" Getter for infinite scroll of HTMX """ Getter for infinite scroll of HTMX

View File

@ -1,20 +0,0 @@
upstream konova {
server localhost:8000;
}
server {
listen 80;
location / {
proxy_pass http://konova;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /static/ {
alias /konova/static/;
}
}

View File

@ -48,5 +48,4 @@ wcwidth==0.2.5
webservices==0.7 webservices==0.7
wrapt==1.13.3 wrapt==1.13.3
xmltodict==0.12.0 xmltodict==0.12.0
zipp==3.4.1 zipp==3.4.1
gunicorn==20.1.0

View File

@ -31,7 +31,7 @@
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
<div class="container-fluid mt-3 px-4"> <div class="container-fluid mt-3 mb-5 px-4">
{% comment %} {% comment %}
The modal wrapper, which can be used on every view can stay on the base.html template The modal wrapper, which can be used on every view can stay on the base.html template
{% endcomment %} {% endcomment %}

View File

@ -14,8 +14,8 @@
{% block body %} {% block body %}
<div class="container"> <div class="container">
<h4>{% trans 'Teams' %}</h4>
<div class="col-md"> <div class="col-md">
<h4>{% trans 'Teams' %}</h4>
<button class="btn rlp-r btn-modal" data-form-url="{% url 'user:team-new' %}" title="{% trans 'Add new team' %}"> <button class="btn rlp-r btn-modal" data-form-url="{% url 'user:team-new' %}" title="{% trans 'Add new team' %}">
{% fa5_icon 'plus' %} {% fa5_icon 'plus' %}
{% trans 'New' %} {% trans 'New' %}