Служебные скрипты
apps/backend/src/scripts — большинство запускается через
npx medusa exec ./src/scripts/<файл>.ts из apps/backend. Исключение — probe-standalone.ts
(см. ниже), у него собственная точка входа без Medusa CLI.
import-moysklad-catalog.ts — импорт каталога из МойСклад
Импортирует товары, категории, цены и изображения из МойСклад, с учётом rate limit и повтором при HTTP 429.
- Dry-run по умолчанию — только строит план без записи. Режим
--applyразрешён исключительно черезmedusa exec(не через обычныйnode), чтобы случайный запуск не мог ничего изменить (:1363). - Не обращается к API вовсе, если одновременно не заданы
MOYSKLAD_TOKENиMOYSKLAD_ENCRYPTION_KEY(:263). - Пропускает: архивные позиции, товары без кода, без положительной цены, с дублирующимся
исходным SKU или с уже неоднозначным SKU на стороне Medusa (
:328). - Принимает только тип цены с точным названием «Цена продажи», переводит значение из копеек
в рубли (
:278). - Путь категорий МойСклад разбирается по
/, отсутствующие уровни создаются от родителей к детям, коллизии handle разрешаются коротким хешем (:439). - Создаёт опубликованный одновариантный товар: описание, SKU, штрихкод, вес, объём, цена в
рублях, категория, sales channel и внешний ID (
:959). - Штрихкод выбирается в порядке приоритета: EAN-13, EAN-8, GTIN, UPC, Code128, QR — иначе первое
доступное значение (
:308). - Изображения: уже импортированные распознаются по
moysklad_href, новые загружаются публично, первое исходное изображение становится thumbnail (:1070). - Ошибка одной позиции или картинки пишется в итоговый отчёт и не останавливает обработку
остальных товаров (
:1320). - Итоговый отчёт: режим (dry-run/apply), числа созданных/обновлённых/пропущенных товаров,
причины пропусков, отсутствующие изображения и цены, ошибки и примеры преобразования цен
(
:1204).
Прогоните без флага, изучите отчёт (особенно раздел пропусков и примеры преобразования цен),
и только после этого запускайте с --apply.
benchmark-catalog-search.ts — бенчмарк поиска
Создаёт тестовый каталог и проверяет поисковые сценарии против бюджета 300 мс.
- Размер каталога, прогрев, число итераций, параллелизм, бюджет и URL проверяемого backend
задаются переменными окружения (
:634). - Отдельно измеряет: поиск с брендом и наличием, категорией и ценой, backorder, фильтры без
запроса, поиск по артикулу (
:105). - Считает общий и посценарный p95, максимум времени ответа и p95 внутреннего времени
Meilisearch (
:598) — отдельно от сетевого/HTTP времени, чтобы видеть, где именно тратится бюджет.
probe-deep.ts / probe-standalone.ts — проверка доступа к МойСклад
Read-only проверка доступа к API МойСклад по токену либо по логину/паролю, без операций записи. Используйте перед первой настройкой интеграции или при подозрении на проблему с реквизитами — безопасно запускать на боевых реквизитах, ничего не меняет.
probe-deep.ts — не самостоятельный скрипт, а библиотека (runMoyskladReadOnlyProbe) с самой
логикой проверок. probe-standalone.ts — тонкая обёртка над ней, запускается напрямую через
node/ts-node, без medusa exec: печатает результат каждой проверки построчно
(ПРОШЛО/НЕ ПРОШЛО | причина) и завершается ненулевым exit code при любой непройденной
проверке или отсутствующих реквизитах — удобно для скриптовой/CI-обвязки, где важен код возврата,
а не только текст в консоли.
reindex-catalog.ts — полная пересборка поискового индекса
Ручная полная пересборка индекса Meilisearch из CLI — единственный способ полного переиндексирования, в админке и Admin API кнопки для этого нет (см. «Категории, коллекции и поисковый индекс»). В конце выводит число добавленных и пропущенных товаров. Пропускаются черновики и товары без названия, положительной цены или категории — тот же критерий «полноценного» публичного товара, что и у витрины.
seed-site-content.ts — демо-контент витрины
Идемпотентно создаёт или обновляет демонстрационные вкладки контента и ссылки на соцсети. Повторный запуск безопасен — не плодит дубли.
seed-commerce.ts — демо-каталог для разработки
Идемпотентно создаёт весь commerce-контур для демо: магазин, регион, валюту, налоговый регион, канал продаж («Auto Paint Storefront», делает его default), publishable key, склад, fulfillment-настройки, доставку и демонстрационный каталог с остатками.
Это не часть автонастройки при первом деплое (см. Деплой) — для новой компании
на боевом окружении запускать не нужно. Команда из корня — npm run backend:seed.
Скрипты Strapi (apps/cms/scripts)
Отдельный набор, для CMS, не для backend. Запускаются из apps/cms.
ensure-storefront-read-token.ts
Идемпотентно создаёт или обновляет API-токен Strapi «Medusa storefront read-only» с правами
только на чтение Homepage, Site settings и SEO entry (find/findOne) — это и есть
токен, который cms-bootstrap сохраняет для backend (см. Переменные окружения).
Повторный запуск находит существующий токен по имени и обновляет его вместо создания дубля. Скрипт
не печатает секрет в stdout.
migrate-medusa-site-content.ts
Одноразовая миграция контента из старой (legacy) схемы Medusa в Strapi. Требует
LEGACY_MEDUSA_DATABASE_URL, явно проверяет, что legacy и CMS базы данных различаются (иначе
падает с ошибкой) — защита от случайного запуска на одной и той же базе. Переносит HTML-контент
через legacyHtmlToBlocks.
legacyHtmlToBlocks (apps/cms/src/legacy-content.ts:15) — грубое, не полноценный HTML-парсер:
декодирует базовые HTML-сущности, заменяет <br> и закрывающий </p> на перенос строки, вырезает
все остальные теги целиком, затем режет результат по переносам на непустые строки — каждая
становится отдельным Strapi-параграфом. Любое форматирование внутри тегов (жирный, ссылки,
списки) при этом теряется — переносится только текст.
Уже заполненные поля (!isEmptyBlocks(current[key])) не трогаются — миграция заполняет только
пустые поля. Повторный запуск на частично заполненной записи безопасен.
seed-default-homepage.ts
На свежей установке Strapi отдаёт 404 на Homepage без записи. Скрипт создаёт и публикует
базовый набор секций, которым не нужны загруженные медиа. При наличии любой записи, включая
черновик, он пишет предупреждение и не меняет её.
cms-bootstrap.ts
Комбинирует создание read-токена, начальной главной и Site settings; запускается сервисом
cms-bootstrap из Compose после готовности CMS. Токен выводится только в файл именованного тома
через временный файл и rename, с правами 0600; в логи он не попадает.