fix(v1): сделать отзыв доступа, бэкап и диагностику соответствующими своим именам
Проход по операциям, которые делают не то, что обещает их имя. P0. Удаление bootstrap-admin-peer не было отзывом доступа. Признаком «создавать пир или нет» служило наличие строки в таблице, а HY2XS_ADMIN_CON_PASS продолжает жить в /etc/hy2xs/hy2xs.env — его читает systemd-юнит. Оператор удалял пира, доступ исчезал, и ближайший restart возвращал того же пира с тем же секретом. Молча. Признаком стала отметка BOOTSTRAP_PEER_SEEDED в таблице config: «создавался когда-либо», а не «существует сейчас». Отметка и пир пишутся одной транзакцией. P1. Резервная копия с includeSecrets=true проглатывала и ошибку расшифровки, и отсутствие шифртекста, отдавая пира с пустым secret и успешный ответ. Теперь недоступный секрет любого пира отклоняет весь запрос с указанием имени. P1. DecryptPeerSecret возвращала содержимое колонки как расшифрованный секрет, если оно не начиналось с v1: — остаток поколения с открытыми секретами. P1. doctor перезапускал hysteria-server и hy2xs-admin: диагностика подозрения на проблему обрывала все живые соединения. P1. Админка сама генерировала HYSTERIA2_TRAFFIC_STATS_SECRET, записать который в /etc/hysteria/config.yaml она не может. Сервис объявлял себя здоровым, а machine auth переставал совпадать. P1. Обходы проверки зависимостей (accepted-risk/skipped) не могли произвести артефакт: приёмка требует dependency_security_gate=true. Удалены из сборки и документации, отсутствие проверяется приёмкой. P2. UPDATE по отсутствующей строке config считался успехом, и cron перепланировался при несохранённом значении. Решение по RowsAffected. P2. Слой данных не отличал «записи нет» от «база не ответила»: sentinel-значения ErrPeerNotFound / ErrAdminUserNotFound / ErrConfigNotFound / ErrStorage. P2. Удалены алиасы /:id/client-url и /:id/qr. Контракт разработки: apps/go.mod объявляет toolchain go1.26.7 (директива go — языковой baseline, а не выбор компилятора), tools/dev/doctor.sh|.ps1 сверяют среду с versions.env.
This commit is contained in:
@@ -701,7 +701,7 @@ hy2xs-orchestrator reconfigure \
|
||||
| --- | --- |
|
||||
| `hy2xs-orchestrator preflight-install` | Read‑only проверка чистоты хоста; ничего не меняет |
|
||||
| `hy2xs-orchestrator status` | Показать состояние платформы, сервисов, firewall и install marker |
|
||||
| `hy2xs-orchestrator doctor` | Выполнить preflight и smoke‑checks текущей установки |
|
||||
| `hy2xs-orchestrator doctor` | Выполнить preflight и smoke‑checks текущей установки; сервисы **не перезапускает** |
|
||||
| `hy2xs-orchestrator reconfigure --dry-run` | Проверить конфиг без применения |
|
||||
| `hy2xs-orchestrator reconfigure --apply` | Применить runtime‑конфигурацию |
|
||||
| `hy2xs-orchestrator repair --allow-partial-state` | Довести до конца незавершённую установку **текущего поколения** |
|
||||
@@ -872,6 +872,43 @@ hy2xs-orchestrator redact-config \
|
||||
|
||||
Обычному пользователю не нужно собирать проект из исходников. Этот раздел нужен maintainer’у, который готовит release‑архив.
|
||||
|
||||
### Перед работой: сверьте среду с контрактом
|
||||
|
||||
```bash
|
||||
./tools/dev/doctor.sh # Linux/macOS
|
||||
.\tools\dev\doctor.ps1 # Windows (PowerShell 7+)
|
||||
```
|
||||
|
||||
```text
|
||||
HY2XS development environment
|
||||
contract: versions.env (HY2XS 1.0.0, release line 1)
|
||||
|
||||
Go:
|
||||
required: 1.26.7
|
||||
found: 1.25.6
|
||||
FAIL — локальный Go собирает не ту stdlib, что уедет в релиз; поставьте 1.26.7
|
||||
|
||||
Node:
|
||||
required: 24.20.0
|
||||
found: 24.20.0
|
||||
OK
|
||||
```
|
||||
|
||||
Скрипт ничего не устанавливает и не меняет — он отвечает на один вопрос:
|
||||
совпадает ли эта машина с контрактом сборки.
|
||||
|
||||
Раньше `versions.env` был контрактом только для сборки: она скачивает Go, Node и
|
||||
Bun ровно тех версий, что там записаны, сверяя контрольные суммы, а машина
|
||||
разработчика не проверялась никак. Расхождение обнаруживалось на Debian, внутри
|
||||
release‑сборки, и выглядело как «у меня работало».
|
||||
|
||||
Расхождение не гипотетическое. Директива `go` в `apps/go.mod` — это языковой
|
||||
baseline модуля, а не выбор компилятора, поэтому локальный Go другой минорной
|
||||
линии собирал проект успешно, пока релизный бинарь компилировался на 1.26.7 и
|
||||
наследовал **её** stdlib: проверялся не тот код, который уезжает в production.
|
||||
Поэтому `go.mod` теперь объявляет `toolchain` явно, а `doctor` показывает
|
||||
расхождение до сборки, а не после.
|
||||
|
||||
Сборка поддерживается на Debian 13 amd64 из чистого git work tree.
|
||||
|
||||
```bash
|
||||
@@ -935,12 +972,21 @@ export GITHUB_TOKEN=<token>
|
||||
| `HYSTERIA_VERIFY_UPSTREAM_HASHES` | `true` | Сверять артефакт с upstream `hashes.txt`; отключение — только break‑glass |
|
||||
| `HYSTERIA_WRITE_LOCK` | `false` | Записать разрешённые значения обратно в lock‑файл |
|
||||
|
||||
Переменные проверки зависимостей:
|
||||
Проверка зависимостей переменными не управляется: у неё **нет аварийного
|
||||
выхода**. Релизный артефакт HY2XS невозможно собрать с непройденным гейтом, и
|
||||
поле `dependency_security_gate` в `metadata/package.env` принимает единственное
|
||||
значение `true`.
|
||||
|
||||
| Переменная | По умолчанию | Назначение |
|
||||
| --- | --- | --- |
|
||||
| `ALLOW_VULNERABLE_DEPENDENCIES` | `false` | Выпустить релиз, зная о найденной уязвимости. Решение человека, а не поведение по умолчанию; попадает в metadata как `dependency_security_gate=accepted-risk` |
|
||||
| `SKIP_SECURITY_SCAN` | `false` | Полностью пропустить шаг; в metadata пишется `skipped` |
|
||||
Раньше здесь были описаны два способа выпустить релиз, зная об уязвимости. Ими
|
||||
они не являлись: финальная приёмка архива требует буквально
|
||||
`dependency_security_gate=true`, поэтому сборка с любым из них проходила весь
|
||||
цикл и падала на последнем шаге. Документированная операция, которую продукт сам
|
||||
же запрещает, — хуже отсутствующей.
|
||||
|
||||
Если advisory вышло в неудачный момент, чинится это обновлением графа
|
||||
(`apps/go.sum`, `apps/frontend/pnpm-lock.yaml`) или версии toolchain в
|
||||
`versions.env`. Для локальной работы обходить нечего: `go test ./...`,
|
||||
`govulncheck ./...` и `pnpm audit` запускаются напрямую и tarball не создают.
|
||||
|
||||
Проверка versions‑контракта и проверка зависимостей отвечают на разные вопросы.
|
||||
Первая следит, что зафиксированные версии **согласованы между собой**; вторая —
|
||||
@@ -981,6 +1027,7 @@ tar -tzf dist/hy2xs-install-1.0.0.tar.gz | grep -E \
|
||||
├── orchestrator/ # install-only orchestrator на Bun + TypeScript
|
||||
├── package/ # skeleton будущего install package
|
||||
├── tools/build/ # production builder и packaging pipeline
|
||||
├── tools/dev/ # doctor: сверка среды разработки с versions.env
|
||||
├── tools/test/ # end-to-end проверки с реальным клиентом Hysteria
|
||||
├── tools/legacy/ # purge-v0.sh: очистка сервера от предыдущего поколения
|
||||
├── docs/ # спецификации baseline, тестов и эксплуатации
|
||||
|
||||
Reference in New Issue
Block a user