Giter Club home page Giter Club logo

nodejs-demoapp's Introduction

Node.js - Demo Web Application

This is a simple Node.js web app using the Express framework and EJS templates.

The app has been designed with cloud native demos & containers in mind, in order to provide a real working application for deployment, something more than "hello-world" but with the minimum of pre-reqs. It is not intended as a complete example of a fully functioning architecture or complex software design.

Typical uses would be deployment to Kubernetes, demos of Docker, CI/CD (build pipelines are provided), deployment to cloud (Azure) monitoring, auto-scaling

The app has several basic pages accessed from the top navigation menu, some of which are only lit up when certain configuration variables are set (see 'Optional Features' below):

  • 'Info' - Will show system & runtime information, and will also display if the app is running from within a Docker container and Kubernetes.
  • 'Tools' - Some tools useful in demos, such a forcing CPU load (for autoscale demos), and error/exception pages for use with App Insights or other monitoring tool.
  • 'Monitor' - Display realtime monitoring data, showing memory usage/total and process CPU load.
  • 'Weather' - (Optional) Gets the location of the client page (with HTML5 Geolocation). The resulting location is used to fetch weather data from the OpenWeather API
  • 'Todo' - (Optional) This is a small todo/task-list app which uses MongoDB as a database.
  • 'User Account' - (Optional) When configured with Azure AD (application client id) user login button will be enabled, and an user-account details page enabled, which calls the Microsoft Graph API

screen screen screen

Status

Live instance:

Running and Testing Locally

Pre-reqs

  • Be using Linux, WSL or MacOS, with bash, make etc
  • Node.js - for running locally, linting, running tests etc
  • Docker - for running as a container, or building images
  • Azure CLI - for deployment to Azure

Clone the project to any directory where you do development work

git clone https://github.com/benc-uk/nodejs-demoapp.git

Makefile

A standard GNU Make file is provided to help with running and building locally.

$ make

help                 ๐Ÿ’ฌ This help message
lint                 ๐Ÿ”Ž Lint & format, will not fix but sets exit code on error
lint-fix             ๐Ÿ“œ Lint & format, will try to fix errors and modify code
image                ๐Ÿ”จ Build container image from Dockerfile
push                 ๐Ÿ“ค Push container image to registry
run                  ๐Ÿƒ Run locally using Node.js
deploy               ๐Ÿš€ Deploy to Azure Container App
undeploy             ๐Ÿ’€ Remove from Azure
test                 ๐ŸŽฏ Unit tests with Jest
test-report          ๐Ÿคก Unit tests with Jest & Junit output
test-api             ๐Ÿšฆ Run integration API tests, server must be running
clean                ๐Ÿงน Clean up project

Make file variables and default values, pass these in when calling make, e.g. make image IMAGE_REPO=blah/foo

Makefile Variable Default
IMAGE_REG ghcr.io
IMAGE_REPO benc-uk/nodejs-demoapp
IMAGE_TAG latest
AZURE_RES_GROUP demoapps
AZURE_REGION northeurope

Web app will be listening on the standard Express port of 3000, but this can be changed by setting the PORT environmental variable.

Containers

Public container image is available on GitHub Container Registry.

Run in a container with:

docker run --rm -it -p 3000:3000 ghcr.io/benc-uk/nodejs-demoapp:latest

Should you want to build your own container, use make image and the above variables to customise the name & tag.

Kubernetes

The app can easily be deployed to Kubernetes using Helm, see deploy/kubernetes/readme.md for details

GitHub Actions CI/CD

A set of GitHub Actions workflows are included for CI / CD. Automated builds for PRs are run in GitHub hosted runners validating the code (linting and tests) and building dev images. When code is merged into master, then automated deployment to AKS is done using Helm.

Optional Features

The app will start up and run with zero configuration, however the only features that will be available will be the INFO and TOOLS views. The following optional features can be enabled:

Application Insights

Enable this by setting APPLICATIONINSIGHTS_CONNECTION_STRING

The app has been instrumented with the Application Insights SDK, it will however need to be configured to point to your App Insights instance/workspace. All requests will be tracked, as well as dependant calls to MongoDB or other APIs (if configured), exceptions & error will also be logged

This article has more information on monitoring Node.js with App Insights

Weather Details

Enable this by setting WEATHER_API_KEY

This will require a API key from OpenWeather, you can sign up for free and get one here. The page uses a browser API for geolocation to fetch the user's location.
However, the geolocation.getCurrentPosition() browser API will only work when the site is served via HTTPS or from localhost. As a fallback, weather for London, UK will be show if the current position can not be obtained

User Authentication with Azure AD

Enable this by setting AAD_APP_ID

