Java 11 Documentum REST Client examples

On Java 11, HttpClient was added to Java (no more need to use Apache’s HttpClient). and this presents some changes to the usual way of consuming Documentum REST services. The main “issue” is that there is no MultiPart class provided to easily handle multipart content (create a document), so we need to do it manually. I’ve upload a project to GitHub with basic examples of using Documentum REST services with Java 11: DctmRest11

D2 slow loading login screen

You may have realized that D2 takes some time to load the login screen when you want to log in. The usual behaviour is that after typing D2’s url in your browser, you’ll see something that looks like a loading screen (after d2 spin wheel):

and after a few moments the login screen in shown.

This behaviour is not something Documentum users are used to when using Webtop so, why this happens? Well, by now you’ve probably realized that D2 does not show the repository name, but the repository description. And in a questionable design decision, this processing is done every time the login screen is loaded (=every time a user access).

This happens on C6-Common\com\emc\common\dctm\objects\DfDocbaseMapEx class and the effect is quite clear as it is shown in this log trace:

c.e.c.d.o.DfDocbaseMapEx[] : Load docbases from docbrocker 8.925s

Yes, here we have users waiting for 9 seconds before the login screen is shown, and this happens every single time they try to access D2.

So, what wizardry is behind this odd behaviour? Let’s check it:

public DfDocbaseMapEx(String attrName, String direction) throws DfException {
    StopWatch stopWatch = new StopWatch(true);
    this.m_docbases = new TreeSet(new DfDocbaseComparator(this, attrName, direction));
    IDfClient client = DfClient.getLocalClient();
    IDfDocbaseMap docbaseMap = client.getDocbaseMap();

    int count = docbaseMap.getDocbaseCount();
    for (int i = 0; i < count; i++) {
      try {
        String server;
        IDfTypedObject serverMap = docbaseMap.getServerMap(i);
        String name = docbaseMap.getDocbaseName(i);
        String currentServer = serverMap.getString("i_host_name");

        if (serverMap.findString("r_host_name", currentServer) == -1) {
          server = serverMap.getRepeatingString("r_host_name", 0);
        } else {
          server = currentServer;
        }
        String description = docbaseMap.getDocbaseDescription(i);
        String version = docbaseMap.getServerVersion(i);
        DfDocbaseEx docbase = new DfDocbaseEx(this, name, server, description, version);
        this.m_docbases.add(docbase);
      }
      catch (DfException e) {
        LOG.error("{}", e);
     }
    }
    LOG.debug("Load docbases from docbrocker {}", stopWatch);
  }

Well, there is no much mistery here, getting an IDfTypedObject for each repository registered in your docbroker, every single time a user logs in… it may not be very noticeable with one repository, but try this code with +10 repositories… You can add logging inside the loop and check how much time takes for each repository…

This questionable design decision, makes you also wonder about other behaviors/configurations from D2:

  • Repository filter option: This acts as a simple cosmetic filter, as you can see that there’s no filtering when the list is populated. This means that you can have one repository listed, but you still have to wait for all the repositories to be “processed”
  • If you have enabled autologin/default repository, you’ll face the same situation, users will be logged in directly… after several seconds waiting for the login screen (that they won’t see) to finish loading.

So, what can we do to fix it (besides waiting for OT to fix it)?. Well, as you can see the code is no rocket science, so there are a bunch of possibilities:

  1. Don’t process every single time the repository list (basically check if this.m_docbases == null or size == 0)
  2. Load settings.properties and actually apply the repository filter inside the for loop
  3. Process autologin setting as in #2
  4. Add an option in D2FS/settings.properties to use repository name and forget about description
  5.  Don’t instantiate the servermap and use i_host_name from docbaseMap

By implementing any of these approaches you’ll get something like this when loading the repository list:

Standard D2:
repo1:16.4.0100.0153 Linux64.Oracle -> 1.087s
repo2:16.4.0100.0153 Linux64.Oracle -> 1.093s
repo3:16.4.0100.0153 Linux64.Oracle -> 1.098s
repo4:16.4.0100.0153 Linux64.Oracle -> 1.108s
Total: 4.389s
 
Modified D2:
repo1:16.4.0100.0153 Linux64.Oracle -> 0.000s
repo2:16.4.0100.0153 Linux64.Oracle -> 0.000s
repo3:16.4.0100.0153 Linux64.Oracle -> 0.000s
repo4:16.4.0100.0153 Linux64.Oracle -> 0.000s
Total: 0.002s

And users will be much happier than before 😀

Improving Opentext’s Documentum Administrator 20.2 Docker container

If you go looking for Documentum’s DA 20.2 Docker file you’ll find the following:

documentum_adminstrator_20.2_docker_centos.tar (1.4 GB)

What’s wrong with this? Well, in a container world (specially when using application servers) why is there the word “centos” and why a tomcat is 1.4 GB?

The answer is simple: Whoever built this image didn’t know what a container is, and it seems that nobody knows yet at Opentext.

What is a container? Well you can google it, but a container IS NOT A VM, it is a process. The idea behind containers is to have an isolated process that can be easily scalable (ie: deploy multiple similar tomcat instances quickly). So what’s the point of running a Docker environment when what we are doing is simply deploying VM’s? None at all.

So let’s assume we can use an actual container, that can be scaled up quickly, and won’t force us to “redeploy” a Centos OS on each container (for Tomcat, as DA is not a process and should not be “a container”), what should we do? Here we go (Note that I’ve used the same VM used for Opentext Documentum 20.2 Docker with PostgreSQL install guide):

  • Pull Tomcat 9 + openJDK 11 image from DockerHub:
[dmadmin@dctm202 ~]$ docker pull tomcat:9-jdk11
9-jdk11: Pulling from library/tomcat
f15005b0235f: Pull complete
41ebfd3d2fd0: Pull complete
b998346ba308: Pull complete
f01ec562c947: Pull complete
74c11ae3efe8: Pull complete
c65829cc6c71: Pull complete
b98eacc09bf1: Pull complete
b12b9c976670: Pull complete
62a47f54db4c: Pull complete
8c872760f50c: Pull complete
Digest: sha256:2254679f4958efe7c9810d6a66d449f58b58-p 8888:80808ecd253e83e9d3afb68c51637cf4
Status: Downloaded newer image for tomcat:9-jdk11
docker.io/library/tomcat:9-jdk11

