diff --git a/CHANGELOG.md b/CHANGELOG.md index fa66075..b88b894 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,23 @@ ## [Unreleased] +### Документация — итоговая приёмка v1.0.0 + +- Зафиксирован финальный production-прогон `1.0.0-rc5`: build, повторная + проверка опубликованного артефакта, чистая установка на Debian 13, reboot, + Admin/UI, управление пирами, diagnostics и внешний E2E официальным клиентом + Hysteria 2.12.2 дали `PASS`. +- Отдельно записан downstream gateway/TUN-прогон через `vpn-egressctl 0.2.0` + и sing-box 1.14.0, включая реального клиента за `br_vpn`, idempotent sync и + fail-closed / anti-leak проверку. +- Release identity привязана к source commit `b7e478f0143846633d1261ca0bcd220736d28f44`, + Build ID `rc5-final-fi-20260908T003829Z` и SHA-256 артефакта + `d35cf469d8e1e3b5c1e79cb94329c1b19d1afbd7ade771498d2fb8caf5cd746a`. + Stable promotion должен использовать эти же байты без пересборки; docs-only + коммит не меняет идентичность проверенного кандидата. +- Полный протокол опубликован в + [итоговом отчёте о приёмке RC5](docs/acceptance/2026-09-15-v1.0.0-rc5-final-acceptance.md). + Runtime-разбор RC4 закрыл три дефекта панели и один связанный риск сопровождения. Набор знаков имени пира больше не хранится как сырой `@` внутри message format: общий frontend-контракт передаёт его в RU/EN-подсказку через diff --git a/README.md b/README.md index 8be4152..5e6fbcb 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@

