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