diff --git a/.env.example b/.env.example
index f065fa7..0e19f66 100644
--- a/.env.example
+++ b/.env.example
@@ -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
diff --git a/README.md b/README.md
index 6244f75..147c0e3 100644
--- a/README.md
+++ b/README.md
@@ -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**:
> 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**
> * 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**
> 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**
-> 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.
diff --git a/apache/Dockerfile b/apache/Dockerfile
index a1d962a..bf8bf11 100644
--- a/apache/Dockerfile
+++ b/apache/Dockerfile
@@ -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}
diff --git a/apache/setup/httpd.conf b/apache/setup/httpd.conf
index b5cdc66..351a472 100644
--- a/apache/setup/httpd.conf
+++ b/apache/setup/httpd.conf
@@ -224,18 +224,18 @@ Group www-data
# virtual host being defined.
#
-
- ProxyPass ${APACHE_CKAN_PROXY_PASS}
- ProxyPassReverse ${APACHE_CKAN_PROXY_PASS}
+
+ ProxyPass ${PROXY_CKAN_PROXY_PASS}
+ ProxyPassReverse ${PROXY_CKAN_PROXY_PASS}
-
- ProxyPass ${APACHE_PYCSW_PROXY_PASS}
- ProxyPassReverse ${APACHE_PYCSW_PROXY_PASS}
+
+ ProxyPass ${PROXY_PYCSW_PROXY_PASS}
+ ProxyPassReverse ${PROXY_PYCSW_PROXY_PASS}
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
diff --git a/ckan/Dockerfile b/ckan/Dockerfile
index a571109..4695f5a 100644
--- a/ckan/Dockerfile
+++ b/ckan/Dockerfile
@@ -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
diff --git a/ckan/Dockerfile.dev b/ckan/Dockerfile.dev
index daf1dfd..afff19a 100644
--- a/ckan/Dockerfile.dev
+++ b/ckan/Dockerfile.dev
@@ -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
diff --git a/ckan/Dockerfile.ghcr b/ckan/Dockerfile.ghcr
index 0a442e8..f0cad95 100644
--- a/ckan/Dockerfile.ghcr
+++ b/ckan/Dockerfile.ghcr
@@ -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
diff --git a/ckan/docker-entrypoint.d/00_update_who.sh b/ckan/docker-entrypoint.d/00_update_who.sh
index 11559ef..7b76729 100644
--- a/ckan/docker-entrypoint.d/00_update_who.sh
+++ b/ckan/docker-entrypoint.d/00_update_who.sh
@@ -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; \
- fi
\ No newline at end of file
+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
diff --git a/docker-compose.nginx.yml b/docker-compose.apache.yml
similarity index 75%
rename from docker-compose.nginx.yml
rename to docker-compose.apache.yml
index 68ccd01..f99afdd 100644
--- a/docker-compose.nginx.yml
+++ b/docker-compose.apache.yml
@@ -1,4 +1,3 @@
-# With NGINX and without ckan-pycsw
version: "3"
volumes:
@@ -7,11 +6,11 @@ volumes:
solr_data:
services:
-
- nginx:
- container_name: ${NGINX_CONTAINER_NAME}
+
+ apache:
+ container_name: ${APACHE_CONTAINER_NAME}
build:
- context: nginx/
+ context: apache/
dockerfile: Dockerfile
env_file:
- .env
@@ -24,9 +23,9 @@ 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}
build:
@@ -52,8 +51,32 @@ 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}
build:
@@ -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"]
diff --git a/docker-compose.ghcr.yml b/docker-compose.ghcr.yml
index 97c9176..ff71e00 100644
--- a/docker-compose.ghcr.yml
+++ b/docker-compose.ghcr.yml
@@ -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,9 +22,9 @@ 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}
build:
@@ -76,7 +75,7 @@ services:
restart: on-failure:3
healthcheck:
test: ["CMD", "wget", "-qO", "/dev/null", "http://localhost:${PYCSW_PORT}"]
-
+
db:
container_name: ${POSTGRESQL_CONTAINER_NAME}
build:
diff --git a/docker-compose.yml b/docker-compose.yml
index f99afdd..aafe87a 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -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,9 +22,9 @@ 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}
build:
@@ -76,7 +75,7 @@ services:
restart: on-failure:3
healthcheck:
test: ["CMD", "wget", "-qO", "/dev/null", "http://localhost:${PYCSW_PORT}"]
-
+
db:
container_name: ${POSTGRESQL_CONTAINER_NAME}
build:
diff --git a/nginx/Dockerfile b/nginx/Dockerfile
index b7b6abc..66b5fc6 100644
--- a/nginx/Dockerfile
+++ b/nginx/Dockerfile
@@ -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/
diff --git a/nginx/setup/ckan-local.crt b/nginx/setup/ckan-local.crt
index 745f95d..5ebeb69 100644
--- a/nginx/setup/ckan-local.crt
+++ b/nginx/setup/ckan-local.crt
@@ -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-----
diff --git a/nginx/setup/ckan-local.key b/nginx/setup/ckan-local.key
index a558d42..4915970 100644
--- a/nginx/setup/ckan-local.key
+++ b/nginx/setup/ckan-local.key
@@ -1,52 +1,52 @@
-----BEGIN PRIVATE KEY-----
-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
-E0CmRHNQumr+KBM8UT4YtWA+recgbtA=
+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
+iycJUgmdCcBC+PcCS7b6jI+Rp29QaKw=
-----END PRIVATE KEY-----
diff --git a/nginx/setup/default.conf b/nginx/setup/default.conf.template
similarity index 52%
rename from nginx/setup/default.conf
rename to nginx/setup/default.conf.template
index 17e9cc1..1bdd8a4 100644
--- a/nginx/setup/default.conf
+++ b/nginx/setup/default.conf.template
@@ -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;
diff --git a/samples/.env.apache.example b/samples/.env.apache.example
new file mode 100644
index 0000000..b87aa55
--- /dev/null
+++ b/samples/.env.apache.example
@@ -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. IDEE, bajo CC BY 3.0.'
+
+# 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
\ No newline at end of file
diff --git a/samples/.env.localhost b/samples/.env.localhost
index 6468996..e2e6421 100644
--- a/samples/.env.localhost
+++ b/samples/.env.localhost
@@ -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