Bullish

A simple webapp to explore Bhav Copy Equity data

[![License: AGPL v3](https://img.shields.io/badge/License-AGPL%20v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) Backend: [![Docker Pulls - Backend](https://img.shields.io/docker/pulls/codingcoffee/bullish-backend)](https://hub.docker.com/r/codingcoffee/bullish-backend) [![Docker Image Size Backend (tag)](https://img.shields.io/docker/image-size/codingcoffee/bullish-backend?sort=date)](https://hub.docker.com/r/codingcoffee/bullish-backend/tags?name=latest) Frontend [![Docker Pulls - Frontend](https://img.shields.io/docker/pulls/codingcoffee/bullish-frontend)](https://hub.docker.com/r/codingcoffee/bullish-frontend) [![Docker Image Size Frontend (tag)](https://img.shields.io/docker/image-size/codingcoffee/bullish-frontend?sort=date)](https://hub.docker.com/r/codingcoffee/bullish-frontend/tags?name=latest) ## Usage - Local setup is supported via Docker Compose ![Development Architecture](.assets/images/bullish-dev-2021-02-12.png "Development Architecture") ```sh docker-compose up -d ``` ### Build - Build images for dev ```sh docker-compose build ``` - Build images for prod ```sh ./prod-build.sh ``` ### Logging To get the logs of all containers ```sh docker logs -f ``` To get the logs of a particular container ```sh docker logs -f container-name ``` Here `container-name` can be either of `backend`, `frontend`, `redis`, `postgresql`, `rqworker` or `rqscheduler`. ### Debugging - To goto Django's shell to debug you may use ```sh docker-compose exec backend python manage.py shell ``` - To create migrations ```sh docker-compose exec backend python manage.py makemigrations ``` - To run migrate ```sh docker-compose exec backend python manage.py migrate ``` - To run unit tests ```sh docker-compose exec backend python manage.py test ``` Similarly all django commands can be run this way. ## Endpoints There are 5 available endpoints: 1. Empty Response Endpoint - to intentionally get an empty response from the server 2. Directly from BSE - fetchs the data directly from the BSE website 3. Postgres Endpoint - fetches the data from Postgres 4. Redis Cache and Redis Cache v2 - both fetch data from redis, however there is a slight differece in the way they store data. - In the 1st case a LIST is stored maintainig the list of stocks for a given day, and a HASHMAP for every stock is stored - In the v2 endpoint, the entire JSON response for a day is stringified and stored The reason for implemnting two different endpoints, was to just check the response times. ## Deploy The recommended way for deploy is on Kubernetes. You can find the related files ![Production Architecture](.assets/images/bullish-prod-2021-02-12.png "Production Architecture") in `k8s` directory. Before deploy create a `secret.yaml` file in `k8s/app`, with base 64 encoded secrets. A sample file named `sample-secret.yaml` has been committed listing all the required variables. Change the secrets preset in the file before using it. - One time deploy ```sh # Deploy ingress kubectl apply -f k8s/ingress/ingress-https.yaml # Deploy secrets kubectl apply -f k8s/app/secret.yaml # Deploy Postgres and Redis DB kubectl apply -f k8s/app/redis.yaml kubectl apply -f k8s/app/postgres.yaml # Deploy Backend kubectl apply -f k8s/app/backend.yaml kubectl apply -f k8s/app/rqworker.yaml kubectl apply -f k8s/app/rqscheduler.yaml # Deploy Frontend kubectl apply -f k8s/app/frontend.yaml ``` - Subsequent deploys can be done by rolloing out a restart since all pods have a `imagePullPolicy` set to `Always` ```sh # Push containers to Docker Hub and Deploy to K8s ./prod-deploy.sh ``` ## Contribution Have better suggestions to optimize the image? Found some typos? Go ahead and send in a Pull Request! Contributions of any kind welcome! ## License The code in this repository has been released under the [GNU Affero General Public License v3](https://www.gnu.org/licenses/agpl-3.0.en.html) ## Attributions - [Bullish icon](https://www.flaticon.com/free-icon/bull-side-view-black-animal-shape_30480) made by [Freepik](https://www.freepik.com) from [Flaticon](https://www.flaticon.com)