Přejít k obsahu
acb.cz — audit a návrh přestavby

Nezávislý technický posudek · září 2026

Solidní dražební
stroj pod selhávajícím
povrchem.

acb.cz běží na Auctify/Auctea, což je skutečná víceklientská dražební platforma od sinfin.digital. Platforma umí dost. Vrstva, kterou 1. Art Consulting ukazuje veřejnosti, je o generaci pozadu — a měřitelně.

3,8Celkem z 10
7Zralost platformy
3Tato konkrétní instalace
4,1%bajtů HTML je obsah
8,5%stylopisu se používá

Měřeno na lokální kopii živého webu, jeho HTTP odpovědích, sitemapách a obou balících assetů. Kopie má 602 stránek; audit běžel nad 513 stránkami, které v tu chvíli existovaly, tedy nad 81,5 MB značkování. Každé číslo na této stránce bylo spočítáno, ne odhadnuto, pokud u něj není výslovně uvedeno ODHAD.

01

Šest redesignů

Každý z nich staví celý web znovu — všechny stránky, česky i anglicky — jako proklikatelnou statickou ukázku. Všech šest sdílí stejný obsah, stejný seznam stránek a stejné adresy. Liší se jen design. Dražení, vyhledávání a přihlášení jsou nahrané, ne zapojené: nikam se nic neodesílá.

Změřeno proti živému webu

Každý redesign vykresluje stejných 218 stránek ze stejného obsahového modelu, česky i anglicky. Čísla níže jsou spočítaná nad hotovým výstupem, stejným způsobem, jakým audit počítal živý web.

Přetečení se kontrolovalo na každé stránce při šířkách 390, 768, 1024 a 1440 — 872 kombinací stránka/šířka na každý redesign, nula chyb. Každý vnitřní odkaz a každý odkaz na obrázek ve všech vygenerovaných stránkách byl ověřen proti souborovému systému; žádný nechybí. Všech šest funguje i s vypnutým JavaScriptem.

02

Na čem web běží

Určeno z balíků, hlaviček a značkování
FrameworkRuby on Rails, serverem vykreslované ERB
x-runtime, x-request-id, session cookie Rails
PlatformaAuctify / Auctea — víceklientský dražební engine
auctea_application-themed-as-acb.css
CMSFolio
window.Folio, jmenný prostor tříd f-
Dodavatelsinfin.digital
poznámka v patičce, organizace sinfin na GitHubu
AssetySprockets, jeden CSS 763 KB a jeden JS 585 KB, bez dělení
NavigaceTurbolinks 5 — v roce 2021 nahrazené Turbem
ChováníStimulus, 99 registrovaných controllerů, 43 se používá veřejně
Realtimemessage_bus, HTTP long-poll
0 zmínek o WebSocket v 585 KB
UI knihovnyBootstrap 5.3.1, jQuery, Popper, PhotoSwipe, Dropzone, Tempus Dominus
PřihlašováníDevise + OmniAuth (Google, Apple, X), Cloudflare Turnstile
EdgeCloudflare pouze před HTML
MédiaVeřejný S3 bucket auctea, eu-central-1, bez CDN
MarketingGTM, Meta Pixel, Seznam Sklik, Consent Mode v2

Nejpřekvapivější nález. Stránka deklaruje <meta name="action-cable-url" content="/cable">, ale v JavaScriptovém balíku není jediný výskyt ActionCable, createConsumer ani WebSocket.

Živé dražení nese message_bus, knihovna HTTP long-pollingu z Discourse, s minimálním intervalem 100 ms — jeden otevřený požadavek na každého dražitele a aukci a k tomu dotažení JSON fragmentu při každém příhozu. Funguje to, a je to špatný přenos pro tuhle úlohu.

Co dostane každý anonymní návštěvník

56 z 99 Stimulus controllerů je back office — konzole licitátora, klávesové zkratky a zvuková upozornění operátora, pohled prezentujícího, pokladna, schvalování registrací dražitelů a ověřování uživatelů. Spolu s nimi i window.Auctify.API_URLS, tedy mapa koncových bodů pro operátora, licitátora a prezentujícího. Autorizace se pravděpodobně kontroluje na serveru; útočná plocha back office je ale i tak zveřejněná na každé stránce.

03

Jak se web dnes doručuje

Každé zobrazení stránky je vykreslení na origin serveru. Cloudflare stojí před HTML a neukládá z něj nic — aplikace posílá cache-control: max-age=0, private, must-revalidate a Cloudflare na každé měřené stránce odpovídá cf-cache-status: DYNAMIC. Čas do prvního bajtu se pohyboval od 0,35 s do 0,81 s. Katalog je 152 702 anonymních adres, pro všechny stejných, které se generují z databáze jedna po druhé.

