Merge pull request #59 from mjanez/fix/nginx-multilocations

Fix/nginx multilocations
This commit is contained in:
mjanez 2023-07-26 22:23:14 +02:00 committed by GitHub
commit ab4b99133b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 375 additions and 183 deletions

View File

@ -32,15 +32,18 @@ TEST_CKAN_REDIS_URL=redis://redis:6379/1
# NGINX
NGINX_PORT=80
NGINX_SSLPORT=443
NGINX_LOG_DIR=/var/log/nginx
# Apache HTTP Server
APACHE_VERSION=2.4-alpine
APACHE_PORT=80
APACHE_LOG_DIR=/var/log/apache
APACHE_SERVER_NAME=localhost
# Check CKAN__ROOT_PATH and CKANEXT__DCAT__BASE_URI. If you don't need to use domain locations, it is better to use the nginx configuration. Leave blank or use the root `/`.
APACHE_CKAN_LOCATION=/catalog
APACHE_PYCSW_LOCATION=/csw
#NIGNX/APACHE
## Check CKAN__ROOT_PATH and CKANEXT__DCAT__BASE_URI. If you don't need to use domain locations, it is better to use the nginx configuration. Leave blank or use the root `/`.
PROXY_SERVER_NAME=localhost
PROXY_CKAN_LOCATION=/catalog
PROXY_PYCSW_LOCATION=/csw
# pycsw
PYCSW_PORT=8000
@ -76,7 +79,7 @@ TEST_CKAN_DATASTORE_READ_URL=postgresql://datastore_ro:datastore@db/datastore_te
## If use docker-compose.ghcr.yml only "*.*.*" versions available in: https://github.com/mjanez/ckan-docker/pkgs/container/ckan-spatial
CKAN_VERSION=2.9.9
CKAN_SITE_ID=default
# CKAN_SITE_URL = http:/ or https:/ + APACHE_SERVER_NAME. Optionally the APACHE_HOST_PORT if different from 80
# CKAN_SITE_URL = http:/ or https:/ + PROXY_SERVER_NAME. Optionally the APACHE_HOST_PORT if different from 80
CKAN_SITE_URL=http://localhost
CKAN__ROOT_PATH=/catalog/{{LANG}}
CKAN_PORT=5000

View File

