Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
7d2dc90
reworked several files in an attempt to make things linux/arm64/v8 co…
suricactus Oct 15, 2025
b37dcd7
Fix QGIS ARM64 compatibility
mrboogiee Oct 15, 2025
8687ec4
Fix GDAL development headers for ARM64 fiona package build
mrboogiee Oct 15, 2025
eb7206d
Add g++ compiler for fiona C++ extensions on ARM64
mrboogiee Oct 15, 2025
1e3e5ce
Apply code formatting improvements
mrboogiee Oct 15, 2025
53007db
Merge branch 'opengisch:master' into arm64-compatibility
mrboogiee Oct 20, 2025
4ebeaf6
Merge pull request #1 from mrboogiee/arm64-compatibility
mrboogiee Oct 20, 2025
051f657
attempt at making it k8s compatible
mrboogiee Oct 22, 2025
0d3ae38
Merge branch 'opengisch:master' into arm64-compatibility
mrboogiee Oct 22, 2025
c761214
using docker buildx for multi-platform compilation
mrboogiee Oct 22, 2025
0c22081
attempt at fixing tx issues
mrboogiee Oct 22, 2025
6ff50eb
Merge pull request #2 from mrboogiee/arm64-compatibility
mrboogiee Oct 22, 2025
f6a1b66
Merge branch 'opengisch:master' into master
mrboogiee Oct 22, 2025
00f05b3
Merge branch 'opengisch:master' into arm64-compatibility
mrboogiee Oct 22, 2025
3d4171a
fixing worker wrapper docker dependency issues for k8s deployments
mrboogiee Oct 22, 2025
da0cda4
Merge pull request #3 from mrboogiee/arm64-compatibility
mrboogiee Oct 22, 2025
f0318fc
attempting to fix linting issues
mrboogiee Oct 22, 2025
b5586e6
fixing release of :latest
mrboogiee Oct 22, 2025
8d783bc
Merge pull request #4 from mrboogiee/arm64-compatibility
mrboogiee Oct 22, 2025
3de7ecb
worker backend not working properly yet
mrboogiee Oct 23, 2025
e072a68
Merge pull request #5 from mrboogiee/arm64-compatibility
mrboogiee Oct 23, 2025
b1444c4
Merge branch 'opengisch:master' into master
mrboogiee Oct 23, 2025
b5177a9
Merge branch 'opengisch:master' into arm64-compatibility
mrboogiee Oct 23, 2025
4d87185
Add Django setting for QFIELDCLOUD_WORKER_BACKEND to enable Kubernete…
mrboogiee Oct 23, 2025
9d5edb8
Merge pull request #6 from mrboogiee/arm64-compatibility
mrboogiee Oct 23, 2025
b97e68b
Add pull_request trigger to build_and_push workflow
mrboogiee Oct 23, 2025
b915584
Merge pull request #7 from mrboogiee/arm64-compatibility
mrboogiee Oct 23, 2025
70e1f94
Fix Docker Hub latest tag for pull requests to master
mrboogiee Oct 23, 2025
4c29c27
Merge pull request #8 from mrboogiee/arm64-compatibility
mrboogiee Oct 23, 2025
909b90b
Fix: Use cached Kubernetes client to prevent 401 authentication errors
mrboogiee Oct 24, 2025
1d65679
Merge pull request #9 from mrboogiee/arm64-compatibility
mrboogiee Oct 24, 2025
1f94e52
Fix: Kubernetes worker authentication using manual client configuration
mrboogiee Oct 24, 2025
9827246
Merge branch 'opengisch:master' into arm64-compatibility
mrboogiee Oct 24, 2025
ee96aea
Merge pull request #10 from mrboogiee/arm64-compatibility
mrboogiee Oct 24, 2025
825493c
Temporarily disable orphaned worker cleanup and simplify K8s auth
mrboogiee Oct 24, 2025
57cdb87
Merge pull request #11 from mrboogiee/arm64-compatibility
mrboogiee Oct 24, 2025
7a9b88b
fix: upgrade kubernetes Python client to 34.1.0 for K8s 1.34 compatib…
mrboogiee Oct 24, 2025
7a11db0
fix: downgrade urllib3 to 2.3.0 for kubernetes 34.1.0 compatibility
mrboogiee Oct 24, 2025
1de10d6
feat: use shared PVC for job I/O between worker and K8s Jobs
mrboogiee Oct 24, 2025
ea338af
fix: kubernetes auth - override API endpoint and re-enable orphaned w…
mrboogiee Oct 24, 2025
ab3ca23
fix: properly override kubernetes API host from environment variable
mrboogiee Oct 24, 2025
62ea625
fix: remove API host override to use default kubernetes.default.svc e…
mrboogiee Oct 25, 2025
047c5f8
feat: add QFIELDCLOUD_K8S_DEBUG environment variable for verbose K8s …
mrboogiee Oct 25, 2025
642ed46
layout
mrboogiee Oct 25, 2025
21298e1
Disable automatic service account token mounting for K8s job pods
mrboogiee Oct 25, 2025
013e92d
Fix K8s wrapper to use shared PVC instead of temp directory
mrboogiee Oct 25, 2025
b85b07f
Remove manual directory creation - let Kubernetes handle subPath
mrboogiee Oct 25, 2025
914c9e8
Remove subPath from job volume mounts
mrboogiee Oct 25, 2025
3910062
Remove restrictive security context from job pods
mrboogiee Oct 25, 2025
b834b7b
Simplify K8s job to bare minimum for testing
mrboogiee Oct 25, 2025
1772ded
Add back labels and volumes to K8s job
mrboogiee Oct 25, 2025
1ad3020
Add environment variables and actual command to K8s job
mrboogiee Oct 25, 2025
146500d
Add timeout and debug port support, document resource limits issue
mrboogiee Oct 25, 2025
e799b4f
Set working directory for QGIS container to job-specific path
mrboogiee Oct 25, 2025
e5ada9d
Use absolute path for entrypoint.py
mrboogiee Oct 25, 2025
22608c8
Fix entrypoint.py path to match Dockerfile WORKDIR
mrboogiee Oct 25, 2025
f6e6e6c
Mount job-specific directory at /io using subPath
mrboogiee Oct 25, 2025
6f73173
Fix URL issues: Add missing project_overview URL pattern and QFIELDCL…
mrboogiee Oct 26, 2025
119c5a6
Add project_overview URL pattern for admin 'view on site' functionality
mrboogiee Oct 27, 2025
3679a16
Add CSRF_TRUSTED_ORIGINS configuration
mrboogiee Oct 27, 2025
074f900
Fix qfcworker storage connectivity in Kubernetes environment
mrboogiee Oct 27, 2025
ce9a71a
Use STORAGE_ prefixed environment variables to match Docker implement…
mrboogiee Oct 27, 2025
c7a5758
Fix STORAGE_REGION_NAME handling in settings_utils
mrboogiee Oct 27, 2025
61a1214
Fix QField iOS client push directory creation in Kubernetes
mrboogiee Oct 27, 2025
f881215
little cleanup
mrboogiee Oct 27, 2025
2066988
little cleanup
mrboogiee Oct 27, 2025
1c9d669
little cleanup
mrboogiee Oct 27, 2025
d03d040
Merge branch 'opengisch:master' into master
mrboogiee Nov 3, 2025
de21fb5
feat: add new templates and styles for account management
Rakanhf Oct 29, 2025
377f0a0
feat: adjust settings and add smooth timedelta filter tag
Rakanhf Oct 29, 2025
552f5bb
refactor: general cleanup and reorganization for consistency
Rakanhf Oct 29, 2025
6a1f83e
chore: update JavaScript dependencies
Rakanhf Nov 3, 2025
ec7830e
fix: Remove the source map reference
Rakanhf Nov 3, 2025
e1fd913
fix: do not check missing Sha256sum key when checking if file exists …
gounux Nov 6, 2025
d8854d1
feat(drf): ensure the login on drf browseable API page is also using …
suricactus Jul 24, 2025
456296c
feat(admin): add custom admin site that reuses the allauth login
suricactus Jul 24, 2025
c4f8937
refactor: Fix lint
Rakanhf Nov 6, 2025
864cc16
refactor: Fix lint
Rakanhf Nov 6, 2025
99fc45f
tests: Make volume name for test DB respect COMPOSE_PROJECT_NAME:
lukasgraf Nov 10, 2025
d56f257
Fix typos in README.md.
felixxm Nov 10, 2025
8a387db
chore: update .gitignore to include .env.test and .venv
Rakanhf Nov 11, 2025
c3b6025
fix: remove mutable default parameters in job `Step`
suricactus Nov 2, 2025
5900d75
fix: mounted path must not have .py suffix
suricactus Nov 2, 2025
0ec8ff8
refactor: treat objects readonly instead of mutating them in place
suricactus Nov 2, 2025
b0a17dd
refactor: remove unnecessary variable definition
suricactus Nov 2, 2025
7a21973
refactor: improve English in comments
suricactus Nov 2, 2025
628dc9c
refactor: add a constant with the transformation grids mount path
suricactus Nov 2, 2025
84f9154
fix: add explicit import in the worker wrapper for `docker.client`
suricactus Nov 2, 2025
37e64b9
fix: make consistent formatting on test failure with jobs
suricactus Nov 2, 2025
e6772f6
feat: add extra time to token expiration compared to the container ti…
suricactus Nov 2, 2025
b5168e9
Drop field `is_metered` from `Plan` model:
lukasgraf Nov 10, 2025
d9c21f0
fix: flaky file size calculations
Rakanhf Nov 10, 2025
98183ba
fix(models): ensure recomputed fields are included in during save
Rakanhf Nov 11, 2025
16bc5e9
Bump postgis image version to 17 in .env.example:
lukasgraf Nov 6, 2025
63fa310
Bump `django` from `4.2.25` to `4.2.26`
gounux Nov 13, 2025
f6d7e57
Bump `sentry-sdk` from 2.42.0` to `2.44.0`
gounux Nov 13, 2025
3622560
Bump `drf-spectacular` from `0.28.0` to `0.29.0`
gounux Nov 13, 2025
21d3cc5
Bump `django-auditlog` from `3.2.1` to `3.3.0`
gounux Nov 13, 2025
4063504
feat: add field to Project and update admin/serializers accordingly
Rakanhf Nov 11, 2025
d20d13b
feat: update project file handling to track restricted data updates
Rakanhf Nov 11, 2025
7711f07
tests: add unit tests for updating
Rakanhf Nov 11, 2025
a8548a9
feat: add qfieldcloud version to admin panel
Rakanhf Nov 18, 2025
628bbda
fix: update timestamps for project on file deletion
Rakanhf Nov 18, 2025
2ee66ae
feat(nginx): Add env vars for Nginx max body size and proxy timeouts
toebivankenoebi Nov 20, 2025
b038c7e
Add SSO branding for login with Microsoft Entra ID.
lukasgraf Nov 24, 2025
24317b9
Temporarily bump django-auditlog to version from git that contains SS…
lukasgraf Nov 25, 2025
d43318a
Define AUDITLOG_LOGENTRY_MODEL in settings:
lukasgraf Nov 25, 2025
07fca6b
feat: add session_role to a postgis layer if configured, during delta…
gounux Nov 20, 2025
490a030
Fix GDAL development headers for ARM64 fiona package build
mrboogiee Oct 15, 2025
5e81cfd
Add g++ compiler for fiona C++ extensions on ARM64
mrboogiee Oct 15, 2025
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
25 changes: 20 additions & 5 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,21 @@ WEB_HTTPS_PORT=443
# DEFAULT: error
NGINX_ERROR_LOG_LEVEL=error

# Sets the maximum allowed size of the client request body.
# DEFAULT: 10g
NGINX_CLIENT_MAX_BODY_SIZE=10g

# Timeout for establishing a connection with the proxied server
# DEFAULT: 5s
NGINX_PROXY_CONNECT_TIMEOUT=5s

# Timeout for reading a response from the proxied server.
# DEFAULT: 300s
NGINX_PROXY_READ_TIMEOUT=300s

# Timeout for transmitting a request to the proxied server.
# DEFAULT: 300s
NGINX_PROXY_SEND_TIMEOUT=300s

##################
# Gunicorn settings
Expand Down Expand Up @@ -449,8 +464,8 @@ SMTP4DEV_IMAP_PORT=143
# see this gist: https://gist.github.com/gounux/2c0779fcb22e512cbdc613eb78200571
# Migration to a newer database version is a risky operation to your data, so prepare and test the backup of the `postgres_data` volume.
# NOTE: Ignored if `db` is not used.
# DEFAULT: 13-3.1-alpine
POSTGIS_IMAGE_VERSION=13-3.1-alpine
# DEFAULT: 17-3.5-alpine
POSTGIS_IMAGE_VERSION=17-3.5-alpine

# Local admin username configuration for minio storage in local and standalone instances.
# NOTE: Ignored if `minio` is not used.
Expand Down Expand Up @@ -520,9 +535,9 @@ DEBUG_WORKER_WRAPPER_DEBUGPY_PORT=5679
# DEFAULT: ""
DEBUG_QGIS_DEBUGPY_PORT=""

# Host path which will be mounted by the `worker_wrapper` into the `worker` containers to facilitate development and debugging pythons files.
# Will mount `qfc_worker`, `entrypoint.py`, and if existent - `qfieldcloud-sdk` and `libqfieldsync`.
# If empty value or invalid value, the copied by docker or pip installed versions will be used.
# Host path which will be mounted by the `worker_wrapper` into the `worker` containers to facilitate development and debugging python files.
# Will mount `qfc_worker`, `entrypoint.py`, and if exists - `qfieldcloud-sdk` and `libqfieldsync`.
# If empty or invalid value, the original code from the docker image (either copied or pip installed) will be used.
# DEFAULT: ""
DEBUG_QGIS_WORKER_HOST_PATH=""

Expand Down
48 changes: 19 additions & 29 deletions .github/workflows/build_and_push.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
name: Build and Push
on:
push:
pull_request:
release:
types: [published]

Expand All @@ -12,61 +13,53 @@ jobs:
fail-fast: true
matrix:
services:
-
service_name: app
- service_name: app
dockerfile: docker-app/Dockerfile
docker_context: docker-app
docker_target: webserver_runtime
enable_dockerhub: true

-
service_name: app-test
- service_name: app-test
dockerfile: docker-app/Dockerfile
docker_context: docker-app
docker_target: webserver_test
enable_dockerhub: false

-
service_name: worker-wrapper
- service_name: worker-wrapper
dockerfile: docker-app/Dockerfile
docker_context: docker-app
docker_target: worker_wrapper_runtime
enable_dockerhub: true

-
service_name: qgis
- service_name: qgis
dockerfile: docker-qgis/Dockerfile
docker_context: docker-qgis
enable_dockerhub: true

-
service_name: nginx
- service_name: nginx
dockerfile: docker-nginx/Dockerfile
docker_context: docker-nginx
enable_dockerhub: true

-
service_name: createbuckets
- service_name: createbuckets
dockerfile: docker-createbuckets/Dockerfile
docker_context: docker-createbuckets
enable_dockerhub: true

steps:
-
name: Checkout
- name: Checkout
uses: actions/checkout@v4

-
name: Docker Metadata
- name: Docker Metadata
id: docker_metadata
uses: docker/metadata-action@v5
with:
images: |
name=ghcr.io/opengisch/qfieldcloud-${{ matrix.services.service_name }},enable=true
name=opengisch/qfieldcloud-${{ matrix.services.service_name }},enable=${{ matrix.services.enable_dockerhub && (github.event_name == 'release' || github.ref_name == 'master') }}
name=ghcr.io/${{ github.repository_owner }}/qfieldcloud-${{ matrix.services.service_name }},enable=true
name=${{ secrets.DOCKER_HUB_USERNAME }}/qfieldcloud-${{ matrix.services.service_name }},enable=${{ matrix.services.enable_dockerhub && (github.event_name == 'release' || github.ref_name == 'master' || (github.event_name == 'pull_request' && github.base_ref == 'master')) }}

flavor: |
latest=auto
latest=${{ github.event_name == 'release' || github.ref_name == 'master' || (github.event_name == 'pull_request' && github.base_ref == 'master') }}
prefix=,onlatest=false
suffix=

Expand All @@ -76,36 +69,33 @@ jobs:
type=match,pattern=v(.*),group=1
type=edge,branch=master

-
name: Login to GitHub Container Repository (ghcr.io)
- name: Login to GitHub Container Repository (ghcr.io)
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

-
name: Login to Docker Hub
- name: Login to Docker Hub
if: ${{ matrix.services.enable_dockerhub && (github.event_name == 'release' || github.ref_name == 'master') }}
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}

-
name: Set up Docker Buildx
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3

-
name: Docker Build ${{ matrix.services.service_name }}
- name: Docker Build ${{ matrix.services.service_name }}
id: docker_test_application
uses: docker/build-push-action@v6
with:
file: ${{ matrix.services.dockerfile }}
context: ${{ matrix.services.docker_context }}
platforms: linux/amd64,linux/arm64/v8
push: ${{ matrix.services.enable_dockerhub && (github.event_name == 'release' || github.ref_name == 'master') }}
target: ${{ matrix.services.docker_target }}
tags: ${{ steps.docker_metadata.outputs.tags }}
cache-from: type=registry,ref=ghcr.io/opengisch/qfieldcloud-${{ matrix.services.service_name }}:buildcache
cache-to: type=registry,ref=ghcr.io/opengisch/qfieldcloud-${{ matrix.services.service_name }}:buildcache,mode=max
cache-from: type=registry,ref=ghcr.io/${{ github.repository_owner }}/qfieldcloud-${{ matrix.services.service_name }}:buildcache
cache-to: type=registry,ref=ghcr.io/${{ github.repository_owner }}/qfieldcloud-${{ matrix.services.service_name }}:buildcache,mode=max
34 changes: 22 additions & 12 deletions .github/workflows/sync_translations.yml
Original file line number Diff line number Diff line change
@@ -1,50 +1,60 @@
name: 🌎 Synchronize translations with Transifex

on:
schedule:
- cron: "0 2 * * *"
workflow_dispatch:
schedule:
- cron: "0 2 * * *"
workflow_dispatch:

jobs:

sync_translations:

name: Synchronize Transifex translations
runs-on: ubuntu-latest

env:
TX_TOKEN: ${{ secrets.TX_TOKEN }}

steps:

- name: Checkout code
uses: actions/checkout@v4
with:
token: ${{ secrets.NYUKI_TOKEN }}

- name: Install Transifex CLI
- name: Install transifex client
run: |
# Detect architecture and download appropriate binary
ARCH=$(uname -m)
if [ "$ARCH" = "x86_64" ]; then
curl -OL https://github.com/transifex/cli/releases/download/v1.6.17/tx-linux-amd64.tar.gz
tar -xvzf tx-linux-amd64.tar.gz
elif [ "$ARCH" = "aarch64" ]; then
curl -OL https://github.com/transifex/cli/releases/download/v1.6.17/tx-linux-arm64.tar.gz
tar -xvzf tx-linux-arm64.tar.gz
else
echo "Unsupported architecture: $ARCH" && exit 1
fi
sudo mv tx /usr/local/bin/tx

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Copy .env file
run: |
cp .env.example .env

- name: Perform docker pre operations
run: |
docker compose pull
docker compose build
docker compose pull
docker compose build

- name: Generate Django translation po files
run: |
docker compose run --user root app python manage.py makemessages -l es
docker compose run --user root app python manage.py makemessages -l es

- name: Push translation files to Transifex
run: ./tx push --source
run: tx push --source

- name: Pull from Transifex
run: ./tx pull --all --minimum-perc 0 --force
run: tx pull --all --minimum-perc 0 --force

- name: Add and commit new translations
uses: EndBug/add-and-commit@v9
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ __pycache__/
.coverage
.vscode
.env
.env.test
docker-compose.override.yml
client/projects
conf/mkcert/*
Expand All @@ -16,6 +17,7 @@ Pipfile*
**/site-packages
docker-qgis/libqfieldsync
docker-qgis/qfieldcloud-sdk-python
.venv

# compiled translations
docker-app/qfieldcloud/locale/**/*.mo
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ Do not forget to copy the site packages every time any of the `requirements*.txt

