Что у CartSome
под капотом.
CartSome — это целый магазин: витрина, оформление заказа, доставка и админка, которым вы управляете из привычного ИИ-клиента. Его делают люди, которые строят банки, и он быстрый, потому что мы это измеряем. Внутри: ячейка, которая обслуживает магазины, управляющий контур, который ведёт платформу, жёсткая граница между ними, своя схема на каждый магазин и ячейки по несколько сотен магазинов. Ниже — как всё это собрано, к чему допущен ИИ и как магазин переезжает. Ни одно модное словечко не пострадало.
- Делают люди, которые строят банки
- Магазины и платформа на разных ядрах
- Схема и два логина на каждый магазин
- Ячейки примерно по 300 магазинов
- 314 действий в магазине через MCP, с отменой
Делают люди,
которые строят банки.
Скорость у нас в ДНК. Как и привычка не терять ваши деньги. CartSome делают люди, которые строят банки, и это видно в самых неброских местах: одна точка записи для денег и остатков, след от каждого действия, предпросмотр перед каждой крупной записью и цифра за каждым утверждением.
- Сначала правильно, потом быстроДеньги и остатки записывает только один сервис — shop-core. Платежи проверяются на сервере, а не принимаются на веру от браузера, и браузер считает суммы в целых центах.
- Всё оставляет следКаждая выдача или отзыв доступа записывается в той же транзакции, что и само действие, а каждое действие оператора — в журнал платформы.
- Скучно — и это нарочноPostgreSQL, Java, чистый SQL и Terraform: инструменты, которые никуда не денутся и через десять лет, и никакого хитроумного слоя, который придётся отлаживать в 3 часа ночи.
- Измеряем, а не гадаемКаждое изменение в том, как витрина читает данные, до релиза проходит бенчмарк на каталоге из 500 000 товаров. Догадка — это то, с чего бенчмарк начинается, а не то, чем он заканчивается.
Быстро. И проверки не дают замедлиться
бюджет на некэшированную страницу списка товаров по p95 при каталоге из 500 000 товаров. Фильтру, прокрутке или поиску — 150.
смещение макета на главной и страницах товаров autotools.ee при времени блокировки меньше 30 мс. Замер 29 октября 2026 г.
сверх main — и страница уже не проходит проверку скорости.
- Рендер на сервере, кэш на краю сетиСтраницы приходят готовым HTML на языке покупателя, а shop-core держит списки и страницы товаров прогретыми в Valkey.
- Бюджет в байтах прямо в CIТочка входа витрины, её оболочка и каждый чанк маршрута при каждом изменении укладываются в бюджет, а бюджет может только уменьшаться. Каждый язык лежит в отдельном чанке, так что покупатель скачивает только один.
- Проверка скорости перед релизомОна собирает main и изменение бок о бок и бракует страницу, которая стала тяжелее или медленнее в Lighthouse — по загрузке, смещению макета или времени блокировки.
- Проверка худшего случаяВсе опции темы на максимум, все типы секций разом — и магазин всё равно не имеет права тормозить. Темы — это CSS-переменные, поэтому тема не добавляет ни строчки JavaScript.
- Лёгкие картинкиКаждое изображение товара пережимается в варианты AVIF, а статические файлы отдаются заранее сжатыми brotli.
Две половины.
Жёсткая граница.
Большинство платформ обрастают отдельным сервисом под каждую функцию. Мы делим систему ровно в одном месте: магазины по одну сторону, платформа — по другую. У каждой половины своё приложение, своё ядро, свой логин в базе данных и своя половина ключа. И старое правило действует по обе стороны: пишет только ядро.
- shop-core — ячейка, на Java 25 и Spring BootЕдинственный, кто пишет данные магазинов в PostgreSQL, Valkey и S3. Через него проходит каждое изменение в админке, каждый импорт, платёж и фоновая задача магазина. Он недоступен из публичного интернета, сам проверяет каждый платёжный вебхук и каждую подпись и открывает запечатанные секреты магазинов.
- platform-core — управляющий контурТа же кодовая база, собранная как второе приложение со своим образом: бэкенд консоли, биллинг, организации и подключение новых магазинов, собственная почта платформы и фоновые задачи управляющего контура. Его логин в базе данных не дотягивается ни до одной схемы магазина, и миграций он не запускает.
- API ячейки между нимиДва ядра общаются через две внутренние двери, по одной на каждое направление, и у каждой свой секрет. Каждая дверь хранит только SHA-256 секрета, который принимает, так что ни одно ядро не держит ничего, что открыло бы его собственную дверь. Ни один запрос покупателя не ждёт ответа от управляющего контура.
- shop web — TanStack Start, React, рендер на сервереРендерит каждую витрину на языке покупателя, админку магазина, admin MCP и дверь Trade API. Читает Valkey, а PostgreSQL — под собственным логином магазина для чтения, и не пишет ничего, кроме сессий входа; любая другая запись уходит в shop-core.
- Консоль — своё приложениеОтдельное приложение и образ для admin.cartsome.com, MCP оператора, форм cartsome.com и вебхука Stripe. У неё нет драйвера базы данных и нет секретов магазинов, а разговаривает она только с platform-core.
- Край сети — CloudFront и WAFСтраницы кэшируются на краю сети, изображения идут прямо из S3. Балансировщик нагрузки за ним принимает запросы только от CloudFront и отправляет каждый адрес в приложение, которое его обслуживает, а шквал запросов, нацеленный на один магазин, останавливается уже на краю сети — отдельно для каждого адреса магазина.
- Aurora PostgreSQL 18, чистый SQLНикакой ORM, нигде. Полнотекстовый поиск тоже работает в PostgreSQL — на языке покупателя и снисходительно к опечаткам. Никакого отдельного поискового кластера, за которым нужно присматривать.
- Valkey и S3В Valkey лежат страницы, которые shop-core прогревает заранее, до прихода покупателей. В S3 — изображения товаров (варианты AVIF), шрифты тем, товарный фид на каждом языке и экспорт магазина, который уходит.
- Контейнеры на ARMВсе четыре сервиса работают на ECS Fargate, на Graviton, каждый из своего образа, а воркеры изображений — на Lambda, тоже на ARM. Всё описано в Terraform, и ничего не собрано кликами в консоли.
Картинки — через очередь
Переезжающий магазин привозит тысячи картинок, и новый магазин не должен тормозить ничьё оформление заказа, пока их пережимают. Поэтому shop-core сам их не пережимает.
- Ядро только ставит в очередьShop-core кладёт каждую задачу по картинке в SQS и записывает ответы по мере их возвращения — пачками, одной транзакцией на магазин. У воркеров вообще нет логина в базу данных.
- Справедливая очередь для каждого магазинаКаждый магазин — отдельная группа в справедливых очередях SQS: интерактивная полоса для картинки, которую загружает администратор, массовая полоса для импорта и лимит на магазин в каждой. Большой импорт одного магазина никогда не встанет перед единственным фото другого.
- Тот же кодировщик, больше рукВоркеры на Lambda выполняют то же кодирование libvips, что и ядро, поэтому картинка выглядит одинаково, кто бы её ни пережал. Скачивание идёт в своём темпе для каждого исходного хоста, чтобы не завалить сервер поставщика.
- Пережато раз — годится вездеКартинку узнают по хешу её байтов. Если какой-то магазин в ячейке уже пережал тот же исходник, воркеры берут готовые файлы, а не кодируют заново.
- Готово к наплывуПарк воркеров разрастается, когда переезжает сразу много магазинов, и ничего не стоит в простое, а админка показывает каждый прогон вживую: готово, переиспользовано, с ошибкой, в ожидании и место в очереди.
Вся система —
на одной странице.
Кто с кем разговаривает — от телефона покупателя до самых дисков. Сплошные линии — запросы и записи, пунктирные — только чтение.
Карта словами
- Кто стучится. Покупатели (люди и ИИ-агенты для покупок), системы других компаний через Trade API, ИИ-клиент владельца магазина, администраторы магазинов и операторы CartSome — все заходят через край сети.
- Край сети. CloudFront кэширует страницы, отдаёт изображения прямо из S3, хранит сертификаты для каждого адреса *.cartsome.com и собственного домена каждого магазина, а его WAF ограничивает каждый адрес магазина по отдельности.
- Балансировщик нагрузки принимает запросы только от CloudFront. Адрес каждого магазина он отправляет в shop web, а admin.cartsome.com и API cartsome.com — в консоль.
- Shop web рендерит витрину, админку и admin MCP, публичный MCP для ИИ-агентов покупателей, который каждый магазин включает сам, и дверь Trade API. Он читает PostgreSQL и Valkey и передаёт каждую запись в shop-core.
- Консоль обслуживает admin.cartsome.com, MCP оператора, формы cartsome.com и вебхук Stripe и разговаривает только с platform-core.
- Shop-core — это ячейка: единственный, кто пишет данные магазинов в PostgreSQL, Valkey и S3. Он проверяет вебхуки, открывает хранилище магазинов и ставит работу с картинками в очереди.
- Platform-core — это управляющий контур: организации, подключение новых магазинов, биллинг, почта платформы и её фоновые задачи, под собственным логином в базе данных. До ячейки он дотягивается только через API ячейки, по одному секрету в каждую сторону.
- Воркеры изображений берут задачи из справедливых очередей SQS, по группе на магазин, кодируют картинки на Lambda и пишут файлы в S3.
- Данные: Aurora PostgreSQL со схемой платформы и отдельной схемой на каждый магазин, Valkey с тёплыми страницами каждого магазина и S3 для изображений, шрифтов, фидов и экспортов.
- Ячейка 1 сегодня держит всё это в Стокгольме. Ячейка 2 — тот же стек ещё раз; её откроют, когда она понадобится, в том регионе AWS, который нужен её магазинам.
Жизнь одного запроса
Адрес выбирает магазин
Край сети передаёт настоящий адрес магазина. Shop web сопоставляет его с одним магазином и привязывает этот магазин ко всему запросу.
Чтение — поблизости
Тёплая страница приходит из Valkey; всё остальное читается под собственным логином магазина, у которого есть право только на чтение.
Запись — через shop-core
Web пересылает запись, указав магазин. Shop-core проверяет общий секрет и пишет под собственным логином магазина.
Кэш догоняет
Shop-core убирает из кэша затронутые страницы этого магазина, и следующий покупатель видит уже новую цену.
Ваш магазин.
Ваша схема.
Много магазинов, один кластер базы данных и ноль общих таблиц магазинов. Каждый магазин получает собственную схему PostgreSQL, а соседей к нему не пускает сама база данных.
- Схема и два логинаМагазин n живёт в собственной схеме, построенной по единому эталону. Shop web входит под логином магазина для чтения, shop-core — под логином для записи, и ни один из них не дотягивается до другого магазина. А логин platform-core не дотягивается ни до одного магазина вообще.
- Нет колонки магазина, о которой можно забытьВнутри схемы таблицы сохраняют свою форму: никакого id магазина в каждой строке и никакого фильтра, который запрос мог бы пропустить. Внешние ключи никогда не выходят за пределы схемы.
- Запросы никогда не называют схемуМагазин определяется логином, под которым входит соединение, а соединение обслуживает один магазин всю свою жизнь. Статическая проверка валит сборку, если в запросе встретится имя схемы.
- Пулы, которые открываются по требованиюКаждый магазин получает собственные небольшие пулы соединений: они открываются при его первом запросе и закрываются, когда он затихает, поэтому бюджет соединений базы данных ограничивает, сколько магазинов заняты одновременно, а не сколько их всего. У каждого магазина есть и свой бюджет запросов, и магазин, который его превысил, просят повторить попытку — только его одного.
- Кэш и ссылки знают свой магазинКлюч каждой записи в кэше включает магазин. Сессии, ссылки на заказы и подарочные карты, токены отписки подписываются собственными ключами магазина, поэтому ссылку одного магазина другой отклонит.
- Тесты на утечки, которые дёргают все двериОни создают строку в каждой таблице магазина для двух магазинов и читают каждую от имени другого — через соединения и shop-core, и shop web, — а затем вызывают каждый эндпоинт ядра, принимающий id. Запускаются при каждом изменении.
Ячейки, а не
один большой ком.
Мы масштабируемся ячейками. Ячейка — это полный стек: свой кластер Aurora, свои shop-core и shop web, схемы её магазинов, свои очереди и воркеры изображений. Когда одна заполняется, мы открываем следующую. Управляющий контур стоит отдельно и говорит с ячейкой только через API ячейки. Растёт платформа, а не каждая отдельная ячейка.
магазинов в общей ячейке. Измерено, а не угадано: тестовой ячейке на 1 000 магазинов дважды не хватило памяти.
ячейка: ячейка 1 в регионе AWS в Стокгольме. Там живёт Autotools, и туда же пока попадает каждый новый магазин.
новых ячеек — из тех же модулей Terraform, по мере надобности и в том регионе AWS, какой нужен их магазинам.
Что значит «заполнена»
Ячейка перестаёт принимать новые магазины, как только любой из этих показателей упирается в свой предел. При 80 процентах любого предела мы планируем следующую ячейку; страница «Ячейка» в консоли показывает текущее заполнение и называет сигнал.
| Сигнал | Заполнена, когда |
|---|---|
| Магазины | в ячейке их около 300 |
| Мощность базы данных | Aurora по нескольку минут подряд работает почти на пределе |
| Соединения | бюджет соединений превысил бы то, что допускает кластер |
| Пулы магазинов | магазинам отказывают в соединениях, хотя у базы данных есть запас |
| Память кэша | Valkey приближается к потолку памяти |
| Миграции | волна миграций по схемам ячейки падает или застревает |
- Крупному магазину — своя ячейкаМагазин, который перерос общую ячейку, получает ячейку в единоличное пользование. Autotools остаётся в ячейке 1.
- Переносимость заложена в устройствоВсё, чем владеет магазин, названо по магазину: его схема со своими ключами и последовательностями, его строки в хранилище, запечатанные под его организацией, его ключи кэша, его файлы фидов. Ничто не привязывает его к ячейке, в которой он родился.
- Если честноПеренести магазин между ячейками пока нельзя одной кнопкой. Эта возможность появится вместе со второй ячейкой, а мешать ей нечему: общего на этом пути нет ничего.
Закрыто по умолчанию.
Скучно — нарочно.
Самое интересное в магазине — это товары. А вот скучная часть, ровно в том объёме, который мы готовы опубликовать.
- Изоляция в базе данныхОтдельные схемы и логины для каждого магазина; изоляцию обеспечивают привилегии PostgreSQL, а не код, который должен не забыть про фильтр. У управляющего контура свой логин, а у логина shop-core нет никаких прав на таблицы управляющего контура.
- Запечатанное хранилище для каждой организацииКлючи платёжных систем, перевозчиков и почты лежат в хранилище, каждый зашифрован AES-256-GCM свежим ключом данных от ключа KMS, которым могут пользоваться только два ядра, и привязан к своей организации и имени. Скопированная строка не откроется нигде. Секреты никогда не живут в коде.
- У каждого ядра своя половина ключаShop-core открывает секреты магазинов, а platform-core — собственные секреты платформы, например её ключи Stripe и бухгалтерии. Политика ключа не пускает ни одно из ядер в чужую половину.
- Две двери, два секретаЯдра вызывают друг друга с отдельным секретом на каждое направление, и каждая дверь хранит только SHA-256 секрета, который принимает, так что ни одно ядро не держит того, что открывает его собственную дверь.
- Ключи доступа для тех, кто управляет платформойОператоры входят по ключам доступа (passkey) и каждое изменение платформы заново подтверждают ключом. Выдать доступ через инструмент нельзя: ни токен, ни ИИ не может добавить оператора.
- Записи ИИ, которые видно и можно откатитьМассовые и обращённые вовне записи сначала выполняются как предпросмотр и применяются по подтверждению, привязанному к тому, что вы видели; если магазин за это время изменился, запись отклоняется. А каждая выполненная запись сразу сообщает, как её отменить.
- Токены с минимальной связкой ключейКаждый токен или подключение admin MCP несёт набор прав и видит только те инструменты, которые эти права разрешают. Для возвратов, секретов и администраторов нужно по отдельному праву.
- Покупатели остаются за пределами чатаОтвет инструмента уходит к провайдеру ИИ, поэтому в ответах нет имён, электронной почты, телефонов, адресов и налоговых номеров покупателей. Немногие оговорённые исключения, например текст комментария к заказу, перечислены в правилах.
- След от каждого действия оператораКаждое изменение, которое вносит оператор, и каждое чтение данных сразу нескольких магазинов попадает в журнал аудита платформы.
314 действий.
Ноль форм.
Admin MCP даёт ИИ-клиенту 314 действий в магазине, и каждое из них есть и в веб-админке. Подключите Claude, ChatGPT, Cursor, Gemini или любой другой MCP-клиент — через вход в аккаунт или вставленный токен. Переключатель выключен, пока его не включит администратор.
Каталог и цены.
Товары, семейства, теги, меню, атрибуты, импорт, ценовые правила, распродажи, комплекты и купоны. tag_products, manage_family, explain_price.
Заказы и остатки.
Найти заказ, продвинуть его дальше, прокомментировать, запросить этикетки; склады, инвентаризации, заказы поставщикам и аккаунты бизнес-клиентов. Для возвратов нужно отдельное право.
Контент и витрина.
Макеты главной, страницы, блог, FAQ, тема, объявления, поисковые синонимы и то, что читают поисковики и ИИ-ассистенты.
Маркетинг и рассылки.
Форма подписки, кампании, приветственные серии, сценарии и шаблоны сообщений. Кампания ставится в расписание только после предпросмотра.
Настройки и запуск.
Языки, рынки, доставка, оформление заказа, вход, приложения и чек-лист перед открытием. manage_languages, set_shop_open.
Студия изображений.
Рисует картинки для товаров, категорий, слайдов и баннеров рассылок, опираясь на ваши собственные фото, и показывает клиенту нарисованное, прежде чем оно куда-либо попадёт.
Модель безопасности
Чтение
Клиент читает магазин как есть. У каждой записи есть чтение, которое показывает нужные ей id.
Предпросмотр
Массовая или обращённая вовне запись сначала отвечает, что она изменила бы — количество и примеры, — и ничего не меняет.
Подтверждение
Вы говорите «да». Применение ещё раз проверяет магазин и отклоняет предпросмотр, если магазин с тех пор изменился.
Отмена
Ответ сразу содержит отмену — готовый вызов, который всё вернёт. Немногие действия, которые отменить нельзя, объясняют почему: отправленное письмо, возвращённые деньги, заменённый ключ.
Права определяют поверхность
Токен видит только инструменты, разрешённые его правами, поэтому узкий токен — это и маленькая поверхность, и маленькая власть. Теги и меню — отдельные права, потому что опубликованное меню сразу меняет то, что видят покупатели. Написать черновик поста и опубликовать его — тоже два разных права. Подтвердить бухгалтерскую проводку ИИ не может никак: это делает человек в админке.
Примеры
«Покажи в магазине новую линейку Bosch».
list_products set_shown_in_shop
Результат: предпросмотр скрытых товаров по бренду, затем один вызов, который показывает всю линейку, и id, по которым её можно снова скрыть.
«Перенеси адреса моего старого сайта, чтобы Google по-прежнему находил каждый товар».
check_redirects import_redirects
Результат: ваш старый экспорт проверен строка за строкой, цепочки свёрнуты в один переход, несовпавшее собрано для вас в список, а затем — пробный прогон, прежде чем что-либо сохранится.
«Нарисуй зимний баннер и подготовь кампанию к пятнице».
generate_image draft_campaign schedule_campaign
Результат: баннер прямо в чате, черновик кампании и расписание — только после того, как вы увидели её предпросмотр.
↑ Примеры запросов · инструменты настоящие
Магазин — магазину.
Без посредников.
Каждый магазин может открыть своим бизнес-клиентам Trade API: нейтральный версионируемый HTTP API, через который их собственные системы читают каталог по их ценам и оформляют заказы. А любой магазин может покупать у любого другого магазина, который говорит на этом протоколе, — как у ещё одного поставщика.
- Протокол, а не брендОбнаружение по адресу
/.well-known/trade-api, сам API под/trade/v1, документ OpenAPI 3.1 — и нигде в нём нет названия какой-либо платформы. Продавец, который говорит на этом протоколе, — просто продавец, на чём бы он ни работал. - Ключи делает сам клиентАдминистратор открывает компании аккаунт бизнес-клиента, закрепляет ценовой уровень, по которому она покупает, и разрешает ей API. Клиент сам выпускает и отзывает свои ключи на странице аккаунта; магазин хранит только хеш, и ни один администратор никогда не видит ключа.
- Их цены, настоящие остаткиЦена каждого товара — ровно та, которую витрина показала бы этому клиенту после входа, а рядом — доступный к продаже остаток витрины, с верхним пределом.
- Заказы, которые не задвоятсяКаждый заказ несёт ключ идемпотентности: тот же ключ и то же тело возвращают первый заказ, а другое тело отклоняется. Дальше это обычный заказ магазина: счёт, сборка и отправка идут привычным путём.
- Покупайте у любого магазинаУниверсальный коннектор торгового поставщика делает продавца ещё одним поставщиком: его остатки и цены читаются по расписанию, заказы уходят с ключом идемпотентности, а подтверждения и отгрузки считываются обратно. Он обращается к публичному адресу продавца, как любой посторонний, и никогда не срезает путь внутри ячейки.
- Короткий поводокЛимиты на запросы и заказы для каждого ключа, потолок неоплаченных заказов, а ключ одного магазина для другого — посторонний. Каждое действие с аккаунтом, доступом и ключом попадает в журнал аудита магазина, а клиент узнаёт о каждом новом ключе.
- Если честноВебхуков пока нет: покупатель сам опрашивает, что изменилось. Пока заказы оплачиваются по счёту на предоплату; отсрочка платежа появится позже.
Магазин за минуты.
Открывайтесь, когда готовы.
Ни установщика, ни выбора сервера. Мы добавляем вашу организацию в консоли платформы, магазин собирается сам, а дальше — ваш ход.
Организация и магазин
Ваша компания, название магазина и его основной язык. Собственный домен можно подключить сразу или позже.
Магазин собирается сам
Его схема, логины, ключи подписи и путь к фиду создаются в фоне, отдельно от запроса. Поначалу магазин закрыт для посетителей.
Адрес — сразу
vashmagazin.cartsome.com отвечает, как только магазин активирован: один сертификат на все поддомены, никаких шагов с DNS.
Ключ и первый администратор
Одноразовый ключ подключения передаётся лично или во время звонка, но никогда — по электронной почте. Ваш первый администратор открывает /setup и создаёт ключ доступа.
Перед открытием
Платежи через Montonio, тарифы доставки, языки, данные магазина, товар, который можно купить. Каждый шаг — это страница и инструмент MCP.
Открытие, затем домен
Открывайтесь, когда чек-лист пройден. Направьте домен одной записью DNS, и мы добавим его на край сети; как только он ответит, он станет основным адресом.
Языки — переключателем. Новый магазин стартует с основным языком и эстонским. Включайте любой из 8, когда для него готовы переводы, — в разделе «Настройки › Языки» или через manage_languages. У товара один и тот же адрес на всех языках.
Перевозите магазин.
Google едет с вами.
Autotools переехал с Shopify и сегодня держит на CartSome 25 000+ товаров. Инструменты, которые для этого понадобились, — ровно те, что получаете вы.
- Товары: конвертирует ИИ, проверяет человекВаш ИИ-клиент читает формат импорта, словарь магазина и данные поставщика и пишет файл, который проходит собственный валидатор магазина. Вместо того чтобы выдумывать категорию, он останавливается и называет каждый пробел. Человек просматривает, что совпало и что новое, и применяется только тот импорт, который он назвал, — подтверждением прочитанного им предпросмотра.
- Скрыто, пока вы не скажете «показать»Новые товары приходят скрытыми. Один вызов с предпросмотром показывает целую линейку — до 5 000 товаров.
- Старые адреса — с переадресациейПередайте экспорт переадресаций из Shopify или любой список из двух колонок. Каждая строка сопоставляется так же, как витрина ищет адреса, цепочки сворачиваются в одну постоянную переадресацию, а каждая цель сверяется с собственными страницами магазина.
- Набор для ухода с ShopifyНаши инструменты переключения делают снимок старого сайта, строят карту «старый адрес → новый» с отчётом о том, что осталось, а затем проверяют на новом магазине каждую строку, требуя ровно одну переадресацию 301 на работающую страницу. Так Autotools перенёс 12 598 старых адресов.
- Согласия на рассылку — переносятся один разСписок рассылки переходит в журнал согласий магазина с ответом каждого человека в том виде, в каком он был дан. При переносе ничего не отправляется.
- Что остаётсяПрошлые заказы остаются на старой платформе. Сохраните её экспорт для бухгалтерии.
Пример переезда
Старт
Доступ к старому магазину и договорённость о том, что переносим.
Перенос
Каталог, фото и клиенты — в новый магазин на его адресе cartsome.com.
Ваша проверка
Сверка старого магазина с новым, страница за страницей, и тестовый заказ. Мы исправляем всё, что вы найдёте.
Переключение
Переадресации проверены, затем одна запись DNS. Старый магазин продаёт до самого этого момента.
↑ Пример · темп задаёт размер вашего каталога
Как проходит переездИнженеры спрашивают.
Мы отвечаем.
Какой стек, если точно?
Java 25 со Spring Boot для обоих ядер, TanStack Start с React 19 для shop web и консоли, Aurora PostgreSQL 18, Valkey 9, S3 и CloudFront, а для воркеров изображений — SQS и Lambda. Сервисы работают на ECS Fargate на ARM, и всё это описано в Terraform. Везде чистый SQL: никакой ORM.
Насколько он быстрый на самом деле?
Запустите Lighthouse на autotools.ee сами. 29 октября 2026 г. в мобильном профиле главная и страницы товаров показали нулевое смещение макета, время блокировки меньше 30 мс и 100 баллов за доступность, рекомендации и SEO; cartsome.com набрал 100 во всех четырёх категориях. За этим стоят бюджет в байтах в CI, проверка скорости и проверка худшего случая перед релизом, а также бюджет 250 мс по p95 для страниц списка товаров при каталоге из 500 000 товаров.
Зачем делить ядро надвое?
Чтобы трафик магазинов и дела платформы никогда не делили ни процесс, ни логин в базе данных и ни одна сторона не могла открыть секреты другой. Shop-core обслуживает магазины и не может открыть секреты платформы; platform-core ведёт консоль и биллинг и не может прочитать ни один магазин. Если управляющий контур упадёт, магазины продолжат продавать.
Это мультитенантная система? Насколько изолирован магазин?
Да. У каждого магазина своя схема PostgreSQL и два собственных логина, так что изоляция — забота базы данных, а не фильтра в коде. Кэш, сессии и подписанные ссылки привязаны к магазину, а тесты на утечки при каждом изменении читают каждую таблицу магазина от имени другого магазина.
Что происходит, когда ячейка заполняется?
Она перестаёт принимать новые магазины, и открывается следующая. Мы планируем её, когда любой сигнал (магазины, мощность базы данных, соединения, память кэша, миграции) достигает 80 процентов своего предела, поэтому ячейка перестаёт принимать магазины ещё до того, как заполнится.
Где хранятся мои данные?
Сегодня — в регионе Amazon Web Services в Стокгольме (eu-north-1). Строки вашего магазина лежат в его собственной схеме, а его ключи — в запечатанном хранилище вашей организации.
Можно ли забрать свои данные?
Да. Когда магазин уходит, вся его схема выгружается с помощью pg_dump, а pg_restore загружает этот файл в любую базу данных PostgreSQL 18.
Могут ли мои бизнес-клиенты заказывать из своих систем?
Да, если вы это разрешите. Откройте им аккаунт бизнес-клиента, и они сами создадут себе ключи Trade API, будут читать ваш каталог по своим ценам и оформлять заказы — каждый с ключом идемпотентности, так что повторная попытка никогда не закажет дважды.
Попадают ли данные покупателей к моему провайдеру ИИ?
По замыслу — нет. В ответах инструментов нет имён, электронной почты, телефонов, адресов и налоговых номеров покупателей, и тесты падают, если что-то из этого проскочит. Оговорённые исключения — история действий по заказу, текст комментария и имена сотрудников в комментариях.
Может ли ИИ вернуть деньги за заказ или сменить платёжный ключ?
Только с токеном, который вы выпустили именно с этим правом. Возвраты — отдельное право; секреты и администраторы доступны только по вставленному токену, который администратор выпустил сознательно, и никогда — через подключение приложения в один клик.
Какие ИИ-клиенты подходят?
Любой клиент, который говорит на MCP: среди них Claude, ChatGPT, Cursor и Gemini. Они подключаются через вход в аккаунт или вставленный токен и видят только инструменты, разрешённые их правами.
Как работает поиск без поискового кластера?
Полнотекстовый поиск PostgreSQL на языке покупателя, с триграммным сопоставлением для опечаток и артикулов. На одну систему в эксплуатации меньше, и перед каждым изменением он проходит бенчмарк на каталоге из 500 000 товаров.
Можно ли его расширять?
Да. Установите проверенное приложение из магазина приложений или создайте собственное вместе с ИИ-клиентом. Каждое работает в своей песочнице и устанавливается выключенным.
Сделаем
торговлю интересной.
Расскажите о своём магазине. Мы перенесём его за вас, а общаться вы будете с инженерами, которые создают CartSome.
Поговорим