Files
mono/components/boot
claude 1a6f326aa4 chore(infra): mongo standalone локально, без --replSet rs0
Локально гоняем mongo как standalone. Раньше был --replSet rs0 +
rs.initiate в entrypoint, но проект не использует ни transactions
(нет startSession), ни change streams (нет .watch()), ни
readConcern:'majority' — replica-set серверно избыточен. Клиенты
(mongoose в controller, MongoClient в parser, notifications) уже
подключаются по URL без replicaSet=/directConnection= параметров,
для них переход прозрачен.

Бонусы:
- pnpm run reboot больше не висит на «MongoDB еще не готов
  (нет PRIMARY)»: на arm64 sleep 5 в entrypoint не успевал поднять
  mongod до того, как rs.initiate пытался выполниться, и rs.status()
  внутри try/catch ловил неправильную ошибку — replica config не
  применялся, oplog.rs не создавался, PRIMARY никогда не наступал
  (инцидент 2026-05-23).
- Старт mongo на 5-10 сек быстрее.
- Меньше состояния в volume — нет oplog/replica-config.

reboot.sh: ждать db.adminCommand({ping:1}) вместо db.hello().isWritablePrimary.

Прод-конфигурация (k8s/swarm) этого файла не использует — там
своя replica-схема для HA, не затронута.

Если в будущем потребуются transactions — вернуть --replSet rs0
+ rs.initiate в entrypoint обратно. Триггер: появление в коде
session = await mongoose.startSession() или .watch().

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 10:16:25 +05:00
..
2025-03-26 18:19:52 +05:00
2025-03-27 18:13:33 +05:00
2026-05-23 00:55:52 +05:00
2026-02-19 22:01:50 +05:00

🚀 @coopenomics/boot

CLI-утилита для инициализации блокчейн-инфраструктуры кооператива. Создаёт системные аккаунты, устанавливает смарт-контракты, настраивает токены и разворачивает кооперативную среду. Включает интеграционные тесты для основных подсистем платформы.

Основные возможности

  • Полный цикл развёртывания блокчейна EOSIO — от запуска ноды до создания кооператива
  • Установка системных и прикладных смарт-контрактов
  • Инициализация токенов и создание тестовых данных
  • Управление Docker-контейнерами блокчейн-ноды
  • Интеграционные тесты: паевые взносы (capital), кошелёк (wallet), регистрация участников (registrator)
  • Поддержка нескольких режимов загрузки: стандартный, чистый и расширенный

Установка

Компонент является частью монорепозитория. Установка зависимостей из корня проекта:

pnpm install

Или только для этого компонента:

pnpm install --filter @coopenomics/boot

Скрипты

Скрипт Команда Описание
boot pnpm run boot Запуск блокчейна и установка контрактов
boot:clean pnpm run boot:clean Чистый запуск с полной переустановкой
boot:extra pnpm run boot:extra Расширенная инициализация с дополнительными данными
deploy pnpm run deploy Развёртывание контрактов на запущенной ноде
cli pnpm run cli Интерактивный командный интерфейс (Commander.js)
clear pnpm run clear Очистка данных блокчейна
start pnpm run start Перезапуск ноды
stop pnpm run stop Остановка ноды
test pnpm run test Интеграционные тесты (capital)
test:all pnpm run test:all Все интеграционные тесты

Конфигурация

Скопируйте .env-example в .env и настройте переменные окружения:

  • Endpoint блокчейн-ноды (API)
  • Строка подключения к MongoDB
  • Строка подключения к реляционной БД
  • Приватные ключи для развёртывания контрактов

Подробное описание переменных — в файле .env-example.

Запуск bootstrap'а в стороннем проекте (sideboot)

Для проектов, которым нужна только цепь + контракты (без mongo/pg/mono-инфры), есть готовый docker-образ dicoop/bootcoop:<branch>. Он one-shot job'ом накатывает на удалённую ноду все системные и кооперативные контракты, активирует протокол-фичи, создаёт системный токен.