Что это · + Приёмка v1.0.0 · Возможности · Быстрый старт · Конфигурация · @@ -37,6 +38,18 @@ HY2XS подходит для сценария, где нужен один produ Ключевая идея: на target‑сервере выполняется только установка готового пакета. Вся тяжёлая сборочная часть остаётся на build‑машине. +## Статус приёмки v1.0.0 + +Кандидат `1.0.0-rc5` прошёл финальную production-приёмку на чистом Debian 13: +сборку и проверку опубликованного артефакта, установку, reboot persistence, +Admin/UI, управление пирами, diagnostics, реальный E2E официальным клиентом +Hysteria 2.12.2 и дополнительный gateway/TUN anti-leak прогон. + +Вердикт: **`PASS / PRODUCTION E2E VALIDATED`**, кандидат готов к выпуску +`1.0.0`. Канонические release identity, контрольная сумма и полный протокол — в +[итоговом отчёте о приёмке RC5](docs/acceptance/2026-09-15-v1.0.0-rc5-final-acceptance.md). +Stable должен продвигать проверенный RC5 artifact без пересборки. + ## Возможности HY2XS release‑пакет разворачивает и настраивает: diff --git a/docs/acceptance/2026-09-15-v1.0.0-rc5-final-acceptance.md b/docs/acceptance/2026-09-15-v1.0.0-rc5-final-acceptance.md new file mode 100644 index 0000000..791f6d0 --- /dev/null +++ b/docs/acceptance/2026-09-15-v1.0.0-rc5-final-acceptance.md @@ -0,0 +1,338 @@ +# HY2XS 1.0.0-rc5 — итоговый отчёт о приёмке + +**Дата прогона:** 2026-09-15 + +**Вердикт:** `PASS / PRODUCTION E2E VALIDATED` + +**Статус выпуска:** `READY FOR 1.0.0` + +Этот отчёт фиксирует фактическую финальную приёмку RC5: release build, +повторную проверку опубликованного артефакта, установку на чистый Debian 13, +проверки после перезагрузки, Admin/UI, диагностику и реальный внешний dataplane +официальным клиентом Hysteria 2.12.2. + +Проверенный кандидат: + +```text +Product: HY2XS +Version: 1.0.0-rc5 +Source commit: b7e478f0143846633d1261ca0bcd220736d28f44 +Build ID: rc5-final-fi-20260908T003829Z +Artifact: hy2xs-install-1.0.0.tar.gz +Artifact size: 50 785 975 bytes +SHA-256: d35cf469d8e1e3b5c1e79cb94329c1b19d1afbd7ade771498d2fb8caf5cd746a +Target: Debian 13 / amd64 +Hysteria: v2.12.2 +``` + +> Публичный IPv4 тестового хоста в отчёте заменён на `198.51.100.20` +> (RFC 5737, документационный диапазон). Домен и порты оставлены: без них +> конфигурация прогона была бы неоднозначной. Секреты, credentials и клиентские +> URI в отчёт не перенесены. + +--- + +## 1. Build acceptance + +Production builder успешно завершил полный release pipeline из чистого +рабочего дерева. + +Подтверждено: + +- тесты оркестратора — `PASS`; +- frontend contract tests — `PASS`; +- runtime-тесты RU/EN словарей `vue-i18n` — `PASS`; +- frontend typecheck — `PASS`; +- production build frontend — `PASS`; +- Go tests — `PASS`; +- Go race checks — `PASS`; +- `govulncheck` — `PASS`; +- `pnpm audit` с порогом high+ — `PASS`; +- upstream SHA-256 Hysteria — `PASS`; +- совместимость Gecko — `PASS`; +- совместимость Salamander — `PASS`; +- полные release acceptance gates — `PASS`; +- внутренние контрольные суммы пакета — `PASS`; +- рабочее дерево источника после сборки осталось чистым. + +## 2. Приёмка опубликованного артефакта + +Для clean-host прогона использован опубликованный release artifact, повторно +скачанный из Gitea. На target он не пересобирался. + +Повторно проверены: + +- имя и размер архива; +- внешний SHA-256 архива; +- package provenance; +- Build ID; +- source commit; +- внутренние контрольные суммы; +- clean-host preflight. + +Все проверки идентичности сошлись с release identity в начале отчёта. + +## 3. Чистый хост и установка + +RC5 установлен штатным `install.sh` на чистый Debian 13 amd64. До установки +подтверждены актуальное состояние ОС и kernel, отсутствие ожидающих package +upgrades, SSH на TCP/2323 с key-only root authentication и отключённой password +authentication. Публичный IPv4 хоста и DNS endpoint совпадали. + +Admin forwarding был разрешён только к `127.0.0.1:8080`. + +Результат установки: + +```text +install.sh exit code: 0 +``` + +В ходе штатной установки успешно проверены: + +- установка Hysteria 2.12.2; +- upstream SHA-256 Hysteria; +- генерация production-конфигурации; +- systemd units; +- nftables takeover; +- staged firewall apply; +- firewall rollback guard; +- runtime Hysteria; +- runtime HY2XS admin; +- отрицательный Admin login: `invalid_credentials`, токен отсутствует; +- положительный Admin login: Bearer token получен; +- effective firewall соответствует generated configuration; +- effective Hysteria configuration соответствует production profile. + +После успешного smoke rollback guard снят, install state переведён в durable +состояние `installed`. + +## 4. Admin/UI и управление пирами + +Admin UI был доступен только через SSH tunnel на `127.0.0.1:8080`. + +Фактически подтверждены: + +- вход через реальный браузер; +- работа dashboard; +- состояние Hysteria2 отображается как active; +- доступность Traffic Stats API; +- отображение системных журналов; +- отображение журналов Hysteria; +- создание пира; +- изменение состояния пира; +- получение client URI/config. + +В runtime отдельно проверены исправления RC5: + +- diagnostic `vue-i18n Invalid linked format` отсутствует; +- форма пира корректно показывает допустимую пунктуацию; +- Element Plus Radio больше не использует deprecated `label` as value; +- выбор диапазона dashboard работает штатно. + +## 5. Состояние после перезагрузки + +После reboot подтверждено: + +```text +hysteria-server.service enabled / active +hy2xs-admin.service enabled / active +nftables.service enabled / active + +runtime_state running +install state installed +firewall state valid +rollback guard quiescent +operation in progress none +doctor PASS +``` + +В журналах не обнаружены runtime-сигналы `panic`, `fatal`, `segfault` или HTTP +500. + +Runtime listeners: + +| Назначение | Адрес | +| --- | --- | +| Hysteria | публичный UDP endpoint | +| SSH | TCP/2323 | +| HY2XS admin | `127.0.0.1:8080` | +| Traffic Stats API | `127.0.0.1:36712` | + +Admin и Traffic Stats API остались loopback-only. + +## 6. Diagnostics acceptance + +Diagnostics bundle успешно сформирован в trusted storage. + +Подтверждено: + +- diagnostics directory принадлежит root; +- режим архива — `0600`; +- владелец архива — `root:root`; +- временный workspace удаляется; +- реальные secret values в bundle отсутствуют; +- Admin credentials заменены на ``; +- Hysteria Traffic Stats secret заменён на ``; +- Gecko/obfs password заменён на ``; +- `HY2XS_FORCE_PASSWORD_CHANGE=false` остаётся видимым как non-secret flag. + +Итог diagnostics contract: `PASS`. + +## 7. Production E2E официальным клиентом + +Финальный независимый dataplane E2E выполнен официальным клиентом Hysteria +2.12.2. + +Production deployment: + +```text +Host: se.api.withen.pro +IPv4: 198.51.100.20 (обезличен) +OS: Debian 13 / amd64 +Hysteria: v2.12.2 +HY2XS: 1.0.0-rc5 +Public Hysteria endpoint: UDP/2053 +SSH: TCP/2323 +ACME HTTP-01: TCP/80 +Admin: 127.0.0.1:8080 +Traffic Stats API: 127.0.0.1:36712 +Firewall: takeover / policy drop +Obfuscation: Gecko +``` + +Созданный в HY2XS пир успешно использован официальным клиентом Hysteria. + +Подтверждено: + +- соединение с `se.api.withen.pro:2053` — `PASS`; +- QUIC/Hysteria handshake — `PASS`; +- `udpEnabled=true`; +- SOCKS5 tunnel — `PASS`; +- HTTPS через tunnel — `PASS`; +- внешний IPv4 через tunnel совпал с публичным IPv4 HY2XS-хоста; +- packet capture: 136 packets; +- dropped packets: 0; +- client → server UDP packets: 70; +- server → client UDP packets: 66. + +Тем самым подтверждена полная цепочка: + +```text +client +→ DNS/TLS/SNI +→ UDP endpoint +→ Gecko +→ Hysteria2 +→ HY2XS peer authentication +→ Internet egress +``` + +## 8. Дополнительная downstream-проверка + +Отдельный production-прогон через `vpn-egressctl 0.2.0` и sing-box 1.14.0 не +является приёмкой этих внешних компонентов в репозитории HY2XS. Он фиксируется +здесь как дополнительное доказательство совместимости HY2XS endpoint с +gateway/TUN-сценарием и реальным клиентом за gateway. + +Проверенная конфигурация: + +```text +vpn-egressctl: 0.2.0 +sing-box: 1.14.0 +Server Hysteria: 2.12.2 +Obfuscation: Gecko +Endpoint: se.api.withen.pro:2053 +Gateway TUN: tun-sb0 +TUN address: 172.19.0.1/30 +Config SHA-256: 0d888e7793bd979d212b613542070ce9349a625ddace2a0727776072b66c96ae +``` + +На чистом first apply успешно прошли `check`, генерация конфигурации, первый +`sync` и активация runtime. `sing-box.service` и +`vpn-egress-guard.service` были active, `tun-sb0` поднят, DNS и HTTPS через +Hysteria outbound работали. Повторный `sync` завершился no-op с +`changed=false`, без config/source drift и без изменения SHA-256. + +Независимый клиент `10.30.0.20/24` за `br_vpn` получил DNS и HTTPS через +следующую цепочку: + +```text +10.30.0.20 +→ br_vpn +→ vpn-egress-gw / eth1 +→ tun-sb0 +→ sing-box 1.14.0 +→ Hysteria2 / Gecko +→ se.api.withen.pro:2053 +→ Internet +``` + +Внешний IPv4 gateway и клиента совпал с публичным IPv4 HY2XS-хоста. + +Fail-closed / anti-leak проверка также прошла: после остановки sing-box сервис +стал inactive, guard остался active, прямой Internet access клиента отсутствовал +(`curl` завершился с `rc=7`), обход через обычный WAN/`eth0` не появился. После +возврата sing-box доступ восстановился через тот же HY2XS endpoint. + +Состояния `last_good_available=false` и `last_good_valid=false` после чистого +first apply ожидаемы: предыдущей managed-good generation для rollback ещё не +существовало, а последующий idempotent sync был no-op. + +После проверки временные namespace/veth, диагностический бинарник Hysteria, +временные configs, logs и pcap-файлы удалены. Production URI, config и runtime +state сохранены. + +## 9. Граница вывода по предыдущим endpoint failures + +Ранее неуспешные E2E-прогоны через UFO endpoint не доказали дефект +`vpn-egressctl 0.2.0`, renderer или sing-box 1.14.0. Контрольная приёмка на +текущем endpoint прошла без изменения основного client/gateway stack: +официальный Hysteria client E2E, first apply, gateway HTTPS, idempotent sync, +клиент за `br_vpn` и fail-closed / anti-leak дали `PASS`. + +Это позволяет относить прежнее наблюдение к конкретному endpoint/environment +path либо к фактору вне доказанного runtime-контракта. Точная первопричина UFO +endpoint в рамках этой приёмки не установлена; приписывать эпизод как +подтверждённый дефект HY2XS, `vpn-egressctl`, renderer или sing-box нельзя. + +## 10. Итог + +```text +BUILD ACCEPTED +PUBLISHED ARTIFACT ACCEPTED +CLEAN INSTALL ACCEPTED +POST-REBOOT ACCEPTED +ADMIN/UI ACCEPTED +PEER MANAGEMENT ACCEPTED +DIAGNOSTICS ACCEPTED +OFFICIAL CLIENT E2E ACCEPTED +DOWNSTREAM GATEWAY E2E ACCEPTED +ANTI-LEAK ACCEPTED + +RUNTIME STATUS ACCEPTED +RELEASE STATUS READY FOR 1.0.0 +``` + +HY2XS 1.0.0-rc5 прошёл production build acceptance, проверку неизменности +артефакта, чистую установку, install smoke, runtime Admin/UI, управление пирами, +firewall acceptance, reboot persistence, diagnostics security и реальный E2E +официальным клиентом Hysteria. + +**Финальный статус: `PASS / PRODUCTION E2E VALIDATED`.** + +## 11. Требование к stable promotion + +Stable `1.0.0` должен продвигать без пересборки ровно тот immutable artifact, +который прошёл этот прогон: + +```text +Tag: 1.0.0 +Source commit: b7e478f0143846633d1261ca0bcd220736d28f44 +Artifact: hy2xs-install-1.0.0.tar.gz +SHA-256: d35cf469d8e1e3b5c1e79cb94329c1b19d1afbd7ade771498d2fb8caf5cd746a +Size: 50 785 975 bytes +``` + +Документационный коммит, добавляющий настоящий отчёт в `main`, намеренно идёт +после source commit кандидата и не меняет release identity. Тег `1.0.0` должен +указывать на source commit выше, а не на последующий docs-only commit. diff --git a/docs/acceptance/README.md b/docs/acceptance/README.md index 06928a3..7176ff0 100644 --- a/docs/acceptance/README.md +++ b/docs/acceptance/README.md @@ -27,6 +27,7 @@ | 2026-09-01 | `1.0.0-rc1` | `a1f0db22` | build + host acceptance, Debian 13 | [RC ACCEPTED WITH RELEASE-REQUIRED UX FIXES](2026-09-01-v1.0.0-rc1-host-acceptance.md) | | 2026-09-04 | `1.0.0-rc2` | `82e5ca40` | clean install + runtime, Debian 13 | [RUNTIME REJECTED — вход в панель недоступен](2026-09-04-v1.0.0-rc2-runtime-findings.md) | | 2026-09-07 | `1.0.0-rc3` | `bf10810c` | clean install + failure rollback, Debian 13 | [RUNTIME REJECTED — installer smoke блокируется middleware](2026-09-07-v1.0.0-rc3-runtime-findings.md) | +| 2026-09-15 | `1.0.0-rc5` | `b7e478f0` | build + clean install + production E2E, Debian 13 | [PASS / PRODUCTION E2E VALIDATED — READY FOR 1.0.0](2026-09-15-v1.0.0-rc5-final-acceptance.md) | ## Открытые дефекты приёмки @@ -36,6 +37,9 @@ | 2026-09-04, `1.0.0-rc2` | [LOGIN-01…LOGIN-08](2026-09-04-v1.0.0-rc2-runtime-findings.md) — все закрыты | | 2026-09-07, `1.0.0-rc3` | [RC3-LOGIN-01…04, RC3-ROLLBACK-01](2026-09-07-v1.0.0-rc3-runtime-findings.md) — исправления подготовлены для RC4 | +Итоговая приёмка RC5 не выявила открытых release blockers; исправления +предыдущих кандидатов подтверждены фактическим runtime-прогоном и внешним E2E. + ## Разборы кода между прогонами Отдельно от отчётов о прогонах: дефекты, найденные чтением дерева и сверкой с