Closes #1: Add docker environment for development and production

This commit is contained in:
Nikita Klyshko 2023-04-10 22:12:53 +03:00
parent 7f868af5e5
commit 6a33ffc480
11 changed files with 117 additions and 32 deletions

6
.dockerignore Normal file
View file

@ -0,0 +1,6 @@
.vscode/
.venv/
build/
static/
umap_project.egg-info/
data/

5
.gitignore vendored
View file

@ -8,6 +8,8 @@ node_modules/*
umap/static/umap/vendors
site/*
.pytest_cache/
static/
uploads/
### Python ###
# Byte-compiled / optimized / DLL files
@ -18,3 +20,6 @@ build/
dist/
*.egg-info/
.env
.venv/

24
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,24 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Remote Attach",
"type": "python",
"request": "attach",
"connect": {
"host": "localhost",
"port": 5678
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}/umap/",
"remoteRoot": "/srv/app/umap/"
}
],
"justMyCode": false
}
]
}

View file

@ -1,27 +1,13 @@
FROM node:18 AS vendors
COPY . /srv/umap
COPY . /srv/app
WORKDIR /srv/umap
WORKDIR /srv/app
RUN make installjs
RUN make vendors
FROM python:3.8-slim
ENV PYTHONUNBUFFERED=1 \
UMAP_SETTINGS=/srv/umap/umap/settings/docker.py \
PORT=8000
RUN mkdir -p /srv/umap/data && \
mkdir -p /srv/umap/uploads
COPY . /srv/umap
COPY --from=vendors /srv/umap/umap/static/umap/vendors /srv/umap/umap/static/umap/vendors
WORKDIR /srv/umap
FROM python:3.8-slim as app_python
RUN apt-get update && \
apt-get install -y --no-install-recommends \
@ -42,10 +28,21 @@ RUN apt-get update && \
zlib1g-dev \
libfreetype6-dev \
liblcms2-dev \
libwebp-dev \
&& \
pip install --no-cache -r requirements-docker.txt && pip install . && \
apt-get remove -y \
libwebp-dev
ENV PYTHONUNBUFFERED=1 \
UMAP_SETTINGS=/srv/app/umap/settings/docker.py \
PORT=8000
COPY . /srv/app
RUN mkdir -p /srv/app/data && \
mkdir -p /srv/app/uploads
COPY --from=vendors /srv/app/umap/static/umap/vendors /srv/app/umap/static/umap/vendors
WORKDIR /srv/app
RUN pip install --no-cache -r requirements-docker.txt && pip install .
RUN apt-get remove -y \
binutils \
libproj-dev \
libffi-dev \
@ -64,4 +61,10 @@ EXPOSE 8000
ENTRYPOINT ["/usr/bin/tini", "--"]
CMD ["/srv/umap/docker-entrypoint.sh"]
CMD ["/srv/app/docker-entrypoint.sh"]
FROM app_python as app_python_debug
WORKDIR /srv/app
RUN pip install debugpy==1.6.7

View file

@ -0,0 +1,14 @@
version: '2'
services:
app:
build:
target: app_python_debug
environment:
PYTHON_DEBUG: True
volumes:
- ./umap:/srv/app/umap
ports:
- 8000:8000
- 5678:5678

28
docker-compose.yml Normal file
View file

@ -0,0 +1,28 @@
version: '2'
services:
postgres:
image: postgis/postgis:14-3.2
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
volumes:
- ./data:/var/lib/postgresql/data
redis:
image: redis:latest
app:
build:
context: .
target: app_python
environment:
DATABASE_URL: postgis://postgres:postgres@postgres/postgres
REDIS_URL: redis://redis:6379/0
SECRET_KEY: some-long-and-weirdly-unrandom-secret-key
ALLOWED_HOSTS: "*"
SITE_URL: http://localhost:8000/
LEAFLET_STORAGE_ALLOW_ANONYMOUS: true
depends_on:
- postgres
volumes:
- $PWD:/srv/umap
ports:
- "8000:8000"

View file

@ -27,5 +27,9 @@ umap collectstatic --noinput
#umap storagei18n
# compress static files
umap compress
# run uWSGI
exec uwsgi --ini uwsgi.ini
if [ "$PYTHON_DEBUG" = true ] ; then
python -m debugpy --listen 0.0.0.0:5678 manage.py runserver 0.0.0.0:8000 --nothreading --noreload
else
exec uwsgi --ini uwsgi.ini
fi

View file

@ -1,3 +1,3 @@
django-environ==0.4.1
django-redis==4.7.0
uwsgi==2.0.14
django-redis==5.2.0
uwsgi==2.0.21

View file

@ -12,5 +12,6 @@ DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'umap',
'SECRET_KEY': 'some-long-and-weirdly-unrandom-secret-key',
}
}

View file

@ -13,9 +13,9 @@ env = environ.Env()
SECRET_KEY = env('SECRET_KEY')
INTERNAL_IPS = env.list('INTERNAL_IPS', default='127.0.0.1')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default='*')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=['*'])
DEBUG = env.bool('DEBUG', default=False)
DEBUG = env.bool('PYTHON_DEBUG', default=False)
ADMIN_EMAILS = env.list('ADMIN_EMAIL', default='')
ADMINS = [(email, email) for email in ADMIN_EMAILS]
@ -111,10 +111,10 @@ EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
UMAP_USE_UNACCENT = False
# For static deployment
STATIC_ROOT = '/srv/umap/static'
STATIC_ROOT = '/srv/app/static'
# For users' statics (geojson mainly)
MEDIA_ROOT = '/srv/umap/uploads'
MEDIA_ROOT = '/srv/app/uploads'
# Default map location for new maps
LEAFLET_LONGITUDE = env.int('LEAFLET_LONGITUDE', default=2)

View file

@ -6,5 +6,5 @@ vacuum = True
max-requests = 5000
processes = 4
enable-threads = true
static-map = /static=/srv/umap/static
static-map = /uploads=/srv/umap/uploads
static-map = /static=/srv/app/static
static-map = /uploads=/srv/app/uploads