docs: описать транзакционный guard и взаимное исключение операций

- docs/07: полный порядок staged apply, инвариант снятия guard, объяснение
  почему окно 45 секунд не обязано покрывать smoke и почему guard не трогает
  nftables.service, семантическая проверка эффективного firewall;
- docs/11: разделы A5e/A5f для новых unit-тестов и серверные сценарии D1e
  (guard доходит до дедлайна), D1f (конкурентные операции), D1g (успешная
  операция не оставляет следов транзакции); матрица и acceptance criteria
  дополнены;
- docs/12: разбор отказов "уже выполняется другая операция" и
  firewall_guard_fired;
- docs/13: строки журнала guard в таблице recovery, новый раздел 8a про замок
  операций;
- docs/14 и purge-v0.sh: очистка /run/hy2xs, замка операций и candidate-файлов
  firewall — /run это tmpfs, но очистка не имеет права требовать перезагрузки;
- README: защита от потери доступа при смене firewall и раздел "Одна операция
  за раз";
- CHANGELOG: шестой проход.
This commit is contained in:
2026-08-31 01:31:15 +05:00
parent 50ec4d9717
commit 39139e95f7
8 changed files with 532 additions and 11 deletions
+17 -2
View File
@@ -152,9 +152,17 @@ sudo ./purge-v0.sh --apply --yes-i-know
`/var/lib/hysteria` (там остаётся ACME-состояние и сертификаты Hysteria),
`/usr/local/lib/hy2xs` и symlink `/usr/local/bin/hy2xs-orchestrator`;
5. удаляет `/usr/local/bin/hysteria`;
6. удаляет фрагмент `/etc/nftables.d/hy2xs.nft` и строку `include` для него из
6. удаляет артефакты незавершённой операции в `/run`: каталог отката
`/run/hy2xs` (прежние `nftables.conf`, `hy2xs.nft` и маркер срабатывания
guard) и замок операций `/run/lock/hy2xs-orchestrator.lock`, который может
пережить убитый `kill -9` процесс оркестратора и не дать запуститься
следующей установке. `/run` — tmpfs, и перезагрузка убрала бы оба, но
очистка не имеет права требовать перезагрузки;
7. удаляет `*.candidate` firewall — они остаются, если операция упала между
`nft -c` и подстановкой файла в production-путь;
8. удаляет фрагмент `/etc/nftables.d/hy2xs.nft` и строку `include` для него из
`/etc/nftables.conf`, после чего перезагружает ruleset;
7. проверяет чистоту хоста.
9. проверяет чистоту хоста.
Список удаляемых путей и список legacy-маркеров clean-host контракта описывают
одну и ту же границу: расхождение между ними ловится приёмкой сборки. Иначе
@@ -194,6 +202,13 @@ sudo rm -rf /etc/hy2xs /etc/hysteria /var/lib/hy2xs /var/lib/hy2xs-admin \
/usr/local/lib/hy2xs /usr/local/h-ui
sudo rm -f /usr/local/bin/hysteria /usr/local/bin/hy2xs-orchestrator
# артефакты незавершённой операции в /run (tmpfs)
sudo rm -rf /run/hy2xs
sudo rm -f /run/lock/hy2xs-orchestrator.lock
# candidate-файлы firewall от операции, упавшей до подстановки
sudo rm -f /etc/nftables.conf.candidate /etc/nftables.d/hy2xs.nft.candidate
sudo rm -f /etc/nftables.d/hy2xs.nft
sudo sed -i '/nftables.d\/hy2xs.nft/d' /etc/nftables.conf
sudo nft -c -f /etc/nftables.conf && sudo nft -f /etc/nftables.conf