You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@fineract.apache.org by aw...@apache.org on 2019/09/13 10:19:04 UTC

[fineract-cn-docker-compose] branch master updated (fb8b48b -> a5ed548)

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

awasum pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git.


    from fb8b48b  Merge pull request #1 from aasaru/perepare_docker_compose
     new 252574e  add fims-web-app add Postman provisioning scripts taken from https://github.com/vishwasbabu/ProvisioningFineractCN rename ledger-ms to accounting-ms
     new 4cadf2c  update Readme
     new a5e833a  Add Fineract CN start-up script
     new 7c2009e  Merge remote-tracking branch 'anh3h/master' into anh3h_master Make it work with mac
     new 88e4768  FINCN-165 fix subnet size and notifications-ms network and image
     new fb93b29  FINCN-165 fix service names in postman scripts
     new eeebf2a  FINCN-165 fix provisioner network settings
     new a5ed548  Merge pull request #4 from aasaru/anh3h_master

The 12 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 README.md                                          | 139 +++-
 docker-compose.yml                                 | 123 ++-
 env_variables                                      |  15 +
 external_tools/docker-compose.yml                  |   6 +
 ...act-Cn-Initial-Requests.postman_collection.json | 872 +++++++++++++++++++++
 ...tial-Setup-Environment.postman_environment.json |  84 ++
 start-up.sh                                        |  26 +
 7 files changed, 1243 insertions(+), 22 deletions(-)
 create mode 100644 postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
 create mode 100644 postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json
 create mode 100755 start-up.sh


[fineract-cn-docker-compose] 01/12: Initialize repo

Posted by aw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

awasum pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 990b13c62c92e278ad5c96a667a1ae750110c8ba
Author: Awasum Yannick <aw...@apache.org>
AuthorDate: Wed Sep 4 12:49:11 2019 +0100

    Initialize repo
---
 README.md          | 7 +++++++
 docker-compose.yml | 0
 2 files changed, 7 insertions(+)

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..db8df2b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,7 @@
+# Fineract CN Docker Compose
+This project contains Docker Compose Scripts for running Fineract CN especially in Development.
+
+## Requirements
+- Docker
+- Docker Compose
+
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..e69de29


[fineract-cn-docker-compose] 10/12: FINCN-165 fix service names in postman scripts

Posted by aw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

awasum pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit fb93b291b1db715361c0f0ede75eb7dfe6f1532e
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Sep 11 13:48:31 2019 +0300

    FINCN-165 fix service names in postman scripts
---
 README.md                                                    |  9 +++++++--
 .../Fineract-Cn-Initial-Requests.postman_collection.json     | 12 ++++++------
 2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/README.md b/README.md
index c0573e9..f049eb4 100644
--- a/README.md
+++ b/README.md
@@ -123,19 +123,24 @@ Postman scripts use service names (postgres, provisioner-ms, etc) when refering
 If you want to use the same Postman scripts when running micro services locally then add into your hosts (/etc/hosts in Unix) file:
 
 ```
+127.0.0.1 postgres
+127.0.0.1 cassandra
 127.0.0.1 provisioner-ms
 127.0.0.1 identity-ms
+127.0.0.1 rhythm-ms
 127.0.0.1 office-ms
 127.0.0.1 customer-ms
-127.0.0.1 portfolio-ms
 127.0.0.1 accounting-ms
+127.0.0.1 portfolio-ms
 127.0.0.1 deposit-account-management-ms
 127.0.0.1 teller-ms
 127.0.0.1 reporting-ms
 127.0.0.1 cheques-ms
 127.0.0.1 payroll-ms
 127.0.0.1 group-ms
-127.0.0.1 postgres
+127.0.0.1 notifications-ms
+127.0.0.1 fims-web-app
+
 ```
 
 ### How to reset everything and start from scratch
