You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2019/03/08 12:20:40 UTC

[syncope] branch 2_1_X updated: [SYNCOPE-1445] docker-compose working with pgjsonb + using Zulu instead of Debian OpenJDK

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch 2_1_X
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/2_1_X by this push:
     new 585a291  [SYNCOPE-1445] docker-compose working with pgjsonb + using Zulu instead of Debian OpenJDK
585a291 is described below

commit 585a291a0676151313e9b91c90edc16b3086bc70
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Fri Mar 8 13:20:30 2019 +0100

    [SYNCOPE-1445] docker-compose working with pgjsonb + using Zulu instead of Debian OpenJDK
---
 .../src/main/resources/quartz/tables_postgres.sql  |  22 +--
 docker/console/src/main/resources/build.sh         |  12 +-
 docker/core/pom.xml                                |   1 +
 docker/core/src/main/resources/Dockerfile          |   7 +-
 docker/core/src/main/resources/build.sh            |  14 +-
 .../{ => domains}/Master.properties.mariadb        |   0
 .../{ => domains}/Master.properties.mssql          |   0
 .../{ => domains}/Master.properties.mysql          |   0
 .../Master.properties.pgjsonb}                     |   2 +-
 .../{ => domains}/Master.properties.postgresql     |   0
 .../resources/domains/MasterContent.xml.pgjsonb    | 183 +++++++++++++++++++++
 docker/core/src/main/resources/index.xml.pgjsonb   |  63 +++++++
 ...tence.properties => persistence.properties.all} |   0
 ...e.properties => persistence.properties.pgjsonb} |  18 +-
 .../main/resources/provisioning.properties.pgjsonb |  33 ++++
 docker/core/src/main/resources/startup.sh          |  31 ++++
 docker/core/src/main/resources/views.xml.pgjsonb   | 154 +++++++++++++++++
 docker/enduser/src/main/resources/build.sh         |  12 +-
 .../resources/docker-compose/docker-compose-ha.yml |  10 +-
 .../docker-compose/docker-compose-mariadb.yml      |   6 +-
 .../docker-compose/docker-compose-mssql.yml        |   6 +-
 .../docker-compose/docker-compose-mysql.yml        |   6 +-
 ...e-postgresql.yml => docker-compose-pgjsonb.yml} |  14 +-
 .../docker-compose/docker-compose-postgresql.yml   |   8 +-
 pom.xml                                            |   6 +-
 25 files changed, 549 insertions(+), 59 deletions(-)

diff --git a/core/provisioning-java/src/main/resources/quartz/tables_postgres.sql b/core/provisioning-java/src/main/resources/quartz/tables_postgres.sql
index 9b7800f..634ade5 100644
--- a/core/provisioning-java/src/main/resources/quartz/tables_postgres.sql
+++ b/core/provisioning-java/src/main/resources/quartz/tables_postgres.sql
@@ -20,17 +20,17 @@
 -- In your Quartz properties file, you'll need to set 
 -- org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
 
