πŸ“Œ Overview

We are transitioning from a monolithic WildFly-based deployment to a lightweight, modular deployment architecture using Nginx as the reverse proxy and systemd for service management.
This improves maintainability, scalability, and deployment speed while reducing complexity.



βœ… Key Changes

Old Setup (WildFly)New Setup (Lightweight)
WAR files deployed to WildFlyJAR/WAR files run via java -jar and managed via systemd
Static content served via WAR filesUI bundles served via Nginx from local folders
Domain/SSL managed via WildFlySSL and routing managed by Nginx
All services are tightly coupled in a single deploymentIndependently deployed microservices
Slow deployment times (~10 mins for 20 WARs)Fast and parallel deployments via pipelines

πŸ“¦ API Services: New Approach


🌐 Nginx: Reverse Proxy + Static UI Hosting


πŸ› οΈ CI/CD Pipeline: Modified Workflow

Backend Services

  1. Build Spring Boot JARs

  2. Rsync to /opt/services/service-name.jar

  3. Restart via:

    sudo systemctl restart service-name
    

Frontend Apps

  1. Build UI (ng build --prod)

  2. Rsync dist/* to /var/www/html/


🎯 Benefits of the New Architecture

CategoryBenefit
🧠 SimplicityNo application server; clean Nginx + systemd setup
⚑ SpeedFaster builds, deployment, and startup
🧩 ModularityEach microservice deploys and logs independently
πŸͺ™ Cost-EffectiveLower resource usage without WildFly overhead
πŸ” SecurityNginx SSL + better process isolation
πŸ“ˆ ObservabilityEasier monitoring via systemctl and journalctl

πŸ”§ Additional Recommendations


πŸ“… Migration Plan

TaskDeadline
Merge all Docker-related PRs
Update CI/CD pipeline for backend
Setup Linux server - Java 17LTS, Redis
Update CI-CD pipeline to deploy and rsync all UI repos
Setup nginx and SSL with domain routing
https://amritdemo.piramalswasthya.org/

Deploy all API microservices
Create systemd units for all microservices
Configure Nginx reverse proxy and SSL
Update CI/CD pipeline for restarts
Documentation for replication of the setup
Ensure ELK stack has all the logs tracked



πŸ”§ Server Setup

βœ… 1. Initial Server Setup

Update & Upgrade

sudo apt update && sudo apt upgrade -y

Add Jenkins SSH public key for Jenkins to communicate with the server.

cat /var/lib/jenkins/.ssh/id_rsa.pub



βœ… 2. Install Java (for Spring Boot)

sudo apt install openjdk-17-jdk -y
java -version  # confirm it's installed

Spring Boot 2.5+ works best with Java 17.


βœ… 3. Create a Directory Structure

sudo mkdir -p /opt/services
sudo mkdir -p /var/www/html
sudo chown -R $USER:$USER /opt/services /var/www/html

βœ… 4. Install Nginx

sudo apt install nginx -y
sudo systemctl enable nginx
sudo systemctl start nginx


βœ… 5. Configure Nginx for API & UI

sudo nano /etc/nginx/sites-available/your-app

Example Config:

server {
    listen 80;
    server_name yourdomain.com;

    root /var/www/your-ui-app;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /api/user/ {
        proxy_pass http://localhost:8081/;
    }

    location /api/order/ {
        proxy_pass http://localhost:8082/;
    }

    # Add more services as needed
}

Enable Site & Restart

sudo ln -s /etc/nginx/sites-available/your-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

βœ… 6. Install MySQL

Step 1: Install MySQL Server

sudo apt update
sudo apt install mysql-server -y

Step 2: Secure MySQL Installation

sudo mysql_secure_installation

Step 3: Create a Database and User (Example)

sudo mysql -u root -p

-- Create Databases
CREATE DATABASE db_iemr;
CREATE DATABASE db_identity;
CREATE DATABASE db_1097_identity;
CREATE DATABASE db_reporting;


-- Create User
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'NewSecureP@ss123!';


-- Grant Privileges
GRANT ALL PRIVILEGES ON db_iemr.* TO 'app_user'@'localhost';
GRANT ALL PRIVILEGES ON db_identity.* TO 'app_user'@'localhost';
GRANT ALL PRIVILEGES ON db_1097_identity.* TO 'app_user'@'localhost';
GRANT ALL PRIVILEGES ON db_reporting.* TO 'app_user'@'localhost';
GRANT SUPER ON *.* TO 'app_user'@'localhost';


-- Apply Changes
FLUSH PRIVILEGES;
EXIT;



sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

At the bottom (or under [mysqld]), add:

[mysqld]

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

lower_case_table_names=1

character-set-server=utf8mb4

collation-server=utf8mb4_unicode_ci


sudo nano /etc/mysql/my.cnf

If these sections aren’t already there, add:

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4



Ref:

https://askubuntu.com/questions/1261422/how-to-install-mysql-8-0-with-lower-case-table-names-1-on-ubuntu-server-20-04-lt



βœ… 7.Β Install Redis

sudo apt-get install lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
sudo chmod 644 /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt-get update
sudo apt-get install redis
Ref: https://redis.io/docs/latest/operate/oss_and_stack/install/archive/install-redis/install-redis-on-linux/


sudo systemctl enable redis-server sudo systemctl start redis-server





βœ… 8.Β Setup MySQL tables

Install maven

sudo apt install maven

git clone https://github.com/PSMRI/AMRIT-DB.git
cd AMRIT-DB

mvn clean install -DENV_VAR=local

mvn spring-boot:run -DENV_VAR=local

Restore DB.





βœ… 9.Β Deploy Spring Boot Services

Allow sudo

sudo visudo

Add this line at the end of the file:

dev_user ALL=NOPASSWD: /bin/systemctl


Example: User Service

cp user-service.jar /opt/services/

Create systemd service file

sudo nano /etc/systemd/system/user-service.service
[Unit]
Description=User Service
After=network.target

[Service]
User=ubuntu
ExecStart=/usr/bin/java -jar /opt/services/user-service.jar
SuccessExitStatus=143
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start user-service
sudo systemctl enable user-service

Repeat for other services.



βœ… 10.Setting up ELK

Add Elastic repo:

curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update


wget https://search.maven.org/remotecontent?filepath=co/elastic/apm/elastic-apm-agent/1.48.0/elastic-apm-agent-1.48.0.jar -O elastic-apm-agent.jar
sudo mv elastic-apm-agent.jar /opt/amrit/services/


This assumes that the APM server is already running on http://192.168.45.179:8200

Use Filebeat to Ship Logs from systemd Services


sudo apt update
sudo apt install filebeat

Edit the config file:

sudo nano /etc/filebeat/filebeat.yml

Edit it as per ELK configuration.


Step 3: Enable and Start Filebeat



πŸ“Š Verify in Kibana



βœ… 11. Setting up OpenKM


Step 1: Install Docker on Ubuntu

πŸ”Ή 1. Update your system:

sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

πŸ”Ή 2. Add Docker’s official GPG key:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

πŸ”Ή 3. Add the Docker repo:

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

πŸ”Ή 4. Install Docker:

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

πŸ”Ή 5. Add your user to the docker group (optional):

sudo usermod -aG docker $USER
# Log out and back in for this to take effect

βœ… Step 2: Run OpenKM via Docker


πŸ”Ή 1. Pull the Docker image:

docker pull openkm/openkm-ce

πŸ”Ή 2. Run OpenKM container:

docker run -d \
  --name openkm \
  -p 8080:8080 \
  -v openkm_data:/opt/openkm/repository \
  -v openkm_index:/opt/openkm/index \
  openkm/openkm-ce

This will:


βœ… Step 3: Access OpenKM

Open your browser and go to:

http://localhost:8080/OpenKM