Specyfikacja techniczna — marketplace skryptallegro.pl

Framework inc/idx.php + inc/ofidx.php · PHP 8.3 (wersja produkcyjna) · plikowy NoSQL + opcjonalne MongoDB · stan: wdrożone i działające na VPS Forpsi 4-8 (4 vCPU / 8 GB / 80 GB NVMe) — aukcji.com

1. Czym jest system

Serwis ogłoszeniowo-auckcyjny klasy marketplace: zlecenia usługowe (stary serwis) + pełny moduł przedmiotów (licytacje, Kup teraz, katalog produktów, magazyny zdalne). Całość działa na plikowym silniku NoSQL własnej konstrukcji — bez zewnętrznych zależności PHP (bez Composera), z możliwością przełączenia warstwy indeksu na MongoDB jednym wpisem w configu.

2. Zrealizowane wymagania (co jest i jak działa)

2.1 Silnik indeksu — inc/idx.php + backendy

ElementImplementacjaEfekt
Rekordy aukcjidane/aukcje/s<i1>/<i2>/a-<id>.txt — 2-poziomowy shard po ID (65 536 katalogów liści)O(1) odczyt po ID; ~6 tys. plików/katalog przy 400 mln
Metyidx/meta/m-<id%8192>.php (mapa return array() — OPcache trzyma w RAM) + m-*.log ogon JSONL, kompaktowany do .php przy 3000 wierszy + m-*.php.ser (serialize — szybki odczyt bez OPcache)odczyt met ≈ pamięć; bez OPcache ~2–4× szybciej przez .ser
Postingi (odwrócony indeks)idx/post/<klucz>.log — append +id/-id tombstony, kompaktacja przy 20 000koszt zapytania = rozmiar pasujących list, nie bazy
Kluczekat: (każdy prefiks ścieżki), u:, e: EAN, kc: kod prod., t: typ, s: stan, l: kraj[:miasto], w: słowa (tekst+lokalizacja+sprzedawca), p:<sha1> parametry, pin:/pinpod: wyróżnienia, lic:/kup: licytowane/kupione userafacety, wykluczenia -słowo, EAN, sprzedawca
Zapytanienajmniejsza lista = driver → przecięcia AND / unie OR / NOT → reszta filtrów po metach → sort → strona → pełne rekordy tylko dla wyświetlanych 10 pozycjitypowy listing ~60–150 ms niezależnie od bazy
Fast-pathsorty po dacie (id rosnąco): mety ładowane tylko dla strony + pinów; liczba wyników z cache idx/cnt/ TTL 5 minstrona 500 kosztuje jak strona 1
Liczniki kategoriiidx/kat-cnt.json mapa ścieżka→n, różnicowo przy zapisiedrzewo z (x) <5 ms, te same filtry co lista
MongoDBinc/idx-mongo.php — te same kontrakty funkcji; kolekcje aukcje_meta (klucze w xk[] + multikey index) i katcnt; jeden find robi przecięcia; rekordy zostają plikamiauto-przełącznik MONGO_AUTO: przy ≥N aukcji system sam dogrzewa Mongo w tle (dual-write + import partiami, inc/idx-warm.php) i przełącza się bez rebuildu; tryb ręczny = samo MONGO_URI + rebuild; awaria Mongo = czytelny 503
Cache shardówhierarchia auto: OPcache → APCu/APC w RAM między żądaniami (klucz = plik+mtime+log, sam się unieważnia) → .ser → .php; per request LRU 32 shardydziała na każdym hostingu, z każdym rozszerzeniem które jest

2.2 Silnik ofert-zleceń — inc/ofidx.php (nowy, ta sama architektura)

Osobne drzewodane/ofidx/ — 512 shardów met + postingi (id ofert i aukcji z różnych liczników, nie mogą się zderzyć)
Kluczeofkat: prefiksy, ofu: user, oft: zleceniodawca/zleceniobiorca, ofs: status, ofl: kraj[:miasto], ofw: słowa, ofp:1 pilne, ofst: stawka, ofod: od kogo, ofpl: płeć, ofd:demo/real
Listingoferty_kandydaci_meta() — driver po kluczach + oferta_aktywna (okna demo) na metach; liczniki drzewa kategorii na tym samym zbiorze
Migracjapierwszy odczyt importuje stary oferty-indeks.txt → rename .migrated — upgrade bez ręcznego rebuildu

