mirror of
https://github.com/grillazz/fastapi-sqlalchemy-asyncpg.git
synced 2025-11-30 13:20:40 +03:00
compose refactor
This commit is contained in:
30
Makefile
30
Makefile
@@ -14,32 +14,32 @@ docker-up: ## Run project with compose
|
|||||||
docker-clean: ## Clean Reset project containers and volumes with compose
|
docker-clean: ## Clean Reset project containers and volumes with compose
|
||||||
docker compose down -v --remove-orphans | true
|
docker compose down -v --remove-orphans | true
|
||||||
docker compose rm -f | true
|
docker compose rm -f | true
|
||||||
docker volume rm fastapi_postgres_data | true
|
docker volume rm panettone_postgres_data | true
|
||||||
|
|
||||||
.PHONY: docker-apply-db-migrations
|
.PHONY: docker-apply-db-migrations
|
||||||
docker-apply-db-migrations: ## apply alembic migrations to database/schema
|
docker-apply-db-migrations: ## apply alembic migrations to database/schema
|
||||||
docker compose run --rm app alembic upgrade head
|
docker compose run --rm api1 alembic upgrade head
|
||||||
|
|
||||||
.PHONY: docker-create-db-migration
|
.PHONY: docker-create-db-migration
|
||||||
docker-create-db-migration: ## Create new alembic database migration aka database revision. Example: make docker-create-db-migration msg="add users table"
|
docker-create-db-migration: ## Create new alembic database migration aka database revision. Example: make docker-create-db-migration msg="add users table"
|
||||||
docker compose up -d db | true
|
docker compose up -d postgres | true
|
||||||
docker compose run --no-deps app alembic revision --autogenerate -m "$(msg)"
|
docker compose run --no-deps api1 alembic revision --autogenerate -m "$(msg)"
|
||||||
|
|
||||||
.PHONY: docker-test
|
.PHONY: docker-test
|
||||||
docker-test: ## Run project tests
|
docker-test: ## Run project tests
|
||||||
docker compose -f compose.yml -f test-compose.yml run --rm app pytest tests --durations=0 -vv
|
docker compose -f compose.yml -f test-compose.yml run --rm api1 pytest tests --durations=0 -vv
|
||||||
|
|
||||||
.PHONY: docker-test-snapshot
|
.PHONY: docker-test-snapshot
|
||||||
docker-test-snapshot: ## Run project tests with inline snapshot
|
docker-test-snapshot: ## Run project tests with inline snapshot
|
||||||
docker compose -f compose.yml -f test-compose.yml run --rm app pytest tests --inline-snapshot=fix
|
docker compose -f compose.yml -f test-compose.yml run --rm api1 pytest tests --inline-snapshot=fix
|
||||||
|
|
||||||
.PHONY: safety
|
.PHONY: safety
|
||||||
safety: ## Check project and dependencies with safety https://github.com/pyupio/safety
|
safety: ## Check project and dependencies with safety https://github.com/pyupio/safety
|
||||||
docker compose run --rm app safety check
|
docker compose run --rm api1 safety check
|
||||||
|
|
||||||
.PHONY: py-upgrade
|
.PHONY: py-upgrade
|
||||||
py-upgrade: ## Upgrade project py files with pyupgrade library for python version 3.10
|
py-upgrade: ## Upgrade project py files with pyupgrade library for python version 3.10
|
||||||
pyupgrade --py313-plus `find app -name "*.py"`
|
pyupgrade --py313-plus `find api1 -name "*.py"`
|
||||||
|
|
||||||
.PHONY: lint
|
.PHONY: lint
|
||||||
lint: ## Lint project code.
|
lint: ## Lint project code.
|
||||||
@@ -47,16 +47,16 @@ lint: ## Lint project code.
|
|||||||
|
|
||||||
.PHONY: slim-build
|
.PHONY: slim-build
|
||||||
slim-build: ## with power of docker-slim build smaller and safer images
|
slim-build: ## with power of docker-slim build smaller and safer images
|
||||||
docker-slim build --compose-file docker-compose.yml --target-compose-svc app --dep-include-target-compose-svc-deps true --http-probe-exec app fastapi-sqlalchemy-asyncpg_app:latest
|
docker-slim build --compose-file docker-compose.yml --target-compose-svc api1 --dep-include-target-compose-svc-deps true --http-probe-exec api1 fastapi-sqlalchemy-asyncpg_api1:latest
|
||||||
|
|
||||||
.PHONY: docker-feed-database
|
.PHONY: docker-feed-database
|
||||||
docker-feed-database: ## create database objects and insert data
|
docker-feed-database: ## create database objects and insert data
|
||||||
docker compose exec db psql devdb devdb -f /home/gx/code/shakespeare_work.sql | true
|
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_work.sql | true
|
||||||
docker compose exec db psql devdb devdb -f /home/gx/code/shakespeare_chapter.sql | true
|
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_chapter.sql | true
|
||||||
docker compose exec db psql devdb devdb -f /home/gx/code/shakespeare_wordform.sql | true
|
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_wordform.sql | true
|
||||||
docker compose exec db psql devdb devdb -f /home/gx/code/shakespeare_character.sql | true
|
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_character.sql | true
|
||||||
docker compose exec db psql devdb devdb -f /home/gx/code/shakespeare_paragraph.sql | true
|
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_paragraph.sql | true
|
||||||
docker compose exec db psql devdb devdb -f /home/gx/code/shakespeare_character_work.sql
|
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_character_work.sql
|
||||||
|
|
||||||
.PHONY: model-generate
|
.PHONY: model-generate
|
||||||
model-generate: ## generate sqlalchemy models from database
|
model-generate: ## generate sqlalchemy models from database
|
||||||
|
|||||||
10
README.md
10
README.md
@@ -32,6 +32,7 @@
|
|||||||
<li><a href="#smtp-setup">Email Configuration</a></li>
|
<li><a href="#smtp-setup">Email Configuration</a></li>
|
||||||
<li><a href="#uv-knowledge-and-inspirations">UV knowledge and inspirations</a></li>
|
<li><a href="#uv-knowledge-and-inspirations">UV knowledge and inspirations</a></li>
|
||||||
<li><a href="#large-language-model">Integration with local LLM</a></li>
|
<li><a href="#large-language-model">Integration with local LLM</a></li>
|
||||||
|
<li><a href="#ha-sample-with-nginx-as-load-balancer">High Availability sample with nginx as load balancer</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#acknowledgments">Acknowledgments</a></li>
|
<li><a href="#acknowledgments">Acknowledgments</a></li>
|
||||||
@@ -184,6 +185,14 @@ ollama run llama3.2
|
|||||||
|
|
||||||
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|
||||||
|
|
||||||
|
### HA sample with nginx as load balancer
|
||||||
|
Sample high availability setup with nginx as load balancer and 2 uvicorn instances running on different ports.
|
||||||
|
```shell
|
||||||
|
make docker-up-ha
|
||||||
|
```
|
||||||
|
<p align="right">(<a href="#readme-top">back to top</a>)</p>
|
||||||
|
|
||||||
|
|
||||||
### UV knowledge and inspirations
|
### UV knowledge and inspirations
|
||||||
- https://docs.astral.sh/uv/
|
- https://docs.astral.sh/uv/
|
||||||
- https://hynek.me/articles/docker-uv/
|
- https://hynek.me/articles/docker-uv/
|
||||||
@@ -217,6 +226,7 @@ I've included a few of my favorites to kick things off!
|
|||||||
<details>
|
<details>
|
||||||
<summary>2025 (3 changes)</summary>
|
<summary>2025 (3 changes)</summary>
|
||||||
<ul>
|
<ul>
|
||||||
|
<li>[SEP 2 2025] add sample high availability with nginx as load balancer</li>
|
||||||
<li>[AUG 23 2025] intro exception handlers</li>
|
<li>[AUG 23 2025] intro exception handlers</li>
|
||||||
<li>[JUL some sunny day 2025] add rotoger</li>
|
<li>[JUL some sunny day 2025] add rotoger</li>
|
||||||
<li>[MAY 3, 2025] add large language model integration :robot:</li>
|
<li>[MAY 3, 2025] add large language model integration :robot:</li>
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ async def lifespan(app: FastAPI):
|
|||||||
"Postgres pool created", idle_size=app.postgres_pool.get_idle_size()
|
"Postgres pool created", idle_size=app.postgres_pool.get_idle_size()
|
||||||
)
|
)
|
||||||
yield
|
yield
|
||||||
|
except Exception as e:
|
||||||
|
await logger.aerror("Error during app startup", error=repr(e))
|
||||||
|
raise
|
||||||
finally:
|
finally:
|
||||||
await app.redis.close()
|
await app.redis.close()
|
||||||
await app.postgres_pool.close()
|
await app.postgres_pool.close()
|
||||||
|
|||||||
25
compose.yml
25
compose.yml
@@ -1,7 +1,6 @@
|
|||||||
services:
|
services:
|
||||||
app:
|
api1:
|
||||||
container_name: fsap_app
|
container_name: panettone_api1
|
||||||
network_mode: host
|
|
||||||
build: .
|
build: .
|
||||||
environment:
|
environment:
|
||||||
- PYTHONPATH=/panettone
|
- PYTHONPATH=/panettone
|
||||||
@@ -12,7 +11,6 @@ services:
|
|||||||
uvicorn app.main:app
|
uvicorn app.main:app
|
||||||
--host 0.0.0.0 --port 8080
|
--host 0.0.0.0 --port 8080
|
||||||
--lifespan=on --use-colors --loop uvloop --http httptools
|
--lifespan=on --use-colors --loop uvloop --http httptools
|
||||||
--reload --log-level debug
|
|
||||||
"
|
"
|
||||||
volumes:
|
volumes:
|
||||||
- ./app:/panettone/app
|
- ./app:/panettone/app
|
||||||
@@ -22,17 +20,16 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- "8080:8080"
|
- "8080:8080"
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- postgres
|
||||||
- inmemory
|
- redis
|
||||||
|
|
||||||
db:
|
postgres:
|
||||||
container_name: fsap_db
|
container_name: panettone_postgres
|
||||||
network_mode: host
|
|
||||||
build:
|
build:
|
||||||
context: ./db
|
context: ./db
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
volumes:
|
volumes:
|
||||||
- fastapi_postgres_data:/var/lib/postgresql/data
|
- panettone_postgres_data:/var/lib/postgresql/data
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
ports:
|
ports:
|
||||||
@@ -50,15 +47,15 @@ services:
|
|||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 5
|
retries: 5
|
||||||
|
|
||||||
inmemory:
|
redis:
|
||||||
image: redis:latest
|
image: redis:latest
|
||||||
network_mode: host
|
container_name: panettone_redis
|
||||||
container_name: fsap_inmemory
|
|
||||||
ports:
|
ports:
|
||||||
- "6379:6379"
|
- "6379:6379"
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
entrypoint: redis-server --appendonly yes
|
entrypoint: redis-server --appendonly yes
|
||||||
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
fastapi_postgres_data: {}
|
panettone_postgres_data: {}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
services:
|
services:
|
||||||
app:
|
api1:
|
||||||
environment:
|
environment:
|
||||||
- POSTGRES_DB=testdb
|
- POSTGRES_DB=testdb
|
||||||
|
|
||||||
db:
|
postgres:
|
||||||
environment:
|
environment:
|
||||||
- POSTGRES_USER=${POSTGRES_USER}
|
- POSTGRES_USER=${POSTGRES_USER}
|
||||||
- POSTGRES_DB=testdb
|
- POSTGRES_DB=testdb
|
||||||
Reference in New Issue
Block a user