Files
minecraft-lab/docs/phase5-results.md
2026-10-04 00:30:09 +07:00

75 lines
5.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Phase 5: backups и восстановление
Phase 5 завершена для NeoForge 21.1.252 / Minecraft 1.21.1. Реализованы
`./mcpack backup`, `./mcpack restore` и обязательный gate `backupBeforeApply`
для будущего deployment. Контракт и проверенная инструкция: [backups.md](backups.md).
## Проверка с реальным Docker
Проверка 2026-10-03 выполнялась на отдельном root `.tools/phase4-server`,
project `minecraft-lab-phase4`, port 25566, full release 0.0.4. Основной
Phase 0 сервер на 25565 не останавливался и остался healthy.
- Запущенный сервер был корректно остановлен; backup всего runtime
опубликован после tar/zstd listing и пробной распаковки.
- Snapshot содержит runtime archive, metadata, полную копию release 0.0.4
и checksums всех файлов. Исключений нет.
- После backup сервер автоматически вернулся на исходный release в healthy;
`mc-health` подтвердил Minecraft 1.21.1.
- Затем намеренно подставлена команда tar с exit 42. Backup вернул non-zero,
оставил сервер остановленным, не создал дополнительный окончательный
snapshot и удалил временный staging. Metadata операции фиксирует failed.
- Старый тестовый контейнер удалён через down. Snapshot восстановлен в новый
`.tools/phase5-restored-server` без распаковки поверх существующего root.
- До запуска совпали все 416 inventory entries (160 файлов, включая 23 файла
world): пути, bytes/SHA256, mode, UID и GID. В наборе есть владельцы
1000:1000 и 0:0; обе группы сохранились.
- Подтверждены `mod-state/phase5.json` и unmanaged config вне world,
server.properties, ops.json, whitelist.json. Локальный host `.env` не
копировался: при запуске использован уже настроенный файл прежнего test root.
- Восстановленная копия запущена с собственным сохранённым `release/`:
NeoForge 21.1.252, Minecraft 1.21.1, статус healthy и успешный `mc-health`.
- После проверки восстановленный контейнер/network удалены через down.
Оба тестовых runtime и snapshot сохранены для дальнейших проверок.
Проверенный snapshot:
```text
.tools/phase4-server/backups/20261003T134409150Z-edd387d7-f947-4c3d-8ffc-bc02649cdfdc
archive bytes: 162695375
archive SHA256: e52c82adb379942ed2b63fb0cd361dd7d2cfd153314b26b026bafd942c87c9ce
release manifest SHA256: 5933ed34f35473026a32f0c3eab9a8b86b6fb484461bac2f670e0a74930aaa0c
```
Свидетельства: `.tools/phase5-evidence/backup.log`, `failed-backup.log`,
`failure-verification.txt`, `restore-verification.txt`, `resumed-health.txt`,
`restored-health.txt`, `restored-start.log`, `primary-server-status.txt`,
`integration.log`. Сценарий — `scripts/verify-phase5.sh`; он требует специально
подготовленного test root Phase 4 и ещё не существующего restore destination.
Его нельзя запускать как универсальную команду на primary сервере.
## Автоматические проверки
`npm test`: 37 tests pass. Backup/restore tests проверяют общий lifecycle lock,
stop/archive/verify/resume, stopped/absent state, разные snapshot ID,
восстановление bytes/modes/ownership и связанного release, запрет существующей
цели, повреждённый archive, неполное checksum coverage, ошибку tar/stop/resume,
unsupported links, проверку target до остановки и отказ применения до backup.
Gate test доказывает, что callback будущего apply не вызывается при ошибке
архива и вызывается только после verified snapshot под той же блокировкой.
При ошибке callback status учитывает текущее состояние контейнера и не
запускает старую сборку автоматически. SSH apply сам пока не реализован.
Build, mod commands и runtime regression tests также проходят. Node/Bash
syntax и `git diff --check` пройдены.
## Оставшиеся границы
Автоматическое удаление snapshot, off-host копии, retention, rollback и
переключение active release — последующие фазы. Пока runtime не поддерживает
links/special files в backup. Atomic publication защищает от обычной ошибки
процесса, но fsync для гарантии при отключении питания не реализован.
Primary старого spike wrapper не мигрирован на full-release binding.
Следующая Phase 6 — расширенная диагностика healthcheck, crash/restart-loop
и timeout с полезными logs.