diff --git a/fineract-doc/src/docs/en/chapters/appendix/properties-database.adoc b/fineract-doc/src/docs/en/chapters/appendix/properties-database.adoc
index 988a9c38f..074afbaed 100644
--- a/fineract-doc/src/docs/en/chapters/appendix/properties-database.adoc
+++ b/fineract-doc/src/docs/en/chapters/appendix/properties-database.adoc
@@ -63,4 +63,35 @@
|FINERACT_LIQUIBASE_ENABLED
|true
|TBD
+
+|fineract.tenant.read-only-name
+|FINERACT_DEFAULT_TENANTDB_RO_NAME
+|
+|
+
+|fineract.tenant.read-only-host
+|FINERACT_DEFAULT_TENANTDB_RO_HOSTNAME
+|
+|
+
+|fineract.tenant.read-only-port
+|FINERACT_DEFAULT_TENANTDB_RO_PORT
+|
+|
+
+|fineract.tenant.read-only-username
+|FINERACT_DEFAULT_TENANTDB_RO_UID
+|
+|
+
+|fineract.tenant.read-only-password
+|FINERACT_DEFAULT_TENANTDB_RO_PWD
+|
+|
+
+|fineract.tenant.read-only-parameters
+|FINERACT_DEFAULT_TENANTDB_RO_CONN_PARAMS
+|
+|
+
|===
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/FineractProperties.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/FineractProperties.java
index 0ee0bc852..ad4abe2f3 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/FineractProperties.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/config/FineractProperties.java
@@ -80,6 +80,12 @@ public class FineractProperties {
private String masterPassword;
private String encryption;
+ private String readOnlyHost;
+ private Integer readOnlyPort;
+ private String readOnlyUsername;
+ private String readOnlyPassword;
+ private String readOnlyParameters;
+ private String readOnlyName;
}
@Getter
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseUpgradeService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseUpgradeService.java
index 623c49532..ae5828e79 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseUpgradeService.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseUpgradeService.java
@@ -29,6 +29,7 @@ import liquibase.exception.LiquibaseException;
import liquibase.integration.spring.SpringLiquibase;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
import org.apache.fineract.infrastructure.core.boot.FineractProfiles;
import org.apache.fineract.infrastructure.core.config.FineractProperties;
import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant;
@@ -108,6 +109,13 @@ public class TenantDatabaseUpgradeService implements InitializingBean {
log.info("- fineract.tenant.description: {}", fineractProperties.getTenant().getDescription());
log.info("- fineract.tenant.identifier: {}", fineractProperties.getTenant().getIdentifier());
log.info("- fineract.tenant.name: {}", fineractProperties.getTenant().getName());
+
+ log.info("- fineract.tenant.username: {}", fineractProperties.getTenant().getReadOnlyUsername());
+ log.info("- fineract.tenant.password: {}",
+ StringUtils.isNotBlank(fineractProperties.getTenant().getReadOnlyPassword()) ? "****" : "");
+ log.info("- fineract.tenant.parameters: {}", fineractProperties.getTenant().getReadOnlyParameters());
+ log.info("- fineract.tenant.name: {}", fineractProperties.getTenant().getReadOnlyName());
+
}
private void upgradeIndividualTenants() throws LiquibaseException {
diff --git a/fineract-provider/src/main/resources/application.properties b/fineract-provider/src/main/resources/application.properties
index d5fa1c77f..0545d1b14 100644
--- a/fineract-provider/src/main/resources/application.properties
+++ b/fineract-provider/src/main/resources/application.properties
@@ -37,6 +37,13 @@ fineract.tenant.description=${FINERACT_DEFAULT_TENANTDB_DESCRIPTION:Default Demo
fineract.tenant.master-password=${FINERACT_DEFAULT_TENANTDB_MASTER_PASSWORD:fineract}
fineract.tenant.encrytion=${FINERACT_DEFAULT_TENANTDB_ENCRYPTION:"AES/CBC/PKCS5Padding"}
+fineract.tenant.read-only-host=${FINERACT_DEFAULT_TENANTDB_RO_HOSTNAME:}
+fineract.tenant.read-only-port=${FINERACT_DEFAULT_TENANTDB_RO_PORT:}
+fineract.tenant.read-only-username=${FINERACT_DEFAULT_TENANTDB_RO_UID:}
+fineract.tenant.read-only-password=${FINERACT_DEFAULT_TENANTDB_RO_PWD:}
+fineract.tenant.read-only-parameters=${FINERACT_DEFAULT_TENANTDB_RO_CONN_PARAMS:}
+fineract.tenant.read-only-name=${FINERACT_DEFAULT_TENANTDB_RO_NAME:}
+
fineract.mode.read-enabled=${FINERACT_MODE_READ_ENABLED:true}
fineract.mode.write-enabled=${FINERACT_MODE_WRITE_ENABLED:true}
fineract.mode.batch-worker-enabled=${FINERACT_MODE_BATCH_WORKER_ENABLED:true}
@@ -190,6 +197,12 @@ spring.liquibase.parameters.fineract.tenant.port=${fineract.tenant.port}
spring.liquibase.parameters.fineract.tenant.username=${fineract.tenant.username}
spring.liquibase.parameters.fineract.tenant.password=${fineract.tenant.password}
spring.liquibase.parameters.fineract.tenant.parameters=${fineract.tenant.parameters}
+spring.liquibase.parameters.fineract.tenant.read-only-host=${fineract.tenant.read-only-host}
+spring.liquibase.parameters.fineract.tenant.read-only-port=${fineract.tenant.read-only-port}
+spring.liquibase.parameters.fineract.tenant.read-only-username=${fineract.tenant.read-only-username}
+spring.liquibase.parameters.fineract.tenant.read-only-password=${fineract.tenant.read-only-password}
+spring.liquibase.parameters.fineract.tenant.read-only-parameters=${fineract.tenant.read-only-parameters}
+spring.liquibase.parameters.fineract.tenant.read-only-name=${fineract.tenant.read-only-name}
springdoc.api-docs.path=${SPRINGDOC_API_DOCS_PATH:/api-docs}
springdoc.api-docs.enabled=${SPRINGDOC_API_DOCS_ENABLED:true}
diff --git a/fineract-provider/src/main/resources/db/changelog/tenant-store/changelog-tenant-store.xml b/fineract-provider/src/main/resources/db/changelog/tenant-store/changelog-tenant-store.xml
index 42c4aba73..ae5bb4f01 100644
--- a/fineract-provider/src/main/resources/db/changelog/tenant-store/changelog-tenant-store.xml
+++ b/fineract-provider/src/main/resources/db/changelog/tenant-store/changelog-tenant-store.xml
@@ -28,4 +28,5 @@
+
diff --git a/fineract-provider/src/main/resources/db/changelog/tenant-store/parts/0009_set_and_encrypt_ro_if_not_exists.xml b/fineract-provider/src/main/resources/db/changelog/tenant-store/parts/0009_set_and_encrypt_ro_if_not_exists.xml
new file mode 100644
index 000000000..abcd696a0
--- /dev/null
+++ b/fineract-provider/src/main/resources/db/changelog/tenant-store/parts/0009_set_and_encrypt_ro_if_not_exists.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+ SELECT count(1) FROM tenant_server_connections WHERE id = 1 and readonly_schema_password is null and readonly_schema_username is null and readonly_schema_name is null;
+
+
+
+
+
+
+
+
+
+
+
+
+