Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/mohamad-liyaghi/foodanywhere

A Food delivery system using Django, PostGIS, Kubernetes, Loki, Prometheus, Grafana, OpenTelemetry, Jaeger and Redis.
https://github.com/mohamad-liyaghi/foodanywhere

caching celery django grafana jaeger kubernetes loki nodeexporter opentelemetry postgis prometheus promtail redis

Last synced: 6 days ago
JSON representation

A Food delivery system using Django, PostGIS, Kubernetes, Loki, Prometheus, Grafana, OpenTelemetry, Jaeger and Redis.

Awesome Lists containing this project

README

        

## FoodAnywhere

## Table of Contents
- [Introduction](#introduction)
- [Technologies](#technologies)
- [Monitoring](#monitoring)
- [Node Exporter](#node-exporter)
- [Loki](#loki)
- [OpenTelemetry](#opentelemetry)
- [Application](#application)
- [User](#user)
- [Active Session](#active-session)
- [Locations](#locations)
- [Restaurants](#restaurants)
- [Products](#products)
- [Carts](#carts)
- [Orders](#orders)
- [Transactions](#transactions)
- [Installation](#installation)
- [Docker Compose](#docker-compose)
- [Kubernetes](#kubernetes)
- [Run Tests](#run-tests)

## Introduction
FoodAnywhere is a comprehensive platform designed to make food ordering and delivery easier for both customers and vendors.
Vendors can easily register their restaurants, manage their menus, and add products to the system. Customers, on the other hand, can effortlessly search for nearby restaurants, browse menus, and place orders with just a few clicks.

## Technologies


django
postgresql
postgis
docker
kubernetes
celery
redis
grafana
prometheus
loki
pytest
jaeger
opentelemetry


This project uses Django as the backend framework, with PostgreSQL and PostGIS for database management and geographic data handling. The application is containerized using Docker and orchestrated with Kubernetes.

For background task processing, Celery is used, with Redis serving as both the caching layer and the message broker. Monitoring and logging are handled with Grafana, Node Exporter, Promtail, and Loki, Also Jaeger is used for distributed tracing.

Testing is managed with pytest to ensure code quality and reliability.

## Monitoring
This project has been set up with monitoring and logging capabilities. The following tools are used for monitoring:

### Node Exporter
This tool is used to collect system metrics from the nodes in the Kubernetes cluster. It provides information about CPU, memory, disk, and network usage, among other things.

Here is an example of the Node Exporter dashboard in Grafana:
Node Exporter

### Loki
Loki is a log aggregation system that is used to store and query logs from the application. It is integrated with Grafana, which allows for easy visualization and querying of logs.

Here is an example of the Loki dashboard in Grafana:
Loki

### OpenTelemetry
This Project uses OpenTelemetry as its distributed tracing system. Jaeger is used to collect, store, and visualize traces from the application. It provides insights into the performance of the application and helps identify bottlenecks and issues.

Here is an example of the Jaeger dashboard:
Jaeger

Here is an example of the metrics in grafana:
Open Telemetry

## Application
To make the application easier to understand, we have divided it into several components. Each component is responsible for a specific part of the application. The components are as follows:

### User
This component is responsible for managing user accounts. It handles user registration, and login, as well as user profile management.
Authorization is handled using JSON Web Tokens (JWT).

### Active Session
To keep track of active user sessions, this component is used. It stores information about the user, the device, and the IP address of the user's current session.

### Locations
To find nearby restaurants, this component is used. It stores information about the location of restaurants and provides functionality to search for restaurants based on the user's location.

### Restaurants
This component handles all vendor-specific and customer-specific functionalities related to restaurants.

Some functionalities include:
#### Vendor Specific
- Registering a new restaurant
- Managing restaurant details
#### Customer Specific
- Viewing Nearby Restaurants
- Viewing Restaurant Details

### Products
This component is responsible for managing and displaying products.
Vendors can easily add products to their restaurant's menu, while customers can browse products and add them to their cart.

### Carts
The cart component acts as a temporary storage for products that the user wants to order. It allows users to add, remove, and update products in their cart.
All the items get saved in a cache until the user places an order.

### Orders
The order component is responsible for managing orders for both vendors and customers.
Customers can place orders, pay or cancel orders, and view their order history.
Vendors can view and manage orders that have been placed at their restaurant. So they can update the status of the order.

### Transactions
This component keeps track of all transactions that occur on the platform.
This includes payments made by customers, refunds, and other financial transactions.

## Installation
You can run FoodAnywhere either using Docker Compose or Kubernetes in either a local or production environment.

### Docker Compose
To run the application using Docker Compose, follow these steps:
1. Clone the repository
```shell
git clone https://github.com/mohamad-liyaghi/FoodAnywhere.git
```
2. Change to the project directory
```shell
cd FoodAnywhere/
```
3. Run the project
```shell
make run
```
* To run in production mode, use the following command:
```shell
make deploy
```

### Kubernetes
To run the application using Kubernetes, follow these steps:
1. Clone the repository
```shell
git clone https://github.com/mohamad-liyaghi/FoodAnywhere.git
```
2. Change to the project directory
```shell
cd FoodAnywhere/
```
3. Create ConfigMaps
```shell
make local_confmap
```
* To create ConfigMaps for production, use the following command:
```shell
make prod_confmap
```
4. Deploy the application
```shell
make k8s
```

## Run Tests
This project uses Pytest for testing. To run the tests, run the following command
```shell
make test
```