diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml
index 623b0b24d92f20cfbbc1d7b150a1b513cf178a4d..76f5f529e4de97adfb46c5dc648519d7fd110ed5 100644
--- a/docker-compose.prod.yml
+++ b/docker-compose.prod.yml
@@ -11,9 +11,9 @@ volumes:
   broker-service-data:
   upload-service-data:
   search-db-data:
+  storage-service-data:
 
 services:
-
   dbrepo-metadata-db:
     restart: "no"
     container_name: dbrepo-metadata-db
@@ -75,21 +75,6 @@ services:
     logging:
       driver: json-file
 
-  dbrepo-upload-service:
-    restart: "no"
-    container_name: dbrepo-upload-service
-    hostname: upload-service
-    image: docker.io/tusproject/tusd:v1.12
-    ports:
-      - "1080:1080"
-    command:
-      - "--base-path=/api/upload/files/"
-    volumes:
-      - upload-service-data:/data
-      - "${SHARED_FILESYSTEM:-/tmp}:/srv/tusd-data/data"
-    logging:
-      driver: json-file
-
   dbrepo-authentication-service:
     restart: "no"
     container_name: dbrepo-authentication-service
@@ -192,7 +177,9 @@ services:
     ports:
       - "5000:5000"
     environment:
-      SHARED_FILESYSTEM: "${SHARED_FILESYSTEM:-/tmp}"
+      S3_STORAGE_ENDPOINT: "${STORAGE_ENDPOINT:-http://storage-service:9000}"
+      S3_ACCESS_KEY_ID: "${STORAGE_USERNAME:-minioadmin}"
+      S3_SECRET_ACCESS_KEY: ${STORAGE_PASSWORD:-minioadmin}
     volumes:
       - "${SHARED_FILESYSTEM:-/tmp}:/tmp"
     healthcheck:
@@ -261,6 +248,26 @@ services:
       FLASK_DEBUG: ${SEARCH_DEBUG_MODE:-true}
       OPENSEARCH_HOST: ${OPENSEARCH_HOST:-dbrepo-search-db}
 
+  dbrepo-data-db-sidecar:
+    restart: "no"
+    container_name: dbrepo-data-db-sidecar
+    hostname: data-db-sidecar
+    image: docker.io/dbrepo/data-db-sidecar:latest
+    ports:
+      - "3305:3305"
+    environment:
+      FLASK_DEBUG: ${SEARCH_DEBUG_MODE:-true}
+      S3_STORAGE_ENDPOINT: "${STORAGE_ENDPOINT:-http://storage-service:9000}"
+      S3_ACCESS_KEY_ID: "${STORAGE_USERNAME:-minioadmin}"
+      S3_SECRET_ACCESS_KEY: ${STORAGE_PASSWORD:-minioadmin}
+    volumes:
+      - "${SHARED_FILESYSTEM:-/tmp}:/tmp"
+    healthcheck:
+      test: curl -sSL 127.0.0.1:5000/health | jq .status | grep "UP" || exit 1
+      interval: 10s
+      timeout: 5s
+      retries: 12
+
   dbrepo-ui:
     restart: "no"
     container_name: dbrepo-ui
@@ -281,14 +288,17 @@ services:
       ICON: "${ICON:-/favicon.ico}"
       DBREPO_CLIENT_ID: "${DBREPO_CLIENT_ID:-dbrepo-client}"
       DBREPO_CLIENT_SECRET: "${DBREPO_CLIENT_SECRET:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}"
-      UPLOAD_PATH: "${UPLOAD_PATH:-/tmp/}"
+      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
-      dbrepo-upload-service:
-        condition: service_started
+      dbrepo-storage-service:
+        condition: service_healthy
     logging:
       driver: json-file
 
@@ -333,6 +343,43 @@ services:
     logging:
       driver: json-file
 
