# Изменения HY2XS Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/). Проект использует [семантическое версионирование](https://semver.org/lang/ru/). Версия относится к самому HY2XS, а не к Hysteria: версия Hysteria выбирается на этапе сборки пакета и фиксируется в его metadata. ## [Unreleased] ## [1.0.0] — 2026-08-27 Первый релиз линейки `v1`. > **Обновление с `0.x` не поддерживается.** > Между `0.x` и `1.0.0` изменились схема конфигурации, тип обфускации > по умолчанию и контракт выбора версии Hysteria. Сервер, установленный > из пакета `0.x`, нужно поднимать заново: очистка и установка с нуля. > Подробности — в разделе «Миграция с 0.x» ниже. ### Добавлено - **Разрешение версии Hysteria на этапе сборки.** Builder по умолчанию сам определяет последний стабильный upstream-релиз, скачивает артефакт, вычисляет SHA-256 и замораживает `version` + `url` + `sha256` в metadata пакета. Target-сервер по-прежнему скачивает конкретный неизменяемый артефакт и никогда не обращается к moving `latest`. - **Compatibility gate в сборке.** До создания release-пакета builder рендерит канонический конфиг HY2XS тем же кодом, что и оркестратор, и запускает с ним реальный бинарник Hysteria — для обоих профилей обфускации. Несовместимый upstream ломает сборку, а не сервер оператора. - **Поддержка Gecko-обфускации** (Hysteria 2.9.2+) со сквозной интеграцией: оркестратор, шаблон конфига, модель админки, генерация `hysteria2://` URI, типы и формы фронтенда. - **Версия схемы конфигурации** `HY2XS_CONFIG_SCHEMA_VERSION=2`. Пакет отказывается работать с конфигурацией неизвестной схемы вместо того, чтобы молча применить чужие значения. - **Современный серверный baseline** в генерируемом конфиге: `congestion.type: bbr` + `bbrProfile: standard`, `bandwidth.disableLossCompensation: false`, `quic.disableStatelessReset: false`, а также `maxIdleTimeout`, `maxIncomingStreams`, `disablePathMTUDiscovery`. - **Модель современной схемы Hysteria в админке**: `obfs.gecko`, `ech`, `congestion`, `mimic`, `realm`, `tls.clientCA`, `quic.disableStatelessReset`, `bandwidth.disableLossCompensation`, `masquerade.proxy.xForwarded`. Поля читаются и отображаются, даже если HY2XS не включает их в default-профиль. - **Тесты оркестратора** (`bun test`): разбор env, рендер конфига, семантические инварианты профиля, резолвер upstream-релизов, release rollover. - **E2E-проверка с реальным клиентом Hysteria** — `tools/test/e2e-hysteria.sh`: TLS и obfs handshake, HTTP auth (допуск и отказ), TCP и UDP forwarding, trafficStats, per-peer accounting, переподключение после перезапуска сервера и подключение клиента именно по сгенерированной ссылке. - **`CHANGELOG.md`** в корне репозитория. ### Изменено - **Обфускация по умолчанию для новых установок — Gecko.** Salamander остаётся полностью поддержанным режимом совместимости и выбирается через `HY2XS_HYSTERIA_OBFS_TYPE=salamander`. - **Gecko использует upstream-defaults `512/1200`** и не выносит размеры пакетов в env: официальная URI-схема не умеет их передавать, поэтому нестандартные значения сделали бы клиентскую ссылку неполной. - **Тип обфускации больше не собирается внутри статического YAML.** Оркестратор формирует проверенный `obfs`-блок целиком, поэтому комбинация вида `type: gecko` рядом с блоком `salamander` структурно невозможна. - **Экспорт конфига Hysteria работает от исходного YAML**, а не от типизированной модели: поля, о которых HY2XS ещё не знает, переживают выгрузку. - **Smoke-проверки разбирают YAML** и сверяют его с production-профилем, вместо поиска подстрок. - **Канонический upstream-репозиторий** — `HyNetworks/hysteria` (вместо устаревших ссылок на `apernet`). - **Реестр ACME DNS-провайдеров во фронтенде** приведён к актуальному upstream: добавлены `namecheap`, `njalla`, `porkbun`. - **Дефолты формы Hysteria во фронтенде** отражают baseline HY2XS (50/50 Mbps, Let's Encrypt, каталог ACME), а не пример из upstream-доки. - Сборка запускает тесты оркестратора и админки до упаковки. ### Исправлено - **`hysteria2://` для Gecko.** Генератор ссылок был завязан на `Obfs.Salamander.Password`, поэтому при любой другой обфускации выдавал формально корректную, но неработающую ссылку без параметров `obfs`. - **SNI в клиентской ссылке при файловых сертификатах.** SNI брался только из ACME-блока, поэтому при `HY2XS_TLS_MODE=file` уходил пустым. Теперь источник — ACME-домен, затем `HY2XS_DOMAIN`, затем `HY2XS_PUBLIC_HOST`; IP-адрес в качестве SNI не используется. - **Утечка секретов в экспорте конфига.** Выгружаемый оператору YAML содержал `trafficStats.secret`, `access_token` в auth-URL и пароль обфускации. Секреты вырезаются, включая поля, о которых HY2XS ещё не знает. - **Расхождение runtime-конфига с разобранным.** `renderRuntimeEnv` печатал тип обфускации и режим auth литералами, игнорируя фактическую конфигурацию, — из-за чего запись `/etc/hy2xs/hy2xs.env` могла разойтись с тем, что реально применено. - **Смешение веток `obfs` в UI.** Форма склеивала дефолт с ответом API и показывала блок обфускации, которого нет в конфиге сервера. - **`namedotcom` в списке ACME DNS-провайдеров.** Провайдер удалён из Hysteria в 2.11.0; конфигурация с ним больше не запускается. - **Отсутствие подсказок в форме создания пира.** У полей «Пир», «Комментарий» и «Секрет» не было ни примеров, ни пояснений: оператор не мог понять без документации, что секрет необязателен и генерируется автоматически. ### Безопасность - Переход на Hysteria 2.12.2 закрывает исправления, вышедшие после 2.8.2, включая обход UDP ACL, возможный OOM через sniff и обход ACL через домены с завершающей точкой (2.9.2). - Экспорт конфига больше не выносит секреты за пределы сервера. ### Миграция с 0.x Автоматическая миграция не предусмотрена и не планируется. Порядок перехода: 1. Выпишите с работающего сервера список пиров и их секреты. 2. Разверните `1.0.0` на чистом Debian 13 из release-пакета. 3. Заведите пиров заново и раздайте новые клиентские ссылки. Клиентские ссылки `0.x` в любом случае перестанут работать: смена обфускации — это изменение wire-совместимости. [Unreleased]: https://git.flamy.studio/prod/HY2XS_flamy/compare/v1.0.0...HEAD [1.0.0]: https://git.flamy.studio/prod/HY2XS_flamy/releases/tag/v1.0.0