docs: clean-install-only, versions.env и очистка предыдущего поколения
Новый docs/14-legacy-cleanup.md: как выглядит отказ установщика, полный список маркеров чужой установки, что сохранить перед очисткой, работа purge-v0.sh, ручная процедура и отдельно - случай незавершённой установки текущего поколения, где нужен repair, а не очистка. Обновлено под фактическое поведение: - README и package/docs: установка описана как две фазы, PHASE 0 ничего не меняет; добавлен troubleshooting по отказу clean-host; версии toolchain больше не передаются через окружение; - 02-build-layer: раздел про versions.env (что в нём есть и чего нет и почему), verify_versions_contract, проверка происхождения артефакта по upstream hashes.txt; - 08-orchestrator-spec: двухфазный контракт, read-only guard, идентификация поколения в install-state, ownership-aware rollback, расширенная семантическая проверка конфига, структурная редакция; - 04-admin-panel: таблица удалённых маршрутов и почему они удалены, а не оставлены заглушками; сужена формулировка гарантии санитайза; - 11-testing: новые unit-наборы, полный список инвариантов конфига, раздел про одну реализацию URI вместо двух, сценарий проверки границы установки на живом сервере; - 12-operations и 13-runbook: диагностика отказов по поколению, поведение diagnostics-бандла; - tools/build/README: контракт версий, обе суммы Bun, hashes.txt. CHANGELOG: раздел Unreleased с разбором каждого исправленного дефекта.
This commit is contained in:
@@ -138,7 +138,12 @@ hy2xs-install/
|
||||
└── metadata/
|
||||
```
|
||||
|
||||
При запуске `install.sh` пакет проверяет `metadata/checksums.txt`, устанавливает orchestrator в `/usr/local/lib/hy2xs/hy2xs-orchestrator`, создаёт symlink `/usr/local/bin/hy2xs-orchestrator`, копирует package assets в `/usr/local/lib/hy2xs/package` и передаёт управление install‑only orchestrator.
|
||||
При запуске `install.sh` пакет сначала проверяет `metadata/checksums.txt` и
|
||||
выполняет read‑only clean‑host preflight **из распакованного архива**. Только
|
||||
после этого он устанавливает orchestrator в
|
||||
`/usr/local/lib/hy2xs/hy2xs-orchestrator`, создаёт symlink
|
||||
`/usr/local/bin/hy2xs-orchestrator`, копирует package assets в
|
||||
`/usr/local/lib/hy2xs/package` и передаёт управление install‑only orchestrator.
|
||||
|
||||
## Сетевая модель по умолчанию
|
||||
|
||||
@@ -169,13 +174,18 @@ HY2XS **не привязан к конкретному номеру верси
|
||||
build machine target server
|
||||
───────────── ─────────────
|
||||
определить последнюю стабильную ─┐
|
||||
скачать артефакт, посчитать SHA-256 │
|
||||
проверить, что бинарник принимает ├─► release‑пакет ──► скачать ровно
|
||||
канонический конфиг HY2XS │ version + url этот артефакт,
|
||||
заморозить version/url/sha256 ─┘ + sha256 сверить SHA-256
|
||||
и `hysteria version`
|
||||
взять ожидаемый SHA-256 из │
|
||||
upstream hashes.txt │
|
||||
скачать артефакт и сверить его ├─► release‑пакет ──► скачать ровно
|
||||
проверить, что бинарник принимает │ version + url этот артефакт,
|
||||
канонический конфиг HY2XS │ + sha256 сверить SHA-256
|
||||
заморозить version/url/sha256 ─┘ и `hysteria version`
|
||||
```
|
||||
|
||||
Контрольная сумма берётся из upstream‑ассета `hashes.txt`, а не считается
|
||||
только локально: локальный пересчёт подтверждает, что файл не изменился после
|
||||
скачивания, но не доказывает, что скачан именно ожидаемый upstream artifact.
|
||||
|
||||
Что это даёт:
|
||||
|
||||
- новая установка получает актуальную Hysteria без ручного обновления version lock;
|
||||
@@ -459,19 +469,33 @@ HY2XS_UI_PUBLIC_ACCESS=false
|
||||
./install.sh --config /root/hy2xs-target.env --non-interactive
|
||||
```
|
||||
|
||||
Во время установки HY2XS:
|
||||
Установка идёт в две фазы с жёсткой границей между ними.
|
||||
|
||||
1. проверит checksums release‑пакета;
|
||||
2. установит orchestrator в `/usr/local/lib/hy2xs`;
|
||||
3. создаст runtime‑каталоги и service users;
|
||||
4. запишет `/etc/hy2xs/hy2xs.env`;
|
||||
5. разложит bundled HY2XS admin;
|
||||
6. скачает закреплённый в пакете Hysteria2 binary из upstream, проверит SHA256 и фактическую версию;
|
||||
7. создаст `/etc/hysteria/config.yaml`;
|
||||
8. установит systemd‑юниты;
|
||||
9. применит nftables‑правила;
|
||||
10. выполнит smoke‑checks;
|
||||
11. зафиксирует успешное состояние в `/var/lib/hy2xs/install-state.json`.
|
||||
**PHASE 0 — только чтение.** До её успешного завершения на сервере не
|
||||
изменяется ни один файл, включая `/usr/local/lib/hy2xs`:
|
||||
|
||||
1. проверит, что запущено от root;
|
||||
2. проверит checksums release‑пакета;
|
||||
3. запустит clean‑host preflight **из распакованного архива**: платформа
|
||||
Debian 13 amd64, отсутствие предыдущей установки, валидность конфигурации.
|
||||
|
||||
**PHASE 1 — применение изменений:**
|
||||
|
||||
4. установит orchestrator в `/usr/local/lib/hy2xs` и разложит runtime‑пакет;
|
||||
5. создаст runtime‑каталоги и service users;
|
||||
6. запишет `/etc/hy2xs/hy2xs.env`;
|
||||
7. разложит bundled HY2XS admin;
|
||||
8. скачает закреплённый в пакете Hysteria2 binary из upstream, проверит SHA256 и фактическую версию;
|
||||
9. создаст `/etc/hysteria/config.yaml`;
|
||||
10. установит systemd‑юниты;
|
||||
11. применит nftables‑правила;
|
||||
12. выполнит smoke‑checks;
|
||||
13. зафиксирует успешное состояние в `/var/lib/hy2xs/install-state.json`.
|
||||
|
||||
Если PHASE 0 не прошла, установщик завершается с ошибкой и **сервер остаётся в
|
||||
том же состоянии, в котором был**. HY2XS v1 не устанавливается поверх
|
||||
предыдущего поколения и не мигрирует его состояние: очистка старой установки —
|
||||
отдельная явная операция, см. [docs/14-legacy-cleanup.md](docs/14-legacy-cleanup.md).
|
||||
|
||||
### 10. Получите bootstrap‑пароль админки
|
||||
|
||||
@@ -654,14 +678,21 @@ hy2xs-orchestrator reconfigure \
|
||||
|
||||
| Команда | Назначение |
|
||||
| --- | --- |
|
||||
| `hy2xs-orchestrator preflight-install` | Read‑only проверка чистоты хоста; ничего не меняет |
|
||||
| `hy2xs-orchestrator status` | Показать состояние платформы, сервисов, firewall и install marker |
|
||||
| `hy2xs-orchestrator doctor` | Выполнить preflight и smoke‑checks текущей установки |
|
||||
| `hy2xs-orchestrator reconfigure --dry-run` | Проверить конфиг без применения |
|
||||
| `hy2xs-orchestrator reconfigure --apply` | Применить runtime‑конфигурацию |
|
||||
| `hy2xs-orchestrator repair` | Попытаться восстановить partial install state |
|
||||
| `hy2xs-orchestrator repair --allow-partial-state` | Довести до конца незавершённую установку **текущего поколения** |
|
||||
| `hy2xs-orchestrator diagnostics collect` | Собрать diagnostic bundle в `/var/log/hy2xs/diagnostics` |
|
||||
| `hy2xs-orchestrator redact-config` | Отредактировать секреты в env/yaml перед публикацией логов |
|
||||
|
||||
`repair` без `--allow-partial-state` работает только поверх полностью успешной
|
||||
установки. В обоих режимах он сначала проверяет, что
|
||||
`/var/lib/hy2xs/install-state.json` принадлежит текущему поколению продукта
|
||||
(`product`, `release_line`, `config_schema_version`), и отказывается работать
|
||||
поверх чужого состояния.
|
||||
|
||||
Пример сбора диагностики:
|
||||
|
||||
```bash
|
||||
@@ -708,6 +739,35 @@ permitopen 127.0.0.1:8080 localhost:8080
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Установка отказывается: обнаружена предыдущая установка
|
||||
|
||||
```text
|
||||
[hy2xs] ERROR: На сервере обнаружена предыдущая или посторонняя установка.
|
||||
HY2XS v1 не поддерживает установку поверх и не мигрирует состояние 0.x.
|
||||
Ни один файл на сервере не изменён.
|
||||
```
|
||||
|
||||
Это ожидаемое поведение, а не сбой. Отказ происходит в PHASE 0, до любой
|
||||
мутации: сервер остался в том состоянии, в котором был.
|
||||
|
||||
Что делать:
|
||||
|
||||
1. сохраните нужные данные (база пиров, конфиг) — см.
|
||||
[docs/14-legacy-cleanup.md](docs/14-legacy-cleanup.md);
|
||||
2. посмотрите план очистки: `sudo ./purge-v0.sh`;
|
||||
3. выполните очистку: `sudo ./purge-v0.sh --apply --yes-i-know`;
|
||||
4. повторите установку.
|
||||
|
||||
Отдельный случай — отказ вида
|
||||
`HY2XS_CONFIG_SCHEMA_VERSION отсутствует в конфигурации`. Он означает, что
|
||||
переданный `--config` относится к предыдущему поколению: до v1 этого поля не
|
||||
существовало. Создайте конфиг заново по разделу «Создайте конфиг для своего
|
||||
сервера».
|
||||
|
||||
Если установка HY2XS v1 упала **после** начала применения изменений, полная
|
||||
очистка не нужна — используйте
|
||||
`hy2xs-orchestrator repair --allow-partial-state`.
|
||||
|
||||
### Установка падает на DNS AAAA
|
||||
|
||||
Причина: домен имеет IPv6 AAAA‑запись, а HY2XS production profile является IPv4‑only.
|
||||
@@ -787,23 +847,27 @@ git status --short
|
||||
|
||||
Подготовьте build env:
|
||||
|
||||
Версии и контрольные суммы toolchain **не задаются переменными окружения**: они
|
||||
объявлены в корневом [`versions.env`](versions.env), и сборка берёт их оттуда.
|
||||
Раньше их приходилось передавать снаружи, из-за чего воспроизводимая сборка в
|
||||
чистой Debian‑среде требовала предварительного знания четырёх SHA‑256.
|
||||
|
||||
```bash
|
||||
export PACKAGE_VERSION=1.0.0
|
||||
export BUILD_ID=prod-$(date -u +%Y%m%dT%H%M%SZ)
|
||||
|
||||
# Для переносимости между x86_64-серверами без AVX2 предпочтителен baseline artifact.
|
||||
# Ожидаемый digest выбирается автоматически: в versions.env зафиксированы обе суммы.
|
||||
export BUN_FLAVOR=x64-baseline
|
||||
|
||||
# Builder требует SHA256 для скачиваемых toolchain-архивов.
|
||||
# Значения нужно брать из официальных release/checksum источников для конкретных версий.
|
||||
export GO_ARCHIVE_SHA256=<sha256-go1.21.13-linux-amd64.tar.gz>
|
||||
export NODE_ARCHIVE_SHA256=<sha256-node-v20.19.0-linux-x64.tar.xz>
|
||||
export BUN_ARCHIVE_SHA256=<sha256-bun-linux-x64-baseline-1.3.13.zip>
|
||||
|
||||
# Опционально: снимает anonymous rate limit при разрешении upstream-релиза.
|
||||
export GITHUB_TOKEN=<token>
|
||||
```
|
||||
|
||||
`PACKAGE_VERSION` тоже приходит из `versions.env` (`HY2XS_VERSION`). Шаг
|
||||
`verify_versions_contract` роняет сборку, если версия продукта, схема
|
||||
конфигурации, целевая платформа или `packageManager` в `package.json`
|
||||
разошлись с контрактом.
|
||||
|
||||
Запустите сборку:
|
||||
|
||||
```bash
|
||||
@@ -812,25 +876,28 @@ export GITHUB_TOKEN=<token>
|
||||
|
||||
Сборка последовательно:
|
||||
|
||||
1. прогоняет тесты и типы оркестратора (`bun test`, `tsc --noEmit`);
|
||||
2. определяет последнюю стабильную версию Hysteria, скачивает артефакт и считает SHA‑256;
|
||||
3. проходит compatibility gate: реальный бинарник Hysteria должен принять канонический конфиг HY2XS для Gecko и для Salamander;
|
||||
4. собирает orchestrator, frontend и backend;
|
||||
5. прогоняет `go vet` и `go test` для HY2XS admin;
|
||||
6. формирует архив и прогоняет acceptance‑проверки.
|
||||
1. проверяет контракт `versions.env` (`verify_versions_contract`);
|
||||
2. прогоняет тесты и типы оркестратора (`bun test`, `tsc --noEmit`);
|
||||
3. определяет последнюю стабильную версию Hysteria, берёт ожидаемый SHA‑256 из upstream `hashes.txt` и сверяет с ним скачанный артефакт;
|
||||
4. проходит compatibility gate: реальный бинарник Hysteria должен принять канонический конфиг HY2XS для Gecko и для Salamander;
|
||||
5. собирает orchestrator, frontend и backend, проставляя версию админки из контракта;
|
||||
6. прогоняет `go vet` и `go test` для HY2XS admin;
|
||||
7. формирует архив и прогоняет acceptance‑проверки.
|
||||
|
||||
Любой сбой на шагах 1–5 останавливает сборку до создания пакета.
|
||||
Любой сбой на шагах 1–6 останавливает сборку до создания пакета.
|
||||
|
||||
Переменные, управляющие выбором версии Hysteria:
|
||||
|
||||
| Переменная | По умолчанию | Назначение |
|
||||
| --- | --- | --- |
|
||||
| `HYSTERIA_CHANNEL` | `stable` | `stable` — разрешить последнюю стабильную; `pinned` — офлайн‑сборка по `tools/build/hysteria-lock.env` |
|
||||
| `HYSTERIA_CHANNEL` | из `versions.env` (`stable`) | `stable` — разрешить последнюю стабильную; `pinned` — офлайн‑сборка по `tools/build/hysteria-lock.env` |
|
||||
| `HYSTERIA_VERSION_OVERRIDE` | пусто | Закрепить конкретную версию `vX.Y.Z` |
|
||||
| `HYSTERIA_COMPAT_GATE` | `true` | Compatibility gate; для release‑сборок обязателен |
|
||||
| `HYSTERIA_VERIFY_UPSTREAM_HASHES` | `true` | Сверять артефакт с upstream `hashes.txt`; отключение — только break‑glass |
|
||||
| `HYSTERIA_WRITE_LOCK` | `false` | Записать разрешённые значения обратно в lock‑файл |
|
||||
|
||||
Полный E2E с реальным клиентом Hysteria запускается отдельно:
|
||||
Полный E2E с реальным клиентом Hysteria запускается отдельно (нужен Go: ссылка
|
||||
берётся из production‑генератора, а не из отдельной реализации внутри теста):
|
||||
|
||||
```bash
|
||||
HYSTERIA_BIN=/usr/local/bin/hysteria ./tools/test/e2e-hysteria.sh
|
||||
@@ -863,7 +930,9 @@ tar -tzf dist/hy2xs-install-1.0.0.tar.gz | grep -E \
|
||||
├── package/ # skeleton будущего install package
|
||||
├── tools/build/ # production builder и packaging pipeline
|
||||
├── tools/test/ # end-to-end проверки с реальным клиентом Hysteria
|
||||
├── tools/legacy/ # purge-v0.sh: очистка сервера от предыдущего поколения
|
||||
├── docs/ # спецификации baseline, тестов и эксплуатации
|
||||
├── versions.env # контракт продукта, платформы и toolchain
|
||||
├── CHANGELOG.md
|
||||
├── README.md
|
||||
└── LICENSE
|
||||
|
||||
Reference in New Issue
Block a user