-drop table qrtz_fired_triggers;
-DROP TABLE QRTZ_PAUSED_TRIGGER_GRPS;
-DROP TABLE QRTZ_SCHEDULER_STATE;
-DROP TABLE QRTZ_LOCKS;
-drop table qrtz_simple_triggers;
-drop table qrtz_cron_triggers;
-drop table qrtz_simprop_triggers;
-DROP TABLE QRTZ_BLOB_TRIGGERS;
-drop table qrtz_triggers;
-drop table qrtz_job_details;
-drop table qrtz_calendars;
+DROP TABLE IF EXISTS qrtz_fired_triggers;
+DROP TABLE IF EXISTS qrtz_paused_trigger_grps;
+DROP TABLE IF EXISTS qrtz_scheduler_state;
+DROP TABLE IF EXISTS qrtz_locks;
+DROP TABLE IF EXISTS qrtz_simple_triggers;
+DROP TABLE IF EXISTS qrtz_cron_triggers;
+DROP TABLE IF EXISTS qrtz_simprop_triggers;
+DROP TABLE IF EXISTS qrtz_blob_triggers;
+DROP TABLE IF EXISTS qrtz_triggers;
+DROP TABLE IF EXISTS qrtz_job_details;
+DROP TABLE IF EXISTS qrtz_calendars;
 
 CREATE TABLE qrtz_job_details
   (
diff --git a/docker/console/src/main/resources/build.sh b/docker/console/src/main/resources/build.sh
index a164395..ca4b39f 100755
--- a/docker/console/src/main/resources/build.sh
+++ b/docker/console/src/main/resources/build.sh
@@ -32,12 +32,20 @@ export DEBCONF_TERSE true
 mkdir -p /usr/share/man/man1/
 
 ######
+# Additional APT repositories
+######
+apt-get -q update && apt-get -q install -y wget
+
+wget -q -O - http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems | tee /etc/apt/trusted.gpg.d/zulu.asc
+echo 'deb http://repos.azulsystems.com/debian stable main' > /etc/apt/sources.list.d/zulu.list
+
+######
 # Install packages
 ######
 apt-get -q update \
   && apt-get -q install -y \
     xtail \
-    openjdk-8-jdk \
+    zulu-8 \
     tomcat8 \
     libservlet3.1-java \
   && apt-get clean
@@ -55,4 +63,4 @@ echo "JAVA_OPTS=\"\${JAVA_OPTS} -Dfile.encoding=UTF-8 -server \
 -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC \
 -Djava.security.egd=file:/dev/./urandom\"" >> /etc/default/tomcat8
 
-echo "JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" >> /etc/default/tomcat8
+echo "JAVA_HOME=/usr/lib/jvm/zulu-8-amd64" >> /etc/default/tomcat8
diff --git a/docker/core/pom.xml b/docker/core/pom.xml
index 53eaaaf..a938604 100644
--- a/docker/core/pom.xml
+++ b/docker/core/pom.xml
@@ -92,6 +92,7 @@ under the License.
                 <copy file="${settings.localRepository}/com/microsoft/sqlserver/mssql-jdbc/${jdbc.mssql.version}8/mssql-jdbc-${jdbc.mssql.version}8.jar" todir="${project.build.directory}/classes" overwrite="true" />
 
                 <copy file="${basedir}/../../deb/core/target/apache-syncope-${project.version}.deb" todir="${project.build.directory}/classes" overwrite="true" />
+                <copy file="${basedir}/../../core/persistence-jpa-json/target/syncope-core-persistence-jpa-json-${project.version}.jar" todir="${project.build.directory}/classes" overwrite="true" />
               </target>
             </configuration>
             <goals>
diff --git a/docker/core/src/main/resources/Dockerfile b/docker/core/src/main/resources/Dockerfile
index 656019f..7a80a9d 100644
--- a/docker/core/src/main/resources/Dockerfile
+++ b/docker/core/src/main/resources/Dockerfile
@@ -24,10 +24,9 @@ COPY *.jar /tmp/
 
 COPY *.deb /tmp/
 
-COPY provisioning.properties.* /etc/apache-syncope/
-COPY views.xml.* /etc/apache-syncope/
-COPY *.properties /etc/apache-syncope/
-COPY Master.properties.* /etc/apache-syncope/domains/
+COPY *.properties* /etc/apache-syncope/
+COPY *.xml* /etc/apache-syncope/
+COPY domains/* /etc/apache-syncope/domains/
 
 COPY build.sh /tmp
 RUN chmod 755 /tmp/build.sh && sync && /tmp/build.sh && rm /tmp/build.sh
diff --git a/docker/core/src/main/resources/build.sh b/docker/core/src/main/resources/build.sh
index d311e47..06df0b3 100755
--- a/docker/core/src/main/resources/build.sh
+++ b/docker/core/src/main/resources/build.sh
@@ -32,18 +32,28 @@ export DEBCONF_TERSE true
 mkdir -p /usr/share/man/man1/
 
 ######
+# Additional APT repositories
+######
+apt-get -q update && apt-get -q install -y wget
+
+wget -q -O - http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems | tee /etc/apt/trusted.gpg.d/zulu.asc
+echo 'deb http://repos.azulsystems.com/debian stable main' > /etc/apt/sources.list.d/zulu.list
+
+######
 # Install packages
 ######
 apt-get -q update \
   && apt-get -q install -y \
     xtail \
-    openjdk-8-jdk \
+    zulu-8 \
     tomcat8 \
     libservlet3.1-java \
   && apt-get clean
 
 dpkg -i /tmp/*.deb && rm /tmp/*deb
 
+mv /tmp/syncope-core-persistence-jpa-json-*.jar /etc/apache-syncope
+
 ######
 # Setup Tomcat
 ######
@@ -57,4 +67,4 @@ echo "JAVA_OPTS=\"\${JAVA_OPTS} -Dfile.encoding=UTF-8 -server \
 -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC \
 -Djava.security.egd=file:/dev/./urandom\"" >> /etc/default/tomcat8
 
-echo "JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" >> /etc/default/tomcat8
+echo "JAVA_HOME=/usr/lib/jvm/zulu-8-amd64" >> /etc/default/tomcat8
diff --git a/docker/core/src/main/resources/Master.properties.mariadb b/docker/core/src/main/resources/domains/Master.properties.mariadb
similarity index 100%
rename from docker/core/src/main/resources/Master.properties.mariadb
rename to docker/core/src/main/resources/domains/Master.properties.mariadb
diff --git a/docker/core/src/main/resources/Master.properties.mssql b/docker/core/src/main/resources/domains/Master.properties.mssql
similarity index 100%
rename from docker/core/src/main/resources/Master.properties.mssql
rename to docker/core/src/main/resources/domains/Master.properties.mssql
diff --git a/docker/core/src/main/resources/Master.properties.mysql b/docker/core/src/main/resources/domains/Master.properties.mysql
similarity index 100%
rename from docker/core/src/main/resources/Master.properties.mysql
rename to docker/core/src/main/resources/domains/Master.properties.mysql
diff --git a/docker/core/src/main/resources/Master.properties.postgresql b/docker/core/src/main/resources/domains/Master.properties.pgjsonb
similarity index 96%
copy from docker/core/src/main/resources/Master.properties.postgresql
copy to docker/core/src/main/resources/domains/Master.properties.pgjsonb
index 74b3471..2f50013 100644
--- a/docker/core/src/main/resources/Master.properties.postgresql
+++ b/docker/core/src/main/resources/domains/Master.properties.pgjsonb
@@ -20,7 +20,7 @@ Master.schema=
 Master.username=${DB_USER}
 Master.password=${DB_PASSWORD}
 Master.databasePlatform=org.apache.openjpa.jdbc.sql.PostgresDictionary
-Master.orm=META-INF/spring-orm.xml
+Master.orm=META-INF/spring-orm-pgjsonb.xml
 
 Master.pool.maxActive=${DB_POOL_MAX}
 Master.pool.minIdle=${DB_POOL_MIN}
diff --git a/docker/core/src/main/resources/Master.properties.postgresql b/docker/core/src/main/resources/domains/Master.properties.postgresql
similarity index 100%
rename from docker/core/src/main/resources/Master.properties.postgresql
rename to docker/core/src/main/resources/domains/Master.properties.postgresql
diff --git a/docker/core/src/main/resources/domains/MasterContent.xml.pgjsonb b/docker/core/src/main/resources/domains/MasterContent.xml.pgjsonb
new file mode 100644
index 0000000..814b3c6
--- /dev/null
+++ b/docker/core/src/main/resources/domains/MasterContent.xml.pgjsonb
@@ -0,0 +1,183 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<dataset>
+  <Realm id="ea696a4f-e77a-4ef1-be67-8f8093bc8686" name="/"/>  
+
+  <SyncopeSchema id="password.cipher.algorithm"/>
+  <PlainSchema id="password.cipher.algorithm" type="String"
+               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
+
+  <!-- notificationjob.cronExpression:
+  + not existing: NotificationJob runs according to NotificationJob.DEFAULT_CRON_EXP
+  + provided as empty string: NotificationJob disabled
+  + provided as non-empty string: NotificationJob runs according to the given value -->
+  <SyncopeSchema id="notificationjob.cronExpression"/>
+  <PlainSchema id="notificationjob.cronExpression" type="String"
+               mandatoryCondition="false" multivalue="0" uniqueConstraint="0" readonly="0"/>
+  
+  <SyncopeSchema id="notification.maxRetries"/>
+  <PlainSchema id="notification.maxRetries" type="Long"
+               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
+
+  <SyncopeSchema id="token.length"/>
+  <PlainSchema id="token.length" type="Long"
+               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
+
+  <SyncopeSchema id="token.expireTime"/>
+  <PlainSchema id="token.expireTime" type="Long"
+               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
+
+  <SyncopeSchema id="selfRegistration.allowed"/>
+  <PlainSchema id="selfRegistration.allowed" type="Boolean"
+               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
+
+  <SyncopeSchema id="passwordReset.allowed"/>
+  <PlainSchema id="passwordReset.allowed" type="Boolean"
+               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
+
+  <SyncopeSchema id="passwordReset.securityQuestion"/>
+  <PlainSchema id="passwordReset.securityQuestion" type="Boolean"
+               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
+
+  <SyncopeSchema id="authentication.attributes"/>
+  <PlainSchema id="authentication.attributes" type="String" multivalue="1" uniqueConstraint="0" readonly="0"/>
+
+  <SyncopeSchema id="authentication.statuses"/>
+  <PlainSchema id="authentication.statuses" type="String" multivalue="1" uniqueConstraint="0" readonly="0"/>
+
+  <!-- Save user login date upon successful authentication -->
+  <SyncopeSchema id="log.lastlogindate"/>
+  <PlainSchema id="log.lastlogindate" type="Boolean"
+               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
+
+  <!-- Return hashed password values when reading users -->
+  <SyncopeSchema id="return.password.value"/>
+  <PlainSchema id="return.password.value" type="Boolean"
+               mandatoryCondition="false" multivalue="0" uniqueConstraint="0" readonly="0"/>
+  
+  <!--  JWT lifetime in minutes -->                   
+  <SyncopeSchema id="jwt.lifetime.minutes"/>
+  <PlainSchema id="jwt.lifetime.minutes" type="Long"
+               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
+    
+  <!--  Connector and Resource configuration history -->                   
+  <SyncopeSchema id="connector.conf.history.size"/>
+  <PlainSchema id="connector.conf.history.size" type="Long"
+               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
+  
+  <SyncopeSchema id="resource.conf.history.size"/>
+  <PlainSchema id="resource.conf.history.size" type="Long"
+               mandatoryCondition="true" multivalue="0" uniqueConstraint="0" readonly="0"/>
+  
+  <SyncopeConf id="cd64d66f-6fff-4008-b966-a06b1cc1436d"
+               plainAttrs="[{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;SSHA256&quot;}],&quot;schema&quot;:&quot;password.cipher.algorithm&quot;},{&quot;values&quot;:[{&quot;stringValue&quot;:&quot;&quot;}],&quot;schema&quot;:&quot;notificationjob.cronExpression&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:3}],&quot;schema&quot;:&quot;notification.maxRetries&quot;},{&quot;values&quot;:[{&quot;longValue&quot;:256}],&quot;schema&quot;:&quot;token.length&quot;},{&quot;values&q [...]
+
+  <AnyType id="USER" kind="USER"/>
+  <AnyTypeClass id="BaseUser"/>
+  <AnyType_AnyTypeClass anyType_id="USER" anyTypeClass_id="BaseUser"/>
+
+  <AnyType id="GROUP" kind="GROUP"/>
+  <AnyTypeClass id="BaseGroup"/>
+  <AnyType_AnyTypeClass anyType_id="GROUP" anyTypeClass_id="BaseGroup"/>
+        
+  <!-- Actual plain schemas -->
+  <Implementation id="EmailAddressValidator" type="VALIDATOR" engine="JAVA"
+                  body="org.apache.syncope.core.persistence.jpa.attrvalue.validation.EmailAddressValidator"/>
+  <SyncopeSchema id="email"/>
+  <PlainSchema id="email" type="String" anyTypeClass_id="BaseUser"
+               mandatoryCondition="false" multivalue="0" uniqueConstraint="0" readonly="0"
+               validator_id="EmailAddressValidator"/>
+  
+  <Implementation id="BinaryValidator" type="VALIDATOR" engine="JAVA"
+                  body="org.apache.syncope.core.persistence.jpa.attrvalue.validation.BinaryValidator"/>
+
+  <Implementation id="PullJobDelegate" type="TASKJOB_DELEGATE" engine="JAVA"
+                  body="org.apache.syncope.core.provisioning.java.pushpull.PullJobDelegate"/>
+  <Implementation id="PushJobDelegate" type="TASKJOB_DELEGATE" engine="JAVA"
+                  body="org.apache.syncope.core.provisioning.java.pushpull.PushJobDelegate"/>
+
+
+  <Implementation id="ExpiredAccessTokenCleanup" type="TASKJOB_DELEGATE" engine="JAVA"
+                  body="org.apache.syncope.core.provisioning.java.job.ExpiredAccessTokenCleanup"/>
+  <Task DTYPE="SchedTask" id="89de5014-e3f5-4462-84d8-d97575740baf" name="Access Token Cleanup Task"  active="1"
+        jobDelegate_id="ExpiredAccessTokenCleanup" cronExpression="0 0/5 * * * ?"/>
+  <Implementation id="ExpiredBatchCleanup" type="TASKJOB_DELEGATE" engine="JAVA"
+                  body="org.apache.syncope.core.provisioning.java.job.ExpiredBatchCleanup"/>
+  <Task DTYPE="SchedTask" id="8ea0ea51-ce08-4fe3-a0c8-c281b31b5893" name="Expired Batch Operations Cleanup Task"  active="1"
+        jobDelegate_id="ExpiredBatchCleanup" cronExpression="0 0/5 * * * ?"/>
+
+  <!-- Password reset notifications -->
+  <MailTemplate id="requestPasswordReset"
+                textTemplate="Hi,
+a password reset was request for ${user.getUsername()}.
+
+In order to complete this request, you need to visit this link:
+
+http://localhost:9080/syncope-enduser/app/#!/confirmpasswordreset?token=${input.get(0).replaceAll(' ', '%20')}
+
+If you did not request this reset, just ignore the present e-mail.
+
+Best regards."
+                htmlTemplate="&lt;html&gt;
+&lt;body&gt;
+&lt;p&gt;Hi,
+a password reset was request for ${user.getUsername()}.&lt;/p&gt;
+
+&lt;p&gt;In order to complete this request, you need to visit this 
+&lt;a href=&quot;http://localhost:9080/syncope-enduser/app/#!/confirmpasswordreset?token=${input.get(0).replaceAll(' ', '%20')}&quot;&gt;link&lt;/a&gt;&lt;/p&gt;.
+
+&lt;p&gt;If you did not request this reset, just ignore the present e-mail.&lt;/p&gt;
+
+&lt;p&gt;Best regards.&lt;/p&gt;
+&lt;/body&gt;
+&lt;/html&gt;"/>
+  <MailTemplate id="confirmPasswordReset"
+                textTemplate="Hi,
+we are happy to inform you that the password request was successfully executed for your account.
+
+Best regards."
+                htmlTemplate="&lt;html&gt;
+&lt;body&gt;
+&lt;p&gt;Hi,&lt;/br&gt;
+we are happy to inform you that the password request was successfully executed for your account.&lt;/p&gt;
+
+&lt;p&gt;Best regards.&lt;/p&gt;
+&lt;/body&gt;
+&lt;/html&gt;"/>
+
+  <Notification id="e00945b5-1184-4d43-8e45-4318a8dcdfd4" active="1" recipientAttrName="email" selfAsRecipient="1" 
+                sender="admin@syncope.apache.org" subject="Password Reset request" template_id="requestPasswordReset" 
+                traceLevel="FAILURES"/> 
+  <AnyAbout id="a328f2e6-25e9-4cc1-badf-7425d7be4b39" anyType_id="USER" notification_id="e00945b5-1184-4d43-8e45-4318a8dcdfd4" filter="token!=$null"/>
+  <Notification_events notification_id="e00945b5-1184-4d43-8e45-4318a8dcdfd4" event="[CUSTOM]:[]:[]:[requestPasswordReset]:[SUCCESS]"/>
+  
+  <Notification id="bef0c250-e8a7-4848-bb63-2564fc409ce2" active="1" recipientAttrName="email" selfAsRecipient="1" 
+                sender="admin@syncope.apache.org" subject="Password Reset successful" template_id="confirmPasswordReset" 
+                traceLevel="FAILURES"/> 
+  <Notification_events notification_id="bef0c250-e8a7-4848-bb63-2564fc409ce2" event="[CUSTOM]:[]:[]:[confirmPasswordReset]:[SUCCESS]"/>
+
+  <ReportTemplate id="empty"/>  
+
+  <Report id="c3520ad9-179f-49e7-b315-d684d216dd97" name="reconciliation" active="1" template_id="empty"/>
+  <Implementation id="ReconciliationReportletConf" type="REPORTLET" engine="JAVA"
+                  body='{"@class":"org.apache.syncope.common.lib.report.ReconciliationReportletConf","name":"dashboardReconciliationReportlet","userMatchingCond":null,"groupMatchingCond":null,"anyObjectMatchingCond":null,"features":["key","username","groupName"]}'/>
+  <ReportReportlet report_id="c3520ad9-179f-49e7-b315-d684d216dd97" implementation_id="ReconciliationReportletConf"/>
+
+</dataset>
diff --git a/docker/core/src/main/resources/index.xml.pgjsonb b/docker/core/src/main/resources/index.xml.pgjsonb
new file mode 100644
index 0000000..3e5b92b
--- /dev/null
+++ b/docker/core/src/main/resources/index.xml.pgjsonb
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
+<properties>
+  <comment>Additional indexes (in respect to JPA's)</comment>
+
+  <entry key="SyncopeUser_plainAttrs_idx">CREATE INDEX SyncopeUser_plainAttrs_idx ON SyncopeUser USING gin ((plainAttrs) jsonb_path_ops)</entry>
+  <entry key="SyncopeGroup_plainAttrs_idx">CREATE INDEX SyncopeGroup_plainAttrs_idx ON SyncopeGroup USING gin ((plainAttrs) jsonb_path_ops)</entry>
+  <entry key="AnyObject_plainAttrs_idx">CREATE INDEX AnyObject_plainAttrs_idx ON AnyObject USING gin ((plainAttrs) jsonb_path_ops)</entry>
+  <entry key="SyncopeConf_plainAttrs_idx">CREATE INDEX SyncopeConf_plainAttrs_idx ON SyncopeConf USING gin ((plainAttrs) jsonb_path_ops)</entry>
+
+  <entry key="UDynGroupMembers_any_id">CREATE INDEX UDynGroupMembers_any_id ON UDynGroupMembers(any_id)</entry>
+  <entry key="UDynGroupMembers_group_id">CREATE INDEX UDynGroupMembers_group_id ON UDynGroupMembers(group_id)</entry>
+  <entry key="ADynGroupMembers_any_id">CREATE INDEX ADynGroupMembers_any_id ON ADynGroupMembers(any_id)</entry>
+  <entry key="ADynGroupMembers_group_id">CREATE INDEX ADynGroupMembers_group_id ON ADynGroupMembers(group_id)</entry>
+
+  <entry key="DynRoleMembers_any_id">CREATE INDEX DynRoleMembers_any_id ON DynRoleMembers(any_id)</entry>
+  <entry key="DynRoleMembers_role_id">CREATE INDEX DynRoleMembers_role_id ON DynRoleMembers(role_id)</entry>
+
+  <entry key="DynRealmMembers_any_id">CREATE INDEX DynRealmMembers_any_id ON DynRealmMembers(any_id)</entry>
+  <entry key="DynRealmMembers_realm_id">CREATE INDEX DynRealmMembers_dynRealm_id ON DynRealmMembers(dynRealm_id)</entry>
+
+  <entry key="CPlainAttrValue_stringvalueIndex">CREATE INDEX CAttrValue_stringvalueIndex ON CPlainAttrValue(stringvalue)</entry>
+  <entry key="CPlainAttrValue_datevalueIndex">CREATE INDEX CAttrValue_datevalueIndex ON CPlainAttrValue(datevalue)</entry>
+  <entry key="CPlainAttrValue_longvalueIndex">CREATE INDEX CAttrValue_longvalueIndex ON CPlainAttrValue(longvalue)</entry>
+  <entry key="CPlainAttrValue_doublevalueIndex">CREATE INDEX CAttrValue_doublevalueIndex ON CPlainAttrValue(doublevalue)</entry>
+  <entry key="CPlainAttrValue_booleanvalueIndex">CREATE INDEX CAttrValue_booleanvalueIndex ON CPlainAttrValue(booleanvalue)</entry>
+
+  <entry key="UMembership_GroupIndex">CREATE INDEX UMembership_GroupIndex ON UMembership(group_id)</entry>
+  <entry key="UMembership_UserIndex">CREATE INDEX UMembership_UserIndex ON UMembership(user_id)</entry>
+  <entry key="AMembership_GroupIndex">CREATE INDEX AMembership_GroupIndex ON AMembership(group_id)</entry>
+  <entry key="AMembership_AnyObjectIndex">CREATE INDEX AMembership_AnyObjectIndex ON AMembership(anyObject_id)</entry>
+
+  <entry key="URelationship_RightIndex">CREATE INDEX URelationship_RightIndex ON URelationship(anyObject_id)</entry>
+  <entry key="URelationship_LeftIndex">CREATE INDEX URelationship_LeftIndex ON URelationship(user_id)</entry>
+  <entry key="ARelationship_RightIndex">CREATE INDEX ARelationship_RightIndex ON ARelationship(right_anyObject_id)</entry>
+  <entry key="ARelationship_AnyObjectIndex">CREATE INDEX ARelationship_AnyObjectIndex ON ARelationship(left_anyObject_id)</entry>
+
+  <entry key="CPlainAttrValue_attrIndex">CREATE INDEX CPlainAttrValue_attrIndex on CPlainAttrValue(attribute_id)</entry>
+  <entry key="CPAttrUniqueValue_attrIndex">CREATE INDEX CPAttrUniqueValue_attrIndex on CPlainAttrUniqueValue(attribute_id)</entry>
+
+  <entry key="CPlainAttr_owner_Index">CREATE INDEX CPlainAttr_owner_Index on CPlainAttr(owner_id)</entry>
+  <entry key="CPlainAttr_schema_Index">CREATE INDEX CPlainAttr_schema_Index on CPlainAttr(schema_id)</entry>
+
+  <entry key="Task_executedIndex">CREATE INDEX Task_executedIndex ON Task(executed)</entry>
+</properties>
diff --git a/docker/core/src/main/resources/persistence.properties b/docker/core/src/main/resources/persistence.properties.all
similarity index 100%
copy from docker/core/src/main/resources/persistence.properties
copy to docker/core/src/main/resources/persistence.properties.all
diff --git a/docker/core/src/main/resources/persistence.properties b/docker/core/src/main/resources/persistence.properties.pgjsonb
similarity index 59%
rename from docker/core/src/main/resources/persistence.properties
rename to docker/core/src/main/resources/persistence.properties.pgjsonb
index b4e2c81..6da6788 100644
--- a/docker/core/src/main/resources/persistence.properties
+++ b/docker/core/src/main/resources/persistence.properties.pgjsonb
@@ -15,13 +15,13 @@
 # specific language governing permissions and limitations
 # under the License.
 content.directory=/etc/apache-syncope
-entity.factory=org.apache.syncope.core.persistence.jpa.entity.JPAEntityFactory
-plainSchema.dao=org.apache.syncope.core.persistence.jpa.dao.JPAPlainSchemaDAO
-plainAttr.dao=org.apache.syncope.core.persistence.jpa.dao.JPAPlainAttrDAO
-plainAttrValue.dao=org.apache.syncope.core.persistence.jpa.dao.JPAPlainAttrValueDAO
-any.search.dao=org.apache.syncope.core.persistence.jpa.dao.JPAAnySearchDAO
-user.dao=org.apache.syncope.core.persistence.jpa.dao.JPAUserDAO
-group.dao=org.apache.syncope.core.persistence.jpa.dao.JPAGroupDAO
-anyObject.dao=org.apache.syncope.core.persistence.jpa.dao.JPAAnyObjectDAO
-conf.dao=org.apache.syncope.core.persistence.jpa.dao.JPAConfDAO
+entity.factory=org.apache.syncope.core.persistence.jpa.entity.PGJPAJSONEntityFactory
+plainSchema.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainSchemaDAO
+plainAttr.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainAttrDAO
+plainAttrValue.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONPlainAttrValueDAO
+any.search.dao=org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONAnySearchDAO
+user.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONUserDAO
+group.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONGroupDAO
+anyObject.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONAnyObjectDAO
+conf.dao=org.apache.syncope.core.persistence.jpa.dao.JPAJSONConfDAO
 openjpa.RemoteCommitProvider=${OPENJPA_REMOTE_COMMIT}
diff --git a/docker/core/src/main/resources/provisioning.properties.pgjsonb b/docker/core/src/main/resources/provisioning.properties.pgjsonb
new file mode 100644
index 0000000..220105e
--- /dev/null
+++ b/docker/core/src/main/resources/provisioning.properties.pgjsonb
@@ -0,0 +1,33 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+asyncConnectorFacadeExecutor.poolSize=10
+
+# see http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html#scheduling-task-namespace-executor
+propagationTaskExecutorAsyncExecutor.poolSize=5-25
+propagationTaskExecutorAsyncExecutor.queueCapacity=100
+propagationTaskExecutor=org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor
+
+userProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultUserProvisioningManager
+groupProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultGroupProvisioningManager
+anyObjectProvisioningManager=org.apache.syncope.core.provisioning.java.DefaultAnyObjectProvisioningManager
+virAttrCache=org.apache.syncope.core.provisioning.java.cache.MemoryVirAttrCache
+notificationManager=org.apache.syncope.core.provisioning.java.notification.DefaultNotificationManager
+auditManager=org.apache.syncope.core.provisioning.java.DefaultAuditManager
+
+quartz.jobstore=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
+quartz.sql=tables_postgres.sql
+quartz.disableInstance=false
diff --git a/docker/core/src/main/resources/startup.sh b/docker/core/src/main/resources/startup.sh
index 8c11ad9..52617e6 100755
--- a/docker/core/src/main/resources/startup.sh
+++ b/docker/core/src/main/resources/startup.sh
@@ -18,15 +18,46 @@
 # under the License.
 
 cd /etc/apache-syncope
+
 rm -f provisioning.properties
 ln -s provisioning.properties.$DBMS provisioning.properties
+
+rm -f persistence.properties
+if [ $DBMS = "pgjsonb" ]; then
+  ln -s persistence.properties.pgjsonb persistence.properties
+else
+  ln -s persistence.properties.all persistence.properties
+fi
+
 rm -f views.xml
 ln -s views.xml.$DBMS views.xml
 
+if [ $DBMS = "pgjsonb" ]; then
+  ln -s indexes.xml.pgjsonb indexes.xml
+else
+  rm -f indexes.xml
+fi
+
 cd domains
+
+if [ $DBMS = "pgjsonb" ]; then
+  mv MasterContent.xml MasterContent.xml.all
+  ln -s MasterContent.xml.pgjsonb MasterContent.xml
+else
+  rm -f MasterContent.xml
+  mv MasterContent.xml.all MasterContent.xml
+fi
+
 rm -f Master.properties
 ln -s Master.properties.$DBMS Master.properties
 
+if [ $DBMS = "pgjsonb" ]; then
+  mkdir -p /tmp/WEB-INF/lib
+  cp /etc/apache-syncope/syncope-core-persistence-jpa-json-*.jar /tmp/WEB-INF/lib
+  cd /tmp
+  jar uvf /usr/share/apache-syncope/syncope-deb-core-*.war WEB-INF/lib/
+fi
+
 /etc/init.d/tomcat8 start
 
 xtail /var/log/apache-syncope/*.log /var/log/tomcat8/
diff --git a/docker/core/src/main/resources/views.xml.pgjsonb b/docker/core/src/main/resources/views.xml.pgjsonb
new file mode 100644
index 0000000..eb450be
--- /dev/null
+++ b/docker/core/src/main/resources/views.xml.pgjsonb
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
+<properties>
+  
+  <entry key="UDynGroupMembers">
+    CREATE TABLE UDynGroupMembers(
+    any_id CHAR(36),
+    group_id CHAR(36),
+    UNIQUE(any_id, group_id))
+  </entry>
+  <entry key="ADynGroupMembers">
+    CREATE TABLE ADynGroupMembers(
+    anyType_id VARCHAR(255),
+    any_id CHAR(36),
+    group_id CHAR(36),
+    UNIQUE(anyType_id, any_id, group_id))
+  </entry>
+  <entry key="DynRoleMembers">
+    CREATE TABLE DynRoleMembers(
+    any_id CHAR(36),
+    role_id VARCHAR(255),
+    UNIQUE(any_id, role_id))
+  </entry>
+  <entry key="DynRealmMembers">
+    CREATE TABLE DynRealmMembers(
+    any_id CHAR(36),
+    dynRealm_id VARCHAR(255),
+    UNIQUE(any_id, dynRealm_id))
+  </entry>
+
+  <!-- user -->
+  <entry key="user_search">
+    CREATE VIEW user_search AS
+
+    SELECT u.id as any_id, u.*,attrs,attrValues
+    FROM SyncopeUser u, jsonb_array_elements(COALESCE(u.plainAttrs, '[{}]'::jsonb)) attrs,
+    jsonb_array_elements(COALESCE(attrs -> 'values', '[{}]'::jsonb)) attrValues
+  </entry>
+  <entry key="user_search_urelationship">
+    CREATE VIEW user_search_urelationship AS
+
+    SELECT m.user_id AS any_id, m.anyObject_id AS right_any_id, m.type_id AS type
+    FROM URelationship m
+  </entry>
+  <entry key="user_search_umembership">
+    CREATE VIEW user_search_umembership AS
+
+    SELECT m.user_id AS any_id, g.id AS group_id, g.name AS group_name
+    FROM UMembership m, SyncopeGroup g
+    WHERE m.group_id = g.id
+  </entry>
+  <entry key="user_search_role">
+    CREATE VIEW user_search_role AS
+
+    SELECT ss.user_id AS any_id, ss.role_id AS role_id
+    FROM SyncopeUser_SyncopeRole ss
+  </entry>
+  <entry key="user_search_priv">
+    CREATE VIEW user_search_priv AS
+
+    SELECT ss.user_id AS any_id, sp.privilege_id AS privilege_id
+    FROM SyncopeUser_SyncopeRole ss, SyncopeRole_Privilege sp
+    WHERE ss.role_id = sp.role_id
+  </entry>
+  <entry key="user_search_dynpriv">
+    CREATE VIEW user_search_dynpriv AS
+
+    SELECT any_id, privilege_id
+    FROM DynRoleMembers drm, SyncopeRole_Privilege rp
+    WHERE drm.role_id = rp.role_id
+  </entry>
+  <entry key="user_search_resource">
+    CREATE VIEW user_search_resource AS
+
+    SELECT st.user_id AS any_id, st.resource_id AS resource_id
+    FROM SyncopeUser_ExternalResource st
+  </entry>
+  <entry key="user_search_group_res">
+    CREATE VIEW user_search_group_res AS
+
+    SELECT m.user_id AS any_id, st.resource_id AS resource_id
+    FROM UMembership m, SyncopeGroup r, SyncopeGroup_ExternalResource st
+    WHERE m.group_id = r.id AND st.group_id = r.id
+  </entry>
+
+  <!-- anyObject -->
+  <entry key="anyObject_search">
+    CREATE VIEW anyObject_search AS
+
+    SELECT a.id as any_id, a.*,attrs,attrValues
+    FROM AnyObject a, jsonb_array_elements(COALESCE(a.plainAttrs, '[{}]'::jsonb)) attrs,
+    jsonb_array_elements(COALESCE(attrs -> 'values', '[{}]'::jsonb)) attrValues
+  </entry>
+  <entry key="anyObject_search_arelationship">
+    CREATE VIEW anyObject_search_arelationship AS
+
+    SELECT m.left_anyObject_id AS any_id, m.right_anyObject_id AS right_any_id, m.type_id AS type
+    FROM ARelationship m
+  </entry>
+  <entry key="anyObject_search_amembership">
+    CREATE VIEW anyObject_search_amembership AS
+
+    SELECT m.anyObject_id AS any_id, g.id AS group_id, g.name AS group_name
+    FROM AMembership m, SyncopeGroup g
+    WHERE m.group_id = g.id
+  </entry>
+  <entry key="anyObject_search_resource">
+    CREATE VIEW anyObject_search_resource AS
+
+    SELECT st.anyObject_id AS any_id, st.resource_id AS resource_id
+    FROM AnyObject_ExternalResource st
+  </entry>
+  <entry key="anyObject_search_group_res">
+    CREATE VIEW anyObject_search_group_res AS
+
+    SELECT m.anyObject_id AS any_id, st.resource_id AS resource_id
+    FROM AMembership m, SyncopeGroup r, SyncopeGroup_ExternalResource st
+    WHERE m.group_id = r.id AND st.group_id = r.id
+  </entry>
+
+  <!-- group -->
+  <entry key="group_search">
+    CREATE VIEW group_search AS
+
+    SELECT g.id as any_id, g.*,attrs,attrValues
+    FROM SyncopeGroup g, jsonb_array_elements(COALESCE(g.plainAttrs, '[{}]'::jsonb)) attrs,
+    jsonb_array_elements(COALESCE(attrs -> 'values', '[{}]'::jsonb)) attrValues
+  </entry>
+  <entry key="group_search_resource">
+    CREATE VIEW group_search_resource AS
+
+    SELECT st.group_id AS any_id, st.resource_id AS resource_id
+    FROM SyncopeGroup_ExternalResource st
+  </entry>
+
+</properties>
diff --git a/docker/enduser/src/main/resources/build.sh b/docker/enduser/src/main/resources/build.sh
index a164395..ca4b39f 100755
--- a/docker/enduser/src/main/resources/build.sh
+++ b/docker/enduser/src/main/resources/build.sh
@@ -32,12 +32,20 @@ export DEBCONF_TERSE true
 mkdir -p /usr/share/man/man1/
 
 ######
+# Additional APT repositories
+######
+apt-get -q update && apt-get -q install -y wget
+
+wget -q -O - http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems | tee /etc/apt/trusted.gpg.d/zulu.asc
+echo 'deb http://repos.azulsystems.com/debian stable main' > /etc/apt/sources.list.d/zulu.list
+
+######
 # Install packages
 ######
 apt-get -q update \
   && apt-get -q install -y \
     xtail \
-    openjdk-8-jdk \
+    zulu-8 \
     tomcat8 \
     libservlet3.1-java \
   && apt-get clean
@@ -55,4 +63,4 @@ echo "JAVA_OPTS=\"\${JAVA_OPTS} -Dfile.encoding=UTF-8 -server \
 -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC \
 -Djava.security.egd=file:/dev/./urandom\"" >> /etc/default/tomcat8
 
-echo "JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" >> /etc/default/tomcat8
+echo "JAVA_HOME=/usr/lib/jvm/zulu-8-amd64" >> /etc/default/tomcat8
diff --git a/docker/src/main/resources/docker-compose/docker-compose-ha.yml b/docker/src/main/resources/docker-compose/docker-compose-ha.yml
index 8f9aa0c..c5857ba 100644
--- a/docker/src/main/resources/docker-compose/docker-compose-ha.yml
+++ b/docker/src/main/resources/docker-compose/docker-compose-ha.yml
@@ -22,7 +22,7 @@ version: '3.3'
 
 services:
    db:
-     image: postgres:latest
+     image: postgres:11.2
      restart: always
      environment:
        POSTGRES_DB: syncope
@@ -32,7 +32,7 @@ services:
    syncope1:
      depends_on:
        - db
-     image: apache/syncope:${syncope.version}
+     image: apache/syncope:${SYNCOPE_VERSION}
      ports:
        - "18080:8080"
      restart: always
@@ -48,7 +48,7 @@ services:
    syncope2:
      depends_on:
        - db
-     image: apache/syncope:${syncope.version}
+     image: apache/syncope:${SYNCOPE_VERSION}
      ports:
        - "18081:8080"
      restart: always
@@ -64,7 +64,7 @@ services:
    syncope-console:
      depends_on:
        - syncope1
-     image: apache/syncope-console:${syncope.version}
+     image: apache/syncope-console:${SYNCOPE_VERSION}
      ports:
        - "28080:8080"
      restart: always
@@ -76,7 +76,7 @@ services:
    syncope-enduser:
      depends_on:
        - syncope1
-     image: apache/syncope-enduser:${syncope.version}
+     image: apache/syncope-enduser:${SYNCOPE_VERSION}
      ports:
        - "38080:8080"
      restart: always
diff --git a/docker/src/main/resources/docker-compose/docker-compose-mariadb.yml b/docker/src/main/resources/docker-compose/docker-compose-mariadb.yml
index 3f15b25..e39ff8b 100644
--- a/docker/src/main/resources/docker-compose/docker-compose-mariadb.yml
+++ b/docker/src/main/resources/docker-compose/docker-compose-mariadb.yml
@@ -32,7 +32,7 @@ services:
    syncope:
      depends_on:
        - db
-     image: apache/syncope:${syncope.version}
+     image: apache/syncope:${SYNCOPE_VERSION}
      ports:
        - "18080:8080"
      restart: always
@@ -48,7 +48,7 @@ services:
    syncope-console:
      depends_on:
        - syncope
-     image: apache/syncope-console:${syncope.version}
+     image: apache/syncope-console:${SYNCOPE_VERSION}
      ports:
        - "28080:8080"
      restart: always
@@ -60,7 +60,7 @@ services:
    syncope-enduser:
      depends_on:
        - syncope
-     image: apache/syncope-enduser:${syncope.version}
+     image: apache/syncope-enduser:${SYNCOPE_VERSION}
      ports:
        - "38080:8080"
      restart: always
diff --git a/docker/src/main/resources/docker-compose/docker-compose-mssql.yml b/docker/src/main/resources/docker-compose/docker-compose-mssql.yml
index 462f749..32a9300 100644
--- a/docker/src/main/resources/docker-compose/docker-compose-mssql.yml
+++ b/docker/src/main/resources/docker-compose/docker-compose-mssql.yml
@@ -33,7 +33,7 @@ services:
    syncope:
      depends_on:
        - db
-     image: apache/syncope:${syncope.version}
+     image: apache/syncope:${SYNCOPE_VERSION}
      ports:
        - "18080:8080"
      restart: always
@@ -50,7 +50,7 @@ services:
    syncope-console:
      depends_on:
        - syncope
-     image: apache/syncope-console:${syncope.version}
+     image: apache/syncope-console:${SYNCOPE_VERSION}
      ports:
        - "28080:8080"
      restart: always
@@ -62,7 +62,7 @@ services:
    syncope-enduser:
      depends_on:
        - syncope
-     image: apache/syncope-enduser:${syncope.version}
+     image: apache/syncope-enduser:${SYNCOPE_VERSION}
      ports:
        - "38080:8080"
      restart: always
diff --git a/docker/src/main/resources/docker-compose/docker-compose-mysql.yml b/docker/src/main/resources/docker-compose/docker-compose-mysql.yml
index d2af8c0..c7ecd2b 100644
--- a/docker/src/main/resources/docker-compose/docker-compose-mysql.yml
+++ b/docker/src/main/resources/docker-compose/docker-compose-mysql.yml
@@ -31,7 +31,7 @@ services:
    syncope:
      depends_on:
        - db
-     image: apache/syncope:${syncope.version}
+     image: apache/syncope:${SYNCOPE_VERSION}
      ports:
        - "18080:8080"
      restart: always
@@ -47,7 +47,7 @@ services:
    syncope-console:
      depends_on:
        - syncope
-     image: apache/syncope-console:${syncope.version}
+     image: apache/syncope-console:${SYNCOPE_VERSION}
      ports:
        - "28080:8080"
      restart: always
@@ -59,7 +59,7 @@ services:
    syncope-enduser:
      depends_on:
        - syncope
-     image: apache/syncope-enduser:${syncope.version}
+     image: apache/syncope-enduser:${SYNCOPE_VERSION}
      ports:
        - "38080:8080"
      restart: always
diff --git a/docker/src/main/resources/docker-compose/docker-compose-postgresql.yml b/docker/src/main/resources/docker-compose/docker-compose-pgjsonb.yml
similarity index 82%
copy from docker/src/main/resources/docker-compose/docker-compose-postgresql.yml
copy to docker/src/main/resources/docker-compose/docker-compose-pgjsonb.yml
index 5e36ec0..8af76b7 100644
--- a/docker/src/main/resources/docker-compose/docker-compose-postgresql.yml
+++ b/docker/src/main/resources/docker-compose/docker-compose-pgjsonb.yml
@@ -15,13 +15,13 @@
 # specific language governing permissions and limitations
 # under the License.
 
-# Full deployment (Core, Console, Enduser) on PostgreSQL
+# Full deployment (Core, Console, Enduser) on PostgreSQL with JSONB support
 
 version: '3.3'
 
 services:
    db:
-     image: postgres:11.1
+     image: postgres:11.2
      restart: always
      environment:
        POSTGRES_DB: syncope
@@ -31,13 +31,13 @@ services:
    syncope:
      depends_on:
        - db
-     image: apache/syncope:${syncope.version}
+     image: apache/syncope:${SYNCOPE_VERSION}
      ports:
        - "18080:8080"
      restart: always
      environment:
-       DBMS: postgresql
-       DB_URL: jdbc:postgresql://db:5432/syncope
+       DBMS: pgjsonb
+       DB_URL: jdbc:postgresql://db:5432/syncope?stringtype=unspecified
        DB_USER: syncope
        DB_PASSWORD: syncope
        DB_POOL_MAX: 10
@@ -47,7 +47,7 @@ services:
    syncope-console:
      depends_on:
        - syncope
-     image: apache/syncope-console:${syncope.version}
+     image: apache/syncope-console:${SYNCOPE_VERSION}
      ports:
        - "28080:8080"
      restart: always
@@ -59,7 +59,7 @@ services:
    syncope-enduser:
      depends_on:
        - syncope
-     image: apache/syncope-enduser:${syncope.version}
+     image: apache/syncope-enduser:${SYNCOPE_VERSION}
      ports:
        - "38080:8080"
      restart: always
diff --git a/docker/src/main/resources/docker-compose/docker-compose-postgresql.yml b/docker/src/main/resources/docker-compose/docker-compose-postgresql.yml
index 5e36ec0..5911083 100644
--- a/docker/src/main/resources/docker-compose/docker-compose-postgresql.yml
+++ b/docker/src/main/resources/docker-compose/docker-compose-postgresql.yml
@@ -21,7 +21,7 @@ version: '3.3'
 
 services:
    db:
-     image: postgres:11.1
+     image: postgres:11.2
      restart: always
      environment:
        POSTGRES_DB: syncope
@@ -31,7 +31,7 @@ services:
    syncope:
      depends_on:
        - db
-     image: apache/syncope:${syncope.version}
+     image: apache/syncope:${SYNCOPE_VERSION}
      ports:
        - "18080:8080"
      restart: always
@@ -47,7 +47,7 @@ services:
    syncope-console:
      depends_on:
        - syncope
-     image: apache/syncope-console:${syncope.version}
+     image: apache/syncope-console:${SYNCOPE_VERSION}
      ports:
        - "28080:8080"
      restart: always
@@ -59,7 +59,7 @@ services:
    syncope-enduser:
      depends_on:
        - syncope
-     image: apache/syncope-enduser:${syncope.version}
+     image: apache/syncope-enduser:${SYNCOPE_VERSION}
      ports:
        - "38080:8080"
      restart: always
diff --git a/pom.xml b/pom.xml
index 142e2c4..be4959e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -523,13 +523,13 @@ under the License.
     <nodejs.version>v8.11.4</nodejs.version>    
     <protractor.version>5.4.0</protractor.version>    
 
-    <docker.postgresql.version>11.1</docker.postgresql.version>
+    <docker.postgresql.version>11.2</docker.postgresql.version>
     <docker.mariadb.version>10.4</docker.mariadb.version>
 
     <jdbc.postgresql.version>42.2.5</jdbc.postgresql.version>
     <jdbc.mysql.version>5.1.47</jdbc.mysql.version>
-    <jdbc.mariadb.version>2.3.0</jdbc.mariadb.version>
-    <jdbc.mssql.version>6.4.0.jre</jdbc.mssql.version>
+    <jdbc.mariadb.version>2.4.0</jdbc.mariadb.version>
+    <jdbc.mssql.version>7.2.1.jre</jdbc.mssql.version>
 
     <adminUser>admin</adminUser>
     <anonymousUser>anonymous</anonymousUser>