From 133efe1453eab5288dc535bd14d087e23b3fb45d Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Sat, 20 Feb 2021 13:45:10 +0200 Subject: [PATCH 01/36] Airflow added in COVID-19 museum --- distributives/covid19museum/airflow.env | 13 +++++++++++++ distributives/covid19museum/airflow.yaml | 1 + 2 files changed, 14 insertions(+) create mode 100644 distributives/covid19museum/airflow.env create mode 120000 distributives/covid19museum/airflow.yaml diff --git a/distributives/covid19museum/airflow.env b/distributives/covid19museum/airflow.env new file mode 100644 index 0000000..36007de --- /dev/null +++ b/distributives/covid19museum/airflow.env @@ -0,0 +1,13 @@ +AIRFLOW__CORE__EXECUTOR=CeleryExecutor +AIRFLOW__WEBSERVER__RBAC=False +AIRFLOW__CORE__CHECK_SLAS=False +AIRFLOW__CORE__STORE_SERIALIZED_DAGS=False +AIRFLOW__CORE__PARALLELISM=50 +AIRFLOW__CORE__LOAD_EXAMPLES=False +AIRFLOW__CORE__LOAD_DEFAULT_CONNECTIONS=False +AIRFLOW__SCHEDULER__SCHEDULER_HEARTBEAT_SEC=10 +AIRFLOW__CELERY__BROKER_URL=redis://:@redis:6379/0 +AIRFLOW__CELERY__RESULT_BACKEND=db+postgresql://airflow:airflow@postgres_airflow:5432/airflow +AIRFLOW__CORE__SQL_ALCHEMY_CONN=postgresql+psycopg2://airflow:airflow@postgres_airflow:5432/airflow +AIRFLOW__CORE__FERNET_KEY=Zt62766f9667ea_zt4e3Ziq3LdUUO7F2Z95cvFFx16hU8jTeR1ASM= +DB_HOST=postgres_airflow diff --git a/distributives/covid19museum/airflow.yaml b/distributives/covid19museum/airflow.yaml new file mode 120000 index 0000000..4933585 --- /dev/null +++ b/distributives/covid19museum/airflow.yaml @@ -0,0 +1 @@ +../../services-available/workflows/airflow.yaml \ No newline at end of file From ee3ba5911b5a15d7e238fe9945dae7d5dac7dd41 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Sun, 21 Feb 2021 21:24:32 +0200 Subject: [PATCH 02/36] Superset removed --- distributives/analytics/superset | 1 - 1 file changed, 1 deletion(-) delete mode 160000 distributives/analytics/superset diff --git a/distributives/analytics/superset b/distributives/analytics/superset deleted file mode 160000 index 91db008..0000000 --- a/distributives/analytics/superset +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 91db008d72f1313f2b7593c5c6f2a3fddaf18a3e From 83bc0c77d1ba51f2534b668d21703522911b04f1 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Mon, 22 Feb 2021 13:27:13 +0200 Subject: [PATCH 03/36] Services names adjusted --- distributives/timemachine/{dataverse.yaml => dataverse-5.3.yaml} | 0 distributives/timemachine/{traefik.yaml => traefik-https.yaml} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename distributives/timemachine/{dataverse.yaml => dataverse-5.3.yaml} (100%) rename distributives/timemachine/{traefik.yaml => traefik-https.yaml} (100%) diff --git a/distributives/timemachine/dataverse.yaml b/distributives/timemachine/dataverse-5.3.yaml similarity index 100% rename from distributives/timemachine/dataverse.yaml rename to distributives/timemachine/dataverse-5.3.yaml diff --git a/distributives/timemachine/traefik.yaml b/distributives/timemachine/traefik-https.yaml similarity index 100% rename from distributives/timemachine/traefik.yaml rename to distributives/timemachine/traefik-https.yaml From cee7c87b1bc856c971b1f1b69d9674f090b13297 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Mon, 22 Feb 2021 13:28:47 +0200 Subject: [PATCH 04/36] Dataverse JDK11 infra adjusted --- distributives/dataverse-jdk11/dataverse.yaml | 1 - distributives/dataverse-jdk11/traefik.yaml | 1 - 2 files changed, 2 deletions(-) delete mode 120000 distributives/dataverse-jdk11/dataverse.yaml delete mode 120000 distributives/dataverse-jdk11/traefik.yaml diff --git a/distributives/dataverse-jdk11/dataverse.yaml b/distributives/dataverse-jdk11/dataverse.yaml deleted file mode 120000 index 8799d4d..0000000 --- a/distributives/dataverse-jdk11/dataverse.yaml +++ /dev/null @@ -1 +0,0 @@ -../../services-available/dataverse/dataverse-5.3.yaml \ No newline at end of file diff --git a/distributives/dataverse-jdk11/traefik.yaml b/distributives/dataverse-jdk11/traefik.yaml deleted file mode 120000 index f1b43d5..0000000 --- a/distributives/dataverse-jdk11/traefik.yaml +++ /dev/null @@ -1 +0,0 @@ -../../services-available/ingress/traefik-https.yaml \ No newline at end of file From 773c58050375d6b3a2989e0cd748ec9f068b25d0 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Mon, 22 Feb 2021 13:52:52 +0200 Subject: [PATCH 05/36] Timbuctoo image is old, deleted --- images/timbuctoo/Dockerfile | 11 -- images/timbuctoo/README.md | 23 ---- images/timbuctoo/example_config.yaml | 158 --------------------------- 3 files changed, 192 deletions(-) delete mode 100644 images/timbuctoo/Dockerfile delete mode 100644 images/timbuctoo/README.md delete mode 100644 images/timbuctoo/example_config.yaml diff --git a/images/timbuctoo/Dockerfile b/images/timbuctoo/Dockerfile deleted file mode 100644 index 984d7c9..0000000 --- a/images/timbuctoo/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -from huygensing/timbuctoo:latest -RUN apk add --no-cache curl -COPY timbuctoo /app -COPY easy100.nt /app -COPY ElsstTriples2017-10-02-033936.nt /app -ENV timbuctoo_elasticsearch_host=http://elasticsearch -ENV timbuctoo_elasticsearch_port=80 -ENV timbuctoo_elasticsearch_user=elastic -ENV timbuctoo_elasticsearch_password=changeme -ENV timbuctoo_search_url=http://elasticsearch:9200 -ENV timbuctoo_indexer_url=http://elasticsearch:9200 diff --git a/images/timbuctoo/README.md b/images/timbuctoo/README.md deleted file mode 100644 index acca1b2..0000000 --- a/images/timbuctoo/README.md +++ /dev/null @@ -1,23 +0,0 @@ -## Timbuctoo extension for CESSDA controlled vocabularies -This software is developed and supported by the [Huygens Institute](http://huygens.knaw.nl) in the Netherlands. - -### Installation -If you want to use European Language Social Science Thesaurus (ELSST) you should request it from [UKDA](https://elsst.ukdataservice.ac.uk/elsst-guide) in the form of .nt triples: ElsstTriples*.nt (* indicates version number). -Then copy ElsstTriples*.nt to timbuctoo folder: -``` -cp ElsstTriples*.nt ./timbuctoo/ -``` -You should use docker-compose-elsst.yml as basic configuration file to build Dataverse with Timbuctoo -``` -docker-compose -f docker-compose-elsst.yml build -docker-compose -f docker-compose-elsst.yml up -``` -### Usage -GraphiQL web interface will be available here: http://localhost:8090/static/graphiql. It allows visual data discovery of ELSST thesaurus to investigate relations between terms in different languages. - - -The thesaurus covers the core social science disciplines: politics, sociology, economics, education, law, crime, demography, health, employment, information and communication technology and, increasingly, environmental science. -It is currently available in 13 languages: Danish, Czech, English, Finnish, French, German, Greek, Lithuanian, Norwegian, Romanian, Slovenian, Spanish, and Swedish. - - -Timbuctoo API will deliver terms to Dataverse instances available in other languages than English. Depositors will get possibility to fill metadata with standardized values in their own language. diff --git a/images/timbuctoo/example_config.yaml b/images/timbuctoo/example_config.yaml deleted file mode 100644 index d7be705..0000000 --- a/images/timbuctoo/example_config.yaml +++ /dev/null @@ -1,158 +0,0 @@ -#This config allows you to run a local debug version of timbuctoo -#it also explains the options that you need to configure a production-worthy version - -securityConfiguration: - "@class": nl.knaw.huygens.timbuctoo.server.security.OldStyleSecurityFactoryConfiguration - localAuthentication: - "@class": nl.knaw.huygens.timbuctoo.security.dataaccess.localfile.LocalfileAccessFactory - authorizationsPath: ${timbuctoo_dataPath}/datasets - oldAuthorizationsPath: ${timbuctoo_authPath}/authorizations - loginsFilePath: ${timbuctoo_authPath}/logins.json - usersFilePath: ${timbuctoo_authPath}/users.json - autoLogoutTimeout: - duration: 8 - timeUnit: HOURS - federatedAuthentication: - enabled: true - authenticationServerUrl: DUMMY - authenticationCredentials: DUMMY - -baseUri: ${base_uri} #specifying 0 as port will replace it with the port that timbuctoo ends up listening on -userRedirectUrl: ./static/graphiql - -collectionFilters: - elasticsearch: - "@class": nl.knaw.huygens.timbuctoo.v5.elasticsearch.ElasticSearchFilter - hostname: ${timbuctoo_elasticsearch_host} - port: ${timbuctoo_elasticsearch_port} - username: ${timbuctoo_elasticsearch_user} - password: ${timbuctoo_elasticsearch_password} - -archetypesSchema: | - type Archetypes { - persons: PersonArchetypeList @fromCollection(uri: "http://timbuctoo.huygens.knaw.nl/datasets/clusius/Persons", listAll: true, indexName: "PersonArchetype") - } - - type PersonArchetypeList { - prevCursor: ID - nextCursor: ID - items: [PersonArchetype!]! - } - - type PersonArchetype { - names: Value @rdf(predicate: "http://timbuctoo.huygens.knaw.nl/properties/names", direction: "OUT", isValue: true, isObject: false, isList: false) - } - -defaultSummaryProps: - defaultTitles: - - path: - - http://timbuctoo.huygens.knaw.nl/static/v5/predicate/names - type: SimplePath - - path: - - http://schema.org/name - type: SimplePath - - path: - - http://schema.org/title - type: SimplePath - - path: - - http://www.w3.org/2000/01/rdf-schema#label - type: SimplePath - - path: - - http://www.w3.org/2004/02/skos/core#prefLabel - type: SimplePath - - path: - - http://www.w3.org/2004/02/skos/core#altLabel - type: SimplePath - defaultDescriptions: - - path: - - http://schema.org/description - type: SimplePath - defaultImages: - - path: - - http://xmlns.com/foaf/0.1/img - type: SimplePath - - path: - - http://xmlns.com/foaf/0.1/depiction - type: SimplePath - - path: - - http://schema.org/image - type: SimplePath - -databases: - databaseLocation: ${timbuctoo_dataPath}/datasets - -databaseConfiguration: - databasePath: ${timbuctoo_dataPath}/neo4j - -dataSet: - dataStorage: - "@class": nl.knaw.huygens.timbuctoo.v5.datastorage.implementations.filesystem.FileSystemDataStorage - rootDir: ${timbuctoo_dataPath}/datasets - rdfIo: - "@class": nl.knaw.huygens.timbuctoo.v5.rdfio.implementations.rdf4j.Rdf4jIoFactory - rdfFormat: application/n-quads - -# The base uri will be the base uri for all the generated RDF by Timbuctoo. -rdfUriHelper: - rdfBaseUri: http://example.org/ - -# Timeouts -# the 'duration' is a number -# the timeUnit is a 'java.util.concurrent.TimeUnit' -searchResultAvailabilityTimeout: - duration: 8 - timeUnit: HOURS - -webhooks: - vreAdded: ${timbuctoo_search_url} - dataSetUpdated: ${timbuctoo_indexer_url} - httpClient: - connectionRequestTimeout: 200ms - -activeMq: - #persistent=false means that the broker does not try to store the queue. This is not needed in a debugrun. - #useShutdownHook=false is needed because the activeMq bundle already takes care of shutting down activeMq - #using a vm:// url will also add two amq metrics to the dropwizard metrics. Using a remote url means you have - #to export the metrics from the remote VM's jmx yourself. See http://activemq.apache.org/jmx.html for more info - brokerUrl: vm://timbuctoo?broker.persistent=false&broker.useShutdownHook=false - shutdownWaitInSeconds: 1 #use for debug runs only! - -persistenceManager: - useDummy: yes #set to "no" to connect to a real handle server -# privateKeyFile: -# cypher: -# namingAuthority: -# prefix: - -#Note! disable this for production builds -allowGremlinEndpoint: true - -server: - applicationConnectors: - - type: http #Note! if you change this you might or might not also want to change the baseUri - port: ${timbuctoo_port} #Note! if you change this you might or might not also want to change the baseUri - adminConnectors: - - type: http - port: ${timbuctoo_adminPort} - requestLog: - appenders: [] #All requests are already logged using logging.LoggingFilter so the seperate requestlog is not needed - -logging: - appenders: - - type: console - logFormat: "- %-5p %m [%c{60}]%n" -#enable this to send the logs to an external log server -# - type: gelf -# host: 192.168.99.100 -# port: 32768 -# useMarker: true # -# includeFullMDC: true #We put the request information in the MDC - level: INFO - -#enable this to send the metrics to graphite -#metrics: -# reporters: -# - type: graphite -# host: 192.168.99.100 -# port: 32778 -# prefix: timbuctoo From 828ab8136d9657d8f63775c31c105d419b53e042 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Mon, 22 Feb 2021 22:30:43 +0200 Subject: [PATCH 06/36] .env file for FAIR infra --- distributives/fair/.env | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) mode change 120000 => 100644 distributives/fair/.env diff --git a/distributives/fair/.env b/distributives/fair/.env deleted file mode 120000 index 50736b5..0000000 --- a/distributives/fair/.env +++ /dev/null @@ -1 +0,0 @@ -../../deploys/localhost/.env \ No newline at end of file diff --git a/distributives/fair/.env b/distributives/fair/.env new file mode 100644 index 0000000..4be462d --- /dev/null +++ b/distributives/fair/.env @@ -0,0 +1,18 @@ +COMPOSE_PROJECT_NAME=fair + +# traefik settings +traefikhost=dataverse.org.ua + +# local postgres settings +LC_ALL=C.UTF-8 +POSTGRES_DB=dvndb +POSTGRES_USER=dvnuser +POSTGRES_PASSWORD=dvnsecret +POSTGRES_PORT=5432 + +# local dataverse settings +DATAVERSE_URL=https://dataverse.s3.coronawhy.org +POSTGRES_SERVER=postgres +POSTGRES_DATABASE=$POSTGRES_DB +PGPASSWORD=$POSTGRES_PASSWORD + From 9129e6f0dcb72ea5495a7c75c215565602461f89 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Mon, 22 Feb 2021 22:32:23 +0200 Subject: [PATCH 07/36] COVID-19 infra adjusted --- .../{dataverse.yaml => dataverse-5.3.yaml} | 0 distributives/covid19museum/env | 18 ------------------ .../{traefik.yaml => traefik-https.yaml} | 0 3 files changed, 18 deletions(-) rename distributives/covid19museum/{dataverse.yaml => dataverse-5.3.yaml} (100%) delete mode 100644 distributives/covid19museum/env rename distributives/covid19museum/{traefik.yaml => traefik-https.yaml} (100%) diff --git a/distributives/covid19museum/dataverse.yaml b/distributives/covid19museum/dataverse-5.3.yaml similarity index 100% rename from distributives/covid19museum/dataverse.yaml rename to distributives/covid19museum/dataverse-5.3.yaml diff --git a/distributives/covid19museum/env b/distributives/covid19museum/env deleted file mode 100644 index e68e7e5..0000000 --- a/distributives/covid19museum/env +++ /dev/null @@ -1,18 +0,0 @@ -COMPOSE_PROJECT_NAME=localhost - -# traefik settings -traefikhost=dataverse.org.ua - -# local postgres settings -LC_ALL=C.UTF-8 -POSTGRES_DB=dvndb -POSTGRES_USER=dvnuser -POSTGRES_PASSWORD=dvnsecret -POSTGRES_PORT=5432 - -# local dataverse settings -DATAVERSE_URL=https://dataverse.s3.coronawhy.org -POSTGRES_SERVER=postgres -POSTGRES_DATABASE=$POSTGRES_DB -PGPASSWORD=$POSTGRES_PASSWORD - diff --git a/distributives/covid19museum/traefik.yaml b/distributives/covid19museum/traefik-https.yaml similarity index 100% rename from distributives/covid19museum/traefik.yaml rename to distributives/covid19museum/traefik-https.yaml From b2b08aeb9ca2750a84e6dcdcef96fd17dbe0708c Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Mon, 22 Feb 2021 22:34:05 +0200 Subject: [PATCH 08/36] CLARIAH infra updated --- .../{dataverse.yaml => dataverse-5.3.yaml} | 0 distributives/clariah/env | 18 ------------------ .../{traefik.yaml => traefik-https.yaml} | 0 3 files changed, 18 deletions(-) rename distributives/clariah/{dataverse.yaml => dataverse-5.3.yaml} (100%) delete mode 100644 distributives/clariah/env rename distributives/clariah/{traefik.yaml => traefik-https.yaml} (100%) diff --git a/distributives/clariah/dataverse.yaml b/distributives/clariah/dataverse-5.3.yaml similarity index 100% rename from distributives/clariah/dataverse.yaml rename to distributives/clariah/dataverse-5.3.yaml diff --git a/distributives/clariah/env b/distributives/clariah/env deleted file mode 100644 index e68e7e5..0000000 --- a/distributives/clariah/env +++ /dev/null @@ -1,18 +0,0 @@ -COMPOSE_PROJECT_NAME=localhost - -# traefik settings -traefikhost=dataverse.org.ua - -# local postgres settings -LC_ALL=C.UTF-8 -POSTGRES_DB=dvndb -POSTGRES_USER=dvnuser -POSTGRES_PASSWORD=dvnsecret -POSTGRES_PORT=5432 - -# local dataverse settings -DATAVERSE_URL=https://dataverse.s3.coronawhy.org -POSTGRES_SERVER=postgres -POSTGRES_DATABASE=$POSTGRES_DB -PGPASSWORD=$POSTGRES_PASSWORD - diff --git a/distributives/clariah/traefik.yaml b/distributives/clariah/traefik-https.yaml similarity index 100% rename from distributives/clariah/traefik.yaml rename to distributives/clariah/traefik-https.yaml From 0527647525f3eb3fbdb75ab468478d3a8504fd0d Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Mon, 22 Feb 2021 22:35:30 +0200 Subject: [PATCH 09/36] Superset infra updated --- distributives/analytics/.env_superset | 48 ++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) mode change 120000 => 100644 distributives/analytics/.env_superset diff --git a/distributives/analytics/.env_superset b/distributives/analytics/.env_superset deleted file mode 120000 index add5c77..0000000 --- a/distributives/analytics/.env_superset +++ /dev/null @@ -1 +0,0 @@ -../../services-available/bi/superset.env.example \ No newline at end of file diff --git a/distributives/analytics/.env_superset b/distributives/analytics/.env_superset new file mode 100644 index 0000000..f109569 --- /dev/null +++ b/distributives/analytics/.env_superset @@ -0,0 +1,47 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +COMPOSE_PROJECT_NAME=superset +# traefik settings +traefikhost=dataverse.org.ua + +# database configurations (do not modify) +DATABASE_DB=superset +DATABASE_HOST=db +DATABASE_PASSWORD=superset +DATABASE_USER=superset + +# database engine specific environment variables +# change the below if you prefers another database engine +DATABASE_PORT=5432 +DATABASE_DIALECT=postgresql +POSTGRES_DB=superset +POSTGRES_USER=superset +POSTGRES_PASSWORD=superset +#MYSQL_DATABASE=superset +#MYSQL_USER=superset +#MYSQL_PASSWORD=superset +#MYSQL_RANDOM_ROOT_PASSWORD=yes + +# Add the mapped in /app/pythonpath_docker which allows devs to override stuff +PYTHONPATH=/app/pythonpath:/app/docker/pythonpath_dev +REDIS_HOST=redis +REDIS_PORT=6379 + +FLASK_ENV=development +SUPERSET_ENV=development +SUPERSET_LOAD_EXAMPLES=yes +CYPRESS_CONFIG=false From 8781bbf1e363f2dd95d01031cc6f65fd89f16a2c Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Mon, 22 Feb 2021 22:43:07 +0200 Subject: [PATCH 10/36] Superset infra adjusted --- distributives/analytics/{superset.yaml => superset-http.yaml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename distributives/analytics/{superset.yaml => superset-http.yaml} (100%) diff --git a/distributives/analytics/superset.yaml b/distributives/analytics/superset-http.yaml similarity index 100% rename from distributives/analytics/superset.yaml rename to distributives/analytics/superset-http.yaml From 9b712eb2d175af8e6924efe49413c271047c225b Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Mon, 22 Feb 2021 22:49:47 +0200 Subject: [PATCH 11/36] Readme extended --- README.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 68b63d3..b65e6a0 100644 --- a/README.md +++ b/README.md @@ -35,9 +35,9 @@ The list of services integrated in BeFAIR: * [INDRA](https://indralab.github.io) (INDRA REST API https://indra.readthedocs.io/en/latest/rest_api.html) * [Apache Superset](https://github.com/apache/superset) (in progress) * [FAIRDataPoint](https://github.com/FAIRDataTeam/FAIRDataPoint) (in progress) +* CoronaWhy API (FastAPI with OpenAPI spec) To Do (we re accepting Pull Requests, please join the project if you want to contribute!): -* CoronaWhy API (FastAPI with OpenAPI spec) * Elasticsearch * SPARQL endpoint (Virtuoso as a service) * Grlc (SPARQL queries into RESTful APIs convertor) @@ -77,17 +77,20 @@ newgrp docker If you see the message: "ERROR: Network traefik declared as external, but could not be found", please create the network manually using `docker network create traefik` and try again. -After Docker is installed you can run BeFAIR: +After Docker is installed you can check the consistency of all BeFAIR distributives: ``` git clone https://github.com/CoronaWhy/befair cd befair -cd distributives +make check-all ``` -You'll find a lot of distributives for the different research communities there. Choose some of the, for example, "fair", and start with command: +You can find all available installations in "distributives" folder. Different distributives are suitable for various research communities. + +Choose some distributive, for example, "fair", and start/stop all services with commands: ``` cd fair make up +make down ``` Warning: please use init commands for Apache Airflow and Apache Superset: @@ -96,6 +99,10 @@ make airflow make superset ``` +# Menuconfig + +BeFAIR has a tool to manage all services, it's located in bin/menuconfig. You can enable/disable both services and distributives there in a convinient way. + # Citation for the academic use Please cite this work as follows: From 2152d0fc8b1bf257262c068af4eaf3cd4d2c654e Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Mon, 22 Feb 2021 23:08:28 +0200 Subject: [PATCH 12/36] Extra env files removed, all should be handled with .env --- distributives/dataverse-jdk11/env | 18 ------------------ distributives/timemachine/env | 18 ------------------ 2 files changed, 36 deletions(-) delete mode 100644 distributives/dataverse-jdk11/env delete mode 100644 distributives/timemachine/env diff --git a/distributives/dataverse-jdk11/env b/distributives/dataverse-jdk11/env deleted file mode 100644 index e68e7e5..0000000 --- a/distributives/dataverse-jdk11/env +++ /dev/null @@ -1,18 +0,0 @@ -COMPOSE_PROJECT_NAME=localhost - -# traefik settings -traefikhost=dataverse.org.ua - -# local postgres settings -LC_ALL=C.UTF-8 -POSTGRES_DB=dvndb -POSTGRES_USER=dvnuser -POSTGRES_PASSWORD=dvnsecret -POSTGRES_PORT=5432 - -# local dataverse settings -DATAVERSE_URL=https://dataverse.s3.coronawhy.org -POSTGRES_SERVER=postgres -POSTGRES_DATABASE=$POSTGRES_DB -PGPASSWORD=$POSTGRES_PASSWORD - diff --git a/distributives/timemachine/env b/distributives/timemachine/env deleted file mode 100644 index e68e7e5..0000000 --- a/distributives/timemachine/env +++ /dev/null @@ -1,18 +0,0 @@ -COMPOSE_PROJECT_NAME=localhost - -# traefik settings -traefikhost=dataverse.org.ua - -# local postgres settings -LC_ALL=C.UTF-8 -POSTGRES_DB=dvndb -POSTGRES_USER=dvnuser -POSTGRES_PASSWORD=dvnsecret -POSTGRES_PORT=5432 - -# local dataverse settings -DATAVERSE_URL=https://dataverse.s3.coronawhy.org -POSTGRES_SERVER=postgres -POSTGRES_DATABASE=$POSTGRES_DB -PGPASSWORD=$POSTGRES_PASSWORD - From 94f0b669b01281c221a1d77131491837f32c1f51 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Mon, 22 Feb 2021 23:18:50 +0200 Subject: [PATCH 13/36] AUTHORS added --- distributives/AUTHORS | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 distributives/AUTHORS diff --git a/distributives/AUTHORS b/distributives/AUTHORS new file mode 100644 index 0000000..2e5c50a --- /dev/null +++ b/distributives/AUTHORS @@ -0,0 +1,6 @@ +BeFAIR (Be Findable, Accessible, Interoperable, Reusable) Open Science Framework was created in January 2021 as another CoronaWhy Labs infrastructure project. + +Here is an incomplete list of MUCH-APPRECIATED CONTRIBUTORS, in the alphabethical order: + Anton Polishko (Coronawhy) + Maksym Komar (Evologics Gmbh) + Slava Tykhonov (DANS-KNAW, the Royal Netherlands Academy of Arts and Sciences) From 4ec515dcdc350bb7284abe7d7f7b1b71edf73b44 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Mon, 22 Feb 2021 23:22:50 +0200 Subject: [PATCH 14/36] AUTHORS file added in root --- AUTHORS | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 AUTHORS diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..2e5c50a --- /dev/null +++ b/AUTHORS @@ -0,0 +1,6 @@ +BeFAIR (Be Findable, Accessible, Interoperable, Reusable) Open Science Framework was created in January 2021 as another CoronaWhy Labs infrastructure project. + +Here is an incomplete list of MUCH-APPRECIATED CONTRIBUTORS, in the alphabethical order: + Anton Polishko (Coronawhy) + Maksym Komar (Evologics Gmbh) + Slava Tykhonov (DANS-KNAW, the Royal Netherlands Academy of Arts and Sciences) From cb8bdfb8207f86425ed9d8023a4aa8e65146cb8b Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Mon, 22 Feb 2021 23:47:33 +0200 Subject: [PATCH 15/36] Weblate as a service --- distributives/AUTHORS | 6 --- services-available/translations/weblate.yaml | 52 ++++++++++++++++++++ 2 files changed, 52 insertions(+), 6 deletions(-) delete mode 100644 distributives/AUTHORS create mode 100644 services-available/translations/weblate.yaml diff --git a/distributives/AUTHORS b/distributives/AUTHORS deleted file mode 100644 index 2e5c50a..0000000 --- a/distributives/AUTHORS +++ /dev/null @@ -1,6 +0,0 @@ -BeFAIR (Be Findable, Accessible, Interoperable, Reusable) Open Science Framework was created in January 2021 as another CoronaWhy Labs infrastructure project. - -Here is an incomplete list of MUCH-APPRECIATED CONTRIBUTORS, in the alphabethical order: - Anton Polishko (Coronawhy) - Maksym Komar (Evologics Gmbh) - Slava Tykhonov (DANS-KNAW, the Royal Netherlands Academy of Arts and Sciences) diff --git a/services-available/translations/weblate.yaml b/services-available/translations/weblate.yaml new file mode 100644 index 0000000..d6e315e --- /dev/null +++ b/services-available/translations/weblate.yaml @@ -0,0 +1,52 @@ +version: '3.7' + weblate: + image: fairdata/fairdatapoint-client + ports: + - "8091:80" +services: + weblate: + image: weblate/weblate + volumes: + - weblate-data:/app/data + env_file: + - ./.env + restart: always + depends_on: + - database + - cache + environment: + WEBLATE_ENABLE_HTTPS: 1 + database: + image: postgres:9.6-alpine + env_file: + - ./.env + volumes: + - postgres-data:/var/lib/postgresql/data + restart: always + cache: + image: redis:4-alpine + restart: always + command: ["redis-server", "--appendonly", "yes"] + volumes: + - redis-data:/data + https-portal: + image: steveltn/https-portal:1 + ports: + - '80:80' + - '443:443' + restart: always + environment: + STAGE: production + PROXY_READ_TIMEOUT: 3600 + volumes: + - ssl-certs:/var/lib/https-portal + labels: + - "traefik.enable=true" + - "traefik.http.routers.weblate.rule=Host(`weblate.${traefikhost}`)" + - "traefik.http.routers.weblate.tls=true" + - "traefik.http.routers.weblate.tls.certresolver=myresolver" +volumes: + weblate-data: {} + postgres-data: {} + redis-data: {} + ssl-certs: {} From d8dc415ea7f701c07e9fe28d5b4c4c0ebb660e0d Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Tue, 23 Feb 2021 00:17:34 +0200 Subject: [PATCH 16/36] Dataverse 5.3 spec added --- .../dataverse/dataverse-5.3.yaml | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 services-available/dataverse/dataverse-5.3.yaml diff --git a/services-available/dataverse/dataverse-5.3.yaml b/services-available/dataverse/dataverse-5.3.yaml new file mode 100644 index 0000000..68c9d30 --- /dev/null +++ b/services-available/dataverse/dataverse-5.3.yaml @@ -0,0 +1,64 @@ +version: '3.7' +services: + dataverse: + image: coronawhy/dataverse:5.4-cv + # privileged: true + ports: + #- "443:443" + - "4848:4848" + - "8085:8080" + environment: + - "DATAVERSE_URL=https://dataverse.s3.coronawhy.org" + - "CVM_SERVER_NAME=CESSDA" #Optional + - "CVM_SERVER_URL=https://ns.${traefikhost}" + - "CVM_TSV_SOURCE=https://raw.githubusercontent.com/Dans-labs/semantic-gateway/main/conf/CMM_Custom_MetadataBlock.tsv" + #- "WAR_FILE=https://github.com/IQSS/dataverse-docker/releases/download/5.2-cv/dataverse-5.2-cv.war" + - "WAR_FILE=https://github.com/IQSS/dataverse/releases/download/v5.3/dataverse-5.3.war" + + - "4848:4848" + - "8085:8080" + - "DOCKER_BUILD=true" + - "CVM_SQL=https://github.com/IQSS/dataverse-docker/releases/download/5.2-cv/cv-update.sql" + - "CVM_CONFIG=https://github.com/IQSS/dataverse-docker/releases/download/5.2-cv/cv-keywords.json" + - "LANG=en" + - "cvManager=http://" + - "BUNDLEPROPERTIES=Bundle.properties" + - "ADMIN_EMAIL=admin@localhost" + - "MAIL_SERVER=mailrelay" + + ######################################## + # Next section MUST BE overwritten by --env-file when docker-compose is launched + - "POSTGRES_SERVER" + - "POSTGRES_PORT" + - "POSTGRES_DATABASE" + - "POSTGRES_USER" + - "PGPASSWORD" + ######################################## + + - "SOLR_LOCATION=solr:8983" + - "TWORAVENS_LOCATION=NOT INSTALLED" + - "RSERVE_HOST=localhost" + - "RSERVE_PORT=6311" + - "RSERVE_USER=rserve" + - "RSERVE_PASSWORD=rserve" + - "DB_HOST=postgres" + - "DB_PORT=5432" + - "DB_NAME=dvndb" + - "DB_USER=dvnuser" + - "DB_PASS=dvnsecret" + - "JVM_OPTS='-Xmx10g -Xms10g -XX:MaxPermSize=20g -XX:PermSize=20g'" + depends_on: + - solr +# - ns + volumes: + - ./var/dataverse/data:/usr/local/payara5/glassfish/domains/domain1/autodeploy + - ./var/dataverse/dumps:/dumps + - ./var/dataverse/docroot:/docroot + - ./var/dataverse/metadata:/metadata + labels: + - "traefik.enable=true" + - "traefik.http.routers.dataverse.rule=Host(`www.${traefikhost}`)" + - "traefik.http.services.dataverse.loadbalancer.server.port=8080" + - "traefik.http.routers.dataverse.tls=true" + - "traefik.http.routers.dataverse.tls.certresolver=myresolver" + From fbbb0228bbf321f0fd48c2253d1737f16f1c3a71 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Tue, 23 Feb 2021 00:19:20 +0200 Subject: [PATCH 17/36] Superset http spec added --- services-available/bi/superset-http.yaml | 124 +++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 services-available/bi/superset-http.yaml diff --git a/services-available/bi/superset-http.yaml b/services-available/bi/superset-http.yaml new file mode 100644 index 0000000..8ba9529 --- /dev/null +++ b/services-available/bi/superset-http.yaml @@ -0,0 +1,124 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +x-superset-image: &superset-image apache/superset:latest-dev +x-superset-depends-on: &superset-depends-on + - db + - redis +x-superset-volumes: &superset-volumes + # /app/pythonpath_docker will be appended to the PYTHONPATH in the final container + - ./superset/docker:/app/docker + - ./superset/superset:/app/superset + - ./superset/superset-frontend:/app/superset-frontend + - superset_home:/app/superset_home + - ./superset/tests:/app/tests + +version: "3.7" +services: + redis: + image: redis:5.0.5 + environment: + REDIS_HOST: redis + REDIS_PORT: 6379 + container_name: superset_cache + restart: unless-stopped + ports: + - "6379:6379" + volumes: + - redis:/data + + db: + env_file: .env_superset + image: postgres:10 + container_name: superset_db + restart: unless-stopped + ports: + - "127.0.0.1:5432:5432" + volumes: + - db_home:/var/lib/postgresql/data + + superset: + env_file: .env_superset + image: *superset-image + container_name: superset_app + command: ["/app/docker/docker-bootstrap.sh", "app"] + restart: unless-stopped + ports: + - 8088:8088 + user: "root" + depends_on: *superset-depends-on + volumes: *superset-volumes + environment: + CYPRESS_CONFIG: "${CYPRESS_CONFIG}" + labels: + - "traefik.enable=true" + - "traefik.http.routers.superset_insecure.rule=Host(`superset.${traefikhost}`)" + - "traefik.http.routers.superset_insecure.middlewares=file.https-redirect" + - "traefik.http.services.superset.loadbalancer.server.port=8088" + - "traefik.http.routers.superset.rule=Host(`superset.${traefikhost}`)" + - "traefik.http.routers.superset.tls=true" + + superset-init: + image: *superset-image + container_name: superset_init + command: ["/app/docker/docker-init.sh"] + env_file: .env_superset + depends_on: *superset-depends-on + user: "root" + volumes: *superset-volumes + environment: + CYPRESS_CONFIG: "${CYPRESS_CONFIG}" + + superset-node: + image: node:12 + container_name: superset_node + command: ["/app/docker/docker-frontend.sh"] + env_file: .env_superset + depends_on: *superset-depends-on + volumes: *superset-volumes + + superset-worker: + image: *superset-image + container_name: superset_worker + command: ["/app/docker/docker-bootstrap.sh", "worker"] + env_file: .env_superset + restart: unless-stopped + depends_on: *superset-depends-on + user: "root" + volumes: *superset-volumes + + superset-tests-worker: + image: *superset-image + container_name: superset_tests_worker + command: ["/app/docker/docker-bootstrap.sh", "worker"] + env_file: .env_superset + environment: + DATABASE_HOST: localhost + DATABASE_DB: test + REDIS_CELERY_DB: 2 + REDIS_RESULTS_DB: 3 + REDIS_HOST: localhost + depends_on: *superset-depends-on + user: "root" + volumes: *superset-volumes + +volumes: + superset_home: + external: false + db_home: + external: false + redis: + external: false From 817158a7f94465e4a3ec84a939b8970d132dd49d Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Tue, 23 Feb 2021 01:09:10 +0200 Subject: [PATCH 18/36] AUTHORS file extended --- AUTHORS | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 2e5c50a..8ff0317 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,6 +1,8 @@ -BeFAIR (Be Findable, Accessible, Interoperable, Reusable) Open Science Framework was created in January 2021 as another CoronaWhy Labs infrastructure project. +BeFAIR (Be Findable, Accessible, Interoperable, Reusable) Open Science Framework was created in January 2021 as yet another CoronaWhy Labs infrastructure project. +The ultimate goal of BeFAIR is to provide both local and distributed networked services for researchers, based on cutting-edge technologies and easy to use. +In FAIR we trust, come and join us! Here is an incomplete list of MUCH-APPRECIATED CONTRIBUTORS, in the alphabethical order: Anton Polishko (Coronawhy) - Maksym Komar (Evologics Gmbh) + Maksym Komar (Evologics GmbH) Slava Tykhonov (DANS-KNAW, the Royal Netherlands Academy of Arts and Sciences) From 982abcb5c0328a633e2e41cbbe007c55ea4acab7 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Tue, 23 Feb 2021 23:54:05 +0200 Subject: [PATCH 19/36] Moved all distributives to distro folder --- distributives/analytics/who.yaml | 10 --- distributives/clariah/Makefile | 1 - distributives/covid19museum/Makefile | 1 - distributives/localhost/dataverse.yaml | 1 - distributives/timemachine/Makefile | 1 - {distributives => distro}/analytics/.env | 0 .../analytics/.env_superset | 0 {distributives => distro}/analytics/Makefile | 0 {distributives => distro}/analytics/fuji.yaml | 0 .../analytics/superset-http.yaml | 0 .../analytics/traefik-https.yaml | 0 {distributives => distro}/clariah/.env | 0 .../clariah}/Makefile | 0 .../clariah/dataverse-5.3.yaml | 0 .../clariah/postgresql.yaml | 0 {distributives => distro}/clariah/solr.yaml | 0 .../clariah/traefik-https.yaml | 0 {distributives => distro}/covid19museum/.env | 0 .../covid19museum}/Makefile | 0 .../covid19museum/airflow.env | 0 .../covid19museum/airflow.yaml | 0 .../covid19museum/dataverse-5.3.yaml | 0 .../covid19museum/postgresql.yaml | 0 .../covid19museum/solr.yaml | 0 .../covid19museum/traefik-https.yaml | 0 .../dataverse-airflow/.env | 0 .../dataverse-airflow}/Makefile | 0 .../dataverse-airflow/airflow.env | 0 .../dataverse-airflow/airflow.yaml | 0 .../dataverse-airflow/dataverse.yaml | 0 .../dataverse-airflow/nde.yaml | 0 .../dataverse-airflow/postgresql.yaml | 0 .../dataverse-airflow/semantic-gateway.yaml | 0 .../dataverse-airflow/solr.yaml | 0 .../dataverse-airflow/traefik.yaml | 0 .../dataverse-airflow/whoami.yaml | 0 .../dataverse-jdk11/.env | 0 .../dataverse-jdk11}/Makefile | 0 .../dataverse-jdk11}/dataverse-5.3.yaml | 0 .../dataverse-jdk11/postgresql.yaml | 0 .../dataverse-jdk11/solr.yaml | 0 .../dataverse-jdk11}/traefik-https.yaml | 0 distro/dataverse-multilang/.env | 75 +++++++++++++++++++ .../dataverse-multilang}/Makefile | 0 distro/dataverse-multilang/dataverse-5.3.yaml | 1 + .../dataverse-multilang}/postgresql.yaml | 0 .../dataverse-multilang}/solr.yaml | 0 distro/dataverse-multilang/weblate.yaml | 1 + {distributives => distro}/fair/.env | 0 distro/fair/Makefile | 1 + {distributives => distro}/fair/fdp.config | 0 {distributives => distro}/fair/fdp.yaml | 0 {distributives => distro}/fair/fuji.yaml | 0 .../localhost => distro/fair}/postgresql.yaml | 0 .../localhost => distro/fair}/solr.yaml | 0 .../fair}/traefik-https.yaml | 0 {distributives => distro}/hello-world/.env | 0 distro/hello-world/Makefile | 1 + .../hello-world/traefik.yaml | 0 .../hello-world/whoami.yaml | 0 {distributives => distro}/localhost/.env | 0 distro/localhost/Makefile | 1 + .../fair => distro/localhost}/dataverse.yaml | 0 {distributives => distro}/localhost/nde.yaml | 0 .../localhost}/postgresql.yaml | 0 .../localhost/semantic-gateway.yaml | 0 .../localhost}/solr.yaml | 0 .../localhost/traefik.yaml | 0 .../localhost/whoami.yaml | 0 {distributives => distro}/timemachine/.env | 0 distro/timemachine/Makefile | 1 + distro/timemachine/dataverse-5.3.yaml | 1 + distro/timemachine/postgresql.yaml | 1 + distro/timemachine/solr.yaml | 1 + distro/timemachine/traefik-https.yaml | 1 + 75 files changed, 85 insertions(+), 14 deletions(-) delete mode 100644 distributives/analytics/who.yaml delete mode 120000 distributives/clariah/Makefile delete mode 120000 distributives/covid19museum/Makefile delete mode 120000 distributives/localhost/dataverse.yaml delete mode 120000 distributives/timemachine/Makefile rename {distributives => distro}/analytics/.env (100%) rename {distributives => distro}/analytics/.env_superset (100%) rename {distributives => distro}/analytics/Makefile (100%) rename {distributives => distro}/analytics/fuji.yaml (100%) rename {distributives => distro}/analytics/superset-http.yaml (100%) rename {distributives => distro}/analytics/traefik-https.yaml (100%) rename {distributives => distro}/clariah/.env (100%) rename {distributives/dataverse-airflow => distro/clariah}/Makefile (100%) rename {distributives => distro}/clariah/dataverse-5.3.yaml (100%) rename {distributives => distro}/clariah/postgresql.yaml (100%) rename {distributives => distro}/clariah/solr.yaml (100%) rename {distributives => distro}/clariah/traefik-https.yaml (100%) rename {distributives => distro}/covid19museum/.env (100%) rename {distributives/dataverse-jdk11 => distro/covid19museum}/Makefile (100%) rename {distributives => distro}/covid19museum/airflow.env (100%) rename {distributives => distro}/covid19museum/airflow.yaml (100%) rename {distributives => distro}/covid19museum/dataverse-5.3.yaml (100%) rename {distributives => distro}/covid19museum/postgresql.yaml (100%) rename {distributives => distro}/covid19museum/solr.yaml (100%) rename {distributives => distro}/covid19museum/traefik-https.yaml (100%) rename {distributives => distro}/dataverse-airflow/.env (100%) rename {distributives/fair => distro/dataverse-airflow}/Makefile (100%) rename {distributives => distro}/dataverse-airflow/airflow.env (100%) rename {distributives => distro}/dataverse-airflow/airflow.yaml (100%) rename {distributives => distro}/dataverse-airflow/dataverse.yaml (100%) rename {distributives => distro}/dataverse-airflow/nde.yaml (100%) rename {distributives => distro}/dataverse-airflow/postgresql.yaml (100%) rename {distributives => distro}/dataverse-airflow/semantic-gateway.yaml (100%) rename {distributives => distro}/dataverse-airflow/solr.yaml (100%) rename {distributives => distro}/dataverse-airflow/traefik.yaml (100%) rename {distributives => distro}/dataverse-airflow/whoami.yaml (100%) rename {distributives => distro}/dataverse-jdk11/.env (100%) rename {distributives/hello-world => distro/dataverse-jdk11}/Makefile (100%) rename {distributives/timemachine => distro/dataverse-jdk11}/dataverse-5.3.yaml (100%) rename {distributives => distro}/dataverse-jdk11/postgresql.yaml (100%) rename {distributives => distro}/dataverse-jdk11/solr.yaml (100%) rename {distributives/fair => distro/dataverse-jdk11}/traefik-https.yaml (100%) create mode 100644 distro/dataverse-multilang/.env rename {distributives/localhost => distro/dataverse-multilang}/Makefile (100%) create mode 120000 distro/dataverse-multilang/dataverse-5.3.yaml rename {distributives/fair => distro/dataverse-multilang}/postgresql.yaml (100%) rename {distributives/fair => distro/dataverse-multilang}/solr.yaml (100%) create mode 120000 distro/dataverse-multilang/weblate.yaml rename {distributives => distro}/fair/.env (100%) create mode 120000 distro/fair/Makefile rename {distributives => distro}/fair/fdp.config (100%) rename {distributives => distro}/fair/fdp.yaml (100%) rename {distributives => distro}/fair/fuji.yaml (100%) rename {distributives/localhost => distro/fair}/postgresql.yaml (100%) rename {distributives/localhost => distro/fair}/solr.yaml (100%) rename {distributives/timemachine => distro/fair}/traefik-https.yaml (100%) rename {distributives => distro}/hello-world/.env (100%) create mode 120000 distro/hello-world/Makefile rename {distributives => distro}/hello-world/traefik.yaml (100%) rename {distributives => distro}/hello-world/whoami.yaml (100%) rename {distributives => distro}/localhost/.env (100%) create mode 120000 distro/localhost/Makefile rename {distributives/fair => distro/localhost}/dataverse.yaml (100%) rename {distributives => distro}/localhost/nde.yaml (100%) rename {distributives/timemachine => distro/localhost}/postgresql.yaml (100%) rename {distributives => distro}/localhost/semantic-gateway.yaml (100%) rename {distributives/timemachine => distro/localhost}/solr.yaml (100%) rename {distributives => distro}/localhost/traefik.yaml (100%) rename {distributives => distro}/localhost/whoami.yaml (100%) rename {distributives => distro}/timemachine/.env (100%) create mode 120000 distro/timemachine/Makefile create mode 120000 distro/timemachine/dataverse-5.3.yaml create mode 120000 distro/timemachine/postgresql.yaml create mode 120000 distro/timemachine/solr.yaml create mode 120000 distro/timemachine/traefik-https.yaml diff --git a/distributives/analytics/who.yaml b/distributives/analytics/who.yaml deleted file mode 100644 index a3d0074..0000000 --- a/distributives/analytics/who.yaml +++ /dev/null @@ -1,10 +0,0 @@ -version: "3.7" -services: - whoami: - image: containous/whoami - labels: - - "traefik.enable=true" - - "traefik.http.routers.whoami_insecure.rule=Host(`whoami.${traefikhost}`)" - - "traefik.http.routers.whoami_insecure.middlewares=file.https-redirect" - - "traefik.http.routers.whoami.rule=Host(`whoami.${traefikhost}`)" - - "traefik.http.routers.whoami.tls=true" diff --git a/distributives/clariah/Makefile b/distributives/clariah/Makefile deleted file mode 120000 index c8c700d..0000000 --- a/distributives/clariah/Makefile +++ /dev/null @@ -1 +0,0 @@ -../analytics/Makefile \ No newline at end of file diff --git a/distributives/covid19museum/Makefile b/distributives/covid19museum/Makefile deleted file mode 120000 index c8c700d..0000000 --- a/distributives/covid19museum/Makefile +++ /dev/null @@ -1 +0,0 @@ -../analytics/Makefile \ No newline at end of file diff --git a/distributives/localhost/dataverse.yaml b/distributives/localhost/dataverse.yaml deleted file mode 120000 index 0869bb0..0000000 --- a/distributives/localhost/dataverse.yaml +++ /dev/null @@ -1 +0,0 @@ -../../services-available/dataverse.yaml \ No newline at end of file diff --git a/distributives/timemachine/Makefile b/distributives/timemachine/Makefile deleted file mode 120000 index c8c700d..0000000 --- a/distributives/timemachine/Makefile +++ /dev/null @@ -1 +0,0 @@ -../analytics/Makefile \ No newline at end of file diff --git a/distributives/analytics/.env b/distro/analytics/.env similarity index 100% rename from distributives/analytics/.env rename to distro/analytics/.env diff --git a/distributives/analytics/.env_superset b/distro/analytics/.env_superset similarity index 100% rename from distributives/analytics/.env_superset rename to distro/analytics/.env_superset diff --git a/distributives/analytics/Makefile b/distro/analytics/Makefile similarity index 100% rename from distributives/analytics/Makefile rename to distro/analytics/Makefile diff --git a/distributives/analytics/fuji.yaml b/distro/analytics/fuji.yaml similarity index 100% rename from distributives/analytics/fuji.yaml rename to distro/analytics/fuji.yaml diff --git a/distributives/analytics/superset-http.yaml b/distro/analytics/superset-http.yaml similarity index 100% rename from distributives/analytics/superset-http.yaml rename to distro/analytics/superset-http.yaml diff --git a/distributives/analytics/traefik-https.yaml b/distro/analytics/traefik-https.yaml similarity index 100% rename from distributives/analytics/traefik-https.yaml rename to distro/analytics/traefik-https.yaml diff --git a/distributives/clariah/.env b/distro/clariah/.env similarity index 100% rename from distributives/clariah/.env rename to distro/clariah/.env diff --git a/distributives/dataverse-airflow/Makefile b/distro/clariah/Makefile similarity index 100% rename from distributives/dataverse-airflow/Makefile rename to distro/clariah/Makefile diff --git a/distributives/clariah/dataverse-5.3.yaml b/distro/clariah/dataverse-5.3.yaml similarity index 100% rename from distributives/clariah/dataverse-5.3.yaml rename to distro/clariah/dataverse-5.3.yaml diff --git a/distributives/clariah/postgresql.yaml b/distro/clariah/postgresql.yaml similarity index 100% rename from distributives/clariah/postgresql.yaml rename to distro/clariah/postgresql.yaml diff --git a/distributives/clariah/solr.yaml b/distro/clariah/solr.yaml similarity index 100% rename from distributives/clariah/solr.yaml rename to distro/clariah/solr.yaml diff --git a/distributives/clariah/traefik-https.yaml b/distro/clariah/traefik-https.yaml similarity index 100% rename from distributives/clariah/traefik-https.yaml rename to distro/clariah/traefik-https.yaml diff --git a/distributives/covid19museum/.env b/distro/covid19museum/.env similarity index 100% rename from distributives/covid19museum/.env rename to distro/covid19museum/.env diff --git a/distributives/dataverse-jdk11/Makefile b/distro/covid19museum/Makefile similarity index 100% rename from distributives/dataverse-jdk11/Makefile rename to distro/covid19museum/Makefile diff --git a/distributives/covid19museum/airflow.env b/distro/covid19museum/airflow.env similarity index 100% rename from distributives/covid19museum/airflow.env rename to distro/covid19museum/airflow.env diff --git a/distributives/covid19museum/airflow.yaml b/distro/covid19museum/airflow.yaml similarity index 100% rename from distributives/covid19museum/airflow.yaml rename to distro/covid19museum/airflow.yaml diff --git a/distributives/covid19museum/dataverse-5.3.yaml b/distro/covid19museum/dataverse-5.3.yaml similarity index 100% rename from distributives/covid19museum/dataverse-5.3.yaml rename to distro/covid19museum/dataverse-5.3.yaml diff --git a/distributives/covid19museum/postgresql.yaml b/distro/covid19museum/postgresql.yaml similarity index 100% rename from distributives/covid19museum/postgresql.yaml rename to distro/covid19museum/postgresql.yaml diff --git a/distributives/covid19museum/solr.yaml b/distro/covid19museum/solr.yaml similarity index 100% rename from distributives/covid19museum/solr.yaml rename to distro/covid19museum/solr.yaml diff --git a/distributives/covid19museum/traefik-https.yaml b/distro/covid19museum/traefik-https.yaml similarity index 100% rename from distributives/covid19museum/traefik-https.yaml rename to distro/covid19museum/traefik-https.yaml diff --git a/distributives/dataverse-airflow/.env b/distro/dataverse-airflow/.env similarity index 100% rename from distributives/dataverse-airflow/.env rename to distro/dataverse-airflow/.env diff --git a/distributives/fair/Makefile b/distro/dataverse-airflow/Makefile similarity index 100% rename from distributives/fair/Makefile rename to distro/dataverse-airflow/Makefile diff --git a/distributives/dataverse-airflow/airflow.env b/distro/dataverse-airflow/airflow.env similarity index 100% rename from distributives/dataverse-airflow/airflow.env rename to distro/dataverse-airflow/airflow.env diff --git a/distributives/dataverse-airflow/airflow.yaml b/distro/dataverse-airflow/airflow.yaml similarity index 100% rename from distributives/dataverse-airflow/airflow.yaml rename to distro/dataverse-airflow/airflow.yaml diff --git a/distributives/dataverse-airflow/dataverse.yaml b/distro/dataverse-airflow/dataverse.yaml similarity index 100% rename from distributives/dataverse-airflow/dataverse.yaml rename to distro/dataverse-airflow/dataverse.yaml diff --git a/distributives/dataverse-airflow/nde.yaml b/distro/dataverse-airflow/nde.yaml similarity index 100% rename from distributives/dataverse-airflow/nde.yaml rename to distro/dataverse-airflow/nde.yaml diff --git a/distributives/dataverse-airflow/postgresql.yaml b/distro/dataverse-airflow/postgresql.yaml similarity index 100% rename from distributives/dataverse-airflow/postgresql.yaml rename to distro/dataverse-airflow/postgresql.yaml diff --git a/distributives/dataverse-airflow/semantic-gateway.yaml b/distro/dataverse-airflow/semantic-gateway.yaml similarity index 100% rename from distributives/dataverse-airflow/semantic-gateway.yaml rename to distro/dataverse-airflow/semantic-gateway.yaml diff --git a/distributives/dataverse-airflow/solr.yaml b/distro/dataverse-airflow/solr.yaml similarity index 100% rename from distributives/dataverse-airflow/solr.yaml rename to distro/dataverse-airflow/solr.yaml diff --git a/distributives/dataverse-airflow/traefik.yaml b/distro/dataverse-airflow/traefik.yaml similarity index 100% rename from distributives/dataverse-airflow/traefik.yaml rename to distro/dataverse-airflow/traefik.yaml diff --git a/distributives/dataverse-airflow/whoami.yaml b/distro/dataverse-airflow/whoami.yaml similarity index 100% rename from distributives/dataverse-airflow/whoami.yaml rename to distro/dataverse-airflow/whoami.yaml diff --git a/distributives/dataverse-jdk11/.env b/distro/dataverse-jdk11/.env similarity index 100% rename from distributives/dataverse-jdk11/.env rename to distro/dataverse-jdk11/.env diff --git a/distributives/hello-world/Makefile b/distro/dataverse-jdk11/Makefile similarity index 100% rename from distributives/hello-world/Makefile rename to distro/dataverse-jdk11/Makefile diff --git a/distributives/timemachine/dataverse-5.3.yaml b/distro/dataverse-jdk11/dataverse-5.3.yaml similarity index 100% rename from distributives/timemachine/dataverse-5.3.yaml rename to distro/dataverse-jdk11/dataverse-5.3.yaml diff --git a/distributives/dataverse-jdk11/postgresql.yaml b/distro/dataverse-jdk11/postgresql.yaml similarity index 100% rename from distributives/dataverse-jdk11/postgresql.yaml rename to distro/dataverse-jdk11/postgresql.yaml diff --git a/distributives/dataverse-jdk11/solr.yaml b/distro/dataverse-jdk11/solr.yaml similarity index 100% rename from distributives/dataverse-jdk11/solr.yaml rename to distro/dataverse-jdk11/solr.yaml diff --git a/distributives/fair/traefik-https.yaml b/distro/dataverse-jdk11/traefik-https.yaml similarity index 100% rename from distributives/fair/traefik-https.yaml rename to distro/dataverse-jdk11/traefik-https.yaml diff --git a/distro/dataverse-multilang/.env b/distro/dataverse-multilang/.env new file mode 100644 index 0000000..ab017ee --- /dev/null +++ b/distro/dataverse-multilang/.env @@ -0,0 +1,75 @@ +COMPOSE_PROJECT_NAME=dataverse.org.ua + +# traefik settings +traefikhost=dataverse.org.ua + +# local postgres settings +LC_ALL=C.UTF-8 +POSTGRES_DB=dvndb +POSTGRES_USER=dvnuser +POSTGRES_PASSWORD=dvnsecret +POSTGRES_PORT=5432 + +# local dataverse settings +DATAVERSE_URL=https://dataverse.s3.coronawhy.org +POSTGRES_SERVER=postgres +POSTGRES_DATABASE=postgres +PGPASSWORD=dvnsecret + +# See Weblate documentation for detailed description: +# https://docs.weblate.org/en/latest/admin/deployments.html#docker + +# Weblate setup +WEBLATE_DEBUG=1 +WEBLATE_SITE_DOMAIN=0.0.0.0:9000 +WEBLATE_LOGLEVEL=DEBUG +WEBLATE_SITE_TITLE=Weblate +WEBLATE_ADMIN_NAME=admin +WEBLATE_ADMIN_EMAIL=weblate@example.com +WEBLATE_ADMIN_PASSWORD=admin +WEBLATE_SERVER_EMAIL=weblate@example.com +WEBLATE_DEFAULT_FROM_EMAIL=weblate@example.com +WEBLATE_ALLOWED_HOSTS=* +WEBLATE_REGISTRATION_OPEN=1 + +# Extra +#WEBLATE_TIME_ZONE= +#WEBLATE_MT_GOOGLE_KEY= +#WEBLATE_SOCIAL_AUTH_GITHUB_KEY= +#WEBLATE_SOCIAL_AUTH_GITHUB_SECRET= +#WEBLATE_SOCIAL_AUTH_BITBUCKET_KEY= +#WEBLATE_SOCIAL_AUTH_BITBUCKET_SECRET= +#WEBLATE_SOCIAL_AUTH_FACEBOOK_KEY= +#WEBLATE_SOCIAL_AUTH_FACEBOOK_SECRET= +#WEBLATE_SOCIAL_AUTH_GOOGLE_OAUTH2_KEY= +#WEBLATE_SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET= + +#WEBLATE_OFFLOAD_INDEXING=1 +#WEBLATE_GOOGLE_ANALYTICS_ID= +#WEBLATE_ENABLE_HTTPS=1 +#WEBLATE_IP_PROXY_HEADER=HTTP_X_FORWARDED_FOR +#WEBLATE_REQUIRE_LOGIN=1 + +# LDAP Auth +#WEBLATE_AUTH_LDAP_SERVER_URI=ldap://ldap.example.org +#WEBLATE_AUTH_LDAP_USER_DN_TEMPLATE=uid=%(user)s,ou=People,dc=example,dc=net +#WEBLATE_AUTH_LDAP_USER_ATTR_MAP=first_name:name,email:mail + +# PostgreSQL setup +POSTGRES_PASSWORD=weblate +POSTGRES_USER=weblate +POSTGRES_DATABASE=weblate +POSTGRES_HOST=database +POSTGRES_PORT= + +# Cache setup +# https://docs.weblate.org/en/latest/admin/install.html#production-cache +REDIS_HOST=cache +REDIS_PORT=6379 + +# Mail server, the server has to listen on port 587 and understand TLS +WEBLATE_EMAIL_HOST=127.0.0.1 +# Do NOT use quotes here +WEBLATE_EMAIL_USER= +# Do NOT use quotes here +WEBLATE_EMAIL_PASSWORD= diff --git a/distributives/localhost/Makefile b/distro/dataverse-multilang/Makefile similarity index 100% rename from distributives/localhost/Makefile rename to distro/dataverse-multilang/Makefile diff --git a/distro/dataverse-multilang/dataverse-5.3.yaml b/distro/dataverse-multilang/dataverse-5.3.yaml new file mode 120000 index 0000000..8799d4d --- /dev/null +++ b/distro/dataverse-multilang/dataverse-5.3.yaml @@ -0,0 +1 @@ +../../services-available/dataverse/dataverse-5.3.yaml \ No newline at end of file diff --git a/distributives/fair/postgresql.yaml b/distro/dataverse-multilang/postgresql.yaml similarity index 100% rename from distributives/fair/postgresql.yaml rename to distro/dataverse-multilang/postgresql.yaml diff --git a/distributives/fair/solr.yaml b/distro/dataverse-multilang/solr.yaml similarity index 100% rename from distributives/fair/solr.yaml rename to distro/dataverse-multilang/solr.yaml diff --git a/distro/dataverse-multilang/weblate.yaml b/distro/dataverse-multilang/weblate.yaml new file mode 120000 index 0000000..98f453a --- /dev/null +++ b/distro/dataverse-multilang/weblate.yaml @@ -0,0 +1 @@ +../../services-available/translations/weblate.yaml \ No newline at end of file diff --git a/distributives/fair/.env b/distro/fair/.env similarity index 100% rename from distributives/fair/.env rename to distro/fair/.env diff --git a/distro/fair/Makefile b/distro/fair/Makefile new file mode 120000 index 0000000..3e6e831 --- /dev/null +++ b/distro/fair/Makefile @@ -0,0 +1 @@ +../../mk/distro-makefile.mk \ No newline at end of file diff --git a/distributives/fair/fdp.config b/distro/fair/fdp.config similarity index 100% rename from distributives/fair/fdp.config rename to distro/fair/fdp.config diff --git a/distributives/fair/fdp.yaml b/distro/fair/fdp.yaml similarity index 100% rename from distributives/fair/fdp.yaml rename to distro/fair/fdp.yaml diff --git a/distributives/fair/fuji.yaml b/distro/fair/fuji.yaml similarity index 100% rename from distributives/fair/fuji.yaml rename to distro/fair/fuji.yaml diff --git a/distributives/localhost/postgresql.yaml b/distro/fair/postgresql.yaml similarity index 100% rename from distributives/localhost/postgresql.yaml rename to distro/fair/postgresql.yaml diff --git a/distributives/localhost/solr.yaml b/distro/fair/solr.yaml similarity index 100% rename from distributives/localhost/solr.yaml rename to distro/fair/solr.yaml diff --git a/distributives/timemachine/traefik-https.yaml b/distro/fair/traefik-https.yaml similarity index 100% rename from distributives/timemachine/traefik-https.yaml rename to distro/fair/traefik-https.yaml diff --git a/distributives/hello-world/.env b/distro/hello-world/.env similarity index 100% rename from distributives/hello-world/.env rename to distro/hello-world/.env diff --git a/distro/hello-world/Makefile b/distro/hello-world/Makefile new file mode 120000 index 0000000..3e6e831 --- /dev/null +++ b/distro/hello-world/Makefile @@ -0,0 +1 @@ +../../mk/distro-makefile.mk \ No newline at end of file diff --git a/distributives/hello-world/traefik.yaml b/distro/hello-world/traefik.yaml similarity index 100% rename from distributives/hello-world/traefik.yaml rename to distro/hello-world/traefik.yaml diff --git a/distributives/hello-world/whoami.yaml b/distro/hello-world/whoami.yaml similarity index 100% rename from distributives/hello-world/whoami.yaml rename to distro/hello-world/whoami.yaml diff --git a/distributives/localhost/.env b/distro/localhost/.env similarity index 100% rename from distributives/localhost/.env rename to distro/localhost/.env diff --git a/distro/localhost/Makefile b/distro/localhost/Makefile new file mode 120000 index 0000000..3e6e831 --- /dev/null +++ b/distro/localhost/Makefile @@ -0,0 +1 @@ +../../mk/distro-makefile.mk \ No newline at end of file diff --git a/distributives/fair/dataverse.yaml b/distro/localhost/dataverse.yaml similarity index 100% rename from distributives/fair/dataverse.yaml rename to distro/localhost/dataverse.yaml diff --git a/distributives/localhost/nde.yaml b/distro/localhost/nde.yaml similarity index 100% rename from distributives/localhost/nde.yaml rename to distro/localhost/nde.yaml diff --git a/distributives/timemachine/postgresql.yaml b/distro/localhost/postgresql.yaml similarity index 100% rename from distributives/timemachine/postgresql.yaml rename to distro/localhost/postgresql.yaml diff --git a/distributives/localhost/semantic-gateway.yaml b/distro/localhost/semantic-gateway.yaml similarity index 100% rename from distributives/localhost/semantic-gateway.yaml rename to distro/localhost/semantic-gateway.yaml diff --git a/distributives/timemachine/solr.yaml b/distro/localhost/solr.yaml similarity index 100% rename from distributives/timemachine/solr.yaml rename to distro/localhost/solr.yaml diff --git a/distributives/localhost/traefik.yaml b/distro/localhost/traefik.yaml similarity index 100% rename from distributives/localhost/traefik.yaml rename to distro/localhost/traefik.yaml diff --git a/distributives/localhost/whoami.yaml b/distro/localhost/whoami.yaml similarity index 100% rename from distributives/localhost/whoami.yaml rename to distro/localhost/whoami.yaml diff --git a/distributives/timemachine/.env b/distro/timemachine/.env similarity index 100% rename from distributives/timemachine/.env rename to distro/timemachine/.env diff --git a/distro/timemachine/Makefile b/distro/timemachine/Makefile new file mode 120000 index 0000000..3e6e831 --- /dev/null +++ b/distro/timemachine/Makefile @@ -0,0 +1 @@ +../../mk/distro-makefile.mk \ No newline at end of file diff --git a/distro/timemachine/dataverse-5.3.yaml b/distro/timemachine/dataverse-5.3.yaml new file mode 120000 index 0000000..8799d4d --- /dev/null +++ b/distro/timemachine/dataverse-5.3.yaml @@ -0,0 +1 @@ +../../services-available/dataverse/dataverse-5.3.yaml \ No newline at end of file diff --git a/distro/timemachine/postgresql.yaml b/distro/timemachine/postgresql.yaml new file mode 120000 index 0000000..b7ccd09 --- /dev/null +++ b/distro/timemachine/postgresql.yaml @@ -0,0 +1 @@ +../../services-available/databases/postgresql.yaml \ No newline at end of file diff --git a/distro/timemachine/solr.yaml b/distro/timemachine/solr.yaml new file mode 120000 index 0000000..6e19c26 --- /dev/null +++ b/distro/timemachine/solr.yaml @@ -0,0 +1 @@ +../../services-available/search/solr.yaml \ No newline at end of file diff --git a/distro/timemachine/traefik-https.yaml b/distro/timemachine/traefik-https.yaml new file mode 120000 index 0000000..f1b43d5 --- /dev/null +++ b/distro/timemachine/traefik-https.yaml @@ -0,0 +1 @@ +../../services-available/ingress/traefik-https.yaml \ No newline at end of file From 567e118eac8b8474da8134a616b6ab0ddad02c4e Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Wed, 24 Feb 2021 00:22:38 +0200 Subject: [PATCH 20/36] Weblate as a service --- distro/dataverse-multilang/.env_weblate | 60 +++++++++++++++++++ distro/dataverse-multilang/weblate.yaml | 1 - .../translations/weblate-https.yaml | 36 +++++++++++ 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 distro/dataverse-multilang/.env_weblate delete mode 120000 distro/dataverse-multilang/weblate.yaml create mode 100644 services-available/translations/weblate-https.yaml diff --git a/distro/dataverse-multilang/.env_weblate b/distro/dataverse-multilang/.env_weblate new file mode 100644 index 0000000..f32c019 --- /dev/null +++ b/distro/dataverse-multilang/.env_weblate @@ -0,0 +1,60 @@ +COMPOSE_PROJECT_NAME=dataverse.org.ua +# See Weblate documentation for detailed description: +# https://docs.weblate.org/en/latest/admin/deployments.html#docker + +# Weblate setup +WEBLATE_DEBUG=1 +WEBLATE_SITE_DOMAIN=0.0.0.0:9000 +WEBLATE_LOGLEVEL=DEBUG +WEBLATE_SITE_TITLE=Weblate +WEBLATE_ADMIN_NAME=admin +WEBLATE_ADMIN_EMAIL=weblate@example.com +WEBLATE_ADMIN_PASSWORD=admin +WEBLATE_SERVER_EMAIL=weblate@example.com +WEBLATE_DEFAULT_FROM_EMAIL=weblate@example.com +WEBLATE_ALLOWED_HOSTS=* +WEBLATE_REGISTRATION_OPEN=1 + +# Extra +SECURE_HSTS_SECONDS=True +SESSION_COOKIE_SECURE=True +#WEBLATE_TIME_ZONE= +#WEBLATE_MT_GOOGLE_KEY= +#WEBLATE_SOCIAL_AUTH_GITHUB_KEY= +#WEBLATE_SOCIAL_AUTH_GITHUB_SECRET= +#WEBLATE_SOCIAL_AUTH_BITBUCKET_KEY= +#WEBLATE_SOCIAL_AUTH_BITBUCKET_SECRET= +#WEBLATE_SOCIAL_AUTH_FACEBOOK_KEY= +#WEBLATE_SOCIAL_AUTH_FACEBOOK_SECRET= +#WEBLATE_SOCIAL_AUTH_GOOGLE_OAUTH2_KEY= +#WEBLATE_SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET= + +#WEBLATE_OFFLOAD_INDEXING=1 +#WEBLATE_GOOGLE_ANALYTICS_ID= +#WEBLATE_ENABLE_HTTPS=1 +#WEBLATE_IP_PROXY_HEADER=HTTP_X_FORWARDED_FOR +#WEBLATE_REQUIRE_LOGIN=1 + +# LDAP Auth +#WEBLATE_AUTH_LDAP_SERVER_URI=ldap://ldap.example.org +#WEBLATE_AUTH_LDAP_USER_DN_TEMPLATE=uid=%(user)s,ou=People,dc=example,dc=net +#WEBLATE_AUTH_LDAP_USER_ATTR_MAP=first_name:name,email:mail + +# PostgreSQL setup +POSTGRES_PASSWORD=weblate +POSTGRES_USER=weblate +POSTGRES_DATABASE=weblate +POSTGRES_HOST=database +POSTGRES_PORT= + +# Cache setup +# https://docs.weblate.org/en/latest/admin/install.html#production-cache +REDIS_HOST=cache +REDIS_PORT=6379 + +# Mail server, the server has to listen on port 587 and understand TLS +WEBLATE_EMAIL_HOST=127.0.0.1 +# Do NOT use quotes here +WEBLATE_EMAIL_USER= +# Do NOT use quotes here +WEBLATE_EMAIL_PASSWORD= diff --git a/distro/dataverse-multilang/weblate.yaml b/distro/dataverse-multilang/weblate.yaml deleted file mode 120000 index 98f453a..0000000 --- a/distro/dataverse-multilang/weblate.yaml +++ /dev/null @@ -1 +0,0 @@ -../../services-available/translations/weblate.yaml \ No newline at end of file diff --git a/services-available/translations/weblate-https.yaml b/services-available/translations/weblate-https.yaml new file mode 100644 index 0000000..1c46c16 --- /dev/null +++ b/services-available/translations/weblate-https.yaml @@ -0,0 +1,36 @@ +version: '3.7' +services: + weblate: + image: weblate/weblate:4.5-1 + privileged: true + ports: + - 8095:8080 + volumes: + - ./var/weblate/weblate-data:/app/data + env_file: .env_weblate + restart: always + depends_on: + - database + - cache + labels: + - "traefik.enable=true" + - "traefik.http.routers.weblate.rule=Host(`weblate.${traefikhost}`)" + - "traefik.http.routers.weblate.tls=true" + - "traefik.http.services.weblate.loadbalancer.server.port=8080" + - "traefik.http.routers.weblate.tls.certresolver=myresolver" + database: + image: postgres:9.6-alpine + privileged: true + ports: + - 5431:5432 + env_file: .env_weblate + volumes: + - ./var/weblate/postgres-data:/var/lib/postgresql/data + restart: always + cache: + image: redis:4-alpine + privileged: true + restart: always + command: ["redis-server", "--appendonly", "yes"] + volumes: + - ./redis-data:/data From 6673ee9a1448e2c8b75049f28967caf1e843738a Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Wed, 24 Feb 2021 16:19:10 +0200 Subject: [PATCH 21/36] Apache Kafka added as a service with GUI --- distro/workflows/.env | 18 ++++++++++ distro/workflows/Makefile | 1 + distro/workflows/kafka.yaml | 1 + distro/workflows/traefik-https.yaml | 1 + .../var/security/letsencrypt/acme.json | 36 +++++++++++++++++++ services-available/workflows/kafka.yaml | 33 +++++++++++++++++ 6 files changed, 90 insertions(+) create mode 100644 distro/workflows/.env create mode 120000 distro/workflows/Makefile create mode 120000 distro/workflows/kafka.yaml create mode 120000 distro/workflows/traefik-https.yaml create mode 100644 distro/workflows/var/security/letsencrypt/acme.json create mode 100644 services-available/workflows/kafka.yaml diff --git a/distro/workflows/.env b/distro/workflows/.env new file mode 100644 index 0000000..f1e87a1 --- /dev/null +++ b/distro/workflows/.env @@ -0,0 +1,18 @@ +COMPOSE_PROJECT_NAME=dataverse.org.ua + +# traefik settings +traefikhost=dataverse.org.ua +useremail=team@coronawhy.org + +# local postgres settings +LC_ALL=C.UTF-8 +POSTGRES_DB=dvndb +POSTGRES_USER=dvnuser +POSTGRES_PASSWORD=dvnsecret +POSTGRES_PORT=5432 + +# local dataverse settings +DATAVERSE_URL=https://dataverse.s3.coronawhy.org +POSTGRES_SERVER=postgres +POSTGRES_DATABASE=postgres +PGPASSWORD=dvnsecret diff --git a/distro/workflows/Makefile b/distro/workflows/Makefile new file mode 120000 index 0000000..3e6e831 --- /dev/null +++ b/distro/workflows/Makefile @@ -0,0 +1 @@ +../../mk/distro-makefile.mk \ No newline at end of file diff --git a/distro/workflows/kafka.yaml b/distro/workflows/kafka.yaml new file mode 120000 index 0000000..5a8edc3 --- /dev/null +++ b/distro/workflows/kafka.yaml @@ -0,0 +1 @@ +../../services-available/workflows/kafka.yaml \ No newline at end of file diff --git a/distro/workflows/traefik-https.yaml b/distro/workflows/traefik-https.yaml new file mode 120000 index 0000000..f1b43d5 --- /dev/null +++ b/distro/workflows/traefik-https.yaml @@ -0,0 +1 @@ +../../services-available/ingress/traefik-https.yaml \ No newline at end of file diff --git a/distro/workflows/var/security/letsencrypt/acme.json b/distro/workflows/var/security/letsencrypt/acme.json new file mode 100644 index 0000000..a5e28dc --- /dev/null +++ b/distro/workflows/var/security/letsencrypt/acme.json @@ -0,0 +1,36 @@ +{ + "myresolver": { + "Account": { + "Email": "team@coronawhy.org", + "Registration": { + "body": { + "status": "valid", + "contact": [ + "mailto:team@coronawhy.org" + ] + }, + "uri": "https://acme-v02.api.letsencrypt.org/acme/acct/113781916" + }, + "PrivateKey": "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", + "KeyType": "4096" + }, + "Certificates": [ + { + "domain": { + "main": "kafka.dataverse.org.ua" + }, + "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdNRENDQlJpZ0F3SUJBZ0lTQkFEM1pKSnJSVWpvT2ZRREZ1Wi9ldjBYTUEwR0NTcUdTSWIzRFFFQkN3VUEKTURJeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFNWlhRbmN5QkZibU55ZVhCME1Rc3dDUVlEVlFRRApFd0pTTXpBZUZ3MHlNVEF5TWpReE16RTNOVGhhRncweU1UQTFNalV4TXpFM05UaGFNQ0V4SHpBZEJnTlZCQU1UCkZtdGhabXRoTG1SaGRHRjJaWEp6WlM1dmNtY3VkV0V3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXcKZ2dJS0FvSUNBUUN0NXNHZ3FDZ1NOV00rcUIxaytiZysyNVNTL1VUdTBSR3lRd25XOWNGQWxydVBMenI4dnl5QgoxZ256STNpZWJQdEh1bTJwQUN1RXluOUY3L3JhOUFYK283a2k5MEpXY0phYWs0Um9Rbk4wd1ZlVlJCa2tucmp4ClhNWG40c2duUms0R3RvRHpCUU8rcWV4ZkJweVBMbVk1am52b05OSmhDN0syYUJaV2I2T0J2NmFaYnlSYm1SaWkKSTJOKzdTUGtQeGpDeVN2UE5XeHJJK2FjYXlEMUsrWGxaRTVvanlLUUxlMy8rcGk0cVJ5T29pTzNkb29qWFVVegpLVnFIMEQ3U2R2eklCQ2N0U1ppL2ttNlNFOFZPbkMrR1VvcklwK0NTU0x6TnY1cFdPYzZIdXBzazRpb0J4TGFkCkVqUkdMai9jbW5ZS09lc2Nzd3E2b2dMcGxpNlB1eXkvbktqa0c0K051ZDBiM3pNZEVJK1VoNHpEbzEzYmJOVmwKajI4YzVXeDRJMDg0MUhSalBqZTJEV2hkSk5rc1lqZHZZVW9kTUU0bUwzenFNWFFFQUEzWGZiRmJwbzQ3ejBBbwp6cWFML244TEMxUHRjMDFPSTdQUzdjOWR2aXR3R2lnYVIrcVU3SEd1em45VGdsVXJ6TlkvWkUvbGhzVTVBLzZECjIwOG82S2N2N21aUGpnM3AxSGdEeHhYRDJ3czNrT09IVGxOclhjaXlNSHhhQkE4eTN5bTY3VFl0R2V6YWhsS0QKU3owSVhnWlBTbFdJbUVtWERaQmVQTmcvRWhrREhZKzVZYlo3WWdIVDVicWFKM2srRnpPTzNLa09vTnpCQXUvMwo3aG5DNU1ETStQUS9iQmlzUC9CL3JHcm0rcm5oVDBjU3FoREJwd3pLZHhNWGFvcDNINXNDdHdJREFRQUJvNElDClR6Q0NBa3N3RGdZRFZSMFBBUUgvQkFRREFnV2dNQjBHQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01CQmdnckJnRUYKQlFjREFqQU1CZ05WSFJNQkFmOEVBakFBTUIwR0ExVWREZ1FXQkJSc3VXYS9YRU9hZFVhY1pLRE9WUHd2L0VLMAppVEFmQmdOVkhTTUVHREFXZ0JRVUxyTVh0MWhXeTY1UUNVRG1INitkaXhUQ3hqQlZCZ2dyQmdFRkJRY0JBUVJKCk1FY3dJUVlJS3dZQkJRVUhNQUdHRldoMGRIQTZMeTl5TXk1dkxteGxibU55TG05eVp6QWlCZ2dyQmdFRkJRY3cKQW9ZV2FIUjBjRG92TDNJekxta3ViR1Z1WTNJdWIzSm5MekFoQmdOVkhSRUVHakFZZ2hacllXWnJZUzVrWVhSaApkbVZ5YzJVdWIzSm5MblZoTUV3R0ExVWRJQVJGTUVNd0NBWUdaNEVNQVFJQk1EY0dDeXNHQVFRQmd0OFRBUUVCCk1DZ3dKZ1lJS3dZQkJRVUhBZ0VXR21oMGRIQTZMeTlqY0hNdWJHVjBjMlZ1WTNKNWNIUXViM0puTUlJQkFnWUsKS3dZQkJBSFdlUUlFQWdTQjh3U0I4QUR1QUhVQVJKUmxMckR1enEvRVFBZllxUDRvd05ybWdyN1l5ekcxUDlNegpsclcyZ2FnQUFBRjMxR2RhSlFBQUJBTUFSakJFQWlBQTBBcDV0MkRob3lCcCtWVDN1dmIwSW9kajhNWWwxanFLCmtQMXlvTU1DTXdJZ0pjZW1ydVl0SnV6bXhyTnVBdjIyQVh4NDBDU3oydTFmQWtyTERHMDdPeGdBZFFCOVB2TDQKai8rSVZXZ2t3c0RLbmxLSmVTdkZEbmdKZnk1cWwyaVpmaUx3MXdBQUFYZlVaMXBDQUFBRUF3QkdNRVFDSUVJdQpMVGxhSnJ6R1lrdGhmWUczL00rR0djVGJMdFZ3YU5sTFdSUi9CeHowQWlBbEwrbmNnYUUxT3JuZHV0NkQ4SkdNCkVSTTFwdTVqQzloZjdLczNhZlpzMmpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQU5zY2pNZVRyNDRpVlZXelkKLzBDSi9YbFZiMHd4d1lGSlZ5R2k0RzNURU9nR1N2TzVIbVJ6TWNaemNIL2NDZDhUNU1maHl6THdORWpuOFlJRwpCT1BheTlUWlR0NmkzRHNUYmxnYXhXSGVJODhYSmhtVG9Ub1l4TkUraGM0NzZ2WHNRclBmNWZabEhiNlRjcnJhCldBTTdwcTgrNzVZWmQ5Sk1RWG1qM3N5aGxIenlCMlFZREhtbm1nME9sUS9xeHZrQ1hGSjl4RHZ5eGR1Q3QvQUgKcVR6dUV1b2o0R1Evd1ViN29Vc3JoWmxsa1hEZzlPbHVpTVVtRTR5TFlvR3h6Q3NVMEdDYnZkUU5TZFJNUXk0cQpSenY0NUhTK1FSRDhoM2lNRWphZnJZOUdSU0ZISjdORWFBUGlMdFZRQlhoY3YrM3R1K1d0aXpBcVh0Wm5ZNWdPCkRwSjhsUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWlRDQ0EwMmdBd0lCQWdJUVFBRjFCSU1VcE1naGpJU3BEQmJOM3pBTkJna3Foa2lHOXcwQkFRc0ZBREEvCk1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVQKRGtSVFZDQlNiMjkwSUVOQklGZ3pNQjRYRFRJd01UQXdOekU1TWpFME1Gb1hEVEl4TURreU9URTVNakUwTUZvdwpNakVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVeGxkQ2R6SUVWdVkzSjVjSFF4Q3pBSkJnTlZCQU1UCkFsSXpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV3SVZLTXoyb0pUVER4THMKalZXU3cvaUM4Wm1tZWtLSXAxMG1xclVydWNWTXNhK09hL2wxeUtQWEQwZVVGRlUxVjR5ZXFLSTVHZldDUEVLcApUbTcxTzhNdTI0M0FzRnp6V1RqbjdjOXA4Rm9MRzc3QWxDUWxoL28zY2JNVDV4eXM0WnZ2MitRN1JWSkZscW5CClU4NDB5Rkx1dGE3dGo5NWdjT0tsVkt1MmJRNlhwVUEwYXl2VHZHYnJaalI4K211TGoxY3BtZmd3RjEyNmNtLzcKZ2NXdDBvWllQUmZINXdtNzhTdjNodHpCMm5GZDFFYmp6SzBsd1lpOFlHZDFaclB4R1BlaVhPWlQvenFJdGtlbAoveE1ZNnBnSmR6K2RVL25QQWVYMXBuQVhGSzlqcFArWnM1T2QzRk9uQnY1SWhSMmhhYTRsZGJzVHpGSUQ5ZTFSCm9ZdmJGUUlEQVFBQm80SUJhRENDQVdRd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFEQU9CZ05WSFE4QkFmOEUKQkFNQ0FZWXdTd1lJS3dZQkJRVUhBUUVFUHpBOU1Ec0dDQ3NHQVFVRkJ6QUNoaTlvZEhSd09pOHZZWEJ3Y3k1cApaR1Z1ZEhKMWMzUXVZMjl0TDNKdmIzUnpMMlJ6ZEhKdmIzUmpZWGd6TG5BM1l6QWZCZ05WSFNNRUdEQVdnQlRFCnA3R2tleXh4K3R2aFM1QjEvOFFWWUlXSkVEQlVCZ05WSFNBRVRUQkxNQWdHQm1lQkRBRUNBVEEvQmdzckJnRUUKQVlMZkV3RUJBVEF3TUM0R0NDc0dBUVVGQndJQkZpSm9kSFJ3T2k4dlkzQnpMbkp2YjNRdGVERXViR1YwYzJWdQpZM0o1Y0hRdWIzSm5NRHdHQTFVZEh3UTFNRE13TWFBdm9DMkdLMmgwZEhBNkx5OWpjbXd1YVdSbGJuUnlkWE4wCkxtTnZiUzlFVTFSU1QwOVVRMEZZTTBOU1RDNWpjbXd3SFFZRFZSME9CQllFRkJRdXN4ZTNXRmJMcmxBSlFPWWYKcjUyTEZNTEdNQjBHQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01CQmdnckJnRUZCUWNEQWpBTkJna3Foa2lHOXcwQgpBUXNGQUFPQ0FRRUEyVXpneWZXRWlEY3gyN3NUNHJQOGkydGlFbXhZdDBsK1BBSzNxQjhvWWV2TzRDNXo3MGtICmVqV0VIeDJ0YVBEWS9sYUJMMjEvV0tadU5UWVFISFBENWIxdFhnSFhibkw3S3FDNDAxZGs1VnZDYWRUUXN2ZDgKUzhNWGpvaHljOXo5L0cyOTQ4a0xqbUU2RmxoOWREWXJWWUE5eDJPK2hFUEdPYUVPYTFlZVB5bkJnUGF5dlVmTApxakJzdHpMaFdWUUxHQWtYWG1Ocys1Wm5QQnh6REpPTHhoRjJKSWJlUUFjSDVIMHRaclVsbzVaWXlPcUE3czlwCk81Yjg1bzNBTS9PSitDa3RGQlF0ZnZCaGNKVmQ5d3Zsd1Bzayt1eU95MkhJN21OeEtLZ3NCVHQzNzV0ZUEyVHcKVWRIa2hWTmNzQUtYMUg3R05OTE9FQURrc2Q4Nnd1b1h2Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", + "key": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS0FJQkFBS0NBZ0VBcmViQm9LZ29FalZqUHFnZFpQbTRQdHVVa3YxRTd0RVJza01KMXZYQlFKYTdqeTg2Ci9MOHNnZFlKOHlONG5tejdSN3B0cVFBcmhNcC9SZS82MnZRRi9xTzVJdmRDVm5DV21wT0VhRUp6ZE1GWGxVUVoKSko2NDhWekY1K0xJSjBaT0JyYUE4d1VEdnFuc1h3YWNqeTVtT1k1NzZEVFNZUXV5dG1nV1ZtK2pnYittbVc4awpXNWtZb2lOamZ1MGo1RDhZd3Nrcnp6VnNheVBtbkdzZzlTdmw1V1JPYUk4aWtDM3QvL3FZdUtrY2pxSWp0M2FLCkkxMUZNeWxhaDlBKzBuYjh5QVFuTFVtWXY1SnVraFBGVHB3dmhsS0t5S2Zna2tpOHpiK2FWam5PaDdxYkpPSXEKQWNTMm5SSTBSaTQvM0pwMkNqbnJITE1LdXFJQzZaWXVqN3NzdjV5bzVCdVBqYm5kRzk4ekhSQ1BsSWVNdzZOZAoyMnpWWlk5dkhPVnNlQ05QT05SMFl6NDN0ZzFvWFNUWkxHSTNiMkZLSFRCT0ppOTg2akYwQkFBTjEzMnhXNmFPCk84OUFLTTZtaS81L0N3dFQ3WE5OVGlPejB1M1BYYjRyY0Jvb0drZnFsT3h4cnM1L1U0SlZLOHpXUDJSUDVZYkYKT1FQK2c5dFBLT2luTCs1bVQ0NE42ZFI0QThjVnc5c0xONURqaDA1VGExM0lzakI4V2dRUE10OHB1dTAyTFJucwoyb1pTZzBzOUNGNEdUMHBWaUpoSmx3MlFYanpZUHhJWkF4MlB1V0cyZTJJQjArVzZtaWQ1UGhjemp0eXBEcURjCndRTHY5KzRad3VUQXpQajBQMndZckQvd2Y2eHE1dnE1NFU5SEVxb1F3YWNNeW5jVEYycUtkeCtiQXJjQ0F3RUEKQVFLQ0FnQnFmZ1lTNFFidzU1cW44d0ZWSll0TGl1SDRCWHJpR0V1UzgzU2lHNHJGaDhqQnpUVjlNNEVJM1U3bwpnczlKalFsd0NsMC9BZWlrZi9EaW5pdnJTMFlrZ3BSTU1raUFjSi81ZHQ2OWpmdndBcm9rb1RnWWNjNWxsOTlsCnVqM0J0MDd1MDNJeDM5OUVNZ0Nhekl5eExjUFIrVXd0amJOTFZJT1RLamlMby8vbjQ3b2MrYSsxSEJLMnI1OHQKU2dFUnRBWHd1b3JHY0R1OWZKV3JNZnRUeUJjWG00NWNmMUsySWpvOTZITC9taWZ2dktETXA1MitQRTYxSHR6ZQprSXI0RFgrTTZPWW8ySW5ldnNoUlVpUWdtSXFONGh3MDlvRVNjOUtTMklPbHkrNkt0WjV1UHNWa29kY0dadkIyCkRicHoyRzd5b2pjMU12c2VBVHB4V3RPV2x4TzJHN0ZvZXJsSkMrRDVaSXp1L3NNdHgwNHJ4Qllaa1YrS2tRTEEKemVreWxGSCs5RE1tTEhYQytjQWhTa2U4NS9aWngxZmo4eTJSWlpiZzlTYkhvdDA2dDhqem1zTnNlNEtpcWZrQQpiTDhhaloyaXJRRFJaZ051aEpuVXBWN2F0VW5pdlNYTXpDdFR0U3I1OUlWcHVGQTBmQUJjdlYxV1h6cXVLOW1vCmphWEZWRWFZc3hkRnlsOGxXb1lXZ0xUQzhDQSt4SEcyZnFCdkR5TEVEcHVQaGZ6SS9jbXN4UWZFcEplbmVqNjYKOU1KajVsMnRMUXI4TXNuRnJRd1B0SVJnWHVvRStKaVViQWhCOUVRMmpkcjBXaDN5c1U1ZzR1OHRHY3diTEdUWAowcWdWMUhxQXYxZllxS0xrUFB1L3NRLzUzMDVnSk9XSjhRTTBCam5Nb3NQYThHNWJhUUtDQVFFQXdIVlZKZzBNCjhIb09CcFUwSHdleG9nN3g0LzdQUHBsWlM3T1pHclRydXZxay9RRTVNQ1ZDOVBBSzljcU9qL0E4M0MwdUdPd1MKQi9ad0xqYkdWZnRZYXdkbTEyRjlkV2xmaUZpNnFPMWJjL00xYUl0RGNtNGxuRW90VFYwbDJteWU1OE5vd3hIeQppNmF2eDFIalkrYW5mU3JvT1lIUlh2QXkvbENkbk45d2IvSFl0NFNGMkhjZEFyR1planRPaGNsTS80aEFyS05jCkJITjJPWjBTbzg3QWhoYW9TYy9kQWlBQmRGS1hxQnFuOU9HcXB4MktmSjgwOUFkc0NHRHM3eE5GQXNHcmpsVXEKdjd1ajBLOFlyQmZLaU9Fd09iSFRDYkRJc3NzZkRkVUVGRDBrRkZDWUZXVVRqY012VjQ5Q1ZPbzJ0TDZCMTdGNQpnbUxjcTRpU1h0MXpld0tDQVFFQTUxRDdrZUdGNDM3RXFMRGUzNUVvV2gxL3gwZ21ZYlJPd09vSldNUXBuMDQxCnNIelFJUmdTcWdWRU94UzRSUkFVY2loSlRMMEh2WUlQR3BzOWRtWUYzcElHNXI2RjJycGtvNUlHQ1pUaE9GaHIKRWt0b0RiT3g3SGk4ZXJWNTNaOXRodXQ4akIzcDF6NlVCM1hVNWV3aktkRUwxWjJuVnZrS1FNZGd0WklJU2RZMgpoQ3lGd3ltYk15RnhkdmhxL0lhWFlmaTVkMTRCL20xdi9PUkhwOW1xM0s0VEtGUVhwZU5mR0VwcURlN1FOZXpKClJzNXB6TTZpNUE3YWNrazhtd1p3K1RZSTYyU1JWdVVLUFl1bTNuNFQra1JIaXVoY1BORG0yczhKaTlGWGI4aVYKVUE4M0RIaXpqbjZickloZE41dzhhcWVmdi9hNDgrL1RyOUQ5UUlNYTlRS0NBUUJiYmVJN3AydUVPcGU3TE5xTAorejI1L1Z1UXNwYUY2SmZ4VEtycGN4V2h5RHpsTE5XY043ZHRZVFB6dkh5cGlMbUE1NzNFZlRHN3NxbHNhdjBpCkQ3dmJiTExBazBIa3EyQ0ZCNUgxZW4wOXdrYVhHY0c2OVBUTklMZ1F6cldTNUpOQkN5WVR0YzBCNXZnT3VxcEoKNVdPZ0pPZ1ptY0I3VjZVQ0NBNDRYald1R0xpWnhrMUhucDZianYrWWYrQTMwbi9QelV6Y051Y1ovamdsK3FiRwpSd3hUSnlSZm5HNGora3gybEY0VHNFWW1JYWJPcVV3SEZDTTE0dWpCdWpvVkFaU0JVTHhOYTh4Wk5hMEhFSWVxCkNjdGY1NHJmZmNrQ0M0ZnMyRzR5UmdZZ0QwTzZtdWNGRXZXTkhUSzZhQVpkREw5Y2NqeUEyWUVlSGhVek1EaEkKOU85TkFvSUJBUUM0NmM0UmtqMWIzUzBNeFVlRlpSN2kydzRZbXA3RUlFV01oZ3F1d1RHY3ZnTEJjU1ZZTDB4TQpTaVYvTFZNWk1uK0Z1cHJPRTVhcWNkdnRJd2lCSzVHcG1RYVhVdHJpUFhyU0g1dGY4WG9SZHUweEZNSzdvVmlzCmR1QUZJQ21wZHhjeGNmS0FlREZFOWl1VHd5aE1IUGNIS0t2VE9sSlpmb0FweExpVXJZYWVyL1dvdDRhK3V2WHMKYStHdWYydlhMeWk1RXdJQVlGQXJ1Z1I2SDJzQXpVcC9XMURKUG1BaEpxQVFaUHhlNHZmakE4VHJLM3I4Vkh0Mgo0RURVZDZOUk1sY0JnYWFqdGlOUldZdFVJOTFqbzFvSkNLaEFiUHUvU2lnaDVydjAzNGFNUDhiTTF6emtaV0QwCm1sV01HUDZidy9Pd053dkhnMDNiQTI4djcxdGtST281QW9JQkFIbEtTUlNNUjcyY29uV2VKWFk0UGdPWkJNWWkKVkRZYUU3dUE1RU1YRldQRzFRNXlTai9FOFlwRHd6OC9KaHhoS04rZlVUN2xNOWpzRjJhK1JKNDVvZ3htdXpnYQp5R3BTRlh3Y1BkSFoyaFI0RERGVXowMmZMSnAvcUd2bitFUVdKOEtkM3VIUlc3aTVpR3ZmaEhmeXd6OXFzSlBVCm5lODVtOEVtcXM2OFVlN01Vc25BK3dCK09TN2N2MXBDZW5XTUxIQzAwRWFaZlJUSXd2b0VzWEVPOWs1OEZjWFkKUFE0WVJwQ3RQd3BGaHZRVTdZUU9FSVZ0K2pkUlBNL3htbTZzeHE3ajZ1WjVkMDNRemwvVU9XaFNBUzA3a0FSegp6YmtreXU4Vm8zZjBvV1pMZ0tlNFRSRThTcStzSUZiWDk3YXRSQTZVRmhPdTlmT0hveDZxWHhFOThPcz0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", + "Store": "default" + }, + { + "domain": { + "main": "dashboard.dataverse.org.ua" + }, + "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdPakNDQlNLZ0F3SUJBZ0lTQkZBOWpJR2Rtc240WTREcUZXNk1OZGhJTUEwR0NTcUdTSWIzRFFFQkN3VUEKTURJeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFNWlhRbmN5QkZibU55ZVhCME1Rc3dDUVlEVlFRRApFd0pTTXpBZUZ3MHlNVEF5TWpReE16RTRNRFJhRncweU1UQTFNalV4TXpFNE1EUmFNQ1V4SXpBaEJnTlZCQU1UCkdtUmhjMmhpYjJGeVpDNWtZWFJoZG1WeWMyVXViM0puTG5WaE1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0MKQWc4QU1JSUNDZ0tDQWdFQXlJSERwMk1RNUJHNWNZeXNsUk1vTTEza0Q1WjhLQVdCdk10eVBUTUVRSlduU28rdAo3Z1phOXRTL25ob1REZ1hGNE11UzAxcVJ6TWJmRVlnUVZ3UGVMRkxZem9RVXV3SXAvVHdUYXNabW5POG1iMUNNCjBhYnhMcnNIYVdaaXFNSVAvSmJydkg5Ykdjck1vSzI2anREK2xXVjFmK1NseUlONE5KVEUyLzdkdUg3K2VyMFMKZHM4OXJnQ3dYbEJlUFI1Q2tIVmdybHFrUkpQMmdzZklSZnl6b3ozWDVqV1dabUlvWXNBdUREUXhlTEVvM2lLWgpqOTAzeWwzaGlQY0hkdVZ0VGFsVzdydkttMmNsTkZsZWlaL0MxRmpERThCbjVtU2RtRXVlblBjMkJMRlZjYnJrCkR3RlRaTmRzRGVSUzZyVzFBU0svRk50MXRWdzczMXVKTWdnMCtJV09GL3R4QUNxS1Q3MFVnMkZaY0krN3RKWm4KdGROTUM0WC84MjYwNFhIZzQvYWJsSXZseXJaMlRjK2V2YVY0aThVZm9DNFVnMDBwZXYrV3pFZjl5Wjh6ZzdCTwp4RzlwdWdrL0RpbG1uZjh1TmlYVnFTQ3JuM0h3U3ltUkV4cnFSR1g0eVlFaWNlVVIybmVXWTFxMndQVFVKQ1gvCkVUZ2lHZW41MHhyWm9MblUzT2o3bFNRVE55b2YwdVh4K1lFd2JNWmE0bFpWdlo5dlg0VFFXUGo5YktnaU9jUngKU1Z4SWp5Nk9jRWRFR3QyL1laVkVidlFyYSt3Zi9Nd2pGRWN0bHFsUXZRMGZNQ3ptU2FUZkIvbXJQb0VHdEhrdgoybkpPNHdoMU05RTRXVGdjNm50Y3NaMUJ5UEIwOUVoNytDbHM3OUIrSlViN3ZuNDRpRENDQWhJUC9WOENBd0VBCkFhT0NBbFV3Z2dKUk1BNEdBMVVkRHdFQi93UUVBd0lGb0RBZEJnTlZIU1VFRmpBVUJnZ3JCZ0VGQlFjREFRWUkKS3dZQkJRVUhBd0l3REFZRFZSMFRBUUgvQkFJd0FEQWRCZ05WSFE0RUZnUVVhcmJIODhIVG5KUWxFRXNmZ3NhRApoaUpmaG9vd0h3WURWUjBqQkJnd0ZvQVVGQzZ6RjdkWVZzdXVVQWxBNWgrdm5Zc1V3c1l3VlFZSUt3WUJCUVVICkFRRUVTVEJITUNFR0NDc0dBUVVGQnpBQmhoVm9kSFJ3T2k4dmNqTXVieTVzWlc1amNpNXZjbWN3SWdZSUt3WUIKQlFVSE1BS0dGbWgwZEhBNkx5OXlNeTVwTG14bGJtTnlMbTl5Wnk4d0pRWURWUjBSQkI0d0hJSWFaR0Z6YUdKdgpZWEprTG1SaGRHRjJaWEp6WlM1dmNtY3VkV0V3VEFZRFZSMGdCRVV3UXpBSUJnWm5nUXdCQWdFd053WUxLd1lCCkJBR0MzeE1CQVFFd0tEQW1CZ2dyQmdFRkJRY0NBUllhYUhSMGNEb3ZMMk53Y3k1c1pYUnpaVzVqY25sd2RDNXYKY21jd2dnRUVCZ29yQmdFRUFkWjVBZ1FDQklIMUJJSHlBUEFBZGdCRWxHVXVzTzdPcjhSQUI5aW8vaWpBMnVhQwp2dGpMTWJVLzB6T1d0YmFCcUFBQUFYZlVaM0NEQUFBRUF3QkhNRVVDSVFDaHhDM05sWTl0RXBJRllJbkZOTWVJCm1keTRaYit1WjY2ZUVNNjZDTCs0Z3dJZ0Z4T0VQM2VGNFdXSU1ZNWwzZC9Jb04zM3lzRXM2cVFlYXg1TWZlZlkKUjVFQWRnQjlQdkw0ai8rSVZXZ2t3c0RLbmxLSmVTdkZEbmdKZnk1cWwyaVpmaUx3MXdBQUFYZlVaM0NoQUFBRQpBd0JITUVVQ0lEMmRDeXBFdE9wT3NOcVBPdHRBTEhzaElDdVBsOEhBRFpmdG9FcExaWjFUQWlFQTlzYWFuaDkzCnc0UlBrbGxXai9qYm9FaXliNDdNSVF6bHVlVVFvc0MvdnZBd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFEMkkKS3FJYXY4ZzlmNjJpcEVXZnFBNnlEVm9EdXMrZG5qdDFyb20yYjdPZjJTVHdKL2NNVkNWS0J0c2lSN2NqTXVQNQpBdjY0bXZRSS9pb1R5cE5kZENZazVHL2MwTS82blA1VWFKK0gxU3dKcWxTUmUvK0VTaWRUanVJWUlKdloydlk0CnVaanplKzRQeUZyYmZ2Q0ZCeHpqOXhOTnhEV09CeFNURGlidDdiVTJVbzJOYnJtajhNOXRVUzlUbm5yQ0kyZ2MKS3ZteVR3VnJabDM3ZDN3bjJWSGV3UFFhb0FJcTltM1ZydVRTYkJDOUVxT3pjbTEvTVV2Umk0Zmp2WHBaelFqeQovTm5oN2d4c3VGYnhjdGRDZldHeXU1akN2UFJSUGdUSVpsUkVoQk1EcWszQytGYVQ4WUxBcGlhNlNIWnVYMTE3CnpHQm1UNnZsRGx3REc2WGx2ajA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWlRDQ0EwMmdBd0lCQWdJUVFBRjFCSU1VcE1naGpJU3BEQmJOM3pBTkJna3Foa2lHOXcwQkFRc0ZBREEvCk1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVQKRGtSVFZDQlNiMjkwSUVOQklGZ3pNQjRYRFRJd01UQXdOekU1TWpFME1Gb1hEVEl4TURreU9URTVNakUwTUZvdwpNakVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVeGxkQ2R6SUVWdVkzSjVjSFF4Q3pBSkJnTlZCQU1UCkFsSXpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV3SVZLTXoyb0pUVER4THMKalZXU3cvaUM4Wm1tZWtLSXAxMG1xclVydWNWTXNhK09hL2wxeUtQWEQwZVVGRlUxVjR5ZXFLSTVHZldDUEVLcApUbTcxTzhNdTI0M0FzRnp6V1RqbjdjOXA4Rm9MRzc3QWxDUWxoL28zY2JNVDV4eXM0WnZ2MitRN1JWSkZscW5CClU4NDB5Rkx1dGE3dGo5NWdjT0tsVkt1MmJRNlhwVUEwYXl2VHZHYnJaalI4K211TGoxY3BtZmd3RjEyNmNtLzcKZ2NXdDBvWllQUmZINXdtNzhTdjNodHpCMm5GZDFFYmp6SzBsd1lpOFlHZDFaclB4R1BlaVhPWlQvenFJdGtlbAoveE1ZNnBnSmR6K2RVL25QQWVYMXBuQVhGSzlqcFArWnM1T2QzRk9uQnY1SWhSMmhhYTRsZGJzVHpGSUQ5ZTFSCm9ZdmJGUUlEQVFBQm80SUJhRENDQVdRd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFEQU9CZ05WSFE4QkFmOEUKQkFNQ0FZWXdTd1lJS3dZQkJRVUhBUUVFUHpBOU1Ec0dDQ3NHQVFVRkJ6QUNoaTlvZEhSd09pOHZZWEJ3Y3k1cApaR1Z1ZEhKMWMzUXVZMjl0TDNKdmIzUnpMMlJ6ZEhKdmIzUmpZWGd6TG5BM1l6QWZCZ05WSFNNRUdEQVdnQlRFCnA3R2tleXh4K3R2aFM1QjEvOFFWWUlXSkVEQlVCZ05WSFNBRVRUQkxNQWdHQm1lQkRBRUNBVEEvQmdzckJnRUUKQVlMZkV3RUJBVEF3TUM0R0NDc0dBUVVGQndJQkZpSm9kSFJ3T2k4dlkzQnpMbkp2YjNRdGVERXViR1YwYzJWdQpZM0o1Y0hRdWIzSm5NRHdHQTFVZEh3UTFNRE13TWFBdm9DMkdLMmgwZEhBNkx5OWpjbXd1YVdSbGJuUnlkWE4wCkxtTnZiUzlFVTFSU1QwOVVRMEZZTTBOU1RDNWpjbXd3SFFZRFZSME9CQllFRkJRdXN4ZTNXRmJMcmxBSlFPWWYKcjUyTEZNTEdNQjBHQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01CQmdnckJnRUZCUWNEQWpBTkJna3Foa2lHOXcwQgpBUXNGQUFPQ0FRRUEyVXpneWZXRWlEY3gyN3NUNHJQOGkydGlFbXhZdDBsK1BBSzNxQjhvWWV2TzRDNXo3MGtICmVqV0VIeDJ0YVBEWS9sYUJMMjEvV0tadU5UWVFISFBENWIxdFhnSFhibkw3S3FDNDAxZGs1VnZDYWRUUXN2ZDgKUzhNWGpvaHljOXo5L0cyOTQ4a0xqbUU2RmxoOWREWXJWWUE5eDJPK2hFUEdPYUVPYTFlZVB5bkJnUGF5dlVmTApxakJzdHpMaFdWUUxHQWtYWG1Ocys1Wm5QQnh6REpPTHhoRjJKSWJlUUFjSDVIMHRaclVsbzVaWXlPcUE3czlwCk81Yjg1bzNBTS9PSitDa3RGQlF0ZnZCaGNKVmQ5d3Zsd1Bzayt1eU95MkhJN21OeEtLZ3NCVHQzNzV0ZUEyVHcKVWRIa2hWTmNzQUtYMUg3R05OTE9FQURrc2Q4Nnd1b1h2Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", + "key": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS1FJQkFBS0NBZ0VBeUlIRHAyTVE1Qkc1Y1l5c2xSTW9NMTNrRDVaOEtBV0J2TXR5UFRNRVFKV25Tbyt0CjdnWmE5dFMvbmhvVERnWEY0TXVTMDFxUnpNYmZFWWdRVndQZUxGTFl6b1FVdXdJcC9Ud1Rhc1ptbk84bWIxQ00KMGFieExyc0hhV1ppcU1JUC9KYnJ2SDliR2NyTW9LMjZqdEQrbFdWMWYrU2x5SU40TkpURTIvN2R1SDcrZXIwUwpkczg5cmdDd1hsQmVQUjVDa0hWZ3JscWtSSlAyZ3NmSVJmeXpvejNYNWpXV1ptSW9Zc0F1RERReGVMRW8zaUtaCmo5MDN5bDNoaVBjSGR1VnRUYWxXN3J2S20yY2xORmxlaVovQzFGakRFOEJuNW1TZG1FdWVuUGMyQkxGVmNicmsKRHdGVFpOZHNEZVJTNnJXMUFTSy9GTnQxdFZ3NzMxdUpNZ2cwK0lXT0YvdHhBQ3FLVDcwVWcyRlpjSSs3dEpabgp0ZE5NQzRYLzgyNjA0WEhnNC9hYmxJdmx5cloyVGMrZXZhVjRpOFVmb0M0VWcwMHBlditXekVmOXlaOHpnN0JPCnhHOXB1Z2svRGlsbW5mOHVOaVhWcVNDcm4zSHdTeW1SRXhycVJHWDR5WUVpY2VVUjJuZVdZMXEyd1BUVUpDWC8KRVRnaUdlbjUweHJab0xuVTNPajdsU1FUTnlvZjB1WHgrWUV3Yk1aYTRsWlZ2Wjl2WDRUUVdQajliS2dpT2NSeApTVnhJank2T2NFZEVHdDIvWVpWRWJ2UXJhK3dmL013akZFY3RscWxRdlEwZk1Dem1TYVRmQi9tclBvRUd0SGt2CjJuSk80d2gxTTlFNFdUZ2M2bnRjc1oxQnlQQjA5RWg3K0Nsczc5QitKVWI3dm40NGlEQ0NBaElQL1Y4Q0F3RUEKQVFLQ0FnQmNHZjlkckV2ZDk2WlBXbWNNTXppTUg5emFyQzFyMU51N2RWaU1kQnJINy9aZ2NZOWJmdC9aOGUvegpGOWNZNGQzN1hJZWRQa1VxNDA4a0puUWJCRlBSMkZ4dXdJMGxPZUUveVpEQncxRHZWWXM2SnE0SXY3NlowSitlCjhzRHU4L1dUK1Y5ZnZzQ0NJSDNPY1A3NUMxZG1HS3pZaXBiOGZDZURQN01OdXd6dDZxZktpWDhweEJoNURTZjIKcXNRZkh2OUVqQ1pVOEozMFFtTkJ2N05uTXFUeG56N0ZLR2hscjBFTjIybExnYzRYdW9ralFKRjVYQXg4a0pOQQo3dmdtelV4Z0dDRXVtR1NBN2VoUkc1d3BhNUY3S1NxeXIvY0tCYjIrYnozMHJEbkwvZ2xackplRnJQNDVuQnF1Clp1c1BsVmdIcFlaUWRsNmphREs0YnJ1ZWw5WjhZZmlIVFVhUm85anlzQzloYmdqU0RGU25CMll3aVZzNkZjbmkKakpaajE0dFhYYlBRaUZod3h2TC9BMjZ3NUJraEQ0YTNRWW5EbzhxTWx6ZGFodHQxQzgzOUduc3E2d0FYaEZWeApVeUVxSS9rbXVKTUJzeEV3YTBwQkEvN0hzLzJrMGtUYUJvWGtORFYrWVVzUVhLcDhhUXZTalJ5ajI5Ymw1RVE3CjJaYkJycU15UHNITkh3Z2ppbGo2SEQ3Mm0rVU9sY0dtSFpaTEwzdVhEeUlxVWlLTUpSS1pOcSsvcVRxa2w0UmkKYUVUUzhzMW1tbWRrdU16dkNoeGtlMHdPYWFWWmdkaEU0SnU5T1ZYaldiOHFYNUxqQXI3RTFBQnRDdWkzYXRtTgpIaDR4WDg5eEVXY0dRdmlYT1JvRjJ3NEVKbTFiNkxkWFVzclJLbVBYRUJLWGR4NG13UUtDQVFFQTRpMDJpelNWCjQ1WUtiWThudldON0VrZWlqZkcyTXVjYnVIcVN4MmNoaGZMb3g1UTVpWTFOYzgxZFdDei9HYjhBU0pBU0k4ckUKaytucGVYUS9DOGVNL2sySjl6R3Q1T3lpODJiWHBlY2FxYzU4UjlEdWVWVmJKUjFhV2hYZGdiUnpyckU0R3pNUgpCenc0SUwxTW54RWd2d3Q4a05Ea0tnU0lLTzJESVMrZFFaQ3VhemF2TUFxd2lOV1VBWWNCOXdnbGViNUg2YXRnCnJPWlcrWGlCRC9YK3dRMnkzSCsvQkl6OGJlcU9zeGdhZW56bHU4SWhHaHdtV3lrMUpkU29vZlRycEJ0M3RwcEsKMTg3blQ5NnpxN3h1em1ETXE5aEJ4VVNNZTIyMnZycU9NbzNPY0lIT2VTNEcvcjIreStZSmNJUFBBcUp6L1lMWQpSRzNBaGpHUDFZYmJSUUtDQVFFQTR2SU1Makk0UVFOMFBnVDRWbUx4a1lpV1VZeTRySnVhc0FlbldiMld0bVZ6CjNJeGU2MmszSURSSXBkeGhRSGNyd3ZsOVBBS0tiYi9mRUdoNCtpdkxmK0NwVG9ITHVQOEI5VWllcWZ0OUIrMUcKZU9qMEJTQitKLzhmeEVJSU1zZENIOEs4T3BtaTZCZTg4eG8vamNVZGJNQXdMa0d4VFpDWVFoV2hzdVBQMjBjWgpkQUdkNXNwa1VrU1BxeUJ5N0Z6WVlwVnRVNWUzVDY0TjlxOTBhYUpJTjREWXZIYXcxdit3emNNRjNpQy93dm5pCkNKcDJaWUkreFhSZ2N4TVZSQXFWbVBTNGNFd3RNcVFyQnEwcEhaWVR2N0hoN1l0S2V1dTBWY2V0Q1dwRnhDeXAKVmRML29QM1ZRQ1VGQVdxOVhMZFBTUm8yWjdwUHNvRVhGNDdFTXZhdVV3S0NBUUVBc2oyTlVYRFVlckVnY0t5egpWYVlUTkJtdCtneTFXRElXLzIvaFFqRjlFckdXVHNuNStmT1lTUjFiWllTNFdOTFQ1MXRhWUVpSVdFU3JrT0pTCldQY2VucjMrYndjQWtuc0dBNmxWWXRIWWlsOUdROVpjU05SQ2F1SlI5TkpzYUs0THlHeXkyWVNKODlpNkp0cm4KaWllV1ZkZzRoMnVIazdGVW1HUnN4WGRmaDI3OGRWTjRCZlUybis4b24zZUV6ZWZtbUtXaXlId2RTTVNSWURKZQpDM1VDR2FPeEErSE1hRXF2Ri9RVUZ3RjB4SGl2RnlOcXNNZmtWazBJTEZNRnZmUmt5MFEyT0hvcFp4OFAzVHFVCi8wOFZSNkN6U3UyM0R6M3hNOGdIanhFM3hKRktVaEdKNUtlb0xaTGN6SlR4ZFhENmI0b1V2SUVqNi9GT0dyTHUKTmdqN3ZRS0NBUUIvRnllbEV6Q1hqL1NmNnE2Ynlnc1lBaEtVRnFjdzJtOFZGeVFyeUZWSFRhZEZva0podU9sTApHcHg0YmVMMGRBaEl4dWpRRzJna0wrZ2VTek04Zmh3WFA5dndnQlZ6UXpONGhqTjhZNzdRR3B0MWlKZG02NXhhCmo2L2RlMUVXQnFwTUdRVEtHRkczZ2R1cGxGQjA5eWNVU01oeWp3MVlyNW5rb0RLT2VLOWxUL3E4RVUrNCtDeVkKT1pidk1WdkthL0F0dlJxZFRvQTBtZmR0NXpIZEdpa3hFL0hNRVBmVlh4bEhFV2tPek80MnBUTmt1QU9Ic3htdQpBQThuUWsrTmJCUDh0VWM0ZENCM2xLSVh1ZzhsWjI4bDBkc0E2UmxMbndXOVovWEtLUDVxN3N2aHFTaklvbjJ5CnowaHZVN1E1NE5vQXlUSWdncUN4Q1VQQ1NJd3RNaUhMQW9JQkFRQ1FWamZGc0ZiN1RUU2dJdVJuU2FCanZTaWwKVXRUdEFnOWpHb2xobWtYdVBQSE1uSlZQRzNhTU4wQ1hBcFBOSi9pRlFOYmxvbWpMeVUzb2FWdnRzWEZQdjFZaQpoL2N3SzRFNFhCWENXN3kvRGhvclBvRGF5UnVTTk9BWnFENVBTWWIxQVVqUHpqc1dOektZM29Cc0RiUGhaZTJ2CjFneEVMODR4akpydzF2bS8rY0RUeTFNR3crRnBSeW85aGgvR1o1SGJkd2ZFa2sySi9WbStVa0FKbFdCejRJMEgKZHhpMi9iWXFFUENod0tSWUxwT2VMZ1JMOHl4djZ1OUphWkkwSDJCb3NOVDF5bStFN0x3eS9RVjQyUUx6Y2V2bwpZQUt6SXZaOGxNdHNKZ0FVV1FRdHNwcmIxTWhwNkZvUHJQUjA1aDI4c3IzUVVtV093eHduVVNJSDJ2UjYKLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", + "Store": "default" + } + ] + } +} \ No newline at end of file diff --git a/services-available/workflows/kafka.yaml b/services-available/workflows/kafka.yaml new file mode 100644 index 0000000..379461a --- /dev/null +++ b/services-available/workflows/kafka.yaml @@ -0,0 +1,33 @@ +version: '3.7' +services: + kafdrop: + image: obsidiandynamics/kafdrop + restart: "no" + ports: + - "9000:9000" + environment: + KAFKA_BROKERCONNECT: "kafka:29092" + JVM_OPTS: "-Xms16M -Xmx48M -Xss180K -XX:-TieredCompilation -XX:+UseStringDeduplication -noverify" + depends_on: + - "kafka" + labels: + - "traefik.enable=true" + - "traefik.http.routers.kafka.rule=Host(`kafka.${traefikhost}`)" + - "traefik.http.routers.kafka.tls=true" + - "traefik.http.services.kafka.loadbalancer.server.port=9000" + - "traefik.http.routers.kafka.tls.certresolver=myresolver" + kafka: + image: obsidiandynamics/kafka + restart: "no" + ports: + - "2181:2181" + - "9092:9092" + environment: + KAFKA_LISTENERS: "INTERNAL://:29092,EXTERNAL://:9092" + KAFKA_ADVERTISED_LISTENERS: "INTERNAL://kafka:29092,EXTERNAL://localhost:9092" + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT" + KAFKA_INTER_BROKER_LISTENER_NAME: "INTERNAL" + KAFKA_ZOOKEEPER_SESSION_TIMEOUT: "6000" + KAFKA_RESTART_ATTEMPTS: "10" + KAFKA_RESTART_DELAY: "5" + ZOOKEEPER_AUTOPURGE_PURGE_INTERVAL: "0" From 7257ff7f2c98dd75a66fc1775f3adcd8a068bbb1 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Wed, 24 Feb 2021 16:23:35 +0200 Subject: [PATCH 22/36] make /distro folder default --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 6b6e825..0d55186 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ menuconfig-docker: # help: check all distributives consistency check-all: - @for DIR in distributives/*; do \ + @for DIR in distro/*; do \ printf "============================="; \ printf " Checking %-20s " $$DIR; \ printf "=============================\n"; \ From d610a205951645ec01f2065a9753c578a21ce060 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Wed, 24 Feb 2021 22:24:49 +0200 Subject: [PATCH 23/36] SKOSMOS as a server --- services-available/semantics/skosmos.yaml | 45 +++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 services-available/semantics/skosmos.yaml diff --git a/services-available/semantics/skosmos.yaml b/services-available/semantics/skosmos.yaml new file mode 100644 index 0000000..b9133a6 --- /dev/null +++ b/services-available/semantics/skosmos.yaml @@ -0,0 +1,45 @@ +version: '3.7' +services: + fuseki: + container_name: skosmos-fuseki + image: coronawhy/fuseki:latest + #build: jena-fuseki/ + #image: stain/jena-fuseki + environment: + - ADMIN_PASSWORD=admin + - JVM_ARGS=-Xmx6g + #--config=/data/skosmos.ttl + - FUSEKI_DATASET_1=skosmos + - FUSEKI_ADDITIONAL_ARGS=/data/jena-text.jar + ports: + - 3030:3030 + volumes: + - ./var/skosmos/config/config.ttl:/fuseki/config.ttl + - ./var/skosmos/config/fuseki-server:/jena-fuseki/fuseki-server + - ./var/skosmos/data/fuseki-data:/fuseki/databases + - ./var/skosmos/data/fuseki-input:/data + labels: + - "traefik.enable=true" + - "traefik.http.routers.fuseki.rule=Host(`fuseki.${traefikhost}`)" + - "traefik.http.services.fuseki.loadbalancer.server.port=3030" + - "traefik.http.routers.fuseki.tls=true" + - "traefik.http.routers.fuseki.tls.certresolver=myresolver" + + skosmos: + networks: + - traefik + container_name: skosmos + build: . + volumes: + - ./skosmos/Skosmos:/var/www/html + ports: + - 8000:80 + labels: + - "traefik.enable=true" + - "traefik.http.routers.skosmos.rule=Host(`skosmos.${traefikhost}`)" + - "traefik.http.services.skosmos.loadbalancer.server.port=80" + - "traefik.http.routers.skosmos.tls=true" + - "traefik.http.routers.skosmos.tls.certresolver=myresolver" + depends_on: + - fuseki + From de2faeb6c0a492fa616387f2967613eabc5f9b90 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Wed, 24 Feb 2021 22:59:56 +0200 Subject: [PATCH 24/36] Semantic Tools distributive added --- distro/semantictools/.env | 18 ++++++++++++++++++ distro/semantictools/Makefile | 1 + distro/semantictools/Skosmos | 1 + distro/semantictools/skosmos.yaml | 1 + distro/semantictools/traefik-https.yaml | 1 + 5 files changed, 22 insertions(+) create mode 100644 distro/semantictools/.env create mode 120000 distro/semantictools/Makefile create mode 120000 distro/semantictools/Skosmos create mode 120000 distro/semantictools/skosmos.yaml create mode 120000 distro/semantictools/traefik-https.yaml diff --git a/distro/semantictools/.env b/distro/semantictools/.env new file mode 100644 index 0000000..f1e87a1 --- /dev/null +++ b/distro/semantictools/.env @@ -0,0 +1,18 @@ +COMPOSE_PROJECT_NAME=dataverse.org.ua + +# traefik settings +traefikhost=dataverse.org.ua +useremail=team@coronawhy.org + +# local postgres settings +LC_ALL=C.UTF-8 +POSTGRES_DB=dvndb +POSTGRES_USER=dvnuser +POSTGRES_PASSWORD=dvnsecret +POSTGRES_PORT=5432 + +# local dataverse settings +DATAVERSE_URL=https://dataverse.s3.coronawhy.org +POSTGRES_SERVER=postgres +POSTGRES_DATABASE=postgres +PGPASSWORD=dvnsecret diff --git a/distro/semantictools/Makefile b/distro/semantictools/Makefile new file mode 120000 index 0000000..3e6e831 --- /dev/null +++ b/distro/semantictools/Makefile @@ -0,0 +1 @@ +../../mk/distro-makefile.mk \ No newline at end of file diff --git a/distro/semantictools/Skosmos b/distro/semantictools/Skosmos new file mode 120000 index 0000000..4a7ec82 --- /dev/null +++ b/distro/semantictools/Skosmos @@ -0,0 +1 @@ +/data/Skosmos \ No newline at end of file diff --git a/distro/semantictools/skosmos.yaml b/distro/semantictools/skosmos.yaml new file mode 120000 index 0000000..c8508c0 --- /dev/null +++ b/distro/semantictools/skosmos.yaml @@ -0,0 +1 @@ +../../services-available/semantics/skosmos.yaml \ No newline at end of file diff --git a/distro/semantictools/traefik-https.yaml b/distro/semantictools/traefik-https.yaml new file mode 120000 index 0000000..f1b43d5 --- /dev/null +++ b/distro/semantictools/traefik-https.yaml @@ -0,0 +1 @@ +../../services-available/ingress/traefik-https.yaml \ No newline at end of file From f49af610c99fac4bba57f14f6f94fb0850b6bde1 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Wed, 24 Feb 2021 23:02:49 +0200 Subject: [PATCH 25/36] SKOSMOS will use source folder to keep src from github --- services-available/semantics/skosmos.yaml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/services-available/semantics/skosmos.yaml b/services-available/semantics/skosmos.yaml index b9133a6..430c997 100644 --- a/services-available/semantics/skosmos.yaml +++ b/services-available/semantics/skosmos.yaml @@ -14,8 +14,8 @@ services: ports: - 3030:3030 volumes: - - ./var/skosmos/config/config.ttl:/fuseki/config.ttl - - ./var/skosmos/config/fuseki-server:/jena-fuseki/fuseki-server + - ./source/skosmos/config/config.ttl:/fuseki/config.ttl + - ./source/skosmos/config/fuseki-server:/jena-fuseki/fuseki-server - ./var/skosmos/data/fuseki-data:/fuseki/databases - ./var/skosmos/data/fuseki-input:/data labels: @@ -26,12 +26,11 @@ services: - "traefik.http.routers.fuseki.tls.certresolver=myresolver" skosmos: - networks: - - traefik container_name: skosmos - build: . + #build: . + image: coronawhy/skosmos:latest volumes: - - ./skosmos/Skosmos:/var/www/html + - ./source/Skosmos:/var/www/html ports: - 8000:80 labels: From 3447c69c7a466f860faf6154514aaddc724a52ed Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Wed, 24 Feb 2021 23:03:21 +0200 Subject: [PATCH 26/36] Source folder added in Semantic tools distributive --- distro/semantictools/Skosmos | 1 - distro/semantictools/source/README.md | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 120000 distro/semantictools/Skosmos create mode 100644 distro/semantictools/source/README.md diff --git a/distro/semantictools/Skosmos b/distro/semantictools/Skosmos deleted file mode 120000 index 4a7ec82..0000000 --- a/distro/semantictools/Skosmos +++ /dev/null @@ -1 +0,0 @@ -/data/Skosmos \ No newline at end of file diff --git a/distro/semantictools/source/README.md b/distro/semantictools/source/README.md new file mode 100644 index 0000000..39875a1 --- /dev/null +++ b/distro/semantictools/source/README.md @@ -0,0 +1 @@ +Source code folder for SKOSMOS. From 64bec341fc19582b5a6ad8aced0a9deeccda2f8d Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Thu, 25 Feb 2021 00:31:05 +0200 Subject: [PATCH 27/36] distributives folder removed to /distro, small corrections --- README.md | 6 +- bin/menuconfig | 2 +- distro/dataverse-multilang/.env | 59 +------------------- services-available/translations/weblate.yaml | 11 +--- 4 files changed, 8 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index b65e6a0..bae97ce 100644 --- a/README.md +++ b/README.md @@ -46,9 +46,9 @@ To Do (we re accepting Pull Requests, please join the project if you want to con * OCR Tesseract (OCR as a service) * Kibana -BeFAIR is using Traefik load balancer and proxy service. Please define traefikhost in the configuration of your distributive (see distributive/ folder) to start enabled services. +BeFAIR is using Traefik load balancer and proxy service. Please define traefikhost in the configuration of your distributive (see distro/ folder) to start enabled services. -if you want to enable some service, for example, INDRA, run this from ./distributives/your_domain_name where your_domain_name should correspond to your domain (default is localhost): +if you want to enable some service, for example, INDRA, run this from ./distro/your_distributive_name where your_distributive_name should correspond to your project name or domain (default is localhost): ``` ln -s ../../services-available/indra.yaml indra.yaml ``` @@ -84,7 +84,7 @@ cd befair make check-all ``` -You can find all available installations in "distributives" folder. Different distributives are suitable for various research communities. +You can find all available installations in /distro folder. Different distributives are suitable for various research communities. Choose some distributive, for example, "fair", and start/stop all services with commands: ``` diff --git a/bin/menuconfig b/bin/menuconfig index 69d6210..cfdc80f 100755 --- a/bin/menuconfig +++ b/bin/menuconfig @@ -3,7 +3,7 @@ BASEDIR=$(realpath $(dirname $(realpath $0))/..) cd $BASEDIR -DISTROS_DIR=distributives +DISTROS_DIR=distro DISTRO_ACTIVE_LINK=distributive-active SERVICES_AVAILABLE_DIR=services-available STANDALONE_DIR=exports diff --git a/distro/dataverse-multilang/.env b/distro/dataverse-multilang/.env index ab017ee..f1e87a1 100644 --- a/distro/dataverse-multilang/.env +++ b/distro/dataverse-multilang/.env @@ -2,6 +2,7 @@ COMPOSE_PROJECT_NAME=dataverse.org.ua # traefik settings traefikhost=dataverse.org.ua +useremail=team@coronawhy.org # local postgres settings LC_ALL=C.UTF-8 @@ -15,61 +16,3 @@ DATAVERSE_URL=https://dataverse.s3.coronawhy.org POSTGRES_SERVER=postgres POSTGRES_DATABASE=postgres PGPASSWORD=dvnsecret - -# See Weblate documentation for detailed description: -# https://docs.weblate.org/en/latest/admin/deployments.html#docker - -# Weblate setup -WEBLATE_DEBUG=1 -WEBLATE_SITE_DOMAIN=0.0.0.0:9000 -WEBLATE_LOGLEVEL=DEBUG -WEBLATE_SITE_TITLE=Weblate -WEBLATE_ADMIN_NAME=admin -WEBLATE_ADMIN_EMAIL=weblate@example.com -WEBLATE_ADMIN_PASSWORD=admin -WEBLATE_SERVER_EMAIL=weblate@example.com -WEBLATE_DEFAULT_FROM_EMAIL=weblate@example.com -WEBLATE_ALLOWED_HOSTS=* -WEBLATE_REGISTRATION_OPEN=1 - -# Extra -#WEBLATE_TIME_ZONE= -#WEBLATE_MT_GOOGLE_KEY= -#WEBLATE_SOCIAL_AUTH_GITHUB_KEY= -#WEBLATE_SOCIAL_AUTH_GITHUB_SECRET= -#WEBLATE_SOCIAL_AUTH_BITBUCKET_KEY= -#WEBLATE_SOCIAL_AUTH_BITBUCKET_SECRET= -#WEBLATE_SOCIAL_AUTH_FACEBOOK_KEY= -#WEBLATE_SOCIAL_AUTH_FACEBOOK_SECRET= -#WEBLATE_SOCIAL_AUTH_GOOGLE_OAUTH2_KEY= -#WEBLATE_SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET= - -#WEBLATE_OFFLOAD_INDEXING=1 -#WEBLATE_GOOGLE_ANALYTICS_ID= -#WEBLATE_ENABLE_HTTPS=1 -#WEBLATE_IP_PROXY_HEADER=HTTP_X_FORWARDED_FOR -#WEBLATE_REQUIRE_LOGIN=1 - -# LDAP Auth -#WEBLATE_AUTH_LDAP_SERVER_URI=ldap://ldap.example.org -#WEBLATE_AUTH_LDAP_USER_DN_TEMPLATE=uid=%(user)s,ou=People,dc=example,dc=net -#WEBLATE_AUTH_LDAP_USER_ATTR_MAP=first_name:name,email:mail - -# PostgreSQL setup -POSTGRES_PASSWORD=weblate -POSTGRES_USER=weblate -POSTGRES_DATABASE=weblate -POSTGRES_HOST=database -POSTGRES_PORT= - -# Cache setup -# https://docs.weblate.org/en/latest/admin/install.html#production-cache -REDIS_HOST=cache -REDIS_PORT=6379 - -# Mail server, the server has to listen on port 587 and understand TLS -WEBLATE_EMAIL_HOST=127.0.0.1 -# Do NOT use quotes here -WEBLATE_EMAIL_USER= -# Do NOT use quotes here -WEBLATE_EMAIL_PASSWORD= diff --git a/services-available/translations/weblate.yaml b/services-available/translations/weblate.yaml index d6e315e..c2f30ec 100644 --- a/services-available/translations/weblate.yaml +++ b/services-available/translations/weblate.yaml @@ -1,15 +1,10 @@ version: '3.7' - weblate: - image: fairdata/fairdatapoint-client - ports: - - "8091:80" services: weblate: image: weblate/weblate volumes: - weblate-data:/app/data - env_file: - - ./.env + env_file: .env_weblate restart: always depends_on: - database @@ -18,8 +13,7 @@ services: WEBLATE_ENABLE_HTTPS: 1 database: image: postgres:9.6-alpine - env_file: - - ./.env + env_file: .env_weblate volumes: - postgres-data:/var/lib/postgresql/data restart: always @@ -38,6 +32,7 @@ services: environment: STAGE: production PROXY_READ_TIMEOUT: 3600 + env_file: .env_weblate volumes: - ssl-certs:/var/lib/https-portal labels: From ca9f58db285ad3285d7447f5b4e713200580f01a Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Thu, 25 Feb 2021 11:40:46 +0200 Subject: [PATCH 28/36] docs folder added for documentation and images --- docs/images/overview.png | Bin 0 -> 78629 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/overview.png diff --git a/docs/images/overview.png b/docs/images/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..5fb2169ee9451a0ac4e1ef7add96a32da2ff6767 GIT binary patch literal 78629 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%0Dx%cegdxi)#kgpfFz{?JDBR4`6 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 XC-y;Q^hx0r@So}fEu~TgtLOg Date: Fri, 26 Feb 2021 00:24:37 +0200 Subject: [PATCH 29/36] Dataverse converter tool added as a service --- distro/dataverse-converters/.env | 18 ++++++++++ distro/dataverse-converters/Makefile | 1 + distro/dataverse-converters/ddiconverter.yaml | 1 + .../dataverse-converters/traefik-https.yaml | 1 + .../var/security/letsencrypt/acme.json | 36 +++++++++++++++++++ 5 files changed, 57 insertions(+) create mode 100644 distro/dataverse-converters/.env create mode 120000 distro/dataverse-converters/Makefile create mode 120000 distro/dataverse-converters/ddiconverter.yaml create mode 120000 distro/dataverse-converters/traefik-https.yaml create mode 100644 distro/dataverse-converters/var/security/letsencrypt/acme.json diff --git a/distro/dataverse-converters/.env b/distro/dataverse-converters/.env new file mode 100644 index 0000000..f1e87a1 --- /dev/null +++ b/distro/dataverse-converters/.env @@ -0,0 +1,18 @@ +COMPOSE_PROJECT_NAME=dataverse.org.ua + +# traefik settings +traefikhost=dataverse.org.ua +useremail=team@coronawhy.org + +# local postgres settings +LC_ALL=C.UTF-8 +POSTGRES_DB=dvndb +POSTGRES_USER=dvnuser +POSTGRES_PASSWORD=dvnsecret +POSTGRES_PORT=5432 + +# local dataverse settings +DATAVERSE_URL=https://dataverse.s3.coronawhy.org +POSTGRES_SERVER=postgres +POSTGRES_DATABASE=postgres +PGPASSWORD=dvnsecret diff --git a/distro/dataverse-converters/Makefile b/distro/dataverse-converters/Makefile new file mode 120000 index 0000000..3e6e831 --- /dev/null +++ b/distro/dataverse-converters/Makefile @@ -0,0 +1 @@ +../../mk/distro-makefile.mk \ No newline at end of file diff --git a/distro/dataverse-converters/ddiconverter.yaml b/distro/dataverse-converters/ddiconverter.yaml new file mode 120000 index 0000000..be4ae83 --- /dev/null +++ b/distro/dataverse-converters/ddiconverter.yaml @@ -0,0 +1 @@ +../../services-available/converters/ddiconverter.yaml \ No newline at end of file diff --git a/distro/dataverse-converters/traefik-https.yaml b/distro/dataverse-converters/traefik-https.yaml new file mode 120000 index 0000000..f1b43d5 --- /dev/null +++ b/distro/dataverse-converters/traefik-https.yaml @@ -0,0 +1 @@ +../../services-available/ingress/traefik-https.yaml \ No newline at end of file diff --git a/distro/dataverse-converters/var/security/letsencrypt/acme.json b/distro/dataverse-converters/var/security/letsencrypt/acme.json new file mode 100644 index 0000000..d2670e1 --- /dev/null +++ b/distro/dataverse-converters/var/security/letsencrypt/acme.json @@ -0,0 +1,36 @@ +{ + "myresolver": { + "Account": { + "Email": "team@coronawhy.org", + "Registration": { + "body": { + "status": "valid", + "contact": [ + "mailto:team@coronawhy.org" + ] + }, + "uri": "https://acme-v02.api.letsencrypt.org/acme/acct/113932823" + }, + "PrivateKey": "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", + "KeyType": "4096" + }, + "Certificates": [ + { + "domain": { + "main": "dashboard.dataverse.org.ua" + }, + "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdPakNDQlNLZ0F3SUJBZ0lTQTNsclFNckw2cDFqalAwTG55NkNIbkMvTUEwR0NTcUdTSWIzRFFFQkN3VUEKTURJeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFNWlhRbmN5QkZibU55ZVhCME1Rc3dDUVlEVlFRRApFd0pTTXpBZUZ3MHlNVEF5TWpVeU1URTBNVFJhRncweU1UQTFNall5TVRFME1UUmFNQ1V4SXpBaEJnTlZCQU1UCkdtUmhjMmhpYjJGeVpDNWtZWFJoZG1WeWMyVXViM0puTG5WaE1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0MKQWc4QU1JSUNDZ0tDQWdFQWx0emI3MHl1TEl6Z3c3R1lnWkVPQktOeFZvc0hodDJPV3dvZmIwOWZZYTJWMHRxcgpnTktqdUxUd0ZoYm55T0E1Yng2bkpUbWFDcDJlUGdyZkd5OVFBbTExS0lOWGloMVVObFlabVpDaE8wUDlTT2JmCjdOZE9pMXhQdFdmUHhvOS83Ym5NaGt0Q2l0eUVDZFpocjlGRE5IU0o0YjZNUkRaWTVqMEpYanJvYzcycVVLVU8KdUFyNlNzRWZHU0NDcDBXVnpuV2ppUlNsQTZ1cElyaUxQanhDRWpycU5CeXBWRjdrUkxRaEVITTBBSkowZnFQSAppUjQ1b2VYeHBMTjVHK0d4MENILzlVSTcxY00xTUhlTkQ1bWRmOUU1OU81ZTV5NUlqdVloNmpMaklBdDNvUFVLClQrdlI0Y3dtbWMvY3VVZFBCNHVzb0tpK29vR1FtWXdhRWJhN3oyRTlIbCtTd0tINDE1SEhVc0RWYjJKM1NZSTkKT1MzTkNTNFBBNnhsN25HVC9wT25aSFd3eGwrQWhKVFJoSXFrSXozREpDU3NSUEFUOFdRZ3EraVVML3BkQm1oVQpmNnp6dFRQNXZWV0p2Z3FnOWtGN0ZNUVhFeDIwVTN6UmhObG50bXhMbzEvNGgzMVA2YnFpakxaRHFwcXRCT3k1CnJMc0FrM0Nhem5FSkxFYVJIajVMbTl1WHlmdk1xWWJLNTVLdGd5bnhDVFNwVVJwZzFlRmZTa3NEOFQrRkZLY1EKTDg0MnV5clRFb1Z2dUw1WlJXLzcyaVdYRWdrMm9RanZTZ1ltUWRGTzBRcHVrZ0syMjc2dE1UcmVnR2lNTHRZUAptWWlDdVUycnhnMzFZc1RxOFliV2NyL0hVUVNsYkp4NFlmUmpDb2dIS0o1ZWcvOGNUN3gvZ3UxTGhZc0NBd0VBCkFhT0NBbFV3Z2dKUk1BNEdBMVVkRHdFQi93UUVBd0lGb0RBZEJnTlZIU1VFRmpBVUJnZ3JCZ0VGQlFjREFRWUkKS3dZQkJRVUhBd0l3REFZRFZSMFRBUUgvQkFJd0FEQWRCZ05WSFE0RUZnUVUzZjEzQzRBQlgrSXJsRWFmZytWQgpaUnBqNGJFd0h3WURWUjBqQkJnd0ZvQVVGQzZ6RjdkWVZzdXVVQWxBNWgrdm5Zc1V3c1l3VlFZSUt3WUJCUVVICkFRRUVTVEJITUNFR0NDc0dBUVVGQnpBQmhoVm9kSFJ3T2k4dmNqTXVieTVzWlc1amNpNXZjbWN3SWdZSUt3WUIKQlFVSE1BS0dGbWgwZEhBNkx5OXlNeTVwTG14bGJtTnlMbTl5Wnk4d0pRWURWUjBSQkI0d0hJSWFaR0Z6YUdKdgpZWEprTG1SaGRHRjJaWEp6WlM1dmNtY3VkV0V3VEFZRFZSMGdCRVV3UXpBSUJnWm5nUXdCQWdFd053WUxLd1lCCkJBR0MzeE1CQVFFd0tEQW1CZ2dyQmdFRkJRY0NBUllhYUhSMGNEb3ZMMk53Y3k1c1pYUnpaVzVqY25sd2RDNXYKY21jd2dnRUVCZ29yQmdFRUFkWjVBZ1FDQklIMUJJSHlBUEFBZHdCYzNFT1MvdWFyUlVTeFhwclVWdVlRTi92Vgora2Zjb1hPVXNsN205c2NPeWdBQUFYZmJRYnVMQUFBRUF3QklNRVlDSVFDVk5XYzBON3VZUDV5MzFCSk1WQkwrCitDT1BLUFA5REg2dWU5RjZLVzBVb2dJaEFPNGV0Q3BwVFRvVXNRNWxidFc0dkdlNmJqNWNNK1JvNllBSnFObncKRFJCMUFIVUE5bHlVTDlGM01DSVVWQmdJTUpSV2p1Tk5FeGt6djk4TUx5QUx6RTd4Wk9NQUFBRjMyMEc3aVFBQQpCQU1BUmpCRUFpQjVnY3NhVVBSZzUvc0FpQTdzREFXdVNMa3RjOHU4SnpNTFB5TWliaFVxdGdJZ1piRlNUbFRwCnFoRGZkODVoMzB5QU42c01URjF2TjBmSjBBTXZHNnZKdENJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFDb1AKdTFYdGxMY0ZwR29kVDhjUStYRnBFVVRPMURsU1pLRStUVmlxZUdmSnVYWEE2NzJWQVdpTjY4TTBOR3cvSnZUKwp2Rjc3c0dBdjRwanArM3ZNby9LV3FDdzZjbWoxZmRvOWxFRjg4SDdWZXYrMHQzQ2x6QzZyQmFBQjJjNU9MOXJIClVrYTZNVjBGV0NlWktEbnFUZkxGVjIwZHF3WnJscFZaWEZpRU1PUzhHMVNxRDIvMUtxYzc2WXRXdUFteHNIZ3IKTzFuU3g3WVk5MGpUQ1p3SDh0WTlCdjZzMURmbjRlQlk1VDhFZVJodUlGamFyV2dVMzFPT3NFTlNaUjk2UGdHbgpwZDV0RGdzU3pFN2grWGs5eml4a1lCemRiSXFFQTJNUHl0WkwxbHRMT1ZkeVRmbG5xQngyRnhLanM3RVczbkpPCm0wYW9MZDRqZFUrQW9OTCs5a3M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWlRDQ0EwMmdBd0lCQWdJUVFBRjFCSU1VcE1naGpJU3BEQmJOM3pBTkJna3Foa2lHOXcwQkFRc0ZBREEvCk1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVQKRGtSVFZDQlNiMjkwSUVOQklGZ3pNQjRYRFRJd01UQXdOekU1TWpFME1Gb1hEVEl4TURreU9URTVNakUwTUZvdwpNakVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVeGxkQ2R6SUVWdVkzSjVjSFF4Q3pBSkJnTlZCQU1UCkFsSXpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV3SVZLTXoyb0pUVER4THMKalZXU3cvaUM4Wm1tZWtLSXAxMG1xclVydWNWTXNhK09hL2wxeUtQWEQwZVVGRlUxVjR5ZXFLSTVHZldDUEVLcApUbTcxTzhNdTI0M0FzRnp6V1RqbjdjOXA4Rm9MRzc3QWxDUWxoL28zY2JNVDV4eXM0WnZ2MitRN1JWSkZscW5CClU4NDB5Rkx1dGE3dGo5NWdjT0tsVkt1MmJRNlhwVUEwYXl2VHZHYnJaalI4K211TGoxY3BtZmd3RjEyNmNtLzcKZ2NXdDBvWllQUmZINXdtNzhTdjNodHpCMm5GZDFFYmp6SzBsd1lpOFlHZDFaclB4R1BlaVhPWlQvenFJdGtlbAoveE1ZNnBnSmR6K2RVL25QQWVYMXBuQVhGSzlqcFArWnM1T2QzRk9uQnY1SWhSMmhhYTRsZGJzVHpGSUQ5ZTFSCm9ZdmJGUUlEQVFBQm80SUJhRENDQVdRd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFEQU9CZ05WSFE4QkFmOEUKQkFNQ0FZWXdTd1lJS3dZQkJRVUhBUUVFUHpBOU1Ec0dDQ3NHQVFVRkJ6QUNoaTlvZEhSd09pOHZZWEJ3Y3k1cApaR1Z1ZEhKMWMzUXVZMjl0TDNKdmIzUnpMMlJ6ZEhKdmIzUmpZWGd6TG5BM1l6QWZCZ05WSFNNRUdEQVdnQlRFCnA3R2tleXh4K3R2aFM1QjEvOFFWWUlXSkVEQlVCZ05WSFNBRVRUQkxNQWdHQm1lQkRBRUNBVEEvQmdzckJnRUUKQVlMZkV3RUJBVEF3TUM0R0NDc0dBUVVGQndJQkZpSm9kSFJ3T2k4dlkzQnpMbkp2YjNRdGVERXViR1YwYzJWdQpZM0o1Y0hRdWIzSm5NRHdHQTFVZEh3UTFNRE13TWFBdm9DMkdLMmgwZEhBNkx5OWpjbXd1YVdSbGJuUnlkWE4wCkxtTnZiUzlFVTFSU1QwOVVRMEZZTTBOU1RDNWpjbXd3SFFZRFZSME9CQllFRkJRdXN4ZTNXRmJMcmxBSlFPWWYKcjUyTEZNTEdNQjBHQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01CQmdnckJnRUZCUWNEQWpBTkJna3Foa2lHOXcwQgpBUXNGQUFPQ0FRRUEyVXpneWZXRWlEY3gyN3NUNHJQOGkydGlFbXhZdDBsK1BBSzNxQjhvWWV2TzRDNXo3MGtICmVqV0VIeDJ0YVBEWS9sYUJMMjEvV0tadU5UWVFISFBENWIxdFhnSFhibkw3S3FDNDAxZGs1VnZDYWRUUXN2ZDgKUzhNWGpvaHljOXo5L0cyOTQ4a0xqbUU2RmxoOWREWXJWWUE5eDJPK2hFUEdPYUVPYTFlZVB5bkJnUGF5dlVmTApxakJzdHpMaFdWUUxHQWtYWG1Ocys1Wm5QQnh6REpPTHhoRjJKSWJlUUFjSDVIMHRaclVsbzVaWXlPcUE3czlwCk81Yjg1bzNBTS9PSitDa3RGQlF0ZnZCaGNKVmQ5d3Zsd1Bzayt1eU95MkhJN21OeEtLZ3NCVHQzNzV0ZUEyVHcKVWRIa2hWTmNzQUtYMUg3R05OTE9FQURrc2Q4Nnd1b1h2Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", + "key": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS1FJQkFBS0NBZ0VBbHR6YjcweXVMSXpndzdHWWdaRU9CS054Vm9zSGh0Mk9Xd29mYjA5ZllhMlYwdHFyCmdOS2p1TFR3RmhibnlPQTVieDZuSlRtYUNwMmVQZ3JmR3k5UUFtMTFLSU5YaWgxVU5sWVptWkNoTzBQOVNPYmYKN05kT2kxeFB0V2ZQeG85Lzdibk1oa3RDaXR5RUNkWmhyOUZETkhTSjRiNk1SRFpZNWowSlhqcm9jNzJxVUtVTwp1QXI2U3NFZkdTQ0NwMFdWem5XamlSU2xBNnVwSXJpTFBqeENFanJxTkJ5cFZGN2tSTFFoRUhNMEFKSjBmcVBICmlSNDVvZVh4cExONUcrR3gwQ0gvOVVJNzFjTTFNSGVORDVtZGY5RTU5TzVlNXk1SWp1WWg2akxqSUF0M29QVUsKVCt2UjRjd21tYy9jdVVkUEI0dXNvS2krb29HUW1Zd2FFYmE3ejJFOUhsK1N3S0g0MTVISFVzRFZiMkozU1lJOQpPUzNOQ1M0UEE2eGw3bkdUL3BPblpIV3d4bCtBaEpUUmhJcWtJejNESkNTc1JQQVQ4V1FncStpVUwvcGRCbWhVCmY2enp0VFA1dlZXSnZncWc5a0Y3Rk1RWEV4MjBVM3pSaE5sbnRteExvMS80aDMxUDZicWlqTFpEcXBxdEJPeTUKckxzQWszQ2F6bkVKTEVhUkhqNUxtOXVYeWZ2TXFZYks1NUt0Z3lueENUU3BVUnBnMWVGZlNrc0Q4VCtGRktjUQpMODQydXlyVEVvVnZ1TDVaUlcvNzJpV1hFZ2syb1FqdlNnWW1RZEZPMFFwdWtnSzIyNzZ0TVRyZWdHaU1MdFlQCm1ZaUN1VTJyeGczMVlzVHE4WWJXY3IvSFVRU2xiSng0WWZSakNvZ0hLSjVlZy84Y1Q3eC9ndTFMaFlzQ0F3RUEKQVFLQ0FnRUFpWTlOaEFBWmVVbmowTXpwVUl0aGl0MDFoVUkwVk1kRS9NSllNM2plY2dTRDdzV3hTRC9KUmF6RwpsbjNBVDZ3VThydXlrUURhOHY4UndXVE1WczluVnk5VGV1TjRPTm5SWmRKUWVYUWxjQkxvcTBiSnUvMy9BcGZqCm5uZlFQeSt0NktoWVU4UGdJeG83MDNTRmtubHZuQzcvWXJZSzFFL3g4ODZIOGtJb254QzhjZGh2ZVdXWkgvekUKVEhjV2Ewdko4MzNVNWpQSzIzUDFQMUdpdGRiZ01CdEVYc3dib25EOEY2RmYzTTRQQnM2RUpzMVVMalUvTzk2ZAozaDVBT2lvcnBxcTU1M3JEY0lFVXlPTFozdldsWlZ6MFNkL283VWVJcGJRMkRJVG1FTndqOHNJODZ1OE9hNk5wCk55c1FDbWw1S0ZvMXlERFYwdnZ0Uy9VeCtDRDFVaGJpS1JMZVM1U01oQTFKMjBNdVF4UjJTZ0k4Z1ZUSVo1bEkKQlpKOTJma3RlYUlrL1VkcU5hbEVVK2hYVk1qK2R6aG5NNWZqZjRtVnJ0TnRFZ1dwN2M2a0UwM1NiYyttWFRWaApMNTZHMWhhdEVZUUhwR0xBTDljQmpEdFlpbFNTU1VnSDNkeS83SzFSQVA5RlBXQ1JTMStCbUlEYmQ0YTZhRU9tCkNRU2xLVzRCaEVidlp6MmlSUTJFTWRvanJ0SlcvRXI4S2pMMXJYVWpIQm54Y1Flc2pNdGNTU1lmdUtxcWJVOUcKb3l2c1g0MVVZdDhMTDdwdkxhWXJuNStEN3p6OXBONDBSQnArUTNFYmVmVmZUYndESTdZL0trZXlTbzZIa1UzdAo0REVIcnZUTFBWT0o0cXdiUWpNcjRYbW1CUGNtM2dOaFJGSXl2VGt5cVNNV2tWblNVcUVDZ2dFQkFNWmhmL2NHCjNiSVVodWVRa1NWNTc3aXAzTFlkMWxnYUhYbjZ2SXp3NmpDb2JuWkxKRCs0bDJXck9PSkpzNHQ5bWhHMncreUcKSE5qZkVIT2VLVUs0NHQ4bDd1b2VPTnZ0VFQzV2YzU21wZFBsdTZESFE3d05rWUFNSXVxTWVUSDRxc21HVkNWVQp6dDd5YkM1eW5DOVhQc09UWExPSm9aeUxQWDl0eGNGOGJ3ZExadm9jVzVoQk02OThiTWY1OG95S0VDSzh4QW5nCnl6UUFPbUcwMm5HS1BYSGlRUWtGS0tpV2N6d1M3MTVuYmc3S1R2NzByNDZ4K1JIL0g5RkJ5TjdsekJPM2NWclMKZ1JuT09OSlVEd0RpbXZQMHFrSW9xcWtYeGRXbTRHK01TQkZYQ3dGVHhGWWwvL0c5cWdsMmtmaW1SMXdadmdSKwp3RnB0dFhlSkoyaXBMNWtDZ2dFQkFNS3VMTVNlbzhEN2RGTkdvVlh6Y3ZpYzAyNExncXJpNUFUMk0yeFFSRlpHCkVoZGFBaTEwaGxHNC85NWlYckRwYVYxRTRaQnBLUE9NNHVOaVhiRUE4VFJsa0hKRS8zSVZYdHJiRmxTUGF2MkMKa1poL2Uya3BDSnMrVkFFYjlJOE9OQVlFS2Z0WFE0WkdEazg3K1lQOWpIak9jcms1OGo3Y3hZZXlBVFl0SHd0cwppU2tjaFZkc2FCVjAyY0FqUDJKMVZIZHpQVFlYNjM2VllWeHRrUUxUYWl2VHFWTVIvN0QyQlJ6bjd1bGhPb3VPCmNwNVBIYjl2TFdMQmFoWi9CMjhVeWp6ZSs1NUsxNzBzbmpseCtkQ1BsejNtTmpIcTBESTNvMytQK0c0VVlwTlIKbkRWNC9YZjB1VXExSjhOWE9SMXJIMTZlUGVlWThjeDlMRXNETlJ0STVNTUNnZ0VBTEZvSC9mWnZBaTFNcStESwpVcEtjWWJDNFE0OFFLTXBONU1PRi9BeXdqd2haQ2VGcXpVUTd0T00rNkhpSng1bmhKQ3kwU09FQytnbUU2QlJvCkxSNmd1anNFMnhxK280eStSQ0Q4aGR2c0h4K3hmeFNOdERGa1lqaFVaaFBaMUs0L29LYURrWVVRYXcvUDErS1AKd0pYRTFuelBzT1FJV2JOWG9IR3VVTCs5SXVoY3NYWTlsQ0NmcVpBcjBkbXp2Ry94ZzVLb1VYME1jU2ZMNWFSRgpZalVCMzhBeHdnNkJOSS9PVzVQd0tDNy9rQmJ5NmxWU0dwajNrbXB6ZHBrNmkzcmMwVnVsNENSSDhMa0dReCsvCjZ2YStwZVFCWEtFeTVuTUdLK29QSzJFMWk0cm1Udm1uWDR0SFdZaUp4MnZXM3J4dUg4MHhpbGU4TVh0dG9yZnIKTTU3L29RS0NBUUVBbmxkOElnL0ZzTmpVckVidVFqSlllTTFWU2xRaVcwdGZtb21GR2J2UFdUeDB5bmx5Ky9XaQpxaVdHTnlKYlVoa0drYzNNaU9CL1psaFkwZ2pYbTNmZ3QzVkVIeXp2ZDZMYUc3ZkdXZENzZkxVT0pyTEpkYWJpClVTSkl3UDR6MDRjQjJVTFp3b3dmWjc3ak5KN2JPdmVtb1R1SkpBNTFjWnV2TGNjaUpTWmQ4YlM5ZXFxdjZZTksKeE9qZGt1RVlWTVNKaHY0Nzh4dFJkd3VZdk15QS9ZTm0vMjZRY2ZoWnQxemltN2dwSWJqckhVY25Bb3ZtN2lWSApET096bmNpRUMxMGxnSXo4cXFyRS9pQ2tNS1Q3UXg4SExGbHFDditwaHE2cVZMNk1tVHdMVVRjM2ptWnlBbmNSCm5pbnB4WC9UL0pGOFdrRHFxTXhGSHNWUW1WSnFoMTZxY1FLQ0FRQW9ISHVQUTVvR1F3dGlnSzFzcXR6Ym54S0oKa0lDMC81SEU1M3JmbzBNVmVwQXhvL0x3WmlZMDYwZDJRVDBiRTZkTDFDNWJuQ1p5V2ZPQmxCVi93OWxpZi9CUgovNDZsbTZvdCtTampKbFN0aGliSWtKZ1FxdCs2R2t4L0dwR2VhTmJnZ09qaUpVczE5SHVPdHpDQ1Z4clRJT3ZXCjJoblhEaVYxYVRKRVdUR3BscDVEUGdCcFdweVFoWVZDVldmVUdMR0V5NnR6UkR0SjZNd3ZmZWlwUlV2aXZyQ1MKRTNmc2U5MkNxWkdQZjU4WE5BMnZIcXFiU3JTazZ0eGdjRS9mZSs4dmZONEwraGw2YTIrMFdsc01KMUxNQ3RqQgp2U08yNlFHQzFuekF1TVVVRC8xN21wd0JZeC9nNDZ0bTUxSTgxcEtlU1ZVeTlvdVNIOHhqUGVnZGY4QUIKLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", + "Store": "default" + }, + { + "domain": { + "main": "apietl.dataverse.org.ua" + }, + "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdNekNDQlJ1Z0F3SUJBZ0lTQThzcjkzSldmZ0hEWTFRODJhaEhKYytTTUEwR0NTcUdTSWIzRFFFQkN3VUEKTURJeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFNWlhRbmN5QkZibU55ZVhCME1Rc3dDUVlEVlFRRApFd0pTTXpBZUZ3MHlNVEF5TWpVeU1USXhNRFJhRncweU1UQTFNall5TVRJeE1EUmFNQ0l4SURBZUJnTlZCQU1UCkYyRndhV1YwYkM1a1lYUmhkbVZ5YzJVdWIzSm5MblZoTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEEKTUlJQ0NnS0NBZ0VBdWxNbTI4d2RuS254aXZISWYrYVF1WWZ0WlcwcHJOdS9RUlJRS05mcmM0cFVaR2lqS2diNQpoN2FuRlMzcERLOUZDcnJtSXdZQmdlRFQrZXdpUU94elJkTXhWRlRudXpueTJiU2VISS9TTnZoQXFieU9BMkRSCmhhL3AwZEhmSGZqaG96d3RoR29LVVIwdHhkeDFPaGZsZnZ4dkxFT3ArblBHbU1ncWl2ZFBqSnlKVmRWaHozQk4KL0lwaXJEeHFwaWQvR0NoVVhEK0swRk5ycUFxbXJwczNuKzZVWGlTdndVL1M3U0s1cXdGbkpBcHcxVCtLLzh6VAprRnZtNFRPRVF1T3dKNjdqSVBqNnFzc1NhZ2VuTkthV2ZMTE9jOHlXMTFjQS9FRWI3ZkZmemdGeHJFaHo0WlNKCjBibTd3MWRxU2VXU05GVlRNbDQ3aWl6YUZYY2pKbzFZdFFJLzFaekJGeXpjSGpQYThOaWZUVVNySWtQcXFORDYKSFFnRmtKL1dxS3RtWTBtanMxM0c3TC9HVjdBcVRlNkQvTTJUUHJnbWVlU1EwSy84QjZEQndrZTd2OTEwNi9YagpPNXY1eDY4dmZ3NWVJZ3MweW1FcEgzbEZiWTRyYnhQSHoydW1BUUF6Sm01SWQwR3daT2gwY0NwdWVMeVVYc2o1CkxseXIxdVhYS3hmV1Fxc0Y2cncyTEV5dTY3MTh5cUtYRjRjRDR2MTd1UnlpeFMzeXJwM2hQQjhON01pTDBYU0kKUXBGeUFjcy9TUjRabEdGUnZoWUZHMlcyWmtOT2UyMEZvQngwVzVZWCtzeEdiZHlwOHN2Nlg2d01MRXFmZFFWWgpUdldTOGhDdDdtMDVJVWpKemZVcVdpVGk1dTYxemZqa2t6bStJSXhEZFJ6aUpicWdtQWhnVno4Q0F3RUFBYU9DCkFsRXdnZ0pOTUE0R0ExVWREd0VCL3dRRUF3SUZvREFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQVFZSUt3WUIKQlFVSEF3SXdEQVlEVlIwVEFRSC9CQUl3QURBZEJnTlZIUTRFRmdRVUQ5V293Q0FVRTZUZU8yeUlJd0taWjZ4RQpNQkV3SHdZRFZSMGpCQmd3Rm9BVUZDNnpGN2RZVnN1dVVBbEE1aCt2bllzVXdzWXdWUVlJS3dZQkJRVUhBUUVFClNUQkhNQ0VHQ0NzR0FRVUZCekFCaGhWb2RIUndPaTh2Y2pNdWJ5NXNaVzVqY2k1dmNtY3dJZ1lJS3dZQkJRVUgKTUFLR0ZtaDBkSEE2THk5eU15NXBMbXhsYm1OeUxtOXlaeTh3SWdZRFZSMFJCQnN3R1lJWFlYQnBaWFJzTG1SaApkR0YyWlhKelpTNXZjbWN1ZFdFd1RBWURWUjBnQkVVd1F6QUlCZ1puZ1F3QkFnRXdOd1lMS3dZQkJBR0MzeE1CCkFRRXdLREFtQmdnckJnRUZCUWNDQVJZYWFIUjBjRG92TDJOd2N5NXNaWFJ6Wlc1amNubHdkQzV2Y21jd2dnRUQKQmdvckJnRUVBZFo1QWdRQ0JJSDBCSUh4QU84QWRRQkVsR1V1c083T3I4UkFCOWlvL2lqQTJ1YUN2dGpMTWJVLwowek9XdGJhQnFBQUFBWGZiUi8zcEFBQUVBd0JHTUVRQ0lCckZCWTVaZE8zdUZvVitNVm1OMGh5TVJvb21GUVl4ClJGNHJuNGJidkk2akFpQldDQmZVSzU0b3VKS0dFblB0NHgramFnVkJ5OWdOZTZQWUFlWEZ3WTB2endCMkFIMCsKOHZpUC80aFZhQ1RDd01xZVVvbDVLOFVPZUFsL0xtcVhhSmwrSXZEWEFBQUJkOXRIL2lJQUFBUURBRWN3UlFJZwpGY2E5S1JNaEw3TExyTzZmYjA1aHhQeUM2eit3RmlEeFJaZkVPUGYxQ09rQ0lRQytEVTNKNTFqa0YwSEVIS0crCktDbHBpVFlIWlVLMGtBb0FJTCszTGJsb3BEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUF1YXJVUElxWnhyeS8KMEsvMUR6WEQyU0VWNnZIdG1YRXY2UHNFVS9WS1FvcHRtUFNhS0NVQUxHRWlDKzA2NnFqVFZyUVBVSDlFQjJneQpQOE41Y05KTEF2VVExVHI4MExLSytidmJ4MENIbnNNT0szcmdXM0FNNmw1Uk4wajJuRTA2TnlEcDA3QXRtVDdrClh5SjdtRUlFWXF4Mm45ZTgvWnFHTHFWT1B6STdFdHVkby9oeGtFQ2NtNEpzMkhKblJ6cTcrN3hORDJXaUtCUWgKKytaM1Q0UFU0WXBRMmRQbCtHVG1VaXJqVE45UzRBWFV5MG9aWlpMVjIzS0llWTRsaWY3bDZVQTlwQjArQ3BJRQpEZTN0OVBNalRLb29KZEUrTXZXUTZVaGIwSjk1b3Ard0NtOHdzbFZUZGVIaXJSTytKMWJ6YlhHbXFvSlJUNXVUCmN2NmRYYklBUFE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVpUQ0NBMDJnQXdJQkFnSVFRQUYxQklNVXBNZ2hqSVNwREJiTjN6QU5CZ2txaGtpRzl3MEJBUXNGQURBLwpNU1F3SWdZRFZRUUtFeHRFYVdkcGRHRnNJRk5wWjI1aGRIVnlaU0JVY25WemRDQkRieTR4RnpBVkJnTlZCQU1UCkRrUlRWQ0JTYjI5MElFTkJJRmd6TUI0WERUSXdNVEF3TnpFNU1qRTBNRm9YRFRJeE1Ea3lPVEU1TWpFME1Gb3cKTWpFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1REVXhsZENkeklFVnVZM0o1Y0hReEN6QUpCZ05WQkFNVApBbEl6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF1d0lWS016Mm9KVFREeExzCmpWV1N3L2lDOFptbWVrS0lwMTBtcXJVcnVjVk1zYStPYS9sMXlLUFhEMGVVRkZVMVY0eWVxS0k1R2ZXQ1BFS3AKVG03MU84TXUyNDNBc0Z6eldUam43YzlwOEZvTEc3N0FsQ1FsaC9vM2NiTVQ1eHlzNFp2djIrUTdSVkpGbHFuQgpVODQweUZMdXRhN3RqOTVnY09LbFZLdTJiUTZYcFVBMGF5dlR2R2JyWmpSOCttdUxqMWNwbWZnd0YxMjZjbS83CmdjV3Qwb1pZUFJmSDV3bTc4U3YzaHR6QjJuRmQxRWJqekswbHdZaThZR2QxWnJQeEdQZWlYT1pUL3pxSXRrZWwKL3hNWTZwZ0pkeitkVS9uUEFlWDFwbkFYRks5anBQK1pzNU9kM0ZPbkJ2NUloUjJoYWE0bGRic1R6RklEOWUxUgpvWXZiRlFJREFRQUJvNElCYURDQ0FXUXdFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJBREFPQmdOVkhROEJBZjhFCkJBTUNBWVl3U3dZSUt3WUJCUVVIQVFFRVB6QTlNRHNHQ0NzR0FRVUZCekFDaGk5b2RIUndPaTh2WVhCd2N5NXAKWkdWdWRISjFjM1F1WTI5dEwzSnZiM1J6TDJSemRISnZiM1JqWVhnekxuQTNZekFmQmdOVkhTTUVHREFXZ0JURQpwN0drZXl4eCt0dmhTNUIxLzhRVllJV0pFREJVQmdOVkhTQUVUVEJMTUFnR0JtZUJEQUVDQVRBL0Jnc3JCZ0VFCkFZTGZFd0VCQVRBd01DNEdDQ3NHQVFVRkJ3SUJGaUpvZEhSd09pOHZZM0J6TG5KdmIzUXRlREV1YkdWMGMyVnUKWTNKNWNIUXViM0puTUR3R0ExVWRId1ExTURNd01hQXZvQzJHSzJoMGRIQTZMeTlqY213dWFXUmxiblJ5ZFhOMApMbU52YlM5RVUxUlNUMDlVUTBGWU0wTlNUQzVqY213d0hRWURWUjBPQkJZRUZCUXVzeGUzV0ZiTHJsQUpRT1lmCnI1MkxGTUxHTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFqQU5CZ2txaGtpRzl3MEIKQVFzRkFBT0NBUUVBMlV6Z3lmV0VpRGN4MjdzVDRyUDhpMnRpRW14WXQwbCtQQUszcUI4b1lldk80QzV6NzBrSAplaldFSHgydGFQRFkvbGFCTDIxL1dLWnVOVFlRSEhQRDViMXRYZ0hYYm5MN0txQzQwMWRrNVZ2Q2FkVFFzdmQ4ClM4TVhqb2h5Yzl6OS9HMjk0OGtMam1FNkZsaDlkRFlyVllBOXgyTytoRVBHT2FFT2ExZWVQeW5CZ1BheXZVZkwKcWpCc3R6TGhXVlFMR0FrWFhtTnMrNVpuUEJ4ekRKT0x4aEYySkliZVFBY0g1SDB0WnJVbG81Wll5T3FBN3M5cApPNWI4NW8zQU0vT0orQ2t0RkJRdGZ2QmhjSlZkOXd2bHdQc2srdXlPeTJISTdtTnhLS2dzQlR0Mzc1dGVBMlR3ClVkSGtoVk5jc0FLWDFIN0dOTkxPRUFEa3NkODZ3dW9Ydmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==", + "key": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS1FJQkFBS0NBZ0VBdWxNbTI4d2RuS254aXZISWYrYVF1WWZ0WlcwcHJOdS9RUlJRS05mcmM0cFVaR2lqCktnYjVoN2FuRlMzcERLOUZDcnJtSXdZQmdlRFQrZXdpUU94elJkTXhWRlRudXpueTJiU2VISS9TTnZoQXFieU8KQTJEUmhhL3AwZEhmSGZqaG96d3RoR29LVVIwdHhkeDFPaGZsZnZ4dkxFT3ArblBHbU1ncWl2ZFBqSnlKVmRWaAp6M0JOL0lwaXJEeHFwaWQvR0NoVVhEK0swRk5ycUFxbXJwczNuKzZVWGlTdndVL1M3U0s1cXdGbkpBcHcxVCtLCi84elRrRnZtNFRPRVF1T3dKNjdqSVBqNnFzc1NhZ2VuTkthV2ZMTE9jOHlXMTFjQS9FRWI3ZkZmemdGeHJFaHoKNFpTSjBibTd3MWRxU2VXU05GVlRNbDQ3aWl6YUZYY2pKbzFZdFFJLzFaekJGeXpjSGpQYThOaWZUVVNySWtQcQpxTkQ2SFFnRmtKL1dxS3RtWTBtanMxM0c3TC9HVjdBcVRlNkQvTTJUUHJnbWVlU1EwSy84QjZEQndrZTd2OTEwCjYvWGpPNXY1eDY4dmZ3NWVJZ3MweW1FcEgzbEZiWTRyYnhQSHoydW1BUUF6Sm01SWQwR3daT2gwY0NwdWVMeVUKWHNqNUxseXIxdVhYS3hmV1Fxc0Y2cncyTEV5dTY3MTh5cUtYRjRjRDR2MTd1UnlpeFMzeXJwM2hQQjhON01pTAowWFNJUXBGeUFjcy9TUjRabEdGUnZoWUZHMlcyWmtOT2UyMEZvQngwVzVZWCtzeEdiZHlwOHN2Nlg2d01MRXFmCmRRVlpUdldTOGhDdDdtMDVJVWpKemZVcVdpVGk1dTYxemZqa2t6bStJSXhEZFJ6aUpicWdtQWhnVno4Q0F3RUEKQVFLQ0FnQmExU0NUZEUxWFMyM0tTNVp2NjZuUUdKaTlvbHIzdnVUY3lCZFA0ZnNSaDNVZXdmZ1JDL2RubHI2YgpUNWRXTExlZXhJQmV3SlhKaUI0dXIxUC9qSVdobTVSbnhVQjNBSWdJWThuVXFMUlZRZTdjRUdTMjl1TU5walY1CnFUTjQvQlNickVHUVZOV1V0NEhSL0doVm1zS3hoa1I0TXNCUnJWRTZ1Qkl0VHVWRDZpZjFaU0hhcTZnSkhqbCsKTjdIU01GMEFIT0VMVzVyRGRuZDhJejBneitCdElqVElOR0JPQUNrV202QWg0bnd5a0xoeTdSaEpIY1Joa3J2YQpPM0FWMzhQSGhMV0xKSFdtLzNxSm9CTitVbHY0akg2aTZ6RDU1NXMrWGt0TVV5aGVXRXZmTGk3MzRKN1RWQlZaCjVHcVhmY2dwcFJMNjhmOWFuQVR4QS9ScDNleEk4NmYwelgrdmNTWnhmSDZQeFZFekl3OEc2UWE1QXJiRmwwdWoKTnlKYUlrOG9zWXE2UXpFeGZtZTdJZDJBSVJwb2hmaUZNMUY2U2pqMGJiakkyQjE5NXNaVlcvS3pQMFBrK1RtQgpPaVRMb0FQTEUzRjBCVFBLNWJncnZzOGROUkg2Z3JaUnpqenRZRXJIS3BFT1JQK2tUREcycy9HRUVWQWpaQnFjClhRdnoyWGlUVU9tcjNubjJpNzUwZEJUVi9JUHFmMlp1bThzVE9TSnpVeFc2bFY3am5zZHczYUx0cUh2QUo1K1kKbkhPM2c0cjZlZ2daQTRPM2R6UllsMG12S0NNS2hLNEJWYzlrZFRMLzd0eXk5MjRkdzFzYnJqOHVXa3h5cXlXRAp2a2xCVFp6RzJzaUg0bHZrZjB4UXVhampYNFVhYkdYUkJzVmRWN3ZTR3IzL0dBUWFNUUtDQVFFQThsc3NZK282CkxKNHF3Tm8zSEM3a3EzNW5XODQrRUpQYTF2RldzZHBqK0hFelI1T3NjTFMvSy94VmJGK1YwZzJpejlkcjdCdEQKN1NVRUFiWWJiaHB2MmlBYlowUkdKeXBDdjFzT3N4QitobmNJVThlbGFKbHJtUlNsWGtqN1QvaUcyUFhhUllVTwpGTnMvaXg0N3Vyd3pzY3NFcWxWWENsQjN0VkwxekRmdnVNcW5tYW5EbTJ4R20vRGZXcCtCaE5kdkVSdkpvRlJxCkFmYXovMmVRcStjUEtTSkg5UGdvRnMrUkZuUk95bCtTU2ZBaTVpWTBMajloZTN6V0NBRTU4YUI1TzJOVHEzci8KRmJHUUx1STBJS3VFQkg1UFVJZFNmU3JPa2FvV2tjbGlNWFJDWU4zN3haZldZcFFuZDBvQng4THBkZnVKcldtKwpDNkZUeTF5eTZIMmlwd0tDQVFFQXhOQjFCLzFUTnZSQW51ZUlBSFd4Z1NTak1ENnlBWERiWlRWUW42WGxoS0FsCjRkODIvc3l6cW8wMElhc2Q2cWFQTVdJM0dpbXh6Rm01dTY5UFlYZ3k0VGJmYk9jYTI3dnhaSmZIcUxkTGJZRmMKa0s0c0h3QUdYUFQwZFRBcS9jMzlJSkpTMTlNYjlBdytVQndnUkpqS3J1YWdFbmdFV1VXVTlVTnExNlJ1MjZIcgpRNE1TbHhVaEF1T29vNUN3NVJFdURBUzRlc3VhUzFveWJDbEVocUpuWUZxSEJMSmRPYmVBbFdFS0tHNG9UOEZDCjFyWWNka2dhS0M1YytoVnBSbDF5US9yZ0lHT2NFM2hLbE4wTldIU1FoKy9ScXdaK2RXakpZODNRc0NPbTBpYnQKWVdwczY5dXlTN0FrbUlwOGZGSEwydUlQWXNrY21yd3BkQi9JWkFJeHFRS0NBUUVBc0VxUjU3d2h4UUxvcHBBVgpObk1GODVsbkplaklUTmJBZ1VuY2ZsTVdGVXFDdXJZNDRXTVpESzNvbFlTU1B0R2NkUU9HaGFEdnNEa1V5UW5tCnVoaVE5R0lXak8raytDaE5sVlJ2Uk9IaXAzMCttWExJWjJYeVZ0QWwyb2ZNQjBnSkR4a0hSVHFjRzUvQWdUbmsKeU5qTjRhNkVIa01scFdNVE1OcS80V1Z2QTBTbTFhZ2ZtWmNSWmEyNVN2cHNCRzJSWlNpSmFnNzliYUEvSHJILwpFb3hwQXNyay9OVG1sSEU0WU5VSjJ6dlo5ZDZ3QkNvV0d1NFB3dnZ6MUs3UHIydkR3K2RrbllCQ3ZVMEVUSlpPCnhOVCtteVltRzdYVDB5aW9TbDBuUGJUM3NIR1pOMDFDTDJGYm1TbWI2N0h4eVpXR3JVUGp5amo0L1F6RkgxQzIKODFjd1VRS0NBUUJWWFBpMW0ybGhWM1ZEdHJabFJLYlZsWmQyRUd0U2RxbWg3d3JtQTZWVjdjUWdnSmt3MElaSQp2ZS9UZm8xK1BmbXplSjdmcVIvbHV6RDB0NmZkWmEzand0SUxRUDJFT3JNTFowMkEzdWRIT3FsMFV5YnQxeXZyClc0OC8yTUY4emNBeFJXWExHRlJ5ZUhENmZBaCsyQ3BveTd5MzVmZzA1Qm9rZXJZM2k2bE5kNkE3NnZqQU1MamQKc1BKdTV3M2lmSjRWTm1MeFY2ZTNjUXFYb1JxSXJwM1p5OG50L3BLeXV1VjVaTnBzQ01OUlBFaUtLZmlVVU5lUApmL1J4djZHbWxGZEFKdXJaQVhzcmNxd2VmdllQM0pibmJ0dm9xdXRrYnl1U0x5MkppQjBOM3pac1h5V1k4dlFWCklmUHRlWHRlekhkM216OERJS2xZYjY0bklMWGdzcGJwQW9JQkFRQ1J3bjdUajVsV0ZRYXZNeG1NN0dJelYzajgKUEV3QUNGV2V1aTVzZHBqbUhWWk53d3QxWEJTK2hydTc2OVAyV2NQOHRlN3M0SWpVeVVUbWovQitkeFN2dWQ4agpkN2VoSTQxU0pXTXB0b2pqRDNuOThKS2srdWdlK2hjYlk3c3dZZDBLd09yZjlnN3Z3KzlNN2ZhYU52WnFjZUcxCmZJVGp5NDF6VHlnQXBPSWZtd3VtZWxubFVZWmRxbEZoLzQ1TTBKUVV4R2x1U1dtbmllajVJTmJxdzQ4TmxhVTkKU1dvdUZvT09XclcrOXNlV1RZTTFCOE1rbEphbjhXMWZRdzlKTVYyUkRXazJoeGVHUjh0c1Q0azAwYXFyTnJHKwo3L2xrK1JuUTNyakp1MXlHSlkya2ZFcnJkakZjTkg4M29ZMUJ2Z3d2YXlKSWdYUEZtd3JvaSsxZGJaNk0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", + "Store": "default" + } + ] + } +} \ No newline at end of file From 8f31a33013baf39273d52128053f88ace1705f51 Mon Sep 17 00:00:00 2001 From: 4tikhonov <4tikhonov@gmail.com> Date: Fri, 26 Feb 2021 00:25:06 +0200 Subject: [PATCH 30/36] DDI convertor service yaml --- services-available/converters/ddiconverter.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 services-available/converters/ddiconverter.yaml diff --git a/services-available/converters/ddiconverter.yaml b/services-available/converters/ddiconverter.yaml new file mode 100644 index 0000000..0d5c441 --- /dev/null +++ b/services-available/converters/ddiconverter.yaml @@ -0,0 +1,12 @@ +version: '3.7' +services: + ddiconverter: + image: coronawhy/ddi-converter-tool + ports: + - "8520:8520" + labels: + - "traefik.enable=true" + - "traefik.http.routers.ddiconverter.rule=Host(`coapi.${traefikhost}`)" + - "traefik.http.services.ddiconverter.loadbalancer.server.port=8520" + - "traefik.http.routers.ddiconverter.tls=true" + - "traefik.http.routers.ddiconverter.tls.certresolver=myresolver" From 37e680b361da7de6ac8942df3c2a12ede38e4938 Mon Sep 17 00:00:00 2001 From: Maksym Komar Date: Thu, 25 Feb 2021 23:10:32 +0000 Subject: [PATCH 31/36] Mass rename distributive -> distro --- .gitignore | 4 +- Makefile | 13 +-- README.md | 12 +-- TODO | 18 ++--- bin/menuconfig | 80 +++++++++---------- {distro => distros}/analytics/.env | 0 {distro => distros}/analytics/.env_superset | 0 {distro => distros}/analytics/Makefile | 0 {distro => distros}/analytics/fuji.yaml | 0 .../analytics/superset-http.yaml | 0 .../analytics/traefik-https.yaml | 0 {distro => distros}/clariah/.env | 0 {distro => distros}/clariah/Makefile | 0 .../clariah/dataverse-5.3.yaml | 0 {distro => distros}/clariah/postgresql.yaml | 0 {distro => distros}/clariah/solr.yaml | 0 .../clariah/traefik-https.yaml | 0 {distro => distros}/covid19museum/.env | 0 {distro => distros}/covid19museum/Makefile | 0 {distro => distros}/covid19museum/airflow.env | 0 .../covid19museum/airflow.yaml | 0 .../covid19museum/dataverse-5.3.yaml | 0 .../covid19museum/postgresql.yaml | 0 {distro => distros}/covid19museum/solr.yaml | 0 .../covid19museum/traefik-https.yaml | 0 {distro => distros}/dataverse-airflow/.env | 0 .../dataverse-airflow/Makefile | 0 .../dataverse-airflow/airflow.env | 0 .../dataverse-airflow/airflow.yaml | 0 .../dataverse-airflow/dataverse.yaml | 0 .../dataverse-airflow/nde.yaml | 0 .../dataverse-airflow/postgresql.yaml | 0 .../dataverse-airflow/semantic-gateway.yaml | 0 .../dataverse-airflow/solr.yaml | 0 .../dataverse-airflow/traefik.yaml | 0 .../dataverse-airflow/whoami.yaml | 0 {distro => distros}/dataverse-jdk11/.env | 0 {distro => distros}/dataverse-jdk11/Makefile | 0 .../dataverse-jdk11/dataverse-5.3.yaml | 0 .../dataverse-jdk11/postgresql.yaml | 0 {distro => distros}/dataverse-jdk11/solr.yaml | 0 .../dataverse-jdk11/traefik-https.yaml | 0 {distro => distros}/dataverse-multilang/.env | 0 .../dataverse-multilang/.env_weblate | 0 .../dataverse-multilang/Makefile | 0 .../dataverse-multilang/dataverse-5.3.yaml | 0 .../dataverse-multilang/postgresql.yaml | 0 .../dataverse-multilang/solr.yaml | 0 {distro => distros}/fair/.env | 0 {distro => distros}/fair/Makefile | 0 {distro => distros}/fair/fdp.config | 0 {distro => distros}/fair/fdp.yaml | 0 {distro => distros}/fair/fuji.yaml | 0 {distro => distros}/fair/postgresql.yaml | 0 {distro => distros}/fair/solr.yaml | 0 {distro => distros}/fair/traefik-https.yaml | 0 {distro => distros}/hello-world/.env | 0 {distro => distros}/hello-world/Makefile | 0 {distro => distros}/hello-world/traefik.yaml | 0 {distro => distros}/hello-world/whoami.yaml | 0 {distro => distros}/localhost/.env | 0 {distro => distros}/localhost/Makefile | 0 {distro => distros}/localhost/dataverse.yaml | 0 {distro => distros}/localhost/nde.yaml | 0 {distro => distros}/localhost/postgresql.yaml | 0 .../localhost/semantic-gateway.yaml | 0 {distro => distros}/localhost/solr.yaml | 0 {distro => distros}/localhost/traefik.yaml | 0 {distro => distros}/localhost/whoami.yaml | 0 {distro => distros}/semantictools/.env | 0 {distro => distros}/semantictools/Makefile | 0 .../semantictools/skosmos.yaml | 0 .../semantictools/source/README.md | 0 .../semantictools/traefik-https.yaml | 0 {distro => distros}/timemachine/.env | 0 {distro => distros}/timemachine/Makefile | 0 .../timemachine/dataverse-5.3.yaml | 0 .../timemachine/postgresql.yaml | 0 {distro => distros}/timemachine/solr.yaml | 0 .../timemachine/traefik-https.yaml | 0 {distro => distros}/workflows/.env | 0 {distro => distros}/workflows/Makefile | 0 {distro => distros}/workflows/kafka.yaml | 0 .../workflows/traefik-https.yaml | 0 .../var/security/letsencrypt/acme.json | 0 mk/{common.mk => distro-common.mk} | 28 +++---- mk/distro-makefile.mk | 2 +- ...one-template.mk => standalone-makefile.mk} | 10 +-- 88 files changed, 84 insertions(+), 83 deletions(-) rename {distro => distros}/analytics/.env (100%) rename {distro => distros}/analytics/.env_superset (100%) rename {distro => distros}/analytics/Makefile (100%) rename {distro => distros}/analytics/fuji.yaml (100%) rename {distro => distros}/analytics/superset-http.yaml (100%) rename {distro => distros}/analytics/traefik-https.yaml (100%) rename {distro => distros}/clariah/.env (100%) rename {distro => distros}/clariah/Makefile (100%) rename {distro => distros}/clariah/dataverse-5.3.yaml (100%) rename {distro => distros}/clariah/postgresql.yaml (100%) rename {distro => distros}/clariah/solr.yaml (100%) rename {distro => distros}/clariah/traefik-https.yaml (100%) rename {distro => distros}/covid19museum/.env (100%) rename {distro => distros}/covid19museum/Makefile (100%) rename {distro => distros}/covid19museum/airflow.env (100%) rename {distro => distros}/covid19museum/airflow.yaml (100%) rename {distro => distros}/covid19museum/dataverse-5.3.yaml (100%) rename {distro => distros}/covid19museum/postgresql.yaml (100%) rename {distro => distros}/covid19museum/solr.yaml (100%) rename {distro => distros}/covid19museum/traefik-https.yaml (100%) rename {distro => distros}/dataverse-airflow/.env (100%) rename {distro => distros}/dataverse-airflow/Makefile (100%) rename {distro => distros}/dataverse-airflow/airflow.env (100%) rename {distro => distros}/dataverse-airflow/airflow.yaml (100%) rename {distro => distros}/dataverse-airflow/dataverse.yaml (100%) rename {distro => distros}/dataverse-airflow/nde.yaml (100%) rename {distro => distros}/dataverse-airflow/postgresql.yaml (100%) rename {distro => distros}/dataverse-airflow/semantic-gateway.yaml (100%) rename {distro => distros}/dataverse-airflow/solr.yaml (100%) rename {distro => distros}/dataverse-airflow/traefik.yaml (100%) rename {distro => distros}/dataverse-airflow/whoami.yaml (100%) rename {distro => distros}/dataverse-jdk11/.env (100%) rename {distro => distros}/dataverse-jdk11/Makefile (100%) rename {distro => distros}/dataverse-jdk11/dataverse-5.3.yaml (100%) rename {distro => distros}/dataverse-jdk11/postgresql.yaml (100%) rename {distro => distros}/dataverse-jdk11/solr.yaml (100%) rename {distro => distros}/dataverse-jdk11/traefik-https.yaml (100%) rename {distro => distros}/dataverse-multilang/.env (100%) rename {distro => distros}/dataverse-multilang/.env_weblate (100%) rename {distro => distros}/dataverse-multilang/Makefile (100%) rename {distro => distros}/dataverse-multilang/dataverse-5.3.yaml (100%) rename {distro => distros}/dataverse-multilang/postgresql.yaml (100%) rename {distro => distros}/dataverse-multilang/solr.yaml (100%) rename {distro => distros}/fair/.env (100%) rename {distro => distros}/fair/Makefile (100%) rename {distro => distros}/fair/fdp.config (100%) rename {distro => distros}/fair/fdp.yaml (100%) rename {distro => distros}/fair/fuji.yaml (100%) rename {distro => distros}/fair/postgresql.yaml (100%) rename {distro => distros}/fair/solr.yaml (100%) rename {distro => distros}/fair/traefik-https.yaml (100%) rename {distro => distros}/hello-world/.env (100%) rename {distro => distros}/hello-world/Makefile (100%) rename {distro => distros}/hello-world/traefik.yaml (100%) rename {distro => distros}/hello-world/whoami.yaml (100%) rename {distro => distros}/localhost/.env (100%) rename {distro => distros}/localhost/Makefile (100%) rename {distro => distros}/localhost/dataverse.yaml (100%) rename {distro => distros}/localhost/nde.yaml (100%) rename {distro => distros}/localhost/postgresql.yaml (100%) rename {distro => distros}/localhost/semantic-gateway.yaml (100%) rename {distro => distros}/localhost/solr.yaml (100%) rename {distro => distros}/localhost/traefik.yaml (100%) rename {distro => distros}/localhost/whoami.yaml (100%) rename {distro => distros}/semantictools/.env (100%) rename {distro => distros}/semantictools/Makefile (100%) rename {distro => distros}/semantictools/skosmos.yaml (100%) rename {distro => distros}/semantictools/source/README.md (100%) rename {distro => distros}/semantictools/traefik-https.yaml (100%) rename {distro => distros}/timemachine/.env (100%) rename {distro => distros}/timemachine/Makefile (100%) rename {distro => distros}/timemachine/dataverse-5.3.yaml (100%) rename {distro => distros}/timemachine/postgresql.yaml (100%) rename {distro => distros}/timemachine/solr.yaml (100%) rename {distro => distros}/timemachine/traefik-https.yaml (100%) rename {distro => distros}/workflows/.env (100%) rename {distro => distros}/workflows/Makefile (100%) rename {distro => distros}/workflows/kafka.yaml (100%) rename {distro => distros}/workflows/traefik-https.yaml (100%) rename {distro => distros}/workflows/var/security/letsencrypt/acme.json (100%) rename mk/{common.mk => distro-common.mk} (84%) rename mk/{standalone-template.mk => standalone-makefile.mk} (90%) diff --git a/.gitignore b/.gitignore index 91de802..cf94d29 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ -distributives/*/var/ -distributives/*/*/var/ +distros/*/var/ +distros/*/*/var/ # vim swap [._]*.s[a-v][a-z] diff --git a/Makefile b/Makefile index 0d55186..2aa43a7 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,11 @@ include mk/helpers.mk -DISTRO_ACTIVE_LINK=distributive-active +DISTROS_DIR=distros +DISTRO_ACTIVE_LINK=distro-active # help: show all targets with tag 'help' help: - @$(call generate-help,$(MAKEFILE_LIST) mk/common.mk) + @$(call generate-help,$(MAKEFILE_LIST) mk/distro-common.mk) .PHONY: help # help: run configurator @@ -17,9 +18,9 @@ menuconfig-docker: docker run -it --rm -v $(shell pwd):/work -w /work ubuntu /work/bin/menuconfig .PHONY: menuconfig-docker -# help: check all distributives consistency +# help: check all distros consistency check-all: - @for DIR in distro/*; do \ + @for DIR in $(DISTROS_DIR)/*; do \ printf "============================="; \ printf " Checking %-20s " $$DIR; \ printf "=============================\n"; \ @@ -32,13 +33,13 @@ check-all: @if [ ! -L $(DISTRO_ACTIVE_LINK) ]; then \ if [ -e $(DISTRO_ACTIVE_LINK) ]; then \ echo "$(DISTRO_ACTIVE_LINK) is not a symbolic link." \ - "It should be a link to an active distributive setup" >&2; \ + "It should be a link to an active distro setup" >&2; \ exit 1; \ fi; \ $(MAKE) menuconfig; \ elif [ ! -e $(DISTRO_ACTIVE_LINK) ]; then \ echo "$(DISTRO_ACTIVE_LINK) is brocken symbolic link." \ - "It should be a link to an active distributive setup" >&2; \ + "It should be a link to an active distro setup" >&2; \ exit 1; \ fi; \ fi; \ diff --git a/README.md b/README.md index bae97ce..fe7f025 100644 --- a/README.md +++ b/README.md @@ -46,9 +46,9 @@ To Do (we re accepting Pull Requests, please join the project if you want to con * OCR Tesseract (OCR as a service) * Kibana -BeFAIR is using Traefik load balancer and proxy service. Please define traefikhost in the configuration of your distributive (see distro/ folder) to start enabled services. +BeFAIR is using Traefik load balancer and proxy service. Please define traefikhost in the configuration of your distro (see distros/ folder) to start enabled services. -if you want to enable some service, for example, INDRA, run this from ./distro/your_distributive_name where your_distributive_name should correspond to your project name or domain (default is localhost): +if you want to enable some service, for example, INDRA, run this from ./distros/your_distro_name where your_distro_name should correspond to your project name or domain (default is localhost): ``` ln -s ../../services-available/indra.yaml indra.yaml ``` @@ -77,16 +77,16 @@ newgrp docker If you see the message: "ERROR: Network traefik declared as external, but could not be found", please create the network manually using `docker network create traefik` and try again. -After Docker is installed you can check the consistency of all BeFAIR distributives: +After Docker is installed you can check the consistency of all BeFAIR distros: ``` git clone https://github.com/CoronaWhy/befair cd befair make check-all ``` -You can find all available installations in /distro folder. Different distributives are suitable for various research communities. +You can find all available installations in distros/ folder. Different distros are suitable for various research communities. -Choose some distributive, for example, "fair", and start/stop all services with commands: +Choose some distro, for example, "fair", and start/stop all services with commands: ``` cd fair make up @@ -101,7 +101,7 @@ make superset # Menuconfig -BeFAIR has a tool to manage all services, it's located in bin/menuconfig. You can enable/disable both services and distributives there in a convinient way. +BeFAIR has a tool to manage all services, it's located in bin/menuconfig. You can enable/disable both services and distros there in a convinient way. # Citation for the academic use diff --git a/TODO b/TODO index b3ae5c5..bf40d36 100644 --- a/TODO +++ b/TODO @@ -3,34 +3,34 @@ + check yaml syntax + .env is present - [menuconfig] user can use command 'e) export' even if menu for it not showed becouse - of error in active distributive. need to fix + of error in active distro. need to fix - [menuconfig] implement export docker-compose.override.yaml from *.override.yaml files - [menuconfig] handle .env files in - [menuconfig] add command from command line. like: menuconfig export - make export, make export-tgz - - make menuconfig from distributive directory and exports/(?) + - make menuconfig from distro directory and exports/(?) + services-avalable/*.mk - - allow run several distributives in same host + - allow run several distros in same host - fix tcp ports intersection - build custom docker images from images/ + make config + make new-distro - add to HACKING.md example how to make new serivce using whoami service - + implement consistency of distributive checking (see check_consistency() in bin/menuconfig) + + implement consistency of distro checking (see check_consistency() in bin/menuconfig) - track service dependence from other services - + add possibility remove (backup?) distributives + + add possibility remove (backup?) distros - + [menuconfig] add/remove service to current distributive from services-available/ + + [menuconfig] add/remove service to current distro from services-available/ + symbolic link default yaml - copy of example env/config/secrets files - create new service from skeleton typical compose service .. - + create new distributive by copying existent - + create new distributive from scratch + + create new distro by copying existent + + create new distro from scratch - use some skeleton project or it(?) - - switch between default service and distributive specific and/or customized service + - switch between default service and distro specific and/or customized service - backup/remove service customizations diff --git a/bin/menuconfig b/bin/menuconfig index cfdc80f..336babd 100755 --- a/bin/menuconfig +++ b/bin/menuconfig @@ -3,8 +3,8 @@ BASEDIR=$(realpath $(dirname $(realpath $0))/..) cd $BASEDIR -DISTROS_DIR=distro -DISTRO_ACTIVE_LINK=distributive-active +DISTROS_DIR=distros +DISTRO_ACTIVE_LINK=distro-active SERVICES_AVAILABLE_DIR=services-available STANDALONE_DIR=exports @@ -55,11 +55,11 @@ check_active() { if [ ! -L $DISTRO_ACTIVE_LINK ]; then if [ -e $DISTRO_ACTIVE_LINK ]; then die "$DISTRO_ACTIVE_LINK is not a symbolic link." \ - "It's should be link to active distributive setup" + "It's should be link to active distro setup" fi elif [ ! -e $DISTRO_ACTIVE_LINK ]; then die "$DISTRO_ACTIVE_LINK is brocken symbolic link." \ - "It's should be link to active distributive setup" + "It's should be link to active distro setup" fi } @@ -101,7 +101,7 @@ distro_is_valid() { fi if ls $DIR/*.yml 2> /dev/null >&2; then - msg $MSG_TYPE "There is $DIR/*.yml files. Please rename or move out them from distributive" + msg $MSG_TYPE "There is $DIR/*.yml files. Please rename or move out them from distro" set_short_msg "exist *.yml(!)" $CHECK_EXIT fi @@ -150,7 +150,7 @@ distro_is_valid() { distro_make_active() { ln -fns $1 $DISTRO_ACTIVE_LINK - msg info "Distributive \"$(basename $1)\" active now" + msg info "Distro \"$(basename $1)\" active now" } get_distros_list() { @@ -231,8 +231,8 @@ gen_menu_items() { PROMPT="${PROMPT}\n" } -# $1: variable name to return distributive namw -# $2: optional parameter "new", to check if distributive already exist +# $1: variable name to return distro namw +# $2: optional parameter "new", to check if distro already exist ask_distro_name() { # clear variable if it still exist from last time @@ -241,7 +241,7 @@ ask_distro_name() { # ctrl-c will cancel action trap 'CTRL_C=1' INT - while printf "Enter distributive name: " + while printf "Enter distro name: " read ANS do if [ -n "$CTRL_C" ]; then @@ -249,12 +249,12 @@ ask_distro_name() { fi if echo "$ANS" | grep -q '[^a-zA-Z0-9_-]'; then - msg warn "Distributive name must consist only 'a-z', 'A-Z', '0-9', '_' or '-'" + msg warn "Distro name must consist only 'a-z', 'A-Z', '0-9', '_' or '-'" continue fi if [ "$2" = "new" -a -e $DISTROS_DIR/$ANS ]; then - msg warn "Distributive \"$ANS\" already exist" + msg warn "Distro \"$ANS\" already exist" continue fi @@ -332,7 +332,7 @@ make_docker_compose_yaml() { FIRST=1 printf "$SEP$SEP$SEP\n" > $FILE_OUT printf "# File automatically generated by BeFAIR (https://github.com/CoronaWhy/befair)\n#\n" >> $FILE_OUT - printf "# Distributives \"$DIR_IN\" as standalone distributives\n" >> $FILE_OUT + printf "# Distros \"$DIR_IN\" as standalone distros\n" >> $FILE_OUT printf "$SEP$SEP$SEP\n\n" >> $FILE_OUT printf "\n$SEP %-30s $SEP\n\n" $YAML_REAL >> $FILE_OUT cat $YAML >> $FILE_OUT @@ -346,7 +346,7 @@ make_docker_compose_yaml() { } -export_standalone_distributive() { +export_standalone_distro() { DISTRO_DIR=$(readlink $1) DISTRO_NAME=$(basename $DISTRO_DIR) DISTRO_STANDALONE_DIR=$STANDALONE_DIR/$DISTRO_NAME @@ -365,7 +365,7 @@ export_standalone_distributive() { make_docker_compose_yaml $DISTRO_ACTIVE_LINK $DISTRO_STANDALONE_DIR - cp mk/standalone-template.mk $DISTRO_STANDALONE_DIR/Makefile + cp mk/standalone-makefile.mk $DISTRO_STANDALONE_DIR/Makefile if ! useremail=dummy traefikhost=dummy COMPOSE_FILE=$DISTRO_STANDALONE_DIR/docker-compose.yaml docker-compose config -q; then msg hr "$MENU_HR" msg err "Export to $DISTRO_STANDALONE_DIR/docker-compose.yaml fail" @@ -389,10 +389,10 @@ export_standalone_distributive() { } ############################################################################################ -menu_show_active_distributive() { +menu_show_active_distro() { msg hr $MENU_HR if [ ! -L $DISTRO_ACTIVE_LINK ]; then - msg warn "No active distributive" + msg warn "No active distro" msg hr $MENU_HR return fi @@ -402,7 +402,7 @@ menu_show_active_distributive() { msg hr $MENU_HR fi - printf "${C_MENU_TITLE}Active distributive is \"$DISTRO_ACTIVE\".${C_NONE} " + printf "${C_MENU_TITLE}Active distro is \"$DISTRO_ACTIVE\".${C_NONE} " SERVICES_ACTIVE=$(get_services_active_list $DISTRO_ACTIVE_LINK) if [ -n "$SERVICES_ACTIVE" ]; then @@ -427,31 +427,31 @@ menu_show_prompt() { case $MENU_MODE in create-distro) COPY_DISTRO="$(get_distros_list $DISTROS_DIR)" - gen_menu_items "Available distributives. Choose distributive to make ${C_MSG_TIPS}copy${C_NONE}:\n" \ + gen_menu_items "Available distros. Choose distro to make ${C_MSG_TIPS}copy${C_NONE}:\n" \ COPY_DISTRO \ "get_distro_status $DISTROS_DIR/" - PROMPT="${PROMPT} ${C_WHITE}m)${C_NONE} Make new distributive\n" - PROMPT="${PROMPT} ${C_WHITE}R)${C_NONE} Remove distributive\n" + PROMPT="${PROMPT} ${C_WHITE}m)${C_NONE} Make new distro\n" + PROMPT="${PROMPT} ${C_WHITE}R)${C_NONE} Remove distro\n" ;; remove-distro) REMOVE_DISTRO="$(get_distros_list $DISTROS_DIR)" - gen_menu_items "Available distributives. Choose distributive to ${C_MSG_WARN}remove${C_NONE}:\n" \ + gen_menu_items "Available distros. Choose distro to ${C_MSG_WARN}remove${C_NONE}:\n" \ REMOVE_DISTRO \ "get_distro_status $DISTROS_DIR/" ;; esac if [ -L $DISTRO_ACTIVE_LINK ]; then - PROMPT="${PROMPT} ${C_WHITE}d)${C_NONE} Disable current distributive\n" - PROMPT="${PROMPT} ${C_WHITE}r)${C_NONE} Rename current distributive\n" + PROMPT="${PROMPT} ${C_WHITE}d)${C_NONE} Disable current distro\n" + PROMPT="${PROMPT} ${C_WHITE}r)${C_NONE} Rename current distro\n" if distro_is_valid $DISTROS_DIR/$DISTRO_ACTIVE null; then - PROMPT="${PROMPT}\n ${C_WHITE}e$C_NONE) Export from current distributive to standalone distributive docker-compose.yaml\n" + PROMPT="${PROMPT}\n ${C_WHITE}e$C_NONE) Export from current distro to standalone distro docker-compose.yaml\n" fi PROMPT="${PROMPT}\n" fi - ############ distributive choose list ############## + ############ distro choose list ############## case $MENU_MODE in choose-distro-available) if [ -L $DISTRO_ACTIVE_LINK ]; then @@ -459,7 +459,7 @@ menu_show_prompt() { PROMPT="${PROMPT}$MENU_HR_C\n\n" # to $DISTROS_DIR/ will be added ITEM in gen_menu_items - gen_menu_items "Available distributives. Choose distributive to make it ${C_MSG_TIPS}active${C_NONE}:\n" \ + gen_menu_items "Available distros. Choose distro to make it ${C_MSG_TIPS}active${C_NONE}:\n" \ ACTIVATE_DISTRO \ "get_distro_status $DISTROS_DIR/" fi @@ -468,7 +468,7 @@ menu_show_prompt() { *) if [ -z "$MENU_MODE" -a ! -L $DISTRO_ACTIVE_LINK ]; then # to $DISTROS_DIR/ will be added ITEM in gen_menu_items - gen_menu_items "Available distributives. Choose distributive to make it ${C_MSG_TIPS}active${C_NONE}:\n" \ + gen_menu_items "Available distros. Choose distro to make it ${C_MSG_TIPS}active${C_NONE}:\n" \ ACTIVATE_DISTRO \ "get_distro_status $DISTROS_DIR/" fi @@ -476,18 +476,18 @@ menu_show_prompt() { esac if [ -L $DISTRO_ACTIVE_LINK -a "$MENU_MODE" != "choose-distro-available" ]; then PROMPT="${PROMPT}$MENU_HR_C\n\n" - PROMPT="${PROMPT} ${C_MENU_KEY}c)${C_NONE} Choose available distributive [ mode ]\n\n" + PROMPT="${PROMPT} ${C_MENU_KEY}c)${C_NONE} Choose available distro [ mode ]\n\n" fi - ############ distributives modes list ############## + ############ distros modes list ############## PROMPT="${PROMPT}$MENU_HR_C\n\n" if [ "$MENU_MODE" != "create-distro" ]; then - PROMPT="${PROMPT} ${C_MENU_KEY}C)${C_NONE} Create new distributive [ mode ]\n" + PROMPT="${PROMPT} ${C_MENU_KEY}C)${C_NONE} Create new distro [ mode ]\n" fi if [ "$MENU_MODE" != "remove-distro" ]; then - PROMPT="${PROMPT} ${C_MENU_KEY}R)${C_NONE} Remove distributive [ mode ]\n" + PROMPT="${PROMPT} ${C_MENU_KEY}R)${C_NONE} Remove distro [ mode ]\n" fi PROMPT="${PROMPT}\n ${C_MENU_KEY}q)${C_NONE} Quit\n" @@ -531,7 +531,7 @@ menu_numeric_index_action() { ask_distro_name DISTRO_NEW new if [ -n "$DISTRO_NEW" ]; then cp -ra $DISTROS_DIR/$ITEM $DISTROS_DIR/$DISTRO_NEW - msg info "Distributive \"$DISTRO_NEW\" created from \"$ITEM\"" + msg info "Distro \"$DISTRO_NEW\" created from \"$ITEM\"" fi ;; @@ -541,11 +541,11 @@ menu_numeric_index_action() { DISTRO_CURRENT=$(basename $(readlink $DISTRO_ACTIVE_LINK)) if [ "$DISTRO_CURRENT" = "$ITEM" ]; then rm $DISTRO_ACTIVE_LINK - msg info "Distributive \"$ITEM\" disabled" + msg info "Distro \"$ITEM\" disabled" fi fi rm -r $DISTROS_DIR/$ITEM/ - msg info "Distributive \"$ITEM\" removed" + msg info "Distro \"$ITEM\" removed" fi ;; @@ -563,7 +563,7 @@ menu_main() { clear while menu_unset_variables - menu_show_active_distributive + menu_show_active_distro menu_show_prompt read ANS do @@ -580,9 +580,9 @@ menu_main() { mkdir -p $DISTROS_DIR/$DISTRO_NEW ln -rs $DISTROS_DIR/../mk/distro-makefile.mk $DISTROS_DIR/$DISTRO_NEW/Makefile # TODO: create .env file - msg info "Distributive \"$DISTRO_NEW\" created" + msg info "Distro \"$DISTRO_NEW\" created" if [ -L $DISTRO_ACTIVE_LINK ]; then - if ask_yes "Do you want make new distributive $DISTRO_NEW active?"; then + if ask_yes "Do you want make new distro $DISTRO_NEW active?"; then distro_make_active $DISTROS_DIR/$DISTRO_NEW fi else @@ -596,15 +596,15 @@ menu_main() { DISTRO_CURRENT=$(readlink $DISTRO_ACTIVE_LINK) mv $DISTRO_CURRENT $DISTROS_DIR/$DISTRO_NEW ln -fns $DISTROS_DIR/$DISTRO_NEW $DISTRO_ACTIVE_LINK - msg info "Distributive \"$(basename $DISTRO_CURRENT)\" renamed to\"$DISTRO_NEW\"" + msg info "Distro \"$(basename $DISTRO_CURRENT)\" renamed to\"$DISTRO_NEW\"" fi ;; d) [ -L $DISTRO_ACTIVE_LINK ] && rm $DISTRO_ACTIVE_LINK - msg info "Active distributive \"$DISTRO_ACTIVE\" disabled." + msg info "Active distro \"$DISTRO_ACTIVE\" disabled." ;; e) - export_standalone_distributive $DISTRO_ACTIVE_LINK + export_standalone_distro $DISTRO_ACTIVE_LINK ;; q) exit ;; diff --git a/distro/analytics/.env b/distros/analytics/.env similarity index 100% rename from distro/analytics/.env rename to distros/analytics/.env diff --git a/distro/analytics/.env_superset b/distros/analytics/.env_superset similarity index 100% rename from distro/analytics/.env_superset rename to distros/analytics/.env_superset diff --git a/distro/analytics/Makefile b/distros/analytics/Makefile similarity index 100% rename from distro/analytics/Makefile rename to distros/analytics/Makefile diff --git a/distro/analytics/fuji.yaml b/distros/analytics/fuji.yaml similarity index 100% rename from distro/analytics/fuji.yaml rename to distros/analytics/fuji.yaml diff --git a/distro/analytics/superset-http.yaml b/distros/analytics/superset-http.yaml similarity index 100% rename from distro/analytics/superset-http.yaml rename to distros/analytics/superset-http.yaml diff --git a/distro/analytics/traefik-https.yaml b/distros/analytics/traefik-https.yaml similarity index 100% rename from distro/analytics/traefik-https.yaml rename to distros/analytics/traefik-https.yaml diff --git a/distro/clariah/.env b/distros/clariah/.env similarity index 100% rename from distro/clariah/.env rename to distros/clariah/.env diff --git a/distro/clariah/Makefile b/distros/clariah/Makefile similarity index 100% rename from distro/clariah/Makefile rename to distros/clariah/Makefile diff --git a/distro/clariah/dataverse-5.3.yaml b/distros/clariah/dataverse-5.3.yaml similarity index 100% rename from distro/clariah/dataverse-5.3.yaml rename to distros/clariah/dataverse-5.3.yaml diff --git a/distro/clariah/postgresql.yaml b/distros/clariah/postgresql.yaml similarity index 100% rename from distro/clariah/postgresql.yaml rename to distros/clariah/postgresql.yaml diff --git a/distro/clariah/solr.yaml b/distros/clariah/solr.yaml similarity index 100% rename from distro/clariah/solr.yaml rename to distros/clariah/solr.yaml diff --git a/distro/clariah/traefik-https.yaml b/distros/clariah/traefik-https.yaml similarity index 100% rename from distro/clariah/traefik-https.yaml rename to distros/clariah/traefik-https.yaml diff --git a/distro/covid19museum/.env b/distros/covid19museum/.env similarity index 100% rename from distro/covid19museum/.env rename to distros/covid19museum/.env diff --git a/distro/covid19museum/Makefile b/distros/covid19museum/Makefile similarity index 100% rename from distro/covid19museum/Makefile rename to distros/covid19museum/Makefile diff --git a/distro/covid19museum/airflow.env b/distros/covid19museum/airflow.env similarity index 100% rename from distro/covid19museum/airflow.env rename to distros/covid19museum/airflow.env diff --git a/distro/covid19museum/airflow.yaml b/distros/covid19museum/airflow.yaml similarity index 100% rename from distro/covid19museum/airflow.yaml rename to distros/covid19museum/airflow.yaml diff --git a/distro/covid19museum/dataverse-5.3.yaml b/distros/covid19museum/dataverse-5.3.yaml similarity index 100% rename from distro/covid19museum/dataverse-5.3.yaml rename to distros/covid19museum/dataverse-5.3.yaml diff --git a/distro/covid19museum/postgresql.yaml b/distros/covid19museum/postgresql.yaml similarity index 100% rename from distro/covid19museum/postgresql.yaml rename to distros/covid19museum/postgresql.yaml diff --git a/distro/covid19museum/solr.yaml b/distros/covid19museum/solr.yaml similarity index 100% rename from distro/covid19museum/solr.yaml rename to distros/covid19museum/solr.yaml diff --git a/distro/covid19museum/traefik-https.yaml b/distros/covid19museum/traefik-https.yaml similarity index 100% rename from distro/covid19museum/traefik-https.yaml rename to distros/covid19museum/traefik-https.yaml diff --git a/distro/dataverse-airflow/.env b/distros/dataverse-airflow/.env similarity index 100% rename from distro/dataverse-airflow/.env rename to distros/dataverse-airflow/.env diff --git a/distro/dataverse-airflow/Makefile b/distros/dataverse-airflow/Makefile similarity index 100% rename from distro/dataverse-airflow/Makefile rename to distros/dataverse-airflow/Makefile diff --git a/distro/dataverse-airflow/airflow.env b/distros/dataverse-airflow/airflow.env similarity index 100% rename from distro/dataverse-airflow/airflow.env rename to distros/dataverse-airflow/airflow.env diff --git a/distro/dataverse-airflow/airflow.yaml b/distros/dataverse-airflow/airflow.yaml similarity index 100% rename from distro/dataverse-airflow/airflow.yaml rename to distros/dataverse-airflow/airflow.yaml diff --git a/distro/dataverse-airflow/dataverse.yaml b/distros/dataverse-airflow/dataverse.yaml similarity index 100% rename from distro/dataverse-airflow/dataverse.yaml rename to distros/dataverse-airflow/dataverse.yaml diff --git a/distro/dataverse-airflow/nde.yaml b/distros/dataverse-airflow/nde.yaml similarity index 100% rename from distro/dataverse-airflow/nde.yaml rename to distros/dataverse-airflow/nde.yaml diff --git a/distro/dataverse-airflow/postgresql.yaml b/distros/dataverse-airflow/postgresql.yaml similarity index 100% rename from distro/dataverse-airflow/postgresql.yaml rename to distros/dataverse-airflow/postgresql.yaml diff --git a/distro/dataverse-airflow/semantic-gateway.yaml b/distros/dataverse-airflow/semantic-gateway.yaml similarity index 100% rename from distro/dataverse-airflow/semantic-gateway.yaml rename to distros/dataverse-airflow/semantic-gateway.yaml diff --git a/distro/dataverse-airflow/solr.yaml b/distros/dataverse-airflow/solr.yaml similarity index 100% rename from distro/dataverse-airflow/solr.yaml rename to distros/dataverse-airflow/solr.yaml diff --git a/distro/dataverse-airflow/traefik.yaml b/distros/dataverse-airflow/traefik.yaml similarity index 100% rename from distro/dataverse-airflow/traefik.yaml rename to distros/dataverse-airflow/traefik.yaml diff --git a/distro/dataverse-airflow/whoami.yaml b/distros/dataverse-airflow/whoami.yaml similarity index 100% rename from distro/dataverse-airflow/whoami.yaml rename to distros/dataverse-airflow/whoami.yaml diff --git a/distro/dataverse-jdk11/.env b/distros/dataverse-jdk11/.env similarity index 100% rename from distro/dataverse-jdk11/.env rename to distros/dataverse-jdk11/.env diff --git a/distro/dataverse-jdk11/Makefile b/distros/dataverse-jdk11/Makefile similarity index 100% rename from distro/dataverse-jdk11/Makefile rename to distros/dataverse-jdk11/Makefile diff --git a/distro/dataverse-jdk11/dataverse-5.3.yaml b/distros/dataverse-jdk11/dataverse-5.3.yaml similarity index 100% rename from distro/dataverse-jdk11/dataverse-5.3.yaml rename to distros/dataverse-jdk11/dataverse-5.3.yaml diff --git a/distro/dataverse-jdk11/postgresql.yaml b/distros/dataverse-jdk11/postgresql.yaml similarity index 100% rename from distro/dataverse-jdk11/postgresql.yaml rename to distros/dataverse-jdk11/postgresql.yaml diff --git a/distro/dataverse-jdk11/solr.yaml b/distros/dataverse-jdk11/solr.yaml similarity index 100% rename from distro/dataverse-jdk11/solr.yaml rename to distros/dataverse-jdk11/solr.yaml diff --git a/distro/dataverse-jdk11/traefik-https.yaml b/distros/dataverse-jdk11/traefik-https.yaml similarity index 100% rename from distro/dataverse-jdk11/traefik-https.yaml rename to distros/dataverse-jdk11/traefik-https.yaml diff --git a/distro/dataverse-multilang/.env b/distros/dataverse-multilang/.env similarity index 100% rename from distro/dataverse-multilang/.env rename to distros/dataverse-multilang/.env diff --git a/distro/dataverse-multilang/.env_weblate b/distros/dataverse-multilang/.env_weblate similarity index 100% rename from distro/dataverse-multilang/.env_weblate rename to distros/dataverse-multilang/.env_weblate diff --git a/distro/dataverse-multilang/Makefile b/distros/dataverse-multilang/Makefile similarity index 100% rename from distro/dataverse-multilang/Makefile rename to distros/dataverse-multilang/Makefile diff --git a/distro/dataverse-multilang/dataverse-5.3.yaml b/distros/dataverse-multilang/dataverse-5.3.yaml similarity index 100% rename from distro/dataverse-multilang/dataverse-5.3.yaml rename to distros/dataverse-multilang/dataverse-5.3.yaml diff --git a/distro/dataverse-multilang/postgresql.yaml b/distros/dataverse-multilang/postgresql.yaml similarity index 100% rename from distro/dataverse-multilang/postgresql.yaml rename to distros/dataverse-multilang/postgresql.yaml diff --git a/distro/dataverse-multilang/solr.yaml b/distros/dataverse-multilang/solr.yaml similarity index 100% rename from distro/dataverse-multilang/solr.yaml rename to distros/dataverse-multilang/solr.yaml diff --git a/distro/fair/.env b/distros/fair/.env similarity index 100% rename from distro/fair/.env rename to distros/fair/.env diff --git a/distro/fair/Makefile b/distros/fair/Makefile similarity index 100% rename from distro/fair/Makefile rename to distros/fair/Makefile diff --git a/distro/fair/fdp.config b/distros/fair/fdp.config similarity index 100% rename from distro/fair/fdp.config rename to distros/fair/fdp.config diff --git a/distro/fair/fdp.yaml b/distros/fair/fdp.yaml similarity index 100% rename from distro/fair/fdp.yaml rename to distros/fair/fdp.yaml diff --git a/distro/fair/fuji.yaml b/distros/fair/fuji.yaml similarity index 100% rename from distro/fair/fuji.yaml rename to distros/fair/fuji.yaml diff --git a/distro/fair/postgresql.yaml b/distros/fair/postgresql.yaml similarity index 100% rename from distro/fair/postgresql.yaml rename to distros/fair/postgresql.yaml diff --git a/distro/fair/solr.yaml b/distros/fair/solr.yaml similarity index 100% rename from distro/fair/solr.yaml rename to distros/fair/solr.yaml diff --git a/distro/fair/traefik-https.yaml b/distros/fair/traefik-https.yaml similarity index 100% rename from distro/fair/traefik-https.yaml rename to distros/fair/traefik-https.yaml diff --git a/distro/hello-world/.env b/distros/hello-world/.env similarity index 100% rename from distro/hello-world/.env rename to distros/hello-world/.env diff --git a/distro/hello-world/Makefile b/distros/hello-world/Makefile similarity index 100% rename from distro/hello-world/Makefile rename to distros/hello-world/Makefile diff --git a/distro/hello-world/traefik.yaml b/distros/hello-world/traefik.yaml similarity index 100% rename from distro/hello-world/traefik.yaml rename to distros/hello-world/traefik.yaml diff --git a/distro/hello-world/whoami.yaml b/distros/hello-world/whoami.yaml similarity index 100% rename from distro/hello-world/whoami.yaml rename to distros/hello-world/whoami.yaml diff --git a/distro/localhost/.env b/distros/localhost/.env similarity index 100% rename from distro/localhost/.env rename to distros/localhost/.env diff --git a/distro/localhost/Makefile b/distros/localhost/Makefile similarity index 100% rename from distro/localhost/Makefile rename to distros/localhost/Makefile diff --git a/distro/localhost/dataverse.yaml b/distros/localhost/dataverse.yaml similarity index 100% rename from distro/localhost/dataverse.yaml rename to distros/localhost/dataverse.yaml diff --git a/distro/localhost/nde.yaml b/distros/localhost/nde.yaml similarity index 100% rename from distro/localhost/nde.yaml rename to distros/localhost/nde.yaml diff --git a/distro/localhost/postgresql.yaml b/distros/localhost/postgresql.yaml similarity index 100% rename from distro/localhost/postgresql.yaml rename to distros/localhost/postgresql.yaml diff --git a/distro/localhost/semantic-gateway.yaml b/distros/localhost/semantic-gateway.yaml similarity index 100% rename from distro/localhost/semantic-gateway.yaml rename to distros/localhost/semantic-gateway.yaml diff --git a/distro/localhost/solr.yaml b/distros/localhost/solr.yaml similarity index 100% rename from distro/localhost/solr.yaml rename to distros/localhost/solr.yaml diff --git a/distro/localhost/traefik.yaml b/distros/localhost/traefik.yaml similarity index 100% rename from distro/localhost/traefik.yaml rename to distros/localhost/traefik.yaml diff --git a/distro/localhost/whoami.yaml b/distros/localhost/whoami.yaml similarity index 100% rename from distro/localhost/whoami.yaml rename to distros/localhost/whoami.yaml diff --git a/distro/semantictools/.env b/distros/semantictools/.env similarity index 100% rename from distro/semantictools/.env rename to distros/semantictools/.env diff --git a/distro/semantictools/Makefile b/distros/semantictools/Makefile similarity index 100% rename from distro/semantictools/Makefile rename to distros/semantictools/Makefile diff --git a/distro/semantictools/skosmos.yaml b/distros/semantictools/skosmos.yaml similarity index 100% rename from distro/semantictools/skosmos.yaml rename to distros/semantictools/skosmos.yaml diff --git a/distro/semantictools/source/README.md b/distros/semantictools/source/README.md similarity index 100% rename from distro/semantictools/source/README.md rename to distros/semantictools/source/README.md diff --git a/distro/semantictools/traefik-https.yaml b/distros/semantictools/traefik-https.yaml similarity index 100% rename from distro/semantictools/traefik-https.yaml rename to distros/semantictools/traefik-https.yaml diff --git a/distro/timemachine/.env b/distros/timemachine/.env similarity index 100% rename from distro/timemachine/.env rename to distros/timemachine/.env diff --git a/distro/timemachine/Makefile b/distros/timemachine/Makefile similarity index 100% rename from distro/timemachine/Makefile rename to distros/timemachine/Makefile diff --git a/distro/timemachine/dataverse-5.3.yaml b/distros/timemachine/dataverse-5.3.yaml similarity index 100% rename from distro/timemachine/dataverse-5.3.yaml rename to distros/timemachine/dataverse-5.3.yaml diff --git a/distro/timemachine/postgresql.yaml b/distros/timemachine/postgresql.yaml similarity index 100% rename from distro/timemachine/postgresql.yaml rename to distros/timemachine/postgresql.yaml diff --git a/distro/timemachine/solr.yaml b/distros/timemachine/solr.yaml similarity index 100% rename from distro/timemachine/solr.yaml rename to distros/timemachine/solr.yaml diff --git a/distro/timemachine/traefik-https.yaml b/distros/timemachine/traefik-https.yaml similarity index 100% rename from distro/timemachine/traefik-https.yaml rename to distros/timemachine/traefik-https.yaml diff --git a/distro/workflows/.env b/distros/workflows/.env similarity index 100% rename from distro/workflows/.env rename to distros/workflows/.env diff --git a/distro/workflows/Makefile b/distros/workflows/Makefile similarity index 100% rename from distro/workflows/Makefile rename to distros/workflows/Makefile diff --git a/distro/workflows/kafka.yaml b/distros/workflows/kafka.yaml similarity index 100% rename from distro/workflows/kafka.yaml rename to distros/workflows/kafka.yaml diff --git a/distro/workflows/traefik-https.yaml b/distros/workflows/traefik-https.yaml similarity index 100% rename from distro/workflows/traefik-https.yaml rename to distros/workflows/traefik-https.yaml diff --git a/distro/workflows/var/security/letsencrypt/acme.json b/distros/workflows/var/security/letsencrypt/acme.json similarity index 100% rename from distro/workflows/var/security/letsencrypt/acme.json rename to distros/workflows/var/security/letsencrypt/acme.json diff --git a/mk/common.mk b/mk/distro-common.mk similarity index 84% rename from mk/common.mk rename to mk/distro-common.mk index 79df6f5..63c26f2 100644 --- a/mk/common.mk +++ b/mk/distro-common.mk @@ -1,9 +1,9 @@ -DISTRO_DIR=$(dir $(filter %common.mk,$(MAKEFILE_LIST))) +DISTRO_DIR=$(dir $(filter %distro-common.mk,$(MAKEFILE_LIST))) -# Run all unknown target in distributive-active/ directory +# Run all unknown target in distro-active/ directory ifeq ($(DISTRO_DIR),./) -#$(guile (chdir "distributive-active")) -$(chdir "distributive-active") +#$(guile (chdir "distro-active")) +$(chdir "distro-active") .DEFAULT_GOAL := all .PHONY: ${MAKECMDGOALS} $(filter-out all,${MAKECMDGOALS}) all: .forward-all ; @: @@ -18,7 +18,7 @@ endif # add default enviroment file if available -include .env -# find all *.yaml file in distributive directory and set COMPOSE_FILE for docker-compose +# find all *.yaml file in distro directory and set COMPOSE_FILE for docker-compose export COMPOSE_FILE=$(call join-with,:,$(wildcard *.yaml)) # FIXME: find a proper way to find dataverse container name @@ -41,7 +41,7 @@ var-show-all: echo $(DISTRO_DIR) # Find all *.mk files which corrspond to *.yaml files. -# For example if solr.yaml exist in distributive directory, search for +# For example if solr.yaml exist in distro directory, search for # services-available/solr.yaml and include it $(foreach mk,$(addsuffix .mk,$(basename $(wildcard *.yaml))), \ $(eval SERVICE_INCLUDE_MK += $(call search-parent-mk,services-available/$(mk))) \ @@ -53,7 +53,7 @@ $(foreach mk,$(SERVICE_INCLUDE_MK), \ OK := $(shell printf "\"\e[1;32mok\e[0m\"") FAIL := $(shell printf "\"\e[1;31mfail\e[0m\"") -# help: checking consistency of distributive +# help: checking consistency of distro check: @printf "Checking 'docker-compose config -q' syntax - " @useremail=dummy traefikhost=dummy docker-compose config -q && echo $(OK) || { echo $(FAIL); $(CHECK_EXIT) } @@ -66,7 +66,7 @@ check: || { echo $(FAIL)'. Need at least one not override.yaml'; $(CHECK_EXIT) } @printf 'Checking not existing *.yml files - ' - @ls *.yml 2> /dev/null >&2 && { echo $(FAIL)'. Please rename or move out *.yml from distributive'; $(CHECK_EXIT) } || echo $(OK) + @ls *.yml 2> /dev/null >&2 && { echo $(FAIL)'. Please rename or move out *.yml from distro'; $(CHECK_EXIT) } || echo $(OK) @printf 'Checking links point to files with same name - ' @for YAML in *.yaml; do \ @@ -124,7 +124,7 @@ airflow: .PHONY: airflow superset: - # clone latest version ready for distributive + # clone latest version ready for distro git clone http://github.com/apache/superset .PHONY: superset @@ -157,12 +157,12 @@ shell devshell: docker-compose exec $(DATAVERSE_CONTAINER_NAME) bash .PHONY: shell devshell -# help: 'docker volume prune' - cleanup data for current distributive +# help: 'docker volume prune' - cleanup data for current distro volume-prune: docker volume prune --filter 'name=$(COMPOSE_PROJECT_NAME)' .PHONY: volume-prune -# help: 'docker volume -y prune' - cleanup data for current distributive without prompt +# help: 'docker volume -y prune' - cleanup data for current distro without prompt volume-prune-force: docker volume -y prune --filter 'name=$(COMPOSE_PROJECT_NAME)' .PHONY: volume-prune-force @@ -171,17 +171,17 @@ volume-prune-force: reset: down volume-prune .PHONY: reset -# help: generate enviroment variables for current distributive. Can be user in shell as: eval \$(make env) +# help: generate enviroment variables for current distro. Can be user in shell as: eval \$(make env) env: .env @echo export COMPOSE_FILE=$(COMPOSE_FILE) @cat .env | sed '/^ *$$\|^#/d;s/^[^#]/export &/' @#env --ignore-environment sh -c "set -x;eval $$(/bin/cat .env); echo 123; export -p" .PHONY: env -# help: bash with enviroment variables for current distributive to allow operate docker-compose directly +# help: bash with enviroment variables for current distro to allow operate docker-compose directly bash: .env @. ./.env; \ - printf "\nbash with enviroment variables for current distributive. Try to run 'docker-compose config' for example\n\n"; \ + printf "\nbash with enviroment variables for current distro. Try to run 'docker-compose config' for example\n\n"; \ bash -li || true .PHONY: bash diff --git a/mk/distro-makefile.mk b/mk/distro-makefile.mk index 9e67f9f..c974cfc 100644 --- a/mk/distro-makefile.mk +++ b/mk/distro-makefile.mk @@ -27,5 +27,5 @@ search-parent-mk = \ ) $(call include-parent-mk,mk/helpers.mk) -$(call include-parent-mk,mk/common.mk) +$(call include-parent-mk,mk/distro-common.mk) diff --git a/mk/standalone-template.mk b/mk/standalone-makefile.mk similarity index 90% rename from mk/standalone-template.mk rename to mk/standalone-makefile.mk index 67abccf..3117587 100644 --- a/mk/standalone-template.mk +++ b/mk/standalone-makefile.mk @@ -1,10 +1,10 @@ ######################################################################################### -# This file part of BeFAIR (https://github.com/CoronaWhy/befair) standalone distributive +# This file part of BeFAIR (https://github.com/CoronaWhy/befair) standalone distro ######################################################################################### help: - @printf "tgz - create tar.gz with distributive\n" - @printf "check - checking consistency of standalone distributive\n\n" + @printf "tgz - create tar.gz with distro\n" + @printf "check - checking consistency of standalone distro\n\n" @printf "up - 'docker-compose up -d'\n" @printf "debug - 'docker-compose up'\n" @printf "down - 'docker-compose down'\n" @@ -22,7 +22,7 @@ tgz: OK := $(shell printf "\"\e[1;32mok\e[0m\"") FAIL := $(shell printf "\"\e[1;31mfail\e[0m\"") -# help: checking consistency of distributive +# help: checking consistency of distro check: @printf "Checking 'docker-compose config -q' syntax - " @useremail=dummy traefikhost=dummy docker-compose config -q && echo $(OK) || { echo $(FAIL); $(CHECK_EXIT) } @@ -35,7 +35,7 @@ check: || { echo $(FAIL)'. Need at least one not override.yaml'; $(CHECK_EXIT) } @printf 'Checking not existing *.yml files - ' - @ls *.yml 2> /dev/null >&2 && { echo $(FAIL)'. Please rename or move out *.yml from distributive'; $(CHECK_EXIT) } || echo $(OK) + @ls *.yml 2> /dev/null >&2 && { echo $(FAIL)'. Please rename or move out *.yml from distro'; $(CHECK_EXIT) } || echo $(OK) .PHONY: check From a3ee3e2301cd0710acd20b0ddbded86fe08112f0 Mon Sep 17 00:00:00 2001 From: Maksym Komar Date: Fri, 26 Feb 2021 01:19:29 +0000 Subject: [PATCH 32/36] Fix adding make rules in services .mk files That was brocken after moving service-available in subdirectories --- mk/distro-common.mk | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/mk/distro-common.mk b/mk/distro-common.mk index 63c26f2..7ede2d1 100644 --- a/mk/distro-common.mk +++ b/mk/distro-common.mk @@ -42,12 +42,18 @@ var-show-all: # Find all *.mk files which corrspond to *.yaml files. # For example if solr.yaml exist in distro directory, search for -# services-available/solr.yaml and include it -$(foreach mk,$(addsuffix .mk,$(basename $(wildcard *.yaml))), \ - $(eval SERVICE_INCLUDE_MK += $(call search-parent-mk,services-available/$(mk))) \ +# solr.mk which in symbolic link (usually in service-avaliable/) ... +$(foreach mk,$(wildcard $(addsuffix .mk,$(basename $(realpath $(wildcard *.yaml))))), \ + $(eval SERVICE_INCLUDE_MK += $(mk)) \ ) + +# ... or current distro directory. +$(foreach mk,$(abspath $(wildcard $(addsuffix .mk,$(basename $(wildcard *.yaml))))), \ + $(eval SERVICE_INCLUDE_MK += $(mk)) \ +) + $(foreach mk,$(SERVICE_INCLUDE_MK), \ - $(eval include $(mk))\ + $(eval -include $(mk))\ ) OK := $(shell printf "\"\e[1;32mok\e[0m\"") From 59bc605801d6432a11a09de46f9e9840fd44ed0a Mon Sep 17 00:00:00 2001 From: Maksym Komar Date: Fri, 26 Feb 2021 01:20:04 +0000 Subject: [PATCH 33/36] Move airflow and superset specific targets to coresponded .mk files --- README.md | 8 +------- mk/distro-common.mk | 19 ------------------- services-available/bi/superset-http.mk | 1 + services-available/bi/superset.mk | 11 +++++++++++ services-available/workflows/airflow.mk | 15 +++++++++++++++ 5 files changed, 28 insertions(+), 26 deletions(-) create mode 120000 services-available/bi/superset-http.mk create mode 100644 services-available/bi/superset.mk create mode 100644 services-available/workflows/airflow.mk diff --git a/README.md b/README.md index fe7f025..2334fe9 100644 --- a/README.md +++ b/README.md @@ -88,17 +88,11 @@ You can find all available installations in distros/ folder. Different distros a Choose some distro, for example, "fair", and start/stop all services with commands: ``` -cd fair +cd distros/fair make up make down ``` -Warning: please use init commands for Apache Airflow and Apache Superset: -``` -make airflow -make superset -``` - # Menuconfig BeFAIR has a tool to manage all services, it's located in bin/menuconfig. You can enable/disable both services and distros there in a convinient way. diff --git a/mk/distro-common.mk b/mk/distro-common.mk index 7ede2d1..6dac7af 100644 --- a/mk/distro-common.mk +++ b/mk/distro-common.mk @@ -122,25 +122,6 @@ debug: docker-compose up .PHONY: debug -airflow: - docker-compose run webserver db init - # not secure, just for dev - chmod -R 777 ./var/airflow - docker-compose run webserver users create -r Admin -u admin -e team@coronawhy.org -f admin -l user -p admin -.PHONY: airflow - -superset: - # clone latest version ready for distro - git clone http://github.com/apache/superset -.PHONY: superset - -# init and start everything -init: - docker-compose run webserver db init - docker-compose run webserver users create -r Admin -u admin -e team@coronawhy.org -f admin -l user -p admin - docker-compose up -.PHONY: init - # help: 'docker-compose up' with dummy override entrypoint for dataverse. dataverse need to be run manual up-manual:: COMPOSE_FILE=$(COMPOSE_FILE):/tmp/entrypoint.override.yaml up-manual:: diff --git a/services-available/bi/superset-http.mk b/services-available/bi/superset-http.mk new file mode 120000 index 0000000..fade1a2 --- /dev/null +++ b/services-available/bi/superset-http.mk @@ -0,0 +1 @@ +superset.mk \ No newline at end of file diff --git a/services-available/bi/superset.mk b/services-available/bi/superset.mk new file mode 100644 index 0000000..9460056 --- /dev/null +++ b/services-available/bi/superset.mk @@ -0,0 +1,11 @@ +# help: clone latest version ready for distro +superset-clone: + git clone http://github.com/apache/superset +.PHONY: superset-clone + +# help: init superset and start everything +superset-init: + docker-compose run webserver db init + docker-compose run webserver users create -r Admin -u admin -e team@coronawhy.org -f admin -l user -p admin + docker-compose up +.PHONY: superset-init diff --git a/services-available/workflows/airflow.mk b/services-available/workflows/airflow.mk new file mode 100644 index 0000000..7a4b8ce --- /dev/null +++ b/services-available/workflows/airflow.mk @@ -0,0 +1,15 @@ +# help: init airflow +airflow-init: ./var/db/airflow.db ./var/airflow + docker-compose run webserver db init + docker-compose run webserver users create -r Admin -u admin -e team@coronawhy.org -f admin -l user -p admin +.PHONY: airflow-init + +./var/airflow: + @mkdir -p ./var/airflow + # not secure, just for dev + @chmod -R 777 ./var/airflow + +# help: clean all airflow data (DANGEROUS!!!) +airflow-dist-clean: + @rm -r ./var/airflow +.PHONY: airflow-dist-clean From 6f6bb6a6d2cd791b945a51695dcaae4818e0884d Mon Sep 17 00:00:00 2001 From: Maksym Komar Date: Fri, 26 Feb 2021 11:11:01 +0000 Subject: [PATCH 34/36] Remove tupo --- .../var/security/letsencrypt/acme.json | 36 ------------------- .../var/security/letsencrypt/acme.json | 36 ------------------- 2 files changed, 72 deletions(-) delete mode 100644 distros/dataverse-converters/var/security/letsencrypt/acme.json delete mode 100644 distros/workflows/var/security/letsencrypt/acme.json diff --git a/distros/dataverse-converters/var/security/letsencrypt/acme.json b/distros/dataverse-converters/var/security/letsencrypt/acme.json deleted file mode 100644 index d2670e1..0000000 --- a/distros/dataverse-converters/var/security/letsencrypt/acme.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "myresolver": { - "Account": { - "Email": "team@coronawhy.org", - "Registration": { - "body": { - "status": "valid", - "contact": [ - "mailto:team@coronawhy.org" - ] - }, - "uri": "https://acme-v02.api.letsencrypt.org/acme/acct/113932823" - }, - "PrivateKey": "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", - "KeyType": "4096" - }, - "Certificates": [ - { - "domain": { - "main": "dashboard.dataverse.org.ua" - }, - "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdPakNDQlNLZ0F3SUJBZ0lTQTNsclFNckw2cDFqalAwTG55NkNIbkMvTUEwR0NTcUdTSWIzRFFFQkN3VUEKTURJeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFNWlhRbmN5QkZibU55ZVhCME1Rc3dDUVlEVlFRRApFd0pTTXpBZUZ3MHlNVEF5TWpVeU1URTBNVFJhRncweU1UQTFNall5TVRFME1UUmFNQ1V4SXpBaEJnTlZCQU1UCkdtUmhjMmhpYjJGeVpDNWtZWFJoZG1WeWMyVXViM0puTG5WaE1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0MKQWc4QU1JSUNDZ0tDQWdFQWx0emI3MHl1TEl6Z3c3R1lnWkVPQktOeFZvc0hodDJPV3dvZmIwOWZZYTJWMHRxcgpnTktqdUxUd0ZoYm55T0E1Yng2bkpUbWFDcDJlUGdyZkd5OVFBbTExS0lOWGloMVVObFlabVpDaE8wUDlTT2JmCjdOZE9pMXhQdFdmUHhvOS83Ym5NaGt0Q2l0eUVDZFpocjlGRE5IU0o0YjZNUkRaWTVqMEpYanJvYzcycVVLVU8KdUFyNlNzRWZHU0NDcDBXVnpuV2ppUlNsQTZ1cElyaUxQanhDRWpycU5CeXBWRjdrUkxRaEVITTBBSkowZnFQSAppUjQ1b2VYeHBMTjVHK0d4MENILzlVSTcxY00xTUhlTkQ1bWRmOUU1OU81ZTV5NUlqdVloNmpMaklBdDNvUFVLClQrdlI0Y3dtbWMvY3VVZFBCNHVzb0tpK29vR1FtWXdhRWJhN3oyRTlIbCtTd0tINDE1SEhVc0RWYjJKM1NZSTkKT1MzTkNTNFBBNnhsN25HVC9wT25aSFd3eGwrQWhKVFJoSXFrSXozREpDU3NSUEFUOFdRZ3EraVVML3BkQm1oVQpmNnp6dFRQNXZWV0p2Z3FnOWtGN0ZNUVhFeDIwVTN6UmhObG50bXhMbzEvNGgzMVA2YnFpakxaRHFwcXRCT3k1CnJMc0FrM0Nhem5FSkxFYVJIajVMbTl1WHlmdk1xWWJLNTVLdGd5bnhDVFNwVVJwZzFlRmZTa3NEOFQrRkZLY1EKTDg0MnV5clRFb1Z2dUw1WlJXLzcyaVdYRWdrMm9RanZTZ1ltUWRGTzBRcHVrZ0syMjc2dE1UcmVnR2lNTHRZUAptWWlDdVUycnhnMzFZc1RxOFliV2NyL0hVUVNsYkp4NFlmUmpDb2dIS0o1ZWcvOGNUN3gvZ3UxTGhZc0NBd0VBCkFhT0NBbFV3Z2dKUk1BNEdBMVVkRHdFQi93UUVBd0lGb0RBZEJnTlZIU1VFRmpBVUJnZ3JCZ0VGQlFjREFRWUkKS3dZQkJRVUhBd0l3REFZRFZSMFRBUUgvQkFJd0FEQWRCZ05WSFE0RUZnUVUzZjEzQzRBQlgrSXJsRWFmZytWQgpaUnBqNGJFd0h3WURWUjBqQkJnd0ZvQVVGQzZ6RjdkWVZzdXVVQWxBNWgrdm5Zc1V3c1l3VlFZSUt3WUJCUVVICkFRRUVTVEJITUNFR0NDc0dBUVVGQnpBQmhoVm9kSFJ3T2k4dmNqTXVieTVzWlc1amNpNXZjbWN3SWdZSUt3WUIKQlFVSE1BS0dGbWgwZEhBNkx5OXlNeTVwTG14bGJtTnlMbTl5Wnk4d0pRWURWUjBSQkI0d0hJSWFaR0Z6YUdKdgpZWEprTG1SaGRHRjJaWEp6WlM1dmNtY3VkV0V3VEFZRFZSMGdCRVV3UXpBSUJnWm5nUXdCQWdFd053WUxLd1lCCkJBR0MzeE1CQVFFd0tEQW1CZ2dyQmdFRkJRY0NBUllhYUhSMGNEb3ZMMk53Y3k1c1pYUnpaVzVqY25sd2RDNXYKY21jd2dnRUVCZ29yQmdFRUFkWjVBZ1FDQklIMUJJSHlBUEFBZHdCYzNFT1MvdWFyUlVTeFhwclVWdVlRTi92Vgora2Zjb1hPVXNsN205c2NPeWdBQUFYZmJRYnVMQUFBRUF3QklNRVlDSVFDVk5XYzBON3VZUDV5MzFCSk1WQkwrCitDT1BLUFA5REg2dWU5RjZLVzBVb2dJaEFPNGV0Q3BwVFRvVXNRNWxidFc0dkdlNmJqNWNNK1JvNllBSnFObncKRFJCMUFIVUE5bHlVTDlGM01DSVVWQmdJTUpSV2p1Tk5FeGt6djk4TUx5QUx6RTd4Wk9NQUFBRjMyMEc3aVFBQQpCQU1BUmpCRUFpQjVnY3NhVVBSZzUvc0FpQTdzREFXdVNMa3RjOHU4SnpNTFB5TWliaFVxdGdJZ1piRlNUbFRwCnFoRGZkODVoMzB5QU42c01URjF2TjBmSjBBTXZHNnZKdENJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFDb1AKdTFYdGxMY0ZwR29kVDhjUStYRnBFVVRPMURsU1pLRStUVmlxZUdmSnVYWEE2NzJWQVdpTjY4TTBOR3cvSnZUKwp2Rjc3c0dBdjRwanArM3ZNby9LV3FDdzZjbWoxZmRvOWxFRjg4SDdWZXYrMHQzQ2x6QzZyQmFBQjJjNU9MOXJIClVrYTZNVjBGV0NlWktEbnFUZkxGVjIwZHF3WnJscFZaWEZpRU1PUzhHMVNxRDIvMUtxYzc2WXRXdUFteHNIZ3IKTzFuU3g3WVk5MGpUQ1p3SDh0WTlCdjZzMURmbjRlQlk1VDhFZVJodUlGamFyV2dVMzFPT3NFTlNaUjk2UGdHbgpwZDV0RGdzU3pFN2grWGs5eml4a1lCemRiSXFFQTJNUHl0WkwxbHRMT1ZkeVRmbG5xQngyRnhLanM3RVczbkpPCm0wYW9MZDRqZFUrQW9OTCs5a3M9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWlRDQ0EwMmdBd0lCQWdJUVFBRjFCSU1VcE1naGpJU3BEQmJOM3pBTkJna3Foa2lHOXcwQkFRc0ZBREEvCk1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVQKRGtSVFZDQlNiMjkwSUVOQklGZ3pNQjRYRFRJd01UQXdOekU1TWpFME1Gb1hEVEl4TURreU9URTVNakUwTUZvdwpNakVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVeGxkQ2R6SUVWdVkzSjVjSFF4Q3pBSkJnTlZCQU1UCkFsSXpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV3SVZLTXoyb0pUVER4THMKalZXU3cvaUM4Wm1tZWtLSXAxMG1xclVydWNWTXNhK09hL2wxeUtQWEQwZVVGRlUxVjR5ZXFLSTVHZldDUEVLcApUbTcxTzhNdTI0M0FzRnp6V1RqbjdjOXA4Rm9MRzc3QWxDUWxoL28zY2JNVDV4eXM0WnZ2MitRN1JWSkZscW5CClU4NDB5Rkx1dGE3dGo5NWdjT0tsVkt1MmJRNlhwVUEwYXl2VHZHYnJaalI4K211TGoxY3BtZmd3RjEyNmNtLzcKZ2NXdDBvWllQUmZINXdtNzhTdjNodHpCMm5GZDFFYmp6SzBsd1lpOFlHZDFaclB4R1BlaVhPWlQvenFJdGtlbAoveE1ZNnBnSmR6K2RVL25QQWVYMXBuQVhGSzlqcFArWnM1T2QzRk9uQnY1SWhSMmhhYTRsZGJzVHpGSUQ5ZTFSCm9ZdmJGUUlEQVFBQm80SUJhRENDQVdRd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFEQU9CZ05WSFE4QkFmOEUKQkFNQ0FZWXdTd1lJS3dZQkJRVUhBUUVFUHpBOU1Ec0dDQ3NHQVFVRkJ6QUNoaTlvZEhSd09pOHZZWEJ3Y3k1cApaR1Z1ZEhKMWMzUXVZMjl0TDNKdmIzUnpMMlJ6ZEhKdmIzUmpZWGd6TG5BM1l6QWZCZ05WSFNNRUdEQVdnQlRFCnA3R2tleXh4K3R2aFM1QjEvOFFWWUlXSkVEQlVCZ05WSFNBRVRUQkxNQWdHQm1lQkRBRUNBVEEvQmdzckJnRUUKQVlMZkV3RUJBVEF3TUM0R0NDc0dBUVVGQndJQkZpSm9kSFJ3T2k4dlkzQnpMbkp2YjNRdGVERXViR1YwYzJWdQpZM0o1Y0hRdWIzSm5NRHdHQTFVZEh3UTFNRE13TWFBdm9DMkdLMmgwZEhBNkx5OWpjbXd1YVdSbGJuUnlkWE4wCkxtTnZiUzlFVTFSU1QwOVVRMEZZTTBOU1RDNWpjbXd3SFFZRFZSME9CQllFRkJRdXN4ZTNXRmJMcmxBSlFPWWYKcjUyTEZNTEdNQjBHQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01CQmdnckJnRUZCUWNEQWpBTkJna3Foa2lHOXcwQgpBUXNGQUFPQ0FRRUEyVXpneWZXRWlEY3gyN3NUNHJQOGkydGlFbXhZdDBsK1BBSzNxQjhvWWV2TzRDNXo3MGtICmVqV0VIeDJ0YVBEWS9sYUJMMjEvV0tadU5UWVFISFBENWIxdFhnSFhibkw3S3FDNDAxZGs1VnZDYWRUUXN2ZDgKUzhNWGpvaHljOXo5L0cyOTQ4a0xqbUU2RmxoOWREWXJWWUE5eDJPK2hFUEdPYUVPYTFlZVB5bkJnUGF5dlVmTApxakJzdHpMaFdWUUxHQWtYWG1Ocys1Wm5QQnh6REpPTHhoRjJKSWJlUUFjSDVIMHRaclVsbzVaWXlPcUE3czlwCk81Yjg1bzNBTS9PSitDa3RGQlF0ZnZCaGNKVmQ5d3Zsd1Bzayt1eU95MkhJN21OeEtLZ3NCVHQzNzV0ZUEyVHcKVWRIa2hWTmNzQUtYMUg3R05OTE9FQURrc2Q4Nnd1b1h2Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", - "key": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS1FJQkFBS0NBZ0VBbHR6YjcweXVMSXpndzdHWWdaRU9CS054Vm9zSGh0Mk9Xd29mYjA5ZllhMlYwdHFyCmdOS2p1TFR3RmhibnlPQTVieDZuSlRtYUNwMmVQZ3JmR3k5UUFtMTFLSU5YaWgxVU5sWVptWkNoTzBQOVNPYmYKN05kT2kxeFB0V2ZQeG85Lzdibk1oa3RDaXR5RUNkWmhyOUZETkhTSjRiNk1SRFpZNWowSlhqcm9jNzJxVUtVTwp1QXI2U3NFZkdTQ0NwMFdWem5XamlSU2xBNnVwSXJpTFBqeENFanJxTkJ5cFZGN2tSTFFoRUhNMEFKSjBmcVBICmlSNDVvZVh4cExONUcrR3gwQ0gvOVVJNzFjTTFNSGVORDVtZGY5RTU5TzVlNXk1SWp1WWg2akxqSUF0M29QVUsKVCt2UjRjd21tYy9jdVVkUEI0dXNvS2krb29HUW1Zd2FFYmE3ejJFOUhsK1N3S0g0MTVISFVzRFZiMkozU1lJOQpPUzNOQ1M0UEE2eGw3bkdUL3BPblpIV3d4bCtBaEpUUmhJcWtJejNESkNTc1JQQVQ4V1FncStpVUwvcGRCbWhVCmY2enp0VFA1dlZXSnZncWc5a0Y3Rk1RWEV4MjBVM3pSaE5sbnRteExvMS80aDMxUDZicWlqTFpEcXBxdEJPeTUKckxzQWszQ2F6bkVKTEVhUkhqNUxtOXVYeWZ2TXFZYks1NUt0Z3lueENUU3BVUnBnMWVGZlNrc0Q4VCtGRktjUQpMODQydXlyVEVvVnZ1TDVaUlcvNzJpV1hFZ2syb1FqdlNnWW1RZEZPMFFwdWtnSzIyNzZ0TVRyZWdHaU1MdFlQCm1ZaUN1VTJyeGczMVlzVHE4WWJXY3IvSFVRU2xiSng0WWZSakNvZ0hLSjVlZy84Y1Q3eC9ndTFMaFlzQ0F3RUEKQVFLQ0FnRUFpWTlOaEFBWmVVbmowTXpwVUl0aGl0MDFoVUkwVk1kRS9NSllNM2plY2dTRDdzV3hTRC9KUmF6RwpsbjNBVDZ3VThydXlrUURhOHY4UndXVE1WczluVnk5VGV1TjRPTm5SWmRKUWVYUWxjQkxvcTBiSnUvMy9BcGZqCm5uZlFQeSt0NktoWVU4UGdJeG83MDNTRmtubHZuQzcvWXJZSzFFL3g4ODZIOGtJb254QzhjZGh2ZVdXWkgvekUKVEhjV2Ewdko4MzNVNWpQSzIzUDFQMUdpdGRiZ01CdEVYc3dib25EOEY2RmYzTTRQQnM2RUpzMVVMalUvTzk2ZAozaDVBT2lvcnBxcTU1M3JEY0lFVXlPTFozdldsWlZ6MFNkL283VWVJcGJRMkRJVG1FTndqOHNJODZ1OE9hNk5wCk55c1FDbWw1S0ZvMXlERFYwdnZ0Uy9VeCtDRDFVaGJpS1JMZVM1U01oQTFKMjBNdVF4UjJTZ0k4Z1ZUSVo1bEkKQlpKOTJma3RlYUlrL1VkcU5hbEVVK2hYVk1qK2R6aG5NNWZqZjRtVnJ0TnRFZ1dwN2M2a0UwM1NiYyttWFRWaApMNTZHMWhhdEVZUUhwR0xBTDljQmpEdFlpbFNTU1VnSDNkeS83SzFSQVA5RlBXQ1JTMStCbUlEYmQ0YTZhRU9tCkNRU2xLVzRCaEVidlp6MmlSUTJFTWRvanJ0SlcvRXI4S2pMMXJYVWpIQm54Y1Flc2pNdGNTU1lmdUtxcWJVOUcKb3l2c1g0MVVZdDhMTDdwdkxhWXJuNStEN3p6OXBONDBSQnArUTNFYmVmVmZUYndESTdZL0trZXlTbzZIa1UzdAo0REVIcnZUTFBWT0o0cXdiUWpNcjRYbW1CUGNtM2dOaFJGSXl2VGt5cVNNV2tWblNVcUVDZ2dFQkFNWmhmL2NHCjNiSVVodWVRa1NWNTc3aXAzTFlkMWxnYUhYbjZ2SXp3NmpDb2JuWkxKRCs0bDJXck9PSkpzNHQ5bWhHMncreUcKSE5qZkVIT2VLVUs0NHQ4bDd1b2VPTnZ0VFQzV2YzU21wZFBsdTZESFE3d05rWUFNSXVxTWVUSDRxc21HVkNWVQp6dDd5YkM1eW5DOVhQc09UWExPSm9aeUxQWDl0eGNGOGJ3ZExadm9jVzVoQk02OThiTWY1OG95S0VDSzh4QW5nCnl6UUFPbUcwMm5HS1BYSGlRUWtGS0tpV2N6d1M3MTVuYmc3S1R2NzByNDZ4K1JIL0g5RkJ5TjdsekJPM2NWclMKZ1JuT09OSlVEd0RpbXZQMHFrSW9xcWtYeGRXbTRHK01TQkZYQ3dGVHhGWWwvL0c5cWdsMmtmaW1SMXdadmdSKwp3RnB0dFhlSkoyaXBMNWtDZ2dFQkFNS3VMTVNlbzhEN2RGTkdvVlh6Y3ZpYzAyNExncXJpNUFUMk0yeFFSRlpHCkVoZGFBaTEwaGxHNC85NWlYckRwYVYxRTRaQnBLUE9NNHVOaVhiRUE4VFJsa0hKRS8zSVZYdHJiRmxTUGF2MkMKa1poL2Uya3BDSnMrVkFFYjlJOE9OQVlFS2Z0WFE0WkdEazg3K1lQOWpIak9jcms1OGo3Y3hZZXlBVFl0SHd0cwppU2tjaFZkc2FCVjAyY0FqUDJKMVZIZHpQVFlYNjM2VllWeHRrUUxUYWl2VHFWTVIvN0QyQlJ6bjd1bGhPb3VPCmNwNVBIYjl2TFdMQmFoWi9CMjhVeWp6ZSs1NUsxNzBzbmpseCtkQ1BsejNtTmpIcTBESTNvMytQK0c0VVlwTlIKbkRWNC9YZjB1VXExSjhOWE9SMXJIMTZlUGVlWThjeDlMRXNETlJ0STVNTUNnZ0VBTEZvSC9mWnZBaTFNcStESwpVcEtjWWJDNFE0OFFLTXBONU1PRi9BeXdqd2haQ2VGcXpVUTd0T00rNkhpSng1bmhKQ3kwU09FQytnbUU2QlJvCkxSNmd1anNFMnhxK280eStSQ0Q4aGR2c0h4K3hmeFNOdERGa1lqaFVaaFBaMUs0L29LYURrWVVRYXcvUDErS1AKd0pYRTFuelBzT1FJV2JOWG9IR3VVTCs5SXVoY3NYWTlsQ0NmcVpBcjBkbXp2Ry94ZzVLb1VYME1jU2ZMNWFSRgpZalVCMzhBeHdnNkJOSS9PVzVQd0tDNy9rQmJ5NmxWU0dwajNrbXB6ZHBrNmkzcmMwVnVsNENSSDhMa0dReCsvCjZ2YStwZVFCWEtFeTVuTUdLK29QSzJFMWk0cm1Udm1uWDR0SFdZaUp4MnZXM3J4dUg4MHhpbGU4TVh0dG9yZnIKTTU3L29RS0NBUUVBbmxkOElnL0ZzTmpVckVidVFqSlllTTFWU2xRaVcwdGZtb21GR2J2UFdUeDB5bmx5Ky9XaQpxaVdHTnlKYlVoa0drYzNNaU9CL1psaFkwZ2pYbTNmZ3QzVkVIeXp2ZDZMYUc3ZkdXZENzZkxVT0pyTEpkYWJpClVTSkl3UDR6MDRjQjJVTFp3b3dmWjc3ak5KN2JPdmVtb1R1SkpBNTFjWnV2TGNjaUpTWmQ4YlM5ZXFxdjZZTksKeE9qZGt1RVlWTVNKaHY0Nzh4dFJkd3VZdk15QS9ZTm0vMjZRY2ZoWnQxemltN2dwSWJqckhVY25Bb3ZtN2lWSApET096bmNpRUMxMGxnSXo4cXFyRS9pQ2tNS1Q3UXg4SExGbHFDditwaHE2cVZMNk1tVHdMVVRjM2ptWnlBbmNSCm5pbnB4WC9UL0pGOFdrRHFxTXhGSHNWUW1WSnFoMTZxY1FLQ0FRQW9ISHVQUTVvR1F3dGlnSzFzcXR6Ym54S0oKa0lDMC81SEU1M3JmbzBNVmVwQXhvL0x3WmlZMDYwZDJRVDBiRTZkTDFDNWJuQ1p5V2ZPQmxCVi93OWxpZi9CUgovNDZsbTZvdCtTampKbFN0aGliSWtKZ1FxdCs2R2t4L0dwR2VhTmJnZ09qaUpVczE5SHVPdHpDQ1Z4clRJT3ZXCjJoblhEaVYxYVRKRVdUR3BscDVEUGdCcFdweVFoWVZDVldmVUdMR0V5NnR6UkR0SjZNd3ZmZWlwUlV2aXZyQ1MKRTNmc2U5MkNxWkdQZjU4WE5BMnZIcXFiU3JTazZ0eGdjRS9mZSs4dmZONEwraGw2YTIrMFdsc01KMUxNQ3RqQgp2U08yNlFHQzFuekF1TVVVRC8xN21wd0JZeC9nNDZ0bTUxSTgxcEtlU1ZVeTlvdVNIOHhqUGVnZGY4QUIKLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", - "Store": "default" - }, - { - "domain": { - "main": "apietl.dataverse.org.ua" - }, - "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdNekNDQlJ1Z0F3SUJBZ0lTQThzcjkzSldmZ0hEWTFRODJhaEhKYytTTUEwR0NTcUdTSWIzRFFFQkN3VUEKTURJeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFNWlhRbmN5QkZibU55ZVhCME1Rc3dDUVlEVlFRRApFd0pTTXpBZUZ3MHlNVEF5TWpVeU1USXhNRFJhRncweU1UQTFNall5TVRJeE1EUmFNQ0l4SURBZUJnTlZCQU1UCkYyRndhV1YwYkM1a1lYUmhkbVZ5YzJVdWIzSm5MblZoTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEEKTUlJQ0NnS0NBZ0VBdWxNbTI4d2RuS254aXZISWYrYVF1WWZ0WlcwcHJOdS9RUlJRS05mcmM0cFVaR2lqS2diNQpoN2FuRlMzcERLOUZDcnJtSXdZQmdlRFQrZXdpUU94elJkTXhWRlRudXpueTJiU2VISS9TTnZoQXFieU9BMkRSCmhhL3AwZEhmSGZqaG96d3RoR29LVVIwdHhkeDFPaGZsZnZ4dkxFT3ArblBHbU1ncWl2ZFBqSnlKVmRWaHozQk4KL0lwaXJEeHFwaWQvR0NoVVhEK0swRk5ycUFxbXJwczNuKzZVWGlTdndVL1M3U0s1cXdGbkpBcHcxVCtLLzh6VAprRnZtNFRPRVF1T3dKNjdqSVBqNnFzc1NhZ2VuTkthV2ZMTE9jOHlXMTFjQS9FRWI3ZkZmemdGeHJFaHo0WlNKCjBibTd3MWRxU2VXU05GVlRNbDQ3aWl6YUZYY2pKbzFZdFFJLzFaekJGeXpjSGpQYThOaWZUVVNySWtQcXFORDYKSFFnRmtKL1dxS3RtWTBtanMxM0c3TC9HVjdBcVRlNkQvTTJUUHJnbWVlU1EwSy84QjZEQndrZTd2OTEwNi9YagpPNXY1eDY4dmZ3NWVJZ3MweW1FcEgzbEZiWTRyYnhQSHoydW1BUUF6Sm01SWQwR3daT2gwY0NwdWVMeVVYc2o1CkxseXIxdVhYS3hmV1Fxc0Y2cncyTEV5dTY3MTh5cUtYRjRjRDR2MTd1UnlpeFMzeXJwM2hQQjhON01pTDBYU0kKUXBGeUFjcy9TUjRabEdGUnZoWUZHMlcyWmtOT2UyMEZvQngwVzVZWCtzeEdiZHlwOHN2Nlg2d01MRXFmZFFWWgpUdldTOGhDdDdtMDVJVWpKemZVcVdpVGk1dTYxemZqa2t6bStJSXhEZFJ6aUpicWdtQWhnVno4Q0F3RUFBYU9DCkFsRXdnZ0pOTUE0R0ExVWREd0VCL3dRRUF3SUZvREFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQVFZSUt3WUIKQlFVSEF3SXdEQVlEVlIwVEFRSC9CQUl3QURBZEJnTlZIUTRFRmdRVUQ5V293Q0FVRTZUZU8yeUlJd0taWjZ4RQpNQkV3SHdZRFZSMGpCQmd3Rm9BVUZDNnpGN2RZVnN1dVVBbEE1aCt2bllzVXdzWXdWUVlJS3dZQkJRVUhBUUVFClNUQkhNQ0VHQ0NzR0FRVUZCekFCaGhWb2RIUndPaTh2Y2pNdWJ5NXNaVzVqY2k1dmNtY3dJZ1lJS3dZQkJRVUgKTUFLR0ZtaDBkSEE2THk5eU15NXBMbXhsYm1OeUxtOXlaeTh3SWdZRFZSMFJCQnN3R1lJWFlYQnBaWFJzTG1SaApkR0YyWlhKelpTNXZjbWN1ZFdFd1RBWURWUjBnQkVVd1F6QUlCZ1puZ1F3QkFnRXdOd1lMS3dZQkJBR0MzeE1CCkFRRXdLREFtQmdnckJnRUZCUWNDQVJZYWFIUjBjRG92TDJOd2N5NXNaWFJ6Wlc1amNubHdkQzV2Y21jd2dnRUQKQmdvckJnRUVBZFo1QWdRQ0JJSDBCSUh4QU84QWRRQkVsR1V1c083T3I4UkFCOWlvL2lqQTJ1YUN2dGpMTWJVLwowek9XdGJhQnFBQUFBWGZiUi8zcEFBQUVBd0JHTUVRQ0lCckZCWTVaZE8zdUZvVitNVm1OMGh5TVJvb21GUVl4ClJGNHJuNGJidkk2akFpQldDQmZVSzU0b3VKS0dFblB0NHgramFnVkJ5OWdOZTZQWUFlWEZ3WTB2endCMkFIMCsKOHZpUC80aFZhQ1RDd01xZVVvbDVLOFVPZUFsL0xtcVhhSmwrSXZEWEFBQUJkOXRIL2lJQUFBUURBRWN3UlFJZwpGY2E5S1JNaEw3TExyTzZmYjA1aHhQeUM2eit3RmlEeFJaZkVPUGYxQ09rQ0lRQytEVTNKNTFqa0YwSEVIS0crCktDbHBpVFlIWlVLMGtBb0FJTCszTGJsb3BEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUF1YXJVUElxWnhyeS8KMEsvMUR6WEQyU0VWNnZIdG1YRXY2UHNFVS9WS1FvcHRtUFNhS0NVQUxHRWlDKzA2NnFqVFZyUVBVSDlFQjJneQpQOE41Y05KTEF2VVExVHI4MExLSytidmJ4MENIbnNNT0szcmdXM0FNNmw1Uk4wajJuRTA2TnlEcDA3QXRtVDdrClh5SjdtRUlFWXF4Mm45ZTgvWnFHTHFWT1B6STdFdHVkby9oeGtFQ2NtNEpzMkhKblJ6cTcrN3hORDJXaUtCUWgKKytaM1Q0UFU0WXBRMmRQbCtHVG1VaXJqVE45UzRBWFV5MG9aWlpMVjIzS0llWTRsaWY3bDZVQTlwQjArQ3BJRQpEZTN0OVBNalRLb29KZEUrTXZXUTZVaGIwSjk1b3Ard0NtOHdzbFZUZGVIaXJSTytKMWJ6YlhHbXFvSlJUNXVUCmN2NmRYYklBUFE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVpUQ0NBMDJnQXdJQkFnSVFRQUYxQklNVXBNZ2hqSVNwREJiTjN6QU5CZ2txaGtpRzl3MEJBUXNGQURBLwpNU1F3SWdZRFZRUUtFeHRFYVdkcGRHRnNJRk5wWjI1aGRIVnlaU0JVY25WemRDQkRieTR4RnpBVkJnTlZCQU1UCkRrUlRWQ0JTYjI5MElFTkJJRmd6TUI0WERUSXdNVEF3TnpFNU1qRTBNRm9YRFRJeE1Ea3lPVEU1TWpFME1Gb3cKTWpFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1REVXhsZENkeklFVnVZM0o1Y0hReEN6QUpCZ05WQkFNVApBbEl6TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF1d0lWS016Mm9KVFREeExzCmpWV1N3L2lDOFptbWVrS0lwMTBtcXJVcnVjVk1zYStPYS9sMXlLUFhEMGVVRkZVMVY0eWVxS0k1R2ZXQ1BFS3AKVG03MU84TXUyNDNBc0Z6eldUam43YzlwOEZvTEc3N0FsQ1FsaC9vM2NiTVQ1eHlzNFp2djIrUTdSVkpGbHFuQgpVODQweUZMdXRhN3RqOTVnY09LbFZLdTJiUTZYcFVBMGF5dlR2R2JyWmpSOCttdUxqMWNwbWZnd0YxMjZjbS83CmdjV3Qwb1pZUFJmSDV3bTc4U3YzaHR6QjJuRmQxRWJqekswbHdZaThZR2QxWnJQeEdQZWlYT1pUL3pxSXRrZWwKL3hNWTZwZ0pkeitkVS9uUEFlWDFwbkFYRks5anBQK1pzNU9kM0ZPbkJ2NUloUjJoYWE0bGRic1R6RklEOWUxUgpvWXZiRlFJREFRQUJvNElCYURDQ0FXUXdFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJBREFPQmdOVkhROEJBZjhFCkJBTUNBWVl3U3dZSUt3WUJCUVVIQVFFRVB6QTlNRHNHQ0NzR0FRVUZCekFDaGk5b2RIUndPaTh2WVhCd2N5NXAKWkdWdWRISjFjM1F1WTI5dEwzSnZiM1J6TDJSemRISnZiM1JqWVhnekxuQTNZekFmQmdOVkhTTUVHREFXZ0JURQpwN0drZXl4eCt0dmhTNUIxLzhRVllJV0pFREJVQmdOVkhTQUVUVEJMTUFnR0JtZUJEQUVDQVRBL0Jnc3JCZ0VFCkFZTGZFd0VCQVRBd01DNEdDQ3NHQVFVRkJ3SUJGaUpvZEhSd09pOHZZM0J6TG5KdmIzUXRlREV1YkdWMGMyVnUKWTNKNWNIUXViM0puTUR3R0ExVWRId1ExTURNd01hQXZvQzJHSzJoMGRIQTZMeTlqY213dWFXUmxiblJ5ZFhOMApMbU52YlM5RVUxUlNUMDlVUTBGWU0wTlNUQzVqY213d0hRWURWUjBPQkJZRUZCUXVzeGUzV0ZiTHJsQUpRT1lmCnI1MkxGTUxHTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFqQU5CZ2txaGtpRzl3MEIKQVFzRkFBT0NBUUVBMlV6Z3lmV0VpRGN4MjdzVDRyUDhpMnRpRW14WXQwbCtQQUszcUI4b1lldk80QzV6NzBrSAplaldFSHgydGFQRFkvbGFCTDIxL1dLWnVOVFlRSEhQRDViMXRYZ0hYYm5MN0txQzQwMWRrNVZ2Q2FkVFFzdmQ4ClM4TVhqb2h5Yzl6OS9HMjk0OGtMam1FNkZsaDlkRFlyVllBOXgyTytoRVBHT2FFT2ExZWVQeW5CZ1BheXZVZkwKcWpCc3R6TGhXVlFMR0FrWFhtTnMrNVpuUEJ4ekRKT0x4aEYySkliZVFBY0g1SDB0WnJVbG81Wll5T3FBN3M5cApPNWI4NW8zQU0vT0orQ2t0RkJRdGZ2QmhjSlZkOXd2bHdQc2srdXlPeTJISTdtTnhLS2dzQlR0Mzc1dGVBMlR3ClVkSGtoVk5jc0FLWDFIN0dOTkxPRUFEa3NkODZ3dW9Ydmc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==", - "key": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS1FJQkFBS0NBZ0VBdWxNbTI4d2RuS254aXZISWYrYVF1WWZ0WlcwcHJOdS9RUlJRS05mcmM0cFVaR2lqCktnYjVoN2FuRlMzcERLOUZDcnJtSXdZQmdlRFQrZXdpUU94elJkTXhWRlRudXpueTJiU2VISS9TTnZoQXFieU8KQTJEUmhhL3AwZEhmSGZqaG96d3RoR29LVVIwdHhkeDFPaGZsZnZ4dkxFT3ArblBHbU1ncWl2ZFBqSnlKVmRWaAp6M0JOL0lwaXJEeHFwaWQvR0NoVVhEK0swRk5ycUFxbXJwczNuKzZVWGlTdndVL1M3U0s1cXdGbkpBcHcxVCtLCi84elRrRnZtNFRPRVF1T3dKNjdqSVBqNnFzc1NhZ2VuTkthV2ZMTE9jOHlXMTFjQS9FRWI3ZkZmemdGeHJFaHoKNFpTSjBibTd3MWRxU2VXU05GVlRNbDQ3aWl6YUZYY2pKbzFZdFFJLzFaekJGeXpjSGpQYThOaWZUVVNySWtQcQpxTkQ2SFFnRmtKL1dxS3RtWTBtanMxM0c3TC9HVjdBcVRlNkQvTTJUUHJnbWVlU1EwSy84QjZEQndrZTd2OTEwCjYvWGpPNXY1eDY4dmZ3NWVJZ3MweW1FcEgzbEZiWTRyYnhQSHoydW1BUUF6Sm01SWQwR3daT2gwY0NwdWVMeVUKWHNqNUxseXIxdVhYS3hmV1Fxc0Y2cncyTEV5dTY3MTh5cUtYRjRjRDR2MTd1UnlpeFMzeXJwM2hQQjhON01pTAowWFNJUXBGeUFjcy9TUjRabEdGUnZoWUZHMlcyWmtOT2UyMEZvQngwVzVZWCtzeEdiZHlwOHN2Nlg2d01MRXFmCmRRVlpUdldTOGhDdDdtMDVJVWpKemZVcVdpVGk1dTYxemZqa2t6bStJSXhEZFJ6aUpicWdtQWhnVno4Q0F3RUEKQVFLQ0FnQmExU0NUZEUxWFMyM0tTNVp2NjZuUUdKaTlvbHIzdnVUY3lCZFA0ZnNSaDNVZXdmZ1JDL2RubHI2YgpUNWRXTExlZXhJQmV3SlhKaUI0dXIxUC9qSVdobTVSbnhVQjNBSWdJWThuVXFMUlZRZTdjRUdTMjl1TU5walY1CnFUTjQvQlNickVHUVZOV1V0NEhSL0doVm1zS3hoa1I0TXNCUnJWRTZ1Qkl0VHVWRDZpZjFaU0hhcTZnSkhqbCsKTjdIU01GMEFIT0VMVzVyRGRuZDhJejBneitCdElqVElOR0JPQUNrV202QWg0bnd5a0xoeTdSaEpIY1Joa3J2YQpPM0FWMzhQSGhMV0xKSFdtLzNxSm9CTitVbHY0akg2aTZ6RDU1NXMrWGt0TVV5aGVXRXZmTGk3MzRKN1RWQlZaCjVHcVhmY2dwcFJMNjhmOWFuQVR4QS9ScDNleEk4NmYwelgrdmNTWnhmSDZQeFZFekl3OEc2UWE1QXJiRmwwdWoKTnlKYUlrOG9zWXE2UXpFeGZtZTdJZDJBSVJwb2hmaUZNMUY2U2pqMGJiakkyQjE5NXNaVlcvS3pQMFBrK1RtQgpPaVRMb0FQTEUzRjBCVFBLNWJncnZzOGROUkg2Z3JaUnpqenRZRXJIS3BFT1JQK2tUREcycy9HRUVWQWpaQnFjClhRdnoyWGlUVU9tcjNubjJpNzUwZEJUVi9JUHFmMlp1bThzVE9TSnpVeFc2bFY3am5zZHczYUx0cUh2QUo1K1kKbkhPM2c0cjZlZ2daQTRPM2R6UllsMG12S0NNS2hLNEJWYzlrZFRMLzd0eXk5MjRkdzFzYnJqOHVXa3h5cXlXRAp2a2xCVFp6RzJzaUg0bHZrZjB4UXVhampYNFVhYkdYUkJzVmRWN3ZTR3IzL0dBUWFNUUtDQVFFQThsc3NZK282CkxKNHF3Tm8zSEM3a3EzNW5XODQrRUpQYTF2RldzZHBqK0hFelI1T3NjTFMvSy94VmJGK1YwZzJpejlkcjdCdEQKN1NVRUFiWWJiaHB2MmlBYlowUkdKeXBDdjFzT3N4QitobmNJVThlbGFKbHJtUlNsWGtqN1QvaUcyUFhhUllVTwpGTnMvaXg0N3Vyd3pzY3NFcWxWWENsQjN0VkwxekRmdnVNcW5tYW5EbTJ4R20vRGZXcCtCaE5kdkVSdkpvRlJxCkFmYXovMmVRcStjUEtTSkg5UGdvRnMrUkZuUk95bCtTU2ZBaTVpWTBMajloZTN6V0NBRTU4YUI1TzJOVHEzci8KRmJHUUx1STBJS3VFQkg1UFVJZFNmU3JPa2FvV2tjbGlNWFJDWU4zN3haZldZcFFuZDBvQng4THBkZnVKcldtKwpDNkZUeTF5eTZIMmlwd0tDQVFFQXhOQjFCLzFUTnZSQW51ZUlBSFd4Z1NTak1ENnlBWERiWlRWUW42WGxoS0FsCjRkODIvc3l6cW8wMElhc2Q2cWFQTVdJM0dpbXh6Rm01dTY5UFlYZ3k0VGJmYk9jYTI3dnhaSmZIcUxkTGJZRmMKa0s0c0h3QUdYUFQwZFRBcS9jMzlJSkpTMTlNYjlBdytVQndnUkpqS3J1YWdFbmdFV1VXVTlVTnExNlJ1MjZIcgpRNE1TbHhVaEF1T29vNUN3NVJFdURBUzRlc3VhUzFveWJDbEVocUpuWUZxSEJMSmRPYmVBbFdFS0tHNG9UOEZDCjFyWWNka2dhS0M1YytoVnBSbDF5US9yZ0lHT2NFM2hLbE4wTldIU1FoKy9ScXdaK2RXakpZODNRc0NPbTBpYnQKWVdwczY5dXlTN0FrbUlwOGZGSEwydUlQWXNrY21yd3BkQi9JWkFJeHFRS0NBUUVBc0VxUjU3d2h4UUxvcHBBVgpObk1GODVsbkplaklUTmJBZ1VuY2ZsTVdGVXFDdXJZNDRXTVpESzNvbFlTU1B0R2NkUU9HaGFEdnNEa1V5UW5tCnVoaVE5R0lXak8raytDaE5sVlJ2Uk9IaXAzMCttWExJWjJYeVZ0QWwyb2ZNQjBnSkR4a0hSVHFjRzUvQWdUbmsKeU5qTjRhNkVIa01scFdNVE1OcS80V1Z2QTBTbTFhZ2ZtWmNSWmEyNVN2cHNCRzJSWlNpSmFnNzliYUEvSHJILwpFb3hwQXNyay9OVG1sSEU0WU5VSjJ6dlo5ZDZ3QkNvV0d1NFB3dnZ6MUs3UHIydkR3K2RrbllCQ3ZVMEVUSlpPCnhOVCtteVltRzdYVDB5aW9TbDBuUGJUM3NIR1pOMDFDTDJGYm1TbWI2N0h4eVpXR3JVUGp5amo0L1F6RkgxQzIKODFjd1VRS0NBUUJWWFBpMW0ybGhWM1ZEdHJabFJLYlZsWmQyRUd0U2RxbWg3d3JtQTZWVjdjUWdnSmt3MElaSQp2ZS9UZm8xK1BmbXplSjdmcVIvbHV6RDB0NmZkWmEzand0SUxRUDJFT3JNTFowMkEzdWRIT3FsMFV5YnQxeXZyClc0OC8yTUY4emNBeFJXWExHRlJ5ZUhENmZBaCsyQ3BveTd5MzVmZzA1Qm9rZXJZM2k2bE5kNkE3NnZqQU1MamQKc1BKdTV3M2lmSjRWTm1MeFY2ZTNjUXFYb1JxSXJwM1p5OG50L3BLeXV1VjVaTnBzQ01OUlBFaUtLZmlVVU5lUApmL1J4djZHbWxGZEFKdXJaQVhzcmNxd2VmdllQM0pibmJ0dm9xdXRrYnl1U0x5MkppQjBOM3pac1h5V1k4dlFWCklmUHRlWHRlekhkM216OERJS2xZYjY0bklMWGdzcGJwQW9JQkFRQ1J3bjdUajVsV0ZRYXZNeG1NN0dJelYzajgKUEV3QUNGV2V1aTVzZHBqbUhWWk53d3QxWEJTK2hydTc2OVAyV2NQOHRlN3M0SWpVeVVUbWovQitkeFN2dWQ4agpkN2VoSTQxU0pXTXB0b2pqRDNuOThKS2srdWdlK2hjYlk3c3dZZDBLd09yZjlnN3Z3KzlNN2ZhYU52WnFjZUcxCmZJVGp5NDF6VHlnQXBPSWZtd3VtZWxubFVZWmRxbEZoLzQ1TTBKUVV4R2x1U1dtbmllajVJTmJxdzQ4TmxhVTkKU1dvdUZvT09XclcrOXNlV1RZTTFCOE1rbEphbjhXMWZRdzlKTVYyUkRXazJoeGVHUjh0c1Q0azAwYXFyTnJHKwo3L2xrK1JuUTNyakp1MXlHSlkya2ZFcnJkakZjTkg4M29ZMUJ2Z3d2YXlKSWdYUEZtd3JvaSsxZGJaNk0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", - "Store": "default" - } - ] - } -} \ No newline at end of file diff --git a/distros/workflows/var/security/letsencrypt/acme.json b/distros/workflows/var/security/letsencrypt/acme.json deleted file mode 100644 index a5e28dc..0000000 --- a/distros/workflows/var/security/letsencrypt/acme.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "myresolver": { - "Account": { - "Email": "team@coronawhy.org", - "Registration": { - "body": { - "status": "valid", - "contact": [ - "mailto:team@coronawhy.org" - ] - }, - "uri": "https://acme-v02.api.letsencrypt.org/acme/acct/113781916" - }, - "PrivateKey": "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", - "KeyType": "4096" - }, - "Certificates": [ - { - "domain": { - "main": "kafka.dataverse.org.ua" - }, - "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdNRENDQlJpZ0F3SUJBZ0lTQkFEM1pKSnJSVWpvT2ZRREZ1Wi9ldjBYTUEwR0NTcUdTSWIzRFFFQkN3VUEKTURJeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFNWlhRbmN5QkZibU55ZVhCME1Rc3dDUVlEVlFRRApFd0pTTXpBZUZ3MHlNVEF5TWpReE16RTNOVGhhRncweU1UQTFNalV4TXpFM05UaGFNQ0V4SHpBZEJnTlZCQU1UCkZtdGhabXRoTG1SaGRHRjJaWEp6WlM1dmNtY3VkV0V3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXcKZ2dJS0FvSUNBUUN0NXNHZ3FDZ1NOV00rcUIxaytiZysyNVNTL1VUdTBSR3lRd25XOWNGQWxydVBMenI4dnl5QgoxZ256STNpZWJQdEh1bTJwQUN1RXluOUY3L3JhOUFYK283a2k5MEpXY0phYWs0Um9Rbk4wd1ZlVlJCa2tucmp4ClhNWG40c2duUms0R3RvRHpCUU8rcWV4ZkJweVBMbVk1am52b05OSmhDN0syYUJaV2I2T0J2NmFaYnlSYm1SaWkKSTJOKzdTUGtQeGpDeVN2UE5XeHJJK2FjYXlEMUsrWGxaRTVvanlLUUxlMy8rcGk0cVJ5T29pTzNkb29qWFVVegpLVnFIMEQ3U2R2eklCQ2N0U1ppL2ttNlNFOFZPbkMrR1VvcklwK0NTU0x6TnY1cFdPYzZIdXBzazRpb0J4TGFkCkVqUkdMai9jbW5ZS09lc2Nzd3E2b2dMcGxpNlB1eXkvbktqa0c0K051ZDBiM3pNZEVJK1VoNHpEbzEzYmJOVmwKajI4YzVXeDRJMDg0MUhSalBqZTJEV2hkSk5rc1lqZHZZVW9kTUU0bUwzenFNWFFFQUEzWGZiRmJwbzQ3ejBBbwp6cWFML244TEMxUHRjMDFPSTdQUzdjOWR2aXR3R2lnYVIrcVU3SEd1em45VGdsVXJ6TlkvWkUvbGhzVTVBLzZECjIwOG82S2N2N21aUGpnM3AxSGdEeHhYRDJ3czNrT09IVGxOclhjaXlNSHhhQkE4eTN5bTY3VFl0R2V6YWhsS0QKU3owSVhnWlBTbFdJbUVtWERaQmVQTmcvRWhrREhZKzVZYlo3WWdIVDVicWFKM2srRnpPTzNLa09vTnpCQXUvMwo3aG5DNU1ETStQUS9iQmlzUC9CL3JHcm0rcm5oVDBjU3FoREJwd3pLZHhNWGFvcDNINXNDdHdJREFRQUJvNElDClR6Q0NBa3N3RGdZRFZSMFBBUUgvQkFRREFnV2dNQjBHQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01CQmdnckJnRUYKQlFjREFqQU1CZ05WSFJNQkFmOEVBakFBTUIwR0ExVWREZ1FXQkJSc3VXYS9YRU9hZFVhY1pLRE9WUHd2L0VLMAppVEFmQmdOVkhTTUVHREFXZ0JRVUxyTVh0MWhXeTY1UUNVRG1INitkaXhUQ3hqQlZCZ2dyQmdFRkJRY0JBUVJKCk1FY3dJUVlJS3dZQkJRVUhNQUdHRldoMGRIQTZMeTl5TXk1dkxteGxibU55TG05eVp6QWlCZ2dyQmdFRkJRY3cKQW9ZV2FIUjBjRG92TDNJekxta3ViR1Z1WTNJdWIzSm5MekFoQmdOVkhSRUVHakFZZ2hacllXWnJZUzVrWVhSaApkbVZ5YzJVdWIzSm5MblZoTUV3R0ExVWRJQVJGTUVNd0NBWUdaNEVNQVFJQk1EY0dDeXNHQVFRQmd0OFRBUUVCCk1DZ3dKZ1lJS3dZQkJRVUhBZ0VXR21oMGRIQTZMeTlqY0hNdWJHVjBjMlZ1WTNKNWNIUXViM0puTUlJQkFnWUsKS3dZQkJBSFdlUUlFQWdTQjh3U0I4QUR1QUhVQVJKUmxMckR1enEvRVFBZllxUDRvd05ybWdyN1l5ekcxUDlNegpsclcyZ2FnQUFBRjMxR2RhSlFBQUJBTUFSakJFQWlBQTBBcDV0MkRob3lCcCtWVDN1dmIwSW9kajhNWWwxanFLCmtQMXlvTU1DTXdJZ0pjZW1ydVl0SnV6bXhyTnVBdjIyQVh4NDBDU3oydTFmQWtyTERHMDdPeGdBZFFCOVB2TDQKai8rSVZXZ2t3c0RLbmxLSmVTdkZEbmdKZnk1cWwyaVpmaUx3MXdBQUFYZlVaMXBDQUFBRUF3QkdNRVFDSUVJdQpMVGxhSnJ6R1lrdGhmWUczL00rR0djVGJMdFZ3YU5sTFdSUi9CeHowQWlBbEwrbmNnYUUxT3JuZHV0NkQ4SkdNCkVSTTFwdTVqQzloZjdLczNhZlpzMmpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQU5zY2pNZVRyNDRpVlZXelkKLzBDSi9YbFZiMHd4d1lGSlZ5R2k0RzNURU9nR1N2TzVIbVJ6TWNaemNIL2NDZDhUNU1maHl6THdORWpuOFlJRwpCT1BheTlUWlR0NmkzRHNUYmxnYXhXSGVJODhYSmhtVG9Ub1l4TkUraGM0NzZ2WHNRclBmNWZabEhiNlRjcnJhCldBTTdwcTgrNzVZWmQ5Sk1RWG1qM3N5aGxIenlCMlFZREhtbm1nME9sUS9xeHZrQ1hGSjl4RHZ5eGR1Q3QvQUgKcVR6dUV1b2o0R1Evd1ViN29Vc3JoWmxsa1hEZzlPbHVpTVVtRTR5TFlvR3h6Q3NVMEdDYnZkUU5TZFJNUXk0cQpSenY0NUhTK1FSRDhoM2lNRWphZnJZOUdSU0ZISjdORWFBUGlMdFZRQlhoY3YrM3R1K1d0aXpBcVh0Wm5ZNWdPCkRwSjhsUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWlRDQ0EwMmdBd0lCQWdJUVFBRjFCSU1VcE1naGpJU3BEQmJOM3pBTkJna3Foa2lHOXcwQkFRc0ZBREEvCk1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVQKRGtSVFZDQlNiMjkwSUVOQklGZ3pNQjRYRFRJd01UQXdOekU1TWpFME1Gb1hEVEl4TURreU9URTVNakUwTUZvdwpNakVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVeGxkQ2R6SUVWdVkzSjVjSFF4Q3pBSkJnTlZCQU1UCkFsSXpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV3SVZLTXoyb0pUVER4THMKalZXU3cvaUM4Wm1tZWtLSXAxMG1xclVydWNWTXNhK09hL2wxeUtQWEQwZVVGRlUxVjR5ZXFLSTVHZldDUEVLcApUbTcxTzhNdTI0M0FzRnp6V1RqbjdjOXA4Rm9MRzc3QWxDUWxoL28zY2JNVDV4eXM0WnZ2MitRN1JWSkZscW5CClU4NDB5Rkx1dGE3dGo5NWdjT0tsVkt1MmJRNlhwVUEwYXl2VHZHYnJaalI4K211TGoxY3BtZmd3RjEyNmNtLzcKZ2NXdDBvWllQUmZINXdtNzhTdjNodHpCMm5GZDFFYmp6SzBsd1lpOFlHZDFaclB4R1BlaVhPWlQvenFJdGtlbAoveE1ZNnBnSmR6K2RVL25QQWVYMXBuQVhGSzlqcFArWnM1T2QzRk9uQnY1SWhSMmhhYTRsZGJzVHpGSUQ5ZTFSCm9ZdmJGUUlEQVFBQm80SUJhRENDQVdRd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFEQU9CZ05WSFE4QkFmOEUKQkFNQ0FZWXdTd1lJS3dZQkJRVUhBUUVFUHpBOU1Ec0dDQ3NHQVFVRkJ6QUNoaTlvZEhSd09pOHZZWEJ3Y3k1cApaR1Z1ZEhKMWMzUXVZMjl0TDNKdmIzUnpMMlJ6ZEhKdmIzUmpZWGd6TG5BM1l6QWZCZ05WSFNNRUdEQVdnQlRFCnA3R2tleXh4K3R2aFM1QjEvOFFWWUlXSkVEQlVCZ05WSFNBRVRUQkxNQWdHQm1lQkRBRUNBVEEvQmdzckJnRUUKQVlMZkV3RUJBVEF3TUM0R0NDc0dBUVVGQndJQkZpSm9kSFJ3T2k4dlkzQnpMbkp2YjNRdGVERXViR1YwYzJWdQpZM0o1Y0hRdWIzSm5NRHdHQTFVZEh3UTFNRE13TWFBdm9DMkdLMmgwZEhBNkx5OWpjbXd1YVdSbGJuUnlkWE4wCkxtTnZiUzlFVTFSU1QwOVVRMEZZTTBOU1RDNWpjbXd3SFFZRFZSME9CQllFRkJRdXN4ZTNXRmJMcmxBSlFPWWYKcjUyTEZNTEdNQjBHQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01CQmdnckJnRUZCUWNEQWpBTkJna3Foa2lHOXcwQgpBUXNGQUFPQ0FRRUEyVXpneWZXRWlEY3gyN3NUNHJQOGkydGlFbXhZdDBsK1BBSzNxQjhvWWV2TzRDNXo3MGtICmVqV0VIeDJ0YVBEWS9sYUJMMjEvV0tadU5UWVFISFBENWIxdFhnSFhibkw3S3FDNDAxZGs1VnZDYWRUUXN2ZDgKUzhNWGpvaHljOXo5L0cyOTQ4a0xqbUU2RmxoOWREWXJWWUE5eDJPK2hFUEdPYUVPYTFlZVB5bkJnUGF5dlVmTApxakJzdHpMaFdWUUxHQWtYWG1Ocys1Wm5QQnh6REpPTHhoRjJKSWJlUUFjSDVIMHRaclVsbzVaWXlPcUE3czlwCk81Yjg1bzNBTS9PSitDa3RGQlF0ZnZCaGNKVmQ5d3Zsd1Bzayt1eU95MkhJN21OeEtLZ3NCVHQzNzV0ZUEyVHcKVWRIa2hWTmNzQUtYMUg3R05OTE9FQURrc2Q4Nnd1b1h2Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", - "key": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS0FJQkFBS0NBZ0VBcmViQm9LZ29FalZqUHFnZFpQbTRQdHVVa3YxRTd0RVJza01KMXZYQlFKYTdqeTg2Ci9MOHNnZFlKOHlONG5tejdSN3B0cVFBcmhNcC9SZS82MnZRRi9xTzVJdmRDVm5DV21wT0VhRUp6ZE1GWGxVUVoKSko2NDhWekY1K0xJSjBaT0JyYUE4d1VEdnFuc1h3YWNqeTVtT1k1NzZEVFNZUXV5dG1nV1ZtK2pnYittbVc4awpXNWtZb2lOamZ1MGo1RDhZd3Nrcnp6VnNheVBtbkdzZzlTdmw1V1JPYUk4aWtDM3QvL3FZdUtrY2pxSWp0M2FLCkkxMUZNeWxhaDlBKzBuYjh5QVFuTFVtWXY1SnVraFBGVHB3dmhsS0t5S2Zna2tpOHpiK2FWam5PaDdxYkpPSXEKQWNTMm5SSTBSaTQvM0pwMkNqbnJITE1LdXFJQzZaWXVqN3NzdjV5bzVCdVBqYm5kRzk4ekhSQ1BsSWVNdzZOZAoyMnpWWlk5dkhPVnNlQ05QT05SMFl6NDN0ZzFvWFNUWkxHSTNiMkZLSFRCT0ppOTg2akYwQkFBTjEzMnhXNmFPCk84OUFLTTZtaS81L0N3dFQ3WE5OVGlPejB1M1BYYjRyY0Jvb0drZnFsT3h4cnM1L1U0SlZLOHpXUDJSUDVZYkYKT1FQK2c5dFBLT2luTCs1bVQ0NE42ZFI0QThjVnc5c0xONURqaDA1VGExM0lzakI4V2dRUE10OHB1dTAyTFJucwoyb1pTZzBzOUNGNEdUMHBWaUpoSmx3MlFYanpZUHhJWkF4MlB1V0cyZTJJQjArVzZtaWQ1UGhjemp0eXBEcURjCndRTHY5KzRad3VUQXpQajBQMndZckQvd2Y2eHE1dnE1NFU5SEVxb1F3YWNNeW5jVEYycUtkeCtiQXJjQ0F3RUEKQVFLQ0FnQnFmZ1lTNFFidzU1cW44d0ZWSll0TGl1SDRCWHJpR0V1UzgzU2lHNHJGaDhqQnpUVjlNNEVJM1U3bwpnczlKalFsd0NsMC9BZWlrZi9EaW5pdnJTMFlrZ3BSTU1raUFjSi81ZHQ2OWpmdndBcm9rb1RnWWNjNWxsOTlsCnVqM0J0MDd1MDNJeDM5OUVNZ0Nhekl5eExjUFIrVXd0amJOTFZJT1RLamlMby8vbjQ3b2MrYSsxSEJLMnI1OHQKU2dFUnRBWHd1b3JHY0R1OWZKV3JNZnRUeUJjWG00NWNmMUsySWpvOTZITC9taWZ2dktETXA1MitQRTYxSHR6ZQprSXI0RFgrTTZPWW8ySW5ldnNoUlVpUWdtSXFONGh3MDlvRVNjOUtTMklPbHkrNkt0WjV1UHNWa29kY0dadkIyCkRicHoyRzd5b2pjMU12c2VBVHB4V3RPV2x4TzJHN0ZvZXJsSkMrRDVaSXp1L3NNdHgwNHJ4Qllaa1YrS2tRTEEKemVreWxGSCs5RE1tTEhYQytjQWhTa2U4NS9aWngxZmo4eTJSWlpiZzlTYkhvdDA2dDhqem1zTnNlNEtpcWZrQQpiTDhhaloyaXJRRFJaZ051aEpuVXBWN2F0VW5pdlNYTXpDdFR0U3I1OUlWcHVGQTBmQUJjdlYxV1h6cXVLOW1vCmphWEZWRWFZc3hkRnlsOGxXb1lXZ0xUQzhDQSt4SEcyZnFCdkR5TEVEcHVQaGZ6SS9jbXN4UWZFcEplbmVqNjYKOU1KajVsMnRMUXI4TXNuRnJRd1B0SVJnWHVvRStKaVViQWhCOUVRMmpkcjBXaDN5c1U1ZzR1OHRHY3diTEdUWAowcWdWMUhxQXYxZllxS0xrUFB1L3NRLzUzMDVnSk9XSjhRTTBCam5Nb3NQYThHNWJhUUtDQVFFQXdIVlZKZzBNCjhIb09CcFUwSHdleG9nN3g0LzdQUHBsWlM3T1pHclRydXZxay9RRTVNQ1ZDOVBBSzljcU9qL0E4M0MwdUdPd1MKQi9ad0xqYkdWZnRZYXdkbTEyRjlkV2xmaUZpNnFPMWJjL00xYUl0RGNtNGxuRW90VFYwbDJteWU1OE5vd3hIeQppNmF2eDFIalkrYW5mU3JvT1lIUlh2QXkvbENkbk45d2IvSFl0NFNGMkhjZEFyR1planRPaGNsTS80aEFyS05jCkJITjJPWjBTbzg3QWhoYW9TYy9kQWlBQmRGS1hxQnFuOU9HcXB4MktmSjgwOUFkc0NHRHM3eE5GQXNHcmpsVXEKdjd1ajBLOFlyQmZLaU9Fd09iSFRDYkRJc3NzZkRkVUVGRDBrRkZDWUZXVVRqY012VjQ5Q1ZPbzJ0TDZCMTdGNQpnbUxjcTRpU1h0MXpld0tDQVFFQTUxRDdrZUdGNDM3RXFMRGUzNUVvV2gxL3gwZ21ZYlJPd09vSldNUXBuMDQxCnNIelFJUmdTcWdWRU94UzRSUkFVY2loSlRMMEh2WUlQR3BzOWRtWUYzcElHNXI2RjJycGtvNUlHQ1pUaE9GaHIKRWt0b0RiT3g3SGk4ZXJWNTNaOXRodXQ4akIzcDF6NlVCM1hVNWV3aktkRUwxWjJuVnZrS1FNZGd0WklJU2RZMgpoQ3lGd3ltYk15RnhkdmhxL0lhWFlmaTVkMTRCL20xdi9PUkhwOW1xM0s0VEtGUVhwZU5mR0VwcURlN1FOZXpKClJzNXB6TTZpNUE3YWNrazhtd1p3K1RZSTYyU1JWdVVLUFl1bTNuNFQra1JIaXVoY1BORG0yczhKaTlGWGI4aVYKVUE4M0RIaXpqbjZickloZE41dzhhcWVmdi9hNDgrL1RyOUQ5UUlNYTlRS0NBUUJiYmVJN3AydUVPcGU3TE5xTAorejI1L1Z1UXNwYUY2SmZ4VEtycGN4V2h5RHpsTE5XY043ZHRZVFB6dkh5cGlMbUE1NzNFZlRHN3NxbHNhdjBpCkQ3dmJiTExBazBIa3EyQ0ZCNUgxZW4wOXdrYVhHY0c2OVBUTklMZ1F6cldTNUpOQkN5WVR0YzBCNXZnT3VxcEoKNVdPZ0pPZ1ptY0I3VjZVQ0NBNDRYald1R0xpWnhrMUhucDZianYrWWYrQTMwbi9QelV6Y051Y1ovamdsK3FiRwpSd3hUSnlSZm5HNGora3gybEY0VHNFWW1JYWJPcVV3SEZDTTE0dWpCdWpvVkFaU0JVTHhOYTh4Wk5hMEhFSWVxCkNjdGY1NHJmZmNrQ0M0ZnMyRzR5UmdZZ0QwTzZtdWNGRXZXTkhUSzZhQVpkREw5Y2NqeUEyWUVlSGhVek1EaEkKOU85TkFvSUJBUUM0NmM0UmtqMWIzUzBNeFVlRlpSN2kydzRZbXA3RUlFV01oZ3F1d1RHY3ZnTEJjU1ZZTDB4TQpTaVYvTFZNWk1uK0Z1cHJPRTVhcWNkdnRJd2lCSzVHcG1RYVhVdHJpUFhyU0g1dGY4WG9SZHUweEZNSzdvVmlzCmR1QUZJQ21wZHhjeGNmS0FlREZFOWl1VHd5aE1IUGNIS0t2VE9sSlpmb0FweExpVXJZYWVyL1dvdDRhK3V2WHMKYStHdWYydlhMeWk1RXdJQVlGQXJ1Z1I2SDJzQXpVcC9XMURKUG1BaEpxQVFaUHhlNHZmakE4VHJLM3I4Vkh0Mgo0RURVZDZOUk1sY0JnYWFqdGlOUldZdFVJOTFqbzFvSkNLaEFiUHUvU2lnaDVydjAzNGFNUDhiTTF6emtaV0QwCm1sV01HUDZidy9Pd053dkhnMDNiQTI4djcxdGtST281QW9JQkFIbEtTUlNNUjcyY29uV2VKWFk0UGdPWkJNWWkKVkRZYUU3dUE1RU1YRldQRzFRNXlTai9FOFlwRHd6OC9KaHhoS04rZlVUN2xNOWpzRjJhK1JKNDVvZ3htdXpnYQp5R3BTRlh3Y1BkSFoyaFI0RERGVXowMmZMSnAvcUd2bitFUVdKOEtkM3VIUlc3aTVpR3ZmaEhmeXd6OXFzSlBVCm5lODVtOEVtcXM2OFVlN01Vc25BK3dCK09TN2N2MXBDZW5XTUxIQzAwRWFaZlJUSXd2b0VzWEVPOWs1OEZjWFkKUFE0WVJwQ3RQd3BGaHZRVTdZUU9FSVZ0K2pkUlBNL3htbTZzeHE3ajZ1WjVkMDNRemwvVU9XaFNBUzA3a0FSegp6YmtreXU4Vm8zZjBvV1pMZ0tlNFRSRThTcStzSUZiWDk3YXRSQTZVRmhPdTlmT0hveDZxWHhFOThPcz0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", - "Store": "default" - }, - { - "domain": { - "main": "dashboard.dataverse.org.ua" - }, - "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdPakNDQlNLZ0F3SUJBZ0lTQkZBOWpJR2Rtc240WTREcUZXNk1OZGhJTUEwR0NTcUdTSWIzRFFFQkN3VUEKTURJeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFNWlhRbmN5QkZibU55ZVhCME1Rc3dDUVlEVlFRRApFd0pTTXpBZUZ3MHlNVEF5TWpReE16RTRNRFJhRncweU1UQTFNalV4TXpFNE1EUmFNQ1V4SXpBaEJnTlZCQU1UCkdtUmhjMmhpYjJGeVpDNWtZWFJoZG1WeWMyVXViM0puTG5WaE1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0MKQWc4QU1JSUNDZ0tDQWdFQXlJSERwMk1RNUJHNWNZeXNsUk1vTTEza0Q1WjhLQVdCdk10eVBUTUVRSlduU28rdAo3Z1phOXRTL25ob1REZ1hGNE11UzAxcVJ6TWJmRVlnUVZ3UGVMRkxZem9RVXV3SXAvVHdUYXNabW5POG1iMUNNCjBhYnhMcnNIYVdaaXFNSVAvSmJydkg5Ykdjck1vSzI2anREK2xXVjFmK1NseUlONE5KVEUyLzdkdUg3K2VyMFMKZHM4OXJnQ3dYbEJlUFI1Q2tIVmdybHFrUkpQMmdzZklSZnl6b3ozWDVqV1dabUlvWXNBdUREUXhlTEVvM2lLWgpqOTAzeWwzaGlQY0hkdVZ0VGFsVzdydkttMmNsTkZsZWlaL0MxRmpERThCbjVtU2RtRXVlblBjMkJMRlZjYnJrCkR3RlRaTmRzRGVSUzZyVzFBU0svRk50MXRWdzczMXVKTWdnMCtJV09GL3R4QUNxS1Q3MFVnMkZaY0krN3RKWm4KdGROTUM0WC84MjYwNFhIZzQvYWJsSXZseXJaMlRjK2V2YVY0aThVZm9DNFVnMDBwZXYrV3pFZjl5Wjh6ZzdCTwp4RzlwdWdrL0RpbG1uZjh1TmlYVnFTQ3JuM0h3U3ltUkV4cnFSR1g0eVlFaWNlVVIybmVXWTFxMndQVFVKQ1gvCkVUZ2lHZW41MHhyWm9MblUzT2o3bFNRVE55b2YwdVh4K1lFd2JNWmE0bFpWdlo5dlg0VFFXUGo5YktnaU9jUngKU1Z4SWp5Nk9jRWRFR3QyL1laVkVidlFyYSt3Zi9Nd2pGRWN0bHFsUXZRMGZNQ3ptU2FUZkIvbXJQb0VHdEhrdgoybkpPNHdoMU05RTRXVGdjNm50Y3NaMUJ5UEIwOUVoNytDbHM3OUIrSlViN3ZuNDRpRENDQWhJUC9WOENBd0VBCkFhT0NBbFV3Z2dKUk1BNEdBMVVkRHdFQi93UUVBd0lGb0RBZEJnTlZIU1VFRmpBVUJnZ3JCZ0VGQlFjREFRWUkKS3dZQkJRVUhBd0l3REFZRFZSMFRBUUgvQkFJd0FEQWRCZ05WSFE0RUZnUVVhcmJIODhIVG5KUWxFRXNmZ3NhRApoaUpmaG9vd0h3WURWUjBqQkJnd0ZvQVVGQzZ6RjdkWVZzdXVVQWxBNWgrdm5Zc1V3c1l3VlFZSUt3WUJCUVVICkFRRUVTVEJITUNFR0NDc0dBUVVGQnpBQmhoVm9kSFJ3T2k4dmNqTXVieTVzWlc1amNpNXZjbWN3SWdZSUt3WUIKQlFVSE1BS0dGbWgwZEhBNkx5OXlNeTVwTG14bGJtTnlMbTl5Wnk4d0pRWURWUjBSQkI0d0hJSWFaR0Z6YUdKdgpZWEprTG1SaGRHRjJaWEp6WlM1dmNtY3VkV0V3VEFZRFZSMGdCRVV3UXpBSUJnWm5nUXdCQWdFd053WUxLd1lCCkJBR0MzeE1CQVFFd0tEQW1CZ2dyQmdFRkJRY0NBUllhYUhSMGNEb3ZMMk53Y3k1c1pYUnpaVzVqY25sd2RDNXYKY21jd2dnRUVCZ29yQmdFRUFkWjVBZ1FDQklIMUJJSHlBUEFBZGdCRWxHVXVzTzdPcjhSQUI5aW8vaWpBMnVhQwp2dGpMTWJVLzB6T1d0YmFCcUFBQUFYZlVaM0NEQUFBRUF3QkhNRVVDSVFDaHhDM05sWTl0RXBJRllJbkZOTWVJCm1keTRaYit1WjY2ZUVNNjZDTCs0Z3dJZ0Z4T0VQM2VGNFdXSU1ZNWwzZC9Jb04zM3lzRXM2cVFlYXg1TWZlZlkKUjVFQWRnQjlQdkw0ai8rSVZXZ2t3c0RLbmxLSmVTdkZEbmdKZnk1cWwyaVpmaUx3MXdBQUFYZlVaM0NoQUFBRQpBd0JITUVVQ0lEMmRDeXBFdE9wT3NOcVBPdHRBTEhzaElDdVBsOEhBRFpmdG9FcExaWjFUQWlFQTlzYWFuaDkzCnc0UlBrbGxXai9qYm9FaXliNDdNSVF6bHVlVVFvc0MvdnZBd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFEMkkKS3FJYXY4ZzlmNjJpcEVXZnFBNnlEVm9EdXMrZG5qdDFyb20yYjdPZjJTVHdKL2NNVkNWS0J0c2lSN2NqTXVQNQpBdjY0bXZRSS9pb1R5cE5kZENZazVHL2MwTS82blA1VWFKK0gxU3dKcWxTUmUvK0VTaWRUanVJWUlKdloydlk0CnVaanplKzRQeUZyYmZ2Q0ZCeHpqOXhOTnhEV09CeFNURGlidDdiVTJVbzJOYnJtajhNOXRVUzlUbm5yQ0kyZ2MKS3ZteVR3VnJabDM3ZDN3bjJWSGV3UFFhb0FJcTltM1ZydVRTYkJDOUVxT3pjbTEvTVV2Umk0Zmp2WHBaelFqeQovTm5oN2d4c3VGYnhjdGRDZldHeXU1akN2UFJSUGdUSVpsUkVoQk1EcWszQytGYVQ4WUxBcGlhNlNIWnVYMTE3CnpHQm1UNnZsRGx3REc2WGx2ajA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWlRDQ0EwMmdBd0lCQWdJUVFBRjFCSU1VcE1naGpJU3BEQmJOM3pBTkJna3Foa2lHOXcwQkFRc0ZBREEvCk1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVQKRGtSVFZDQlNiMjkwSUVOQklGZ3pNQjRYRFRJd01UQXdOekU1TWpFME1Gb1hEVEl4TURreU9URTVNakUwTUZvdwpNakVMTUFrR0ExVUVCaE1DVlZNeEZqQVVCZ05WQkFvVERVeGxkQ2R6SUVWdVkzSjVjSFF4Q3pBSkJnTlZCQU1UCkFsSXpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV3SVZLTXoyb0pUVER4THMKalZXU3cvaUM4Wm1tZWtLSXAxMG1xclVydWNWTXNhK09hL2wxeUtQWEQwZVVGRlUxVjR5ZXFLSTVHZldDUEVLcApUbTcxTzhNdTI0M0FzRnp6V1RqbjdjOXA4Rm9MRzc3QWxDUWxoL28zY2JNVDV4eXM0WnZ2MitRN1JWSkZscW5CClU4NDB5Rkx1dGE3dGo5NWdjT0tsVkt1MmJRNlhwVUEwYXl2VHZHYnJaalI4K211TGoxY3BtZmd3RjEyNmNtLzcKZ2NXdDBvWllQUmZINXdtNzhTdjNodHpCMm5GZDFFYmp6SzBsd1lpOFlHZDFaclB4R1BlaVhPWlQvenFJdGtlbAoveE1ZNnBnSmR6K2RVL25QQWVYMXBuQVhGSzlqcFArWnM1T2QzRk9uQnY1SWhSMmhhYTRsZGJzVHpGSUQ5ZTFSCm9ZdmJGUUlEQVFBQm80SUJhRENDQVdRd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFEQU9CZ05WSFE4QkFmOEUKQkFNQ0FZWXdTd1lJS3dZQkJRVUhBUUVFUHpBOU1Ec0dDQ3NHQVFVRkJ6QUNoaTlvZEhSd09pOHZZWEJ3Y3k1cApaR1Z1ZEhKMWMzUXVZMjl0TDNKdmIzUnpMMlJ6ZEhKdmIzUmpZWGd6TG5BM1l6QWZCZ05WSFNNRUdEQVdnQlRFCnA3R2tleXh4K3R2aFM1QjEvOFFWWUlXSkVEQlVCZ05WSFNBRVRUQkxNQWdHQm1lQkRBRUNBVEEvQmdzckJnRUUKQVlMZkV3RUJBVEF3TUM0R0NDc0dBUVVGQndJQkZpSm9kSFJ3T2k4dlkzQnpMbkp2YjNRdGVERXViR1YwYzJWdQpZM0o1Y0hRdWIzSm5NRHdHQTFVZEh3UTFNRE13TWFBdm9DMkdLMmgwZEhBNkx5OWpjbXd1YVdSbGJuUnlkWE4wCkxtTnZiUzlFVTFSU1QwOVVRMEZZTTBOU1RDNWpjbXd3SFFZRFZSME9CQllFRkJRdXN4ZTNXRmJMcmxBSlFPWWYKcjUyTEZNTEdNQjBHQTFVZEpRUVdNQlFHQ0NzR0FRVUZCd01CQmdnckJnRUZCUWNEQWpBTkJna3Foa2lHOXcwQgpBUXNGQUFPQ0FRRUEyVXpneWZXRWlEY3gyN3NUNHJQOGkydGlFbXhZdDBsK1BBSzNxQjhvWWV2TzRDNXo3MGtICmVqV0VIeDJ0YVBEWS9sYUJMMjEvV0tadU5UWVFISFBENWIxdFhnSFhibkw3S3FDNDAxZGs1VnZDYWRUUXN2ZDgKUzhNWGpvaHljOXo5L0cyOTQ4a0xqbUU2RmxoOWREWXJWWUE5eDJPK2hFUEdPYUVPYTFlZVB5bkJnUGF5dlVmTApxakJzdHpMaFdWUUxHQWtYWG1Ocys1Wm5QQnh6REpPTHhoRjJKSWJlUUFjSDVIMHRaclVsbzVaWXlPcUE3czlwCk81Yjg1bzNBTS9PSitDa3RGQlF0ZnZCaGNKVmQ5d3Zsd1Bzayt1eU95MkhJN21OeEtLZ3NCVHQzNzV0ZUEyVHcKVWRIa2hWTmNzQUtYMUg3R05OTE9FQURrc2Q4Nnd1b1h2Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K", - "key": "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS1FJQkFBS0NBZ0VBeUlIRHAyTVE1Qkc1Y1l5c2xSTW9NMTNrRDVaOEtBV0J2TXR5UFRNRVFKV25Tbyt0CjdnWmE5dFMvbmhvVERnWEY0TXVTMDFxUnpNYmZFWWdRVndQZUxGTFl6b1FVdXdJcC9Ud1Rhc1ptbk84bWIxQ00KMGFieExyc0hhV1ppcU1JUC9KYnJ2SDliR2NyTW9LMjZqdEQrbFdWMWYrU2x5SU40TkpURTIvN2R1SDcrZXIwUwpkczg5cmdDd1hsQmVQUjVDa0hWZ3JscWtSSlAyZ3NmSVJmeXpvejNYNWpXV1ptSW9Zc0F1RERReGVMRW8zaUtaCmo5MDN5bDNoaVBjSGR1VnRUYWxXN3J2S20yY2xORmxlaVovQzFGakRFOEJuNW1TZG1FdWVuUGMyQkxGVmNicmsKRHdGVFpOZHNEZVJTNnJXMUFTSy9GTnQxdFZ3NzMxdUpNZ2cwK0lXT0YvdHhBQ3FLVDcwVWcyRlpjSSs3dEpabgp0ZE5NQzRYLzgyNjA0WEhnNC9hYmxJdmx5cloyVGMrZXZhVjRpOFVmb0M0VWcwMHBlditXekVmOXlaOHpnN0JPCnhHOXB1Z2svRGlsbW5mOHVOaVhWcVNDcm4zSHdTeW1SRXhycVJHWDR5WUVpY2VVUjJuZVdZMXEyd1BUVUpDWC8KRVRnaUdlbjUweHJab0xuVTNPajdsU1FUTnlvZjB1WHgrWUV3Yk1aYTRsWlZ2Wjl2WDRUUVdQajliS2dpT2NSeApTVnhJank2T2NFZEVHdDIvWVpWRWJ2UXJhK3dmL013akZFY3RscWxRdlEwZk1Dem1TYVRmQi9tclBvRUd0SGt2CjJuSk80d2gxTTlFNFdUZ2M2bnRjc1oxQnlQQjA5RWg3K0Nsczc5QitKVWI3dm40NGlEQ0NBaElQL1Y4Q0F3RUEKQVFLQ0FnQmNHZjlkckV2ZDk2WlBXbWNNTXppTUg5emFyQzFyMU51N2RWaU1kQnJINy9aZ2NZOWJmdC9aOGUvegpGOWNZNGQzN1hJZWRQa1VxNDA4a0puUWJCRlBSMkZ4dXdJMGxPZUUveVpEQncxRHZWWXM2SnE0SXY3NlowSitlCjhzRHU4L1dUK1Y5ZnZzQ0NJSDNPY1A3NUMxZG1HS3pZaXBiOGZDZURQN01OdXd6dDZxZktpWDhweEJoNURTZjIKcXNRZkh2OUVqQ1pVOEozMFFtTkJ2N05uTXFUeG56N0ZLR2hscjBFTjIybExnYzRYdW9ralFKRjVYQXg4a0pOQQo3dmdtelV4Z0dDRXVtR1NBN2VoUkc1d3BhNUY3S1NxeXIvY0tCYjIrYnozMHJEbkwvZ2xackplRnJQNDVuQnF1Clp1c1BsVmdIcFlaUWRsNmphREs0YnJ1ZWw5WjhZZmlIVFVhUm85anlzQzloYmdqU0RGU25CMll3aVZzNkZjbmkKakpaajE0dFhYYlBRaUZod3h2TC9BMjZ3NUJraEQ0YTNRWW5EbzhxTWx6ZGFodHQxQzgzOUduc3E2d0FYaEZWeApVeUVxSS9rbXVKTUJzeEV3YTBwQkEvN0hzLzJrMGtUYUJvWGtORFYrWVVzUVhLcDhhUXZTalJ5ajI5Ymw1RVE3CjJaYkJycU15UHNITkh3Z2ppbGo2SEQ3Mm0rVU9sY0dtSFpaTEwzdVhEeUlxVWlLTUpSS1pOcSsvcVRxa2w0UmkKYUVUUzhzMW1tbWRrdU16dkNoeGtlMHdPYWFWWmdkaEU0SnU5T1ZYaldiOHFYNUxqQXI3RTFBQnRDdWkzYXRtTgpIaDR4WDg5eEVXY0dRdmlYT1JvRjJ3NEVKbTFiNkxkWFVzclJLbVBYRUJLWGR4NG13UUtDQVFFQTRpMDJpelNWCjQ1WUtiWThudldON0VrZWlqZkcyTXVjYnVIcVN4MmNoaGZMb3g1UTVpWTFOYzgxZFdDei9HYjhBU0pBU0k4ckUKaytucGVYUS9DOGVNL2sySjl6R3Q1T3lpODJiWHBlY2FxYzU4UjlEdWVWVmJKUjFhV2hYZGdiUnpyckU0R3pNUgpCenc0SUwxTW54RWd2d3Q4a05Ea0tnU0lLTzJESVMrZFFaQ3VhemF2TUFxd2lOV1VBWWNCOXdnbGViNUg2YXRnCnJPWlcrWGlCRC9YK3dRMnkzSCsvQkl6OGJlcU9zeGdhZW56bHU4SWhHaHdtV3lrMUpkU29vZlRycEJ0M3RwcEsKMTg3blQ5NnpxN3h1em1ETXE5aEJ4VVNNZTIyMnZycU9NbzNPY0lIT2VTNEcvcjIreStZSmNJUFBBcUp6L1lMWQpSRzNBaGpHUDFZYmJSUUtDQVFFQTR2SU1Makk0UVFOMFBnVDRWbUx4a1lpV1VZeTRySnVhc0FlbldiMld0bVZ6CjNJeGU2MmszSURSSXBkeGhRSGNyd3ZsOVBBS0tiYi9mRUdoNCtpdkxmK0NwVG9ITHVQOEI5VWllcWZ0OUIrMUcKZU9qMEJTQitKLzhmeEVJSU1zZENIOEs4T3BtaTZCZTg4eG8vamNVZGJNQXdMa0d4VFpDWVFoV2hzdVBQMjBjWgpkQUdkNXNwa1VrU1BxeUJ5N0Z6WVlwVnRVNWUzVDY0TjlxOTBhYUpJTjREWXZIYXcxdit3emNNRjNpQy93dm5pCkNKcDJaWUkreFhSZ2N4TVZSQXFWbVBTNGNFd3RNcVFyQnEwcEhaWVR2N0hoN1l0S2V1dTBWY2V0Q1dwRnhDeXAKVmRML29QM1ZRQ1VGQVdxOVhMZFBTUm8yWjdwUHNvRVhGNDdFTXZhdVV3S0NBUUVBc2oyTlVYRFVlckVnY0t5egpWYVlUTkJtdCtneTFXRElXLzIvaFFqRjlFckdXVHNuNStmT1lTUjFiWllTNFdOTFQ1MXRhWUVpSVdFU3JrT0pTCldQY2VucjMrYndjQWtuc0dBNmxWWXRIWWlsOUdROVpjU05SQ2F1SlI5TkpzYUs0THlHeXkyWVNKODlpNkp0cm4KaWllV1ZkZzRoMnVIazdGVW1HUnN4WGRmaDI3OGRWTjRCZlUybis4b24zZUV6ZWZtbUtXaXlId2RTTVNSWURKZQpDM1VDR2FPeEErSE1hRXF2Ri9RVUZ3RjB4SGl2RnlOcXNNZmtWazBJTEZNRnZmUmt5MFEyT0hvcFp4OFAzVHFVCi8wOFZSNkN6U3UyM0R6M3hNOGdIanhFM3hKRktVaEdKNUtlb0xaTGN6SlR4ZFhENmI0b1V2SUVqNi9GT0dyTHUKTmdqN3ZRS0NBUUIvRnllbEV6Q1hqL1NmNnE2Ynlnc1lBaEtVRnFjdzJtOFZGeVFyeUZWSFRhZEZva0podU9sTApHcHg0YmVMMGRBaEl4dWpRRzJna0wrZ2VTek04Zmh3WFA5dndnQlZ6UXpONGhqTjhZNzdRR3B0MWlKZG02NXhhCmo2L2RlMUVXQnFwTUdRVEtHRkczZ2R1cGxGQjA5eWNVU01oeWp3MVlyNW5rb0RLT2VLOWxUL3E4RVUrNCtDeVkKT1pidk1WdkthL0F0dlJxZFRvQTBtZmR0NXpIZEdpa3hFL0hNRVBmVlh4bEhFV2tPek80MnBUTmt1QU9Ic3htdQpBQThuUWsrTmJCUDh0VWM0ZENCM2xLSVh1ZzhsWjI4bDBkc0E2UmxMbndXOVovWEtLUDVxN3N2aHFTaklvbjJ5CnowaHZVN1E1NE5vQXlUSWdncUN4Q1VQQ1NJd3RNaUhMQW9JQkFRQ1FWamZGc0ZiN1RUU2dJdVJuU2FCanZTaWwKVXRUdEFnOWpHb2xobWtYdVBQSE1uSlZQRzNhTU4wQ1hBcFBOSi9pRlFOYmxvbWpMeVUzb2FWdnRzWEZQdjFZaQpoL2N3SzRFNFhCWENXN3kvRGhvclBvRGF5UnVTTk9BWnFENVBTWWIxQVVqUHpqc1dOektZM29Cc0RiUGhaZTJ2CjFneEVMODR4akpydzF2bS8rY0RUeTFNR3crRnBSeW85aGgvR1o1SGJkd2ZFa2sySi9WbStVa0FKbFdCejRJMEgKZHhpMi9iWXFFUENod0tSWUxwT2VMZ1JMOHl4djZ1OUphWkkwSDJCb3NOVDF5bStFN0x3eS9RVjQyUUx6Y2V2bwpZQUt6SXZaOGxNdHNKZ0FVV1FRdHNwcmIxTWhwNkZvUHJQUjA1aDI4c3IzUVVtV093eHduVVNJSDJ2UjYKLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K", - "Store": "default" - } - ] - } -} \ No newline at end of file From 396f86cf7e99f16aa80c383e186363a95df63ccf Mon Sep 17 00:00:00 2001 From: Anton Polishko Date: Mon, 1 Mar 2021 19:04:52 -0800 Subject: [PATCH 35/36] final fixes for "distro" naming --- README.md | 2 +- bin/menuconfig | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 2334fe9..a57bbe4 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ BeFAIR (Be Findable, Accessible, Interoperable, Reusable) Open Science Framework BeFAIR is a Common Distributed Research Infrastructure where users can add and run any tools and components by themselves using Debian's way of managing services. All selected services should be available on a selected subdomain name and could be easily integrated together with [Dataverse](https://dataverse.org), BeFAIR data repository. -BeFAIR distributive was designed as out-of-the-box Distributed Networked Infrastructure that any research community can install with one command just as normal Operating System. The roadmap includes releases containing Open Data available for the different sciences, however [COVID-19 Data Hub](http://datasets.coronawhy.org) is our current priority. +BeFAIR was designed as out-of-the-box Distributed Networked Infrastructure that any research community can install with one command just as normal Operating System. The roadmap includes releases containing Open Data available for the different sciences, however [COVID-19 Data Hub](http://datasets.coronawhy.org) is our current priority. # Acknowledgements BeFAIR infrastructure is standing the Shoulder of Giants. Please find below the acknowledgements for resources and contributions from the finished on ongoing projects. diff --git a/bin/menuconfig b/bin/menuconfig index 742d5c6..b358c34 100755 --- a/bin/menuconfig +++ b/bin/menuconfig @@ -239,7 +239,7 @@ gen_menu_items() { PROMPT="${PROMPT}\n" } -# $1: variable name to return distro namw +# $1: variable name to return distro name # $2: optional parameter "new", to check if distro already exist ask_distro_name() { @@ -502,9 +502,9 @@ create_distro() { mkdir -p $DISTROS_DIR/$DISTRO_NEW ln -rs $DISTROS_DIR/../mk/distro-makefile.mk $DISTROS_DIR/$DISTRO_NEW/Makefile # TODO: create .env file - msg info "Distributive \"$DISTRO_NEW\" created" + msg info "Distro \"$DISTRO_NEW\" created" if [ -L $DISTRO_ACTIVE_LINK ]; then - if ask_yes "Do you want make new distributive $DISTRO_NEW active?"; then + if ask_yes "Do you want make new distro $DISTRO_NEW active?"; then distro_make_active $DISTROS_DIR/$DISTRO_NEW else [ $? = 2 ] && return # cancel @@ -596,7 +596,7 @@ menu_show_prompt() { PROMPT="${PROMPT} ${C_MENU_KEY}d${C_NONE}) Disable current distro\n" PROMPT="${PROMPT} ${C_MENU_KEY}r${C_NONE}) Rename current distro\n" if distro_is_valid $DISTROS_DIR/$DISTRO_ACTIVE null; then - PROMPT="${PROMPT}\n ${C_MENU_KEY}e$C_NONE) Export from current distro to standalone distributive docker-compose.yaml\n" + PROMPT="${PROMPT}\n ${C_MENU_KEY}e$C_NONE) Export from current distro to a standalone docker-compose.yaml\n" fi PROMPT="${PROMPT}\n" fi From 2c3f9f6e640d69bc32ff13d8d3d5cfade54c779c Mon Sep 17 00:00:00 2001 From: Anton Polishko Date: Mon, 1 Mar 2021 19:05:33 -0800 Subject: [PATCH 36/36] Fix leftovers from refactoring --- bin/menuconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/menuconfig b/bin/menuconfig index b358c34..64f7c73 100755 --- a/bin/menuconfig +++ b/bin/menuconfig @@ -756,7 +756,7 @@ menu_main() { ;; e) [ -L $DISTRO_ACTIVE_LINK ] || $CONTINUE_WRONG - export_standalone_distributive $DISTRO_ACTIVE_LINK + export_standalone_distro $DISTRO_ACTIVE_LINK ;; q) exit ;;