- 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
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 |
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 |
- 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
- 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
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.
Tested for:
minikube version: v1.24.0 commit: 76b94fb3c4e8ac5062daf70d60cf03ddcc0a741b
Docker version 20.10.12, build e91ed57
git clone https://github.com/Scytalelabs-official/auction-website
- Add the following line to your hosts file (https://phoenixnap.com/kb/how-to-edit-hosts-file-in-windows-mac-or-linux)
127.0.0.1 auctionweb.site
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
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>
- 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>
skaffold dev
kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 8080:80
- 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
This project is licensed under the Unlicense License