2.3 Funkcje sprzedażowe

2.4 Użytkownicy i skala kont

2.5 Integralność i bezpieczeństwo

2.6 SEO i UX

2.7 Operacja i instalacja

2.8 Środowisko produkcyjne — wdrożone i zmierzone (aukcji.com)

WarstwaKonfiguracja produkcyjnaWynik
Sprzęt/OSVPS Forpsi 4-8: 4 vCPU, 8 GB RAM, 80 GB NVMe, 1 Gb/s, 50 TB transferu/mies.; Ubuntu 24.04 LTS72 GB wolnego, ~5,2 mln inodów (~400–500 tys. aukcji ze zdjęciami)
Serwer HTTPApache 2.4.58 mpm_event (do 1024 równoległych połączeń, keep-alive 500 req/3 s) + proxy_fcgi; statyki bez PHP~8 300 żądań/s plików statycznych (zmierzone)
PHPPHP 8.3 PHP-FPM: pool dynamiczny do ~120 workerów, listen.backlog 4096; OPcache 512 MB / 50 tys. plików; memory_limit 512M; GD+webp; mod_mime_magic (typy MIME dla zdjęć bez rozszerzenia)~8 700–9 200 żądań/s index.php przy 100–300 równoległych — zmierzone ab na produkcji, 0 błędów, max 48 ms
Systemsysctl: somaxconn + syn_backlog 4096, deskryptory ~1 mlnskok kilku tys. jednoczesnych wejść = kolejka, nie błąd 500
Statystyki serwera w adminiewolne miejsce na dysku (alarm <1 GB), rozmiar + liczba plików idx/ i ofidx/, stan OPcache, data ostatniej przebudowy, transfer dzienny i miesięczny (vnStat na interfejsie, limit 50 TB)monitoring bez zewnętrznych narzędzi — wszystko w panelu
HTTPS/dostępLet's Encrypt, przekierowania wszystkich wariantów → https://www.; SFTP/SSH port 22; nosniff, SAMEORIGIN, Referrer-Policy; dane/ zablokowane (403)canonical https://www.aukcji.com

3. Wymagania serwerowe / hostingowe

To samo sprawdza przedinstall.php — tu pełna lista z wartościami „minimalne / zalecane". Czerwone = bez tego nie ruszy, pomarańczowe = ruszy ale gorzej.

3.1 Wymagane (czerwone — bez tego instalacja stoi)

WymaganieMinimumZalecanePo co
PHP8.08.3 + PHP-FPM (stan produkcyjny)składnia, wydajność; brak Composer i zewnętrznych zależności
Rozszerzeniambstring, json, session, pcre+ openssl, fileinfoszukajka (mb_*), rekordy, sesje, slugi, tokeny, typy plików
getimagesizetak (GD)pełne GD + webprozpoznawanie JPG/PNG/WEBP przy uploadzie
Zapis na dyskurealny zapis w dane/, real/, demo/ (test pliku, nie samo is_writable)—rekordy, indeksy, zdjęcia, sesje
memory_limit128M (<128M = stop)512M przy milionach rekordówmapy met, przecięcia zbiorów
mod_rewrite (Apache)tak — SEO URLe—.htaccess. LiteSpeed czyta .htaccess jak Apache — działa od razu. Ręcznie przepisać trzeba dopiero na Nginx / OpenLiteSpeed (uwaga pomarańczowa)

3.2 Wydajność (pomarańczowe — ruszy, ale warto)

