Mifos 21.07.02 Installation on Tomcat-Ubuntu 18.04

Linux Server for Fineract Platform using

Ubuntu Server 18.04.4 LTS - Higher Versions Not tested

Java-OpenJDK-15.0.2 - Higher Versions Not Recommended (Anything above 15.0.XX) is not yet tested thus not recommended)

Tomcat server (Minimum v.9.0.xx) or above (latest available at https://tomcat.apache.org/download-90.cgi

MYSQL server (v.5.7.xx) - Higher or lower versions not tested and not recommended on production servers until you test them your self

NOTE

Keep all the credentials used in this document as your defaults until after you are done with your first successful installation.
Then you can change the passwords and other settings

Use the same versions of the prerequisites (Java, Tomcat, Ubuntu) mentioned then test the others later

Step 1 - Installing System Updates and Prerequisites:

Run all below mentioned scripts one by one on the ubuntu console & follow step by step instructions: - 

# sudo apt-get update

# sudo apt-get upgrade

Install Java 15.0.X the specific linkhttps://www.oracle.com/java/technologies/javase/jdk15-archive-downloads.html#license-lightbox : 

The latest version of Java OpenJDK on Ubuntu 18.04 is OpenJDK-11 this means we will have to install Java OpenJDK-15.0.2 using the tar.gz or the Debian Packages. In the steps below we will use the tar.gz procedure to install Java. First of all, visit the Oracle Archives page and download the Linux x64 Compressed Archive namely jdk-15.0.2_linux-x64_bin.tar.gz and once you are done follow th following steps https://www.oracle.com/java/technologies/javase/jdk15-archive-downloads.html 

(OR you can run this to download directly to your server:

# sudo wget https://download.oracle.com/otn/java/jdk/15.0.2%2B7/0d1cfde4252546c6931946de8db48ee2/jdk-15.0.2_linux-x64_bin.tar.gz

)

sudo tar -zxvf jdk-15.0.2_linux-x64_bin.tar.gz 
sudo mv jdk-15.0.2  /usr/lib/jvm/ 

# sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-15.0.2/bin/java 1 (if you have more than one Java installations then use the number of current your Java installation)

# sudo update-alternatives --config java

java license agreement

if you have more than 1 versions of Java installed, when you run the last command above you should see a prompt to select the version of Java you want to make the default. Otherwise the commands will not return anything. if you have more than one the example below, you will see something like below 

There are 2 choices for the alternative java (providing /usr/bin/java).

Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 auto mode
1 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 manual mode
2 /usr/lib/jvm/jdk-15.0.2/bin/java 2 manual mode
Press <enter> to keep the current choice[*], or type selection number: 2

In this case we have 3 and we have 0,1 & 2 ) type 2 and press enter

Next, Set the JAVA_HOME like so : 

# export JAVA_HOME=/usr/lib/jvm/jdk-15.0.2
# export PATH=$PATH:$JAVA_HOME/bin

java license agreement

Check you java version like so 

java -version

java version "15.0.2" 2021-01-19
Java(TM) SE Runtime Environment (build 15.0.2+7-27)
Java HotSpot(TM) 64-Bit Server VM (build 15.0.2+7-27, mixed mode, sharing)



Install mysql-server : 

# sudo apt update && sudo apt install mysql-server -y



mysql password

Once the installation is completed, the MySQL service will start automatically. To check whether the MySQL server is running, type:

# sudo systemctl status mysql

Configure the Port and binding address as shown below using sudo nano command
# sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Set the bind address as you wish for example 0.0.0.0 sets it to any IP address across the globe (Strongly not recommended)
By default it comes as 
bind-address 127.0.0.1  ( this a security feature in MySQL 5.7 and above )

Run the security script: for proper configurations 
# sudo mysql_secure_installation

Follow the prompts and configure you installation to the best of your interests

In order to use a password to connect to MySQL as root, you will need to switch its authentication method from auth_socket to mysql_native_password.
To do this, open up the MySQL prompt from your terminal:

# sudo mysql

