diff --git a/webui/plugins/podman/Podman.page b/webui/plugins/podman/Podman.page
index 4c1548b..1ee7649 100644
--- a/webui/plugins/podman/Podman.page
+++ b/webui/plugins/podman/Podman.page
@@ -238,15 +238,17 @@ function podman_asset_version(string $relPath): string
-
Podman Service
Start, restart, or check the podman.sock backend — no terminal needed.
+
Podman Service
Start, stop, restart, or check the podman.sock backend — no terminal needed.
Checking…
+
+
Stop/Restart first stop all running containers (each gets its own configured grace period) — not just the API service.
diff --git a/webui/plugins/podman/ajax/settings.php b/webui/plugins/podman/ajax/settings.php
index e2792a5..6848406 100644
--- a/webui/plugins/podman/ajax/settings.php
+++ b/webui/plugins/podman/ajax/settings.php
@@ -18,6 +18,7 @@
* autostart_save POST {"names": ["postgres", "nextcloud", ...]}
* service_status GET -> {"running": bool, "output": "..."}
* service_start POST -> {"running": bool, "output": "..."}
+ * service_stop POST -> {"running": bool, "output": "..."}
* service_restart POST -> {"running": bool, "output": "..."}
*/
@@ -58,6 +59,10 @@ switch ($action) {
podman_json_response(rc_podman('start', 120));
break;
+ case 'service_stop':
+ podman_json_response(rc_podman('stop', 120));
+ break;
+
case 'service_restart':
podman_json_response(rc_podman('restart', 120));
break;
diff --git a/webui/plugins/podman/javascript/settings.js b/webui/plugins/podman/javascript/settings.js
index f682a1e..35a6838 100644
--- a/webui/plugins/podman/javascript/settings.js
+++ b/webui/plugins/podman/javascript/settings.js
@@ -72,8 +72,13 @@
}
}
+ function serviceButtons() {
+ return ['settings-service-status-btn', 'settings-service-start-btn', 'settings-service-stop-btn', 'settings-service-restart-btn']
+ .map(function (id) { return P.el(id); });
+ }
+
function refreshServiceStatus() {
- const buttons = [P.el('settings-service-status-btn'), P.el('settings-service-start-btn'), P.el('settings-service-restart-btn')];
+ const buttons = serviceButtons();
buttons.forEach(function (b) { b.disabled = true; });
return P.get('settings', 'service_status').then(renderServiceResult).catch(function (err) {
P.el('settings-service-chip').className = 'podman-chip podman-chip-bad';
@@ -86,7 +91,7 @@
}
function runServiceAction(action) {
- const buttons = [P.el('settings-service-status-btn'), P.el('settings-service-start-btn'), P.el('settings-service-restart-btn')];
+ const buttons = serviceButtons();
buttons.forEach(function (b) { b.disabled = true; });
P.el('settings-service-log').style.display = '';
P.el('settings-service-log').textContent = 'Working…';
@@ -205,7 +210,14 @@
P.el('settings-service-status-btn').addEventListener('click', refreshServiceStatus);
P.el('settings-service-start-btn').addEventListener('click', function () { runServiceAction('service_start'); });
- P.el('settings-service-restart-btn').addEventListener('click', function () { runServiceAction('service_restart'); });
+ P.el('settings-service-stop-btn').addEventListener('click', function () {
+ if (!confirm('Stop podman? All running containers will be stopped first (each with its own configured grace period).')) return;
+ runServiceAction('service_stop');
+ });
+ P.el('settings-service-restart-btn').addEventListener('click', function () {
+ if (!confirm('Restart podman? All running containers will be stopped and podman.sock will be unavailable until it comes back up.')) return;
+ runServiceAction('service_restart');
+ });
P.el('settings-format-disk-btn').addEventListener('click', openFormatDiskModal);
refreshServiceStatus();