Skip to content

Commit b0c7722

Browse files
committed
compose refactor
1 parent ca89d54 commit b0c7722

File tree

5 files changed

+41
-31
lines changed

5 files changed

+41
-31
lines changed

Makefile

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,49 +14,49 @@ docker-up: ## Run project with compose
1414
docker-clean: ## Clean Reset project containers and volumes with compose
1515
docker compose down -v --remove-orphans | true
1616
docker compose rm -f | true
17-
docker volume rm fastapi_postgres_data | true
17+
docker volume rm panettone_postgres_data | true
1818

1919
.PHONY: docker-apply-db-migrations
2020
docker-apply-db-migrations: ## apply alembic migrations to database/schema
21-
docker compose run --rm app alembic upgrade head
21+
docker compose run --rm api1 alembic upgrade head
2222

2323
.PHONY: docker-create-db-migration
2424
docker-create-db-migration: ## Create new alembic database migration aka database revision. Example: make docker-create-db-migration msg="add users table"
25-
docker compose up -d db | true
26-
docker compose run --no-deps app alembic revision --autogenerate -m "$(msg)"
25+
docker compose up -d postgres | true
26+
docker compose run --no-deps api1 alembic revision --autogenerate -m "$(msg)"
2727

2828
.PHONY: docker-test
2929
docker-test: ## Run project tests
30-
docker compose -f compose.yml -f test-compose.yml run --rm app pytest tests --durations=0 -vv
30+
docker compose -f compose.yml -f test-compose.yml run --rm api1 pytest tests --durations=0 -vv
3131

3232
.PHONY: docker-test-snapshot
3333
docker-test-snapshot: ## Run project tests with inline snapshot
34-
docker compose -f compose.yml -f test-compose.yml run --rm app pytest tests --inline-snapshot=fix
34+
docker compose -f compose.yml -f test-compose.yml run --rm api1 pytest tests --inline-snapshot=fix
3535

3636
.PHONY: safety
3737
safety: ## Check project and dependencies with safety https://github.com/pyupio/safety
38-
docker compose run --rm app safety check
38+
docker compose run --rm api1 safety check
3939

4040
.PHONY: py-upgrade
4141
py-upgrade: ## Upgrade project py files with pyupgrade library for python version 3.10
42-
pyupgrade --py313-plus `find app -name "*.py"`
42+
pyupgrade --py313-plus `find api1 -name "*.py"`
4343

4444
.PHONY: lint
4545
lint: ## Lint project code.
4646
uv run ruff check --fix .
4747

4848
.PHONY: slim-build
4949
slim-build: ## with power of docker-slim build smaller and safer images
50-
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
50+
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
5151

5252
.PHONY: docker-feed-database
5353
docker-feed-database: ## create database objects and insert data
54-
docker compose exec db psql devdb devdb -f /home/gx/code/shakespeare_work.sql | true
55-
docker compose exec db psql devdb devdb -f /home/gx/code/shakespeare_chapter.sql | true
56-
docker compose exec db psql devdb devdb -f /home/gx/code/shakespeare_wordform.sql | true
57-
docker compose exec db psql devdb devdb -f /home/gx/code/shakespeare_character.sql | true
58-
docker compose exec db psql devdb devdb -f /home/gx/code/shakespeare_paragraph.sql | true
59-
docker compose exec db psql devdb devdb -f /home/gx/code/shakespeare_character_work.sql
54+
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_work.sql | true
55+
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_chapter.sql | true
56+
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_wordform.sql | true
57+
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_character.sql | true
58+
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_paragraph.sql | true
59+
docker compose exec postgres psql devdb devdb -f /home/gx/code/shakespeare_character_work.sql
6060

6161
.PHONY: model-generate
6262
model-generate: ## generate sqlalchemy models from database

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<li><a href="#smtp-setup">Email Configuration</a></li>
3333
<li><a href="#uv-knowledge-and-inspirations">UV knowledge and inspirations</a></li>
3434
<li><a href="#large-language-model">Integration with local LLM</a></li>
35+
<li><a href="#ha-sample-with-nginx-as-load-balancer">High Availability sample with nginx as load balancer</a></li>
3536
</ul>
3637
</li>
3738
<li><a href="#acknowledgments">Acknowledgments</a></li>
@@ -184,6 +185,14 @@ ollama run llama3.2
184185

185186
<p align="right">(<a href="#readme-top">back to top</a>)</p>
186187

188+
### HA sample with nginx as load balancer
189+
Sample high availability setup with nginx as load balancer and 2 uvicorn instances running on different ports.
190+
```shell
191+
make docker-up-ha
192+
```
193+
<p align="right">(<a href="#readme-top">back to top</a>)</p>
194+
195+
187196
### UV knowledge and inspirations
188197
- https://docs.astral.sh/uv/
189198
- https://hynek.me/articles/docker-uv/
@@ -217,6 +226,7 @@ I've included a few of my favorites to kick things off!
217226
<details>
218227
<summary>2025 (3 changes)</summary>
219228
<ul>
229+
<li>[SEP 2 2025] add sample high availability with nginx as load balancer</li>
220230
<li>[AUG 23 2025] intro exception handlers</li>
221231
<li>[JUL some sunny day 2025] add rotoger</li>
222232
<li>[MAY 3, 2025] add large language model integration :robot:</li>

app/main.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ async def lifespan(app: FastAPI):
3636
"Postgres pool created", idle_size=app.postgres_pool.get_idle_size()
3737
)
3838
yield
39+
except Exception as e:
40+
await logger.aerror("Error during app startup", error=repr(e))
41+
raise
3942
finally:
4043
await app.redis.close()
4144
await app.postgres_pool.close()

compose.yml

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
services:
2-
app:
3-
container_name: fsap_app
4-
network_mode: host
2+
api1:
3+
container_name: panettone_api1
54
build: .
65
environment:
76
- PYTHONPATH=/panettone
@@ -12,7 +11,6 @@ services:
1211
uvicorn app.main:app
1312
--host 0.0.0.0 --port 8080
1413
--lifespan=on --use-colors --loop uvloop --http httptools
15-
--reload --log-level debug
1614
"
1715
volumes:
1816
- ./app:/panettone/app
@@ -22,17 +20,16 @@ services:
2220
ports:
2321
- "8080:8080"
2422
depends_on:
25-
- db
26-
- inmemory
23+
- postgres
24+
- redis
2725

28-
db:
29-
container_name: fsap_db
30-
network_mode: host
26+
postgres:
27+
container_name: panettone_postgres
3128
build:
3229
context: ./db
3330
dockerfile: Dockerfile
3431
volumes:
35-
- fastapi_postgres_data:/var/lib/postgresql/data
32+
- panettone_postgres_data:/var/lib/postgresql/data
3633
env_file:
3734
- .env
3835
ports:
@@ -50,15 +47,15 @@ services:
5047
timeout: 5s
5148
retries: 5
5249

53-
inmemory:
50+
redis:
5451
image: redis:latest
55-
network_mode: host
56-
container_name: fsap_inmemory
52+
container_name: panettone_redis
5753
ports:
5854
- "6379:6379"
5955
env_file:
6056
- .env
6157
entrypoint: redis-server --appendonly yes
6258

59+
6360
volumes:
64-
fastapi_postgres_data: {}
61+
panettone_postgres_data: {}

test-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
services:
2-
app:
2+
api1:
33
environment:
44
- POSTGRES_DB=testdb
55

6-
db:
6+
postgres:
77
environment:
88
- POSTGRES_USER=${POSTGRES_USER}
99
- POSTGRES_DB=testdb

0 commit comments

Comments
 (0)