Deep Learning template

In what follows, it is assumed that you will be deploying this template on Linux.

Note that the tools for running GPU-enabled Docker images on Windows are in active development.

The template defined below is GPU-enabled, because it is meant for Deep Learning. The following two Docker images replace the corresponding images in the standard template for RapidMiner AI Hub.

  • 1 GPU-enabled RapidMiner Server instance (rapidminer/rapidminer-server:9.8-DL-GPU)
  • 1 GPU-enabled RapidMiner Job Agent (rapidminer/rapidminer-execution-jobagent:9.8-DL-GPU)

For a detailed description of every Docker image, see the image reference.

If you prefer a simpler setup, without all the extra services provided by RapidMiner AI Hub, see the standalone instructions.

Pre-installed and pre-configured

Whether you use the standalone template or the full RapidMiner AI Hub, the benefit is that CUDA and cuDNN are pre-installed on the Docker image, together with the following extensions:

and the Job Agent is pre-configured via the file job-agent-home/config/rapidminer/rapidminer.properties

rapidminer.backend.nd4j=GPU-CUDA
rapidminer.backend.nd4j.max_bytes=32G
rapidminer.backend.nd4j.max_physical_bytes=48G
rapidminer.deeplearning.training_ui.ports=60080

Note however that to give Docker access to the GPU, you need to install some additional software.

Table of contents

System requirements

Minimum recommended hardware configuration

The amount of memory needed depends heavily on the amount of data that will be processed by RapidMiner AI Hub. By themselves, the RapidMiner services can run with as little as 16 GB. However, in production environments, we recommend 32GB or more depending on user data, in order to provide users with enough capacity to analyze data from realistic use cases.

Each virtual or physical machine should at least have:

  • Quad core
  • 32GB RAM
  • >20GB free disk space

Preliminaries: Nvidia setup

Although the Deep Learning extension does not require a GPU, you will get much better performance when using one of Nvidia's CUDA-compatible GPUs to build your models than when using the CPU. To give Docker access to the GPU, you need to install some additional software.

  1. Make sure you have an Nvidia graphics card, and that the Nvidia drivers are installed

  2. Install nvidia-docker2, to make the GPU available inside docker containers

Make sure the Nvidia drivers are installed

On Linux, use the command-line tool lspci to make sure that you are using the non-free graphics driver nvidia, not the default driver nouveau.

$ lspci -nn | egrep -i "3d|display|vga"

4b:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP102 [TITAN X] [10de:1b00] (rev a1)

$ lspci -v -s 4b:00.0

4b:00.0 VGA compatible controller: NVIDIA Corporation GP102 [TITAN X] (rev a1) (prog-if 00 [VGA controller])
        Subsystem: NVIDIA Corporation GP102 [TITAN X]
        Physical Slot: 4
        Flags: bus master, fast devsel, latency 0, IRQ 65, NUMA node 0
        Memory at ce000000 (32-bit, non-prefetchable) [size=16M]
        Memory at b0000000 (64-bit, prefetchable) [size=256M]
        Memory at c0000000 (64-bit, prefetchable) [size=32M]
        I/O ports at c000 [size=128]
        Expansion ROM at 000c0000 [virtual] [disabled] [size=128K]
        Capabilities: 
        Kernel driver in use: nvidia
        Kernel modules: nvidia

If the driver is identified as nouveau, you need to first install the package nvidia-driver and then restart the computer.

Install nvidia-docker2

To give Docker access to the GPU, install nvidia-docker2, after configuring your Linux distribution with a custom repository. The instructions given below apply to Debian / Ubuntu distributions, but see Repository configuration if you are using some other Linux distribution.

Configure the repository for Debian / Ubuntu

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -

curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

Once the repository is ready, install the package nvidia-docker2, and restart Docker:

sudo apt update && sudo apt install nvidia-docker2

sudo systemctl restart docker

To check that everything is working as expected, run nvidia-smi inside a docker container, and look for output resembling the output below.

$ docker run --rm --gpus all nvidia/cuda:10.1-base nvidia-smi

Status: Downloaded newer image for nvidia/cuda:10.1-base
Thu Oct 22 15:21:59 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.66       Driver Version: 450.66       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  TITAN X (Pascal)    On   | 00000000:4B:00.0  On |                  N/A |
| 23%   29C    P8    14W / 250W |    358MiB / 12192MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

Read more:

Instructions (Standalone)

docker-compose.yml

version: "2.4"
services:
  gpu-rapidminer-server:
    image: rapidminer/rapidminer-server:9.8-DL-GPU
    runtime: nvidia
    ports:
      - "8080:8080"   # server port
      - "60080:60080" # training UI port
    environment:
      EMBEDDED_DATABASE: 1
      BUNDLED_JOB_AGENT: 1
    volumes:
      - gpu-rm-server-home-vol:/persistent-rapidminer-home

volumes:
  gpu-rm-server-home-vol:

If you have no need for any of the extra services provided by RapidMiner AI Hub (see below), the simplest setup is to deploy a single GPU-enabled Docker image for RapidMiner Server, using the embedded database and the embedded (GPU-enabled) Job Agent. The only file you need is docker-compose.yml, displayed above.

  1. Transfer the file docker-compose.yml to the computer with the GPU, where nvidia-docker2 is installed.

  2. From the directory containing docker-compose.yml, issue the following command:

     docker-compose up -d
    
  3. Via a browser, connect to port 8080 of the deployment URL, e.g., http://<deployment-url>:8080. Enter the username admin and the password changeit.

Upgrading to version 3 of the Compose file

The file docker-compose.yml described above uses version 2 of the Compose file. To upgrade to version 3 of the Compose file, take the following steps:

  • in the file docker-compose.yml, change the version from "2.4" to "3" and delete the line:

      runtime: nvidia
    
  • in the configuration file /etc/docker/daemon.json, add the following line as the first entry:

      "default-runtime": "nvidia",
    

Instructions (RapidMiner AI Hub)

If you want the extra services provided by RapidMiner AI Hub, proceed as follows. You will need the following two files, included in the ZIP file in step (1). Note that this template is identical to the standard template for RapidMiner AI Hub, except for the value of SERVER_VERSION=9.8-DL-GPU and the inclusion of a Training UI port in the Job Agent.

Proceed as follows:

  1. Download the template files

  2. Follow the general deployment instructions.

  3. Remember to set the variables PUBLIC_URL and SSO_PUBLIC_URL in the .env file.

  4. Remember to include the RapidMiner Server and RapidMiner Go licenses in the environment file, respectively as SERVER_LICENSE and GO_LICENSE.

  5. When connecting from RapidMiner Studio, remember to check RapidMiner AI Hub / Enterprise Login, with username admin and password changeit.

The environment file (.env)

# ############################################
#
# Global parameters
#
# ############################################

# Public domain of the deployment
PUBLIC_DOMAIN=platform.rapidminer.com

# Public URL of the deployment that will be used for external access (Public domain + protocol + port)
PUBLIC_URL=https://platform.rapidminer.com

# Public URL of the SSO endpoint that will be used for external access. In most cases it should be the same as the PUBLIC_URL
SSO_PUBLIC_URL=https://platform.rapidminer.com

# Enable/disable the service build into the RapidMiner cloud images, that updates the PUBLIC_URL and SSO_PUBLIC_URL variables to the new dynamic cloud hostname/IP address
AUTOMATIC_PUBLIC_URL_UPDATE_FOR_CLOUD_IMAGES=true

# Enable/disable the Legacy BASIC authentication support for REST endpoints, like webservices. (lowercase true/false)
LEGACY_REST_BASIC_AUTH_ENABLED=false

# Timezone setting
TZ=UTC

# ############################################
#
# Deployment parameters
#
# ############################################

# Prefix to use for docker registry
REGISTRY=rapidminer/

# Version of the Init container
INIT_VERSION=9.8

# Enable configuring server settings for Python Scripting extension
INIT_SHARED_CONDA_SETTINGS=true

# User migration settings for migrating from non-Keycloak-based deployments
USER_MIGRATION_ENABLED=True
USER_MIGRATION_DRY_RUN=False

# ############################################
#
# KeyCloak (SSO)
#
# ############################################

# Keycloak container version
KEYCLOAK_VERSION=9.8

# Keycloak database parameters
KC_DB=kcdb
KC_USER=kcdbuser
KC_PASSWORD=kcdbpass

# Default platform admin user credentials
KEYCLOAK_USER=admin
KEYCLOAK_PASSWORD=changeit

# SSO default parameters
SSO_IDP_REALM=master
SSO_SSL_REQUIRED=none

# ############################################
#
# Rapidminer server
#
# ############################################

SERVER_VERSION=9.8-DL-GPU
SERVER_DBHOST=rm-postgresql-svc
SERVER_DBSCHEMA=rapidminer-server-db
SERVER_DBUSER=rmserver-db-user
SERVER_DBPASS=w61J784XSb24K4LRV97MbE16i8xa9O
SERVER_MAX_MEMORY=2048M
RMSERVER_SSO_CLIENT_ID=urn:rapidminer:server
RMSERVER_SSO_CLIENT_SECRET=
SERVER_LICENSE=
RAPIDMINER_SERVER_HOST=rm-server-svc
RAPIDMINER_SERVER_PORT=8080
RAPIDMINER_SERVER_URL=http://rm-server-svc:8080
AUTH_SECRET=TTY5MjUxbzRBN2ZIWThpNGVKNGo4V2xqOHk0dTNV
BROKER_ACTIVEMQ_USERNAME=amq-user
BROKER_ACTIVEMQ_PASSWORD=M69251o4A7fHY8i4eJ4j8Wlj8y4u3U

# ############################################
#
# Job Agent
#
# ############################################

JOBAGENT_QUEUE_ACTIVEMQ_URI=failover:(tcp://rm-server-svc:5672)
JOBAGENT_CONTAINER_COUNT=2
JOB_QUEUE=DEFAULT
JOBAGENT_CONTAINER_MEMORYLIMIT=2048
#RAPIDMINER_JOBAGENT_OPTS="-Djobagent.python.registryBaseUrl=http://platform-admin-webui-svc:1082/"
RAPIDMINER_JOBAGENT_OPTS=
RAPIDMINER_SERVER_PROTOCOL=http

# ############################################
#
# Proxy
#
# ############################################

PROXY_VERSION=9.8
JUPYTER_BACKEND=http://rm-jupyterhub-svc:8000
JUPYTER_URL_SUFFIX=/jupyter
GRAFANA_BACKEND=http://rm-grafana-svc:3000
GRAFANA_URL_SUFFIX=/grafana
PA_BACKEND=http://platform-admin-webui-svc:1082/
PA_URL_SUFFIX=/platform-admin
RTS_WEBUI_BACKEND=http://platform-admin-webui-svc:1082/
RTS_WEBUI_URL_SUFFIX=/rts-admin
RTS_SCORING_BACKEND=http://rts-agent-svc:8090/
RTS_SCORING_URL_SUFFIX=/rts
KEYCLOAK_BACKEND=http://rm-keycloak-svc:8080
LANDING_BACKEND=http://landing-page
TOKEN_BACKEND=http://rm-token-tool-svc
TOKEN_URL_SUFFIX=/get-token
ALLOW_LE=true
LE_BACKEND=http://letsencrypt-svc:84
PASSWORD_FILE_PATH=/etc/nginx/ssl/password.txt
HTTPS_CRT_PATH=/etc/nginx/ssl/certificate.crt
HTTPS_KEY_PATH=/etc/nginx/ssl/private.key
HTTPS_DH_PATH=/etc/nginx/ssl/dhparam.pem
PROXY_DATA_UPLOAD_LIMIT=10240M

# ############################################
#
# Jupyterhub
#
# ############################################

RM_JUPYTER_VERSION=9.8
JHUB_POSTGRES_HOST=rm-jupyterhub-db-svc
JHUB_POSTGRES_DB=jupyterhub
JHUB_POSTGRES_USER=jupyterhubdbuser
JHUB_POSTGRES_PASSWORD=FoExRExzQsL7UpgEYa5sO7mhiGhi3ne
JHUB_HOSTNAME=rm-jupyterhub-svc
JUPYTERHUB_CRYPT_KEY=e0084caa38f521cc985d675168bcf7b7137cf5b0d4a3e8b99d2e3542705584eb
JHUB_DEBUG=False
JHUB_TOKEN_DEBUG=False
JHUB_PROXY_DEBUG=False
JHUB_DB_DEBUG=False
JHUB_SPAWNER_DEBUG=False
JUPYTER_STACK_NAME=default
SSO_NB_UID_KEY=X_NB_UID
SSO_NB_GID_KEY=X_NB_GID
SSO_NB_CUSTOM_BIND_MOUNTS_KEY=X_NB_CUSTOM_BIND_MOUNTS
# Content should be in json format, use quotes here instead of apostrophes
#JUPYTER_NB_CUSTOM_BIND_MOUNTS={"/usr/share/doc/apt":"/tmp/apt","/usr/share/doc/mount/":"/tmp/mount"}
JUPYTER_NB_CUSTOM_BIND_MOUNTS=
DOCKER_NOTEBOOK_CPU_LIMIT=100
DOCKER_NOTEBOOK_MEM_LIMIT=2g
#k8s
#DOCKER_NOTEBOOK_MEM_LIMIT=2G
JHUB_SSO_CLIENT_ID=urn:rapidminer:jupyterhub
JHUB_SSO_CLIENT_SECRET=
JHUB_SPAWNER=dockerspawner
JHUB_API_PROTOCOL=http
JHUB_API_HOSTNAME=rm-jupyterhub-svc
JHUB_PROXY_PORT=8000
JHUB_API_PORT=8001
JHUB_APP_PORT=8081
JHUB_ENV_VOLUME_NAME=rm-coding-shared-vol
#JHUB_CUSTOM_CA_CERTS=${PWD}/ssl/deb_cacerts/
#JHUB_SPAWNER=kubespawner
#JHUB_K8S_CMD: '/entrypoint.sh'
#JHUB_K8S_ARGS: ''
#JHUB_K8S_NAMESPACE=advertisinganalytics
#JHUB_K8S_NODE_SELECTOR_NAME: 'rapidminer.customer'
#JHUB_K8S_NODE_SELECTOR_VALUE: 'rapidminer'
#JHUB_K8S_NOTEBOOK_STORAGE_ACCESS_MODE=ReadWriteOnce
#JHUB_K8S_NOTEBOOK_STORAGE_CAPACITY=5Gi
#JHUB_K8S_NOTEBOOK_STORAGE_CLASS=ms-ebs-us-west-2b
#JHUB_K8S_IMAGE_PULL_SECRET=rm-docker-login-secret
#JHUB_K8S_ENV_PVC_NAME=python-envs-pvc

# ############################################
#
# Radoop Proxy
#
# ############################################

RADOOP_PROXY_VERSION=1.2.1
# Authentication: 'server|jwt|superuser'
RADOOP_PROXY_AUTHENTICATION=superuser
RADOOP_PROXY_SUPERUSERNAME=proxyadmin
RADOOP_PROXY_SUPERUSERPASSWORD=changeit
RADOOP_PROXY_PORT=1081
RADOOP_PROXY_WORKERSPOOLSIZE=100
RADOOP_PROXY_SSL="off"

# ############################################
#
# Platform admin
#
# ############################################

PA_VERSION=9.8
PA_SSO_CLIENT_ID=urn:rapidminer:platform-admin
PA_SSO_CLIENT_SECRET=
PA_DISABLE_PYTHON=false
PA_DISABLE_RTS=false

#
# Coding Environment Storage
#
CES_VERSION=9.8

# ############################################
#
# Real-Time Scoring Agent
#
# ############################################

RTS_VERSION=9.8
RTSUI_VERSION=9.8
WAIT_FOR_LICENSES=1

# ############################################
#
# Grafana
#
# ############################################

RM_GRAFANA_VERSION=9.8
GRAFANA_SSO_CLIENT_ID=urn:rapidminer:grafana
GRAFANA_SSO_CLIENT_SECRET=

# ############################################
#
# TabGo
#
# ############################################

# Used for both TabGo and the TabGo proxy.
TABGO_VERSION=9.8

# Proxy specific settings.
TABGO_PROXY_PORT=4443
TABGO_BACKEND=http://rm-tabgo-svc

# Settings for the TabGo service.
TABGO_MAX_MEMORY=384m
TABGO_PORT=8090
# Rate limit for small requests (e.g., scoring a single data row). The default
# values limit the rate to 10 requests per 5 seconds.
TABGO_SMALL_REQUEST_LIMIT=10
TABGO_SMALL_REQUEST_INTERVAL=5
# Change the log level to DEBUG to log HTTP traffic routed through TabGo.
TABGO_LOG_LEVEL=INFO
# Additional Java options should only be used for debugging.
TABGO_JAVA_OPTIONS=

# ############################################
#
# LetsEncrypt Client
#
# ############################################

LE_VERSION=9.8

# ############################################
#
# Docker Deployment Manager
#
# ############################################

DDM_VERSION=9.8

# ############################################
#
# Landing page
#
# ############################################

RM_LANDING_VERSION=9.8
LANDING_SSO_CLIENT_ID=urn:rapidminer:landing-page
LANDING_SSO_CLIENT_SECRET=


# ############################################
#
# Token Tool
#
# ############################################

TOKEN_SSO_CLIENT_ID=urn:rapidminer:token-tool
TOKEN_SSO_CLIENT_SECRET=

# ############################################
#
# RapidMiner Go
#
# ############################################

## General setup
GO_LICENSE=
GO_AUTH_SECRET=dGhhbmt5b3Vmb3J1c2luZ2F1dG9tb2RlbG9ucHJlbWlzZTIwMTk=
GO_DB_HOST=rapidminer-automodel-db
GO_AMQ_URL=tcp://rapidminer-automodel-activemq:61616
GO_AMQ_USERNAME=next
GO_AMQ_PASSWORD=next
GO_JOB_QUEUE=rapiminder-automodeler-job-queue
GO_JOB_STATUS_QUEUE=rapidminer-automodeler-job-status-queue
GO_JOB_COMMAND_TOPIC=rapidminer-automodeler-job-command-topic
#_JAVA_OPTIONS='-Dlogging.level.root=DEBUG'
GO_JAVA_OPTIONS=

## Resource management

# RapidMiner Go is preconfigured to run on a host (or Docker engine) with 8GB
GO_JOB_CONTAINERS=1

## Docker images

GO_IMAGE_TAG_ROUTING=2.4.1-platform-9.8.0
GO_IMAGE_TAG_RMID=2.4.1
GO_IMAGE_TAG_AM=2.4.1
GO_IMAGE_TAG_JC=2.4.1
GO_IMAGE_TAG_ET=2.4.0

# ############################################
#
# GO ROUTING
#
# ############################################

GO_ROUTING_RMID_HOST_PORT_1=rapidminer-automodel-rmid:8080
GO_ROUTING_AM_HOST_PORT_1=rapidminer-automodeler:8080
GO_ROUTING_EVENT_HOST_PORT=rapidminer-ui-event-tracking:8080
# Docker's internal DNS server
GO_ROUTING_RESOLVER=127.0.0.11
GO_ROUTING_SERVER_NAME=localhost
GO_ROUTING_PROTOCOL=http

# ############################################
#
# GO RMID
#
# ############################################

GO_RMID_SPRING_PROFILES_ACTIVE=db-postgresql,is-saml,on-prem,branding
GO_RMID_FRONTEND_TRACKING_ENABLED=false
GO_RMID_TOKEN_MAX_AGE=86400
GO_RMID_LOGIN_TYPE=LOGIN_TYPE_EXTERNAL
GO_SSO_CLIENT_ID=urn:rapidminer:go
GO_RMID_SAML_KEYSTORE_PASSWORD=bXlrZXlwYXNz
GO_RMID_SAML_KEYSTORE_ALIAS=mykeyalias

# ############################################
#
# GO AUTOMODELER
#
# ############################################

GO_AUTOMODELER_SPRING_PROFILES_ACTIVE=db-postgresql,on-prem,branding
# Maximal Data file size given in bytes upto 2GB
GO_AUTOMODELER_SPRING_SERVLET_MULTIPART_MAX_FILE_SIZE=104857600
GO_AUTOMODELER_RMID_BASE_URL=http://rapidminer-automodel-rmid:8080
GO_AUTOMODELER_FRONTEND_TRACKING_ENABLED=true
GO_AUTOMODELER_FILESTORE_MIN_ROW_LIMIT=50
GO_AUTOMODELER_EXECUTION_TASK_LIMIT_PER_USER=4
# Maximal size of RapidMiner result set given in MB
GO_AUTOMODELER_EXECUTION_MAXIMUM_TOTAL_RESULT_SIZE=2000
GO_AUTOMODELER_DATA_IMPORT_MINIMUM_ATTRIBUTE_COUNT=3
GO_AUTOMODELER_DATA_IMPORT_MAXIMUM_ATTRIBUTE_COUNT=500

# ############################################
#
# GO JC
#
# ############################################

GO_JC_SPRING_PROFILES_ACTIVE=on-prem

# ############################################
#
# GO AMQ
#
# ############################################

GO_ACTIVEMQ_CONFIG_DEFAULTACCOUNT=false
GO_ACTIVEMQ_ADMIN_LOGIN=admin
GO_ACTIVEMQ_ADMIN_PASSWORD=admin

# ############################################
#
# GO DB
#
# ############################################

GO_POSTGRES_PASSWORD=pgadminpass
GO_POSTGRES_USER=pgadmin
GO_AUTOMODELER_DB_USER=cookie
GO_AUTOMODELER_DB_PASSWORD=cookiepass
GO_AUTOMODELER_DB_NAME=cookie
GO_RMID_DB_USER=rmid
GO_RMID_DB_PASSWORD=rmid
GO_RMID_DB_NAME=rmid

The docker-compose definition (docker-compose.yml)

version: "3.5"
services:
  rm-proxy-svc:
    image: "${REGISTRY}rapidminer-proxy:${PROXY_VERSION}" 
    hostname: rm-proxy-svc
    restart: always
    environment:
      - KEYCLOAK_BACKEND=${KEYCLOAK_BACKEND}
      - RMSERVER_BACKEND=${RAPIDMINER_SERVER_URL}
      - JUPYTER_BACKEND=${JUPYTER_BACKEND}
      - JUPYTER_URL_SUFFIX=${JUPYTER_URL_SUFFIX}
      - GRAFANA_BACKEND=${GRAFANA_BACKEND}
      - GRAFANA_URL_SUFFIX=${GRAFANA_URL_SUFFIX}
      - PA_BACKEND=${PA_BACKEND}
      - PA_URL_SUFFIX=${PA_URL_SUFFIX}
      - TOKEN_BACKEND=${TOKEN_BACKEND}
      - TOKEN_URL_SUFFIX=${TOKEN_URL_SUFFIX}
      - ALLOW_LE=${ALLOW_LE}
      - LE_BACKEND=${LE_BACKEND}
      - RTS_WEBUI_BACKEND=${RTS_WEBUI_BACKEND}
      - RTS_WEBUI_URL_SUFFIX=${RTS_WEBUI_URL_SUFFIX}
      - RTS_SCORING_BACKEND=${RTS_SCORING_BACKEND}
      - RTS_SCORING_URL_SUFFIX=${RTS_SCORING_URL_SUFFIX}
      - SSO_PUBLIC_URL=${SSO_PUBLIC_URL}
      - SSO_IDP_REALM=${SSO_IDP_REALM}
      - RTS_BASIC_AUTH=true
      - LANDING_BACKEND=${LANDING_BACKEND}
      - PASSWORD_FILE_PATH=${PASSWORD_FILE_PATH}
      - HTTPS_CRT_PATH=${HTTPS_CRT_PATH}
      - HTTPS_KEY_PATH=${HTTPS_KEY_PATH}
      - HTTPS_DH_PATH=${HTTPS_DH_PATH}
      #- DEBUG_CONF_INIT=true
      #- WAIT_FOR_DHPARAM=true
      - PROXY_DATA_UPLOAD_LIMIT=${PROXY_DATA_UPLOAD_LIMIT}
    ports:
      - 80:80
      - 443:443
    networks:
      rm-go-proxy-net:
        aliases:
         - rm-proxy-svc
         - ${PUBLIC_DOMAIN}
      rm-platform-int-net:
        aliases:
         - rm-proxy-svc
         - ${PUBLIC_DOMAIN}
      jupyterhub-user-net: 
        aliases: 
         - ${PUBLIC_DOMAIN}
    volumes:
      - ./ssl:/etc/nginx/ssl
      - platform-admin-uploaded-vol:/rapidminer/platform-admin/uploaded/

  letsencrypt-svc:
    image: "${REGISTRY}rm-letsencrypt-client:${LE_VERSION}"
    hostname: rm-letsencrypt-client-svc
    restart: always
    environment:
    - PUBLIC_URL=${PUBLIC_URL}
    - LETSENCRYPT_HOME=/certificates/
    - DOMAIN=${PUBLIC_URL}
    - WEBMASTER_MAIL=devops@rapidminer.com
    - TZ=Europe/Budapest
#    ports:
#    - 84:84
    networks:
      rm-platform-int-net:
        aliases:
        - rm-letsencrypt-client-svc
    volumes:
    - ./ssl:/etc/letsencrypt/


  rm-keycloak-db-svc:
    image: postgres:9.6
    restart: always
    hostname: rm-keycloak-db-svc
    environment:
      - POSTGRES_DB=${KC_DB}
      - POSTGRES_USER=${KC_USER}
      - POSTGRES_PASSWORD=${KC_PASSWORD}
    volumes:
      - keycloak-postgresql-vol:/var/lib/postgresql/data
    networks:
      rm-idp-db-net:
        aliases:
         - rm-keycloak-db-svc

  rm-keycloak-svc:
    image: ${REGISTRY}rapidminer-keycloak:${KEYCLOAK_VERSION}
    restart: always
    hostname: rm-keycloak-svc
    environment:
      - DB_VENDOR=POSTGRES
      - DB_ADDR=rm-keycloak-db-svc
      - DB_DATABASE=${KC_DB}
      - DB_USER=${KC_USER}
      - DB_SCHEMA=public
      - DB_PASSWORD=${KC_PASSWORD}
      - KEYCLOAK_USER=${KEYCLOAK_USER}
      - KEYCLOAK_PASSWORD=${KEYCLOAK_PASSWORD}
      - PROXY_ADDRESS_FORWARDING=true
      #- KEYCLOAK_LOGLEVEL=DEBUG
      #- ROOT_LOGLEVEL=DEBUG
      #- JDBC_PARAMS=ssl=true
    depends_on:
      - rm-keycloak-db-svc
      - rm-proxy-svc
    networks:
      rm-platform-int-net:
        aliases:
          - rm-keycloak-svc
      rm-idp-db-net:
        aliases:
          - rm-keycloak-svc

  rm-init-svc:
    image: "${REGISTRY}rapidminer-deployment-init:${INIT_VERSION}"
    restart: "no"
    hostname: rm-keycloak-init-svc
    depends_on:
      - rm-keycloak-svc
      - rm-postgresql-svc
    environment:
      - LEGACY_REST_BASIC_AUTH_ENABLED=${LEGACY_REST_BASIC_AUTH_ENABLED}
      - PUBLIC_URL=${PUBLIC_URL}
      - SSO_PUBLIC_URL=${SSO_PUBLIC_URL}
    volumes: 
      - ./.env:/.env
      - ./docker-compose.yml:/docker-compose.yml:ro
      - keycloak-admin-cli-vol:/root/.keycloak/
      - deployed-services-vol:/rapidminer/deployed-services/
      - ./go/saml:/go/saml/
      - ./go/licenses:/go/licenses/
    networks:
      rm-platform-int-net:
        aliases:
          - rm-init-svc
      rm-server-db-net:
        aliases:
          - rm-init-svc

  rm-postgresql-svc:
    image: "postgres:9.6"
    hostname: rm-postgresql-svc
    restart: always
    environment:
     - POSTGRES_DB=${SERVER_DBSCHEMA}
     - POSTGRES_USER=${SERVER_DBUSER}
     - POSTGRES_PASSWORD=${SERVER_DBPASS}
    volumes:
     - rm-postgresql-vol:/var/lib/postgresql/data
    networks:
      rm-server-db-net:
        aliases:
         - rm-postgresql-svc

  rm-server-svc:
    image: "${REGISTRY}rapidminer-server:${SERVER_VERSION}"
    hostname: rm-server-svc
    restart: always
    environment:
      - PA_BASE_URL=${PA_BACKEND}
      - PA_SYNC_DEBUG=False
#      This may be useful, if server and platform-admin are not on an internal network
#      - PA_SYNC_AUTH_USER=admin
#      - PA_SYNC_AUTH_PASS=changeit
      - DBHOST=${SERVER_DBHOST}
      - DBSCHEMA=${SERVER_DBSCHEMA}
      - DBUSER=${SERVER_DBUSER}
      - DBPASS=${SERVER_DBPASS}
      - SSO_PUBLIC_URL=${SSO_PUBLIC_URL}
      - SSO_IDP_REALM=${SSO_IDP_REALM}
      - SSO_CLIENT_ID=${RMSERVER_SSO_CLIENT_ID}
      - SSO_CLIENT_SECRET=${RMSERVER_SSO_CLIENT_SECRET}
      - SSO_SSL_REQUIRED=${SSO_SSL_REQUIRED}
      - LEGACY_REST_BASIC_AUTH_ENABLED=${LEGACY_REST_BASIC_AUTH_ENABLED}
      - SERVER_MAX_MEMORY=${SERVER_MAX_MEMORY}
      - BROKER_ACTIVEMQ_USERNAME=${BROKER_ACTIVEMQ_USERNAME}
      - BROKER_ACTIVEMQ_PASSWORD=${BROKER_ACTIVEMQ_PASSWORD}
      - JOBSERVICE_AUTH_SECRET=${AUTH_SECRET}
      - JUPYTER_URL_SUFFIX=${JUPYTER_URL_SUFFIX}
      - GRAFANA_URL_SUFFIX=${GRAFANA_URL_SUFFIX}
#      - PROXY_HTTP_PORT=80
#      - PROXY_HTTPS_PORT=443
      - TZ=${TZ}
      - CES_VERSION=${CES_VERSION}
    volumes:
      - rm-server-bootstrap-vol:/bootstrap.d
      - rm-server-home-vol:/persistent-rapidminer-home
      - rm-coding-shared-vol:/opt/coding-shared/:ro
    depends_on:
      - rm-postgresql-svc
    networks:
      jupyterhub-user-net:
        aliases:
         - rm-server-svc
      rm-platform-int-net:
        aliases:
         - rm-server-svc
      rm-server-db-net:
        aliases:
         - rm-server-svc

  rm-server-job-agent-svc:
    image: "${REGISTRY}rapidminer-execution-jobagent:${SERVER_VERSION}"
    hostname: rm-server-job-agent-svc
    restart: always
    environment:
      - RAPIDMINER_SERVER_HOST=${RAPIDMINER_SERVER_HOST}
      - RAPIDMINER_SERVER_PROTOCOL=${RAPIDMINER_SERVER_PROTOCOL}
      - RAPIDMINER_SERVER_PORT=${RAPIDMINER_SERVER_PORT}
      - JOBAGENT_QUEUE_ACTIVEMQ_URI=${JOBAGENT_QUEUE_ACTIVEMQ_URI}
      - JOBAGENT_QUEUE_ACTIVEMQ_USERNAME=${BROKER_ACTIVEMQ_USERNAME}
      - JOBAGENT_QUEUE_ACTIVEMQ_PASSWORD=${BROKER_ACTIVEMQ_PASSWORD}
      - JOBAGENT_AUTH_SECRET=${AUTH_SECRET}
      - JOBAGENT_CONTAINER_COUNT=${JOBAGENT_CONTAINER_COUNT}
      - JOB_QUEUE=${JOB_QUEUE}
      - JOBAGENT_CONTAINER_MEMORYLIMIT=${JOBAGENT_CONTAINER_MEMORYLIMIT}
      - RAPIDMINER_JOBAGENT_OPTS=${RAPIDMINER_JOBAGENT_OPTS}
      - TZ=${TZ}
      - INIT_SHARED_CONDA_SETTINGS=${INIT_SHARED_CONDA_SETTINGS}
      - CES_VERSION=${CES_VERSION}
    ports:
      - 60080:60080   # Training UI port
    volumes:
      - rm-server-bootstrap-ja-vol:/bootstrap.d
      - rm-coding-shared-vol:/opt/coding-shared/:ro
    depends_on:
      - rm-server-svc
    networks:
      rm-platform-int-net:
        aliases:
         - rm-server-job-agent-svc

  rm-radoop-proxy-svc:
    image: "${REGISTRY}radoop-proxy:${RADOOP_PROXY_VERSION}"
    hostname: rm-radoop-proxy-svc
    restart: always
    environment:
      - AUTHENTICATION=${RADOOP_PROXY_AUTHENTICATION}
      - SUPERUSERNAME=${RADOOP_PROXY_SUPERUSERNAME}
      - SUPERUSERPASSWORD=${RADOOP_PROXY_SUPERUSERPASSWORD}
      - PORT=${RADOOP_PROXY_PORT}
      - WORKERSPOOLSIZE=${RADOOP_PROXY_WORKERSPOOLSIZE}
      - SSL=${RADOOP_PROXY_SSL}
      - SERVERHOST=${RAPIDMINER_SERVER_HOST}
      - SERVERPORT=${RAPIDMINER_SERVER_PORT}
      #- SCHEME
    ports:
      # has to be the same number for internal and external ports.
      - ${RADOOP_PROXY_PORT}:${RADOOP_PROXY_PORT}
    #depends_on:
      #- rm-server-svc

  platform-admin-webui-svc:
    image: "${REGISTRY}rapidminer-platform-admin-webui:${PA_VERSION}"
    hostname: platform-admin-webui-svc
    restart: always
    environment:
      - PA_URL_SUFFIX=${PA_URL_SUFFIX}
      - RTS_SCORING_URL_SUFFIX=${RTS_SCORING_URL_SUFFIX}
      - RTS_SCORING_BACKEND=${RTS_SCORING_BACKEND}
      - SSO_PUBLIC_URL=${SSO_PUBLIC_URL}
      - SSO_IDP_REALM=${SSO_IDP_REALM}
      - SSO_CLIENT_ID=${PA_SSO_CLIENT_ID}
      - SSO_CLIENT_SECRET=${PA_SSO_CLIENT_SECRET}
      - PA_DISABLE_PYTHON=${PA_DISABLE_PYTHON}
      - PA_DISABLE_RTS=${PA_DISABLE_RTS}
      - DEBUG=false
      - CES_VERSION=${CES_VERSION}
    volumes:
      - platform-admin-uploaded-vol:/var/www/html/uploaded/
      - rts-licenses-vol:/var/www/html/uploaded/licenses/
    networks:
      jupyterhub-user-net:
        aliases:
         - platform-admin-webui-svc
      rm-platform-int-net:
        aliases:
         - platform-admin-webui-svc
      rm-coding-environment-storage-net:
        aliases:
         - platform-admin-webui-svc

  rts-agent-svc:
    image: "${REGISTRY}rapidminer-execution-scoring:${RTS_VERSION}"
    hostname: rts-agent-svc
    restart: always
    environment:
      - WAIT_FOR_LICENSES=${WAIT_FOR_LICENSES}
      - TZ=${TZ}
    volumes:
      - rts-deployments-vol:/rapidminer-scoring-agent/home/deployments/
      - rts-licenses-vol:/rapidminer-scoring-agent/home/resources/licenses/rapidminer-scoring-agent/
    networks:
      rm-platform-int-net:
        aliases:
         - rts-agent-svc

  rm-jupyterhub-db-svc:
    image: postgres:9.6
    hostname: rm-jupyterhub-db-svc
    restart: always
    environment:
      - POSTGRES_DB=${JHUB_POSTGRES_DB}
      - POSTGRES_USER=${JHUB_POSTGRES_USER}
      - POSTGRES_PASSWORD=${JHUB_POSTGRES_PASSWORD}
    volumes:
      - jupyterhub-postgresql-vol:/var/lib/postgresql/data
    networks:
      jupyterhub-db-net:
        aliases:
         - rm-jupyterhub-db-svc

  rm-jupyterhub-svc:
    image: "${REGISTRY}rapidminer-jupyterhub-jupyterhub:${RM_JUPYTER_VERSION}"
    hostname: rm-jupyterhub-svc
    restart: always
    environment:
      - RM_JUPYTER_VERSION=${RM_JUPYTER_VERSION}
      - JHUB_HOSTNAME=${JHUB_HOSTNAME}
      - SERVER_BASE_URL=${RAPIDMINER_SERVER_URL}
      - POSTGRES_HOST=${JHUB_POSTGRES_HOST}
      - POSTGRES_DB=${JHUB_POSTGRES_DB}
      - POSTGRES_USER=${JHUB_POSTGRES_USER}
      - POSTGRES_PASSWORD=${JHUB_POSTGRES_PASSWORD}
      - DOCKER_NOTEBOOK_IMAGE=${REGISTRY}rapidminer-jupyter_notebook:${RM_JUPYTER_VERSION}
      - JUPYTERHUB_CRYPT_KEY=${JUPYTERHUB_CRYPT_KEY}
      - DOCKER_NOTEBOOK_CPU_LIMIT=${DOCKER_NOTEBOOK_CPU_LIMIT}
      - DOCKER_NOTEBOOK_MEM_LIMIT=${DOCKER_NOTEBOOK_MEM_LIMIT}
      - JHUB_DEBUG=${JHUB_DEBUG}
      - JHUB_TOKEN_DEBUG=${JHUB_TOKEN_DEBUG}
      - JHUB_PROXY_DEBUG=${JHUB_PROXY_DEBUG}
      - JHUB_DB_DEBUG=${JHUB_DB_DEBUG}
      - JHUB_SPAWNER_DEBUG=${JHUB_SPAWNER_DEBUG}
      - JUPYTER_STACK_NAME=${JUPYTER_STACK_NAME}
      - SSO_NB_UID_KEY=${SSO_NB_UID_KEY}
      - SSO_NB_GID_KEY=${SSO_NB_GID_KEY}
      - SSO_NB_CUSTOM_BIND_MOUNTS_KEY=${SSO_NB_CUSTOM_BIND_MOUNTS_KEY}
      - JUPYTER_NB_CUSTOM_BIND_MOUNTS=${JUPYTER_NB_CUSTOM_BIND_MOUNTS}      
      - SSO_PUBLIC_URL=${SSO_PUBLIC_URL}
      - SSO_IDP_REALM=${SSO_IDP_REALM}
      - SSO_CLIENT_ID=${JHUB_SSO_CLIENT_ID}
      - SSO_CLIENT_SECRET=${JHUB_SSO_CLIENT_SECRET}
      - PUBLIC_URL=${PUBLIC_URL}
      - JUPYTER_URL_SUFFIX=${JUPYTER_URL_SUFFIX}
      - SSO_USERNAME_KEY=preferred_username
      - SSO_RESOURCE_ACCESS_KEY=resource_access
      - JHUB_DEFAULT_ENV_NAME=aihub-${RM_JUPYTER_VERSION}-python
      - JHUB_SPAWNER=${JHUB_SPAWNER}
      - JHUB_API_PROTOCOL=${JHUB_API_PROTOCOL}
      - JHUB_API_HOSTNAME=${JHUB_API_HOSTNAME}
      - JHUB_PROXY_PORT=${JHUB_PROXY_PORT}
      - JHUB_API_PORT=${JHUB_API_PORT}
      - JHUB_ENV_VOLUME_NAME=${JHUB_ENV_VOLUME_NAME}
#      - JHUB_CUSTOM_CA_CERTS=${JHUB_CUSTOM_CA_CERTS}
#      - JHUB_K8S_NAMESPACE=${JHUB_K8S_NAMESPACE}
#      - JHUB_K8S_NODE_SELECTOR_NAME=${JHUB_K8S_NODE_SELECTOR_NAME}
#      - JHUB_K8S_NODE_SELECTOR_VALUE=${JHUB_K8S_NODE_SELECTOR_VALUE}
#      - JHUB_K8S_NOTEBOOK_STORAGE_ACCESS_MODE=${JHUB_K8S_NOTEBOOK_STORAGE_ACCESS_MODE}
#      - JHUB_K8S_NOTEBOOK_STORAGE_CAPACITY=${JHUB_K8S_NOTEBOOK_STORAGE_CAPACITY}
#      - JHUB_K8S_NOTEBOOK_STORAGE_CLASS=${JHUB_K8S_NOTEBOOK_STORAGE_CLASS}
#      - JHUB_K8S_IMAGE_PULL_SECRET=${JHUB_K8S_IMAGE_PULL_SECRET}
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:rw
    depends_on:
      - rm-jupyterhub-db-svc
      - rm-server-svc
    networks:
      rm-platform-int-net:
        aliases:
         - rm-jupyterhub-svc
      jupyterhub-db-net:
        aliases:
         - rm-jupyterhub-svc
      jupyterhub-user-net:
        aliases:
         - rm-jupyterhub-svc

  rm-coding-environment-storage-svc:
    image: "${REGISTRY}rapidminer-coding-environment-storage:${CES_VERSION}"
    hostname: rm-coding-environment-storage-svc
    restart: always
    environment:
      - PA_BASE_URL=${PA_BACKEND}
      - PA_SYNC_DEBUG=False
    networks:
      rm-coding-environment-storage-net:
        aliases:
         - rm-coding-environment-storage-svc
    volumes:
      - rm-coding-shared-vol:/opt/coding-shared/

  rm-grafana-svc:
    image: ${REGISTRY}rapidminer-grafana:${RM_GRAFANA_VERSION}
    hostname: rm-grafana-svc
    restart: always
    environment:
      - PUBLIC_URL=${PUBLIC_URL}
      - GRAFANA_URL_SUFFIX=${GRAFANA_URL_SUFFIX}
      #- GF_LOG_LEVEL=debug
      - SSO_PUBLIC_URL=${SSO_PUBLIC_URL}
      - SSO_IDP_REALM=${SSO_IDP_REALM}
      - SSO_CLIENT_ID=${GRAFANA_SSO_CLIENT_ID}
      - SSO_CLIENT_SECRET=${GRAFANA_SSO_CLIENT_SECRET}
      - TZ=${TZ}
    volumes:
      - grafana-home:/var/lib/grafana
    depends_on:
      - rm-grafana-proxy-svc
    networks:
      rm-platform-int-net:
        aliases:
         - rm-grafana-svc

  rm-grafana-proxy-svc:
    image: ${REGISTRY}rapidminer-grafana-proxy:${RM_GRAFANA_VERSION}
    hostname: rm-grafana-proxy-svc
    restart: always
    environment:
      - RAPIDMINER_URL=${RAPIDMINER_SERVER_URL}
    depends_on:
      - rm-server-svc
    networks:
      rm-platform-int-net:
        aliases:
         - rm-grafana-proxy-svc

  rm-tabgo-proxy-svc:
    image: ${REGISTRY}rapidminer-tabgo-proxy:${TABGO_VERSION}
    hostname: rm-tabgo-proxy-svc
    restart: always
    environment:
      - HTTPS_CRT_PATH=${HTTPS_CRT_PATH}
      - HTTPS_KEY_PATH=${HTTPS_KEY_PATH}
      - TABGO_BACKEND=${TABGO_BACKEND}
      - TABGO_PORT=${TABGO_PORT}
    ports:
      - ${TABGO_PROXY_PORT}:443
    depends_on:
      - rm-proxy-svc
    volumes:
      - ./ssl:/etc/nginx/ssl
    networks:
      rm-platform-int-net:
        aliases:
         - rm-tabgo-proxy-svc
    
  rm-tabgo-svc:
    image: ${REGISTRY}rapidminer-tabgo:${TABGO_VERSION}
    restart: always
    hostname: rm-tabgo-svc
    environment:
      - TABGO_MAX_MEMORY=${TABGO_MAX_MEMORY}
      - TABGO_RMS_HOSTNAME=${RAPIDMINER_SERVER_URL}
      - TABGO_GO_HOSTNAME=${PUBLIC_URL}
      - TABGO_SMALL_REQUEST_LIMIT=${TABGO_SMALL_REQUEST_LIMIT}
      - TABGO_SMALL_REQUEST_INTERVAL=${TABGO_SMALL_REQUEST_INTERVAL}
      - TABGO_LOG_LEVEL=${TABGO_LOG_LEVEL}
      - _JAVA_OPTIONS=${TABGO_JAVA_OPTIONS}
    networks:
      rm-platform-int-net:
        aliases:
         - rm-tabgo-svc

  landing-page:
    image: ${REGISTRY}rapidminer-deployment-landing-page:${RM_LANDING_VERSION}
    restart: always
    hostname: landing-page
    environment:
      - SSO_PUBLIC_URL=${SSO_PUBLIC_URL}
      - SSO_IDP_REALM=${SSO_IDP_REALM}
      - SSO_CLIENT_ID=${LANDING_SSO_CLIENT_ID}
      - SSO_CLIENT_SECRET=${LANDING_SSO_CLIENT_SECRET}
      - DEBUG=false
    volumes:
      - rm-landing-page-vol:/var/www/html/uploaded/
      - deployed-services-vol:/rapidminer/deployed-services/
    networks:
      rm-platform-int-net:
        aliases:
         - landing-page

  rm-token-tool-svc:
    image: ${REGISTRY}rapidminer-deployment-landing-page:${RM_LANDING_VERSION}
    restart: always
    hostname: rm-token-tool
    environment:      
    - PUBLIC_URL=${PUBLIC_URL}
    - SSO_PUBLIC_URL=${SSO_PUBLIC_URL}               
    - SSO_IDP_REALM=${SSO_IDP_REALM}
    - SSO_CLIENT_ID=${TOKEN_SSO_CLIENT_ID}
    - SSO_CLIENT_SECRET=${TOKEN_SSO_CLIENT_SECRET}
    - DEBUG=false
    - SSO_CUSTOM_SCOPE=openid info offline_access
    - CUSTOM_URL_SUFFIX=${TOKEN_URL_SUFFIX}
    - CUSTOM_CONTENT=get-token
    volumes:
      - rm-token-tool-vol:/var/www/html/uploaded/
    networks:
      rm-platform-int-net:
        aliases:
        - rm-token-tool


  # ###############################################
  #
  # RapidMiner GO
  #
  # ###############################################

  # Frontend and API router
  rapidminer-automodel-routing:
    image: rapidminer/rapidminer-automodel-routing:${GO_IMAGE_TAG_ROUTING}
    hostname: rapidminer-automodel-routing
    #ports:
    #  - "30000:80"
    environment:
      RMID_HOST_PORT_1: ${GO_ROUTING_RMID_HOST_PORT_1}
      AM_HOST_PORT_1: ${GO_ROUTING_AM_HOST_PORT_1}
      EVENT_HOST_PORT: ${GO_ROUTING_EVENT_HOST_PORT}
      RESOLVER: ${GO_ROUTING_RESOLVER}
      SERVER_NAME: ${GO_ROUTING_SERVER_NAME}
      PROTOCOL: ${GO_ROUTING_PROTOCOL}
    depends_on:
      - rapidminer-automodeler
      - rapidminer-automodel-rmid
    restart: always
    networks:
      rm-go-proxy-net:
        aliases:
         - rapidminer-automodel-routing
      rm-go-int-net:
        aliases:
         - rapidminer-automodel-routing
  rapidminer-automodel-rmid:
    image: rapidminer/rapidminer-automodel-rmid:${GO_IMAGE_TAG_RMID}
    hostname: rapidminer-automodel-rmid
    environment:
      SPRING_PROFILES_ACTIVE: ${GO_RMID_SPRING_PROFILES_ACTIVE}
      DB_HOST: ${GO_DB_HOST}
      DB_USER: ${GO_RMID_DB_USER}
      DB_PASSWORD: ${GO_RMID_DB_PASSWORD}
      DB_NAME: ${GO_RMID_DB_NAME}
      _JAVA_OPTIONS: ${GO_JAVA_OPTIONS}
      BASE_URL: ${PUBLIC_URL}
      AUTH_SECRET: ${GO_AUTH_SECRET}
      RMID_FRONTEND_TRACKING_ENABLED: ${GO_RMID_FRONTEND_TRACKING_ENABLED}
      TOKEN_MAX_AGE: ${GO_RMID_TOKEN_MAX_AGE}
      LOGIN_TYPE: ${GO_RMID_LOGIN_TYPE}
      SAML_ENTITY_ID: ${GO_SSO_CLIENT_ID}
      SAML_KEYSTORE_PASSWORD: ${GO_RMID_SAML_KEYSTORE_PASSWORD}
      SAML_KEYSTORE_ALIAS: ${GO_RMID_SAML_KEYSTORE_ALIAS}
      RMID_FRONTEND_AUTO_LOGIN: "true"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/rmid/system/health"]
    restart: always
    volumes:
      - ./go/saml:/rapidminer-automodel-rmid/saml
      - ./go/branding/rmid:/rapidminer-automodeler/branding
    depends_on: 
      - rapidminer-automodel-db
    networks:
      rm-go-int-net:
        aliases:
         - rapidminer-automodel-rmid 
  rapidminer-automodeler:
    image: rapidminer/rapidminer-automodeler:${GO_IMAGE_TAG_AM}
    hostname: rapidminer-automodeler
    environment:
      SPRING_PROFILES_ACTIVE: ${GO_AUTOMODELER_SPRING_PROFILES_ACTIVE}
      SPRING_SERVLET_MULTIPART_MAX_FILE_SIZE: ${GO_AUTOMODELER_SPRING_SERVLET_MULTIPART_MAX_FILE_SIZE}
      _JAVA_OPTIONS: ${GO_JAVA_OPTIONS}
      DB_HOST: ${GO_DB_HOST}
      DB_USER: ${GO_AUTOMODELER_DB_USER}
      DB_PASSWORD: ${GO_AUTOMODELER_DB_PASSWORD}
      DB_NAME: ${GO_AUTOMODELER_DB_NAME}
      BASE_URL: ${PUBLIC_URL}
      RMID_BASE_URL: ${GO_AUTOMODELER_RMID_BASE_URL}
      AMQ_URL: ${GO_AMQ_URL}
      AMQ_USERNAME: ${GO_AMQ_USERNAME}
      AMQ_PASSWORD: ${GO_AMQ_PASSWORD}
      AUTH_SECRET: ${GO_AUTH_SECRET}
      AUTOMODELER_FRONTEND_TRACKING_ENABLED: ${GO_AUTOMODELER_FRONTEND_TRACKING_ENABLED}
      AUTOMODELER_FILESTORE_MIN_ROW_LIMIT: ${GO_AUTOMODELER_FILESTORE_MIN_ROW_LIMIT}
      AUTOMODELER_EXECUTION_TASK_LIMIT_PER_USER: ${GO_AUTOMODELER_EXECUTION_TASK_LIMIT_PER_USER}
      AUTOMODELER_EXECUTION_QUEUE_LIMIT_PER_USER: ${GO_JOB_CONTAINERS}
      AUTOMODELER_EXECUTION_MAXIMUM_TOTAL_RESULT_SIZE: ${GO_AUTOMODELER_EXECUTION_MAXIMUM_TOTAL_RESULT_SIZE}
      AUTOMODELER_DATA_IMPORT_MINIMUM_ATTRIBUTE_COUNT: ${GO_AUTOMODELER_DATA_IMPORT_MINIMUM_ATTRIBUTE_COUNT}
      AUTOMODELER_DATA_IMPORT_MAXIMUM_ATTRIBUTE_COUNT: ${GO_AUTOMODELER_DATA_IMPORT_MAXIMUM_ATTRIBUTE_COUNT}
      JOB_QUEUE: ${GO_JOB_QUEUE}
      JOB_STATUS_QUEUE: ${GO_JOB_STATUS_QUEUE}
      JOB_COMMAND_TOPIC: ${GO_JOB_COMMAND_TOPIC}
    volumes:
      - rapidminer_automodel_shared:/rapidminer-automodeler/shared
      - ./go/licenses:/rapidminer-automodeler/shared/licenses
      - ./go/branding/am:/rapidminer-automodeler/branding
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/am/system/health"]
    restart: always
    depends_on: 
      - rapidminer-automodel-activemq
      - rapidminer-automodel-db
    networks:
      rm-go-int-net:
        aliases:
         - rapidminer-automodeler
  rapidminer-automodel-job-container:
    image: rapidminer/rapidminer-automodel-job-container:${GO_IMAGE_TAG_JC}
    hostname: rapidminer-automodel-job-container
    environment:
      # Be aware that additional env vars might be set in Dockerfile
      #      (e.g. JOBCONTAINER_BASEDIR: /rapidminer-automodel-job-container)
      SPRING_PROFILES_ACTIVE: ${GO_JC_SPRING_PROFILES_ACTIVE}
      _JAVA_OPTIONS: ${GO_JAVA_OPTIONS}
      JOB_QUEUE: ${GO_JOB_QUEUE}
      JOB_STATUS_QUEUE: ${GO_JOB_STATUS_QUEUE}
      JOB_COMMAND_TOPIC: ${GO_JOB_COMMAND_TOPIC}
      AMQ_URL: ${GO_AMQ_URL}
      AMQ_USERNAME: ${GO_AMQ_USERNAME}
      AMQ_PASSWORD: ${GO_AMQ_PASSWORD}
    volumes:
      - rapidminer_automodel_shared:/rapidminer-automodel-job-container/shared
      - ./go/licenses:/rapidminer-automodel-job-container/shared/licenses
    depends_on:
      - rapidminer-automodeler
    restart: always
    networks:
      rm-go-int-net:
        aliases:
         - rapidminer-automodel-job-container
  rapidminer-ui-event-tracking:
    image: rapidminer/rapidminer-ui-event-tracking:${GO_IMAGE_TAG_ET}
    hostname: rapidminer-ui-event-tracking
    environment:
      _JAVA_OPTIONS: ${GO_JAVA_OPTIONS}
      DB_HOST: ${GO_DB_HOST}
      DB_USER: ${GO_AUTOMODELER_DB_USER}
      DB_PASSWORD: ${GO_AUTOMODELER_DB_PASSWORD}
      DB_NAME: ${GO_AUTOMODELER_DB_NAME}
    depends_on:
      - rapidminer-automodeler
    restart: always
    networks:
      rm-go-int-net:
        aliases:
         - rapidminer-ui-event-tracking
  rapidminer-automodel-db:
    image: postgres:9.6.6
    hostname: rapidminer-automodel-db
    volumes:
      - rapidminer_automodel_dbdata:/var/lib/postgresql/data
      - ./go/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
    networks:
      rm-go-int-net:
        aliases:
         - rapidminer-automodel-db
    environment:
      AUTOMODELER_DB_USER: ${GO_AUTOMODELER_DB_USER}
      AUTOMODELER_DB_PASSWORD: ${GO_AUTOMODELER_DB_PASSWORD}
      AUTOMODELER_DB_NAME: ${GO_AUTOMODELER_DB_NAME}
      RMID_DB_USER: ${GO_RMID_DB_USER}
      RMID_DB_PASSWORD: ${GO_RMID_DB_PASSWORD}
      RMID_DB_NAME: ${GO_RMID_DB_NAME}
      POSTGRES_PASSWORD: ${GO_POSTGRES_PASSWORD}
      POSTGRES_USER: ${GO_POSTGRES_USER}
    #ports:
    #  - "5432:5432"
  rapidminer-automodel-activemq:
    image: webcenter/activemq:5.14.3
    hostname: rapidminer-automodel-activemq
    environment:
      ACTIVEMQ_CONFIG_DEFAULTACCOUNT: ${GO_ACTIVEMQ_CONFIG_DEFAULTACCOUNT}
      ACTIVEMQ_ADMIN_LOGIN: ${GO_ACTIVEMQ_ADMIN_LOGIN}
      ACTIVEMQ_ADMIN_PASSWORD: ${GO_ACTIVEMQ_ADMIN_PASSWORD}
      ACTIVEMQ_OWNER_LOGIN: ${GO_AMQ_USERNAME}
      ACTIVEMQ_OWNER_PASSWORD: ${GO_AMQ_PASSWORD}
    networks:
      rm-go-int-net:
        aliases:
         - rapidminer-automodel-activemq
    #ports:
    #  - "8161:8161"
    #  - "61616:61616"
    #  - "61613:61613"



volumes:
  rm-postgresql-vol:
  rm-server-bootstrap-vol:
  rm-server-home-vol:
  rm-server-bootstrap-ja-vol:
  platform-admin-uploaded-vol:
  rts-deployments-vol:
  rts-licenses-vol:
  jupyterhub-postgresql-vol:
  grafana-home:
  keycloak-postgresql-vol:
  keycloak-admin-cli-vol:
  rm-landing-page-vol:
  rm-token-tool-vol:
  deployed-services-vol:
  rm-coding-shared-vol:
    name: ${JHUB_ENV_VOLUME_NAME}
  rapidminer_automodel_dbdata:
  rapidminer_automodel_shared:

networks:
  rm-platform-int-net:
  rm-idp-db-net:
  jupyterhub-db-net:
  rm-server-db-net:
  rm-coding-environment-storage-net:
  jupyterhub-user-net:
    name: jupyterhub-user-net-${JUPYTER_STACK_NAME}
  rm-go-int-net:
  rm-go-proxy-net: