diff --git a/backend/package.json b/backend/package.json index cd5be3fa..14842874 100644 --- a/backend/package.json +++ b/backend/package.json @@ -20,7 +20,7 @@ "test:auth": "tsx src/plugins/auth-path.test.ts && tsx src/lib/permissions.test.ts && tsx src/plugins/auth.smoke.test.ts && tsx src/plugins/auth.ospf-optimizer.test.ts", "test:wireguard": "npx tsx src/services/wireguard-config.test.ts && npx tsx src/services/wireguard-ipv6.test.ts && npx tsx --test src/services/wireguard-import.test.ts src/services/wireguard-import-apply.test.ts src/services/wireguard-import-revision.test.ts src/services/wireguard-delete.test.ts && npx tsx src/routes/wireguard-import.test.ts", "test:traffic-rate": "tsx src/services/traffic-rate.test.ts && tsx src/services/traffic-observation.test.ts && tsx src/services/traffic-freshness.test.ts && tsx src/services/traffic-live.test.ts && tsx src/services/traffic-observation-sql.test.ts && tsx src/services/traffic-history-sql.test.ts && tsx src/services/traffic-live-sql.test.ts && tsx src/services/traffic-volume-sql.test.ts && tsx src/services/traffic-binding-status.test.ts && tsx src/services/traffic-status-sql.test.ts && tsx src/services/traffic-gap.test.ts && tsx src/services/traffic-identity.test.ts && tsx src/services/traffic-membership.test.ts && tsx src/services/traffic-aggregate-peak.test.ts && tsx src/services/traffic-users-cache.test.ts && tsx src/services/traffic-collection-lock.test.ts && tsx src/services/traffic-concurrency-sql.test.ts", - "test:traffic-flow": "tsx src/routes/traffic-flow-query.test.ts && tsx src/services/traffic-flow-month.test.ts && tsx src/services/traffic-flow-parse.test.ts && tsx src/services/traffic-flow-ipv6-pipeline.test.ts && tsx src/services/traffic-flow-map-exporter.test.ts && tsx src/services/traffic-flow-ifaces.test.ts && tsx src/services/traffic-flow-ifindex.test.ts && tsx src/services/traffic-flow-dedup.test.ts && tsx src/services/traffic-flow-planes.test.ts && tsx src/services/traffic-flow-ip.test.ts && tsx src/services/traffic-flow-dest.test.ts && tsx src/services/traffic-flow-classify.test.ts && tsx src/services/traffic-flow-ripe.test.ts && tsx src/services/traffic-flow-brands.test.ts && tsx src/services/traffic-flow-ingest.test.ts && tsx src/services/traffic-flow-analytics.test.ts && tsx src/services/traffic-flow-map-hops.test.ts && tsx src/services/traffic-flow-purge.test.ts && tsx src/services/traffic-flow-geoip.test.ts && tsx src/services/traffic-flow-facts.test.ts && tsx src/services/traffic-flow-facts-filter.test.ts && tsx src/services/traffic-flow-facts-rebuild.test.ts && tsx src/services/statistics-aggregate.test.ts", + "test:traffic-flow": "tsx src/routes/traffic-flow-query.test.ts && tsx src/services/traffic-flow-month.test.ts && tsx src/services/traffic-flow-parse.test.ts && tsx src/services/traffic-flow-ipv6-pipeline.test.ts && tsx src/services/traffic-flow-map-exporter.test.ts && tsx src/services/traffic-flow-ifaces.test.ts && tsx src/services/traffic-flow-ifindex.test.ts && tsx src/services/traffic-flow-dedup.test.ts && tsx src/services/traffic-flow-planes.test.ts && tsx src/services/traffic-flow-ip.test.ts && tsx src/services/traffic-flow-dest.test.ts && tsx src/services/traffic-flow-classify.test.ts && tsx src/services/traffic-flow-ripe.test.ts && tsx src/services/traffic-flow-brands.test.ts && tsx src/services/traffic-flow-ingest.test.ts && tsx src/services/traffic-flow-analytics.test.ts && tsx src/services/traffic-flow-map-hops.test.ts && tsx src/services/traffic-flow-purge.test.ts && tsx src/services/geoip-download.test.ts && tsx src/services/traffic-flow-geoip.test.ts && tsx src/services/traffic-flow-facts.test.ts && tsx src/services/traffic-flow-facts-filter.test.ts && tsx src/services/traffic-flow-facts-rebuild.test.ts && tsx src/services/statistics-aggregate.test.ts", "test:users": "tsx src/modules/users/iface-type.test.ts && tsx src/modules/users/bindings.test.ts && tsx src/modules/users/interface-inventory.test.ts && tsx src/routes/users-catalog.test.ts", "test:pg": "tsx src/db/pg-pool.test.ts && tsx src/db/sql-bind.test.ts && tsx src/db/sqlite-json.test.ts && tsx src/db/traffic-flags.test.ts && tsx src/db/pg-schema.test.ts && tsx src/services/config-revisions.test.ts", "test:recursive-routes": "tsx src/routes/recursive-routes.test.ts && tsx src/services/recursive-route-catalog.test.ts && tsx src/services/recursive-apply.test.ts", diff --git a/backend/scripts/acceptance/run-traffic-flow-regression.sh b/backend/scripts/acceptance/run-traffic-flow-regression.sh new file mode 100644 index 00000000..080a0d4f --- /dev/null +++ b/backend/scripts/acceptance/run-traffic-flow-regression.sh @@ -0,0 +1,32 @@ +#!/bin/bash +set -euo pipefail +umask 077 +cd /opt/mmapp-test +mm245_db="mm_accept_166_$(date +%s%3N)" +mm245_pass="$(openssl rand -hex 24)" +mm245_role_created=false +mm245_db_created=false +cleanup245() { + docker rm mmapp-s3app245-owned >/dev/null 2>&1 || true + if $mm245_db_created; then docker exec mmapp-test-postgres psql -U mmapp -d mmapp -v ON_ERROR_STOP=1 -c "DROP DATABASE \"$mm245_db\" WITH (FORCE)"; fi + if $mm245_role_created; then docker exec mmapp-test-postgres psql -U mmapp -d mmapp -v ON_ERROR_STOP=1 -c "DROP ROLE \"$mm245_db\""; fi + remaining=$(docker exec mmapp-test-postgres psql -U mmapp -d mmapp -Atc "SELECT (SELECT count(*) FROM pg_database WHERE datname='$mm245_db')+(SELECT count(*) FROM pg_roles WHERE rolname='$mm245_db')") + [ "$remaining" = 0 ] + python3 - <<'PY' +import json,pathlib +p=pathlib.Path('/opt/mmapp-test/artifacts/traffic-flow245/traffic-flow245.json') +if p.exists(): + r=json.loads(p.read_text());r['ownedDatabaseAndRoleRemoved']=True;p.write_text(json.dumps(r,indent=2)+'\n') +PY + printf 'OWNED_DATABASE_AND_ROLE_REMOVED\n' + unset mm245_pass +} +trap cleanup245 EXIT +[[ "$mm245_db" =~ ^mm_accept_166_[0-9]+$ ]] +existing=$(docker exec mmapp-test-postgres psql -U mmapp -d mmapp -Atc "SELECT (SELECT count(*) FROM pg_database WHERE datname='$mm245_db')+(SELECT count(*) FROM pg_roles WHERE rolname='$mm245_db')") +[ "$existing" = 0 ] +printf "CREATE ROLE \"%s\" LOGIN PASSWORD '%s' NOSUPERUSER NOCREATEDB NOCREATEROLE NOBYPASSRLS;\n" "$mm245_db" "$mm245_pass" | docker exec -i mmapp-test-postgres psql -U mmapp -d mmapp -v ON_ERROR_STOP=1 +mm245_role_created=true +docker exec mmapp-test-postgres psql -U mmapp -d mmapp -v ON_ERROR_STOP=1 -c "CREATE DATABASE \"$mm245_db\" OWNER \"$mm245_db\"" +mm245_db_created=true +docker run --name mmapp-s3app245-owned --network mmapp-test_default --cap-drop ALL --security-opt no-new-privileges -e "MMAPP_ORIGIN_BASELINE=${2:-false}" -e NODE_ENV=test -e "DATABASE_URL=postgres://$mm245_db:$mm245_pass@postgres:5432/$mm245_db" -e "MMAPP_OWN_SQL_DB=$mm245_db" -e "DATABASE_PATH=/tmp/$mm245_db/legacy.db" -e "GEOIP_DIR=/tmp/$mm245_db/geoip" -v /opt/mmapp-test/artifacts/traffic-flow245:/checks --entrypoint node "${1:-mmapp-test/backend:ux-geoip242-acceptance}" /checks/traffic-flow-regression.mjs diff --git a/backend/scripts/acceptance/traffic-flow-regression.mjs b/backend/scripts/acceptance/traffic-flow-regression.mjs new file mode 100644 index 00000000..8d2d615e --- /dev/null +++ b/backend/scripts/acceptance/traffic-flow-regression.mjs @@ -0,0 +1,27 @@ +import fs from 'node:fs'; +import assert from 'node:assert/strict'; +import { execFileSync } from 'node:child_process'; +import { createRequire } from 'node:module'; +const pg = createRequire('/app/backend/package.json')('pg'); +const database = process.env.MMAPP_OWN_SQL_DB; assert(/^mm_accept_166_\d+$/.test(database)); +const url = new URL(process.env.DATABASE_URL); assert.equal(url.pathname, '/' + database); assert.equal(url.username, database); +const client = new pg.Client({ connectionString: url.toString() }); await client.connect(); +const role = (await client.query('SELECT rolsuper,rolcreatedb,rolcreaterole,rolbypassrls FROM pg_roles WHERE rolname=current_user')).rows[0]; assert(Object.values(role).every(v => v === false)); await client.end(); +const pkg = JSON.parse(fs.readFileSync('/checks/package245.json')); +assert.equal(pkg.scripts['test:traffic-flow'].split('geoip-download.test.ts').length - 1, 1); +assert.equal(pkg.scripts['test:all'].split('npm run test:traffic-flow').length - 1, 1); +fs.writeFileSync('/app/backend/package.json', JSON.stringify(pkg, null, 2)); +const report = { date: '2026-10-14', block: '12.5.245', scope: 'Changed traffic-flow profile only, source acceptance image + current npm command metadata + owned PostgreSQL', passed: false, newGeoipHttpTestIncludedOnce: true, testAllProfileIncludedOnce: true, productionImagesChanged: false }; +try { + const started = Date.now(); + const output = execFileSync('npm', ['--prefix', 'backend', 'run', 'test:traffic-flow'], { cwd: '/app', timeout: 180000, maxBuffer: 8 * 1024 ** 2, encoding: 'utf8', env: { ...process.env, NODE_ENV: 'test', DATABASE_PATH: '/tmp/' + database + '/legacy.db', GEOIP_DIR: '/tmp/' + database + '/geoip' }, stdio: ['ignore', 'pipe', 'pipe'] }); + fs.writeFileSync('/checks/traffic-flow245-private.log', output, { mode: 0o600 }); + assert(output.includes('GeoIP HTTP: whole-body timeout, declared/chunked limits,304 and recovery passed')); + report.durationMs = Date.now() - started; + report.unavailableSqlBranches = output.split('\n').filter(s => /\bskip(?:ped)?\b/i.test(s) && /PostgreSQL|owned|database|MMAPP_OWN|не пустая БД/i.test(s)).map(s => s.trim()); + const expectedOptionalSkips = ['Monthly SQL: skip (requires an owned isolated database)', 'IPv6 UDP/worker/SQL: skip (requires an owned isolated database)']; + assert.deepEqual(report.unavailableSqlBranches, expectedOptionalSkips); + report.optionalSqlBranchesRequireTheirOwnDedicatedDatabase = true; + report.profileExitCode = 0; report.passed = true; +} catch (e) { report.failure = { name: e.name }; if (e.stdout || e.stderr) fs.writeFileSync('/checks/traffic-flow245-private.log', String(e.stdout ?? '') + '\n' + String(e.stderr ?? ''), { mode: 0o600 }); process.exitCode = 1; } +finally { fs.writeFileSync('/checks/traffic-flow245.json', JSON.stringify(report, null, 2) + '\n'); console.log(JSON.stringify(report)); } diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index b519daef..200383bb 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -1,6 +1,6 @@ # UX/UI: протокол внешней приёмки 12.5 -Актуальное продолжение 2026-10-14:244 — подготовлен официальный container7.24.5 NPK1,175,697bytes из vendor archive200; SHA256 и точная процедура сохранены. SSH22 на104.165.244.7 доступен,194.226.121.150 остаётся control. Package upload/install/reboot0; positive lifecycle не принят. Перед применением нужно отдельное согласие на временный пакет/две controlled перезагрузки и cleanup. Runtime ux-geoip242/ux-backups237. Пока ожидается ответ — независимый245:включение нового GeoIP HTTP regression в общий CI профиль. Этап12.5 открыт. +Актуальное продолжение 2026-10-14:245 — новый GeoIP HTTP regression включён ровно1 раз вtraffic-flow→test:all→npm test/GiteaCI. Local иown-PG source acceptance profile24 scripts прошёл57,066ms; monthly/IPv6 специализированныеSQLветки явноskipped (отдельныеown DB guards). Temporary DB/role/container удалены. User отклонил официальныйcontainer244 и указалmikrotik.ltd; источник проверяется для246, установки/reboot0. Runtime ux-geoip242/ux-backups237 unchanged. Этап12.5 открыт. IPsec78: реальный PSK responder established, mode-config198.18.78.10 и online=true подтверждены API; точные собственные объекты удалены. Сертификатный/DN online, late failure и history restore остаются открытыми. [Отчёт](ux-ui/acceptance/ipsec-mode-config-2026-10-09.json), [журнал](ux-ui-progress.md). @@ -18,6 +18,16 @@ OSPF84: real GRE Full adjacency/private routes/Ping3/3 и4 live PC/320px URL/bro BFD85: Up/Full/own route/Ping,4 live UI и loss/withdrawal/recovery приняты; exact own cleanup8 коллекций×2 passed. Withdrawal5,245ms не подтверждает sub-second BFD timing; этот вопрос открыт. Runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json). +## 12.5.245 — новый GeoIP HTTP тест входит в общий CI-профиль (2026-10-14) + +В backend/package.json test:traffic-flow добавленgeoip-download.test.ts передcollector тестом. test:all вызываетэтотprofile один раз, backend/scripts/test.mjs выполняетего черезnpm test; Gitea backend-test вызываетnpm run test --prefix backend. Новой зависимости и отдельного дублирующего test:geoip вtest:all нет. test:geoip остаётся удобной профильной командой. Это только dev/test command metadata, compiledruntime242/API/UI не изменяются; production Docker не пересобирался ради списка тестов, при следующей сборке метаданные попадутвобраз. + +Local24 scripts прошли; SQLbranches безlocal PG честноskipped. Source acceptance image на code242/cache build с текущим package245 command overlay выполнил тотжеprofile в собственной PostgreSQL ролиNOSUPERUSER/NOCREATEDB/NOCREATEROLE/NOBYPASSRLS:exit0/57,066ms/newHTTPtest observedonce. Обычные SQLветки исполнились; ровно2 специализированныеbranches monthly/IPv6 требуютдругих отдельноименованныхown DB иskipped. Ониневыдаются за новуюприёмку; предыдущие222 протоколы остаютсяисторическими. ВременныеDB/role/container удалены и отсутствиеDB/roleподтверждено. + +Первыйharness запуск не нашёлpg из/checks; исправлен createRequire(/app/backend/package.json), DB/role очищены. Затем guardharness ошибочно запрещалобаизвестныхoptional skips при успешномnpm exit0; скорректирован точныйallowlist, финальныйrun57,066ms passed. Повторныепроверки не суммируются. stdoutтестов сохранёнprivately, publicJSON содержитлишьscope/duration/skips/cleanup. [Протокол](ux-ui/acceptance/traffic-flow245.json); helperstraffic-flow-regression.mjs/run-traffic-flow-regression.sh проходятnode --check. + +Userотклонилприменениеофициальногоcontainer244 из-заисточника иуказалmikrotik.ltd. ЭтотNPKнеприменяется, upload/reboot0. Следующий246 фиксируетзапрошенный7.24.5/x86artifact/source/digest иобновлённуюпроцедуру; конкретное согласие на installation/reboot ещё не получено. Productionbackend ux-geoip242/frontend ux-backups237 неизменны. + ## 12.5.244 — конкретный пакет и процедура контейнерной приёмки (2026-10-14) Для104.165.244.7 подготовлен официальный [all_packages-x867.24.5](https://download.mikrotik.com/routeros/7.24.5/all_packages-x86-7.24.5.zip), HEAD/GET200,10,476,996bytes. Архив прочитан как данные, извлечён толькоcontainer-7.24.5.npk1,175,697bytes. SHA256 zip6acfd80b3f6edfd23cea14bfcdbbb183a6258acb3aedb3d7b0a23f60a19e51c6, NPK7515c52499bd11b063517c7b48a6553519976098040d9dec67f6bf087876a3c9. Это локально вычисленные отпечаткиHTTPSvendor payload, не отдельнаяvendor checksum; native signature/installation ещё не проверены. Файлы толькоignored tmp, вGitбинарники не добавлены. SSH22 reachable, вход/передача NPK не выполнялись. diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 8d7dab4b..266dab79 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,9 +1,19 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-14:244 — подготовлен официальный container7.24.5 NPK1,175,697bytes из vendor archive200; SHA256 и точная процедура сохранены. SSH22 на104.165.244.7 доступен,194.226.121.150 остаётся control. Package upload/install/reboot0; positive lifecycle не принят. Перед применением нужно отдельное согласие на временный пакет/две controlled перезагрузки и cleanup. Runtime ux-geoip242/ux-backups237. Пока ожидается ответ — независимый245:включение нового GeoIP HTTP regression в общий CI профиль. Этап12.5 открыт. +Актуальное продолжение 2026-10-14:245 — новый GeoIP HTTP regression включён ровно1 раз вtraffic-flow→test:all→npm test/GiteaCI. Local иown-PG source acceptance profile24 scripts прошёл57,066ms; monthly/IPv6 специализированныеSQLветки явноskipped (отдельныеown DB guards). Temporary DB/role/container удалены. User отклонил официальныйcontainer244 и указалmikrotik.ltd; источник проверяется для246, установки/reboot0. Runtime ux-geoip242/ux-backups237 unchanged. Этап12.5 открыт. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-14. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. +## 12.5.245 — новый GeoIP HTTP тест входит в общий CI-профиль (2026-10-14) + +В backend/package.json test:traffic-flow добавленgeoip-download.test.ts передcollector тестом. test:all вызываетэтотprofile один раз, backend/scripts/test.mjs выполняетего черезnpm test; Gitea backend-test вызываетnpm run test --prefix backend. Новой зависимости и отдельного дублирующего test:geoip вtest:all нет. test:geoip остаётся удобной профильной командой. Это только dev/test command metadata, compiledruntime242/API/UI не изменяются; production Docker не пересобирался ради списка тестов, при следующей сборке метаданные попадутвобраз. + +Local24 scripts прошли; SQLbranches безlocal PG честноskipped. Source acceptance image на code242/cache build с текущим package245 command overlay выполнил тотжеprofile в собственной PostgreSQL ролиNOSUPERUSER/NOCREATEDB/NOCREATEROLE/NOBYPASSRLS:exit0/57,066ms/newHTTPtest observedonce. Обычные SQLветки исполнились; ровно2 специализированныеbranches monthly/IPv6 требуютдругих отдельноименованныхown DB иskipped. Ониневыдаются за новуюприёмку; предыдущие222 протоколы остаютсяисторическими. ВременныеDB/role/container удалены и отсутствиеDB/roleподтверждено. + +Первыйharness запуск не нашёлpg из/checks; исправлен createRequire(/app/backend/package.json), DB/role очищены. Затем guardharness ошибочно запрещалобаизвестныхoptional skips при успешномnpm exit0; скорректирован точныйallowlist, финальныйrun57,066ms passed. Повторныепроверки не суммируются. stdoutтестов сохранёнprivately, publicJSON содержитлишьscope/duration/skips/cleanup. [Протокол](ux-ui/acceptance/traffic-flow245.json); helperstraffic-flow-regression.mjs/run-traffic-flow-regression.sh проходятnode --check. + +Userотклонилприменениеофициальногоcontainer244 из-заисточника иуказалmikrotik.ltd. ЭтотNPKнеприменяется, upload/reboot0. Следующий246 фиксируетзапрошенный7.24.5/x86artifact/source/digest иобновлённуюпроцедуру; конкретное согласие на installation/reboot ещё не получено. Productionbackend ux-geoip242/frontend ux-backups237 неизменны. + ## 12.5.244 — конкретный пакет и процедура контейнерной приёмки (2026-10-14) Для104.165.244.7 подготовлен официальный [all_packages-x867.24.5](https://download.mikrotik.com/routeros/7.24.5/all_packages-x86-7.24.5.zip), HEAD/GET200,10,476,996bytes. Архив прочитан как данные, извлечён толькоcontainer-7.24.5.npk1,175,697bytes. SHA256 zip6acfd80b3f6edfd23cea14bfcdbbb183a6258acb3aedb3d7b0a23f60a19e51c6, NPK7515c52499bd11b063517c7b48a6553519976098040d9dec67f6bf087876a3c9. Это локально вычисленные отпечаткиHTTPSvendor payload, не отдельнаяvendor checksum; native signature/installation ещё не проверены. Файлы толькоignored tmp, вGitбинарники не добавлены. SSH22 reachable, вход/передача NPK не выполнялись. diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index f25b4cac..b485bca5 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-14:244 — подготовлен официальный container7.24.5 NPK1,175,697bytes из vendor archive200; SHA256 и точная процедура сохранены. SSH22 на104.165.244.7 доступен,194.226.121.150 остаётся control. Package upload/install/reboot0; positive lifecycle не принят. Перед применением нужно отдельное согласие на временный пакет/две controlled перезагрузки и cleanup. Runtime ux-geoip242/ux-backups237. Пока ожидается ответ — независимый245:включение нового GeoIP HTTP regression в общий CI профиль. Этап12.5 открыт. +Актуальное продолжение 2026-10-14:245 — новый GeoIP HTTP regression включён ровно1 раз вtraffic-flow→test:all→npm test/GiteaCI. Local иown-PG source acceptance profile24 scripts прошёл57,066ms; monthly/IPv6 специализированныеSQLветки явноskipped (отдельныеown DB guards). Temporary DB/role/container удалены. User отклонил официальныйcontainer244 и указалmikrotik.ltd; источник проверяется для246, установки/reboot0. Runtime ux-geoip242/ux-backups237 unchanged. Этап12.5 открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -38,6 +38,16 @@ | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | | 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка12.3.83 в границах журнала. Внешняя12.5: блоки1–236 завершены в записанных scopes, этап открыт. Runtime backend ux-backup234/frontend ux-routing218; backend25/UI52 и дополнительные SQL/UDP222 прошли. | +## 12.5.245 — новый GeoIP HTTP тест входит в общий CI-профиль (2026-10-14) + +В backend/package.json test:traffic-flow добавленgeoip-download.test.ts передcollector тестом. test:all вызываетэтотprofile один раз, backend/scripts/test.mjs выполняетего черезnpm test; Gitea backend-test вызываетnpm run test --prefix backend. Новой зависимости и отдельного дублирующего test:geoip вtest:all нет. test:geoip остаётся удобной профильной командой. Это только dev/test command metadata, compiledruntime242/API/UI не изменяются; production Docker не пересобирался ради списка тестов, при следующей сборке метаданные попадутвобраз. + +Local24 scripts прошли; SQLbranches безlocal PG честноskipped. Source acceptance image на code242/cache build с текущим package245 command overlay выполнил тотжеprofile в собственной PostgreSQL ролиNOSUPERUSER/NOCREATEDB/NOCREATEROLE/NOBYPASSRLS:exit0/57,066ms/newHTTPtest observedonce. Обычные SQLветки исполнились; ровно2 специализированныеbranches monthly/IPv6 требуютдругих отдельноименованныхown DB иskipped. Ониневыдаются за новуюприёмку; предыдущие222 протоколы остаютсяисторическими. ВременныеDB/role/container удалены и отсутствиеDB/roleподтверждено. + +Первыйharness запуск не нашёлpg из/checks; исправлен createRequire(/app/backend/package.json), DB/role очищены. Затем guardharness ошибочно запрещалобаизвестныхoptional skips при успешномnpm exit0; скорректирован точныйallowlist, финальныйrun57,066ms passed. Повторныепроверки не суммируются. stdoutтестов сохранёнprivately, publicJSON содержитлишьscope/duration/skips/cleanup. [Протокол](ux-ui/acceptance/traffic-flow245.json); helperstraffic-flow-regression.mjs/run-traffic-flow-regression.sh проходятnode --check. + +Userотклонилприменениеофициальногоcontainer244 из-заисточника иуказалmikrotik.ltd. ЭтотNPKнеприменяется, upload/reboot0. Следующий246 фиксируетзапрошенный7.24.5/x86artifact/source/digest иобновлённуюпроцедуру; конкретное согласие на installation/reboot ещё не получено. Productionbackend ux-geoip242/frontend ux-backups237 неизменны. + ## 12.5.244 — конкретный пакет и процедура контейнерной приёмки (2026-10-14) Для104.165.244.7 подготовлен официальный [all_packages-x867.24.5](https://download.mikrotik.com/routeros/7.24.5/all_packages-x86-7.24.5.zip), HEAD/GET200,10,476,996bytes. Архив прочитан как данные, извлечён толькоcontainer-7.24.5.npk1,175,697bytes. SHA256 zip6acfd80b3f6edfd23cea14bfcdbbb183a6258acb3aedb3d7b0a23f60a19e51c6, NPK7515c52499bd11b063517c7b48a6553519976098040d9dec67f6bf087876a3c9. Это локально вычисленные отпечаткиHTTPSvendor payload, не отдельнаяvendor checksum; native signature/installation ещё не проверены. Файлы толькоignored tmp, вGitбинарники не добавлены. SSH22 reachable, вход/передача NPK не выполнялись. diff --git a/docs/ux-ui-remaining-acceptance.md b/docs/ux-ui-remaining-acceptance.md index ab9d93ea..428167f8 100644 --- a/docs/ux-ui-remaining-acceptance.md +++ b/docs/ux-ui-remaining-acceptance.md @@ -1,11 +1,21 @@ # Оставшаяся внешняя приёмка — 2026-10-14 -Актуальное продолжение 2026-10-14:244 — подготовлен официальный container7.24.5 NPK1,175,697bytes из vendor archive200; SHA256 и точная процедура сохранены. SSH22 на104.165.244.7 доступен,194.226.121.150 остаётся control. Package upload/install/reboot0; positive lifecycle не принят. Перед применением нужно отдельное согласие на временный пакет/две controlled перезагрузки и cleanup. Runtime ux-geoip242/ux-backups237. Пока ожидается ответ — независимый245:включение нового GeoIP HTTP regression в общий CI профиль. Этап12.5 открыт. +Актуальное продолжение 2026-10-14:245 — новый GeoIP HTTP regression включён ровно1 раз вtraffic-flow→test:all→npm test/GiteaCI. Local иown-PG source acceptance profile24 scripts прошёл57,066ms; monthly/IPv6 специализированныеSQLветки явноskipped (отдельныеown DB guards). Temporary DB/role/container удалены. User отклонил официальныйcontainer244 и указалmikrotik.ltd; источник проверяется для246, установки/reboot0. Runtime ux-geoip242/ux-backups237 unchanged. Этап12.5 открыт. -Это актуальная матрица после 12.5.244. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. +Это актуальная матрица после 12.5.245. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-geoip242`, frontend `ux-backups237`; production lab с195 использует AUTH_REQUIRED=true и Portal1.3.1. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. +## 12.5.245 — новый GeoIP HTTP тест входит в общий CI-профиль (2026-10-14) + +В backend/package.json test:traffic-flow добавленgeoip-download.test.ts передcollector тестом. test:all вызываетэтотprofile один раз, backend/scripts/test.mjs выполняетего черезnpm test; Gitea backend-test вызываетnpm run test --prefix backend. Новой зависимости и отдельного дублирующего test:geoip вtest:all нет. test:geoip остаётся удобной профильной командой. Это только dev/test command metadata, compiledruntime242/API/UI не изменяются; production Docker не пересобирался ради списка тестов, при следующей сборке метаданные попадутвобраз. + +Local24 scripts прошли; SQLbranches безlocal PG честноskipped. Source acceptance image на code242/cache build с текущим package245 command overlay выполнил тотжеprofile в собственной PostgreSQL ролиNOSUPERUSER/NOCREATEDB/NOCREATEROLE/NOBYPASSRLS:exit0/57,066ms/newHTTPtest observedonce. Обычные SQLветки исполнились; ровно2 специализированныеbranches monthly/IPv6 требуютдругих отдельноименованныхown DB иskipped. Ониневыдаются за новуюприёмку; предыдущие222 протоколы остаютсяисторическими. ВременныеDB/role/container удалены и отсутствиеDB/roleподтверждено. + +Первыйharness запуск не нашёлpg из/checks; исправлен createRequire(/app/backend/package.json), DB/role очищены. Затем guardharness ошибочно запрещалобаизвестныхoptional skips при успешномnpm exit0; скорректирован точныйallowlist, финальныйrun57,066ms passed. Повторныепроверки не суммируются. stdoutтестов сохранёнprivately, publicJSON содержитлишьscope/duration/skips/cleanup. [Протокол](ux-ui/acceptance/traffic-flow245.json); helperstraffic-flow-regression.mjs/run-traffic-flow-regression.sh проходятnode --check. + +Userотклонилприменениеофициальногоcontainer244 из-заисточника иуказалmikrotik.ltd. ЭтотNPKнеприменяется, upload/reboot0. Следующий246 фиксируетзапрошенный7.24.5/x86artifact/source/digest иобновлённуюпроцедуру; конкретное согласие на installation/reboot ещё не получено. Productionbackend ux-geoip242/frontend ux-backups237 неизменны. + ## 12.5.244 — конкретный пакет и процедура контейнерной приёмки (2026-10-14) Для104.165.244.7 подготовлен официальный [all_packages-x867.24.5](https://download.mikrotik.com/routeros/7.24.5/all_packages-x86-7.24.5.zip), HEAD/GET200,10,476,996bytes. Архив прочитан как данные, извлечён толькоcontainer-7.24.5.npk1,175,697bytes. SHA256 zip6acfd80b3f6edfd23cea14bfcdbbb183a6258acb3aedb3d7b0a23f60a19e51c6, NPK7515c52499bd11b063517c7b48a6553519976098040d9dec67f6bf087876a3c9. Это локально вычисленные отпечаткиHTTPSvendor payload, не отдельнаяvendor checksum; native signature/installation ещё не проверены. Файлы толькоignored tmp, вGitбинарники не добавлены. SSH22 reachable, вход/передача NPK не выполнялись. @@ -148,7 +158,7 @@ Portal offline JWT действует доexp после logout/role change; э ## Следующая последовательность — 2026-10-14 -1. **Контейнеры244:** точный пакет и процедура готовы; установка/перезапуски ждут согласия. **245 — CI:** включить новый GeoIP HTTP boundary test в общий regression path без повторного выполнения коллектора. ACME и remote Gitea publishing требуют своих доступов/разрешённого scope. +1. **Контейнеры246:** официальныйartifact244 отклонён пользователем, использовать источникmikrotik.ltd; проверить точный7.24.5artifact/digest и обновить процедуру. Применение/перезапуски ещё не согласованы. CI245 принят; ACME и remote Gitea publishing требуют своих доступов/разрешённого scope. 2. **Профильный контроль:** для новых изменений выполнять затронутые SQL/API/UI проверки. Общая регрессия192 выполнена; не повторять её без изменений общей основы или нового основания. 3. **Внешние зависимости:** Portal issuer/login/revoke, Telegram bot/chat/разрешённое сообщение, клиентские ОС, независимые WAN/public IPv6 и scale/multi-instance — отдельные группы по таблице выше. Ограничения текущего стенда не превращать в обещание приёмки всех конфигураций. diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index fe8559c7..2ab8271d 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-14:244 — подготовлен официальный container7.24.5 NPK1,175,697bytes из vendor archive200; SHA256 и точная процедура сохранены. SSH22 на104.165.244.7 доступен,194.226.121.150 остаётся control. Package upload/install/reboot0; positive lifecycle не принят. Перед применением нужно отдельное согласие на временный пакет/две controlled перезагрузки и cleanup. Runtime ux-geoip242/ux-backups237. Пока ожидается ответ — независимый245:включение нового GeoIP HTTP regression в общий CI профиль. Этап12.5 открыт. +Актуальное продолжение 2026-10-14:245 — новый GeoIP HTTP regression включён ровно1 раз вtraffic-flow→test:all→npm test/GiteaCI. Local иown-PG source acceptance profile24 scripts прошёл57,066ms; monthly/IPv6 специализированныеSQLветки явноskipped (отдельныеown DB guards). Temporary DB/role/container удалены. User отклонил официальныйcontainer244 и указалmikrotik.ltd; источник проверяется для246, установки/reboot0. Runtime ux-geoip242/ux-backups237 unchanged. Этап12.5 открыт. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -4152,6 +4152,16 @@ Real Portal/browser API, provider local verified: создан один job ро Runtime backend ux-backup234/frontend ux-routing218 healthy; новое application image для volume-only fix не требовалось. Пароли CHR не менялись, S3 mutations0 в235, configs body/JWT не опубликованы, private local manifest удалён. Исходные10 missing local files не восстановлены и records не удалены. Force-recreate — не host reboot/power loss/fsync/DR приёмка. Далее236 — UX недоступных local files, затем version retention границы и оставшиеся7 группы матрицы; multi-instance guard не принимается. Этап12.5 открыт. +## 12.5.245 — новый GeoIP HTTP тест входит в общий CI-профиль (2026-10-14) + +В backend/package.json test:traffic-flow добавленgeoip-download.test.ts передcollector тестом. test:all вызываетэтотprofile один раз, backend/scripts/test.mjs выполняетего черезnpm test; Gitea backend-test вызываетnpm run test --prefix backend. Новой зависимости и отдельного дублирующего test:geoip вtest:all нет. test:geoip остаётся удобной профильной командой. Это только dev/test command metadata, compiledruntime242/API/UI не изменяются; production Docker не пересобирался ради списка тестов, при следующей сборке метаданные попадутвобраз. + +Local24 scripts прошли; SQLbranches безlocal PG честноskipped. Source acceptance image на code242/cache build с текущим package245 command overlay выполнил тотжеprofile в собственной PostgreSQL ролиNOSUPERUSER/NOCREATEDB/NOCREATEROLE/NOBYPASSRLS:exit0/57,066ms/newHTTPtest observedonce. Обычные SQLветки исполнились; ровно2 специализированныеbranches monthly/IPv6 требуютдругих отдельноименованныхown DB иskipped. Ониневыдаются за новуюприёмку; предыдущие222 протоколы остаютсяисторическими. ВременныеDB/role/container удалены и отсутствиеDB/roleподтверждено. + +Первыйharness запуск не нашёлpg из/checks; исправлен createRequire(/app/backend/package.json), DB/role очищены. Затем guardharness ошибочно запрещалобаизвестныхoptional skips при успешномnpm exit0; скорректирован точныйallowlist, финальныйrun57,066ms passed. Повторныепроверки не суммируются. stdoutтестов сохранёнprivately, publicJSON содержитлишьscope/duration/skips/cleanup. [Протокол](ux-ui/acceptance/traffic-flow245.json); helperstraffic-flow-regression.mjs/run-traffic-flow-regression.sh проходятnode --check. + +Userотклонилприменениеофициальногоcontainer244 из-заисточника иуказалmikrotik.ltd. ЭтотNPKнеприменяется, upload/reboot0. Следующий246 фиксируетзапрошенный7.24.5/x86artifact/source/digest иобновлённуюпроцедуру; конкретное согласие на installation/reboot ещё не получено. Productionbackend ux-geoip242/frontend ux-backups237 неизменны. + ## 12.5.244 — конкретный пакет и процедура контейнерной приёмки (2026-10-14) Для104.165.244.7 подготовлен официальный [all_packages-x867.24.5](https://download.mikrotik.com/routeros/7.24.5/all_packages-x86-7.24.5.zip), HEAD/GET200,10,476,996bytes. Архив прочитан как данные, извлечён толькоcontainer-7.24.5.npk1,175,697bytes. SHA256 zip6acfd80b3f6edfd23cea14bfcdbbb183a6258acb3aedb3d7b0a23f60a19e51c6, NPK7515c52499bd11b063517c7b48a6553519976098040d9dec67f6bf087876a3c9. Это локально вычисленные отпечаткиHTTPSvendor payload, не отдельнаяvendor checksum; native signature/installation ещё не проверены. Файлы толькоignored tmp, вGitбинарники не добавлены. SSH22 reachable, вход/передача NPK не выполнялись. diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index e2eae1bc..9780a893 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -1,6 +1,6 @@ # Тестовый сервер UX/UI — 2026-10-10 -Актуальное продолжение 2026-10-14:244 — подготовлен официальный container7.24.5 NPK1,175,697bytes из vendor archive200; SHA256 и точная процедура сохранены. SSH22 на104.165.244.7 доступен,194.226.121.150 остаётся control. Package upload/install/reboot0; positive lifecycle не принят. Перед применением нужно отдельное согласие на временный пакет/две controlled перезагрузки и cleanup. Runtime ux-geoip242/ux-backups237. Пока ожидается ответ — независимый245:включение нового GeoIP HTTP regression в общий CI профиль. Этап12.5 открыт. +Актуальное продолжение 2026-10-14:245 — новый GeoIP HTTP regression включён ровно1 раз вtraffic-flow→test:all→npm test/GiteaCI. Local иown-PG source acceptance profile24 scripts прошёл57,066ms; monthly/IPv6 специализированныеSQLветки явноskipped (отдельныеown DB guards). Temporary DB/role/container удалены. User отклонил официальныйcontainer244 и указалmikrotik.ltd; источник проверяется для246, установки/reboot0. Runtime ux-geoip242/ux-backups237 unchanged. Этап12.5 открыт. | Параметр | Проверенное состояние | | --- | --- | @@ -34,6 +34,16 @@ OSPF84: real GRE Full adjacency/private routes/Ping3/3 и4 live PC/320px URL/bro BFD85: Up/Full/own route/Ping,4 live UI и loss/withdrawal/recovery приняты; exact own cleanup8 коллекций×2 passed. Withdrawal5,245ms не подтверждает sub-second BFD timing; этот вопрос открыт. Runtime routing83 без новой сборки. [Отчёт](ux-ui/acceptance/ospf-bfd-loss-2026-10-09.json). +## 12.5.245 — новый GeoIP HTTP тест входит в общий CI-профиль (2026-10-14) + +В backend/package.json test:traffic-flow добавленgeoip-download.test.ts передcollector тестом. test:all вызываетэтотprofile один раз, backend/scripts/test.mjs выполняетего черезnpm test; Gitea backend-test вызываетnpm run test --prefix backend. Новой зависимости и отдельного дублирующего test:geoip вtest:all нет. test:geoip остаётся удобной профильной командой. Это только dev/test command metadata, compiledruntime242/API/UI не изменяются; production Docker не пересобирался ради списка тестов, при следующей сборке метаданные попадутвобраз. + +Local24 scripts прошли; SQLbranches безlocal PG честноskipped. Source acceptance image на code242/cache build с текущим package245 command overlay выполнил тотжеprofile в собственной PostgreSQL ролиNOSUPERUSER/NOCREATEDB/NOCREATEROLE/NOBYPASSRLS:exit0/57,066ms/newHTTPtest observedonce. Обычные SQLветки исполнились; ровно2 специализированныеbranches monthly/IPv6 требуютдругих отдельноименованныхown DB иskipped. Ониневыдаются за новуюприёмку; предыдущие222 протоколы остаютсяисторическими. ВременныеDB/role/container удалены и отсутствиеDB/roleподтверждено. + +Первыйharness запуск не нашёлpg из/checks; исправлен createRequire(/app/backend/package.json), DB/role очищены. Затем guardharness ошибочно запрещалобаизвестныхoptional skips при успешномnpm exit0; скорректирован точныйallowlist, финальныйrun57,066ms passed. Повторныепроверки не суммируются. stdoutтестов сохранёнprivately, publicJSON содержитлишьscope/duration/skips/cleanup. [Протокол](ux-ui/acceptance/traffic-flow245.json); helperstraffic-flow-regression.mjs/run-traffic-flow-regression.sh проходятnode --check. + +Userотклонилприменениеофициальногоcontainer244 из-заисточника иуказалmikrotik.ltd. ЭтотNPKнеприменяется, upload/reboot0. Следующий246 фиксируетзапрошенный7.24.5/x86artifact/source/digest иобновлённуюпроцедуру; конкретное согласие на installation/reboot ещё не получено. Productionbackend ux-geoip242/frontend ux-backups237 неизменны. + ## 12.5.244 — конкретный пакет и процедура контейнерной приёмки (2026-10-14) Для104.165.244.7 подготовлен официальный [all_packages-x867.24.5](https://download.mikrotik.com/routeros/7.24.5/all_packages-x86-7.24.5.zip), HEAD/GET200,10,476,996bytes. Архив прочитан как данные, извлечён толькоcontainer-7.24.5.npk1,175,697bytes. SHA256 zip6acfd80b3f6edfd23cea14bfcdbbb183a6258acb3aedb3d7b0a23f60a19e51c6, NPK7515c52499bd11b063517c7b48a6553519976098040d9dec67f6bf087876a3c9. Это локально вычисленные отпечаткиHTTPSvendor payload, не отдельнаяvendor checksum; native signature/installation ещё не проверены. Файлы толькоignored tmp, вGitбинарники не добавлены. SSH22 reachable, вход/передача NPK не выполнялись. diff --git a/docs/ux-ui/acceptance/traffic-flow245.json b/docs/ux-ui/acceptance/traffic-flow245.json new file mode 100644 index 00000000..2c074755 --- /dev/null +++ b/docs/ux-ui/acceptance/traffic-flow245.json @@ -0,0 +1,17 @@ +{ + "date": "2026-10-14", + "block": "12.5.245", + "scope": "Changed traffic-flow profile only, source acceptance image + current npm command metadata + owned PostgreSQL", + "passed": true, + "newGeoipHttpTestIncludedOnce": true, + "testAllProfileIncludedOnce": true, + "productionImagesChanged": false, + "durationMs": 57066, + "unavailableSqlBranches": [ + "Monthly SQL: skip (requires an owned isolated database)", + "IPv6 UDP/worker/SQL: skip (requires an owned isolated database)" + ], + "optionalSqlBranchesRequireTheirOwnDedicatedDatabase": true, + "profileExitCode": 0, + "ownedDatabaseAndRoleRemoved": true +}