Skip to content
/ Ares Public

Multi container application using i.e. Docker, Nginx, Kubernetes, React, Nodejs, GraphQL e.g

Notifications You must be signed in to change notification settings

HakimiX/Ares

Repository files navigation

Ares

Multi container application consisting of mulitple microservices and data sources.

Technologies: Docker, Kubernetes, Helm, Nginx, React, Nodejs, Express, Graphql, Postgres, MongoDB, Elasticsearch, Logstash, Kibana, Jenkins, and Google Cloud,

Overview

Components

Nginx

The nginx web server accepts requests from a client, forwards the request to a server that can fullfill it, and returns the response from the server to the client.

# Client running on
http://localhost:8888

# Upstream person-server
http://localhost:8888/api/person/all

# Upstream address-server
http://localhost:8888/api/address/all

# Upstream company-server 
http://localhost:8888/api/company/all

address-server

Express Server that fetches addresses from the MongoDB database.

# Running on 
http://localhost:5007

# Endpoints
/address/all
/address/:id

person-server

Express Server that fetches persons from the Postgres database.

# Running on 
http://localhost:5005

# Endpoints
/person/all
/person/:id

company-server

Express Server that fetches companies from Elasticsearch.

# Running on 
http://localhost:5008

# Endpoints
/company/all
/company/:id

posts-server

Apollo Server that fetches data from an external API and exposes the data in a GraphQL API.

# Running on 
http://localhost:5009

# Sample request
curl --request POST \
  --header 'content-type: application/json' \
  --url http://localhost:5009/graphql \
  --data '{"query":"query { __typename }"}'

pour-server

Express Server that fetches data from an external API and populates pieces of that data into three different data sources (MongoDB, Postgres and Elasticsearch).

# Running on 
http://localhost:5006

# Endpoints
/pour/all       # populates all data sources
/pour/address   # populates MongoDB
/pour/person    # populates Postgres
/pour/company   # populates Elasticsearch

Elasticsearch

Elasticsearch is used to store, search, and manage data for the company-server (express server).

Obtaining Elasticsearch for Docker is as simply as issuing a docker pull command against the Elastic Docker registry:

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.2

Docker Compose is used to start a multi-node Elasticsearch cluster in Docker. This configuration provides a simple method of starting a secured cluster for development before building a distributed deployment with multiple hosts.

Communication with Elasticsearch is done through the Index API's which are used to manage individual indices, index settings, aliases, mappings, and index templates.

# Container running 
http://localhost:9200

# Create index
PUT /<index>

# Get index
GET /<target>

# Delete index
DELETE /<index>

Elasticsearch provides a full Query DSL (Domain Specific Language) based on JSON to define queries.

Logstash

Logstash is a service-side data processing pipeline that ingests data and persists it in Elasticsearch.

Run the following script in order to run Logstash with Docker Compose for local development

# Creates a 'logstash/query' directory in 'tmp' with read/write permissions 
./scripts/fix-logstash.sh

Postgres

Access the Postgres CLI inside the container:

# Enter container
docker exec -it postgres /bin/sh

# Postgres CLI
psql --username postgres 

# Commands
$ \c <dbname>   # switch connection to new database
$ \l            # list databases
$ \dt           # list table
$ \d+ <table>   # describe table

MongoDB

Local Development

Dockerfile

# Build image 
docker build -t person-server  -f ./person-server/Dockerfile.dev ./person-server

# Run container
docker run -p 5005:5005 person-server

Docker Compose

# Start containers
docker-compose up

# Stop containers 
docker-compose down

Deploy Kubernetes Manifests to Minikube

The local Jenkins server is integrated with a local Kubernetes Cluster (Minikube) and Google Cloud.

CI/CD

Jenkins

Continuous Integration and Continuous Delivery using a local Jenkins server running on Kubernetes using Minikube. The Jenkins documentation is located here.

Deployment

Kubernetes

Todo...

Deploy Kubernetes resources using a Helm Chart:

npm run helm:deploy

Accessing services (ClusterIP)

kubectl port-forward service/person-server-service 5005:5005

# Navigate to 
http://localhost:5005

Google Cloud

TODO...

Source

About

Multi container application using i.e. Docker, Nginx, Kubernetes, React, Nodejs, GraphQL e.g

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published