Současná architektura, jak byla naměřena. Přepínač pohledů je uvnitř diagramu. Otevřít ve velkém ↗
04

Kde to bolí

Výkon — platí se za značkování, ne za obsah

24,6 : 1Poměr značkování k textu na 513 stránkách. 81,5 MB HTML nese 3,3 MB čitelného textu — obsah tvoří 4,1 % bajtů. Nejhorší stránka katalogu má poměr 54 : 1.
91,5 %Stylopisu o velikosti 763 KB se nikdy nepoužije. Na webu je 8 225 tříd; kdekoli na něm se objeví 698. Odesílá se 1 888 utility tříd Bootstrapu, používá se 21 z nich, a stojí 71 KB.
10 815Obrázků bez width a height — 77,8 % všech obrázků, a každý z nich posune rozvržení. Rozměry má jen 22,2 %.
0Deskriptorů w a atributů sizes. Každý srcset řeší jen hustotu pixelů, takže telefon se šířkou 360 px stahuje obrázek pro desktop.
0Direktiv preconnect na server S3, ze kterého jde všech zhruba 50 obrázků na stránce. První obrázek tak platí celé DNS a TLS navázání až po zpracování HTML.
58 355Atributů data-controller na webu, tedy 114 na stránku, k tomu 35 530 vložených SVG a 37 771 atributů style přímo v elementech.

Přístupnost — 3 / 10

0Odkazů pro přeskočení obsahu. Každý návštěvník projde tabulátorem sedmipoložkové menu, jeho podmenu, vyhledávací formulář a panel nastavení, než se dostane k obsahu.
0Oblastí aria-live — na webu, jehož hlavní funkcí je cena, která se mění v reálném čase. Nevidomý dražitel se nikdy nedozví, že byl přeplacen.
28 %Stránek má orientační bod <main>. Na úvodní stránce chybí <h1> úplně; její osnova začíná na h4. Na 31 % stránek je přeskočena úroveň nadpisu.
3,26 : 1Kontrast značkové zlaté #B18839 na bílé. WCAG AA požaduje pro text 4,5 : 1. Používá se jako text i jako bílý text na zlatém tlačítku. Přístupná varianta #8F6B24 v sadě tokenů existuje a nepoužívá se.
8,6 %Z 653 rámců iframe má atribut title. 642 prvků s role="dialog" nemá aria-modal ani přístupný název.

Vyhledávače — 3 / 10

0Bloků JSON-LD na 513 stránkách. Aukční dům se 72 578 záznamy o dílech nepublikuje žádná strukturovaná data typu Product, Offer, Event ani VisualArtwork.
152 702Obsahově chudých adres katalogu — 99,6 % sitemapy. Zdvojené v češtině i angličtině, se shodou 99,98 % slugů, bez popisu, bez strukturovaných dat a bez dosažených cen, protože ty jsou až po registraci. Přitom jsou jediným důvodem, proč katalog existuje.
0Značek meta robots, přestože robots.txt v komentáři tvrdí, že se indexace katalogu řídí právě jimi. Napsaná politika není zavedená.
58 %Stránek nemá meta popis, včetně 85 z 86 stránek katalogu. 192 stránek sdílí zdvojený titulek; 16 stránek aukcí má titulek úplně stejný.
22 %Stránek má hreflang a x-default se nepoužívá vůbec. Dvanáct anglických stránek je prázdná skořápka — anglický archiv výstav má 23 znaků, anglický rozcestník blogu nemá žádný, a přitom sitemapa uvádí 143 anglických adres blogu.

Bezpečnost a soukromí — 4 / 10

Chybí CSPA nejde doplnit levně: 6 418 vložených bloků <script> a 37 771 vložených stylů znamená, že jakákoli politika by potřebovala unsafe-inline a nic by nepřinesla. Skutečné CSP vyžaduje přestavbu šablon.
Chybí HSTSNa webu, který drží registrace dražitelů s osobními údaji. Chybí také Permissions-Policy, COOP a CORP.
5 × bez SRIBootstrap, js-cookie, cleave.js, intl-tel-input a html5sortable se tahají z cdnjs za běhu, bez otisku Subresource Integrity a bez CSP, které by je omezilo. Bootstrap se navíc načítá v neminifikované verzi.
Veřejný bucketKaždá fotografie díla jde nepodepsaná z s3.eu-central-1.amazonaws.com/auctea/, po cestě, která prozrazuje čas nahrání na sekundu. Celou obrazovou knihovnu lze stáhnout a vykrádat odkazem na náklady klienta.
SprávněPříznaky cookie (secure; HttpOnly; SameSite=Lax, 12 h), CSRF Rails v každém formuláři a opravdu dobře udělaný Consent Mode v2 se všemi šesti signály ve výchozím stavu zamítnutými a s Meta Pixelem drženým neaktivním až do souhlasu. Je to nejsilnější část webu.

Udržovatelnost — kázeň tam je, hygiena ne

Systém tříd je udělaný dobře: dva striktní jmenné prostory, a- pro Auctify a f- pro Folio, striktní BEM u 1 430 z 1 592 tříd, atomický slovník komponent a JavaScriptové háčky záměrně oddělené od stylovacích. Někdo nad tím přemýšlel.

A pak: 6 503 deklarací !important proti 10 363 pravidlům — 0,63 na pravidlo. Vrstva design tokenů, která existuje a obchází se: značková zlatá je natvrdo zapsaná jako #B18839 na 24 místech, zatímco var(--auctify-brand-200) se nepoužije ani jednou. 28 různých hodnot breakpointů bez jakékoli dohody. A 2 642 bajtů motivu jiného klienta (a-site-theme-sypka-*) uvnitř stylopisu ACB.

Stáří použitého přístupu
Používá seNahrazeno
Turbolinks 5Turbo, 2021
Jeden balík Sprocketsimportmap / jsbundling, Rails 7, 2021
jQueryzůstalo jen jako adaptér pro message_bus
message_bus long-pollWebSocket
role="document" v dialozíchvzor z doby před rokem 2016
ruční přepínač tmavého režimuprefers-color-scheme, použito 0×

Nic z toho není rozbité. Všechno je o generaci pozadu — a je to zrovna ta generace, která tyhle věci zlevnila.

05

Hodnocení

Dvanáct oblastí, každá hodnocená 0–10 proti spočítaným důkazům, pak zvážená. Váhy dávají nejvíc výkonu a vyhledávačům, protože tohle je firma, jejíž katalog je zároveň jejím marketingem.

3,8Vážený průměr
7 / 10Auctify jako platforma
3 / 10Instalace acb.cz

Na tomhle rozdílu stojí rozpočet. Vyměnit Auctify znamená postavit znovu funkční dražební engine — registrace dražitelů, limitní příhozy, prodloužený konec, konzoli licitátora, vypořádání. Vyměnit prezentační vrstvu opraví většinu toho, co je výše naměřeno.

Jen čtyři nálezy jsou skutečně na úrovni platformy a na úrovni klienta se opravit nedají: poměr značkování 24,6 : 1, stylopis o 763 KB, přenos přes long-polling a chybějící CSP.

06

Kolik stojí web provozovat

Český trh, rok 2026, všechny částky bez DPH a v korunách. Zveřejněné ceny jsou citované; všechno ostatní je odhad a je tak označené. O skutečné smlouvě ACB není veřejně nic — žádný záznam ve věstníku, žádná faktura, žádná zveřejněná provize.

Sazby českých agentur této třídy — odhad podle zveřejněných ceníků
RolenízkástřednívysokáKč / MD
Senior Rails vývojář1 4002 0002 80016 000
Frontend vývojář1 2001 8002 50014 400
UX/UI designér1 2001 7002 40013 600
Projektový manažer1 1001 6002 20012 800
Analytik1 2001 7002 40013 600
Smíšená sazba použitá dále1 800 Kč/h14 400

Sazby v korunách za hodinu. Ukotveno v analýze Ministerstva vnitra a EY nad 830 veřejnými ICT zakázkami z druhé poloviny roku 2024, kde medián za člověkoden vychází 10 328 Kč u programátora a 12 696 Kč u architekta. Produktová studia na volném trhu si účtují víc než mediány z veřejných tendrů, proto je sazebník výše nad nimi. Brněnské a pražské agentury zveřejňují 1 500–2 800 Kč/h.

Hosting pro tuto zátěž, měsíčně — odhad
VariantaKč / měsíc
Český VPS, bez správy
třída Vedos / Váš-Hosting / Forpsi
7 500–12 000
Hetzner Cloud7 500–9 500
DigitalOcean10 000–14 000
AWS eu-central-116 000–24 000
Přefakturováno agenturou15 000–35 000

České agentury přefakturovávají infrastrukturu zhruba 1,8× až 3× nad holé náklady, protože ta položka pokrývá i monitoring, ověřování záloh, pohotovost a marži. VSHosting má zveřejněný poplatek za správu 2 500 Kč měsíčně za server plus 990 Kč za každou další spravovanou službu, což samo o sobě dělá 6 500–8 500 Kč měsíčně ještě před jakýmkoli hardwarem.

Paušál za údržbu — odhad
Úroveňh / měsícKč / měsíc
Nízká — záplaty, monitoring, reaktivně6–812 000–16 000
Standard — navíc drobné změny, čtvrtletní upgrady12–1622 000–30 000
Vysoká — navíc SLA pro živé aukce, proaktivní práce20–3036 000–55 000

Běžný český trh „správy webu“ za 1 000–5 000 Kč měsíčně je pro weby třídy WordPress a na Rails monolit s realtime sběrnicí a katalogem o 76 000 záznamech se nevztahuje. Zde je pravděpodobná úroveň Standard.

Požadavky na změnu — odhad při 1 800 Kč/h
PrácehodinKč
Nová obsahová stránka ze stávajících bloků2–63 600–11 000
Nová stránka s vlastním rozvržením8–2014 000–36 000
Nový filtr v katalogu10–3018 000–54 000
Redesign jedné šablony20–5036 000–90 000
Nový jazyk60–150108 000–270 000
Napojení na externí službu30–10054 000–180 000
Nový typ aukce nebo změna pravidel dražby40–12072 000–216 000
Zveřejněný ceník Auctea — auctea.com, přepočteno kurzem 25 Kč/€
TarifKč / měsícRozsah
Startupod 1 475web s CMS, objednávky, fakturace
Growthod 8 125+ modul nabídky děl, prioritní podpora
Enterpriseod 16 250+ BankID, smlouvy, analytika
Customna vyžádání+ vývoj na míru, plné API

Odhad. ACB používá smlouvy, živé vysílání, hybridní dražbu v sále i online, archiv cen a vlastní vzhled. To je nad úrovní Enterprise — reálně 25 000 až 50 000 Kč měsíčně. Žádný zřizovací poplatek, poplatek za aukci ani provize nejsou nikde zveřejněné; pokud provize z dosažené ceny existuje, převáží všechny ostatní položky. Tohle je neověřené.

Celkové roční náklady vlastníka — odhad, platforma už postavená
Položkanízkopravděpodobněvysoko
Licence platformy96 000300 000600 000
Hosting, přefakturovaný120 000240 000420 000
Paušál za údržbu144 000300 000660 000
Požadavky na změnu100 000350 000900 000
Cloudflare, monitoring, pošta, SMS15 00040 00090 000
Ročně, Kč475 0001 230 0002 670 000

Pokud jsou licence a hosting sloučené do jednoho paušálu — což je u jednoho dlouhodobého klienta v Česku běžné — pravděpodobná částka vychází kolem 1,0 až 1,3 milionu korun ročně.

07

Dodavatelské riziko

Tahle sekce není o kódu, ale o tom, kdo ho drží a co z toho plyne. Všechno níže pochází z veřejných zdrojů: z patičky acb.cz, z veřejných repozitářů dodavatele, z registru balíků RubyGems a z ceníku, který dodavatel sám zveřejňuje. Nikde nepracuji se smlouvou, obratem ani cenou, kterou ACB platí — nic z toho veřejné není.

Co dodavatel provozuje

ProduktCo to jeJak se poskytujePoslední veřejná změna
Folioredakční systémotevřený zdrojový kód, licence MIT, používá se u klientů napříč obory14. 9. 2026
Boutiquee-shopový engineotevřený zdrojový kód, licence MIT27. 8. 2026
Auctifydražební engine — příhozy, žebříček kroků, automatické příhozy, registrace dražitelů, uzavírání aukcíotevřený zdrojový kód, licence MIT15. 11. 2024
Aucteadražební aplikace a služba, která ty enginy spojuje a doplňujekomerční, tarify Startup, Growth, Enterprise a Custombez veřejného repozitáře

Poslední vydaná verze balíku auctify na RubyGems je 1.1.5 z 5. 9. 2023. Hledání repozitáře auctea na GitHubu nevrací žádný výsledek.

Další aukční klienti

Dodavatel na svém webu uvádí u dražební vertikály tyto reference vedle 1. Art Consulting: Aukční dům Sýpka, Galerie Arcimboldo a Aukce aukcí. Jde tedy o jednu platformu obsluhující několik aukčních domů, ne o řešení postavené pro jednoho klienta.

Jak je acb.cz doručováno

jedna aplikaceStylopis se jmenuje auctea_application-themed-as-acb. Není to web ACB, je to aplikace Auctea obarvená pro ACB.
sdílený vzhledVe stylopisu ACB je 2 642 bajtů pravidel motivu jiného klienta (a-site-theme-sypka-*), z nichž se na acb.cz nepoužije ani jedno. Izolace mezi klienty není vynucená.
sdílené úložištěFotografie děl leží v S3 bucketu auctea na cestách /auctea/production/…, tedy ve společném úložišti platformy.
sdílený JavaScriptwindow.Auctify.API_URLS a 56 z 99 Stimulus controllerů patří back office platformy, ne webu ACB, a stahuje je každý návštěvník.

