Go & Vue.js - Demo Web Application
This is a simple web application with a Go server/backend and a Vue.js SPA (Single Page Application) frontend.
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 SPA component was created using the Vue CLI and uses Bootstrap-Vue and Font Awesome. In addition Gauge.js is used for the dials in the monitoring view
- The Go component is a Go HTTP server based on the std http package and using gopsutils for monitoring metrics, and Gorilla Mux for routing
Status
Live instances:
Repo Structure
/
├── spa Root of the Vue.js project
│ └── src Vue.js source code
├── deploy Supporting files for Azure deployment etc
│ └── kubernetes Instructions for Kubernetes deployment with Helm
├── server Go backend server
├── build Supporting build scripts and Dockerfile
└── test API / integration tests
Server API
The Go server component performs two tasks
- Serve the Vue.js app to the user. As this is a SPA, this is static content, i.e. HTML, JS & CSS files and any images. Note. The Vue.js app needs to be 'built' before it can be served, this bundles everything up correctly.
- Provide a simple REST API for data to be displayed & rendered by the Vue.js app. This API is very simple currently has three routes:
GET /api/info
- Returns system information and various properties as JSONGET /api/metrics
- Returns monitoring metrics for CPU, memory, disk and network. This data comes from the gopsutils libraryGET /api/weather
- Returns weather data for the location determined automatically from the calling IP address, uses IPStack and DarkSky REST APIs
Building & Running Locally
Pre-reqs
- Be using Linux, WSL or MacOS, with bash, make etc
- Node.js Go 1.16+ - for running locally, linting, running tests etc
- cosmtrek/air - if using
make watch-server
- Docker - for running as a container, or image build and push
- Azure CLI - for deployment to Azure
Clone the project to any directory where you do development work
git clone https://github.com/benc-uk/vuego-demoapp.git
Makefile
A standard GNU Make file is provided to help with running and building locally.
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 BOTH components locally using Vue CLI and Go server backend
watch-server 👀 Run API server with hot reload file watcher, needs cosmtrek/air
watch-spa 👀 Run frontend SPA with hot reload file watcher
deploy 🚀 Deploy to Azure Web App
undeploy 💀 Remove from Azure
test 🎯 Unit tests for server and frontend
test-report 🎯 Unit tests for server and frontend (with report output)
test-snapshot 📷 Update snapshots for frontend tests
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/vuego-demoapp |
IMAGE_TAG | latest |
AZURE_RES_GROUP | temp-demoapps |
AZURE_REGION | uksouth |
AZURE_SITE_NAME | nodeapp-{git-sha} |
- The server will listen on port 4000 by default, change this by setting the environmental variable
PORT
- The server will ry to serve static content (i.e. bundled SPA frontend) from the same directory as the server binary, change this by setting the environmental variable
CONTENT_DIR
- The SPA frontend will use
/api
as the API endpoint, when working locallyVUE_APP_API_ENDPOINT
is set and overrides this to behttp://localhost:4000/api
Containers
Public container image is available on GitHub Container Registry
Run in a container with:
docker run --rm -it -p 4000:4000 ghcr.io/benc-uk/vuego-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
Running in Azure App Service (Linux)
If you want to deploy to an Azure Web App as a container (aka Linux Web App), a Bicep template is provided in the deploy directory
For a super quick deployment, use make deploy
which will deploy to a resource group, temp-demoapps and use the git ref to create a unique site name
make deploy
Config
Environmental variables
WEATHER_API_KEY
- Enable the weather feature with a DarkSky API keyIPSTACK_API_KEY
- Enable the weather feature with a IPStack API keyPORT
- Port to listen on (default:4000
)CONTENT_DIR
- Directory to serve static content from (default:.
)AUTH_CLIENT_ID
- Set to a Azure AD registered app if you wish to enable the optional user sign-in feature
Optional User Sign-In Feature
The application can be configured with an optional user sign-in feature which uses Azure Active Directory as an identity platform. This uses wrapper & helper libraries from https://github.com/benc-uk/msal-graph-vue
If you wish to enable this, carry out the following steps:
- Register an application with Azure AD, see these steps
- Set the environmental variable
AUTH_CLIENT_ID
on the Go server, with the value of the client id. This can be done in the.env
file if working locally. - Optional when testing/debugging the Vue.js SPA without the Go server, you can place the client-id in
.env.development
under the valueVUE_APP_AUTH_CLIENT_ID
GitHub Actions CI/CD
A working set of CI and CD release GitHub Actions workflows are provided .github/workflows/
, automated builds are run in GitHub hosted runners
GitHub Actions
Updates
When | What |
---|---|
Mar 2021 | Auth using MSAL.js v2 added |
Mar 2021 | Refresh, makefile, more tests |
Nov 2020 | New pipelines & code/ API robustness |
Dec 2019 | Github Actions and AKS |
Sept 2019 | New release pipelines and config moved to env vars |
Sept 2018 | Updated with weather API and weather view |
July 2018 | Updated Vue CLI config & moved to Golang 1.11 |
April 2018 | Project created |