Next, check which authentication method each of your MySQL user accounts use with the following command:

SELECT user,authentication_string,plugin,host FROM mysql.user;

Output should look like below 
+------------------+------------------------------+-----------------------+-----------+
| user | authentication_string        | plugin          |                 host |
+------------------+------------------------------+-----------------------+-----------+
| root |                                          | auth_socket           | localhost |

Set the password to "mysql"  Please note that this is Bad for security, but just to get all installed and instructions on how to change it will be provided later in this guide)

Setting password use the command below

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mysql'; FLUSH PRIVILEGES;
Comfirm by runnig script below 

SELECT user,authentication_string,plugin,host FROM mysql.user;
Output should look like below 
+------------------+--------------------------------------------------------------+--------------------------------+-----------+
| user | authentication_string                                                        | plugin                             | host      |
+------------------+--------------------------------------------------------------+--------------------------------+-----------+
| root | *3636DACC8616D997782ADD0839F92C1571D6D78F | mysql_native_password | localhost |

 
Eexit sudo mysql and restart mysql service
exit
# sudo service mysql restart


On completion of java installation,one could verify the installed version by & should be 5.7 or above

# mysql --version



Install tomact : 

# sudo wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.72/bin/apache-tomcat-9.0.72.tar.gz
# sudo mv apache-tomcat-9.0.72.tar.gz /usr/share 
# cd /usr/share
# sudo tar xvf apache-tomcat-9.0.72.tar.gz 
# sudo rm -f apache-tomcat-9.0.72.tar.gz 
# sudo mv apache-tomcat-9.0.72 tomcat9 
# cd ~ 



Install nano - text editor 

# sudo apt-get install nano

OPTIONAL (date/time settings) 

Check date:

# date

and if needed update with

# dpkg-reconfigure tzdata 

Step 2 - Tomcat setup

Enabling SSL

To enable tomcat SSL (https), generate and store a key with a key size of 2048 as required for the latest browsers:

sudo keytool -genkey -keyalg RSA -keysize 2048 -alias tomcat -keystore /usr/share/tomcat.keystore

in case you have the error below 

Sudo: keytool: command not found 

run the commands below to install and set the keytool path 

sudo update-alternatives --install /usr/bin/keytool keytool /usr/lib/jvm/jdk-15.0.2/bin/keytool 1
sudo update-alternatives --set keytool /usr/lib/jvm/jdk-15.0.2/bin/keytool

then re-run the command 

# sudo keytool -genkey -keyalg RSA -keysize 2048 -alias tomcat -keystore /usr/share/tomcat.keystore



Updating server.xml configuration file

It is located at /usr/share/tomcat9/conf/server.xml path

# sudo nano /usr/share/tomcat9/conf/server.xml 

copy and replace below content into it

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml"
/>

<Resource
type="javax.sql.DataSource"
name="jdbc/fineract_tenants"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/fineract_tenants"
username="root"
password="mysql"
initialSize="3"
maxActive="15"
maxIdle="6"
minIdle="3"
validationQuery="SELECT 1"
testOnBorrow="true"
testOnReturn="true"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="30000"
minEvictableIdleTimeMillis="60000"
logAbandoned="true"
suspectTimeout="60"
/>
</GlobalNamingResources>
<Service name="Catalina">

<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="443"
maxThreads="200"
scheme="https"
secure="true"
SSLEnabled="true"
keystoreFile="/usr/share/tomcat.keystore"
keystorePass="xyz123"
clientAuth="false"
sslProtocol="TLS"
URIEncoding="UTF-8"
compression="force"
acceptCount="100"
minSpareThreads="25"
maxSpareThreads="75"
enableLookups="false"
disableUploadTimeout="true"
maxHttpHeaderSize="8192"
compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css"/>

<Engine name="Catalina" defaultHost="localhost">

<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".log"
pattern="%h %l %u %t &quot;%r&quot; %s %b" /></Host>
</Engine>
</Service>
</Server>





Download drizzle jdbc connector

Place it under lib folder 

# cd /usr/share/tomcat9/lib

