Skip to content

GitHub leaderboard for your organisation or repo (Serverless SPA)

License

Notifications You must be signed in to change notification settings

openfaas-incubator/leaderboard-app

 
 

Repository files navigation

leaderboard-app - a serverless application

OpenFaaS

This application is an example of how to write a Single Page App (SPA) with a Serverless approach. It provides a live leaderboard for your GitHub organisation or repos showing comments made and issues opened by your community and contributors.

  • The front-end is written with Vue.js
  • The backing data-store data is Postgres with a remote DBaaS or in-cluster deployment

See a live example tracking the openfaas/openfaas-incubator organizations: https://alexellis.o6s.io/leaderboard-page

To test out the functionality comment on this issue: Issue: Let's test the leaderboard!

Here's a preview of the app when the dark theme is enabled:

Dark Leaderboard example

Subscribe to events by adding a webhook to the github-sub function:

Subscribe

Blog post / tutorial

Read all the details here on how to build a portable Serverless Single Page App for any cloud:

See also: Blog: How to build a Serverless Single Page App

Functions

  • github-sub

Receives webhooks from GitHub via an organization or repo subscription. Secured with HMAC by Alex Ellis

  • leaderboard

Retrieves the current leaderboard in JSON by Alex Ellis

  • leaderboard-page

Renders the leaderboard itself as a Vue.js app by Ken Fukuyama

Schema

Secrets

You can seal your secrets for use with OpenFaaS Cloud:

faas-cli cloud seal \
  --name teamserverless-leaderboard-app-secrets \
  --literal=password="$PASS" \
  --literal=username="$USER" \
  --literal=host="$HOST" \
  --literal=webhook-secret="${WEBHOOK}"

Running locally

  • Deploy OpenFaaS

The quickest/easiest option is to use Swarm.

  • Grab custom templates
faas-cli template store pull node8-express
faas-cli template store pull golang-middlware
  • Create the required secrets
export PASS=""
export USER=""
export HOST=""
export WEBHOOK="secret"   # As set on the webhook page on GitHub

# Kubernetes
faas-cli secret create leaderboard-app-secrets-password \
  --from-literal=password="$PASS" \
  --from-literal=username="$USER" \
  --from-literal=host="$HOST" \
  --from-literal=webhook-secret="${WEBHOOK}"

# Swarm

faas-cli secret create password --from-literal="$PASS"
faas-cli secret create username --from-literal="$USER"
faas-cli secret create host --from-literal="$HOST"
faas-cli secret create webhook-secret --from-literal="${WEBHOOK}"

# Then apply each secret to the required function in local.yml
  • Rename the stack.yml to local.yml

Edit local.yml and rename the functions:

leaderboard => alexellis-leaderboard
github-sub => alexellis-github-sub
leaderboard-page => alexellis-leaderboard-page

Then add a prefix for each function's Docker image name and run faas-cli build -f local.yml

  • Deploy of-router:

Via: https://github.com/openfaas/openfaas-cloud/tree/master/router

Deploy a fake auth function:

faas-cli store deploy figlet

Deploy the router:

TAG=0.6.0
docker service rm of-router

docker service create --network=func_functions \
 --env upstream_url=http://gateway:8080 \
 --env auth_url=http://figlet:8080 \
 --publish 8081:8080 \
 --name of-router \
 -d openfaas/cloud-router:$TAG
  • Create entries in: /etc/hosts
127.0.0.1 alexellis.local-o6s.io
  • Initialize Postgres

Provision Postgres 10 and set up your initial table schema and function:

export CONNECTION_STRING=""
docker run -ti postgres:10 psql ${CONNECTION_STRING}

Copy/paste from schema-1.0.sql

  • Test the JSON function:

http://127.0.0.1:8080/function/alexellis-leaderboard

  • Test the Vue.js page:

http://alexellis.local-o6s.io:8081/leaderboard-page

Contributing & license

Please feel free to fork and star this repo and use it as a template for your own applications. The license is MIT.

To contribute see CONTRIBUTING.md

About

GitHub leaderboard for your organisation or repo (Serverless SPA)

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Go 43.5%
  • PLpgSQL 18.5%
  • Vue 16.7%
  • JavaScript 15.9%
  • HTML 5.4%