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