├── .gitignore ├── .gitmodules ├── LICENSE ├── README.md ├── api-gateway ├── nginx-example-multitenant.conf └── nginx-example.conf ├── docker-compose-example.yml ├── pg_service.conf ├── scripts └── set_permissions.sh └── volumes ├── attachments └── .gitignore ├── config-in └── default │ ├── config.json │ ├── index.html │ ├── tenantConfig.json │ └── themesConfig.json ├── config ├── README └── default │ ├── adminGuiConfig.json │ ├── dataConfig.json │ ├── dbAuthConfig.json │ ├── documentConfig.json │ ├── elevationConfig.json │ ├── featureInfoConfig.json │ ├── index.html │ ├── legendConfig.json │ ├── mapViewerConfig.json │ ├── mapinfoConfig.json │ ├── ogcConfig.json │ ├── permalinkConfig.json │ ├── permissions.json │ ├── printConfig.json │ └── searchConfig.json ├── demo-data ├── setup-demo-data-permissions.sh └── setup-demo-data.sh ├── info-templates └── qwc_demo │ └── countries.html ├── legends └── qwc_demo │ ├── edit_lines.png │ ├── edit_lines_thumbnail.png │ ├── edit_points.png │ ├── edit_points_thumbnail.png │ ├── edit_polygons.png │ └── edit_polygons_thumbnail.png ├── print-layouts └── a3_landscape.qpt ├── qgs-resources ├── qwc_demo.qgs └── scan │ └── natural-earth-countries.qgs ├── qwc2 ├── assets │ ├── catalog.json │ ├── css │ │ ├── colorschemes.css │ │ └── qwc2.css │ ├── forms │ │ └── autogen │ │ │ └── .gitignore │ ├── help.html │ ├── img │ │ ├── app_icon.png │ │ ├── app_icon_114.png │ │ ├── app_icon_144.png │ │ ├── app_icon_72.png │ │ ├── favicon.ico │ │ ├── genmapthumbs │ │ │ └── .gitignore │ │ ├── logo-mobile.svg │ │ ├── logo.svg │ │ ├── mapthumbs │ │ │ ├── bluemarble.jpg │ │ │ ├── default.jpg │ │ │ ├── mapnik.jpg │ │ │ ├── natural-earth-countries.png │ │ │ └── qwc_demo.jpg │ │ ├── qwc-logo.svg │ │ └── search │ │ │ ├── dataproduct.svg │ │ │ └── feature.svg │ └── templates │ │ └── legendprint.html └── dist │ └── .gitignore ├── reports └── Country.jrxml └── solr ├── configsets └── gdi │ └── conf │ ├── dih_geodata_config.xml │ ├── dih_metadata_config.xml │ ├── lang │ ├── contractions_ca.txt │ ├── contractions_fr.txt │ ├── contractions_ga.txt │ ├── contractions_it.txt │ ├── hyphenations_ga.txt │ ├── stemdict_nl.txt │ ├── stoptags_ja.txt │ └── userdict_ja.txt │ ├── lib │ └── postgresql-42.2.5.jar │ ├── managed-schema │ ├── params.json │ ├── protwords.txt │ ├── solrconfig.xml │ └── synonyms.txt ├── data └── .gitignore └── security.json /.gitignore: -------------------------------------------------------------------------------- 1 | docker-compose.yml 2 | api-gateway/nginx.conf 3 | .env 4 | volumes/config/__capabilities_cache 5 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "volumes/qgis-server-plugins"] 2 | path = volumes/qgis-server-plugins 3 | url = https://github.com/qwc-services/qwc-qgis-server-plugins.git 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Sourcepole AG 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Logo](https://github.com/qwc-services/qwc-docker/blob/master/volumes/qwc2/assets/img/qwc-logo.svg?raw=true) Docker containers for QWC Services 2 | ================================== 3 | 4 | The QWC Services are a collection of microservices enhancing the functionality of the [QGIS Web Client](https://github.com/qgis/qwc2), including: 5 | 6 | - Authentication and permission control 7 | - Editing 8 | - Fulltext search 9 | - Permalinks/bookmarks 10 | - ... 11 | 12 | This repository contains a sample setup for running QWC services with docker. 13 | 14 | Documentation 15 | ------------- 16 | 17 | The documentation is available at [qwc-services.github.io](https://qwc-services.github.io/). 18 | 19 | Quick start 20 | ----------- 21 | 22 | See [qwc-services.github.io/master/QuickStart/](https://qwc-services.github.io/master/QuickStart/). 23 | 24 | Versioning 25 | ---------- 26 | 27 | Since February 2023 a new long-term-support branch of QWC2 and its services has been introduced. The respective Docker images are tagged as `vYYYY.x-lts` (i.e. `v2023.0-lts`). This branch will receive bugfix updates for approximately one year. The sample `docker-compose-example.yml` references these images. 28 | 29 | The latest versions of QWC2 and its services is available as before, tagged as `vYYYY-MM-DD`. 30 | 31 | Health checks for Kubernetes 32 | ---------------------------- 33 | 34 | Health checks are a simple way to let the system know if an instance of the app is working or not working. If an instance of the app is not working, then other services should not access it or send a request to it. Instead, requests should be sent to another instance of the app that is ready, or retried at a later time. The system should also bring the app back to a healthy state. 35 | 36 | ### Readyness: 37 | 38 | Readiness probes are designed to let Kubernetes know when the app is ready to serve traffic. Kubernetes makes sure the readiness probe passes before allowing a service to send traffic to the pod. If a readiness probe starts to fail, Kubernetes stops sending traffic to the pod until it passes. 39 | 40 | **Check is available at: `/ready`** 41 | 42 | Example check: 43 | 44 | * Return ok, if web service is initialized and running 45 | 46 | ### Liveness: 47 | 48 | **Check is available at: `/healthz`** 49 | 50 | Liveness probes let Kubernetes know if the app is alive or dead. If the app is alive, then Kubernetes leaves it alone. If the app is dead, Kubernetes removes the Pod and starts a new one to replace it. 51 | 52 | Example checks: 53 | 54 | * Check database connection (Example service: `qwc-admin-gui`) 55 | * Check if all data files are available and readable (Example service: `qwc-elevation-service`) 56 | 57 | SELinux 58 | ------- 59 | 60 | If you have SELinux enabled, you will need to sandbox certain files and ports to allow the Docker containers access. You can run `sudo scripts/set_permissions.sh QWC_UID QWC_GID` 61 | to do this. Please ensure that the `QWC_UID` and `QWC_GID` in the script match the `SERVICE_UID` and `SERVICE_GID` set in the docker-compose file. 62 | 63 | 64 | Development 65 | ----------- 66 | 67 | Create a QWC services dir: 68 | 69 | mkdir qwc-services 70 | cd qwc-services/ 71 | 72 | Clone the desired service, i.e. the `qwc-config-service`: 73 | 74 | git clone https://github.com/qwc-services/qwc-config-service.git 75 | 76 | Configure `docker-compose.yml` to build a local image: 77 | 78 | qwc-config-service: 79 | # image: docker.io/sourcepole/qwc-config-generator:latest-lts 80 | build: 81 | context: ./qwc-services/qwc-config-generator 82 | ... 83 | -------------------------------------------------------------------------------- /api-gateway/nginx-example-multitenant.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name localhost; 4 | # Increase this if the config-generator returns timeout errors 5 | proxy_read_timeout 90; 6 | # Relevant i.e. for file uploads 7 | client_max_body_size 10M; 8 | 9 | proxy_redirect off; 10 | 11 | # Disables emitting nginx version on error pages and in the “Server” response header field. 12 | # http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens 13 | server_tokens off; 14 | 15 | # tenant1 and tenant2 are sample tenant names 16 | location ~ ^/(?tenant1|tenant2) { 17 | # Extract tenant 18 | proxy_set_header Tenant $t; 19 | # Set headers for original request host 20 | proxy_set_header Host $http_host; 21 | proxy_set_header X-Real-IP $remote_addr; 22 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 23 | proxy_set_header X-Forwarded-Proto $scheme; 24 | 25 | location ~ ^/[^/]+/api/v1/data { 26 | rewrite ^/[^/]+(.+) $1 break; 27 | proxy_pass http://qwc-data-service:9090; 28 | } 29 | 30 | location ~ ^/[^/]+/api/v1/document { 31 | rewrite ^/[^/]+(.+) $1 break; 32 | proxy_pass http://qwc-document-service:9090; 33 | } 34 | 35 | location ~ ^/[^/]+/v1/elevation { 36 | rewrite ^/[^/]+(.+) $1 break; 37 | proxy_pass http://qwc-elevation-service:9090; 38 | } 39 | 40 | location ~ ^/[^/]+/api/v1/featureinfo { 41 | rewrite ^/[^/]+(.+) $1 break; 42 | proxy_pass http://qwc-feature-info-service:9090; 43 | } 44 | 45 | location ~ ^/[^/]+/api/v1/legend { 46 | rewrite ^/[^/]+(.+) $1 break; 47 | proxy_pass http://qwc-legend-service:9090; 48 | } 49 | 50 | location ~ ^/[^/]+/api/v1/mapinfo { 51 | rewrite ^/[^/]+(.+) $1 break; 52 | proxy_pass http://qwc-mapinfo-service:9090; 53 | } 54 | 55 | location ~ ^/[^/]+/api/v1/permalink { 56 | rewrite ^/[^/]+(.+) $1 break; 57 | proxy_pass http://qwc-permalink-service:9090; 58 | } 59 | 60 | location ~ ^/[^/]+/api/v1/print{ 61 | rewrite ^/[^/]+(.+) $1 break; 62 | proxy_pass http://qwc-print-service:9090; 63 | } 64 | 65 | location ~ ^/[^/]+/api/v2/search { 66 | rewrite ^/[^/]+(.+) $1 break; 67 | proxy_pass http://qwc-fulltext-search-service:9090; 68 | } 69 | 70 | location ~ ^/[^/]+/auth { 71 | rewrite ^/[^/]+(.+) $1 break; 72 | proxy_pass http://qwc-auth-service:9090; 73 | } 74 | 75 | location ~ ^/[^/]+/qwc_admin { 76 | rewrite ^/[^/]+(.+) $1 break; 77 | proxy_pass http://qwc-admin-gui:9090; 78 | } 79 | 80 | location ~ ^/[^/]+/ows { 81 | rewrite ^/[^/]+(.+) $1 break; 82 | proxy_pass http://qwc-ogc-service:9090; 83 | } 84 | 85 | # location ~ ^/[^/]+/registration { 86 | # rewrite ^/[^/]+(.+) $1 break; 87 | # proxy_pass http://qwc-registration-gui:9090; 88 | # } 89 | 90 | # Redirect to ensure trailing slash 91 | location ~ ^(/[^/]+)$ { 92 | return 301 $scheme://$http_host$1/; 93 | } 94 | 95 | location ~ ^/[^/]+/ { 96 | rewrite ^/[^/]+(.+) $1 break; 97 | proxy_pass http://qwc-map-viewer:9090; 98 | } 99 | } 100 | 101 | #error_page 404 /404.html; 102 | 103 | # redirect server error pages to the static page /50x.html 104 | # 105 | error_page 500 502 503 504 /50x.html; 106 | location = /50x.html { 107 | root /usr/share/nginx/html; 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /api-gateway/nginx-example.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name localhost; 4 | # Increase this if the config-generator returns timeout errors 5 | proxy_read_timeout 90; 6 | # Relevant i.e. for file uploads 7 | client_max_body_size 10M; 8 | 9 | proxy_redirect off; 10 | proxy_set_header Host $http_host; 11 | proxy_set_header X-Real-IP $remote_addr; 12 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 13 | proxy_set_header X-Forwarded-Proto $scheme; 14 | 15 | # Disables emitting nginx version on error pages and in the “Server” response header field. 16 | # http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens 17 | server_tokens off; 18 | 19 | location /api/v1/data { 20 | proxy_pass http://qwc-data-service:9090; 21 | } 22 | 23 | location /api/v1/document { 24 | proxy_pass http://qwc-document-service:9090; 25 | } 26 | 27 | location /api/v1/elevation { 28 | proxy_pass http://qwc-elevation-service:9090; 29 | } 30 | 31 | location /api/v1/featureinfo { 32 | proxy_pass http://qwc-feature-info-service:9090; 33 | } 34 | 35 | location /api/v1/legend { 36 | proxy_pass http://qwc-legend-service:9090; 37 | } 38 | 39 | location /api/v1/mapinfo/ { 40 | proxy_pass http://qwc-mapinfo-service:9090; 41 | } 42 | 43 | location /api/v1/permalink { 44 | proxy_pass http://qwc-permalink-service:9090; 45 | } 46 | 47 | location /api/v1/print { 48 | proxy_pass http://qwc-print-service:9090; 49 | } 50 | 51 | location /api/v2/search { 52 | proxy_pass http://qwc-fulltext-search-service:9090; 53 | } 54 | 55 | location /qwc_admin { 56 | proxy_pass http://qwc-admin-gui:9090; 57 | } 58 | 59 | location /auth/ { 60 | proxy_pass http://qwc-auth-service:9090; 61 | } 62 | 63 | location /ows { 64 | proxy_pass http://qwc-ogc-service:9090; 65 | } 66 | 67 | # location /registration { 68 | # proxy_pass http://qwc-registration-gui:9090; 69 | # } 70 | 71 | location / { 72 | proxy_pass http://qwc-map-viewer:9090; 73 | } 74 | 75 | #error_page 404 /404.html; 76 | 77 | # redirect server error pages to the static page /50x.html 78 | # 79 | error_page 500 502 503 504 /50x.html; 80 | location = /50x.html { 81 | root /usr/share/nginx/html; 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /docker-compose-example.yml: -------------------------------------------------------------------------------- 1 | version: '3.4' 2 | 3 | x-qwc-service-variables: &qwc-service-variables 4 | JWT_SECRET_KEY: $JWT_SECRET_KEY 5 | JWT_COOKIE_CSRF_PROTECT: 'True' 6 | JWT_COOKIE_SAMESITE: 'Strict' 7 | # Uncomment if the application is exclusively run over HTTPS to ensure cookies are only sent with HTTPS requests 8 | # JWT_COOKIE_SECURE: 'True' 9 | # Set these to override the UID/GID which runs uwsgi. Useful to ensure uwsgi runs under the same user/group 10 | # which owns the shared volumes on host, avoiding the need to change the ownership/permissions of those files/folders. 11 | # SERVICE_UID: 1000 12 | # SERVICE_GID: 1000 13 | # Uncomment this for multi-tenant support, see also api-gateway/nginx-example-multitenant.conf 14 | # TENANT_HEADER: Tenant 15 | 16 | services: 17 | 18 | qwc-postgis: 19 | image: sourcepole/qwc-base-db:16 # 16 refers to the Postgres major version 20 | environment: 21 | POSTGRES_PASSWORD: '' # TODO: Set your postgres password here! 22 | volumes: 23 | - ./volumes/db:/var/lib/postgresql/docker 24 | # NOTE: Remove this line if you don't want/need the demo data 25 | - ./volumes/demo-data/setup-demo-data.sh:/docker-entrypoint-initdb.d/2_setup-demo-data.sh 26 | ports: 27 | - "127.0.0.1:5439:5432" 28 | healthcheck: 29 | test: ["CMD-SHELL", "pg_isready -U postgres"] 30 | interval: 10s 31 | 32 | qwc-config-db-migrate: 33 | image: sourcepole/qwc-base-db-migrate:latest-2025-lts 34 | volumes: 35 | - ./pg_service.conf:/tmp/pg_service.conf:ro 36 | # NOTE: Remove this line if you don't want/need the demo data 37 | - ./volumes/demo-data/setup-demo-data-permissions.sh:/tmp/extra-init.d/setup-demo-data-permissions.sh 38 | 39 | qwc-qgis-server: 40 | image: sourcepole/qwc-qgis-server:3.40 41 | # ports: 42 | # - "127.0.0.1:8001:80" 43 | environment: 44 | # QGIS_SERVER_LOG_LEVEL: 0 45 | # LOCALE: 'de_DE' 46 | # QGIS_SERVER_IGNORE_BAD_LAYERS: 1 47 | FCGID_EXTRA_ENV: 'PRINT_LAYOUT_DIR' 48 | PRINT_LAYOUT_DIR: '/layouts' 49 | volumes: 50 | - ./volumes/qgs-resources:/data:ro 51 | - ./pg_service.conf:/etc/postgresql-common/pg_service.conf:ro 52 | - ./volumes/qgis-server-plugins/print_templates:/usr/share/qgis/python/plugins/print_templates:ro 53 | - ./volumes/qgis-server-plugins/split_categorized:/usr/share/qgis/python/plugins/split_categorized:ro 54 | - ./volumes/qgis-server-plugins/filter_geom:/usr/share/qgis/python/plugins/filter_geom:ro 55 | - ./volumes/qgis-server-plugins/clear_capabilities:/usr/share/qgis/python/plugins/clear_capabilities:ro 56 | - ./volumes/print-layouts:/layouts:ro 57 | 58 | qwc-config-service: 59 | image: sourcepole/qwc-config-generator:latest-2025-lts 60 | environment: 61 | <<: *qwc-service-variables 62 | INPUT_CONFIG_PATH: '/srv/qwc_service/config-in' 63 | OUTPUT_CONFIG_PATH: '/srv/qwc_service/config-out' 64 | GENERATE_DYNAMIC_KVRELS: 1 65 | # ports: 66 | # - "127.0.0.1:5010:9090" 67 | volumes: 68 | - ./volumes/config-in:/srv/qwc_service/config-in:ro 69 | - ./volumes/config:/srv/qwc_service/config-out 70 | - ./volumes/qwc2:/qwc2 71 | - ./volumes/qgs-resources:/data 72 | - ./volumes/print-layouts:/layouts:ro 73 | - ./volumes/reports:/reports 74 | - ./pg_service.conf:/srv/pg_service.conf:ro 75 | 76 | qwc-admin-gui: 77 | image: sourcepole/qwc-admin-gui:latest-2025-lts 78 | environment: 79 | <<: *qwc-service-variables 80 | # Don't enable JWT CSRF protection for admin gui, it conflicts with CSRF protection offered by Flask-WTF 81 | JWT_COOKIE_CSRF_PROTECT: 'False' 82 | # When setting user info fields, make sure to create corresponding columns (i.e. "surname", "first_name", "street", etc) in qwc_config.user_infos 83 | # USER_INFO_FIELDS: '[{"title": "Surname", "name": "surname", "type": "text", "required": true}, {"title": "First name", "name": "first_name", "type": "text", "required": true}, {"title": "Street", "name": "street", "type": "text"}, {"title": "ZIP", "name": "zip", "type": "text"}, {"title": "City", "name": "city", "type": "text"}]' 84 | #TOTP_ENABLED: 'False' 85 | GROUP_REGISTRATION_ENABLED: 'True' 86 | #IDLE_TIMEOUT: 600 87 | DEFAULT_LOCALE: 'en' 88 | MAIL_SUPPRESS_SEND: 'True' 89 | MAIL_DEFAULT_SENDER: 'from@example.com' 90 | volumes: 91 | - ./pg_service.conf:/srv/pg_service.conf:ro 92 | - ./volumes/config:/srv/qwc_service/config:ro 93 | # required by themes plugin: 94 | # - ./volumes/config-in:/srv/qwc_service/config-in:rw 95 | # - ./volumes/qwc2:/qwc2 96 | # - ./volumes/qgs-resources:/qgs-resources 97 | # - ./volumes/info-templates:/info_templates 98 | 99 | qwc-auth-service: 100 | image: sourcepole/qwc-db-auth:latest-2025-lts 101 | environment: 102 | <<: *qwc-service-variables 103 | SERVICE_MOUNTPOINT: '/auth' 104 | # Enable the following in production (requires https): 105 | #JWT_COOKIE_SECURE: 'True' 106 | #TOTP_ENABLED: 'False' 107 | #TOTP_ISSUER_NAME: 'QWC Services' 108 | # MAIL_SUPPRESS_SEND: 'False' 109 | # MAIL_DEFAULT_SENDER: 'info@example.com' 110 | # MAIL_SERVER: 'mail.example.com' 111 | # MAIL_PORT: '465' 112 | # MAIL_USERNAME: 'info@example.com' 113 | # MAIL_PASSWORD: 'password1234' 114 | # MAIL_USE_SSL: 'True' 115 | volumes: 116 | - ./pg_service.conf:/srv/pg_service.conf:ro 117 | - ./volumes/config:/srv/qwc_service/config:ro 118 | 119 | qwc-data-service: 120 | image: sourcepole/qwc-data-service:latest-2025-lts 121 | environment: 122 | <<: *qwc-service-variables 123 | SERVICE_MOUNTPOINT: '/api/v1/data' 124 | ATTACHMENTS_BASE_DIR: '/attachments' 125 | MAX_ATTACHMENT_FILE_SIZE: 1048576 126 | volumes: 127 | - ./volumes/config:/srv/qwc_service/config:ro 128 | - ./volumes/attachments:/attachments 129 | - ./pg_service.conf:/srv/pg_service.conf:ro 130 | # NOTE: you can mount a pg_service-write.conf with R/W DB users and have R/O DB users in the main pg_service.conf 131 | # - ./pg_service-write.conf:/srv/pg_service.conf:ro 132 | 133 | # NOTE: you can use clamav for virus scanning in the data service 134 | # clamav: 135 | # image: clamav/clamav:stable 136 | 137 | qwc-document-service: 138 | image: sourcepole/qwc-document-service:latest-2025-lts 139 | environment: 140 | <<: *qwc-service-variables 141 | SERVICE_MOUNTPOINT: '/api/v1/document' 142 | volumes: 143 | - ./pg_service.conf:/srv/pg_service.conf:ro 144 | - ./volumes/reports:/reports 145 | - ./volumes/reports/fonts:/srv/qwc_service/fonts 146 | - ./volumes/config:/srv/qwc_service/config:ro 147 | 148 | qwc-elevation-service: 149 | image: sourcepole/qwc-elevation-service:latest-2025-lts 150 | environment: 151 | <<: *qwc-service-variables 152 | SERVICE_MOUNTPOINT: '/api/v1/elevation' 153 | volumes: 154 | - ./volumes/config:/srv/qwc_service/config:ro 155 | 156 | qwc-feature-info-service: 157 | image: sourcepole/qwc-feature-info-service:latest-2025-lts 158 | environment: 159 | <<: *qwc-service-variables 160 | SERVICE_MOUNTPOINT: '/api/v1/featureinfo' 161 | volumes: 162 | - ./pg_service.conf:/srv/pg_service.conf:ro 163 | - ./volumes/config:/srv/qwc_service/config:ro 164 | - ./volumes/info-templates:/info_templates:ro 165 | 166 | qwc-fulltext-search-service: 167 | image: sourcepole/qwc-fulltext-search-service:latest-2025-lts 168 | environment: 169 | <<: *qwc-service-variables 170 | SERVICE_MOUNTPOINT: '/api/v2/search' 171 | volumes: 172 | - ./pg_service.conf:/srv/pg_service.conf:ro 173 | - ./volumes/config:/srv/qwc_service/config:ro 174 | 175 | qwc-solr: 176 | image: solr:8.11-slim 177 | entrypoint: 178 | - docker-entrypoint.sh 179 | - solr-precreate 180 | - gdi 181 | - /gdi_conf 182 | ports: 183 | - "127.0.0.1:8983:8983" 184 | volumes: 185 | - ./volumes/solr/configsets/gdi:/gdi_conf:ro 186 | # Configuration is copied once from /gdi_conf/ to /var/solr/data/ 187 | # Change ownership to solr user with `sudo chown 8983:8983 volumes/solr/data` 188 | - ./volumes/solr/data:/var/solr/data 189 | # Protect admin GUI and admin API with Basic auth 190 | # Change "#credentials" to "credentials" in security.json for adding a user 'solr' with password 'SolrRocks' 191 | #- ./volumes/solr/security.json:/var/solr/data/security.json:ro 192 | 193 | qwc-legend-service: 194 | image: sourcepole/qwc-legend-service:latest-2025-lts 195 | environment: 196 | <<: *qwc-service-variables 197 | SERVICE_MOUNTPOINT: '/api/v1/legend' 198 | volumes: 199 | - ./volumes/config:/srv/qwc_service/config:ro 200 | - ./volumes/legends:/legends 201 | 202 | qwc-mapinfo-service: 203 | image: sourcepole/qwc-mapinfo-service:latest-2025-lts 204 | environment: 205 | <<: *qwc-service-variables 206 | SERVICE_MOUNTPOINT: '/api/v1/mapinfo' 207 | volumes: 208 | - ./pg_service.conf:/srv/pg_service.conf:ro 209 | - ./volumes/config:/srv/qwc_service/config:ro 210 | 211 | qwc-map-viewer: 212 | # Stock qwc2 app 213 | image: sourcepole/qwc-map-viewer:latest-2025-lts 214 | # Or with own viewer build placed in volumes/qwc2 215 | # image: sourcepole/qwc-map-viewer-base:latest-2025-lts 216 | environment: 217 | <<: *qwc-service-variables 218 | SERVICE_MOUNTPOINT: '/' 219 | volumes: 220 | - ./pg_service.conf:/srv/pg_service.conf:ro 221 | - ./volumes/config:/srv/qwc_service/config:ro 222 | # When using qwc-map-viewer: 223 | - ./volumes/qwc2/assets:/qwc2/assets:ro 224 | # When using own viewer build with qwc-map-viewer-base: 225 | #- ./volumes/qwc2:/qwc2:ro 226 | 227 | qwc-ogc-service: 228 | image: sourcepole/qwc-ogc-service:latest-2025-lts 229 | environment: 230 | <<: *qwc-service-variables 231 | SERVICE_MOUNTPOINT: '/ows' 232 | volumes: 233 | - ./volumes/config:/srv/qwc_service/config:ro 234 | 235 | qwc-permalink-service: 236 | image: sourcepole/qwc-permalink-service:latest-2025-lts 237 | environment: 238 | <<: *qwc-service-variables 239 | SERVICE_MOUNTPOINT: '/api/v1/permalink' 240 | volumes: 241 | - ./pg_service.conf:/srv/pg_service.conf:ro 242 | - ./volumes/config:/srv/qwc_service/config:ro 243 | 244 | qwc-print-service: 245 | image: sourcepole/qwc-print-service:latest-2025-lts 246 | environment: 247 | <<: *qwc-service-variables 248 | SERVICE_MOUNTPOINT: '/api/v1/print' 249 | volumes: 250 | - ./volumes/config:/srv/qwc_service/config:ro 251 | 252 | # qwc-registration-gui: 253 | # image: sourcepole/qwc-registration-gui:latest-2025-lts 254 | # environment: 255 | # <<: *qwc-service-variables 256 | # SERVICE_MOUNTPOINT: '/registration' 257 | # DEFAULT_LOCALE: 'en' 258 | # ADMIN_RECIPIENTS: 'admin@example.com' 259 | # MAIL_SUPPRESS_SEND: 'True' 260 | # MAIL_DEFAULT_SENDER: 'from@example.com' 261 | # volumes: 262 | # - ./pg_service.conf:/srv/pg_service.conf:ro 263 | 264 | qwc-api-gateway: 265 | image: nginx:1.27 266 | ports: 267 | # NOTE: The port the qwc application runs on. You can choose another port instead of 8088. 268 | - "8088:80" 269 | volumes: 270 | - ./api-gateway/nginx.conf:/etc/nginx/conf.d/default.conf:ro 271 | depends_on: 272 | - qwc-postgis 273 | - qwc-qgis-server 274 | - qwc-config-service 275 | - qwc-admin-gui 276 | - qwc-auth-service 277 | - qwc-data-service 278 | - qwc-document-service 279 | - qwc-elevation-service 280 | - qwc-feature-info-service 281 | - qwc-fulltext-search-service 282 | - qwc-legend-service 283 | - qwc-map-viewer 284 | - qwc-mapinfo-service 285 | - qwc-ogc-service 286 | - qwc-permalink-service 287 | - qwc-print-service 288 | #- qwc-registration-gui 289 | -------------------------------------------------------------------------------- /pg_service.conf: -------------------------------------------------------------------------------- 1 | [qwc_configdb] 2 | host=qwc-postgis 3 | port=5432 4 | dbname=qwc_services 5 | user=qwc_admin 6 | password=qwc_admin 7 | sslmode=disable 8 | 9 | [qwc_geodb] 10 | host=qwc-postgis 11 | port=5432 12 | dbname=qwc_services 13 | user=qwc_service_write 14 | password=qwc_service_write 15 | sslmode=disable 16 | -------------------------------------------------------------------------------- /scripts/set_permissions.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | help() { 4 | echo 'usage: set_permissions.sh QWC_UID QWC_GID' 5 | echo ' set_permissions.sh --help' 6 | echo 7 | echo ' Run this script from the qwc-docker directory to configure' 8 | echo ' permissions for QWC2 Docker containers.' 9 | echo 10 | echo ' SELinux settings will get applied if SELinux tools are present' 11 | echo 12 | echo ' Please make sure that QWC_UID and QWC_GID match match the' 13 | echo ' SERVICE_UID/SERVICE_GID settings defined in docker-compose.yml' 14 | echo ' (qwc-docker sets them to 1000:1000 by default)' 15 | echo 16 | 17 | exit 1 18 | } 19 | 20 | [ "$1" == "--help" ] && help 21 | [ "$1" == "" -o "$2" == "" ] && echo "ERROR: You need to set the QWC_UID QWC_GID parameters" >&2 && exit 2 22 | 23 | if [ "$(whoami)" != "root" ]; then 24 | echo "Please run me as root" 25 | exit 3 26 | fi 27 | 28 | QWC_UID="$1" 29 | QWC_GID="$2" 30 | 31 | # Ignore SIGPIPE to prevent broken pipe errors 32 | trap '' SIGPIPE 33 | 34 | # Check if SELinux tools are available 35 | SELINUX_ENABLED=0 36 | if command -v chcon >/dev/null 2>&1 && command -v semanage >/dev/null 2>&1 && command -v restorecon >/dev/null 2>&1; then 37 | SELINUX_ENABLED=1 38 | echo "SELinux tools detected, applying SELinux contexts." 39 | else 40 | echo "SELinux tools not detected, skipping SELinux commands." 41 | fi 42 | 43 | # Function to run SELinux commands with error handling and debug logging 44 | run_selinux_cmd() { 45 | local cmd="$1" 46 | echo "Running: $cmd" 47 | # Redirect all output to prevent pipe breaks 48 | if ! $cmd > /dev/null 2> /tmp/set_permissions_error.log; then 49 | echo "Error: Failed to execute '$cmd'" 50 | echo "Debug output: $(cat /tmp/set_permissions_error.log)" 51 | exit 1 52 | fi 53 | } 54 | 55 | # below we will set SELinux type to svirt_sandbox_file_t recursively 56 | # for Docker container access. See 57 | # https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_atomic_host/7/html/container_security_guide/docker_selinux_security_policy#docker_selinux_security_policy 58 | 59 | # Configure permissions for the PostgreSQL database volume (qwc-postgis) 60 | if [ $SELINUX_ENABLED -eq 1 ]; then 61 | run_selinux_cmd "chcon -Rt svirt_sandbox_file_t ./volumes/db" 62 | # Add or modify persistent SELinux file context rule for all files in ./volumes/db 63 | if semanage fcontext -l | grep -q "^./volumes/db/.*\s.*svirt_sandbox_file_t\s" > /dev/null 2>&1; then 64 | #echo "Debug: Found context for ./volumes/db/.*" 65 | run_selinux_cmd "semanage fcontext -m -t svirt_sandbox_file_t './volumes/db/.*'" 66 | else 67 | #echo "Debug: No context for ./volumes/db/.*, adding new" 68 | run_selinux_cmd "semanage fcontext -a -t svirt_sandbox_file_t './volumes/db/.*'" 69 | fi 70 | run_selinux_cmd "restorecon -R ./volumes/db" 71 | fi 72 | # Set ownership to the UID that postgres is running under in the qwc-postgis container 73 | chown -R 999:999 ./volumes/db 74 | chmod -R 700 ./volumes/db 75 | 76 | # Configure the NGINX configuration file for the qwc-api-gateway container 77 | if [ $SELINUX_ENABLED -eq 1 ]; then 78 | run_selinux_cmd "chcon -t svirt_sandbox_file_t ./api-gateway/nginx.conf" 79 | # Add or modify persistent SELinux file context rule 80 | if semanage fcontext -l | grep -q "^./api-gateway/nginx.conf\s.*svirt_sandbox_file_t\s" > /dev/null 2>&1; then 81 | #echo "Debug: Found context for ./api-gateway/nginx.conf" 82 | run_selinux_cmd "semanage fcontext -m -t svirt_sandbox_file_t './api-gateway/nginx.conf'" 83 | else 84 | #echo "Debug: No context for ./api-gateway/nginx.conf, adding new" 85 | run_selinux_cmd "semanage fcontext -a -t svirt_sandbox_file_t './api-gateway/nginx.conf'" 86 | fi 87 | run_selinux_cmd "restorecon ./api-gateway/nginx.conf" 88 | fi 89 | 90 | # Configure the configuration volume used by qwc-map-viewer and other services 91 | if [ $SELINUX_ENABLED -eq 1 ]; then 92 | run_selinux_cmd "chcon -Rt svirt_sandbox_file_t ./volumes/config" 93 | # Add or modify persistent SELinux file context rule 94 | if semanage fcontext -l | grep -q "^./volumes/config/.*\s.*svirt_sandbox_file_t\s" > /dev/null 2>&1; then 95 | #echo "Debug: Found context for ./volumes/config/.*" 96 | run_selinux_cmd "semanage fcontext -m -t svirt_sandbox_file_t './volumes/config/.*'" 97 | else 98 | #echo "Debug: No context for ./volumes/config/.*, adding new" 99 | run_selinux_cmd "semanage fcontext -a -t svirt_sandbox_file_t './volumes/config/.*'" 100 | fi 101 | run_selinux_cmd "restorecon -R ./volumes/config" 102 | fi 103 | # services inside the containers are running as $QWC_UID:$QWC_GID 104 | chown -R $QWC_UID:$QWC_GID ./volumes/config 105 | 106 | # Configure the PostgreSQL service configuration file used by multiple services 107 | if [ $SELINUX_ENABLED -eq 1 ]; then 108 | run_selinux_cmd "chcon -t svirt_sandbox_file_t ./pg_service.conf" 109 | # Add or modify persistent SELinux file context rule 110 | if semanage fcontext -l | grep -q "^./pg_service.conf\s.*svirt_sandbox_file_t\s" > /dev/null 2>&1; then 111 | #echo "Debug: Found context for ./pg_service.conf" 112 | run_selinux_cmd "semanage fcontext -m -t svirt_sandbox_file_t './pg_service.conf'" 113 | else 114 | #echo "Debug: No context for ./pg_service.conf, adding new" 115 | run_selinux_cmd "semanage fcontext -a -t svirt_sandbox_file_t './pg_service.conf'" 116 | fi 117 | run_selinux_cmd "restorecon ./pg_service.conf" 118 | fi 119 | 120 | # Configure additional volumes (config-in, qwc2, qgs-resources, attachments) 121 | if [ $SELINUX_ENABLED -eq 1 ]; then 122 | run_selinux_cmd "chcon -Rt svirt_sandbox_file_t ./volumes/config-in ./volumes/qwc2 ./volumes/qgs-resources ./volumes/attachments" 123 | # Add or modify persistent SELinux file context rule 124 | if semanage fcontext -l | grep -q "^./volumes/config-in/.*\s.*svirt_sandbox_file_t\s" > /dev/null 2>&1; then 125 | #echo "Debug: Found context for ./volumes/config-in/.*" 126 | run_selinux_cmd "semanage fcontext -m -t svirt_sandbox_file_t './volumes/config-in/.*'" 127 | else 128 | #echo "Debug: No context for ./volumes/config-in/.*, adding new" 129 | run_selinux_cmd "semanage fcontext -a -t svirt_sandbox_file_t './volumes/config-in/.*'" 130 | fi 131 | if semanage fcontext -l | grep -q "^./volumes/qwc2/.*\s.*svirt_sandbox_file_t\s" > /dev/null 2>&1; then 132 | #echo "Debug: Found context for ./volumes/qwc2/.*" 133 | run_selinux_cmd "semanage fcontext -m -t svirt_sandbox_file_t './volumes/qwc2/.*'" 134 | else 135 | #echo "Debug: No context for ./volumes/qwc2/.*, adding new" 136 | run_selinux_cmd "semanage fcontext -a -t svirt_sandbox_file_t './volumes/qwc2/.*'" 137 | fi 138 | if semanage fcontext -l | grep -q "^./volumes/qgs-resources/.*\s.*svirt_sandbox_file_t\s" > /dev/null 2>&1; then 139 | #echo "Debug: Found context for ./volumes/qgs-resources/.*" 140 | run_selinux_cmd "semanage fcontext -m -t svirt_sandbox_file_t './volumes/qgs-resources/.*'" 141 | else 142 | #echo "Debug: No context for ./volumes/qgs-resources/.*, adding new" 143 | run_selinux_cmd "semanage fcontext -a -t svirt_sandbox_file_t './volumes/qgs-resources/.*'" 144 | fi 145 | if semanage fcontext -l | grep -q "^./volumes/attachments/.*\s.*svirt_sandbox_file_t\s" > /dev/null 2>&1; then 146 | #echo "Debug: Found context for ./volumes/attachments/.*" 147 | run_selinux_cmd "semanage fcontext -m -t svirt_sandbox_file_t './volumes/attachments/.*'" 148 | else 149 | #echo "Debug: No context for ./volumes/attachments/.*, adding new" 150 | run_selinux_cmd "semanage fcontext -a -t svirt_sandbox_file_t './volumes/attachments/.*'" 151 | fi 152 | run_selinux_cmd "restorecon -R ./volumes/config-in ./volumes/qwc2 ./volumes/qgs-resources ./volumes/attachments" 153 | fi 154 | chown -R $QWC_UID:$QWC_GID ./volumes/config-in ./volumes/qwc2 ./volumes/qgs-resources ./volumes/attachments 155 | 156 | # Configure Solr volumes 157 | if [ $SELINUX_ENABLED -eq 1 ]; then 158 | run_selinux_cmd "chcon -Rt container_file_t -l s0 ./volumes/solr/data ./volumes/solr/configsets" 159 | # Add or modify persistent SELinux file context rule 160 | if semanage fcontext -l | grep -q "^./volumes/solr/data/.*\s.*container_file_t\s" > /dev/null 2>&1; then 161 | #echo "Debug: Found context for ./volumes/solr/data/.*" 162 | run_selinux_cmd "semanage fcontext -m -t container_file_t './volumes/solr/data/.*'" 163 | else 164 | #echo "Debug: No context for ./volumes/solr/data/.*, adding new" 165 | run_selinux_cmd "semanage fcontext -a -t container_file_t './volumes/solr/data/.*'" 166 | fi 167 | if semanage fcontext -l | grep -q "^./volumes/solr/configsets/.*\s.*container_file_t\s" > /dev/null 2>&1; then 168 | #echo "Debug: Found context for ./volumes/solr/configsets/.*" 169 | run_selinux_cmd "semanage fcontext -m -t container_file_t './volumes/solr/configsets/.*'" 170 | else 171 | #echo "Debug: No context for ./volumes/solr/configsets/.*, adding new" 172 | run_selinux_cmd "semanage fcontext -a -t container_file_t './volumes/solr/configsets/.*'" 173 | fi 174 | run_selinux_cmd "restorecon -R ./volumes/solr/data ./volumes/solr/configsets" 175 | fi 176 | # solr inside the conainer is running as 8983 177 | chown -R 8983:8983 ./volumes/solr/data ./volumes/solr/configsets 178 | 179 | # Configure the demo data permissions script for qwc-config-db-migrate 180 | if [ $SELINUX_ENABLED -eq 1 ]; then 181 | run_selinux_cmd "chcon -t svirt_sandbox_file_t ./volumes/demo-data/setup-demo-data-permissions.sh" 182 | # Add or modify persistent SELinux file context rule 183 | if semanage fcontext -l | grep -q "^./volumes/demo-data/setup-demo-data-permissions.sh\s.*svirt_sandbox_file_t\s" > /dev/null 2>&1; then 184 | #echo "Debug: Found context for ./volumes/demo-data/setup-demo-data-permissions.sh" 185 | run_selinux_cmd "semanage fcontext -m -t svirt_sandbox_file_t './volumes/demo-data/setup-demo-data-permissions.sh'" 186 | else 187 | #echo "Debug: No context for ./volumes/demo-data/setup-demo-data-permissions.sh, adding new" 188 | run_selinux_cmd "semanage fcontext -a -t svirt_sandbox_file_t './volumes/demo-data/setup-demo-data-permissions.sh'" 189 | fi 190 | run_selinux_cmd "restorecon ./volumes/demo-data/setup-demo-data-permissions.sh" 191 | fi 192 | chown $QWC_UID:$QWC_GID ./volumes/demo-data/setup-demo-data-permissions.sh 193 | 194 | # Configure SELinux network policies for container connectivity 195 | if [ $SELINUX_ENABLED -eq 1 ]; then 196 | # Check if container_connect_any boolean exists 197 | if getsebool container_connect_any >/dev/null 2>&1; then 198 | # allow containers to connect to any port 199 | run_selinux_cmd "setsebool -P container_connect_any 1" 200 | else 201 | # Print a message if the boolean is not defined (e.g., in older SELinux versions) 202 | echo "Note: container_connect_any boolean not defined, skipping." 203 | fi 204 | # Configure ports 5432 (PostgreSQL), 8088 (QWC2 services), and 8983 (Solr) 205 | for port in 5432 8088 8983; do 206 | # Check if the port is already defined as http_port_t 207 | if semanage port -l | grep -q "http_port_t.*$port" > /dev/null 2>&1; then 208 | run_selinux_cmd "semanage port -m -t http_port_t -p tcp $port" 209 | else 210 | run_selinux_cmd "semanage port -a -t http_port_t -p tcp $port" 211 | fi 212 | done 213 | # Ensure port 5432 is labeled with postgresql_port_t for PostgreSQL access 214 | run_selinux_cmd "semanage port -m -t postgresql_port_t -p tcp 5432" 215 | fi 216 | 217 | # Print confirmation and instructions to restart Docker services 218 | echo "Permissions applied. Restart services with:" 219 | echo "docker-compose down && docker-compose up -d" 220 | -------------------------------------------------------------------------------- /volumes/attachments/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /volumes/config-in/default/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "routingServiceUrl": "https://valhalla1.openstreetmap.de/", 3 | "omitUrlParameterUpdates":false, 4 | "urlPositionFormat":"centerAndZoom", 5 | "urlPositionCrs":"", 6 | "preserveBackgroundOnThemeSwitch":true, 7 | "preserveExtentOnThemeSwitch":true, 8 | "preserveNonThemeLayersOnThemeSwitch":false, 9 | "allowAddingOtherThemes":true, 10 | "allowLayerTreeSeparators":false, 11 | "allowRemovingThemeLayers":true, 12 | "allowReorderingLayers":true, 13 | "preventSplittingGroupsWhenReordering":false, 14 | "globallyDisableDockableDialogs":false, 15 | "searchThemes":true, 16 | "allowFractionalZoom":false, 17 | "localeAwareNumbers":false, 18 | "identifyTool":"Identify", 19 | "wmsDpi":96, 20 | "wmsHidpi":false, 21 | "qgisServerVersion":3, 22 | "defaultFeatureStyle":{ 23 | "strokeColor":[ 24 | 0, 25 | 0, 26 | 255, 27 | 1 28 | ], 29 | "strokeWidth":1, 30 | "strokeDash":[ 31 | 4 32 | ], 33 | "fillColor":[ 34 | 255, 35 | 0, 36 | 255, 37 | 0.33 38 | ], 39 | "circleRadius":10, 40 | "textFill":"black", 41 | "textStroke":"white", 42 | "textFont":"11pt sans-serif" 43 | }, 44 | "importLayerUrlPresets":[ 45 | { 46 | "label":"Swisstopo WMTS", 47 | "value":"https://wmts10.geo.admin.ch/EPSG/2056/1.0.0/WMTSCapabilities.xml" 48 | } 49 | ], 50 | "projections":[ 51 | { 52 | "code":"EPSG:32632", 53 | "proj":"+proj=utm +zone=32 +datum=WGS84 +units=m +no_defs", 54 | "label":"WGS 84 / UTM zone 32N" 55 | }, 56 | { 57 | "code":"EPSG:31254", 58 | "proj":"+proj=tmerc +lat_0=0 +lon_0=10.33333333333333 +k=1 +x_0=0 +y_0=-5000000 +ellps=bessel +towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232 +units=m +no_defs +axis=neu", 59 | "label":"MGI / Austria GK West" 60 | }, 61 | { 62 | "code":"EPSG:21781", 63 | "proj":"+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=600000 +y_0=200000 +ellps=bessel +towgs84=674.4,15.1,405.3,0,0,0,0 +units=m +no_defs", 64 | "label":"CH1903 / LV03" 65 | }, 66 | { 67 | "code":"EPSG:2056", 68 | "proj":"+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=2600000 +y_0=1200000 +ellps=bessel +towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs", 69 | "label":"CH1903+ / LV95" 70 | }, 71 | { 72 | "code":"EPSG:25832", 73 | "proj":"+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs", 74 | "label":"ETRS89 / UTM 32N" 75 | }, 76 | { 77 | "code":"EPSG:31983", 78 | "proj":"+proj=utm +zone=23 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs", 79 | "label":"SIRGAS 2000 / UTM zone 23S" 80 | } 81 | ], 82 | "plugins":{ 83 | "common": [ 84 | { 85 | "name":"API" 86 | }, 87 | { 88 | "name":"AttributeTable" 89 | }, 90 | { 91 | "name":"Authentication" 92 | }, 93 | { 94 | "name":"BackgroundSwitcher", 95 | "cfg":{ 96 | "position":0 97 | } 98 | }, 99 | { 100 | "name":"Bookmark" 101 | }, 102 | { 103 | "name":"BottomBar", 104 | "cfg":{ 105 | "viewertitleUrl":"https://qwc-services.github.io/", 106 | "termsUrl":"https://github.com/qwc-services/qwc-docker/blob/master/LICENSE/" 107 | } 108 | }, 109 | { 110 | "name":"Editing", 111 | "cfg":{ 112 | "snapping":true, 113 | "snappingActive":true 114 | } 115 | }, 116 | { 117 | "name":"FeatureForm" 118 | }, 119 | { 120 | "name":"Help", 121 | "cfg": { 122 | "bodyContentsFragmentUrl": "assets/help.html" 123 | }, 124 | "mapClickAction":"identify" 125 | }, 126 | { 127 | "name":"Identify", 128 | "cfg":{ 129 | "params":{ 130 | "FI_POINT_TOLERANCE":16, 131 | "FI_LINE_TOLERANCE":8, 132 | "FI_POLYGON_TOLERANCE":4, 133 | "feature_count":20, 134 | "region_feature_count":100 135 | }, 136 | "enableExport":true, 137 | "longAttributesDisplay":"wrap", 138 | "displayResultTree":false, 139 | "featureInfoReturnsLayerName":false, 140 | "initialWidth":480, 141 | "initialHeight":550 142 | } 143 | }, 144 | { 145 | "name":"HeightProfile", 146 | "cfg":{ 147 | "heighProfilePrecision":0 148 | } 149 | }, 150 | { 151 | "name":"LayerCatalog", 152 | "cfg":{ 153 | "catalogUrl":"assets/catalog.json" 154 | } 155 | }, 156 | { 157 | "name":"LayerTree", 158 | "cfg":{ 159 | "showLegendIcons":true, 160 | "showRootEntry":true, 161 | "showQueryableIcon":true, 162 | "allowMapTips":true, 163 | "allowCompare":true, 164 | "allowImport":true, 165 | "groupTogglesSublayers":false, 166 | "grayUnchecked":false, 167 | "layerInfoWindowSize":{ 168 | "width":480, 169 | "height":400 170 | }, 171 | "bboxDependentLegend":"theme", 172 | "scaleDependentLegend":"theme", 173 | "showToggleAllLayersCheckbox":true 174 | }, 175 | "mapClickAction":"identify" 176 | }, 177 | { 178 | "name":"Map", 179 | "cfg":{ 180 | "mapOptions":{ 181 | "zoomDuration":250, 182 | "enableRotation":true 183 | }, 184 | "toolsOptions":{ 185 | "OverviewSupport":{ 186 | "tipLabel":"Overview" 187 | }, 188 | "LocateSupport":{ 189 | "keepCurrentZoomLevel":true, 190 | "stopFollowingOnDrag":true, 191 | "startupMode":"DISABLED" 192 | }, 193 | "ScaleBarSupport":{ 194 | "units":"metric" 195 | } 196 | }, 197 | "swipeGeometryTypeBlacklist":[ 198 | ], 199 | "swipeLayerNameBlacklist":[ 200 | ] 201 | } 202 | }, 203 | { 204 | "name":"MapCompare" 205 | }, 206 | { 207 | "name":"MapCopyright" 208 | }, 209 | { 210 | "name":"MapExport" 211 | }, 212 | { 213 | "name":"MapFilter", 214 | "cfg": { 215 | "allowCustomFilters": true, 216 | "allowFilterByGeom": true, 217 | "allowFilterByTime": true, 218 | "position": 6 219 | } 220 | }, 221 | { 222 | "name":"MapInfoTooltip", 223 | "cfg":{ 224 | "elevationPrecision":0, 225 | "includeWGS84":true 226 | } 227 | }, 228 | { 229 | "name":"MapLegend", 230 | "cfg":{ 231 | "bboxDependentLegend":"theme", 232 | "scaleDependentLegend":"theme" 233 | } 234 | }, 235 | { 236 | "name":"Measure", 237 | "cfg":{ 238 | "showMeasureModeSwitcher":true, 239 | "snapping":true, 240 | "snappingActive":true 241 | } 242 | }, 243 | { 244 | "name": "NewsPopup", 245 | "cfg": { 246 | "newsDocument": "https://qwc-services.github.io/master/release_notes/ChangeLog/", 247 | "newsRev": "20250210" 248 | } 249 | }, 250 | { 251 | "name":"Print", 252 | "cfg":{ 253 | "inlinePrintOutput":true, 254 | "printExternalLayers":true, 255 | "gridInitiallyEnabled":false 256 | } 257 | }, 258 | { 259 | "name":"Redlining", 260 | "cfg":{ 261 | "snapping":true, 262 | "snappingActive":true 263 | } 264 | }, 265 | { 266 | "name":"Routing" 267 | }, 268 | { 269 | "name":"Settings", 270 | "cfg":{ 271 | "languages":[ 272 | { 273 | "title":"English", 274 | "value":"en-US" 275 | }, 276 | { 277 | "title":"Deutsch", 278 | "value":"de-CH" 279 | }, 280 | { 281 | "title":"Français", 282 | "value":"fr-FR" 283 | }, 284 | { 285 | "title":"Italiano", 286 | "value":"it-IT" 287 | } 288 | ], 289 | "colorSchemes":[ 290 | { 291 | "titleMsgId":"colorschemes.default", 292 | "value":"default" 293 | }, 294 | { 295 | "titleMsgId":"colorschemes.highcontrast", 296 | "value":"highcontrast" 297 | }, 298 | { 299 | "titleMsgId":"colorschemes.dark", 300 | "value":"dark" 301 | } 302 | ] 303 | } 304 | }, 305 | { 306 | "name":"ScratchDrawing" 307 | }, 308 | { 309 | "name":"Share", 310 | "cfg":{ 311 | "showSocials":true, 312 | "showLink":true, 313 | "showQRCode":true 314 | }, 315 | "mapClickAction":"identify" 316 | }, 317 | { 318 | "name":"StartupMarker", 319 | "cfg":{ 320 | "removeMode":"onclickonmarker" 321 | } 322 | }, 323 | { 324 | "name":"ThemeSwitcher", 325 | "cfg":{ 326 | "collapsibleGroups":true 327 | } 328 | }, 329 | { 330 | "name":"TimeManager", 331 | "cfg":{ 332 | "defaultTimelineDisplay":"features" 333 | }, 334 | "mapClickAction":"identify" 335 | }, 336 | { 337 | "name":"TopBar", 338 | "cfg":{ 339 | "menuItems":[ 340 | { 341 | "key":"ThemeSwitcher", 342 | "icon":"themes" 343 | }, 344 | { 345 | "key":"LayerTree", 346 | "icon":"layers" 347 | }, 348 | { 349 | "key": "MapLegend", 350 | "icon": "list-alt" 351 | }, 352 | { 353 | "key":"LayerCatalog", 354 | "icon":"catalog" 355 | }, 356 | { 357 | "key":"Share", 358 | "icon":"share" 359 | }, 360 | { 361 | "key":"Bookmark", 362 | "icon":"bookmark" 363 | }, 364 | { 365 | "key":"Tools", 366 | "icon":"tools", 367 | "subitems":[ 368 | { 369 | "key":"Identify", 370 | "icon":"identify_region", 371 | "mode":"Region" 372 | }, 373 | { 374 | "key":"Measure", 375 | "icon":"measure" 376 | }, 377 | { 378 | "key":"Redlining", 379 | "icon":"draw" 380 | }, 381 | { 382 | "key": "MapFilter", 383 | "icon": "filter" 384 | }, 385 | { 386 | "key":"Editing", 387 | "icon":"editing" 388 | }, 389 | { 390 | "key":"FeatureForm", 391 | "icon":"featureform" 392 | }, 393 | { 394 | "key":"AttributeTable", 395 | "icon":"editing" 396 | }, 397 | { 398 | "key":"MapExport", 399 | "icon":"rasterexport" 400 | }, 401 | { 402 | "key":"TimeManager", 403 | "icon":"clock" 404 | }, 405 | { 406 | "key":"Routing", 407 | "icon":"routing" 408 | } 409 | ] 410 | }, 411 | { 412 | "key":"Print", 413 | "icon":"print" 414 | }, 415 | { 416 | "key":"Help", 417 | "icon":"info" 418 | }, 419 | { 420 | "key":"Settings", 421 | "icon":"cog" 422 | }, 423 | { 424 | "key":"Login", 425 | "icon":"login" 426 | } 427 | ], 428 | "searchOptions":{ 429 | "minScaleDenom":1000, 430 | "showProviderSelection":true, 431 | "providerSelectionAllowAll":true, 432 | "zoomToLayers":false, 433 | "showProvidersInPlaceholder":false 434 | }, 435 | "appMenuClearsTask":true, 436 | "appMenuFilterField":true, 437 | "appMenuVisibleOnStartup":false, 438 | "logoUrl":"/" 439 | } 440 | } 441 | ], 442 | "mobile":[ 443 | { 444 | "name":"BottomBar", 445 | "cfg":{ 446 | "displayCoordinates":false, 447 | "displayScales":false 448 | } 449 | }, 450 | { 451 | "name":"HomeButton", 452 | "cfg":{ 453 | "position":2 454 | } 455 | }, 456 | { 457 | "name":"LocateButton", 458 | "cfg":{ 459 | "position":1 460 | } 461 | } 462 | ], 463 | "desktop":[ 464 | { 465 | "name":"HomeButton", 466 | "cfg":{ 467 | "position":4 468 | } 469 | }, 470 | { 471 | "name":"LocateButton", 472 | "cfg":{ 473 | "position":3 474 | } 475 | }, 476 | { 477 | "name":"MapTip" 478 | }, 479 | { 480 | "name":"TaskButton", 481 | "cfg":{ 482 | "position":5, 483 | "task":"LayerTree", 484 | "icon":"list-alt" 485 | } 486 | }, 487 | { 488 | "name":"TopBar", 489 | "cfg":{ 490 | "toolbarItems":[ 491 | { 492 | "key":"Measure", 493 | "mode":"LineString", 494 | "icon":"measure_line" 495 | }, 496 | { 497 | "key":"Measure", 498 | "mode":"Polygon", 499 | "icon":"measure_polygon" 500 | }, 501 | { 502 | "key":"Print", 503 | "icon":"print" 504 | }, 505 | { 506 | "key":"Identify", 507 | "icon":"identify_region", 508 | "mode":"Region" 509 | } 510 | ] 511 | } 512 | }, 513 | { 514 | "name":"ZoomIn", 515 | "cfg":{ 516 | "position":2 517 | } 518 | }, 519 | { 520 | "name":"ZoomOut", 521 | "cfg":{ 522 | "position":1 523 | } 524 | } 525 | ] 526 | } 527 | } 528 | -------------------------------------------------------------------------------- /volumes/config-in/default/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | QGIS Web Client 2 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 53 | 54 | 59 | 60 | 61 |
62 |
63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /volumes/config-in/default/tenantConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/qwc-services/qwc-config-generator/raw/master/schemas/qwc-config-generator.json", 3 | "service": "config-generator", 4 | "config": { 5 | "autogen_keyvaltable_datasets": true, 6 | "config_db_url": "postgresql:///?service=qwc_configdb", 7 | "default_qgis_server_url": "http://qwc-qgis-server/ows/", 8 | "generate_nested_nrel_forms": false, 9 | "generate_wfs_services": false, 10 | "permissions_default_allow": true, 11 | "qgis_projects_base_dir": "/data", 12 | "qgis_projects_scan_base_dir": "/data/scan", 13 | "strip_scan_prefix_from_theme_names": true, 14 | "tenant": "default", 15 | "validate_schema": true, 16 | "use_default_map_thumbnail": true 17 | }, 18 | "themesConfig": "./themesConfig.json", 19 | "services": [ 20 | { 21 | "name": "adminGui", 22 | "config": { 23 | "config_generator_service_url": "http://qwc-config-service:9090", 24 | "db_url": "postgresql:///?service=qwc_configdb", 25 | "input_config_path": "/srv/qwc_service/config-in", 26 | "info_templates_path": "/info_templates", 27 | "default_qgis_server_url": "http://qwc-qgis-server/ows/", 28 | "ows_prefix": "/ows", 29 | "ows_service_url": "/ows", 30 | "plugins": [], 31 | "qgs_resources_path": "/qgs-resources", 32 | "qwc2_path": "/qwc2", 33 | "solr_service_url": "http://qwc-solr:8983/solr/gdi/select", 34 | "solr_tenant_dih": "dih_geodata_config", 35 | "totp_enabled": false, 36 | "user_info_fields": [] 37 | } 38 | }, 39 | { 40 | "name": "data", 41 | "config": { 42 | "geometry_default_allow_null": false 43 | } 44 | }, 45 | { 46 | "name": "document", 47 | "config": { 48 | } 49 | }, 50 | { 51 | "name": "dbAuth", 52 | "config": { 53 | "db_url": "postgresql:///?service=qwc_configdb" 54 | } 55 | }, 56 | { 57 | "name": "elevation", 58 | "config": { 59 | "elevation_dataset": "/vsicurl/https://data.sourcepole.com/srtm_1km_3857.tif" 60 | } 61 | }, 62 | { 63 | "name": "featureInfo", 64 | "config": { 65 | "data_service_url": "/api/v1/data/", 66 | "skip_empty_attributes": false 67 | } 68 | }, 69 | { 70 | "name": "legend", 71 | "config": { 72 | "legend_images_path": "/legends/" 73 | } 74 | }, 75 | { 76 | "name": "mapinfo", 77 | "config": { 78 | "queries": [ 79 | { 80 | "db_url": "postgresql:///?service=qwc_geodb", 81 | "info_display_col": "name", 82 | "info_geom_col": "wkb_geometry", 83 | "info_table": "qwc_geodb.ne_10m_admin_0_countries", 84 | "info_title": "Country" 85 | }, 86 | { 87 | "db_url": "postgresql:///?service=qwc_geodb", 88 | "info_sql": "SELECT type FROM qwc_geodb.ne_10m_admin_0_countries WHERE ST_contains(wkb_geometry, ST_SetSRID(ST_Point(:x, :y), :srid)) LIMIT 1", 89 | "info_title": "Type" 90 | } 91 | ] 92 | } 93 | }, 94 | { 95 | "name": "mapViewer", 96 | "generator_config": { 97 | "qwc2_config": { 98 | "qwc2_config_file": "/srv/qwc_service/config-in/default/config.json", 99 | "qwc2_index_file": "/srv/qwc_service/config-in/default/index.html" 100 | } 101 | }, 102 | "config": { 103 | "qwc2_path": "/qwc2/", 104 | "auth_service_url": "/auth/", 105 | "data_service_url": "/api/v1/data/", 106 | "document_service_url": "/api/v1/document/", 107 | "elevation_service_url": "/api/v1/elevation/", 108 | "info_service_url": "/api/v1/featureinfo/", 109 | "legend_service_url": "/api/v1/legend/", 110 | "mapinfo_service_url": "/api/v1/mapinfo/", 111 | "ogc_service_url": "/ows/", 112 | "permalink_service_url": "/api/v1/permalink/", 113 | "print_service_url": "/api/v1/print/", 114 | "search_service_url": "/api/v2/search/", 115 | "search_data_service_url": "/api/v2/search/geom/" 116 | } 117 | }, 118 | { 119 | "name": "ogc", 120 | "config": { 121 | }, 122 | "generator_config": { 123 | "wms_services": { 124 | "online_resources": { 125 | "feature_info": "/api/v1/featureinfo/", 126 | "legend": "/api/v1/legend/", 127 | "service": "/ows/" 128 | } 129 | } 130 | } 131 | }, 132 | { 133 | "name": "permalink", 134 | "config": { 135 | "db_url": "postgresql:///?service=qwc_configdb", 136 | "permalinks_table": "qwc_config.permalinks", 137 | "user_permalink_table": "qwc_config.user_permalinks", 138 | "user_bookmark_table": "qwc_config.user_bookmarks" 139 | } 140 | }, 141 | { 142 | "name": "print", 143 | "config": { 144 | "ogc_service_url": "http://qwc-ogc-service:9090/" 145 | } 146 | }, 147 | { 148 | "name": "search", 149 | "config": { 150 | "db_url": "postgresql:///?service=qwc_geodb", 151 | "search_backend": "solr", 152 | "search_result_limit": 50, 153 | "solr_service_url": "http://qwc-solr:8983/solr/gdi/select" 154 | }, 155 | "resources": { 156 | "facets": [ 157 | { 158 | "name": "ne_10m_admin_0_countries", 159 | "filter_word": "Country", 160 | "table_name": "qwc_geodb.ne_10m_admin_0_countries", 161 | "geometry_column": "wkb_geometry", 162 | "search_id_col": "ogc_fid" 163 | } 164 | ] 165 | } 166 | } 167 | ] 168 | } 169 | -------------------------------------------------------------------------------- /volumes/config-in/default/themesConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultScales": [100000000, 50000000, 25000000, 10000000, 4000000, 2000000, 1000000, 400000, 200000, 80000, 40000, 20000, 10000, 8000, 6000, 4000, 2000, 1000, 500, 250, 100], 3 | "defaultPrintGrid": [ 4 | {"s": 10000000, "x": 1000000, "y": 1000000}, 5 | {"s": 1000000, "x": 100000, "y": 100000}, 6 | {"s": 100000, "x": 10000, "y": 10000}, 7 | {"s": 10000, "x": 1000, "y": 1000}, 8 | {"s": 1000, "x": 100, "y": 100}, 9 | {"s": 100, "x": 10, "y": 10} 10 | ], 11 | "defaultWMSVersion": "1.3.0", 12 | "defaultBackgroundLayers": [], 13 | "defaultSearchProviders": ["coordinates"], 14 | "defaultMapCrs": "EPSG:3857", 15 | "defaultTheme": "qwc_demo", 16 | "themes": { 17 | "items": [ 18 | { 19 | "id": "qwc_demo", 20 | "title": "QWC Demo Theme", 21 | "url": "/ows/qwc_demo", 22 | "attribution": "Demo attribution", 23 | "attributionUrl": "https://example.com/", 24 | "backgroundLayers": [ 25 | {"name": "bluemarble", "printLayer": "bluemarble_bg", "visibility": true}, 26 | {"name": "mapnik", "printLayer": "osm_bg"} 27 | ], 28 | "searchProviders": [ 29 | "coordinates", 30 | "nominatim", 31 | { 32 | "provider": "fulltext", 33 | "params": { 34 | "default": ["ne_10m_admin_0_countries"] 35 | } 36 | } 37 | ], 38 | "mapCrs": "EPSG:3857", 39 | "additionalMouseCrs": [], 40 | "extent": [-1000000,4000000,3000000,8000000], 41 | "printResolutions": [100, 300], 42 | "thumbnail": "qwc_demo.jpg", 43 | "featureReport": { 44 | "countries": "Country" 45 | }, 46 | "predefinedFilters": [{ 47 | "id": "continent_filter", 48 | "title": "Continent", 49 | "filter": { 50 | "countries": ["continent", "=", "$continent$"] 51 | }, 52 | "fields": [{ 53 | "id": "continent", 54 | "title": "Name", 55 | "defaultValue": "", 56 | "inputConfig": {"type": "select", "options": ["Africa", "Asia", "Europe", "Oceania"]} 57 | }] 58 | }], 59 | "extraLegendParameters": "LAYERTITLE=FALSE", 60 | "defaultPrintLayout": "A4 Landscape" 61 | } 62 | ], 63 | "backgroundLayers": [ 64 | { 65 | "name": "mapnik", 66 | "title": "Open Street Map", 67 | "type": "osm", 68 | "source": "osm", 69 | "attribution": "OpenStreetMap contributors", 70 | "attributionUrl": "https://www.openstreetmap.org/copyright", 71 | "thumbnail": "img/mapthumbs/mapnik.jpg" 72 | }, 73 | { 74 | "type": "wmts", 75 | "url": "http://gibs.earthdata.nasa.gov/wmts/epsg3857/best/BlueMarble_ShadedRelief/default/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg", 76 | "title": "Blue Marble", 77 | "name": "bluemarble", 78 | "tileMatrixPrefix": "", 79 | "tileMatrixSet": "GoogleMapsCompatible_Level8", 80 | "originX": -20037508.34278925, 81 | "originY": 20037508.34278925, 82 | "projection:": "EPSG:3857", 83 | "resolutions": [156543.03390625,78271.516953125,39135.7584765625,19567.87923828125,9783.939619140625,4891.9698095703125,2445.9849047851562,1222.9924523925781], 84 | "tileSize": [256,256], 85 | "thumbnail": "img/mapthumbs/bluemarble.jpg" 86 | } 87 | ] 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /volumes/config/README: -------------------------------------------------------------------------------- 1 | all files in this directory get created/overwritten by the config generator 2 | -------------------------------------------------------------------------------- /volumes/config/default/adminGuiConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/qwc-services/qwc-admin-gui/raw/master/schemas/qwc-admin-gui.json", 3 | "service": "admin-gui", 4 | "config": { 5 | "config_generator_service_url": "http://qwc-config-service:9090", 6 | "db_url": "postgresql:///?service=qwc_configdb", 7 | "input_config_path": "/srv/qwc_service/config-in", 8 | "info_templates_path": "/info_templates", 9 | "default_qgis_server_url": "http://qwc-qgis-server/ows/", 10 | "ows_prefix": "/ows", 11 | "ows_service_url": "/ows", 12 | "plugins": [], 13 | "qgs_resources_path": "/qgs-resources", 14 | "qwc2_path": "/qwc2", 15 | "solr_service_url": "http://qwc-solr:8983/solr/gdi/select", 16 | "solr_tenant_dih": "dih_geodata_config", 17 | "totp_enabled": false, 18 | "user_info_fields": [] 19 | } 20 | } -------------------------------------------------------------------------------- /volumes/config/default/dataConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/qwc-services/qwc-data-service/raw/master/schemas/qwc-data-service.json", 3 | "service": "data", 4 | "config": { 5 | "geometry_default_allow_null": false 6 | }, 7 | "resources": { 8 | "datasets": [ 9 | { 10 | "name": "qwc_demo.edit_lines", 11 | "db_url": "postgresql:///?service=qwc_geodb", 12 | "schema": "qwc_geodb", 13 | "datasource_filter": null, 14 | "table_name": "edit_lines", 15 | "primary_key": "id", 16 | "fields": [ 17 | { 18 | "name": "id", 19 | "data_type": "integer", 20 | "constraints": { 21 | "min": -2147483648, 22 | "max": 2147483647, 23 | "readOnly": true, 24 | "expression": "", 25 | "hidden": true 26 | }, 27 | "joinfield": null 28 | }, 29 | { 30 | "name": "name", 31 | "data_type": "character varying", 32 | "constraints": { 33 | "maxlength": 32, 34 | "required": false, 35 | "expression": "", 36 | "multiline": false 37 | }, 38 | "joinfield": null 39 | }, 40 | { 41 | "name": "description", 42 | "data_type": "text", 43 | "constraints": { 44 | "required": false, 45 | "expression": "", 46 | "multiline": true 47 | }, 48 | "joinfield": null 49 | }, 50 | { 51 | "name": "num", 52 | "data_type": "integer", 53 | "constraints": { 54 | "min": 0, 55 | "max": 10000, 56 | "required": false, 57 | "expression": "", 58 | "step": 1, 59 | "prec": 0 60 | }, 61 | "joinfield": null 62 | }, 63 | { 64 | "name": "value", 65 | "data_type": "double precision", 66 | "constraints": { 67 | "pattern": "[0-9]+([\\.,][0-9]+)?", 68 | "required": false, 69 | "expression": "", 70 | "multiline": false 71 | }, 72 | "joinfield": null 73 | }, 74 | { 75 | "name": "type", 76 | "data_type": "smallint", 77 | "constraints": { 78 | "min": -32768, 79 | "max": 32767, 80 | "required": false, 81 | "expression": "", 82 | "values": [ 83 | { 84 | "label": "Type A", 85 | "value": "0" 86 | }, 87 | { 88 | "label": "Type B", 89 | "value": "1" 90 | }, 91 | { 92 | "label": "Type C", 93 | "value": "2" 94 | } 95 | ] 96 | }, 97 | "joinfield": null 98 | }, 99 | { 100 | "name": "amount", 101 | "data_type": "numeric", 102 | "constraints": { 103 | "numeric_precision": 5, 104 | "numeric_scale": 2, 105 | "min": -999.99, 106 | "max": 999.99, 107 | "step": 0.01, 108 | "required": false, 109 | "expression": "", 110 | "multiline": false 111 | }, 112 | "joinfield": null 113 | }, 114 | { 115 | "name": "validated", 116 | "data_type": "boolean", 117 | "constraints": { 118 | "required": false, 119 | "expression": "" 120 | }, 121 | "joinfield": null 122 | }, 123 | { 124 | "name": "datetime", 125 | "data_type": "timestamp without time zone", 126 | "constraints": { 127 | "required": false, 128 | "expression": "" 129 | }, 130 | "joinfield": null 131 | } 132 | ], 133 | "jointables": {}, 134 | "geometry": { 135 | "geometry_column": "geom", 136 | "geometry_type": "LINESTRING", 137 | "srid": 3857 138 | } 139 | }, 140 | { 141 | "name": "qwc_demo.edit_points", 142 | "db_url": "postgresql:///?service=qwc_geodb", 143 | "schema": "qwc_geodb", 144 | "datasource_filter": null, 145 | "table_name": "edit_points", 146 | "primary_key": "id", 147 | "fields": [ 148 | { 149 | "name": "id", 150 | "data_type": "integer", 151 | "constraints": { 152 | "min": -2147483648, 153 | "max": 2147483647, 154 | "readOnly": true, 155 | "expression": "", 156 | "hidden": true 157 | }, 158 | "joinfield": null 159 | }, 160 | { 161 | "name": "name", 162 | "data_type": "character varying", 163 | "constraints": { 164 | "maxlength": 32, 165 | "required": false, 166 | "expression": "", 167 | "multiline": false 168 | }, 169 | "joinfield": null 170 | }, 171 | { 172 | "name": "description", 173 | "data_type": "text", 174 | "constraints": { 175 | "required": false, 176 | "expression": "", 177 | "multiline": true 178 | }, 179 | "joinfield": null 180 | }, 181 | { 182 | "name": "num", 183 | "data_type": "integer", 184 | "constraints": { 185 | "min": 0, 186 | "max": 10000, 187 | "required": false, 188 | "expression": "", 189 | "step": 1, 190 | "prec": 0 191 | }, 192 | "joinfield": null 193 | }, 194 | { 195 | "name": "value", 196 | "data_type": "double precision", 197 | "constraints": { 198 | "pattern": "[0-9]+([\\.,][0-9]+)?", 199 | "required": false, 200 | "expression": "", 201 | "multiline": false 202 | }, 203 | "joinfield": null 204 | }, 205 | { 206 | "name": "type", 207 | "data_type": "smallint", 208 | "constraints": { 209 | "min": -32768, 210 | "max": 32767, 211 | "required": false, 212 | "expression": "", 213 | "values": [ 214 | { 215 | "label": "Type A", 216 | "value": "0" 217 | }, 218 | { 219 | "label": "Type B", 220 | "value": "1" 221 | }, 222 | { 223 | "label": "Type C", 224 | "value": "2" 225 | } 226 | ] 227 | }, 228 | "joinfield": null 229 | }, 230 | { 231 | "name": "amount", 232 | "data_type": "numeric", 233 | "constraints": { 234 | "numeric_precision": 5, 235 | "numeric_scale": 2, 236 | "min": -999.99, 237 | "max": 999.99, 238 | "step": 0.01, 239 | "required": false, 240 | "expression": "", 241 | "multiline": false 242 | }, 243 | "joinfield": null 244 | }, 245 | { 246 | "name": "validated", 247 | "data_type": "boolean", 248 | "constraints": { 249 | "required": false, 250 | "expression": "" 251 | }, 252 | "joinfield": null 253 | }, 254 | { 255 | "name": "datetime", 256 | "data_type": "timestamp without time zone", 257 | "constraints": { 258 | "required": false, 259 | "expression": "" 260 | }, 261 | "joinfield": null 262 | } 263 | ], 264 | "jointables": {}, 265 | "geometry": { 266 | "geometry_column": "geom", 267 | "geometry_type": "POINT", 268 | "srid": 3857 269 | } 270 | }, 271 | { 272 | "name": "qwc_demo.edit_polygons", 273 | "db_url": "postgresql:///?service=qwc_geodb", 274 | "schema": "qwc_geodb", 275 | "datasource_filter": null, 276 | "table_name": "edit_polygons", 277 | "primary_key": "id", 278 | "fields": [ 279 | { 280 | "name": "id", 281 | "data_type": "integer", 282 | "constraints": { 283 | "min": -2147483648, 284 | "max": 2147483647, 285 | "readOnly": true, 286 | "expression": "", 287 | "hidden": true 288 | }, 289 | "joinfield": null 290 | }, 291 | { 292 | "name": "name", 293 | "data_type": "character varying", 294 | "constraints": { 295 | "maxlength": 32, 296 | "required": false, 297 | "expression": "", 298 | "multiline": false 299 | }, 300 | "joinfield": null 301 | }, 302 | { 303 | "name": "description", 304 | "data_type": "text", 305 | "constraints": { 306 | "required": false, 307 | "expression": "", 308 | "multiline": true 309 | }, 310 | "joinfield": null 311 | }, 312 | { 313 | "name": "num", 314 | "data_type": "integer", 315 | "constraints": { 316 | "min": 0, 317 | "max": 10000, 318 | "required": false, 319 | "expression": "", 320 | "step": 1, 321 | "prec": 0 322 | }, 323 | "joinfield": null 324 | }, 325 | { 326 | "name": "value", 327 | "data_type": "double precision", 328 | "constraints": { 329 | "pattern": "[0-9]+([\\.,][0-9]+)?", 330 | "required": false, 331 | "expression": "", 332 | "multiline": false 333 | }, 334 | "joinfield": null 335 | }, 336 | { 337 | "name": "type", 338 | "data_type": "smallint", 339 | "constraints": { 340 | "min": -32768, 341 | "max": 32767, 342 | "required": false, 343 | "expression": "", 344 | "values": [ 345 | { 346 | "label": "Type A", 347 | "value": "0" 348 | }, 349 | { 350 | "label": "Type B", 351 | "value": "1" 352 | }, 353 | { 354 | "label": "Type C", 355 | "value": "2" 356 | } 357 | ] 358 | }, 359 | "joinfield": null 360 | }, 361 | { 362 | "name": "amount", 363 | "data_type": "numeric", 364 | "constraints": { 365 | "numeric_precision": 5, 366 | "numeric_scale": 2, 367 | "min": -999.99, 368 | "max": 999.99, 369 | "step": 0.01, 370 | "required": false, 371 | "expression": "", 372 | "multiline": false 373 | }, 374 | "joinfield": null 375 | }, 376 | { 377 | "name": "validated", 378 | "data_type": "boolean", 379 | "constraints": { 380 | "required": false, 381 | "expression": "" 382 | }, 383 | "joinfield": null 384 | }, 385 | { 386 | "name": "datetime", 387 | "data_type": "timestamp without time zone", 388 | "constraints": { 389 | "required": false, 390 | "expression": "" 391 | }, 392 | "joinfield": null 393 | } 394 | ], 395 | "jointables": {}, 396 | "geometry": { 397 | "geometry_column": "geom", 398 | "geometry_type": "POLYGON", 399 | "srid": 3857 400 | } 401 | } 402 | ] 403 | } 404 | } -------------------------------------------------------------------------------- /volumes/config/default/dbAuthConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/qwc-services/qwc-db-auth/raw/master/schemas/qwc-db-auth.json", 3 | "service": "db-auth", 4 | "config": { 5 | "db_url": "postgresql:///?service=qwc_configdb" 6 | } 7 | } -------------------------------------------------------------------------------- /volumes/config/default/documentConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/qwc-services/qwc-document-service/raw/master/schemas/qwc-document-service.json", 3 | "service": "document", 4 | "config": {}, 5 | "resources": { 6 | "document_templates": [ 7 | { 8 | "template": "Country" 9 | } 10 | ] 11 | } 12 | } -------------------------------------------------------------------------------- /volumes/config/default/elevationConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/qwc-services/qwc-elevation-service/raw/master/schemas/qwc-elevation-service.json", 3 | "service": "elevation", 4 | "config": { 5 | "elevation_dataset": "/vsicurl/https://data.sourcepole.com/srtm_1km_3857.tif" 6 | } 7 | } -------------------------------------------------------------------------------- /volumes/config/default/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | QGIS Web Client 2 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 53 | 54 | 59 | 60 | 61 |
62 |
63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /volumes/config/default/legendConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/qwc-services/qwc-legend-service/raw/master/schemas/qwc-legend-service.json", 3 | "service": "legend", 4 | "config": { 5 | "legend_images_path": "/legends/", 6 | "default_qgis_server_url": "http://qwc-qgis-server/ows/" 7 | }, 8 | "resources": { 9 | "wms_services": [ 10 | { 11 | "name": "qwc_demo", 12 | "root_layer": { 13 | "name": "qwc_demo", 14 | "layers": [ 15 | { 16 | "name": "edit_demo", 17 | "layers": [ 18 | { 19 | "name": "edit_points" 20 | }, 21 | { 22 | "name": "edit_lines" 23 | }, 24 | { 25 | "name": "edit_polygons" 26 | } 27 | ] 28 | }, 29 | { 30 | "name": "geographic_lines" 31 | }, 32 | { 33 | "name": "country_names" 34 | }, 35 | { 36 | "name": "states_provinces" 37 | }, 38 | { 39 | "name": "countries" 40 | } 41 | ] 42 | } 43 | }, 44 | { 45 | "name": "scan/natural-earth-countries", 46 | "root_layer": { 47 | "name": "qwc_demo", 48 | "layers": [ 49 | { 50 | "name": "geographic_lines" 51 | }, 52 | { 53 | "name": "country_names" 54 | }, 55 | { 56 | "name": "states_provinces" 57 | }, 58 | { 59 | "name": "countries" 60 | } 61 | ] 62 | } 63 | } 64 | ] 65 | } 66 | } -------------------------------------------------------------------------------- /volumes/config/default/mapinfoConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/qwc-services/qwc-mapinfo-service/raw/master/schemas/qwc-mapinfo-service.json", 3 | "service": "mapinfo", 4 | "config": { 5 | "queries": [ 6 | { 7 | "db_url": "postgresql:///?service=qwc_geodb", 8 | "info_display_col": "name", 9 | "info_geom_col": "wkb_geometry", 10 | "info_table": "qwc_geodb.ne_10m_admin_0_countries", 11 | "info_title": "Country" 12 | }, 13 | { 14 | "db_url": "postgresql:///?service=qwc_geodb", 15 | "info_sql": "SELECT type FROM qwc_geodb.ne_10m_admin_0_countries WHERE ST_contains(wkb_geometry, ST_SetSRID(ST_Point(:x, :y), :srid)) LIMIT 1", 16 | "info_title": "Type" 17 | } 18 | ] 19 | } 20 | } -------------------------------------------------------------------------------- /volumes/config/default/ogcConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/qwc-services/qwc-ogc-service/raw/master/schemas/qwc-ogc-service.json", 3 | "service": "ogc", 4 | "config": { 5 | "default_qgis_server_url": "http://qwc-qgis-server/ows/" 6 | }, 7 | "resources": { 8 | "wms_services": [ 9 | { 10 | "name": "qwc_demo", 11 | "online_resources": { 12 | "feature_info": "/api/v1/featureinfo/qwc_demo", 13 | "legend": "/api/v1/legend/qwc_demo", 14 | "service": "/ows/qwc_demo" 15 | }, 16 | "root_layer": { 17 | "name": "qwc_demo", 18 | "title": "QWC Demo", 19 | "layers": [ 20 | { 21 | "name": "edit_demo", 22 | "title": "Edit Demo", 23 | "layers": [ 24 | { 25 | "name": "edit_points", 26 | "title": "Edit Points", 27 | "attributes": [ 28 | "id", 29 | "Name", 30 | "Description", 31 | "Number", 32 | "value", 33 | "Type", 34 | "amount", 35 | "Validated", 36 | "Date", 37 | "geometry", 38 | "maptip" 39 | ], 40 | "queryable": true 41 | }, 42 | { 43 | "name": "edit_lines", 44 | "title": "Edit Lines", 45 | "attributes": [ 46 | "id", 47 | "Name", 48 | "Description", 49 | "Number", 50 | "value", 51 | "Type", 52 | "amount", 53 | "Validated", 54 | "Date", 55 | "geometry", 56 | "maptip" 57 | ], 58 | "queryable": true 59 | }, 60 | { 61 | "name": "edit_polygons", 62 | "title": "Edit Polygons", 63 | "attributes": [ 64 | "id", 65 | "Name", 66 | "Description", 67 | "Number", 68 | "value", 69 | "Type", 70 | "amount", 71 | "Validated", 72 | "Date", 73 | "geometry", 74 | "maptip" 75 | ], 76 | "queryable": true 77 | } 78 | ] 79 | }, 80 | { 81 | "name": "geographic_lines", 82 | "title": "Geographic lines", 83 | "attributes": [ 84 | "ogc_fid", 85 | "scalerank", 86 | "name", 87 | "name_long", 88 | "abbrev", 89 | "note", 90 | "featurecla", 91 | "min_zoom", 92 | "wikidataid", 93 | "name_ar", 94 | "name_bn", 95 | "name_de", 96 | "name_en", 97 | "name_es", 98 | "name_fr", 99 | "name_el", 100 | "name_hi", 101 | "name_hu", 102 | "name_id", 103 | "name_it", 104 | "name_ja", 105 | "name_ko", 106 | "name_nl", 107 | "name_pl", 108 | "name_pt", 109 | "name_ru", 110 | "name_sv", 111 | "name_tr", 112 | "name_vi", 113 | "name_zh", 114 | "wdid_score", 115 | "ne_id", 116 | "geometry", 117 | "maptip" 118 | ], 119 | "queryable": true 120 | }, 121 | { 122 | "name": "country_names", 123 | "title": "Country names", 124 | "attributes": [ 125 | "ogc_fid", 126 | "scalerank", 127 | "labelrank", 128 | "z_postal", 129 | "z_abbrev", 130 | "z_name", 131 | "z_admin", 132 | "featurecla", 133 | "sovereignt", 134 | "sov_a3", 135 | "adm0_dif", 136 | "level", 137 | "type", 138 | "admin", 139 | "adm0_a3", 140 | "geou_dif", 141 | "name", 142 | "abbrev", 143 | "postal", 144 | "name_forma", 145 | "terr_", 146 | "name_sort", 147 | "map_color", 148 | "pop_est", 149 | "gdp_md_est", 150 | "fips_10_", 151 | "iso_a2", 152 | "iso_a3", 153 | "iso_n3", 154 | "geometry", 155 | "maptip" 156 | ], 157 | "queryable": true 158 | }, 159 | { 160 | "name": "states_provinces", 161 | "title": "States and Provinces", 162 | "attributes": [ 163 | "featurecla", 164 | "name", 165 | "adm0_a3", 166 | "adm0_name", 167 | "sov_a3", 168 | "name_l", 169 | "name_r", 170 | "name_alt_l", 171 | "name_alt_r", 172 | "name_loc_l", 173 | "name_loc_r", 174 | "name_len_l", 175 | "name_len_r", 176 | "note", 177 | "type", 178 | "geometry", 179 | "maptip" 180 | ], 181 | "queryable": true 182 | }, 183 | { 184 | "name": "countries", 185 | "title": "Countries", 186 | "attributes": [ 187 | "featurecla", 188 | "sovereignt", 189 | "sov_a3", 190 | "adm0_dif", 191 | "level", 192 | "type", 193 | "admin", 194 | "adm0_a3", 195 | "geou_dif", 196 | "geounit", 197 | "gu_a3", 198 | "su_dif", 199 | "subunit", 200 | "su_a3", 201 | "brk_diff", 202 | "name", 203 | "name_long", 204 | "brk_a3", 205 | "brk_name", 206 | "brk_group", 207 | "abbrev", 208 | "postal", 209 | "formal_en", 210 | "formal_fr", 211 | "name_ciawf", 212 | "note_adm0", 213 | "note_brk", 214 | "name_sort", 215 | "name_alt", 216 | "pop_est", 217 | "pop_rank", 218 | "gdp_md_est", 219 | "pop_year", 220 | "lastcensus", 221 | "gdp_year", 222 | "economy", 223 | "income_grp", 224 | "wikipedia", 225 | "fips_10_", 226 | "iso_a2", 227 | "iso_a3", 228 | "iso_a3_eh", 229 | "iso_n3", 230 | "un_a3", 231 | "wb_a2", 232 | "wb_a3", 233 | "woe_id", 234 | "woe_id_eh", 235 | "woe_note", 236 | "adm0_a3_is", 237 | "adm0_a3_us", 238 | "adm0_a3_un", 239 | "adm0_a3_wb", 240 | "continent", 241 | "region_un", 242 | "subregion", 243 | "region_wb", 244 | "name_len", 245 | "long_len", 246 | "abbrev_len", 247 | "tiny", 248 | "homepart", 249 | "ne_id", 250 | "wikidataid", 251 | "name_ar", 252 | "name_bn", 253 | "name_de", 254 | "name_en", 255 | "name_es", 256 | "name_fr", 257 | "name_el", 258 | "name_hi", 259 | "name_hu", 260 | "name_id", 261 | "name_it", 262 | "name_ja", 263 | "name_ko", 264 | "name_nl", 265 | "name_pl", 266 | "name_pt", 267 | "name_ru", 268 | "name_sv", 269 | "name_tr", 270 | "name_vi", 271 | "name_zh", 272 | "geometry", 273 | "maptip" 274 | ], 275 | "queryable": true 276 | } 277 | ] 278 | }, 279 | "print_templates": [ 280 | "A4 Landscape", 281 | "A3 Landscape" 282 | ], 283 | "internal_print_layers": [ 284 | "bluemarble_bg", 285 | "osm_bg", 286 | "osm_bg", 287 | "bluemarble_bg" 288 | ] 289 | }, 290 | { 291 | "name": "scan/natural-earth-countries", 292 | "online_resources": { 293 | "feature_info": "/api/v1/featureinfo/scan/natural-earth-countries", 294 | "legend": "/api/v1/legend/scan/natural-earth-countries", 295 | "service": "/ows/scan/natural-earth-countries" 296 | }, 297 | "root_layer": { 298 | "name": "qwc_demo", 299 | "title": "Natural Earth Countries", 300 | "layers": [ 301 | { 302 | "name": "geographic_lines", 303 | "title": "Geographic lines", 304 | "attributes": [ 305 | "ogc_fid", 306 | "scalerank", 307 | "name", 308 | "name_long", 309 | "abbrev", 310 | "note", 311 | "featurecla", 312 | "min_zoom", 313 | "wikidataid", 314 | "name_ar", 315 | "name_bn", 316 | "name_de", 317 | "name_en", 318 | "name_es", 319 | "name_fr", 320 | "name_el", 321 | "name_hi", 322 | "name_hu", 323 | "name_id", 324 | "name_it", 325 | "name_ja", 326 | "name_ko", 327 | "name_nl", 328 | "name_pl", 329 | "name_pt", 330 | "name_ru", 331 | "name_sv", 332 | "name_tr", 333 | "name_vi", 334 | "name_zh", 335 | "wdid_score", 336 | "ne_id", 337 | "geometry", 338 | "maptip" 339 | ], 340 | "queryable": true 341 | }, 342 | { 343 | "name": "country_names", 344 | "title": "Country names", 345 | "attributes": [ 346 | "ogc_fid", 347 | "scalerank", 348 | "labelrank", 349 | "z_postal", 350 | "z_abbrev", 351 | "z_name", 352 | "z_admin", 353 | "featurecla", 354 | "sovereignt", 355 | "sov_a3", 356 | "adm0_dif", 357 | "level", 358 | "type", 359 | "admin", 360 | "adm0_a3", 361 | "geou_dif", 362 | "name", 363 | "abbrev", 364 | "postal", 365 | "name_forma", 366 | "terr_", 367 | "name_sort", 368 | "map_color", 369 | "pop_est", 370 | "gdp_md_est", 371 | "fips_10_", 372 | "iso_a2", 373 | "iso_a3", 374 | "iso_n3", 375 | "geometry", 376 | "maptip" 377 | ], 378 | "queryable": true 379 | }, 380 | { 381 | "name": "states_provinces", 382 | "title": "States and Provinces", 383 | "attributes": [ 384 | "featurecla", 385 | "name", 386 | "adm0_a3", 387 | "adm0_name", 388 | "sov_a3", 389 | "name_l", 390 | "name_r", 391 | "name_alt_l", 392 | "name_alt_r", 393 | "name_loc_l", 394 | "name_loc_r", 395 | "name_len_l", 396 | "name_len_r", 397 | "note", 398 | "type", 399 | "geometry", 400 | "maptip" 401 | ], 402 | "queryable": true 403 | }, 404 | { 405 | "name": "countries", 406 | "title": "Countries", 407 | "attributes": [ 408 | "featurecla", 409 | "sovereignt", 410 | "sov_a3", 411 | "adm0_dif", 412 | "level", 413 | "type", 414 | "admin", 415 | "adm0_a3", 416 | "geou_dif", 417 | "geounit", 418 | "gu_a3", 419 | "su_dif", 420 | "subunit", 421 | "su_a3", 422 | "brk_diff", 423 | "name", 424 | "name_long", 425 | "brk_a3", 426 | "brk_name", 427 | "brk_group", 428 | "abbrev", 429 | "postal", 430 | "formal_en", 431 | "formal_fr", 432 | "name_ciawf", 433 | "note_adm0", 434 | "note_brk", 435 | "name_sort", 436 | "name_alt", 437 | "pop_est", 438 | "pop_rank", 439 | "gdp_md_est", 440 | "pop_year", 441 | "lastcensus", 442 | "gdp_year", 443 | "economy", 444 | "income_grp", 445 | "wikipedia", 446 | "fips_10_", 447 | "iso_a2", 448 | "iso_a3", 449 | "iso_a3_eh", 450 | "iso_n3", 451 | "un_a3", 452 | "wb_a2", 453 | "wb_a3", 454 | "woe_id", 455 | "woe_id_eh", 456 | "woe_note", 457 | "adm0_a3_is", 458 | "adm0_a3_us", 459 | "adm0_a3_un", 460 | "adm0_a3_wb", 461 | "continent", 462 | "region_un", 463 | "subregion", 464 | "region_wb", 465 | "name_len", 466 | "long_len", 467 | "abbrev_len", 468 | "tiny", 469 | "homepart", 470 | "ne_id", 471 | "wikidataid", 472 | "name_ar", 473 | "name_bn", 474 | "name_de", 475 | "name_en", 476 | "name_es", 477 | "name_fr", 478 | "name_el", 479 | "name_hi", 480 | "name_hu", 481 | "name_id", 482 | "name_it", 483 | "name_ja", 484 | "name_ko", 485 | "name_nl", 486 | "name_pl", 487 | "name_pt", 488 | "name_ru", 489 | "name_sv", 490 | "name_tr", 491 | "name_vi", 492 | "name_zh", 493 | "geometry", 494 | "maptip" 495 | ], 496 | "queryable": true 497 | } 498 | ] 499 | }, 500 | "print_templates": [ 501 | "A3 Landscape" 502 | ] 503 | } 504 | ], 505 | "wfs_services": [] 506 | } 507 | } -------------------------------------------------------------------------------- /volumes/config/default/permalinkConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/qwc-services/qwc-permalink-service/raw/master/schemas/qwc-permalink-service.json", 3 | "service": "permalink", 4 | "config": { 5 | "db_url": "postgresql:///?service=qwc_configdb", 6 | "permalinks_table": "qwc_config.permalinks", 7 | "user_permalink_table": "qwc_config.user_permalinks", 8 | "user_bookmark_table": "qwc_config.user_bookmarks" 9 | } 10 | } -------------------------------------------------------------------------------- /volumes/config/default/permissions.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/qwc-services/qwc-services-core/raw/master/schemas/qwc-services-permissions.json", 3 | "users": [ 4 | { 5 | "name": "admin", 6 | "groups": [], 7 | "roles": [ 8 | "admin" 9 | ] 10 | } 11 | ], 12 | "groups": [], 13 | "roles": [ 14 | { 15 | "role": "public", 16 | "permissions": { 17 | "wms_services": [ 18 | { 19 | "name": "qwc_demo", 20 | "layers": [ 21 | { 22 | "name": "edit_points", 23 | "queryable": true, 24 | "info_template": true, 25 | "info_attributes": [ 26 | "id", 27 | "Name", 28 | "Description", 29 | "Number", 30 | "value", 31 | "Type", 32 | "amount", 33 | "Validated", 34 | "Date", 35 | "geometry", 36 | "maptip" 37 | ], 38 | "attributes": [ 39 | "id", 40 | "Name", 41 | "Description", 42 | "Number", 43 | "value", 44 | "Type", 45 | "amount", 46 | "Validated", 47 | "Date", 48 | "geometry", 49 | "maptip" 50 | ] 51 | }, 52 | { 53 | "name": "edit_lines", 54 | "queryable": true, 55 | "info_template": true, 56 | "info_attributes": [ 57 | "id", 58 | "Name", 59 | "Description", 60 | "Number", 61 | "value", 62 | "Type", 63 | "amount", 64 | "Validated", 65 | "Date", 66 | "geometry", 67 | "maptip" 68 | ], 69 | "attributes": [ 70 | "id", 71 | "Name", 72 | "Description", 73 | "Number", 74 | "value", 75 | "Type", 76 | "amount", 77 | "Validated", 78 | "Date", 79 | "geometry", 80 | "maptip" 81 | ] 82 | }, 83 | { 84 | "name": "edit_polygons", 85 | "queryable": true, 86 | "info_template": true, 87 | "info_attributes": [ 88 | "id", 89 | "Name", 90 | "Description", 91 | "Number", 92 | "value", 93 | "Type", 94 | "amount", 95 | "Validated", 96 | "Date", 97 | "geometry", 98 | "maptip" 99 | ], 100 | "attributes": [ 101 | "id", 102 | "Name", 103 | "Description", 104 | "Number", 105 | "value", 106 | "Type", 107 | "amount", 108 | "Validated", 109 | "Date", 110 | "geometry", 111 | "maptip" 112 | ] 113 | }, 114 | { 115 | "name": "geographic_lines", 116 | "queryable": true, 117 | "info_template": true, 118 | "info_attributes": [ 119 | "ogc_fid", 120 | "scalerank", 121 | "name", 122 | "name_long", 123 | "abbrev", 124 | "note", 125 | "featurecla", 126 | "min_zoom", 127 | "wikidataid", 128 | "name_ar", 129 | "name_bn", 130 | "name_de", 131 | "name_en", 132 | "name_es", 133 | "name_fr", 134 | "name_el", 135 | "name_hi", 136 | "name_hu", 137 | "name_id", 138 | "name_it", 139 | "name_ja", 140 | "name_ko", 141 | "name_nl", 142 | "name_pl", 143 | "name_pt", 144 | "name_ru", 145 | "name_sv", 146 | "name_tr", 147 | "name_vi", 148 | "name_zh", 149 | "wdid_score", 150 | "ne_id", 151 | "geometry", 152 | "maptip" 153 | ], 154 | "attributes": [ 155 | "ogc_fid", 156 | "scalerank", 157 | "name", 158 | "name_long", 159 | "abbrev", 160 | "note", 161 | "featurecla", 162 | "min_zoom", 163 | "wikidataid", 164 | "name_ar", 165 | "name_bn", 166 | "name_de", 167 | "name_en", 168 | "name_es", 169 | "name_fr", 170 | "name_el", 171 | "name_hi", 172 | "name_hu", 173 | "name_id", 174 | "name_it", 175 | "name_ja", 176 | "name_ko", 177 | "name_nl", 178 | "name_pl", 179 | "name_pt", 180 | "name_ru", 181 | "name_sv", 182 | "name_tr", 183 | "name_vi", 184 | "name_zh", 185 | "wdid_score", 186 | "ne_id", 187 | "geometry", 188 | "maptip" 189 | ] 190 | }, 191 | { 192 | "name": "country_names", 193 | "queryable": true, 194 | "info_template": true, 195 | "info_attributes": [ 196 | "ogc_fid", 197 | "scalerank", 198 | "labelrank", 199 | "z_postal", 200 | "z_abbrev", 201 | "z_name", 202 | "z_admin", 203 | "featurecla", 204 | "sovereignt", 205 | "sov_a3", 206 | "adm0_dif", 207 | "level", 208 | "type", 209 | "admin", 210 | "adm0_a3", 211 | "geou_dif", 212 | "name", 213 | "abbrev", 214 | "postal", 215 | "name_forma", 216 | "terr_", 217 | "name_sort", 218 | "map_color", 219 | "pop_est", 220 | "gdp_md_est", 221 | "fips_10_", 222 | "iso_a2", 223 | "iso_a3", 224 | "iso_n3", 225 | "geometry", 226 | "maptip" 227 | ], 228 | "attributes": [ 229 | "ogc_fid", 230 | "scalerank", 231 | "labelrank", 232 | "z_postal", 233 | "z_abbrev", 234 | "z_name", 235 | "z_admin", 236 | "featurecla", 237 | "sovereignt", 238 | "sov_a3", 239 | "adm0_dif", 240 | "level", 241 | "type", 242 | "admin", 243 | "adm0_a3", 244 | "geou_dif", 245 | "name", 246 | "abbrev", 247 | "postal", 248 | "name_forma", 249 | "terr_", 250 | "name_sort", 251 | "map_color", 252 | "pop_est", 253 | "gdp_md_est", 254 | "fips_10_", 255 | "iso_a2", 256 | "iso_a3", 257 | "iso_n3", 258 | "geometry", 259 | "maptip" 260 | ] 261 | }, 262 | { 263 | "name": "states_provinces", 264 | "queryable": true, 265 | "info_template": true, 266 | "info_attributes": [ 267 | "featurecla", 268 | "name", 269 | "adm0_a3", 270 | "adm0_name", 271 | "sov_a3", 272 | "name_l", 273 | "name_r", 274 | "name_alt_l", 275 | "name_alt_r", 276 | "name_loc_l", 277 | "name_loc_r", 278 | "name_len_l", 279 | "name_len_r", 280 | "note", 281 | "type", 282 | "geometry", 283 | "maptip" 284 | ], 285 | "attributes": [ 286 | "featurecla", 287 | "name", 288 | "adm0_a3", 289 | "adm0_name", 290 | "sov_a3", 291 | "name_l", 292 | "name_r", 293 | "name_alt_l", 294 | "name_alt_r", 295 | "name_loc_l", 296 | "name_loc_r", 297 | "name_len_l", 298 | "name_len_r", 299 | "note", 300 | "type", 301 | "geometry", 302 | "maptip" 303 | ] 304 | }, 305 | { 306 | "name": "countries", 307 | "queryable": true, 308 | "info_template": true, 309 | "info_attributes": [ 310 | "featurecla", 311 | "sovereignt", 312 | "sov_a3", 313 | "adm0_dif", 314 | "level", 315 | "type", 316 | "admin", 317 | "adm0_a3", 318 | "geou_dif", 319 | "geounit", 320 | "gu_a3", 321 | "su_dif", 322 | "subunit", 323 | "su_a3", 324 | "brk_diff", 325 | "name", 326 | "name_long", 327 | "brk_a3", 328 | "brk_name", 329 | "brk_group", 330 | "abbrev", 331 | "postal", 332 | "formal_en", 333 | "formal_fr", 334 | "name_ciawf", 335 | "note_adm0", 336 | "note_brk", 337 | "name_sort", 338 | "name_alt", 339 | "pop_est", 340 | "pop_rank", 341 | "gdp_md_est", 342 | "pop_year", 343 | "lastcensus", 344 | "gdp_year", 345 | "economy", 346 | "income_grp", 347 | "wikipedia", 348 | "fips_10_", 349 | "iso_a2", 350 | "iso_a3", 351 | "iso_a3_eh", 352 | "iso_n3", 353 | "un_a3", 354 | "wb_a2", 355 | "wb_a3", 356 | "woe_id", 357 | "woe_id_eh", 358 | "woe_note", 359 | "adm0_a3_is", 360 | "adm0_a3_us", 361 | "adm0_a3_un", 362 | "adm0_a3_wb", 363 | "continent", 364 | "region_un", 365 | "subregion", 366 | "region_wb", 367 | "name_len", 368 | "long_len", 369 | "abbrev_len", 370 | "tiny", 371 | "homepart", 372 | "ne_id", 373 | "wikidataid", 374 | "name_ar", 375 | "name_bn", 376 | "name_de", 377 | "name_en", 378 | "name_es", 379 | "name_fr", 380 | "name_el", 381 | "name_hi", 382 | "name_hu", 383 | "name_id", 384 | "name_it", 385 | "name_ja", 386 | "name_ko", 387 | "name_nl", 388 | "name_pl", 389 | "name_pt", 390 | "name_ru", 391 | "name_sv", 392 | "name_tr", 393 | "name_vi", 394 | "name_zh", 395 | "geometry", 396 | "maptip" 397 | ], 398 | "attributes": [ 399 | "featurecla", 400 | "sovereignt", 401 | "sov_a3", 402 | "adm0_dif", 403 | "level", 404 | "type", 405 | "admin", 406 | "adm0_a3", 407 | "geou_dif", 408 | "geounit", 409 | "gu_a3", 410 | "su_dif", 411 | "subunit", 412 | "su_a3", 413 | "brk_diff", 414 | "name", 415 | "name_long", 416 | "brk_a3", 417 | "brk_name", 418 | "brk_group", 419 | "abbrev", 420 | "postal", 421 | "formal_en", 422 | "formal_fr", 423 | "name_ciawf", 424 | "note_adm0", 425 | "note_brk", 426 | "name_sort", 427 | "name_alt", 428 | "pop_est", 429 | "pop_rank", 430 | "gdp_md_est", 431 | "pop_year", 432 | "lastcensus", 433 | "gdp_year", 434 | "economy", 435 | "income_grp", 436 | "wikipedia", 437 | "fips_10_", 438 | "iso_a2", 439 | "iso_a3", 440 | "iso_a3_eh", 441 | "iso_n3", 442 | "un_a3", 443 | "wb_a2", 444 | "wb_a3", 445 | "woe_id", 446 | "woe_id_eh", 447 | "woe_note", 448 | "adm0_a3_is", 449 | "adm0_a3_us", 450 | "adm0_a3_un", 451 | "adm0_a3_wb", 452 | "continent", 453 | "region_un", 454 | "subregion", 455 | "region_wb", 456 | "name_len", 457 | "long_len", 458 | "abbrev_len", 459 | "tiny", 460 | "homepart", 461 | "ne_id", 462 | "wikidataid", 463 | "name_ar", 464 | "name_bn", 465 | "name_de", 466 | "name_en", 467 | "name_es", 468 | "name_fr", 469 | "name_el", 470 | "name_hi", 471 | "name_hu", 472 | "name_id", 473 | "name_it", 474 | "name_ja", 475 | "name_ko", 476 | "name_nl", 477 | "name_pl", 478 | "name_pt", 479 | "name_ru", 480 | "name_sv", 481 | "name_tr", 482 | "name_vi", 483 | "name_zh", 484 | "geometry", 485 | "maptip" 486 | ] 487 | }, 488 | { 489 | "name": "qwc_demo" 490 | }, 491 | { 492 | "name": "edit_demo" 493 | }, 494 | { 495 | "name": "bluemarble_bg" 496 | }, 497 | { 498 | "name": "osm_bg" 499 | }, 500 | { 501 | "name": "osm_bg" 502 | }, 503 | { 504 | "name": "bluemarble_bg" 505 | } 506 | ], 507 | "print_templates": [ 508 | "A4 Landscape", 509 | "A3 Landscape" 510 | ] 511 | }, 512 | { 513 | "name": "scan/natural-earth-countries", 514 | "layers": [ 515 | { 516 | "name": "geographic_lines", 517 | "queryable": true, 518 | "info_template": true, 519 | "info_attributes": [ 520 | "ogc_fid", 521 | "scalerank", 522 | "name", 523 | "name_long", 524 | "abbrev", 525 | "note", 526 | "featurecla", 527 | "min_zoom", 528 | "wikidataid", 529 | "name_ar", 530 | "name_bn", 531 | "name_de", 532 | "name_en", 533 | "name_es", 534 | "name_fr", 535 | "name_el", 536 | "name_hi", 537 | "name_hu", 538 | "name_id", 539 | "name_it", 540 | "name_ja", 541 | "name_ko", 542 | "name_nl", 543 | "name_pl", 544 | "name_pt", 545 | "name_ru", 546 | "name_sv", 547 | "name_tr", 548 | "name_vi", 549 | "name_zh", 550 | "wdid_score", 551 | "ne_id", 552 | "geometry", 553 | "maptip" 554 | ], 555 | "attributes": [ 556 | "ogc_fid", 557 | "scalerank", 558 | "name", 559 | "name_long", 560 | "abbrev", 561 | "note", 562 | "featurecla", 563 | "min_zoom", 564 | "wikidataid", 565 | "name_ar", 566 | "name_bn", 567 | "name_de", 568 | "name_en", 569 | "name_es", 570 | "name_fr", 571 | "name_el", 572 | "name_hi", 573 | "name_hu", 574 | "name_id", 575 | "name_it", 576 | "name_ja", 577 | "name_ko", 578 | "name_nl", 579 | "name_pl", 580 | "name_pt", 581 | "name_ru", 582 | "name_sv", 583 | "name_tr", 584 | "name_vi", 585 | "name_zh", 586 | "wdid_score", 587 | "ne_id", 588 | "geometry", 589 | "maptip" 590 | ] 591 | }, 592 | { 593 | "name": "country_names", 594 | "queryable": true, 595 | "info_template": true, 596 | "info_attributes": [ 597 | "ogc_fid", 598 | "scalerank", 599 | "labelrank", 600 | "z_postal", 601 | "z_abbrev", 602 | "z_name", 603 | "z_admin", 604 | "featurecla", 605 | "sovereignt", 606 | "sov_a3", 607 | "adm0_dif", 608 | "level", 609 | "type", 610 | "admin", 611 | "adm0_a3", 612 | "geou_dif", 613 | "name", 614 | "abbrev", 615 | "postal", 616 | "name_forma", 617 | "terr_", 618 | "name_sort", 619 | "map_color", 620 | "pop_est", 621 | "gdp_md_est", 622 | "fips_10_", 623 | "iso_a2", 624 | "iso_a3", 625 | "iso_n3", 626 | "geometry", 627 | "maptip" 628 | ], 629 | "attributes": [ 630 | "ogc_fid", 631 | "scalerank", 632 | "labelrank", 633 | "z_postal", 634 | "z_abbrev", 635 | "z_name", 636 | "z_admin", 637 | "featurecla", 638 | "sovereignt", 639 | "sov_a3", 640 | "adm0_dif", 641 | "level", 642 | "type", 643 | "admin", 644 | "adm0_a3", 645 | "geou_dif", 646 | "name", 647 | "abbrev", 648 | "postal", 649 | "name_forma", 650 | "terr_", 651 | "name_sort", 652 | "map_color", 653 | "pop_est", 654 | "gdp_md_est", 655 | "fips_10_", 656 | "iso_a2", 657 | "iso_a3", 658 | "iso_n3", 659 | "geometry", 660 | "maptip" 661 | ] 662 | }, 663 | { 664 | "name": "states_provinces", 665 | "queryable": true, 666 | "info_template": true, 667 | "info_attributes": [ 668 | "featurecla", 669 | "name", 670 | "adm0_a3", 671 | "adm0_name", 672 | "sov_a3", 673 | "name_l", 674 | "name_r", 675 | "name_alt_l", 676 | "name_alt_r", 677 | "name_loc_l", 678 | "name_loc_r", 679 | "name_len_l", 680 | "name_len_r", 681 | "note", 682 | "type", 683 | "geometry", 684 | "maptip" 685 | ], 686 | "attributes": [ 687 | "featurecla", 688 | "name", 689 | "adm0_a3", 690 | "adm0_name", 691 | "sov_a3", 692 | "name_l", 693 | "name_r", 694 | "name_alt_l", 695 | "name_alt_r", 696 | "name_loc_l", 697 | "name_loc_r", 698 | "name_len_l", 699 | "name_len_r", 700 | "note", 701 | "type", 702 | "geometry", 703 | "maptip" 704 | ] 705 | }, 706 | { 707 | "name": "countries", 708 | "queryable": true, 709 | "info_template": true, 710 | "info_attributes": [ 711 | "featurecla", 712 | "sovereignt", 713 | "sov_a3", 714 | "adm0_dif", 715 | "level", 716 | "type", 717 | "admin", 718 | "adm0_a3", 719 | "geou_dif", 720 | "geounit", 721 | "gu_a3", 722 | "su_dif", 723 | "subunit", 724 | "su_a3", 725 | "brk_diff", 726 | "name", 727 | "name_long", 728 | "brk_a3", 729 | "brk_name", 730 | "brk_group", 731 | "abbrev", 732 | "postal", 733 | "formal_en", 734 | "formal_fr", 735 | "name_ciawf", 736 | "note_adm0", 737 | "note_brk", 738 | "name_sort", 739 | "name_alt", 740 | "pop_est", 741 | "pop_rank", 742 | "gdp_md_est", 743 | "pop_year", 744 | "lastcensus", 745 | "gdp_year", 746 | "economy", 747 | "income_grp", 748 | "wikipedia", 749 | "fips_10_", 750 | "iso_a2", 751 | "iso_a3", 752 | "iso_a3_eh", 753 | "iso_n3", 754 | "un_a3", 755 | "wb_a2", 756 | "wb_a3", 757 | "woe_id", 758 | "woe_id_eh", 759 | "woe_note", 760 | "adm0_a3_is", 761 | "adm0_a3_us", 762 | "adm0_a3_un", 763 | "adm0_a3_wb", 764 | "continent", 765 | "region_un", 766 | "subregion", 767 | "region_wb", 768 | "name_len", 769 | "long_len", 770 | "abbrev_len", 771 | "tiny", 772 | "homepart", 773 | "ne_id", 774 | "wikidataid", 775 | "name_ar", 776 | "name_bn", 777 | "name_de", 778 | "name_en", 779 | "name_es", 780 | "name_fr", 781 | "name_el", 782 | "name_hi", 783 | "name_hu", 784 | "name_id", 785 | "name_it", 786 | "name_ja", 787 | "name_ko", 788 | "name_nl", 789 | "name_pl", 790 | "name_pt", 791 | "name_ru", 792 | "name_sv", 793 | "name_tr", 794 | "name_vi", 795 | "name_zh", 796 | "geometry", 797 | "maptip" 798 | ], 799 | "attributes": [ 800 | "featurecla", 801 | "sovereignt", 802 | "sov_a3", 803 | "adm0_dif", 804 | "level", 805 | "type", 806 | "admin", 807 | "adm0_a3", 808 | "geou_dif", 809 | "geounit", 810 | "gu_a3", 811 | "su_dif", 812 | "subunit", 813 | "su_a3", 814 | "brk_diff", 815 | "name", 816 | "name_long", 817 | "brk_a3", 818 | "brk_name", 819 | "brk_group", 820 | "abbrev", 821 | "postal", 822 | "formal_en", 823 | "formal_fr", 824 | "name_ciawf", 825 | "note_adm0", 826 | "note_brk", 827 | "name_sort", 828 | "name_alt", 829 | "pop_est", 830 | "pop_rank", 831 | "gdp_md_est", 832 | "pop_year", 833 | "lastcensus", 834 | "gdp_year", 835 | "economy", 836 | "income_grp", 837 | "wikipedia", 838 | "fips_10_", 839 | "iso_a2", 840 | "iso_a3", 841 | "iso_a3_eh", 842 | "iso_n3", 843 | "un_a3", 844 | "wb_a2", 845 | "wb_a3", 846 | "woe_id", 847 | "woe_id_eh", 848 | "woe_note", 849 | "adm0_a3_is", 850 | "adm0_a3_us", 851 | "adm0_a3_un", 852 | "adm0_a3_wb", 853 | "continent", 854 | "region_un", 855 | "subregion", 856 | "region_wb", 857 | "name_len", 858 | "long_len", 859 | "abbrev_len", 860 | "tiny", 861 | "homepart", 862 | "ne_id", 863 | "wikidataid", 864 | "name_ar", 865 | "name_bn", 866 | "name_de", 867 | "name_en", 868 | "name_es", 869 | "name_fr", 870 | "name_el", 871 | "name_hi", 872 | "name_hu", 873 | "name_id", 874 | "name_it", 875 | "name_ja", 876 | "name_ko", 877 | "name_nl", 878 | "name_pl", 879 | "name_pt", 880 | "name_ru", 881 | "name_sv", 882 | "name_tr", 883 | "name_vi", 884 | "name_zh", 885 | "geometry", 886 | "maptip" 887 | ] 888 | }, 889 | { 890 | "name": "qwc_demo" 891 | } 892 | ], 893 | "print_templates": [ 894 | "A3 Landscape" 895 | ] 896 | } 897 | ], 898 | "wfs_services": [], 899 | "background_layers": [ 900 | "mapnik", 901 | "bluemarble" 902 | ], 903 | "data_datasets": [], 904 | "viewer_tasks": [], 905 | "theme_info_links": [], 906 | "plugin_data": [], 907 | "dataproducts": [], 908 | "document_templates": [ 909 | "Country" 910 | ], 911 | "print_templates": [], 912 | "solr_facets": [ 913 | "ne_10m_admin_0_countries" 914 | ], 915 | "external_links": [] 916 | } 917 | }, 918 | { 919 | "role": "admin", 920 | "permissions": { 921 | "wms_services": [], 922 | "wfs_services": [], 923 | "background_layers": [], 924 | "data_datasets": [ 925 | { 926 | "name": "qwc_demo.edit_lines", 927 | "attributes": [ 928 | "id", 929 | "name", 930 | "description", 931 | "num", 932 | "value", 933 | "type", 934 | "amount", 935 | "validated", 936 | "datetime" 937 | ], 938 | "writable": true, 939 | "creatable": true, 940 | "readable": true, 941 | "updatable": true, 942 | "deletable": true 943 | }, 944 | { 945 | "name": "qwc_demo.edit_points", 946 | "attributes": [ 947 | "id", 948 | "name", 949 | "description", 950 | "num", 951 | "value", 952 | "type", 953 | "amount", 954 | "validated", 955 | "datetime" 956 | ], 957 | "writable": true, 958 | "creatable": true, 959 | "readable": true, 960 | "updatable": true, 961 | "deletable": true 962 | }, 963 | { 964 | "name": "qwc_demo.edit_polygons", 965 | "attributes": [ 966 | "id", 967 | "name", 968 | "description", 969 | "num", 970 | "value", 971 | "type", 972 | "amount", 973 | "validated", 974 | "datetime" 975 | ], 976 | "writable": true, 977 | "creatable": true, 978 | "readable": true, 979 | "updatable": true, 980 | "deletable": true 981 | } 982 | ], 983 | "viewer_tasks": [], 984 | "theme_info_links": [], 985 | "plugin_data": [], 986 | "dataproducts": [], 987 | "document_templates": [], 988 | "print_templates": [], 989 | "solr_facets": [], 990 | "external_links": [] 991 | } 992 | } 993 | ] 994 | } -------------------------------------------------------------------------------- /volumes/config/default/printConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/qwc-services/qwc-print-service/raw/master/schemas/qwc-print-service.json", 3 | "service": "print", 4 | "config": { 5 | "ogc_service_url": "http://qwc-ogc-service:9090/" 6 | }, 7 | "resources": { 8 | "print_templates": [ 9 | { 10 | "template": "A4 Landscape" 11 | }, 12 | { 13 | "template": "A3 Landscape" 14 | }, 15 | { 16 | "template": "A3 Landscape" 17 | } 18 | ] 19 | } 20 | } -------------------------------------------------------------------------------- /volumes/config/default/searchConfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://github.com/qwc-services/qwc-fulltext-search-service/raw/master/schemas/qwc-search-service.json", 3 | "service": "search", 4 | "config": { 5 | "db_url": "postgresql:///?service=qwc_geodb", 6 | "search_backend": "solr", 7 | "search_result_limit": 50, 8 | "solr_service_url": "http://qwc-solr:8983/solr/gdi/select" 9 | }, 10 | "resources": { 11 | "facets": [ 12 | { 13 | "name": "ne_10m_admin_0_countries", 14 | "filter_word": "Country", 15 | "table_name": "qwc_geodb.ne_10m_admin_0_countries", 16 | "geometry_column": "wkb_geometry", 17 | "search_id_col": "ogc_fid" 18 | } 19 | ] 20 | } 21 | } -------------------------------------------------------------------------------- /volumes/demo-data/setup-demo-data-permissions.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Add resources and permissions for demo data 4 | qwc_config_schema=${QWC_CONFIG_SCHEMA:-qwc_config} 5 | psql -v ON_ERROR_STOP=1 "service=$PGSERVICE" <<-EOSQL 6 | INSERT INTO ${qwc_config_schema}.resources (id, parent_id, type, name) 7 | VALUES 8 | (1, NULL, 'solr_facet', 'ne_10m_admin_0_countries'), 9 | (2, NULL, 'map', 'qwc_demo'), 10 | (3, 2, 'data', 'edit_points'), 11 | (4, 2, 'data', 'edit_lines'), 12 | (5, 2, 'data', 'edit_polygons'); 13 | INSERT INTO ${qwc_config_schema}.permissions (id, role_id, resource_id, priority, write) 14 | VALUES 15 | (1, 1, 1, 0, FALSE), 16 | (5, 1, 2, 0, FALSE), 17 | (2, 2, 4, 0, TRUE), 18 | (3, 2, 3, 0, TRUE), 19 | (4, 2, 5, 0, TRUE); 20 | SELECT setval('${qwc_config_schema}.resources_id_seq', (SELECT MAX(id) FROM ${qwc_config_schema}.resources)); 21 | SELECT setval('${qwc_config_schema}.permissions_id_seq', (SELECT MAX(id) FROM ${qwc_config_schema}.permissions)); 22 | 23 | EOSQL 24 | -------------------------------------------------------------------------------- /volumes/demo-data/setup-demo-data.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | cd /tmp 4 | 5 | curl -L https://qwc2.sourcepole.ch/data/qwc_geodb.backup > qwc_geodb.backup 6 | pg_restore -U "$POSTGRES_USER" -d qwc_services -1 qwc_geodb.backup 7 | -------------------------------------------------------------------------------- /volumes/info-templates/qwc_demo/countries.html: -------------------------------------------------------------------------------- 1 |
2 |

