From c7bfbcc022e8e91cd0a61b8f30096aad04e35654 Mon Sep 17 00:00:00 2001
From: Martin Weise <martin.weise@tuwien.ac.at>
Date: Thu, 31 Aug 2023 13:31:16 +0200
Subject: [PATCH] Added more envs

---
 dbrepo-authentication-service/Dockerfile |   2 +-
 dbrepo-broker-service/Dockerfile         |   3 ++
 dbrepo-gateway-service/dbrepo.conf       |  20 ++++++------
 dbrepo-ui/Dockerfile                     |   2 ++
 dbrepo-ui/config.js                      |  32 +++++++++---------
 dbrepo-ui/layouts/default.vue            |  14 ++++----
 dbrepo-ui/nuxt.config.js                 |   5 ++-
 dbrepo-ui/pages/login.vue                |  20 ++++++++++--
 dbrepo-ui/static/favicon_alt.ico         | Bin 0 -> 15086 bytes
 dbrepo-ui/static/favicon_alt.png         | Bin 0 -> 1794 bytes
 dbrepo-ui/store/index.js                 |  10 ++++++
 install.sh                               |  40 +++++++++++++++++++++++
 12 files changed, 112 insertions(+), 36 deletions(-)
 create mode 100644 dbrepo-ui/static/favicon_alt.ico
 create mode 100644 dbrepo-ui/static/favicon_alt.png
 create mode 100644 install.sh

diff --git a/dbrepo-authentication-service/Dockerfile b/dbrepo-authentication-service/Dockerfile
index 12cc75bde9..21a4e3ac45 100644
--- a/dbrepo-authentication-service/Dockerfile
+++ b/dbrepo-authentication-service/Dockerfile
@@ -46,7 +46,7 @@ ENV KC_DB_USERNAME=${AUTH_USERNAME}
 ENV KC_DB_PASSWORD=${AUTH_PASSWORD}
 ENV KC_HOSTNAME_STRICT_HTTPS=false
 ENV KC_HOSTNAME_PATH=/api/auth
-ENV KC_HOSTNAME_ADMIN_URL=http://localhost/api/auth
+ENV KC_HOSTNAME_ADMIN_URL=http://localhost/auth
 
 ENV KEYCLOAK_IMPORT=/opt/keycloak/data/import/dbrepo-realm.json
 ENV KEYCLOAK_ADMIN=fda
diff --git a/dbrepo-broker-service/Dockerfile b/dbrepo-broker-service/Dockerfile
index 2025bab24e..caef7401ec 100644
--- a/dbrepo-broker-service/Dockerfile
+++ b/dbrepo-broker-service/Dockerfile
@@ -11,4 +11,7 @@ COPY ./pubkey.pem ./pubkey.pem
 
 RUN rabbitmq-plugins enable --offline rabbitmq_prometheus rabbitmq_mqtt rabbitmq_auth_backend_oauth2 rabbitmq_auth_mechanism_ssl
 
+EXPOSE 5672
+EXPOSE 15672
+
 HEALTHCHECK --interval=10s --timeout=5s --retries=12 CMD wget --spider http://localhost:15672/broker/
