first cycle lab release

This commit is contained in:
2026-10-04 00:30:09 +07:00
parent 85f6897365
commit d134daafd8
92 changed files with 5623 additions and 9 deletions
+61
View File
@@ -0,0 +1,61 @@
# Phase 6: healthcheck и диагностика startup
Phase 6 завершена: ожидание готовности проверяет pinned image healthcheck,
Minecraft status query и стабильность контейнера; отказ возвращает non-zero
и пути к сохранённым logs/report. Контракт — [health.md](health.md).
## Реальная Docker-проверка 2026-10-03
Исходный snapshot Phase 5 восстановлен в отдельный `.tools/phase6-server`.
Использован сохранённый полный NeoForge release 0.0.4, Minecraft 1.21.1,
NeoForge 21.1.252, pinned image, host UID/GID 1000:1000 и port 25566.
Project — свободный после Phase 5 `minecraft-lab-phase4`.
- `up --wait --wait-timeout 2 --stable-seconds 1` на холодном JVM старте
вернул timeout/non-zero через 2000 ms ожидания. Container оставлен для
диагностики; runtime/binding сохранились.
- `health --wait-timeout 120 --stable-seconds 3` затем вернул 0 после
Docker healthy и стабильных свежих Minecraft queries. TCP не использован
как достаточное свидетельство готовности.
- Только тестовый контейнер аварийно завершён `docker kill --signal KILL`.
Следующий health вернул crash/non-zero, report сохранил exit code 137
и OOMKilled=false; elapsed около 230 ms.
- Повторный `up --wait --wait-timeout 120 --stable-seconds 3` поднял тот же
NeoForge release и подтвердил готовность. Исходный модпак не заменялся.
- Для restart loop создан отдельный `.tools/phase6-loop-server` и намеренно
повреждённая Compose fixture: pinned image, entrypoint с exit 42 и
restart=on-failure:5. Это тестовая копия полного релиза с отдельной версией
`phase6-failure-fixture` в manifest и пересчитанными checksums;
опубликованный immutable release 0.0.4 не менялся. Fixture не доказывает
загрузку NeoForge: её назначение — реальный Docker restart loop.
- Docker inspect подтвердил RestartCount=1 до проверки. Health затем
вернул restart-loop/non-zero за около 1476 ms с RestartCount=2 и новым
StartedAt, сохранив logs с intentional failure marker.
- Для всех ошибок есть JSON report и файл последних logs, binding сохранился,
lifecycle lock освободилась, automatic rollback не выполнялся.
- Test containers/network удалены через down. Их runtime/release/diagnostics
оставлены для просмотра. Primary Phase 0 сервер на 25565 не останавливался,
не пересоздавался и остался healthy.
Сценарий: `scripts/verify-phase6.sh`. Он требует Phase 5 snapshot и новых
fixture roots, использует только копии test runtime. Свидетельства:
`.tools/phase6-evidence/{integration.log,timeout.txt,healthy.txt,healthy-start.log,
crash.txt,recovered.txt,restart-loop.txt,loop-docker-state.txt,assertions.txt,
primary-server-status.txt}`. Подробные reports/logs находятся в diagnostics
соответствующих test roots.
## Автоматические проверки
`npm test`: 46 тестов. Deterministic health tests проверяют успешные
последовательные queries, провал протокола при running/healthy state,
starting/unhealthy, сброс окна после transient failure, crash/OOM/paused,
RestartCount/StartedAt/container identity, missing container/healthcheck,
inspection error, deadlines включая launch и слишком поздний query, строгие
флаги и диагностику Compose failure с сохранением binding/lock cleanup.
Regression tests Phase 2–5 проходят; backup resume теперь действительно
ожидает стабильную готовность. Bash/Node syntax и `git diff --check` пройдены.
SSH transport, switching active-release, automatic recovery/rollback и
continuous watchdog не добавляются в эту фазу. Следующая Phase 7 — SSH deployment
с уже готовыми backup gate и healthcheck.