FastAPI Book Project. My Stage 2 Task

Overview The FastAPI Book Project is a simple REST API built using FastAPI. It provides endpoints for retrieving book details and is designed with best practices in CI/CD, containerization, and deployment. This project's repository was forked from hng12-devbot/fastapi-book-project with the task to add a missing endpoint, set up a test pipeline, and configure the deployment process. The application should be served using Nginx. Features Retrieve book details by ID CI pipeline using pytest Automated deployment pipeline Dockerized FastAPI application Reverse proxy setup with Nginx Hosted on AWS Technologies Used FastAPI - Web framework for building APIs Python - Programming language Docker - Containerization Nginx - Reverse proxy server GitHub Actions - CI/CD pipeline AWS - Cloud deployment Project Structure fastapi-book-project/ ├── api/ │ ├── db/ │ │ ├── __init__.py │ │ └── schemas.py # Data models and in-memory database │ ├── routes/ │ │ ├── __init__.py │ │ └── books.py # Book route handlers │ └── router.py # API router configuration ├── core/ │ ├── __init__.py │ └── config.py # Application settings ├── tests/ │ ├── __init__.py │ └── test_books.py # API endpoint tests ├── main.py # Application entry point │── Dockerfile │── .github/workflows/ │ ├── ci.yml │ ├── cd.yml ├── requirements.txt # Project dependencies └── README.md Installation Prerequisites Ensure you have the following installed: Python 3.9+ Docker FastAPI Uvicorn Git Setup Clone the repository: git clone https://github.com/ameh0429/fastapi-book-project.git cd fastapi-book-project Install dependencies: pip install -r requirements.txt Run the application: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload Access the API documentation at: Swagger UI: http://localhost:8000/docs API Endpoints Method Endpoint Description GET /api/v1/books/{book_id} Retrieve book details Running Tests Run unit tests using pytest: pytest tests/ Docker Deployment Build the Docker image: docker build -t fastapi-book-app . Run the container: docker run -p 8000:8000 fastapi-book-app CI/CD Pipeline The project includes GitHub Actions for: Running tests on PRs Deploying automatically on merge AWS Deployment Deploy the container using AWS EC2. Configure Nginx as a reverse proxy. Run sudo nano /etc/nginx/sites-available/fastapi to configure nginx server { listen 80; server_name YOUR_EC2_PUBLIC_IP; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } Test from Your Browser Try accessing the correct API endpoint in your browser. http://54.164.65.253/api/v1/books/ The Result Challenges and Lessons Learned I faced numerous challenges as the deadline for submitting this task was tight. I encountered errors at various stages but was able to debug them with the help of my #HNG peers and by consulting AI. Through this experience, I gained deeper insights into FastAPI, Docker, CI/CD pipelines, and AWS deployment. I also improved my debugging skills and learned the importance of collaboration in software development. Future Improvements Implement authentication and authorization Add database integration for persistent storage Enhance test coverage with additional unit and integration tests Improve error handling and logging Deploy using AWS Lambda and API Gateway for a serverless architecture Contributing Fork the repository. Create a new branch (feature-branch). Commit your changes. Push to your branch and create a pull request. License This project is licensed under the MIT License.

Feb 14, 2025 - 15:30
 0
FastAPI Book Project. My Stage 2 Task

Overview

The FastAPI Book Project is a simple REST API built using FastAPI. It provides endpoints for retrieving book details and is designed with best practices in CI/CD, containerization, and deployment.

This project's repository was forked from hng12-devbot/fastapi-book-project with the task to add a missing endpoint, set up a test pipeline, and configure the deployment process. The application should be served using Nginx.

Features

  • Retrieve book details by ID
  • CI pipeline using pytest
  • Automated deployment pipeline
  • Dockerized FastAPI application
  • Reverse proxy setup with Nginx
  • Hosted on AWS

Technologies Used

  • FastAPI - Web framework for building APIs
  • Python - Programming language
  • Docker - Containerization
  • Nginx - Reverse proxy server
  • GitHub Actions - CI/CD pipeline
  • AWS - Cloud deployment

Project Structure

fastapi-book-project/
├── api/
│   ├── db/
│   │   ├── __init__.py
│   │   └── schemas.py      # Data models and in-memory database
│   ├── routes/
│   │   ├── __init__.py
│   │   └── books.py        # Book route handlers
│   └── router.py           # API router configuration
├── core/
│   ├── __init__.py
│   └── config.py           # Application settings
├── tests/
│   ├── __init__.py
│   └── test_books.py       # API endpoint tests
├── main.py                 # Application entry point
│── Dockerfile
│── .github/workflows/
│   ├── ci.yml
│   ├── cd.yml
├── requirements.txt        # Project dependencies
└── README.md

Installation

Prerequisites

Ensure you have the following installed:

  • Python 3.9+
  • Docker
  • FastAPI
  • Uvicorn
  • Git

Setup

  • Clone the repository:
   git clone https://github.com/ameh0429/fastapi-book-project.git
   cd fastapi-book-project
  • Install dependencies:
   pip install -r requirements.txt
  • Run the application:
   uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
  • Access the API documentation at:
    • Swagger UI: http://localhost:8000/docs

Image description

API Endpoints

Method Endpoint Description
GET /api/v1/books/{book_id} Retrieve book details

Running Tests

Run unit tests using pytest:

pytest tests/

Docker Deployment

  1. Build the Docker image:
   docker build -t fastapi-book-app .
  1. Run the container:
   docker run -p 8000:8000 fastapi-book-app

Image description

CI/CD Pipeline

The project includes GitHub Actions for:

  • Running tests on PRs
  • Deploying automatically on merge

Image description

AWS Deployment

  • Deploy the container using AWS EC2.

Image description

Image description

  • Configure Nginx as a reverse proxy. Run sudo nano /etc/nginx/sites-available/fastapi to configure nginx
server {
    listen 80;
    server_name YOUR_EC2_PUBLIC_IP;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Image description

Test from Your Browser

Try accessing the correct API endpoint in your browser.
http://54.164.65.253/api/v1/books/

Image description

The Result

Image description

Challenges and Lessons Learned

I faced numerous challenges as the deadline for submitting this task was tight. I encountered errors at various stages but was able to debug them with the help of my #HNG peers and by consulting AI. Through this experience, I gained deeper insights into FastAPI, Docker, CI/CD pipelines, and AWS deployment. I also improved my debugging skills and learned the importance of collaboration in software development.

Future Improvements

  • Implement authentication and authorization
  • Add database integration for persistent storage
  • Enhance test coverage with additional unit and integration tests
  • Improve error handling and logging

Deploy using AWS Lambda and API Gateway for a serverless architecture

Contributing

  1. Fork the repository.
  2. Create a new branch (feature-branch).
  3. Commit your changes.
  4. Push to your branch and create a pull request.

License

This project is licensed under the MIT License.