Kde je acb.cz pozadu za vlastní platformou

Tohle je nejkonkrétnější nález celé sekce. Dodavatel modernizaci udělal — jen se nedostala ke klientovi.

OblastCo má Folio dnesCo dostává acb.cz
FrameworkRails 8, Ruby 3.3—
Navigace mezi stránkamiturbo-rails je v projektuTurbolinks 5, nahrazené Turbem v roce 2021
Sestavení assetůsprockets, bez Propshaftu a importmapjeden balík 585 KB JS a 763 KB CSS, využito 8,5 %
Přenos příhozů—message_bus long-poll; značka action-cable-url je pozůstatek bez funkce
Práce s AIAGENTS.md, .cursorrules a 10+ vlastních dovedností v .skillsžádný měřitelný dopad na stav webu

V projektu Folio jsou turbo-rails i turbolinks současně. Přechod probíhá a není dokončený. acb.cz je na té starší větvi.

Signály, které jsem zachytil

Jsou to signály, ne závěry. Každý má víc možných vysvětlení. Dohromady ale ukazují jedním směrem.

22 měsícůDražební engine auctify nemá veřejnou změnu od listopadu 2024. Redakční systém Folio má změnu z dneška a přes 100 commitů za posledních dvanáct měsíců. E-shopový engine Boutique má změnu ze srpna 2026.
bez repozitářeAplikační vrstva Auctea, která obsahuje konzole operátora a licitátora, smlouvy, vypořádání a fakturaci, není veřejná nikde. Otevřené jsou enginy pod ní, ne produkt nad nimi.
jeden autorV redakčním systému Folio připadá naprostá většina commitů na jednoho člověka. Deset hvězd a dva forky na GitHubu znamenají, že mimo dodavatele to prakticky nikdo nepoužívá. Otevřená licence tu popisuje právní stav, ne komunitu.
133 issuesOtevřených hlášení v redakčním systému. U aktivně vyvíjeného projektu normální číslo; u projektu, který by musel převzít někdo jiný, je to seznam převzatých závazků.
schopnost bez dopaduDodavatel používá AI agenty organizovaně — má pro ně napsané vlastní dovednosti ke svému codebase. Na stavu acb.cz to vidět není. Schopnost existuje a ke klientovi se nedostává.

Hlavní rizika pro acb.cz

  1. Sdílená fronta priorit. Platforma obsluhuje několik aukčních domů z jednoho kódu. Změna, která se pere s jiným klientem, se neudělá, a ACB nemá jak to ovlivnit. Dva roky nepřevedeného tématu jsou měřitelný důsledek.
  2. Útlum vertikály. Dražební engine se veřejně nehýbe, zatímco ostatní produkty dodavatele ano. Riziko není, že systém spadne — funguje. Riziko je, že se přestane rozvíjet a ACB zůstane na verzi, která se rok od roku vzdaluje běžnému standardu.
  3. Závislost na neveřejné vrstvě. Enginy pod aplikací jsou pod licencí MIT a dají se převzít. Aplikace nad nimi — konzole, smlouvy, vypořádání, fakturace, živé vysílání — veřejná není. Odchod od dodavatele znamená tuhle vrstvu postavit znovu.
  4. Znalost domény je v jedné firmě. Pravidla příhozových kroků, prodlužování konce aukce, DPH, autorské poplatky a vypořádání s komitenty jsou v kódu, ne v dokumentu, který by ACB vlastnilo.
  5. Chybějící izolace mezi klienty. Motiv jiného aukčního domu uvnitř stylopisu ACB ukazuje, že hranice mezi klienty není technicky vynucená. Chyba nebo změna u jednoho klienta se může projevit u druhého.
  6. Riziko není v ceně. Je v tempu. Systém běží a dražby se konají. Co chybí, je rozvoj — a ten se v účetnictví neprojeví, dokud nezačne odcházet návštěvnost nebo dokud katalog nepřestane být vidět ve vyhledávačích.

Otázky, které mají číselnou odpověď