This uses Microsoft Authentication Library (MSAL) for Node to authenticate via MSAL with OIDC and OAuth 2.0. The flow it uses is the "Authorization Code Grant (PKCE)", which means we can sign in users without needing client secrets

In addition the user account page shows details & photo retrieved from the Microsoft Graph API

You will need to register an app in your Azure AD tenant. The app should be configured for the PKCE flow, if creating the app via the portal select Public client/native (mobile & desktop) (ignore the fact this doesn't seem the right option for a web app)

When configuring authentication the redirect URL will be the host where the app is running with /signin as the URL path, e.g. https://myapp.azurewebsites.net/signin, for local testing use http://localhost:3000/signin

For the signin audience select Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)

To simplify the registration, the Azure CLI can be used with the following bash snippet:

baseUrl="http://localhost:3000"
name="NodeJS Demo"
# Create app registration and get client ID
clientId=$(az ad app create \
--public-client-redirect-uris "$baseUrl/signin" \
--display-name "$name" \
--sign-in-audience AzureADandPersonalMicrosoftAccount \
--query appId -o tsv)
# Create a service principal for the application
az ad sp create --id $clientId -o json
echo -e "\n### Set env var AAD_APP_ID to '$clientId'"

Todo App

Enable this by setting TODO_MONGO_CONNSTR

A mini todo & task tracking app can be enabled if a MongoDB backend is provided and a connection string to access it. This feature is primarily to show database dependency detection and tracking in App Insights

The default database name is todoDb but you can change this by setting TODO_MONGO_DB

You can stand up MongoDB in a container instance or in Cosmos DB (using the Mongo API). Note. When using Cosmos DB and the per database provisioned RU/s option, you must manually create the collection called todos in the relevant database and set the shard key to _id

Configuration

The following configuration environmental variables are supported, however none are mandatory. These can be set directly or when running locally will be picked up from an .env file if it is present. A sample .env file called .env.sample is provided for you to copy

If running in an Azure Web App, all of these values can be injected as application settings in Azure.

Environmental Variable Default Description
PORT 3000 Port the server will listen on
TODO_MONGO_CONNSTR none Connect to specified MongoDB instance, when set the todo feature will be enabled
TODO_MONGO_DB todoDb Name of the database in MongoDB to use (optional)
APPINSIGHTS_CONNECTION_STRING none Enable AZure Application Insights monitoring
WEATHER_API_KEY none OpenWeather API key. Info here
AAD_APP_ID none Client ID of app registered in Azure AD
DISABLE_METRICS none Set to truthy value if you want to switch off Prometheus metrics
REDIS_SESSION_HOST none Point to a Redis host to hold/persist session cache

Deployment

See deployment folder for deploying into Kubernetes with Helm or into Azure with Bicep and Container Apps.

Updates

  • Oct 2022 - Update App Insights, track custom events
  • Sept 2022 - Add Prometheus metrics
  • Aug 2022 - Switch to PKCE for auth & login flow
  • Nov 2021 - Replace DarkSky API with OpenWeather
  • Mar 2021 - Refresh packages and added make + bicep
  • Nov 2020 - Switched to MSAL-Node library for authentication
  • Oct 2020 - Added GitHub Actions pipelines and Bicep IaC
  • Jan 2020 - Added monitor page and API
  • Jun 2019 - Added Azure AD login and profile page, cleaned up Todo app MongoDB code
  • Apr 2019 - Updated to latest App Insights SDK package, and moved to Bootstrap 4
  • Dec 2018 - Modified weather to use client browser location, rather than use IP
  • Jul 2018 - Switched todo app over to MongoDB, fixed weather
  • Feb 2018 - Updated App Insights monitoring
  • Nov 2017 - Update to use Node 8.9
  • Oct 2017 - Updated App Insights, improved Dockerfile
  • Sept 2017 - Added weather page
  • Sept 2017 - Major revamp. Switched to EJS, added Bootstrap and App Insights
  • Aug 2017 - Minor changes and fixes for CRLF stuff
  • July 2017 - Updated Dockerfile to use super tiny Alpine Node 6 image
  • June 2017 - Moved repo to Github

nodejs-demoapp's People

Contributors

benc-uk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

nodejs-demoapp's Issues

Installation of sample app with helm not working

Hi,

I am following this guide to run the application is kubernetes environment.
https://github.com/benc-uk/nodejs-demoapp/blob/master/deploy/kubernetes/readme.md

But facing the following error:

$ helm repo list
NAME    URL
benc-uk https://benc-uk.github.io/helm-charts


sudo helm install demo benc-uk/webapp --values myapp.yaml
Error: INSTALLATION FAILED: failed to download "benc-uk/webapp"

Any help would be really appreciated.

Secondly, if i don't want to use helm charts, what's the alternate way to run this application in k8s?

Looking forward to hear from you.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.