diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..b288c765 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,36 @@ +FROM python:3.9.18-slim-bullseye + +# set work directory +WORKDIR /usr/mamweb-docker + +# set environment variables +ENV PIP_DISABLE_PIP_VERSION_CHECK 1 +ENV PYTHONDONTWRITEBYTECODE 1 +ENV PYTHONUNBUFFERED 1 + +# install dependencies +RUN apt-get update && apt-get install -y \ + libpq-dev \ + gcc \ + locales \ + imagemagick \ + netcat \ + postgresql-client +RUN pip install --upgrade pip +COPY ./requirements.txt . +COPY ./constraints.txt . +RUN pip install -r requirements.txt + +# allow correct locales +RUN sed -i '/cs_CZ.UTF-8/s/^# //g' /etc/locale.gen && \ + locale-gen +ENV LANG cs_CZ.UTF-8 +ENV LANGUAGE en_US:en +ENV LC_ALL cs_CZ.UTF-8 + +# copy project +COPY . . + +# create test data once db is ready +RUN chmod +x /usr/mamweb-docker/docker_entrypoint.sh +ENTRYPOINT ["/usr/mamweb-docker/docker_entrypoint.sh"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..f916a735 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,23 @@ + +services: + web: + build: . + command: python manage.py runserver 0.0.0.0:8000 + volumes: + - .:/usr/mamweb-docker + ports: + - 8000:8000 + depends_on: + - db + + db: + image: postgres:13-bullseye + volumes: + - postgres_data:/var/lib/postgresql/data/ + environment: + - POSTGRES_USER=mam-web + - POSTGRES_PASSWORD=RoEGG5g7&b # Random generated string corresponding with Django settings + - POSTGRES_DB=mam_docker + +volumes: + postgres_data: \ No newline at end of file diff --git a/docker_entrypoint.sh b/docker_entrypoint.sh new file mode 100755 index 00000000..eb5842a3 --- /dev/null +++ b/docker_entrypoint.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +echo "Waiting for Postgres..." + +while ! nc -z "db" "5432"; do + sleep 0.1 +done + +echo "PostgreSQL started" + +PGPASSWORD="RoEGG5g7&b" # Random generated, corresponds to the one in docker-compose.yml +if psql "postgresql://mam-web:$PGPASSWORD@db:5432/mam_docker" -t -c '\dt' | cut -d \| -f 2 | grep -qw "seminar_cisla"; then + echo "\nExistuje tabulka 'seminar_cisla' v db, testdata pravděpodobně byla vygenerována.\n" +else + python ./manage.py testdata + python ./manage.py loaddata data/* +fi + +exec "$@" diff --git a/docs/docker.rst b/docs/docker.rst new file mode 100644 index 00000000..12b48e1e --- /dev/null +++ b/docs/docker.rst @@ -0,0 +1,15 @@ +Lokální vývoj pomocí dockeru +============================ + +Přijde vám standardní zprovoznění painful? Docker comes to the rescue. Stačí mít nainstalovaný ``docker`` a spustit ``docker compose up``. + +Co se děje under the hood +------------------------- + +- ``docker-compose.yml`` specifikuje, že chceme kontejner pro web, který je závislý na kontejneru s PostgreSQL db + - ``web`` se buildí z ``Dockerfilu``, mountuje si kořen repa jako svůj volume (takže vidí změny), na konci spouští webserver a vysatvuje ho na port 8000 localhosta + - ``db`` je z ``postgres:13-bullseye`` a má nastavené nějaké parametry, svoje data ukládá jako docker volume +- ``Dockerfile`` staví ``web`` na pythonu3.9 a debianu bullseye (mělo by odpovídat gimlimu) - nainstaluje dependencies, nastaví locale a entrypoint (co se má vykonat při spouštění kontejneru) +- ``docker_entrypoint.sh`` počká na Postgres ready v ``db``, podívá se jestli jsou v něm testdata a když ne, tak je vygeneruje, pak spustí command z compose (i.e. webserver) +- ``mamweb/settings.py`` vybere django settings podle cesty (jako doteď), vybere ``mamweb/settings_docker.py``, které importuje všechno z ``mamweb/settings_local.py``, přepíše jen ``DATABASES`` a ``SECRET_KEY``, aby se jako DB Engine používal Postgres ve vedlejším kontejneru, aby se celý web choval stejně jako ``_test`` a ``_prod`` (``_local`` aktuálně používá DB Engine sqlite3, které se v něčem chová trochu rozdílně) +- kontejner ``web`` se musí nějak připojovat k postgresu v ``db``, k tomu slouží user ``mam-web``, náhodně vygenerované heslo (v ``docker-compose.yml`` a ``docker_entrypoint.sh``, musí se shodovat), db se jmenuje ``mam_docker`` diff --git a/mamweb/settings.py b/mamweb/settings.py index 6f5d302f..98f70f91 100644 --- a/mamweb/settings.py +++ b/mamweb/settings.py @@ -14,6 +14,9 @@ if "mamweb-test" in os.path.abspath(__file__): elif "mamweb-prod" in os.path.abspath(__file__): from .settings_prod import * +elif "mamweb-docker" in os.path.abspath(__file__): + from .settings_docker import * + else: from .settings_local import * diff --git a/mamweb/settings_docker.py b/mamweb/settings_docker.py new file mode 100644 index 00000000..1f73ed5b --- /dev/null +++ b/mamweb/settings_docker.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- + +# +# Docker nastaveni settings.py +# +# Pro vyber tohoto nastaveni muzete pouzit tez: +# DJANGO_SETTINGS_MODULE=mamweb.settings_docker ./manage.py ... +# + +# Import common settings +from .settings_common import * # zatim nutne, casem snad vyresime # noqa + +from mamweb.settings_local import * # Import all the settings for local development + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'EZfSzeuDCycKr5ZjiCQ^45ZqFU@8Ke#YDwn9ThqerfEpu^yV#p' + +# Database +# https://docs.djangoproject.com/en/1.7/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'mam_docker', + 'USER': 'mam-web', + 'PASSWORD': 'RoEGG5g7&b', # Random generated string corresponding with docker-compose + 'TEST': { + 'NAME': 'mam-docker-testdb', + }, + "HOST": "db", + "PORT": "5432", + }, +}