Перейти к содержанию

Runbook — интеграция seed-скриптов в alatyr-service

Задача 40 · Skeleton создан 07.08.2026 · Как встроить скрипты в build/deploy

Что готово

  • alatyr-service/script/seed-own-companies.ts — реализован детерминированный snapshot и upsert 2 ИП
  • skeletons/seed-services.ts — читает services-catalog.md, upsert категорий

Реализация seed собственных компаний не скачивает приватный KB при деплое. Статические реквизиты версионируются в приватном репозитории alatyr-service и обновляются одновременно с my-companies.md. Это убирает сетевую зависимость и отдельный PAT с доступом к инфраструктурному KB.

Порядок выполнения (после задачи 39a)

Шаг 1: перенести оставшийся seed услуг в alatyr-service

# в клоне alatyr-service
cp /path/to/alatyr-infra-kb/skeletons/seed-services.ts script/

# Правки после переноса schema-crm (задача 39a):
# - Импорт из "../shared/schema-crm" заменить на "../shared/schema"
# - Импорт `db` брать из "../server/storage"

Шаг 2: package.json scripts

{
  "scripts": {
    "db:generate": "drizzle-kit generate",
    "db:migrate": "drizzle-kit migrate",
    "db:seed:own-companies": "tsx script/seed-own-companies.ts",
    "db:seed:services": "tsx script/seed-services.ts",
    "db:seed": "npm run db:seed:own-companies && npm run db:seed:services"
  }
}

Шаг 3: секреты и доступ к KB

Seed собственных компаний не требует GITHUB_TOKEN, KB_READ_TOKEN или других секретов. API-токены Моё Дело в код и KB не добавляются.

Шаг 4: когда запускать seed

Вариант A: build-time (в deploy workflow):

- run: npm run db:migrate && npm run db:seed
Плюс: KB и БД всегда согласованы. Минус: seed идёт при каждом деплое (2-3 сек).

Вариант B: on-demand:

# После обновления my-companies.md в KB:
ssh oswold@46.17.99.183 "cd /opt/alatyr-service && npm run db:seed"
Плюс: контроль. Минус: можно забыть.

Рекомендация: Вариант A. Сиды идемпотентны, overhead минимальный.

Проверка после запуска

-- в psql/sqlite после npm run db:seed
SELECT code, full_name, bank_bik, bank_account FROM own_companies;
SELECT code, title FROM service_categories WHERE is_active = 1 ORDER BY order_index;

Ожидаемо: - own_companies: 2 строки (golovin, korobochka) - service_categories: 7 строк (skud, video, fire, network, construction, low_voltage, general)

Что делать когда меняется KB

Обновились реквизиты банка (например Роман сменил счёт)

  1. Отредактировать my-companies.md в KB
  2. Обновить тот же реквизит в snapshot alatyr-service/script/seed-own-companies.ts
  3. Закоммитить оба изменения
  4. Запустить npm run db:seed:own-companies или дождаться следующего деплоя
  5. UPDATE в own_companies пойдёт по code=golovin, а id, mdCompanyId и isActive останутся прежними
  6. FK от objects.own_company_id не сломается

Добавилась новая категория услуг

  1. Добавить строку в таблицу в services-catalog.md
  2. npm run db:seed:services — INSERT новой строки, orderIndex = следующий
  3. Если убрали категорию — она станет is_active=0 (soft-delete), FK не сломается

Артём открыл новый счёт (после решения 39a)

Если выбрали Вариант A (JSON): - Обновить парсер seed-own-companies.ts → собирать additionalAccounts: Account[]

Если выбрали Вариант B (отдельная таблица): - Обновить seed-own-companies.ts → писать в own_company_accounts через отдельный upsert по (own_company_id + bank_bik + account)

Открытые вопросы

  • mdCompanyId — seed намеренно не заполняет и не перезаписывает; получить через API МД в задаче 41
  • Множественные счета — отдельная таблица own_company_accounts, реализовано в alatyr-service коммитом 627b6d2
  • Артём email в ЕГРИП (artemius06@gmail.com) — писать в отдельное поле owner_email? Сейчас в схеме нет.
  • Дата регистрации ИП (14.08.2017 и 29.01.2026) — писать в отдельное поле registration_date? Полезно для UI, сейчас в схеме нет.