@ -40,26 +40,25 @@ The non-CKAN images are as follows:
* PostgreSQL: [Custom image](/postgresql/Dockerfile) based on official PostgreSQL image. Database files are stored in a named volume.
* Solr: CKAN's [pre-configured Solr image](https://github.com/ckan/ckan-solr). The index data is stored in a named volume and has a spatial schema. [^2]
* Redis: standard Redis image
* Apache HTTP Server: [Custom image](/apache/Dockerfile) based on official latest stable httpd image. Configured to serve multiple routes for the [ckan-pycsw](#ckan-pycsw) CSW endpoint (`{CKAN_SITE_URL}/csw`) and CKAN (`{CKAN_SITE_URL}/catalog`).
* NGINX: latest stable nginx image that includes SSL and Non-SSL endpoints.
* ckan-pycsw: [Custom image](/ckan-pycsw/Dockerfile) based on [pycsw CKAN harvester ISO19139](https://github.com/mjanez/ckan-pycsw) for INSPIRE Metadata CSW Endpoint.
Optional HTTP Endpoint ([`docker-compose.nginx.yml`](/docker-compose.nginx.yml)):
* `docker-compose.nginx.yml`:
* NGINX: latest stable nginx image that includes SSL and Non-SSL endpoints instead of Apache HTTP Server. No locations, no ckan-pycsw, only CKAN.
Optional HTTP Endpoint ([`docker-compose.apache.yml`](/docker-compose.apache.yml)):
* `docker-compose.apache.yml`:
* Apache HTTP Server: [Custom image](/apache/Dockerfile) based on official latest stable httpd image. Configured to serve multiple routes for the [ckan-pycsw](#ckan-pycsw) CSW endpoint (`{CKAN_SITE_URL}/csw`) and CKAN (`{CKAN_SITE_URL}/catalog`). Only HTTP.
| Compose files | Repository | Type | Docker tag | Size | Notes |
| --- | --- | --- | --- | --- | --- |
| [`docker-compose.yml`](/docker-compose.yml) / [`docker-compose.nginx.yml`](/docker-cospatianginx.yml) | CKAN 2.9.8 | custom image | [`mjanez/ckan-spatial:ckan-2.9.8`](https://github.com/mjanez/ckan-docker/pkgs/container/ckan-spatial) | 800 MB | Custom Dockerfile: [`ckan/Dockerfile`](/ckan/Dockerfile) |
| [`docker-compose.yml`](/docker-compose.yml) / [`docker-compose.nginx.yml`](/docker-compose.nginx.yml) | PostgreSQL 15.2 | base image | [`postgres/postgres:15-alpine`](https://hub.docker.com/layers/library/postgres/15-alpine/images/sha256-53a02ecbe9d18ff6476e6651c34811da39f054424c725fc15d2b480fc3fab877?context=explore) | 89.74 MB | Custom Dockerfile: [`postgresql/Dockerfile`](/postgresql/Dockerfile) |
| [`docker-compose.yml`](/docker-compose.yml) / [`docker-compose.nginx.yml`](/docker-compose.nginx.yml) | Solr 8.11.1 | custom image | [`ckan/ckan-solr:2.9-solr8-spatial`](https://registry.hub.docker.com/layers/ckan/ckan-solr/2.9-solr8-spatial/images/sha256-b5ee4979891c7dd1f10d2ac2cbdd4d80ff656879edb0f0493616be7b4cf8bc3a?context=explore) | 331.1 MB | CKAN's [pre-configured spatial Solr image](https://github.com/ckan/ckan-solr). |
| [`docker-compose.yml`](/docker-compose.yml) / [`docker-compose.nginx.yml`](/docker-compose.nginx.yml) | Redis 7.0.10 | base image | [`redis/redis:7-alpine`](https://hub.docker.com/layers/library/redis/7-alpine/images/sha256-98f4ea44e912d0941d29015a4e2448151b94411109c896b5627d94d79306eea7?context=explore) | 11.82 MB | - |
| [`docker-compose.yml`](/docker-compose.yml) / [`docker-compose.apache.yml`](/docker-compose.apache.yml) | CKAN 2.9.8 | custom image | [`mjanez/ckan-spatial:ckan-2.9.8`](https://github.com/mjanez/ckan-docker/pkgs/container/ckan-spatial) | 800 MB | Custom Dockerfile: [`ckan/Dockerfile`](/ckan/Dockerfile) |
| [`docker-compose.yml`](/docker-compose.yml) / [`docker-compose.apache.yml`](/docker-compose.apache.yml) | PostgreSQL 15.2 | base image | [`postgres/postgres:15-alpine`](https://hub.docker.com/layers/library/postgres/15-alpine/images/sha256-53a02ecbe9d18ff6476e6651c34811da39f054424c725fc15d2b480fc3fab877?context=explore) | 89.74 MB | Custom Dockerfile: [`postgresql/Dockerfile`](/postgresql/Dockerfile) |
| [`docker-compose.yml`](/docker-compose.yml) / [`docker-compose.apache.yml`](/docker-compose.apache.yml) | Solr 8.11.1 | custom image | [`ckan/ckan-solr:2.9-solr8-spatial`](https://registry.hub.docker.com/layers/ckan/ckan-solr/2.9-solr8-spatial/images/sha256-b5ee4979891c7dd1f10d2ac2cbdd4d80ff656879edb0f0493616be7b4cf8bc3a?context=explore) | 331.1 MB | CKAN's [pre-configured spatial Solr image](https://github.com/ckan/ckan-solr). |
| [`docker-compose.yml`](/docker-compose.yml) / [`docker-compose.apache.yml`](/docker-compose.apache.yml) | Redis 7.0.10 | base image | [`redis/redis:7-alpine`](https://hub.docker.com/layers/library/redis/7-alpine/images/sha256-98f4ea44e912d0941d29015a4e2448151b94411109c896b5627d94d79306eea7?context=explore) | 11.82 MB | - |
| [`docker-compose.yml`](/docker-compose.yml) | Apache HTTP Server 2.4 | custom image | [`httpd/httpd:2.4`](https://hub.docker.com/layers/library/httpd/2.4/images/sha256-f34e8e25ee18da020633ef0b2bf7516d8cfdad5c5c4b0595d36e5cd78a098101?context=explore) | 54.47 MB | Custom Dockerfile: [`apache/Dockerfile`](/apache/Dockerfile) |
| [`docker-compose.yml`](/docker-compose.yml)| pycsw CKAN harvester ISO19139 | custom image | [`mjanez/ckan-pycsw:latest`](https://github.com/mjanez/ckan-pycsw/pkgs/container/ckan-pycsw) | 175 MB | Custom Dockerfile: [`ckan-pycsw/Dockerfile`](/ckan-pycsw/Dockerfile) |
| [`docker-compose.nginx.yml`](/docker-compose.nginx.yml) | NGINX 1.22.1 | base image | [`nginx:stable-alpine`](https://hub.docker.com/layers/library/nginx/stable-alpine/images/sha256-ff2a5d557ca22fa93669f5e70cfbeefda32b98f8fd3d33b38028c582d700f93a?context=explore) | 9.74 MB | No routing, only CKAN. Custom Dockerfile: [`nginx/Dockerfile`](/nginx/Dockerfile) |
| [`docker-compose.apache.yml`](/docker-compose.apache.yml) | NGINX 1.22.1 | base image | [`nginx:stable-alpine`](https://hub.docker.com/layers/library/nginx/stable-alpine/images/sha256-ff2a5d557ca22fa93669f5e70cfbeefda32b98f8fd3d33b38028c582d700f93a?context=explore) | 9.74 MB | No routing, only CKAN. Custom Dockerfile: [`nginx/Dockerfile`](/nginx/Dockerfile) |
The site is configured using environment variables that you can set in the `.env` file for an Apache HTTP Server and ckan-pycsw deployment (default `.env.example`), or replace it with the [`.env.nginx.example`](/samples/.env.nginx.example) for a NGINX and CKAN-only deployment using the Docker Compose file: [`docker-compose.nginx.yml`](/docker-compose.nginx.yml).
The site is configured using environment variables that you can set in the `.env` file for an NGINX and ckan-pycsw deployment (default `.env.example`), or replace it with the [`.env.apache.example`](/samples/.env.apache.example) for a Apache HTTP Server deployment using the Docker Compose file: [`docker-compose.apache.yml`](/docker-compose.apache.yml).
### ckan-docker roadmap
@ -118,9 +117,9 @@ Use this if you are a maintainer and will not be making code changes to CKAN or
cp .env.example .env
```
- **Apache HTTP Server & CKAN/ckan-pycsw endpoints**: Modifiy the variables about the site URL or locations (`CKAN_SITE_URL` `CKAN_URL`, `PYCSW_URL`, `CKANEXT__DCAT__BASE_URI`, `APACHE_SERVER_NAME`, `APACHE_CKAN_LOCATION`, `APACHE_PYCSW_LOCATION`, etc.).
- **NGINX & CKAN/ckan-pycsw endpoints**: Modifiy the variables about the site URL or locations (`CKAN_SITE_URL` `CKAN_URL`, `PYCSW_URL`, `CKANEXT__DCAT__BASE_URI`, `PROXY_SERVER_NAME`, `PROXY_CKAN_LOCATION`, `PROXY_PYCSW_LOCATION`, etc.).
- **NGINX only CKAN**: Replace the [`.env`](/.env) with the [`/samples/.env.nginx.example`](/samples/.env.nginx.example) and modify the variables as needed.
- **Apache HTTP Server**: Replace the [`.env`](/.env) with the [`/samples/.env.apache.example`](/samples/.env.apache.example) and modify the variables as needed.
>**Note**:<br>
> Please note that when accessing CKAN directly (via a browser) ie: not going through Apache/NGINX you will need to make sure you have "ckan" set up to be an alias to localhost in the local hosts file. Either that or you will need to change the `.env` entry for `CKAN_SITE_URL`
@ -149,7 +148,7 @@ window for something else.
>**Note**<br>
> * Or `docker compose up --build` to build & up the containers.
> * Or `docker compose -f docker-compose.nginx.yml up -d --build` to use the NGINX version.
> * Or `docker compose -f docker-compose.apache.yml up -d --build` to use the Apache HTTP Server version.
>**Note**<br>
> Learn more about configuring this ckan docker:
@ -158,11 +157,11 @@ window for something else.
At the end of the container start sequence there should be 6 containers running (or 5 if use NGINX Docker Compose file)
After this step, CKAN should be running at {`APACHE_SERVER_NAME`}{`APACHE_CKAN_LOCATION`} and ckan-pycsw at {`APACHE_SERVER_NAME`}{`APACHE_PYCSW_LOCATION`}, i.e: http://localhost/catalog or http://localhost/csw
After this step, CKAN should be running at {`PROXY_SERVER_NAME`}{`PROXY_CKAN_LOCATION`} and ckan-pycsw at {`PROXY_SERVER_NAME`}{`PROXY_PYCSW_LOCATION`}, i.e: http://localhost/catalog or http://localhost/csw
|CONTAINER ID |IMAGE |COMMAND|CREATED|STATUS|PORTS|NAMES|
|------------|----------------------------------|--------------------|-------|-------|------|-----|
|0217537f717e|ckan-docker-apache |/docker-entrypoint.…|6 minutes ago |Up 4 minutes|80/tcp,0.0.0.0:80->80/tcp | apache |
|0217537f717e|ckan-docker-nginx |/docker-entrypoint.…|6 minutes ago |Up 4 minutes|80/tcp,0.0.0.0:80->80/tcp,0.0.0.0:8443->443/tcp | nginx |
|7b06ab2e060a|ckan-docker-ckan|/srv/app/start_ckan…|6 minutes ago |Up 5 minutes (healthy)|0.0.0.0:5000->5000/tcp|ckan | |
|1b8d9789c29a|redis:7-alpine |docker-entrypoint.s…|6 minutes ago |Up 4 minutes (healthy)|6379/tcp |redis | |
|7f162741254d|ckan/ckan-solr:2.9-solr8-spatial |docker-entrypoint.s…|6 minutes ago |Up 4 minutes (healthy)|8983/tcp |solr | |
@ -345,36 +344,51 @@ command: `python -m pdb /usr/lib/ckan/venv/bin/ckan --config /srv/app/ckan.ini r
The Datastore database and user is created as part of the entrypoint scripts for the db container.
### Apache HTTP Server
The default Docker Compose configuration ([`docker-compose.yml`](/docker-compose.yml)) uses an httpd image as the front-end. It has two routes for the ckan (default location: `/catalog`) and ckan-pycsw (default location: `/csw`) services.
Both web locations can be modified in the `.env` file:
```ini
...
# Apache HTTP Server
APACHE_VERSION=2.4
APACHE_PORT=80
APACHE_LOG_DIR=/var/log/apache
APACHE_SERVER_NAME=mjanez-cautious-lamp-4pjq9vpg967hq447-80.preview.app.github.dev
# Check CKAN__ROOT_PATH and CKANEXT__DCAT__BASE_URI. If you don't need to use domain locations, it is better to use the nginx configuration. Leave blank or use the root `/`.
APACHE_CKAN_LOCATION=/catalog
APACHE_PYCSW_LOCATION=/csw
...
```
### NGINX
>**Warning**<br>
> The [nginx docker compose file](/docker-compose.nginx.yml) only deploys the CKAN service, not ckan-pycsw.
The default Docker Compose configuration ([`docker-compose.yml`](/docker-compose.yml)) uses an NGINX image as the front-end (ie: reverse proxy). It includes HTTPS running on port number 8443 and an HTTP port (81). A "self-signed" SSL certificate is generated beforehand and the server certificate and key files are included. The NGINX `server_name` (ENV: `PROXY_SERVER_NAME`) directive and the `CN` field in the SSL certificate have been both set to 'localhost'. This should obviously not be used for production.
The nginx Docker Compose configuration ([`docker-compose.nginx.yml`](/docker-compose.nginx.yml)) uses an NGINX image as the front-end (ie: reverse proxy). It includes HTTPS running on port number 8443 and an HTTP port (81). A "self-signed" SSL certificate is generated beforehand and the server certificate and key files are included. The NGINX `server_name` directive and the `CN` field in the SSL certificate have been both set to 'localhost'. This should obviously not be used for production.
The proxy locations, ports and other NGINX options can be modified in the `.env` file:
```ini
# Host Ports
NGINX_PORT_HOST=81
NGINX_SSLPORT_HOST=8443
# NGINX
NGINX_PORT=80
NGINX_SSLPORT=443
NGINX_LOG_DIR=/var/log/nginx
# Check CKAN__ROOT_PATH and CKANEXT__DCAT__BASE_URI. If you don't need to use domain locations, it is better to use the nginx configuration. Leave blank or use the root `/`.
PROXY_SERVER_NAME=192.168.68.106
PROXY_CKAN_LOCATION=/catalog
PROXY_PYCSW_LOCATION=/csw
```
Creating the SSL cert and key files as follows:
`openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=DE/ST=Berlin/L=Berlin/O=None/CN=localhost" -keyout ckan-local.key -out ckan-local.crt`
The `ckan-local.*` files will then need to be moved into the nginx/setup/ directory
### Apache HTTP Server
The Docker Compose configuration ([`docker-compose.apache.yml`](/docker-compose.apache.yml)) uses an httpd image as the front-end. It has two routes for the ckan (default location: `/catalog`) and ckan-pycsw (default location: `/csw`) services.
The proxy locations, ports and other Apache Web Server options can be modified in the `.env` file:
```ini
# Host Ports
APACHE_PORT_HOST=81
# Apache HTTP Server
APACHE_VERSION=2.4-alpine
APACHE_PORT=80
APACHE_LOG_DIR=/var/log/apache
# Check CKAN__ROOT_PATH and CKANEXT__DCAT__BASE_URI. If you don't need to use domain locations, it is better to use the nginx configuration. Leave blank or use the root `/`.
PROXY_SERVER_NAME=192.168.68.106
PROXY_CKAN_LOCATION=/catalog
PROXY_PYCSW_LOCATION=/csw
```
### envvars
The ckanext-envvars extension is used in the CKAN Docker base repo to build the base images.
This extension checks for environmental variables conforming to an expected format and updates the corresponding CKAN config settings with its value.

View File

@ -8,12 +8,12 @@ ENV APACHE_PORT=80
ENV APACHE_LOG_DIR=/var/log/apache
ENV APACHE_ROOT=/usr/local/apache2
ENV APACHE_DOCUMENT_ROOT=${APACHE_ROOT}/htdocs
ENV APACHE_SERVER_NAME=localhost
ENV PROXY_SERVER_NAME=localhost
ENV APACHE_CKAN_LOCATION=/
ENV APACHE_PYCSW_LOCATION=/csw
ENV APACHE_PYCSW_PROXY_PASS=http://${PYCSW_CONTAINER_NAME}:${PYCSW_PORT_HOST}
ENV APACHE_CKAN_PROXY_PASS=http://${CKAN_CONTAINER_NAME}:${CKAN_PORT_HOST}
ENV PROXY_CKAN_LOCATION=/catalog
ENV PROXY_PYCSW_LOCATION=/csw
ENV PROXY_PYCSW_PROXY_PASS=http://${PYCSW_CONTAINER_NAME}:${PYCSW_PORT_HOST}
ENV PROXY_CKAN_PROXY_PASS=http://${CKAN_CONTAINER_NAME}:${CKAN_PORT_HOST}
RUN mkdir -p ${APACHE_LOG_DIR}

View File

@ -224,18 +224,18 @@ Group www-data
# virtual host being defined.
#
<VirtualHost *:${APACHE_PORT}>
<Location ${APACHE_CKAN_LOCATION}>
ProxyPass ${APACHE_CKAN_PROXY_PASS}
ProxyPassReverse ${APACHE_CKAN_PROXY_PASS}
<Location ${PROXY_CKAN_LOCATION}>
ProxyPass ${PROXY_CKAN_PROXY_PASS}
ProxyPassReverse ${PROXY_CKAN_PROXY_PASS}
</Location>
<Location ${APACHE_PYCSW_LOCATION}>
ProxyPass ${APACHE_PYCSW_PROXY_PASS}
ProxyPassReverse ${APACHE_PYCSW_PROXY_PASS}
<Location ${PROXY_PYCSW_LOCATION}>
ProxyPass ${PROXY_PYCSW_PROXY_PASS}
ProxyPassReverse ${PROXY_PYCSW_PROXY_PASS}
</Location>
Protocols h2 http/1.1
ServerName ${APACHE_SERVER_NAME}
ServerName ${PROXY_SERVER_NAME}
ServerAdmin webmaster@localhost
DocumentRoot ${APACHE_DOCUMENT_ROOT}
ErrorLog ${APACHE_LOG_DIR}/error.log

View File

@ -52,7 +52,7 @@ RUN echo ${TZ} > /etc/timezone && \
# Used to configure the container environment by setting environment variables, creating users, running initialization scripts, .etc
COPY docker-entrypoint.d/* /docker-entrypoint.d/
# Update who.ini with APACHE_CKAN_LOCATION
# Update who.ini with PROXY_CKAN_LOCATION
COPY setup/who.ini ${APP_DIR}/
# Apply any patches needed to CKAN core

View File

@ -48,7 +48,7 @@ RUN echo ${TZ} > /etc/timezone && \
# Used to configure the container environment by setting environment variables, creating users, running initialization scripts, .etc
COPY docker-entrypoint.d/* /docker-entrypoint.d/
# Update who.ini with APACHE_CKAN_LOCATION
# Update who.ini with PROXY_CKAN_LOCATION
COPY setup/who.ini ${APP_DIR}/
# Override start_ckan.sh with DEV sh

View File

@ -13,7 +13,7 @@ RUN if ! [ /usr/share/zoneinfo/${TZ} -ef /etc/localtime ]; then \
# Used to configure the container environment by setting environment variables, creating users, running initialization scripts, .etc
COPY docker-entrypoint.d/* /docker-entrypoint.d/
# Update who.ini with APACHE_CKAN_LOCATION
# Update who.ini with PROXY_CKAN_LOCATION
COPY setup/who.ini ${APP_DIR}/
# Apply any patches needed to CKAN core

View File

@ -1,9 +1,15 @@
#!/bin/bash
# Update who.ini when exists APACHE_CKAN_LOCATION
# Update who.ini when exists PROXY_CKAN_LOCATION
echo "Update who.ini"
if [ -n "$APACHE_CKAN_LOCATION" ] && [ "$APACHE_CKAN_LOCATION" != "/" ]; then \
sed -i "s|\${WHO_LOCATION}|$APACHE_CKAN_LOCATION|g" ${APP_DIR}/who.ini; \
else \
sed -i "s|\${WHO_LOCATION}|/|g" ${APP_DIR}/who.ini; \
if [ -n "$PROXY_CKAN_LOCATION" ] && [ "$PROXY_CKAN_LOCATION" != "/" ]; then
sed -i "s|\${WHO_LOCATION}|$PROXY_CKAN_LOCATION|g" "${APP_DIR}/who.ini";
else
# Check if the value is exactly "/"
if [ "$PROXY_CKAN_LOCATION" = "/" ]; then
sed -i "s|\${WHO_LOCATION}||g" "${APP_DIR}/who.ini";
else
# Handle the case when $PROXY_CKAN_LOCATION is empty or not set
sed -i "s|\${WHO_LOCATION}|/|g" "${APP_DIR}/who.ini";
fi
fi

View File

@ -1,4 +1,3 @@
# With NGINX and without ckan-pycsw
version: "3"
volumes:
@ -8,10 +7,10 @@ volumes:
services:
nginx:
container_name: ${NGINX_CONTAINER_NAME}
apache:
container_name: ${APACHE_CONTAINER_NAME}
build:
context: nginx/
context: apache/
dockerfile: Dockerfile
env_file:
- .env
@ -24,8 +23,8 @@ services:
ckan:
condition: service_healthy
ports:
- "0.0.0.0:${NGINX_PORT_HOST}:${NGINX_PORT}"
- "0.0.0.0:${NGINX_SSLPORT_HOST}:${NGINX_SSLPORT}"
- "0.0.0.0:${APACHE_PORT_HOST}:${APACHE_PORT}"
restart: on-failure:3
ckan:
container_name: ${CKAN_CONTAINER_NAME}
@ -52,7 +51,31 @@ services:
- ckan_storage:/var/lib/ckan
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "-qO", "/dev/null", "http://localhost:5000"]
test: ["CMD", "wget", "-qO", "/dev/null", "http://localhost:${CKAN_PORT}"]
pycsw:
container_name: ${PYCSW_CONTAINER_NAME}
build:
context: ckan-pycsw/
dockerfile: Dockerfile
env_file:
- .env
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "10"
depends_on:
ckan:
condition: service_healthy
ports:
- "0.0.0.0:${PYCSW_PORT_HOST}:${PYCSW_PORT}"
volumes:
- ./log:${APP_DIR}/log
- ./metadata:${APP_DIR}/metadata
restart: on-failure:3
healthcheck:
test: ["CMD", "wget", "-qO", "/dev/null", "http://localhost:${PYCSW_PORT}"]
db:
container_name: ${POSTGRESQL_CONTAINER_NAME}
@ -65,13 +88,13 @@ services:
- DATASTORE_READONLY_PASSWORD=${DATASTORE_READONLY_PASSWORD}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- PGDATA=/var/lib/postgresql/data/db
volumes:
- pg_data:/var/lib/postgresql/data
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "10"
volumes:
- pg_data:/var/lib/postgresql/data
restart: unless-stopped
healthcheck:
test: ["CMD", "pg_isready", "-U", "ckan"]

View File

@ -6,11 +6,10 @@ volumes:
solr_data:
services:
apache:
container_name: ${APACHE_CONTAINER_NAME}
nginx:
container_name: ${NGINX_CONTAINER_NAME}
build:
context: apache/
context: nginx/
dockerfile: Dockerfile
env_file:
- .env
@ -23,8 +22,8 @@ services:
ckan:
condition: service_healthy
ports:
- "0.0.0.0:${APACHE_PORT_HOST}:${APACHE_PORT}"
restart: on-failure:3
- "0.0.0.0:${NGINX_PORT_HOST}:${NGINX_PORT}"
- "0.0.0.0:${NGINX_SSLPORT_HOST}:${NGINX_SSLPORT}"
ckan:
container_name: ${CKAN_CONTAINER_NAME}

View File

@ -6,11 +6,10 @@ volumes:
solr_data:
services:
apache:
container_name: ${APACHE_CONTAINER_NAME}
nginx:
container_name: ${NGINX_CONTAINER_NAME}
build:
context: apache/
context: nginx/
dockerfile: Dockerfile
env_file:
- .env
@ -23,8 +22,8 @@ services:
ckan:
condition: service_healthy
ports:
- "0.0.0.0:${APACHE_PORT_HOST}:${APACHE_PORT}"
restart: on-failure:3
- "0.0.0.0:${NGINX_PORT_HOST}:${NGINX_PORT}"
- "0.0.0.0:${NGINX_SSLPORT_HOST}:${NGINX_SSLPORT}"
ckan:
container_name: ${CKAN_CONTAINER_NAME}

View File

@ -1,11 +1,24 @@
FROM nginx:stable-alpine
ENV NGINX_DIR=/etc/nginx
ENV CKAN_PORT_HOST=5000
ENV PYCSW_PORT_HOST=8000
ENV PYCSW_CONTAINER_NAME=pycsw
ENV CKAN_CONTAINER_NAME=ckan
ENV PROXY_SERVER_NAME=localhost
ENV PROXY_CKAN_LOCATION=/catalog
ENV PROXY_PYCSW_LOCATION=/csw
ENV PROXY_PYCSW_PROXY_PASS=http://${PYCSW_CONTAINER_NAME}:${PYCSW_PORT_HOST}
ENV PROXY_CKAN_PROXY_PASS=http://${CKAN_CONTAINER_NAME}:${CKAN_PORT_HOST}
ENV NGINX_PORT=80
ENV NGINX_LOG_DIR=/var/log/nginx
ENV NGINX_DIR=/etc/nginx
RUN mkdir -p ${NGINX_LOG_DIR}
COPY setup/nginx.conf ${NGINX_DIR}/nginx.conf
COPY setup/index.html /usr/share/nginx/html/index.html
COPY setup/default.conf ${NGINX_DIR}/conf.d/
COPY setup/default.conf.template ${NGINX_DIR}/templates/default.conf.templateç
RUN mkdir -p ${NGINX_DIR}/certs
COPY setup/ckan-local.* ${NGINX_DIR}/certs/

View File

@ -1,30 +1,32 @@
-----BEGIN CERTIFICATE-----
MIIFIDCCAwgCCQDr3dGZoSvqMDANBgkqhkiG9w0BAQsFADBSMQswCQYDVQQGEwJE
RTEPMA0GA1UECAwGQmVybGluMQ8wDQYDVQQHDAZCZXJsaW4xDTALBgNVBAoMBE5v
bmUxEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0yMzAzMzEwMjM1MjZaFw0yNDAzMzAw
MjM1MjZaMFIxCzAJBgNVBAYTAkRFMQ8wDQYDVQQIDAZCZXJsaW4xDzANBgNVBAcM
BkJlcmxpbjENMAsGA1UECgwETm9uZTESMBAGA1UEAwwJbG9jYWxob3N0MIICIjAN
BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEApej5FEF4lCOAmmUaAr67w6Go2XZO
crV2UoWbJQq+aC688XpSX5MaxBVK7r4MQGvwC0u/5aN50fyGQBWGeiY6/27MbGHA
fimLtGAmHf5ys4FYtD71YYV0ekUMvlTV1flV3gdM3JItlkXR8ukqIb6WlAGv4vS3
31QdoUyd7bGbCMmtDJ2ecnSlO5U0l9Udoqz4+cDPUMWMc1rXw9DfK/mzm+KR3iW+
QdWwbWj+Crd/aBKiofKIscq2svRfcVisxSbPr4ib1iMEAxes3nt2cBYNQe8H2OVh
SHbskKtaVgG5d+X+f/Mo+P6/1wrqY1JBgkegWkpcaz5mlT4tjsiudfmKsRRnKqHP
m5qohWBZxH2MDWX1ggJsziI546a5Y0lkvazql8QUd44X/vrWnx37sCn50Dj8DRAf
xtzNAC4doO+nIS+NC964yr6Ps4NrZE++WP5Ry6VUKhl46JSRkg6vtc27ZRrGn6LS
AmWU/Ob6/9UaPQkWZ3A/iDnkrkBflM6wdaD/EQmb5LLou84dhZCivqEJ6/5TdB3c
8w5muTQY2SLY9JmvECNQpfviD1IdXq7zqeH23L/hgE9i3GrYGWqGc9E3cjNht8Qt
hF7WbRaomzbjH6ChZTtiSEw3wtf6bTLKuJjWCBDbp+GypyfDWrvJI2UFVwtH5QMv
HYvxG4t+u+E6F2MCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAQcFH6iKXcErUuPJv
N+EdDfJh8CTvbqnp7SXOBQ2Q66NhsTZXPrpyOzT3APoeineWhwt7YZF59m02O1Ek
yS2qVEdAI9vDgmRvR6ryRsaEkLvnbhfTsBkN56c2oLTxqHBHooAyBKVIl0rSplW9
EYhZ9t+08QNd/2unEipgTMFUM+JIMMzseKDwrug97tGsCftIPeWddkPchT309Lwr
ECl2JsXX4t67oNR54hqRRvxyriSx/E8BF7rupsnaGNdNPPASoBbGVGEWumUutWMh
PzlkyOgpl5fZ44WqYOBvBeLGGPTkM3uoaySv6GNOAxFsXJfHXCq59TL93LRn4RKs
rik07ZabYa95JFAPUUSzMpplU4RCpE6r+MFceb1WMrDpK/4zoLLeIwmlwiHsrg/6
L0tN1/RLVQwvpxiVqlmETlyDmqFC+McURNU1ZJU2V8efQTWhDVnB7rNVefQsbTLN
5jaWiKMKQxva2Skf1jgVT9JOfYYCRlHpryOp9yIrqQqVxlaaDJz/Jm91Pt4QhCDj
VhSMDYVMFtE/ylMbB1qR3MJBw0xCCG4zdZpUzvFfR6/wQ5FZ4DvXsbYnsxX/JhgV
sTqxkdnhhR0UsxuHyxGWVPPxS+5IZdxVETcjrMVeaK9PAHyBBSI4DQHYIJWoyZ3m
y9oQx2IvfVXpGptadU5EKWM6210=
MIIFjzCCA3egAwIBAgIUc4bBs9H3jrsKXSWH1Qjl4EyujW8wDQYJKoZIhvcNAQEL
BQAwVzELMAkGA1UEBhMCREUxDzANBgNVBAgMBkJlcmxpbjEPMA0GA1UEBwwGQmVy
bGluMQ0wCwYDVQQKDAROb25lMRcwFQYDVQQDDA4xOTIuMTY4LjY4LjEwNjAeFw0y
MzA3MjEwNTE1NDJaFw0yNDA3MjAwNTE1NDJaMFcxCzAJBgNVBAYTAkRFMQ8wDQYD
VQQIDAZCZXJsaW4xDzANBgNVBAcMBkJlcmxpbjENMAsGA1UECgwETm9uZTEXMBUG
A1UEAwwOMTkyLjE2OC42OC4xMDYwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
AoICAQC8gWjhG3g9kyUhPNO/fNk5DT/e+6PNnL8Aapmts5yWGgfSL7aSMgy1TG3b
+NHKzSQFntSq9sYy3UBWFOnRoeIQE6P4Wr3tW5ml6AJxKlEJNOPFqiNaFvpoz8wD
l3Js+nz9z9THOc6X/qgPqxBshvPnNOHiKWj0Z+Vo3yBfOCxXl6ymTwd3t2GcXsbu
auq4rW/oq7DawhLwgZbkiUzgLH5YXs5DytnC9n+P1+H6bCXUOgcWW32RWS/MrojV
cgBoUP60olIl78/qKAyBsSVvHhxAnxJPdHlTn9NnWXhnyjLfslWBH+4KdjivIxcK
xlRNSZLWtU/ogIkyveT9oItfoG32CLIdXp4CS9c6LprYl0ekEbkJk1lS5i1Mlyjz
rsb43i7uBNGkFUeFQddbQGctNoIB3WptrnlQLmUlT2knwkx58+Z4VMtnTx8OpWP6
H72fFwwxpeOR1LGPrWen8IEce4jOoJ5KZWfV3bZVMwLVsJUCJe/Mh9QkrcwikbCt
KuPxqUvHY+jAlYd3Med/cubJVWvAYSA26QP0jhxMwNW6F4GnnmvLkrjP7qWlsDdJ
CZelKdDSDs8NZCby/huyMPSrDLESTtm0Y0bwHOtekET2lp9EnqOCFEpQJe8agUDZ
N7KTUDNW6JZpMR5hba4yJKSRI3Q5JVRhGdJqtccMqhVx+r8rBwIDAQABo1MwUTAd
BgNVHQ4EFgQUhAA9MLeUMwWmq/9VlHzG2igtr1IwHwYDVR0jBBgwFoAUhAA9MLeU
MwWmq/9VlHzG2igtr1IwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
AgEAodM2/ZGMbM1UBMaY1OK4tqjHP/u1a3uQLTSGQaG36+Jbgb0eLZWuYl2ykLHm
OWrzKsNq6K9DEjGYwPw/XMvyBAtAFdztKx+qgeoIw4hRwelgzmIXjEKaPOZLezEg
VgUs1vVImId6h+nR7i2rPoP4jz19Btt82Mw49C76Vu8+UQN5MltXFhSK5hXCc6Z6
W+JlMOKkMhkNYb5MbeZWllQHgF14aNxE5fnB4DxTBndRXNd0Ckg/+FD5HaG74D4N
ess8HhVBpN3DSR6p+h9YFvQUxd0NXD3gRF+Gf+GXUFZY7t246GSUZcmyKE1V295D
ceQ5aP4lwoahrkrJTdgAMoJaccI5YpFKofJJkaBk2izbce36+MWQAcUaOQzpacn4
781dDbmNAwUJv1K6yFeWCQ/S2f8k6bALx3/ZnqwiYJKSMOzKLKbGG1neEBelSr0F
luhndf95tfrNZ7G55gcmiQ82hYKHVtTOAYZob8Hhnvv8dXb7pS1/3dbROEYD1cWT
258xst7JlwVdc39I1qJlHfkXPOaqvCWM9bgd5//ql6M+yYh9CTyzID5v83hRHOqk
5us7MJZhVX5LBGYccyfuxdAjV1sUUyYpfwe6BomSG7bg1r7S53nuyGoMRgWwEhwb
8cq3y8kT2R/G8BSIgD6x/nyu+dOmaRxq9A9dsiixtcnfWPI=
-----END CERTIFICATE-----

View File

@ -1,52 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
E0CmRHNQumr+KBM8UT4YtWA+recgbtA=
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
iycJUgmdCcBC+PcCS7b6jI+Rp29QaKw=
-----END PRIVATE KEY-----

View File

@ -1,19 +1,28 @@
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name localhost;
listen ${NGINX_PORT};
listen [::]:${NGINX_PORT};
listen ${NGINX_SSLPORT} ssl;
listen [::]:${NGINX_SSLPORT} ssl;
server_name ${PROXY_SERVER_NAME};
ssl_certificate /etc/nginx/certs/ckan-local.crt;
ssl_certificate_key /etc/nginx/certs/ckan-local.key;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://ckan:5000/;
location ${PROXY_CKAN_LOCATION} {
proxy_pass ${PROXY_CKAN_PROXY_PASS}/;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_cache_bypass $cookie_auth_tkt;
proxy_no_cache $cookie_auth_tkt;
proxy_cache_valid 30m;
proxy_cache_key $host$scheme$proxy_host$request_uri;
}
location ${PROXY_PYCSW_LOCATION} {
proxy_pass ${PROXY_PYCSW_PROXY_PASS}/;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
#proxy_cache cache;
proxy_cache_bypass $cookie_auth_tkt;
proxy_no_cache $cookie_auth_tkt;
proxy_cache_valid 30m;

124
samples/.env.apache.example Normal file
View File

@ -0,0 +1,124 @@
# Base
APP_DIR=/srv/app
# Container names
NGINX_CONTAINER_NAME=nginx
REDIS_CONTAINER_NAME=redis
POSTGRESQL_CONTAINER_NAME=db
SOLR_CONTAINER_NAME=solr
CKAN_CONTAINER_NAME=ckan
WORKER_CONTAINER_NAME=ckan-worker
# Host Ports
CKAN_PORT_HOST=5000
NGINX_PORT_HOST=80
NGINX_SSLPORT_HOST=8443
# Solr
SOLR_IMAGE_VERSION=2.9-solr8-spatial
SOLR_PORT=8983
CKAN_SOLR_URL=http://solr:${SOLR_PORT}/solr/ckan
TEST_CKAN_SOLR_URL=http://solr:${SOLR_PORT}/solr/ckan
# Redis
REDIS_VERSION=7-alpine
CKAN_REDIS_URL=redis://redis:6379/1
TEST_CKAN_REDIS_URL=redis://redis:6379/1
# NGINX
NGINX_PORT=80
NGINX_SSLPORT=443
# CKAN databases
POSTGRES_USER=ckan
POSTGRES_PASSWORD=ckan
DATASTORE_READONLY_USER=datastore_ro
DATASTORE_READONLY_PASSWORD=datastore
POSTGRES_HOST=db
CKAN_SQLALCHEMY_URL=postgresql://ckan:ckan@db/ckan
CKAN_DATASTORE_WRITE_URL=postgresql://ckan:ckan@db/datastore
CKAN_DATASTORE_READ_URL=postgresql://datastore_ro:datastore@db/datastore
# Test database connections
TEST_CKAN_SQLALCHEMY_URL=postgres://ckan:ckan@db/ckan_test
TEST_CKAN_DATASTORE_WRITE_URL=postgresql://ckan:ckan@db/datastore_test
TEST_CKAN_DATASTORE_READ_URL=postgresql://datastore_ro:datastore@db/datastore_test
# CKAN core
CKAN_VERSION=2.9.9
CKAN_SITE_ID=default
CKAN_SITE_URL=http://localhost:5000
CKAN_PORT=5000
CKAN___BEAKER__SESSION__SECRET=CHANGE_ME
# See https://docs.ckan.org/en/latest/maintaining/configuration.html#api-token-settings
CKAN___API_TOKEN__JWT__ENCODE__SECRET=string:CHANGE_ME
CKAN___API_TOKEN__JWT__DECODE__SECRET=string:CHANGE_ME
CKAN_SYSADMIN_NAME=ckan_admin
CKAN_SYSADMIN_PASSWORD=test1234
CKAN_SYSADMIN_EMAIL=your_email@example.com
CKAN_STORAGE_PATH=/var/lib/ckan
CKAN_SMTP_SERVER=smtp.corporateict.domain:25
CKAN_SMTP_STARTTLS=True
CKAN_SMTP_USER=user
CKAN_SMTP_PASSWORD=pass
CKAN_SMTP_MAIL_FROM=ckan@localhost
TZ=UTC
## Customize which text formats the text_view plugin will show
CKAN__PREVIEW__JSON_FORMATS="json jsonld"
# html htm rdf+xml owl+xml xml n3 n-triples turtle plain atom csv tsv rss txt json
CKAN__PREVIEW__XML_FORMATS="xml rdf rdf+xml owl+xml atom rss turtle ttl n3 n-triples"
CKAN__PREVIEW__TEXT_FORMATS="text plain text/plain text/turtle csv tsv rss txt json"
CKAN__PREVIEW__LOADABLE="html htm rdf+xml owl+xml xml n3 n-triples turtle plain atom csv tsv rss txt json arcgis_rest"
## Resource Proxy settings
### Preview size limit, default: 1MB
CKAN__RESOURCE_PROXY__MAX_FILE_SIZE=50048576
## Size of chunks to read/write__
CKAN__RESOURCE_PROXY__CHUNK_SIZE=4096
## Default timeout for fetching proxied items
CKAN__RESOURCE_PROXY__TIMEOUT=10
CKAN__VIEWS__DEFAULT_VIEWS="image_view webpage_view text_view recline_view wmts_view geojson_view geo_view shp_view pdf_view"
# Localization
CKAN__LOCALE_DEFAULT="en"
CKAN__LOCALE_ORDER="en es pt_BR ja it cs_CZ ca fr el sv sr sr@latin no sk fi ru de pl nl bg ko_KR hu sa sl lv"
# Extensions
CKAN__PLUGINS="envvars stats text_view image_view webpage_view recline_view resourcedictionary datastore xloader harvest ckan_harvester spatial_metadata spatial_query spatial_harvest_metadata_api csw_harvester waf_harvester doc_harvester resource_proxy geo_view geojson_view wmts_view shp_view dcat dcat_rdf_harvester dcat_json_harvester dcat_json_interface scheming_datasets scheming_groups scheming_organizations pdf_view pages"
# ckanext-harvest
CKAN__HARVEST__MQ__TYPE=redis
CKAN__HARVEST__MQ__HOSTNAME=redis
CKAN__HARVEST__MQ__PORT=6379
CKAN__HARVEST__MQ__REDIS_DB=1
# ckanext-xloader
CKANEXT__XLOADER__API_TOKEN=api_token
CKANEXT__XLOADER__JOBS__DB_URI=postgresql://ckan:ckan@db/ckan
# ckanext-dcat
CKANEXT__DCAT__BASE_URI=https://localhost:5000/
CKANEXT__DCAT__RDF_PROFILES="euro_dcat_ap_2 euro_dcat_ap"
# ckanext-scheming: setup_scheming.sh
SCHEMA_CKANEXT_SCHEMING_DATASET_SCHEMA="ckanext.scheming:ckan_geodcatap.yaml"
SCHEMA_CKANEXT_SCHEMING_GROUP_SCHEMAS="ckanext.scheming:ckan_group_geodcatap.json"
SCHEMA_CKANEXT_SCHEMING_ORGANIZATION_SCHEMAS="ckanext.scheming:ckan_org_geodcatap.json"
SCHEMA_CKANEXT_SCHEMING_PRESETS="ckanext.scheming:presets.json"
# ckanext-spatial (Solr Backend - solr8-spatial)
CKANEXT__SPATIAL__SEARCH_BACKEND=solr-bbox
CKAN__SPATIAL__SRID=3857
CKANEXT__SPATIAL__COMMON_MAP__TYPE=custom
CKANEXT__SPATIAL__COMMON_MAP__CUSTOM__URL=https://rts.larioja.org/mapa-base/rioja/{z}/{x}/{y}.png
CKANEXT__SPATIAL__COMMON_MAP__ATTRIBUTION='Servicios de Teselas. <a href="https://www.idee.es/">IDEE</a>, bajo <a href="http://creativecommons.org/licenses/by/3.0">CC BY 3.0</a>.'
# ckanext-geoview
CKANEXT__GEOVIEW__GEOJSON__MAX_FILE_SIZE=100000000
CKANEXT__GEOVIEW__OL_VIEWER__FORMATS="wms wfs geojson gml kml"
CKANEXT__GEOVIEW__SHP_VIEWER__SRID=3857
CKANEXT__GEOVIEW__SHP_VIEWER__ENCODING=UTF-8
#TODO: ckanext-sparql - Not implemented yet
CKANEXT__SPARQL__ENDPOINT_URL=http://dbpedia.org/sparql
CKANEXT__SPARQL__HIDE_ENDPOINT_URL=False

View File

@ -37,10 +37,10 @@ NGINX_SSLPORT=443
APACHE_VERSION=2.4-alpine
APACHE_PORT=80
APACHE_LOG_DIR=/var/log/apache
APACHE_SERVER_NAME=localhost
PROXY_SERVER_NAME=localhost
# Check CKAN__ROOT_PATH and CKANEXT__DCAT__BASE_URI. If you don't need to use domain locations, it is better to use the nginx configuration.
APACHE_CKAN_LOCATION=/catalog
APACHE_PYCSW_LOCATION=/csw
PROXY_CKAN_LOCATION=/catalogcatalog
PROXY_PYCSW_LOCATION=/csw
# pycsw
PYCSW_PORT=8000