Country {{ feature.name }}

3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
Formal name:{{ feature.formal_en }}
Continent:{{ feature.continent }}
Subregion:{{ feature.subregion }}
Pop est.:{{ feature.pop_est }} ({{ feature.pop_year }})
17 |
18 | -------------------------------------------------------------------------------- /volumes/legends/qwc_demo/edit_lines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/legends/qwc_demo/edit_lines.png -------------------------------------------------------------------------------- /volumes/legends/qwc_demo/edit_lines_thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/legends/qwc_demo/edit_lines_thumbnail.png -------------------------------------------------------------------------------- /volumes/legends/qwc_demo/edit_points.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/legends/qwc_demo/edit_points.png -------------------------------------------------------------------------------- /volumes/legends/qwc_demo/edit_points_thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/legends/qwc_demo/edit_points_thumbnail.png -------------------------------------------------------------------------------- /volumes/legends/qwc_demo/edit_polygons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/legends/qwc_demo/edit_polygons.png -------------------------------------------------------------------------------- /volumes/legends/qwc_demo/edit_polygons_thumbnail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/legends/qwc_demo/edit_polygons_thumbnail.png -------------------------------------------------------------------------------- /volumes/qwc2/assets/catalog.json: -------------------------------------------------------------------------------- 1 | { 2 | "catalog": [ 3 | { 4 | "title": "World Cities", 5 | "resource": "wms:https://demo.mapserver.org/cgi-bin/wms#cities" 6 | }, 7 | { 8 | "title": "EMODnet", 9 | "sublayers": [ 10 | { 11 | "title": "Lighthouses", 12 | "resource": "wms:https://ows.emodnet-humanactivities.eu/geoserver/emodnet/wms#lighthouses" 13 | }, 14 | { 15 | "title": "Main Ports", 16 | "resource": "wms:https://ows.emodnet-humanactivities.eu/geoserver/emodnet/wms#portlocations" 17 | }, 18 | { 19 | "title": "Pipelines", 20 | "resource": "wms:https://ows.emodnet-humanactivities.eu/geoserver/emodnet/wms#pipelines" 21 | } 22 | ] 23 | } 24 | ] 25 | } 26 | -------------------------------------------------------------------------------- /volumes/qwc2/assets/css/colorschemes.css: -------------------------------------------------------------------------------- 1 | :root.highcontrast { 2 | /* Base colors */ 3 | --text-color: black; 4 | --text-color-link: blue; 5 | --text-color-disabled: #999; 6 | --container-bg-color: white; 7 | --input-bg-color: white; 8 | --input-bg-color-disabled: white; 9 | --border-color: black; 10 | --color-active: blue; 11 | --focus-outline: 2px solid black; 12 | /* Tooltips */ 13 | --tooltip-bg-color: rgba(0, 0, 0, 0.75); 14 | --tooltip-text-color: white; 15 | --tooltip-border-color: black; 16 | /* Map buttons */ 17 | --map-button-bg-color: black; 18 | --map-button-text-color: white; 19 | --map-button-hover-bg-color: white; 20 | --map-button-hover-text-color: black; 21 | --map-button-active-bg-color: white; 22 | --map-button-active-text-color: black; 23 | /* Panels (topbar and bottom bar) */ 24 | --panel-bg-color: rgba(255, 255, 255, 0.85); 25 | --panel-text-color: black; 26 | /* Titlebars */ 27 | --titlebar-bg-color: black; 28 | --titlebar-text-color: white; 29 | /* Button */ 30 | --button-bg-color: white; 31 | --button-bg-color-hover: #ddd; 32 | --button-bg-color-active: black; 33 | --button-bg-color-active-hover: #222; 34 | --button-bg-color-disabled: white; 35 | --button-text-color: black; 36 | --button-text-color-hover: black; 37 | --button-text-color-active: white; 38 | --button-text-color-active-hover: white; 39 | --button-text-color-disabled: #999; 40 | /* List */ 41 | --list-bg-color: white; 42 | --list-section-bg-color: black; 43 | --list-section-text-color: white; 44 | --list-item-bg-color-even: #eee; 45 | --list-item-bg-color-hover: #ddd; 46 | --list-item-bg-color-active: #aaa; 47 | --list-item-bg-color-active-hover: #bbb; 48 | --list-item-text-color-hover: black; 49 | --list-item-text-color-active: black; 50 | --list-item-text-color-active-hover: black; 51 | /* App menu */ 52 | --app-menu-bg-color: white; 53 | --app-menu-text-color: black; 54 | --app-menu-bg-color-hover: #ddd; 55 | --app-menu-text-color-hover: black; 56 | --app-submenu-bg-color: black; 57 | --app-submenu-text-color: white; 58 | --app-submenu-bg-color-hover: #222; 59 | --app-submenu-text-color-hover: white; 60 | } 61 | 62 | :root.dark { 63 | /* Base colors */ 64 | --text-color: white; 65 | --text-color-link: #AAAAFF; 66 | --container-bg-color: #333; 67 | --input-bg-color: #3f3f3f; 68 | --input-bg-color-disabled: #252526; 69 | --text-color-disabled: #999; 70 | --border-color: #2c2c2c; 71 | --color-active: #AAAAFF; 72 | --focus-outline: 2px solid #007acc; 73 | /* Tooltips */ 74 | --tooltip-bg-color: rgba(0, 0, 0, 0.75); 75 | --tooltip-text-color: white; 76 | --tooltip-border-color: black; 77 | /* Map buttons */ 78 | --map-button-bg-color: #595959; 79 | --map-button-text-color: white; 80 | --map-button-hover-bg-color: #f2f2f2; 81 | --map-button-hover-text-color: #595959; 82 | --map-button-active-bg-color: #f2f2f2; 83 | --map-button-active-text-color: #595959; 84 | /* Panels (topbar and bottom bar) */ 85 | --panel-bg-color: rgba(42, 46, 50, 0.85); 86 | --panel-text-color: white; 87 | /* Titlebars */ 88 | --titlebar-bg-color: #475057; 89 | --titlebar-text-color: white; 90 | /* Button */ 91 | --button-bg-color: #3f3f3f; 92 | --button-bg-color-hover: #3a3a3a; 93 | --button-bg-color-active: #202020; 94 | --button-bg-color-active-hover: #1a1a1a; 95 | --button-bg-color-disabled: #333; 96 | --button-text-color: white; 97 | --button-text-color-hover: white; 98 | --button-text-color-active: white; 99 | --button-text-color-active-hover: white; 100 | --button-text-color-disabled: #666; 101 | /* List */ 102 | --list-bg-color: #3f3f3f; 103 | --list-section-bg-color: black; 104 | --list-section-text-color: white; 105 | --list-item-bg-color-even: #393939; 106 | --list-item-bg-color-hover: #292929; 107 | --list-item-bg-color-active: #1f1f1f; 108 | --list-item-bg-color-active-hover: #0f0f0f; 109 | --list-item-text-color-hover: white; 110 | --list-item-text-color-active: white; 111 | --list-item-text-color-active-hover: white; 112 | /* App menu */ 113 | --app-menu-bg-color: #4f4f4f; 114 | --app-menu-text-color: white; 115 | --app-menu-bg-color-hover: #666; 116 | --app-menu-text-color-hover: white; 117 | --app-submenu-bg-color: #222; 118 | --app-submenu-text-color: white; 119 | --app-submenu-bg-color-hover: #404040; 120 | --app-submenu-text-color-hover: white; 121 | } 122 | 123 | -------------------------------------------------------------------------------- /volumes/qwc2/assets/css/qwc2.css: -------------------------------------------------------------------------------- 1 | /* Add any custom CSS here */ 2 | -------------------------------------------------------------------------------- /volumes/qwc2/assets/forms/autogen/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /volumes/qwc2/assets/help.html: -------------------------------------------------------------------------------- 1 |
2 |

3 | 4 |

5 |

6 | Homepage
7 | Demo viewer
8 |

9 |

QWC2 Build $VERSION$

10 |
11 | -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/app_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/qwc2/assets/img/app_icon.png -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/app_icon_114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/qwc2/assets/img/app_icon_114.png -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/app_icon_144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/qwc2/assets/img/app_icon_144.png -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/app_icon_72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/qwc2/assets/img/app_icon_72.png -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/qwc2/assets/img/favicon.ico -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/genmapthumbs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/logo-mobile.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 24 | 26 | 29 | 33 | 34 | 37 | 41 | 42 | 45 | 49 | 50 | 53 | 57 | 58 | 65 | 75 | 76 | 98 | 100 | 101 | 103 | image/svg+xml 104 | 106 | 107 | 108 | 109 | 110 | 115 | 118 | 124 | 142 | 160 | 178 | 196 | 199 | 207 | 215 | 216 | 222 | 223 | 224 | 225 | -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 23 | 25 | 28 | 32 | 33 | 36 | 40 | 41 | 44 | 48 | 49 | 52 | 56 | 57 | 64 | 74 | 75 | 100 | 114 | 115 | 117 | 118 | 120 | image/svg+xml 121 | 123 | 124 | 125 | 126 | 131 | 144 | 148 | 155 | 157 | 161 | 166 | 171 | 174 | 178 | 184 | 202 | 220 | 238 | 256 | 260 | 268 | 276 | 277 | 283 | 284 | 287 | 292 | 297 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/mapthumbs/bluemarble.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/qwc2/assets/img/mapthumbs/bluemarble.jpg -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/mapthumbs/default.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/qwc2/assets/img/mapthumbs/default.jpg -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/mapthumbs/mapnik.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/qwc2/assets/img/mapthumbs/mapnik.jpg -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/mapthumbs/natural-earth-countries.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/qwc2/assets/img/mapthumbs/natural-earth-countries.png -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/mapthumbs/qwc_demo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/qwc2/assets/img/mapthumbs/qwc_demo.jpg -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/qwc-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 20 | 22 | 25 | 29 | 30 | 33 | 37 | 38 | 41 | 45 | 46 | 49 | 53 | 54 | 61 | 71 | 81 | 82 | 103 | 105 | 106 | 108 | image/svg+xml 109 | 111 | 112 | 113 | 114 | 118 | 121 | 128 | 146 | 154 | 172 | 190 | 208 | 216 | 217 | 218 | 219 | -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/search/dataproduct.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /volumes/qwc2/assets/img/search/feature.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /volumes/qwc2/assets/templates/legendprint.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Legend 5 | 6 | 7 |

Map legend

8 |
9 |
10 | 11 | 12 | -------------------------------------------------------------------------------- /volumes/qwc2/dist/.gitignore: -------------------------------------------------------------------------------- 1 | QWC2App.js* 2 | -------------------------------------------------------------------------------- /volumes/solr/configsets/gdi/conf/dih_geodata_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /volumes/solr/configsets/gdi/conf/dih_metadata_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /volumes/solr/configsets/gdi/conf/lang/contractions_ca.txt: -------------------------------------------------------------------------------- 1 | # Set of Catalan contractions for ElisionFilter 2 | # TODO: load this as a resource from the analyzer and sync it in build.xml 3 | d 4 | l 5 | m 6 | n 7 | s 8 | t 9 | -------------------------------------------------------------------------------- /volumes/solr/configsets/gdi/conf/lang/contractions_fr.txt: -------------------------------------------------------------------------------- 1 | # Set of French contractions for ElisionFilter 2 | # TODO: load this as a resource from the analyzer and sync it in build.xml 3 | l 4 | m 5 | t 6 | qu 7 | n 8 | s 9 | j 10 | d 11 | c 12 | jusqu 13 | quoiqu 14 | lorsqu 15 | puisqu 16 | -------------------------------------------------------------------------------- /volumes/solr/configsets/gdi/conf/lang/contractions_ga.txt: -------------------------------------------------------------------------------- 1 | # Set of Irish contractions for ElisionFilter 2 | # TODO: load this as a resource from the analyzer and sync it in build.xml 3 | d 4 | m 5 | b 6 | -------------------------------------------------------------------------------- /volumes/solr/configsets/gdi/conf/lang/contractions_it.txt: -------------------------------------------------------------------------------- 1 | # Set of Italian contractions for ElisionFilter 2 | # TODO: load this as a resource from the analyzer and sync it in build.xml 3 | c 4 | l 5 | all 6 | dall 7 | dell 8 | nell 9 | sull 10 | coll 11 | pell 12 | gl 13 | agl 14 | dagl 15 | degl 16 | negl 17 | sugl 18 | un 19 | m 20 | t 21 | s 22 | v 23 | d 24 | -------------------------------------------------------------------------------- /volumes/solr/configsets/gdi/conf/lang/hyphenations_ga.txt: -------------------------------------------------------------------------------- 1 | # Set of Irish hyphenations for StopFilter 2 | # TODO: load this as a resource from the analyzer and sync it in build.xml 3 | h 4 | n 5 | t 6 | -------------------------------------------------------------------------------- /volumes/solr/configsets/gdi/conf/lang/stemdict_nl.txt: -------------------------------------------------------------------------------- 1 | # Set of overrides for the dutch stemmer 2 | # TODO: load this as a resource from the analyzer and sync it in build.xml 3 | fiets fiets 4 | bromfiets bromfiets 5 | ei eier 6 | kind kinder 7 | -------------------------------------------------------------------------------- /volumes/solr/configsets/gdi/conf/lang/stoptags_ja.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This file defines a Japanese stoptag set for JapanesePartOfSpeechStopFilter. 3 | # 4 | # Any token with a part-of-speech tag that exactly matches those defined in this 5 | # file are removed from the token stream. 6 | # 7 | # Set your own stoptags by uncommenting the lines below. Note that comments are 8 | # not allowed on the same line as a stoptag. See LUCENE-3745 for frequency lists, 9 | # etc. that can be useful for building you own stoptag set. 10 | # 11 | # The entire possible tagset is provided below for convenience. 12 | # 13 | ##### 14 | # noun: unclassified nouns 15 | #名詞 16 | # 17 | # noun-common: Common nouns or nouns where the sub-classification is undefined 18 | #名詞-一般 19 | # 20 | # noun-proper: Proper nouns where the sub-classification is undefined 21 | #名詞-固有名詞 22 | # 23 | # noun-proper-misc: miscellaneous proper nouns 24 | #名詞-固有名詞-一般 25 | # 26 | # noun-proper-person: Personal names where the sub-classification is undefined 27 | #名詞-固有名詞-人名 28 | # 29 | # noun-proper-person-misc: names that cannot be divided into surname and 30 | # given name; foreign names; names where the surname or given name is unknown. 31 | # e.g. お市の方 32 | #名詞-固有名詞-人名-一般 33 | # 34 | # noun-proper-person-surname: Mainly Japanese surnames. 35 | # e.g. 山田 36 | #名詞-固有名詞-人名-姓 37 | # 38 | # noun-proper-person-given_name: Mainly Japanese given names. 39 | # e.g. 太郎 40 | #名詞-固有名詞-人名-名 41 | # 42 | # noun-proper-organization: Names representing organizations. 43 | # e.g. 通産省, NHK 44 | #名詞-固有名詞-組織 45 | # 46 | # noun-proper-place: Place names where the sub-classification is undefined 47 | #名詞-固有名詞-地域 48 | # 49 | # noun-proper-place-misc: Place names excluding countries. 50 | # e.g. アジア, バルセロナ, 京都 51 | #名詞-固有名詞-地域-一般 52 | # 53 | # noun-proper-place-country: Country names. 54 | # e.g. 日本, オーストラリア 55 | #名詞-固有名詞-地域-国 56 | # 57 | # noun-pronoun: Pronouns where the sub-classification is undefined 58 | #名詞-代名詞 59 | # 60 | # noun-pronoun-misc: miscellaneous pronouns: 61 | # e.g. それ, ここ, あいつ, あなた, あちこち, いくつ, どこか, なに, みなさん, みんな, わたくし, われわれ 62 | #名詞-代名詞-一般 63 | # 64 | # noun-pronoun-contraction: Spoken language contraction made by combining a 65 | # pronoun and the particle 'wa'. 66 | # e.g. ありゃ, こりゃ, こりゃあ, そりゃ, そりゃあ 67 | #名詞-代名詞-縮約 68 | # 69 | # noun-adverbial: Temporal nouns such as names of days or months that behave 70 | # like adverbs. Nouns that represent amount or ratios and can be used adverbially, 71 | # e.g. 金曜, 一月, 午後, 少量 72 | #名詞-副詞可能 73 | # 74 | # noun-verbal: Nouns that take arguments with case and can appear followed by 75 | # 'suru' and related verbs (する, できる, なさる, くださる) 76 | # e.g. インプット, 愛着, 悪化, 悪戦苦闘, 一安心, 下取り 77 | #名詞-サ変接続 78 | # 79 | # noun-adjective-base: The base form of adjectives, words that appear before な ("na") 80 | # e.g. 健康, 安易, 駄目, だめ 81 | #名詞-形容動詞語幹 82 | # 83 | # noun-numeric: Arabic numbers, Chinese numerals, and counters like 何 (回), 数. 84 | # e.g. 0, 1, 2, 何, 数, 幾 85 | #名詞-数 86 | # 87 | # noun-affix: noun affixes where the sub-classification is undefined 88 | #名詞-非自立 89 | # 90 | # noun-affix-misc: Of adnominalizers, the case-marker の ("no"), and words that 91 | # attach to the base form of inflectional words, words that cannot be classified 92 | # into any of the other categories below. This category includes indefinite nouns. 93 | # e.g. あかつき, 暁, かい, 甲斐, 気, きらい, 嫌い, くせ, 癖, こと, 事, ごと, 毎, しだい, 次第, 94 | # 順, せい, 所為, ついで, 序で, つもり, 積もり, 点, どころ, の, はず, 筈, はずみ, 弾み, 95 | # 拍子, ふう, ふり, 振り, ほう, 方, 旨, もの, 物, 者, ゆえ, 故, ゆえん, 所以, わけ, 訳, 96 | # わり, 割り, 割, ん-口語/, もん-口語/ 97 | #名詞-非自立-一般 98 | # 99 | # noun-affix-adverbial: noun affixes that that can behave as adverbs. 100 | # e.g. あいだ, 間, あげく, 挙げ句, あと, 後, 余り, 以外, 以降, 以後, 以上, 以前, 一方, うえ, 101 | # 上, うち, 内, おり, 折り, かぎり, 限り, きり, っきり, 結果, ころ, 頃, さい, 際, 最中, さなか, 102 | # 最中, じたい, 自体, たび, 度, ため, 為, つど, 都度, とおり, 通り, とき, 時, ところ, 所, 103 | # とたん, 途端, なか, 中, のち, 後, ばあい, 場合, 日, ぶん, 分, ほか, 他, まえ, 前, まま, 104 | # 儘, 侭, みぎり, 矢先 105 | #名詞-非自立-副詞可能 106 | # 107 | # noun-affix-aux: noun affixes treated as 助動詞 ("auxiliary verb") in school grammars 108 | # with the stem よう(だ) ("you(da)"). 109 | # e.g. よう, やう, 様 (よう) 110 | #名詞-非自立-助動詞語幹 111 | # 112 | # noun-affix-adjective-base: noun affixes that can connect to the indeclinable 113 | # connection form な (aux "da"). 114 | # e.g. みたい, ふう 115 | #名詞-非自立-形容動詞語幹 116 | # 117 | # noun-special: special nouns where the sub-classification is undefined. 118 | #名詞-特殊 119 | # 120 | # noun-special-aux: The そうだ ("souda") stem form that is used for reporting news, is 121 | # treated as 助動詞 ("auxiliary verb") in school grammars, and attach to the base 122 | # form of inflectional words. 123 | # e.g. そう 124 | #名詞-特殊-助動詞語幹 125 | # 126 | # noun-suffix: noun suffixes where the sub-classification is undefined. 127 | #名詞-接尾 128 | # 129 | # noun-suffix-misc: Of the nouns or stem forms of other parts of speech that connect 130 | # to ガル or タイ and can combine into compound nouns, words that cannot be classified into 131 | # any of the other categories below. In general, this category is more inclusive than 132 | # 接尾語 ("suffix") and is usually the last element in a compound noun. 133 | # e.g. おき, かた, 方, 甲斐 (がい), がかり, ぎみ, 気味, ぐるみ, (~した) さ, 次第, 済 (ず) み, 134 | # よう, (でき)っこ, 感, 観, 性, 学, 類, 面, 用 135 | #名詞-接尾-一般 136 | # 137 | # noun-suffix-person: Suffixes that form nouns and attach to person names more often 138 | # than other nouns. 139 | # e.g. 君, 様, 著 140 | #名詞-接尾-人名 141 | # 142 | # noun-suffix-place: Suffixes that form nouns and attach to place names more often 143 | # than other nouns. 144 | # e.g. 町, 市, 県 145 | #名詞-接尾-地域 146 | # 147 | # noun-suffix-verbal: Of the suffixes that attach to nouns and form nouns, those that 148 | # can appear before スル ("suru"). 149 | # e.g. 化, 視, 分け, 入り, 落ち, 買い 150 | #名詞-接尾-サ変接続 151 | # 152 | # noun-suffix-aux: The stem form of そうだ (様態) that is used to indicate conditions, 153 | # is treated as 助動詞 ("auxiliary verb") in school grammars, and attach to the 154 | # conjunctive form of inflectional words. 155 | # e.g. そう 156 | #名詞-接尾-助動詞語幹 157 | # 158 | # noun-suffix-adjective-base: Suffixes that attach to other nouns or the conjunctive 159 | # form of inflectional words and appear before the copula だ ("da"). 160 | # e.g. 的, げ, がち 161 | #名詞-接尾-形容動詞語幹 162 | # 163 | # noun-suffix-adverbial: Suffixes that attach to other nouns and can behave as adverbs. 164 | # e.g. 後 (ご), 以後, 以降, 以前, 前後, 中, 末, 上, 時 (じ) 165 | #名詞-接尾-副詞可能 166 | # 167 | # noun-suffix-classifier: Suffixes that attach to numbers and form nouns. This category 168 | # is more inclusive than 助数詞 ("classifier") and includes common nouns that attach 169 | # to numbers. 170 | # e.g. 個, つ, 本, 冊, パーセント, cm, kg, カ月, か国, 区画, 時間, 時半 171 | #名詞-接尾-助数詞 172 | # 173 | # noun-suffix-special: Special suffixes that mainly attach to inflecting words. 174 | # e.g. (楽し) さ, (考え) 方 175 | #名詞-接尾-特殊 176 | # 177 | # noun-suffix-conjunctive: Nouns that behave like conjunctions and join two words 178 | # together. 179 | # e.g. (日本) 対 (アメリカ), 対 (アメリカ), (3) 対 (5), (女優) 兼 (主婦) 180 | #名詞-接続詞的 181 | # 182 | # noun-verbal_aux: Nouns that attach to the conjunctive particle て ("te") and are 183 | # semantically verb-like. 184 | # e.g. ごらん, ご覧, 御覧, 頂戴 185 | #名詞-動詞非自立的 186 | # 187 | # noun-quotation: text that cannot be segmented into words, proverbs, Chinese poetry, 188 | # dialects, English, etc. Currently, the only entry for 名詞 引用文字列 ("noun quotation") 189 | # is いわく ("iwaku"). 190 | #名詞-引用文字列 191 | # 192 | # noun-nai_adjective: Words that appear before the auxiliary verb ない ("nai") and 193 | # behave like an adjective. 194 | # e.g. 申し訳, 仕方, とんでも, 違い 195 | #名詞-ナイ形容詞語幹 196 | # 197 | ##### 198 | # prefix: unclassified prefixes 199 | #接頭詞 200 | # 201 | # prefix-nominal: Prefixes that attach to nouns (including adjective stem forms) 202 | # excluding numerical expressions. 203 | # e.g. お (水), 某 (氏), 同 (社), 故 (~氏), 高 (品質), お (見事), ご (立派) 204 | #接頭詞-名詞接続 205 | # 206 | # prefix-verbal: Prefixes that attach to the imperative form of a verb or a verb 207 | # in conjunctive form followed by なる/なさる/くださる. 208 | # e.g. お (読みなさい), お (座り) 209 | #接頭詞-動詞接続 210 | # 211 | # prefix-adjectival: Prefixes that attach to adjectives. 212 | # e.g. お (寒いですねえ), バカ (でかい) 213 | #接頭詞-形容詞接続 214 | # 215 | # prefix-numerical: Prefixes that attach to numerical expressions. 216 | # e.g. 約, およそ, 毎時 217 | #接頭詞-数接続 218 | # 219 | ##### 220 | # verb: unclassified verbs 221 | #動詞 222 | # 223 | # verb-main: 224 | #動詞-自立 225 | # 226 | # verb-auxiliary: 227 | #動詞-非自立 228 | # 229 | # verb-suffix: 230 | #動詞-接尾 231 | # 232 | ##### 233 | # adjective: unclassified adjectives 234 | #形容詞 235 | # 236 | # adjective-main: 237 | #形容詞-自立 238 | # 239 | # adjective-auxiliary: 240 | #形容詞-非自立 241 | # 242 | # adjective-suffix: 243 | #形容詞-接尾 244 | # 245 | ##### 246 | # adverb: unclassified adverbs 247 | #副詞 248 | # 249 | # adverb-misc: Words that can be segmented into one unit and where adnominal 250 | # modification is not possible. 251 | # e.g. あいかわらず, 多分 252 | #副詞-一般 253 | # 254 | # adverb-particle_conjunction: Adverbs that can be followed by の, は, に, 255 | # な, する, だ, etc. 256 | # e.g. こんなに, そんなに, あんなに, なにか, なんでも 257 | #副詞-助詞類接続 258 | # 259 | ##### 260 | # adnominal: Words that only have noun-modifying forms. 261 | # e.g. この, その, あの, どの, いわゆる, なんらかの, 何らかの, いろんな, こういう, そういう, ああいう, 262 | # どういう, こんな, そんな, あんな, どんな, 大きな, 小さな, おかしな, ほんの, たいした, 263 | # 「(, も) さる (ことながら)」, 微々たる, 堂々たる, 単なる, いかなる, 我が」「同じ, 亡き 264 | #連体詞 265 | # 266 | ##### 267 | # conjunction: Conjunctions that can occur independently. 268 | # e.g. が, けれども, そして, じゃあ, それどころか 269 | 接続詞 270 | # 271 | ##### 272 | # particle: unclassified particles. 273 | 助詞 274 | # 275 | # particle-case: case particles where the subclassification is undefined. 276 | 助詞-格助詞 277 | # 278 | # particle-case-misc: Case particles. 279 | # e.g. から, が, で, と, に, へ, より, を, の, にて 280 | 助詞-格助詞-一般 281 | # 282 | # particle-case-quote: the "to" that appears after nouns, a person’s speech, 283 | # quotation marks, expressions of decisions from a meeting, reasons, judgements, 284 | # conjectures, etc. 285 | # e.g. ( だ) と (述べた.), ( である) と (して執行猶予...) 286 | 助詞-格助詞-引用 287 | # 288 | # particle-case-compound: Compounds of particles and verbs that mainly behave 289 | # like case particles. 290 | # e.g. という, といった, とかいう, として, とともに, と共に, でもって, にあたって, に当たって, に当って, 291 | # にあたり, に当たり, に当り, に当たる, にあたる, において, に於いて,に於て, における, に於ける, 292 | # にかけ, にかけて, にかんし, に関し, にかんして, に関して, にかんする, に関する, に際し, 293 | # に際して, にしたがい, に従い, に従う, にしたがって, に従って, にたいし, に対し, にたいして, 294 | # に対して, にたいする, に対する, について, につき, につけ, につけて, につれ, につれて, にとって, 295 | # にとり, にまつわる, によって, に依って, に因って, により, に依り, に因り, による, に依る, に因る, 296 | # にわたって, にわたる, をもって, を以って, を通じ, を通じて, を通して, をめぐって, をめぐり, をめぐる, 297 | # って-口語/, ちゅう-関西弁「という」/, (何) ていう (人)-口語/, っていう-口語/, といふ, とかいふ 298 | 助詞-格助詞-連語 299 | # 300 | # particle-conjunctive: 301 | # e.g. から, からには, が, けれど, けれども, けど, し, つつ, て, で, と, ところが, どころか, とも, ども, 302 | # ながら, なり, ので, のに, ば, ものの, や ( した), やいなや, (ころん) じゃ(いけない)-口語/, 303 | # (行っ) ちゃ(いけない)-口語/, (言っ) たって (しかたがない)-口語/, (それがなく)ったって (平気)-口語/ 304 | 助詞-接続助詞 305 | # 306 | # particle-dependency: 307 | # e.g. こそ, さえ, しか, すら, は, も, ぞ 308 | 助詞-係助詞 309 | # 310 | # particle-adverbial: 311 | # e.g. がてら, かも, くらい, 位, ぐらい, しも, (学校) じゃ(これが流行っている)-口語/, 312 | # (それ)じゃあ (よくない)-口語/, ずつ, (私) なぞ, など, (私) なり (に), (先生) なんか (大嫌い)-口語/, 313 | # (私) なんぞ, (先生) なんて (大嫌い)-口語/, のみ, だけ, (私) だって-口語/, だに, 314 | # (彼)ったら-口語/, (お茶) でも (いかが), 等 (とう), (今後) とも, ばかり, ばっか-口語/, ばっかり-口語/, 315 | # ほど, 程, まで, 迄, (誰) も (が)([助詞-格助詞] および [助詞-係助詞] の前に位置する「も」) 316 | 助詞-副助詞 317 | # 318 | # particle-interjective: particles with interjective grammatical roles. 319 | # e.g. (松島) や 320 | 助詞-間投助詞 321 | # 322 | # particle-coordinate: 323 | # e.g. と, たり, だの, だり, とか, なり, や, やら 324 | 助詞-並立助詞 325 | # 326 | # particle-final: 327 | # e.g. かい, かしら, さ, ぜ, (だ)っけ-口語/, (とまってる) で-方言/, な, ナ, なあ-口語/, ぞ, ね, ネ, 328 | # ねぇ-口語/, ねえ-口語/, ねん-方言/, の, のう-口語/, や, よ, ヨ, よぉ-口語/, わ, わい-口語/ 329 | 助詞-終助詞 330 | # 331 | # particle-adverbial/conjunctive/final: The particle "ka" when unknown whether it is 332 | # adverbial, conjunctive, or sentence final. For example: 333 | # (a) 「A か B か」. Ex:「(国内で運用する) か,(海外で運用する) か (.)」 334 | # (b) Inside an adverb phrase. Ex:「(幸いという) か (, 死者はいなかった.)」 335 | # 「(祈りが届いたせい) か (, 試験に合格した.)」 336 | # (c) 「かのように」. Ex:「(何もなかった) か (のように振る舞った.)」 337 | # e.g. か 338 | 助詞-副助詞/並立助詞/終助詞 339 | # 340 | # particle-adnominalizer: The "no" that attaches to nouns and modifies 341 | # non-inflectional words. 342 | 助詞-連体化 343 | # 344 | # particle-adnominalizer: The "ni" and "to" that appear following nouns and adverbs 345 | # that are giongo, giseigo, or gitaigo. 346 | # e.g. に, と 347 | 助詞-副詞化 348 | # 349 | # particle-special: A particle that does not fit into one of the above classifications. 350 | # This includes particles that are used in Tanka, Haiku, and other poetry. 351 | # e.g. かな, けむ, ( しただろう) に, (あんた) にゃ(わからん), (俺) ん (家) 352 | 助詞-特殊 353 | # 354 | ##### 355 | # auxiliary-verb: 356 | 助動詞 357 | # 358 | ##### 359 | # interjection: Greetings and other exclamations. 360 | # e.g. おはよう, おはようございます, こんにちは, こんばんは, ありがとう, どうもありがとう, ありがとうございます, 361 | # いただきます, ごちそうさま, さよなら, さようなら, はい, いいえ, ごめん, ごめんなさい 362 | #感動詞 363 | # 364 | ##### 365 | # symbol: unclassified Symbols. 366 | 記号 367 | # 368 | # symbol-misc: A general symbol not in one of the categories below. 369 | # e.g. [○◎@$〒→+] 370 | 記号-一般 371 | # 372 | # symbol-comma: Commas 373 | # e.g. [,、] 374 | 記号-読点 375 | # 376 | # symbol-period: Periods and full stops. 377 | # e.g. [..。] 378 | 記号-句点 379 | # 380 | # symbol-space: Full-width whitespace. 381 | 記号-空白 382 | # 383 | # symbol-open_bracket: 384 | # e.g. [({‘“『【] 385 | 記号-括弧開 386 | # 387 | # symbol-close_bracket: 388 | # e.g. [)}’”』」】] 389 | 記号-括弧閉 390 | # 391 | # symbol-alphabetic: 392 | #記号-アルファベット 393 | # 394 | ##### 395 | # other: unclassified other 396 | #その他 397 | # 398 | # other-interjection: Words that are hard to classify as noun-suffixes or 399 | # sentence-final particles. 400 | # e.g. (だ)ァ 401 | その他-間投 402 | # 403 | ##### 404 | # filler: Aizuchi that occurs during a conversation or sounds inserted as filler. 405 | # e.g. あの, うんと, えと 406 | フィラー 407 | # 408 | ##### 409 | # non-verbal: non-verbal sound. 410 | 非言語音 411 | # 412 | ##### 413 | # fragment: 414 | #語断片 415 | # 416 | ##### 417 | # unknown: unknown part of speech. 418 | #未知語 419 | # 420 | ##### End of file 421 | -------------------------------------------------------------------------------- /volumes/solr/configsets/gdi/conf/lang/userdict_ja.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This is a sample user dictionary for Kuromoji (JapaneseTokenizer) 3 | # 4 | # Add entries to this file in order to override the statistical model in terms 5 | # of segmentation, readings and part-of-speech tags. Notice that entries do 6 | # not have weights since they are always used when found. This is by-design 7 | # in order to maximize ease-of-use. 8 | # 9 | # Entries are defined using the following CSV format: 10 | # , ... , ... , 11 | # 12 | # Notice that a single half-width space separates tokens and readings, and 13 | # that the number tokens and readings must match exactly. 14 | # 15 | # Also notice that multiple entries with the same is undefined. 16 | # 17 | # Whitespace only lines are ignored. Comments are not allowed on entry lines. 18 | # 19 | 20 | # Custom segmentation for kanji compounds 21 | 日本経済新聞,日本 経済 新聞,ニホン ケイザイ シンブン,カスタム名詞 22 | 関西国際空港,関西 国際 空港,カンサイ コクサイ クウコウ,カスタム名詞 23 | 24 | # Custom segmentation for compound katakana 25 | トートバッグ,トート バッグ,トート バッグ,かずカナ名詞 26 | ショルダーバッグ,ショルダー バッグ,ショルダー バッグ,かずカナ名詞 27 | 28 | # Custom reading for former sumo wrestler 29 | 朝青龍,朝青龍,アサショウリュウ,カスタム人名 30 | -------------------------------------------------------------------------------- /volumes/solr/configsets/gdi/conf/lib/postgresql-42.2.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/qwc-services/qwc-docker/f1f7103695dbf7af5eaf327f280c79e00cd8221e/volumes/solr/configsets/gdi/conf/lib/postgresql-42.2.5.jar -------------------------------------------------------------------------------- /volumes/solr/configsets/gdi/conf/params.json: -------------------------------------------------------------------------------- 1 | {"params":{ 2 | "query":{ 3 | "defType":"edismax", 4 | "q.alt":"*:*", 5 | "rows":"10", 6 | "fl":"*,score", 7 | "":{"v":0} 8 | }, 9 | "facets":{ 10 | "facet":"on", 11 | "facet.mincount": "1", 12 | "":{"v":0} 13 | }, 14 | "velocity":{ 15 | "wt": "velocity", 16 | "v.template":"browse", 17 | "v.layout": "layout", 18 | "":{"v":0} 19 | } 20 | }} -------------------------------------------------------------------------------- /volumes/solr/configsets/gdi/conf/protwords.txt: -------------------------------------------------------------------------------- 1 | # The ASF licenses this file to You under the Apache License, Version 2.0 2 | # (the "License"); you may not use this file except in compliance with 3 | # the License. You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 | # See the License for the specific language governing permissions and 11 | # limitations under the License. 12 | 13 | #----------------------------------------------------------------------- 14 | # Use a protected word file to protect against the stemmer reducing two 15 | # unrelated words to the same base word. 16 | 17 | # Some non-words that normally won't be encountered, 18 | # just to test that they won't be stemmed. 19 | dontstems 20 | zwhacky 21 | 22 | -------------------------------------------------------------------------------- /volumes/solr/configsets/gdi/conf/synonyms.txt: -------------------------------------------------------------------------------- 1 | # The ASF licenses this file to You under the Apache License, Version 2.0 2 | # (the "License"); you may not use this file except in compliance with 3 | # the License. You may obtain a copy of the License at 4 | # 5 | # http://www.apache.org/licenses/LICENSE-2.0 6 | # 7 | # Unless required by applicable law or agreed to in writing, software 8 | # distributed under the License is distributed on an "AS IS" BASIS, 9 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 | # See the License for the specific language governing permissions and 11 | # limitations under the License. 12 | 13 | #----------------------------------------------------------------------- 14 | #some test synonym mappings unlikely to appear in real input text 15 | aaafoo => aaabar 16 | bbbfoo => bbbfoo bbbbar 17 | cccfoo => cccbar cccbaz 18 | fooaaa,baraaa,bazaaa 19 | 20 | # Some synonym groups specific to this example 21 | GB,gib,gigabyte,gigabytes 22 | MB,mib,megabyte,megabytes 23 | Television, Televisions, TV, TVs 24 | #notice we use "gib" instead of "GiB" so any WordDelimiterGraphFilter coming 25 | #after us won't split it into two words. 26 | 27 | # Synonym mappings can be used for spelling correction too 28 | pixima => pixma 29 | 30 | -------------------------------------------------------------------------------- /volumes/solr/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /volumes/solr/security.json: -------------------------------------------------------------------------------- 1 | { 2 | "authentication": { 3 | "class": "solr.BasicAuthPlugin", 4 | "#credentials": { 5 | "solr": "IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c=" 6 | } 7 | }, 8 | "authorization": { 9 | "class": "solr.RuleBasedAuthorizationPlugin", 10 | "permissions": [ 11 | { 12 | "name": "security-edit", 13 | "role": "admin" 14 | }, 15 | { 16 | "name": "core-admin-read", 17 | "role": "admin" 18 | } 19 | ], 20 | "user-role": { 21 | "solr": "admin" 22 | } 23 | } 24 | } 25 | --------------------------------------------------------------------------------