refactor: make provisioning own instance lifecycle operations
This commit is contained in:
@@ -44,6 +44,7 @@ status between refreshes. Failed refreshes keep the last snapshot visible.
|
||||
- `src/lib/server/fleet/` — file walking, push/beta engines
|
||||
- `src/lib/server/integrations/` — Komodo, RCON
|
||||
- `src/lib/server/pipeline/` — sweep loop, event bus, worker singleton
|
||||
- `src/lib/server/provisioning/` — lifecycle requests, queues, execution, recovery, and history
|
||||
- `src/routes/api/` — REST + SSE endpoints
|
||||
- `src/routes/` — UI pages (dashboard, campaigns, server deployments, betas, per-server)
|
||||
- `Dockerfile`, `docker-compose.yml`, `entrypoint.sh` — container build
|
||||
@@ -108,8 +109,11 @@ by default only **one server across the fleet** can restart or recover at a
|
||||
time. Promotions, rollbacks, drift reconciliation, and beta restarts share this
|
||||
limit. Set `DEPLOYMENT_RESTART_CONCURRENCY` to a positive integer to raise it.
|
||||
|
||||
A background sweep runs every 15s. It checks recovering servers first, then
|
||||
admits queued deployments in oldest-first order when there is capacity. Busy
|
||||
The Provisioning worker runs every 15s. Campaigns, betas, and maintenance submit
|
||||
durable restart requests and read their results. Provisioning checks recovering
|
||||
servers first, then admits queued operations when there is capacity. Requests
|
||||
normally run in submission order; on a shared server, beta activation precedes
|
||||
campaign activation, and maintenance waits for both. Busy
|
||||
or unreachable servers stay queued without taking a slot, so other empty
|
||||
servers can proceed. A successful Komodo restart request retains its slot
|
||||
until the container is healthy and RCON answers. Health checks start no sooner
|
||||
@@ -352,7 +356,7 @@ RCON parsing (fake UDP socket).
|
||||
|
||||
Campaigns (`/campaigns`) tracks script/config updates, drift reconciliation, restart progress, file diffs, and rollbacks. Existing campaign records are preserved in the original database tables. The campaign API lives at `/api/campaigns`; legacy detail API endpoints remain available for compatibility.
|
||||
|
||||
Provisioning (`/provisioning`, `/api/provisioning`) tracks Create, Start, Restart, Rebuild, Stop, and Destroy operations with live stages and persistent history, including failures, warnings, and interrupted operations. History starts with operations performed after this update and survives server removal. New creation requests return HTTP 202 with an operation ID and open the provisioning detail page. Creation is complete only when Komodo reports healthy, RCON responds successfully, and the RCON map exactly matches the selected map. Queued requests reserve their server name and port; queued creation and pending health checks survive application restarts. The detail page records startup progress and explains any health or map mismatch that is still blocking completion.
|
||||
Provisioning (`/provisioning`, `/api/provisioning`) owns Create, Start, Restart, Rebuild, Stop, and Destroy: request persistence, eligibility and occupancy checks, execution, recovery, and history. Campaigns, betas, and scheduled maintenance request lifecycle work through Provisioning and link to the resulting operation. They retain their file, test-evidence, and version-verification workflows. Pending automated restarts appear in Provisioning before execution. History survives server removal. New creation requests return HTTP 202 with an operation ID and open the provisioning detail page. Creation is complete only when Komodo reports healthy, RCON responds successfully, and the RCON map exactly matches the selected map. Queued requests reserve their server name and port; queued creation and pending health checks survive application restarts. The detail page records startup progress and explains any health or map mismatch that is still blocking completion.
|
||||
|
||||
Each server deployment opens a detail page with its flow and timestamped activity. Destroy uses an in-app confirmation modal and immediately returns a queued deployment (`DELETE /api/servers/:name` returns HTTP 202 with `deploymentId`). The worker waits for a fresh RCON player count of zero before teardown; occupied or unreachable servers remain queued and are checked each worker tick. Waiting requests survive application restarts, while interrupted teardown is marked for inspection. Completed destruction stays on the provisioning detail page.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user