From bd705caf6fefd8ad5469e548a65d86a5943c8c81 Mon Sep 17 00:00:00 2001 From: Owen de Bree Date: Fri, 3 Jul 2026 23:32:47 +0200 Subject: [PATCH 1/3] Cleanup --- .github/workflows/release.yml | 21 +- Docs/Configuration.md | 4 - Docs/LinuxDeploymentAndUpdates.md | 9 +- Docs/QuasarArchitecture.md | 10 +- Docs/StateMachines/BackupJobs.md | 6 +- Docs/WindowsDeploymentAndUpdates.md | 3 - Magnetar.Protocol/Runtime/MagnetarPaths.cs | 14 +- .../Runtime/QuasarReleaseVersion.cs | 31 -- Quasar.Bootstrap/Program.cs | 329 +----------------- Quasar/Components/Pages/Backup.razor | 4 +- .../CreateWorldSaveFromTemplateDialog.razor | 4 +- Quasar/Models/QuasarBackupSettings.cs | 36 +- Quasar/Services/Backup/BackupCompatibility.cs | 23 +- .../Services/Backup/BackupFormatMigrations.cs | 52 --- Quasar/Services/BrandingService.cs | 35 +- Quasar/Services/DedicatedServerCatalog.cs | 109 ------ .../GitHubUpdateCredentialsCatalog.cs | 52 +-- .../ManagedDedicatedServerRuntimeResolver.cs | 4 +- Quasar/Services/QuasarWorldTemplateCatalog.cs | 111 ------ .../SteamWorkshopCredentialsCatalog.cs | 53 +-- Quasar/wwwroot/quasar-configs.js | 2 +- whitelabel-theme-configurator.md | 4 +- 22 files changed, 54 insertions(+), 862 deletions(-) delete mode 100644 Quasar/Services/Backup/BackupFormatMigrations.cs diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 03019eab..b7bd0724 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -595,30 +595,11 @@ jobs: match = matches[-1] numbers = [int(part) for part in match.group("core").split(".")] - prerelease = match.group("pre") or "" - prerelease_parts = prerelease.split(".") if prerelease else [] - prerelease_build = None - - if prerelease.isdigit(): - prerelease_build = int(prerelease) - elif prerelease_parts: - # Legacy PR/manual tags used base-pr.. and - # base-manual.. Sort them by the trailing run number so - # current review builds are not treated as older than stable - # base releases only because they carry a non-numeric label. - if prerelease_parts[0] in {"main", "manual"} and prerelease_parts[-1].isdigit(): - prerelease_build = int(prerelease_parts[-1]) - elif ( - prerelease_parts[0] == "pr" - and len(prerelease_parts) >= 3 - and prerelease_parts[-1].isdigit() - ): - prerelease_build = int(prerelease_parts[-1]) while len(numbers) < 3: numbers.append(0) if len(numbers) < 4: - numbers.append(prerelease_build or 0) + numbers.append(0) return tuple(numbers[:4]) diff --git a/Docs/Configuration.md b/Docs/Configuration.md index 80aacc93..fbd1ff56 100644 --- a/Docs/Configuration.md +++ b/Docs/Configuration.md @@ -82,10 +82,6 @@ worker** read JSON config from these locations, later ones overriding earlier: 1. Set `QUASAR_DATA_DIR` (or `--data-dir ` on Linux installs) to keep persistent local overrides in a separate directory. -When Bootstrap starts without a custom `QUASAR_DATA_DIR`, it migrates legacy -default data roots (`~/.config/Quasar` on Linux/macOS, -`%APPDATA%\Quasar` on Windows) into the install root. - The shipped defaults are defined in [`Quasar/appsettings.json`](../Quasar/appsettings.json). During UI-worker staging, Quasar performs a three-way merge for `appsettings.json`: diff --git a/Docs/LinuxDeploymentAndUpdates.md b/Docs/LinuxDeploymentAndUpdates.md index 06dfbcfd..af6b4a90 100644 --- a/Docs/LinuxDeploymentAndUpdates.md +++ b/Docs/LinuxDeploymentAndUpdates.md @@ -93,13 +93,8 @@ The downloaded archive must match the release's `SHA256SUMS` entry before it is extracted. When running as a systemd service, Bootstrap ignores a stale active-release pointer that targets a random external build directory. Only packaged -`WebService/` workers, managed web releases, staged legacy workers, or explicitly -configured `QUASAR_WEB_EXE` / `QUASAR_WEB_DLL` workers are trusted. If Bootstrap -finds an older active pointer that still targets `Updates/Staged/`, it -migrates that release into `ManagedRuntime/WebService/` before launch. -On startup, Bootstrap also migrates a legacy default data root at -`~/.config/Quasar` into the install root unless `QUASAR_DATA_DIR` points to a -custom directory. +`WebService/` workers, managed web releases, or explicitly configured +`QUASAR_WEB_EXE` / `QUASAR_WEB_DLL` workers are trusted. Bootstrap always captures the managed web UI worker's stdout/stderr and mirrors it to its own console. For systemd installs, Quasar web UI warnings and errors diff --git a/Docs/QuasarArchitecture.md b/Docs/QuasarArchitecture.md index 9d440fd6..d542570e 100644 --- a/Docs/QuasarArchitecture.md +++ b/Docs/QuasarArchitecture.md @@ -559,10 +559,8 @@ under Bootstrap, an admin can force activation from the UI. The worker writes a request file under `Updates/` containing the detected version and asset; Bootstrap consumes it with a watcher and runs the same checksum-verified self-update path for that requested release immediately. -Bootstrap also owns default data-root migration: if no custom `QUASAR_DATA_DIR` -is set, or it still points at the legacy default AppData path, Bootstrap moves -the legacy root into the launcher install root and passes that root to the -worker. +Bootstrap sets `QUASAR_DATA_DIR` to the launcher install root when the variable +is not already set, so the launcher and worker share one default state root. The Updates page also shows installed managed-runtime versions independently of Quasar self-update state: Quasar UI/Bootstrap, Magnetar, and the Space Engineers @@ -902,7 +900,7 @@ As of this document: lines first. - first health-monitoring and auto-recovery pass exists for agent attach grace, heartbeat freshness, simulation-frame progress scoring aligned with the DS watcher, and uptime-based warning/recycle policy - initial runtime launch preparation now exists for isolated app-data roots, runtime config sync, `LastSession.sbl`, and enforced headless launch shaping -- server definitions store a saves root (`WorldPath`) plus selected save folder (`WorldSaveName`). Older definitions whose `WorldPath` pointed at a concrete save are migrated automatically by moving the final path segment into `WorldSaveName`. The server editor requires a selected save before save/start, lists existing saves from the saves root, and has an always-available Create From Template dialog that can create/import a world template before copying it into a new save. +- server definitions store a saves root (`WorldPath`) plus selected save folder (`WorldSaveName`). The server editor requires a selected save before save/start, lists existing saves from the saves root, and has an always-available Create From Template dialog that can create/import a world template before copying it into a new save. - neutral light/dark theming exists with local-storage persistence - config editing is now migrated out of Python into Quasar-managed JSON profiles and rendered runtime artifacts. Profiles cover Quasar root settings, server password (rendered to DS-compatible hash/salt), and DS-visible SE session settings including block type world limits; on server start Quasar writes session settings and mods into the world's authoritative `Sandbox_config.sbc` as well as the runtime DS config. World-template import flows can also read a template's current `Sandbox_config.sbc` and create a config profile from its session settings and mods. - file watching/reload now exists for manual edits to Quasar-managed server/profile JSON @@ -920,7 +918,7 @@ As of this document: - the Analytics dashboard renders metrics as client-side uPlot canvas charts: the browser fetches compact, timeline-aligned series from a JSON HTTP endpoint (`/api/analytics/series`, backed by `AnalyticsSeriesService`, which selects the RRD consolidation tier by span — raw ≤2h, 1-minute ≤24h, 1-hour beyond — and drops empty buckets); profiler game-loop timing buckets (frame, update, physics, scripts, network, other) and extensive profiler top grids/entity types are surfaced as additional chart panels through the same endpoint via `ProfilerAnalyticsMetrics` and `ProfilerEntryAnalyticsMetrics`; the same page edits each server/agent profiler mode with user-facing labels ("Simple, low overhead" for `SafeContinuous`, "Extensive, deep detail" for `DeepContinuous`) and pushes live changes through `ServerCommandType.SetProfilerMode`; the previous inline `ProfilerSummaryCard` tables and the `blocks`/`floating-objects` scalar metrics have been removed - deep per-server profiler telemetry now exists: `Quasar.Agent` runs a continuous in-process profiler with `SafeContinuous` enabled by default, with per-server persisted `AgentProfilerMode` values and a global `Quasar:AgentProfilerMode` / `QUASAR_AGENT_PROFILER_MODE` fallback for older definitions. Safe mode uses Harmony prefix/postfix timing only for named high-level paths: frame/update, programmable-block script, physics, replication/network/session, GPS, and block-limit work. It deliberately avoids broad entity update method patching and detailed network-event hooks so the always-on default stays low overhead. Deep mode adds detailed network-event method hooks plus Magnetar-compatible Harmony IL call-site transpilers for `MySession.Update` / `UpdateComponents`, session component calls, replication simulation, entity update dispatch, parallel waits/callbacks, and Havok physics stepping internals. Runtime mode changes reconfigure Harmony patches so Safe, Deep, and Off can be selected without restarting the server. Hot-path measurements use numeric call-site ids and rolling accumulators, split main-thread vs off-thread time, and publish one-second windows with bounded top-lists for grids, scripts, entity types, system methods, physics detail, and network/replication/session work where the active patch depth can observe them. Patch failures are logged and the agent keeps the remaining profiler surface; entity call-site misses stay at high-level timing rather than adding broad method wrapping. Each `ProfilerSnapshot` rides the regular agent snapshot, is validated, and is kept in a small recent in-memory `ProfilerStoreService` ring (~720 samples per server, about 12 minutes at one snapshot per second), then surfaced on the Analytics page as game-loop timing and top grid/entity-type chart panels - Discord per-server options now include chat relay and simspeed alert rules. Discord-to-game chat is injected as `[Discord] : ` so in-game readers see the Discord sender, and `DiscordChatRelayService` suppresses the matching game-history echo before it can post back to Discord as the server/bot author. `DiscordSimSpeedAlertService` evaluates fresh raw metric samples for connected/running agents on the registry change path, sending alerts through the configured simspeed channel or the server's analytics channel. Baseline rules detect sharp sample-to-sample drops across every unseen raw sample pair and sustained low average simspeed, and the Discord page exposes thresholds, windows, cooldowns, and per-rule enable switches. `DiscordBotService` also publishes aggregate managed-server state through Discord presence: the bot status reflects unhealthy/faulted vs active vs idle server instances, and its activity text shows active/total servers, player count, and issue/warning counts. -- a unified GitHub-release-based update/publish pipeline now exists covering both Linux and Windows in a single combined release (`.github/workflows/release.yml`): each build produces `quasar-installer-linux.tar.gz` / `quasar-web-linux-x64.tar.gz` (Linux) and `quasar-installer-windows.zip` / `quasar-web-win-x64.zip` (Windows) under one tag; tag pushes and `main` publish full releases while pull requests publish draft prereleases; installer archives contain a single top-level `Quasar` directory for clean manual extraction; the release carries one combined `SHA256SUMS` covering every archive; release identity is normalized from `AssemblyInformationalVersion` and the active-release pointer (not numeric `AssemblyVersion`); four-part build tags such as `1.0.0.37` are canonical and numeric prerelease aliases such as `1.0.0-37` normalize to them; every downloaded asset is verified against `SHA256SUMS`; the UI stages web updates and queues them for explicit activation from `/settings/updates`; Bootstrap self-upgrades from the launcher stream only when an actually-newer asset appears (see [Linux Deployment and Updates](LinuxDeploymentAndUpdates.md) and [Windows Deployment and Updates](WindowsDeploymentAndUpdates.md)) +- a unified GitHub-release-based update/publish pipeline now exists covering both Linux and Windows in a single combined release (`.github/workflows/release.yml`): each build produces `quasar-installer-linux.tar.gz` / `quasar-web-linux-x64.tar.gz` (Linux) and `quasar-installer-windows.zip` / `quasar-web-win-x64.zip` (Windows) under one tag; tag pushes and `main` publish full releases while pull requests publish draft prereleases; installer archives contain a single top-level `Quasar` directory for clean manual extraction; the release carries one combined `SHA256SUMS` covering every archive; release identity is normalized from `AssemblyInformationalVersion` and the active-release pointer (not numeric `AssemblyVersion`); four-part build tags such as `1.0.0.37` are canonical; every downloaded asset is verified against `SHA256SUMS`; the UI stages web updates and queues them for explicit activation from `/settings/updates`; Bootstrap self-upgrades from the launcher stream only when an actually-newer asset appears (see [Linux Deployment and Updates](LinuxDeploymentAndUpdates.md) and [Windows Deployment and Updates](WindowsDeploymentAndUpdates.md)) - `Quasar.Bootstrap` runs as the stable launcher that owns the public port on both Linux (systemd service) and Windows (Scheduled Task): it activates web releases through the `Updates/active-release.json` pointer after staged payloads are promoted into `ManagedRuntime/WebService//`, and performs worker cutover by draining the old worker and starting the managed one on the same port — a launcher, not yet a reverse proxy — so the public endpoint stays stable across the short listener gap while managed Magnetar servers keep running; on Linux, the UI shutdown action prefers `systemctl --user stop quasar.service` / `systemctl stop quasar.service` when the installed unit is detectable, falling back to the worker-written shutdown request that makes Bootstrap exit without respawning; on Linux the launcher exits with code 75 so systemd restarts it for self-upgrade; on Windows the launcher spawns a detached replacement `Quasar.exe serve --quiet` and exits 0, with the Scheduled Task restart-on-failure as the safety net - Windows deployment exists via `install.ps1`/`uninstall.ps1`: extracted release installs default to the installer root, source installs default to `%ProgramFiles%\Quasar`, and the installer registers a Scheduled Task (`Quasar`) that starts at boot and restarts the launcher on failure; the task runs Bootstrap directly with `serve --quiet --service` - staged relaunch now persists supervisor runtime state so managed DS processes survive worker turnover diff --git a/Docs/StateMachines/BackupJobs.md b/Docs/StateMachines/BackupJobs.md index 648f41c0..5e3bf26c 100644 --- a/Docs/StateMachines/BackupJobs.md +++ b/Docs/StateMachines/BackupJobs.md @@ -8,8 +8,7 @@ retention policy. Relevant source: [`AutomaticBackupService.cs`](../../Quasar/Services/Backup/AutomaticBackupService.cs), [`QuasarBackupManifest.cs`](../../Quasar/Models/QuasarBackupManifest.cs), -[`BackupCompatibility.cs`](../../Quasar/Services/Backup/BackupCompatibility.cs), -[`BackupFormatMigrations.cs`](../../Quasar/Services/Backup/BackupFormatMigrations.cs). +[`BackupCompatibility.cs`](../../Quasar/Services/Backup/BackupCompatibility.cs). There are three [`QuasarBackupKind`](../../Quasar/Models/QuasarBackupManifest.cs) values — `Configuration`, `Server`, `World` — corresponding to the queued job @@ -72,8 +71,7 @@ Restore is gated by a semantic-version check ([`BackupCompatibility.Evaluate`](../../Quasar/Services/Backup/BackupCompatibility.cs)): - same `Major.Minor` → allowed; -- older backup → allowed only if [`BackupFormatMigrations.CanMigrate`](../../Quasar/Services/Backup/BackupFormatMigrations.cs) - finds a contiguous upgrade path through the registered migration steps; +- older backup than the running build → rejected; - newer backup than the running build → rejected (no downgrade). The archive's `quasar-backup.json` manifest records `FormatVersion` (archive diff --git a/Docs/WindowsDeploymentAndUpdates.md b/Docs/WindowsDeploymentAndUpdates.md index be35d055..abfea982 100644 --- a/Docs/WindowsDeploymentAndUpdates.md +++ b/Docs/WindowsDeploymentAndUpdates.md @@ -85,9 +85,6 @@ extracts it under: Then it writes `Updates/active-release.json` pointing at the managed active worker. `Updates\Staged\` is reserved for not-yet-activated update payloads. The downloaded archive must match the release's `SHA256SUMS` entry before extraction. -On startup, Bootstrap also migrates a legacy default data root at -`%APPDATA%\Quasar` into the install root unless `QUASAR_DATA_DIR` points to a -custom directory. ## UI Worker Updates diff --git a/Magnetar.Protocol/Runtime/MagnetarPaths.cs b/Magnetar.Protocol/Runtime/MagnetarPaths.cs index c9e0dce5..01d37745 100644 --- a/Magnetar.Protocol/Runtime/MagnetarPaths.cs +++ b/Magnetar.Protocol/Runtime/MagnetarPaths.cs @@ -7,9 +7,8 @@ public static class MagnetarPaths { // ------------------------------------------------------------------------- // Root — everything lives under QUASAR_DATA_DIR when set. Bootstrap sets it - // to the launcher install root for packaged installs after migrating legacy - // ~/.config/Quasar (Linux/macOS) or %APPDATA%\Quasar (Windows) data. - // Without Bootstrap, fall back to the OS application-data directory. + // to the launcher install root for packaged installs. Without Bootstrap, + // fall back to the OS application-data directory. // ------------------------------------------------------------------------- public static string GetQuasarDirectory() @@ -25,9 +24,6 @@ public static string GetQuasarDirectory() return Path.Combine(appData, "Quasar"); } - // Kept for backward compatibility — resolves to the Quasar root. - public static string GetRuntimeDirectory() => GetQuasarDirectory(); - // ------------------------------------------------------------------------- // Bootstrap / web-service manifest // ------------------------------------------------------------------------- @@ -66,9 +62,6 @@ public static string GetQuasarBrandingPath() => public static string GetQuasarBrandingDirectory() => Path.Combine(GetQuasarDirectory(), "Branding"); - public static string GetQuasarBrandingDirectory(string webRootPath) => - GetQuasarBrandingDirectory(); - public static string GetQuasarDeathMessagesPath() => Path.Combine(GetQuasarDirectory(), "death-messages.json"); @@ -129,9 +122,6 @@ public static string GetQuasarServerAnalyticsPath(string uniqueName) => public static string GetQuasarWorldTemplatesDirectory() => Path.Combine(GetQuasarDirectory(), "WorldTemplates"); - public static string GetLegacyQuasarWorldProfilesDirectory() => - Path.Combine(GetQuasarDirectory(), "WorldProfiles"); - public static string GetQuasarWorldTemplateDirectory(string worldTemplateId) => Path.Combine(GetQuasarWorldTemplatesDirectory(), SanitizePathSegment(worldTemplateId)); diff --git a/Magnetar.Protocol/Runtime/QuasarReleaseVersion.cs b/Magnetar.Protocol/Runtime/QuasarReleaseVersion.cs index 32050536..7cc46372 100644 --- a/Magnetar.Protocol/Runtime/QuasarReleaseVersion.cs +++ b/Magnetar.Protocol/Runtime/QuasarReleaseVersion.cs @@ -11,10 +11,6 @@ public static class QuasarReleaseVersion @"(?\d+(?:\.\d+){1,3})(?:-(?
[0-9A-Za-z][0-9A-Za-z.-]*))?",
         RegexOptions.Compiled | RegexOptions.CultureInvariant);
 
-    private static readonly Regex LegacyChannelPrereleasePattern = new(
-        @"^(?:(?main|manual)\.(?\d+)|pr\.(?\d+)\.(?\d+))$",
-        RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
-
     public static string GetEntryAssemblyVersion()
     {
         var assembly = Assembly.GetEntryAssembly();
@@ -55,11 +51,6 @@ public static string Normalize(string value)
 
         var core = NormalizeCore(match.Groups["core"].Value);
         var prerelease = match.Groups["pre"].Success ? match.Groups["pre"].Value : string.Empty;
-        if (TryNormalizeLegacyChannelPrerelease(core, prerelease, out var channelVersion))
-            return channelVersion;
-
-        if (int.TryParse(prerelease, out _))
-            return $"{core}.{prerelease}";
 
         return string.IsNullOrWhiteSpace(prerelease) ? core : $"{core}-{prerelease}";
     }
@@ -73,28 +64,6 @@ private static string NormalizeCore(string core)
         return string.Join(".", parts);
     }
 
-    private static bool TryNormalizeLegacyChannelPrerelease(string core, string prerelease, out string version)
-    {
-        version = string.Empty;
-        if (string.IsNullOrWhiteSpace(prerelease))
-            return false;
-
-        var match = LegacyChannelPrereleasePattern.Match(prerelease);
-        if (!match.Success)
-            return false;
-
-        var build = match.Groups["build"].Value;
-        var normalizedCore = $"{core}.{build}";
-        if (match.Groups["pr"].Success)
-        {
-            version = $"{normalizedCore}-pr.{match.Groups["pr"].Value}";
-            return true;
-        }
-
-        version = $"{normalizedCore}-{match.Groups["channel"].Value.ToLowerInvariant()}";
-        return true;
-    }
-
     private static bool TryParse(string value, out ReleaseVersion version)
     {
         version = default!;
diff --git a/Quasar.Bootstrap/Program.cs b/Quasar.Bootstrap/Program.cs
index 954af280..2214275e 100644
--- a/Quasar.Bootstrap/Program.cs
+++ b/Quasar.Bootstrap/Program.cs
@@ -30,7 +30,7 @@ internal static class Program
 
     public static async Task Main(string[] args)
     {
-        BootstrapDataDirectoryMigration.ApplyInstallRootDefault();
+        BootstrapDataDirectoryDefaults.ApplyInstallRootDefault();
 
         var quiet = args.Any(static arg => string.Equals(arg, "--quiet", StringComparison.OrdinalIgnoreCase));
         var openBrowser = args.Any(static arg => string.Equals(arg, "--open-browser", StringComparison.OrdinalIgnoreCase));
@@ -560,242 +560,21 @@ private static bool IsDotNetHost(string processPath)
     }
 }
 
