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-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

View File

@@ -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>

View File

@@ -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()

View File

@@ -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: {}

View File

@@ -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