From 1e283daf13bc2b156b9c53bc5cf402fca1918355 Mon Sep 17 00:00:00 2001 From: Dorian Date: Tue, 31 Mar 2026 07:03:57 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20overhaul=20container=20lifecycle=20?= =?UTF-8?q?=E2=80=94=20recovery,=20health,=20uninstall,=20UI=20state?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Container recovery: - Health monitor: MAX_RESTART_ATTEMPTS 3→10, interval 60s→120s - Dependency-aware restarts: won't restart services before their deps - Reset dependent counters when a dependency recovers - Handle "created" state containers (were invisible to health monitor) - Added IndeedHub, mempool-api, mysql to tier system - Crash recovery: podman start timeout 30s→120s with retry - Podman client: socket timeout 5s→30s, added restart policy UI state representation: - Exit code 0 shows "stopped" (gray), not "crashed" (red) - Exit code 137 shows "killed (OOM)" - Non-zero exit shows "crashed" (red) - Added exit_code field to PackageDataEntry Install/uninstall fixes: - Install returns error when container doesn't start (was silent success) - Post-install hooks awaited instead of fire-and-forget tokio::spawn - Uninstall: graceful rm before force, volume prune, network cleanup - Uninstall returns error on partial failure (was 200 OK) Config consistency: - DB passwords read from /var/lib/archipelago/secrets/ (was hardcoded) - Bitcoin: added ZMQ ports 28332/28333 for LND block notifications - IndeedHub port 7777→8190 (was conflicting with strfry) - Marketplace versions: LND 0.17.4→0.18.4, Mempool 2.5.0→3.0.0 Performance: - Metrics collector interval 60s→300s (was duplicating health monitor) - Podman client: proper error propagation instead of unwrap_or_default Co-Authored-By: Claude Opus 4.6 (1M context) --- .claude/agents/code-reviewer.md | 47 ++ .claude/agents/deploy-specialist.md | 42 ++ .claude/memory/MEMORY.md | 3 + .claude/memory/feedback_asset_workflow.md | 16 + .claude/memory/feedback_deploy_patterns.md | 19 + .claude/memory/feedback_gamepad_unfinished.md | 12 + .claude/memory/feedback_logo_ascii.md | 19 + .claude/memory/project_app_registry.md | 19 + .claude/memory/project_cicd_setup.md | 20 + .../memory/project_container_orchestration.md | 20 + .claude/memory/project_gamepad_nav.md | 22 + .claude/memory/project_iso_size_reduction.md | 29 + .claude/memory/project_session_20260328.md | 42 ++ .claude/plans/mutable-roaming-pancake.md | 357 ++++++++++++ .claude/plans/rosy-floating-lightning.md | 174 ++++++ .claude/plans/smooth-roaming-wadler.md | 241 +++++++++ .claude/plans/toasty-inventing-cascade.md | 89 +++ .claude/plans/twinkly-baking-ladybug.md | 205 +++++++ .claude/rules/backend.md | 14 + .../skills/build-iso/references/branding.md | 80 +++ .claude/skills/podman/SKILL.md | 89 +++ .../podman/references/common-failures.md | 102 ++++ .claude/skills/podman/references/port-map.md | 71 +++ .../skills/podman/references/uid-mapping.md | 93 ++++ .claude/skills/polish/references/backend.md | 27 + .claude/skills/polish/references/deploy.md | 26 + .claude/skills/polish/references/errors.md | 23 + .claude/skills/polish/references/forms.md | 30 ++ .claude/skills/polish/references/loading.md | 26 + .claude/skills/polish/references/security.md | 22 + .claude/skills/polish/references/websocket.md | 25 + .../archipelago/src/api/rpc/package/config.rs | 27 +- .../src/api/rpc/package/install.rs | 189 ++++--- .../src/api/rpc/package/progress.rs | 1 + .../src/api/rpc/package/runtime.rs | 75 ++- .../src/container/docker_packages.rs | 1 + core/archipelago/src/crash_recovery.rs | 83 +-- core/archipelago/src/data_model.rs | 3 + core/archipelago/src/health_monitor.rs | 162 +++++- core/archipelago/src/monitoring/mod.rs | 11 +- core/container/src/podman_client.rs | 29 +- core/container/src/runtime.rs | 2 + docs/CONTAINER-ISSUES-REPORT.md | 508 ++++++++++++++++++ docs/GAMEPAD-NAV.md | 159 ++++++ docs/SEED-VERIFICATION.md | 443 +++++++++++++++ image-recipe/build-auto-installer-iso.sh | 25 +- loop/prompt.md | 30 +- neode-ui/docs/GAMEPAD-NAV-MAP.md | 202 +++++-- neode-ui/src/components/ToastStack.vue | 2 +- neode-ui/src/style.css | 14 +- neode-ui/src/types/api.ts | 1 + neode-ui/src/views/AppSession.vue | 116 ++-- neode-ui/src/views/Dashboard.vue | 5 +- neode-ui/src/views/Login.vue | 1 + neode-ui/src/views/Server.vue | 21 +- .../src/views/appDetails/AppHeroSection.vue | 12 +- .../src/views/appDetails/appDetailsData.ts | 20 +- .../src/views/appSession/AppSessionFrame.vue | 2 +- neode-ui/src/views/apps/AppCard.vue | 34 +- neode-ui/src/views/apps/appsConfig.ts | 15 +- neode-ui/src/views/apps/useAppsActions.ts | 6 +- .../views/dashboard/DashboardMobileNav.vue | 29 +- .../views/dashboard/HealthNotifications.vue | 3 +- .../src/views/marketplace/marketplaceData.ts | 6 +- scripts/first-boot-containers.sh | 7 +- 65 files changed, 3950 insertions(+), 298 deletions(-) create mode 100644 .claude/agents/code-reviewer.md create mode 100644 .claude/agents/deploy-specialist.md create mode 100644 .claude/memory/feedback_asset_workflow.md create mode 100644 .claude/memory/feedback_deploy_patterns.md create mode 100644 .claude/memory/feedback_gamepad_unfinished.md create mode 100644 .claude/memory/feedback_logo_ascii.md create mode 100644 .claude/memory/project_app_registry.md create mode 100644 .claude/memory/project_cicd_setup.md create mode 100644 .claude/memory/project_container_orchestration.md create mode 100644 .claude/memory/project_gamepad_nav.md create mode 100644 .claude/memory/project_iso_size_reduction.md create mode 100644 .claude/memory/project_session_20260328.md create mode 100644 .claude/plans/mutable-roaming-pancake.md create mode 100644 .claude/plans/rosy-floating-lightning.md create mode 100644 .claude/plans/smooth-roaming-wadler.md create mode 100644 .claude/plans/toasty-inventing-cascade.md create mode 100644 .claude/plans/twinkly-baking-ladybug.md create mode 100644 .claude/rules/backend.md create mode 100644 .claude/skills/build-iso/references/branding.md create mode 100644 .claude/skills/podman/SKILL.md create mode 100644 .claude/skills/podman/references/common-failures.md create mode 100644 .claude/skills/podman/references/port-map.md create mode 100644 .claude/skills/podman/references/uid-mapping.md create mode 100644 .claude/skills/polish/references/backend.md create mode 100644 .claude/skills/polish/references/deploy.md create mode 100644 .claude/skills/polish/references/errors.md create mode 100644 .claude/skills/polish/references/forms.md create mode 100644 .claude/skills/polish/references/loading.md create mode 100644 .claude/skills/polish/references/security.md create mode 100644 .claude/skills/polish/references/websocket.md create mode 100644 docs/CONTAINER-ISSUES-REPORT.md create mode 100644 docs/GAMEPAD-NAV.md create mode 100644 docs/SEED-VERIFICATION.md diff --git a/.claude/agents/code-reviewer.md b/.claude/agents/code-reviewer.md new file mode 100644 index 00000000..026cb8ef --- /dev/null +++ b/.claude/agents/code-reviewer.md @@ -0,0 +1,47 @@ +--- +name: code-reviewer +description: Reviews Archipelago code changes for quality — frontend patterns, Rust safety, container security, crypto rules, and project conventions. +tools: Read, Grep, Glob +model: sonnet +--- + +You are an Archipelago code reviewer. Check changes against project standards. + +## Frontend (neode-ui/) +- `