[dmadmin@dctm202 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9-jdk11 54877c1fa80a 40 hours ago 647MB
  • Create the following folder structure and copy there these files:
/opt/docker/tomcat/conf/web.xml (just for Tag Pooling)
/opt/docker/tomcat/webapps/da.war (Da to deploy)
/opt/docker/tomcat/java.security (with anon whitelisted)
  • Run container (I’ve used 8888 as external port as the VM has another Tomcat running on 8080):
[dmadmin@dctm202 tomcat]$ docker run -it --rm -p 8888:8080 --name tomcatda -v /opt/docker/tomcat/java.security:/usr/local/openjdk-11/conf/security/java.security -v /opt/docker/tomcat/conf/web.xml:/usr/local/tomcat/conf/web.xml -v /opt/docker/tomcat/webapps:/usr/local/tomcat/webapps tomcat:9-jdk11

And that’s it, you now have a 650MB real container for DA.

Reducing Opentext Documentum 20.2 Docker image size

The Docker image size provided by Opentext for the Content Server is a ~3.5GB tar file:

[dmadmin@dctm202 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
contentserver/centos/stateless/cs 20.2.0000.0110 f83cfb099daf 3 weeks ago 3.48GB

But if you run the image, you’ll see that the actual size of the container is ~2.6GB.

This difference comes from the intermediate layers stored on the original image. If you want to have a smaller image, you could export the container to a .tar file, but if you do this, you will lose all the default configurations required for running the container (ports exposed, entry point, etc.). But there’s a workaround to get a working trimmed image:

docker run -it --entrypoint /bin/bash contentserver/centos/stateless/cs:20.2.0000.0110
  • You can be as “aggressive” as you want removing unused stuff. You can skip this point, but I would at least delete all .dll files and aix/hpux/sol/win folders from com.emc.ide.external.dfc_1.0.0/dmbasic on Composer’s plugin folder, as those don’t make sense on a Linux image.
  • Run the docker rebase script:
./docker-rebase <CONTAINER_ID> contentserver/centos/stateless/cs:20.2.4
  • Export the generated image:
docker save contentserver/centos/stateless/cs:20.2.4 > cs202clean.tar

Now, you’ll have the following:

[dmadmin@dctm202 Scripts]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
contentserver/centos/stateless/cs 20.2.4 5336da9204b0 34 minutes ago 2.49GB

Opentext Documentum 20.2 Docker with PostgreSQL install guide

This is a step-by-step guide to install Documentum 20.2 in a Linux environment with PostgreSQL 11 and Docker.

Some notes before starting:

  • Bundled scripts are from 16.7 (be careful with the paths)
  • Container image still has a lot of “wasted” space:
    • +0.5GB on /tmp
    • +0.5GB on files for windows/hpux/aix on a Linux image
  • Provided yml scripts are for an outdated docker composer version and don’t work OOTB

Environment

Host:
Windows 10 x64 8GB RAM
VMware Workstation Player 15

Guest:
CentOS 7.7 x64 25GB HD 4GB RAM 2 cores
PostgreSQL 11
Docker 19.03.4

VM Creation + PostgreSQL 11 configuration

You can just follow the procedure described in Opentext Documentum 20.2 PostgreSQL Developer Edition, as I’ve used the same VM for this one.

Docker configuration

  • Install docker:
[dmadmin@dctm202 ~]$ sudo yum install -y yum-utils && device-mapper-persistent-data && lvm2
[dmadmin@dctm202 ~]$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[dmadmin@dctm202 ~]$ sudo yum install -y docker-ce docker-ce-cli containerd.io
[dmadmin@dctm202 ~]$ sudo systemctl start docker
  • Install docker compose and check it is correctly installed:
[dmadmin@dctm202 docker]$ sudo yum install -y epel-release
[dmadmin@dctm202 docker]$ sudo yum install -y python-pip
[dmadmin@dctm202 docker]$ sudo pip install docker-compose
[dmadmin@dctm202 docker]$ sudo yum upgrade python*
[dmadmin@dctm202 docker]$ docker-compose version
docker-compose version 1.25.4, build unknown
docker-py version: 4.2.0
CPython version: 2.7.5
OpenSSL version: OpenSSL 1.0.2k-fips  26 Jan 2017

Docker configuration

  • Import image:
[dmadmin@dctm202 docker]$ docker load -i Contentserver_Centos.tar
9e607bb861a7: Loading layer [==================================================>]  227.4MB/227.4MB
0b8351dad8f5: Loading layer [==================================================>]    156MB/156MB
0bdffe493043: Loading layer [==================================================>]  331.9MB/331.9MB
4477c4933872: Loading layer [==================================================>]  3.072kB/3.072kB
2cb92160ff08: Loading layer [==================================================>]  83.45MB/83.45MB
3791acd2392f: Loading layer [==================================================>]  11.92MB/11.92MB
9edf87e7e96b: Loading layer [==================================================>]  267.3kB/267.3kB
f823733197a1: Loading layer [==================================================>]  3.297MB/3.297MB
8175917577fb: Loading layer [==================================================>]  46.08kB/46.08kB
66c808159e56: Loading layer [==================================================>]  15.53MB/15.53MB
c60aa2091bd5: Loading layer [==================================================>]   98.3kB/98.3kB
b148e43b1fc1: Loading layer [==================================================>]  2.667GB/2.667GB
2cd48c26512d: Loading layer [==================================================>]  7.168kB/7.168kB
03eb108f7247: Loading layer [==================================================>]   12.6MB/12.6MB
ba3de33f6548: Loading layer [==================================================>]   2.56kB/2.56kB
Loaded image: contentserver/centos/stateless/cs:20.2.0000.0110
  • Create PostgreSQL tablespace file (Remember that you also need to add the container’s IP to the pg_hba file in order to be able to connect from the contanier)
[dmadmin@dctm202 dctmdocker]$ su - postgres
Password:
Last login: Sat Oct 19 19:39:49 CEST 2019 on pts/0
-bash-4.2$ mkdir /var/lib/pgsql/11/data/db_dockerdctm167_dat.dat
-bash-4.2$ exit
logout
  • Set required environment variables:
[dmadmin@dctm202 Scripts]$ vi ~/.bash_profile
export APP_SERVER_PASSWORD=dmadmin
export INSTALL_OWNER_PASSWORD=dmadmin
export ROOT_PASSWORD=dmadmin
export DOCBASE_PASSWORD=dmadmin
export DATABASE_PASSWORD=dmadmin
export GLOBAL_REGISTRY_PASSWORD=dmadmin
export AEK_PASSPHRASE=dmadmin
  • Configure file CS-Docker-Compose_Stateless.yml:
version: '3.7'
services:
  rcs:
    image: contentserver/centos/stateless/cs:20.2.0000.0110
    environment:
      - DOCKER_HOST=192.168.94.130
      - DATABASE_HOST=192.168.94.130
      - DATABASE_USER=postgres
      - DATABASE_PASSWORD=${DATABASE_PASSWORD}
      - DATABASE_SERVER_PORT=5432
      - SERVICE_NAME=MyPostgres
      - ROOT_PASSWORD=${ROOT_PASSWORD}
      - INSTALL_OWNER=dmadmin
      - INSTALL_OWNER_PASSWORD=${INSTALL_OWNER_PASSWORD}
      - DOCBASE_NAME=dctmdocker202
      - GLOBAL_REGISTRY_PASSWORD=${GLOBAL_REGISTRY_PASSWORD}
      - AEK_ALGORITHM=AES_256_CBC
      - AEK_PASSPHRASE=${AEK_PASSPHRASE}
      - AEK_NAME=CSaek
      - CONFIGURE_THUMBNAIL_SERVER=NO
      - THUMBNAIL_SERVER_PORT=8081
      - THUMBNAIL_SERVER_SSL_PORT=8443
      - EXTERNAL_DOCBROKER_PORT=1689
      - CONTENTSERVER_PORT=50000
      - APP_SERVER_PASSWORD=${APP_SERVER_PASSWORD}
      - INSTALL_OWNER_UID=1000
      - HIGH_VOLUME_SERVER_LICENSE=
      - TRUSTED_LICENSE=
      - STORAGEAWARE_LICENSE=
      - XMLSTORE_LICENSE=
      - SNAPLOCKSTORE_LICENSE=
      - RPS_LICENSE=
      - FED_RECD_SERVICE_LICENSE=
      - RECORD_MANAGER_LICENSE=
      - PRM_LICENSE=
      - DOCBASE_PASSWORD=${DOCBASE_PASSWORD}
      - INSTALLER_UI=silent
      - KEEP_TEMP_FILE=true
      - INSTALLER_DEBUG_LOG=true
      - DOCBASE_ID=453216
      - USE_EXISTING_DATABASE_ACCOUNT=
      - INDEXSPACE_NAME=DM_XCHIVE_DOCBASE
      - USE_EXISTING_AEK=false
    hostname:
      "dctmdocker202"
    container_name:
      "dctmdocker202"
    ports:
      - "1689:1689"
      - "1690:1690"
      - "50000:50000"
      - "50001:50001"
      - "9080:9080"
      - "9082:9082"
      - "9081:9081"
      - "9084:9084"
      - "8081:8081"
      - "8443:8443"
    volumes:
      - DocbaseName_odbc:/opt/dctm/odbc
      - DocbaseName_data:/opt/dctm/data
      - DocbaseName_dba:/opt/dctm/dba
      - DocbaseName_share:/opt/dctm/share
      - DocbaseName_dfc:/opt/dctm/config
      - DocbaseName_mdserver_conf:/opt/dctm/mdserver_conf
      - DocbaseName_mdserver_log:/opt/dctm/wildfly17.0.1/server/DctmServer_MethodServer/log
      - DocbaseName_mdserver_logs:/opt/dctm/wildfly17.0.1/server/DctmServer_MethodServer/logs
      - DocbaseName_Thumbnail_Server_conf:/opt/dctm/product/20.2/thumbsrv/conf
      - DocbaseName_Thumbnail_Server_webinf:/opt/dctm/product/20.2/thumbsrv/container/webapps/thumbsrv/WEB-INF
      - DocbaseName_xhive_storage:/opt/dctm/xhive_storage
      - DocbaseName_XhiveConnector:/opt/dctm/wildfly17.0.1/server/DctmServer_MethodServer/deployments/XhiveConnector.ear
      - DocbaseName_MigrationUtility:/opt/dctm/product/20.2/install/external_apps/MigrationUtil
    privileged: true
#'volumes' service definition:
volumes:
 DocbaseName_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/docker/data
 DocbaseName_share:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/docker/share
 DocbaseName_dba:
 DocbaseName_dfc:
 DocbaseName_odbc:
 DocbaseName_mdserver_conf:
 DocbaseName_mdserver_log:
 DocbaseName_mdserver_logs:
 DocbaseName_Thumbnail_Server_conf:
 DocbaseName_Thumbnail_Server_webinf:
 DocbaseName_XhiveConnector:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/docker/xhive
 DocbaseName_xhive_storage:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/docker/xhive_storage
 DocbaseName_MigrationUtility:

Note: As usual, documentation is lacking/wrong and the scripts don’t work at all. This is the list of parameters that I had to change in CS-Docker-Compose_Stateless.yml file in order for docker compose to work:

    image: contentserver/centos/stateless/cs:16.7.0000.0810
    environment:
      - DOCKER_HOST=192.168.94.130
      - DATABASE_HOST=192.168.94.130
      - DOCBASE_NAME=dctmdocker202
    hostname:
      "dctmdocker202"
    container_name:
      "dctmdocker202"
    ports:
      - "1689:1689"
      - "1690:1690"
      - "50000:50000"
      - "50001:50001"
      - "9080:9080"
      - "9082:9082"
      - "9081:9081"
      - "9084:9084"
      - "8081:8081"
      - "8443:8443"
volumes:
 DocbaseName_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/docker/data
 DocbaseName_share:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/docker/share
 DocbaseName_XhiveConnector:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/docker/xhive
 DocbaseName_xhive_storage:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/docker/xhive_storage
  • Run the docker compose file:
[dmadmin@dctm202 Scripts]$ docker-compose -f CS-Docker-Compose_Stateless.yml up -d
Creating volume "scripts_DocbaseName_mdserver_logs" with default driver
Creating volume "scripts_DocbaseName_dfc" with default driver
Creating volume "scripts_DocbaseName_XhiveConnector" with local driver
Creating volume "scripts_DocbaseName_Thumbnail_Server_conf" with default driver
Creating volume "scripts_DocbaseName_Thumbnail_Server_webinf" with default driver
Creating volume "scripts_DocbaseName_data" with local driver
Creating volume "scripts_DocbaseName_dba" with default driver
Creating volume "scripts_DocbaseName_mdserver_conf" with default driver
Creating volume "scripts_DocbaseName_mdserver_log" with default driver
Creating volume "scripts_DocbaseName_odbc" with default driver
Creating volume "scripts_DocbaseName_share" with local driver
Creating volume "scripts_DocbaseName_xhive_storage" with local driver
Creating volume "scripts_DocbaseName_MigrationUtility" with default driver
Creating dctmdocker202 ... done

 

Remember that if something goes wrong you’ll have to:

  • Stop the container
  • Delete the container
  • Delete the volumes created

Once the process finishes, you should be able to idql from the container:

[dmadmin@dctm202 ~]$ docker exec -i -t dctmdocker202 /bin/basht dctmdocker202 /bin/bash
[root@dctmdocker202 /]# su - dmadmin

[dmadmin@dctmdocker202 ~]$ idql dctmdocker202
Please enter a user (dmadmin):
Please enter password for dmadmin:
OpenText Documentum idql - Interactive document query interface
Copyright (c) 2020. OpenText Corporation
All rights reserved.
Client Library Release 20.2.0000.0082
Connecting to Server using docbase dctmdocker202
[DM_SESSION_I_SESSION_START]info: "Session 0106ea608000016c started for user dmadmin."
Connected to OpenText Documentum Server running Release 20.2.0000.0110 Linux64.Postgres
1>

Opentext Documentum 20.2 PostgreSQL Install Guide

This is a step-by-step guide to install Documentum 20.2 in a Linux environment with PostgreSQL 11.

Environment

Host:
Windows 10 x64 8GB RAM
VMware Workstation Player 15

Guest:
CentOS 7.7 x64 25GB HD 4GB RAM 2 cores
PostgreSQL 11
Documentum 20.2

VM Creation

Mount the CentOS 7 DVD image, boot the machine and follow the steps. You can choose to let EasyInstall do the work for you. I used minimal package install to save resources, named the machine dctm202, configured the network and set the root password as well as a “dmadmin” user.

OS Configuration

  • Install required packages:

[dmadmin@dctm202 ~]$ sudo yum -y install bash-completion kernel-devel rng-tools.x86_64
[dmadmin@dctm202 ~]$ sudo yum -y install bash-completion kernel-devel rng-tools.x86_64 policycoreutils policycoreutils-python selinux-policy selinux-policy-targeted libselinux-utils setroubleshoot-server setools setools-console mcstrans expect tcl
[dmadmin@dctm202 ~]$ sudo yum -y group install X\ Window\ System “Development Tools”
[dmadmin@dctm202 ~]$ sudo yum -y install open-vm-tools.x86_64

  • Stop and disable the firewalld service:

[dmadmin@dctm202 ~]$ sudo systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[dmadmin@dctm202 ~]$ sudo systemctl stop firewalld

  • Configure entropy and allow http connections through selinux:

[dmadmin@dctm202 ~]$ sudo /sbin/rngd -b -r /dev/urandom -p /dev/random
[dmadmin@dctm202 ~]$ sudo setsebool -P httpd_can_network_connect_db 1
[dmadmin@dctm202 ~]$ sudo chkconfig rngd on

PostgreSQL Configuration

  • Install required packages:

[dmadmin@dctm202 ~]$ sudo yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
[dmadmin@dctm202 ~]$ sudo yum -y install postgresql11 postgresql11-server

  • Init the DB:

[dmadmin@dctm202 ~]$ sudo /usr/pgsql-11/bin/postgresql-11-setup initdb

  • Enable and start the PostgreSQL service:

[dmadmin@dctm202 ~]$ sudo systemctl enable postgresql-11
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-11.service to /usr/lib/systemd/system/postgresql-11.service.
[dmadmin@dctm202 ~]$ sudo systemctl start postgresql-11

  • Configure the postgres user:

[dmadmin@dctm202 ~]$ sudo passwd postgres
Changing password for user postgres.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

[dmadmin@dctm202 ~]$ su – postgres
-bash-4.2$ psql
psql (11.5)
Type “help” for help.

postgres=#
postgres=# \password postgres
Enter new password:
Enter it again:
postgres=# \q
-bash-4.2$ exit

  • Configure PostgreSQL:

[root@dctm202 ~]# vi /var/lib/pgsql/11/data/postgresql.conf
listen_addresses = ‘*’
port = 5432

[root@dctm202 ~]# vi /var/lib/pgsql/11/data/pg_hba.conf
host all all 127.0.0.1/32 md5
host all all ::/128 md5
host all all dctm202 md5

  • Restart PostgreSQL service to apply the changes:

[dmadmin@dctm202 ~]$ sudo systemctl restart postgresql-11

phpPgAdmin Configuration

  • Install required packages:

[dmadmin@dctm202 ~]$ sudo yum install -y php php-cli php-common php-pdo php-pgsql httpd apr apr-util httpd-tools libzip mailcap
[dmadmin@dctm202 ~]$ wget https://github.com/phppgadmin/phppgadmin/archive/REL_5-6-0.tar.gz
[dmadmin@dctm202 ~]$ tar -zxvf REL_5-6-0.tar.gz
[dmadmin@dctm202 ~]$ mv phppgadmin-REL_5-6-0/ /usr/share/phppgadmin
[dmadmin@dctm202 ~]$ mv /usr/share/phppgadmin/conf/config.inc.php-dist /usr/share/phppgadmin/conf/config.inc.php

  • Configure phpPgAdmin:

[dmadmin@dctm202 ~]$ sudo vi /etc/httpd/conf.d/phpPgAdmin.conf

Alias /phppgadmin /usr/share/phppgadmin

<Location /phppgadmin>
<IfModule mod_authz_core.c>
# Apache 2.4
Require all granted
#Require host example.com
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order deny,allow
Allow from all
Allow from 127.0.0.1
Allow from ::1
# Allow from .example.com
</IfModule>
</Location>

[dmadmin@dctm202 ~]$ sudo vi /etc/phpPgAdmin/config.inc.php-dist

$conf[‘servers’][0][‘host’] = ‘dctm202’;
$conf[‘extra_login_security’] = false;
$conf[‘owned_only’] = true;

[dmadmin@dctm202 ~]$ sudo cp /etc/phpPgAdmin/config.inc.php-dist /etc/phpPgAdmin/config.inc.php

  • Restart httpd service to apply the changes:

[dmadmin@dctm202 ~]$ sudo systemctl restart httpd

Now you should be able to login to the console from http://dctm202/phppgadmin/.

ODBC Configuration

  • Install required packages:

[dmadmin@dctm202 ~]$ sudo yum -y install postgresql11-odbc.x86_64 unixODBC.x86_64

  • Configure .ini files:

[dmadmin@dctm202 ~]$ sudo vi /etc/odbcinst.ini
[PostgreSQL]
Description = ODBC for PostgreSQL
#Driver = /usr/lib/psqlodbcw.so
#Setup = /usr/lib/libodbcpsqlS.so
#Driver64 = /usr/lib64/psqlodbcw.so
#Setup64 = /usr/lib64/libodbcpsqlS.so
Driver = /usr/pgsql-11/lib/psqlodbcw.so
Driver64 = /usr/pgsql-11/lib/psqlodbcw.so
Setup64 = /usr/lib64/libodbcpsqlS.so
FileUsage = 1
[dmadmin@dctm202 ~]$ sudo vi /etc/odbc.ini
[MyPostgres]
Description=PostgreSQL
Driver=PostgreSQL
Database=postgres
Servername=dctm202
UserName=postgres
Password=dmadmin
Port=5432
Protocol=11
ReadOnly=No
RowVersioning=No
ShowSystemTables=No
ShowOidColumn=No
FakeOidIndex=No
UpdateableCursors=Yes
DEBUG=Yes

  • Test the connection:

[dmadmin@dctm202 ~]$ isql -v MyPostgres
+—————————————+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+—————————————+
SQL> quit

Documentum server

  • Create folders:

[dmadmin@dctm202 ~]$ sudo mkdir -p /opt/documentum && sudo chown dmadmin.dmadmin /opt/documentum && mkdir /opt/documentum/product && mkdir /opt/documentum/product/20.2 && mkdir -p /opt/documentum/sw/cs

  • Install openJDK 11 (remember to remove “anon” from the list of disabled algorithms or the installer will fail to connect to the repository)

[dmadmin@dctm202 cs]$ sudo yum -y install java-11-openjdk java-11-openjdk-devel
[dmadmin@dctm202 cs]$ echo $(dirname $(dirname $(readlink $(readlink $(which javac)))))
/usr/lib/jvm/java-11-openjdk-11.0.4.11-1.el7_7.x86_64

  • Set up environment variables:

[dmadmin@dctm202 ~]$ vi ~/.bash_profile
DOCUMENTUM=/opt/documentum
export DOCUMENTUM

DM_HOME=$DOCUMENTUM/product/20.2
export DM_HOME

POSTGRESQL_HOME=/usr/pgsql-11
export POSTGRESQL_HOME

JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.6.10-1.el7_7.x86_64/
export JAVA_HOME

PATH=$PATH:$DM_HOME/bin:$POSTGRESQL_HOME/bin:$HOME/.local/bin:$HOME/bin:$JAVA_HOME/bin
export PATH

LC_ALL=C
export LC_ALL

LD_LIBRARY_PATH=$POSTGRESQL_HOME/lib:$DM_HOME/bin:$DOCUMENTUM/java64/JAVA_LINK/jre/lib/amd64/server:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH

  • Reserve ports for services:

[dmadmin@dctm202 ~]$ sudo vi /etc/services
dctm202 50000/tcp # dctm 20.2 repo
dctm202_s 50001/tcp # dctm 20.2 repo

  • Create symbolic link for later (configuration program):

[dmadmin@dctm202 ~]$ sudo ln -s /usr/lib64/libsasl2.so.3.0.0 /usr/lib64/libsasl2.so.2

  • Configure limits.conf:

[dmadmin@dctm202 ~]$ sudo vi /etc/security/limits.conf
dmadmin – core -1

  • Run the installer:

[dmadmin@dctm202 cs]$ tar -xvf content_server_20.2_linux64_postgres.tar
[dmadmin@dctm202 cs]$ chmod 777 serverSetup.bin
[dmadmin@dctm202 cs]$ ./serverSetup.bin

 

Docbroker and repository

  • Create the tablespace file for the repository (dctm202):

[dmadmin@dctm202 cs]$ su –
[root@dctm202 ~]# su – postgres
-bash-4.2$ mkdir /var/lib/pgsql/11/data/db_dctm202_dat.dat
-bash-4.2$ exit
[root@dctm167 ~]# exit

  • Run the configurator:

[dmadmin@dctm202 install]$ ./dm_launch_server_config_program.s

And you should know the rest 🙂

 

OpenText AppWorks 16.7 install guide

I should add: for Documentum newbies in OpenText products 🙂

I’ve recently had to test/evaluate OpenText AppWorks as a suitable solution for development purposes.

If you’re not familiar with OpenText portfolio, AppWorks is OpenText equivalent to Documentum’s xCP. A “framework” that allows you to build “process oriented” applications. Also, somewhat like D2, as there’s no coding in AppWorks.

For those of you that are wondering, installing this wasn’t really that easy, and it seems Documentum documentation is not the only “lacking” documentation 🙂

So, let’s start:

Environment

Host:
Windows 10 x64 8GB RAM
VMware Workstation Player 12

Guest:
CentOS 7 x64 25GB HD 4GB RAM 2 cores
PostgreSQL 9.6
Documentum 16.4

VM Creation

I’ve used the VM created on the Opentext Documentum 16.4 PostgreSQL Developer Edition, but you can use any VM with PostgreSQL.

PostgreSQL Configuration

Follow the instructions on any of the previous guides (Opentext Documentum 16.4 PostgreSQL Developer EditionOpentext Documentum 16.7 PostgreSQL Developer Edition) to get PostgreSQL running, then create a new database. I’ve used phpPgAdmin to create a user (appworks), tablespace (appworks, remember to create the folder on the filesystem before creating the tablespace) and a database (appworks).

Additionally, you also need to download PostgreSQL’s JDBC driver from this page.

TomEE Configuration

Be aware that this is not Tomcat 🙂 You’ll need to download the TomEE (I’ve used the Plume 8.0.0 version) from TomEE download page. As with Tomcat, just unzip and you’ll have a familiar structure. Also, set this TomEE to run under openJDK (I used openJDK 11, as this is required later by AppWorks).

Additional configuration to do:

  • Modify tomcat-users.xml with the following:

<role rolename=”tomee-admin” />
<role rolename=”manager-gui”/>
<role rolename=”manager-script”/>
<role rolename=”manager-jmx”/>
<role rolename=”manager-status”/>
<role rolename=”admin-gui”/>
<role rolename=”admin-script”/>

<user username=”tomee” password=”tomee” roles=”admin-gui,manager-gui,tomee-admin”/>
<user username=”opentext” password=”opentext” roles=”admin-gui,admin-script,manager-gui,manager-script,manager-jms,manager-status,tomee-admin”/>
<user username=”rpc” password=”rpc” roles=”admin-script,manager-script,manager-jmx”/>

 

  • Rename /lib/openejb-core-eclipselink-8.0.0.jar to /lib/openejb-core-eclipselink-8.0.0.bak
  • Copy postgresql JDBC driver to \lib folder (although I’m quite sure this is not really needed)
  • Configure a service on the server for Tomee and name it “tomee”

CARS Configuration

  • Run the installer:

sudo JAVA_HOME=/opt/opentext/jdk-11 CLASSPATH=/opt/opentext/postgresql-42.2.9.jar PATH=/opt/opentext/jdk-11/bin:$PATH ./OpenText_CARS_2.6.bin

2020-01-08 20_01_33-01

2020-01-08 20_01_51-02

2020-01-08 20_02_01-03

2020-01-08 20_02_14-04

2020-01-08 20_02_39-06

2020-01-08 20_02_58-07

2020-01-08 20_03_12-08

2020-01-08 20_03_41-09

AppWorks Configuration

You’ll need a license to install AppWorks. This trial license can be requested from the support site.

  • Run the installer:

sudo JAVA_HOME=/opt/opentext/jdk-11 CLASSPATH=/opt/opentext/postgresql-42.2.9.jar PATH=/opt/opentext/jdk-11/bin:$PATH ./OpenText_AppWorks_Platform_16.7.bin

2020-01-08 20_06_59-01_1

2020-01-08 20_07_26-02_1

2020-01-08 20_07_40-03_1

2020-01-08 20_07_54-04_1

2020-01-08 20_08_04-05_1

2020-01-08 20_08_19-06_1

2020-01-08 20_08_30-07_1

2020-01-08 20_08_41-08_1

2020-01-08 20_08_59-09_1

2020-01-08 20_09_45-10_1

2020-01-08 20_10_10-11_1

2020-01-08 20_10_26-12_1

2020-01-08 20_11_00-13_1

2020-01-08 20_11_10-14_1

2020-01-08 20_12_03-15_1

2020-01-08 20_12_23-16_1

2020-01-08 20_12_40-17_1

2020-01-08 20_13_52-18_1

Last, but not least, some sources of information related to AppWorks:

DCTM 16.7 Docker with PostgreSQL install guide

This is a step-by-step guide to install Documentum 16.7 in a Linux environment with PostgreSQL 11 and Docker.

Environment

Host:
Windows 10 x64 8GB RAM
VMware Workstation Player 15

Guest:
CentOS 7.7 x64 25GB HD 4GB RAM 2 cores
PostgreSQL 11
Docker 19.03.4

VM Creation + PostgreSQL 11 configuration

You can just follow the procedure described in Opentext Documentum 16.7 PostgreSQL Developer Edition

Docker configuration

  • Install docker:
[dmadmin@dctm167docker ~]$ sudo yum install -y yum-utils && device-mapper-persistent-data && lvm2
[dmadmin@dctm167docker ~]$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[dmadmin@dctm167docker ~]$ sudo yum install -y docker-ce docker-ce-cli containerd.io
[dmadmin@dctm167docker ~]$ sudo systemctl start docker
  • Install docker compose and check it is correctly installed:
[dmadmin@dctm167docker dctmdocker]$ sudo yum install -y epel-release
[dmadmin@dctm167docker dctmdocker]$ sudo yum install -y python-pip
[dmadmin@dctm167docker dctmdocker]$ sudo pip install docker-compose
[dmadmin@dctm167docker dctmdocker]$ sudo yum upgrade python*
[dmadmin@dctm167docker dctmdocker]$ docker-compose version
docker-compose version 1.24.1, build 4667896
docker-py version: 3.7.3
CPython version: 2.7.5
OpenSSL version: OpenSSL 1.0.2k-fips  26 Jan 2017

Docker configuration

  • Import image:
[dmadmin@dctm167docker dockerimage]$ docker load -i Contentserver_Centos.tar
d69483a6face: Loading layer [==================================================>]  209.5MB/209.5MB
72dea7bec644: Loading layer [==================================================>]  217.2MB/217.2MB
d3468dffaa29: Loading layer [==================================================>]  315.1MB/315.1MB
1f70936ed489: Loading layer [==================================================>]  3.072kB/3.072kB
6a28c1188813: Loading layer [==================================================>]  239.6MB/239.6MB
07cf201dbdc0: Loading layer [==================================================>]  225.8kB/225.8kB
abe3ca337db9: Loading layer [==================================================>]  3.297MB/3.297MB
628e629128da: Loading layer [==================================================>]  46.08kB/46.08kB
4893b60dc3f1: Loading layer [==================================================>]  3.568MB/3.568MB
46d106ddfac4: Loading layer [==================================================>]  94.21kB/94.21kB
49adcbc15f60: Loading layer [==================================================>]  4.121GB/4.121GB
e5fd2930e234: Loading layer [==================================================>]  508.5MB/508.5MB
be7e1221aecc: Loading layer [==================================================>]  679.4kB/679.4kB
6a0c0059135d: Loading layer [==================================================>]  7.168kB/7.168kB
4151aa90b006: Loading layer [==================================================>]   2.56kB/2.56kB
Loaded image: contentserver/centos/stateless/cs:16.7.0000.0810
[dmadmin@dctm167docker dockerimage]$ docker images
REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
contentserver/centos/stateless/cs   16.7.0000.0810      589b5cf8dbc7        8 weeks ago         5.59GB
  • Create PostgreSQL tablespace file:
[dmadmin@dctm167docker dctmdocker]$ su - postgres
Password:
Last login: Sat Oct 19 19:39:49 CEST 2019 on pts/0
-bash-4.2$ mkdir /var/lib/pgsql/11/data/db_dockerdctm167_dat.dat
-bash-4.2$ exit
logout
  • Set required environment variables:
[dmadmin@dctm167docker Scripts]$ vi ~/.bash_profile
export APP_SERVER_PASSWORD=dmadmin
export INSTALL_OWNER_PASSWORD=dmadmin
export ROOT_PASSWORD=dmadmin
export DOCBASE_PASSWORD=dmadmin
export DATABASE_PASSWORD=dmadmin
export GLOBAL_REGISTRY_PASSWORD=dmadmin
export AEK_PASSPHRASE=dmadmin
  • Configure file CS-Docker-Compose_Stateless.yml:
#For description of parameter please do refer to Readme.txt
version: '3.7'
services:
  rcs:
    image: contentserver/centos/stateless/cs:16.7.0000.0810
    environment:
      - DOCKER_HOST=192.168.94.129
      - DATABASE_HOST=192.168.94.129
      - DATABASE_USER=postgres
      - DATABASE_PASSWORD=${DATABASE_PASSWORD}
      - DATABASE_SERVER_PORT=5432
      - SERVICE_NAME=MyPostgres
      - ROOT_PASSWORD=${ROOT_PASSWORD}
      - INSTALL_OWNER=dmadmin
      - INSTALL_OWNER_PASSWORD=${INSTALL_OWNER_PASSWORD}
      - DOCBASE_NAME=dockerdctm167
      - GLOBAL_REGISTRY_PASSWORD=${GLOBAL_REGISTRY_PASSWORD}
      - AEK_ALGORITHM=AES_256_CBC
      - AEK_PASSPHRASE=${AEK_PASSPHRASE}
      - AEK_NAME=CSaek
      - CONFIGURE_THUMBNAIL_SERVER=NO
      - THUMBNAIL_SERVER_PORT=8081
      - THUMBNAIL_SERVER_SSL_PORT=8443
      - EXTERNAL_DOCBROKER_PORT=1689
      - CONTENTSERVER_PORT=50000
      - APP_SERVER_PASSWORD=${APP_SERVER_PASSWORD}
      - INSTALL_OWNER_UID=1000
      - HIGH_VOLUME_SERVER_LICENSE=
      - TRUSTED_LICENSE=
      - STORAGEAWARE_LICENSE=
      - XMLSTORE_LICENSE=
      - SNAPLOCKSTORE_LICENSE=
      - RPS_LICENSE=
      - FED_RECD_SERVICE_LICENSE=
      - RECORD_MANAGER_LICENSE=
      - PRM_LICENSE=
      - DOCBASE_PASSWORD=${DOCBASE_PASSWORD}
      - INSTALLER_UI=silent
      - KEEP_TEMP_FILE=false
      - INSTALLER_DEBUG_LOG=true
      - DOCBASE_ID=453216
      - USE_EXISTING_DATABASE_ACCOUNT=
      - INDEXSPACE_NAME=DM_XCHIVE_DOCBASE
      - USE_EXISTING_AEK=false
    hostname:
      "dockerdctm167"
    container_name:
      "dockerdctm167"
    ports:
      - "1689:1689"
      - "1690:1690"
      - "50000:50000"
      - "50001:50001"
      - "9080:9080"
      - "9082:9082"
      - "9081:9081"
      - "9084:9084"
      - "8081:8081"
      - "8443:8443"
    volumes:
      - DocbaseName_odbc:/opt/dctm/odbc
      - DocbaseName_data:/opt/dctm/data
      - DocbaseName_dba:/opt/dctm/dba
      - DocbaseName_share:/opt/dctm/share
      - DocbaseName_dfc:/opt/dctm/config
      - DocbaseName_mdserver_conf:/opt/dctm/mdserver_conf
      - DocbaseName_mdserver_log:/opt/dctm/wildfly11.0.0/server/DctmServer_MethodServer/log
      - DocbaseName_mdserver_logs:/opt/dctm/wildfly11.0.0/server/DctmServer_MethodServer/logs
      - DocbaseName_Thumbnail_Server_conf:/opt/dctm/product/16.7/thumbsrv/conf
      - DocbaseName_Thumbnail_Server_webinf:/opt/dctm/product/16.7/thumbsrv/container/webapps/thumbsrv/WEB-INF
      - DocbaseName_xhive_storage:/opt/dctm/xhive_storage
      - DocbaseName_XhiveConnector:/opt/dctm/wildfly11.0.0/server/DctmServer_MethodServer/deployments/XhiveConnector.ear
      - DocbaseName_MigrationUtility:/opt/dctm/product/16.7/install/external_apps/MigrationUtil
    privileged: true
#'volumes' service definition:
volumes:
 DocbaseName_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/data
 DocbaseName_share:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/share
 DocbaseName_dba:
 DocbaseName_dfc:
 DocbaseName_odbc:
 DocbaseName_mdserver_conf:
 DocbaseName_mdserver_log:
 DocbaseName_mdserver_logs:
 DocbaseName_Thumbnail_Server_conf:
 DocbaseName_Thumbnail_Server_webinf:
 DocbaseName_XhiveConnector:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/xhive
 DocbaseName_xhive_storage:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/xhive_storage
DocbaseName_MigrationUtility:

Note: As usual, documentation is lacking/wrong and the scripts don’t work at all. This is the list of parameters that I had to change in CS-Docker-Compose_Stateless.yml file in order for docker compose to work:

    image: contentserver/centos/stateless/cs:16.7.0000.0810
    environment:
      - DOCKER_HOST=192.168.94.129
      - DATABASE_HOST=192.168.94.129
      - DOCBASE_NAME=dockerdctm167
    hostname:
      "dockerdctm167"
    container_name:
      "dockerdctm167"
    ports:
      - "1689:1689"
      - "1690:1690"
      - "50000:50000"
      - "50001:50001"
      - "9080:9080"
      - "9082:9082"
      - "9081:9081"
      - "9084:9084"
      - "8081:8081"
      - "8443:8443"
volumes:
 DocbaseName_data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/data
 DocbaseName_share:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/share
 DocbaseName_XhiveConnector:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/xhive
 DocbaseName_xhive_storage:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /opt/dctmdocker/xhive_storage

Remember that if something goes wrong you’ll have to:

  • Stop the container
  • Delete the container
  • Delete the volumes created

Once the process finishes, you should be able to idql from the container:

[dmadmin@dockerdctm167 ~]$ idql dockerdctm167
Please enter a user (dmadmin):
Please enter password for dmadmin:

        OpenText Documentum idql - Interactive document query interface
        Copyright (c) 2018. OpenText Corporation
        All rights reserved.
        Client Library Release 16.7.0000.0322

Connecting to Server using docbase dockerdctm167
[DM_SESSION_I_SESSION_START]info:  "Session 0106ea608000050f started for user dmadmin."

Connected to OpenText Documentum Server running Release 16.7.0000.0810  Linux64.Postgres
1>

Opentext Documentum 16.7 PostgreSQL Developer Edition

This is a step-by-step guide to install Documentum 16.7 in a Linux environment with PostgreSQL 11.

Environment

Host:
Windows 10 x64 8GB RAM
VMware Workstation Player 15

Guest:
CentOS 7.7 x64 25GB HD 4GB RAM 2 cores
PostgreSQL 11
Documentum 16.7

VM Creation

Mount the CentOS 7 DVD image, boot the machine and follow the steps. You can choose to let EasyInstall do the work for you. I used minimal package install to save resources, named the machine dctm167, configured the network and set the root password as well as a “dmadmin” user.

OS Configuration

  • Install required packages:

[dmadmin@dctm167 ~]$ sudo yum -y install bash-completion kernel-devel rng-tools.x86_64
[dmadmin@dctm167 ~]$ sudo yum -y install bash-completion kernel-devel rng-tools.x86_64 policycoreutils policycoreutils-python selinux-policy selinux-policy-targeted libselinux-utils setroubleshoot-server setools setools-console mcstrans expect tcl
[dmadmin@dctm167 ~]$ sudo yum -y group install X\ Window\ System “Development Tools”
[dmadmin@dctm167 ~]$ sudo yum -y install open-vm-tools.x86_64

  • Stop and disable the firewalld service:

[dmadmin@dctm167 ~]$ sudo systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[dmadmin@dctm167 ~]$ sudo systemctl stop firewalld

  • Configure entropy and allow http connections through selinux:

[dmadmin@dctm167 ~]$ sudo /sbin/rngd -b -r /dev/urandom -p /dev/random
[dmadmin@dctm167 ~]$ sudo setsebool -P httpd_can_network_connect_db 1
[dmadmin@dctm167 ~]$ sudo chkconfig rngd on

PostgreSQL Configuration

  • Install required packages:

[dmadmin@dctm167 ~]$ sudo yum -y install https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-2.noarch.rpm
[dmadmin@dctm167 ~]$ sudo yum -y install postgresql11 postgresql11-server

  • Init the DB:

[dmadmin@dctm167 ~]$ sudo /usr/pgsql-11/bin/postgresql-11-setup initdb

  • Enable and start the PostgreSQL service:

[dmadmin@dctm167 ~]$ sudo systemctl enable postgresql-11
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-11.service to /usr/lib/systemd/system/postgresql-11.service.
[dmadmin@dctm167 ~]$ sudo systemctl start postgresql-11

  • Configure the postgres user:

[dmadmin@dctm167 ~]$ sudo passwd postgres
Changing password for user postgres.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

[dmadmin@dctm167 ~]$ su – postgres
-bash-4.2$ psql
psql (11.5)
Type “help” for help.

postgres=#
postgres=# \password postgres
Enter new password:
Enter it again:
postgres=# \q
-bash-4.2$ exit

  • Configure PostgreSQL:

[root@dctm167 ~]# vi /var/lib/pgsql/11/data/postgresql.conf
listen_addresses = ‘*’
port = 5432

[root@dctm167 ~]# vi /var/lib/pgsql/11/data/pg_hba.conf
host    all             all             127.0.0.1/32            md5
host all all ::/128 md5
host    all             all             dctm167              md5

  • Restart PostgreSQL service to apply the changes:

[dmadmin@dctm167 ~]$ sudo systemctl restart postgresql-11

phpPgAdmin Configuration

  • Install required packages:

[dmadmin@dctm167 ~]$ sudo yum -y install phpPgAdmin httpd

  • Configure phpPgAdmin:

[dmadmin@dctm167 ~]$ sudo vi /etc/httpd/conf.d/phpPgAdmin.conf

Alias /phpPgAdmin /usr/share/phpPgAdmin

# Apache 2.4
Require all granted
#Require host example.com

# Apache 2.2
Order deny,allow
Allow from all
#Allow from 127.0.0.1
#Allow from ::1
# Allow from .example.com

[dmadmin@dctm167 ~]$ sudo vi /etc/phpPgAdmin/config.inc.php-dist

$conf[‘servers’][0][‘host’] = ‘dctm167’;
$conf[‘extra_login_security’] = false;
$conf[‘owned_only’] = true;

[dmadmin@dctm167 ~]$ sudo cp /etc/phpPgAdmin/config.inc.php-dist /etc/phpPgAdmin/config.inc.php

  • Restart httpd service to apply the changes:

[dmadmin@dctm167 ~]$ sudo systemctl restart httpd

Now you should be able to login to the console from http://dctm167/phpPgAdmin/

ODBC Configuration

  • Install required packages:

[dmadmin@dctm167 ~]$ sudo yum -y install postgresql11-odbc.x86_64 unixODBC.x86_64

  • Configure .ini files:

[dmadmin@dctm167 ~]$ sudo vi /etc/odbcinst.ini
[PostgreSQL]
Description = ODBC for PostgreSQL
#Driver = /usr/lib/psqlodbcw.so
#Setup = /usr/lib/libodbcpsqlS.so
#Driver64 = /usr/lib64/psqlodbcw.so
#Setup64 = /usr/lib64/libodbcpsqlS.so
Driver = /usr/pgsql-11/lib/psqlodbcw.so
Driver64 = /usr/pgsql-11/lib/psqlodbcw.so
Setup64 = /usr/lib64/libodbcpsqlS.so
FileUsage = 1
[dmadmin@dctm167 ~]$ sudo vi /etc/odbc.ini
[MyPostgres]
Description=PostgreSQL
Driver=PostgreSQL
Database=postgres
Servername=dctm167
UserName=postgres
Password=dmadmin
Port=5432
Protocol=11
ReadOnly=No
RowVersioning=No
ShowSystemTables=No
ShowOidColumn=No
FakeOidIndex=No
UpdateableCursors=Yes
DEBUG=Yes

  • Test the connection:

[dmadmin@dctm167 ~]$ isql -v MyPostgres
+—————————————+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+—————————————+
SQL> quit

Documentum server

  • Create folders:

[dmadmin@dctm167 ~]$ sudo mkdir -p /opt/documentum && sudo chown dmadmin.dmadmin /opt/documentum && mkdir /opt/documentum/product && mkdir /opt/documentum/product/16.7 && mkdir -p /opt/documentum/sw/cs

  • Install openJDK 11 (remember to remove “anon” from the list of disabled algorithms or the installer will fail to connect to the repository)

[dmadmin@dctm167 cs]$ sudo yum -y install java-11-openjdk java-11-openjdk-devel
[dmadmin@dctm167 cs]$ echo $(dirname $(dirname $(readlink $(readlink $(which javac)))))
/usr/lib/jvm/java-11-openjdk-11.0.4.11-1.el7_7.x86_64

  • Set up environment variables:

[dmadmin@dctm167 ~]$ vi ~/.bash_profile
DOCUMENTUM=/opt/documentum
export DOCUMENTUM

DM_HOME=$DOCUMENTUM/product/16.7
export DM_HOME

POSTGRESQL_HOME=/usr/pgsql-11
export POSTGRESQL_HOME

JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.4.11-1.el7_7.x86_64
export JAVA_HOME

PATH=$PATH:$DM_HOME/bin:$POSTGRESQL_HOME/bin:$HOME/.local/bin:$HOME/bin:$JAVA_HOME/bin
export PATH

LC_ALL=C
export LC_ALL

LD_LIBRARY_PATH=$POSTGRESQL_HOME/lib:$DM_HOME/bin:$DOCUMENTUM/java64/JAVA_LINK/jre/lib/amd64/server:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH

  • Reserve ports for services:

[dmadmin@dctm167 ~]$ sudo vi /etc/services
dctm167 50000/tcp # dctm 16.7 repo
dctm167_s 50001/tcp # dctm 16.7 repo

  • Create symbolic link for later (configuration program):

[dmadmin@dctm167 ~]$ sudo ln -s /usr/lib64/libsasl2.so.3.0.0 /usr/lib64/libsasl2.so.2

  • Configure limits.conf:

[dmadmin@dctm167 ~]$ sudo vi /etc/security/limits.conf
dmadmin – core -1

  • Run the installer:

[dmadmin@dctm167 cs]$ tar -xvf content_server_16.7_linux64_postgres.tar
[dmadmin@dctm167 cs]$ chmod 777 serverSetup.bin
[dmadmin@dctm167 cs]$ ./serverSetup.bin

01020304050607

Docbroker and repository

  • Create the tablespace file for the repository (dctm167):

[dmadmin@dctm167 cs]$ su –
[root@dctm167 ~]# su – postgres
-bash-4.2$ mkdir /var/lib/pgsql/11/data/db_dctm167_dat.dat
-bash-4.2$ exit
[root@dctm167 ~]# exit

  • Run the configurator:

[dmadmin@dctm167 install]$ ./dm_launch_server_config_program.sh

0809101112131415161718192021222324252627282930

 

Documentum Administrator

Nothing special about this, same procedure as always. I’ve used the latest tomcat 9 to deploy running on the same openJDK 11 used for the repository:

31

Some notes:

  • Java is not bundled anymore, you need to install a JDK before running the installer. (Be aware of the issues with Java >1.8u201, as the “anon” algorithm has been disabled and if you choose any secure configuration you’ll face some issues while installing)
  • No lockbox!