3 Commits
Author SHA1 Message Date
Juan DenisandClaude Fable 5 c163d4357f feat(files): Stack quick link follows the real install dir
/system/version now returns install_dir (new get_install_dir() in the
shared version resolver: SERVERKIT_INSTALL_DIR override -> own tree ->
/opt/serverkit default; abspath not realpath so blue/green boxes report
the stable symlink). The File Manager re-points its 'Stack' quick-access
shortcut from the response, so custom-directory installs jump to the
real tree; the static default remains the fallback while loading or on
older backends. 2 new resolver tests + install_dir asserted in the
endpoint test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 22:19:14 -04:00
Juan DenisandClaude Fable 5 e797ec3a3f fix(system): version resolution honors custom install dirs and Docker
The About page's /system/version (and check-update's current-version
read) hardcoded /opt/serverkit first, duplicated in three places:

- app/utils/version.py is now the single resolver: explicit
  SERVERKIT_INSTALL_DIR override -> the running code's own tree ->
  /opt/serverkit last (a box moved to a custom dir may still have a
  stale tree there); system.py's two inline copies now call it
- the systemd unit template renders SERVERKIT_INSTALL_DIR from the
  installer's SERVERKIT_DIR (deliberately not the bare SERVERKIT_DIR
  env name, which app/paths.py already uses for the /var/serverkit
  data root); flows to existing installs via the updater's re-render
- crypto's .env discovery gains the same install-dir hint
- Docker image now ships VERSION (/app/VERSION) — containers showed
  the 1.0.0 fallback because no candidate path existed in the image
- 4 proving tests in backend/tests/test_panel_version.py

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 22:14:37 -04:00
Juan DenisandClaude Opus 4.8 6f5f2b1047 feat(extensions): Phase 2 backend — remote registry, checksum install, updates
- RegistryService: configurable SERVERKIT_REGISTRY_URL, TTL cache, offline
  fallback (last-good → bundled app/data/registry_index.json); read-only, never
  auto-installs. GET /api/v1/marketplace/registry + registry install endpoint.
- Checksum-verified install: install_from_url(expected_sha256) hard-fails on
  mismatch; force= path enables in-place updates.
- Update flow v1: check_for_updates() + GET /plugins/updates + POST
  /plugins/<id>/update; respects min/max_panel_version via new
  app/utils/version.py (get_panel_version + semver compare).
- serverkit-gui listed as the first registry entry (bundled index).
- Docs: EXTENSIONS_REGISTRY.md (index format + publisher/review guide).
- Tests: test_registry.py (fetch/cache, checksum, compat gate, update flow).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-01 21:41:50 -04:00