ParametrMinimum rozsądneZalecaneEfekt gdy za mało
OPcachewłączony (install próbuje .user.ini/php_flag)memory_consumption=256+shardy met w RAM. Bez niego działa — fallback: shardy .ser (unserialize ~2–4× szybciej niż parse .php) + APCu/APC w RAM gdy hosting je ma
APCu / APCnie wymaganeobecneplan B gdy OPcache off: mety shardów w RAM między żądaniami (klucz z mtime — sam się unieważnia)
max_execution_time60 s300 s (rebuild indeksu)rebuild ma checkpointy — przy 30 s idzie partiami (admin: auto-odświeżanie + dobijanie przy odwiedzinach); dłuższy = szybciej
upload_max_filesize2M10Mzdjęcia aukcji/logo/katalog kompresowane w przeglądarce do ~20–200 kB przed wysyłką — limit dotyczy już tylko drobnych uploadów admina
post_max_size8M (0 = bez limitu)30Mformularz = tekst + nazwy plików; zdjęcia lecą osobnymi małymi żądaniami AJAX
Wolne miejsce5 GB20 GB+ (fotka ~18 kB × mln aukcji × 10 = ~180 GB)rekordy+zdjęcia+indeksy; magazyny zdalne odciążają
cURL lub allow_url_fopenjedno z dwóchcURLwysyłka do magazynów zdalnych (bez tego tylko lokalne)
HTTPScertyfikat (Let's Encrypt)wymuszony (htaccess już przepisuje)sesje/hasła, SEO (Google premiuje)

3.3 Opcjonalne rozszerzenia skali

ElementWarunekCo daje
mongodb ext (pecl)+ działający serwer MongoDB (Atlas/VPS) + MONGO_URI w configu; MONGO_AUTO = próg aukcjiindeks przecina w Mongo zamiast w PHP — setki mln rekordów, odciążony PHP; włącza się automatycznie po przekroczeniu progu aukcji — dogrzewanie w tle z dual-write, przełączenie bez ręcznego rebuildu, postęp widać w adminie („mongo-warm")
Serwery-magazyny per użytkownikupusc.php + ten sam klucz na każdej maszynie; admin wpisuje userowi jego URLkażdy sprzedawca może mieć własny serwer na zdjęcia/treść swoich aukcji — transfer i dysk rozchodzą się po wielu maszynach, indeks zostaje u nas
Serwer katalogujak wyżej + pole serwer na pozycji katalogowejkatalog: zdjęcia + pełne opisy (endpoint ?opis=), migracja lokalny↔zdalny↔inny-zdalny z admina
Sklep na obcym hostingu/domeniesklep-proxy.php (1 plik, zero zależności) + klucz API z Konto → Sklep; tryb MASTER = wszystkie sklepy po slugustorefront u partnera — nasza kasa, rozliczenie i atrybucja sprzedaży; dowolna liczba sklepów poza naszą infrastrukturą
CDN (Cloudflare/CloudFront)DNS przed domenącache HTML/obrazków na wejściu, WAF/DDoS

3.4 Prognoza przepustowości (ile userów naraz, dziennie, miesięcznie)

„Użytkownik dziennie" = unikalny odwiedzający przy ~10 odsłonach/wizytę (~30% powracających); „miesięcznie" = z puli dzienni×30 po korekcie powtórek. Liczby szacunkowe — wyjdą z logów po starcie.

KonfiguracjaŻądań/sOnline narazUżytk./dzieńUżytk./mies.Baza komfortowaWartość skryptu*
Shared PHP 8.x + OPcache (LiteSpeed/Apache)~30–80~800–2 500~10–30 tys.~250–800 tys.setki tys. aukcji~400–650 tys. zł
▶ VPS 4 vCPU / 8 GB, PHP 8.3 PHP-FPM + OPcache — NASZA OBECNA WERSJA~9 000 zmierzone (ab, localhost); ~1 500–3 000 realnie przez internet~15 000–45 000~50–150 tys.~1,5–4 mlnmiliony aukcji~500–800 tys. zł
▶ VPS + Mongo (indeks poza PHP) — NASZA NASTĘPNA WERSJA, włączy się AUTO przy progu aukcji min. 100 000~2 000–4 000~30 000–60 000~100–300 tys.~3–8 mlndziesiątki mln~600–900 tys. zł
+ page-cache anonimów + CDN (do dodania)~10 000+~100 000+~300 tys.–1 mln~8–20 mlnpopularne strony z cache~700–950 tys. zł
Allegro (dane publiczne)~2–20 tys. req/s (szczyt)~0,5–2 mln~5–8 mln~20+ mln~200+ mln ofert~30–40 mld zł (kapitalizacja)

Sufit to CPU PHP, nie łącze — port 10 Gbps przeniósłby ~10–25 tys. odsłon/s, czyli sieć przestaje być tematem długo przed procesorem. Limit antybot 5 req/s jest per IP — boty nie zajmują przepustowości innych. Wartości produkcyjne nie są szacunkiem — zmierzone Apache Bench na żywym VPS: ~9 200 żądań/s na index.php przy 300 równoległych (0 błędów); realny sufit przez internet (TLS+latency) ~1 500–3 000 żądań/s.

*„Wartość skryptu" = szacunkowy koszt wykonania równoważnego rozwiązania u software house/agencji (lata-praca inżynierów), nie wycena gotowej firmy — serwisu bez ruchu i marki nikt tyle nie zapłaci. Allegro dla skali: tysiące serwerów, własne DC, setki inżynierów — nasz wiersz wyżej pokazuje, że ta sama klasa produktu działa na 1 maszynie.

Wycena rozwiązania (stan produkcyjny)

SkładowaZakres pracKoszt rynkowy*
Silnik indeksu NoSQL (odwrócony indeks, tombstony, kompaktacja, facety, liczniki, sitemap, autocomplete)~12–18 mies. inż.~200–350 tys. zł
Backend podmienny MongoDB + atomowe zapisy (flock-shardy) + cache wielowarstwowy (OPcache→APCu→.ser)~4–6 mies. inż.~80–120 tys. zł
Funkcje marketplace: 5 typów aukcji, KupTeraz-wielosztuki, koszyk gościa, katalog EAN + przechwytywanie, warianty, wyróżnienia, zniżki czasowe~10–14 mies. inż.~180–280 tys. zł
Konta/użytkownicy: shardowane rekordy, saldo/rozliczenia, odznaki (poziomy + „Pewna wysyłka"), oceny, wiadomości, limity per user~4–6 mies. inż.~80–120 tys. zł
Magazyny zdalne (serwer per user / per aukcja / katalog, migracje, publiczny endpoint opisów)~2–3 mies. inż.~40–70 tys. zł
Sklepy rekomendujące (storefront sklep.php + zewnętrzny sklep-proxy.php, klucze API/MASTER, atrybucja i prowizje)~2–3 mies. inż.~40–60 tys. zł
Panel admina: kategorie (drill-down, bulk, slug+migracja), użytkownicy, cennik, odznaki, statystyki serwera (dysk, indeksy, OPcache, transfer vnStat dzienny/miesięczny), rebuild chunkowany~3–5 mies. inż.~60–100 tys. zł
Instalator + diagnostyka (install.php/przedinstall.php, auto-.user.ini) + konfiguracja produkcyjna (PHP-FPM/mpm_event/sysctl)~1–2 mies. inż.~20–40 tys. zł
RAZEM~38–57 mies. inżynierskich~700 tys. – 1,14 mln zł

*Wycena wg stawek agencji PL (~15–20 tys. zł/mies. inż.). To koszt odtworzenia równoważnego systemu — realna cena sprzedaży licencji/serwisu zależy od ruchu, marki i danych, nie od kosztu produkcji.

3.5 Szacunkowy rozkład ruchu po kategoriach głównych

Szacunek wg wzorców OLX/Allegro (portal ogłoszeniowo-sprzedażowy, PL) — do planowania shardingu „serwer na kategorię". Liczby realne wyjdą dopiero z logów i dane/idx/kat-cnt.json; kolumna „serwerów" pokazuje, ile maszyn przypadłoby na kategorię przy farmie 20 sztuk.

Kategoria (slug)Szac. udział ruchuSerwerów /20Uwaga
motoryzacja~35–45%7–9zdecydowany lider — części samochodowe, auta, opony. Jedna maszyna jej nie udźwignie — trzeba sub-sharda po hashu ID wewnątrz kategorii
elektronika~10–14%2–3telefony, laptopy — druga pod względem ruchu i liczby ofert
moda~7–10%2odzież/obuwie — dużo ofert, krótki cykl życia
nieruchomosci~5–8%1–2duży ruch wyszukiwań, mało ofert, długie sesje
dom-i-wyposazenie~5–7%1meble, AGD — stabilny ruch
zlecenia~4–8%*1–2*profil serwisu — jeśli marka stoi na zleceniach, udział rośnie do 15–30%
zdrowie + uroda~4–6%1kosmetyki/suplementy — wysoka rotacja ofert
dziecko~3–5%1wózki, ubranka — lojalni powracający
ogrod~2–4%wspólnymocno sezonowa (wiosna ×3)
kultura + rozrywka~2–4%wspólnyksiążki, gry, multimedia
turystyka~2–3%wspólnysezonowa
wirtualne~1–3%wspólnykonta, klucze, e-booki
uslugi~1–3%wspólnyprzedmiotowa kategoria usług (nie mylić z „zlecenia")
kolekcje-i-sztuka~1%wspólnynisha, ale wysoka wartość transakcji
bilety-i-doladowania<1%wspólnyspike'i przy wydarzeniach
spozywcze<1%wspólny—
pozostale<1%wspólnyworek resztkowy

Wniosek dla architektury 20-serwerowej: podział „1 serwer = 1 kategoria" marnuje maszyny — ~9 kategorii daje łącznie <5% ruchu. Optymalnie: motoryzacja na kilku maszynach (sub-shard po id % n), elektronika/moda na osobnych, a ~10 zimnych kategorii na jednym wspólnym. Realny rozkład mierzy się z liczników kat-cnt.json (oferty) i logów HTTP (odsłony) — procenty powyżej to punkt startowy, nie fakt.

4. Porównanie z Allegro

ObszarNasz silnikAllegroOcena
Wyszukiwanieodwrócony indeks w: (postingi/Mongo xk[])Elasticsearch, klastryta sama idea, uczciwa implementacja
Kategorie dowolnej głębokości + licznikitak — prefiksy kat:, kat-cnt różnicowotakpełne
Facety/parametryp: postingi, OR w parametrzetakpełne
Wykluczenia -słowoNOT po postingachtakpełne
Sprzedawca w szukajcew blobie szuktakpełne
EAN/kod/katalog produktówdokładne e:/kc: + własny Katalog + PrzechwytywanieKatalog Produktówpełne funkcjonalnie
Licytacje + KupTeraz + wielosztuki5 typów, atomowe zapisytakpełne
Wyróżnienia/promowanepin/pinpod/kolor/pogrubPromowanepełne
Lokalizacja + promieńkraj/miasto/+km geotakpełne
Ceny promocyjne w czasietabela 6 h, zamrożenie końcówkiStrefa okazjipełne (mechanika prostsza)
Wygaśnięcie bez cronalazy przy odczycieschedulerypełne
Magazyny zdalne treści/zdjęćserwery A/B przez upusc.php, linki prosto do przeglądarkiCDN własnygotowe (to już jest!)
Paginacja10/strona, koszt ~stały ze stroną60/strona + infinite scrollpełne
Wiadomości/koszyk/saldo/prowizje/rozliczeniatak, własne karty; koszyk też dla gościa (localStorage + widget, scalany przy logowaniu)takpełne
Autocompletesłowa tytułów + kategorie (ac.json)tak, MLjest — bez ML/korekty
Ranking trafności (BM25)sort tylko po polach (data/cena/koniec/sprzedane)trafność + CTR + MLbrak
Analiza językanormalizacja + podciąg; bez stemmingu/odmian/synonimów/literówek„czy chodziło Ci o…", odmianybrak
Personalizacja/rekomendacjenieranking pod użytkownika, MLbrak
Płatności (bramka, escrow, zwroty kupującego)saldo wewnętrzne, brak bramkiAllegro Pay, Ochrona Kupującychbrak
Zwroty/reklamacje/ochrona kupującegoproste karty rozliczeniowepełny processzkielet
API publiczne (REST)tylko wewnętrzne ajax.phpAllegro REST APIbrak
Multi-DC/replikacja/failover1 serwer + magazyny treściklastry, replikacjainfrastruktura
Aplikacja mobilna/PWA/pushresponsive WWWapki + pushbrak
Odporność DDoS/WAFantybot 5 req/s per IPsystemy dedykowanepodstawowy
Testy automatyczne/monitoring/CI-CDbrak (review + przedinstall)pełnebrak
Koszt uruchomienia1 hosting/VPScentra danych, zespołynasza przewaga

4.1 Skala — ilu użytkowników obsłuży skrypt PHP 8.3 bez zaplecza serwerowni

Uczciwe porównanie: nasz silnik na jednym VPS-ie (zero własnej infrastruktury) vs Allegro na tysiącach serwerów. „Użytkownik dziennie/miesięcznie" jak w 3.4 (~10 odsłon na wizytę).

ŚrodowiskoUżytkowników dziennieUżytkowników miesięcznieUwaga
Nasz skrypt — shared PHP 8.x + OPcache~10–30 tys.~250–800 tys.1 hosting za kilka zł/mies.; shardy + postingi robią całą robotę
Nasz skrypt — VPS PHP 8.3 PHP-FPM + OPcache (stan produkcyjny aukcji.com)~50–150 tys.~1,5–4 mln1 maszyna za ~50 zł/mies.; zmierzone ~9 000 żądań/s — wciąż brak „serwerowni"
Nasz skrypt — VPS + MongoDB (indeks poza PHP)~100–300 tys.~3–8 mlnprzełącznik w configu, bez zmiany kodu stron
Nasz skrypt — + page-cache anonimów + CDN~300 tys.–1 mln~8–20 mln90%+ odsłon to anonimowi czytający — cache zdejmuje je z PHP
Allegro (dane publiczne)~5–8 mln~20+ mlntysiące serwerów, własne DC, setki inżynierów

Czytaj uczciwie: różnica nasz-vs-Allegro to ~1–2 rzędy wielkości na jednej maszynie, a nie tysiące ×. Per-serwer Allegro też serwuje dziesiątki tys. userów dziennie — po prostu ma ich tysiące maszyn i klaster płatności/wyszukiwania. Nasz zmierzony sufit na jednym VPS-ie (miliony użytkowników miesięcznie) to skala dużego polskiego portalu — wystarczająca, żeby serwis „żył" i zarabiał. Kolejne mnożniki bez zmiany kodu: MongoDB (~2–3×) → page-cache+CDN (~5–10×) — w tej kolejności, jak ruch rośnie.

5. Czego brakuje — POZA serwerownią (ta już jest: treść/zdjęcia na zewnątrz)

Podział danych na zewnętrzne dyski jest już wdrożony (magazyny A/B). Poniżej to, co jeszcze realnie blokuje poziom „dużego portalu":

Priorytet wysoki — zanim duży ruch

Skala / jakość wyszukiwania

Funkcje produktowe (luka vs Allegro)

Operacyjne

6. Uczciwe granice:

Jest: produkcyjny marketplace w 80% aukcyjnym jak Allegro, wieloserwerowy z prawdziwym silnikiem indeksowym — setki miliony rekordów, miliony użytkowników, magazyny zdalne treści/zdjęć, przełącznik na MongoDB bez zmiany kodu stron, skalowanie horyzontalne (stateless, rekordy/indeksy rozdzielone).

Nie jest: klastrem Allegro — czyli nie jest podzielony na działów rozłożonych na różne serwery zdalne, bez replikacji multi-DC, rankingu ML, płatności/escrow, aplikacji mobilnej i API publicznego. Do poziomu „Allegro" brakuje warstwy biznesowo-prawnej i operacyjnej (monitoring, testy, CDN, replikacja) — nie silnika.


kontakt@skryptallegro.pl - w zależności od wersji wyposażenia od 5.000 PLN do 1.000.000 PLN. Jeżeli chodzi o wersje klastrowe ceny od 10.000.000 PLN (aplikacyjnie działające po stronie urządzenia klienta w 90%).