QFieldCloud will automatically generate a certificate and its root certificate in `./conf/nginx/certs`.
However, you need to trust the root certificate first,
so other programs (e.g. curl) can create secure connection to the local QFieldCloud instance.
so other programs (e.g. `curl`) can create secure connection to the local QFieldCloud instance.

On Debian/Ubuntu, copy the root certificate to the directory with trusted certificates. Note the extension has been changed to `.crt`:

Expand Down Expand Up @@ -307,7 +307,7 @@ Now connecting with `curl` should fail with a similar error:

## Code style

Code style done with [`precommit`](https://pre-commit.com):
Code style done with [`pre-commit`](https://pre-commit.com):

pip install pre-commit
# install pre-commit hook
Expand Down Expand Up @@ -402,7 +402,7 @@ For great `nginx` logs, use:

### Storage

You can use either the integrated `minio` object storage, or use an external provider (e. g. S3) with versioning enabled. Check the corresponding `STORAGE_*` environment variables for more info.
You can use either the integrated `minio` object storage, or use an external provider (e.g. S3) with versioning enabled. Check the corresponding `STORAGE_*` environment variables for more info.

### Database

Expand Down
32 changes: 31 additions & 1 deletion docker-app/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
##########################

# pull a builder image, the same as the base
# This base image supports both AMD64 and ARM64 architectures
FROM python:3.10-slim-bookworm AS build

# Disable annoying pip version check, we don't care if pip is slightly older
Expand All @@ -11,17 +12,33 @@ ARG PIP_DISABLE_PIP_VERSION_CHECK=1
# Do not create and use redundant cache dir in the current user home
ARG PIP_NO_CACHE_DIR=1

# install psycopg2 requirements
# install psycopg2 and GDAL requirements for building packages like fiona
RUN apt-get update \
&& apt-get install -y \
libpq-dev \
python3-dev \
gcc \
g++ \
# GDAL development headers needed for building fiona and other geospatial packages
libgdal-dev \
gdal-bin \
git \
# GDAL development headers needed for building fiona and other geospatial packages on ARM64
g++ \
# GDAL development headers needed for building fiona and other geospatial packages
libgdal-dev \
gdal-bin \
&& rm -rf /var/lib/apt/lists/*

# install `pip-compile` (as part of `pip-tools`)
RUN pip3 install pip-tools

# Set GDAL environment variables for building packages like fiona
ENV GDAL_CONFIG=/usr/bin/gdal-config

# Set GDAL environment variables for building packages like fiona
ENV GDAL_CONFIG=/usr/bin/gdal-config

# install pip dependencies
COPY ./requirements/requirements.txt /requirements/requirements.txt
RUN pip3 install -r requirements/requirements.txt \
Expand All @@ -35,6 +52,7 @@ RUN ls -Q /usr/local/lib/python3.10/site-packages/botocore/data | grep -xv "endp
##########################

# pull official base image
# This base image supports both AMD64 and ARM64 architectures
FROM python:3.10-slim-bookworm AS base

# set work directory
Expand All @@ -47,12 +65,24 @@ ENV PYTHONUNBUFFERED=1
# NOTE while using ARG would be more appropriate, the following vars would have to be redifined for each build stage.
ENV PIP_DISABLE_PIP_VERSION_CHECK=1
ENV PIP_NO_CACHE_DIR=1
# GDAL configuration for building geospatial packages
ENV GDAL_CONFIG=/usr/bin/gdal-config
# GDAL configuration for building geospatial packages
ENV GDAL_CONFIG=/usr/bin/gdal-config

# install dependencies
RUN apt-get update \
&& apt-get install -y \
# GeoDjango as recommended at https://docs.djangoproject.com/en/4.1/ref/contrib/gis/install/geolibs/#installing-geospatial-libraries
binutils libproj-dev gdal-bin \
# GDAL development headers needed for building packages like fiona in test environments
libgdal-dev \
# Build tools needed for compiling Python packages with C++ extensions
gcc g++ python3-dev \
# GDAL development headers needed for building packages like fiona in test environments
libgdal-dev \
# Build tools needed for compiling Python packages with C++ extensions
gcc g++ python3-dev \
# needed for Django's `manage.py makemessages`
gettext \
# for development purposes only (optional dependency for `django-extensions`)
Expand Down
Loading