From 4d7590698f5a091771e28e162700113d6c5c63c1 Mon Sep 17 00:00:00 2001 From: Ben Coleman Date: Tue, 9 Nov 2021 00:02:45 +0000 Subject: [PATCH] Patch release (#21) --- README.md | 2 +- build/Dockerfile | 2 +- src/package-lock.json | 81 +++++++++++++------------------- src/package.json | 2 +- src/public/images/container.png | Bin 0 -> 34586 bytes src/routes/pages.js | 21 +++++++-- src/views/index.ejs | 8 ++-- src/views/info.ejs | 58 ++++++++++------------- 8 files changed, 82 insertions(+), 92 deletions(-) create mode 100644 src/public/images/container.png diff --git a/README.md b/README.md index 5c2b9c6..b237708 100644 --- a/README.md +++ b/README.md @@ -160,7 +160,7 @@ If running in an Azure Web App, all of these values can be injected as applicati | TODO_MONGO_CONNSTR | _none_ | Connect to specified MongoDB instance, when set the Todo feature will be enabled in the menu bar | | TODO_MONGO_DB | todoDb | Name of the database in MongoDB to use (optional) | | APPINSIGHTS_INSTRUMENTATIONKEY | _none_ | Enable Application Insights monitoring | -| WEATHER_API_KEY | _none_ | DarkSky weather API key. [Info here](https://openweathermap.org/api) | +| WEATHER_API_KEY | _none_ | OpenWeather API key. [Info here](https://openweathermap.org/api) | | AAD_APP_ID | _none_ | Application ID of app registered in Azure AD | | AAD_APP_SECRET | _none_ | Secret / password of app registered in Azure AD | | AAD_REDIRECT_URL_BASE | _none_ | Hostname/domain where app is running | diff --git a/build/Dockerfile b/build/Dockerfile index bb95c2d..7b0e1f4 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -2,7 +2,7 @@ ARG ARCH= ARG IMAGE_BASE=14-alpine FROM ${ARCH}node:$IMAGE_BASE -LABEL Name="Node.js Demo App" Version=4.8.0 +LABEL Name="Node.js Demo App" Version=4.8.1 LABEL org.opencontainers.image.source = "https://github.com/benc-uk/nodejs-demoapp" ENV NODE_ENV production WORKDIR /app diff --git a/src/package-lock.json b/src/package-lock.json index f5ca379..1171863 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -1,12 +1,12 @@ { "name": "nodejs-demoapp", - "version": "4.8.0", + "version": "4.8.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "nodejs-demoapp", - "version": "4.8.0", + "version": "4.8.1", "license": "MIT", "dependencies": { "@azure/msal-node": "^1.3.3", @@ -318,9 +318,9 @@ } }, "node_modules/@types/node": { - "version": "16.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", - "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==" + "version": "16.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", + "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==" }, "node_modules/@types/node-fetch": { "version": "2.5.12", @@ -2048,15 +2048,6 @@ "node": ">=12" } }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2925,15 +2916,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/jsonwebtoken": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", @@ -5047,6 +5029,14 @@ "node": ">=6" } }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/tr46": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", @@ -5171,11 +5161,12 @@ } }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" } }, "node_modules/unpipe": { @@ -5749,9 +5740,9 @@ } }, "@types/node": { - "version": "16.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.6.tgz", - "integrity": "sha512-ua7PgUoeQFjmWPcoo9khiPum3Pd60k4/2ZGXt18sm2Slk0W0xZTqt5Y0Ny1NyBiN1EVQ/+FaF9NcY4Qe6rwk5w==" + "version": "16.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", + "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==" }, "@types/node-fetch": { "version": "2.5.12", @@ -7084,14 +7075,6 @@ "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } } }, "fs.realpath": { @@ -7739,14 +7722,6 @@ "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" - }, - "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } } }, "jsonwebtoken": { @@ -9406,6 +9381,13 @@ "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.1.2" + }, + "dependencies": { + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + } } }, "tr46": { @@ -9502,9 +9484,10 @@ } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true }, "unpipe": { "version": "1.0.0", diff --git a/src/package.json b/src/package.json index 295adbb..2364457 100644 --- a/src/package.json +++ b/src/package.json @@ -1,7 +1,7 @@ { "name": "nodejs-demoapp", "description": "Node.js Express app for demos", - "version": "4.8.0", + "version": "4.8.1", "author": "Ben Coleman", "engines": { "node": ">=14.0.0" diff --git a/src/public/images/container.png b/src/public/images/container.png new file mode 100644 index 0000000000000000000000000000000000000000..51426341c94054651a731c056af7eda4389df18b GIT binary patch literal 34586 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
  • System status / information view
  • App Insights support
  • -
  • Geolocated weather info (from DarkSky API)
  • +
  • Geolocated weather info (from OpenWeather API)
  • Tools for triggering errors and high CPU load
  • Mini todo app using MongoDB data store
  • Support for user authentication with Azure AD
  • @@ -23,9 +23,9 @@ Project on Github             -   - Docker images - on Dockerhub +   + Container Images + on GitHub

    diff --git a/src/views/info.ejs b/src/views/info.ejs index acb8874..b37b674 100644 --- a/src/views/info.ejs +++ b/src/views/info.ejs @@ -3,34 +3,32 @@
      System Runtime Information
    - - - - <% if (isDocker) { %> - + + <% if (isContainer) { %> + <% } else { %> - + <% } %> - + <% if (isKube) { %> - + <% } else { %> - + <% } %> - + <% if (process.env.APPINSIGHTS_INSTRUMENTATIONKEY) { %> - + <% } else { %> <% } %> @@ -38,75 +36,69 @@ - + - + - + - + - + - + - + <% if (process.env.RELEASE_INFO) { %> - + - + <% } %>
    ContainerizedLooks like we're running in a Docker container! 😁 ContainerizedLooks like we're running in a container! 😁Not running as a Docker container 😢 Not running as a container 😢
    KubernetesKubernetesWe're also running in a Kubernetes pod! 😃 We're also running in a Kubernetes pod! 😃Not running in Kubernetes 😢 Not running in Kubernetes 😢
      App InsightsApp InsightsReporting data to App Insights, nice job! Reporting data to App Insights, nice job!Not reporting data to App Insights
    HostnameHostname <%= info.hostname %>
    System UptimeSystem Uptime <%= info.uptime %>
    OS VersionOS Version <%= info.type %> - <%= info.release %>
    ArchitectureArchitecture <%= info.arch %>
    ProcessorsProcessors <%= info.cpus.length%> × <%= info.cpus[0].model %>
    MemoryMemory <%= info.mem %> MB
    Node VersionNode Version <%= info.nodever %>
    Release InfoRelease Info <%= process.env.RELEASE_INFO %>
    -
    -
    +
      Server Environmental Variables
    -
    - <% for(let envVar in process.env) { %> - <% if (envVar.toUpperCase().includes('SECRET')) continue %> - <% if (envVar.toUpperCase().includes('PWD')) continue %> - <% if (envVar.toUpperCase().includes('PASSWORD')) continue %> - <% if (envVar.toUpperCase().includes('KEY')) continue %> - <% if (envVar.toUpperCase().includes('PATH')) continue %> - <% if (envVar.toUpperCase().includes('NPM_')) continue %> + <% for(let envVar in process.env) { %> <% if (envVar.toUpperCase().includes('SECRET')) continue %> <% if + (envVar.toUpperCase().includes('PWD')) continue %> <% if (envVar.toUpperCase().includes('PASSWORD')) continue %> + <% if (envVar.toUpperCase().includes('KEY')) continue %> <% if (envVar.toUpperCase().includes('PATH')) continue + %> <% if (envVar.toUpperCase().includes('NPM_')) continue %> - + <% } %>
    <%= envVar %> <%= envVar %> <%= process.env[envVar] %>
    -
    -<%- include('_foot.ejs') %> \ No newline at end of file +<%- include('_foot.ejs') %>