Complete Track F optional Docker/Portainer ops items
CI / test (push) Successful in 10m2s

Implement volume browse, stack env file, service scale, create
secret/config, disconnect network, registry Hub search, server
schedules, resource editor, and fleet environment tags. Mark roadmap
Tracks A–F complete.
This commit is contained in:
2026-07-10 23:52:26 -04:00
parent b62bcd697e
commit 2b6cfc644f
13 changed files with 1083 additions and 107 deletions
+78 -5
View File
@@ -1404,8 +1404,8 @@
<div id="swarm-panel-services" class="swarm-panel">
<div class="table-responsive">
<table class="table table-dark table-hover table-sm">
<thead><tr><th>Name</th><th>Image</th><th>Replicas</th><th>ID</th></tr></thead>
<tbody id="swarm-services-body"><tr><td colspan="4" class="text-muted"></td></tr></tbody>
<thead><tr><th>Name</th><th>Image</th><th>Replicas</th><th>ID</th><th></th></tr></thead>
<tbody id="swarm-services-body"><tr><td colspan="5" class="text-muted"></td></tr></tbody>
</table>
</div>
</div>
@@ -1426,6 +1426,14 @@
</div>
</div>
<div id="swarm-panel-secrets" class="swarm-panel hidden">
<div class="settings-section mb-3" data-min-role="admin">
<h3 class="h6">Create secret</h3>
<div class="row g-2">
<div class="col-md-3"><input id="swarm-secret-name" class="form-control form-control-sm bg-dark text-white" placeholder="Name"></div>
<div class="col-md-7"><input id="swarm-secret-data" class="form-control form-control-sm bg-dark text-white font-monospace" placeholder="Secret value"></div>
<div class="col-md-2"><button type="button" class="btn btn-sm btn-primary w-100" id="swarm-secret-create">Create</button></div>
</div>
</div>
<div class="table-responsive">
<table class="table table-dark table-hover table-sm">
<thead><tr><th>Name</th><th>Created</th><th>ID</th></tr></thead>
@@ -1434,6 +1442,14 @@
</div>
</div>
<div id="swarm-panel-configs" class="swarm-panel hidden">
<div class="settings-section mb-3" data-min-role="admin">
<h3 class="h6">Create config</h3>
<div class="row g-2">
<div class="col-md-3"><input id="swarm-config-name" class="form-control form-control-sm bg-dark text-white" placeholder="Name"></div>
<div class="col-md-7"><textarea id="swarm-config-data" class="form-control form-control-sm bg-dark text-white font-monospace" rows="2" placeholder="Config payload"></textarea></div>
<div class="col-md-2"><button type="button" class="btn btn-sm btn-primary w-100" id="swarm-config-create">Create</button></div>
</div>
</div>
<div class="table-responsive">
<table class="table table-dark table-hover table-sm">
<thead><tr><th>Name</th><th>Created</th><th>ID</th></tr></thead>
@@ -1471,6 +1487,11 @@ services:
environment:
POSTGRES_PASSWORD: password"></textarea>
</div>
<div class="mb-3">
<label for="stack-env-file" class="form-label">Env file (optional)</label>
<textarea class="form-control bg-dark text-white font-monospace" id="stack-env-file" rows="4" placeholder="KEY=value&#10;OTHER=1" spellcheck="false"></textarea>
<div class="form-text">Passed as compose <code>--env-file</code> content on deploy / re-deploy.</div>
</div>
<hr class="border-secondary">
<h6 class="text-muted">GitOps sync (optional)</h6>
<p class="small text-muted">Clone a public/private git repo and deploy its compose file. Requires <code>git</code> on the server host.</p>
@@ -1545,10 +1566,20 @@ services:
<h2><i class="fas fa-server"></i>Fleet</h2>
<p class="page-subtitle">Concurrent multi-host health and Docker status</p>
</div>
<button class="btn btn-outline-primary" type="button" id="fleet-refresh-btn">
<i class="fas fa-sync me-2"></i>Refresh
</button>
<div class="d-flex flex-wrap gap-2 align-items-center">
<select id="fleet-env-filter" class="form-select form-select-sm bg-dark text-white" style="width: auto; min-width: 9rem;" title="Filter by environment tag">
<option value="">All environments</option>
<option value="prod">prod</option>
<option value="staging">staging</option>
<option value="dev">dev</option>
<option value="lab">lab</option>
</select>
<button class="btn btn-outline-primary" type="button" id="fleet-refresh-btn">
<i class="fas fa-sync me-2"></i>Refresh
</button>
</div>
</div>
<p class="small text-muted mb-2">Tag peers with an environment (prod/staging/dev) on each card for multi-host grouping.</p>
<div id="fleet-cards" class="row g-3"></div>
</div>
</div>
@@ -1600,6 +1631,14 @@ services:
</div>
</form>
<div id="access-vault-list" class="small"></div>
<hr class="border-secondary">
<h6 class="text-muted">Registry browser (Hub search)</h6>
<p class="small text-muted mb-2">Search Docker Hub from the active peer, then pull. Use vault credentials for private registries via pull.</p>
<div class="input-group input-group-sm mb-2">
<input type="search" id="access-hub-term" class="form-control bg-dark text-white" placeholder="Search Hub…" spellcheck="false">
<button type="button" class="btn btn-outline-info" id="access-hub-search-btn">Search</button>
</div>
<div id="access-hub-results" class="list-group list-group-flush small" style="max-height: 200px; overflow: auto;"></div>
</div>
</div>
</div>
@@ -1650,6 +1689,40 @@ services:
<div id="host-metrics-summary" class="small text-muted"></div>
</div>
</div>
<div class="col-12">
<div class="settings-section">
<h3>Scheduled maintenance</h3>
<p class="small text-muted mb-2">
Interval jobs on the <strong>server</strong> (min 1 minute). Useful for periodic prune / Docker ping — not external webhooks.
</p>
<div class="row g-2 align-items-end mb-2">
<div class="col-md-3">
<label class="form-label small" for="schedule-kind">Job</label>
<select id="schedule-kind" class="form-select form-select-sm bg-dark text-white">
<option value="dockerPing">Docker ping</option>
<option value="pruneContainers">Prune containers</option>
<option value="pruneImages">Prune images</option>
<option value="systemPrune">System prune</option>
</select>
</div>
<div class="col-md-2">
<label class="form-label small" for="schedule-minutes">Every (min)</label>
<input type="number" id="schedule-minutes" class="form-control form-control-sm bg-dark text-white" min="1" value="60">
</div>
<div class="col-md-3">
<div class="form-check mt-4">
<input class="form-check-input" type="checkbox" id="schedule-volumes">
<label class="form-check-label small" for="schedule-volumes">Include volumes (system prune)</label>
</div>
</div>
<div class="col-md-2">
<button type="button" class="btn btn-sm btn-outline-primary" id="schedule-add-btn" data-min-role="admin">Add</button>
<button type="button" class="btn btn-sm btn-outline-secondary" id="host-schedules-refresh"></button>
</div>
</div>
<div id="schedules-list" class="small"></div>
</div>
</div>
<div class="col-12">
<div class="settings-section">
<h3>Raw info</h3>