diff --git a/Makefile b/Makefile
index c2ad6efc9b84d2d0506452cf5784d86e783ce6de..fc078403586caacbb21d84f6208681756a86c0f0 100644
--- a/Makefile
+++ b/Makefile
@@ -1,17 +1,22 @@
 .PHONY: clean docs
 
+TAG ?= latest
+
 all: build
 
 clean:
 	rm -rf ./site
 
-docs: install-deps
-	python3 ./dockerhub/release.py
+release: release-docs release-dockerhub
 
-install-deps:
-	sudo pip3 install -r ./requirements.txt
+release-docs:
+	docker compose build dbrepo-docs
+	docker tag dbrepo-docs:latest "dbrepo/docs:${TAG}"
+	docker push "dbrepo/docs:${TAG}"
 
-release: install-deps
+release-dockerhub:
+	sudo pip3 install -r ./requirements.txt
+	python3 ./dockerhub/release.py
 
 verify:
 	sudo nginx -t
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..55a299509c9f5f4244502079de64602a3e3d49bd
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,12 @@
+version: "3.8"
+
+services:
+
+  dbrepo-docs:
+    image: dbrepo-docs
+    restart: on-failure
+    build: ./swagger
+    container_name: dbrepo-docs
+    hostname: dbrepo-docs
+    ports:
+      - "80:80"
\ No newline at end of file
diff --git a/dockerhub/fda-docs.md b/dockerhub/fda-docs.md
new file mode 100644
index 0000000000000000000000000000000000000000..262f431a6d8fed492ffaa61d69ac5f8a52ea3c56
--- /dev/null
+++ b/dockerhub/fda-docs.md
@@ -0,0 +1,9 @@
+# How to use this image
+
+```console
+$ docker run -p 80:80
+```
+
+## Customization
+
+No customization.
\ No newline at end of file
diff --git a/dockerhub/release.py b/dockerhub/release.py
index 18a1e38d125348ce7ae5d5d95a5e149d199c783c..c17623b68d64d0081962195e98a30330e869ab70 100755
--- a/dockerhub/release.py
+++ b/dockerhub/release.py
@@ -6,6 +6,6 @@ dockerhub = Dockerhub()
 if __name__ == "__main__":
     for component in ["analyse-service", "authentication-service", "broker-service", "container-service",
                       "database-service", "discovery-service", "gateway-service", "identifier-service",
-                      "metadata-db", "query-service", "search-service", "table-service", "ui", "units-service"]:
+                      "metadata-db", "query-service", "search-service", "table-service", "ui", "units-service", "docs"]:
         response = dockerhub.modify_description(component)
         print(response)
