Перейти к основному содержимому

Служебные скрипты

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).
Сначала dry-run, потом apply

Прогоните без флага, изучите отчёт (особенно раздел пропусков и примеры преобразования цен), и только после этого запускайте с --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; в логи он не попадает.