+  dbrepo-search-db-init:
+    restart: "no"
+    container_name: dbrepo-search-db-init
+    hostname: search-db-init
+    image: docker.io/dbrepo/search-db-init:latest
+    environment:
+      OPENSEARCH_HOST: ${SEARCH_DB_HOST:-http://search-db:9200}
+      CURL_EXTRA_ARGS: ${SEARCH_DB_EXTRA_ARGS:-}
+    depends_on:
+      dbrepo-search-db:
+        condition: service_healthy
+    logging:
+      driver: json-file
+
+  dbrepo-storage-service:
+    restart: "no"
+    container_name: dbrepo-storage-service
+    hostname: storage-service
+    image: docker.io/bitnami/minio:2023-debian-11
+    environment:
+      MINIO_ROOT_USER: "${STORAGE_USERNAME:-minioadmin}"
+      MINIO_ROOT_PASSWORD: "${STORAGE_PASSWORD:-minioadmin}"
+      MINIO_DEFAULT_BUCKETS: "${STORAGE_DBREPO_BUCKET:-dbrepo-upload:upload,dbrepo-download:download}"
+      MINIO_REGION_NAME: "${STORAGE_REGION_NAME:-eu-west-1}"
+      MINIO_BROWSER_REDIRECT_URL: "${STORAGE_BASE_URL:-http://localhost/admin/storage/}"
+    ports:
+      - 9000:9000
+    healthcheck:
+      test: [ "CMD", "mc", "ready", "local" ]
+      interval: 5s
+      timeout: 5s
+      retries: 5
+    volumes:
+      - storage-service-data:/bitnami/minio/data
+    logging:
+      driver: json-file
+
   dbrepo-mirror-service:
     restart: "no"
     container_name: dbrepo-mirror-service
diff --git a/docker-compose.yml b/docker-compose.yml
index 7bfcf542651f4d11f22882ff1ba0dcdb399ade46..623b0b24d92f20cfbbc1d7b150a1b513cf178a4d 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -11,18 +11,17 @@ volumes:
   broker-service-data:
   upload-service-data:
   search-db-data:
-  storage-service-data:
 
 services:
+
   dbrepo-metadata-db:
     restart: "no"
     container_name: dbrepo-metadata-db
     hostname: metadata-db
-    image: dbrepo-metadata-db:latest
-    build: ./dbrepo-metadata-db
+    image: docker.io/dbrepo/metadata-db:latest
     volumes:
       - metadata-db-data:/bitnami/mariadb
-      - ./dbrepo-metadata-db/setup-schema_local.sql:/docker-entrypoint-initdb.d/setup-schema_local.sql
+      - ./dist/setup-schema_local.sql:/docker-entrypoint-initdb.d/setup-schema_local.sql
     ports:
       - "3306:3306"
     environment:
@@ -76,12 +75,26 @@ services:
     logging:
       driver: json-file
 
+  dbrepo-upload-service:
+    restart: "no"
+    container_name: dbrepo-upload-service
+    hostname: upload-service
+    image: docker.io/tusproject/tusd:v1.12
+    ports:
+      - "1080:1080"
+    command:
+      - "--base-path=/api/upload/files/"
+    volumes:
+      - upload-service-data:/data
+      - "${SHARED_FILESYSTEM:-/tmp}:/srv/tusd-data/data"
+    logging:
+      driver: json-file
+
   dbrepo-authentication-service:
     restart: "no"
     container_name: dbrepo-authentication-service
     hostname: authentication-service
-    image: dbrepo-authentication-service:latest
-    build: ./dbrepo-authentication-service
+    image: docker.io/dbrepo/authentication-service:latest
     ports:
       - "8443:8443"
       - "8080:8080"
@@ -106,8 +119,7 @@ services:
     restart: "no"
     container_name: dbrepo-metadata-service
     hostname: metadata-service
-    image: dbrepo-metadata-service:latest
-    build: ./dbrepo-metadata-service
+    image: docker.io/dbrepo/metadata-service:latest
     volumes:
       - "${SHARED_FILESYSTEM:-/tmp}:/tmp"
     ports:
@@ -176,14 +188,11 @@ services:
     restart: "no"
     container_name: dbrepo-analyse-service
     hostname: analyse-service
-    image: dbrepo-analyse-service:latest
-    build: ./dbrepo-analyse-service
+    image: docker.io/dbrepo/analyse-service:latest
     ports:
       - "5000:5000"
     environment:
-      S3_STORAGE_ENDPOINT: "${STORAGE_ENDPOINT:-http://storage-service:9000}"
-      S3_ACCESS_KEY_ID: "${STORAGE_USERNAME:-minioadmin}"
-      S3_SECRET_ACCESS_KEY: ${STORAGE_PASSWORD:-minioadmin}
+      SHARED_FILESYSTEM: "${SHARED_FILESYSTEM:-/tmp}"
     volumes:
       - "${SHARED_FILESYSTEM:-/tmp}:/tmp"
     healthcheck:
@@ -203,11 +212,11 @@ services:
       - "5672:5672"
       - "15672:15672"
     volumes:
-      - ./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
+      - ./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
       - broker-service-data:/bitnami/rabbitmq/mnesia
     healthcheck:
       test: rabbitmq-diagnostics -q is_running | grep 'is fully booted and running'
@@ -221,8 +230,7 @@ services:
     restart: "no"
     container_name: dbrepo-search-db
     hostname: search-db
-    image: dbrepo-search-db:latest
-    build: ./dbrepo-search-db
+    image: docker.io/dbrepo/search-db:latest
     ports:
       - "9200:9200"
     healthcheck:
@@ -246,41 +254,18 @@ services:
     restart: "no"
     container_name: dbrepo-search-service
     hostname: search-service
-    build: ./dbrepo-search-service
-    image: dbrepo-search-service:latest
+    image: docker.io/dbrepo/search-service:latest
     ports:
       - "4000:4000"
     environment:
       FLASK_DEBUG: ${SEARCH_DEBUG_MODE:-true}
       OPENSEARCH_HOST: ${OPENSEARCH_HOST:-dbrepo-search-db}
 
-  dbrepo-data-db-sidecar:
-    restart: "no"
-    container_name: dbrepo-data-db-sidecar
-    hostname: data-db-sidecar
-    build: ./dbrepo-data-db/sidecar
-    image: dbrepo-data-db-sidecar:latest
-    ports:
-      - "3305:3305"
-    environment:
-      FLASK_DEBUG: ${SEARCH_DEBUG_MODE:-true}
-      S3_STORAGE_ENDPOINT: "${STORAGE_ENDPOINT:-http://storage-service:9000}"
-      S3_ACCESS_KEY_ID: "${STORAGE_USERNAME:-minioadmin}"
-      S3_SECRET_ACCESS_KEY: ${STORAGE_PASSWORD:-minioadmin}
-    volumes:
-      - "${SHARED_FILESYSTEM:-/tmp}:/tmp"
-    healthcheck:
-      test: curl -sSL 127.0.0.1:5000/health | jq .status | grep "UP" || exit 1
-      interval: 10s
-      timeout: 5s
-      retries: 12
-
   dbrepo-ui:
     restart: "no"
     container_name: dbrepo-ui
     hostname: ui
-    image: dbrepo-ui
-    build: ./dbrepo-ui
+    image: docker.io/dbrepo/ui:latest
     environment:
       BROKER_USERNAME: "${BROKER_USERNAME:-fda}"
       BROKER_PASSWORD: "${BROKER_PASSWORD:-fda}"
@@ -296,17 +281,14 @@ services:
       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}
