diff --git a/config/authorization/config.ex b/config/authorization/config.ex index 6254386..6379c47 100644 --- a/config/authorization/config.ex +++ b/config/authorization/config.ex @@ -22,14 +22,25 @@ defmodule Acl.UserGroups.Config do "http://www.w3.org/ns/org#Site", "http://www.w3.org/ns/locn#Address", "https://data.vlaanderen.be/ns/generiek#GestructureerdeIdentificator", - "http://data.vlaanderen.be/ns/besluit#Bestuursorgaan", + "http://www.w3.org/ns/adms#Identifier", "http://www.w3.org/ns/person#Person", "http://schema.org/ContactPoint", "http://data.vlaanderen.be/ns/mandaat#Mandataris", - "https://data.vlaanderen.be/ns/organisatie#Oprichting", - "https://data.vlaanderen.be/ns/organisatie#Stopzetting", + "http://data.vlaanderen.be/ns/mandaat#Mandaat", + "http://data.lblod.info/vocabularies/leidinggevenden/Bestuursfunctie", + "http://data.vlaanderen.be/ns/besluit#Bestuursorgaan", + "http://data.vlaanderen.be/ns/besluit#Bestuurseenheid", + "http://data.lblod.info/vocabularies/erediensten/BestuurVanDeEredienst", + "http://data.lblod.info/vocabularies/erediensten/Eredienstbestuursorgaan", + "http://data.lblod.info/vocabularies/erediensten/CentraalBestuurVanDeEredienst", + "http://data.lblod.info/vocabularies/erediensten/CentraleBestuursorgaan", + "http://data.lblod.info/vocabularies/erediensten/RepresentatiefOrgaan", + "http://data.lblod.info/vocabularies/erediensten/EredienstMandataris", + "http://www.w3.org/ns/org#ChangeEvent", + "http://www.w3.org/ns/org#Role", "http://www.w3.org/ns/org#Post", - "http://www.w3.org/ns/org#Role" + "http://data.lblod.info/vocabularies/contacthub/AgentInPositie", + "http://www.w3.org/ns/prov#Location" ] } } ] }, %GraphCleanup{ diff --git a/config/dispatcher/dispatcher.ex b/config/dispatcher/dispatcher.ex index b5c8ac4..7463528 100644 --- a/config/dispatcher/dispatcher.ex +++ b/config/dispatcher/dispatcher.ex @@ -10,6 +10,125 @@ defmodule Dispatcher do define_layers [ :api_services, :api, :frontend, :not_found ] + ############################################################### + # domain.json + ############################################################### + match "/people/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/people/" + end + + match "/agent-in-position/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/agent-in-position/" + end + + match "/posts/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/posts/" + end + + match "/mandatories/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/mandatories/" + end + + match "/mandatory-status-codes/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/mandatory-status-codes/" + end + + match "/worship-mandatories/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/worship-mandatories/" + end + + match "/half-elections/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/half-elections/" + end + + match "/contact-points/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/contact-points/" + end + + match "/mandates/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/mandates/" + end + + match "/board-positions/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/board-positions/" + end + + match "/roles/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/roles/" + end + + match "/organizations/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/organizations/" + end + + match "/administrative-units/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/administrative-units/" + end + + match "/administrative-unit-classification-codes/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/administrative-unit-classification-codes/" + end + + match "/worship-services/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/worship-services/" + end + + match "/honorary-service-types/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/honorary-service-types/" + end + + match "/central-worship-services/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/central-worship-services/" + end + + match "/representative-bodies/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/representative-bodies/" + end + + match "/governing-bodies/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/governing-bodies/" + end + + match "/governing-body-classification-codes/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/governing-body-classification-codes/" + end + + match "/public-involvements/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/public-involvements/" + end + + match "/identifiers/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/identifiers/" + end + + match "/structured-identifiers/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/structured-identifiers/" + end + + match "/addresses/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/addresses/" + end + + match "/sites/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/sites/" + end + + match "/change-events/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/change-events/" + end + + match "/change-event-types/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/change-event-types/" + end + + match "/organization-status-codes/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/organization-status-codes/" + end + + match "/locations/*path", %{ accept: [:json], layer: :api} do + Proxy.forward conn, path, "http://resource/locations/" + end + ############################################################### # sparql endpoint ############################################################### @@ -70,7 +189,7 @@ defmodule Dispatcher do match "/*_path", %{ layer: :frontend } do Proxy.forward conn, [], "http://frontend/index.html" end - + ############################################################### # errors ############################################################### diff --git a/config/resources/domain.json b/config/resources/domain.json new file mode 100644 index 0000000..8faef9a --- /dev/null +++ b/config/resources/domain.json @@ -0,0 +1,652 @@ +{ + "version": "0.1", + "prefixes": { + "skos": "http://www.w3.org/2004/02/skos/core#", + "org": "http://www.w3.org/ns/org#", + "locn": "http://www.w3.org/ns/locn#", + "organisatie": "https://data.vlaanderen.be/ns/organisatie#", + "dc_terms": "http://purl.org/dc/terms/", + "schema": "http://schema.org/", + "regorg": "http://www.w3.org/ns/regorg#", + "person": "http://www.w3.org/ns/person#", + "persoon": "https://data.vlaanderen.be/ns/persoon#", + "foaf": "http://xmlns.com/foaf/0.1/", + "vcard": "http://www.w3.org/2006/vcard/ns#", + "adres": "https://data.vlaanderen.be/ns/adres#", + "generiek": "https://data.vlaanderen.be/ns/generiek#", + "euro": "http://data.europa.eu/m8g/", + "adms": "http://www.w3.org/ns/adms#", + "lblodlg": "https://data.lblod.info/vocabularies/leidinggevenden/", + "besluit": "http://data.vlaanderen.be/ns/besluit#", + "mandaat": "http://data.vlaanderen.be/ns/mandaat#", + "prov": "http://www.w3.org/ns/prov#", + "ere": "http://data.lblod.info/vocabularies/erediensten/", + "ch": "http://data.lblod.info/vocabularies/contacthub/", + "code": "http://lblod.data.gift/vocabularies/organization/", + "ext": "http://mu.semte.ch/vocabularies/ext/" + }, + "resources": { + "people": { + "class": "person:Person", + "attributes": { + "given-name": { + "type": "string", + "predicate": "foaf:givenName" + }, + "family-name": { + "type": "string", + "predicate": "foaf:familyName" + }, + "first-name-used": { + "type": "string", + "predicate": "persoon:gebruikteVoornaam" + } + }, + "relationships": { + "mandatories": { + "predicate": "mandaat:isAangesteldAls", + "target": "mandatories", + "cardinality": "many" + } + }, + "new-resource-base": "http://data.lblod.info/id/personen/" + }, + "agent-in-position": { + "class": "ch:AgentInPositie", + "attributes": { + "start-date": { + "type": "datetime", + "predicate": "ch:startdatum" + }, + "end-date": { + "type": "datetime", + "predicate": "ch:eindedatum" + } + }, + "relationships": { + "position": { + "predicate": "org:hasPost", + "target": "posts", + "cardinality": "one" + }, + "person": { + "predicate": "org:heldBy", + "target": "peolple", + "cardinality": "one" + }, + "contacts": { + "predicate": "schema:contactPoint", + "target": "contact-points", + "cardinality": "many" + } + }, + "new-resource-base": "http://data.lblod.info/id/agentenInPositie/" + }, + "posts": { + "class": "org:Post", + "relationships": { + "role-board": { + "predicate": "org:role", + "target": "board-positions", + "cardinality": "one" + }, + "general-role": { + "predicate": "org:role", + "target": "roles", + "cardinality": "one" + }, + "organization": { + "predicate": "org:postIn", + "target": "organization", + "cardinality": "one" + } + }, + "new-resource-base": "http://data.lblod.info/id/posities/" + }, + "mandatories": { + "class": "mandaat:Mandataris", + "attributes": { + "start-date": { + "type": "datetime", + "predicate": "mandaat:start" + }, + "end-date": { + "type": "datetime", + "predicate": "mandaat:einde" + } + }, + "relationships": { + "status": { + "predicate": "mandaat:status", + "target": "mandatory-status-codes", + "cardinality": "one" + }, + "governing-alias": { + "predicate": "mandaat:isBestuurlijkeAliasVan", + "target": "people", + "cardinality": "one" + }, + "contacts": { + "predicate": "schema:contactPoint", + "target": "contact-points", + "cardinality": "many" + }, + "mandate": { + "predicate": "org:holds", + "target": "mandates", + "cardinality": "one" + } + }, + "new-resource-base": "http://data.lblod.info/id/mandatarissen/" + }, + "mandatory-status-codes": { + "class": "code:MandatarisStatusCode", + "attributes": { + "label": { + "type": "string", + "predicate": "skos:prefLabel" + } + }, + "features": ["include-uri"], + "new-resource-base": "http://data.vlaanderen.be/id/concept/MandatarisStatusCode/" + }, + "worship-mandatories": { + "class": "ere:EredienstMandataris", + "super": ["mandatories"], + "attributes": { + "expected-end-date": { + "type": "datetime", + "predicate": "ere:geplandeEinddatumAanstelling" + }, + "reason-stopped": { + "type": "string", + "predicate": "ere:redenVanStopzetting" + } + }, + "relationships": { + "type-half": { + "predicate": "ere:typeHelft", + "target": "half-elections", + "cardinality": "one" + } + }, + "new-resource-base": "http://data.lblod.info/id/mandatarissen/" + }, + "half-elections": { + "class": "code:HelftVerkiezing", + "attributes": { + "label": { + "type": "string", + "predicate": "skos:prefLabel" + } + }, + "new-resource-base": "http://lblod.data.gift/concepts/" + }, + "contact-points": { + "class": "schema:ContactPoint", + "attributes": { + "email": { + "type": "string", + "predicate": "schema:email" + }, + "telephone": { + "type": "string", + "predicate": "schema:telephone" + }, + "fax": { + "type": "string", + "predicate": "schema:faxNumber" + }, + "website": { + "type": "uri", + "predicate": "foaf:page" + } + }, + "relationships": { + "contact-address": { + "predicate": "locn:address", + "target": "addresses", + "cardinality": "one" + } + }, + "new-resource-base": "http://data.lblod.info/id/contact-punten/" + }, + "mandates": { + "class": "mandaat:Mandaat", + "relationships": { + "role-board": { + "predicate": "org:role", + "target": "board-positions", + "cardinality": "one" + }, + "governing-body": { + "predicate": "org:hasPost", + "target": "governing-bodies", + "cardinality": "one", + "inverse": true + }, + "held-by": { + "predicate": "org:heldBy", + "target": "mandatories", + "cardinality": "many", + "inverse": true + } + }, + "new-resource-base": "http://data.lblod.info/id/mandaten/" + }, + "board-positions": { + "class": "code:BestuursfunctieCode", + "attributes": { + "label": { + "type": "string", + "predicate": "skos:prefLabel" + } + }, + "new-resource-base": "http://data.vlaanderen.be/id/concept/BestuursfunctieCode/" + }, + "roles": { + "class": "org:Role", + "attributes": { + "label": { + "type": "string", + "predicate": "skos:prefLabel" + } + }, + "new-resource-base": "http://data.lblod.info/id/rollen/" + }, + "organizations": { + "class": "org:Organization", + "attributes": { + "name": { + "type": "string", + "predicate": "skos:prefLabel" + }, + "alternative-name": { + "type": "string", + "predicate": "skos:altLabel" + } + }, + "relationships": { + "identifiers": { + "predicate": "adms:identifier", + "target": "identifiers", + "cardinality": "many" + }, + "organization-status": { + "predicate": "regorg:orgStatus", + "target": "organization-status-codes", + "cardinality": "one" + }, + "primary-site": { + "predicate": "org:hasPrimarySite", + "target": "sites", + "cardinality": "one" + }, + "sites": { + "predicate": "org:hasSite", + "target": "sites", + "cardinality": "many" + }, + "changed-by": { + "predicate": "org:changedBy", + "target": "change-events", + "cardinality": "many" + }, + "resulted-from": { + "predicate": "org:resultedFrom", + "target": "change-events", + "cardinality": "many" + }, + "positions": { + "predicate": "org:hasPost", + "target": "posts", + "cardinality": "many" + } + }, + "new-resource-base": "http://data.lblod.info/id/organisaties/" + }, + "administrative-units": { + "class": "besluit:Bestuurseenheid", + "super": ["organizations"], + "relationships": { + "classification": { + "predicate": "org:classification", + "target": "administrative-unit-classification-codes", + "cardinality": "one" + }, + "governing-bodies": { + "predicate": "besluit:bestuurt", + "target": "governing-bodies", + "cardinality": "many", + "inverse": true + }, + "involved-boards": { + "predicate": "ere:betrokkenBestuur", + "target": "public-involvements", + "cardinality": "many" + }, + "municipality": { + "predicate": "besluit:werkingsgebied", + "target": "locations", + "cardinality": "one" + }, + "province": { + "predicate": "vcard:hasRegion", + "target": "locations", + "cardinality": "one" + } + }, + "new-resource-base": "http://data.lblod.info/id/bestuurseenheden/" + }, + "administrative-unit-classification-codes": { + "class": "code:BestuurseenheidClassificatieCode", + "attributes": { + "label": { + "type": "string", + "predicate": "skos:prefLabel" + } + }, + "new-resource-base": "http://data.vlaanderen.be/id/concept/BestuurseenheidClassificatieCode/" + }, + "worship-services": { + "class": "ere:BestuurVanDeEredienst", + "super": ["administrative-units"], + "attributes": { + "denomination": { + "type": "string", + "predicate": "ere:denominatie" + }, + "cross-border": { + "type": "boolean", + "predicate": "ere:grensoverscheidend" + } + }, + "relationships": { + "honorary-service-type": { + "predicate": "ere:typeEredienst", + "target": "honorary-service-types", + "cardinality": "one" + }, + "central-service": { + "predicate": "org:linkedTo", + "target": "central-worship-services", + "cardinality": "one" + }, + "representive-body": { + "predicate": "org:linkedTo", + "target": "representative-bodies", + "cardinality": "one" + } + }, + "new-resource-base": "http://data.lblod.info/id/besturenVanDeEredienst/" + }, + "honorary-service-types": { + "class": "code:TypeEredienst", + "attributes": { + "label": { + "type": "string", + "predicate": "skos:prefLabel" + } + }, + "new-resource-base": "http://lblod.data.gift/concepts/" + }, + "central-worship-services": { + "class": "ere:CentraalBestuurVanDeEredienst", + "super": ["administrative-units"], + "relationships": { + "honorary-service-type": { + "predicate": "ere:typeEredienst", + "target": "honorary-service-types", + "cardinality": "one" + }, + "worship-service": { + "predicate": "org:linkedTo", + "target": "worship-services", + "cardinality": "many", + "inverse": true + }, + "representive-body": { + "predicate": "org:linkedTo", + "target": "representative-bodies", + "cardinality": "one" + } + }, + "new-resource-base": "http://data.lblod.info/id/centraleBesturenVanDeEredienst/" + }, + "representative-bodies": { + "class": "ere:RepresentatiefOrgaan", + "super": ["organizations"], + "relationships": { + "honorary-service-type": { + "predicate": "ere:typeEredienst", + "target": "honorary-service-types", + "cardinality": "one" + }, + "central-service": { + "predicate": "org:linkedTo", + "target": "central-worship-services", + "cardinality": "many", + "inverse": true + }, + "worship-service": { + "predicate": "org:linkedTo", + "target": "worship-services", + "cardinality": "many", + "inverse": true + } + }, + "new-resource-base": "http://data.lblod.info/id/representatieveOrganen/" + }, + "governing-bodies": { + "class": "besluit:Bestuursorgaan", + "attributes": { + "start-date": { + "type": "datetime", + "predicate": "mandaat:bindingStart" + }, + "end-date": { + "type": "datetime", + "predicate": "mandaat:bindingEinde" + } + }, + "relationships": { + "administrative-unit": { + "predicate": "besluit:bestuurt", + "target": "administrative-units", + "cardinality": "one" + }, + "classification": { + "predicate": "org:classification", + "target": "governing-body-classification-codes", + "cardinality": "one" + }, + "is-time-specialization-of": { + "predicate": "generiek:isTijdspecialisatieVan", + "target": "governing-bodies", + "cardinality": "one" + }, + "has-time-specializations": { + "predicate": "generiek:isTijdspecialisatieVan", + "target": "governing-bodies", + "cardinality": "many", + "inverse": true + }, + "mandates": { + "predicate": "org:hasPost", + "target": "mandates", + "cardinality": "many" + } + }, + "new-resource-base": "http://data.lblod.info/id/bestuursorganen/" + }, + "governing-body-classification-codes": { + "class": "code:BestuursfunctieCode", + "attributes": { + "label": { + "type": "string", + "predicate": "skos:prefLabel" + } + }, + "new-resource-base": "http://data.vlaanderen.be/id/concept/BestuursorgaanClassificatieCode/" + }, + "public-involvements": { + "class": "ere:BetrokkenLokaleBesturen", + "attributes": { + "percentage": { + "type": "number", + "predicate": "ere:financieringspercentage" + } + }, + "relationships": { + "involvement-type": { + "predicate": "ere:typebetrokkenheid", + "target": "involvement-types", + "cardinality": "one" + }, + "worship-service": { + "predicate": "org:organization", + "target": "worship-services", + "cardinality": "one" + } + }, + "new-resource-base": "http://data.lblod.info/id/betrokkenLokaleBesturen/" + }, + "identifiers": { + "class": "adms:Identifier", + "attributes": { + "id-name": { + "type": "string", + "predicate": "skos:notation" + } + }, + "relationships": { + "structured-identifier": { + "predicate": "generiek:gestructureerdeIdentificator", + "target": "structured-identifiers", + "cardinality": "one" + } + }, + "new-resource-base": "http://data.lblod.info/id/identificatoren/" + }, + "structured-identifiers": { + "class": "generiek:GestructureerdeIdentificator", + "attributes": { + "local-id": { + "type": "string", + "predicate": "generiek:lokaleIdentificator" + } + }, + "new-resource-base": "http://data.lblod.info/id/gestructureerdeIdentificatoren/" + }, + "addresses": { + "class": "locn:Address", + "attributes": { + "number": { + "type": "string", + "predicate": "adres:Adresvoorstelling.huisnummer" + }, + "box-number": { + "type": "string", + "predicate": "adres:Adresvoorstelling.busnummer" + }, + "street": { + "type": "string", + "predicate": "locn:thoroughfare" + }, + "postcode": { + "type": "string", + "predicate": "locn:postCode" + }, + "municipality": { + "type": "string", + "predicate": "adres:gemeentenaam" + }, + "province": { + "type": "string", + "predicate": "locn:adminUnitL2" + }, + "country": { + "type": "string", + "predicate": "adres:land" + }, + "full-address": { + "type": "string", + "predicate": "locn:fullAddress" + } + }, + "new-resource-base": "http://data.lblod.info/id/adressen/" + }, + "sites": { + "class": "org:Site", + "relationships": { + "contacts": { + "predicate": "org:siteAddress", + "target": "contact-points", + "cardinality": "many" + }, + "address": { + "predicate": "organisatie:bestaatUit", + "target": "addresses", + "cardinality": "one" + } + }, + "new-resource-base": "http://data.lblod.info/id/vestigingen/" + }, + "change-events": { + "class": "org:ChangeEvent", + "attributes": { + "date": { + "type": "datetime", + "predicate": "dc_terms:date" + }, + "description": { + "type": "string", + "predicate": "dc_terms:description" + } + }, + "relationships": { + "type": { + "predicate": "ch:typeWijziging", + "target": "change-event-types", + "cardinality": "one" + } + }, + "new-resource-base": "http://data.lblod.info/id/veranderingsgebeurtenissen/" + }, + "change-event-types": { + "class": "code:Veranderingsgebeurtenis", + "attributes": { + "label": { + "type": "string", + "predicate": "skos:prefLabel" + } + }, + "new-resource-base": "http://lblod.data.gift/concepts/" + }, + "organization-status-codes": { + "class": "code:StatusCode", + "attributes": { + "label": { + "type": "string", + "predicate": "skos:prefLabel" + } + }, + "features": ["include-uri"], + "new-resource-base": "http://lblod.data.gift/concepts/" + }, + "locations": { + "class": "prov:Location", + "attributes": { + "label": { + "type": "string", + "predicate": "rdfs:label" + }, + "level": { + "type": "string", + "predicate": "ext:werkingsgebiedNiveau" + } + }, + "new-resource-base": "http://data.lblod.info/id/werkingsgebieden/" + } + } +} \ No newline at end of file diff --git a/config/resources/domain.lisp b/config/resources/domain.lisp new file mode 100644 index 0000000..5cd593a --- /dev/null +++ b/config/resources/domain.lisp @@ -0,0 +1,9 @@ + +(in-package :mu-cl-resources) + +(defparameter *include-count-in-paginated-responses* t) + +; fixes bug in sorting - parameter is a workaround for virtuoso behaviour (see docs) but cause problems for sorting +(defparameter *max-group-sorted-properties* nil) + +(read-domain-file "domain.json") \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 42e853c..eaa8d2f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -55,6 +55,7 @@ services: LOG_OUTGOING_SPARQL_QUERIES: "true" LOG_INCOMING_SPARQL_QUERIES: "true" LOG_ACCESS_RIGHTS: "true" + LOG_OUTGOING_SPARQL_QUERY_ROUNDTRIP: "true" volumes: - ./config/authorization:/config migrations: @@ -67,6 +68,24 @@ services: - "logging=true" restart: always logging: *default-logging + resource: + image: semtech/mu-cl-resources:latest + links: + - db:database + volumes: + - ./config/resources:/config + labels: + - "logging=true" + restart: always + logging: *default-logging + cache: + image: semtech/mu-cache:2.0.1 + links: + - resource:backend + labels: + - "logging=true" + restart: always + logging: *default-logging # Ember-Metis uri-info: image: redpencil/mu-uri-info-service:0.2.1 @@ -93,7 +112,7 @@ services: labels: - "logging=true" kalliope-api: - image: lblod/jsonld-delta-service + image: lblod/jsonld-delta-service:0.1.0 volumes: - ./config/kalliope:/config - ./data/files:/share @@ -111,6 +130,6 @@ services: labels: - "logging=true" environment: - EMBER_METIS_BASE_URL: "http://data.lblod.info/" + EMBER_METIS_BASE_URL: "http://data.lblod.info/id/" restart: always logging: *default-logging