Skip to content

fix: actions survive client disconnect, rate-limit burst honored, delete errors shown, sync badge only with git sync - #124

Merged
vazra merged 6 commits into
mainfrom
fix/actions-ui-ratelimit
Oct 11, 2026
Merged

vazra merged 6 commits into
mainfrom
fix/actions-ui-ratelimit

Conversation

@vazra

@vazra vazra commented Oct 11, 2026

Copy link
Copy Markdown
Owner

Found by the E2E audit.

  • Stop/start/scale/rollback died when the browser tab closed. They ran docker compose under the request context, so navigating away mid-scale could leave e.g. 1 of 2 replicas. They now run detached (30 min cap), and their activity rows are still recorded.
  • simpledeploy.ratelimit.burst was parsed but ignored, while docs promised a short-spike allowance. Implemented: after requests are used up, up to burst more pass; the burst refills only after a whole window within the limit, so a client that keeps exceeding it stays at the steady rate. Apps without the label behave exactly as before (the server-level ratelimit block never reached the proxy). Label defaults in the docs corrected.
  • Deleting an app that failed to delete still navigated away as if it worked. The page now stays and shows the reason.
  • Restart dialog said "force-recreate" but restart is an in-place restart. Text now matches, in plain language.
  • Activity rows showed a "pending" git sync badge forever without git sync (and in pull-only mode). Rows are marked pending only while git sync pushes.
  • Git sync stopped after saving its settings: ReloadGitSync started the syncer with the request context, so its worker and poll loop ended once the response was sent. Fixed.

Docs: reference/api.md, rate-limiting.md, compose-labels.md, configuration.md, small-vps-tuning.md, architecture/proxy.md and auth.md, activity-log.md, security-audit.md.

Tests: disconnect survival (real deployer, blocking runner), burst and no-burst limiter, delete error vitests, sync-pending recorder, git sync reload outliving the request. All failing before. Full vitest and affected Go packages pass.

vazra added 6 commits October 11, 2026 02:13
…onnects

Run these compose operations under a context detached from the request
(context.WithoutCancel + 30 min timeout) so closing the tab no longer
kills docker compose mid-way. Audit rows use the same context.
The backend runs docker compose restart. Also correct the restart/pull
API docs (202 started) and note that sync actions survive disconnects.
confirmDelete navigated to the app list even when removeApp returned an
error. Show the reason inline and only navigate on success.
The label was parsed but ignored. Once a window's requests are used up,
up to burst more pass; the burst refills only after a whole window within
requests, so sustained traffic stays at the steady rate. burst 0 (label
unset) keeps the plain fixed window. Docs: correct label defaults and mark
config.yaml ratelimit.burst/by as ignored (management API only).
The recorder marked config changes pending even with git sync off, so
Activity showed a pending badge forever. Recorder.SetSyncTracking takes
api.Server.GitSyncPushing (kept in step with SetGitSync/ReloadGitSync);
rows are pending only while a syncer with auto-push runs.
ReloadGitSync started the new syncer with the request context, so its
worker and poll loop stopped as soon as the settings response was sent.
@vazra
vazra merged commit 946d8ba into main Oct 11, 2026
8 checks passed
@vazra
vazra deleted the fix/actions-ui-ratelimit branch October 11, 2026 09:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant