System Installation with Docker

The recommended way to quickly install Universe MDM is by using Docker.

The system can be installed manually, if desired. This method of installation requires special skills and is intended to describe the basic steps. In projects, the IT infrastructure, integration parameters, and etc. will differ.

Note

This page contains an example of installing via Docker. To install, you need to have a repository with the Universe MDM distribution in the form of Docker images

Preparing for Installation

Server preparation:

  • Update the existing list of Ubuntu packages. Command: sudo apt update

  • Install Docker from oficial repository. See docs https://docs.docker.com/

  • Install Docker Compose (version 1.29 or upper).

  • Configure permissions for Docker Compose. Command: sudo chmod +x /usr/local/bin/docker-compose

  • Install Git.

Link to repository:

According to the delivery contract, Universe MDM will get access to the repository with the distribution of your product.

  • The main way: get an archive with Docker images of the distribution. Create your own repository via a local Docker pub.

  • Alternative way: According to the Universe Date delivery agreement, get access to the repository with the distribution of your product.

Installing with Docker

To install Universe MDM:

  1. Make sure you have a link to the repository with the product distribution. About getting the link, see above.

  2. Clone the repository from Gitlab or Docker. The command:

    git clone [your-link-universe-platform-deploy.git]
    
  3. Go to the directory with project using the command:

    cd universe-platform-deploy
    
  4. Log in to the repository using the command (using login /password):

    sudo docker login repo.tddev.ru/universe-dg-deploy
    
  5. Run Universe MDM system:

    docker-compose up -d
    

By default, you can see UI on localhost:8082.

Default login/password: admin/ admin. After entering the login and password, the system will request the license file and password change

Custom Installation with Docker Compose

Note

The version of docker-compose should be 1.29 or upper

If necessary, use docker-compose.yaml to create your own image. The .env file contains the list of available variables. File description see below.

  1. Create docker-compose.yaml file.

  2. Create hunspell folder with dictionaries.

  3. You can recreate docker container with new settings by the command:

    docker-compose up -d --build --force-recreate
    

Example of the docker-compose.yaml file:

version: '2.4'
services:
  jacoco:
    image: docker.universe-data.ru/universe/jacoco-agent:latest
    profiles: ["jacoco"]
    volumes:
      - jacoco:/jacoco:ro

  setup_json:
    image: stedolan/jq:latest
    entrypoint: >
      sh -c "
      cd /opt/json_configs;
      [ ! -z ${OVERRIDE_JSON:-''} ] &&
      jq -s '.[0] * .[1]' customer.json ${OVERRIDE_JSON}
      > ../customer.json ||
      cp customer.json ../customer.json"
    volumes:
      - ./:/opt

  ui:
    image: ${FRONTEND_IMAGE}
    restart: always
    ports:
      - ${FRONTEND_PORT}:80
    networks:
      - mdm_network
    links:
      - mdm
    volumes:
      - ${FRONTEND_UE:-/dev/null}:/usr/share/nginx/html/CUX
      - ./customer.json:/usr/share/nginx/html/customer.json
    environment:
      BACKEND_ADDRESS: ${BACKEND_ADDRESS}
      CLIENT_MAX_BODY_SIZE: ${CLIENT_MAX_BODY_SIZE}
      PROXY_SEND_TIMEOUT: ${PROXY_SEND_TIMEOUT}
      PROXY_READ_TIMEOUT: ${PROXY_READ_TIMEOUT}
      SEND_TIMEOUT: ${SEND_TIMEOUT}
    depends_on:
      setup_json:
        condition: service_completed_successfully

  mdm:
    image: ${BACKEND_IMAGE}
    restart: always
    ports:
      - ${BACKEND_PORT}:8080
      - ${JACOCO_AGENT_PORT:-6300}:6300
    networks:
      - mdm_network
    environment:
      GUEST_MODE: ${GUEST_MODE}
      POSTGRES_ADDRESS: postgres-mdm:5432
      POSTGRES_USERNAME: ${MDM_POSTGRES_USER}
      POSTGRES_PASSWORD: ${MDM_POSTGRES_PASSWORD}
      DATABASE_NAME: ${MDM_POSTGRES_DB_NAME}
      SEARCH_CLUSTER_ADDRESS: opensearch-mdm:9200
      SEARCH_CLUSTER_NAME: docker-cluster
      EMAIL_ENABLED: ${RESTORE_EMAIL_ENABLED}
      EMAIL_SERVER_HOST: ${RESTORE_EMAIL_SERVER_HOST}
      EMAIL_SERVER_PORT: ${RESTORE_EMAIL_SERVER_PORT}
      EMAIL_USERNAME: ${RESTORE_EMAIL_USERNAME}
      EMAIL_PASSWORD: ${RESTORE_EMAIL_PASSWORD}
      EMAIL_FRONTEND_URL: ${RESTORE_EMAIL_FRONTEND_URL}
      EMAIL_SSL_ENABLE: ${RESTORE_EMAIL_SSL_ENABLE}
      EMAIL_STARTTLS_ENABLE: ${RESTORE_EMAIL_STARTTLS_ENABLE}
      JAVA_TOOL_OPTIONS: ${JAVA_TOOL_OPTIONS:-}
    volumes:
      - jacoco:/jacoco:ro
    depends_on:
      postgres-mdm:
        condition: service_healthy
      opensearch-mdm:
        condition: service_healthy

  postgres-mdm:
    image: postgres:12
    restart: always
    environment:
      POSTGRES_DB: ${MDM_POSTGRES_DB_NAME}
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      MDM_POSTGRES_USER: ${MDM_POSTGRES_USER}
      MDM_POSTGRES_PASSWORD: ${MDM_POSTGRES_PASSWORD}
    ports:
      - ${POSTGRES_OUTER_PORT}:5432
    networks:
      - mdm_network
    volumes:
      - ./init-db.sh:/docker-entrypoint-initdb.d/initdb.sh
      - mdm-postgres-data:/var/lib/postgresql/data
    command: postgres -c max_prepared_transactions=300
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d $MDM_POSTGRES_DB_NAME"]
      interval: 10s
      timeout: 1s
      retries: 20

  opensearch-mdm:
    image: opensearchproject/opensearch:2.7.0
    restart: always
    environment:
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
      - "discovery.type=single-node"
      - "DISABLE_SECURITY_PLUGIN=true"
    volumes:
      - mdm-opensearch-data:/usr/share/opensearch/data
      - ./hunspell:/usr/share/opensearch/config/hunspell/
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - ${OPENSEARCH_HTTP_OUTER_PORT}:9200
    networks:
      - mdm_network
    healthcheck:
      test: >
        bash -c "curl http://localhost:9200 | grep '\"cluster_name\"'"
      interval: 10s
      timeout: 2s
      retries: 20

volumes:
  mdm-postgres-data:
    driver: local
  mdm-opensearch-data:
    driver: local
  jacoco:
    driver: local

networks:
  mdm_network:
    driver: bridge

Description of.env File

Tip

Parameter names may differ depending on the edition (SE/EE/CE), but must match the parameters in docker-compose.yaml

  • BACKEND_IMAGE, FRONTEND_IMAGE - references to backend and frontend images; vary depending on the edition.

  • OPENSEARCH_HTTP_OUTER_PORT, POSTGRES_OUTER_PORT, FRONTEND_PORT, BACKEND_PORT - external ports of the corresponding containers, i.e. ports to which the cluster docker can externally connect. The values can be arbitrary; the names must match the docker-compose.yaml file.

  • MDM_POSTGRES_USER, MDM_POSTGRES_PASSWORD, MDM_POSTGRES_DB_NAME - user name, password and database name; varies depending on the edition; must match the docker-compose.yaml file.

  • GUEST_MODE - parameter to enable guest access; available only in Enterprise edition.

  • RESTORE_EMAIL - parameters which are responsible for restoring passwords.

  • Group of parameters nginx.conf is available in Standard and Enterprise editions:

    • BACKEND_ADDRESS - the value is taken from the section of the same name in docker-compose.yaml file - in the example the mdm value is used.

Example of .env file for Enterprise edition:

BACKEND_IMAGE=docker.universe-data.ru/unidata-ee/backend:release-6-9-f8f15d0a
FRONTEND_IMAGE=docker.universe-data.ru/unidata-ee/frontend:release-6-9-6a64df48

OPENSEARCH_HTTP_OUTER_PORT=19201

MDM_POSTGRES_USER=postgres
MDM_POSTGRES_PASSWORD=postgres
MDM_POSTGRES_DB_NAME=postgres
POSTGRES_OUTER_PORT=15431

FRONTEND_PORT=8082
BACKEND_PORT=9081

GUEST_MODE=false

RESTORE_EMAIL_ENABLED=false
RESTORE_EMAIL_SERVER_HOST=localhost
RESTORE_EMAIL_SERVER_PORT=5025
RESTORE_EMAIL_USERNAME=universe@example.com
RESTORE_EMAIL_PASSWORD=password
RESTORE_EMAIL_FRONTEND_URL=''
RESTORE_EMAIL_SSL_ENABLE=true
RESTORE_EMAIL_STARTTLS_ENABLE=false

#nginx.conf
BACKEND_ADDRESS=http://mdm:8080
CLIENT_MAX_BODY_SIZE=100m
PROXY_SEND_TIMEOUT=600s
PROXY_READ_TIMEOUT=600s
SEND_TIMEOUT=600s