furtka/furtka
Daniel Maksymilian Syrnicki 9f9e627678 fix(install,catalog): recover from interrupted installs, don't strand sync on network/disk errors
- an unfinished install-state.json whose runner is gone (free lock, >60 s
  old — reboot, OOM kill, runner never started) is marked 'error' instead
  of blocking every later install with 409 until someone fixes it over SSH
- read_state in install_runner/updater tolerates unreadable and non-object
  files
- Forgejo API + release downloads wrap OSError and HTTPException (socket
  timeouts, resets, disk full) — the update/catalog check endpoints used to
  drop the connection on a flaky network
- catalog sync records any failure as the 'error' stage, not just
  CatalogError

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wq1hzUp4ZmCKHDuLKCnu73
2026-09-28 13:15:10 +02:00
..
__init__.py feat(furtka): resource-manager skeleton — manifest, scanner, CLI 2026-04-15 09:59:41 +02:00
_release_common.py fix(install,catalog): recover from interrupted installs, don't strand sync on network/disk errors 2026-09-28 13:15:10 +02:00
api.py fix(install,catalog): recover from interrupted installs, don't strand sync on network/disk errors 2026-09-28 13:15:10 +02:00
auth.py fix(updater,auth): atomic symlink flip, roll back on any failure, fail closed on a damaged users.json 2026-09-28 13:11:42 +02:00
catalog.py fix(install,catalog): recover from interrupted installs, don't strand sync on network/disk errors 2026-09-28 13:15:10 +02:00
cli.py fix(cli): fire on_install hooks on named CLI installs 2026-06-28 13:03:33 +02:00
deps.py chore: ruff format 2026-05-11 20:10:04 +02:00
dockerops.py chore: ruff format 2026-05-11 20:10:04 +02:00
https.py fix(https): make HTTPS opt-in to stop the BAD_SIGNATURE trap on fresh installs 2026-04-21 19:30:04 +02:00
install_runner.py fix(install,catalog): recover from interrupted installs, don't strand sync on network/disk errors 2026-09-28 13:15:10 +02:00
installer.py fix(api): refuse path-like app names, validate settings before writing .env, harden the HTTP server 2026-09-28 13:04:09 +02:00
manifest.py fix(api): refuse path-like app names, validate settings before writing .env, harden the HTTP server 2026-09-28 13:04:09 +02:00
passwd.py fix: unbreak upgrade path + install-lock race 2026-04-21 17:03:28 +02:00
paths.py fix: auth-guard / and /settings, add Logout link to static navs 2026-04-21 18:16:42 +02:00
reconciler.py fix(deps): give on_start hooks the consumer's stored credentials 2026-05-28 23:45:42 +02:00
scanner.py fix(furtka): audit follow-ups — placeholder secrets, isolate reconcile, .env perms 2026-04-15 10:17:00 +02:00
sources.py feat(catalog): on-box apps catalog synced independently of core version 2026-04-20 14:16:02 +02:00
updater.py fix(updater,auth): atomic symlink flip, roll back on any failure, fail closed on a damaged users.json 2026-09-28 13:11:42 +02:00