-internal static class BootstrapDataDirectoryMigration
+internal static class BootstrapDataDirectoryDefaults
 {
     private const string DataDirectoryEnvironmentVariable = "QUASAR_DATA_DIR";
 
-    public static BootstrapDataDirectoryMigrationResult LastResult { get; private set; } = BootstrapDataDirectoryMigrationResult.Empty;
-
     public static void ApplyInstallRootDefault()
     {
-        LastResult = BootstrapDataDirectoryMigrationResult.Empty;
-
-        var installRoot = NormalizeDirectory(AppContext.BaseDirectory);
-        if (string.IsNullOrWhiteSpace(installRoot))
+        if (!string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable(DataDirectoryEnvironmentVariable)))
             return;
 
-        var legacyRoot = GetLegacyQuasarDirectory();
-        var configuredRoot = Environment.GetEnvironmentVariable(DataDirectoryEnvironmentVariable);
-        if (IsCustomDataDirectory(configuredRoot, installRoot, legacyRoot))
-            return;
-
-        var targetRoot = string.IsNullOrWhiteSpace(configuredRoot) || IsSamePath(configuredRoot, legacyRoot)
-            ? installRoot
-            : NormalizeDirectory(configuredRoot);
-
-        if (string.IsNullOrWhiteSpace(targetRoot))
-            targetRoot = installRoot;
-
-        if (!string.IsNullOrWhiteSpace(legacyRoot) &&
-            !IsSamePath(legacyRoot, targetRoot) &&
-            IsPathUnder(targetRoot, legacyRoot))
-        {
-            Environment.SetEnvironmentVariable(DataDirectoryEnvironmentVariable, legacyRoot);
-            LastResult = new BootstrapDataDirectoryMigrationResult(
-                legacyRoot,
-                targetRoot,
-                Migrated: false,
-                ErrorMessage: "Install root is inside the legacy data directory.");
-            return;
-        }
-
-        try
-        {
-            Directory.CreateDirectory(targetRoot);
-            var migrated = false;
-            if (!string.IsNullOrWhiteSpace(legacyRoot) &&
-                !IsSamePath(legacyRoot, targetRoot) &&
-                Directory.Exists(legacyRoot))
-            {
-                MergeDirectoryContents(legacyRoot, targetRoot);
-                TryRewriteMigratedActiveReleasePointer(legacyRoot, targetRoot);
-                TryDeleteDirectoryIfEmpty(legacyRoot);
-                migrated = true;
-            }
-
-            Environment.SetEnvironmentVariable(DataDirectoryEnvironmentVariable, targetRoot);
-            LastResult = new BootstrapDataDirectoryMigrationResult(legacyRoot, targetRoot, migrated, string.Empty);
-        }
-        catch (Exception exception)
-        {
-            if (!string.IsNullOrWhiteSpace(configuredRoot))
-                Environment.SetEnvironmentVariable(DataDirectoryEnvironmentVariable, configuredRoot);
-
-            LastResult = new BootstrapDataDirectoryMigrationResult(
-                legacyRoot,
-                targetRoot,
-                Migrated: false,
-                ErrorMessage: exception.Message);
-        }
-    }
-
-    private static bool IsCustomDataDirectory(string? configuredRoot, string installRoot, string legacyRoot)
-    {
-        return !string.IsNullOrWhiteSpace(configuredRoot) &&
-               !IsSamePath(configuredRoot, installRoot) &&
-               !IsSamePath(configuredRoot, legacyRoot);
-    }
-
-    private static string GetLegacyQuasarDirectory()
-    {
-        var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
-        return string.IsNullOrWhiteSpace(appData)
-            ? string.Empty
-            : NormalizeDirectory(Path.Combine(appData, "Quasar"));
-    }
-
-    private static void TryRewriteMigratedActiveReleasePointer(string legacyRoot, string targetRoot)
-    {
-        var pointerPath = Path.Combine(targetRoot, "Updates", "active-release.json");
-        if (!File.Exists(pointerPath))
+        var installRoot = AppContext.BaseDirectory;
+        if (string.IsNullOrWhiteSpace(installRoot))
             return;
 
-        try
-        {
-            var pointer = JsonSerializer.Deserialize(
-                File.ReadAllText(pointerPath),
-                LauncherCoordinator.JsonOptions);
-            if (pointer is null)
-                return;
-
-            var fileName = RewriteMigratedPath(pointer.FileName, legacyRoot, targetRoot);
-            var workingDirectory = RewriteMigratedPath(pointer.WorkingDirectory, legacyRoot, targetRoot);
-            var arguments = RewriteMigratedArguments(pointer.Arguments, legacyRoot, targetRoot);
-            if (string.Equals(fileName, pointer.FileName, StringComparison.Ordinal) &&
-                string.Equals(workingDirectory, pointer.WorkingDirectory, StringComparison.Ordinal) &&
-                string.Equals(arguments, pointer.Arguments, StringComparison.Ordinal))
-            {
-                return;
-            }
-
-            var rewritten = new QuasarActiveReleasePointer
-            {
-                Version = pointer.Version,
-                FileName = fileName,
-                Arguments = arguments,
-                WorkingDirectory = workingDirectory,
-                ActivatedAtUtc = pointer.ActivatedAtUtc,
-            };
-            File.WriteAllText(pointerPath, JsonSerializer.Serialize(rewritten, LauncherCoordinator.JsonOptions));
-        }
-        catch
-        {
-        }
-    }
-
-    private static string RewriteMigratedPath(string value, string legacyRoot, string targetRoot)
-    {
-        if (string.IsNullOrWhiteSpace(value) || !Path.IsPathFullyQualified(value))
-            return value;
-
-        if (IsSamePath(value, legacyRoot))
-            return targetRoot;
-
-        if (!IsPathUnder(value, legacyRoot))
-            return value;
-
-        var relativePath = Path.GetRelativePath(NormalizeDirectory(legacyRoot), NormalizeDirectory(value));
-        return Path.Combine(targetRoot, relativePath);
-    }
-
-    private static string RewriteMigratedArguments(string value, string legacyRoot, string targetRoot)
-    {
-        if (string.IsNullOrWhiteSpace(value) || string.IsNullOrWhiteSpace(legacyRoot))
-            return value;
-
-        var normalizedLegacyRoot = NormalizeDirectory(legacyRoot);
-        var normalizedTargetRoot = NormalizeDirectory(targetRoot);
-        var comparison = OperatingSystem.IsWindows() ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal;
-        var rewritten = value.Replace(normalizedLegacyRoot, normalizedTargetRoot, comparison);
-
-        if (OperatingSystem.IsWindows())
-        {
-            rewritten = rewritten.Replace(
-                normalizedLegacyRoot.Replace('\\', '/'),
-                normalizedTargetRoot.Replace('\\', '/'),
-                StringComparison.OrdinalIgnoreCase);
-        }
-
-        return rewritten;
-    }
-
-    private static void MergeDirectoryContents(string sourceDirectory, string destinationDirectory)
-    {
-        Directory.CreateDirectory(destinationDirectory);
-
-        foreach (var sourcePath in Directory.EnumerateFiles(sourceDirectory))
-        {
-            var destinationPath = Path.Combine(destinationDirectory, Path.GetFileName(sourcePath));
-            Directory.CreateDirectory(Path.GetDirectoryName(destinationPath)!);
-            File.Copy(sourcePath, destinationPath, overwrite: true);
-            TryDeleteFile(sourcePath);
-        }
-
-        foreach (var sourceChildDirectory in Directory.EnumerateDirectories(sourceDirectory))
-        {
-            var destinationChildDirectory = Path.Combine(destinationDirectory, Path.GetFileName(sourceChildDirectory));
-            MergeDirectoryContents(sourceChildDirectory, destinationChildDirectory);
-            TryDeleteDirectoryIfEmpty(sourceChildDirectory);
-        }
-    }
-
-    private static void TryDeleteFile(string path)
-    {
-        try
-        {
-            if (File.Exists(path))
-                File.Delete(path);
-        }
-        catch
-        {
-        }
-    }
-
-    private static void TryDeleteDirectoryIfEmpty(string path)
-    {
-        try
-        {
-            if (Directory.Exists(path) && !Directory.EnumerateFileSystemEntries(path).Any())
-                Directory.Delete(path);
-        }
-        catch
-        {
-        }
-    }
-
-    private static string NormalizeDirectory(string? path)
-    {
-        if (string.IsNullOrWhiteSpace(path))
-            return string.Empty;
-
-        return Path.GetFullPath(path.Trim()).TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
+        Environment.SetEnvironmentVariable(DataDirectoryEnvironmentVariable, Path.GetFullPath(installRoot));
     }
-
-    private static bool IsSamePath(string? left, string? right)
-    {
-        if (string.IsNullOrWhiteSpace(left) || string.IsNullOrWhiteSpace(right))
-            return false;
-
-        var comparison = OperatingSystem.IsWindows() ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal;
-        return string.Equals(NormalizeDirectory(left), NormalizeDirectory(right), comparison);
-    }
-
-    private static bool IsPathUnder(string path, string possibleParent)
-    {
-        var normalizedPath = NormalizeDirectory(path) + Path.DirectorySeparatorChar;
-        var normalizedParent = NormalizeDirectory(possibleParent) + Path.DirectorySeparatorChar;
-        var comparison = OperatingSystem.IsWindows() ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal;
-        return normalizedPath.StartsWith(normalizedParent, comparison);
-    }
-}
-
-internal readonly record struct BootstrapDataDirectoryMigrationResult(
-    string LegacyPath,
-    string TargetPath,
-    bool Migrated,
-    string ErrorMessage)
-{
-    public static BootstrapDataDirectoryMigrationResult Empty { get; } = new(string.Empty, string.Empty, false, string.Empty);
 }
 
 internal sealed class BootstrapOptions
@@ -975,16 +754,14 @@ public static string ReadToken(ILogger logger)
             if (persisted is null)
                 return string.Empty;
 
-            if (!string.IsNullOrWhiteSpace(persisted.ProtectedToken))
-            {
-                var protector = DataProtectionProvider
-                    .Create(new DirectoryInfo(MagnetarPaths.GetQuasarDataProtectionKeyringDirectory()), options => options.SetApplicationName("Quasar"))
-                    .CreateProtector(DataProtectionPurpose);
+            if (string.IsNullOrWhiteSpace(persisted.ProtectedToken))
+                return string.Empty;
 
-                return protector.Unprotect(persisted.ProtectedToken).Trim();
-            }
+            var protector = DataProtectionProvider
+                .Create(new DirectoryInfo(MagnetarPaths.GetQuasarDataProtectionKeyringDirectory()), options => options.SetApplicationName("Quasar"))
+                .CreateProtector(DataProtectionPurpose);
 
-            return persisted.Token?.Trim() ?? string.Empty;
+            return protector.Unprotect(persisted.ProtectedToken).Trim();
         }
         catch (Exception exception)
         {
@@ -996,8 +773,6 @@ public static string ReadToken(ILogger logger)
     private sealed class PersistedCredentials
     {
         public string? ProtectedToken { get; set; }
-
-        public string? Token { get; set; }
     }
 }
 
@@ -1101,23 +876,6 @@ public WebServiceDiscoveryManifest GetManifest()
     public async Task StartAsync(CancellationToken cancellationToken)
     {
         _logger.LogInformation("Starting Quasar...");
-        var migration = BootstrapDataDirectoryMigration.LastResult;
-        if (migration.Migrated)
-        {
-            _logger.LogInformation(
-                "Migrated legacy Quasar data directory from {LegacyPath} to {TargetPath}.",
-                migration.LegacyPath,
-                migration.TargetPath);
-        }
-        else if (!string.IsNullOrWhiteSpace(migration.ErrorMessage))
-        {
-            _logger.LogWarning(
-                "Failed migrating legacy Quasar data directory from {LegacyPath} to {TargetPath}: {Message}",
-                migration.LegacyPath,
-                migration.TargetPath,
-                migration.ErrorMessage);
-        }
-
         Directory.CreateDirectory(MagnetarPaths.GetWebServiceDirectory());
         Directory.CreateDirectory(MagnetarPaths.GetQuasarUpdatesDirectory());
         await EnsureInitialWebReleaseAvailableAsync(cancellationToken).ConfigureAwait(false);
@@ -1506,10 +1264,7 @@ private async Task EnsureInitialWebReleaseAvailableAsync(CancellationToken cance
     {
         var existing = ReadActiveReleasePointer();
         if (existing is not null && IsReleasePointerUsable(existing, allowExternalPointer: !IsServiceMode()))
-        {
-            TryMigrateStagedActiveRelease(existing);
             return;
-        }
 
         if (FindPackagedWorkerCandidate() is not null)
             return;
@@ -2264,52 +2019,6 @@ private static void WriteActiveReleasePointer(QuasarActiveReleasePointer pointer
         File.WriteAllText(path, JsonSerializer.Serialize(pointer, JsonOptions));
     }
 
-    private static bool TryMigrateStagedActiveRelease(QuasarActiveReleasePointer pointer)
-    {
-        pointer = Normalize(pointer);
-        var sourceDirectory = string.IsNullOrWhiteSpace(pointer.WorkingDirectory)
-            ? Path.GetDirectoryName(pointer.FileName) ?? string.Empty
-            : pointer.WorkingDirectory;
-        if (string.IsNullOrWhiteSpace(sourceDirectory) ||
-            !IsPathUnder(sourceDirectory, MagnetarPaths.GetQuasarStagingDirectory()))
-        {
-            return false;
-        }
-
-        var version = QuasarReleaseVersion.Normalize(string.IsNullOrWhiteSpace(pointer.Version)
-            ? Path.GetFileName(sourceDirectory)
-            : pointer.Version);
-        var activeDirectory = MagnetarPaths.GetQuasarManagedWebReleaseDirectory(version);
-        if (IsSamePath(sourceDirectory, activeDirectory))
-            return false;
-
-        try
-        {
-            if (Directory.Exists(activeDirectory))
-                Directory.Delete(activeDirectory, recursive: true);
-
-            CopyDirectory(sourceDirectory, activeDirectory);
-            QuasarWebReleaseLayout.ValidateDirectory(activeDirectory);
-            var workerPath = Path.Combine(activeDirectory, QuasarWebReleaseLayout.WorkerExecutableFileName);
-            EnsureExecutableBit(workerPath);
-
-            WriteActiveReleasePointer(new QuasarActiveReleasePointer
-            {
-                Version = version,
-                FileName = workerPath,
-                Arguments = string.Empty,
-                WorkingDirectory = activeDirectory,
-                ActivatedAtUtc = pointer.ActivatedAtUtc == default ? DateTimeOffset.UtcNow : pointer.ActivatedAtUtc,
-            });
-            CleanupStagedUpdates(activeDirectory);
-            return true;
-        }
-        catch
-        {
-            return false;
-        }
-    }
-
     private static void CleanupStagedUpdates(string activeWorkingDirectory)
     {
         var stagingDirectory = MagnetarPaths.GetQuasarStagingDirectory();
@@ -2340,17 +2049,6 @@ private static void CleanupInactiveManagedWebReleases(string activeWorkingDirect
         }
     }
 
-    private static void CopyDirectory(string sourceDirectory, string destinationDirectory)
-    {
-        foreach (var sourcePath in Directory.EnumerateFiles(sourceDirectory, "*", SearchOption.AllDirectories))
-        {
-            var relativePath = Path.GetRelativePath(sourceDirectory, sourcePath);
-            var destinationPath = Path.Combine(destinationDirectory, relativePath);
-            Directory.CreateDirectory(Path.GetDirectoryName(destinationPath)!);
-            File.Copy(sourcePath, destinationPath, overwrite: true);
-        }
-    }
-
     private static bool IsSamePath(string left, string right)
     {
         if (string.IsNullOrWhiteSpace(left) || string.IsNullOrWhiteSpace(right))
@@ -2542,8 +2240,7 @@ private static bool IsKnownReleasePath(string path)
             return false;
 
         return IsPathUnder(path, Path.Combine(AppContext.BaseDirectory, "WebService")) ||
-               IsPathUnder(path, MagnetarPaths.GetQuasarManagedWebServiceDirectory()) ||
-               IsPathUnder(path, MagnetarPaths.GetQuasarStagingDirectory());
+               IsPathUnder(path, MagnetarPaths.GetQuasarManagedWebServiceDirectory());
     }
 
     private static bool IsPathUnder(string path, string root)
diff --git a/Quasar/Components/Pages/Backup.razor b/Quasar/Components/Pages/Backup.razor
index 2e2b90e2..b5ed8450 100644
--- a/Quasar/Components/Pages/Backup.razor
+++ b/Quasar/Components/Pages/Backup.razor
@@ -84,8 +84,8 @@
                     
                         Same major.minor version restores in full; patch versions are compatible both ways.
                     
-                    
-                        Older backups are upgraded through a forward migration path when one is available.
+                    
+                        Restoring a backup from an older major.minor version is not supported.
                     
                     
                         Restoring a backup from a newer major.minor version is not supported (no downgrade).
diff --git a/Quasar/Components/Pages/CreateWorldSaveFromTemplateDialog.razor b/Quasar/Components/Pages/CreateWorldSaveFromTemplateDialog.razor
index ab3fc8b7..8d062ff6 100644
--- a/Quasar/Components/Pages/CreateWorldSaveFromTemplateDialog.razor
+++ b/Quasar/Components/Pages/CreateWorldSaveFromTemplateDialog.razor
@@ -113,9 +113,9 @@
             template = importResult.Template;
             configProfileId = importResult.ConfigProfileId;
         }
-        else if (result.Data is QuasarWorldTemplate legacyTemplate)
+        else if (result.Data is QuasarWorldTemplate selectedTemplate)
         {
-            template = legacyTemplate;
+            template = selectedTemplate;
         }
 
         if (template is null)
diff --git a/Quasar/Models/QuasarBackupSettings.cs b/Quasar/Models/QuasarBackupSettings.cs
index 8c6ef3c0..0cd741d5 100644
--- a/Quasar/Models/QuasarBackupSettings.cs
+++ b/Quasar/Models/QuasarBackupSettings.cs
@@ -87,19 +87,6 @@ public sealed class QuasarBackupSettings
 
     public QuasarBackupRuleSettings World { get; set; } = new();
 
-    // Legacy flat settings kept for reading old backup-settings.json files.
-    public bool? Enabled { get; set; }
-
-    public BackupFrequency? Frequency { get; set; }
-
-    public TimeOnly? TimeOfDay { get; set; }
-
-    public DayOfWeek? DayOfWeek { get; set; }
-
-    public int? RetentionCount { get; set; }
-
-    public DateTimeOffset? LastBackupUtc { get; set; }
-
     public QuasarBackupSettings Clone()
     {
         return new QuasarBackupSettings
@@ -115,30 +102,9 @@ public static QuasarBackupSettings Normalize(QuasarBackupSettings? settings)
     {
         settings ??= new QuasarBackupSettings();
 
-        var useLegacyConfiguration =
-            settings.Configuration is null ||
-            settings.Enabled.HasValue ||
-            settings.LastBackupUtc is not null ||
-            settings.Frequency.HasValue ||
-            settings.TimeOfDay.HasValue ||
-            settings.DayOfWeek.HasValue ||
-            settings.RetentionCount.HasValue;
-
-        var configuration = useLegacyConfiguration
-            ? QuasarBackupRuleSettings.Normalize(new QuasarBackupRuleSettings
-            {
-                Enabled = settings.Enabled ?? false,
-                Frequency = settings.Frequency ?? BackupFrequency.Daily,
-                TimeOfDay = settings.TimeOfDay ?? new TimeOnly(3, 0),
-                DayOfWeek = settings.DayOfWeek ?? System.DayOfWeek.Sunday,
-                RetentionCount = settings.RetentionCount ?? DefaultRetentionCount,
-                LastBackupUtc = settings.LastBackupUtc,
-            })
-            : QuasarBackupRuleSettings.Normalize(settings.Configuration);
-
         return new QuasarBackupSettings
         {
-            Configuration = configuration,
+            Configuration = QuasarBackupRuleSettings.Normalize(settings.Configuration),
             Server = QuasarBackupRuleSettings.Normalize(settings.Server),
             World = QuasarBackupRuleSettings.Normalize(settings.World),
         };
diff --git a/Quasar/Services/Backup/BackupCompatibility.cs b/Quasar/Services/Backup/BackupCompatibility.cs
index 8a2f47c2..65ffec84 100644
--- a/Quasar/Services/Backup/BackupCompatibility.cs
+++ b/Quasar/Services/Backup/BackupCompatibility.cs
@@ -1,15 +1,14 @@
 namespace Quasar.Services.Backup;
 
 /// Result of checking a backup's version against the running Quasar.
-public readonly record struct BackupCompatibilityResult(bool Allowed, bool MigrationRequired, string Reason);
+public readonly record struct BackupCompatibilityResult(bool Allowed, string Reason);
 
 /// 
 /// Applies the semantic-versioning rules that govern whether a backup may be
 /// restored into the running Quasar:
 /// 
 ///   Same Major.Minor — always allowed; patch may differ either direction.
-///   Older Major.Minor — allowed only if a forward migration path exists
-///         (see ); otherwise rejected.
+///   Older Major.Minor — rejected.
 ///   Newer Major.Minor — rejected (no cross-Major.Minor downgrade).
 /// 
 /// 
@@ -18,29 +17,25 @@ public static class BackupCompatibility
     public static BackupCompatibilityResult Evaluate(string? backupVersion, string? runningVersion)
     {
         if (!TryParse(backupVersion, out var backup))
-            return new BackupCompatibilityResult(false, false, $"The backup version '{backupVersion}' is not recognized.");
+            return new BackupCompatibilityResult(false, $"The backup version '{backupVersion}' is not recognized.");
 
         if (!TryParse(runningVersion, out var running))
-            return new BackupCompatibilityResult(false, false, $"The running Quasar version '{runningVersion}' is not recognized.");
+            return new BackupCompatibilityResult(false, $"The running Quasar version '{runningVersion}' is not recognized.");
 
         var comparison = CompareMajorMinor(backup, running);
         if (comparison == 0)
-            return new BackupCompatibilityResult(true, false, "Same major.minor version — fully compatible.");
+            return new BackupCompatibilityResult(true, "Same major.minor version — fully compatible.");
 
         if (comparison > 0)
         {
-            return new BackupCompatibilityResult(false, false,
+            return new BackupCompatibilityResult(false,
                 $"Cannot restore a backup from a newer Quasar ({backup.Major}.{backup.Minor}) into this older one " +
                 $"({running.Major}.{running.Minor}). Downgrading across major.minor versions is not supported.");
         }
 
-        // Backup is from an older major.minor — a forward migration path is required.
-        if (BackupFormatMigrations.CanMigrate(backup, running))
-            return new BackupCompatibilityResult(true, true, "An upgrade path is available for this older backup.");
-
-        return new BackupCompatibilityResult(false, false,
-            $"Restoring a backup from {backup.Major}.{backup.Minor} into {running.Major}.{running.Minor} requires a " +
-            "settings upgrade that is not available yet.");
+        return new BackupCompatibilityResult(false,
+            $"Restoring a backup from older Quasar {backup.Major}.{backup.Minor} into {running.Major}.{running.Minor} " +
+            "is not supported.");
     }
 
     /// Compares two versions by Major then Minor only (patch is ignored).
diff --git a/Quasar/Services/Backup/BackupFormatMigrations.cs b/Quasar/Services/Backup/BackupFormatMigrations.cs
deleted file mode 100644
index 62df15a1..00000000
--- a/Quasar/Services/Backup/BackupFormatMigrations.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-namespace Quasar.Services.Backup;
-
-/// 
-/// Registry of forward upgrade steps that migrate backup contents from one
-/// major.minor release to the next. Restores across an incompatible
-/// major.minor boundary chain these steps from the backup's version up to the
-/// running version.
-/// 
-/// No migrations exist yet — today's backups carry the same data structures as
-/// the code that reads them, so only same-major.minor restores are accepted.
-/// When a future release changes a persisted structure, add a
-///  from the last minor release to the new one
-/// here, and teach  to apply the chain while
-/// extracting.
-/// 
-/// 
-public static class BackupFormatMigrations
-{
-    /// A single hop that upgrades backup data from  to  (major.minor).
-    public sealed record BackupMigrationStep(Version From, Version To);
-
-    /// Ordered, contiguous upgrade steps. Empty until the first breaking change ships.
-    public static IReadOnlyList Steps { get; } = Array.Empty();
-
-    /// 
-    /// True when a contiguous chain of  upgrades a backup taken at
-    ///  up to  (compared by major.minor).
-    /// 
-    public static bool CanMigrate(Version backupVersion, Version runningVersion)
-    {
-        var current = new Version(backupVersion.Major, backupVersion.Minor);
-        var target = new Version(runningVersion.Major, runningVersion.Minor);
-
-        // Walk the registered steps, advancing as long as one continues the chain.
-        var advanced = true;
-        while (advanced && BackupCompatibility.CompareMajorMinor(current, target) < 0)
-        {
-            advanced = false;
-            foreach (var step in Steps)
-            {
-                if (BackupCompatibility.CompareMajorMinor(step.From, current) == 0)
-                {
-                    current = new Version(step.To.Major, step.To.Minor);
-                    advanced = true;
-                    break;
-                }
-            }
-        }
-
-        return BackupCompatibility.CompareMajorMinor(current, target) == 0;
-    }
-}
diff --git a/Quasar/Services/BrandingService.cs b/Quasar/Services/BrandingService.cs
index 8d2b133f..81becae4 100644
--- a/Quasar/Services/BrandingService.cs
+++ b/Quasar/Services/BrandingService.cs
@@ -29,15 +29,10 @@ public sealed class BrandingService : IDisposable
     private FileSystemWatcher? _watcher;
     private CancellationTokenSource? _reloadDebounce;
 
-    public BrandingService(ILogger logger, IWebHostEnvironment environment)
+    public BrandingService(ILogger logger)
     {
         _logger = logger;
-
-        var legacyWebRootPath = string.IsNullOrWhiteSpace(environment.WebRootPath)
-            ? Path.Combine(environment.ContentRootPath, "wwwroot")
-            : environment.WebRootPath;
         _brandingAssetsDirectory = MagnetarPaths.GetQuasarBrandingDirectory();
-        MigrateLegacyBrandingAssets(Path.Combine(legacyWebRootPath, "branding"));
 
         _settings = LoadSettings();
         _snapshot = CreateSnapshot(_settings);
@@ -179,34 +174,6 @@ private void RemoveExistingAssets(string baseName)
         }
     }
 
-    private void MigrateLegacyBrandingAssets(string legacyDirectory)
-    {
-        try
-        {
-            if (string.IsNullOrWhiteSpace(legacyDirectory) ||
-                !Directory.Exists(legacyDirectory) ||
-                string.Equals(
-                    Path.GetFullPath(legacyDirectory),
-                    Path.GetFullPath(_brandingAssetsDirectory),
-                    StringComparison.OrdinalIgnoreCase))
-            {
-                return;
-            }
-
-            Directory.CreateDirectory(_brandingAssetsDirectory);
-            foreach (var legacyPath in Directory.EnumerateFiles(legacyDirectory, "*", SearchOption.TopDirectoryOnly))
-            {
-                var destination = Path.Combine(_brandingAssetsDirectory, Path.GetFileName(legacyPath));
-                if (!File.Exists(destination))
-                    File.Copy(legacyPath, destination);
-            }
-        }
-        catch (Exception exception)
-        {
-            _logger.LogWarning(exception, "Failed migrating legacy branding assets from {Path}.", legacyDirectory);
-        }
-    }
-
     private static string NormalizeExtension(string extension)
     {
         if (string.IsNullOrWhiteSpace(extension))
diff --git a/Quasar/Services/DedicatedServerCatalog.cs b/Quasar/Services/DedicatedServerCatalog.cs
index 2ffa6775..73c7ccdc 100644
--- a/Quasar/Services/DedicatedServerCatalog.cs
+++ b/Quasar/Services/DedicatedServerCatalog.cs
@@ -181,26 +181,6 @@ private List LoadServers()
             if (definition is null)
                 return null;
 
-            using var document = JsonDocument.Parse(json);
-            var root = document.RootElement;
-            var rewriteDefinition = false;
-            var hasWorldSaveName = root.TryGetProperty("worldSaveName", out var worldSaveName) &&
-                                   worldSaveName.ValueKind == JsonValueKind.String;
-            if (!hasWorldSaveName)
-                rewriteDefinition = TryMigrateLegacyWorldPath(definition);
-
-            var hasLegacyWorldTemplateId = root.TryGetProperty("worldProfileId", out var legacyWorldProfileId);
-            if (string.IsNullOrWhiteSpace(definition.WorldTemplateId) &&
-                hasLegacyWorldTemplateId &&
-                legacyWorldProfileId.ValueKind == JsonValueKind.String)
-            {
-                definition.WorldTemplateId = legacyWorldProfileId.GetString() ?? string.Empty;
-                rewriteDefinition = true;
-            }
-
-            if (rewriteDefinition)
-                RewriteLegacyServerDefinition(path, definition);
-
             return definition;
         }
         catch (Exception exception)
@@ -210,12 +190,6 @@ private List LoadServers()
         }
     }
 
-    private static void RewriteLegacyServerDefinition(string path, DedicatedServerDefinition definition)
-    {
-        var json = JsonSerializer.Serialize(definition, JsonOptions);
-        WriteTextReplacing(path, json);
-    }
-
     private async Task SaveServerAsync(DedicatedServerDefinition definition, CancellationToken cancellationToken)
     {
         definition.UpdatedAtUtc = DateTimeOffset.UtcNow;
@@ -272,13 +246,6 @@ private static DedicatedServerDefinition Normalize(DedicatedServerDefinition ser
         server.WorldPath = string.IsNullOrWhiteSpace(server.WorldPath)
             ? Path.Combine(server.DedicatedServerAppDataPath, "Saves")
             : server.WorldPath.Trim();
-        if (string.IsNullOrWhiteSpace(server.WorldSaveName) &&
-            LooksLikeWorldSavePath(server.WorldPath) &&
-            TrySplitWorldSavePath(server.WorldPath, out var savesPath, out var saveName))
-        {
-            server.WorldPath = savesPath;
-            server.WorldSaveName = saveName;
-        }
         server.WorldSaveName = NormalizeWorldSaveName(server.WorldSaveName);
         server.ConfigFilePath = string.IsNullOrWhiteSpace(server.ConfigFilePath)
             ? Path.Combine(server.DedicatedServerAppDataPath, "SpaceEngineers-Dedicated.cfg")
@@ -423,75 +390,6 @@ private static bool IsValidWorldSaveName(string value)
         return value.IndexOfAny(Path.GetInvalidFileNameChars()) < 0;
     }
 
-    private static bool TryMigrateLegacyWorldPath(DedicatedServerDefinition definition)
-    {
-        if (string.IsNullOrWhiteSpace(definition.WorldPath))
-            return false;
-
-        return TrySplitWorldSavePath(definition.WorldPath, out var savesPath, out var saveName) &&
-               ApplyWorldPathSplit(definition, savesPath, saveName);
-    }
-
-    private static bool LooksLikeWorldSavePath(string path)
-    {
-        if (string.IsNullOrWhiteSpace(path))
-            return false;
-
-        var candidate = path.Trim();
-        if (File.Exists(candidate))
-        {
-            return string.Equals(Path.GetFileName(candidate), "Sandbox.sbc", StringComparison.OrdinalIgnoreCase);
-        }
-
-        return File.Exists(Path.Combine(candidate, "Sandbox.sbc"));
-    }
-
-    private static bool TrySplitWorldSavePath(string path, out string savesPath, out string saveName)
-    {
-        savesPath = string.Empty;
-        saveName = string.Empty;
-
-        var candidate = path.Trim();
-        if (string.IsNullOrWhiteSpace(candidate))
-            return false;
-
-        if (File.Exists(candidate) &&
-            string.Equals(Path.GetFileName(candidate), "Sandbox.sbc", StringComparison.OrdinalIgnoreCase))
-        {
-            candidate = Path.GetDirectoryName(candidate) ?? string.Empty;
-        }
-
-        candidate = candidate.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
-        if (string.IsNullOrWhiteSpace(candidate))
-            return false;
-
-        var parent = Path.GetDirectoryName(candidate);
-        var name = Path.GetFileName(candidate);
-        if (string.IsNullOrWhiteSpace(parent) ||
-            string.IsNullOrWhiteSpace(name) ||
-            !IsValidWorldSaveName(name))
-        {
-            return false;
-        }
-
-        savesPath = parent;
-        saveName = name;
-        return true;
-    }
-
-    private static bool ApplyWorldPathSplit(DedicatedServerDefinition definition, string savesPath, string saveName)
-    {
-        if (string.Equals(definition.WorldPath?.Trim(), savesPath, StringComparison.Ordinal) &&
-            string.Equals(definition.WorldSaveName?.Trim(), saveName, StringComparison.Ordinal))
-        {
-            return false;
-        }
-
-        definition.WorldPath = savesPath;
-        definition.WorldSaveName = saveName;
-        return true;
-    }
-
     /// 
     /// Derives a unique-name slug from the supplied text, appending a "-N" suffix when
     /// needed so it does not collide with an existing server (in memory or on disk).
@@ -675,11 +573,4 @@ private static string CreateSnapshot(IEnumerable serv
         return JsonSerializer.Serialize(normalized, JsonOptions);
     }
 
-    private static void WriteTextReplacing(string path, string content)
-    {
-        Directory.CreateDirectory(Path.GetDirectoryName(path)!);
-        var tempPath = $"{path}.{Guid.NewGuid():N}.tmp";
-        File.WriteAllText(tempPath, content);
-        File.Move(tempPath, path, overwrite: true);
-    }
 }
diff --git a/Quasar/Services/GitHubUpdateCredentialsCatalog.cs b/Quasar/Services/GitHubUpdateCredentialsCatalog.cs
index eea6acbc..c4b2ecfd 100644
--- a/Quasar/Services/GitHubUpdateCredentialsCatalog.cs
+++ b/Quasar/Services/GitHubUpdateCredentialsCatalog.cs
@@ -32,12 +32,9 @@ public GitHubUpdateCredentialsCatalog(
     {
         _logger = logger;
         _protector = dataProtectionProvider.CreateProtector(DataProtectionPurpose);
-        _credentials = LoadCredentials(out var requiresMigration);
+        _credentials = LoadCredentials();
         _snapshot = CreateSnapshot(_credentials);
 
-        if (requiresMigration)
-            _ = MigrateLegacyPlaintextAsync();
-
         StartWatching();
     }
 
@@ -92,9 +89,8 @@ public void Dispose()
         _reloadDebounce?.Dispose();
     }
 
-    private GitHubUpdateCredentials LoadCredentials(out bool requiresMigration)
+    private GitHubUpdateCredentials LoadCredentials()
     {
-        requiresMigration = false;
         var path = MagnetarPaths.GetQuasarGitHubUpdateCredentialsPath();
 
         try
@@ -107,8 +103,7 @@ private GitHubUpdateCredentials LoadCredentials(out bool requiresMigration)
             if (persisted is null)
                 return GitHubUpdateCredentials.Normalize(null);
 
-            var credentials = persisted.ToCredentials(_protector, _logger, out var migrated);
-            requiresMigration = migrated;
+            var credentials = persisted.ToCredentials(_protector, _logger);
             return GitHubUpdateCredentials.Normalize(credentials);
         }
         catch (Exception exception)
@@ -118,25 +113,6 @@ private GitHubUpdateCredentials LoadCredentials(out bool requiresMigration)
         }
     }
 
-    private async Task MigrateLegacyPlaintextAsync()
-    {
-        try
-        {
-            GitHubUpdateCredentials snapshot;
-            lock (_sync)
-            {
-                snapshot = _credentials.Clone();
-            }
-
-            await SaveAsync(snapshot).ConfigureAwait(false);
-            _logger.LogInformation("Migrated legacy plaintext GitHub update credentials to protected storage.");
-        }
-        catch (Exception exception)
-        {
-            _logger.LogWarning(exception, "Failed migrating legacy plaintext GitHub update credentials.");
-        }
-    }
-
     private void StartWatching()
     {
         var path = MagnetarPaths.GetQuasarGitHubUpdateCredentialsPath();
@@ -197,7 +173,7 @@ private void ScheduleReload()
 
     private void ReloadFromDisk()
     {
-        var reloaded = LoadCredentials(out var requiresMigration);
+        var reloaded = LoadCredentials();
         var snapshot = CreateSnapshot(reloaded);
         var changed = false;
 
@@ -211,9 +187,6 @@ private void ReloadFromDisk()
             }
         }
 
-        if (requiresMigration)
-            _ = MigrateLegacyPlaintextAsync();
-
         if (!changed)
             return;
 
@@ -246,9 +219,6 @@ private sealed class PersistedCredentials
     {
         public string? ProtectedToken { get; set; }
 
-        // Legacy plaintext field, read-only for migration if early builds wrote it.
-        public string? Token { get; set; }
-
         public static PersistedCredentials FromCredentials(GitHubUpdateCredentials credentials, IDataProtector protector)
         {
             var token = credentials.Token;
@@ -260,11 +230,8 @@ public static PersistedCredentials FromCredentials(GitHubUpdateCredentials crede
 
         public GitHubUpdateCredentials ToCredentials(
             IDataProtector protector,
-            ILogger logger,
-            out bool migratedFromPlaintext)
+            ILogger logger)
         {
-            migratedFromPlaintext = false;
-
             if (!string.IsNullOrWhiteSpace(ProtectedToken))
             {
                 try
@@ -283,15 +250,6 @@ public GitHubUpdateCredentials ToCredentials(
                 }
             }
 
-            if (!string.IsNullOrWhiteSpace(Token))
-            {
-                migratedFromPlaintext = true;
-                return new GitHubUpdateCredentials
-                {
-                    Token = Token,
-                };
-            }
-
             return new GitHubUpdateCredentials();
         }
     }
diff --git a/Quasar/Services/ManagedDedicatedServerRuntimeResolver.cs b/Quasar/Services/ManagedDedicatedServerRuntimeResolver.cs
index 8bb46ff2..387c3664 100644
--- a/Quasar/Services/ManagedDedicatedServerRuntimeResolver.cs
+++ b/Quasar/Services/ManagedDedicatedServerRuntimeResolver.cs
@@ -760,8 +760,8 @@ private string ResolveInstalledMagnetarPath()
             if (File.Exists(interimPath))
                 return interimPath;
 
-            var legacyPath = Path.Combine(_options.MagnetarInstallDirectory, GetWindowsMagnetarLauncherFileName(ManagedServerRuntime.NetFramework48));
-            return File.Exists(legacyPath) ? legacyPath : string.Empty;
+            var netFrameworkPath = Path.Combine(_options.MagnetarInstallDirectory, GetWindowsMagnetarLauncherFileName(ManagedServerRuntime.NetFramework48));
+            return File.Exists(netFrameworkPath) ? netFrameworkPath : string.Empty;
         }
 
         return FindImmediateFile(Path.Combine(_options.MagnetarInstallDirectory, "Bin"), MagnetarLauncherFileNames) ?? string.Empty;
diff --git a/Quasar/Services/QuasarWorldTemplateCatalog.cs b/Quasar/Services/QuasarWorldTemplateCatalog.cs
index 32b6bb71..7f810735 100644
--- a/Quasar/Services/QuasarWorldTemplateCatalog.cs
+++ b/Quasar/Services/QuasarWorldTemplateCatalog.cs
@@ -23,7 +23,6 @@ public sealed class QuasarWorldTemplateCatalog : IDisposable
     public QuasarWorldTemplateCatalog(ILogger logger)
     {
         _logger = logger;
-        MigrateLegacyStorage();
         _templates = LoadTemplates();
         _snapshot = CreateSnapshot(_templates);
         StartWatching();
@@ -163,7 +162,6 @@ private List LoadTemplates()
 
             return Directory
                 .GetFiles(directory, "template.json", SearchOption.AllDirectories)
-                .Concat(Directory.GetFiles(directory, "profile.json", SearchOption.AllDirectories))
                 .Distinct(StringComparer.OrdinalIgnoreCase)
                 .OrderBy(path => path, StringComparer.OrdinalIgnoreCase)
                 .Select(LoadTemplate)
@@ -184,19 +182,8 @@ private List LoadTemplates()
         {
             var json = File.ReadAllText(path);
             var template = JsonSerializer.Deserialize(json, JsonOptions) ?? new QuasarWorldTemplate();
-            using var document = JsonDocument.Parse(json);
-            var root = document.RootElement;
             var pathTemplateId = GetTemplateIdFromDefinitionPath(path);
 
-            if (TryGetString(root, "worldTemplateId", out var storedId))
-            {
-                template.WorldTemplateId = storedId;
-            }
-            else if (TryGetString(root, "worldProfileId", out var legacyId))
-            {
-                template.WorldTemplateId = legacyId;
-            }
-
             if (!string.IsNullOrWhiteSpace(pathTemplateId))
                 template.WorldTemplateId = pathTemplateId;
 
@@ -379,104 +366,6 @@ private static string CreateSnapshot(IEnumerable templates)
         return JsonSerializer.Serialize(normalized, JsonOptions);
     }
 
-    private void MigrateLegacyStorage()
-    {
-        var currentDirectory = MagnetarPaths.GetQuasarWorldTemplatesDirectory();
-        var legacyDirectory = MagnetarPaths.GetLegacyQuasarWorldProfilesDirectory();
-
-        try
-        {
-            if (Directory.Exists(legacyDirectory) && !Directory.Exists(currentDirectory))
-            {
-                Directory.CreateDirectory(Path.GetDirectoryName(currentDirectory)!);
-                Directory.Move(legacyDirectory, currentDirectory);
-                _logger.LogInformation("Migrated Quasar world templates from {LegacyPath} to {Path}.", legacyDirectory, currentDirectory);
-            }
-            else if (Directory.Exists(legacyDirectory) && Directory.Exists(currentDirectory))
-            {
-                foreach (var legacyTemplateDirectory in Directory.GetDirectories(legacyDirectory))
-                {
-                    var targetDirectory = Path.Combine(currentDirectory, Path.GetFileName(legacyTemplateDirectory));
-                    if (!Directory.Exists(targetDirectory))
-                        Directory.Move(legacyTemplateDirectory, targetDirectory);
-                }
-            }
-
-            if (Directory.Exists(currentDirectory))
-            {
-                RenameLegacyTemplateDefinitions(currentDirectory);
-                RewriteLegacyTemplateDefinitions(currentDirectory);
-            }
-        }
-        catch (Exception exception)
-        {
-            _logger.LogWarning(exception, "Failed migrating legacy Quasar world template storage.");
-        }
-    }
-
-    private static void RenameLegacyTemplateDefinitions(string directory)
-    {
-        foreach (var legacyDefinitionPath in Directory.GetFiles(directory, "profile.json", SearchOption.AllDirectories))
-        {
-            var newDefinitionPath = Path.Combine(Path.GetDirectoryName(legacyDefinitionPath)!, "template.json");
-            if (File.Exists(newDefinitionPath))
-                continue;
-
-            File.Move(legacyDefinitionPath, newDefinitionPath);
-        }
-    }
-
-    private static void RewriteLegacyTemplateDefinitions(string directory)
-    {
-        foreach (var definitionPath in Directory.GetFiles(directory, "template.json", SearchOption.AllDirectories))
-        {
-            var json = File.ReadAllText(definitionPath);
-            using var document = JsonDocument.Parse(json);
-            var root = document.RootElement;
-            var pathTemplateId = GetTemplateIdFromDefinitionPath(definitionPath);
-            var hasWorldTemplateId = TryGetString(root, "worldTemplateId", out var storedId);
-            var hasLegacyWorldTemplateId = TryGetString(root, "worldProfileId", out var legacyId);
-
-            if (hasWorldTemplateId &&
-                !hasLegacyWorldTemplateId &&
-                string.Equals(storedId, pathTemplateId, StringComparison.OrdinalIgnoreCase))
-            {
-                continue;
-            }
-
-            var template = JsonSerializer.Deserialize(json, JsonOptions) ?? new QuasarWorldTemplate();
-            template.WorldTemplateId = !string.IsNullOrWhiteSpace(pathTemplateId)
-                ? pathTemplateId
-                : hasLegacyWorldTemplateId
-                    ? legacyId
-                    : template.WorldTemplateId;
-
-            var rewrittenJson = JsonSerializer.Serialize(Normalize(template), JsonOptions);
-            WriteTextReplacing(definitionPath, rewrittenJson);
-        }
-    }
-
     private static string GetTemplateIdFromDefinitionPath(string definitionPath) =>
         Path.GetFileName(Path.GetDirectoryName(definitionPath)) ?? string.Empty;
-
-    private static void WriteTextReplacing(string path, string content)
-    {
-        Directory.CreateDirectory(Path.GetDirectoryName(path)!);
-        var tempPath = $"{path}.{Guid.NewGuid():N}.tmp";
-        File.WriteAllText(tempPath, content);
-        File.Move(tempPath, path, overwrite: true);
-    }
-
-    private static bool TryGetString(JsonElement element, string propertyName, out string value)
-    {
-        value = string.Empty;
-        if (!element.TryGetProperty(propertyName, out var property) ||
-            property.ValueKind != JsonValueKind.String)
-        {
-            return false;
-        }
-
-        value = property.GetString() ?? string.Empty;
-        return !string.IsNullOrWhiteSpace(value);
-    }
 }
diff --git a/Quasar/Services/SteamWorkshopCredentialsCatalog.cs b/Quasar/Services/SteamWorkshopCredentialsCatalog.cs
index 01fe678f..c4da915e 100644
--- a/Quasar/Services/SteamWorkshopCredentialsCatalog.cs
+++ b/Quasar/Services/SteamWorkshopCredentialsCatalog.cs
@@ -32,12 +32,9 @@ public SteamWorkshopCredentialsCatalog(
     {
         _logger = logger;
         _protector = dataProtectionProvider.CreateProtector(DataProtectionPurpose);
-        _credentials = LoadCredentials(out var requiresMigration);
+        _credentials = LoadCredentials();
         _snapshot = CreateSnapshot(_credentials);
 
-        if (requiresMigration)
-            _ = MigrateLegacyPlaintextAsync();
-
         StartWatching();
     }
 
@@ -89,9 +86,8 @@ public void Dispose()
         _reloadDebounce?.Dispose();
     }
 
-    private SteamWorkshopCredentials LoadCredentials(out bool requiresMigration)
+    private SteamWorkshopCredentials LoadCredentials()
     {
-        requiresMigration = false;
         var path = MagnetarPaths.GetQuasarWorkshopOptionsPath();
 
         try
@@ -104,8 +100,7 @@ private SteamWorkshopCredentials LoadCredentials(out bool requiresMigration)
             if (persisted is null)
                 return SteamWorkshopCredentials.Normalize(null);
 
-            var credentials = persisted.ToCredentials(_protector, _logger, out var migrated);
-            requiresMigration = migrated;
+            var credentials = persisted.ToCredentials(_protector, _logger);
             return SteamWorkshopCredentials.Normalize(credentials);
         }
         catch (Exception exception)
@@ -115,25 +110,6 @@ private SteamWorkshopCredentials LoadCredentials(out bool requiresMigration)
         }
     }
 
-    private async Task MigrateLegacyPlaintextAsync()
-    {
-        try
-        {
-            SteamWorkshopCredentials snapshot;
-            lock (_sync)
-            {
-                snapshot = _credentials.Clone();
-            }
-
-            await SaveAsync(snapshot).ConfigureAwait(false);
-            _logger.LogInformation("Migrated legacy plaintext Steam Workshop credentials to protected storage.");
-        }
-        catch (Exception exception)
-        {
-            _logger.LogWarning(exception, "Failed migrating legacy plaintext Steam Workshop credentials.");
-        }
-    }
-
     private void StartWatching()
     {
         var path = MagnetarPaths.GetQuasarWorkshopOptionsPath();
@@ -194,7 +170,7 @@ private void ScheduleReload()
 
     private void ReloadFromDisk()
     {
-        var reloaded = LoadCredentials(out var requiresMigration);
+        var reloaded = LoadCredentials();
         var snapshot = CreateSnapshot(reloaded);
         var changed = false;
 
@@ -208,9 +184,6 @@ private void ReloadFromDisk()
             }
         }
 
-        if (requiresMigration)
-            _ = MigrateLegacyPlaintextAsync();
-
         if (!changed)
             return;
 
@@ -243,10 +216,6 @@ private sealed class PersistedCredentials
     {
         public string? ProtectedWebApiKey { get; set; }
 
-        // Legacy plaintext field — read-only for backward compatibility.
-        // New writes only emit ProtectedWebApiKey.
-        public string? WebApiKey { get; set; }
-
         public static PersistedCredentials FromCredentials(SteamWorkshopCredentials credentials, IDataProtector protector)
         {
             var key = credentials.WebApiKey;
@@ -258,11 +227,8 @@ public static PersistedCredentials FromCredentials(SteamWorkshopCredentials cred
 
         public SteamWorkshopCredentials ToCredentials(
             IDataProtector protector,
-            ILogger logger,
-            out bool migratedFromPlaintext)
+            ILogger logger)
         {
-            migratedFromPlaintext = false;
-
             if (!string.IsNullOrWhiteSpace(ProtectedWebApiKey))
             {
                 try
@@ -281,15 +247,6 @@ public SteamWorkshopCredentials ToCredentials(
                 }
             }
 
-            if (!string.IsNullOrWhiteSpace(WebApiKey))
-            {
-                migratedFromPlaintext = true;
-                return new SteamWorkshopCredentials
-                {
-                    WebApiKey = WebApiKey,
-                };
-            }
-
             return new SteamWorkshopCredentials();
         }
     }
diff --git a/Quasar/wwwroot/quasar-configs.js b/Quasar/wwwroot/quasar-configs.js
index f63ed1bb..f0c6d90b 100644
--- a/Quasar/wwwroot/quasar-configs.js
+++ b/Quasar/wwwroot/quasar-configs.js
@@ -566,7 +566,7 @@ window.quasarConfigs = window.quasarConfigs || {
                 await navigator.clipboard.writeText(text);
                 return true;
             }
-        } catch (e) { /* fall through to legacy path */ }
+        } catch (e) { /* fall through to fallback path */ }
         // Fallback for non-secure contexts (HTTP LAN access)
         try {
             const ta = document.createElement("textarea");
diff --git a/whitelabel-theme-configurator.md b/whitelabel-theme-configurator.md
index bdd96b20..6bca9830 100644
--- a/whitelabel-theme-configurator.md
+++ b/whitelabel-theme-configurator.md
@@ -175,8 +175,8 @@ Add two methods after `GetQuasarDiscordOptionsPath()`:
 public static string GetQuasarBrandingPath() =>
     Path.Combine(GetQuasarDirectory(), "branding.json");
 
-public static string GetQuasarBrandingDirectory(string webRootPath) =>
-    Path.Combine(webRootPath, "branding");
+public static string GetQuasarBrandingDirectory() =>
+    Path.Combine(GetQuasarDirectory(), "Branding");
 ```
 
 ### 7. `Quasar/Services/ThemePreferenceService.cs`

From 085e28fc4f26835616fc87a7bcf84d5454fcdf9c Mon Sep 17 00:00:00 2001
From: Owen de Bree 
Date: Sun, 5 Jul 2026 16:10:32 +0200
Subject: [PATCH 2/3] fix: drain shutdown and unify install root

Make Shutdown Quasar drain Bootstrap instead of asking systemd to stop the unit or letting the worker respawn.

Use QUASAR_INSTALL_DIR as the single Quasar root, remove QUASAR_DATA_DIR and --data-dir, and update installers plus docs for the unified layout.
---
 Docs/BuildingAndDevelopment.md                |  16 +-
 Docs/Configuration.md                         |  30 ++-
 Docs/LinuxDeploymentAndUpdates.md             |  61 +++---
 Docs/QuasarArchitecture.md                    |   8 +-
 Docs/QuasarPluginSystem.md                    |  20 +-
 Docs/QuickStart.md                            |  21 ++-
 Docs/StateMachines/SelfUpdateAndRelease.md    |   3 +
 .../diagrams/bootstrap-cutover.mmd            |   2 +
 .../diagrams/bootstrap-cutover.png            | Bin 114620 -> 117203 bytes
 Docs/WindowsDeploymentAndUpdates.md           |  11 +-
 Magnetar.Protocol/Runtime/MagnetarPaths.cs    |  14 +-
 Quasar.Bootstrap/Program.cs                   | 156 +++++++++++++--
 Quasar/Components/Layout/MainLayout.razor     |   2 +-
 .../Layout/QuasarControlDialog.razor          |   6 +-
 Quasar/Components/Pages/Backup.razor          |   2 +-
 .../Pages/SteamWorkshopApiKeyDialog.razor     |   8 +-
 Quasar/Models/QuasarBackupSettings.cs         |   2 +-
 Quasar/Program.cs                             |   4 +-
 Quasar/Properties/launchSettings.json         |   1 -
 .../Backup/QuasarBackupSettingsService.cs     |   2 +-
 Quasar/Services/BrandingService.cs            |   4 +-
 .../DedicatedServerRuntimePreparer.cs         |  31 ++-
 .../QuasarUiPluginHubCatalogService.cs        |  56 ++++--
 Quasar/Services/QuasarShutdownService.cs      | 177 +-----------------
 .../Services/Updates/QuasarUpdateService.cs   |  13 +-
 install.sh                                    |  57 +-----
 scripts/generate-analytics-data.py            |  19 +-
 scripts/install.ps1                           |   2 +-
 scripts/readme-install-linux.md               |  19 +-
 scripts/readme-install-windows.md             |  10 +-
 30 files changed, 356 insertions(+), 401 deletions(-)

diff --git a/Docs/BuildingAndDevelopment.md b/Docs/BuildingAndDevelopment.md
index 7f128f91..3f168e67 100644
--- a/Docs/BuildingAndDevelopment.md
+++ b/Docs/BuildingAndDevelopment.md
@@ -22,7 +22,7 @@ utilities. For the runtime design see [Architecture](QuasarArchitecture.md).
   Quasar, Quasar.Agent, and companion plugins.
 - Quasar UI plugins
   Optional UI extensions are discovered through QuasarHub and installed into the
-  Quasar data directory at runtime. Entity Viewer now lives in the external
+  Quasar install directory at runtime. Entity Viewer now lives in the external
   `CometWorks/viewer` repository and is installed as a Quasar UI plugin instead
   of being staged from this repository during the core Quasar build.
 
@@ -119,11 +119,17 @@ For local web UI development, run the worker directly:
 dotnet run --project Quasar/Quasar.csproj
 ```
 
-This uses the development launch profile and the normal Quasar data directory
-(`~/.config/Quasar` on Linux unless `QUASAR_DATA_DIR` is set). The Bootstrap
+This uses the development launch profile. Without `QUASAR_INSTALL_DIR`, the
+direct worker uses its app base directory as the install root. The Bootstrap
 launcher and release/update cutover paths are covered by the packaged installer
 and release workflows rather than a local deploy helper.
 
+To run the UI worker from Rider against an installed service/deployed tree, set
+`QUASAR_INSTALL_DIR` to that Quasar root. The worker launch profile deliberately
+does not set `applicationUrl`, so host/port come from that install root's
+`appsettings.json`. Packaged assets and helper scripts are also probed from the
+same install root.
+
 Generate synthetic analytics data for local testing:
 
 ```bash
@@ -131,8 +137,8 @@ python3 scripts/generate-analytics-data.py
 ```
 
 Optional `--server ` to target one server, `--days `, `--seed `,
-`--raw-hours `, `--raw-interval `. Uses `QUASAR_DATA_DIR`
-automatically if set, otherwise defaults to the local Quasar data root.
+`--raw-hours `, `--raw-interval `. Uses `QUASAR_INSTALL_DIR`
+automatically if set, otherwise defaults to the local Quasar install root.
 
 When refreshing the local graphify graph, prune generic framework plumbing after
 `.graphify_extract.json` is produced and before graph build/report generation:
diff --git a/Docs/Configuration.md b/Docs/Configuration.md
index fbd1ff56..99bd4740 100644
--- a/Docs/Configuration.md
+++ b/Docs/Configuration.md
@@ -71,22 +71,17 @@ Magnetar log file. Auto-refresh and the Refresh button are active only for
 ## Where configuration is read from
 
 Both the **Bootstrap launcher** (`Quasar`/`Quasar.exe`) and the replaceable **web
-worker** read JSON config from these locations, later ones overriding earlier:
-
-1. The install directory `appsettings.json` (next to the executable). Auto-updates
-   preserve this file during Bootstrap self-updates. UI-worker activation updates
-   it from the staged, resolved `appsettings.json` so Bootstrap and the managed
-   worker keep the same base settings.
-2. The Quasar **data directory** `appsettings.json`. Bootstrap uses the install
-   root as the default data directory, so this is normally the same file as item
-   1. Set `QUASAR_DATA_DIR` (or `--data-dir ` on Linux installs) to keep
-   persistent local overrides in a separate directory.
+worker** read JSON config from the Quasar install root. Auto-updates preserve
+`appsettings.json` during Bootstrap self-updates, and UI-worker activation
+updates it from the staged, resolved `appsettings.json` so Bootstrap and the
+managed worker keep the same base settings. Set `QUASAR_INSTALL_DIR` for direct
+worker/dev runs that need to target a deployed Quasar root.
 
 The shipped defaults are defined in [`Quasar/appsettings.json`](../Quasar/appsettings.json).
 
 During UI-worker staging, Quasar performs a three-way merge for `appsettings.json`:
-the previous release base stored under the data directory is the merge base, the
-current install-directory `appsettings.json` supplies local values, and the new
+the previous release base stored under the install root is the merge base, the
+current install-root `appsettings.json` supplies local values, and the new
 release file supplies new defaults. Clean local changes are carried into the
 staged version automatically. If both the local file and the release changed the
 same setting differently, the Updates page shows a conflict editor with
@@ -126,7 +121,7 @@ mounted network share:
 }
 ```
 
-Relative paths are resolved under the Quasar data directory. If the folder is on
+Relative paths are resolved under the Quasar install directory. If the folder is on
 a network share, make sure it is mounted before Quasar starts and that the
 Quasar service account can create, list, read, and delete files in it. Changes
 from the Backup page apply to new stored-backup operations immediately; direct
@@ -304,9 +299,12 @@ trust broad networks unless every host in that range is under your control.
 ### Development port
 
 Running the worker directly with `dotnet run --project Quasar/Quasar.csproj` uses
-[`Quasar/Properties/launchSettings.json`](../Quasar/Properties/launchSettings.json),
-which sets `applicationUrl` to `http://0.0.0.0:8080`. Change `applicationUrl` there
-to use a different port for local `dotnet run` sessions.
+[`Quasar/Properties/launchSettings.json`](../Quasar/Properties/launchSettings.json)
+only for development environment variables. It does not set `applicationUrl`, so
+the worker still reads `Quasar:Host` / `Quasar:Port` from normal configuration.
+Set those values in `QUASAR_INSTALL_DIR/appsettings.json` when running the worker
+from Rider against an installed Quasar root, or use `QUASAR_WEB_HOST`
+/ `QUASAR_WEB_PORT` for a one-off direct-worker override.
 
 ## Browser auto-open on start
 
diff --git a/Docs/LinuxDeploymentAndUpdates.md b/Docs/LinuxDeploymentAndUpdates.md
index af6b4a90..9bef535a 100644
--- a/Docs/LinuxDeploymentAndUpdates.md
+++ b/Docs/LinuxDeploymentAndUpdates.md
@@ -73,11 +73,8 @@ review builds per PR/manual stream.
 ## First Start
 
 The default systemd user service runs Bootstrap from the extracted install root
-and sets `QUASAR_DATA_DIR` to that same directory. It also sets
-`QUASAR_SYSTEMD_SERVICE` and `QUASAR_SYSTEMD_SCOPE` so the web UI's **Shutdown
-Quasar** action can request `systemctl --user stop quasar.service` instead of
-only exiting the launcher. A machine-wide service is still available with
-`install.sh --system`.
+and sets `QUASAR_INSTALL_DIR` to that same directory. A machine-wide service is
+still available with `install.sh --system`.
 
 If Bootstrap has no usable `Updates/active-release.json` and no packaged
 `WebService/Quasar`, it downloads the latest Linux web asset from GitHub,
@@ -101,6 +98,13 @@ it to its own console. For systemd installs, Quasar web UI warnings and errors
 therefore appear in the service journal as well as in the configured Quasar log
 files.
 
+The UI **Shutdown Quasar** action drains the web worker, preserves managed
+servers, and leaves Bootstrap running without a worker. Because Bootstrap is
+still alive and exits successfully only when the service is stopped, systemd does
+not restart the worker by itself. Run `systemctl --user restart quasar.service`
+for the default user service, or `sudo systemctl restart quasar.service` for a
+system service, to start the UI and supervisor again.
+
 ## UI Worker Updates
 
 The running Quasar UI checks GitHub releases every 15 minutes by default. The
@@ -113,9 +117,9 @@ are only queued until the operator stages the selected version. Staging requires
 a matching `SHA256SUMS` entry for the downloaded asset.
 
 Staging also resolves `appsettings.json`. Quasar uses the stored release base in
-the data directory (`$QUASAR_DATA_DIR/Updates/appsettings.base.json`) as the
-merge base, applies local values from the install directory
-(`` by default), and writes the resolved file into the staged worker. If the merge
+the install root (`$QUASAR_INSTALL_DIR/Updates/appsettings.base.json`) as the
+merge base, applies local values from the install directory, and writes the
+resolved file into the staged worker. If the merge
 conflicts, auto-staging stops with a warning and `/settings/updates` shows a
 git-style conflict editor. Resolve and save the JSON there, or choose **Force
 release defaults** to stage the release file without local appsettings values.
@@ -219,26 +223,17 @@ tar -xzf quasar-installer-linux.tar.gz -C ~/.local/share/Quasar --strip-componen
 ```
 
 For extracted release installers, `install.sh` uses the script directory as the
-default install directory and the default Quasar data directory. Source installs
-keep using `~/.local/share/Quasar` as the default install root, with state stored
-there as well. Use `--system` with `sudo` for a machine-wide service,
-`--install-dir ` to copy Quasar elsewhere, or `--data-dir ` to place
-Quasar state elsewhere. The generated service sets `HOME` and `QUASAR_DATA_DIR`
-explicitly so Bootstrap and the worker agree on the update/runtime state root.
-It also records the unit name/scope in `QUASAR_SYSTEMD_SERVICE` and
-`QUASAR_SYSTEMD_SCOPE`; with those set, the UI shutdown button asks systemd to
-stop the installed unit. The
-installer enables the service but does not start or restart it unless `--start`
-is passed; start it later with `systemctl --user restart quasar.service`. When
-installing from source instead of an extracted release archive, the installer
-stamps the launcher with `VERSION`, an exact git tag, or a short commit-derived
-prerelease identity so Bootstrap update comparisons do not fall back to plain
-`1.0.0`.
-
-If a previous `/opt/quasar` system install exists, the new user-mode installer
-installs the new Bootstrap and user service first, then calls the old
-`/opt/quasar/uninstall.sh --purge` through `sudo` to stop and remove the old
-system service and files.
+install root. Source installs keep using `~/.local/share/Quasar` as the default
+install root. Use `--system` with `sudo` for a machine-wide service or
+`--install-dir ` to install Quasar elsewhere. The generated service sets
+`HOME` and `QUASAR_INSTALL_DIR` explicitly so Bootstrap and the worker agree on
+the unified update/runtime state root.
+The installer enables the service but does not start or restart it unless
+`--start` is passed; start it later with
+`systemctl --user restart quasar.service`. When installing from source instead
+of an extracted release archive, the installer stamps the launcher with
+`VERSION`, an exact git tag, or a short commit-derived prerelease identity so
+Bootstrap update comparisons do not fall back to plain `1.0.0`.
 
 Raising managed server priority no longer requires granting `CAP_SYS_NICE` to
 the whole Quasar service. The installer can build and install a narrow setuid
@@ -268,11 +263,9 @@ to remove a machine-wide service.
 For the web UI host/port (including how to change the listening port, default
 `8080`) and browser auto-open behavior, see [Configuration](Configuration.md).
 
-Update defaults live in `Quasar:Updates`. Packaged defaults come from the install
-directory, and operator overrides can live in the Quasar data directory
-(`/appsettings.json` by default for Linux systemd installs, or
-`QUASAR_DATA_DIR/appsettings.json` when overridden). The worker and Bootstrap
-both read that data-directory file on startup.
+Update defaults live in `Quasar:Updates`. Packaged defaults and operator
+overrides live in the install root (`$QUASAR_INSTALL_DIR/appsettings.json`).
+The worker and Bootstrap both read that install-root file on startup.
 
 ```json
 {
@@ -311,7 +304,7 @@ until the operator chooses a version and presses Stage.
 Quasar can check GitHub releases without a token, but hosts on shared servers,
 NAT gateways, and public cloud IP ranges can hit GitHub's unauthenticated rate
 limit. The Updates page lets an admin save a GitHub token for release checks.
-It is stored in `github-updates.json` under the Quasar data directory with the
+It is stored in `github-updates.json` under the Quasar install directory with the
 same Data Protection encryption model and owner-only Unix permissions used for
 the Steam Workshop API key.
 
diff --git a/Docs/QuasarArchitecture.md b/Docs/QuasarArchitecture.md
index d542570e..20c0d5a9 100644
--- a/Docs/QuasarArchitecture.md
+++ b/Docs/QuasarArchitecture.md
@@ -540,7 +540,7 @@ Practical guarantee:
 2. Quasar checks GitHub releases every 15 minutes while running
 3. new Linux web assets are downloaded into a staged version directory
 4. staging performs a three-way `appsettings.json` rollover: previous release
-   base from the data directory, local install-directory values, and new release
+   base from the install directory, local install-directory values, and new release
    defaults
 5. UI notifies admins that the update is queued/staged, or shows a conflict
    resolver when appsettings cannot be auto-merged
@@ -559,8 +559,8 @@ under Bootstrap, an admin can force activation from the UI. The worker writes a
 request file under `Updates/` containing the detected version and asset;
 Bootstrap consumes it with a watcher and runs the same checksum-verified
 self-update path for that requested release immediately.
-Bootstrap sets `QUASAR_DATA_DIR` to the launcher install root when the variable
-is not already set, so the launcher and worker share one default state root.
+Bootstrap sets `QUASAR_INSTALL_DIR` to the launcher install root when the
+variable is not already set, so the launcher and worker share one root.
 
 The Updates page also shows installed managed-runtime versions independently of
 Quasar self-update state: Quasar UI/Bootstrap, Magnetar, and the Space Engineers
@@ -919,7 +919,7 @@ As of this document:
 - deep per-server profiler telemetry now exists: `Quasar.Agent` runs a continuous in-process profiler with `SafeContinuous` enabled by default, with per-server persisted `AgentProfilerMode` values and a global `Quasar:AgentProfilerMode` / `QUASAR_AGENT_PROFILER_MODE` fallback for older definitions. Safe mode uses Harmony prefix/postfix timing only for named high-level paths: frame/update, programmable-block script, physics, replication/network/session, GPS, and block-limit work. It deliberately avoids broad entity update method patching and detailed network-event hooks so the always-on default stays low overhead. Deep mode adds detailed network-event method hooks plus Magnetar-compatible Harmony IL call-site transpilers for `MySession.Update` / `UpdateComponents`, session component calls, replication simulation, entity update dispatch, parallel waits/callbacks, and Havok physics stepping internals. Runtime mode changes reconfigure Harmony patches so Safe, Deep, and Off can be selected without restarting the server. Hot-path measurements use numeric call-site ids and rolling accumulators, split main-thread vs off-thread time, and publish one-second windows with bounded top-lists for grids, scripts, entity types, system methods, physics detail, and network/replication/session work where the active patch depth can observe them. Patch failures are logged and the agent keeps the remaining profiler surface; entity call-site misses stay at high-level timing rather than adding broad method wrapping. Each `ProfilerSnapshot` rides the regular agent snapshot, is validated, and is kept in a small recent in-memory `ProfilerStoreService` ring (~720 samples per server, about 12 minutes at one snapshot per second), then surfaced on the Analytics page as game-loop timing and top grid/entity-type chart panels
 - Discord per-server options now include chat relay and simspeed alert rules. Discord-to-game chat is injected as `[Discord] : ` so in-game readers see the Discord sender, and `DiscordChatRelayService` suppresses the matching game-history echo before it can post back to Discord as the server/bot author. `DiscordSimSpeedAlertService` evaluates fresh raw metric samples for connected/running agents on the registry change path, sending alerts through the configured simspeed channel or the server's analytics channel. Baseline rules detect sharp sample-to-sample drops across every unseen raw sample pair and sustained low average simspeed, and the Discord page exposes thresholds, windows, cooldowns, and per-rule enable switches. `DiscordBotService` also publishes aggregate managed-server state through Discord presence: the bot status reflects unhealthy/faulted vs active vs idle server instances, and its activity text shows active/total servers, player count, and issue/warning counts.
 - a unified GitHub-release-based update/publish pipeline now exists covering both Linux and Windows in a single combined release (`.github/workflows/release.yml`): each build produces `quasar-installer-linux.tar.gz` / `quasar-web-linux-x64.tar.gz` (Linux) and `quasar-installer-windows.zip` / `quasar-web-win-x64.zip` (Windows) under one tag; tag pushes and `main` publish full releases while pull requests publish draft prereleases; installer archives contain a single top-level `Quasar` directory for clean manual extraction; the release carries one combined `SHA256SUMS` covering every archive; release identity is normalized from `AssemblyInformationalVersion` and the active-release pointer (not numeric `AssemblyVersion`); four-part build tags such as `1.0.0.37` are canonical; every downloaded asset is verified against `SHA256SUMS`; the UI stages web updates and queues them for explicit activation from `/settings/updates`; Bootstrap self-upgrades from the launcher stream only when an actually-newer asset appears (see [Linux Deployment and Updates](LinuxDeploymentAndUpdates.md) and [Windows Deployment and Updates](WindowsDeploymentAndUpdates.md))
-- `Quasar.Bootstrap` runs as the stable launcher that owns the public port on both Linux (systemd service) and Windows (Scheduled Task): it activates web releases through the `Updates/active-release.json` pointer after staged payloads are promoted into `ManagedRuntime/WebService//`, and performs worker cutover by draining the old worker and starting the managed one on the same port — a launcher, not yet a reverse proxy — so the public endpoint stays stable across the short listener gap while managed Magnetar servers keep running; on Linux, the UI shutdown action prefers `systemctl --user stop quasar.service` / `systemctl stop quasar.service` when the installed unit is detectable, falling back to the worker-written shutdown request that makes Bootstrap exit without respawning; on Linux the launcher exits with code 75 so systemd restarts it for self-upgrade; on Windows the launcher spawns a detached replacement `Quasar.exe serve --quiet` and exits 0, with the Scheduled Task restart-on-failure as the safety net
+- `Quasar.Bootstrap` runs as the stable launcher that owns the public port on both Linux (systemd service) and Windows (Scheduled Task): it activates web releases through the `Updates/active-release.json` pointer after staged payloads are promoted into `ManagedRuntime/WebService//`, and performs worker cutover by draining the old worker and starting the managed one on the same port — a launcher, not yet a reverse proxy — so the public endpoint stays stable across the short listener gap while managed Magnetar servers keep running; the UI shutdown action writes a launcher drain request, stops the worker, and leaves Bootstrap alive without respawning a worker until the service, task, or foreground launcher is restarted; on Linux the launcher exits with code 75 so systemd restarts it for self-upgrade; on Windows the launcher spawns a detached replacement `Quasar.exe serve --quiet` and exits 0, with the Scheduled Task restart-on-failure as the safety net
 - Windows deployment exists via `install.ps1`/`uninstall.ps1`: extracted release installs default to the installer root, source installs default to `%ProgramFiles%\Quasar`, and the installer registers a Scheduled Task (`Quasar`) that starts at boot and restarts the launcher on failure; the task runs Bootstrap directly with `serve --quiet --service`
 - staged relaunch now persists supervisor runtime state so managed DS processes survive worker turnover
 - obsolete `webui/` is removed from the repository
diff --git a/Docs/QuasarPluginSystem.md b/Docs/QuasarPluginSystem.md
index d640c81e..4160cdc7 100644
--- a/Docs/QuasarPluginSystem.md
+++ b/Docs/QuasarPluginSystem.md
@@ -61,7 +61,7 @@ Safe-boot triggers:
 - command line: `--safe-mode`
 - environment variable: `QUASAR_SAFE_MODE=1`
 - environment variable: `QUASAR_DISABLE_UI_PLUGINS=1`
-- data-directory marker file: `{Quasar data directory}/ui-plugins.safe-mode`
+- install-root marker file: `{Quasar install directory}/ui-plugins.safe-mode`
 - automatic Bootstrap fallback after repeated worker startup failures or quick
   crashes
 
@@ -79,7 +79,7 @@ Plugin activation should be last-known-good:
 
 1. User installs/enables/updates a plugin.
 2. Quasar writes enabled/disabled state to
-   `{Quasar data directory}/ui-plugins.state.json`.
+   `{Quasar install directory}/ui-plugins.state.json`.
 3. Quasar restarts through Bootstrap.
 4. The new worker loads plugins.
 5. After startup and health checks pass, Quasar marks the plugin set active.
@@ -141,7 +141,7 @@ repositories and pinned commits. Quasar only shows entries whose `PluginKind` is
 The `/settings/ui-plugins` page now manages the QuasarHub catalog:
 
 - refreshes and caches the catalog in
-  `{Quasar data directory}/Caches/ui-plugin-hub-catalog.json`
+  `{Quasar install directory}/Caches/ui-plugin-hub-catalog.json`
 - checks QuasarHub on Quasar startup and every 15 minutes so installed package
   update availability stays current
 - automatically installs or updates reviewed hub entries that opt into
@@ -163,25 +163,25 @@ The `/settings/ui-plugins` page now manages the QuasarHub catalog:
 Installed UI plugin source packages live under:
 
 ```text
-{Quasar data directory}/Plugins/{catalog id}
+{Quasar install directory}/Plugins/{catalog id}
 ```
 
 Installer staging lives under:
 
 ```text
-{Quasar data directory}/Caches/ui-plugin-installer
+{Quasar install directory}/Caches/ui-plugin-installer
 ```
 
 Git source cache lives under:
 
 ```text
-{Quasar data directory}/Caches/ui-plugin-sources
+{Quasar install directory}/Caches/ui-plugin-sources
 ```
 
 Enabled/disabled state lives under:
 
 ```text
-{Quasar data directory}/ui-plugins.state.json
+{Quasar install directory}/ui-plugins.state.json
 ```
 
 The first installer supports root `quasar-plugin.json` package manifests. Build
@@ -305,13 +305,13 @@ Configuration/environment knobs:
 Default plugin root:
 
 ```text
-{Quasar data directory}/Plugins
+{Quasar install directory}/Plugins
 ```
 
 Shadow-copy root:
 
 ```text
-{Quasar data directory}/Caches/ui-plugins/{pluginId}/{entryAssemblyHash}
+{Quasar install directory}/Caches/ui-plugins/{pluginId}/{entryAssemblyHash}
 ```
 
 Plugin navigation items are rendered by the main Quasar sidebar. Supported zones:
@@ -570,7 +570,7 @@ The Entity Viewer can keep its JavaScript/Three.js-heavy surface in its own
 repository and serve it from that plugin path. Quasar core no longer copies
 viewer assets into `Quasar/wwwroot`; the QuasarHub installer clones the pinned
 viewer repository commit, builds the adapter project, and loads the package from
-the Quasar data directory.
+the Quasar install directory.
 
 Plugins can also ask Quasar to inject package stylesheets into the host page by
 declaring manifest-relative paths:
diff --git a/Docs/QuickStart.md b/Docs/QuickStart.md
index 8855e40b..8fd13c96 100644
--- a/Docs/QuickStart.md
+++ b/Docs/QuickStart.md
@@ -26,8 +26,11 @@ Quasar.exe serve
 ```
 
 Quasar starts, opens `http://localhost:8080` in your browser, and prints log
-output to the console. Press `Ctrl+C` to stop. The web UI port is configurable
-— see [Configuration](Configuration.md).
+output to the console. Press `Ctrl+C` to stop the launcher. The UI **Shutdown
+Quasar** action drains the web worker and leaves the foreground launcher idle;
+press `Ctrl+C`, then run `./Quasar serve` or `Quasar.exe serve` again when you
+want the UI back. The web UI port is configurable — see
+[Configuration](Configuration.md).
 
 ## Install as a background service
 
@@ -56,13 +59,13 @@ tar -xzf quasar-installer-linux.tar.gz -C ~/.local/share/Quasar --strip-componen
 ```
 
 The Linux installer defaults to a user systemd service, uses the extracted
-folder as the install and data root, and writes that path to the unit as
-`QUASAR_DATA_DIR`. Pass `--system` with `sudo` for a machine-wide service,
-`--install-dir ` to copy Quasar elsewhere, or `--data-dir ` to store
-Quasar state elsewhere.
+folder as the install root, and writes that path to the unit as
+`QUASAR_INSTALL_DIR`. Pass `--system` with `sudo` for a machine-wide service or
+`--install-dir ` to install Quasar elsewhere.
 When Quasar is running from the installed user service, the UI **Shutdown
-Quasar** action requests `systemctl --user stop quasar.service` and leaves
-managed servers detached by default.
+Quasar** action drains the web worker and leaves `quasar.service` running idle
+without respawning it. Managed servers stay detached by default. Restart the
+service to bring the UI and supervisor back.
 
 Manage the service with the usual systemd commands:
 
@@ -98,6 +101,8 @@ The task starts at boot, restarts on failure, and runs as the installing user by
 default. Quasar state is stored in the same folder by default. Pass
 `-InstallDir ` to copy Quasar elsewhere, or `-User ` to run as a
 specific service account instead.
+The UI **Shutdown Quasar** action drains the web worker and leaves the Scheduled
+Task running idle. Stop and start the task to bring the UI and supervisor back.
 
 To remove:
 
diff --git a/Docs/StateMachines/SelfUpdateAndRelease.md b/Docs/StateMachines/SelfUpdateAndRelease.md
index d65b9e70..8f4c46a4 100644
--- a/Docs/StateMachines/SelfUpdateAndRelease.md
+++ b/Docs/StateMachines/SelfUpdateAndRelease.md
@@ -71,6 +71,8 @@ stateDiagram-v2
     ForceKilled --> WorkerLaunching: start new-release worker
     Running --> Restarting: worker exits unexpectedly
     Restarting --> WorkerLaunching: relaunch (force)
+    Running --> Drained: UI Shutdown Quasar / launcher drain request
+    Drained --> [*]: service/task/foreground launcher restarted
     Running --> SelfUpgrade: newer Bootstrap asset applied
     SelfUpgrade --> [*]: exit 75 (Linux) / detached relaunch + exit 0 (Windows)
 ```
@@ -85,6 +87,7 @@ stateDiagram-v2
 | `Draining` | Pointer change detected; the launcher posts `/api/internal/drain` (authenticated with the per-session launcher token) and waits for graceful exit. |
 | `Retired` / `ForceKilled` | Old worker exited within the grace window, or was killed after timeout. |
 | `Restarting` | Worker exited unexpectedly (not a launcher request); relaunched with `force`. |
+| `Drained` | UI **Shutdown Quasar** requested a launcher drain; Bootstrap stays alive without respawning a worker until the service, task, or foreground launcher is restarted. |
 | `SelfUpgrade` | A newer Bootstrap asset was applied by the periodic monitor or by a consumed `Updates/bootstrap-update-request.json` request from the Updates page; forced requests target the detected version and platform asset. Linux exits **75** so systemd restarts it; Windows spawns a detached `Quasar.exe serve --quiet` replacement and exits **0**. |
 
 The pointer is `Updates/active-release.json`
diff --git a/Docs/StateMachines/diagrams/bootstrap-cutover.mmd b/Docs/StateMachines/diagrams/bootstrap-cutover.mmd
index 578a0bc7..4c51f425 100644
--- a/Docs/StateMachines/diagrams/bootstrap-cutover.mmd
+++ b/Docs/StateMachines/diagrams/bootstrap-cutover.mmd
@@ -11,5 +11,7 @@ stateDiagram-v2
     ForceKilled --> WorkerLaunching: start new-release worker
     Running --> Restarting: worker exits unexpectedly
     Restarting --> WorkerLaunching: relaunch (force)
+    Running --> Drained: UI Shutdown Quasar / launcher drain request
+    Drained --> [*]: service/task/foreground launcher restarted
     Running --> SelfUpgrade: newer Bootstrap asset applied
     SelfUpgrade --> [*]: exit 75 (Linux) / detached relaunch + exit 0 (Windows)
diff --git a/Docs/StateMachines/diagrams/bootstrap-cutover.png b/Docs/StateMachines/diagrams/bootstrap-cutover.png
index 49b8e43e4d7bdb02a8209225c138a00616f813b2..0ee82f07d1b93467231c49f48b9d77a1224b2cdd 100644
GIT binary patch
literal 117203
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
E7w$}68UO$Q

literal 114620
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
z�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

*hP6MBpb+#J|gt(>z(tUVJm9_u%Z|J+`MM>B}2r z7Wp~;b4%HE|Cv7DpEo2Gm{r!|7r*z}Wpo$-p8aI5qNb^>56DV_ zbW>1u+y%roGoy8-g~<0NIu3iHGO}B?7Zs2)OCz(N*Xngj%4>O5UU?KW-2tmz*RzK9 zQf|%^EoNW`Xa1D@b=QUe)5%&M-=wDEj>V4(XYQHN4sl;jiJ3&FFBkEX^-fMS@e2G> zT2{Stc4f{{_f6!!I85zVyE&GOKF7?ja7gAqDvEt*VDsFCT+eisCB)?v%h;qulPun} zwrgfzKI;fIMRn<}BwajP|LQ$ubQ7bD*SwlhRj(K(F=wm`y)eqO_4AukTVLWtVI)MG^TuPOguF^j${Nb}8VjPzRL=NB_csw8 zQSWlEfGO~6oo6Q#!=S7V?vMOLkw}X@V_JqZmN|MRhMd@{J6)C|CAlF9Avw=6q`fk1 z`1&7tKKsEpw#Ia)GX8NgS9PB0eFw#-G^OG>G_GNLKd`O{qPbE9ICj2Quf27!pQjh$ z*r!6Gjpz8}G1~8KnPaRU`b9MhH6)EJiwwCR(P|R%WBb*Ta8p>Bzb!0^x$#itG~@=O z-@jtP$QMXBel{nwuFp>2UJ|P+fB&YTkz`kgdH)J(F+)y+N<|{^(+Mv;j2g6Iik(Jv zejyHzn&QLYqX3rx%g87i6TY2*#~bb`77V8Kgqp6RYVo=??-mA110L^$+zVvTO44pM zaaiX=i)>z2QH&Y+C`H&Ys7$8w3K<+A1a1wUJ|kFWEQXS3p1cm3+jUCwuUC?xdZMHq|G2&ZXqjSylYP13!< z?aIV0g_q82u$+PJ8Nb!3QOc^m_Jo_SJn4=7Pn91zJ0|9uc6m3hZfY5yt%gU{-!bWb zq)^DIV*cEF`qLwml`h`JMP((XcbJ{nbiEzuQ8X#!78HNxcQFQ?ugK^K6FwLr&i1$e zkrv0G%@F#S&;La6gVJXCzJI_kKaCo86FyXw8^lm!ck{nY=ZWB{G4yTBxwAm1;j1#r zH-GLulT}<@)Bl)wF|Rs5GwZ)T#L}JuL2>^y^GfA8BK28{X3s1kY+$N%Y`wRuR6&$0A$zJ=-gvlZjYwt>d%&@tKO zSp9FRt{Y4NsX`1aQo+7cM7p65-Q#lPYQi^IV(0L;bId=d$_Zx8O_R{Z6snf9=}ic@ zV^gZoV3g}QYr!D6RqQ&PnGUWp6vfTNYes*9QkO zl5{@((5Xph+Hg;>VyIRaV;k%!Hc>INAAD|lTFkREc#CK6R(ZKfeATYUW6CeCjil>b zcEVpMi0U1jKDt;$KKl#l#6-*f-)d)Ztt@ISs{u^m zLz@JIKKCS{;|%=8hT`lv*czQ0xVmHix+&FGlBew1x!JF69jYERJ6#g88fi$(Lt3vz zef#%#;m|#z>)-zxWxbtfN~DN;CP&82+?{NqYy-9Q*$-HArs7!>hN`i7LYV|Cb7oC= zu4FWfZyL zt_loMRx6be6ZWYDOfAJlULxe?2|*WmrsGUu($k#=f&s4*y+8MCQ62bXL9^<{LmKfsmFLPY_M*R)r@=(htou@-a;fna zbXaMz6y)JU)h8K0pVo?hkACmwtxBxMkol2Ncy+z1wskp}zMf+oxATgZjFHT0Qbpxw z61pV_x}nOKxvHeC`BsTQO8B{JMgB5W%3LWZh+JJba4=TKNh2bxiv7F3bEy?iw?^_J zWXc!=;*`kX|F9{m!b-iwNndy+j_rPBy{G%JIqEjuObffVcCGr3cvpx15MJwOMYg6o zHP^X%k@zh=Qr7ZGhlmL46{V@Pl#FS0cj7w?{1ZwtFEs9rtnH>jiFVWsV z2O`1O<-Iey?hCQ!b>bElDed&0eJ;NZMrq5}P zMSoeEw#}bJ;~g_3=qP23%q`>h#uHBGAJZ}13uKKc4~aUPJ|*j1njEFR5wl&#-U{>@P~06n8bdYCo4*kC@N-&i#DW*XHVA z`qP1lijsM+(4~d`;UH@1DGhFSI%4e%jVKZ0zm(F2IN#3mC`3OsCdDp^ngfIqn&s!nB`7QPH{+2%a>ETDC)f$?o1T zJ!i^6DW60@abot!B*#tu0F?=eb4C?Aht!MsT7r1G9gN~igpIx5ODtmaprIRv!#2K%fz{zNt0tJ zaH>%cnZ4o~_@%q|+y2F+AZ3yq@uyGq+z*!Hr6WzWR3+*1s%Ey(f1BNV-a2GC6hXf2 z7BoZS$QyQ(nqaXg*d`XgVAx^ei>rJ1GS@v0(;Pw>u8uAl%hkieftl<*5;b|A*SbXE z!*)1yySG!1tZbDs18#XU)he(!u+ut-8px51u1gF(_E4SNcw;J-gU21BpiQ?S%OH^+ zH+wAbKBwigBPTBZm}1j&?aupHjNwN^2G=ZUl-#mN=JsUs{t`_6yQ8NT@II+8 zg;fe=%zmkf36|=Lu!MDwdy*^`f<|4mJ8gK&`r%Jgascu?A8L5$wR0f*fNB`~Si-uQL?+hBL|%M*BI$z|^Cx@PGMZ;e zZ0vP7wdOH!XeK)*@cG;(nK3+lq%)CA*bXH-u`$EL&6U{o41y zTV%{F$Cn$aR_hdk9up3Z&D6LM{=Z6=v(v&aT`@R~ohQhR#OB?ynnQ7c{&ZwmR3(|6 zZ~M(r?0V7EJb?kZc+gO|vwIGmMS#B(k6&L{N`QMG{ZF$9FqCFgJlyc1BWzTsqChv# zF@5U(SeWDYiw6;k^pgRvD6HUIHXtMba#e%t|=83C3 zO!3_e7_-fZ;`kk#H1uYh;bx+gCFXqcRPHdF!gS=8uP%YbzWqhER9t|_EMh~wU9xxk z#^%J)i)+<8`p*I8`0n>k$;PcLIf@JveB0&|2F?`9m>0!iigDRTpM!aZ#+!Nju6NN9 z^Y3UxD}{}k7DkWIC>1KZyB(zwWdE%V_slA4Y85*u85OG#laJY&I86(DZfadd|4BdW zKd^R$A#{RZZofuT(m4i+^f^m6be8CiO#E?k%grfzGy z$gmWTKBRWkIPU3;f*6GXy6WLCB*cXe>B3v(B2LSVm$M{Izbd_y2<1$8n0&C}3oZ*n zD39tkpbmm}1?0=%n!MwXAb!Xb>nW}1Ng@apm8>RCp5qKI{()CEiBp$y;Me) zbbG6ZtcPkUozzdnWpePXC|%<;N46m%GZ~}KaMQ##+zCw94?AZ!hT8JJTmd! z)8Cn|%ty&%Hd2YDx9F>zM$OanlGxC}Rxux)m?z4!$~vu+VzIehraQX$6I;bav=`qs z6YS2E!w)&s9|@?la7C)i)CT(65w-@bYIXgBxZE2LkedPO+3D>8r1Lj4q&o8foFrlD zIn(v8|3EY+1)~!>YI9^CS-@SD@|sSge&q&@Vj}lJb(j8k#06 zk+DwGX@8N!xwuQQaHYCii?WZ5Le-c9^Eh|#A1s#;$WQ3#9$lCkX=_N)yOsLeFn>P! z^7?y$dD0u+M@N~ZwQ=oHqTi`;?w(Stm z=JFh+;j~pY#q!qmRWj>sjvLa}Tr5tq9PeLW36soY;qAz=t=42w$RTgpTJ&mVW+^F7 zpGjW!H&4lLZ4`g(t7T>C`l=?tayxsO-?kauH|;BD*1UF-<2cKf&cWDvXv{tC;o`H7 z++nUW?SYg9qOd^W-Z=hgMZqRI+xoTQ&M7A^uoLP9Vi)x0N4MRu&5%5C=pLbWKldMF zQYfNgbGa~EO66F;?p-{oxFe)CFjMIZ zE;|;VatX-ZzC*fm@A~>WVt;~@Fvz(vd;}~>mibuFZth`p1sE-+OM5IEe~&TKvx?mQ z$ud7-f_Q3Uy=Dl{TeWJYD}}>nhhJ9nH?nq6g>|e*PPep)1?GHBZ)H9g*Sd`+S;N5n zC05n-nbz;cy9+Mw{cJfx93R!ZOU09{i4~1B0eG-q#XVhe-P`}mR(iC~lpiIby1d7` z_=3ab?yZRp${Uv){ncN`2OBY@JI zK_eOP5d$l)MVzs*|0J^HqhM2f)*?2MF^k&AM)e_Gk%|O)?(yyGKflJ|JqSM6Div(C zkweQdR#kQj{n8{N#M;e7MoeWn@Q-;s7N6SP?Rc?(!RW&}uHgSEFt2eY7E)U%eq(mC zX_DiNFx}#DeCtqh&;P@&MsBZ4Xxk5q@tV7=IZrhcvlb1#pV<>S^r@FbeD;3B7*_sH zy;;FU<&zP?WZ-+Ki@4quQpUXw{BTI`8c96yqbey(`>w749~;o31n4i`4C= z{Y(o7QN)zw^gpi0IEddXHwU+ABFaD$_^YYyZYH3v42N=r+fsww&h z{9Y(`9lPjA#hj+%@;~rbQ*?4WpU{cp<1yolRVOf(?xjhqTYmUOJ*!LJa{N2ZA%>H} ztK1ju*$x_VrP`KZJ~rP}SGkQ=c9dG^q>8(MWbAr;MdD)sh34u`R)E|Br)jiu3oNx>yYuNj%olsAJHe{b}5fcDRIsmElj z5HJFKg;~8Ys#yQ*gn@50?{fwgaWsgGtnyjo^6fqqy-T>8c2KmuD#iRcRz9v+gjEw3jcpPB;3Tk@7}o zuT1pMJ8UZdMHK&Bp!OBE8xG!B&vr1=%aBNC4g2Xr(TJz4Hh2Ii`00Vw$K#6F&+CUu zCfGC&u(McX*964w8itGKsn5UJSemfrie&mxt=#e?Fn`#KQrwROxcVkHj6WMv=Lyn;g~tKs9F zH|#b)cV@w_`y(tY%=t$1Q$qI$c^96Zj|PFo8P zKk6aQM#*UC!161qP_oCwKT&sN3KfhM&lbO%(7*2V>0QE8*G;mlwme*`U}7m~)H+b1 zKD0(0Vj>sd)Dm6o^Xdb~#@U!bh|urD!C5fw45Y~=w!J z%?m1*qqJayx((9kSD@pjgwVjMswy&Ye1fju@zpCq@MM3!POnoOE`B>aR+hr)9jW}# zkD)!HyKmkOuD|6U$ZTFVD-Qn73rzb7A7DM#8gEZkBD7$T=wn=)0GA90?0n#9Jpl`i z2QW)#-8NZL|LH$aJRmg#J_C$C*mxlpUHIMG1Mqq;qKTY5f}^p4fx)9kjSw2X4J=?7 z0{D4Thqw?&r$9XozS=f5yUVSs2h;YwLWpA(7`f5W(Z@g&7Chf=2BX#A470!TEeL5raJYKz)6nqn2eu1O{_`g;-XY&(9c-X8<<_$Zx%*7) z4lX<|`gFOtpS~b_2UKi9Uf%TA=a&a)-!!i8wNp}pHW0Me7$|OPAW+}&Jgx?4uFF8G zR9adZqQJ&QE?{)npJHQUnV6X|&PXy`dWDXsz-m$JcC-N&_1_I|FM~Ar$4w3GM=0!1 zO-nWNufcKQH66;D8b{2J4DgY_*K2=GM11e5K066an?K-7{U-{D<6WO)a|N>w|0BJ9 z7eO!%x$QQhH8(d;TOF5KPJ&lN^U|9}OL(Or>yd?#kqTw)GD!ZLrwiuMwR>7fkn)fN7ANqr0iW;DK@;v8*gCEc`kCb1@5Yx~ ziHV6J-e%C%B!-14tEe1+PYjWjUqKPY8g)O#3j%ktri+UU$p6)IbYL>W`XXuwH1a+i z0SgmZqK)&7$=aMA56@d)|bHcY>HXQS@I{0f3=BhzzkrP-=rk z1i2H)XSjn&1svUv{{FsERvLIp=N{YO$&}!c6+(=GpJeH(r@?R-4TjfZ#HGXPcbQ}Z z&;%fUzc*z@ko;O344qnK7Njtz|Jp#3z^ego;MxPg&iDOV=}meKNaYaWGrwdl0G-Dj zZI0@JHSN6AWw{eLf2AU4{UIM&QE%Y%_xE#gaa}?A{qB$3z5*AH&>^mgYzR1;kzpf6 zhK-Gu)|*lW@;$41)*aefT0Y69x3oOzS^sYQpi1i!i9D}9h}s1_&v{WF*3ShZM!bs- z1+fUA3M8T{(y9QU*8Rua&4H)!!rpo;6tgQZ*oB>2EVO`5GTzch}lRn!~C_a?f zpH4y-4K9Jcyn6PxRYw>tke2t|YLS-<4H@+hV1dW})R$uH2k&|@Vs-_4q>iH_*PqTa z7(Im70L-#bLiTwkzBd=;t_LfAe&`oetMEYX!0ewvND&I(lSKX?K1VRL$@iszWe_0a z;UJ7T0+(s^tJ8h3aUpi>TU?l81Px!g95;rpvsNIQi$B$1WyTCnH?D! z3DyYY@yj5OKLz0M?tdHqsrt&!+iAd!qH)=OJ~nG(#LDIt0~IzrCdQ^@8PYn~6!%^7AC|G_nq z806(XK$8c%A*Bc$AGk&A4%d_}y_p$ViMdHkTn;NHcl#=(|AgRcn4}Y4@Y$@9P3)XE zwfbzOAQiqD5~}=|^t9yz0hoxCm?B}wx#POGoD`CT6HxS@oWX|^G3tx}BXHR*VW%HY z@dEZhA} zf2x*uxi6;!3xC#W(vn;@1o2LRZ^^9-4ko9opTQoNHcX6<{V6*;TQle!?i%jkN`fho z4U+4BK!-b=$a9?nli}8$%f{xWDf+_B7sSSM+HqWWTpKJgxOoJQh@7DqXC);(7~VHv z^LhXN3M&!p+_vD)z4{AZSVVvS^c6Vr@-s8%R^zxWt6-wTr|5-gL!i}EfMFClyczx-j=tLH zDR>E4hyo64x@DHIDfnA#!*mOhfTsaFV|a8l{V*9S3XL{zu6Cue+XZr313(Npjjc{} z&lTA?9&5zK4kv47Phqp6OdtyQpd{mbhyTAmkft0!r_s=KZ{f9qOT0Jzf7ve@S>V(rtA zRaB3k96M*YGp!w5b*G``#UUaWumvW4fGsD{=+z7tCueGU`u;(Dd_27K-bpr?-$@6* z$2=%5Dgq~FascwC_=08249-G`m&bH%PLIv2JGx?l{^;{Q*k=Xzzfr^CcV3TI&wZ!5|v=y=Jg3!D8w$4QW1 z(kmFj#@TRQ111KBh8=NOOOechvkrJzn@4WIn0P4q$iM)|G?v4!Ojmmn1~U|1uf&+B z=W9RH(eaqHEXPB6`0`@cS47fL6Q9lR%Y%OW57RivR=YMymP{E4xf2J}@}a5G$_<3C zI_OQs#eFpMkPQiG*z_q33=CA@AHf0igU>r8I{`VBrmohEfejy~j0 zW*