# sudo wget https://repo1.maven.org/maven2/org/drizzle/jdbc/drizzle-jdbc/1.4/drizzle-jdbc-1.4.jar

Download mysql jdbc 8 connector

Download it from https://downloads.mysql.com/archives/c-j/

# wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-8.0.21.tar.gz

Then unzip it

#tar -xvf mysql-connector-java-8.0.21.tar.gz

#rm -r mysql-connector-java-8.0.21.tar.gz

Then place the .jar in the  /usr/share/tomcat9/lib  folder. 

#sudo mv mysql-connector-java-8.0.21/mysql-connector-java-8.0.21.jar /usr/share/tomcat9/lib/

#rm -r mysql-connector-java-8.0.21

The filename above will vary depending on what the latest version of the connector is

use this script for auto starting tomcat after reboot

Edit /etc/init.d/tomcat9

sudo nano /etc/init.d/tomcat9

copy below content into it & exit by pressing ctrl+x then confirm with y for yes. 

Then Execute on Terminal

Link this script to the startup folders with a symbolic link.Execute these two commands.

Finally execute

More Information


Check Status
Manually Stop
Manually Start

Step 3 - Fineract Platform and Database Setup/Population

Download and extract Fineract platform::

# cd /usr/src

# sudo wget https://sourceforge.net/projects/mifos/files/Mifos%20X/mifosplatform-21.07.02.PATCH_RELEASE.zip

sudo unzip mifosplatform-21.07.02.PATCH_RELEASE.zip

# cd mifosplatform-21.07.02.PATCH_RELEASE


Initialize MySQL data 

# mysql -u root -p

Enter mysql root password, and in mysql console type: 

create database `fineract_tenants`;
create database `fineract_default`;
exit 

Step 4 - Access Mifos using 21.07.01 release of the community-app (this is the user-interface)

Folllow the steps here https://github.com/openMF/community-app to build yourself one. Once you are done 

Copy the community app into Tomcat's webapps folder: 

# cd /usr/src/mifosplatform-21.07.02.PATCH_RELEASE

# sudo cp fineract-provider.war /usr/share/tomcat9/webapps/

# sudo cp -r apps/community-app/ /usr/share/tomcat9/webapps/ 

# sudo cp -r api-docs/ /usr/share/tomcat9/webapps/

# cd /usr/share/tomcat9/webapps

# sudo mv ROOT OLDROOT

# sudo mv community-app ROOT

Create a directory for reports (pentahoReports):  – This shall be updated soon in the meantime follow the events here https://github.com/openMF/fineract-pentaho

Follow the steps in https://github.com/openMF/fineract-pentaho#build--use  and after building then

# sudo -i 

# cd /root 

# mkdir  -p  .mifosx/pentahoReports

# cp /usr/src/mifosplatform-21.07.02.PATCH_RELEASE/pentahoReports/* ~/.mifosx/pentahoReports/




Start tomcat:

sudo /etc/init.d/tomcat9 start 

Setup is complete and mifos should be running. 

In case if it throws error ClassNotFoundException org.apache.catalina.core.JasperListener you need to remove the below line from server.xml 

server.xml

OPTIONAL:
*in separate terminal you may watch your Mifos(logs) come to life like this: 

# sudo tail -f /usr/share/tomcat9/logs/catalina.out 

(if all is good, after a while of loading, you should see something like: Root WebApplicationContext: initialization completed in 45876 ms)


Stop tomcat - after the initial launch, you need to stop MifosX so that you can upload the pentaho jars and then start MifosX again:

sudo /etc/init.d/tomcat9 stop

# cd /usr/src/mifosplatform-21.07.02.PATCH_RELEASE

# sudo cp -r pentaholibs/*.*  /usr/share/tomcat9/webapps/fineract-provider/WEB-INF/lib

Start tomcat:

sudo /etc/init.d/tomcat9 start 

Setup is complete with pentaho reports and mifos should be running and can be accessed at @ https://server ip address or if you are using server port number as 8443 then you could access it @ https://localhost:8443