+      UPLOAD_PATH: "${UPLOAD_PATH:-/tmp/}"
       FORCE_SSL: "${FORCE_SSL:-false}"
       DOI_URL: "${DOI_URL:-https://doi.org}"
     depends_on:
       dbrepo-search-service:
         condition: service_started
-      dbrepo-storage-service:
-        condition: service_healthy
+      dbrepo-upload-service:
+        condition: service_started
     logging:
       driver: json-file
 
@@ -319,7 +301,7 @@ services:
       - "80:80"
       - "443:443"
     volumes:
-      - ./dbrepo-gateway-service/dbrepo.conf:/etc/nginx/conf.d/default.conf
+      - ./dist/dbrepo.conf:/etc/nginx/conf.d/default.conf
     depends_on:
       dbrepo-analyse-service:
         condition: service_healthy
@@ -342,7 +324,7 @@ services:
     hostname: search-db-dashboard
     image: docker.io/opensearchproject/opensearch-dashboards:2.10.0
     volumes:
-      - ./dbrepo-search-db/opensearch_dashboards.yml:/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml
+      - ./dist/opensearch_dashboards.yml:/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml
     ports:
       - "5601:5601"
     depends_on:
@@ -351,50 +333,11 @@ services:
     logging:
       driver: json-file
 
-  dbrepo-search-db-init:
-    restart: "no"
-    container_name: dbrepo-search-db-init
-    hostname: search-db-init
-    image: dbrepo-search-db-init:latest
-    build: ./dbrepo-search-db/init
-    environment:
-      OPENSEARCH_HOST: ${SEARCH_DB_HOST:-http://search-db:9200}
-      CURL_EXTRA_ARGS: ${SEARCH_DB_EXTRA_ARGS:-}
-    depends_on:
-      dbrepo-search-db:
-        condition: service_healthy
-    logging:
-      driver: json-file
-
-  dbrepo-storage-service:
-    restart: "no"
-    container_name: dbrepo-storage-service
-    hostname: storage-service
-    image: docker.io/bitnami/minio:2023-debian-11
-    environment:
-      MINIO_ROOT_USER: "${STORAGE_USERNAME:-minioadmin}"
-      MINIO_ROOT_PASSWORD: "${STORAGE_PASSWORD:-minioadmin}"
-      MINIO_DEFAULT_BUCKETS: "${STORAGE_DBREPO_BUCKET:-dbrepo-upload:upload,dbrepo-download:download}"
-      MINIO_REGION_NAME: "${STORAGE_REGION_NAME:-eu-west-1}"
-      MINIO_BROWSER_REDIRECT_URL: "${STORAGE_BASE_URL:-http://localhost/admin/storage/}"
-    ports:
-      - 9000:9000
-    healthcheck:
-      test: [ "CMD", "mc", "ready", "local" ]
-      interval: 5s
-      timeout: 5s
-      retries: 5
-    volumes:
-      - storage-service-data:/bitnami/minio/data
-    logging:
-      driver: json-file
-
   dbrepo-mirror-service:
     restart: "no"
     container_name: dbrepo-mirror-service
     hostname: mirror-service
-    build: ./dbrepo-mirror-service
-    image: dbrepo-mirror-service
+    image: docker.io/dbrepo/mirror-service:latest
     ports:
       - "9050:9050"
     environment:
@@ -424,8 +367,7 @@ services:
     restart: "no"
     container_name: dbrepo-data-service
     hostname: data-service
-    build: ./dbrepo-data-service
-    image: dbrepo-data-service
+    image: docker.io/dbrepo/data-service:latest
     ports:
       - "9093:9093"
     environment: