From 3f345dbc0248e1dc1e7acd21435d8e96f14a7153 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 15 Apr 2026 15:37:40 +0000 Subject: [PATCH] fix: detach reboot via dedicated systemd oneshot unit Agent-Logs-Url: https://github.com/naturallaw777/staging_alpha/sessions/0338009f-7d7f-4c99-94c1-32cb9b68b5e0 Co-authored-by: naturallaw777 <99053422+naturallaw777@users.noreply.github.com> --- app/sovran_systemsos_web/server.py | 16 +++++++++++++--- modules/core/sovran-hub.nix | 8 ++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/sovran_systemsos_web/server.py b/app/sovran_systemsos_web/server.py index 756c560..2ac8e30 100644 --- a/app/sovran_systemsos_web/server.py +++ b/app/sovran_systemsos_web/server.py @@ -69,7 +69,7 @@ NJALLA_SCRIPT = "/var/lib/njalla/njalla.sh" INTERNAL_IP_FILE = "/var/lib/secrets/internal-ip" ZEUS_CONNECT_FILE = "/var/lib/secrets/zeus-connect-url" -REBOOT_COMMAND = ["/run/current-system/sw/bin/systemctl", "reboot"] +REBOOT_UNIT = "sovran-hub-reboot.service" ONBOARDING_FLAG = "/var/lib/sovran/onboarding-complete" AUTOLAUNCH_DISABLE_FLAG = "/var/lib/sovran/hub-autolaunch-disabled" @@ -2036,7 +2036,12 @@ async def api_upgrade_to_server(): # Don't rebuild yet — the user needs to configure domains, SSL email, # and ports first via the onboarding wizard. Reboot so onboarding runs. try: - await asyncio.create_subprocess_exec(*REBOOT_COMMAND) + proc = await asyncio.create_subprocess_exec( + "/run/current-system/sw/bin/systemctl", "start", "--no-block", REBOOT_UNIT, + stdout=asyncio.subprocess.DEVNULL, + stderr=asyncio.subprocess.DEVNULL, + ) + await proc.wait() except Exception as exc: raise HTTPException(status_code=500, detail=f"Failed to initiate reboot: {exc}") @@ -2860,7 +2865,12 @@ async def api_ping(): @app.post("/api/reboot") async def api_reboot(): try: - await asyncio.create_subprocess_exec(*REBOOT_COMMAND) + proc = await asyncio.create_subprocess_exec( + "/run/current-system/sw/bin/systemctl", "start", "--no-block", REBOOT_UNIT, + stdout=asyncio.subprocess.DEVNULL, + stderr=asyncio.subprocess.DEVNULL, + ) + await proc.wait() except Exception: raise HTTPException(status_code=500, detail="Failed to initiate reboot") return {"ok": True} diff --git a/modules/core/sovran-hub.nix b/modules/core/sovran-hub.nix index c7e70ba..9bae98b 100644 --- a/modules/core/sovran-hub.nix +++ b/modules/core/sovran-hub.nix @@ -380,6 +380,14 @@ in }; }; + systemd.services.sovran-hub-reboot = { + description = "Sovran_SystemsOS Reboot"; + serviceConfig = { + Type = "oneshot"; + ExecStart = "/run/current-system/sw/bin/systemctl reboot"; + }; + }; + environment.systemPackages = [ sovran-hub-web ]; networking.firewall.allowedTCPPorts = [ 8937 60847 ];