Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions compose.prd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -132,3 +132,22 @@ services:
condition: service_healthy
redis:
condition: service_healthy

flower:
build:
context: .
dockerfile: docker/Dockerfile
target: dev
command: celery_flower
environment: *django-env
restart: unless-stopped
ports:
- 5555:5555
depends_on:
redis:
condition: service_healthy
healthcheck:
test: ["CMD", "curl", "-f", "http://flower:5555/"]
interval: 10s
timeout: 5s
retries: 5
61 changes: 0 additions & 61 deletions compose.test.yml

This file was deleted.

28 changes: 14 additions & 14 deletions compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,30 +5,30 @@ volumes:
hope_postgres_data:

x-django-env: &django-env
- ALLOWED_HOSTS=*
- SECRET_KEY=secret-key
- DATABASE_URL=postgis://postgres:postgres@db:5432/hcr
- DATABASE_HOPE_URL=postgis://postgres:postgres@hopedb:5432/hopedb
- REDIS_URL=redis://redis:6379/0
- ALLOWED_HOSTS=backend,localhost
- STATIC_ROOT=/
- AZURE_TENANT_ID=
- AZURE_CLIENT_KEY=
- CACHE_URL=redis://redis:6379/1
- STATIC_URL=/static/
- CELERY_BROKER_URL=redis://redis:6379/0
- DATABASE_URL=postgis://postgres:postgres@db:5432/hcr
- DATABASE_HOPE_URL=postgis://postgres:postgres@hopedb:5432/hopedb
- FILE_STORAGE_DEFAULT=django.core.files.storage.FileSystemStorage
- FLOWER_URL=http://flower:5555
- EMAIL_BACKEND=
- EMAIL_HOST=
- EMAIL_PORT=
- EMAIL_USE_TLS=
- EMAIL_USE_SSL=
- SENTRY_ENVIRONMENT=local
- CELERY_BROKER_URL=redis://redis:6379/0
- MAILJET_API_KEY=
- MAILJET_SECRET_KEY=
- WP_PRIVATE_KEY=
- POWER_QUERY_FLOWER_ADDRESS=http://flower:5555
- REDIS_URL=redis://redis:6379/0
- SECURE_SSL_REDIRECT=False
- AZURE_TENANT_ID=
- AZURE_CLIENT_KEY=
- FLOWER_URL=http://flower:5555
- FILE_STORAGE_DEFAULT=django.core.files.storage.FileSystemStorage
- SECRET_KEY=secret-key
- SENTRY_ENVIRONMENT=local
- STATIC_ROOT=/
- STATIC_URL=/static/
- WP_PRIVATE_KEY=

services:
backend:
Expand Down
83 changes: 61 additions & 22 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
FROM python:3.12-slim-bookworm as base
FROM python:3.12-slim-bookworm AS base

