Skip to content

Commit

Permalink
Merge pull request #34 from wednesday-solutions/feat/update_dc
Browse files Browse the repository at this point in the history
Updated readme with features, getting started etc
  • Loading branch information
anasnadeemws authored Mar 18, 2024
2 parents 6b768ab + 3952691 commit 889cc62
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 39 deletions.
3 changes: 2 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ OPENAI_API_KEY_WEDNESDAY=
SECRET_KEY=
REDIS_URL=
SENTRY_DSN=
SLACK_WEBHOOK_URL=
SLACK_WEBHOOK_URL=
DB_ROOT_PASSWORD= //this is applicable for .env.local file only
107 changes: 81 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,33 +1,55 @@
# FastAPI Template

This repository provides a template for creating and deploying a FastAPI project. Follow the steps below to set up the local environment, run the project, manage database migrations, and deploy the service on AWS ECS.

# FastAPI Template
## Table of Contents

- [Features](#features)
- [Getting started](#getting-started)

### Features

This repository provides a template for creating and deploying a FastAPI project. Follow the steps below to set up the local environment, run the project, manage database migrations, and deploy the service on AWS ECS.
- Python 3.11+ support
- SQLAlchemy 2.0+ support
- Asynchoronous capabilities
- Database migrations using Alembic
- Basic Authentication using JWT
- Caching using Redis
- Error reporting using Sentry
- Asynchoronous background tasks using Celery
- Test cases
- Dockerized application
- Readily available CRUD operations
- Readily available middlewares for rate limiting, request id injection etc
- Type checking using mypy
- Linting using flake8
- Formatting using black
- Code quality analysis using SonarQube

### Getting Started

## Getting Started
#### Requirements:
- Python 3.11
- Docker
- mysql

### 1. Initialize Local Environment
#### 1. Initialize Local Environment

To set up your local environment, run the following script:
- To set up your local environment, run the following script:

```
./scripts/initialize-env.sh
```

This script installs the necessary dependencies and prepares the environment for running the FastAPI application on your local machine.

### 2. Run the Project
Start the project locally with the following command:

```
./scripts/local_server.sh
```
Create a .env.local file with reference of .env.example
Run following command to inject env file
```shell
set -a source .env.local set +a
```

This script upgrades the database migrations using Alembic and starts the FastAPI server using Uvicorn. The server is hosted on 0.0.0.0 and port 8000, making it accessible locally.

### 3. Database Migrations
#### 2. Database Migrations
Create new database migrations when you make changes to your models. Use the following command:
```
alembic revision -m 'brief description of changes'
Expand All @@ -41,7 +63,46 @@ alembic upgrade head
```
This command updates the database schema to reflect the latest changes defined in the migration scripts
### 4. Deploy Service on AWS ECS
#### 3. Redis Dependency
```
docker run --name recorder-redis -p 6379:6379 -d redis:alpine
```
or add the REDIS_URL in .env.local file
#### 4. Celery Dependency
- Run following command to initiallize the celery worker
```shell
celery -A app.app.celery worker -l info
```
- Turn Up Celery Flower with
```shell
flower --broker=${REDIS_URL}/6 --port=5555
```

#### 5. Run the Project

##### Running Application Locally

```
./scripts/local_server.sh
```
This script upgrades the database migrations using Alembic and starts the FastAPI server using Uvicorn. The server is hosted on 0.0.0.0 and port 8000, making it accessible locally.
##### Running Application into Docker Container
- Create a file .env.docker with reference of .env.example
- Inject Docker environment using
```shell
set -a source .env.docker set +a
- use following command to turn on the application
```shell
docker compose --env-file .env.docker up
```


#### 6. Deploy Service on AWS ECS
To deploy the FastAPI application on AWS ECS, use the following script:

```
Expand All @@ -55,24 +116,18 @@ Note: Ensure you have AWS credentials configured and AWS Copilot installed for s
#### New to AWS Copilot?
If you are new to AWS Copilot or you want to learn more about AWS Copilot, please refer to [this helpful article](https://www.wednesday.is/writing-tutorials/how-to-use-copilot-to-deploy-projects-on-ecs) that guides you through the process of setting up AWS Copilot locally as well as also helps you understand how you can publish and update an application using 4 simple steps.

### 5. Redis Dependency
```
docker run --name recorder-redis -p 6379:6379 -d redis:alpine
```
or add the REDIS_URL in .env file

### 6. Circuit breakers
#### 7. Circuit breakers

## Using the Circuit Breaker for External API Calls
Using the Circuit Breaker for External API Calls

Our application uses a circuit breaker pattern to enhance its resilience against failures in external services. The circuit breaker prevents the application from performing operations that are likely to fail, allowing it to continue operating with degraded functionality instead of complete failure.

## How to Use

How to Use?
- For any external service call, wrap the call with the circuit breaker.
- The circuit breaker is configured to trip after a certain number of consecutive failures. Once tripped, it will prevent further calls to the external service for a defined period.

## Example
Example

Here's an example of using the circuit breaker in an API route:

Expand All @@ -85,4 +140,4 @@ async def external_service_endpoint():
return {"message": result}
except CircuitBreakerError:
raise HTTPException(status_code=503, detail="Service temporarily unavailable")
```
```
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ fastapi==0.95.2
fastapi-pagination
flake8
flatbuffers==23.5.26
flower==2.0.1
freezegun==1.4.0
frozenlist==1.3.3
ftfy==6.1.1
Expand Down
19 changes: 7 additions & 12 deletions scripts/initialize-env.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,28 +7,23 @@ echo "Initializing local python environment"
# Initialize python environment
python -m venv venv

echo
echo
echo "Activating local python environment"
# Activate python environment
source ./venv/bin/activate
echo
echo
echo "Local python environment activated"

echo
echo
echo "Upgrading pip"
echo
echo
# Upgrade pip
pip install --upgrade pip
echo
echo
echo "pip upgraded"

echo
echo
echo "Installing project dependencies"
echo
echo
# Install requirements/dependencies
pip install -r requirements.txt --no-cache-dir

pip uninstall httpcore -y
pip uninstall httpx -y
pip install httpcore
pip install httpx

1 comment on commit 889cc62

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coverage

Coverage Report
FileStmtsMissCoverMissing
app
   app.py312423%10–61
app/config
   __init__.py3167%6
   base.py32391%44–46
   celery_config.py16160%1–25
   celery_utils.py20200%1–28
   redis_config.py4325%2–6
app/constants
   jwt_utils.py151127%7–19
app/daos
   home.py10550%11–18
   users.py716311%12–134
app/middlewares
   cache_middleware.py52520%1–68
   rate_limiter_middleware.py24240%1–32
   request_id_injection.py17170%1–25
app/models
   __init__.py330%1–5
   users.py27270%1–38
app/routes
   __init__.py11110%1–13
app/routes/cache_router
   __init__.py220%1–3
   cache_samples.py11110%1–15
app/routes/celery_router
   __init__.py220%1–3
   celery_samples.py11110%1–14
app/routes/home
   __init__.py220%1–3
   home.py33330%1–45
app/routes/users
   __init__.py220%1–3
   users.py38380%1–57
app/schemas/users
   users_request.py41410%1–70
   users_response.py880%1–11
app/sessions
   db.py53530%1–82
app/tests
   test_basic.py201525%10–34
   test_daos_home.py241058%14–21, 27–36, 39
   test_daos_users.py1109514%19–208
app/utils
   exception_handler.py19190%1–36
   redis_utils.py330%1–5
   slack_notification_utils.py13130%1–29
   user_utils.py25250%1–36
app/wrappers
   cache_wrappers.py19190%1–27
TOTAL78868213% 

Tests Skipped Failures Errors Time
2 0 💤 0 ❌ 2 🔥 0.735s ⏱️

Please sign in to comment.