diff --git a/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
index be8eac2..02895ba 100644
--- a/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
+++ b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
@@ -86,7 +86,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"identifier\": \"{{tenantIdentifier}}\",\n\t\"name\": \"Playground\",\n\t\"description\": \"Sample tenant for demonstrating Fineract-CN functionality\",\n\t\"cassandraConnectionInfo\": {\n\t\t\"clusterName\": \"Datacenter1\",\n\t\t\"contactPoints\": \"127.0.0.1:9042\",\n\t\t\"keyspace\": \"playground\",\n\t\t\"replicationType\": \"Simple\",\n\t\t\"replicas\": \"1\"\n\t},\n\t\"databaseConnectionInfo\": {\n\t\t\"driverClass\": \"org.mariadb.jdbc.Driver\",\n\t\t\"database [...]
+					"raw": "{\n\t\"identifier\": \"{{tenantIdentifier}}\",\n\t\"name\": \"Playground\",\n\t\"description\": \"Sample tenant for demonstrating Fineract-CN functionality\",\n\t\"cassandraConnectionInfo\": {\n\t\t\"clusterName\": \"Datacenter1\",\n\t\t\"contactPoints\": \"cassandra:9042\",\n\t\t\"keyspace\": \"playground\",\n\t\t\"replicationType\": \"Simple\",\n\t\t\"replicas\": \"1\"\n\t},\n\t\"databaseConnectionInfo\": {\n\t\t\"driverClass\": \"org.postgresql.Driver\",\n\t\t\"databaseNa [...]
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants",
@@ -129,7 +129,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"identity-v1\",\n\t\"description\": \"Identity Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2021/identity/v1\"\n}"
+					"raw": "{\n\t\"name\": \"identity-v1\",\n\t\"description\": \"Identity Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://identity-ms:2021/identity/v1\"\n}"
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -461,7 +461,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"office-v1\",\n\t\"description\": \"Office Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2023/office/v1\"\n}"
+					"raw": "{\n\t\"name\": \"office-v1\",\n\t\"description\": \"Office Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://office-ms:2023/office/v1\"\n}"
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -545,7 +545,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"customer-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2024/customer/v1\"\n}"
+					"raw": "{\n\t\"name\": \"customer-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://customer-ms:2024/customer/v1\"\n}"
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -629,7 +629,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"accounting-v1\",\n\t\"description\": \"Accounting Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2025/accounting/v1\"\n}"
+					"raw": "{\n\t\"name\": \"accounting-v1\",\n\t\"description\": \"Accounting Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://accounting-ms:2025/accounting/v1\"\n}"
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
@@ -713,7 +713,7 @@
 				],
 				"body": {
 					"mode": "raw",
-					"raw": "{\n\t\"name\": \"deposit-v1\",\n\t\"description\": \"Deposit Management Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2026/deposit/v1\"\n}"
+					"raw": "{\n\t\"name\": \"deposit-v1\",\n\t\"description\": \"Deposit Management Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://deposit-account-management-ms:2027/deposit/v1\"\n}"
 				},
 				"url": {
 					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",


[fineract-cn-docker-compose] 09/12: FINCN-165 fix subnet size and notifications-ms network and image

Posted by aw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

awasum pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 88e47680842c98ef489430da547409fdbea894a2
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Sep 11 12:40:58 2019 +0300

    FINCN-165 fix subnet size and notifications-ms network and image
---
 docker-compose.yml                | 7 ++++---
 env_variables                     | 2 +-
 external_tools/docker-compose.yml | 2 +-
 3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index 21717c7..d0c1a09 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -285,8 +285,8 @@ services:
       fineract:
         ipv4_address: ${GROUP_IP}
 
-  notification-ms:
-    image: apache/fineract-cn-notification:latest
+  notifications-ms:
+    image: aasaru/fineract-cn-notifications:latest # TODO switch to apache repo
     ports:
      - "2033:2033"
     environment:
@@ -302,7 +302,8 @@ services:
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
       external_tools_default:
-        ipv4_address: ${NOTIFICATION_IP}
+      fineract:
+        ipv4_address: ${NOTIFICATIONS_IP}
 
   fims-web-app:
     image: aasaru/fineract-cn-fims-web-app:latest # TODO switch to apache repo
diff --git a/env_variables b/env_variables
index 2613508..dcec372 100644
--- a/env_variables
+++ b/env_variables
@@ -27,4 +27,4 @@ REPORTING_IP=172.16.238.29
 CHEQUES_IP=172.16.238.30
 PAYROLL_IP_IP=172.16.238.31
 GROUP_IP=172.16.238.32
-NOTIFICATION_IP=172.16.238.33
+NOTIFICATIONS_IP=172.16.238.33
diff --git a/external_tools/docker-compose.yml b/external_tools/docker-compose.yml
index f6aec16..137ad0f 100644
--- a/external_tools/docker-compose.yml
+++ b/external_tools/docker-compose.yml
@@ -74,4 +74,4 @@ networks:
     driver: bridge
     ipam:
       config:
-        - subnet: 172.16.238.64/29
+        - subnet: 172.16.238.64/26


[fineract-cn-docker-compose] 03/12: FINCN-165 restore description

Posted by aw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

awasum pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 0493f9353de9ab9f8bfa2bd54e15ce99d496b58b
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Sep 4 15:28:49 2019 +0300

    FINCN-165 restore description
---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 0473442..d212b5c 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 # Fineract CN Docker-Compose scripts
-
+This project contains Docker Compose Scripts for running Fineract CN especially in Development.	
 
 ## Requirements
 - Docker


[fineract-cn-docker-compose] 08/12: Merge remote-tracking branch 'anh3h/master' into anh3h_master Make it work with mac

Posted by aw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

awasum pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 7c2009e2d4313ede49076d551e124f533a6a18d6
Merge: 4cadf2c a5e833a
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Tue Sep 10 15:42:17 2019 +0300

    Merge remote-tracking branch 'anh3h/master' into anh3h_master
    Make it work with mac

 README.md                         |   7 ++-
 docker-compose.yml                | 120 ++++++++++++++++++++++++++++++++------
 env_variables                     |  15 +++++
 external_tools/docker-compose.yml |   6 ++
 start-up.sh                       |  26 +++++++++
 5 files changed, 154 insertions(+), 20 deletions(-)

diff --cc README.md
index c516bb1,2c38ea2..c0573e9
--- a/README.md
+++ b/README.md
@@@ -5,7 -5,10 +5,12 @@@ This project contains Docker Compose Sc
  - Docker
  - Docker-compose
  
 -## Perquisites
++## Automatic or manual provisioning
++
++You can either try to provision automatically using bash script `bash start-up.sh`
++Or you could achieve the same state by manually following the instructions below:
+ 
 -### Start-up Fineract CN microservices using bash script
 - `bash start-up.sh`
 +## Perquisites
  
  ### Generate .env file with RSA keys
  `java -cp external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar  org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env`
diff --cc docker-compose.yml
index d110ee2,af2648c..21717c7
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@@ -30,7 -30,8 +30,9 @@@ services
          delay: 10s
          max_attempts: 3
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.6
++      fineract:
++        ipv4_address: ${PROVISIONER_IP}
  
    identity-ms:
      image: apache/fineract-cn-identity:0.0.1-M.1 # TODO replace with latest
@@@ -56,9 -57,10 +58,11 @@@
          delay: 10s
          max_attempts: 3
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.7
++      fineract:
++        ipv4_address: ${IDENTITY_IP}
  
- # TODO HAS ERRORS:
 -# HAS ERRORS:
++  # TODO HAS ERRORS:
  #  rhythm-ms:
  #    image: apache/fineract-cn-rhythm:latest
  #    environment:
@@@ -76,7 -78,8 +80,9 @@@
  #      restart_policy:
  #        condition: on-failure
  #    networks:
- #      - external_tools_default
 -#        external_tools_default:
 -#          ipv4_address: 172.16.238.8
++#      external_tools_default:
++#      fineract:
++#          ipv4_address: ${RHYTHM_IP}
  
  
    office-ms:
@@@ -97,7 -100,8 +103,9 @@@
        system.privateKey.exponent: ${PRIVATE_KEY_EXPONENT}
        system.privateKey.modulus: ${PRIVATE_KEY_MODULUS}
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.9
++      fineract:
++        ipv4_address: ${OFFICE_IP}
  
    customer-ms:
      image: apache/fineract-cn-customer:latest
@@@ -115,9 -119,10 +123,11 @@@
        system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
        system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.10
++      fineract:
++        ipv4_address: ${CUSTOMER_IP}
  
 -  ledger-ms:
 +  accounting-ms:
      ports:
        - "2025:2025"
      image: apache/fineract-cn-accounting:latest
@@@ -133,7 -138,8 +143,9 @@@
        system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
        system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.11
++      fineract:
++        ipv4_address: ${ACCOUNTING_IP}
  
    portfolio-ms:
      image: apache/fineract-cn-portfolio:latest
@@@ -150,7 -156,8 +162,8 @@@
        system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
        system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.12
++        ipv4_address: ${PORTFOLIO_IP}
  
    deposit-account-management-ms:
      image: apache/fineract-cn-deposit-account-management:latest
@@@ -168,7 -175,8 +181,9 @@@
        system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
        system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.13
++      fineract:
++        ipv4_address: ${DEPOSIT_ACCOUNT_MANAGEMENT_IP}
  
    teller-ms:
      image: apache/fineract-cn-teller:latest
@@@ -186,7 -194,8 +201,9 @@@
        system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
        system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
      networks:
-       - external_tools_default
+       external_tools_default:
 -        ipv4_address: 172.16.238.14
++      fineract:
++        ipv4_address: ${TELLER_IP}
  
    reporting-ms:
      image: apache/fineract-cn-reporting:latest
@@@ -204,10 -213,8 +221,29 @@@
        system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
        system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
      networks:
-       - external_tools_default
- #
- # TODO add checques-ms
- #
+       external_tools_default:
 -        ipv4_address: 172.16.238.15
++      fineract:
++        ipv4_address: ${REPORTING_IP}
++
++  cheques-ms:
++    image: apache/fineract-cn-reporting:latest
++    ports:
++      - "2030:2030"
++    environment:
++      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
++      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
++      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
++      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
++      postgresql.host: ${POSTGRESQL_HOST}
++      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
++      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
++      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
++      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
++      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
++    networks:
++      external_tools_default:
++      fineract:
++        ipv4_address: ${CHEQUES_IP}
  
    payroll-ms:
      image: apache/fineract-cn-payroll:latest
@@@ -225,19 -232,50 +261,65 @@@
        system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
        system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
      networks:
-       - external_tools_default
- #
- # TODO group-ms
- #
+       external_tools_default:
 -        ipv4_address: 172.16.238.16
++      fineract:
++        ipv4_address: ${PAYROLL_IP}
+ 
+   group-ms:
+     image: apache/fineract-cn-group:latest
+     ports:
+       - "2032:2032"
+     environment:
+       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+       postgresql.host: ${POSTGRESQL_HOST}
+       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+     networks:
+       external_tools_default:
 -        ipv4_address: 172.16.238.17
++      fineract:
++        ipv4_address: ${GROUP_IP}
++
++  notification-ms:
++    image: apache/fineract-cn-notification:latest
++    ports:
++     - "2033:2033"
++    environment:
++      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
++      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
++      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
++      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
++      postgresql.host: ${POSTGRESQL_HOST}
++      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
++      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
++      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
++      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
++      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
++    networks:
++      external_tools_default:
++        ipv4_address: ${NOTIFICATION_IP}
  
 -  # Docker image is not yet available
 -  # notification-ms:
 -  #     image: apache/fineract-cn-notification:latest
 -  #     ports:
 -  #       - "2033:2033"
 -  #     environment:
 -  #       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
 -  #       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
 -  #       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
 -  #       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
 -  #       postgresql.host: ${POSTGRESQL_HOST}
 -  #       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
 -  #       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
 -  #       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
 -  #       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
 -  #       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
 -  #     networks:
 -  #       external_tools_default:
 -  #         ipv4_address: 172.16.238.18
 +  fims-web-app:
 +    image: aasaru/fineract-cn-fims-web-app:latest # TODO switch to apache repo
 +    ports:
 +      - "8888:8888"
 +    networks:
-       - external_tools_default
++      external_tools_default:
++      fineract:
++        ipv4_address: ${FIMS_WEB_APP_IP}
+ 
  
  networks:
    external_tools_default:
      external:
        name: external_tools_default
++  fineract:
++    driver: bridge
++    ipam:
++      config:
++        - subnet: 172.16.238.0/26
diff --cc env_variables
index 16cc9ae,16cc9ae..2613508
--- a/env_variables
+++ b/env_variables
@@@ -13,3 -13,3 +13,18 @@@ POSTGRESQL_PORT=543
  POSTGRESQL_USER=postgres
  RIBBON_EUREKA_SERVER=eureka:9090
  SYSTEM_INITIAL_CLIENT_ID=service-runner
++FIMS_WEB_APP_IP=172.16.238.19
++PROVISIONER_IP=172.16.238.20
++IDENTITY_IP=172.16.238.21
++RHYTHM_IP=172.16.238.22
++OFFICE_IP=172.16.238.23
++CUSTOMER_IP=172.16.238.24
++ACCOUNTING_IP=172.16.238.25
++PORTFOLIO_IP=172.16.238.26
++DEPOSIT_ACCOUNT_MANAGEMENT_IP=172.16.238.27
++TELLER_IP=172.16.238.28
++REPORTING_IP=172.16.238.29
++CHEQUES_IP=172.16.238.30
++PAYROLL_IP_IP=172.16.238.31
++GROUP_IP=172.16.238.32
++NOTIFICATION_IP=172.16.238.33
diff --cc external_tools/docker-compose.yml
index 1f30a07,1f30a07..f6aec16
--- a/external_tools/docker-compose.yml
+++ b/external_tools/docker-compose.yml
@@@ -69,3 -69,3 +69,9 @@@ volumes
    cassandra-volume:
    postgres-volume:
  
++networks:
++  default:
++    driver: bridge
++    ipam:
++      config:
++        - subnet: 172.16.238.64/29
diff --cc start-up.sh
index 0000000,14a2fdf..97deace
mode 000000,100755..100755
--- a/start-up.sh
+++ b/start-up.sh
@@@ -1,0 -1,29 +1,26 @@@
+ #!/bin/sh
+ set -e
+ 
 -echo "Createing docker service network"
 -docker network create --driver=bridge --subnet=172.16.238.0/24 external_tools_default
 -
+ cd external_tools/
+ docker-compose up -d
+ cassandra_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cassandra)
+ postgres_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' postgres)
+ 
+ # #Test Cassandra and Postgres
+ echo "Waiting for Cassandra and Postgres ..."
+ while ! nc -z "${cassandra_ip}" 9042 ; do
+   sleep 1
+ done
+ while ! nc -z "${postgres_ip}" 5432 ; do
+   sleep 1
+ done
+ echo "Cassandra and Postgres are up and running..."
+ cd ..
+ 
+ echo "Starting up Fineract CN microservices..."
+ wget https://mifos.jfrog.io/mifos/libs-snapshot-local/org/apache/fineract/cn/lang/0.1.0-BUILD-SNAPSHOT/lang-0.1.0-BUILD-SNAPSHOT.jar
+ java -cp lang-0.1.0-BUILD-SNAPSHOT.jar org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env
+ cat env_variables >> .env
+ 
+ docker-compose up -d
+ echo "Successfully started fineract services."


