Repository navigation
Releases: onixus/EvaCal
Release list
v0.8.0: Specification, catalog and project delivery
EvaCal v0.8.0
This release delivers the specification and catalog contour (#101), the project delivery contour (#103) and commercial pricing fixes (#102), merged in PRs #96–#135.
Changes
- Catalog and specification. Vendors, technical products and revision-bound price offers live in the database. Vendor GPL imports are reviewed, use reusable profiles and can be compared between snapshots; selected updates are applied to a project as a new draft. Specifications gain totals, XLSX, revision diff, a lifecycle with confirmed release and BOM import. Product relations, typed attributes, catalog suggestions, explicit replacement, bundles and subscriptions are supported.
- Compliance evidence. Registry entries and certificates are stored per catalog product. SPEC and PZ print only current confirmed evidence; otherwise «Не подтверждено». The static vendor registry is removed.
- Sizing. Versioned sizing profiles and runs show their impact on the specification and propose catalog candidates. Specification rows link to GOST package requirements and appear in the traceability matrix.
- Commercial offer. Target margin is separated from markup and historical quotes are preserved. Offers support variant comparison, profit forecast, supply and cost items, exchange rates and a margin threshold with discount approval.
- Review and inbox. Personal review stage assignments, comment lifecycle, the «Требует моего действия» queue with in-app notifications, and delay reasons for overdue projects.
- Change requests and acceptance. Change request card, impact and estimate, decisions with a versioned result; acceptance checks bound to an approved package edition, commission decision and PSI/act generated from recorded facts.
- Planning. Production calendars, exceptions and role reservations; explicit stage dependencies, nearest available start and what-if plan variants; actuals ledger with idempotent sync and template norm proposals from actuals.
- Solution library. Versioned project solutions and solution kits applied to projects with update proposals.
- GOST 34 documents. PZ/TZ no longer invent platforms or supply items, and presale sizing defaults are treated as unconfirmed assumptions.
- Platform. Tailwind CSS 4, updated runtime dependencies, Prettier enforced in CI and a PostgreSQL credential preflight in the installer. nginx bind mounts are relabeled for SELinux, so installations on SELinux-enforcing hosts work.
Upgrade notes
The upgrade applies 25 new PostgreSQL migrations automatically through the migration image. update backs up the database first unless --skip-backup is given; S3 deployments still need a coordinated external backup. Read these behaviour changes before rolling out:
- Gantt dates are computed in UTC with a 09:00 UTC working window. On servers with
TZother than UTC, Gantts rebuilt after the upgrade may shift relative to previously stored dates. Existing stage dates are not rewritten. - Applying what-if shifts reschedules the Gantt from the new start date using the production calendar and stage dependencies. Holidays and weekends in the new window may move the end date by more or fewer days than the shift.
- Editing stages or the start date updates stage rows in place. Actuals, ledger entries, tracker mappings and dependencies are kept.
- GOST package document types are stored sorted. Versions of one calculation that differ only in document order now form a single review line.
Installation
Download evacal-0.8.0-deploy.tar.gz and its .sha256 file from this release, then:
sha256sum -c evacal-0.8.0-deploy.tar.gz.sha256
tar -xzf evacal-0.8.0-deploy.tar.gz
cd evacal-0.8.0-deploy
bash install.sh install --version 0.8.0To upgrade an existing installation, run bash install.sh update --version 0.8.0 from the unpacked archive. Use --local for a loopback-only HTTP test installation. Linux Docker Engine and Compose v2 are required.
Images: ghcr.io/onixus/evacal:0.8.0 and ghcr.io/onixus/evacal-migrate:0.8.0. Both are released together for Linux amd64 and arm64.
Validation
The release commit's parent passed the local Jenkins pipeline on main: dependency audit, lint, format, typecheck, unit tests, GOST 34 verification and production build. Release publication builds both images from the tag, runs a Linux container smoke test before promoting version and latest tags, and produces a checksummed deployment archive.
Release verification results
- Release commit:
88b382be05881540e3d50a78af4cc0e457757cab. - Linux Jenkins publication:
evacal-publish #26— SUCCESS on the SELinux-enforcing Fedora nodegaming-amd64. Both runner and migrate built forlinux/amd64andlinux/arm64; 79/79 deployment checks passed, 0 failed. Native amd64 runtime smoke covered migration rerun, non-root execution, writable storage and nginx HTTP/TLS. - Application manifest digest:
sha256:ca1d7ee5e757bd152f621bfd2aeec94ac76b3e1fbf6c912225675fe27ec9156d(0.8.0andlatest). - Migration manifest digest:
sha256:ef997832cadfa963e701a3e99009e803fb9e51d72d8ec9ea91b27f40c1afdc93(0.8.0andlatest). - Deployment archive SHA-256:
6dafdd8a8fc690abc0ae7394b4956c458afc27b8aaca70baabef77bbf5e82b9f.
v0.7.0: PostgreSQL-only runtime and reliable deployment
EvaCal v0.7.0
This release makes PostgreSQL the sole application database and delivers the rebuilt installer and image distribution workflow from PRs #93 and #94.
Changes
- One canonical Prisma schema and migration directory. The five previously published PostgreSQL migrations retain their names and SQL checksums.
- PostgreSQL-only runtime, development, Docker and CI configuration. Invalid database URLs fail explicitly instead of falling back to a local database.
- Source-free deployment archive and paired application/migration images. The installer checks matching OCI revisions, pins image digests and uses configuration from the matching commit.
- Safer installation and upgrades: prepare before replacing live configuration, preserve project names and volumes, back up existing data and recreate nginx after application replacement.
- PostgreSQL backup/restore with transactional database restore, archive validation and local artifact persistence.
- Local HTTP sessions, HTTPS deployment and non-root application operation were validated on Linux.
- Legacy database files and journals remain excluded from both production images. Customer database vocabulary, including SQLite requirements, remains supported by GOST 34 matching.
- Jenkins publication runs on a Linux amd64 Docker agent and uses an isolated registry login for each build.
Compatibility
PostgreSQL installations retain their existing migration history and volumes; no database reset or new baseline is required. SQLite installations must migrate their data separately before upgrading. Unsupported stored database configuration is rejected before modifying the installation. S3 deployments still require a coordinated external backup of their database and objects.
Installation
Download evacal-0.7.0-deploy.tar.gz and its .sha256 file from this release, then:
sha256sum -c evacal-0.7.0-deploy.tar.gz.sha256
tar -xzf evacal-0.7.0-deploy.tar.gz
cd evacal-0.7.0-deploy
bash install.sh install --version 0.7.0Use --local for a loopback-only HTTP test installation. Linux Docker Engine and Compose v2 are required; the image-based installation needs no Node.js, Git or source checkout.
Images: ghcr.io/onixus/evacal:0.7.0 and ghcr.io/onixus/evacal-migrate:0.7.0. Both are released together for Linux amd64 and arm64.
Validation
The application changes passed Linux Jenkins validation before merge: 740 unit tests, 77 deployment checks without skips, lint, typecheck, dependency audit, GOST 34 verification, production and Docker builds, and PostgreSQL integration checks. Baseline, clean HTTP and clean HTTPS installations each passed both Playwright scenarios. Update, backup/restore, authenticated database reads, artifact persistence and source-free installation also passed.
Release publication builds both targets from the release tag, runs a native Linux container smoke test before promoting version/latest tags, and produces a checksummed deployment archive. Public image access and a clean installation of the released version are verified before publishing the GitHub release.
Release verification results
- Release commit:
bf825d938a6f56787713eea47ffc3e56a36d8b84. - Linux Jenkins publication:
evacal-release-0.7.0-linux #3— SUCCESS. Both runner and migrate built forlinux/amd64andlinux/arm64; all 77 deployment checks passed without skips. Native amd64 runtime smoke covered migration rerun, non-root execution, writable storage and nginx HTTP/TLS. - Public installation:
evacal-release-0.7.0-public-install #1— SUCCESS. Anonymous GHCR pull, both platform manifests, matching version/latest manifests and image revisions, fresh HTTPS installation, certificate-verified health and 2/2 Playwright scenarios without retries or skips. - Application manifest digest:
sha256:5b74d3948b7e1b9e84407756f01257e4a4681fd7b2e898afda4dfa052489b184. - Migration manifest digest:
sha256:fe3259101abe5411035c1c5f0477dda60fc5a0e4e4ed0e0b76e5b395aeaf2247.
The attached deployment archive was produced by the Linux publication job and its SHA-256 checksum was verified before upload.
v0.6.0: Установщик одной командой, полные SIEM/IDM/NGFW и верификация ТЗ
EvaCal v0.6.0 — установщик одной командой, полные SIEM/IDM/NGFW и верификация ТЗ
Релиз собирает всё, что вошло в main после v0.5.0: PR #89, #90, #91, #92.
Главное: стенд теперь ставится одной командой из готовых образов, три
внедренческих профиля ИБ стали сквозными пресейл-моделями с автоматическим
sizing и проверяемыми требованиями ТЗ/ПМИ, а движок генерации ТЗ проверяет
итоговую структуру документа перед выпуском.
Новое
- Установщик
deploy/install.sh(#92). Без Node.js и клона репозитория:Проверяет Docker (на Linux предлагает поставить), генерирует секреты иcurl -fsSL https://raw.githubusercontent.com/onixus/EvaCal/main/deploy/install.sh | sudo bash
пароль PostgreSQL, выпускает самоподписанный сертификат или берёт
--cert/--key, тянет образы изghcr.io, ждёт/api/healthи печатает
пароли учёток. Дальше стендом управляетevacal status | logs | update | passwords | backup | restore | restart | uninstall. Параметры:--domain,
--version,--no-tls,--database-url,--sqlite,--source(сборка
из клона). Описание вdeploy/README.md. - Второй образ
ghcr.io/onixus/evacal-migrateпубликуется джобой
evacal-publishрядом с образом приложения; установщик тянет оба. - Полные опросники SIEM / SOC, IDM / IGA и NGFW (#89): 24–25 вопросов
и 8 этапов в каждом, автоматический вендор-нейтральный sizing
(lib/presets/implementationSizing.ts): EPS и retention, идентичности и
JML, throughput / sessions / TLS inspection. Live-preview пресейла
показывает метрики, допущения, состав разделов ТЗ и сценарии ПМИ. - Сквозная цепочка опросник → sizing → требование ТЗ (
ТР-SIEM-*,
ТР-IDM-*,ТР-NGFW-*) → критерий приёмки → профильная методика ПМИ →
трассировка на этап. Практика применения описана в
docs/IMPLEMENTATION_TEMPLATES.md. - Сведения о финансировании по п. 4.3 ГОСТ 34.602-2020 с явным gap при
отсутствии данных (#91).
Исправления
- Верификация ТЗ перед выпуском (#91): единый конвейер подготовки AST
для предпросмотра и экспорта, рекурсивная проверка обязательных разделов
(409/400 вместо пустых секций после ручной правки), правильныйdocType
у GET-релиза, сохранение файлов иtzAuthorв snapshot. - Удалены демонстрационные ФИО, договор и дата подписи; ПДн, класс защиты
иregulatoryScopeбольше не выводятся из количества NGFW. - Кириллические HTTP-имена, Heading3, отдельная нумерация таблиц приложений.
- Профиль внедрения определяется по коду требования единым детектором;
старые расчёты SIEM остаются воспроизводимыми. - В стадии
migrateDockerfile клиент Prisma генерируется на сборке:
docker compose run migrate <команда>(сброс паролей) без этого падал.
Внутреннее
ProjectDetailClientразобран с 1682 до 213 строк: вкладки, модальные
окна и форма реквизитов вынесены вapp/projects/[id]/project-detail/(#90).- DOCX-экспортер разделён на титул, содержимое, типографику и сборку;
generatorVersion2.1.0; воспроизводимыйnpm run test:gost34:verify,
отчёт вdocs/GOST34_ENGINE_VERIFICATION.md. - Тесты: 85 файлов, 712 проверок.
Обновление
Новых миграций БД нет. Существующий Docker-стенд: docker compose pull && docker compose up -d, либо перейти на установщик: deploy/install.sh install --dir /opt/evacal поверх новых томов (данные из старого стенда
переносятся pg_dump/pg_restore или командой evacal restore после
ручной упаковки). Установка без клона заработает после публикации образов
тега 0.6.0 джобой evacal-publish.
v0.5.0: Конвейер проекта, рабочий стол и доска заявок
EvaCal v0.5.0 — конвейер проекта, рабочий стол и доска заявок
Релиз собирает всё, что вошло в main после v0.4.1: PR #87.
Главное: у проекта появился явный жизненный цикл от расчёта до сделки,
а интерфейс перестроен вокруг него — рабочий стол, реестр проектов, карточка
проекта и канбан-доска показывают один и тот же этап и срок на нём.
Новое
- Конвейер проекта (
lib/lifecycle.ts). Восемь шагов: расчёт →
согласование → утверждена → комплект → нормоконтроль → ревью ГАП →
выпущен → сделка. Для каждого проекта известен текущий шаг, дата входа
в него (новая колонкаstageEnteredAt, которую пишут все переходы
статуса), число дней с порогами «висит» по шагу, тревога (возвращён,
завис, пауза, проигрыш) и следующее действие. - Рабочий стол
/для всех ролей: конвейер по портфелю, очередь роли
на сегодня, проекты, требующие внимания. Архив расчётов переехал в
/calculations. - Карточка проекта со степпером этапов и кнопкой следующего действия;
реестр проектов с колонкой «Этап», фильтром по этапу и колонкой
«Дальше». - Доска заявок
/boardдля архитектора, тех.писателя, ГАП, рецензента
и администратора: дорожка смет (черновик → на утверждении → утверждена)
и дорожка комплектов (черновик → нормоконтроль → ревью ГАП → возвращён /
утверждён). Перетаскивание карточки в соседнюю колонку — вердикт на своём
этапе через существующие API с подтверждением; замечание обязательно при
возврате. - Фильтры живут в URL и применяются сразу (чипы и поиск с задержкой)
на реестре проектов, расчётах, аналитике, ресурсном плане и рейтинге. - Единый набор экранов:
PageHeader, классы.page,.tab-bar,
.table-list,.filter-chip, компактные кнопки по умолчанию,
сгруппированный сайдбар, заголовки шапки из навигации роли. - Администратор — надмножество всех ролей: все разделы и обе очереди
ревью. Пресейл открывает реестр проектов и заводит проекты.
Исправления
- Safari зацикливал вход на
http://localhost: production-сборка по
plain-http на localhost больше не ставит Secure-cookie
(FORCE_SECURE_COOKIES=trueвозвращает строгий режим). - Таблицы рейтинга вылезали за карточку в Safari; карточки пресетов и
панели студии оставались белыми в тёмной теме (nord-darkне существовал). - Правки по код-ревью: проверка параметра этапа, двухпроходная выборка при
фильтре по этапу, кэш сводки портфеля, параллельные запросы доски.
Удалено
- Тема Dark Fantasy, компаньон, пасхалка, портреты героинь и их медиа.
Остались светлая и тёмная (Nord); старое сохранённое значение темы
читается как тёмная.
Документация и тесты
- README и «Маршрутный лист новичка» описывают конвейер, рабочий стол и
доску; скриншоты вdocs/screenshots/. - E2E: общие хелперы, сценарий «Северный банк» под новый UI, новый сценарий
ui-pipeline(фильтры, доска, утверждение сметы перетаскиванием);
E2E_NO_WEBSERVER=1иBASE_URLдля прогона против запущенного стенда.
Обновление
Миграция PostgreSQL 20260915010000_stage_entered_at добавляет
stageEnteredAt в Calculation и GostPackage; применяется контейнером
migrate при старте (SQLite — npm run db:sync). Значения для старых
записей не заполняются: срок считается по прежним эвристикам до первого
перехода статуса.
v0.4.1: Факт сделки, ресурсный план, PostgreSQL по умолчанию
EvaCal v0.4.1 — факт сделки, ресурсный план, PostgreSQL по умолчанию
Релиз собирает всё, что вошло в main после v0.4.0: PR #72–#82.
Главное: PostgreSQL стал СУБД по умолчанию, а поверх согласованных
расчётов появился контур факта — исход сделки, фактические часы и сроки,
ресурсный план по портфелю и аналитика отклонений.
Новое
- Калибровка оценки по похожим проектам (#72). Для расчёта подбираются
утверждённые расчёты того же шаблона с близкими ответами опросника
(расстояние Гауэра); панель показывает медианную поправку, коридор часов,
калиброванную оценку, типичный срок и этапы, которые архитектор обычно
правит. Гостям по share-ссылке соседи показываются обезличенно. - Факт и исход сделки (#78, Horizon E1). Исход на проекте: выиграна
(версия договора, сумма без НДС), проиграна (причина, конкурент),
отменена. Факт часов и дат по этапам выигранной версии, факт РП,
закрытие факта, CSV-импорт с dry-run. Страница/analyticsс вкладками
«Сделки» и «Точность оценок». Калибровка получила третий слой
«факт / утверждено», рейтинг — win rate у пресейлов и медиану отклонения
у архитекторов. - Ресурсный план по портфелю (#79, E2). Спрос из Гантов всех проектов
по ISO-неделям и ролям с весами воронки, ёмкость ролей с датой действия
(/admin/capacity), тепловая карта/capacityна 13 или 26 недель,
what-if со сдвигом расчётов и применением черезPOST /api/capacity/apply,
выгрузка в xlsx, полоса «Перегруз по портфелю» над Гантом и виджет
загрузки на главной архитектора. - Контроль сроков и отклонения по задачам (#80, E3). Статус этапа и
проекта по датам факта (в графике / риск срыва / опоздание / завершён),
прогноз окончания. График медианных отклонений по одинаковым задачам и
конструктор срезов/analytics/deviationsс фильтрами, группировками,
метриками (медиана, среднее, P90), сохранением срезов и выгрузкой в xlsx. - PostgreSQL по умолчанию (#73, #76).
docker compose upподнимает
сервисpostgres, контейнерmigrateприменяет версионированные миграции
изprisma/postgresql/migrations, CI гоняет тесты, сборку и e2e против
той же СУБД. SQLite остаётся режимом одного стенда
(DATABASE_PROVIDER=sqlite). - S3-совместимое хранилище артефактов (#75). ZIP выпущенных комплектов
и DOCX тех.писателя можно хранить в AWS S3, MinIO, Yandex/VK Object
Storage или Ceph RGW; включается заданнымS3_BUCKET. Для файлового
режима объявлен томstorage-data— раньше артефакты жили в слое
контейнера и терялись при его пересоздании.
Исправлено
По код-ревью стопки E1–E3 (#82):
- Панель факта не рисовала ячейки дат факта и сдвига: шапка объявляла
девять колонок, строка выводила пять. - Применение what-if шло через PATCH расчёта, который отказывает
утверждённым версиям, и при первой ошибке оставляло уже применённые
сдвиги на панели. Новый эндпоинт переносит даты этапов с сохранением id. - Замок закрытого факта пропускал повторное «выиграно» и смену версии
с потерей факта; непереданная сумма обнулялась. - Сохранённые срезы: обновление только автором или админом, 404 на
несуществующий id. - Рейтинг: исход сделки приписывается автору выигранной версии, проигрыш —
автору последней; проект без расчётов не входит в win rate. - CSV-импорт факта помечает одноимённые этапы как неоднозначные вместо
записи в последний попавшийся. - Калибровка не считает соседями свои версии и не теряет обнулённые этапы (#72).
Обновление с 0.4.0
- Смена СУБД по умолчанию. Стенд на SQLite продолжит работать, если в
.envзадатьDATABASE_PROVIDER=sqliteиDATABASE_URL=file:./prisma/dev.db
и пересобрать образ с тем жеDATABASE_PROVIDER. Без этого compose
поднимет PostgreSQL с чистой базой. Перенос данных между SQLite и
PostgreSQL штатной командой не делается, см. README. - Схема. Новые модели и поля под исход сделки, факт, ёмкость ролей и
срезы. PostgreSQL:prisma migrate deploy(делает контейнерmigrate).
SQLite:prisma db pushчерезnpm run db:sync. - Артефакты. Если комплекты лежали в слое контейнера, перед пересозданием
скопируйте/app/storageв томstorage-dataили в S3.
Проверено
npm audit --audit-level=high — 0 уязвимостей. 597 юнит-тестов в 71 файле.
Jenkins на коммите 6408388: аудит, lint, typecheck, тесты, сборка и
сквозной сценарий ГОСТ 34 против PostgreSQL — зелёные.
Образ
ghcr.io/onixus/evacal:0.4.1
ghcr.io/onixus/evacal:latest
Мультиарх, linux/amd64 + linux/arm64. Манифест:
sha256:5b5df7fea2f29f8f88e94e43d483751b18d0e634cc993e0268e0ad6b7f29c287
Образ собран из того же коммита, на который указывает тег (387516a).
v0.4.0: Шаблоны ГОСТ 34, работающий выпуск комплекта и рейтинг эффективности
EvaCal v0.4.0 — шаблоны ГОСТ 34, работающий выпуск комплекта и рейтинг эффективности
Релиз объединяет функциональность PR #68 и последовавший за ним блок
исправлений. Главное: выпуск комплекта ГОСТ 34 теперь работает из коробки —
до этого он был заблокирован для любого нового пользователя.
Новое
-
Шаблоны ТЗ по ГОСТ 34 и harness ТЗ-автора: семь отраслевых ТЗ-шаблонов,
набор eval-сценариев, проверки grounding и защита от инъекций в промпт. -
Тёмное фэнтези в интерфейсе: оформление студии и сопутствующие экраны.
-
Рейтинг эффективности пресейлов и архитекторов (
/leaderboard). Для
пресейла — конверсия в утверждённые расчёты, доля переделок, медианный цикл
от создания до утверждения и интегральная оценка. Для архитектора —
согласованные расчёты, выпущенные комплекты ГОСТ 34, решения в роли ГАП и
доля комплектов, принятых с первого раза. Периоды: 30 дней, 90 дней, год,
за всё время; выборки меньше порога помечаются как ненадёжные.Экран открытый:
GET /leaderboardиGET /api/leaderboardдоступны
любому, без учётной записи. Наружу отдаются только логины и агрегаты —
названий расчётов и заказчиков там нет. Граница зафиксирована в
docs/SECURITY_PERIMETER.md.
Исправлено
-
Выпуск комплекта был заблокирован из коробки. Защита от повторного сида
проверяла наличие любого шаблона черезfindFirst(), а отраслевые пресеты
импортируются раньше — поэтому демо-шаблон и демонстрационный расчёт не
создавались никогда. Активных шаблонов не оставалось, presale-страница
уходила в fallback «десять последних без фильтра по активности», и новому
пользователю доставался произвольный пресет. Требования этапов пресетов были
написаны отглагольными существительными, правилоcompletenessпомечало их
ERROR, мастер превращал ERROR в блокер — кнопка «Выпустить комплект»
оставалась заблокированной навсегда.Починены обе стороны: проверка в сиде стала адресной, а 59 текстов требований
во всех десяти пресетах переписаны в обязывающей форме. Закрыто регрессиями. -
Терялись строки листа внутренних изменений. Клиент Prisma кэшировался
только вне production, а прокси читает его на каждое обращение к свойству —
в проде это давало новыйPrismaClientна каждое обращение и рвало
интерактивные транзакции (P2028). Ошибка гасилась в
recordInternalChangeSafe, поэтому журнал молча не писался, а тесты
оставались зелёными. -
Контейнер всегда был unhealthy. Проба здоровья обращалась по имени
localhost:3000, а оно в образе резолвится сначала в IPv6 ([::1]), тогда
как next standalone слушает только0.0.0.0:3000. Проба получала connection
refused при полностью работающем приложении. В оркестраторе постоянно красная
проба означает рестарты или отказ пускать трафик на здоровый контейнер.
Адрес заменён на числовой127.0.0.1. -
Уязвимости в mysql2 (
GHSA-3f6p-5ww8-9rcr,GHSA-rgwj-5xj2-c3m3):
утечка пароля открытым текстом через downgrade auth-плагина и
decompression-bomb DoS. Закрыты override наmysql2 ^3.24.4вместо отката
prisma на 6.19.3, который предлагалnpm audit fix --force.
Инфраструктура
- Сквозной тест в CI. Стадия E2E прогоняет полный путь: логин, создание
проекта и расчёта, мастер ГОСТ 34, выпуск комплекта, утверждение. - Сборка уведена из bind-mount VirtioFS — он недетерминированно терял
записи, из-за чего падалиtsc,vitestи нативный SWC на неповреждённом коде. - Цепочка поставки: 629 резолвов в локе переведены с зеркала
registry.npmmirror.comнаregistry.npmjs.org, реестр закреплён в.npmrc.
Сверка показала 0 расхождений integrity на 715 записях — подмены не было. - Репозиторий приведён к prettier.
Проверено
npm audit --audit-level=high — 0 уязвимостей. 516 юнит-тестов в 61 файле.
Сквозной сценарий ГОСТ 34 проходит целиком. Сборка образа: linux/amd64 + linux/arm64.
Образ
ghcr.io/onixus/evacal:0.4.0
ghcr.io/onixus/evacal:latest
Мультиарх, linux/amd64 + linux/arm64. Манифест:
sha256:681a53ef7a1ef27b6dffeeef24e286eb767b3cee18e8af4f24a97a3491bfafdf
Образ собран из того же коммита, на который указывает тег.
v0.3.0: Polish, Security Hardening & ГОСТ 34 Operations Suite
🚀 Релиз v0.3.0 — EvaCal
📑 1. Эксплуатационная документация ГОСТ 34
- Руководство пользователя (РП) — генератор
lib/gost34/templates/rp34.ts(код 30 по ГОСТ 34.201 / РД 50-34.698-90 п. 2.9): назначение, условия применения, ролевая модель, регламент типовых операций и сценарии аварийного восстановления. - Руководство системного администратора (РА) — генератор
lib/gost34/templates/ra34.ts(код 31 по ГОСТ 34.201): архитектурные требования, регламент развертывания через Docker Compose, управление безопасностью и мониторинг через/api/health. - Расширен тип
GostDocumentType(TZ | PZ | AF | PMI | SPEC | RP | RA) и реестр генераторов.
🛡️ 2. Безопасность и AppSec
- Formula Injection (CWE-1236): автоматическое экранирование спецсимволов
=,+,-,@,\t,\rпри формировании Excel-книг (lib/xlsx.ts). - Инвалидация сессий: серверный механизм немедленного отзыва сессионных токенов (
revokeSession,isSessionRevoked) при выходе из системы. - Харденинг Nginx:
server_tokens off;, добавлены заголовкиX-Content-Type-Options,X-Frame-Options,Referrer-Policy,Permissions-Policy, включеноgzip-сжатие.
⚙️ 3. DevOps, CI/CD и контейнеризация
- Базовые образы: зафиксирован точный тег
node:22.14-alpine3.21вDockerfileиJenkinsfile. - Исправление отдачи статики: добавлено копирование каталога
public/в финальный образrunner. - Мониторинг: внедрен
HEALTHCHECK(30s) и эндпоинтGET /api/health. - Ресурсы и логи: настроена ротация логов (драйвер
json-file, 5x20MB) и лимиты ресурсов (2 CPU, 2048 MB RAM) вdocker-compose.yml.
🧮 4. Финансовый калькулятор
- Защита от распространения
NaN/Infinityв расчетах маржинальности, налогов и ставок (lib/commercial.ts).
🧪 Тестирование и качество
- 40 тестовых наборов, 368 тестов (100% успех)
- TypeScript & ESLint: 0 ошибок, 0 предупреждений
- Next.js Production Build: 23/23 routes скомпилированы успешно
v0.2.2: ГОСТ 34 Нормоконтроль, Реестр Проектов и Prisma 7
Что нового в v0.2.2
📄 ГОСТ 34: Выпуск документов и нормоконтроль
- Правки нормоконтроля: обновлены титульные листы, правила нумерации страниц, сквозная нумерация таблиц по ГОСТ 2.105, калибровка стилей docDefaults/TOC.
- Архитектура ТЗ-2020: модульная декомпозиция схемы разделов, валидаторов и хелперов генератора.
- Трассируемость и пресеты: матрица трассируемости требований к стадиям/ролям, отраслевые пресеты и интерактивный предварительный просмотр.
🗂 Реестр проектов (RR-1)
- Добавлен реестр и карточки проектов в пользовательском интерфейсе.
- Скрипт миграции и бэкфилла существующих расчётов в структуру проектов.
🔒 Безопасность и стабильность
- Устранена уязвимость
deepmerge-tsчерез npm overrides. - Реализован контур разграничения доступа (Page-level ACL / Horizon A).
- Обновление Prisma 5.22 → 7.9 с переходом на современный драйвер SQLite.
🎨 UI/UX и темы
- Новая визуальная тема Dark Fantasy с галереей героинь и пасхалкой бездействия.
- Исправлена логика автоплея медиа и тумблера звука с учетом политик браузера.
⚙️ Инфраструктура и CI
- Пайплайны сборки и публикации контейнеров переведены на локальный Jenkins.
- Обновлена конфигурация хуков Husky v9 и Prettier-форматирование.
v0.2.0
Производительность списков и выгрузки. Аудит выявил три подтверждённые проблемы — все три исправлены в #43.
База данных
В схеме не было ни одного индекса, а SQLite, в отличие от PostgreSQL, не индексирует внешние ключи автоматически. Каждая выборка стадий и рисков расчёта, полей шаблона и поиск активного шаблона шли полным сканом таблицы.
Индексы добавлены строго под запросы, которые есть в коде — лишние только замедляют запись:
| Модель | Индекс |
|---|---|
Stage, Risk |
[calculationId, order] |
FormField, StageTemplate, RiskTemplate |
[templateId, order] |
Calculation |
[createdAt], [templateId], [status, createdAt] |
FormTemplate |
[isActive] |
EXPLAIN QUERY PLAN подтверждает SEARCH USING INDEX вместо SCAN.
Списки
Экраны «Все расчёты», «Архитектор» и «Админ» читали таблицу целиком и вдобавок тянули каждую стадию со всеми полями, включая длинный requirements, ради двух чисел в колонке «Трудозатраты». Теперь читается одна страница (50 строк) и только отображаемые поля.
На экране архитектора разделение на «ожидают согласования» и «остальные» делалось фильтрацией полного массива в памяти — заменено двумя запросами. Очередь согласования по-прежнему показывается целиком, постранично идёт только архив под ней.
API
/api/calculations, /api/templates и /api/users принимают ?page и ?limit (потолок 200). Тело ответа осталось массивом, поэтому существующие вызовы не ломаются, но добавлены заголовки X-Total-Count / X-Page / X-Page-Size / X-Total-Pages — ограничение выдачи видно клиенту, а не происходит молча.
Изменение поведения: по умолчанию эти эндпоинты теперь отдают 50 записей вместо всей таблицы. Отсюда минорная версия, а не патч.
Выгрузка
Экспорт docx/xlsx/pdf/zip оборачивал результат в new Uint8Array(buffer), что для Node Buffer копирует все байты — вторая полная копия многомегабайтного документа в памяти. Заменено представлением поверх той же памяти.
Сборка
Исправлена сборка Docker-образа (#46): npm ci запускал скрипт prepare, а тот прогонял format и typecheck в слое, где ещё нет исходников, и обрывал установку. В GitHub Actions это было не видно, потому что раннер сам выставляет CI=true. Также синхронизирован package-lock.json (#45).
Образ
Собран локально как ghcr.io/onixus/evacal:v0.2.0 / :latest, digest sha256:b4ab990cc881450564c83327d3d7e91659e175f30c3e988b720b290ab0978ac9.
В GHCR не опубликован: GitHub Actions в репозитории сейчас не запускается — «recent account payments have failed or your spending limit needs to be increased». По той же причине у этого релиза нет прогонов CI; все шаги CI (lint, typecheck, тесты, build) прогонялись локально — 274 теста зелёные.
Образ проверен вживую: migrate создаёт схему на чистом томе, приложение отвечает 200 на /, /login, /?page=2 и /api/calculations, индексы в БД контейнера на месте.
Опубликовать образ после починки биллинга:
docker login ghcr.io -u onixus
docker push ghcr.io/onixus/evacal:v0.2.0
docker push ghcr.io/onixus/evacal:latestv0.1.1
Docker
- Adds a
migratebuild target and matchingdocker composeservice (toolsprofile) so the Docker deployment can actually initialize its SQLite schema:docker compose run --rm migraterunsprisma db pushagainst the mounteddb-datavolume, using a full-node_modulesimage kept separate from the slim runtime image (which ships only the generated Prisma Client, no CLI). - README now documents the Docker flow:
docker compose run --rm migrateonce (and after schema changes), thendocker compose up -d --build. - Verified end-to-end on a fresh volume:
migratecreates the schema, thenappserves/and/loginwith 200 — no manual steps inside the container required.
This closes the known limitation called out in v0.1.0 ("first-run schema setup must be run outside the container").
Image
Built locally as ghcr.io/onixus/evacal:v0.1.1 / :latest (digest sha256:74cdce9c255475f24e4f78a9a8f26adb3205287f8b86a8386d6e04528064e908). Not pushed to GHCR from this session — the available token still lacks write:packages scope:
docker build -t ghcr.io/onixus/evacal:v0.1.1 -t ghcr.io/onixus/evacal:latest .
docker login ghcr.io -u onixus
docker push ghcr.io/onixus/evacal:v0.1.1
docker push ghcr.io/onixus/evacal:latest