diff --git a/nginx/nginx.conf b/nginx/nginx.conf
deleted file mode 100644
index 02aef5ec8c9b71b012b71458fa4e3c1253deb203..0000000000000000000000000000000000000000
--- a/nginx/nginx.conf
+++ /dev/null
@@ -1,78 +0,0 @@
-# For more information on configuration, see:
-#   * Official English Documentation: http://nginx.org/en/docs/
-#   * Official Russian Documentation: http://nginx.org/ru/docs/
-
-user nginx;
-worker_processes auto;
-error_log /var/log/nginx/error.log;
-pid /run/nginx.pid;
-
-# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
-include /usr/share/nginx/modules/*.conf;
-
-events {
-    worker_connections 1024;
-}
-
-http {
-    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
-                      '$status $body_bytes_sent "$http_referer" '
-                      '"$http_user_agent" "$http_x_forwarded_for"';
-
-    access_log  /var/log/nginx/access.log  main;
-
-    sendfile            on;
-    tcp_nopush          on;
-    tcp_nodelay         on;
-    keepalive_timeout   65;
-    types_hash_max_size 2048;
-
-    include             /etc/nginx/mime.types;
-    default_type        application/octet-stream;
-
-    # Load modular configuration files from the /etc/nginx/conf.d directory.
-    # See http://nginx.org/en/docs/ngx_core_module.html#include
-    # for more information.
-    include /etc/nginx/conf.d/*.conf;
-
-    server {
-            listen 80 default_server;
-            listen [::]:80 default_server;
-            return 301 https://$host$request_uri;
-    }
-
-    server {
-            listen 443 ssl http2;
-            listen [::]:443 ssl http2;
-            root /usr/share/nginx/html/dbrepo-docs.ossdip.at;
-            index index.html index.htm;
-            server_name dbrepo-docs.ossdip.at;
-            ssl_certificate /etc/letsencrypt/live/dbrepo-docs.ossdip.at/fullchain.pem;
-            ssl_certificate_key /etc/letsencrypt/live/dbrepo-docs.ossdip.at/privkey.pem;
-            include /etc/letsencrypt/options-ssl-nginx.conf;
-            ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
-
-       location / {
-           try_files $uri $uri/ =404;
-       }
-
-    }
-
-#    server {
-#            listen 443 ssl http2;
-#            listen [::]:443 ssl http2;
-#            root /usr/share/nginx/html/ossdip.at;
-#            index index.html index.htm;
-#            server_name ossdip.at;
-#            ssl_certificate /etc/letsencrypt/live/ossdip.at/fullchain.pem;
-#            ssl_certificate_key /etc/letsencrypt/live/ossdip.at/privkey.pem;
-#            include /etc/letsencrypt/options-ssl-nginx.conf;
-#            ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
-#
-#       location / {
-#           try_files $uri $uri/ =404;
-#       }
-#
-#    }
-
-}
diff --git a/swagger/Dockerfile b/swagger/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..b7d9c039d8b56bad540a29c3fb26f812041e553d
--- /dev/null
+++ b/swagger/Dockerfile
@@ -0,0 +1,35 @@
+FROM nginx:latest AS runtime
+MAINTAINER Martin Weise <martin.weise@tuwien.ac.at>
+
+ARG SWAGGER_UI_VERSION=4.15.2
+
+RUN echo 1
+
+# reset
+RUN rm -f /usr/share/nginx/html/*
+
+WORKDIR /app
+
+ADD "https://github.com/swagger-api/swagger-ui/archive/refs/tags/v${SWAGGER_UI_VERSION}.tar.gz" /app/tmp.tar.gz
+RUN tar xzfv /app/tmp.tar.gz --strip-components 1 && rm -f /app/tmp.tar.gz
+
+COPY ./swagger-initializer.js ./swagger-initializer.js
+COPY ./docker-build.sh ./docker-build.sh
+RUN chmod +x ./docker-build.sh
+
+WORKDIR /usr/share/nginx/html/
+
+# copy api
+COPY ./index.html ./index.html
+COPY ./api-analyse.yaml ./analyse/api.yaml
+COPY ./api-authentication.yaml ./authentication/api.yaml
+COPY ./api-container.yaml ./container/api.yaml
+COPY ./api-database.yaml ./database/api.yaml
+COPY ./api-identifier.yaml ./identifier/api.yaml
+COPY ./api-metadata.yaml ./metadata/api.yaml
+COPY ./api-query.yaml ./query/api.yaml
+COPY ./api-table.yaml ./table/api.yaml
+COPY ./api-units.yaml ./units/api.yaml
+
+# generate
+RUN bash /app/docker-build.sh
\ No newline at end of file
diff --git a/swagger/api-document.yaml b/swagger/api-document.yaml
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/swagger/docker-build.sh b/swagger/docker-build.sh
new file mode 100644
index 0000000000000000000000000000000000000000..c8d0630c91e615bc31172b834dac4a3f0d0a7188
--- /dev/null
+++ b/swagger/docker-build.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+declare -A services
+services[5000]=analyse
+services[5010]=units
+services[9091]=container
+services[9092]=database
+services[9093]=query
+services[9094]=table
+services[9096]=identifier
+services[9097]=authentication
+services[9098]=metadata
+
+function copy () {
+  echo "... copy dist to $1"
+  cp -r /app/dist/* "./$1"
+}
+
+function init () {
+  echo "... copy initializer to $1"
+  cp /app/swagger-initializer.js "/usr/share/nginx/html/$1"
+}
+
+function replace () {
+  echo "... replace server url of $1"
+  sed -i -e "s/localhost.*/dbrepo1.ec.tuwien.ac.at\/api/g" "./$1/api.yaml"
+  sed -i -e "s/Generated server url/TU Wien DBRepo/g" "./$1/api.yaml"
+}
+
+for key in "${!services[@]}"; do
+  echo "Preparing ${services[$key]} API"
+  replace "${services[$key]}"
+  copy "${services[$key]}"
+  init "${services[$key]}"
+done
\ No newline at end of file
diff --git a/swagger/generate.sh b/swagger/generate.sh
index 677ce855f7cc4dca09fff0b7e7a342ef97e3e6d1..e22453902669f506b7dc5dcf892791546be9a565 100755
--- a/swagger/generate.sh
+++ b/swagger/generate.sh
@@ -1,13 +1,15 @@
 #!/bin/bash
 
 declare -A services
+services[5000]=analyse
 services[5010]=units
 services[9091]=container
 services[9092]=database
 services[9093]=query
 services[9094]=table
-services[9097]=authentication
 services[9096]=identifier
+services[9097]=authentication
+services[9098]=metadata
 
 function retrieve () {
   echo "... retrieve api"
diff --git a/swagger/index.html b/swagger/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..e730d640e2baa5e031974aea556a85df598bc7f1
--- /dev/null
+++ b/swagger/index.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<head>
+    <title>DBRepo Endpoint Documentation</title>
+</head>
+<body>
+    <h3>DBRepo Endpoint Documentation</h3>
+    <ul>
+        <li><a href="/analyse">Analyse Service</a></li>
+        <li><a href="/authentication">Authentication Service</a></li>
+        <li><a href="/container">Container Service</a></li>
+        <li><a href="/database">Database Service</a></li>
+        <li><a href="/identifier">Identifier Service</a></li>
+        <li><a href="/metadata">Metadata Service</a></li>
+        <li><a href="/query">Query Service</a></li>
+        <li><a href="/table">Table Service</a></li>
+        <li><a href="/units">Units Service</a></li>
+    </ul>
+</body>
\ No newline at end of file
diff --git a/swagger/swagger-initializer.js b/swagger/swagger-initializer.js
new file mode 100644
index 0000000000000000000000000000000000000000..93d055f0cba235b1fe4124dc297184aedcd03e9a
--- /dev/null
+++ b/swagger/swagger-initializer.js
@@ -0,0 +1,20 @@
+window.onload = function() {
+  //<editor-fold desc="Changeable Configuration Block">
+
+  // the following lines will be replaced by docker/configurator, when it runs in a docker-container
+  window.ui = SwaggerUIBundle({
+    url: "api.yaml",
+    dom_id: '#swagger-ui',
+    deepLinking: true,
+    presets: [
+      SwaggerUIBundle.presets.apis,
+      SwaggerUIStandalonePreset
+    ],
+    plugins: [
+      SwaggerUIBundle.plugins.DownloadUrl
+    ],
+    layout: "StandaloneLayout"
+  });
+
+  //</editor-fold>
+};
\ No newline at end of file