https://github.com/bit-maximum/fastapi-feature-rich-template
FastAPI Production-Ready feature rich template based in DDD
https://github.com/bit-maximum/fastapi-feature-rich-template
backend docker fastapi kubernetes postgresql python rebbitmq redis rest-api traefik
Last synced: 3 months ago
JSON representation
FastAPI Production-Ready feature rich template based in DDD
- Host: GitHub
- URL: https://github.com/bit-maximum/fastapi-feature-rich-template
- Owner: Bit-Maximum
- License: mit
- Created: 2025-08-08T10:27:44.000Z (11 months ago)
- Default Branch: main
- Last Pushed: 2025-08-16T14:11:15.000Z (10 months ago)
- Last Synced: 2025-08-16T16:13:09.820Z (10 months ago)
- Topics: backend, docker, fastapi, kubernetes, postgresql, python, rebbitmq, redis, rest-api, traefik
- Language: Python
- Homepage:
- Size: 934 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# I am currently working on my master's thesis.
## Work in progress | Breaking changes expected
### Future plans:
- Add caching with Redis
- Refactor integration with Taskiq
- Rework documentation
- Add metrics with OpenTelemetry and Grafana
- Add interactive demo
## Docker
You can start the project with docker using this command:
```bash
docker-compose up --build
```
If you want to develop in docker with autoreload and exposed ports add `-f deploy/docker-compose.dev.yml` to your docker command.
Like this:
```bash
docker-compose -f docker-compose.yml -f deploy/docker-compose.dev.yml --project-directory . up --build
```
This command exposes the web application on port 8000, mounts current directory and enables autoreload.
But you have to rebuild image every time you modify `poetry.lock` or `pyproject.toml` with this command:
```bash
docker-compose build
```
## Project structure
```bash
$ tree "app"
app
├── conftest.py # Fixtures for all tests.
├── db # module contains db configurations
│ ├── dao # Data Access Objects. Contains different classes to interact with database.
│ └── models # Package contains different models for ORMs.
├── __main__.py # Startup script. Starts uvicorn.
├── adapters # Package for different external adapters such as rabbit or redis etc.
├── settings.py # Main configuration settings for project.
├── static # Static content.
├── tests # Tests for project.
└── controller # Package contains controller server. Handlers, startup config.
├── api # Package with all handlers.
│ └── router.py # Main router.
├── application.py # FastAPI application configuration.
└── lifespan.py # Contains actions to perform on startup and shutdown.
```
## Configuration
This application can be configured with environment variables.
You can create `.env` file in the root directory and place all
environment variables here.
All environment variables should start with "APP_" prefix.
For example if you see in your "app/settings.py" a variable named like
`random_parameter`, you should provide the "APP_RANDOM_PARAMETER"
variable to configure the value. This behaviour can be changed by overriding `env_prefix` property
in `app.settings.Settings.Config`.
An example of .env file:
```bash
APP_RELOAD="True"
APP_PORT="8000"
APP_ENVIRONMENT="dev"
```
You can read more about BaseSettings class here: https://pydantic-docs.helpmanual.io/usage/settings/
## OpenTelemetry
If you want to start your project with OpenTelemetry collector
you can add `-f ./deploy/docker-compose.otlp.yml` to your docker command.
Like this:
```bash
docker-compose -f docker-compose.yml -f deploy/docker-compose.otlp.yml --project-directory . up
```
This command will start OpenTelemetry collector and jaeger.
After sending a requests you can see traces in jaeger's UI
at http://localhost:16686/.
This docker configuration is not supposed to be used in production.
It's only for demo purpose.
You can read more about OpenTelemetry here: https://opentelemetry.io/
## Pre-commit
To install pre-commit simply run inside the shell:
```bash
pre-commit install
```
pre-commit is very useful to check your code before publishing it.
It's configured using .pre-commit-config.yaml file.
By default it runs:
* black (formats your code);
* mypy (validates types);
* ruff (spots possible bugs);
You can read more about pre-commit here: https://pre-commit.com/
## Kubernetes
To run your app in kubernetes
just run:
```bash
kubectl apply -f deploy/kube
```
It will create needed components.
If you haven't pushed to docker registry yet, you can build image locally.
```bash
docker-compose build
docker save --output app.tar app:latest
```
## Migrations
If you want to migrate your database, you should run following commands:
```bash
# To run all migrations until the migration with revision_id.
alembic upgrade ""
# To perform all pending migrations.
alembic upgrade "head"
```
### Reverting migrations
If you want to revert migrations, you should run:
```bash
# revert all migrations up to: revision_id.
alembic downgrade
# Revert everything.
alembic downgrade base
```
### Migration generation
To generate migrations you should run:
```bash
# For automatic change detection.
alembic revision --autogenerate
# For empty file generation.
alembic revision
```
## Running tests
If you want to run it in docker, simply run:
```bash
docker-compose run --build --rm api pytest -vv .
docker-compose down
```
For running tests on your local machine.
1. you need to start a database.
I prefer doing it with docker:
```
docker run -p "5432:5432" -e "POSTGRES_PASSWORD=app" -e "POSTGRES_USER=app" -e "POSTGRES_DB=app" postgres:16.3-bullseye
```
2. Run the pytest.
```bash
pytest -vv .
```