Skip to content

Commit

Permalink
reorganise images per folder + add warning in README
Browse files Browse the repository at this point in the history
  • Loading branch information
3nids committed Apr 23, 2024
1 parent e64d3a2 commit 345163d
Show file tree
Hide file tree
Showing 13 changed files with 203 additions and 192 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/build_docker_images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,12 @@ jobs:
- id: nightly
name: building nightly
run: docker build -t qgis/${{ env.DOCKER_TAG }}:nightly -f ${{ matrix.qgis_type }}.Dockerfile --build-arg repo=ubuntu-nightly .
run: docker build -t qgis/${{ env.DOCKER_TAG }}:nightly -f ${{ matrix.qgis_type }}/Dockerfile --build-arg repo=ubuntu-nightly .

- name: test
if: ${{ matrix.qgis_type == 'server' }}
run: |
docker run -d -v $(pwd)/test/data:/io/data -p 8010:80 --name qgis-server qgis/qgis-server:nightly
docker run -d -v $(pwd)/${{ matrix.qgis_type }}/test/data:/io/data -p 8010:80 --name qgis-server qgis/qgis-server:nightly
docker exec -i qgis-server dpkg -l qgis-server
sleep 5
curl -s 'http://localhost:8010/ogc/test_project?service=WMS&request=GetCapabilities' | grep -ivq exception
Expand Down
191 changes: 3 additions & 188 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,191 +1,6 @@
# QGIS Docker

This repository automates the build of QGIS desktop and QGIS server Docker images.

## QGIS server

### General information

The Docker image is built using *Ubuntu 20.04 (focal) and 22.04 (jammy)* and official QGIS DEBs from <https://qgis.org/>.
It includes *Nginx* and *Xvfb* and can be used as a standalone service (via HTTP TCP port 80) or as *FCGI* backend (via TCP port 9993).

### Requisites

You need **Docker >= 18.04** with `seccomp`. Support for the `statx` syscall, required by Qt 5.10+, may be made necessary in the future. This is generally included in **libseccomp >= 2.3.3**;
a kernel with `statx` support is also required; any kernel newer than 4.11 should be ok. Please check with your vendor.

Known good configurations are:
- Ubuntu 18.04.2+
- CentOS 8
- Fedora 29+

See <https://github.com/qgis/qgis-docker/issues/1> for further details.

Containers are not tested on hosts running OSes other than Linux.

### Services provided

This Docker container exposes HTTP on port `80` via Nginx and a direct FastCGI on port `9993` that can be used directly by an external HTTP proxy (like the provided `docker-compose.yml` does).
A sample Nginx configuration for using it as a *FastCGI* backend is also [provided](conf/nginx-fcgi-sample.conf).

### Available tags

Image name: `qgis/qgis-server`

- **QGIS stable**: `stable` | `stable-ubuntu`
- **QGIS LTR**: `ltr` | `ltr-ubuntu`

Example:

```sh
docker pull qgis/qgis-server:ltr
```

### Build the container

#### QGIS stable

```sh
# stable version
docker build -t qgis/qgis-server:stable .

# ltr version
docker build --build-arg repo=ubuntu-ltr -t qgis/qgis-server:ltr .
```

You may skip this step. The container will be downloaded from the Docker Hub.

### Run the docker and map host data

```sh
docker run -v $(pwd)/data:/io/data --name qgis-server -d -p 8010:80 qgis/qgis-server:ltr
```

`WMS` and `WFS` for a specific project will be published at `http://localhost:8010/ogc/<project_name>`.
An `/ows/` endpoint is also available for direct access to the `fcgi` (bypassing the `map=<project_name>` rewrite).
Direct access to `WFS3` is accessible via `http://localhost:8010/wfs3/`.


#### PostgreSQL connection service file (optional)