Nic z toho nejsou obvinění. Jsou to otázky, na které existuje konkrétní odpověď, a ta odpověď rozhoduje víc než cokoli v tomhle dokumentu.

  1. Kdy se ACB převede z Turbolinks a Sprockets na to, co už Folio má, a kolik to stojí? Je to jediná změna, která opravuje 585 KB i 763 KB najednou.
  2. Běží na acb.cz veřejný auctify, a v jaké verzi? Odpověď určuje, jak drahý by byl případný odchod.
  3. Jaká část paušálu je dostupnost a pohotovost, a jaká je vývoj? Ta první klesnout nemá; ta druhá po nasazení AI agentů ano.
  4. Kdo obsluhuje aukční večer a kolik lidí zná systém natolik, aby ho zastoupilo?
08

Přezkum zdrojového kódu

Enginy Auctify (dražební doména) a Folio (CMS) jsou pod licencí MIT a byly naklonovány a přečteny. Auctea, aplikace, která je na acb.cz spojuje, je neveřejná — proto každý nález říká, co je prokázané z veřejného kódu a co ještě závisí na neveřejné konfiguraci Auctey. Podrobné přezkumy jsou v angličtině, odkazy dole.

Skóre 0–10
OblastAuctifyFolio
Správnost dražební domény4—
Bezpečnost34
Síla testů47
Zdraví kódu76
Dokumentace39
Kázeň vydávání27
Zdraví projektu18

Jsou to dva různé objekty. Folio je zralý projekt: má CI, vydání každé tři týdny po léta, dopředu zdokumentované zásadní změny, 19 přispěvatelů za rok. Auctify je dobře napsaný engine o 2 500 řádcích, který od poloviny roku 2022 leží: 8 commitů za čtyři roky, bus faktor 1, za celou historii žádné CI.

Nálezy, které rozhodují — a co je ověřené

ověřenoPříhozy se neřadí zámkem. auction.rb:158 otevře transakci, ale nebere žádný zámek — nikde v repozitáři není lock!, SELECT FOR UPDATE, lock_version ani unikátní index na tabulce příhozů. Dva příhozy v poslední vteřině mohou být přijaty oba. To je sporné kladívko u díla za miliony. Ale: Auctea může příhoz obalit vlastním zámkem — gem už na with_advisory_lock závisí a používá ho při zavírání. Tuhle jednu otázku zodpoví jen kód Auctey.
ověřenoShodu vyhrává pozdější příhoz. bid.rb:7 řadí price: :desc, id: :desc. Při stejné ceně bere dílo řádek vložený jako druhý. Pravidla sálu říkají opak.
ověřenoProvize se počítá Floatem. base.rb:96 a :106 — percent * 0.01 * price. Ceny samotné jsou decimal(12,2) a čisté; tenhle Float nehne kladívkem, ale rozbíjí součty na fakturách. Oprava je jeden token.
v kódu ano, živě neEngine Auctify má scaffold controllery bez autorizace. application_controller.rb má jen protect_from_forgery. Doslova čteno by kdokoli mohl přihazovat za kohokoli. Ale ověřil jsem živý web: GET /auctify/bids vrací 404. Auctea tyhle cesty nemontuje. V gemu reálné, na acb.cz nevystavené.
v kódu ano, živě neověřenoFolio má stahovací endpoint bez přihlášení. downloads_controller.rb běží na holém ActionController::Base. Tvrzení o číselném výčtu napříč klienty je ale částečně přehnané — file.rb:453 záměrně vynucuje nečíselný slug. Výčet přes primární klíč by mohl fungovat jinou cestou; to jsem na živém webu nezkoušel, protože stahovat cizí soubory je útok, ne přezkum.
ověřenoAuctify se do moderního Rails nenainstaluje. auctify.gemspec drží rails "~> 6.1.4"; Folio běží na Rails 8. Nedají se nainstalovat spolu. Veřejný auctify tedy není engine, který běží na acb.cz — Auctea má privátní fork. Rails 6.1 je po konci bezpečnostní podpory.

Přehnaná tvrzení, která jsem zmírnil

Podrobný přezkum Folia hlásí několik kritických nálezů o úniku mezi klienty — samopovýšení na administrátora jiného webu, export cizích záznamů, spuštění skriptu editora na původu webu. Každý je věrohodným čtením skutečného kódu, ale všechny stojí na dvou předpokladech, které z venku neověřím: že acb.cz sdílí jedno nasazení Folia s ostatními aukčními domy, a že Auctea nepřidává autorizaci navrch. Předávám je jako seznam k prověření, ne jako potvrzené díry na acb.cz.

Kde je kód dobrý

penízeNa cenové cestě je decimal, ne float, v celých tabulkách příhozů.
historiePříhozy se nemažou, jen se označí cancelled. Spor lze zrekonstruovat.
proxyEngine limitních příhozů je nejsilnější část auctify a má skutečný deterministický test.
FolioSkutečná inženýrská organizace: CI, vydání po třech týdnech, UPGRADING.md, dopředu psané zásadní změny.