[fineract-cn-docker-compose] 11/12: FINCN-165 fix provisioner network settings

Posted by aw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

awasum pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit eeebf2acdfd3aeeca75f63969cac888ef35c9fbf
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Sep 11 20:45:21 2019 +0300

    FINCN-165 fix provisioner network settings
---
 docker-compose.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/docker-compose.yml b/docker-compose.yml
index d0c1a09..7b4dfd9 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -163,6 +163,7 @@ services:
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
       external_tools_default:
+      fineract:
         ipv4_address: ${PORTFOLIO_IP}
 
   deposit-account-management-ms:


[fineract-cn-docker-compose] 06/12: update Readme

Posted by aw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

awasum pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 4cadf2c9edf29a3d11e1773d1ea5f189edb43ba6
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Thu Sep 5 17:18:44 2019 +0300

    update Readme
---
 README.md | 32 ++++++++++++++++++--------------
 1 file changed, 18 insertions(+), 14 deletions(-)

diff --git a/README.md b/README.md
index f418afc..c516bb1 100644
--- a/README.md
+++ b/README.md
@@ -11,14 +11,14 @@ This project contains Docker Compose Scripts for running Fineract CN especially
 `java -cp external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar  org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env`
 
 This library is taken from [fineract-cn-lang](https://github.com/apache/fineract-cn-lang#generate-and-print-rsa-keys).
-If needed you can pull a fresh copy of it:
 
-`wget https://mifos.jfrog.io/mifos/libs-snapshot-local/org/apache/fineract/cn/lang/0.1.0-BUILD-SNAPSHOT/lang-0.1.0-BUILD-SNAPSHOT.jar lang-0.1.0-BUILD-SNAPSHOT.jar`
+If needed you can pull a fresh copy of it:
+`wget https://mifos.jfrog.io/mifos/libs-snapshot-local/org/apache/fineract/cn/lang/0.1.0-BUILD-SNAPSHOT/lang-0.1.0-BUILD-SNAPSHOT.jar external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar`
 
 ### Add other environment variables to the end of the .env file
 `cat env_variables >> .env`
 
-If you run some service from localhost then you need to change the host parameter to 'localhost' of that service in .env file.
+If you run some service from localhost then [add these services to your hosts file](#use-the-postman-scripts-when-running-locally).
 
 ## Procedure
 
@@ -28,27 +28,26 @@ cd external-tools
 docker-compose up
 ```
 
-### Choose the services you want to run
-In the docker-compose.yml (that resides in project root) there are more than 10 services defined.
-Running all services together consumes a lot of memory.
-
-
 ### Start micro services
 First only start provisioner-ms by running following in project root:
 
 ```
 docker-compose up provisioner-ms 
 ```
+after it has started (and created table seshat to postgres) stop it.
+This is just to make sure provisioner gets to create the database the other services require.
 
-after it has started (and created table seshat to postgres) stop it and start a subset of services.
-
-For example you could start the following micro services and an fims-web-app
+### Choose the services you want to run
+In the docker-compose.yml (that resides in project root) there are more than 10 services defined.
+Running all services together consumes a lot of memory. So you can start a subset of services.
 
+For example you could start the following micro services and an fims-web-app:
 ```
 docker-compose up provisioner-ms identity-ms office-ms customer-ms accounting-ms fims-web-app
 ```
-If you want you can add other micro services (listed in docker-compose.yml) to the list, for example
- you could also add deposit-account-management-ms
+
+If you want you can add other micro services (listed in docker-compose.yml) to the list.
+For example you could also start `deposit-account-management-ms`
 
 # Provision
 
@@ -69,7 +68,6 @@ Initialize Postman as follows:
 4. Select the environment "Fineract-Cn-Initial-Setup-Environment" in the environment drop-down (top right corner in Postman).
 5. Execute the requests one by one by selecting them in the collection and then pressing "Send".
 
-
 The first request will retrieve a token. The response should look like this, with a different token:
 
 ```
@@ -154,3 +152,9 @@ docker-compose up
 
 There are some scripts in [https://github.com/openMF/fineract-cn-containers](https://github.com/openMF/fineract-cn-containers)
 that have been developed in the past for this purpose.
+
+## References
+
+Derived from [https://github.com/vishwasbabu/ProvisioningFineractCN](https://github.com/vishwasbabu/ProvisioningFineractCN) ,
+[https://github.com/apache/fineract-cn-demo-server](https://github.com/apache/fineract-cn-demo-server)
+and [https://github.com/senacor/BankingInTheCloud-Fineract](https://github.com/apache/fineract-cn-demo-server).


[fineract-cn-docker-compose] 04/12: Merge pull request #1 from aasaru/perepare_docker_compose

Posted by aw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

awasum pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit fb8b48b92b80b69f4dddc90b19bc90538e049fee
Merge: 990b13c 0493f93
Author: Courage Angeh <co...@gmail.com>
AuthorDate: Thu Sep 5 01:01:42 2019 -0400

    Merge pull request #1 from aasaru/perepare_docker_compose
    
    FINCN-165 Perepare docker compose scripts using official images

 .gitignore                                   |   1 +
 HEADER                                       |  16 ++
 LICENSE                                      | 201 +++++++++++++++++++++++
 NOTICE.txt                                   |   5 +
 README.md                                    |  48 +++++-
 docker-compose.yml                           | 230 +++++++++++++++++++++++++++
 env_variables                                |  15 ++
 external_tools/docker-compose.yml            |  71 +++++++++
 external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar | Bin 0 -> 65395 bytes
 9 files changed, 584 insertions(+), 3 deletions(-)


[fineract-cn-docker-compose] 12/12: Merge pull request #4 from aasaru/anh3h_master

Posted by aw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

awasum pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit a5ed548f37e127ea2de311f6d39c1730e9977459
Merge: fb8b48b eeebf2a
Author: Awasum Yannick <aw...@apache.org>
AuthorDate: Fri Sep 13 11:18:59 2019 +0100

    Merge pull request #4 from aasaru/anh3h_master
    
    FINCN-165: Enhance Fineract CN startup script. make it work with mac and linux.

 README.md                                          | 139 +++-
 docker-compose.yml                                 | 123 ++-
 env_variables                                      |  15 +
 external_tools/docker-compose.yml                  |   6 +
 ...act-Cn-Initial-Requests.postman_collection.json | 872 +++++++++++++++++++++
 ...tial-Setup-Environment.postman_environment.json |  84 ++
 start-up.sh                                        |  26 +
 7 files changed, 1243 insertions(+), 22 deletions(-)


[fineract-cn-docker-compose] 05/12: add fims-web-app add Postman provisioning scripts taken from https://github.com/vishwasbabu/ProvisioningFineractCN rename ledger-ms to accounting-ms

Posted by aw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

awasum pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit 252574ee0a8c540adee4d0917ae684f4720cefeb
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Thu Sep 5 17:10:44 2019 +0300

    add fims-web-app
    add Postman provisioning scripts taken from https://github.com/vishwasbabu/ProvisioningFineractCN
    rename ledger-ms to accounting-ms
---
 README.md                                          | 113 ++-
 docker-compose.yml                                 |  17 +-
 ...act-Cn-Initial-Requests.postman_collection.json | 872 +++++++++++++++++++++
 ...tial-Setup-Environment.postman_environment.json |  84 ++
 4 files changed, 1081 insertions(+), 5 deletions(-)

diff --git a/README.md b/README.md
index d212b5c..f418afc 100644
--- a/README.md
+++ b/README.md
@@ -29,20 +29,127 @@ docker-compose up
 ```
 
 ### Choose the services you want to run
-In the docker-compose.yml (that resides in project root) comment out the services  you don't want to run.
+In the docker-compose.yml (that resides in project root) there are more than 10 services defined.
 Running all services together consumes a lot of memory.
 
 
 ### Start micro services
+First only start provisioner-ms by running following in project root:
 
-In project root directory run:
 ```
+docker-compose up provisioner-ms 
+```
+
+after it has started (and created table seshat to postgres) stop it and start a subset of services.
+
+For example you could start the following micro services and an fims-web-app
+
+```
+docker-compose up provisioner-ms identity-ms office-ms customer-ms accounting-ms fims-web-app
+```
+If you want you can add other micro services (listed in docker-compose.yml) to the list, for example
+ you could also add deposit-account-management-ms
+
+# Provision
+
+## Provisioning the Micro Services Using Postman
+
+We provide a postman-request-collection as well as a postman-environment that defines variables that are used to hold values received in responses.
+Both files are located under [postman-initial-requests folder](postman_scripts):
+```
+postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
+postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json
+```
+
+Initialize Postman as follows:
+
+1. Start Postman and load both files into Postman by clicking ```Import``` and then selecting the file.
+2. You will see the collection "Fineract-Cn-Initial-Requests" in the left sidebar.
+3. Open the collection by clicking on it.
+4. Select the environment "Fineract-Cn-Initial-Setup-Environment" in the environment drop-down (top right corner in Postman).
+5. Execute the requests one by one by selecting them in the collection and then pressing "Send".
+
+
+The first request will retrieve a token. The response should look like this, with a different token:
+
+```
+{
+    "token": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJhdWQiOiJwcm92aXNpb25lci12MSIsInN1YiI6IndlcGVtbmVmcmV0IiwiL21pZm9zLmlvL3NpZ25hdHVyZVRpbWVzdGFtcCI6IjIwMTctMDQtMThUMDlfNDRfMjIiLCIvbWlmb3MuaW8vdG9rZW5Db250ZW50IjoiUk9MRV9BRE1JTiIsImlzcyI6InN5c3RlbSIsImlhdCI6MTUwMDA1NjgxNywiZXhwIjoxNTAwNDE2ODE3fQ.OfxTUTStJbKQc4rAPW5PLIQYNjCG_uqcNPR4up6pIQBWLDxkgEiU9EF1WrB5NQdzXBJIHqjDFQpaVywm5DersIh4LxPGD3MZj3TqZK5_LUcZvBDTa4Xgb41e3xXkWB4TkN6KqfmiK12Ngjrrj7qZGBdtypDmFmZwKQRZIOL6T3QbI7LpbPGpeWjpWZirFgtcn5B1Z_h3r9r [...]
+    "accessTokenExpiration": "2019-07-18T22:26:57.784"
+}
+```
+
+If you don't get a token there is something wrong with your setup. The token is necessary for authentication in other requests thus be sure that this steps works.
+
+Important: Be sure to execute the requests in the right order! If you execute the requests that gives you the initial password (request "03.2 Create Identity Service for Tenant") twice you will not be able to retrieve the initial password again (due to the implementation of the identity service).
+If that happens the variable antonyUserPassword is empty (undefined) and you will not be able to sign in antony and change his password (03.3, 03.4).
+
+6. If you didn't start the micro service deposit-account-management-ms with docker-compose then
+you can assign deposits app to tenant (in step 07.1 and 07.2) but these services won't work.
+
+
+#### Debugging help
+
+1. Check if the micro services to which the requests are made are up and running.
+Check the container for details of failures (if any):
+
+docker-compose logs provisioner-ms
+
+
+2. Reach out to [mailing list](https://lists.apache.org/list.html?dev@fineract.apache.org) with the relevant details
+
+
+### Sign-in using fims-web-app
+
+Prerequisites: Fineract-CN has been successfully provisioned by following the instructions in the previous sections
+User ```mifos``` is created in the the last two requests (user creation and role assignment) in the postman request-list.
+This user has admin rights and is able to manage offices,customers and thier deposits.
+
+Navigate to http://localhost:8888 in your browser and enter the credentials of the user you want to sign in with.
+
+The following user-profile is available in fims-web-app after above setup was completed successfully:
+
+```
+tenant: playground
+user: mifos
+password: password
+```
+
+### Use the Postman scripts when running locally
+Postman scripts use service names (postgres, provisioner-ms, etc) when refering to different services.
+If you want to use the same Postman scripts when running micro services locally then add into your hosts (/etc/hosts in Unix) file:
+
+```
+127.0.0.1 provisioner-ms
+127.0.0.1 identity-ms
+127.0.0.1 office-ms
+127.0.0.1 customer-ms
+127.0.0.1 portfolio-ms
+127.0.0.1 accounting-ms
+127.0.0.1 deposit-account-management-ms
+127.0.0.1 teller-ms
+127.0.0.1 reporting-ms
+127.0.0.1 cheques-ms
+127.0.0.1 payroll-ms
+127.0.0.1 group-ms
+127.0.0.1 postgres
+```
+
+### How to reset everything and start from scratch
+
+```
+cd external-tools
+docker-compose stop
+docker-compose rm
+docker volume rm external_tools_cassandra-volume
+docker volume rm external_tools_postgres-volume
 docker-compose up
 ```
 
+
 ## TODO
 
-- Provision the web services
+- Provision the web services using a script
 - Adjust scripts for Kubernetes
 
 There are some scripts in [https://github.com/openMF/fineract-cn-containers](https://github.com/openMF/fineract-cn-containers)
diff --git a/docker-compose.yml b/docker-compose.yml
index 7ae1011..d110ee2 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -58,7 +58,7 @@ services:
     networks:
       - external_tools_default
 
-# HAS ERRORS:
+# TODO HAS ERRORS:
 #  rhythm-ms:
 #    image: apache/fineract-cn-rhythm:latest
 #    environment:
@@ -117,7 +117,7 @@ services:
     networks:
       - external_tools_default
 
-  ledger-ms:
+  accounting-ms:
     ports:
       - "2025:2025"
     image: apache/fineract-cn-accounting:latest
@@ -205,6 +205,9 @@ services:
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
       - external_tools_default
+#
+# TODO add checques-ms
+#
 
   payroll-ms:
     image: apache/fineract-cn-payroll:latest
@@ -223,6 +226,16 @@ services:
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
       - external_tools_default
+#
+# TODO group-ms
+#
+
+  fims-web-app:
+    image: aasaru/fineract-cn-fims-web-app:latest # TODO switch to apache repo
+    ports:
+      - "8888:8888"
+    networks:
+      - external_tools_default
 
 networks:
   external_tools_default:
diff --git a/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
new file mode 100644
index 0000000..be8eac2
--- /dev/null
+++ b/postman_scripts/Fineract-Cn-Initial-Requests.postman_collection.json
@@ -0,0 +1,872 @@
+{
+	"info": {
+		"_postman_id": "16b8ce24-0311-498b-b248-b91ddcc14b08",
+		"name": "Fineract-Initial-Requests",
+		"description": "Collection to initialize tenant",
+		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
+	},
+	"item": [
+		{
+			"name": "01. Get token from system user",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "2a49d9a1-377c-4c03-90b8-1c285140de5a",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"rootUserToken\", jsonData.token);",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [],
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/auth/token?grant_type=password&client_id={{client_id}}&username={{rootUser}}&password={{rootUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"auth",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "client_id",
+							"value": "{{client_id}}",
+							"description": "The initial Client Id used for starting service runner\n"
+						},
+						{
+							"key": "username",
+							"value": "{{rootUser}}",
+							"description": "Initial system user \"wepemnefret\"\n"
+						},
+						{
+							"key": "password",
+							"value": "{{rootUserPassword}}"
+						}
+					]
+				},
+				"description": "1. Get Token from System-User"
+			},
+			"response": []
+		},
+		{
+			"name": "02. Create first tenant",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"identifier\": \"{{tenantIdentifier}}\",\n\t\"name\": \"Playground\",\n\t\"description\": \"Sample tenant for demonstrating Fineract-CN functionality\",\n\t\"cassandraConnectionInfo\": {\n\t\t\"clusterName\": \"Datacenter1\",\n\t\t\"contactPoints\": \"127.0.0.1:9042\",\n\t\t\"keyspace\": \"playground\",\n\t\t\"replicationType\": \"Simple\",\n\t\t\"replicas\": \"1\"\n\t},\n\t\"databaseConnectionInfo\": {\n\t\t\"driverClass\": \"org.mariadb.jdbc.Driver\",\n\t\t\"database [...]
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.1 Create identity-v1 application",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}",
+						"type": "text",
+						"disabled": true
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"identity-v1\",\n\t\"description\": \"Identity Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2021/identity/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.2 Assign Identity Manager for Tenant",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "206c2d92-7c20-46e9-8079-ead0c0adbbe0",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"antonyUserPassword\", jsonData.adminPassword);",
+							"",
+							"",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"identity-v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/identityservice",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"identityservice"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.3 Login Antony",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"type": "text/javascript",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"antonyToken\", jsonData.accessToken);",
+							"",
+							"",
+							""
+						]
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{}"
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username=antony&password={{antonyUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "antony"
+						},
+						{
+							"key": "password",
+							"value": "{{antonyUserPassword}}"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.4 Change Antony Password",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"type": "text/javascript",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							"",
+							"postman.setEnvironmentVariable(\"antonyUserPassword\", \"dGVzdA==\");",
+							"",
+							"",
+							""
+						]
+					}
+				}
+			],
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"password\": \"dGVzdA==\"\n}"
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/users/antony/password",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"users",
+						"antony",
+						"password"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.5 Login Antony with new password",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"type": "text/javascript",
+						"exec": [
+							"tests[\"Status code is 200\"] = responseCode.code === 200;",
+							"",
+							"var jsonData = JSON.parse(responseBody);",
+							"postman.setEnvironmentVariable(\"antonyToken\", jsonData.accessToken);",
+							"",
+							"",
+							""
+						]
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{}"
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/token?grant_type=password&username={{antonyUser}}&password={{antonyUserPassword}}",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"token"
+					],
+					"query": [
+						{
+							"key": "grant_type",
+							"value": "password"
+						},
+						{
+							"key": "username",
+							"value": "{{antonyUser}}"
+						},
+						{
+							"key": "password",
+							"value": "{{antonyUserPassword}}"
+						}
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "03.6 Assign Identity for Tenant",
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"identity-v1\"\n\t}\n]"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/s{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"s{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.1 Create office-v1 application",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"office-v1\",\n\t\"description\": \"Office Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2023/office/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "04.2 Assign Office for Tenant",
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"office-v1\"\n\t}\n]"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.1 Create customer-v1 application",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"customer-v1\",\n\t\"description\": \"Customer Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2024/customer/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "05.2 Assign customer for Tenant",
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"customer-v1\"\n\t}\n]"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.1 Create accounting-v1 application",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"accounting-v1\",\n\t\"description\": \"Accounting Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2025/accounting/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "06.2 Assign accounting for Tenant",
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"accounting-v1\"\n\t}\n]"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "07.1 Create deposit-v1 application",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"name\": \"deposit-v1\",\n\t\"description\": \"Deposit Management Service\",\n\t\"vendor\": \"Apache Fineract\",\n\t\"homepage\": \"http://localhost:2026/deposit/v1\"\n}"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "07.2 Assign deposits for Tenant",
+			"request": {
+				"method": "PUT",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{rootUserToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{rootUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "[\n\t{\n\t\t\"name\": \"deposit-v1\"\n\t}\n]"
+				},
+				"url": {
+					"raw": "http://{{provisionerUrl}}/provisioner/v1/tenants/{{tenantIdentifier}}/applications",
+					"protocol": "http",
+					"host": [
+						"{{provisionerUrl}}"
+					],
+					"path": [
+						"provisioner",
+						"v1",
+						"tenants",
+						"{{tenantIdentifier}}",
+						"applications"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "08.1 Create Admin Role for tenant \"playground\"",
+			"event": [
+				{
+					"listen": "test",
+					"script": {
+						"id": "c64b529c-6e8a-4ef1-ab0d-a58b9499ade9",
+						"exec": [
+							"tests[\"Status code is 202\"] = responseCode.code === 202;",
+							""
+						],
+						"type": "text/javascript"
+					}
+				}
+			],
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\"identifier\":\"administrator\",\"permissions\":[{\"permittableEndpointGroupIdentifier\":\"identity__v1__roles\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"identity__v1__self\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"office__v1__employees\",\"allowedOperations\":[\"READ\",\"CHANGE\",\"DELETE\"]},{\"permittableEndpointGroupIdentifier\":\"customer__v1__task\",\"al [...]
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/roles",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"roles"
+					]
+				}
+			},
+			"response": []
+		},
+		{
+			"name": "08.2 Create Admin User",
+			"request": {
+				"method": "POST",
+				"header": [
+					{
+						"key": "Authorization",
+						"value": "{{antonyToken}}"
+					},
+					{
+						"key": "User",
+						"value": "{{antonyUser}}"
+					},
+					{
+						"key": "Content-Type",
+						"value": "application/json"
+					},
+					{
+						"key": "X-Tenant-Identifier",
+						"value": "{{tenantIdentifier}}"
+					}
+				],
+				"body": {
+					"mode": "raw",
+					"raw": "{\n\t\"identifier\": \"mifos\",\n\t\"role\": \"administrator\",\n\t\"password\": \"cGFzc3dvcmQ=\"\n}"
+				},
+				"url": {
+					"raw": "http://{{identityUrl}}/identity/v1/users",
+					"protocol": "http",
+					"host": [
+						"{{identityUrl}}"
+					],
+					"path": [
+						"identity",
+						"v1",
+						"users"
+					]
+				}
+			},
+			"response": []
+		}
+	]
+}
diff --git a/postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json b/postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json
new file mode 100644
index 0000000..ee13692
--- /dev/null
+++ b/postman_scripts/Fineract-Cn-Initial-Setup-Environment.postman_environment.json
@@ -0,0 +1,84 @@
+{
+	"id": "91c46e16-2e81-441f-af81-349ca02d2052",
+	"name": "Fineract-Cn-Initial-Setup-Environment",
+	"values": [
+		{
+			"key": "host",
+			"value": "localhost",
+			"enabled": true
+		},
+		{
+			"key": "tenantIdentifier",
+			"value": "playground",
+			"enabled": true
+		},
+		{
+			"key": "user",
+			"value": "superuser",
+			"enabled": true
+		},
+		{
+			"key": "accessToken",
+			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJzdWIiOiJzdXBlcnVzZXIiLCIvbWlmb3MuaW8vc2lnbmF0dXJlVGltZXN0YW1wIjoiMjAxNy0wNC0yNlQwN18yNl8xMyIsIi9taWZvcy5pby90b2tlbkNvbnRlbnQiOiJ7XCJ0b2tlblBlcm1pc3Npb25zXCI6W3tcInBhdGhcIjpcInBvcnRmb2xpby12MS9wcm9kdWN0cy8qL2NoYXJnZXNcIixcImFsbG93ZWRPcGVyYXRpb25zXCI6W1wiQ0hBTkdFXCJdfSx7XCJwYXRoXCI6XCJpZGVudGl0eS12MS9hcHBsaWNhdGlvbnMvKi9wZXJtaXNzaW9ucy8qL3VzZXJzL3t1c2VyaWRlbnRpZmllcn0vZW5hYmxlZFwiLFwiYWxsb3dlZE9wZXJhdGlvbnNcIjpbXCJSRUFEXCJdfSx7XCJwYXRoXCI6XCJpZGV [...]
+			"enabled": true
+		},
+		{
+			"key": "rootUser",
+			"value": "wepemnefret",
+			"enabled": true
+		},
+		{
+			"key": "rootUserToken",
+			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJhdWQiOiJwcm92aXNpb25lci12MSIsInN1YiI6IndlcGVtbmVmcmV0IiwiL2ZpbmNuLmFwYWNoZS5vcmcvcyI6IjIwMTktMDktMDRUMDZfNDNfNTIiLCIvZmluY24uYXBhY2hlLm9yZy9jIjoiUk9MRV9BRE1JTiIsImlzcyI6InN5c3RlbSIsImlhdCI6MTU2NzY5MDcxOSwiZXhwIjoxNTY3Njk0MzE5fQ.mG4Hs3IkU0_lHzazEidYU3EbVoHxmVhF3mBKWsnsLktE4PUnFjkfkP201RLypUzUTFTR4jp8ytDryOZQi-Cqku1BeRv8zQihJNFNL5khpmLnDKmelffE4BmM6t3wPsXSLke9orTL6HQEgNELcR03UhihGp_JvPYVQ5uzcSKcv1uG5U0IDZdKMAfvCdeu7uS5mV_H6tHnPjChbGcfPdB6wtk-4d7O [...]
+			"enabled": true
+		},
+		{
+			"key": "antonyUser",
+			"value": "antony",
+			"enabled": true
+		},
+		{
+			"key": "antonyToken",
+			"value": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJzdWIiOiJhbnRvbnkiLCIvZmluY24uYXBhY2hlLm9yZy9zIjoiMjAxOS0wOS0wNVQxM18zOV80NiIsIi9maW5jbi5hcGFjaGUub3JnL2MiOiJ7XCJ0b2tlblBlcm1pc3Npb25zXCI6W3tcInBhdGhcIjpcImlkZW50aXR5LXYxL3VzZXJzL3t1c2VyaWRlbnRpZmllcn0vcGFzc3dvcmRcIixcImFsbG93ZWRPcGVyYXRpb25zXCI6W1wiQ0hBTkdFXCIsXCJSRUFEXCIsXCJERUxFVEVcIl19LHtcInBhdGhcIjpcImlkZW50aXR5LXYxL3JvbGVzLypcIixcImFsbG93ZWRPcGVyYXRpb25zXCI6W1wiQ0hBTkdFXCIsXCJSRUFEXCIsXCJERUxFVEVcIl19LHtcInBhdGhcIjpcImlkZW50aXR5LXYxL3VzZXJ [...]
+			"enabled": true
+		},
+		{
+			"key": "client_id",
+			"value": "service-runner",
+			"enabled": true
+		},
+		{
+			"key": "rootUserPassword",
+			"value": "oS/0IiAME/2unkN1momDrhAdNKOhGykYFH/mJN20",
+			"enabled": true
+		},
+		{
+			"key": "provisionerUrl",
+			"value": "provisioner-ms:2020",
+			"enabled": true
+		},
+		{
+			"key": "identityUrl",
+			"value": "identity-ms:2021",
+			"enabled": true
+		},
+		{
+			"key": "webappUrl",
+			"value": "localhost:8888",
+			"enabled": true
+		},
+		{
+			"key": "accountingUrl",
+			"value": "accounting-ms:2025",
+			"enabled": true
+		},
+		{
+			"key": "antonyUserPassword",
+			"value": "dGVzdA==",
+			"enabled": true
+		}
+	],
+	"_postman_variable_scope": "environment",
+	"_postman_exported_at": "2019-09-05T13:50:13.901Z",
+	"_postman_exported_using": "Postman/7.5.0"
+}


[fineract-cn-docker-compose] 07/12: Add Fineract CN start-up script

Posted by aw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

awasum pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit a5e833a9568d497f3c0b77e03d0038b995d65dc3
Author: Anh3h <co...@gmail.com>
AuthorDate: Thu Sep 5 21:23:12 2019 -0400

    Add Fineract CN start-up script
---
 .gitignore                                   |   1 +
 README.md                                    |   5 +-
 docker-compose.yml                           |  73 +++++++++++++++++++++++----
 external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar | Bin 65395 -> 0 bytes
 start-up.sh                                  |  29 +++++++++++
 5 files changed, 96 insertions(+), 12 deletions(-)

diff --git a/.gitignore b/.gitignore
index 4c49bd7..d028ce2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
 .env
+*.jar
\ No newline at end of file
diff --git a/README.md b/README.md
index d212b5c..2c38ea2 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 # Fineract CN Docker-Compose scripts
-This project contains Docker Compose Scripts for running Fineract CN especially in Development.	
+This project contains Docker Compose Scripts for running Fineract CN especially in Development.
 
 ## Requirements
 - Docker
@@ -7,6 +7,9 @@ This project contains Docker Compose Scripts for running Fineract CN especially
 
 ## Perquisites
 
+### Start-up Fineract CN microservices using bash script
+ `bash start-up.sh`
+
 ### Generate .env file with RSA keys
 `java -cp external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar  org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env`
 
diff --git a/docker-compose.yml b/docker-compose.yml
index 7ae1011..af2648c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -30,7 +30,8 @@ services:
         delay: 10s
         max_attempts: 3
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.6
 
   identity-ms:
     image: apache/fineract-cn-identity:0.0.1-M.1 # TODO replace with latest
@@ -56,7 +57,8 @@ services:
         delay: 10s
         max_attempts: 3
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.7
 
 # HAS ERRORS:
 #  rhythm-ms:
@@ -76,7 +78,8 @@ services:
 #      restart_policy:
 #        condition: on-failure
 #    networks:
-#      - external_tools_default
+#        external_tools_default:
+#          ipv4_address: 172.16.238.8
 
 
   office-ms:
@@ -97,7 +100,8 @@ services:
       system.privateKey.exponent: ${PRIVATE_KEY_EXPONENT}
       system.privateKey.modulus: ${PRIVATE_KEY_MODULUS}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.9
 
   customer-ms:
     image: apache/fineract-cn-customer:latest
@@ -115,7 +119,8 @@ services:
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.10
 
   ledger-ms:
     ports:
@@ -133,7 +138,8 @@ services:
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.11
 
   portfolio-ms:
     image: apache/fineract-cn-portfolio:latest
@@ -150,7 +156,8 @@ services:
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.12
 
   deposit-account-management-ms:
     image: apache/fineract-cn-deposit-account-management:latest
@@ -168,7 +175,8 @@ services:
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.13
 
   teller-ms:
     image: apache/fineract-cn-teller:latest
@@ -186,7 +194,8 @@ services:
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.14
 
   reporting-ms:
     image: apache/fineract-cn-reporting:latest
@@ -204,7 +213,8 @@ services:
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.15
 
   payroll-ms:
     image: apache/fineract-cn-payroll:latest
@@ -222,7 +232,48 @@ services:
       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
     networks:
-      - external_tools_default
+      external_tools_default:
+        ipv4_address: 172.16.238.16
+
+  group-ms:
+    image: apache/fineract-cn-group:latest
+    ports:
+      - "2032:2032"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      external_tools_default:
+        ipv4_address: 172.16.238.17
+
+  # Docker image is not yet available
+  # notification-ms:
+  #     image: apache/fineract-cn-notification:latest
+  #     ports:
+  #       - "2033:2033"
+  #     environment:
+  #       activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+  #       cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+  #       eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+  #       eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+  #       postgresql.host: ${POSTGRESQL_HOST}
+  #       ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+  #       spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+  #       system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+  #       system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+  #       system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+  #     networks:
+  #       external_tools_default:
+  #         ipv4_address: 172.16.238.18
+
 
 networks:
   external_tools_default:
diff --git a/external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar b/external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar
deleted file mode 100644
index 42251a5..0000000
Binary files a/external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar and /dev/null differ
diff --git a/start-up.sh b/start-up.sh
new file mode 100755
index 0000000..14a2fdf
--- /dev/null
+++ b/start-up.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+set -e
+
+echo "Createing docker service network"
+docker network create --driver=bridge --subnet=172.16.238.0/24 external_tools_default
+
+cd external_tools/
+docker-compose up -d
+cassandra_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cassandra)
+postgres_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' postgres)
+
+# #Test Cassandra and Postgres
+echo "Waiting for Cassandra and Postgres ..."
+while ! nc -z "${cassandra_ip}" 9042 ; do
+  sleep 1
+done
+while ! nc -z "${postgres_ip}" 5432 ; do
+  sleep 1
+done
+echo "Cassandra and Postgres are up and running..."
+cd ..
+
+echo "Starting up Fineract CN microservices..."
+wget https://mifos.jfrog.io/mifos/libs-snapshot-local/org/apache/fineract/cn/lang/0.1.0-BUILD-SNAPSHOT/lang-0.1.0-BUILD-SNAPSHOT.jar
+java -cp lang-0.1.0-BUILD-SNAPSHOT.jar org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env
+cat env_variables >> .env
+
+docker-compose up -d
+echo "Successfully started fineract services."


[fineract-cn-docker-compose] 02/12: FINCN-165 based on https://github.com/openMF/fineract-cn-containers create docker-compose files that use official Apache Docker images

Posted by aw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

awasum pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/fineract-cn-docker-compose.git

commit a1d97145ecf12d94406b3ba6c8668e01803018d2
Author: Juhan Aasaru <Ju...@nortal.com>
AuthorDate: Wed Sep 4 15:27:13 2019 +0300

    FINCN-165 based on https://github.com/openMF/fineract-cn-containers create docker-compose files that use official Apache Docker images
---
 .gitignore                                   |   1 +
 HEADER                                       |  16 ++
 LICENSE                                      | 201 +++++++++++++++++++++++
 NOTICE.txt                                   |   5 +
 README.md                                    |  48 +++++-
 docker-compose.yml                           | 230 +++++++++++++++++++++++++++
 env_variables                                |  15 ++
 external_tools/docker-compose.yml            |  71 +++++++++
 external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar | Bin 0 -> 65395 bytes
 9 files changed, 584 insertions(+), 3 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4c49bd7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.env
diff --git a/HEADER b/HEADER
new file mode 100644
index 0000000..90705e0
--- /dev/null
+++ b/HEADER
@@ -0,0 +1,16 @@
+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.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..100d215
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source identifier, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object identifier, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source identifier control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed 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.
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 0000000..4709188
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,5 @@
+Apache Fineract CN Docker Compose scripts
+Copyright [2017-2018] The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
diff --git a/README.md b/README.md
index db8df2b..0473442 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,49 @@
-# Fineract CN Docker Compose
-This project contains Docker Compose Scripts for running Fineract CN especially in Development.
+# Fineract CN Docker-Compose scripts
+
 
 ## Requirements
 - Docker
-- Docker Compose
+- Docker-compose
+
+## Perquisites
+
+### Generate .env file with RSA keys
+`java -cp external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar  org.apache.fineract.cn.lang.security.RsaKeyPairFactory UNIX > .env`
+
+This library is taken from [fineract-cn-lang](https://github.com/apache/fineract-cn-lang#generate-and-print-rsa-keys).
+If needed you can pull a fresh copy of it:
+
+`wget https://mifos.jfrog.io/mifos/libs-snapshot-local/org/apache/fineract/cn/lang/0.1.0-BUILD-SNAPSHOT/lang-0.1.0-BUILD-SNAPSHOT.jar lang-0.1.0-BUILD-SNAPSHOT.jar`
+
+### Add other environment variables to the end of the .env file
+`cat env_variables >> .env`
+
+If you run some service from localhost then you need to change the host parameter to 'localhost' of that service in .env file.
+
+## Procedure
+
+### Start external tools (database, cassandra, etc)
+```
+cd external-tools
+docker-compose up
+```
+
+### Choose the services you want to run
+In the docker-compose.yml (that resides in project root) comment out the services  you don't want to run.
+Running all services together consumes a lot of memory.
+
+
+### Start micro services
+
+In project root directory run:
+```
+docker-compose up
+```
+
+## TODO
+
+- Provision the web services
+- Adjust scripts for Kubernetes
 
+There are some scripts in [https://github.com/openMF/fineract-cn-containers](https://github.com/openMF/fineract-cn-containers)
+that have been developed in the past for this purpose.
diff --git a/docker-compose.yml b/docker-compose.yml
index e69de29..7ae1011 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -0,0 +1,230 @@
+version: '3'
+services:
+  provisioner-ms:
+    image: apache/fineract-cn-provisioner:latest
+    ports:
+      - "2020:2020"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.cluster.pwd: ${CASSANDRA_CLUSTER_PASSWORD}
+      cassandra.cluster.user: ${CASSANDRA_CLUSTER_USER}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      custom.postgresql.host: ${POSTGRESQL_HOST}
+      custom.postgresql.user: ${POSTGRESQL_USER}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.initialclientid: ${SYSTEM_INITIAL_CLIENT_ID}
+      system.privateKey.exponent: ${PRIVATE_KEY_EXPONENT}
+      system.privateKey.modulus: ${PRIVATE_KEY_MODULUS}
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: any
+        delay: 10s
+        max_attempts: 3
+    networks:
+      - external_tools_default
+
+  identity-ms:
+    image: apache/fineract-cn-identity:0.0.1-M.1 # TODO replace with latest
+    ports:
+      - "2021:2021"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.cluster.pwd: ${CASSANDRA_CLUSTER_PASSWORD}
+      cassandra.cluster.user: ${CASSANDRA_CLUSTER_USER}
+      cassandra.clusterName: ${CASSANDRA_CLUSTER_NAME}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: any
+        delay: 10s
+        max_attempts: 3
+    networks:
+      - external_tools_default
+
+# HAS ERRORS:
+#  rhythm-ms:
+#    image: apache/fineract-cn-rhythm:latest
+#    environment:
+#      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+#      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+#      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+#      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+#      postgresql.host: ${POSTGRESQL_HOST}
+#      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+#      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+#      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+#      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+#    deploy:
+#      replicas: 1
+#      restart_policy:
+#        condition: on-failure
+#    networks:
+#      - external_tools_default
+
+
+  office-ms:
+    image: apache/fineract-cn-office:latest
+    ports:
+      - "2023:2023"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+      system.privateKey.exponent: ${PRIVATE_KEY_EXPONENT}
+      system.privateKey.modulus: ${PRIVATE_KEY_MODULUS}
+    networks:
+      - external_tools_default
+
+  customer-ms:
+    image: apache/fineract-cn-customer:latest
+    ports:
+      - "2024:2024"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      - external_tools_default
+
+  ledger-ms:
+    ports:
+      - "2025:2025"
+    image: apache/fineract-cn-accounting:latest
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      - external_tools_default
+
+  portfolio-ms:
+    image: apache/fineract-cn-portfolio:latest
+    ports:
+      - "2026:2026"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      - external_tools_default
+
+  deposit-account-management-ms:
+    image: apache/fineract-cn-deposit-account-management:latest
+    ports:
+      - "2027:2027"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      - external_tools_default
+
+  teller-ms:
+    image: apache/fineract-cn-teller:latest
+    ports:
+      - "2028:2028"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      - external_tools_default
+
+  reporting-ms:
+    image: apache/fineract-cn-reporting:latest
+    ports:
+      - "2029:2029"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      - external_tools_default
+
+  payroll-ms:
+    image: apache/fineract-cn-payroll:latest
+    ports:
+      - "2031:2031"
+    environment:
+      activemq.brokerUrl: ${ACTIVEMQ_BROKER_URL}
+      cassandra.contactPoints: ${CASSANDRA_CONTACT_POINTS}
+      eureka.client.serviceUrl.defaultZone: ${EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE}
+      eureka.instance.hostname: ${EUREKA_INSTANCE_HOSTNAME}
+      postgresql.host: ${POSTGRESQL_HOST}
+      ribbon.listOfServers: ${RIBBON_EUREKA_SERVER}
+      spring.datasource.url: jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/seshat
+      system.publicKey.exponent: ${PUBLIC_KEY_EXPONENT}
+      system.publicKey.modulus: ${PUBLIC_KEY_MODULUS}
+      system.publicKey.timestamp: ${PUBLIC_KEY_TIMESTAMP}
+    networks:
+      - external_tools_default
+
+networks:
+  external_tools_default:
+    external:
+      name: external_tools_default
diff --git a/env_variables b/env_variables
new file mode 100644
index 0000000..16cc9ae
--- /dev/null
+++ b/env_variables
@@ -0,0 +1,15 @@
+ACTIVEMQ_BROKER_URL=tcp://activemq:61616
+CASSANDRA_CLUSTER_NAME=Datacenter1
+CASSANDRA_CLUSTER_PASSWORD=password
+CASSANDRA_CLUSTER_USER=cassandra
+CASSANDRA_CONTACT_POINTS=cassandra:9042
+EUREKA_CLIENT_SERVICE_URL_DEFAULT_ZONE=http://localhost:8761/eureka
+EUREKA_INSTANCE_HOSTNAME=eureka
+MARIADB_HOST=mariadb
+MARIADB_PASSWORD=mysql
+MARIADB_USER=root
+POSTGRESQL_HOST=postgres
+POSTGRESQL_PORT=5432
+POSTGRESQL_USER=postgres
+RIBBON_EUREKA_SERVER=eureka:9090
+SYSTEM_INITIAL_CLIENT_ID=service-runner
diff --git a/external_tools/docker-compose.yml b/external_tools/docker-compose.yml
new file mode 100644
index 0000000..1f30a07
--- /dev/null
+++ b/external_tools/docker-compose.yml
@@ -0,0 +1,71 @@
+version: "3"
+services:
+  activemq:
+    image: rmohr/activemq:5.14.5
+    container_name: activemq
+    ports:
+      - "61616:61616"
+      - "8161:8161"
+    environment:
+      ACTIVEMQ_CONFIG_MINMEMORY: 512
+      ACTIVEMQ_CONFIG_MAXMEMORY: 1024
+    healthcheck:
+      test: curl -u admin:admin -s http://localhost:8161/admin || exit 1
+      interval: 1m
+      retries: 5
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: any
+        delay: 10s
+        max_attempts: 3
+
+  eureka:
+    image: anh3h/eureka-server:latest
+    container_name: eureka
+    ports:
+      - "8761:8761"
+    healthcheck:
+      test: curl -f http://localhost:8761 || exit 1
+      interval: 1m
+      retries: 5
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: any
+        delay: 10s
+        max_attempts: 3
+
+  postgres:
+    image: postgres:11
+    container_name: postgres
+    environment:
+      POSTGRES_USER: postgres
+      POSTGRES_PASSWORD: postgres
+    ports:
+      - "5432:5432"
+    volumes:
+      - postgres-volume:/var/lib/postgresql/data
+
+  cassandra:
+    image: cassandra:latest
+    container_name: cassandra
+    ports:
+      - "9042:9042"
+    healthcheck:
+      test: cqlsh ping -h localhost
+      interval: 1m
+      retries: 5
+    deploy:
+      replicas: 1
+      restart_policy:
+        condition: any
+        delay: 10s
+        max_attempts: 3
+    volumes:
+      - cassandra-volume:/var/lib/cassandra
+
+volumes:
+  cassandra-volume:
+  postgres-volume:
+
diff --git a/external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar b/external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar
new file mode 100644
index 0000000..42251a5
Binary files /dev/null and b/external_tools/lang-0.1.0-BUILD-SNAPSHOT.jar differ