Historie – jak MiniShop vznikal
Deník kroků od první doménové události po zálohy v cloudu, s odkazy na podrobné souhrny v repozitáři.
Na této stránce
V jedné větě: MiniShop nevznikl naráz – začal jako obyčejná vrstvená aplikace a ve 13 krocích EDA a 13 krocích nasazení se z něj stal systém řízený událostmi, běžící v cloudu. Každý krok má v repozitáři podrobný souhrn.
Souhrny odkazované níže jsou návody a záznamy rozhodnutí – co se v kroku měnilo, proč, a jak to vyzkoušet. Dokumentace v aplikaci (tahle příručka) popisuje výsledný stav.
Cesta k event-driven architektuře
Plán: docs/EDA-roadmap.md
| Krok | Co přinesl | Souhrn |
|---|---|---|
| 1 | Doménové události v entitách (Entity, IDomainEvent) |
součást kroku 2 |
| 2 | Dispatcher – doručení událostí handlerům po uložení | krok-02 |
| 3 | Handlery místo přímých volání v OrderService |
krok-03 |
| 4 | Outbox – události v téže transakci jako data | krok-04 |
| 5 | Background worker – asynchronní doručení s opakováním | krok-05 |
| 6 | Inbox – idempotentní handlery | krok-06 |
| 7 | Integrační události a kontrakty …V1 |
krok-07 |
| 8 | RabbitMQ jako message broker | krok-08 |
| 9 | Sága objednávky s timeoutem a kompenzací | krok-09 |
| 10A | Modulární monolit – databáze na modul, kopie katalogu | krok-10a |
| 10B | Sklad jako samostatná služba, .NET Aspire | krok-10b |
| 11 | Observabilita – trasování přes zprávy | krok-11 |
| 12A | Proud událostí formuláře a projekce | krok-12a |
| 12B | Přehrání průběhu objednávky | krok-12b |
Cesta do cloudu
Plán (včetně výběru cloudu a rozpočtu): docs/Cloud-roadmap.md
| Krok | Co přinesl | Souhrn |
|---|---|---|
| 1 | Dockerfile, produkční konfigurace, data v /data |
cloud-01 |
| 2 | Docker Compose – „produkce na mém PC“ | cloud-02 |
| 3 | Účet Oracle Cloud, rozpočet, compartment, IAM | cloud-03 |
| 4 | Síť a VM ručně, první nasazení | cloud-04 |
| 5 | DuckDNS, HTTPS přes Caddy, heslo | cloud-05 |
| 6 | CI – build a testy, ochrana main |
cloud-06 |
| 7 | Image pro x86 i ARM v GHCR | cloud-07 |
| 8 | CD – automatické nasazení přes Tailscale | cloud-08 |
| 9 | Infrastruktura jako kód (OpenTofu) | cloud-09 |
| 10 | Secrets jen v GitHubu, rotace hesel | cloud-10 |
| 11 | Monitoring, Aspire dashboard v cloudu, alarmy | cloud-11 |
| 12 | Zálohy a obnova, cvičná havárie | cloud-12 |
| 13 | Vlastní doména minishop-tichy.cz, přesměrování ze staré adresy |
cloud-13 |
Uživatelské účty a role
Plán (role User a Admin, best practice): docs/Ucty-roadmap.md
| Krok | Co přinesl | Souhrn |
|---|---|---|
| 1 | Účty, registrace, přihlášení (ASP.NET Core Identity, users.db) |
ucty-01 |
| 2 | Role User/Admin, policies, fallback policy, první admin příkazem create-admin |
ucty-02 |
| 3 | Vlastník objednávky – zákazník vidí a ruší jen své, cizí = 404, jméno a e-mail z účtu | ucty-03 |
| 4 | Zrušení objednávky ve stavu Pending – odloženo | — |
| 5 | Skutečné e-maily – potvrzení e-mailu, nové heslo, stav objednávky (Gmail, lokálně Mailpit) | ucty-05 |
| 6 | Správa uživatelů – povýšení, blokace, poslední admin, audit; EF Core migrace users.db |
ucty-06 |
| 7 | Zabezpečení skladu – servisní klíč mezi Webem a Inventory.Api (zero trust) | ucty-07 |
| 8 | Zpevnění – zámek účtu, rate limiting, CSP a bezpečnostní hlavičky, logy bez osobních údajů | ucty-08 |
| 9 | Otevření webu – bez basic auth, objednávka jen s potvrzeným e-mailem, smazání účtu, ochrana osobních údajů | ucty-09 |
Dokončení e-shopu
Plán (výloha, košík, pokladna, expedice, platba, notifikace): docs/Eshop-roadmap.md
| Krok | Co přinesl | Souhrn |
|---|---|---|
| 1 | Migrace všech databází (EF Core, sdílený DatabaseMigrator, baseline produkčních DB) – schéma se mění bez mazání dat |
eshop-01 |
| 2A | Výloha /Shop – kategorie, hledání bez diakritiky, filtry, řazení; ProductUpdatedV2 (expand → contract), StockAvailabilityChangedV1 jen při změně pásma |
eshop-02a |
| 2B | Obrázky produktů – bezpečný upload do skladu (typ podle bajtů, bez SVG, 1 MB), ve zprávě jen jméno souboru, /media/products s cache na rok, zálohy |
eshop-02b |
| 3 | Košík – agregát Cart s invarianty v Orderingu (bez nové zprávy, zboží neblokuje), /Cart, počet kusů v hlavičce, ceny vždy aktuální z kopie katalogu |
eshop-03 |
| 4A | Pokladna /Checkout – objednávka s více položkami z košíku v jedné transakci, idempotentní příkaz (CheckoutId = verze košíku + concurrency token), žádné tiché zdražení, doprava (strategie) a adresa (hodnotový objekt) |
eshop-04a |
| 4B | Sledování průběhu (Journeys) přesunuto na pokladnu – stejné typy událostí, projekce pozná formulář, přehrávač má kopii pokladny i původního formuláře pro staré proudy; starý formulář objednávky a „Objednat“ ve výloze odstraněny | eshop-04b |
| 5 | Detail objednávky /Orders/{id} s časovou osou stavů – historie OrderStatusChange přímo v agregátu (jedna transakce se stavem), migrace doplnila historii starým objednávkám bez vymyšlených časů |
eshop-05 |
Proč po krocích
Každý krok řeší jeden problém, který předchozí krok odhalil, a po každém aplikace funguje. Tak je u každé techniky vidět, proč vznikla – ne jen jak vypadá.