diff --git a/dbrepo-metadata-db/setup-schema.sql b/dbrepo-metadata-db/setup-schema.sql index 21081998abdc10c0ea8c72282133792c4f350765..c42a754e863da64daf563dc29821076e0d8c7891 100644 --- a/dbrepo-metadata-db/setup-schema.sql +++ b/dbrepo-metadata-db/setup-schema.sql @@ -51,9 +51,12 @@ CREATE TABLE IF NOT EXISTS `mdb_containers` internal_name character varying(255) NOT NULL, name character varying(255) NOT NULL, host character varying(255) NOT NULL, - port integer 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) NOT NULL, - sidecar_port integer NOT NULL, + sidecar_port integer NOT NULL default 3305, image_id bigint NOT NULL, created timestamp NOT NULL DEFAULT NOW(), last_modified timestamp, diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java index bedba0f11369ed3243e36d7c55671a08b82cd788..78435fc540721a6e695ba0346749b2827b913e3e 100644 --- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java +++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java @@ -48,6 +48,12 @@ public class ContainerDto { @JsonProperty("sidecar_port") private Integer sidecarPort; + @JsonProperty("ui_host") + private String uiHost; + + @JsonProperty("ui_port") + private Integer uiPort; + private ImageBriefDto image; @NotNull diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java index e44c9313841bd556b8b7cb6671fff75a53bddc93..82b646e3adbb682e1b6629f85afbb6efbeecdcee 100644 --- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java +++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/container/Container.java @@ -51,6 +51,15 @@ public class Container { @Column(nullable = false) private Integer sidecarPort; + @Column + private String uiHost; + + @Column + private Integer uiPort; + + @Column + private String uiAdditionalFlags; + @ToString.Exclude @org.springframework.data.annotation.Transient @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java index cd78c8200c12ca4ca21c3893d706818942dc39bf..ae3ae81be32720f67f7303a1920ecb153b2265ea 100644 --- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java +++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java @@ -825,6 +825,9 @@ public abstract class BaseTest { public final static String CONTAINER_1_NAME = "u01"; public final static String CONTAINER_1_INTERNALNAME = "dbrepo-userdb-u01"; public final static String CONTAINER_1_IP = "127.0.0.1"; + public final static String CONTAINER_1_UI_HOST = "localhost"; + public final static Integer CONTAINER_1_UI_PORT = 3306; + public final static String CONTAINER_1_UI_ADDITIONAL_FLAGS = "?sslMode=disable"; public final static Boolean CONTAINER_1_RUNNING = true; public final static String CONTAINER_1_HOST = "localhost"; public final static Integer CONTAINER_1_PORT = 3308; @@ -843,6 +846,9 @@ public abstract class BaseTest { .created(CONTAINER_1_CREATED) .host(CONTAINER_1_HOST) .port(CONTAINER_1_PORT) + .uiHost(CONTAINER_1_UI_HOST) + .uiPort(CONTAINER_1_UI_PORT) + .uiAdditionalFlags(CONTAINER_1_UI_ADDITIONAL_FLAGS) .sidecarHost(CONTAINER_1_SIDECAR_HOST) .sidecarPort(CONTAINER_1_SIDECAR_PORT) .privilegedUsername(CONTAINER_1_PRIVILEGED_USERNAME) diff --git a/dbrepo-ui/Dockerfile b/dbrepo-ui/Dockerfile index ff5efad1efd58121879e0f83c959f7930b2c8c0c..3336cdc5b50683d5a6b02299f20e7cd6586bab9b 100644 --- a/dbrepo-ui/Dockerfile +++ b/dbrepo-ui/Dockerfile @@ -8,8 +8,8 @@ ENV API=http://:80 WORKDIR /app -COPY ./package.json ./ -COPY ./yarn.lock ./ +COPY ./package.json ./package.json +COPY ./yarn.lock ./yarn.lock # Install yarn dependencies RUN yarn install --frozen-lockfile @@ -17,7 +17,7 @@ RUN yarn install --frozen-lockfile COPY ./nuxt.config.js ./nuxt.config.js COPY ./ava.config.cjs ./ava.config.cjs COPY ./babel.config.js ./babel.config.js -COPY ./config.js ./config.js +COPY ./dbrepo.config.json ./dbrepo.config.json COPY ./assets ./assets COPY ./api ./api COPY ./components ./components @@ -39,27 +39,6 @@ MAINTAINER Martin Weise <martin.weise@tuwien.ac.at> EXPOSE 3000 EXPOSE 9100 -ENV BROKER_USERNAME="fda" -ENV BROKER_PASSWORD="fda" -ENV BROKER_LOGIN_URL="/admin/broker/" -ENV KEYCLOAK_LOGIN_URL="/api/auth/" -ENV OPENSEARCH_LOGIN_URL="/admin/dashboard/" -ENV MINIO_LOGIN_URL="/admin/storage/" -ENV LOGO="/logo.png" -ENV SEARCH_USERNAME="admin" -ENV SEARCH_PASSWORD="admin" -ENV S3_STORAGE_HOSTNAME="storage-service" -ENV S3_STORAGE_PORT="9000" -ENV S3_ACCESS_KEY_ID="minioadmin" -ENV S3_SECRET_ACCESS_KEY="minioadmin" -ENV VERSION="${TAG}" -ENV TITLE="Database Repository" -ENV ICON="/favicon.ico" -ENV DBREPO_CLIENT_ID="dbrepo-client" -ENV DBREPO_CLIENT_SECRET="MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG" -ENV DEFAULT_PID_PUBLISHER="" -ENV FORCE_SSL="false" - WORKDIR /app COPY --from=build /app /app diff --git a/dbrepo-ui/config.js b/dbrepo-ui/config.js deleted file mode 100644 index e5d23835276fa64031bd07a38bc52bbc4e93049b..0000000000000000000000000000000000000000 --- a/dbrepo-ui/config.js +++ /dev/null @@ -1,22 +0,0 @@ -const config = {} - -config.title = process.env.NODE_ENV !== 'development' ? process.env.TITLE : 'Database Repository' -config.icon = process.env.NODE_ENV !== 'development' ? process.env.ICON : '/favicon.ico' -config.brokerLoginUrl = process.env.NODE_ENV !== 'development' ? process.env.BROKER_LOGIN_URL : '/admin/broker/' -config.keycloakLoginUrl = process.env.NODE_ENV !== 'development' ? process.env.KEYCLOAK_LOGIN_URL : '/api/auth/' -config.openSearchUrl = process.env.NODE_ENV !== 'development' ? process.env.OPENSEARCH_LOGIN_URL : '/admin/dashboard/' -config.version = process.env.NODE_ENV !== 'development' ? process.env.VERSION : 'vue-dev' -config.logo = process.env.NODE_ENV !== 'development' ? process.env.LOGO : '/logo.png' -config.searchUsername = process.env.NODE_ENV !== 'development' ? process.env.SEARCH_USERNAME : 'admin' -config.searchPassword = process.env.NODE_ENV !== 'development' ? process.env.SEARCH_PASSWORD : 'admin' -config.clientId = process.env.NODE_ENV !== 'development' ? process.env.DBREPO_CLIENT_ID : 'dbrepo-client' -config.clientSecret = process.env.NODE_ENV !== 'development' ? process.env.DBREPO_CLIENT_SECRET : 'MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG' -config.defaultPublisher = process.env.NODE_ENV !== 'development' ? process.env.DEFAULT_PID_PUBLISHER : '' -config.doiUrl = process.env.NODE_ENV !== 'development' ? process.env.DOI_URL : 'https://doi.org' -config.minIoUrl = process.env.NODE_ENV !== 'development' ? process.env.MINIO_LOGIN_URL : '/admin/storage/' -config.s3storageHostname = process.env.NODE_ENV !== 'development' ? process.env.S3_STORAGE_HOSTNAME : 'storage-service' -config.s3storagePort = process.env.NODE_ENV !== 'development' ? Number(process.env.S3_STORAGE_PORT) : 9000 -config.s3accessKeyId = process.env.NODE_ENV !== 'development' ? process.env.S3_ACCESS_KEY_ID : 'minioadmin' -config.s3secretAccessKey = process.env.NODE_ENV !== 'development' ? process.env.S3_SECRET_ACCESS_KEY : 'minioadmin' -config.forceSsl = process.env.NODE_ENV !== 'development' ? process.env.FORCE_SSL === 'true' : false -module.exports = config diff --git a/dbrepo-ui/dbrepo.config.json b/dbrepo-ui/dbrepo.config.json new file mode 100644 index 0000000000000000000000000000000000000000..5683a2059536cf5fd21a4065f1f318cc9577d4a0 --- /dev/null +++ b/dbrepo-ui/dbrepo.config.json @@ -0,0 +1,114 @@ +{ + "title": "Database Repository", + "version": "vue-dev", + "ssl": { + "force": false + }, + "logo": { + "path": "/logo.png" + }, + "icon": { + "path": "/favicon.ico" + }, + "broker": { + "connection": { + "host": "localhost", + "ports": [ + 5672 + ], + "extraInfo": null + } + }, + "storage": { + "endpoint": "storage-service", + "port": 9000, + "useSsl": false, + "accessKey": { + "id": "minioadmin", + "secret": "minioadmin" + } + }, + "database": { + "connection": { + "extraInfo": null + } + }, + "keycloak": { + "client": { + "id": "dbrepo-client", + "secret": "MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG" + } + }, + "opensearch": { + "username": "admin", + "password": "admin" + }, + "pid": { + "default": { + "publisher": "" + } + }, + "doi": { + "url": "https://doi.org" + }, + "pages": { + "login": { + "links": [ + { + "text": "OpenSearch Admin", + "blank": true, + "href": "http://localhost/admin/dashboard" + }, + { + "text": "Storage Admin", + "blank": true, + "href": "http://localhost/admin/storage" + }, + { + "text": "RabbitMQ Admin", + "blank": true, + "href": "http://localhost/admin/broker" + }, + { + "text": "Keycloak Admin", + "blank": true, + "href": "http://localhost/api/auth" + } + ] + }, + "information": { + "links": [ + { + "text": "Online Documentation", + "blank": true, + "href": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/latest/" + }, + { + "text": "Sourcecode Documentation", + "blank": true, + "href": "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services" + }, + { + "text": "Docker Images", + "blank": true, + "href": "https://hub.docker.com/u/dbrepo" + }, + { + "text": "Demo Instance (Kubernetes)", + "blank": true, + "href": "https://test.dbrepo.tuwien.ac.at/" + }, + { + "text": "Demo Instance (Docker Compose)", + "blank": true, + "href": "https://dbrepo2.ec.tuwien.ac.at/" + }, + { + "text": "Paper", + "blank": true, + "href": "https://doi.org/10.2218/ijdc.v17i1.825" + } + ] + } + } +} diff --git a/dbrepo-ui/layouts/default.vue b/dbrepo-ui/layouts/default.vue index fa175be0f78335f4175f7c04fe3aebf20a1b97ea..9a3b21d8e7f1111ea26065b0388a6a786c6debb4 100644 --- a/dbrepo-ui/layouts/default.vue +++ b/dbrepo-ui/layouts/default.vue @@ -463,11 +463,6 @@ export default { this.$store.commit('SET_SEARCH_USERNAME', this.$config.searchUsername) this.$store.commit('SET_SEARCH_PASSWORD', this.$config.searchPassword) this.$store.commit('SET_DOI_URL', this.$config.doiUrl) - this.$store.commit('SET_S3_STORAGE_HOSTNAME', this.$config.s3storageHostname) - this.$store.commit('SET_S3_STORAGE_PORT', this.$config.s3storagePort) - this.$store.commit('SET_S3_ACCESS_KEY_ID', this.$config.s3accessKeyId) - this.$store.commit('SET_S3_SECRET_ACCESS_KEY', this.$config.s3secretAccessKey) - this.$store.commit('SET_FORCE_SSL', this.$config.forceSsl) console.debug('runtime config', this.$config) }, advancedSearch () { @@ -544,6 +539,11 @@ export default { return this.dynamicFieldsMap()[this.advancedSearchData.type].includes(item.attribute_name) } }, + head () { + return { + title: this.$config.title + } + }, provide () { return { advancedSearchData: this.advancedSearchData diff --git a/dbrepo-ui/nuxt.config.js b/dbrepo-ui/nuxt.config.js index 91db20c2cf3acec146bd6800c665083e8fa69e72..9bab00a4e3e6396f6d29a6b68981af73ac6c712a 100644 --- a/dbrepo-ui/nuxt.config.js +++ b/dbrepo-ui/nuxt.config.js @@ -1,6 +1,6 @@ import path from 'path' import colors from 'vuetify/es5/util/colors' -import { forceSsl, icon, clientSecret, title, logo, version, defaultPublisher, doiUrl, minIoUrl, clientId, searchUsername, searchPassword, brokerLoginUrl, keycloakLoginUrl, openSearchUrl, s3storageHostname, s3storagePort, s3accessKeyId, s3secretAccessKey } from './config' +import config from './dbrepo.config.json' const proxy = {} @@ -29,6 +29,8 @@ const meta = [ { name: 'viewport', content: 'width=device-width, initial-scale=1' } ] +const forceSsl = config.ssl.force + if (forceSsl) { console.info('Flag FORCE_SSL is set: http-equiv Content-Security-Policy header is set to upgrade-insecure-requests') meta.push({ 'http-equiv': 'Content-Security-Policy', content: 'upgrade-insecure-requests' }) @@ -47,10 +49,10 @@ export default { }, head: { - title, + title: config.title, meta, link: [ - { rel: 'icon', type: 'image/x-icon', href: icon } + { rel: 'icon', type: 'image/x-icon', href: config.icon.path } ] }, @@ -96,23 +98,21 @@ export default { proxy, publicRuntimeConfig: { - title, - version, - logo, - clientId, - clientSecret, - defaultPublisher, - brokerLoginUrl, - keycloakLoginUrl, - openSearchUrl, - searchUsername, - searchPassword, - doiUrl, - minIoUrl, - s3storageHostname, - s3storagePort, - s3accessKeyId, - s3secretAccessKey + title: config.title, + version: config.version, + logo: config.logo.path, + clientId: config.keycloak.client.id, + clientSecret: config.keycloak.client.secret, + defaultPublisher: config.pid.default.publisher, + searchUsername: config.opensearch.username, + searchPassword: config.opensearch.password, + doiUrl: config.doi.url, + infoLinks: config.pages.information.links, + loginLinks: config.pages.login.links, + brokerHost: config.broker.connection.host, + brokerPorts: config.broker.connection.ports, + brokerExtraInfo: config.broker.connection.extraInfo, + databaseExtraInfo: config.database.connection.extraInfo }, serverMiddleware: [ diff --git a/dbrepo-ui/pages/database/_database_id/info.vue b/dbrepo-ui/pages/database/_database_id/info.vue index 8715c63e2fc5ef5795571da749838434060edcf7..de0a1082ed8366e3407daacf297b2465773f344d 100644 --- a/dbrepo-ui/pages/database/_database_id/info.vue +++ b/dbrepo-ui/pages/database/_database_id/info.vue @@ -77,14 +77,22 @@ Database Access </v-list-item-title> <v-list-item-content v-if="access && access.type"> - <v-skeleton-loader v-if="loading" type="text" class="skeleton-small" /> - {{ accessDescription.text }} + <span> + <v-badge inline :content="databaseExtraInfo" color="primary"> + <pre v-text="accessDescription.text" /> + </v-badge> + </span> + </v-list-item-content> + <v-list-item-title v-if="access" class="mt-2"> + Database Connection + </v-list-item-title> + <v-list-item-content v-if="access"> + <pre class="pb-1" v-text="jdbcString" /> </v-list-item-content> <v-list-item-title v-if="contact" class="mt-2"> Database Contact </v-list-item-title> <v-list-item-content v-if="contact"> - <v-skeleton-loader v-if="loading" type="text" class="skeleton-small" /> <span v-if="!loading" v-text="contact" /> </v-list-item-content> </v-list-item-content> @@ -298,6 +306,12 @@ export default { return false } return this.database.owner.username === this.user.username + }, + jdbcString () { + return `jdbc://${this.database.container.ui_host}:${this.database.container.ui_port}/${this.database.internal_name}${this.database.container.ui_additional_flags} (username=${this.user.username}, password=yourpassword)` + }, + databaseExtraInfo () { + return this.$config.databaseExtraInfo } }, methods: { diff --git a/dbrepo-ui/pages/database/_database_id/table/_table_id/info.vue b/dbrepo-ui/pages/database/_database_id/table/_table_id/info.vue index f6960c957bf685e04862e0859988110d149bf333..e5a5e86ff2b4c8c426632e6ebb91d88bc08ca69e 100644 --- a/dbrepo-ui/pages/database/_database_id/table/_table_id/info.vue +++ b/dbrepo-ui/pages/database/_database_id/table/_table_id/info.vue @@ -31,9 +31,19 @@ <v-list-item-content v-if="table && table.created"> <span>{{ createdUTC }}</span> </v-list-item-content> + <v-list-item-title v-if="access && access.type" class="mt-2"> + Table Access + </v-list-item-title> + <v-list-item-content v-if="access && access.type"> + <span> + <v-badge inline :content="brokerExtraInfo" color="primary"> + <span v-text="accessDescription.text" /> + </v-badge> + </span> + </v-list-item-content> </v-list-item-content> </v-list-item> - <v-list-item v-if="canWriteQueues"> + <v-list-item v-if="canWrite && canWriteQueues"> <v-list-item-icon> <v-icon>mdi-rabbit</v-icon> </v-list-item-icon> @@ -49,7 +59,7 @@ </v-list-item-title> <v-list-item-content v-if="database"> <span> - <v-badge inline :content="database.exchange_type" color="primary">{{ database.exchange_name }}</v-badge> + <v-badge inline :content="database.exchange_type" color="secondary">{{ database.exchange_name }}</v-badge> </span> </v-list-item-content> <v-list-item-title class="mt-2"> @@ -57,7 +67,7 @@ </v-list-item-title> <v-list-item-content v-if="table"> <span> - <v-badge inline :content="table.queue_type" color="primary">{{ table.queue_name }}</v-badge> + <v-badge inline :content="table.queue_type" color="secondary">{{ table.queue_name }}</v-badge> </span> </v-list-item-content> <v-list-item-title v-if="table && table.routing_key" class="mt-2"> @@ -66,11 +76,16 @@ <v-list-item-content v-if="table && table.routing_key"> <pre v-text="table.routing_key" /> </v-list-item-content> - <v-list-item-title v-if="canRead" class="mt-2"> + <v-list-item-title class="mt-2"> Connection String </v-list-item-title> <v-list-item-content> - <pre v-text="amqpString" /> + <span v-for="(port, i) in brokerPorts" :key="i"> + <pre v-if="![5671,5672].includes(port)" class="pb-1" v-text="amqpString" /> + <v-badge inline :content="amqpBadgeText(port)" :color="amqpBadgeColor(port)"> + <pre class="pb-1" v-text="amqpString(port)" /> + </v-badge> + </span> </v-list-item-content> </v-list-item-content> </v-list-item> @@ -130,6 +145,12 @@ export default { } return this.access.type === 'read' || this.access.type === 'write_own' || this.access.type === 'write_all' }, + canWrite () { + if (!this.table || !this.user || !this.access) { + return false + } + return (this.access.type === 'write_own' && this.table.owner.id === this.user.id) || this.access.type === 'write_all' + }, createdUTC () { if (this.table.created === undefined || this.table.created === null) { return null @@ -166,11 +187,26 @@ export default { } return this.version.substring(0, 10) + 'T' + this.version.substring(11, 19) + 'Z' }, - amqpString () { - if (!this.user) { - return null + brokerExtraInfo () { + return this.$config.brokerExtraInfo + }, + brokerHost () { + return this.$config.brokerHost + }, + brokerPorts () { + return this.$config.brokerPorts + }, + accessDescription () { + if (!this.access) { + return + } + if (this.canWrite) { + return { text: 'You can write to this table' } + } else if (this.canRead) { + return { text: 'You can read all contents of this table' } + } else { + return { text: null } } - return `amqp://${window.location.hostname}:5672/dbrepo (username=${this.user.username}, password=yourpassword)` } }, methods: { @@ -182,6 +218,28 @@ export default { return false } return table.owner.id === this.user.id + }, + amqpBadgeText (port) { + if (port === 5672) { + return 'insecure' + } else if (port === 5671) { + return 'secure' + } + return null + }, + amqpBadgeColor (port) { + if (port === 5672) { + return 'warning' + } else if (port === 5671) { + return 'success' + } + return null + }, + amqpString (port) { + if (!this.user) { + return null + } + return `amqp://${this.brokerHost}:${port}/dbrepo (username=${this.user.username}, password=yourpassword)` } } } diff --git a/dbrepo-ui/pages/index.vue b/dbrepo-ui/pages/index.vue index 646c9f58acfd050b36433773964771f8a79cdd2b..f2c22e4aef9f37fed61ebf5cd7272298498c2334 100644 --- a/dbrepo-ui/pages/index.vue +++ b/dbrepo-ui/pages/index.vue @@ -1,25 +1,14 @@ <template> <div> <v-card flat tile> - <v-card-text> + <v-card-text v-if="infoLinks && infoLinks.length > 0"> <div class="mb-2">Important Links</div> <div class="text--primary"> <ul> - <li> - <a href="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/" target="_blank">Online Documentation</a> - </li> - <li> - <a href="https://doi.org/10.2218/ijdc.v17i1.825" target="_blank">System Description</a> - </li> - <li> - <a href="https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services" target="_blank">Sourcecode - Documentation</a> - </li> - <li> - <a href="https://hub.docker.com/u/dbrepo" target="_blank">Docker Images</a> - </li> - <li> - <a href="https://dbrepo2.ec.tuwien.ac.at/" target="_blank">Demo Instance</a> + <li v-for="(link, i) in infoLinks" :key="i"> + <a :href="link.href" :target="link.blank ? '_blank' : 'self'"> + {{ link.text }} <sup v-if="link.blank"><v-icon color="primary" x-small>mdi-open-in-new</v-icon></sup> + </a> </li> </ul> </div> @@ -86,6 +75,12 @@ <script> export default { - components: {} + computed: { + infoLinks () { + const infoLinks = this.$config.infoLinks + console.debug('info links', infoLinks) + return infoLinks + } + } } </script> diff --git a/dbrepo-ui/pages/login.vue b/dbrepo-ui/pages/login.vue index 057e21926280e8bfbcf6e259ea70c0bb3ae89f35..fad6973e5b069ef86ceb0c90be85625dc3236440 100644 --- a/dbrepo-ui/pages/login.vue +++ b/dbrepo-ui/pages/login.vue @@ -52,17 +52,8 @@ </v-btn> </v-card-actions> <v-card-subtitle class="text-right"> - <a v-if="openSearchUrl" class="mr-1" :href="openSearchUrl" target="_blank"> - OpenSearch Admin <sup><v-icon color="primary" x-small>mdi-open-in-new</v-icon></sup> - </a> - <a v-if="rabbitMqUrl" class="mr-1" :href="rabbitMqUrl" target="_blank"> - RabbitMQ Admin <sup><v-icon color="primary" x-small>mdi-open-in-new</v-icon></sup> - </a> - <a v-if="keycloakUrl" class="ml-1" :href="keycloakUrl" target="_blank"> - Keycloak Admin <sup><v-icon color="primary" x-small>mdi-open-in-new</v-icon></sup> - </a> - <a v-if="minIoUrl" class="ml-1" :href="minIoUrl" target="_blank"> - MinIO Admin <sup><v-icon color="primary" x-small>mdi-open-in-new</v-icon></sup> + <a v-for="(link, i) in loginLinks" :key="i" class="ml-1" :href="link.href" :target="link.blank ? '_blank' : 'self'"> + {{ link.text }} <sup v-if="link.blank"><v-icon color="primary" x-small>mdi-open-in-new</v-icon></sup> </a> </v-card-subtitle> </v-card> @@ -94,17 +85,10 @@ export default { user () { return this.$store.state.user }, - keycloakUrl () { - return this.$config.keycloakLoginUrl - }, - rabbitMqUrl () { - return this.$config.brokerLoginUrl - }, - openSearchUrl () { - return this.$config.openSearchUrl - }, - minIoUrl () { - return this.$config.minIoUrl + loginLinks () { + const loginLinks = this.$config.loginLinks + console.debug('login links', loginLinks) + return loginLinks } }, mounted () { diff --git a/dbrepo-ui/server-middleware/index.js b/dbrepo-ui/server-middleware/index.js index 6d2f71275988547b857766ccae4c72055e8ecf64..40b785bac1f38f7748dc6ecb220eaef1c79af24b 100644 --- a/dbrepo-ui/server-middleware/index.js +++ b/dbrepo-ui/server-middleware/index.js @@ -1,18 +1,18 @@ +import config from '../dbrepo.config.json' const express = require('express') const multer = require('multer') const Minio = require('minio') -const { s3storageHostname, s3storagePort, forceSsl, s3accessKeyId, s3secretAccessKey } = require('../config') const { buildQuery } = require('./query') const app = express() app.use(express.json()) const minioClient = new Minio.Client({ - endPoint: s3storageHostname, - port: s3storagePort, - useSSL: forceSsl, - accessKeyId: s3accessKeyId, - secretAccessKey: s3secretAccessKey + endPoint: config.storage.endpoint, + port: config.storage.port, + useSSL: config.storage.useSsl, + accessKeyId: config.storage.accessKey.id, + secretAccessKey: config.storage.accessKey.secret }) app.post('/query/build', (req, res) => { diff --git a/dbrepo-ui/store/index.js b/dbrepo-ui/store/index.js index f6ca7efdb7d8140efbd3ef101714c43bb91a68a4..b919a18df9b3cd3076efd7f809a8406709147baf 100644 --- a/dbrepo-ui/store/index.js +++ b/dbrepo-ui/store/index.js @@ -28,12 +28,7 @@ const store = new Store({ searchUsername: null, searchPassword: null, databaseCount: null, - doiUrl: null, - s3storageHostname: null, - s3storagePort: null, - s3accessKeyId: null, - s3secretAccessKey: null, - forceSsl: null + doiUrl: null }, getters: { getTitle: state => state.title, @@ -52,12 +47,7 @@ const store = new Store({ getClientSecret: state => state.clientSecret, getSearchUsername: state => state.searchUsername, getSearchPassword: state => state.searchPassword, - getDatabaseCount: state => state.databaseCount, - getS3storageHostname: state => state.s3storageHostname, - getS3storagePort: state => state.s3storagePort, - getS3accessKeyId: state => state.s3accessKeyId, - getS3secretAccessKey: state => state.s3secretAccessKey, - getForceSsl: state => state.forceSsl + getDatabaseCount: state => state.databaseCount }, mutations: { SET_TITLE (state, title) { @@ -113,21 +103,6 @@ const store = new Store({ }, SET_DOI_URL (state, doiUrl) { state.doiUrl = doiUrl - }, - SET_S3_STORAGE_HOSTNAME (state, s3storageHostname) { - state.s3storageHostname = s3storageHostname - }, - SET_S3_STORAGE_PORT (state, s3storagePort) { - state.s3storagePort = s3storagePort - }, - SET_S3_ACCESS_KEY_ID (state, s3accessKeyId) { - state.s3accessKeyId = s3accessKeyId - }, - SET_S3_SECRET_ACCESS_KEY (state, s3secretAccessKey) { - state.s3secretAccessKey = s3secretAccessKey - }, - SET_FORCE_SSL (state, forceSsl) { - state.forceSsl = forceSsl } }, actions: { diff --git a/dbrepo-upload-service/README.md b/dbrepo-upload-service/README.md deleted file mode 100644 index a8d1e38506fc48b28470b7723de7c76f64865874..0000000000000000000000000000000000000000 --- a/dbrepo-upload-service/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Upload Service - -## Actuator - -- Info: http://localhost:1080 -- Prometheus: http://localhost:1080/metrics - -## TUS - -- File upload: http://localhost:1080/api/upload/files \ No newline at end of file diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index b93f1ad203b390b6538e3bc539bf3a9ed6d34cbe..a703eadeabf41b0f402e844e75dec406e93e9b6c 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -273,27 +273,8 @@ services: container_name: dbrepo-ui hostname: ui image: docker.io/dbrepo/ui:latest - environment: - BROKER_USERNAME: "${BROKER_USERNAME:-fda}" - BROKER_PASSWORD: "${BROKER_PASSWORD:-fda}" - BROKER_LOGIN_URL: "${BROKER_LOGIN_URL:-/admin/broker/}" - KEYCLOAK_LOGIN_URL: "${KEYCLOAK_LOGIN_URL:-/api/auth/admin/}" - OPENSEARCH_LOGIN_URL: "${OPENSEARCH_LOGIN_URL:-/admin/dashboard/}" - SHARED_FILESYSTEM: "${SHARED_FILESYSTEM:-/tmp}" - LOGO: "${LOGO:-/logo.png}" - SEARCH_USERNAME: "${SEARCH_USERNAME:-admin}" - SEARCH_PASSWORD: "${SEARCH_PASSWORD:-admin}" - VERSION: "${VERSION:-latest}" - TITLE: "${TITLE:-Database Repository}" - ICON: "${ICON:-/favicon.ico}" - DBREPO_CLIENT_ID: "${DBREPO_CLIENT_ID:-dbrepo-client}" - DBREPO_CLIENT_SECRET: "${DBREPO_CLIENT_SECRET:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}" - S3_STORAGE_HOSTNAME: "${STORAGE_HOSTNAME:-storage-service}" - S3_STORAGE_PORT: "${STORAGE_PORT:-9000}" - S3_ACCESS_KEY_ID: "${STORAGE_USERNAME:-minioadmin}" - S3_SECRET_ACCESS_KEY: ${STORAGE_PASSWORD:-minioadmin} - FORCE_SSL: "${FORCE_SSL:-false}" - DOI_URL: "${DOI_URL:-https://doi.org}" + volumes: + - ./dist/dbrepo.config.json:/app/dbrepo.config.json depends_on: dbrepo-search-service: condition: service_started diff --git a/docker-compose.yml b/docker-compose.yml index 809b7546e0fc4a77c31a909ae7115816665ace9b..f38cb5618f150c5e5e1c439efef7e20aff3c8045 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,7 +22,7 @@ services: build: ./dbrepo-metadata-db volumes: - metadata-db-data:/bitnami/mariadb - - ./dist/setup-schema_local.sql:/docker-entrypoint-initdb.d/setup-schema_local.sql + - ./dbrepo-metadata-db/setup-schema_local.sql:/docker-entrypoint-initdb.d/setup-schema_local.sql ports: - "3306:3306" environment: @@ -203,11 +203,11 @@ services: - "5672:5672" - "15672:15672" volumes: - - ./dist/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf - - ./dist/enabled_plugins:/etc/rabbitmq/enabled_plugins - - ./dist/cert.pem:/app/cert.pem - - ./dist/pubkey.pem:/app/pubkey.pem - - ./dist/definitions.json:/app/definitions.json + - ./dbrepo-broker-service/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf + - ./dbrepo-broker-service/enabled_plugins:/etc/rabbitmq/enabled_plugins + - ./dbrepo-broker-service/cert.pem:/app/cert.pem + - ./dbrepo-broker-service/pubkey.pem:/app/pubkey.pem + - ./dbrepo-broker-service/definitions.json:/app/definitions.json - broker-service-data:/bitnami/rabbitmq/mnesia healthcheck: test: rabbitmq-diagnostics -q is_running | grep 'is fully booted and running' @@ -281,27 +281,6 @@ services: hostname: ui image: dbrepo-ui:latest build: ./dbrepo-ui - environment: - BROKER_USERNAME: "${BROKER_USERNAME:-fda}" - BROKER_PASSWORD: "${BROKER_PASSWORD:-fda}" - BROKER_LOGIN_URL: "${BROKER_LOGIN_URL:-/admin/broker/}" - KEYCLOAK_LOGIN_URL: "${KEYCLOAK_LOGIN_URL:-/api/auth/admin/}" - OPENSEARCH_LOGIN_URL: "${OPENSEARCH_LOGIN_URL:-/admin/dashboard/}" - SHARED_FILESYSTEM: "${SHARED_FILESYSTEM:-/tmp}" - LOGO: "${LOGO:-/logo.png}" - SEARCH_USERNAME: "${SEARCH_USERNAME:-admin}" - SEARCH_PASSWORD: "${SEARCH_PASSWORD:-admin}" - VERSION: "${VERSION:-latest}" - TITLE: "${TITLE:-Database Repository}" - ICON: "${ICON:-/favicon.ico}" - DBREPO_CLIENT_ID: "${DBREPO_CLIENT_ID:-dbrepo-client}" - DBREPO_CLIENT_SECRET: "${DBREPO_CLIENT_SECRET:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}" - S3_STORAGE_HOSTNAME: "${STORAGE_HOSTNAME:-storage-service}" - S3_STORAGE_PORT: "${STORAGE_PORT:-9000}" - S3_ACCESS_KEY_ID: "${STORAGE_USERNAME:-minioadmin}" - S3_SECRET_ACCESS_KEY: ${STORAGE_PASSWORD:-minioadmin} - FORCE_SSL: "${FORCE_SSL:-false}" - DOI_URL: "${DOI_URL:-https://doi.org}" depends_on: dbrepo-search-service: condition: service_started @@ -319,7 +298,7 @@ services: - "80:80" - "443:443" volumes: - - ./dist/dbrepo.conf:/etc/nginx/conf.d/default.conf + - ./dbrepo-gateway-service/dbrepo.conf:/etc/nginx/conf.d/default.conf depends_on: dbrepo-analyse-service: condition: service_healthy @@ -342,7 +321,7 @@ services: hostname: search-db-dashboard image: docker.io/opensearchproject/opensearch-dashboards:2.10.0 volumes: - - ./dist/opensearch_dashboards.yml:/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml + - ./dbrepo-search-db/opensearch_dashboards.yml:/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml ports: - "5601:5601" depends_on: diff --git a/install.sh b/install.sh index 390f09dc43d50d0f185be23580a5eaa06137517b..0a2941913fc5772aad5d79ee48448ba9c30fe408 100644 --- a/install.sh +++ b/install.sh @@ -22,6 +22,7 @@ curl -sSL -o ./dist/pubkey.pem https://gitlab.phaidra.org/fair-data-austria-db-r curl -sSL -o ./dist/definitions.json https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-broker-service/definitions.json curl -sSL -o ./dist/dbrepo.conf https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-gateway-service/dbrepo.conf curl -sSL -o ./dist/opensearch_dashboards.yml https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-search-db/opensearch_dashboards.yml +curl -sSL -o ./dist/dbrepo.config.json https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-ui/dbrepo.config.json echo "[📦] Pulling images ..." docker compose pull