The [connection service file](https://www.postgresql.org/docs/12/libpq-pgservice.html) allows connection parameters to be associated with a single service name and thus to be able to use the same QGIS projects in different environments. This could also be achieved with [QGIS authentications](https://docs.qgis.org/3.16/en/docs/user_manual/auth_system/auth_workflows.html#database-authentication).
To use a pg_service file you need to bind mount it as shown in the [docker-compose](docker-compose.yml) or on run:

```sh
-v $(pwd)/conf/pg_service.conf:/etc/postgresql-common/pg_service.conf:ro
```


#### Plugins, fonts and SVG symbols (optional)

Plugins, custom fonts and SVG can be optionally exposed from host to the containers:

- plugins: `-v $(pwd)/plugins:/io/plugins`
- fonts: `-v $(pwd)/fonts:/usr/share/fonts`
- svg symbols: `-v $(pwd)/svg:/var/lib/qgis/.local/share/QGIS/QGIS3/profiles/default/svg`

Example:

```sh
docker run -v $(pwd)/data:/io/data -v $(pwd)/plugins:/io/plugins -v $(pwd)/fonts:/usr/share/fonts --name qgis-server -d -p 8010:80 qgis/qgis-server:ltr
```

#### Access the container via bash

```sh
docker exec -ti qgis-server /bin/bash
```

where `qgis-server` is the name of the container.

#### Logs and debugging

QGIS server log can retreived via `docker logs`

```sh
docker logs [-f] qgis-server
```

where `qgis-server` is the name of the container.

Default log level is set to `warning`. Log level can be increased during container deployment passing the `-e QGIS_SERVER_LOG_LEVEL=0` option:

```sh
docker run -e QGIS_SERVER_LOG_LEVEL=0 -v $(pwd)/data:/io/data -v $(pwd)/plugins:/io/plugins --name qgis-server -d -p 8010:80 qgis/qgis-server:ltr
```

### Run multiple instances of QGIS server

Adjust first the configuration in `conf/nginx.conf` with the proper number of expected workers
and `docker-compose.yml` with the path of data folder on the host.

Then:

```sh
docker-compose up -d --scale qgis-server=N
```

Where N is the number of expected QGIS server workers.


### Data dir structure

`$(pwd)/data` must have the following structure:

```text
data
|
|-- <project_name>
|-- <project_name>.qgs
```

[oq-consolidate](https://github.com/gem/oq-consolidate) may helps you in exporting data suitable for QGIS server (consolidating project and layers).

`$(pwd)/plugins` must have the following structure:

```text
plugins
|
|-- <plugin_name>
|-- <plugin_code>.py
|-- metadata.txt
|-- __init__.py
```

Custom fonts are loaded into `/usr/share/fonts`. `fc-cache` is run when container is started.

### Runtime customizations

The following variables can be customized during container deployment:

#### Nginx

When `SKIP_NGINX` is set to a different value than `0` or `false` the embedded copy of Nginx will not be started and an external reverse proxy is then required to access the FastCGI QGIS backend.

- `SKIP_NGINX`: default is *unset* (do not skip Nginx startup)

#### QGIS

- `QGIS_SERVER_LOG_LEVEL`: default is `1`
- `QGIS_SERVER_PARALLEL_RENDERING`: default is `true`
- `QGIS_SERVER_MAX_THREADS`: default is `2`
- `QGIS_SERVER_WMS_MAX_WIDTH`: not set by default
- `QGIS_SERVER_WMS_MAX_WIDTH`: not set by default

See [QGIS server documentation](https://docs.qgis.org/testing/en/docs/server_manual/config.html#environment-variables) for further details.

It is also possible to customized the ID of the user running QGIS server processes when it is required to write to host volumes (see [notes](#notes)):

- `QGIS_USER`: default is `nginx`, a numerical id must be proivided

Example: `docker run -e QGIS_USER=1000` or `docker run -e QGIS_USER=$(id -u qgis)`

### Notes

GeoPackages do not play well with multiple processes having gpkg files opened in `rw` mode. By default QGIS server processes lack write permission on `/io/data`.
If it is required to let QGIS server write data to `/io/data` make sure that either you are using a process-safe datastore (i.e. a Postgres backend) or you are
limiting horizontal scaling to one container only. QGIS server user can be customized via the `QGIS_USER` environment variable.

## QGIS Desktop
### Warning

There is currently no documentation how to run the QGIS Desktop via docker.
There are discussions on how to build these images and they are not considered stable.
They are considered as NOT production ready.
File renamed without changes.
8 changes: 8 additions & 0 deletions desktop/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
## QGIS Desktop standalone

A simple QGIS desktop Docker image

### Warning

There are discussions on how to build these images and they are not considered stable.
They are considered as NOT production ready.
2 changes: 1 addition & 1 deletion scripts/build-push-docker.sh
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,5 @@ for TAG in ${TAGS}; do
ALL_TAGS="${ALL_TAGS} --tag qgis/${REPO}:${TAG}"
done

docker buildx build --push --platform linux/amd64,linux/arm64 --build-arg ubuntu_dist=${UBUNTU_DIST} --build-arg repo=${QGIS_UBUNTU_PPA} ${ALL_TAGS} -f ${QGIS_TYPE}.Dockerfile .
docker buildx build --push --platform linux/amd64,linux/arm64 --build-arg ubuntu_dist=${UBUNTU_DIST} --build-arg repo=${QGIS_UBUNTU_PPA} ${ALL_TAGS} -f ${QGIS_TYPE}/Dockerfile .

2 changes: 1 addition & 1 deletion server.Dockerfile → server/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ RUN apt update && apt install -y gnupg wget software-properties-common && \
# This part is kept to allow the container to be used in
# standalone mode, without composing it with 'nginx'
ADD conf/qgis-server-nginx.conf /etc/nginx/nginx.conf
ADD start-xvfb-nginx.sh /usr/local/bin/start-xvfb-nginx.sh
ADD ../start-xvfb-nginx.sh /usr/local/bin/start-xvfb-nginx.sh

ENV QGIS_PREFIX_PATH /usr
ENV QGIS_PLUGINPATH /io/plugins
Expand Down
Loading

0 comments on commit 345163d

Please sign in to comment.