Их postinstall тянет тяжёлые сетевые загрузки (Electron zip, Chromium),
не нужные ни для build (unbuild/tsc/vite), ни для runtime — периодически
валил release job TLS-таймаутом, из-за чего publish-packages (needs: release)
не запускался вообще.
@livekit/rtc-node (Rust + rustls + rustls-native-certs) reads root CAs
only from the system trust store. node:22-slim ships without
ca-certificates, so without /etc/ssl/certs/ca-certificates.crt every TLS
handshake from native bindings fails with
"invalid peer certificate: UnknownIssuer" — even for a valid LE chain.
Node.js itself is unaffected (own embedded CA bundle).
Incident 2026-05-21: secretary in dicoop/coopback:v2026.5.21-2 could not
connect to wss://chatcooprtc.coopenomics.world (controller logs full of
SecretaryAgentService UnknownIssuer; nginx on api-prod never saw the
handshake — broken before HTTP upgrade). Hot-fix on
voskhod-coopback-blue (docker cp ca-certificates.crt + restart)
restored secretary connectivity; this commit makes the fix permanent
in the base image so every consumer of dicoop/mono-base
(coopback / desktop / cooparser / notifications / boot) inherits it
on the next release tag.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Без пина CI каждый раз тянул latest pnpm; на 10.4+ ignored builds
из warning стали ERR_PNPM_IGNORED_BUILDS, и `pnpm install --frozen-lockfile`
валился на electron/esbuild/@parcel/watcher и пр.
- packageManager=pnpm@10.33.0 в корневом package.json (синхронно с
publish-packages.yaml и components/boot/Dockerfile)
- pnpm.onlyBuiltDependencies — 18 пакетов из лога фейла
- Dockerfile: corepack enable вместо `npm install -g pnpm` (обе стадии)
- publish-docs.yaml: pnpm/action-setup@v4 без version + cache: pnpm
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Теперь все production-сервисы запускаются изнутри dicoop/mono-base
без volume-mount и без devDeps:
- @coopenomics/parser: scripts.start `esno src/index.ts`
→ `node ./dist/index.cjs` (unbuild уже собирал dist).
- @coopenomics/notifications: scripts.sync `tsx src/sync/sync-runner.ts`
→ `node ./dist/sync/sync-runner.cjs`. Добавлен entry
`src/sync/sync-runner` в build.config.ts — unbuild делает
bundle с разрешёнными импортами (старый tsc-output ломался
под чистым node из-за extension-less ESM-импортов).
Поле `bin.novu-sync` обновлено на `.cjs`.
- @coopenomics/controller: `tsconfig-paths` перенесён из devDeps
в deps. Сервис стартует через `ts-node -r tsconfig-paths/register`
(ts-node уже был в deps). После prune --prod оба останутся.
В корневом Dockerfile вернули `pnpm prune --prod --ignore-scripts`
после lerna run build — выкидывает все devDeps (typescript, vitest,
unbuild, eslint, quasar, tsx, esno и пр.).
Smoke-test slim-образа `dicoop/mono-base:dev-local` (2.96GB):
- parser → дотягивает до runtime, валится на missing NODE_ENV ✓
- notifications → стартует, валится на missing NOVU_API_KEY ✓
- desktop → дотягивает до runtime, валится на missing chain url ✓
- boot --help → работает ✓
- coopback (controller) → ts-node компилирует, стартует ✓
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
cooparser стартует через `esno src/index.ts` (esno = devDep) и
notifications — через `tsx src/sync/sync-runner.ts` (tsx = devDep).
В playbook'е monocoop pull-based деплой (docker-compose.containers.yaml)
запускает их без volume-mount, изнутри образа. После prune --prod
оба упали бы на старте с `esno: not found` / `tsx: not found`.
mono-base остаётся ~5GB (вместо 3GB после prune). Полное сжатие
вернём отдельным шагом — после того как cooparser и notifications
переведём на `node dist/...`.
Multi-stage сама по себе уже даёт win: 7.36GB → ~5GB через
.dockerignore + apt --no-install-recommends + python3-only-runtime
без gcc/dev-headers.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Корневой Dockerfile переписан под две стадии: builder с full toolchain
(apt dev-headers, WeasyPrint в venv, pnpm install + lerna run build +
pnpm prune --prod --ignore-scripts) и runtime — slim node:22-slim
без gcc/dev-headers, только runtime-libs WeasyPrint + готовый /app.
Локально сжалось с 7.36GB до 2.95GB (-60%). Образы наследники
(dicoop/desktop / coopback / cooparser / notificator / notifications)
автоматом получат тонкий runtime через build-containers.yaml.
Безопасность для playbook'ов monocoop: их docker-compose.yaml собирает
сервисы из components/{controller,parser,desktop}/Dockerfile (не
корневого) и монтирует ./:/app — корневой mono-base туда вообще не
попадает.
.dockerignore — выкинул .git (962MB), blockchain-data/wallet-data,
_blago, coverage, *.log и т.п. Build-context теперь намного легче.
docker-compose.testnet.yml — локальный 3-сервисный smoke-стек:
ke-node (dicoop/blockchain_v5.1.1:dev) + ke-contracts (one-shot
copy из dicoop/contracts:dev в shared volume) + ke-bootstrap
(mono-base, node /app/components/boot/dist/index.cjs boot:remote).
Изолирован от dev-ноды mono-ai-4-node-1 через отдельную сеть и порты
8919/9907/8101.
В playbook'ах не применяется (там docker-compose.yaml, не .testnet.yml).
.gitignore — добавлен .env.testnet (содержит EOSIO_*KEY).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>