compose refactor

This commit is contained in:
grillazz
2025-09-20 17:38:01 +02:00
parent ca89d54513
commit b0c7722d29
5 changed files with 41 additions and 31 deletions

View File

@@ -14,32 +14,32 @@ docker-up: ## Run project with compose
docker-clean: ## Clean Reset project containers and volumes with compose
docker compose down -v --remove-orphans | 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
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
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 run --no-deps app alembic revision --autogenerate -m "$(msg)"
docker compose up -d postgres | true
docker compose run --no-deps api1 alembic revision --autogenerate -m "$(msg)"
.PHONY: docker-test
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
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
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
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
lint: ## Lint project code.
@@ -47,16 +47,16 @@ lint: ## Lint project code.
.PHONY: slim-build
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
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 db 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 db 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 db psql devdb devdb -f /home/gx/code/shakespeare_character_work.sql
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_work.sql | true
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_chapter.sql | true
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_wordform.sql | true
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_character.sql | true
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_paragraph.sql | true
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_character_work.sql
.PHONY: model-generate
model-generate: ## generate sqlalchemy models from database

View File

@@ -32,6 +32,7 @@
<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="#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>
</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>
### 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
- https://docs.astral.sh/uv/
- https://hynek.me/articles/docker-uv/
@@ -217,6 +226,7 @@ I've included a few of my favorites to kick things off!
<details>
<summary>2025 (3 changes)</summary>
<ul>
<li>[SEP 2 2025] add sample high availability with nginx as load balancer</li>
<li>[AUG 23 2025] intro exception handlers</li>
<li>[JUL some sunny day 2025] add rotoger</li>
<li>[MAY 3, 2025] add large language model integration :robot:</li>

View File

@@ -36,6 +36,9 @@ async def lifespan(app: FastAPI):
"Postgres pool created", idle_size=app.postgres_pool.get_idle_size()
)
yield
except Exception as e:
await logger.aerror("Error during app startup", error=repr(e))
raise
finally:
await app.redis.close()
await app.postgres_pool.close()

View File

@@ -1,7 +1,6 @@
services:
app:
container_name: fsap_app
network_mode: host
api1:
container_name: panettone_api1
build: .
environment:
- PYTHONPATH=/panettone
@@ -12,7 +11,6 @@ services:
uvicorn app.main:app
--host 0.0.0.0 --port 8080
--lifespan=on --use-colors --loop uvloop --http httptools
--reload --log-level debug
"
volumes:
- ./app:/panettone/app
@@ -22,17 +20,16 @@ services:
ports:
- "8080:8080"
depends_on:
- db
- inmemory
- postgres
- redis
db:
container_name: fsap_db
network_mode: host
postgres:
container_name: panettone_postgres
build:
context: ./db
dockerfile: Dockerfile
volumes:
- fastapi_postgres_data:/var/lib/postgresql/data
- panettone_postgres_data:/var/lib/postgresql/data
env_file:
- .env
ports:
@@ -50,15 +47,15 @@ services:
timeout: 5s
retries: 5
inmemory:
redis:
image: redis:latest
network_mode: host
container_name: fsap_inmemory
container_name: panettone_redis
ports:
- "6379:6379"
env_file:
- .env
entrypoint: redis-server --appendonly yes
volumes:
fastapi_postgres_data: {}
panettone_postgres_data: {}

View File

@@ -1,9 +1,9 @@
services:
app:
api1:
environment:
- POSTGRES_DB=testdb
db:
postgres:
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_DB=testdb