From c88357cd2c1889b11320a01ee76c1e977b4ba61c Mon Sep 17 00:00:00 2001 From: Martin Weise <martin.weise@tuwien.ac.at> Date: Sat, 14 Sep 2024 18:25:17 +0200 Subject: [PATCH] Added config files --- .docker/.env | 12 + .docker/config/1_setup-schema.sql | 564 ++++++++++++++++++++++++++++++ .docker/config/2_setup-data.sql | 8 + .docker/config/advanced.config | 17 + .docker/config/dbrepo.conf | 167 +++++++++ .docker/config/definitions.json | 52 +++ .docker/config/enabled_plugins | 1 + .docker/config/rabbitmq.conf | 30 ++ .docker/config/s3_config.json | 20 ++ .docker/dist.tar.gz | Bin 9967 -> 9957 bytes .env.unix.example | 1 - .gitignore | 1 - 12 files changed, 871 insertions(+), 2 deletions(-) create mode 100644 .docker/.env create mode 100644 .docker/config/1_setup-schema.sql create mode 100644 .docker/config/2_setup-data.sql create mode 100644 .docker/config/advanced.config create mode 100644 .docker/config/dbrepo.conf create mode 100644 .docker/config/definitions.json create mode 100644 .docker/config/enabled_plugins create mode 100644 .docker/config/rabbitmq.conf create mode 100644 .docker/config/s3_config.json delete mode 100644 .env.unix.example diff --git a/.docker/.env b/.docker/.env new file mode 100644 index 0000000000..6e598a8d0a --- /dev/null +++ b/.docker/.env @@ -0,0 +1,12 @@ +# UNCOMMENT THE LINES BELOW TO OVERRIDE +#BASE_URL=http://example.com +#ADMIN_EMAIL=noreply@example.com +#LOG_LEVEL=debug +#IDENTITY_SERVICE_ADMIN_PASSWORD=admin +#AUTH_SERVICE_ADMIN_PASSWORD=admin +#METADATA_DB_PASSWORD=dbrepo +#DATA_DB_PASSWORD=dbrepo +#AUTH_DB_PASSWORD=dbrepo +#S3_ACCESS_KEY_ID=seaweedfsadmin +#S3_SECRET_ACCESS_KEY=seaweedfsadmin +#SYSTEM_PASSWORD=admin diff --git a/.docker/config/1_setup-schema.sql b/.docker/config/1_setup-schema.sql new file mode 100644 index 0000000000..47ee3a95e2 --- /dev/null +++ b/.docker/config/1_setup-schema.sql @@ -0,0 +1,564 @@ +BEGIN; + +CREATE TABLE IF NOT EXISTS `mdb_users` +( + id character varying(36) NOT NULL, + username character varying(255) NOT NULL, + firstname character varying(255), + lastname character varying(255), + email character varying(255) NOT NULL, + orcid character varying(255), + affiliation character varying(255), + mariadb_password character varying(255) NOT NULL, + theme character varying(255) NOT NULL default ('light'), + language character varying(3) NOT NULL default ('en'), + PRIMARY KEY (id), + UNIQUE (username), + UNIQUE (email) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_images` +( + id bigint NOT NULL AUTO_INCREMENT, + registry character varying(255) NOT NULL DEFAULT 'docker.io', + name character varying(255) NOT NULL, + version character varying(255) NOT NULL, + default_port integer NOT NULL, + dialect character varying(255) NOT NULL, + driver_class character varying(255) NOT NULL, + jdbc_method character varying(255) NOT NULL, + is_default BOOLEAN NOT NULL DEFAULT FALSE, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + PRIMARY KEY (id), + UNIQUE (name, version), + UNIQUE (is_default) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_images_date` +( + id bigint NOT NULL AUTO_INCREMENT, + iid bigint NOT NULL, + database_format character varying(255) NOT NULL, + unix_format character varying(255) NOT NULL, + example character varying(255) NOT NULL, + has_time boolean NOT NULL, + created_at timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id), + FOREIGN KEY (iid) REFERENCES mdb_images (id), + UNIQUE (database_format, unix_format, example) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_containers` +( + id bigint NOT NULL AUTO_INCREMENT, + internal_name character varying(255) NOT NULL, + name character varying(255) NOT NULL, + host character varying(255) NOT NULL, + port integer NOT NULL default 3306, + ui_host character varying(255) NOT NULL default host, + ui_port integer NOT NULL default port, + ui_additional_flags text, + sidecar_host character varying(255), + sidecar_port integer, + image_id bigint NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + privileged_username character varying(255) NOT NULL, + privileged_password character varying(255) NOT NULL, + quota integer NOT NULL DEFAULT 50, + PRIMARY KEY (id), + FOREIGN KEY (image_id) REFERENCES mdb_images (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_data` +( + ID bigint NOT NULL AUTO_INCREMENT, + PROVENANCE text, + FileEncoding text, + FileType character varying(100), + Version text, + Seperator text, + PRIMARY KEY (ID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_licenses` +( + identifier character varying(255) NOT NULL, + uri text NOT NULL, + description text NOT NULL, + PRIMARY KEY (identifier), + UNIQUE (uri(200)) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_databases` +( + id bigint NOT NULL AUTO_INCREMENT, + cid bigint NOT NULL, + name character varying(255) NOT NULL, + internal_name character varying(255) NOT NULL, + exchange_name character varying(255) NOT NULL, + description text, + engine character varying(20), + is_public boolean NOT NULL DEFAULT TRUE, + image longblob, + created_by character varying(36), + owned_by character varying(36), + contact_person character varying(36), + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + PRIMARY KEY (id), + FOREIGN KEY (cid) REFERENCES mdb_containers (id) /* currently we only support one-to-one */, + FOREIGN KEY (created_by) REFERENCES mdb_users (id), + FOREIGN KEY (owned_by) REFERENCES mdb_users (id), + FOREIGN KEY (contact_person) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_databases_subjects` +( + dbid BIGINT NOT NULL, + subjects character varying(255) NOT NULL, + PRIMARY KEY (dbid, subjects) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_tables` +( + ID bigint NOT NULL AUTO_INCREMENT, + tDBID bigint NOT NULL, + tName VARCHAR(64) NOT NULL, + internal_name VARCHAR(64) NOT NULL, + queue_name VARCHAR(255) NOT NULL, + routing_key VARCHAR(255), + tDescription VARCHAR(2048), + num_rows BIGINT, + data_length BIGINT, + max_data_length BIGINT, + avg_row_length BIGINT, + `separator` CHAR(1), + quote CHAR(1), + element_null VARCHAR(50), + skip_lines BIGINT, + element_true VARCHAR(50), + element_false VARCHAR(50), + Version TEXT, + created timestamp NOT NULL DEFAULT NOW(), + versioned boolean not null default true, + created_by character varying(36) NOT NULL, + owned_by character varying(36) NOT NULL, + last_modified timestamp, + PRIMARY KEY (ID), + UNIQUE (tDBID, internal_name), + FOREIGN KEY (tDBID) REFERENCES mdb_databases (id), + FOREIGN KEY (created_by) REFERENCES mdb_users (id), + FOREIGN KEY (owned_by) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns` +( + ID BIGINT NOT NULL AUTO_INCREMENT, + tID BIGINT NOT NULL, + dfID BIGINT, + cName VARCHAR(64), + internal_name VARCHAR(64) NOT NULL, + Datatype ENUM ('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR'), + length BIGINT NULL, + ordinal_position INTEGER NOT NULL, + index_length BIGINT NULL, + description VARCHAR(2048), + size BIGINT, + d BIGINT, + auto_generated BOOLEAN DEFAULT false, + is_null_allowed BOOLEAN NOT NULL DEFAULT true, + val_min NUMERIC NULL, + val_max NUMERIC NULL, + mean NUMERIC NULL, + median NUMERIC NULL, + std_dev Numeric NULL, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + FOREIGN KEY (tID) REFERENCES mdb_tables (ID) ON DELETE CASCADE, + PRIMARY KEY (ID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_enums` +( + id bigint NOT NULL AUTO_INCREMENT, + column_id bigint NOT NULL, + value CHARACTER VARYING(255) NOT NULL, + FOREIGN KEY (column_id) REFERENCES mdb_columns (ID) ON DELETE CASCADE, + PRIMARY KEY (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_sets` +( + id bigint NOT NULL AUTO_INCREMENT, + column_id bigint NOT NULL, + value CHARACTER VARYING(255) NOT NULL, + FOREIGN KEY (column_id) REFERENCES mdb_columns (ID) ON DELETE CASCADE, + PRIMARY KEY (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_nom` +( + tID bigint, + cID bigint, + maxlength INTEGER, + last_modified timestamp, + created timestamp NOT NULL DEFAULT NOW(), + FOREIGN KEY (tID, cID) REFERENCES mdb_columns (tID, ID), + PRIMARY KEY (tID, cID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_cat` +( + tID bigint, + cID bigint, + num_cat INTEGER, + -- cat_array TEXT[], + last_modified timestamp, + created timestamp NOT NULL DEFAULT NOW(), + FOREIGN KEY (tID, cID) REFERENCES mdb_columns (tID, ID), + PRIMARY KEY (tID, cID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_foreign_key` +( + fkid BIGINT NOT NULL AUTO_INCREMENT, + tid BIGINT NOT NULL, + rtid BIGINT NOT NULL, + name VARCHAR(255) NOT NULL, + on_update VARCHAR(50) NULL, + on_delete VARCHAR(50) NULL, + position INT NULL, + PRIMARY KEY (fkid), + FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE, + FOREIGN KEY (rtid) REFERENCES mdb_tables (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_primary_key` +( + pkid BIGINT NOT NULL AUTO_INCREMENT, + tID BIGINT NOT NULL, + cid BIGINT NOT NULL, + PRIMARY KEY (pkid), + FOREIGN KEY (tID) REFERENCES mdb_tables (id) ON DELETE CASCADE, + FOREIGN KEY (cid) REFERENCES mdb_columns (id) ON DELETE CASCADE +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_foreign_key_reference` +( + id BIGINT NOT NULL AUTO_INCREMENT, + fkid BIGINT NOT NULL, + cid BIGINT NOT NULL, + rcid BIGINT NOT NULL, + PRIMARY KEY (id), + UNIQUE (fkid, cid, rcid), + FOREIGN KEY (fkid) REFERENCES mdb_constraints_foreign_key (fkid) ON UPDATE CASCADE, + FOREIGN KEY (cid) REFERENCES mdb_columns (id), + FOREIGN KEY (rcid) REFERENCES mdb_columns (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_unique` +( + uid BIGINT NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + tid BIGINT NOT NULL, + position INT NULL, + PRIMARY KEY (uid), + FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS `mdb_constraints_unique_columns` +( + id BIGINT NOT NULL AUTO_INCREMENT, + uid BIGINT NOT NULL, + cid BIGINT NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (uid) REFERENCES mdb_constraints_unique (uid), + FOREIGN KEY (cid) REFERENCES mdb_columns (id) ON DELETE CASCADE +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_constraints_checks` +( + id BIGINT NOT NULL AUTO_INCREMENT, + tid BIGINT NOT NULL, + checks VARCHAR(255) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (tid) REFERENCES mdb_tables (id) ON DELETE CASCADE +) WITH SYSTEM VERSIONING; + + +CREATE TABLE IF NOT EXISTS `mdb_concepts` +( + id bigint NOT NULL AUTO_INCREMENT, + uri text not null, + name VARCHAR(255) null, + description TEXT null, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id), + UNIQUE (uri(200)) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_units` +( + id bigint NOT NULL AUTO_INCREMENT, + uri text not null, + name VARCHAR(255) null, + description TEXT null, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id), + UNIQUE (uri(200)) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_concepts` +( + id bigint NOT NULL, + cID bigint NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id, cid), + FOREIGN KEY (cID) REFERENCES mdb_columns (ID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_columns_units` +( + id bigint NOT NULL, + cID bigint NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (id, cID), + FOREIGN KEY (cID) REFERENCES mdb_columns (ID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_view` +( + id bigint NOT NULL AUTO_INCREMENT, + vdbid bigint NOT NULL, + vName VARCHAR(64) NOT NULL, + internal_name VARCHAR(64) NOT NULL, + Query TEXT NOT NULL, + query_hash VARCHAR(255) NOT NULL, + Public BOOLEAN NOT NULL, + InitialView BOOLEAN NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + last_modified timestamp, + created_by character varying(36) NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (vdbid) REFERENCES mdb_databases (id), + FOREIGN KEY (created_by) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_banner_messages` +( + id bigint NOT NULL AUTO_INCREMENT, + type ENUM ('ERROR', 'WARNING', 'INFO') NOT NULL default 'INFO', + message TEXT NOT NULL, + link TEXT NULL, + link_text VARCHAR(255) NULL, + display_start timestamp NULL, + display_end timestamp NULL, + PRIMARY KEY (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_ontologies` +( + id bigint NOT NULL AUTO_INCREMENT, + prefix VARCHAR(8) NOT NULL, + uri TEXT NOT NULL, + uri_pattern TEXT, + sparql_endpoint TEXT NULL, + rdf_path TEXT NULL, + last_modified timestamp, + created timestamp NOT NULL DEFAULT NOW(), + UNIQUE (prefix), + UNIQUE (uri(200)), + PRIMARY KEY (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_view_columns` +( + id BIGINT NOT NULL AUTO_INCREMENT, + view_id BIGINT NOT NULL, + dfID BIGINT, + name VARCHAR(64), + internal_name VARCHAR(64) NOT NULL, + column_type ENUM ('CHAR','VARCHAR','BINARY','VARBINARY','TINYBLOB','TINYTEXT','TEXT','BLOB','MEDIUMTEXT','MEDIUMBLOB','LONGTEXT','LONGBLOB','ENUM','SET','BIT','TINYINT','BOOL','SMALLINT','MEDIUMINT','INT','BIGINT','FLOAT','DOUBLE','DECIMAL','DATE','DATETIME','TIMESTAMP','TIME','YEAR'), + ordinal_position INTEGER NOT NULL, + size BIGINT, + d BIGINT, + auto_generated BOOLEAN DEFAULT false, + is_null_allowed BOOLEAN NOT NULL DEFAULT true, + PRIMARY KEY (id), + FOREIGN KEY (view_id) REFERENCES mdb_view (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifiers` +( + id BIGINT NOT NULL AUTO_INCREMENT, + dbid BIGINT NOT NULL, + qid BIGINT, + vid BIGINT, + tid BIGINT, + publisher VARCHAR(255) NOT NULL, + language VARCHAR(2), + publication_year INTEGER NOT NULL, + publication_month INTEGER, + publication_day INTEGER, + identifier_type ENUM ('DATABASE', 'SUBSET', 'VIEW', 'TABLE') NOT NULL, + status ENUM ('DRAFT', 'PUBLISHED') NOT NULL DEFAULT ('PUBLISHED'), + query TEXT, + query_normalized TEXT, + query_hash VARCHAR(255), + execution TIMESTAMP, + result_hash VARCHAR(255), + result_number BIGINT, + doi VARCHAR(255), + created TIMESTAMP NOT NULL DEFAULT NOW(), + created_by VARCHAR(36) NOT NULL, + last_modified TIMESTAMP, + PRIMARY KEY (id), /* must be a single id from persistent identifier concept */ + FOREIGN KEY (dbid) REFERENCES mdb_databases (id), + FOREIGN KEY (created_by) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_licenses` +( + pid bigint NOT NULL, + license_id VARCHAR(255) NOT NULL, + PRIMARY KEY (pid, license_id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id), + FOREIGN KEY (license_id) REFERENCES mdb_licenses (identifier) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_titles` +( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + title text NOT NULL, + title_type ENUM ('ALTERNATIVE_TITLE', 'SUBTITLE', 'TRANSLATED_TITLE', 'OTHER'), + language VARCHAR(2), + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_funders` +( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + funder_name VARCHAR(255) NOT NULL, + funder_identifier TEXT, + funder_identifier_type ENUM ('CROSSREF_FUNDER_ID', 'GRID', 'ISNI', 'ROR', 'OTHER'), + scheme_uri text, + award_number VARCHAR(255), + award_title text, + language VARCHAR(255), + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_descriptions` +( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + description text NOT NULL, + description_type ENUM ('ABSTRACT', 'METHODS', 'SERIES_INFORMATION', 'TABLE_OF_CONTENTS', 'TECHNICAL_INFO', 'OTHER'), + language VARCHAR(2), + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_related_identifiers` +( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + value varchar(255) NOT NULL, + type varchar(255) NOT NULL, + relation varchar(255) NOT NULL, + PRIMARY KEY (id), /* must be a single id from persistent identifier concept */ + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id), + UNIQUE (pid, value) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_identifier_creators` +( + id bigint NOT NULL AUTO_INCREMENT, + pid bigint NOT NULL, + given_names text, + family_name text, + creator_name VARCHAR(255) NOT NULL, + name_type ENUM ('PERSONAL', 'ORGANIZATIONAL') default 'PERSONAL', + name_identifier text, + name_identifier_scheme ENUM ('ROR', 'GRID', 'ISNI', 'ORCID'), + name_identifier_scheme_uri text, + affiliation VARCHAR(255), + affiliation_identifier text, + affiliation_identifier_scheme ENUM ('ROR', 'GRID', 'ISNI'), + affiliation_identifier_scheme_uri text, + PRIMARY KEY (id), + FOREIGN KEY (pid) REFERENCES mdb_identifiers (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_update` +( + uUserID character varying(255) NOT NULL, + uDBID bigint NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (uUserID, uDBID), + FOREIGN KEY (uDBID) REFERENCES mdb_databases (id) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_access` +( + aUserID character varying(255) NOT NULL, + aDBID bigint REFERENCES mdb_databases (id), + attime TIMESTAMP, + download BOOLEAN, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (aUserID, aDBID) +) WITH SYSTEM VERSIONING; + +CREATE TABLE IF NOT EXISTS `mdb_have_access` +( + user_id character varying(36) NOT NULL, + database_id bigint REFERENCES mdb_databases (id), + access_type ENUM ('READ', 'WRITE_OWN', 'WRITE_ALL') NOT NULL, + created timestamp NOT NULL DEFAULT NOW(), + PRIMARY KEY (user_id, database_id), + FOREIGN KEY (user_id) REFERENCES mdb_users (id) +) WITH SYSTEM VERSIONING; + +COMMIT; +BEGIN; + +INSERT INTO `mdb_licenses` (identifier, uri, description) +VALUES ('CC0-1.0', 'https://creativecommons.org/publicdomain/zero/1.0/legalcode', + 'CC0 waives copyright interest in a work you''ve created and dedicates it to the world-wide public domain. Use CC0 to opt out of copyright entirely and ensure your work has the widest reach.'), + ('CC-BY-4.0', 'https://creativecommons.org/licenses/by/4.0/legalcode', + 'The Creative Commons Attribution license allows re-distribution and re-use of a licensed work on the condition that the creator is appropriately credited.'); + +INSERT INTO `mdb_images` (name, registry, version, default_port, dialect, driver_class, jdbc_method) +VALUES ('mariadb', 'docker.io', '11.1.3', 3306, 'org.hibernate.dialect.MariaDBDialect', 'org.mariadb.jdbc.Driver', + 'mariadb'); + +INSERT INTO `mdb_images_date` (iid, database_format, unix_format, example, has_time) +VALUES (1, '%Y-%c-%d %H:%i:%S.%f', 'yyyy-MM-dd HH:mm:ss.SSSSSS', '2022-01-30 13:44:25.499', true), + (1, '%Y-%c-%d %H:%i:%S', 'yyyy-MM-dd HH:mm:ss', '2022-01-30 13:44:25', true), + (1, '%Y-%c-%d', 'yyyy-MM-dd', '2022-01-30', false), + (1, '%H:%i:%S', 'HH:mm:ss', '13:44:25', true), + (1, '%d.%c.%Y', 'dd.MM.yyyy', '30.01.2022', false); + +INSERT INTO `mdb_ontologies` (prefix, uri, uri_pattern, sparql_endpoint, rdf_path) +VALUES ('om', 'http://www.ontology-of-units-of-measure.org/resource/om-2/', + 'http://www.ontology-of-units-of-measure.org/resource/om-2/.*', null, 'rdf/om-2.0.rdf'), + ('wd', 'http://www.wikidata.org/', 'http://www.wikidata.org/entity/.*', 'https://query.wikidata.org/sparql', + null), + ('mo', 'http://purl.org/ontology/mo/', 'http://purl.org/ontology/mo/.*', null, null), + ('dc', 'http://purl.org/dc/elements/1.1/', null, null, null), + ('xsd', 'http://www.w3.org/2001/XMLSchema#', null, null, null), + ('tl', 'http://purl.org/NET/c4dm/timeline.owl#', null, null, null), + ('foaf', 'http://xmlns.com/foaf/0.1/', null, null, null), + ('schema', 'http://schema.org/', null, null, null), + ('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', null, null, null), + ('rdfs', 'http://www.w3.org/2000/01/rdf-schema#', null, null, null), + ('owl', 'http://www.w3.org/2002/07/owl#', null, null, null), + ('prov', 'http://www.w3.org/ns/prov#', null, null, null), + ('db', 'http://dbpedia.org', 'http://dbpedia.org/ontology/.*', 'http://dbpedia.org/sparql', null); +COMMIT; diff --git a/.docker/config/2_setup-data.sql b/.docker/config/2_setup-data.sql new file mode 100644 index 0000000000..e806e1e181 --- /dev/null +++ b/.docker/config/2_setup-data.sql @@ -0,0 +1,8 @@ +BEGIN; + +INSERT INTO `mdb_containers` (name, internal_name, image_id, host, port, ui_host, ui_port, sidecar_host, sidecar_port, + privileged_username, privileged_password) +VALUES ('mariadb:11.1.3-debian-11-r6', 'mariadb_11_1_3', 1, 'data-db', 3306, 'localhost', 3306, 'data-db-sidecar', 8080, + 'root', 'dbrepo'); + +COMMIT; diff --git a/.docker/config/advanced.config b/.docker/config/advanced.config new file mode 100644 index 0000000000..4445ea6019 --- /dev/null +++ b/.docker/config/advanced.config @@ -0,0 +1,17 @@ +[ + { + rabbitmq_auth_backend_ldap, + [ + { + tag_queries, [ + { + administrator, {in_group_nested, "cn=system,ou=users,dc=dbrepo,dc=at", "member"} + }, + { + management, {constant, true} + } + ] + } + ] + } +]. \ No newline at end of file diff --git a/.docker/config/dbrepo.conf b/.docker/config/dbrepo.conf new file mode 100644 index 0000000000..8ac239d464 --- /dev/null +++ b/.docker/config/dbrepo.conf @@ -0,0 +1,167 @@ +client_max_body_size 20G; + +resolver 127.0.0.11 valid=30s; # docker dns + +upstream auth { + server auth-service:8080; +} + +upstream broker { + server broker-service:15672; +} + +upstream analyse { + server analyse-service:8080; +} + +upstream data { + server data-service:8080; +} + +upstream metadata { + server metadata-service:8080; +} + +upstream search { + server search-service:8080; +} + +upstream ui { + server ui:3000; +} + +upstream upload { + server upload-service:8080; +} + +server { + listen 80 default_server; + server_name _; + + location /admin/broker { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://broker; + proxy_read_timeout 90; + } + + location /api/search { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://search; + proxy_read_timeout 90; + } + + location /api/broker { + rewrite /api/broker/(.*) /admin/broker/api/$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://broker; + proxy_read_timeout 90; + } + + location /api/upload { +# allow 128.130.0.0/16; +# deny all; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $host; + proxy_pass http://upload; + proxy_read_timeout 90; + # Disable request and response buffering + proxy_request_buffering off; + proxy_buffering off; + proxy_http_version 1.1; + } + + location /api/analyse { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://analyse; + proxy_read_timeout 90; + } + + location /api/auth { + rewrite /api/auth/(.*) /$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://auth; + proxy_read_timeout 90; + } + + location ~ /api/database/([0-9]+)/table/([0-9]+)/(data|history|export|statistic) { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data; + proxy_read_timeout 90; + } + + location ~ /api/database/([0-9]+)/view/([0-9]+)/data { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data; + proxy_read_timeout 90; + } + + location ~ /api/database/([0-9]+)/view { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata; + proxy_read_timeout 90; + } + + location ~ /api/database/([0-9]+)/subset { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data; + proxy_read_timeout 600; + } + + location ~ /api/(database|concept|container|identifier|image|message|license|oai|ontology|unit|user) { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata; + proxy_read_timeout 90; + } + + location ~ /pid/([0-9]+) { + rewrite /pid/(.*) /api/identifier/$1 break; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata; + proxy_read_timeout 90; + } + + location / { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://ui; + proxy_read_timeout 90; + } +} diff --git a/.docker/config/definitions.json b/.docker/config/definitions.json new file mode 100644 index 0000000000..a3b70c989d --- /dev/null +++ b/.docker/config/definitions.json @@ -0,0 +1,52 @@ +{ + "bindings": [ + { + "arguments": {}, + "destination": "dbrepo", + "destination_type": "queue", + "routing_key": "dbrepo.#", + "source": "dbrepo", + "vhost": "dbrepo" + } + ], + "exchanges": [ + { + "arguments": {}, + "auto_delete": false, + "durable": true, + "name": "dbrepo", + "type": "topic", + "vhost": "dbrepo" + } + ], + "global_parameters": [], + "parameters": [], + "permissions": [], + "policies": [], + "queues": [ + { + "arguments": { + "x-queue-type": "quorum" + }, + "auto_delete": false, + "durable": true, + "name": "dbrepo", + "type": "quorum", + "vhost": "dbrepo" + } + ], + "rabbit_version": "3.10.25", + "rabbitmq_version": "3.10.25", + "topic_permissions": [], + "users": [], + "vhosts": [ + { + "limits": [], + "metadata": { + "description": "Default virtual host", + "tags": [] + }, + "name": "dbrepo" + } + ] +} \ No newline at end of file diff --git a/.docker/config/enabled_plugins b/.docker/config/enabled_plugins new file mode 100644 index 0000000000..95f1c0014d --- /dev/null +++ b/.docker/config/enabled_plugins @@ -0,0 +1 @@ +[rabbitmq_prometheus,rabbitmq_auth_backend_ldap,rabbitmq_auth_mechanism_ssl,rabbitmq_management]. \ No newline at end of file diff --git a/.docker/config/rabbitmq.conf b/.docker/config/rabbitmq.conf new file mode 100644 index 0000000000..ff592bb3ec --- /dev/null +++ b/.docker/config/rabbitmq.conf @@ -0,0 +1,30 @@ +# user +default_vhost = dbrepo +default_user_tags.administrator = false + +# enable http outside localhost +listeners.tcp.1 = 0.0.0.0:5672 + +# management prefix (https://www.rabbitmq.com/management.html#path-prefix) +management.path_prefix = /admin/broker +management.load_definitions = /app/definitions.json + +# logging +log.console = true +log.console.level = warning +auth_ldap.log = true + +# Obviously your authentication server cannot vouch for itself, so you'll need another backend with at least one user in +# it. You should probably use the internal database +auth_backends.1.authn = ldap +auth_backends.1.authz = ldap +auth_backends.2 = internal + +# LDAP +auth_ldap.servers.1 = identity-service +auth_ldap.port = 1389 +auth_ldap.user_dn_pattern = ${username} +auth_ldap.dn_lookup_base = dc=dbrepo,dc=at +auth_ldap.dn_lookup_attribute = uid +auth_ldap.dn_lookup_bind.user_dn = cn=admin,dc=dbrepo,dc=at +auth_ldap.dn_lookup_bind.password = admin diff --git a/.docker/config/s3_config.json b/.docker/config/s3_config.json new file mode 100644 index 0000000000..f270753cdc --- /dev/null +++ b/.docker/config/s3_config.json @@ -0,0 +1,20 @@ +{ + "identities": [ + { + "name": "admin", + "credentials": [ + { + "accessKey": "seaweedfsadmin", + "secretKey": "seaweedfsadmin" + } + ], + "actions": [ + "Read", + "Write", + "List", + "Tagging", + "Admin" + ] + } + ] +} \ No newline at end of file diff --git a/.docker/dist.tar.gz b/.docker/dist.tar.gz index 411c92f64cd600841b98f1375c32b920895df2e0..f6c45cbd78ee20a3280a4b2bd6ec8b4cc37050e1 100644 GIT binary patch literal 9957 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 G0|Nj?rl+?6 literal 9967 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 Sp8K7C$y-*<3}N`dzyJU~P@B{M diff --git a/.env.unix.example b/.env.unix.example deleted file mode 100644 index cc42c24451..0000000000 --- a/.env.unix.example +++ /dev/null @@ -1 +0,0 @@ -LOG_LEVEL=trace # error, warning, info, debug, trace \ No newline at end of file diff --git a/.gitignore b/.gitignore index e552ece0ec..4d7b82f6e6 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ build/ tmp.yaml .docs/.swagger/api-* .scannerwork/ -.docker/config/* # docs .docs/.swagger/dist/ -- GitLab