kkpQT?Z<1t|Mz_O=hp6}yvd5&n|m(2#<6_%D-)&WrjnIlF04dJx^DnIRT9+0 zhDI;6oSdA~!eOKJ-|N63x&Um%N$**zRQR;EMWRO!?eti|(-Tggu$F##q?Ua2zT5Z<6|;aq9DytA zWsKy2i;Ls>S=c`TMRXqv`#id~J7@9N_*G)<2C7jwqSeJK!sQB~=D@6%rJjWEe_CS4pKxBg08||YCZ_*D!+dT5 zIp7@bLFVva;Q)>7as?F&nD4fMgE1BK8MX_dpJN8~C#`JYNj(ikNv^NZW@YUI!yw

ELX`>8xDM;cg%~cp0w6W5f>oIuyB)dC!etEZ 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 dFywDv#P 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�HzRC1Lcvk(edR z$sr1Qe9iG<3PnfN1!`Rd>*Y=bgZrqd&sk>>Vr>Nb3xI%@mKL+UX1Us!576-7FFT-M z9YoxhwF?Er6RI5zl7g7Q#>e~j`TNs|$iNoutUpo{LLQKUX^2As#OOg~XRiZ6V$I{s z*;MDi))!BD)$WtGx6~`B-yHq>JP#5*`4fRHV)DYnj^pUjn;65vfEH^q)&G4{9-!a# z_g~|G4q>X`fB*dd=`Q}?ANv3EU$7>L2i@4XPyJ&Sf7nJej$6ngbTTsb8twjjyf4ct L$z({~^!Psj6qE{E diff --git a/Docs/WindowsDeploymentAndUpdates.md b/Docs/WindowsDeploymentAndUpdates.md index abfea982..54b14f90 100644 --- a/Docs/WindowsDeploymentAndUpdates.md +++ b/Docs/WindowsDeploymentAndUpdates.md @@ -74,6 +74,11 @@ Bootstrap always captures the managed web UI worker's stdout/stderr and mirrors it to the Bootstrap process console, so Quasar web UI warnings and errors are available from the launcher side in addition to the configured Quasar log files. +The UI **Shutdown Quasar** action drains the web worker, preserves managed +servers, and leaves Bootstrap running without a worker. Because the task process +is still alive, Task Scheduler does not restart the worker by itself. Stop and +start the `Quasar` Scheduled Task to start the UI and supervisor again. + If Bootstrap has no usable `Updates/active-release.json` and no packaged `WebService/Quasar.exe`, it downloads the latest Windows web asset from GitHub and extracts it under: @@ -102,8 +107,8 @@ browser shows a restart progress overlay, polls `/api/health` until the activated UI version is serving, then reloads the Updates page. Staging also resolves `appsettings.json`. Quasar uses the stored release base in -the data directory (`\Updates\appsettings.base.json` by default) as the -merge base, applies local values from the install directory, and writes the +the install root (`\Updates\appsettings.base.json`) as the merge +base, applies local values from the install directory, and writes the resolved file into the staged worker. If the merge conflicts, auto-staging stops with a warning and `/settings/updates` shows a git-style conflict editor. Resolve and save the JSON there, or choose **Force release defaults** to stage the @@ -225,7 +230,7 @@ elsewhere. Environment overrides: Quasar can check GitHub releases without a token, but hosts on shared servers, NAT gateways, and public cloud IP ranges can hit GitHub's unauthenticated rate limit. The Updates page lets an admin save a GitHub token for release checks. -It is stored in `github-updates.json` under the Quasar data directory with the +It is stored in `github-updates.json` under the Quasar install directory with the same Data Protection encryption model used for the Steam Workshop API key. Use a classic personal access token without any permissions: diff --git a/Magnetar.Protocol/Runtime/MagnetarPaths.cs b/Magnetar.Protocol/Runtime/MagnetarPaths.cs index 01d37745..f501b421 100644 --- a/Magnetar.Protocol/Runtime/MagnetarPaths.cs +++ b/Magnetar.Protocol/Runtime/MagnetarPaths.cs @@ -6,22 +6,18 @@ namespace Magnetar.Protocol.Runtime; public static class MagnetarPaths { // ------------------------------------------------------------------------- - // Root — everything lives under QUASAR_DATA_DIR when set. Bootstrap sets it - // to the launcher install root for packaged installs. Without Bootstrap, - // fall back to the OS application-data directory. + // Root - everything lives under QUASAR_INSTALL_DIR when set. Bootstrap sets + // it to the launcher install root for packaged installs. Without the + // variable, direct worker sessions use the app base directory. // ------------------------------------------------------------------------- public static string GetQuasarDirectory() { - var envOverride = Environment.GetEnvironmentVariable("QUASAR_DATA_DIR"); + var envOverride = Environment.GetEnvironmentVariable("QUASAR_INSTALL_DIR"); if (!string.IsNullOrWhiteSpace(envOverride)) return envOverride.Trim(); - var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); - if (string.IsNullOrWhiteSpace(appData)) - appData = AppContext.BaseDirectory; - - return Path.Combine(appData, "Quasar"); + return Path.GetFullPath(AppContext.BaseDirectory); } // ------------------------------------------------------------------------- diff --git a/Quasar.Bootstrap/Program.cs b/Quasar.Bootstrap/Program.cs index 2214275e..c593a22b 100644 --- a/Quasar.Bootstrap/Program.cs +++ b/Quasar.Bootstrap/Program.cs @@ -30,7 +30,7 @@ internal static class Program public static async Task Main(string[] args) { - BootstrapDataDirectoryDefaults.ApplyInstallRootDefault(); + BootstrapInstallDirectoryDefaults.ApplyInstallRootDefault(); var quiet = args.Any(static arg => string.Equals(arg, "--quiet", StringComparison.OrdinalIgnoreCase)); var openBrowser = args.Any(static arg => string.Equals(arg, "--open-browser", StringComparison.OrdinalIgnoreCase)); @@ -560,20 +560,20 @@ private static bool IsDotNetHost(string processPath) } } -internal static class BootstrapDataDirectoryDefaults +internal static class BootstrapInstallDirectoryDefaults { - private const string DataDirectoryEnvironmentVariable = "QUASAR_DATA_DIR"; + private const string InstallDirectoryEnvironmentVariable = "QUASAR_INSTALL_DIR"; public static void ApplyInstallRootDefault() { - if (!string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable(DataDirectoryEnvironmentVariable))) + if (!string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable(InstallDirectoryEnvironmentVariable))) return; var installRoot = AppContext.BaseDirectory; if (string.IsNullOrWhiteSpace(installRoot)) return; - Environment.SetEnvironmentVariable(DataDirectoryEnvironmentVariable, Path.GetFullPath(installRoot)); + Environment.SetEnvironmentVariable(InstallDirectoryEnvironmentVariable, Path.GetFullPath(installRoot)); } } @@ -806,6 +806,7 @@ internal sealed class LauncherCoordinator : IHostedService, IDisposable private WorkerProcessHandle? _currentWorker; private bool _isStopping; private bool _isRestartingForBootstrapUpdate; + private bool _isDrained; public LauncherCoordinator(BootstrapOptions options, LauncherForegroundOptions foregroundOptions, ILogger logger) { @@ -829,7 +830,7 @@ public bool IsReady { lock (_sync) { - return _currentWorker is not null && !_currentWorker.Process.HasExited; + return !_isDrained && _currentWorker is not null && !_currentWorker.Process.HasExited; } } } @@ -838,19 +839,23 @@ public object GetHealthPayload() { var workerVersion = string.Empty; var workerBaseUrl = string.Empty; + var isDrained = false; + var isReady = false; lock (_sync) { + isDrained = _isDrained; if (_currentWorker is not null) { workerVersion = _currentWorker.Release.Version; workerBaseUrl = _currentWorker.BaseUri.AbsoluteUri.TrimEnd('/'); + isReady = !_isDrained && !_currentWorker.Process.HasExited; } } return new { - status = IsReady ? "ok" : "starting", + status = isDrained ? "drained" : isReady ? "ok" : "starting", workerId = _workerId, hostId = Environment.MachineName.ToLowerInvariant(), hostName = Environment.MachineName, @@ -878,6 +883,9 @@ public async Task StartAsync(CancellationToken cancellationToken) _logger.LogInformation("Starting Quasar..."); Directory.CreateDirectory(MagnetarPaths.GetWebServiceDirectory()); Directory.CreateDirectory(MagnetarPaths.GetQuasarUpdatesDirectory()); + if (TryConsumeLauncherShutdownRequest()) + _logger.LogInformation("Cleared stale Quasar launcher drain request on startup."); + await EnsureInitialWebReleaseAvailableAsync(cancellationToken).ConfigureAwait(false); EnsureActiveReleasePointerExists(); await ActivateCurrentReleaseAsync(force: false, cancellationToken).ConfigureAwait(false); @@ -1051,13 +1059,13 @@ private async Task RunBootstrapUpdateMonitorAsync(CancellationToken cancellation private async Task TryUpgradeBootstrapAsync(CancellationToken cancellationToken, BootstrapUpdateRequest? request = null) { - if (_isStopping || _isRestartingForBootstrapUpdate) + if (_isStopping || _isRestartingForBootstrapUpdate || IsDrained()) return; await _bootstrapUpdateLock.WaitAsync(cancellationToken).ConfigureAwait(false); try { - if (_isStopping || _isRestartingForBootstrapUpdate) + if (_isStopping || _isRestartingForBootstrapUpdate || IsDrained()) return; var requestedVersion = QuasarReleaseVersion.Normalize(request?.Version ?? string.Empty); @@ -1553,6 +1561,9 @@ private void HandleReleasePointerChanged(object sender, FileSystemEventArgs args private async Task ActivateCurrentReleaseAsync(bool force, CancellationToken cancellationToken) { + if (IsDrained()) + return; + var pointer = ReadActiveReleasePointer(); if (pointer is null) return; @@ -1565,6 +1576,9 @@ private async Task ActivateCurrentReleaseAsync(bool force, CancellationToken can WorkerProcessHandle? current; lock (_sync) { + if (_isDrained) + return; + current = _currentWorker; if (!force && current is not null && @@ -1590,6 +1604,9 @@ await DrainAndRetireWorkerAsync( cancellationToken).ConfigureAwait(false); } + if (IsDrained()) + return; + var nextWorker = await StartWorkerAsync(pointer, cancellationToken).ConfigureAwait(false); if (nextWorker is null) { @@ -1615,9 +1632,15 @@ await DrainAndRetireWorkerAsync( private async Task ActivateSpecificReleaseAsync(QuasarActiveReleasePointer pointer, CancellationToken cancellationToken) { + if (IsDrained()) + return; + await _activationLock.WaitAsync(cancellationToken).ConfigureAwait(false); try { + if (IsDrained()) + return; + var worker = await StartWorkerAsync(pointer, cancellationToken).ConfigureAwait(false); if (worker is null) return; @@ -1641,6 +1664,9 @@ private async Task ActivateSpecificReleaseAsync(QuasarActiveReleasePointer point CancellationToken cancellationToken, bool allowSafeModeRetry = true) { + if (IsDrained()) + return null; + if (string.IsNullOrWhiteSpace(pointer.FileName)) return null; @@ -1673,8 +1699,7 @@ private async Task ActivateSpecificReleaseAsync(QuasarActiveReleasePointer point startInfo.Environment["QUASAR_MODE"] = "service"; startInfo.Environment["QUASAR_LAUNCHER_TOKEN"] = _launcherToken; startInfo.Environment["QUASAR_BOOTSTRAP_VERSION"] = _options.Version; - startInfo.Environment["QUASAR_INSTALL_DIR"] = AppContext.BaseDirectory; - startInfo.Environment["QUASAR_DATA_DIR"] = MagnetarPaths.GetQuasarDirectory(); + startInfo.Environment["QUASAR_INSTALL_DIR"] = ResolveInstallDirectoryForWorker(); startInfo.Environment["QUASAR_PRESERVE_SERVERS_ON_SHUTDOWN"] = _options.PreserveServersOnShutdown ? "true" : "false"; startInfo.Environment["QUASAR_CONSOLE_LOGGING"] = "true"; @@ -1728,7 +1753,10 @@ private static void SyncInstallAppSettingsToWorker(string workerDirectory) if (string.IsNullOrWhiteSpace(workerDirectory)) return; - var sourcePath = Path.Combine(AppContext.BaseDirectory, "appsettings.json"); + var sourcePath = ResolveInstallAppSettingsPath(); + if (string.IsNullOrWhiteSpace(sourcePath)) + return; + var destinationPath = Path.Combine(workerDirectory, "appsettings.json"); if (!File.Exists(sourcePath) || IsSamePath(sourcePath, destinationPath)) return; @@ -1830,14 +1858,22 @@ private void HandleWorkerExited(WorkerProcessHandle worker) if (TryConsumeLauncherShutdownRequest()) { - _logger.LogInformation("Quasar worker requested launcher shutdown; exiting without restarting worker."); - Environment.Exit(0); + lock (_sync) + { + if (ReferenceEquals(_currentWorker, worker)) + _currentWorker = null; + + _isDrained = true; + } + + _logger.LogInformation("Quasar worker requested launcher drain; Bootstrap remains running without a worker until the service or task is restarted."); + TryDisposeProcess(worker.Process); return; } lock (_sync) { - if (!_isStopping && ReferenceEquals(_currentWorker, worker)) + if (!_isStopping && !_isDrained && ReferenceEquals(_currentWorker, worker)) { _currentWorker = null; shouldRestart = true; @@ -1863,6 +1899,14 @@ private void HandleWorkerExited(WorkerProcessHandle worker) _ = Task.Run(() => ActivateCurrentReleaseAsync(force: true, CancellationToken.None), CancellationToken.None); } + private bool IsDrained() + { + lock (_sync) + { + return _isDrained; + } + } + private bool RegisterWorkerStartupFailure(string reason) { var now = DateTimeOffset.UtcNow; @@ -1944,6 +1988,17 @@ private static bool TryConsumeLauncherShutdownRequest() return true; } + private static void TryDisposeProcess(Process process) + { + try + { + process.Dispose(); + } + catch + { + } + } + private static bool TryConsumeBootstrapUpdateRequest(out BootstrapUpdateRequest request) { request = new BootstrapUpdateRequest(); @@ -2239,8 +2294,13 @@ private static bool IsKnownReleasePath(string path) if (string.IsNullOrWhiteSpace(path)) return false; - return IsPathUnder(path, Path.Combine(AppContext.BaseDirectory, "WebService")) || - IsPathUnder(path, MagnetarPaths.GetQuasarManagedWebServiceDirectory()); + foreach (var directory in EnumerateInstallCandidateDirectories()) + { + if (IsPathUnder(path, Path.Combine(directory, "WebService"))) + return true; + } + + return IsPathUnder(path, MagnetarPaths.GetQuasarManagedWebServiceDirectory()); } private static bool IsPathUnder(string path, string root) @@ -2255,9 +2315,24 @@ private static bool IsPathUnder(string path, string root) private static string? FindPackagedWorkerCandidate() { - foreach (var fileName in GetQuasarExecutableFileNames()) + foreach (var directory in EnumerateInstallCandidateDirectories()) { - var candidate = Path.Combine(AppContext.BaseDirectory, "WebService", fileName); + foreach (var fileName in GetQuasarExecutableFileNames()) + { + var candidate = Path.Combine(directory, "WebService", fileName); + if (File.Exists(candidate)) + return candidate; + } + } + + return null; + } + + private static string? ResolveInstallAppSettingsPath() + { + foreach (var directory in EnumerateInstallCandidateDirectories()) + { + var candidate = Path.Combine(directory, "appsettings.json"); if (File.Exists(candidate)) return candidate; } @@ -2265,6 +2340,49 @@ private static bool IsPathUnder(string path, string root) return null; } + private static string ResolveInstallDirectoryForWorker() + { + var explicitInstallDirectory = Environment.GetEnvironmentVariable("QUASAR_INSTALL_DIR"); + if (!string.IsNullOrWhiteSpace(explicitInstallDirectory)) + return Path.GetFullPath(explicitInstallDirectory.Trim()); + + foreach (var directory in EnumerateInstallCandidateDirectories()) + { + if (ContainsInstallAsset(directory)) + return directory; + } + + return Path.GetFullPath(AppContext.BaseDirectory); + } + + private static bool ContainsInstallAsset(string directory) => + File.Exists(Path.Combine(directory, LauncherExecutableFileName)) || + File.Exists(Path.Combine(directory, "install.sh")) || + File.Exists(Path.Combine(directory, "install.ps1")) || + Directory.Exists(Path.Combine(directory, "WebService")); + + private static IEnumerable EnumerateInstallCandidateDirectories() + { + var seen = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var directory in EnumerateRawInstallCandidateDirectories()) + { + if (string.IsNullOrWhiteSpace(directory)) + continue; + + var fullPath = Path.GetFullPath(directory.Trim()); + if (seen.Add(fullPath)) + yield return fullPath; + } + } + + private static IEnumerable EnumerateRawInstallCandidateDirectories() + { + yield return Environment.GetEnvironmentVariable("QUASAR_INSTALL_DIR"); + yield return MagnetarPaths.GetQuasarDirectory(); + yield return AppContext.BaseDirectory; + yield return Directory.GetCurrentDirectory(); + } + private static IEnumerable GetQuasarExecutableFileNames() { yield return OperatingSystem.IsWindows() ? "Quasar.exe" : "Quasar"; diff --git a/Quasar/Components/Layout/MainLayout.razor b/Quasar/Components/Layout/MainLayout.razor index 5e1ccf60..454e927f 100644 --- a/Quasar/Components/Layout/MainLayout.razor +++ b/Quasar/Components/Layout/MainLayout.razor @@ -337,7 +337,7 @@ private async Task ShutdownQuasarAsync() { _isShuttingDown = true; - _shutdownStatus = "Shutting down Quasar… running servers continue."; + _shutdownStatus = "Draining Quasar… restart the service or task to bring the UI back."; await InvokeAsync(StateHasChanged); ShutdownService.ShutdownQuasarPreservingServers(); } diff --git a/Quasar/Components/Layout/QuasarControlDialog.razor b/Quasar/Components/Layout/QuasarControlDialog.razor index 48d9678e..8a2f5ce6 100644 --- a/Quasar/Components/Layout/QuasarControlDialog.razor +++ b/Quasar/Components/Layout/QuasarControlDialog.razor @@ -31,7 +31,7 @@ Class="quasar-control-action"> Shutdown Quasar - Servers continue to run without Quasar supervision. + Drain the web UI; servers continue without supervision. @@ -117,7 +117,7 @@ { QuasarControlAction.RestartQuasar => "Running servers continue to run.", QuasarControlAction.ShutdownAllServers => "Every running server will save and stop.", - _ => "Quasar will stop, but running servers continue.", + _ => "Quasar will drain, but running servers continue.", }; private string ConfirmationBody => _pendingAction switch @@ -127,7 +127,7 @@ QuasarControlAction.ShutdownAllServers => "Quasar stays online. Each running server receives a normal save-and-stop request, and its goal state is set to Off so Quasar does not restart it.", _ => - $"The Quasar web UI and supervisor stop. Running servers are left detached and can continue for {FormatOfflineGrace()} without Quasar before their agent offline policy takes over. Start Quasar again to re-adopt them.", + $"The web UI and supervisor stop, and the launcher stays drained so it will not restart them until the service, task, or foreground launcher is restarted. Running servers are left detached and can continue for {FormatOfflineGrace()} without Quasar before their agent offline policy takes over.", }; private void Select(QuasarControlAction action) diff --git a/Quasar/Components/Pages/Backup.razor b/Quasar/Components/Pages/Backup.razor index b5ed8450..45e119fe 100644 --- a/Quasar/Components/Pages/Backup.razor +++ b/Quasar/Components/Pages/Backup.razor @@ -341,7 +341,7 @@ Label="Backup folder" Variant="Variant.Outlined" Disabled="@BackupDirectoryEditorDisabled" - HelperText="Leave empty for the default data-dir Backups folder. Relative paths resolve under the Quasar data directory." /> + HelperText="Leave empty for the default install-root Backups folder. Relative paths resolve under the Quasar install directory." /> diff --git a/Quasar/Components/Pages/SteamWorkshopApiKeyDialog.razor b/Quasar/Components/Pages/SteamWorkshopApiKeyDialog.razor index 4a4edb94..2e8f4012 100644 --- a/Quasar/Components/Pages/SteamWorkshopApiKeyDialog.razor +++ b/Quasar/Components/Pages/SteamWorkshopApiKeyDialog.razor @@ -75,12 +75,12 @@ private static string GetPlatformStorageLocation() { if (OperatingSystem.IsWindows()) - return "the Quasar install directory, or QUASAR_DATA_DIR when that override is set"; + return "the Quasar install directory"; if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS()) - return "the Quasar install directory, or QUASAR_DATA_DIR when that override is set"; + return "the Quasar install directory"; - return "the Quasar data directory, or QUASAR_DATA_DIR when that override is set"; + return "the Quasar install directory"; } private static string GetPlatformFileProtectionDescription() @@ -91,6 +91,6 @@ if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS()) return "On this platform Quasar also restricts the credentials file to owner read/write permissions (0600) when the filesystem supports it."; - return "Restrict access to the Quasar data directory with the host operating system's file permissions."; + return "Restrict access to the Quasar install directory with the host operating system's file permissions."; } } diff --git a/Quasar/Models/QuasarBackupSettings.cs b/Quasar/Models/QuasarBackupSettings.cs index 0cd741d5..65ba9608 100644 --- a/Quasar/Models/QuasarBackupSettings.cs +++ b/Quasar/Models/QuasarBackupSettings.cs @@ -72,7 +72,7 @@ public static QuasarBackupRuleSettings Normalize(QuasarBackupRuleSettings? setti ///

/// Persistent configuration for the automatic backup scheduler, serialized to -/// backup-settings.json in the Quasar data directory. Each backup scope +/// backup-settings.json in the Quasar install directory. Each backup scope /// has its own rule. /// public sealed class QuasarBackupSettings diff --git a/Quasar/Program.cs b/Quasar/Program.cs index d473eb21..ebe29b28 100644 --- a/Quasar/Program.cs +++ b/Quasar/Program.cs @@ -413,7 +413,7 @@ or DedicatedServerProcessState.Restarting app.MapStaticAssets(); - // Runtime-uploaded branding assets live in the Quasar data directory + // Runtime-uploaded branding assets live in the Quasar install root // so web-service updates do not replace custom logos or favicons. var brandingAssetsDirectory = MagnetarPaths.GetQuasarBrandingDirectory(); Directory.CreateDirectory(brandingAssetsDirectory); @@ -449,7 +449,7 @@ or DedicatedServerProcessState.Restarting startupLogger.LogWarning("Quasar UI plugin load failed: {Error}", loadError); startupLogger.LogInformation( - "Quasar {Version} starting. BootstrapVersion={BootstrapVersion}; HostId={HostId}; DataDirectory={DataDirectory}.", + "Quasar {Version} starting. BootstrapVersion={BootstrapVersion}; HostId={HostId}; InstallRoot={InstallRoot}.", webServiceOptions.Version, string.IsNullOrWhiteSpace(webServiceOptions.BootstrapVersion) ? "none" : webServiceOptions.BootstrapVersion, webServiceOptions.HostId, diff --git a/Quasar/Properties/launchSettings.json b/Quasar/Properties/launchSettings.json index 96691fb5..b7b74c0c 100644 --- a/Quasar/Properties/launchSettings.json +++ b/Quasar/Properties/launchSettings.json @@ -5,7 +5,6 @@ "commandName": "Project", "dotnetRunMessages": false, "launchBrowser": false, - "applicationUrl": "http://0.0.0.0:8080", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/Quasar/Services/Backup/QuasarBackupSettingsService.cs b/Quasar/Services/Backup/QuasarBackupSettingsService.cs index 219a3282..6bafdfa5 100644 --- a/Quasar/Services/Backup/QuasarBackupSettingsService.cs +++ b/Quasar/Services/Backup/QuasarBackupSettingsService.cs @@ -8,7 +8,7 @@ namespace Quasar.Services.Backup; /// /// Singleton store for the automatic-backup schedule settings. Persists to -/// backup-settings.json in the Quasar data directory and picks up external +/// backup-settings.json in the Quasar install directory and picks up external /// edits via a debounced file watch, mirroring . /// public sealed class QuasarBackupSettingsService : IDisposable diff --git a/Quasar/Services/BrandingService.cs b/Quasar/Services/BrandingService.cs index 81becae4..d59f3980 100644 --- a/Quasar/Services/BrandingService.cs +++ b/Quasar/Services/BrandingService.cs @@ -8,8 +8,8 @@ namespace Quasar.Services; /// /// Singleton store for branding and theme configuration. Persists to -/// branding.json in the Quasar data directory and writes uploaded logo / -/// favicon assets into the Quasar data directory. Mirrors the file-watch +/// branding.json in the Quasar install directory and writes uploaded logo / +/// favicon assets into the Quasar install directory. Mirrors the file-watch /// debounce pattern used by so /// external edits are picked up live. /// diff --git a/Quasar/Services/DedicatedServerRuntimePreparer.cs b/Quasar/Services/DedicatedServerRuntimePreparer.cs index e5835f9d..cf788bee 100644 --- a/Quasar/Services/DedicatedServerRuntimePreparer.cs +++ b/Quasar/Services/DedicatedServerRuntimePreparer.cs @@ -4,6 +4,7 @@ using System.Text.RegularExpressions; using System.Xml; using System.Xml.Linq; +using Magnetar.Protocol.Runtime; using Quasar.Plugin.Abstractions.Manifests; using Quasar.Models; using Quasar.Services.Plugins; @@ -597,9 +598,11 @@ private static string TryComputeSha256Hex(string path) private static string? LocateAgentSourceDirectory() { - var stagedDirectory = Path.Combine(AppContext.BaseDirectory, "Agent"); - if (File.Exists(Path.Combine(stagedDirectory, AgentPluginFileName))) - return stagedDirectory; + foreach (var stagedDirectory in EnumerateAgentSourceCandidates()) + { + if (File.Exists(Path.Combine(stagedDirectory, AgentPluginFileName))) + return stagedDirectory; + } var directory = new DirectoryInfo(AppContext.BaseDirectory); for (var depth = 0; directory is not null && depth < 8; depth++, directory = directory.Parent) @@ -620,6 +623,28 @@ private static string TryComputeSha256Hex(string path) return null; } + private static IEnumerable EnumerateAgentSourceCandidates() + { + var seen = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var directory in EnumerateInstallCandidateDirectories()) + { + var candidate = Path.Combine(directory, "Agent"); + if (seen.Add(Path.GetFullPath(candidate))) + yield return candidate; + } + } + + private static IEnumerable EnumerateInstallCandidateDirectories() + { + var installDirectory = Environment.GetEnvironmentVariable("QUASAR_INSTALL_DIR"); + if (!string.IsNullOrWhiteSpace(installDirectory)) + yield return installDirectory.Trim(); + + yield return MagnetarPaths.GetQuasarDirectory(); + yield return AppContext.BaseDirectory; + yield return Directory.GetCurrentDirectory(); + } + private static string SanitizePathSegment(string value) { var invalid = Path.GetInvalidFileNameChars(); diff --git a/Quasar/Services/Plugins/QuasarUiPluginHubCatalogService.cs b/Quasar/Services/Plugins/QuasarUiPluginHubCatalogService.cs index cbd5065d..539c3a64 100644 --- a/Quasar/Services/Plugins/QuasarUiPluginHubCatalogService.cs +++ b/Quasar/Services/Plugins/QuasarUiPluginHubCatalogService.cs @@ -679,18 +679,26 @@ private async Task RunCompanionPluginBuildAsync( private static string GetPluginAbstractionsAssemblyPath() { - var baseDirectoryPath = Path.Combine(AppContext.BaseDirectory, PluginAbstractionsAssemblyFileName); - return File.Exists(baseDirectoryPath) ? baseDirectoryPath : string.Empty; + return EnumerateInstallCandidateDirectories() + .Select(directory => Path.Combine(directory, PluginAbstractionsAssemblyFileName)) + .FirstOrDefault(File.Exists) + ?? string.Empty; } private static string GetMagnetarProtocolAssemblyPath() { - var baseDirectoryPath = Path.Combine(AppContext.BaseDirectory, MagnetarProtocolAssemblyFileName); - if (File.Exists(baseDirectoryPath)) - return baseDirectoryPath; + foreach (var directory in EnumerateInstallCandidateDirectories()) + { + var baseDirectoryPath = Path.Combine(directory, MagnetarProtocolAssemblyFileName); + if (File.Exists(baseDirectoryPath)) + return baseDirectoryPath; + + var agentDirectoryPath = Path.Combine(directory, "Agent", MagnetarProtocolAssemblyFileName); + if (File.Exists(agentDirectoryPath)) + return agentDirectoryPath; + } - var agentDirectoryPath = Path.Combine(AppContext.BaseDirectory, "Agent", MagnetarProtocolAssemblyFileName); - return File.Exists(agentDirectoryPath) ? agentDirectoryPath : string.Empty; + return string.Empty; } private static async Task RunProcessAsync(ProcessStartInfo startInfo, string label, CancellationToken cancellationToken) @@ -1004,20 +1012,36 @@ private void SetDotNetSdkInstallInProgress(bool inProgress) private string GetInstallScriptPath() { - var candidates = new[] - { - Path.Combine(AppContext.BaseDirectory, "install.sh"), - Path.Combine(_environment.ContentRootPath, "install.sh"), - Path.Combine(_environment.ContentRootPath, "..", "install.sh"), - Path.Combine(Directory.GetCurrentDirectory(), "install.sh"), - }; - - return candidates + return EnumerateInstallCandidateDirectories() + .Concat([_environment.ContentRootPath, Path.Combine(_environment.ContentRootPath, "..")]) + .Select(directory => Path.Combine(directory, "install.sh")) .Select(Path.GetFullPath) .FirstOrDefault(File.Exists) ?? string.Empty; } + private static IEnumerable EnumerateInstallCandidateDirectories() + { + var seen = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var directory in EnumerateRawInstallCandidateDirectories()) + { + if (string.IsNullOrWhiteSpace(directory)) + continue; + + var fullPath = Path.GetFullPath(directory.Trim()); + if (seen.Add(fullPath)) + yield return fullPath; + } + } + + private static IEnumerable EnumerateRawInstallCandidateDirectories() + { + yield return Environment.GetEnvironmentVariable("QUASAR_INSTALL_DIR"); + yield return MagnetarPaths.GetQuasarDirectory(); + yield return AppContext.BaseDirectory; + yield return Directory.GetCurrentDirectory(); + } + private static string GetSdkVersion(string sdkLine) { var index = sdkLine.IndexOf(' ', StringComparison.Ordinal); diff --git a/Quasar/Services/QuasarShutdownService.cs b/Quasar/Services/QuasarShutdownService.cs index e9e8fd5b..343ddecb 100644 --- a/Quasar/Services/QuasarShutdownService.cs +++ b/Quasar/Services/QuasarShutdownService.cs @@ -1,6 +1,5 @@ using Magnetar.Protocol.Runtime; using Quasar.Models; -using System.Diagnostics; namespace Quasar.Services; @@ -104,179 +103,17 @@ public void RestartWorker(IProgress? progress = null) /// /// Stops Quasar while preserving managed servers. When launched by Bootstrap, - /// the worker first asks the launcher process to exit so it does not - /// respawn the worker. + /// the worker asks the launcher to enter a drained state so it does not + /// respawn the worker until the external service/task is restarted. /// public void ShutdownQuasarPreservingServers(IProgress? progress = null) { progress?.Report("Shutting down Quasar…"); _supervisor.BeginLauncherDrain(); - if (TryRequestSystemdServiceStop()) - return; - RequestLauncherShutdown(); _lifetime.StopApplication(); } - private bool TryRequestSystemdServiceStop() - { - if (!OperatingSystem.IsLinux()) - return false; - - var target = ResolveSystemdServiceTarget(); - if (target is null) - return false; - - try - { - var startInfo = new ProcessStartInfo - { - FileName = "systemctl", - UseShellExecute = false, - CreateNoWindow = true, - }; - AddSystemctlStopArguments(startInfo, target.Value); - - using var process = Process.Start(startInfo); - - if (process is null) - return false; - - if (!process.WaitForExit(3000)) - { - TryKillProcess(process); - _logger.LogWarning( - "systemctl stop {ServiceName} did not return before timeout; falling back to launcher shutdown request.", - target.Value.ServiceName); - return false; - } - - if (process.ExitCode == 0) - { - _logger.LogInformation("Requested systemd stop for {ServiceName}.", target.Value.ServiceName); - return true; - } - - _logger.LogWarning( - "systemctl stop {ServiceName} failed with exit code {ExitCode}; falling back to launcher shutdown request.", - target.Value.ServiceName, - process.ExitCode); - } - catch (Exception exception) - { - _logger.LogWarning(exception, "Failed requesting systemd stop; falling back to launcher shutdown request."); - } - - return false; - } - - private static void TryKillProcess(Process process) - { - try - { - if (!process.HasExited) - process.Kill(entireProcessTree: false); - } - catch - { - } - } - - private static void AddSystemctlStopArguments(ProcessStartInfo startInfo, SystemdServiceTarget target) - { - if (target.Scope == SystemdServiceScope.User) - startInfo.ArgumentList.Add("--user"); - - startInfo.ArgumentList.Add("--no-block"); - startInfo.ArgumentList.Add("stop"); - startInfo.ArgumentList.Add(target.ServiceName); - } - - private static SystemdServiceTarget? ResolveSystemdServiceTarget() - { - var serviceName = NormalizeServiceName(Environment.GetEnvironmentVariable("QUASAR_SYSTEMD_SERVICE")); - var scope = ParseSystemdScope(Environment.GetEnvironmentVariable("QUASAR_SYSTEMD_SCOPE")); - if (!string.IsNullOrWhiteSpace(serviceName) && scope is not null) - return new SystemdServiceTarget(serviceName, scope.Value); - - var detected = DetectSystemdServiceTargetFromCgroup(); - if (detected is null) - return null; - - return new SystemdServiceTarget(serviceName ?? detected.Value.ServiceName, scope ?? detected.Value.Scope); - } - - private static SystemdServiceTarget? DetectSystemdServiceTargetFromCgroup() - { - const string cgroupPath = "/proc/self/cgroup"; - if (!File.Exists(cgroupPath)) - return null; - - try - { - foreach (var line in File.ReadLines(cgroupPath)) - { - var pathStart = line.IndexOf(":/", StringComparison.Ordinal); - if (pathStart < 0) - continue; - - var path = line[(pathStart + 1)..]; - var serviceName = ExtractServiceName(path); - if (serviceName is null) - continue; - - if (path.Contains("/user.slice/", StringComparison.Ordinal) || - path.Contains("/user@", StringComparison.Ordinal)) - { - return new SystemdServiceTarget(serviceName, SystemdServiceScope.User); - } - - if (path.Contains("/system.slice/", StringComparison.Ordinal)) - return new SystemdServiceTarget(serviceName, SystemdServiceScope.System); - } - } - catch - { - } - - return null; - } - - private static string? ExtractServiceName(string cgroupPath) - { - foreach (var segment in cgroupPath.Split('/', StringSplitOptions.RemoveEmptyEntries).Reverse()) - { - if (segment.EndsWith(".service", StringComparison.Ordinal)) - return segment; - } - - return null; - } - - private static string? NormalizeServiceName(string? value) - { - if (string.IsNullOrWhiteSpace(value)) - return null; - - var serviceName = value.Trim(); - return serviceName.EndsWith(".service", StringComparison.Ordinal) - ? serviceName - : $"{serviceName}.service"; - } - - private static SystemdServiceScope? ParseSystemdScope(string? value) - { - if (string.IsNullOrWhiteSpace(value)) - return null; - - return value.Trim().ToLowerInvariant() switch - { - "user" => SystemdServiceScope.User, - "system" => SystemdServiceScope.System, - _ => null, - }; - } - private void RequestLauncherShutdown() { if (string.IsNullOrWhiteSpace(_options.LauncherToken)) @@ -288,18 +125,10 @@ private void RequestLauncherShutdown() } catch (Exception exception) { - _logger.LogWarning(exception, "Failed writing Quasar launcher shutdown request."); + _logger.LogWarning(exception, "Failed writing Quasar launcher drain request."); } } private static string GetLauncherShutdownRequestPath() => Path.Combine(MagnetarPaths.GetQuasarDirectory(), "launcher-shutdown-request"); - - private readonly record struct SystemdServiceTarget(string ServiceName, SystemdServiceScope Scope); - - private enum SystemdServiceScope - { - User, - System, - } } diff --git a/Quasar/Services/Updates/QuasarUpdateService.cs b/Quasar/Services/Updates/QuasarUpdateService.cs index da18fa5a..f6e66b27 100644 --- a/Quasar/Services/Updates/QuasarUpdateService.cs +++ b/Quasar/Services/Updates/QuasarUpdateService.cs @@ -888,13 +888,16 @@ private static bool HasUnresolvedAppSettingsConflict(string stageDirectory) private static string? ResolveCurrentAppSettingsPath(string stageDirectory) { - var candidates = new[] + var candidates = new List { - Path.Combine(Environment.GetEnvironmentVariable("QUASAR_INSTALL_DIR") ?? string.Empty, AppSettingsFileName), + Path.Combine(MagnetarPaths.GetQuasarDirectory(), AppSettingsFileName), + }; + + candidates.AddRange([ Path.Combine(AppContext.BaseDirectory, AppSettingsFileName), Path.Combine(Directory.GetCurrentDirectory(), AppSettingsFileName), Path.Combine(AppContext.BaseDirectory, "WebService", AppSettingsFileName), - }; + ]); foreach (var candidate in candidates) { @@ -919,9 +922,7 @@ private static async Task PersistAppSettingsBaseAsync(JsonObject release, Cancel private static void TrySyncActiveAppSettingsToInstallDirectory(string activeDirectory) { - var installDirectory = Environment.GetEnvironmentVariable("QUASAR_INSTALL_DIR"); - if (string.IsNullOrWhiteSpace(installDirectory)) - return; + var installDirectory = MagnetarPaths.GetQuasarDirectory(); var sourcePath = Path.Combine(activeDirectory, AppSettingsFileName); var destinationPath = Path.Combine(installDirectory, AppSettingsFileName); diff --git a/install.sh b/install.sh index 2c9ff33d..b38b8831 100755 --- a/install.sh +++ b/install.sh @@ -5,7 +5,6 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SERVICE_NAME="quasar" INSTALL_DIR="" -DATA_DIR="" PACKAGED_INSTALL=false CONFIGURATION="Release" RUNTIME="linux-x64" @@ -41,7 +40,6 @@ UI plugin installs and updates. Options: --install-dir Install directory (default: extracted installer root; source installs use /.local/share/Quasar) - --data-dir Quasar data directory (default: install directory) --service-name systemd service name (default: quasar) --user User to run Quasar as (system installs only; default: sudo caller) --user-service Install a user systemd service (default) @@ -457,10 +455,6 @@ while [[ $# -gt 0 ]]; do INSTALL_DIR="${2:?Missing value for --install-dir}" shift 2 ;; - --data-dir) - DATA_DIR="${2:?Missing value for --data-dir}" - shift 2 - ;; --service-name) SERVICE_NAME="${2:?Missing value for --service-name}" shift 2 @@ -615,11 +609,7 @@ if [[ -z "$INSTALL_DIR" ]]; then INSTALL_DIR="$RUN_HOME/.local/share/Quasar" fi fi -if [[ -z "$DATA_DIR" ]]; then - DATA_DIR="$INSTALL_DIR" -fi INSTALL_DIR="$(realpath -m "$INSTALL_DIR")" -DATA_DIR="$(realpath -m "$DATA_DIR")" case "$INSTALL_DIR" in ""|"/"|"/bin"|"/boot"|"/dev"|"/etc"|"/home"|"/lib"|"/lib64"|"/proc"|"/root"|"/run"|"/sbin"|"/sys"|"/tmp"|"/usr"|"/var") @@ -628,13 +618,6 @@ case "$INSTALL_DIR" in ;; esac -case "$DATA_DIR" in - ""|"/"|"/bin"|"/boot"|"/dev"|"/etc"|"/home"|"/lib"|"/lib64"|"/proc"|"/root"|"/run"|"/sbin"|"/sys"|"/tmp"|"/usr"|"/var") - echo "Refusing unsafe data directory: $DATA_DIR" >&2 - exit 1 - ;; -esac - require_dotnet_installation ensure_optional_ui_plugin_sdk @@ -663,9 +646,7 @@ SuccessExitStatus=130 143 Environment=QUASAR_MODE=Service Environment=QUASAR_OPEN_BROWSER_ON_START=false Environment=HOME=$RUN_HOME -Environment=QUASAR_DATA_DIR=$DATA_DIR -Environment=QUASAR_SYSTEMD_SERVICE=$SERVICE_NAME.service -Environment=QUASAR_SYSTEMD_SCOPE=system +Environment=QUASAR_INSTALL_DIR=$INSTALL_DIR [Install] WantedBy=multi-user.target @@ -697,9 +678,7 @@ SuccessExitStatus=130 143 Environment=QUASAR_MODE=Service Environment=QUASAR_OPEN_BROWSER_ON_START=false Environment=HOME=$RUN_HOME -Environment=QUASAR_DATA_DIR=$DATA_DIR -Environment=QUASAR_SYSTEMD_SERVICE=$SERVICE_NAME.service -Environment=QUASAR_SYSTEMD_SCOPE=user +Environment=QUASAR_INSTALL_DIR=$INSTALL_DIR [Install] WantedBy=default.target @@ -737,28 +716,6 @@ copy_if_different() { cp -a "$source" "$destination" } -cleanup_old_opt_install() { - local old_install_dir="/opt/quasar" - if [[ "$INSTALL_MODE" != "user" || "$INSTALL_DIR" == "$old_install_dir" || ! -x "$old_install_dir/uninstall.sh" ]]; then - return - fi - - echo "Old system install found at $old_install_dir." - local uninstall_args=(--install-dir "$old_install_dir" --purge) - if grep -q -- "--system" "$old_install_dir/uninstall.sh"; then - uninstall_args=(--system "${uninstall_args[@]}") - fi - - if [[ "${EUID}" -eq 0 ]]; then - "$old_install_dir/uninstall.sh" "${uninstall_args[@]}" || true - elif have sudo; then - echo "Removing old system install with sudo..." - sudo "$old_install_dir/uninstall.sh" "${uninstall_args[@]}" || true - else - echo "sudo not found; old system install remains at $old_install_dir." >&2 - fi -} - publish_quasar() { local build_version="$1" local nuget_version="$2" @@ -847,13 +804,8 @@ fi echo "Installing Quasar to $INSTALL_DIR..." if [[ "${EUID}" -eq 0 ]]; then install -d -m 0755 -o "$RUN_USER" -g "$RUN_GROUP" "$INSTALL_DIR" - install -d -m 0755 -o "$RUN_USER" -g "$RUN_GROUP" "$DATA_DIR" else install -d -m 0755 "$INSTALL_DIR" - install -d -m 0755 "$DATA_DIR" -fi -if [[ "$DATA_DIR" != "$INSTALL_DIR" && "$DATA_DIR" != "$INSTALL_DIR"/* ]]; then - find "$INSTALL_DIR" -mindepth 1 -maxdepth 1 -exec rm -rf -- {} + fi cp -a "$PUBLISH_DIR/." "$INSTALL_DIR/" copy_if_different "$SCRIPT_DIR/install.sh" "$INSTALL_DIR/install.sh" @@ -887,8 +839,6 @@ if [[ "$ENABLE_SERVICE" == "true" ]]; then enable_service fi -cleanup_old_opt_install - if [[ "$START_SERVICE" == "true" ]]; then restart_service fi @@ -898,7 +848,6 @@ Installed Quasar. Service: $SERVICE_NAME.service ($INSTALL_MODE) Install dir: $INSTALL_DIR -Data dir: $DATA_DIR Run user: $RUN_USER Renice helper: @@ -915,3 +864,5 @@ else echo "To run the user service before login, enable linger once:" echo " sudo loginctl enable-linger $RUN_USER" fi +echo +echo "UI Shutdown Quasar drains the worker; run the restart command above to bring it back." diff --git a/scripts/generate-analytics-data.py b/scripts/generate-analytics-data.py index e76fe6e7..769a755b 100755 --- a/scripts/generate-analytics-data.py +++ b/scripts/generate-analytics-data.py @@ -22,20 +22,15 @@ def clamp(value: float, min_value: float, max_value: float) -> float: return max(min_value, min(max_value, value)) -def get_quasar_root(data_dir: str | None) -> Path: - if data_dir: - return Path(data_dir).expanduser().resolve() +def get_quasar_root(install_dir: str | None) -> Path: + if install_dir: + return Path(install_dir).expanduser().resolve() - env_override = os.getenv("QUASAR_DATA_DIR") + env_override = os.getenv("QUASAR_INSTALL_DIR") if env_override: return Path(env_override).expanduser().resolve() - if os.name == "nt": - appdata = os.getenv("APPDATA") - if appdata: - return Path(appdata) / "Quasar" - - return Path.home() / ".config" / "Quasar" + return Path.cwd().resolve() def list_servers(quasar_root: Path) -> list[str]: @@ -140,7 +135,7 @@ def generate_series( def build_args(): parser = argparse.ArgumentParser(description="Generate Quasar analytics.jsonl test data.") - parser.add_argument("--data-dir", default=None, help="Override Quasar root directory") + parser.add_argument("--install-dir", default=None, help="Override Quasar install root directory") parser.add_argument("--days", type=int, default=30, help="How many days to generate (default 30)") parser.add_argument("--server", action="append", help="Server uniqueName; repeatable") parser.add_argument("--seed", type=int, default=1337, help="Random seed for repeatable output") @@ -158,7 +153,7 @@ def main(): if args.raw_hours <= 0: raise ValueError("--raw-hours must be > 0") - quasar_root = get_quasar_root(args.data_dir) + quasar_root = get_quasar_root(args.install_dir) servers_dir = quasar_root / "Magnetars" if args.server: diff --git a/scripts/install.ps1 b/scripts/install.ps1 index 09fab034..76d90b78 100644 --- a/scripts/install.ps1 +++ b/scripts/install.ps1 @@ -296,7 +296,6 @@ Installed Quasar. Scheduled task: $TaskName Install dir: $InstallDir -Data dir: $InstallDir Run as: $runAs Web UI: $uiUrl @@ -304,6 +303,7 @@ $startHint The task starts at boot and restarts the launcher on failure (keep-alive). On first start the launcher downloads the Quasar web UI from GitHub and then serves it at $uiUrl. +UI Shutdown Quasar drains the worker; stop and start the task to bring it back. Manage the task: Get-ScheduledTask -TaskName '$TaskName' diff --git a/scripts/readme-install-linux.md b/scripts/readme-install-linux.md index 436d9c49..a266d819 100644 --- a/scripts/readme-install-linux.md +++ b/scripts/readme-install-linux.md @@ -13,9 +13,11 @@ cd Quasar ``` Quasar starts, opens `http://localhost:8080` in your browser, and prints log -output to the console. Press `Ctrl+C` to stop. On first start the launcher -downloads the Quasar web UI from GitHub and caches it locally. The listening -port is configurable — see [Configuration](Docs/Configuration.md). +output to the console. Press `Ctrl+C` to stop the launcher. The UI **Shutdown +Quasar** action drains the web worker and leaves the foreground launcher idle; +press `Ctrl+C`, then run `./Quasar serve` again when you want the UI back. On +first start the launcher downloads the Quasar web UI from GitHub and caches it +locally. The listening port is configurable — see [Configuration](Docs/Configuration.md). ### Install as a background service (systemd) @@ -34,13 +36,12 @@ tar -xzf quasar-installer-linux.tar.gz -C ~/.local/share/Quasar --strip-componen # ~/.local/share/Quasar/install.sh --start --install-ui-plugin-sdk ``` -This installs Quasar in the extracted folder, keeps Quasar state in the same -folder by default, and starts the user `quasar.service`. Pass `--system` with -`sudo` for a machine-wide service, `--install-dir ` to copy it elsewhere, -or `--data-dir ` to store Quasar state elsewhere. The web UI is then served at +This installs Quasar in the extracted folder and starts the user +`quasar.service`. Pass `--system` with `sudo` for a machine-wide service or +`--install-dir ` to install Quasar elsewhere. The web UI is then served at `http://localhost:8080`. In the installed user service, the UI **Shutdown -Quasar** action requests `systemctl --user stop quasar.service`. Manage the -service with: +Quasar** action drains the web worker and leaves `quasar.service` running without +respawning it. Restart the service to bring the UI and supervisor back: ```bash systemctl --user status quasar.service diff --git a/scripts/readme-install-windows.md b/scripts/readme-install-windows.md index 0816f4f8..d7572031 100644 --- a/scripts/readme-install-windows.md +++ b/scripts/readme-install-windows.md @@ -17,9 +17,11 @@ cd C:\quasar\Quasar ``` Quasar starts, opens in your browser, and prints log -output to the console. Press `Ctrl+C` to stop. On first start the launcher -downloads the Quasar web UI from GitHub and caches it locally. The listening -port is configurable — see [Configuration](Docs/Configuration.md). +output to the console. Press `Ctrl+C` to stop the launcher. The UI **Shutdown +Quasar** action drains the web worker and leaves the foreground launcher idle; +press `Ctrl+C`, then run `.\Quasar.exe serve` again when you want the UI back. +On first start the launcher downloads the Quasar web UI from GitHub and caches +it locally. The listening port is configurable — see [Configuration](Docs/Configuration.md). ### Install as a background service (Scheduled Task) @@ -36,6 +38,8 @@ folder by default, and registers a **Scheduled Task** named `Quasar` that starts the launcher at boot and restarts it on failure. The web UI is then served at . Pass `-InstallDir ` to copy it elsewhere, or `-User ` to run as a specific service account instead of the current user. +The UI **Shutdown Quasar** action drains the web worker and leaves the task +running idle. Stop and start the task to bring the UI and supervisor back. Manage the task: From f59ae088869aadcb875e6008bfdf100322378042 Mon Sep 17 00:00:00 2001 From: Owen de Bree Date: Sun, 5 Jul 2026 16:36:20 +0200 Subject: [PATCH 3/3] fix(dev): add install root file override Let Rider launch profiles point at an ignored .quasar-install-dir file instead of committing a developer-specific QUASAR_INSTALL_DIR path. QUASAR_INSTALL_DIR still wins when set directly; the file fallback is only for direct worker development. --- .gitignore | 1 + Docs/BuildingAndDevelopment.md | 18 ++-- Docs/Configuration.md | 12 +-- Magnetar.Protocol/Runtime/MagnetarPaths.cs | 96 +++++++++++++++++++++- Quasar/Properties/launchSettings.json | 3 +- 5 files changed, 115 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index 86d7775a..5e81d912 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ *.user *.userosscache *.sln.docstates +.quasar-install-dir # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs diff --git a/Docs/BuildingAndDevelopment.md b/Docs/BuildingAndDevelopment.md index 3f168e67..a89e0e98 100644 --- a/Docs/BuildingAndDevelopment.md +++ b/Docs/BuildingAndDevelopment.md @@ -124,11 +124,19 @@ direct worker uses its app base directory as the install root. The Bootstrap launcher and release/update cutover paths are covered by the packaged installer and release workflows rather than a local deploy helper. -To run the UI worker from Rider against an installed service/deployed tree, set -`QUASAR_INSTALL_DIR` to that Quasar root. The worker launch profile deliberately -does not set `applicationUrl`, so host/port come from that install root's -`appsettings.json`. Packaged assets and helper scripts are also probed from the -same install root. +To run the UI worker from Rider against an installed service/deployed tree, +write that root path into `.quasar-install-dir` at the repository root. The file +is ignored by git and is read through `QUASAR_INSTALL_DIR_FILE` from the worker +launch profile: + +```bash +printf '%s\n' "$HOME/.local/share/Quasar" > .quasar-install-dir +``` + +`QUASAR_INSTALL_DIR` still works and wins when set directly. The worker launch +profile deliberately does not set `applicationUrl`, so host/port come from that +install root's `appsettings.json`. Packaged assets and helper scripts are also +probed from the same install root. Generate synthetic analytics data for local testing: diff --git a/Docs/Configuration.md b/Docs/Configuration.md index 99bd4740..843220e0 100644 --- a/Docs/Configuration.md +++ b/Docs/Configuration.md @@ -74,8 +74,9 @@ Both the **Bootstrap launcher** (`Quasar`/`Quasar.exe`) and the replaceable **we worker** read JSON config from the Quasar install root. Auto-updates preserve `appsettings.json` during Bootstrap self-updates, and UI-worker activation updates it from the staged, resolved `appsettings.json` so Bootstrap and the -managed worker keep the same base settings. Set `QUASAR_INSTALL_DIR` for direct -worker/dev runs that need to target a deployed Quasar root. +managed worker keep the same base settings. Set `QUASAR_INSTALL_DIR`, or create +the ignored `.quasar-install-dir` file used by the development launch profile, +for direct worker/dev runs that need to target a deployed Quasar root. The shipped defaults are defined in [`Quasar/appsettings.json`](../Quasar/appsettings.json). @@ -302,9 +303,10 @@ Running the worker directly with `dotnet run --project Quasar/Quasar.csproj` use [`Quasar/Properties/launchSettings.json`](../Quasar/Properties/launchSettings.json) only for development environment variables. It does not set `applicationUrl`, so the worker still reads `Quasar:Host` / `Quasar:Port` from normal configuration. -Set those values in `QUASAR_INSTALL_DIR/appsettings.json` when running the worker -from Rider against an installed Quasar root, or use `QUASAR_WEB_HOST` -/ `QUASAR_WEB_PORT` for a one-off direct-worker override. +Set those values in `QUASAR_INSTALL_DIR/appsettings.json`, or in the root named +by `.quasar-install-dir`, when running the worker from Rider against an +installed Quasar root. Use `QUASAR_WEB_HOST` / `QUASAR_WEB_PORT` for a one-off +direct-worker override. ## Browser auto-open on start diff --git a/Magnetar.Protocol/Runtime/MagnetarPaths.cs b/Magnetar.Protocol/Runtime/MagnetarPaths.cs index f501b421..ad5e2dbd 100644 --- a/Magnetar.Protocol/Runtime/MagnetarPaths.cs +++ b/Magnetar.Protocol/Runtime/MagnetarPaths.cs @@ -1,21 +1,43 @@ using System; +using System.Collections.Generic; using System.IO; namespace Magnetar.Protocol.Runtime; public static class MagnetarPaths { + private const string InstallDirectoryEnvironmentVariable = "QUASAR_INSTALL_DIR"; + private const string InstallDirectoryFileEnvironmentVariable = "QUASAR_INSTALL_DIR_FILE"; + private const string DevInstallDirectoryFileName = ".quasar-install-dir"; + private static string? _cachedQuasarDirectory; + // ------------------------------------------------------------------------- // Root - everything lives under QUASAR_INSTALL_DIR when set. Bootstrap sets - // it to the launcher install root for packaged installs. Without the - // variable, direct worker sessions use the app base directory. + // it to the launcher install root for packaged installs. Direct worker + // sessions may read an ignored .quasar-install-dir file; otherwise they use + // the app base directory. // ------------------------------------------------------------------------- public static string GetQuasarDirectory() { - var envOverride = Environment.GetEnvironmentVariable("QUASAR_INSTALL_DIR"); + var cachedDirectory = _cachedQuasarDirectory; + if (cachedDirectory is not null) + return cachedDirectory; + + var resolvedDirectory = ResolveQuasarDirectory(); + _cachedQuasarDirectory = resolvedDirectory; + return resolvedDirectory; + } + + private static string ResolveQuasarDirectory() + { + var envOverride = Environment.GetEnvironmentVariable(InstallDirectoryEnvironmentVariable); if (!string.IsNullOrWhiteSpace(envOverride)) - return envOverride.Trim(); + return Path.GetFullPath(envOverride.Trim()); + + var fileOverride = TryReadInstallDirectoryOverrideFile(); + if (fileOverride is not null) + return fileOverride; return Path.GetFullPath(AppContext.BaseDirectory); } @@ -193,4 +215,70 @@ private static string SanitizePathSegment(string value) return sanitized; } + + private static string? TryReadInstallDirectoryOverrideFile() + { + foreach (var filePath in EnumerateInstallDirectoryOverrideFiles()) + { + if (!File.Exists(filePath)) + continue; + + try + { + var value = File.ReadAllText(filePath).Trim(); + if (string.IsNullOrWhiteSpace(value)) + continue; + + var baseDirectory = Path.GetDirectoryName(filePath) ?? Directory.GetCurrentDirectory(); + return Path.GetFullPath(Path.IsPathRooted(value) + ? value + : Path.Combine(baseDirectory, value)); + } + catch + { + } + } + + return null; + } + + private static IEnumerable EnumerateInstallDirectoryOverrideFiles() + { + var explicitFile = Environment.GetEnvironmentVariable(InstallDirectoryFileEnvironmentVariable); + if (!string.IsNullOrWhiteSpace(explicitFile)) + { + var trimmed = explicitFile.Trim(); + if (Path.IsPathRooted(trimmed)) + { + yield return trimmed; + yield break; + } + + foreach (var directory in EnumerateProbeDirectories()) + yield return Path.Combine(directory, trimmed); + + yield break; + } + + foreach (var directory in EnumerateProbeDirectories()) + yield return Path.Combine(directory, DevInstallDirectoryFileName); + } + + private static IEnumerable EnumerateProbeDirectories() + { + var seen = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var root in new[] { Directory.GetCurrentDirectory(), AppContext.BaseDirectory }) + { + if (string.IsNullOrWhiteSpace(root)) + continue; + + var directory = new DirectoryInfo(root); + for (var depth = 0; directory is not null && depth < 8; depth++, directory = directory.Parent) + { + var fullPath = Path.GetFullPath(directory.FullName); + if (seen.Add(fullPath)) + yield return fullPath; + } + } + } } diff --git a/Quasar/Properties/launchSettings.json b/Quasar/Properties/launchSettings.json index b7b74c0c..15a953e3 100644 --- a/Quasar/Properties/launchSettings.json +++ b/Quasar/Properties/launchSettings.json @@ -6,7 +6,8 @@ "dotnetRunMessages": false, "launchBrowser": false, "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" + "ASPNETCORE_ENVIRONMENT": "Development", + "QUASAR_INSTALL_DIR_FILE": ".quasar-install-dir" } } }