Je to zralý projekt a má ho aukční dům používat dál? Folio ano, zralé. Auctify ne, spící. A přesto: nechat běžet, nenahrazovat, nebrat do vlastní režie. Jediný nález, který může stát peníze — neuzamčený příhoz — je nejspíš už ošetřený uvnitř Auctey, protože zavírací cesta ten zámek používá. Nejděsivější bezpečnostní nálezy jsou ve veřejném enginu a na živém webu nejsou vystavené, nebo závisí na nasazení, které nevidíte. Vzít MIT kód do vlastní režie znamená převzít dražební engine na Rails 6.1, který se do moderního Rails nenainstaluje, plus 45 000 řádků CMS, kterému rozumí jedna firma na světě. To je víc rizika, ne míň.

Oprava odhadu. Dřív jsem odhadl odchod na open source na 2,0–2,75 mil. Kč zčásti proto, že „engine dostanete hotový a otestovaný zdarma". To bylo příliš optimistické: veřejný auctify je snímek z roku 2023 na Rails po konci podpory a před spuštěním se musí portovat. Reálný odchod je spíš 2,4–3,6 mil. Kč a zdědíte dva Rails, které jste nepsali.

Čtyři otázky na dodavatele, každá s číselnou odpovědí

  1. Řadí se odesílání příhozů zámkem, a kde? Tahle otázka rozhoduje o nálezu číslo jedna.
  2. Je GET /download/:id na nasazení dostupný, a jsou soubory Folia oborované podle webu?
  3. Sdílí acb.cz nasazení Folia s ostatními aukčními domy, nebo běží samostatně?
  4. Na jaké verzi Rails a Ruby běží živá Auctea, a kdy byly naposledy záplatované?

Podrobné přezkumy (anglicky): souhrn s ověřením · správnost dražby · bezpečnost Auctify · Folio · kvalita a zdraví projektu.

09

Kolik by stála stavba od nuly

Existuje jeden pevný bod. Případová studie samotného sinfin.digital uvádí, že projekt ACB byl dodán v roce 2024, zabral přes 300 člověkodnů a postavili ho tři lidé — jeden backendista, jeden frontendista a jeden UX/UI designér. Stihli to za 300, protože Folio i Auctify už existovaly. Dodavatel na zelené louce bez těchto enginů skončí u horní hranice rozpětí níže.

Rozsah A — web a katalog, bez dražebního enginu
Balík práceMDKč
Analýza, informační architektura, obsahový model8115 000
Drátěné modely, vizuální design, responzivita a tmavý režim22317 000
Jádro CMS — stránky, bloky, média, role25360 000
Datový model katalogu a import 76 000 záznamů15216 000
Vyhledávání a fasety v rozsahu 76 tisíc položek12173 000
Obrazová linka — příjem, varianty, CDN10144 000
Frontend všech šablon28403 000
Blog, statické stránky, formuláře, měření8115 000
Dvojjazyčnost cs + en8115 000
SEO, sitemapy, výkon7101 000
Testování, infrastruktura, předání15216 000
Vedení projektu19274 000
Celkem1772 549 000

Rozpětí 2,0 až 3,3 milionu Kč.

Rozsah B — celá platforma, sálové i časované aukce, platby, administrace
Balík práceMDKč
Všechno z rozsahu A1772 549 000
Registrace dražitelů, ověření totožnosti, schvalování20288 000
Časované aukce — limitní příhozy, kroky, prodloužený konec30432 000
Konzole pro sálovou aukci a rozhraní operátora28403 000
Realtime přenos, pořadí příhozů, zátěžové testy22317 000
Živé vysílání10144 000
Příjem děl, smlouvy, elektronický podpis25360 000
Platby, fakturace, vypořádání, DPH, autorské poplatky30432 000
Administrace a reporting25360 000
Archiv cen s analytikou12173 000
Bezpečnostní revize, zátěž, zkouška aukčního večera15216 000
Analýza a vedení navíc kvůli dražební doméně26374 000
Celkem4206 048 000

Rozpětí 5,0 až 8,5 milionu Kč při smíšené sazbě 14 400 Kč za člověkoden.

10

Jaký stack bych postavil místo toho

O téhle architektuře rozhodují tři věci. Veřejný web se čte, neobsluhuje — 99,6 % jeho adres je katalog, který nikdo needituje. Dražební engine se zapisuje, souběžně, lidmi, kteří mají v sázce peníze, a pořadí příhozů musí být prokazatelně správné. A klient je aukční dům, ne softwarová firma, takže provozní plocha musí zůstat malá.

