62 lines
4.6 KiB
Markdown
62 lines
4.6 KiB
Markdown
# 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.
|