diff --git a/dbrepo-gateway-service/dbrepo.conf b/dbrepo-gateway-service/dbrepo.conf
index c84c22f970..b5f706fced 100644
--- a/dbrepo-gateway-service/dbrepo.conf
+++ b/dbrepo-gateway-service/dbrepo.conf
@@ -34,16 +34,6 @@ server {
     listen 80 default_server;
     server_name _;
 
-    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://authentication;
-        proxy_read_timeout      90;
-    }
-
     location /api/broker {
         rewrite /api/broker/(.*) /api/$1 break;
         proxy_set_header        Host $host;
@@ -91,6 +81,16 @@ server {
         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://authentication;
+        proxy_read_timeout      90;
+    }
+
     location /retrieve {
         rewrite /retrieve/(.*) /$1 break;
         proxy_set_header        Host $host;
diff --git a/dbrepo-ui/Dockerfile b/dbrepo-ui/Dockerfile
index edc2116850..468f8d5f8c 100644
--- a/dbrepo-ui/Dockerfile
+++ b/dbrepo-ui/Dockerfile
@@ -42,6 +42,8 @@ EXPOSE 9100
 
 ENV BROKER_USERNAME="fda"
 ENV BROKER_PASSWORD="fda"
+ENV BROKER_LOGIN_URL="/broker/"
+ENV KEYCLOAK_LOGIN_URL="/api/auth/"
 ENV SHARED_FILESYSTEM="/tmp"
 ENV LOGO="/logo.png"
 ENV SEARCH_USERNAME="admin"
diff --git a/dbrepo-ui/config.js b/dbrepo-ui/config.js
index 79d165bd32..1ccca7b563 100644
--- a/dbrepo-ui/config.js
+++ b/dbrepo-ui/config.js
@@ -1,19 +1,21 @@
 const config = {}
 
-config.title = process.env.TITLE || 'Database Repository'
-config.icon = process.env.ICON || '/favicon.ico'
-config.brokerUsername = process.env.BROKER_USERNAME || 'fda'
-config.brokerPassword = process.env.BROKER_PASSWORD || 'fda'
-config.sharedFilesystem = process.env.SHARED_FILESYSTEM || '/tmp'
-config.version = process.env.VERSION || 'latest'
-config.logo = process.env.LOGO || '/logo.png'
-config.tokenMax = process.env.TOKEN_MAX || 5
-config.searchUsername = process.env.SEARCH_USERNAME || 'admin'
-config.searchPassword = process.env.SEARCH_PASSWORD || 'admin'
-config.clientId = process.env.DBREPO_CLIENT_ID || 'dbrepo-client'
-config.clientSecret = process.env.DBREPO_CLIENT_SECRET || 'MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG'
-config.defaultPublisher = process.env.DEFAULT_PID_PUBLISHER || 'Example University'
-config.doiUrl = process.env.DOI_URL || 'https://doi.org'
-config.uploadPath = process.env.UPLOAD_PATH || '/tmp/'
+config.title = process.env.TITLE || null
+config.icon = process.env.ICON || null
+config.brokerUsername = process.env.BROKER_USERNAME || null
+config.brokerPassword = process.env.BROKER_PASSWORD || null
+config.brokerLoginUrl = process.env.BROKER_LOGIN_URL || null
+config.keycloakLoginUrl = process.env.KEYCLOAK_LOGIN_URL || null
+config.sharedFilesystem = process.env.SHARED_FILESYSTEM || null
+config.version = process.env.VERSION || null
+config.logo = process.env.LOGO || null
+config.tokenMax = process.env.TOKEN_MAX || null
+config.searchUsername = process.env.SEARCH_USERNAME || null
+config.searchPassword = process.env.SEARCH_PASSWORD || null
+config.clientId = process.env.DBREPO_CLIENT_ID || null
+config.clientSecret = process.env.DBREPO_CLIENT_SECRET || null
+config.defaultPublisher = process.env.DEFAULT_PID_PUBLISHER || null
+config.doiUrl = process.env.DOI_URL || null
+config.uploadPath = process.env.UPLOAD_PATH || null
 
 module.exports = config
diff --git a/dbrepo-ui/layouts/default.vue b/dbrepo-ui/layouts/default.vue
index 42b6886014..f8c56d4a3d 100644
--- a/dbrepo-ui/layouts/default.vue
+++ b/dbrepo-ui/layouts/default.vue
@@ -9,12 +9,8 @@
       </div>
       <v-list-item class="mt-2">
         <v-list-item-content>
-          <v-list-item-subtitle>
-            {{ version }}
-          </v-list-item-subtitle>
-          <v-list-item-title class="text-h6">
-            Database Repository
-          </v-list-item-title>
+          <v-list-item-subtitle v-text="version" />
+          <v-list-item-title class="text-h6" v-text="title" />
         </v-list-item-content>
       </v-list-item>
       <v-list nav>
@@ -182,6 +178,9 @@ export default {
     version () {
       return this.$config.version
     },
+    title () {
+      return this.$config.title
+    },
     canListOntologies () {
       if (!this.roles) {
         return false
@@ -310,6 +309,8 @@ export default {
       this.$router.push({ path: '/search', query: { q: this.search } })
     },
     initEnvironment () {
+      this.$store.commit('SET_TITLE', this.$config.title)
+      this.$store.commit('SET_ICON', this.$config.icon)
       this.$store.commit('SET_CLIENT_ID', this.$config.clientId)
       this.$store.commit('SET_CLIENT_SECRET', this.$config.clientSecret)
       this.$store.commit('SET_BROKER_USERNAME', this.$config.brokerUsername)
@@ -317,6 +318,7 @@ export default {
       this.$store.commit('SET_SEARCH_USERNAME', this.$config.searchUsername)
       this.$store.commit('SET_SEARCH_PASSWORD', this.$config.searchPassword)
       this.$store.commit('SET_UPLOAD_PATH', this.$config.uploadPath)
+      console.debug('runtime config', this.$config)
     }
   }
 }
diff --git a/dbrepo-ui/nuxt.config.js b/dbrepo-ui/nuxt.config.js
index 915fef8e63..16fe0e4cc2 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 { icon, clientSecret, title, logo, version, defaultPublisher, doiUrl, clientId, uploadPath, brokerUsername, brokerPassword, searchUsername, searchPassword } from './config'
+import { icon, clientSecret, title, logo, version, defaultPublisher, doiUrl, clientId, uploadPath, brokerUsername, brokerPassword, searchUsername, searchPassword, brokerLoginUrl, keycloakLoginUrl } from './config'
 
 const proxy = {}
 
@@ -98,6 +98,7 @@ export default {
   proxy,
 
   publicRuntimeConfig: {
+    title,
     version,
     logo,
     clientId,
@@ -105,6 +106,8 @@ export default {
     defaultPublisher,
     brokerUsername,
     brokerPassword,
+    brokerLoginUrl,
+    keycloakLoginUrl,
     searchUsername,
     searchPassword,
     doiUrl,
diff --git a/dbrepo-ui/pages/login.vue b/dbrepo-ui/pages/login.vue
index 95c25af898..4ffb24e8e7 100644
--- a/dbrepo-ui/pages/login.vue
+++ b/dbrepo-ui/pages/login.vue
@@ -51,11 +51,19 @@
             Login
           </v-btn>
         </v-card-actions>
-        <v-card-text class="text-right">
-          <a href="/api/auth/">Admin Login</a>
-        </v-card-text>
       </v-card>
     </v-form>
+    <v-toolbar v-if="!token" flat>
+      <v-spacer />
+      <v-toolbar-title>
+        <v-btn v-if="rabbitMqUrl" color="orange" plain :href="rabbitMqUrl">
+          <v-icon left>mdi-rabbit</v-icon> RabbitMQ
+        </v-btn>
+        <v-btn v-if="keycloakUrl" color="secondary" plain :href="keycloakUrl">
+          <v-icon left>mdi-key</v-icon> Keycloak
+        </v-btn>
+      </v-toolbar-title>
+    </v-toolbar>
   </div>
 </template>
 
@@ -82,6 +90,12 @@ export default {
     },
     user () {
       return this.$store.state.user
+    },
+    keycloakUrl () {
+      return this.$config.keycloakLoginUrl
+    },
+    rabbitMqUrl () {
+      return this.$config.brokerLoginUrl
     }
   },
   mounted () {
diff --git a/dbrepo-ui/static/favicon_alt.ico b/dbrepo-ui/static/favicon_alt.ico
new file mode 100644
index 0000000000000000000000000000000000000000..f8f591a5acbf4973a3626032997b322386ed2217
GIT binary patch
literal 15086
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

literal 0
HcmV?d00001

diff --git a/dbrepo-ui/static/favicon_alt.png b/dbrepo-ui/static/favicon_alt.png
new file mode 100644
index 0000000000000000000000000000000000000000..32cfe969126f93df5632cbfb72a14845b840a3c7
GIT binary patch
literal 1794
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

literal 0
HcmV?d00001

diff --git a/dbrepo-ui/store/index.js b/dbrepo-ui/store/index.js
index 8fad6b2d54..7cfa08e424 100644
--- a/dbrepo-ui/store/index.js
+++ b/dbrepo-ui/store/index.js
@@ -11,6 +11,8 @@ Vue.use(Vuex)
 // https://github.com/hua1995116/webchat/blob/7c6544d3defd41cb7cf68306accea97800858bc3/client/src/store/index.js#L293
 const store = new Store({
   state: {
+    title: null,
+    icon: null,
     token: null,
     refreshToken: null,
     roles: [],
@@ -30,6 +32,8 @@ const store = new Store({
     uploadPath: null
   },
   getters: {
+    getTitle: state => state.title,
+    getIcon: state => state.icon,
     getToken: state => state.token,
     getRefreshToken: state => state.refreshToken,
     getRoles: state => state.roles,
@@ -49,6 +53,12 @@ const store = new Store({
     getUploadPath: state => state.uploadPath
   },
   mutations: {
+    SET_TITLE (state, title) {
+      state.title = title
+    },
+    SET_ICON (state, icon) {
+      state.icon = icon
+    },
     SET_TOKEN (state, token) {
       state.token = token
     },
diff --git a/install.sh b/install.sh
new file mode 100644
index 0000000000..627a55974e
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+if [ `whoami` -neq "root" ]; then
+  echo "This script needs sudo privileges!"
+  exit 1
+fi
+
+docker info > /dev/null
+if [ $? -ne 0 ]; then
+  echo "Docker is not installed (or accessible in bash) on your system:"
+  echo ""
+  echo "  - install docker from https://docs.docker.com/desktop/install/linux-install/"
+  echo "  - make sure the docker executable is in \$PATH"
+  exit 2
+fi
+
+echo "Gathering environment ..."
+curl -sSL -o .env https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/.env.unix.example
+curl -sSL -o docker-compose.yml https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/docker-compose.prod.yml
+curl -sSL -o dbrepo.conf https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/dbrepo.conf
+curl -sSL -o setup-schema_local.sql https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/dev/dbrepo-metadata-db/setup-schema_local.sql
+
+echo "Pulling images ..."
+docker compose pull
+
+MAX_MAP_COUNT=$(cat /proc/sys/vm/max_map_count)
+if [ "$MAX_MAP_COUNT" -lt 262144 ]; then
+  echo "Preparing environment ..."
+  echo "vm.max_map_count=262144" >> /etc/sysctl.conf
+  sysctl -p
+fi
+
+echo "Starting DBRepo ..."
+docker compose up -d
+
+if [ $? -eq 0 ]; then
+  echo "Successfully started. You can now inspect the logs with:"
+  echo ""
+  echo "docker compose logs -f"
+fi
\ No newline at end of file
-- 
GitLab