4.6 KiB
Phase 6: healthcheck и диагностика startup
Phase 6 завершена: ожидание готовности проверяет pinned image healthcheck, Minecraft status query и стабильность контейнера; отказ возвращает non-zero и пути к сохранённым logs/report. Контракт — 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.