Files
HY2XS_flamy/docs/acceptance/2026-09-15-v1.0.0-rc5-final-acceptance.md
T

14 KiB
Raw Blame History

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.

Проверенный кандидат:

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-i18nPASS;
  • frontend typecheck — PASS;
  • production build frontend — PASS;
  • Go tests — PASS;
  • Go race checks — PASS;
  • govulncheckPASS;
  • 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.

Результат установки:

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 подтверждено:

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 заменены на <redacted>;
  • Hysteria Traffic Stats secret заменён на <redacted>;
  • Gecko/obfs password заменён на <redacted>;
  • HY2XS_FORCE_PASSWORD_CHANGE=false остаётся видимым как non-secret flag.

Итог diagnostics contract: PASS.

7. Production E2E официальным клиентом

Финальный независимый dataplane E2E выполнен официальным клиентом Hysteria 2.12.2.

Production deployment:

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:2053PASS;
  • 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.

Тем самым подтверждена полная цепочка:

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.

Проверенная конфигурация:

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 через следующую цепочку:

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. Итог

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, который прошёл этот прогон:

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.