Интернет-магазин запчастей Б/У:
что уже сделано
Каталог, импорт прайсов, наценки, автовыгрузка, заказы и админка. Ниже — проверки, замеры на 500 тыс. и 10 млн, архитектура и ответ про фотографии.
Что уже работает
Проверено на демо-стенде и локальных тестах.
Марка → модель → группа, алфавит А–Я, фильтры, сортировка по цене, подсказки в шапке.
CSV, XLSX и XML разных структур. Автоопределение кодировки, колонок, предпросмотр и запуск в фоне.
Процент, фикс, округление, правила для групп и марок. Расписание по ссылке с проверкой изменений.
Позиции из «Прочее» размечаются один раз, правило запоминается для следующих импортов.
Карточка товара, корзина, заказ без регистрации, регистрация, история заказов, заявки на подбор.
ЧПУ, sitemap, JSON-LD, canonical, robots. Фото поставщиков через прокси в WebP и кэш.
Что показали тесты
Каталог по марке/модели/группе укладывается в миллисекунды. Поиск — отдельная история, ниже честные цифры.
500 тыс. позиций целевой объём
| Страница марки / модели | 0,2–0,8 мс |
| Поиск по одному слову: подсчёт | 54 мс |
| Поиск по одному слову: топ-24 | 0,7 мс |
| Фасеты марок | 28 мс |
| Полнотекстовый поиск с рангом | 486 мс |
Замеры PostgreSQL на отдельной таблице 500 000 строк, те же индексы и запросы, что в каталоге.
10 млн позиций крайний случай
| Страница марки / модели | 0,3–0,8 мс |
| Keyset-пагинация | 0,26 мс |
| Группы модели | 0,68 мс |
| Фасеты марок | 723 мс |
| Поиск «бампер», топ-24 | 7,1 с |
7,1 с — это отдельный локальный тест на 10 млн, не демо-стенд. На 10 млн поиск по частым словам выносится в Meilisearch; на 500 тыс. PostgreSQL достаточно.
Как это устроено
Без платных CMS и лицензий: Go, PostgreSQL, S3/CDN для фото.



Почему сейчас заглушки и что будет с реальными фото
В демо 54 855 позиций из реальных прайсов — у них есть ссылки на фото поставщиков. Ещё 195 149 позиций синтетические, для проверки нагрузки; у них фото нет, поэтому показывается заглушка.
Реальное фото уже работает: прокси скачивает его у поставщика, режет под ширину, конвертирует в WebP и кладёт в кэш. Повторно отдаётся с диска.
- В карточках — 400 px, lazy loading, WebP 20–40 КБ.
- В карточке товара — до 900 px, кэш immutable.
- Оригиналы на сервере не хранятся: только ссылка и превью в кэше.
- В продакшене перед сервером ставится S3 + CDN; сервер не тратит диск на все 2,5 млн фото.
Что предлагаю дальше
Админ-доступ и руководство администратора передаются отдельно в чате Kwork. На этой странице нет паролей.