Files
sencho/docs/features/fleet-actions.mdx
T
Anso 1f673073ca feat(fleet): add fleet-wide Docker prune to Fleet Actions (#1104)
Adds a third card to the Fleet Actions tab that fans out Docker prune
(images, volumes, networks) across every node in one submit. Local nodes
call DockerController under a bulk-prune lock; remote nodes receive one
POST /api/system/prune/system per target. Per-node + per-target results
with reclaimed bytes are surfaced inline via ResultsList.

Tier: Skipper / Admiral (requirePaid + requireAdmin), matching the rest
of Fleet Actions. The frontend card is mounted inside the existing
isPaid branch at FleetActionsTab; no new frontend gate is required.

The card uses an amber accent rail and the Eraser icon so it reads as
'cleanup' rather than 'destructive stop'. Scope toggle defaults to
Managed only (Sencho-tagged resources) with an All unused option that
escalates the destructive-confirm copy.
2026-05-19 00:13:32 -04:00

85 lines
5.4 KiB
Plaintext

---
title: Fleet Actions
description: Run fleet-wide bulk operations from one place — stop stacks across nodes by label, or apply labels to many stacks at once.
---
<Note>
Fleet Actions require a Sencho **Skipper** or **Admiral** license.
</Note>
The **Fleet Actions** tab inside Fleet centralizes bulk operations that span more than a single stack and would otherwise need many manual clicks. It lives next to **Deployments** and **Traffic** in the Fleet view, after the separator that follows Status.
Fleet Actions covers the operations that aren't already exposed elsewhere in Sencho:
- **Stop fleet by label** dispatches a stop to every stack labeled with a given name across every node in the fleet.
- **Bulk label assign** applies the same label set to many stacks on one node in a single round trip.
- **Prune Docker resources fleet-wide** reclaims disk space on every node by removing unused images, volumes, and networks in one submit.
Other bulk actions you may be looking for live in their natural homes:
| Goal | Where to do it |
|------|----------------|
| Restart, stop, or update a subset of stacks | **Bulk mode** in the stack sidebar (press `B` to enable, then check the stacks you want) |
| Schedule a recurring restart, update, or snapshot | **Schedules** in the primary navigation |
| Trigger a Sencho self-update on remote nodes | **Check Updates** button on the Fleet tab |
## Stop fleet by label
This card sends a stop to every stack on every node that has a label matching the name you type. Labels are matched **by name** across the fleet, so a label called `production` on one node and a separate label also called `production` on another node both match.
1. Open **Fleet > Fleet Actions**.
2. In the **Stop fleet by label** card, type a label name. The input suggests names that already exist on any node.
3. Click **Stop matching stacks**.
4. Confirm the destructive action. Sencho dispatches stops per node.
5. Results appear inline below the card, grouped by node, with per-stack success or failure rows.
A node that has no label by that name appears in the results with **no matching label** instead of an error.
## Bulk label assign
This card replaces the label set on many stacks at once on a single node.
1. Pick the node you want to update from the dropdown.
2. Check the stacks you want to update. **Select all** is available once stacks load.
3. Click each label pill to toggle it. The chosen pills become the new label set for every selected stack.
4. Click **Apply to N stacks** and confirm.
Selecting no labels and applying clears existing label assignments on the chosen stacks. The selected label set always **replaces** the existing one rather than appending to it.
## Prune Docker resources fleet-wide
This card reclaims disk space on every reachable node by running Docker prune across the targets you select. Each target runs serially on a node; nodes are processed in parallel.
1. Check the targets you want to prune: **Images**, **Volumes**, and **Networks**. At least one is required.
2. Pick a **Scope**:
- **Managed only** (default): removes only resources owned by stacks Sencho manages. Safe for shared Docker hosts.
- **All unused**: runs `docker prune --all` on every reachable node. Removes every unused image, volume, or network, including resources from workloads Sencho does not manage.
3. Click **Prune across fleet** and confirm. The confirmation copy escalates when **All unused** is selected.
4. Results appear inline below the card, grouped by node with one sub-row per target showing approximate bytes reclaimed.
Reclaimed-byte totals are best-effort. Docker does not report bytes for network removals, so the networks row always reports `0 B`.
## Permissions
Both cards require the **admin** role and a **Skipper** or **Admiral** license. Community-tier users see a calm explainer card in this tab instead of the action surface.
## Troubleshooting
**Nothing happens when I click "Stop matching stacks".**
Verify a label by that name exists on at least one node. The autocomplete suggestions are aggregated from every reachable node; if your label only exists on a node that is currently offline, it will not appear in the suggestions but the request still tries every node.
**A node shows "Label not present" but I know I created the label there.**
Labels are stored per node. The fleet stop matches by **name** only. If the label was renamed on one node, the new name is what gets matched. Check **Settings > Labels** on the affected node.
**Bulk label assign reports "Invalid stack name" for one row.**
Stack names must be alphanumeric with dashes and underscores. The endpoint validates each entry independently, so a single bad name does not block the rest of the batch.
**The Fleet Actions tab is missing from Fleet.**
Confirm the active license is **Skipper** or **Admiral** under **Settings > License**. The tab itself is always visible, but the action cards only render at paid tiers.
**A node row reports "unreachable" after a fleet prune.**
Sencho was unable to dispatch the prune to that remote node within the per-target timeout. Open the node detail and confirm it is online and that its API token is still valid. Sencho short-circuits later targets on the same node once one fails so a dead remote does not slow the whole operation.
**A target row shows `0 B` reclaimed.**
That target had nothing to prune at the time of the run. For networks this is also the expected reading on every successful run, because Docker does not report bytes for network removals.