Takže: předrenderovat na edge všechno, co se čte. Každý zápis, na kterém záleží, protáhnout jedním řadicím zapisovatelem. Držet jednu databázi jako zdroj pravdy a se vším ostatním — vyhledávacím indexem, obrazovými variantami — zacházet jako s projekcemi, které lze kdykoli postavit znovu.

Navržený stack
WebAstro 5 na Cloudflare Workers — předrenderované, ostrůvky jen tam, kde návštěvník něco dělá
APIHono, TypeScript, na Workers
DraženíJeden Durable Object na aukci — jednovláknový, takže pořadí plyne z konstrukce
DatabázePostgreSQL — katalog a append-only log událostí příhozů
VyhledáváníTypesense — fasety, tolerance překlepů, skládání české diakritiky
MédiaR2 pro originály, Cloudflare Images pro varianty, podepsané URL pro nezveřejněné položky
CMSPayload 3, ukládá do téže databáze PostgreSQL
FrontyCloudflare Queues — varianty, pošta, faktury
PlatbyStripe a česká platební brána; bankovní převod párovaný přes variabilní symbol
Navržená architektura. Čtyři pohledy: veřejná stránka, živé dražení, vyhledávání, média. Otevřít ve velkém ↗

Proč jeden zapisovatel na aukci

Durable Object zpracovává vždy jen jednu zprávu. Příhozový žebříček se zkontroluje a událost zapíše ve stejném kroku, takže dva příhozy ve stejné milisekundě nemohou vyhrát oba. Žádný advisory zámek, žádná optimistická smyčka, žádná dorovnávací úloha. Časovač prodlužující konec aukce sedí uvnitř téhož objektu jako stav, který prodlužuje, a rozesílání přes WebSocket sedí vedle stavu, který rozesílá.

Proč je log příhozů jen pro přidávání

Každý příhoz je neměnná událost s pořadovým číslem. Aktuální nejvyšší příhoz je projekce, ne uložené pole. Spornou dosaženou cenu lze zrekonstruovat i po měsících a majiteli díla se dá ukázat celý žebříček. Tohle je jediné místo v dražebním systému, kde se event sourcing zaplatí okamžitě.

Příhoz v posledních vteřinách — odeslání, seřazení, reakce limitu, prodloužený konec. Otevřít ve velkém ↗
Život položky — doménový model, který musí každá přestavba zvládnout. Otevřít ve velkém ↗

Co to přinese proti dnešku

OblastDnesCíl
Podíl obsahu v HTML4,1 %nad 25 %
Odeslané a využité CSS763 KB / 8,5 %pod 60 KB / nad 80 %
Cena zobrazení stránkypokaždé vykreslení na originuodpověď z edge, databáze se nedotkne
Přenos příhozůHTTP long-poll, minimum 100 msWebSocket, pořadí dané konstrukcí
Strukturovaná data0Organization, Event, Product, VisualArtwork, Breadcrumb
Katalog v indexu152 702 obsahově chudých adres, ceny skrytékurátorované stránky autorů a děl s viditelnými cenami
Přístupnostbez odkazu na obsah, bez h1, bez živých oblastíWCAG 2.2 AA, dražení oznamované odečítačem
CSPnelze zavést bez přepsání šablonna bázi nonce, žádný vložený skript
11

Metoda

  1. Stažení živého webu do lokálního stromu — 602 stránek HTML v češtině i angličtině (všechny obsahové stránky, všech 99 aukcí, všech 143 článků a vzorek katalogu), oba balíky assetů, písma, ikonový sprite, čtyři sitemapy a HTTP hlavičky. Celý katalog má 152 702 adres; stahovat ho celý by nebylo užitečné ani slušné.
  2. Určení stacku z balíků, otisků v názvech souborů, HTTP hlaviček a značkování — ne z tvrzení dodavatele.
  3. Každé číslo na této stránce bylo spočítáno skripty nad tím stromem. Kontrastní poměry jsou vypočtené z relativní luminance podle WCAG 2.1, ne odhadnuté okem.
  4. Ocenění českého trhu ze zveřejněných ceníků agentur, zveřejněných tarifů hostingů, ceníku Auctea a z analýzy Ministerstva vnitra nad 830 veřejnými ICT zakázkami. Odhady jsou označené jako odhady.
  5. Návrh cílové architektury podle domény, pak nakreslení a ověření diagramů.
  6. Šestinásobná přestavba celého webu z jednoho obsahového modelu, aby byly ty návrhy porovnatelné stránku po stránce.

Úplné pracovní podklady: technický audit a rozbor nákladů na českém trhu, oba včetně zdrojů.