This is a template repository aimed to kick-start your project with a setup from a real-world application! This template utilizes the following tech stack:
- ๐ณ Dockerized
- ๐ Asynchronous PostgreSQL
- ๐ FastAPI
When the Docker is started, these are the URL addresses:
- Backend Application (API docs) $\rightarrow$ http://localhost:8001/docs
- Database editor (Adminer) $\rightarrow$ http//localhost:8081
The backend API without Docker can be found in http://localhost:8000/docs.
Well, the easy answer is Asynchronousity and Speed!
- FastAPI is crowned as the fastest web framework for Python and thus we use it for our backend development.
- The database of my choice is the asynchronous version of PostgreSQL (via SQLAlchemy 2.0). Read this blog from Packt if you want to educate yourself further about the topic Asynchronous, Synchronous, Concurrency, and Parallelism.
- Docker is a technology that packages an application into standardized units called containers that have everything the software needs to run including libraries, system tools, code, and runtime.
The above-listed technologies are just the main ones. There are other technologies utilized in this project template to ensure that your application is robust and provides the best possible development environment for your team! These technologies are:
- 
TOML $\rightarrow$ The one-for-all configuration file. This makes it simpler to setup our project.
- 
Pyenv $\rightarrow$ The simplest way to manage our Python versions.
- 
Pyenv-VirtualEnv $\rightarrow$ The plugin forPyenvto manage the virtual environment for our packages.
- 
Pre-Commit $\rightarrow$ Git hook scripts to identify issues and quality of your code before pushing it to GitHub. These hooks are implemented for the following linting packages:- 
Black (Python) $\rightarrow$ Manage your code style with auto-formatting and parallel continuous integration runner for Python.
- 
Isort (Python) $\rightarrow$ Sort yourimportfor clarity. Also for Python.
- 
MyPy (Python) $\rightarrow$ A static type checker for Python that helps you to write cleaner code.
 