Минимальный docker-compose.yaml для стороннего репозитория:

services:
  node:
    image: dicoop/blockchain:latest
    ports:
      - "8888:8888"
      - "9876:9876"
    volumes:
      - ./blockchain-data:/mnt/dev/data
    command: >
      /bin/bash -c "/usr/local/bin/nodeos -d /mnt/dev/data
        --config-dir /mnt/dev/config
        --genesis-json /mnt/dev/config/genesis.json"

  bootcoop:
    image: dicoop/bootcoop:dev      # или :testnet / :main / :latest
    depends_on: [node]
    restart: "no"
    environment:
      CHAIN_URL: http://node:8888
      EOSIO_PUB_KEY: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
      EOSIO_PRV_KEY: 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
      RPC_WAIT_TIMEOUT_MS: "180000"

Запуск:

docker compose up -d node
docker compose up bootcoop          # one-shot, выходит после успеха

Bootcoop ждёт ${CHAIN_URL}/v1/chain/get_info, затем катит контракты на ноду. По выходу с кодом 0 — цепь готова к работе.

Версионирование

dicoop/bootcoop:<tag> всегда multi-stage'ится из dicoop/contracts:<tag> с тем же <tag> (dev/testnet/main). Контракты и bootstrap синхронны по sha коммита mono-репо — no skew.

Точный пин по коммиту: dicoop/bootcoop:dev-<short-sha> (тегается каждой сборкой).

Дополнительные данные (опционально)

Если в стороннем проекте всё же нужны mono-данные (voskhod, ant, совет) — выставить флаги, и поднять рядом mongo + postgres:

    environment:
      CHAIN_URL: http://node:8888
      MONGO_URI: mongodb://mongo:27017/cooperative-x
      POSTGRES_HOST: postgres
      POSTGRES_USERNAME: postgres
      POSTGRES_PASSWORD: postgres!23!23
      POSTGRES_DATABASE: voskhod
      INSTALL_INITIAL_DATA: "1"     # voskhod + ant + совет
      INSTALL_EXTRA_DATA:   "1"     # + расширенный совет (5 пайщиков)

Без этих флагов запускается чистый chain-only сценарий.

Тестирование

Перед запуском тестов необходима работающая инфраструктура (см. docker-compose.yaml в корне проекта):

pnpm --filter @coopenomics/boot run test
pnpm --filter @coopenomics/boot run test:all

Тесты используют Vitest с таймаутом 240 секунд — это связано с ожиданием подтверждения блокчейн-транзакций.

Архитектура

src/
├── index.ts              # Точка входа CLI (Commander.js)
├── init/                 # Логика инициализации
│   ├── booter.ts         # Загрузчик блокчейна
│   ├── cooperative.ts    # Настройка кооператива
│   ├── infra.ts          # Инфраструктурная инициализация
│   └── participant.ts    # Создание участников
├── blockchain/           # Взаимодействие с EOSIO (eosjs)
├── docker/               # Управление Docker-контейнерами
├── configs/              # Конфигурация ноды и протокол-фичи
├── tests/                # Интеграционные тесты
│   ├── capital.test.ts   # Тесты паевых взносов
│   ├── wallet.test.ts    # Тесты кошелька
│   └── registrator.test.ts # Тесты регистрации
└── utils/                # Вспомогательные утилиты
scripts/
├── reboot.sh             # Полный перезапуск
├── clean_reboot.sh       # Чистый перезапуск
└── extra_reboot.sh       # Расширенный перезапуск

Ключевые зависимости

  • eosjs — взаимодействие с блокчейном EOSIO
  • commander — CLI-фреймворк
  • dockerode — управление Docker-контейнерами из Node.js
  • mongoose — работа с MongoDB
  • pg — работа с реляционной БД
  • vitest — тестирование

Лицензия

BY-NC-SA 4.0