Szkielet aplikacji trójwarstwowej (prezentacja / logika / dane)

Trzy niezależne usługi FastAPI komunikujące się przez HTTP/JSON, każda
zna tylko adres warstwy bezpośrednio pod nią:

- presentation (:8000) — strona WWW + formularz
- logic (:8001) — reguły biznesowe, pośrednik
- data (:8002) — wyszukiwanie danych za interfejsem DataProvider

Warstwa danych: czytanie setek plików .xlsx z wykrywaniem nagłówka i
mapowaniem układu kolumn na schemat kanoniczny, z 4-poziomowym cache
(schemat L1, Parquet L2, wyniki zapytań L3, odwrócony indeks L4) i
unieważnianiem po odcisku pliku. Gotowa ścieżka migracji do SQL
(ingest/to_sql.py + SqlDataProvider, przełączane przez DATA_PROVIDER).

Zawiera docker-compose, Makefile, generator danych przykładowych.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-26 17:35:09 +02:00
parent a43d1ff955
commit 16d35c16dc
52 changed files with 1491 additions and 1 deletions
+38
View File
@@ -0,0 +1,38 @@
.PHONY: help up down sample reindex migrate sql dev-data dev-logic dev-presentation
help:
@echo "up - uruchom wszystkie 3 warstwy (docker compose)"
@echo "down - zatrzymaj"
@echo "sample - wygeneruj przykładowe pliki .xlsx"
@echo "reindex - zbuduj cache + indeks warstwy bazodanowej"
@echo "migrate - ETL: Excel -> SQL"
@echo "sql - uruchom z warstwą SQL (DATA_PROVIDER=sql)"
@echo "dev-* - uruchom pojedynczą warstwę lokalnie (bez dockera)"
up:
docker compose up --build
down:
docker compose down
sample:
cd services/data && python scripts/make_sample_data.py
reindex:
cd services/data && python -m app.ingest.build_index
migrate:
cd services/data && python -m app.ingest.to_sql
sql:
DATA_PROVIDER=sql docker compose up --build
# --- lokalny dev (3 osobne terminale) ---
dev-data:
cd services/data && uvicorn app.main:app --reload --port 8002
dev-logic:
cd services/logic && DATA_URL=http://localhost:8002 uvicorn app.main:app --reload --port 8001
dev-presentation:
cd services/presentation && LOGIC_URL=http://localhost:8001 uvicorn app.main:app --reload --port 8000