- 
Black (Python) 
- 
Pre-Commit CI $\rightarrow$ Continuous integration for our Pre-Commit hook that fixes and updates our hook versions.
- 
CodeCov $\rightarrow$ A platform that analyzes the result of your automated tests.
- 
PyTest $\rightarrow$ The testing framework for Python code.
- 
DBDiagram $\rightarrow$ A platform that lets your design your database by writing SQL and converting it into ERD. This platform provides a complete symbol for entity relationships (not like many other platforms!).
- 
GitHub Actions $\rightarrow$ The platform to setup our CI/CD by GitHub.
- 
SQLAlchemy 2.0 $\rightarrow$ The go-to database interface library for Python. The 2.0 is the most recent update where it provides an asynchronous setup.
- 
CODEOWNERS $\rightarrow$ A file for distributing the responsibilities in our project to each team/teammate.
My choice for a project development workflow is usually the Trunk-Based Development because of the straightforward approach in the collaboration workflow, hence the name trunk for the main branch repository instead of master or main.
For the backend application:
- The project, linter, and test configurations in backend/pyproject.toml.
- 3 settings classes (development, staging, production) with the super class in backend/src/config/settings/base.py.
- Event logger in backend/src/config/events.py.
- The Accountobject table model inbackend/src/models/db/account.py.
- The Accountobject schema model inbackend/src/models/schemas/account.py.
- PostgreSQL database connection with asynchronous SQLAlchemy 2.0 in backend/src/repository/database.py.
- A custom SQLAlchemy Base class in backend/src/repository/table.py
- PostgreSQL database connection with asynchronous SQLAlchemy 2.0 in backend/src/repository/database.py.
- Database-related events e.g. database table registration by app startup in backend/src/repository/events.py.
- C. R. U. D. methods for Accountobject inbackend/src/repository/crud/account.py.
- Table classes registration file in backend/src/repository/base.py.
- Alembic setup for auto-generating asynchronous database migrations in backend/src/repository/migration/**.
- Alembic main configuration file in backend/alembic.ini.
- Dependency injection for database session and repository in backend/src/api/**.
- API endpoints for Accountsignup and signin inbackend/src/api/routes/authentication.py.
- API endpoints for Accountget all, get 1, update, and delete inbackend/src/api/routes/account.py.
- API endpoints registration file in backend/src/api/endpoints.
- Hashing and JWT generators and simple verification functions in backend/src/securities/**.
- Helper functions, string messages, and error handling in backend/src/utilities/**.
- A comprehensive FastAPI application initialization in backend/src/main.py.
For testing, I have prepared the following simple code to kick-start your test-driven development:
- A simple replication of the backend application for testing purposes and the asynchronous test client in backend/tests/conftest.py.
- 2 simple test functions to test the backend application initialization in tests/unit_tests/test_src.py.
For the DevOps:
- A simple buildjob to test the compilation of the source code for the backend application in.github/workflows/ci-backend.yaml.
- A simple linting job called code-stylewith black, isort, flake8, and mypy in.github/workflows/ci-backend.yaml.
- An automated testing with PyTestand an automated test reporting withCodecovin in.github/workflows/ci-backend.yaml.
- A source code responsibility distribution file in .github/CODEOWNERS(Please change the username to your own).
- A YAMLfile for an automated semantic commit message in.github/workflows/ci-backend.yaml.
- An automated test report monitoring via Codecovincodecov.yaml
- A CI for automatically updating all linter version in the pre-commit YAMLfile in.pre-commit-config.YAML.
For containerization:
- A Dockerconfiguration that utilizes the latest Python image inbackend/Dockerfile.
- A script that ensure the backend application will restart when postgres image hasn't started yet in backend/entrypoint.sh.
- Setting up Postgresimage for our database server,Adminerfor our database editor, andbackend_appfor our backend application's container indocker-compose.yaml.
For the team development environment:
- A pre-commit hooks for Black,Isort, andMyPyto ensure the conventional commit message before pushing an updated code into the remote repository in.pre-commit-config.YAML.
- All secret variables are listed in .env.example. You need to copy these variables and set the values respectively to your need and save them in a new.envin the root directory.
This backend application is setup with Docker. Nevertheless, you can see the full local setup without Docker in backend/README.md.
- 
Before setting up the backend app, please create a new directory called coveragefor the testing report purpose:cd backend && mkdir coverage 
- 
Backend app setup: # Creating VENV pyenv virtualenv 3.11.0 any_venv_name pyenv local any_venv_name # Install dependencies pip3 install -r requirements.txt # Test run your backend server uvicorn src.main:backend_app --reload 
- 
Testing with PyTest: Make sure that you are in thebackend/directory.# For testing without Docker pytest # For testing within Docker docker exec backend_app pytest 
- 
Pre-Commitsetup:# Make sure you are in the ROOT project directory pre-commit install pre-commit autoupdate
- 
Backend app credentials setup: If you are not used to VIM or Linux CLI, then ignore the echocommand and do it manually. All the secret variables for this template are located in.env.example.If you want to have another name for the secret variables, don't forget to change them also in: - backend/src/config/base.py
- docker-compose.yaml
 # Make sure you are in the ROOT project directory touch .env echo "SECRET_VARIABLE=SECRET_VARIABLE_VALUE" >> .env 
- 
CODEOWNERSsetup: Go to.github/and openCODEOWNERSfile. This file is to assign the code to a specific team member so you can distribute the weights of the project clearly.
- 
Docker setup: # Make sure you are in the ROOT project directory chmod +x backend/entrypoint.sh docker-compose build docker-compose up # Every time you write a new code, update your container with: docker-compose up -d --build 
- 
(IMPORTANT) Database setup: # (Docker) Generate revision for the database auto-migrations docker exec backend_app alembic revision --autogenerate -m "YOUR MIGRATION TITLE" docker exec backend_app alembic upgrade head # to register the database classes # (Local) Generate revision for the database auto-migrations alembic revision --autogenerate -m "YOUR MIGRATION TITLE" alembic upgrade head # to register the database classes 
- 
Go to https://about.codecov.io/, and sign up with your github to get the CODECOV_TOKEN
- 
Go to your GitHub and register all the secret variables (look in .env.example) in your repository ( settings$\rightarrow$ (scroll down a bit)Secrets$\rightarrow$ Actions$\rightarrow$ New repository secret)
IMPORTANT: Without the secrets registered in Codecov and GitHub, your CI will fail and life will be horrible ๐คฎ๐คฌ
IMPORTANT: Remember to always run the container update every once in a while. Without the arguments -d --build, your Docker dashboard will be full of junk containers!
.github/
โโโ workflows/
    โโโ ci-backend.yaml                 # A CI file for the backend app that consists of `build`, `code-style`, and `test`
โโโ CODEOWNERS                          # A configuration file to distribute code responsibility
โโโ semantic.yaml                       # A configuration file for ensuring an automated semantic commit message
backend/
โโโ coverage/
โโโ src/
    โโโ api/
        โโโ dependencies/               # Dependency injections
            โโโ session.py
            โโโrepository.py
        โโโ routes/                     # Endpoints
            โโโ account.py              # Account routes
            โโโ authentication.py       # Signup and Signin routes
        โโโ endpoints.py                # Endpoint registration
    โโโ config/
        โโโ settings/
            โโโ base.py                 # Base settings / settings parent class
                โโโ development.py      # Development settings
                โโโ environments.py     # Enum with PROD, DEV, STAGE environment
                โโโ production.py       # Production settings
                โโโ staging.py          # Test settings
        โโโ events.py                   # Registration of global events
        โโโ manager.py                  # Manage get settings
    โโโ models/
        โโโ db/
            โโโ account.py              # Account class for database entity
        โโโ schemas/
            โโโ account.py              # Account classes for data validation objects
            โโโ base.py                 # Base class for data validation objects
    โโโ repository/
        โโโ crud/
            โโโ account.py              # C. R. U. D. operations for Account entity
            โโโ base.py                 # Base class for C. R. U. D. operations
        โโโ migrations/
            โโโ versions/
            โโโ env.py                  # Generated via alembic for automigration
            โโโ script.py.mako          # Generated via alembic
        โโโ base.py                     # Entry point for alembic automigration
        โโโ database.py                 # Database class with engine and session
        โโโ events.py                   # Registration of database events
        โโโ table.py                    # Custom SQLAlchemy Base class
    โโโ security/
        โโโ hashing/
            โโโ hash.py                 # Hash functions with passlib
            โโโ password.py             # Password generator with hash functions
        โโโ authorizations/
            โโโ jwt.py                  # Generate JWT tokens with python-jose
        โโโ verifications/
            โโโ credentials.py          # Check for attributes' availability
    โโโ utilities/
        โโโ exceptions/
            โโโ http/
                โโโ http_exc_400.py     # Custom 400 error handling functions
                โโโ http_exc_401.py     # Custom 401 error handling functions
                โโโ http_exc_403.py     # Custom 403 error handling functions
                โโโ http_exc_404.py     # Custom 404 error handling functions
            โโโ database.py             # Custom `Exception` class
            โโโ password.py             # Custom `Exception` class
        โโโ formatters/
            โโโ datetime_formatter.py   # Reformat datetime into the ISO form
            โโโ field_formatter.py      # Reformat snake_case to camelCase
        โโโ messages/
            โโโ http/
                โโโ http_exc_details.py	# Custom message for HTTP exceptions
    โโโ main.py                         # Our main backend server app
โโโ tests/
    โโโ end_to_end_tests/               # End-to-end tests
    โโโ integration_tests/              # Integration tests
    โโโ security_tests/                 # Security-related tests
    โโโ unit_tests/                     # Unit tests
        โโโ test_src.py                 # Testing the src directory's version
    โโโ conftest.py                     # The fixture codes and other base test codes
โโโ Dockerfile                          # Docker configuration file for backend application
โโโ README.md                           # Documentation for backend app
โโโ entrypoint.sh                       # A script to restart backend app container if postgres is not started
โโโ alembic.ini                         # Automatic database migration configuration
โโโ pyproject.toml                      # Linter and test main configuration file
โโโ requirements.txt                    # Packages installed for backend app
.dockerignore                           # A file that list files to be excluded in Docker container
.gitignore                              # A file that list files to be excluded in GitHub repository
.pre-commit-config.yaml                 # A file with Python linter hooks to ensure conventional commit when committing
LICENSE.md                              # A license to use this template repository (delete this file after using this repository)
README.md                               # The main documentation file for this template repository
codecov.yaml                            # The configuration file for automated testing CI with codecov.io
docker-compose.yaml                     # The main configuration file for setting up a multi-container DockerYou can delete these 3 files (or change its content based on your need):
- LICENSE.md
- README.md
- backend/README.md
Enjoy your development and may your technology be forever useful to everyone ๐๐๐งฌ