RUN apt update \
&& apt install --no-install-recommends -y \
RUN apt update && apt install --no-install-recommends -y \
gcc curl libgdal-dev wkhtmltopdf chromium-driver chromium \
&& apt clean && rm -rf /var/lib/apt/lists/* \
&& addgroup --system --gid 82 hcr \
Expand All @@ -10,42 +9,82 @@ RUN apt update \
--disabled-password --home /home/hcr \
--shell /sbin.nologin --group hcr --gecos hcr \
&& mkdir -p /code /tmp /data /static \
&& chown -R hcr:hcr /code /tmp /data /static
&& chown -R hcr:hcr /code /tmp /data /static \
&& curl -o /data/waitforit -sSL https://github.com/maxclaus/waitforit/releases/download/v2.4.1/waitforit-linux_amd64 \
&& chmod +x /data/waitforit

ENV PATH=/venv/bin:/usr/local/bin/:/usr/bin:/bin:/data \
DJANGO_SETTINGS_MODULE=hope_country_report.config.settings \
PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
UV_PROJECT_ENVIRONMENT=/venv \
VIRTUAL_ENV=/venv \
UWSGI_PROCESSES=4 \
PACKAGES_DIR=/code

ENV PATH=$PATH:/code/.venv/bin/ \
PACKAGES_DIR=/code/.venv/lib/python3.12/site-packages \
PYTHONPATH=$PYTHONPATH:/code/src
RUN pip install uv uwsgi
WORKDIR $PACKAGES_DIR

WORKDIR /code
FROM base AS builder

FROM base as builder
RUN apt update \
&& apt install -y --no-install-recommends \
build-essential cmake git libfontconfig1 libgconf-2-4 libglib2.0-0 libnss3 libssl-dev libxml2-dev python3-dev zlib1g-dev \
&& apt clean && rm -rf /var/lib/apt/lists/*

COPY ../pyproject.toml ./
COPY ../uv.lock ./
COPY pyproject.toml uv.lock /code/
COPY src /app/src/
COPY ./tests ./code/tests

ADD https://astral.sh/uv/install.sh /uv-installer.sh
RUN sh /uv-installer.sh && rm /uv-installer.sh
ENV PATH="/root/.local/bin/:$PATH"
RUN --mount=type=cache,target=/root/.uv-cache \
uv sync --cache-dir=/root/.uv-cache \
--python=/usr/local/bin/python \
--python-preference=system \
--frozen --link-mode=copy

RUN uv sync

FROM builder AS dev

WORKDIR /code
COPY .. ./
ENV PYTHONPATH=/code/src:/code/tests:$PYTHONPATH \
PATH="/venv/bin:$PATH"


WORKDIR $PACKAGES_DIR
COPY uv.lock README.md MANIFEST.in pyproject.toml /code/
COPY src /code/src/
COPY --from=base /data/waitforit /usr/local/bin/waitforit
COPY tests /code/tests

COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

FROM builder AS prd

FROM base AS prd

ENV PATH=$PATH:/code/.venv/bin/
ENV DJANGO_SETTINGS_MODULE="hope_country_report.config.settings"
ENV PATH="/code/.venv/bin:$PATH" \
DJANGO_SETTINGS_MODULE=hope_country_report.config.settings \
PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
UWSGI_PROCESSES=4

COPY --chown=hcr:hcr --from=builder . $PACKAGES_DIR
COPY --chown=hcr:hcr .. ./
COPY --chown=hcr:hcr --from=builder $PACKAGES_DIR $PACKAGES_DIR

USER hcr

COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

FROM dev AS dist

ENV PATH="/code/.venv/bin:$PATH" \
DJANGO_SETTINGS_MODULE=hope_country_report.config.settings \
PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
STATIC_URL="/static/" \
UWSGI_PROCESSES=4

COPY --chown=hcr:hcr --from=prd $PACKAGES_DIR $PACKAGES_DIR
COPY --chown=hcr:hcr .. ./

COPY docker/entrypoint.sh /usr/local/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
12 changes: 8 additions & 4 deletions docker/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
set -eou pipefail

production() {
waitforit -address=tcp://db:5432
uwsgi \
--http :8000 \
--master \
Expand All @@ -17,25 +18,28 @@ fi

case "$1" in
dev)
./docker/wait-for-it.sh db:5432
waitforit -address=tcp://db:5432
python3 manage.py migrate
python3 manage.py runserver 0.0.0.0:8000
;;
tests)
./docker/wait-for-it.sh db:5432
pytest tests/ --create-db --cov-report term --maxfail 5 --with-selenium
waitforit -address=tcp://db:5432
waitforit -address=tcp://hopedb:5432
pytest tests/ --create-db --cov-report term -x --with-selenium --strict-markers
;;
prd)
production
;;
celery_worker)
export C_FORCE_ROOT=1
celery -A hope_country_report.config.celery worker -l info
watchmedo auto-restart --directory=./ --pattern=*.py --recursive -- celery -A hope_country_report.config.celery worker -l info
;;
celery_beat)
waitforit -host=redis -port=6379
celery -A hope_country_report.config.celery beat -l info
;;
celery_flower)
waitforit -address=tcp://backend:8000
celery -A hope_country_report.config.celery flower
;;
*)
Expand Down
50 changes: 39 additions & 11 deletions ops/compose.ci-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,39 @@ services:
command: tests
environment:
- ALLOWED_HOSTS=*
- SECRET_KEY=secret-key
- DATABASE_URL=postgis://postgres:postgres@db:5432/hcr
- AZURE_TENANT_ID=
- AZURE_CLIENT_KEY=
- AUTHENTICATION_BACKENDS=hope_country_report.utils.tests.backends.AnyUserAuthBackend
- CACHE_URL=redis://redis:6379/1
- CELERY_BROKER_URL=redis://redis:6379/0
- CORS_ORIGIN_ALLOW_ALL=True
- CSRF_COOKIE_SECURE=False
- DATABASE_HOPE_URL=postgis://postgres:postgres@hopedb:5432/hopedb
- REDIS_URL=redis://redis:6379/0
- ALLOWED_HOSTS=backend,localhost
- STATIC_ROOT=/
- STATIC_URL=/static/
- EMAIL_BACKEND=
- DATABASE_URL=postgis://postgres:postgres@db:5432/hcr
- DEBUG=True
- EMAIL_BACKEND=anymail.backends.mailjet.EmailBackend
- EMAIL_HOST=
- EMAIL_PORT=
- EMAIL_USE_TLS=
- EMAIL_USE_SSL=
- CELERY_BROKER_URL=redis://redis:6379/0
- FILE_STORAGE_DEFAULT=django.contrib.staticfiles.storage.StaticFilesStorage
- FILE_STORAGE_HOPE=django.core.files.storage.FileSystemStorage
- FILE_STORAGE_MEDIA=django.contrib.staticfiles.storage.StaticFilesStorage
- FILE_STORAGE_STATIC=django.contrib.staticfiles.storage.StaticFilesStorage
- MAILJET_API_KEY=
- MAILJET_SECRET_KEY=
- POWER_QUERY_FLOWER_ADDRESS=http://localhost:5555
- REDIS_URL=redis://redis:6379/0
- SESSION_COOKIE_DOMAIN=localhost
- SESSION_COOKIE_HTTPONLY=True
- SESSION_COOKIE_NAME=hcr_session
- SESSION_COOKIE_PATH=/
- SESSION_COOKIE_SECURE=False
- STATIC_ROOT=/
- STATIC_URL=/static/
- SECURE_SSL_REDIRECT=False
- SECRET_KEY=secret-key
- WP_PRIVATE_KEY=
- CACHE_URL=redis://redis:6379/1
- AZURE_TENANT_ID=
- AZURE_CLIENT_KEY=
depends_on:
db:
condition: service_healthy
Expand All @@ -45,6 +59,20 @@ services:
timeout: 4s
retries: 5

hopedb:
image: postgis/postgis:15-3.4
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=hopedb
restart: always
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
start_period: 5s
interval: 5s
timeout: 4s
retries: 5

redis:
image: redis:7.2
restart: always
Expand Down
Loading