Skip to content

πŸ”¨ A full-stack real-time auction website built using a microservices architecture

License

Notifications You must be signed in to change notification settings

Scytalelabs-official/auction-website

Β 
Β 

A Full Stack Auction Website

Tech logos

πŸ“ Table of contents

✨ Features

  • Real-time bidding on auction listings between users using Socket.IO
  • Server-Side Rendering using React and Next.js
  • Styled frontend using Tailwind CSS with Emotion Styled Components
  • Automated testing suites for each microservice
  • Handles payments using the Stripe API
  • Shares common code among services using a custom npm package

πŸ›οΈ Architecture

Diagram

Overview of services

Service Technologies Description
Auth TypeScript, MySQL Handles user regristration, logging in, signing out and resetting users passwords
Bids TypeScript, MySQL Handles users placing bids on auction listings and allows for real-time bidding using Socket.io
Email TypeScript Allows other services to send emails to users by publishing EmailCreated events
Expiration TypeScript, Redis Expires auction listings once they have ran out of time remaining on the listing
Frontend TypeScript, React, Next.js Handles serving the website to the user utilizing Server Side Rendering using React with Next.js
Listings TypeScript, MySQL Allows users to create and delete auction listings
Payments TypeScript, MySQL Allows users to pay for auction listings they have won
Profile TypeScript, MySQL Allows users to get a users profile or update their own

πŸ“Έ Screenshots

desktop-listings-page desktop-listing-page desktop-dashboard-page desktop-settings-page

πŸ’» Technologies

Back-end

  • Node.js - Runtime environment for JS
  • Express.js - Node.js framework, makes process of building APIs easier & faster
  • MySQL - An open-source relational database management system
  • Sequelize - A promise-based Node.js ORM for Postgres, MySQL, MariaDB, SQLite and Microsoft SQL Server
  • Cloudinary - For image uploading and manipulation
  • Docker - A platform for developing, shippinh and running applications
  • Kubernetes - An open-source system for automating deployment, scaling, and management of containerized applications
  • Ingress NGINX - NGINX Ingress Controller for Kubernetes
  • Skaffold - Handles the workflow for building, pushing and deploying applications
  • Stripe - Online payment processing for internet businesses
  • Jest - A JavaScript testing framework

Front-end

  • ReactJS - Frontend framework
  • Next.js - React framework that enables server-side rendering
  • Tailwind CSS - A utility-first CSS framework
  • Emotion - CSS-in-JS library designed for high performance style composition
  • Formik - React framework for building forms
  • Yup - A form validation library

πŸ“™ About this Project

This project is a rewrite of a previous monolithic auction website I wrote. The repository for my monolithic auction website can be found here. The purpose of this rewrite was to gain experience utilizing a microservices architecture after completing Stephen Griders course on Microservices.

πŸš€ Local Development

Tested for:

minikube version: v1.24.0 commit: 76b94fb3c4e8ac5062daf70d60cf03ddcc0a741b

Docker version 20.10.12, build e91ed57

Clone the respository locally

git clone https://github.com/Scytalelabs-official/auction-website

Edit your hosts file

127.0.0.1 auctionweb.site

Install ingress-nginx for bare metal

The link for cloud depoyment would be different. In case of switching you would need to delete your minikube cluster and start fresh to avoid a lot of pain.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml

Create the required kubernetes secrets

You can use the secret.bash script to generate all secrets at once. Using the same

  • Running the script
chmod +x secret.bash
./secret.bash <secret_key>

Alternatively run all the commands separately to generate the required artifacts

  • Create the JWT_KEY secret
kubectl create secret generic jwt-secret --from-literal=JWT_KEY=<Your Secret Here>
  • Create the MYSQL_ROOT_PASSWORD secret
kubectl create secret generic mysql-root-password-secret --from-literal=MYSQL_ROOT_PASSWORD=<Your Secret Here>
  • Create the EMAIL secret
kubectl create secret generic email-secret --from-literal=EMAIL=<Your Secret Here>
  • Create the EMAIL_PASSWORD secret
kubectl create secret generic email-password-secret --from-literal=EMAIL_PASSWORD=<Your Secret Here>
  • Create the STRIPE_KEY secret
kubectl create secret generic stripe-secret --from-literal=STRIPE_KEY=<Your Secret Here>
  • Create the CLOUDINARY_API_KEY secret
kubectl create secret generic cloudinary-api-key-secret --from-literal=CLOUDINARY_API_KEY=<Your Secret Here>
  • Create the CLOUDINARY_CLOUD_NAME secret
kubectl create secret generic cloudinary-cloud-name-secret --from-literal=CLOUDINARY_CLOUD_NAME=<Your Secret Here>
  • Create the CLOUDINARY_API_SECRET secret
kubectl create secret generic cloudinary-api-secret-secret --from-literal=CLOUDINARY_API_SECRET=<Your Secret Here>

Start skaffold

skaffold dev

Forward port for the ingress

kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 8080:80

Open the project in your browser

  • The project will now be available locally on the domain auctionweb.site:8080 in your browser. If you are using Google Chrome you may have to type "thisisunsafe" while on the page to bypass a security warning

βš–οΈ License

This project is licensed under the Unlicense License

About

πŸ”¨ A full-stack real-time auction website built using a microservices architecture

Resources

License

Code of conduct

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 98.3%
  • Other 1.7%