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

339 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 заменены на `<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:
```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.