@stacksjs/ts-cloud 0.11.1 → 0.11.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/dist/aws/index.js +1 -1
  2. package/dist/bin/{chunk-6vjrts39.js → chunk-0zwknfwp.js} +1 -1
  3. package/dist/bin/chunk-104xrc2w.js +1 -0
  4. package/dist/bin/{chunk-jce28gnz.js → chunk-3aph4c1w.js} +2 -2
  5. package/dist/bin/{chunk-4a97kbk1.js → chunk-4q6tad44.js} +2 -2
  6. package/dist/bin/{chunk-md2k3n21.js → chunk-4xhj37nj.js} +1 -1
  7. package/dist/bin/{chunk-ftse39wf.js → chunk-56wvjysz.js} +2 -2
  8. package/dist/bin/chunk-5nkqza92.js +1 -0
  9. package/dist/bin/chunk-64vczwwt.js +1 -0
  10. package/dist/bin/{chunk-y3rm37z1.js → chunk-6tfwm33r.js} +3 -3
  11. package/dist/bin/chunk-7g2ahkse.js +1 -0
  12. package/dist/bin/{chunk-9rsn48qg.js → chunk-81hmza39.js} +2 -2
  13. package/dist/bin/{chunk-gskbezam.js → chunk-82mj52xr.js} +2 -2
  14. package/dist/bin/{chunk-mwgxyc0z.js → chunk-8khgprf6.js} +1 -1
  15. package/dist/bin/{chunk-mbnwt3r5.js → chunk-9a88fp00.js} +2 -2
  16. package/dist/bin/{chunk-21gggxvf.js → chunk-a7w13qfm.js} +2 -2
  17. package/dist/bin/{chunk-wzepfqf4.js → chunk-b0e39tpv.js} +6 -6
  18. package/dist/bin/{chunk-r6x7beew.js → chunk-b4wt9jcg.js} +2 -2
  19. package/dist/bin/{chunk-4a85nk2q.js → chunk-btsyjhk7.js} +2 -2
  20. package/dist/bin/{chunk-nmkm1f68.js → chunk-c0bdafbx.js} +2 -2
  21. package/dist/bin/{chunk-67jsyn0g.js → chunk-cbsys5v8.js} +2 -2
  22. package/dist/bin/{chunk-kbtrr0c3.js → chunk-cd0ps58j.js} +1 -1
  23. package/dist/bin/{chunk-fpcghdr3.js → chunk-cq9mca3h.js} +3 -3
  24. package/dist/bin/{chunk-9mydnqr6.js → chunk-d7ke90zt.js} +2 -2
  25. package/dist/bin/chunk-djg4zyqk.js +1 -0
  26. package/dist/bin/chunk-dkaz333b.js +1 -0
  27. package/dist/bin/{chunk-ww770qpn.js → chunk-dz1ec589.js} +2 -2
  28. package/dist/bin/{chunk-xev7qr2h.js → chunk-e2bybahr.js} +2 -2
  29. package/dist/bin/{chunk-dbv8w56s.js → chunk-e5ab5twy.js} +2 -2
  30. package/dist/bin/chunk-edvvx3hg.js +1 -0
  31. package/dist/bin/{chunk-ks4ewy1s.js → chunk-ehc63fvs.js} +1 -1
  32. package/dist/bin/chunk-f06c5np9.js +1 -0
  33. package/dist/bin/{chunk-nkpf91d3.js → chunk-g0fm1xcs.js} +1 -1
  34. package/dist/bin/chunk-gq8794k6.js +1 -0
  35. package/dist/bin/{chunk-4vdv41nh.js → chunk-hq9x489e.js} +1 -1
  36. package/dist/bin/{chunk-0y89hs67.js → chunk-ja1vjdn1.js} +1 -1
  37. package/dist/bin/{chunk-zwwnt4x1.js → chunk-k3120rx6.js} +1 -1
  38. package/dist/bin/{chunk-q182t9ba.js → chunk-kg61p5hw.js} +3 -3
  39. package/dist/bin/chunk-m189194f.js +1 -0
  40. package/dist/bin/{chunk-hej39dwr.js → chunk-mcr0r4at.js} +2 -2
  41. package/dist/bin/chunk-mfrf9q4b.js +2 -0
  42. package/dist/bin/{chunk-4kbhbfq8.js → chunk-my3ewh3a.js} +2 -2
  43. package/dist/bin/chunk-nw3d4k52.js +1 -0
  44. package/dist/bin/chunk-p70bc9yr.js +1 -0
  45. package/dist/bin/{chunk-neampxq1.js → chunk-r6b3pq31.js} +2 -2
  46. package/dist/bin/{chunk-c1j9v7ee.js → chunk-s4yzes15.js} +2 -2
  47. package/dist/bin/{chunk-41yqpdv7.js → chunk-sj5csg49.js} +1 -1
  48. package/dist/bin/chunk-tvz9c388.js +1 -0
  49. package/dist/bin/{chunk-e1bfd1yv.js → chunk-w32xv8n4.js} +2 -2
  50. package/dist/bin/chunk-wkx799z2.js +1 -0
  51. package/dist/bin/{chunk-nyc2jxd8.js → chunk-xhwqpgwq.js} +1 -1
  52. package/dist/bin/{chunk-zejwh9cy.js → chunk-xk08030d.js} +2 -2
  53. package/dist/bin/chunk-y1h63vpm.js +1 -0
  54. package/dist/bin/chunk-zdt2rjk6.js +1 -0
  55. package/dist/bin/chunk-zh2d4704.js +1 -0
  56. package/dist/bin/{chunk-35xstvnq.js → chunk-znnawt0k.js} +1 -1
  57. package/dist/bin/{chunk-26cj89s6.js → chunk-zpe64t4r.js} +1 -1
  58. package/dist/bin/{chunk-a2t1e5yb.js → chunk-zsf6pccz.js} +1 -1
  59. package/dist/bin/cli.js +237 -237
  60. package/dist/bin/dashboard-server.js +1 -1
  61. package/dist/cdn/cloudflare-settings.d.ts +16 -0
  62. package/dist/cdn/cloudflare.d.ts +20 -0
  63. package/dist/{chunk-2m09t0c0.js → chunk-6v4k9ekm.js} +2 -2
  64. package/dist/{chunk-rcxq9aaa.js → chunk-7pff0rv9.js} +1 -1
  65. package/dist/chunk-hwan3cev.js +2 -0
  66. package/dist/{chunk-mch30cyc.js → chunk-m4vqpkpp.js} +1 -1
  67. package/dist/deploy/index.js +1 -1
  68. package/dist/dns/cloudflare.d.ts +17 -0
  69. package/dist/dns/godaddy.d.ts +19 -1
  70. package/dist/dns/index.js +1 -1
  71. package/dist/dns/zone-migration.d.ts +0 -8
  72. package/dist/index.js +16 -16
  73. package/dist/ui/404.html +1 -1
  74. package/dist/ui/accept-invitation.html +1 -1
  75. package/dist/ui/access-denied.html +1 -1
  76. package/dist/ui/account/automation.html +5 -5
  77. package/dist/ui/account/security.html +2 -2
  78. package/dist/ui/applications/compose.html +6 -6
  79. package/dist/ui/applications/new.html +2 -2
  80. package/dist/ui/data/backups.html +6 -6
  81. package/dist/ui/data/services.html +5 -5
  82. package/dist/ui/data/volumes.html +6 -6
  83. package/dist/ui/index.html +6 -6
  84. package/dist/ui/infrastructure/topology.html +5 -5
  85. package/dist/ui/integrations.html +1 -1
  86. package/dist/ui/operations/alerts.html +5 -5
  87. package/dist/ui/operations/configuration.html +6 -6
  88. package/dist/ui/operations/jobs.html +5 -5
  89. package/dist/ui/operations/maintenance.html +5 -5
  90. package/dist/ui/operations/observability.html +6 -6
  91. package/dist/ui/operations/previews.html +6 -6
  92. package/dist/ui/operations/queue.html +6 -6
  93. package/dist/ui/operations/regions.html +5 -5
  94. package/dist/ui/operations/releases.html +6 -6
  95. package/dist/ui/operations/spend.html +6 -6
  96. package/dist/ui/operations/workloads.html +6 -6
  97. package/dist/ui/security.html +1 -1
  98. package/dist/ui/server/actions.html +6 -6
  99. package/dist/ui/server/activity.html +1 -1
  100. package/dist/ui/server/capacity.html +5 -5
  101. package/dist/ui/server/database.html +5 -5
  102. package/dist/ui/server/deployments.html +5 -5
  103. package/dist/ui/server/diagnostics.html +1 -1
  104. package/dist/ui/server/firewall.html +5 -5
  105. package/dist/ui/server/fleet.html +6 -6
  106. package/dist/ui/server/logs.html +6 -6
  107. package/dist/ui/server/metrics.html +5 -5
  108. package/dist/ui/server/security.html +2 -2
  109. package/dist/ui/server/services.html +1 -1
  110. package/dist/ui/server/sites.html +6 -6
  111. package/dist/ui/server/ssh-keys.html +6 -6
  112. package/dist/ui/server/team.html +6 -6
  113. package/dist/ui/server/terminal.html +2 -2
  114. package/dist/ui/serverless/alarms.html +6 -6
  115. package/dist/ui/serverless/assets.html +2 -2
  116. package/dist/ui/serverless/cost.html +2 -2
  117. package/dist/ui/serverless/data.html +6 -6
  118. package/dist/ui/serverless/deployments.html +2 -2
  119. package/dist/ui/serverless/firewall.html +1 -1
  120. package/dist/ui/serverless/functions.html +6 -6
  121. package/dist/ui/serverless/logs.html +6 -6
  122. package/dist/ui/serverless/metrics.html +1 -1
  123. package/dist/ui/serverless/queues.html +6 -6
  124. package/dist/ui/serverless/secrets.html +5 -5
  125. package/dist/ui/serverless/traces.html +6 -6
  126. package/dist/ui/serverless.html +5 -5
  127. package/package.json +3 -3
  128. package/dist/bin/chunk-0djsffn6.js +0 -1
  129. package/dist/bin/chunk-0t3sev1j.js +0 -1
  130. package/dist/bin/chunk-6tct7e89.js +0 -1
  131. package/dist/bin/chunk-7v5ff3vc.js +0 -1
  132. package/dist/bin/chunk-80nra92y.js +0 -1
  133. package/dist/bin/chunk-akbfefwq.js +0 -1
  134. package/dist/bin/chunk-b704nznp.js +0 -1
  135. package/dist/bin/chunk-cjz36ths.js +0 -1
  136. package/dist/bin/chunk-cxd5cevb.js +0 -2
  137. package/dist/bin/chunk-dxchg0g1.js +0 -1
  138. package/dist/bin/chunk-g0ewbkbq.js +0 -1
  139. package/dist/bin/chunk-gvs85t2j.js +0 -1
  140. package/dist/bin/chunk-khrye4x9.js +0 -1
  141. package/dist/bin/chunk-memfxrcn.js +0 -1
  142. package/dist/bin/chunk-pqr8jqnd.js +0 -1
  143. package/dist/bin/chunk-rfqk5xym.js +0 -1
  144. package/dist/bin/chunk-wy20ztb6.js +0 -1
  145. package/dist/bin/chunk-xcqmwphz.js +0 -1
  146. package/dist/chunk-qtp90j44.js +0 -2
@@ -1,5 +1,5 @@
1
- <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt3k56ealftvbz"><meta name="title" content="stx Project"><meta name="description" content="A website built with stx templating engine"><meta property="og:title" content="stx Project"><meta property="og:description" content="A website built with stx templating engine"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="stx Project"><meta name="twitter:description" content="A website built with stx templating engine"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud · Backups &amp; recovery</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-runtime src="/_stx/runtime.c696d17a.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
- function __stx_setup_1787353530165_1() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt3tj2le8bg297"><meta name="title" content="stx Project"><meta name="description" content="A website built with stx templating engine"><meta property="og:title" content="stx Project"><meta property="og:description" content="A website built with stx templating engine"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="stx Project"><meta name="twitter:description" content="A website built with stx templating engine"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud · Backups &amp; recovery</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-runtime src="/_stx/runtime.c696d17a.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
+ function __stx_setup_1787369294976_5() {
3
3
  const { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
4
4
 
5
5
  var actionError = undefined;
@@ -367,9 +367,9 @@ verifyPoint = __stxBundle_0750f100c970["verifyPoint"];
367
367
  when = __stxBundle_0750f100c970["when"];
368
368
  return { actionError, activeJobs, api, busy, bytes, createDestination, createPolicy, destinationName, destinationOpen, endpoint, inventory, jobsForPoint, lastUpdatedAt, latestFailures, load, notice, openRestore, policyName, policyOpen, pollingError, pollingState, post, protectPoint, refresh, restorePlan, restoreTarget, runPolicy, safeError, selectedPoint, services, submitRestore, tab, testDestination, tone, values, verifyPoint, when, __stxBundle_0750f100c970 };
369
369
  }
370
- window.__stx_latestSetup=__stx_setup_1787353530165_1;
371
- if(window.stx)window.stx._latestSetup=__stx_setup_1787353530165_1;
372
- </script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.906ee17c.css"></head><body data-stx="__stx_setup_1787353530165_1"><a data-stx-scope="stx_scope_nav_2" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>Project</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="" href="/operations/maintenance?env=production">Maintenance & DR</a><a class="" href="/operations/workloads?env=production">Workloads</a><a class="" href="/operations/observability?env=production">Observability</a><a class="" href="/operations/alerts?env=production">Alerts & health</a><a class="" href="/operations/spend?env=production">Spend & budgets</a><a href="/server/metrics?env=production">Metrics</a><a href="/server/services?env=production">Runtime services</a><a class="" href="/operations/jobs?env=production">Workers & schedules</a><a class="" href="/operations/configuration?env=production">Environment &amp; secrets</a><a class="active" href="/data/backups?env=production">Backups &amp; recovery</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/actions?env=production">Run operations</a></section><section class="nav-group"><h2>Infrastructure</h2><a class="" href="/infrastructure/topology?env=production">Infrastructure map</a><a class="" href="/data/services?env=production">Data services</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/firewall?env=production">Network & firewall</a><a href="/server/ssh-keys?env=production">SSH keys</a><a class="" href="/server/fleet?env=production">Fleet inventory</a><a class="" href="/server/capacity?env=production">Capacity & placement</a><a href="/security?env=production">Security posture</a><a href="/server/terminal?env=production">Terminal</a></section><section class="nav-group"><h2>Organization</h2><a class="" href="/server/team?env=production">People & access</a><a class="" href="/account/automation?env=production">API & automation</a></section><section class="nav-group"><h2>Account</h2><a class="" href="/account/security?env=production">Sign-in & security</a></section></div><form method="post" action="/api/logout" class="signout"><button type="submit">Sign out</button></form></aside><dialog class="command-palette" aria-labelledby="command-title"><div class="command-search"><span aria-hidden="true">⌕</span><input type="search" placeholder="Search services, domains, deployments…" aria-label="Search resources" autocomplete="off"><button type="button" class="command-close" aria-label="Close search">Esc</button></div><h2 id="command-title" class="sr-only">Search resources and navigation</h2><div class="command-status" role="status">Start typing to search this project.</div><section class="saved-views" aria-labelledby="saved-views-title"><div class="saved-views-heading"><h3 id="saved-views-title">Saved views</h3><form class="save-view-form"><label class="sr-only" for="save-view-name">Saved view name</label><input id="save-view-name" maxlength="64" placeholder="Name this view" autocomplete="off"><button type="submit">Save current filters</button></form></div><div class="saved-view-list"></div></section><form class="tag-result-form"><label for="tag-result-name">Tag selected resource</label><input id="tag-result-name" maxlength="32" placeholder="customer-facing" pattern="[A-Za-z0-9][A-Za-z0-9 -]{0,31}" autocomplete="off"><input class="tag-color" type="color" value="#5a8be0" aria-label="Tag color"><button type="submit">Add tag</button></form><div class="command-results" role="listbox" aria-label="Search results"></div><footer><span>↑ ↓ navigate</span><span>Enter open</span><span>Esc close</span></footer></dialog><div class="context-bar" aria-label="Current scope"><div class="context-path"><div class="context-breadcrumb"><span>Project</span><i>/</i><strong>production</strong></div><div class="context-filters" aria-label="Active filters"></div></div><span class="scope-safety production">Production scope</span></div> <script data-stx-scoped data-stx-run="always">
370
+ window.__stx_latestSetup=__stx_setup_1787369294976_5;
371
+ if(window.stx)window.stx._latestSetup=__stx_setup_1787369294976_5;
372
+ </script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.906ee17c.css"></head><body data-stx="__stx_setup_1787369294976_5"><a data-stx-scope="stx_scope_nav_8" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>Project</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="" href="/operations/maintenance?env=production">Maintenance & DR</a><a class="" href="/operations/workloads?env=production">Workloads</a><a class="" href="/operations/observability?env=production">Observability</a><a class="" href="/operations/alerts?env=production">Alerts & health</a><a class="" href="/operations/spend?env=production">Spend & budgets</a><a href="/server/metrics?env=production">Metrics</a><a href="/server/services?env=production">Runtime services</a><a class="" href="/operations/jobs?env=production">Workers & schedules</a><a class="" href="/operations/configuration?env=production">Environment &amp; secrets</a><a class="active" href="/data/backups?env=production">Backups &amp; recovery</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/actions?env=production">Run operations</a></section><section class="nav-group"><h2>Infrastructure</h2><a class="" href="/infrastructure/topology?env=production">Infrastructure map</a><a class="" href="/data/services?env=production">Data services</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/firewall?env=production">Network & firewall</a><a href="/server/ssh-keys?env=production">SSH keys</a><a class="" href="/server/fleet?env=production">Fleet inventory</a><a class="" href="/server/capacity?env=production">Capacity & placement</a><a href="/security?env=production">Security posture</a><a href="/server/terminal?env=production">Terminal</a></section><section class="nav-group"><h2>Organization</h2><a class="" href="/server/team?env=production">People & access</a><a class="" href="/account/automation?env=production">API & automation</a></section><section class="nav-group"><h2>Account</h2><a class="" href="/account/security?env=production">Sign-in & security</a></section></div><form method="post" action="/api/logout" class="signout"><button type="submit">Sign out</button></form></aside><dialog class="command-palette" aria-labelledby="command-title"><div class="command-search"><span aria-hidden="true">⌕</span><input type="search" placeholder="Search services, domains, deployments…" aria-label="Search resources" autocomplete="off"><button type="button" class="command-close" aria-label="Close search">Esc</button></div><h2 id="command-title" class="sr-only">Search resources and navigation</h2><div class="command-status" role="status">Start typing to search this project.</div><section class="saved-views" aria-labelledby="saved-views-title"><div class="saved-views-heading"><h3 id="saved-views-title">Saved views</h3><form class="save-view-form"><label class="sr-only" for="save-view-name">Saved view name</label><input id="save-view-name" maxlength="64" placeholder="Name this view" autocomplete="off"><button type="submit">Save current filters</button></form></div><div class="saved-view-list"></div></section><form class="tag-result-form"><label for="tag-result-name">Tag selected resource</label><input id="tag-result-name" maxlength="32" placeholder="customer-facing" pattern="[A-Za-z0-9][A-Za-z0-9 -]{0,31}" autocomplete="off"><input class="tag-color" type="color" value="#5a8be0" aria-label="Tag color"><button type="submit">Add tag</button></form><div class="command-results" role="listbox" aria-label="Search results"></div><footer><span>↑ ↓ navigate</span><span>Enter open</span><span>Esc close</span></footer></dialog><div class="context-bar" aria-label="Current scope"><div class="context-path"><div class="context-breadcrumb"><span>Project</span><i>/</i><strong>production</strong></div><div class="context-filters" aria-label="Active filters"></div></div><span class="scope-safety production">Production scope</span></div> <script data-stx-scoped data-stx-run="always">
373
373
  (function() {
374
374
  var { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, refresh, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
375
375
  var __destroyHooks = [];
@@ -720,6 +720,6 @@ if(window.stx)window.stx._latestSetup=__stx_setup_1787353530165_1;
720
720
 
721
721
 
722
722
  try { if (typeof __stxScopeRenames !== 'undefined' && __stxScopeRenames) { for (var __stxRK in __stxScopeRenames) __scopeRegistration[__stxRK] = __stxScopeRenames[__stxRK]; } } catch (e) { /* no renames */ }
723
- window.stx._scopes['stx_scope_nav_2'] = __scopeRegistration;
723
+ window.stx._scopes['stx_scope_nav_8'] = __scopeRegistration;
724
724
  })();
725
725
  </script> <main class="recovery-wrap wrap" id="main-content"><div class="crumbs">Operations <span class="sep">/</span> Backups &amp; recovery</div><header class="page"><div><h1>Backups &amp; recovery</h1><p>One inventory for scheduled protection, verified recovery points, retention, restores, and drills.</p></div><div class="header-actions" x-cloak><span class="pill" :class="pollingState()==='live'?'ok':'warn'" x-cloak>{{ pollingState() }}</span><small x-cloak>{{ lastUpdatedAt()?.toLocaleTimeString() || 'connecting' }}</small><button class="btn ghost sm" @click="refresh()">Refresh</button><button class="btn ghost sm" @click="destinationOpen.set(!destinationOpen())">New destination</button><button class="btn sm" @click="policyOpen.set(!policyOpen())">New policy</button></div></header><p class="notice" role="status" @show="!!notice()" x-cloak>{{ notice() }}</p><p class="bad notice" role="alert" @show="!!actionError() || !!pollingError()" x-cloak>{{ actionError() || pollingError() }}</p><section class="summary"><article class="panel"><b>Protected policies</b><strong x-cloak>{{ inventory().coverage.filter(item=>!item.missedRpo).length }}/{{ inventory().coverage.length }}</strong><small>inside expected RPO</small></article><article class="panel"><b>Missed RPO</b><strong :class="inventory().coverage.some(item=>item.missedRpo)?'bad':''" x-cloak>{{ inventory().coverage.filter(item=>item.missedRpo).length }}</strong><small>requires operator attention</small></article><article class="panel"><b>Unverified points</b><strong :class="inventory().coverage.some(item=>item.unverified)?'warn':''" x-cloak>{{ inventory().coverage.reduce((sum,item)=>sum+item.unverified,0) }}</strong><small>uploaded but not trusted</small></article><article class="panel"><b>Active work</b><strong x-cloak>{{ activeJobs().length }}</strong><small x-cloak>{{ latestFailures() }} failed / cleanup required</small></article></section><nav class="tabs" aria-label="Recovery views"><button :class="{active:tab()==='overview'}" @click="tab.set('overview')">Coverage</button><button :class="{active:tab()==='recovery'}" @click="tab.set('recovery')">Recovery points</button><button :class="{active:tab()==='policies'}" @click="tab.set('policies')">Policies</button><button :class="{active:tab()==='destinations'}" @click="tab.set('destinations')">Destinations</button><button :class="{active:tab()==='jobs'}" @click="tab.set('jobs')">Jobs</button></nav><form class="form-grid panel" @show="destinationOpen()" @submit="createDestination($event)" x-cloak><div class="wide"><h2>Connect a destination</h2><p class="note">Credentials and client-side encryption keys are encrypted at rest, never returned by the API, and excluded from logs.</p></div><label>Name<input name="name" required pattern="[a-z0-9][a-z0-9-]{1,62}" placeholder="production-recovery"></label><label>Provider<select name="provider"><option value="aws_s3">AWS S3</option><option value="s3_compatible">S3-compatible</option><option value="aws_backup">AWS Backup</option></select></label><label>Bucket<input name="bucket" placeholder="acme-recovery"></label><label>Region<input name="region" value="us-east-1"></label><label class="wide">Endpoint (S3-compatible)<input name="endpoint" type="url" placeholder="https://objects.example.com"></label><label>Endpoint network policy<select name="endpointPolicy"><option value="public_https">Public HTTPS only</option><option value="allow_private">Allow private endpoint</option></select></label><label>Prefix<input name="prefix" placeholder="production"></label><label>Access key ID<input name="accessKeyId" autocomplete="off"></label><label>Secret access key<input name="secretAccessKey" type="password" autocomplete="new-password"></label><label>Session token<input name="sessionToken" type="password" autocomplete="new-password"></label><label>Credential expires<input name="credentialExpiresAt" type="datetime-local"></label><label>Encryption<select name="encryption"><option value="provider">Provider managed</option><option value="both">Provider + client side</option><option value="client_side">Client side</option></select></label><label class="wide">Client encryption key<input name="encryptionKey" type="password" minlength="32" autocomplete="new-password"></label><label>Object-lock days<input name="lockDays" type="number" min="1"></label><label class="check"><input name="objectLock" type="checkbox"> Object lock enabled</label><label class="check"><input name="forcePathStyle" type="checkbox"> Force path-style URLs</label><button class="btn wide" type="submit" :disabled="busy()" x-cloak>{{ busy()?'Saving…':'Save destination' }}</button></form><form class="form-grid panel" @show="policyOpen()" @submit="createPolicy($event)" x-cloak><div class="wide"><h2>Schedule protection</h2><p class="note">RPO is the maximum acceptable point age; RTO is the recovery time target shown during incidents and drills.</p></div><label>Name<input name="name" required pattern="[a-z0-9][a-z0-9-]{1,62}" placeholder="orders-hourly"></label><label x-cloak>Destination<select name="destinationId" required><template :for="item in inventory().destinations"><option :value="item.id">{{ item.name }} · {{ item.status }}</option></template></select></label><label>Resource kind<select name="resourceKind"><option value="managed_database">Managed database snapshot</option><option value="logical_database">Logical database dump</option><option value="volume">Named volume</option><option value="files">Application files</option><option value="control_plane">Control plane + config</option><option value="infrastructure">AWS infrastructure resource</option></select></label><label>Data service<select name="dataServiceId"><option value="">Not a database</option><template :for="item in services()"><option :value="item.id">{{ item.name }} · {{ item.engine }} · {{ item.provider }}</option></template></select></label><label>Application / resource<select name="resourceId"><option value="">Not an application volume</option><template :for="item in inventory().resources"><option :value="item.id">{{ item.name }} · {{ item.kind }}</option></template></select></label><label>Named volume<input name="volumeName" placeholder="orders-data"></label><label class="wide">Include paths / resource settings<textarea name="includePatterns" rows="2" placeholder="storage/uploads, public/media — or resource:arn:…, role:arn:…, vault:Default"></textarea></label><label class="wide">Exclude patterns<textarea name="excludePatterns" rows="2" placeholder="*.tmp, cache/**"></textarea></label><label>Schedule<input name="schedule" value="hourly" required></label><label>Timezone<input name="timezone" value="UTC" required></label><label>RPO minutes<input name="expectedRpoMinutes" type="number" min="1" value="60"></label><label>RTO minutes<input name="expectedRtoMinutes" type="number" min="1" value="120"></label><label>Keep last<input name="keepLast" type="number" min="1" value="24"></label><label>Daily<input name="daily" type="number" min="0" value="7"></label><label>Weekly<input name="weekly" type="number" min="0" value="4"></label><label>Monthly<input name="monthly" type="number" min="0" value="12"></label><label>Expire after days<input name="expireAfterDays" type="number" min="1" value="30"></label><label>Compression<select name="compression"><option value="gzip">gzip</option><option value="zstd">zstd</option><option value="none">none</option></select></label><label>Encryption<select name="encryption"><option value="destination">Destination policy</option><option value="both">Destination + source</option><option value="client_side">Client side</option></select></label><label class="check"><input name="enabled" type="checkbox" checked> Enabled</label><button class="btn wide" type="submit" :disabled="busy()" x-cloak>{{ busy()?'Scheduling…':'Create policy' }}</button></form><section @show="tab()==='overview'" class="stack" x-cloak><template :for="item in inventory().coverage"><article class="coverage-card panel" x-cloak><div x-cloak><span class="pill" :class="item.missedRpo?'bad':'ok'" x-cloak>{{ item.missedRpo?'missed RPO':'protected' }}</span><span class="pill" :class="item.destinationHealthy?'ok':'bad'" x-cloak>{{ item.destinationHealthy?'destination healthy':'destination attention' }}</span><h2 x-cloak>{{ item.policy.name }}</h2><p x-cloak>{{ item.policy.resourceKind.replaceAll('_',' ') }} · every {{ item.policy.schedule }} · RPO {{ item.policy.expectedRpoMinutes }}m · RTO {{ item.policy.expectedRtoMinutes }}m</p></div><div class="coverage-latest"><small>Latest recovery point</small><b x-cloak>{{ when(item.lastRecoveryPoint?.pointInTime) }}</b><span x-cloak>{{ item.lastRecoveryPoint ? item.lastRecoveryPoint.verificationState : 'No recovery point yet' }}</span></div><button class="btn sm" @click="runPolicy(item.policy)" :disabled="busy()">Run now</button></article></template><div class="empty panel" @show="!inventory().coverage.length" x-cloak><strong>No protection policies</strong><span>Connect a destination, then define the first RPO-backed schedule.</span></div></section><section @show="tab()==='recovery'" class="stack" x-cloak><template :for="item in inventory().recoveryPoints"><article class="panel point-card" x-cloak><div class="point-head" x-cloak><div x-cloak><span class="pill" :class="tone(item.status)" x-cloak>{{ item.status }}</span><span class="pill" :class="tone(item.verificationState)" x-cloak>{{ item.verificationState }}</span><span class="pill" @show="item.held" x-cloak>legal hold</span><span class="pill" @show="item.pinned" x-cloak>pinned</span><h2 x-cloak>{{ policyName(item.policyId) }}</h2></div><button class="btn sm" @click="openRestore(item)" :disabled="item.status!=='available'||item.verificationState!=='verified'">Restore / drill</button></div><div class="point-grid"><div><small>Point in time</small><b x-cloak>{{ when(item.pointInTime) }}</b></div><div><small>Kind</small><b x-cloak>{{ item.kind.replaceAll('_',' ') }}</b></div><div><small>Stored</small><b x-cloak>{{ bytes(item.sizeBytes) }}</b></div><div><small>Expires</small><b x-cloak>{{ when(item.expiresAt) }}</b></div><div><small>Destination</small><b x-cloak>{{ destinationName(item.destinationId) }}</b></div><div><small>Recent jobs</small><b x-cloak>{{ jobsForPoint(item.id).length }}</b></div></div><div class="actions"><button class="btn ghost sm" @click="verifyPoint(item)" :disabled="busy()">Verify again</button><button class="btn ghost sm" @click="protectPoint(item,'pinned')" x-cloak>{{ item.pinned?'Unpin':'Pin' }}</button><button class="btn ghost sm" @click="protectPoint(item,'held')" x-cloak>{{ item.held?'Release hold':'Legal hold' }}</button></div></article></template><div class="empty panel" @show="!inventory().recoveryPoints.length" x-cloak><strong>No recovery points</strong><span>Run a policy to create the first independently verified recovery point.</span></div></section><section id="restore-workspace" class="panel restore" @show="!!selectedPoint()" x-cloak><div class="restore-head"><div><small>Selected recovery point</small><h2 x-cloak>{{ policyName(selectedPoint()?.policyId) }}</h2><p x-cloak>{{ when(selectedPoint()?.pointInTime) }} · {{ selectedPoint()?.kind?.replaceAll('_',' ') }}</p></div><button class="btn ghost sm" @click="selectedPoint.set(null)">Close</button></div><form class="form-grid" @submit="submitRestore($event)"><label>Mode<select name="mode"><option value="isolated">Isolated target (recommended)</option><option value="in_place">In-place replacement</option></select></label><label>Target name / ID<input name="targetName" required placeholder="orders-recovery-drill"></label><label>Safety recovery point<select name="safetyBackupId"><option value="">Required for in-place only</option><template :for="item in inventory().recoveryPoints.filter(item=>item.id!==selectedPoint()?.id&&item.verificationState==='verified')"><option :value="item.id">{{ policyName(item.policyId) }} · {{ when(item.pointInTime) }}</option></template></select></label><label>Typed confirmation<input name="confirm" placeholder="Same as target for in-place"></label><label class="wide" @show="selectedPoint()?.kind==='infrastructure'" x-cloak>AWS restore metadata (JSON)<textarea name="providerMetadata" rows="3" placeholder='{"availabilityZone":"us-east-1a"}'></textarea></label><label class="check"><input name="downtimeAcknowledged" type="checkbox"> I acknowledge downtime and data replacement</label><label class="check"><input name="drill" type="checkbox" :disabled="selectedPoint()?.kind==='infrastructure'"> Drill: validate health, then clean isolated target</label><div class="actions wide"><button class="btn ghost" type="submit" value="plan">Validate plan</button><button class="btn danger" type="submit" value="execute" :disabled="busy()" x-cloak>{{ busy()?'Queueing…':'Queue restore' }}</button></div></form><div class="plan" @show="!!restorePlan()" x-cloak><h3>Validated plan</h3><span class="pill" x-cloak>{{ restorePlan()?.mode }}</span><ul><template :for="warning in restorePlan()?.warnings || []"><li x-cloak>{{ warning }}</li></template></ul></div></section><section @show="tab()==='policies'" class="stack" x-cloak><template :for="item in inventory().policies"><article class="row-card panel" x-cloak><div x-cloak><span class="pill" :class="item.enabled?'ok':'warn'" x-cloak>{{ item.enabled?'enabled':'disabled' }}</span><b x-cloak>{{ item.name }}</b><code x-cloak>{{ item.schedule }} · {{ item.timezone }}</code><p class="note" x-cloak>{{ item.resourceKind.replaceAll('_',' ') }} · {{ destinationName(item.destinationId) }} · RPO {{ item.expectedRpoMinutes }}m / RTO {{ item.expectedRtoMinutes }}m · next {{ when(item.nextRunAt) }}</p></div><button class="btn sm" @click="runPolicy(item)">Run now</button></article></template></section><section @show="tab()==='destinations'" class="stack" x-cloak><template :for="item in inventory().destinations"><article class="row-card panel" x-cloak><div x-cloak><span class="pill" :class="tone(item.status)" x-cloak>{{ item.status }}</span><span class="pill" :class="['expired','invalid'].includes(item.credentialStatus?.status)?'bad':item.credentialStatus?.status==='expiring'?'warn':'ok'" x-cloak>credentials {{ item.credentialStatus?.status || 'unknown' }}</span><b x-cloak>{{ item.name }}</b><code x-cloak>{{ item.provider }} · {{ item.bucket || 'provider vault' }}</code><p class="note" x-cloak>{{ item.endpoint || item.region || 'provider default' }} · {{ item.encryption }} encryption · last tested {{ when(item.lastTestedAt) }}<span @show="!!item.credentialStatus?.expiresAt" x-cloak> · credentials expire {{ when(item.credentialStatus?.expiresAt) }}</span></p><p class="bad note" @show="!!item.lastError" x-cloak>{{ item.lastError }}</p></div><button class="btn ghost sm" @click="testDestination(item)" :disabled="item.provider==='aws_backup'||busy()">Test write/read</button></article></template></section><section @show="tab()==='jobs'" class="stack" x-cloak><template :for="item in inventory().jobs"><article class="job-card panel" x-cloak><span class="pill" :class="tone(item.status)" x-cloak>{{ item.status }}</span><div x-cloak><b x-cloak>{{ item.kind }}</b><code x-cloak>{{ item.id }}</code><p class="note" x-cloak>{{ item.progress?.phase || 'queued' }} · {{ when(item.startedAt || item.createdAt) }}<span @show="!!item.error" x-cloak> · {{ item.error }}</span></p></div><span x-cloak>{{ item.cancellability.replaceAll('_',' ') }}</span></article></template><div class="empty panel" @show="!inventory().jobs.length" x-cloak><strong>No recovery jobs</strong><span>Scheduled and manual work appears here with durable progress and failures.</span></div></section></main><style> .recovery-wrap{max-width:1500px}.header-actions,.actions,.point-head>div{display:flex;gap:7px;align-items:center;flex-wrap:wrap}.summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-bottom:14px}.summary article{display:grid;gap:5px}.summary strong{font-size:28px}.summary small,.point-grid small,.restore small{color:var(--txt3)}.tabs{display:flex;gap:5px;border-bottom:1px solid var(--line);margin-bottom:14px;overflow:auto}.tabs button{border:0;background:none;color:var(--txt3);padding:10px 13px;border-bottom:2px solid transparent;white-space:nowrap}.tabs button.active{color:var(--txt);border-color:var(--accent)}.form-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-bottom:14px}.form-grid label{display:grid;gap:5px;color:var(--txt3);font-size:11px}.form-grid input,.form-grid select,.form-grid textarea{width:100%;background:var(--bg2);border:1px solid var(--line);border-radius:8px;color:var(--txt);padding:9px}.form-grid textarea{resize:vertical}.form-grid .check{display:flex;align-items:center;gap:7px}.form-grid .check input{width:auto}.wide{grid-column:1/-1}.stack{display:grid;gap:10px}.coverage-card{display:grid;grid-template-columns:minmax(0,1fr) minmax(220px,.4fr) auto;gap:16px;align-items:center}.coverage-card h2,.point-card h2,.restore h2{margin:7px 0 3px}.coverage-card p,.restore p{margin:0;color:var(--txt3)}.coverage-latest{display:grid;gap:4px}.point-head,.restore-head,.row-card{display:flex;justify-content:space-between;gap:14px;align-items:center}.point-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:9px;margin:14px 0}.point-grid>div{display:grid;gap:4px;min-width:0}.point-grid b{overflow-wrap:anywhere}.restore{margin:14px 0;border-color:var(--accent)}.restore .form-grid{margin:14px 0 0}.plan{background:var(--bg2);border-radius:8px;padding:12px}.row-card>div{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.row-card p{flex-basis:100%;margin:0}.job-card{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:12px;align-items:center}.job-card div{display:grid;gap:4px}.job-card p{margin:0}.mono,code{font-family:var(--mono)}@media(max-width:1050px){.form-grid{grid-template-columns:repeat(2,1fr)}.point-grid{grid-template-columns:repeat(3,1fr)}.coverage-card{grid-template-columns:1fr auto}.coverage-latest{grid-column:1/-1}.summary{grid-template-columns:repeat(2,1fr)}}@media(max-width:650px){.form-grid,.point-grid,.summary{grid-template-columns:1fr}.form-grid>*{grid-column:1!important}.coverage-card,.job-card{grid-template-columns:1fr}.row-card,.point-head,.restore-head{align-items:flex-start;flex-direction:column}.header-actions{justify-content:flex-start}} </style></body></html>
@@ -1,5 +1,5 @@
1
- <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt3k56ealftvbz"><meta name="title" content="stx Project"><meta name="description" content="A website built with stx templating engine"><meta property="og:title" content="stx Project"><meta property="og:description" content="A website built with stx templating engine"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="stx Project"><meta name="twitter:description" content="A website built with stx templating engine"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud · Data services</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-runtime src="/_stx/runtime.c696d17a.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
- function __stx_setup_1787353530169_2() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt3tj2le8bg297"><meta name="title" content="stx Project"><meta name="description" content="A website built with stx templating engine"><meta property="og:title" content="stx Project"><meta property="og:description" content="A website built with stx templating engine"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="stx Project"><meta name="twitter:description" content="A website built with stx templating engine"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud · Data services</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-runtime src="/_stx/runtime.c696d17a.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
+ function __stx_setup_1787369294964_2() {
3
3
  const { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
4
4
 
5
5
  var actionError = undefined;
@@ -331,9 +331,9 @@ tone = __stxBundle_0ec490371d35["tone"];
331
331
  when = __stxBundle_0ec490371d35["when"];
332
332
  return { actionError, actionLabels, api, busy, chooseAction, copy, createOpen, createService, engineFilter, filtered, formBody, guidance, inspect, lastUpdatedAt, load, notice, observationEntries, oneTime, operationAction, operations, plan, pollingError, pollingState, previewAction, providerFilter, refresh, reveal, runAction, runConfiguredAction, search, selected, serviceOperations, services, statusFilter, tone, when, __stxBundle_0ec490371d35 };
333
333
  }
334
- window.__stx_latestSetup=__stx_setup_1787353530169_2;
335
- if(window.stx)window.stx._latestSetup=__stx_setup_1787353530169_2;
336
- </script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.906ee17c.css"></head><body data-stx="__stx_setup_1787353530169_2"><a data-stx-scope="stx_scope_nav_3" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>Project</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="" href="/operations/maintenance?env=production">Maintenance & DR</a><a class="" href="/operations/workloads?env=production">Workloads</a><a class="" href="/operations/observability?env=production">Observability</a><a class="" href="/operations/alerts?env=production">Alerts & health</a><a class="" href="/operations/spend?env=production">Spend & budgets</a><a href="/server/metrics?env=production">Metrics</a><a href="/server/services?env=production">Runtime services</a><a class="" href="/operations/jobs?env=production">Workers & schedules</a><a class="" href="/operations/configuration?env=production">Environment &amp; secrets</a><a class="" href="/data/backups?env=production">Backups &amp; recovery</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/actions?env=production">Run operations</a></section><section class="nav-group"><h2>Infrastructure</h2><a class="" href="/infrastructure/topology?env=production">Infrastructure map</a><a class="active" href="/data/services?env=production">Data services</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/firewall?env=production">Network & firewall</a><a href="/server/ssh-keys?env=production">SSH keys</a><a class="" href="/server/fleet?env=production">Fleet inventory</a><a class="" href="/server/capacity?env=production">Capacity & placement</a><a href="/security?env=production">Security posture</a><a href="/server/terminal?env=production">Terminal</a></section><section class="nav-group"><h2>Organization</h2><a class="" href="/server/team?env=production">People & access</a><a class="" href="/account/automation?env=production">API & automation</a></section><section class="nav-group"><h2>Account</h2><a class="" href="/account/security?env=production">Sign-in & security</a></section></div><form method="post" action="/api/logout" class="signout"><button type="submit">Sign out</button></form></aside><dialog class="command-palette" aria-labelledby="command-title"><div class="command-search"><span aria-hidden="true">⌕</span><input type="search" placeholder="Search services, domains, deployments…" aria-label="Search resources" autocomplete="off"><button type="button" class="command-close" aria-label="Close search">Esc</button></div><h2 id="command-title" class="sr-only">Search resources and navigation</h2><div class="command-status" role="status">Start typing to search this project.</div><section class="saved-views" aria-labelledby="saved-views-title"><div class="saved-views-heading"><h3 id="saved-views-title">Saved views</h3><form class="save-view-form"><label class="sr-only" for="save-view-name">Saved view name</label><input id="save-view-name" maxlength="64" placeholder="Name this view" autocomplete="off"><button type="submit">Save current filters</button></form></div><div class="saved-view-list"></div></section><form class="tag-result-form"><label for="tag-result-name">Tag selected resource</label><input id="tag-result-name" maxlength="32" placeholder="customer-facing" pattern="[A-Za-z0-9][A-Za-z0-9 -]{0,31}" autocomplete="off"><input class="tag-color" type="color" value="#5a8be0" aria-label="Tag color"><button type="submit">Add tag</button></form><div class="command-results" role="listbox" aria-label="Search results"></div><footer><span>↑ ↓ navigate</span><span>Enter open</span><span>Esc close</span></footer></dialog><div class="context-bar" aria-label="Current scope"><div class="context-path"><div class="context-breadcrumb"><span>Project</span><i>/</i><strong>production</strong></div><div class="context-filters" aria-label="Active filters"></div></div><span class="scope-safety production">Production scope</span></div> <script data-stx-scoped data-stx-run="always">
334
+ window.__stx_latestSetup=__stx_setup_1787369294964_2;
335
+ if(window.stx)window.stx._latestSetup=__stx_setup_1787369294964_2;
336
+ </script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.906ee17c.css"></head><body data-stx="__stx_setup_1787369294964_2"><a data-stx-scope="stx_scope_nav_3" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>Project</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="" href="/operations/maintenance?env=production">Maintenance & DR</a><a class="" href="/operations/workloads?env=production">Workloads</a><a class="" href="/operations/observability?env=production">Observability</a><a class="" href="/operations/alerts?env=production">Alerts & health</a><a class="" href="/operations/spend?env=production">Spend & budgets</a><a href="/server/metrics?env=production">Metrics</a><a href="/server/services?env=production">Runtime services</a><a class="" href="/operations/jobs?env=production">Workers & schedules</a><a class="" href="/operations/configuration?env=production">Environment &amp; secrets</a><a class="" href="/data/backups?env=production">Backups &amp; recovery</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/actions?env=production">Run operations</a></section><section class="nav-group"><h2>Infrastructure</h2><a class="" href="/infrastructure/topology?env=production">Infrastructure map</a><a class="active" href="/data/services?env=production">Data services</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/firewall?env=production">Network & firewall</a><a href="/server/ssh-keys?env=production">SSH keys</a><a class="" href="/server/fleet?env=production">Fleet inventory</a><a class="" href="/server/capacity?env=production">Capacity & placement</a><a href="/security?env=production">Security posture</a><a href="/server/terminal?env=production">Terminal</a></section><section class="nav-group"><h2>Organization</h2><a class="" href="/server/team?env=production">People & access</a><a class="" href="/account/automation?env=production">API & automation</a></section><section class="nav-group"><h2>Account</h2><a class="" href="/account/security?env=production">Sign-in & security</a></section></div><form method="post" action="/api/logout" class="signout"><button type="submit">Sign out</button></form></aside><dialog class="command-palette" aria-labelledby="command-title"><div class="command-search"><span aria-hidden="true">⌕</span><input type="search" placeholder="Search services, domains, deployments…" aria-label="Search resources" autocomplete="off"><button type="button" class="command-close" aria-label="Close search">Esc</button></div><h2 id="command-title" class="sr-only">Search resources and navigation</h2><div class="command-status" role="status">Start typing to search this project.</div><section class="saved-views" aria-labelledby="saved-views-title"><div class="saved-views-heading"><h3 id="saved-views-title">Saved views</h3><form class="save-view-form"><label class="sr-only" for="save-view-name">Saved view name</label><input id="save-view-name" maxlength="64" placeholder="Name this view" autocomplete="off"><button type="submit">Save current filters</button></form></div><div class="saved-view-list"></div></section><form class="tag-result-form"><label for="tag-result-name">Tag selected resource</label><input id="tag-result-name" maxlength="32" placeholder="customer-facing" pattern="[A-Za-z0-9][A-Za-z0-9 -]{0,31}" autocomplete="off"><input class="tag-color" type="color" value="#5a8be0" aria-label="Tag color"><button type="submit">Add tag</button></form><div class="command-results" role="listbox" aria-label="Search results"></div><footer><span>↑ ↓ navigate</span><span>Enter open</span><span>Esc close</span></footer></dialog><div class="context-bar" aria-label="Current scope"><div class="context-path"><div class="context-breadcrumb"><span>Project</span><i>/</i><strong>production</strong></div><div class="context-filters" aria-label="Active filters"></div></div><span class="scope-safety production">Production scope</span></div> <script data-stx-scoped data-stx-run="always">
337
337
  (function() {
338
338
  var { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, refresh, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
339
339
  var __destroyHooks = [];
@@ -1,5 +1,5 @@
1
- <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt3k56ealftvbz"><meta name="title" content="stx Project"><meta name="description" content="A website built with stx templating engine"><meta property="og:title" content="stx Project"><meta property="og:description" content="A website built with stx templating engine"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="stx Project"><meta name="twitter:description" content="A website built with stx templating engine"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud · Persistent volumes</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-runtime src="/_stx/runtime.c696d17a.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
- function __stx_setup_1787353530189_6() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt3tj2le8bg297"><meta name="title" content="stx Project"><meta name="description" content="A website built with stx templating engine"><meta property="og:title" content="stx Project"><meta property="og:description" content="A website built with stx templating engine"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="stx Project"><meta name="twitter:description" content="A website built with stx templating engine"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud · Persistent volumes</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-runtime src="/_stx/runtime.c696d17a.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
+ function __stx_setup_1787369294962_1() {
3
3
  const { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
4
4
 
5
5
  var adopt = undefined;
@@ -219,9 +219,9 @@ tone = __stxBundle_87f7d53bdfa9["tone"];
219
219
  volumes = __stxBundle_87f7d53bdfa9["volumes"];
220
220
  return { adopt, api, attach, body, bytes, create, detach, discover, filtered, lastUpdatedAt, load, mutate, operationFor, pollingError, pollingState, refresh, remove, resize, restore, snapshot, tone, volumes, __stxBundle_87f7d53bdfa9 };
221
221
  }
222
- window.__stx_latestSetup=__stx_setup_1787353530189_6;
223
- if(window.stx)window.stx._latestSetup=__stx_setup_1787353530189_6;
224
- </script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.906ee17c.css"></head><body data-stx="__stx_setup_1787353530189_6"><a data-stx-scope="stx_scope_nav_9" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>Project</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="" href="/operations/maintenance?env=production">Maintenance & DR</a><a class="" href="/operations/workloads?env=production">Workloads</a><a class="" href="/operations/observability?env=production">Observability</a><a class="" href="/operations/alerts?env=production">Alerts & health</a><a class="" href="/operations/spend?env=production">Spend & budgets</a><a href="/server/metrics?env=production">Metrics</a><a href="/server/services?env=production">Runtime services</a><a class="" href="/operations/jobs?env=production">Workers & schedules</a><a class="" href="/operations/configuration?env=production">Environment &amp; secrets</a><a class="" href="/data/backups?env=production">Backups &amp; recovery</a><a class="active" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/actions?env=production">Run operations</a></section><section class="nav-group"><h2>Infrastructure</h2><a class="" href="/infrastructure/topology?env=production">Infrastructure map</a><a class="" href="/data/services?env=production">Data services</a><a class="active" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/firewall?env=production">Network & firewall</a><a href="/server/ssh-keys?env=production">SSH keys</a><a class="" href="/server/fleet?env=production">Fleet inventory</a><a class="" href="/server/capacity?env=production">Capacity & placement</a><a href="/security?env=production">Security posture</a><a href="/server/terminal?env=production">Terminal</a></section><section class="nav-group"><h2>Organization</h2><a class="" href="/server/team?env=production">People & access</a><a class="" href="/account/automation?env=production">API & automation</a></section><section class="nav-group"><h2>Account</h2><a class="" href="/account/security?env=production">Sign-in & security</a></section></div><form method="post" action="/api/logout" class="signout"><button type="submit">Sign out</button></form></aside><dialog class="command-palette" aria-labelledby="command-title"><div class="command-search"><span aria-hidden="true">⌕</span><input type="search" placeholder="Search services, domains, deployments…" aria-label="Search resources" autocomplete="off"><button type="button" class="command-close" aria-label="Close search">Esc</button></div><h2 id="command-title" class="sr-only">Search resources and navigation</h2><div class="command-status" role="status">Start typing to search this project.</div><section class="saved-views" aria-labelledby="saved-views-title"><div class="saved-views-heading"><h3 id="saved-views-title">Saved views</h3><form class="save-view-form"><label class="sr-only" for="save-view-name">Saved view name</label><input id="save-view-name" maxlength="64" placeholder="Name this view" autocomplete="off"><button type="submit">Save current filters</button></form></div><div class="saved-view-list"></div></section><form class="tag-result-form"><label for="tag-result-name">Tag selected resource</label><input id="tag-result-name" maxlength="32" placeholder="customer-facing" pattern="[A-Za-z0-9][A-Za-z0-9 -]{0,31}" autocomplete="off"><input class="tag-color" type="color" value="#5a8be0" aria-label="Tag color"><button type="submit">Add tag</button></form><div class="command-results" role="listbox" aria-label="Search results"></div><footer><span>↑ ↓ navigate</span><span>Enter open</span><span>Esc close</span></footer></dialog><div class="context-bar" aria-label="Current scope"><div class="context-path"><div class="context-breadcrumb"><span>Project</span><i>/</i><strong>production</strong></div><div class="context-filters" aria-label="Active filters"></div></div><span class="scope-safety production">Production scope</span></div> <script data-stx-scoped data-stx-run="always">
222
+ window.__stx_latestSetup=__stx_setup_1787369294962_1;
223
+ if(window.stx)window.stx._latestSetup=__stx_setup_1787369294962_1;
224
+ </script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.906ee17c.css"></head><body data-stx="__stx_setup_1787369294962_1"><a data-stx-scope="stx_scope_nav_2" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>Project</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="" href="/operations/maintenance?env=production">Maintenance & DR</a><a class="" href="/operations/workloads?env=production">Workloads</a><a class="" href="/operations/observability?env=production">Observability</a><a class="" href="/operations/alerts?env=production">Alerts & health</a><a class="" href="/operations/spend?env=production">Spend & budgets</a><a href="/server/metrics?env=production">Metrics</a><a href="/server/services?env=production">Runtime services</a><a class="" href="/operations/jobs?env=production">Workers & schedules</a><a class="" href="/operations/configuration?env=production">Environment &amp; secrets</a><a class="" href="/data/backups?env=production">Backups &amp; recovery</a><a class="active" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/actions?env=production">Run operations</a></section><section class="nav-group"><h2>Infrastructure</h2><a class="" href="/infrastructure/topology?env=production">Infrastructure map</a><a class="" href="/data/services?env=production">Data services</a><a class="active" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/firewall?env=production">Network & firewall</a><a href="/server/ssh-keys?env=production">SSH keys</a><a class="" href="/server/fleet?env=production">Fleet inventory</a><a class="" href="/server/capacity?env=production">Capacity & placement</a><a href="/security?env=production">Security posture</a><a href="/server/terminal?env=production">Terminal</a></section><section class="nav-group"><h2>Organization</h2><a class="" href="/server/team?env=production">People & access</a><a class="" href="/account/automation?env=production">API & automation</a></section><section class="nav-group"><h2>Account</h2><a class="" href="/account/security?env=production">Sign-in & security</a></section></div><form method="post" action="/api/logout" class="signout"><button type="submit">Sign out</button></form></aside><dialog class="command-palette" aria-labelledby="command-title"><div class="command-search"><span aria-hidden="true">⌕</span><input type="search" placeholder="Search services, domains, deployments…" aria-label="Search resources" autocomplete="off"><button type="button" class="command-close" aria-label="Close search">Esc</button></div><h2 id="command-title" class="sr-only">Search resources and navigation</h2><div class="command-status" role="status">Start typing to search this project.</div><section class="saved-views" aria-labelledby="saved-views-title"><div class="saved-views-heading"><h3 id="saved-views-title">Saved views</h3><form class="save-view-form"><label class="sr-only" for="save-view-name">Saved view name</label><input id="save-view-name" maxlength="64" placeholder="Name this view" autocomplete="off"><button type="submit">Save current filters</button></form></div><div class="saved-view-list"></div></section><form class="tag-result-form"><label for="tag-result-name">Tag selected resource</label><input id="tag-result-name" maxlength="32" placeholder="customer-facing" pattern="[A-Za-z0-9][A-Za-z0-9 -]{0,31}" autocomplete="off"><input class="tag-color" type="color" value="#5a8be0" aria-label="Tag color"><button type="submit">Add tag</button></form><div class="command-results" role="listbox" aria-label="Search results"></div><footer><span>↑ ↓ navigate</span><span>Enter open</span><span>Esc close</span></footer></dialog><div class="context-bar" aria-label="Current scope"><div class="context-path"><div class="context-breadcrumb"><span>Project</span><i>/</i><strong>production</strong></div><div class="context-filters" aria-label="Active filters"></div></div><span class="scope-safety production">Production scope</span></div> <script data-stx-scoped data-stx-run="always">
225
225
  (function() {
226
226
  var { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, refresh, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
227
227
  var __destroyHooks = [];
@@ -572,6 +572,6 @@ if(window.stx)window.stx._latestSetup=__stx_setup_1787353530189_6;
572
572
 
573
573
 
574
574
  try { if (typeof __stxScopeRenames !== 'undefined' && __stxScopeRenames) { for (var __stxRK in __stxScopeRenames) __scopeRegistration[__stxRK] = __stxScopeRenames[__stxRK]; } } catch (e) { /* no renames */ }
575
- window.stx._scopes['stx_scope_nav_9'] = __scopeRegistration;
575
+ window.stx._scopes['stx_scope_nav_2'] = __scopeRegistration;
576
576
  })();
577
577
  </script> <main class="volume-wrap wrap" id="main-content"><div class="crumbs">Infrastructure <span class="sep">/</span> Persistent volumes</div><header class="page"><div><h1>Persistent volumes</h1><p>Storage with stable identity, explicit consumers, recovery status, capability-aware operations, and safe retirement.</p></div><div class="header-actions" x-cloak><span class="pill" :class="pollingState()==='live'?'ok':'warn'" x-cloak>{{ pollingState() }}</span><small x-cloak>{{ lastUpdatedAt()?.toLocaleTimeString()||'connecting' }}</small><button class="btn ghost sm" @click="discover()">Discover orphans</button><button class="btn sm" @click="createOpen.set(!createOpen())" x-cloak>{{ createOpen()?'Close':'New volume' }}</button></div></header><p class="notice" role="status" @show="!!notice()" x-cloak>{{ notice() }}</p><p class="bad notice" role="alert" @show="!!error()||!!pollingError()" x-cloak>{{ error()||pollingError() }}</p><section class="summary"><article class="panel"><b>Volumes</b><strong x-cloak>{{ volumes().length }}</strong><small>release-independent</small></article><article class="panel"><b>Attached</b><strong x-cloak>{{ volumes().filter(item=>item.attachments.some(m=>m.observedState==='attached')).length }}</strong><small>active consumers</small></article><article class="panel"><b>Protected</b><strong x-cloak>{{ volumes().filter(item=>item.backupState==='protected').length }}</strong><small>recent verified backup</small></article><article class="panel"><b>Orphans</b><strong x-cloak>{{ volumes().filter(item=>item.orphaned).length }}</strong><small>adopt, attach, snapshot, or delete</small></article></section><form class="create-volume panel" @show="createOpen()" @submit="create($event)" x-cloak><div class="wide"><h2>Create persistent volume</h2><p class="note">The identity remains stable through releases. Provider limits are shown before unsupported operations can be submitted.</p></div><label>Name<input name="name" pattern="[a-z0-9][a-z0-9_.-]{1,62}" required placeholder="uploads"></label><label x-cloak>Driver<select name="driver" required><template :for="driver in providers()"><option :value="driver.provider+'|'+driver.type">{{ driver.provider }} · {{ driver.type }}</option></template></select></label><label>Capacity bytes<input name="capacityBytes" type="number" min="1" placeholder="optional"></label><label>Filesystem<input name="filesystem" placeholder="provider default"></label><label class="check"><input name="encrypted" type="checkbox"> Encrypted where supported</label><button class="btn" type="submit" :disabled="busy()">Queue create</button></form><section class="filters panel" x-cloak><input type="search" aria-label="Search volumes" placeholder="Search volume, driver, or state" @input="search.set($event.currentTarget.value)"><span x-cloak>{{ filtered().length }} shown</span></section><div class="volume-workspace" :class="{detail:!!selected()}" x-cloak><section class="volume-cards" x-cloak><template :for="item in filtered()"><article class="panel volume-card" :class="{selected:selected()?.id===item.id}" x-cloak><div class="volume-head" x-cloak><div x-cloak><span class="pill" :class="tone(item.status)" x-cloak>{{ item.status }}</span><span class="pill" x-cloak>{{ item.provider }} · {{ item.type }}</span><h2 x-cloak>{{ item.name }}</h2></div><button class="btn ghost sm" @click="selected.set(item)">Details</button></div><div class="volume-facts"><div><small>Capacity / usage</small><b x-cloak>{{ bytes(item.usedBytes) }} / {{ bytes(item.capacityBytes) }}</b><span x-cloak>{{ item.usagePercent==null?'usage unavailable':item.usagePercent+'%' }}</span></div><div><small>Consumers</small><b x-cloak>{{ item.attachments.filter(m=>m.observedState==='attached').length }}</b><span x-cloak>{{ item.attachments.map(m=>m.targetPath).join(', ')||'detached' }}</span></div><div><small>Recovery</small><b x-cloak>{{ item.backupState }}</b><span x-cloak>{{ item.snapshots.length }} snapshots · {{ item.lastBackupAt||'never backed up' }}</span></div></div><p class="notice warn" @show="!!operationFor(item)" x-cloak>{{ operationFor(item)?.operation?.kind }} · {{ operationFor(item)?.operation?.state }}</p><div class="actions" @show="item.orphaned" x-cloak><button class="btn sm" @click="adopt(item)">Adopt safely</button></div></article></template><div class="empty panel" @show="!filtered().length" x-cloak><strong>No persistent volumes</strong><span>Create one or discover provider resources without deleting anything automatically.</span></div></section><aside class="panel volume-detail" @show="!!selected()" x-cloak><div class="detail-head"><div><small>Selected volume</small><h2 x-cloak>{{ selected()?.name }}</h2></div><button class="btn ghost sm" @click="selected.set(null)">Close</button></div><div class="capabilities"><h3>Capabilities</h3><template :for="entry in Object.entries(selected()?.capabilities||{})"><p x-cloak><b x-cloak>{{ entry[0] }}</b><span :class="entry[1].supported?'ok-text':'muted'" x-cloak>{{ entry[1].supported?'supported':entry[1].reason }}</span></p></template></div><div class="detail-actions"><button class="btn sm" @click="mountOpen.set(!mountOpen())" :disabled="!selected()?.capabilities?.attach?.supported">Attach</button><button class="btn ghost sm" @click="resize()" :disabled="!selected()?.capabilities?.resize?.supported">Resize</button><button class="btn ghost sm" @click="snapshot()" :disabled="!selected()?.capabilities?.snapshot?.supported">Snapshot</button><a class="btn ghost sm" href="/data/backups">Backups</a><button class="btn danger sm" @click="remove()" :disabled="selected()?.attachments.some(item=>item.observedState==='attached')">Delete</button></div><form class="mount-form" @show="mountOpen()" @submit="attach($event)" x-cloak><h3>Mount editor</h3><label x-cloak>Workload<select name="resourceId" required><template :for="resource in resources()"><option :value="resource.id">{{ resource.name }} · {{ resource.kind }}</option></template></select></label><label>Target path<input name="targetPath" required placeholder="/app/uploads"></label><label>UID<input name="uid" type="number" min="0"></label><label>GID<input name="gid" type="number" min="0"></label><label>Mode<input name="mode" pattern="0?[0-7]{3}" placeholder="0750"></label><label>Propagation<select name="propagation"><option>private</option><option>rprivate</option><option>shared</option><option>rshared</option></select></label><label class="check"><input name="readOnly" type="checkbox"> Read only</label><button class="btn" type="submit">Validate and attach</button></form><section><h3>Consumers</h3><template :for="mount in selected()?.attachments||[]"><article class="mount-row" x-cloak><div x-cloak><b x-cloak>{{ resources().find(item=>item.id===mount.resourceId)?.name||mount.resourceId }}</b><code x-cloak>{{ mount.targetPath }}</code><small x-cloak>{{ mount.readOnly?'read only':'read/write' }} · {{ mount.observedState }}</small></div><button class="btn danger sm" @click="detach(mount)" :disabled="mount.observedState!=='attached'">Drain &amp; detach</button></article></template><p class="muted" @show="!selected()?.attachments?.length" x-cloak>No workloads consume this volume.</p></section><section><h3>Recovery points</h3><template :for="snapshot in selected()?.snapshots||[]"><p x-cloak><b x-cloak>{{ snapshot.status }}</b> {{ snapshot.name }} <button class="btn ghost sm" @click="restore(snapshot)" :disabled="!selected()?.capabilities?.restore?.supported">Restore replacement</button></p></template><template :for="point in recoveryPoints().filter(item=>item.resourceId===selected()?.resourceId)"><p x-cloak><b x-cloak>{{ point.verificationState }}</b> {{ point.pointInTime }}</p></template><p class="muted" @show="!selected()?.snapshots?.length" x-cloak>Link a backup policy for verified recovery and restore drills.</p></section></aside></div></main><style> .volume-wrap{padding-bottom:5rem}.header-actions,.actions,.detail-actions{display:flex;gap:.55rem;align-items:center;flex-wrap:wrap}.summary{display:grid;grid-template-columns:repeat(4,1fr);gap:1rem;margin:1rem 0}.summary article{display:grid;gap:.3rem}.summary strong{font-size:1.8rem}.create-volume,.mount-form{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem;margin:1rem 0}.wide{grid-column:1/-1}.create-volume label,.mount-form label{display:grid;gap:.35rem}.filters{display:flex;gap:1rem;align-items:center;margin:1rem 0}.filters input{flex:1}.volume-workspace{display:grid}.volume-workspace.detail{grid-template-columns:minmax(0,1fr) minmax(320px,430px);gap:1rem}.volume-cards{display:grid;gap:1rem}.volume-card{display:grid;gap:1rem}.volume-head,.detail-head{display:flex;justify-content:space-between;gap:1rem}.volume-head h2{margin:.5rem 0 0}.volume-facts{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem}.volume-facts div{display:grid;gap:.25rem}.volume-detail{position:sticky;top:1rem;align-self:start;display:grid;gap:1.25rem}.capabilities p,.mount-row{display:flex;justify-content:space-between;gap:1rem;border-bottom:1px solid var(--border);padding:.55rem 0}.mount-row div{display:grid;gap:.25rem}.ok-text{color:var(--success)}.muted{color:var(--muted)}@media(max-width:900px){.summary{grid-template-columns:repeat(2,1fr)}.volume-workspace.detail{grid-template-columns:1fr}.volume-detail{position:static}.volume-facts{grid-template-columns:1fr}}@media(max-width:560px){.summary,.create-volume,.mount-form{grid-template-columns:1fr}.wide{grid-column:auto}} </style></body></html>
@@ -1,5 +1,5 @@
1
- <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt3k56ealftvbz"><meta name="title" content="ts-cloud - Dashboard"><meta name="description" content="ts-cloud server &amp; deployment dashboard"><meta property="og:title" content="ts-cloud - Dashboard"><meta property="og:description" content="ts-cloud server &amp; deployment dashboard"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="ts-cloud - Dashboard"><meta name="twitter:description" content="ts-cloud server &amp; deployment dashboard"> <script data-stx-runtime src="/_stx/runtime.c696d17a.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud - Dashboard</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"><meta name="description" content="ts-cloud server &amp; deployment dashboard"> <script data-stx-scoped>
2
- function __stx_setup_1787353533623_32() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt3tj2le8bg297"><meta name="title" content="ts-cloud - Dashboard"><meta name="description" content="ts-cloud server &amp; deployment dashboard"><meta property="og:title" content="ts-cloud - Dashboard"><meta property="og:description" content="ts-cloud server &amp; deployment dashboard"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="ts-cloud - Dashboard"><meta name="twitter:description" content="ts-cloud server &amp; deployment dashboard"> <script data-stx-runtime src="/_stx/runtime.c696d17a.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud - Dashboard</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"><meta name="description" content="ts-cloud server &amp; deployment dashboard"> <script data-stx-scoped>
2
+ function __stx_setup_1787369298544_31() {
3
3
  const { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, refresh, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
4
4
 
5
5
  var initialData = null;
@@ -161,9 +161,9 @@ servicesC = __stxBundle_87ebf77e804c["servicesC"];
161
161
  svcTone = __stxBundle_87ebf77e804c["svcTone"];
162
162
  return { barCss, barStyle, cpuP, cpuSub, data, diskP, gbVal, indicator, liveData, loadP, memP, memSub, n, overallC, overallWordC, pDisp, pTone, pctOf, pollingError, pollingState, servicesC, svcTone, __stxBundle_87ebf77e804c };
163
163
  }
164
- window.__stx_latestSetup=__stx_setup_1787353533623_32;
165
- if(window.stx)window.stx._latestSetup=__stx_setup_1787353533623_32;
166
- </script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.b7a99a5c.css"></head><body data-stx="__stx_setup_1787353533623_32"><a data-stx-scope="stx_scope_nav_48" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>stacks-production-app</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="active" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="" href="/operations/maintenance?env=production">Maintenance & DR</a><a class="" href="/operations/workloads?env=production">Workloads</a><a class="" href="/operations/observability?env=production">Observability</a><a class="" href="/operations/alerts?env=production">Alerts & health</a><a class="" href="/operations/spend?env=production">Spend & budgets</a><a href="/server/metrics?env=production">Metrics</a><a href="/server/services?env=production">Runtime services</a><a class="" href="/operations/jobs?env=production">Workers & schedules</a><a class="" href="/operations/configuration?env=production">Environment &amp; secrets</a><a class="" href="/data/backups?env=production">Backups &amp; recovery</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/actions?env=production">Run operations</a></section><section class="nav-group"><h2>Infrastructure</h2><a class="" href="/infrastructure/topology?env=production">Infrastructure map</a><a class="" href="/data/services?env=production">Data services</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/firewall?env=production">Network & firewall</a><a href="/server/ssh-keys?env=production">SSH keys</a><a class="" href="/server/fleet?env=production">Fleet inventory</a><a class="" href="/server/capacity?env=production">Capacity & placement</a><a href="/security?env=production">Security posture</a><a href="/server/terminal?env=production">Terminal</a></section><section class="nav-group"><h2>Organization</h2><a class="" href="/server/team?env=production">People & access</a><a class="" href="/account/automation?env=production">API & automation</a></section><section class="nav-group"><h2>Account</h2><a class="" href="/account/security?env=production">Sign-in & security</a></section></div><form method="post" action="/api/logout" class="signout"><button type="submit">Sign out</button></form></aside><dialog class="command-palette" aria-labelledby="command-title"><div class="command-search"><span aria-hidden="true">⌕</span><input type="search" placeholder="Search services, domains, deployments…" aria-label="Search resources" autocomplete="off"><button type="button" class="command-close" aria-label="Close search">Esc</button></div><h2 id="command-title" class="sr-only">Search resources and navigation</h2><div class="command-status" role="status">Start typing to search this project.</div><section class="saved-views" aria-labelledby="saved-views-title"><div class="saved-views-heading"><h3 id="saved-views-title">Saved views</h3><form class="save-view-form"><label class="sr-only" for="save-view-name">Saved view name</label><input id="save-view-name" maxlength="64" placeholder="Name this view" autocomplete="off"><button type="submit">Save current filters</button></form></div><div class="saved-view-list"></div></section><form class="tag-result-form"><label for="tag-result-name">Tag selected resource</label><input id="tag-result-name" maxlength="32" placeholder="customer-facing" pattern="[A-Za-z0-9][A-Za-z0-9 -]{0,31}" autocomplete="off"><input class="tag-color" type="color" value="#5a8be0" aria-label="Tag color"><button type="submit">Add tag</button></form><div class="command-results" role="listbox" aria-label="Search results"></div><footer><span>↑ ↓ navigate</span><span>Enter open</span><span>Esc close</span></footer></dialog><div class="context-bar" aria-label="Current scope"><div class="context-path"><div class="context-breadcrumb"><span>stacks-production-app</span><i>/</i><strong>production</strong></div><div class="context-filters" aria-label="Active filters"></div></div><span class="scope-safety production">Production scope</span></div> <script data-stx-scoped data-stx-run="always">
164
+ window.__stx_latestSetup=__stx_setup_1787369298544_31;
165
+ if(window.stx)window.stx._latestSetup=__stx_setup_1787369298544_31;
166
+ </script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.b7a99a5c.css"></head><body data-stx="__stx_setup_1787369298544_31"><a data-stx-scope="stx_scope_nav_47" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>stacks-production-app</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="active" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="" href="/operations/maintenance?env=production">Maintenance & DR</a><a class="" href="/operations/workloads?env=production">Workloads</a><a class="" href="/operations/observability?env=production">Observability</a><a class="" href="/operations/alerts?env=production">Alerts & health</a><a class="" href="/operations/spend?env=production">Spend & budgets</a><a href="/server/metrics?env=production">Metrics</a><a href="/server/services?env=production">Runtime services</a><a class="" href="/operations/jobs?env=production">Workers & schedules</a><a class="" href="/operations/configuration?env=production">Environment &amp; secrets</a><a class="" href="/data/backups?env=production">Backups &amp; recovery</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/actions?env=production">Run operations</a></section><section class="nav-group"><h2>Infrastructure</h2><a class="" href="/infrastructure/topology?env=production">Infrastructure map</a><a class="" href="/data/services?env=production">Data services</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/firewall?env=production">Network & firewall</a><a href="/server/ssh-keys?env=production">SSH keys</a><a class="" href="/server/fleet?env=production">Fleet inventory</a><a class="" href="/server/capacity?env=production">Capacity & placement</a><a href="/security?env=production">Security posture</a><a href="/server/terminal?env=production">Terminal</a></section><section class="nav-group"><h2>Organization</h2><a class="" href="/server/team?env=production">People & access</a><a class="" href="/account/automation?env=production">API & automation</a></section><section class="nav-group"><h2>Account</h2><a class="" href="/account/security?env=production">Sign-in & security</a></section></div><form method="post" action="/api/logout" class="signout"><button type="submit">Sign out</button></form></aside><dialog class="command-palette" aria-labelledby="command-title"><div class="command-search"><span aria-hidden="true">⌕</span><input type="search" placeholder="Search services, domains, deployments…" aria-label="Search resources" autocomplete="off"><button type="button" class="command-close" aria-label="Close search">Esc</button></div><h2 id="command-title" class="sr-only">Search resources and navigation</h2><div class="command-status" role="status">Start typing to search this project.</div><section class="saved-views" aria-labelledby="saved-views-title"><div class="saved-views-heading"><h3 id="saved-views-title">Saved views</h3><form class="save-view-form"><label class="sr-only" for="save-view-name">Saved view name</label><input id="save-view-name" maxlength="64" placeholder="Name this view" autocomplete="off"><button type="submit">Save current filters</button></form></div><div class="saved-view-list"></div></section><form class="tag-result-form"><label for="tag-result-name">Tag selected resource</label><input id="tag-result-name" maxlength="32" placeholder="customer-facing" pattern="[A-Za-z0-9][A-Za-z0-9 -]{0,31}" autocomplete="off"><input class="tag-color" type="color" value="#5a8be0" aria-label="Tag color"><button type="submit">Add tag</button></form><div class="command-results" role="listbox" aria-label="Search results"></div><footer><span>↑ ↓ navigate</span><span>Enter open</span><span>Esc close</span></footer></dialog><div class="context-bar" aria-label="Current scope"><div class="context-path"><div class="context-breadcrumb"><span>stacks-production-app</span><i>/</i><strong>production</strong></div><div class="context-filters" aria-label="Active filters"></div></div><span class="scope-safety production">Production scope</span></div> <script data-stx-scoped data-stx-run="always">
167
167
  (function() {
168
168
  var { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, refresh, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
169
169
  var __destroyHooks = [];
@@ -514,6 +514,6 @@ if(window.stx)window.stx._latestSetup=__stx_setup_1787353533623_32;
514
514
 
515
515
 
516
516
  try { if (typeof __stxScopeRenames !== 'undefined' && __stxScopeRenames) { for (var __stxRK in __stxScopeRenames) __scopeRegistration[__stxRK] = __stxScopeRenames[__stxRK]; } } catch (e) { /* no renames */ }
517
- window.stx._scopes['stx_scope_nav_48'] = __scopeRegistration;
517
+ window.stx._scopes['stx_scope_nav_47'] = __scopeRegistration;
518
518
  })();
519
519
  </script> <div class="wrap"><header class="page"><div><h1>Server Dashboard</h1><p>Hetzner · fsn1 · Linux</p><div class="server-line"><span>IP <b>-</b></span><span>Uptime <b>-</b></span><span>CPUs <b>4</b></span><span class="pill" :class="overallC()" x-cloak>{{ overallWordC() }}</span></div></div><div class="header-actions" x-cloak><span class="env" :class="{ bad: pollingState() === 'stale' }" :title="pollingState() === 'stale' ? pollingError() : 'Auto-refreshing every 10s'" x-cloak>{{ indicator() }}</span><a class="btn ghost" href="/server/actions">Operations</a></div></header><div class="grid cards"><a class="panel" href="/server/metrics"><h3>CPU utilization</h3><div class="stat" x-cloak>{{ pDisp(cpuP()) }}<small x-cloak>{{ cpuSub() }}</small></div><div :class="barCss(cpuP())"><i :style="barStyle(cpuP())"></i></div></a><a class="panel" href="/server/metrics"><h3>Memory</h3><div class="stat" x-cloak>{{ pDisp(memP()) }}<small x-cloak>{{ memSub() }}</small></div><div :class="barCss(memP())"><i :style="barStyle(memP())"></i></div></a><a class="panel" href="/server/metrics"><h3>Disk</h3><div class="stat" x-cloak>{{ pDisp(diskP()) }}<small></small></div><div :class="barCss(diskP())"><i :style="barStyle(diskP())"></i></div></a><a class="panel" href="/data/backups"><h3>Backups</h3><div class="stat">0 MB</div><p style="color: var(--txt2); font-size: 13px; margin-top: 8px;">Last not configured</p></a></div><div class="grid cards-3" style="margin-top:16px;"><a class="panel" href="/server/security"><h3>Security</h3><div class="stat"><span class="pill ok">configured</span></div><p style="color: var(--txt2); font-size: 13px; margin-top: 8px;">0 listeners · 0 certs</p></a><a class="panel" href="/server/diagnostics"><h3>Diagnostics</h3><div class="stat">0<small> fail</small></div><p style="color: var(--txt2); font-size: 13px; margin-top: 8px;">0 warnings</p></a><a class="panel" href="/server/activity"><h3>Activity</h3><div class="stat">0</div><p style="color: var(--txt2); font-size: 13px; margin-top: 8px;">deploys, warnings, key changes</p></a></div><div class="section"><h2>Resource Shape <a class="more" href="/server/metrics">Open health →</a></h2><div class="chart-panel panel"><svg class="chart resource-chart" viewBox="0 0 640 210" role="img" aria-label="Server resource chart"><rect x="1" y="1" width="638" height="208" rx="14" class="chart-shell"></rect><line x1="38" x2="620" y1="166" y2="166" class="chart-grid"></line><text x="28" y="170" text-anchor="end" class="chart-axis">0</text><line x1="38" x2="620" y1="129" y2="129" class="chart-grid"></line><text x="28" y="133" text-anchor="end" class="chart-axis">25</text><line x1="38" x2="620" y1="92" y2="92" class="chart-grid"></line><text x="28" y="96" text-anchor="end" class="chart-axis">50</text><line x1="38" x2="620" y1="55" y2="55" class="chart-grid"></line><text x="28" y="59" text-anchor="end" class="chart-axis">75</text><line x1="38" x2="620" y1="18" y2="18" class="chart-grid"></line><text x="28" y="22" text-anchor="end" class="chart-axis">100</text><g class="bar-mark ok"><rect x="61.59459459459464" y="149.72" width="141.56756756756755" height="16.28" rx="7"></rect><text x="132.37837837837841" y="141.72" text-anchor="middle" class="chart-value">11%</text><text x="132.37837837837841" y="190" text-anchor="middle" class="chart-label">CPU</text><title>11% busy · 0.42 load / 4 vCPU</title></g><g class="bar-mark ok"><rect x="258.21621621621625" y="118.64" width="141.56756756756755" height="47.36" rx="7"></rect><text x="329" y="110.64" text-anchor="middle" class="chart-value">32%</text><text x="329" y="190" text-anchor="middle" class="chart-label">Memory</text><title>2.4 / 7.7 GB</title></g><g class="bar-mark ok"><rect x="454.83783783783787" y="109.76" width="141.56756756756755" height="56.239999999999995" rx="7"></rect><text x="525.6216216216217" y="101.76" text-anchor="middle" class="chart-value">38%</text><text x="525.6216216216217" y="190" text-anchor="middle" class="chart-label">Disk</text><title>0 / 0 GB</title></g></svg></div></div><div class="section"><h2>Services <span class="more"><a href="/server/services">View all →</a><a href="/server/logs">Logs →</a><a href="/server/security">Security →</a></span></h2><div class="panel" x-cloak><div class="svc" x-cloak><template :for="svc in servicesC()"><div class="item" x-cloak>{{ svc.name }} <span class="pill" :class="svcTone(svc.status)" x-cloak>{{ svc.status }}</span></div></template></div><div class="compact empty" @show="servicesC().length === 0" x-cloak><strong>No managed services</strong><span>Configured services will appear after the next successful server probe.</span></div></div></div><div class="section"><h2>SSH Keys <a class="more" href="/server/ssh-keys">Manage →</a></h2><div class="panel"><div class="compact empty"><strong>No SSH keys configured</strong><span>Add keys from the management page and apply them on the next deploy.</span></div><p class="note">SSH keys are managed in <span class="mono">infrastructure.compute.sshKeys</span> in your cloud config and applied on the next <span class="mono">cloud deploy</span>.</p></div></div><div class="section"><h2>Sites <a class="more" href="/server/sites">View all →</a></h2><div class="panel"><table><thead><tr><th scope="col">Site</th><th scope="col">Project</th><th scope="col">Route</th><th scope="col">Response</th><th scope="col">TLS</th><th scope="col">Deploy</th><th scope="col">Status</th></tr></thead><tbody><tr><td><b>main</b></td><td><span class="tag">stacks</span></td><td><a href="https://stacksjs.com" class="mono">stacksjs.com</a></td><td class="mono">pending</td><td><span class="warn pill">https</span></td><td style="color: var(--txt2)">service</td><td><span class="pill ok">live</span></td></tr><tr><td><b>api</b></td><td><span class="tag">stacks</span></td><td><span class="mono">internal</span></td><td class="mono">pending</td><td><span class="warn pill">loopback</span></td><td style="color: var(--txt2)">service</td><td><span class="pill ok">live</span></td></tr><tr><td><b>docs</b></td><td><span class="tag">stacks</span></td><td><a href="https://stacksjs.com/docs" class="mono">stacksjs.com/docs</a></td><td class="mono">pending</td><td><span class="warn pill">https</span></td><td style="color: var(--txt2)">server static</td><td><span class="pill ok">live</span></td></tr><tr><td><b>blog</b></td><td><span class="tag">stacks</span></td><td><a href="https://stacksjs.com/blog" class="mono">stacksjs.com/blog</a></td><td class="mono">pending</td><td><span class="warn pill">https</span></td><td style="color: var(--txt2)">server static</td><td><span class="pill ok">live</span></td></tr><tr><td><b>public</b></td><td><span class="tag">stacks</span></td><td><a href="https://stacksjs.com" class="mono">stacksjs.com</a></td><td class="mono">pending</td><td><span class="warn pill">https</span></td><td style="color: var(--txt2)">server static</td><td><span class="pill warn">shadowed</span></td></tr><tr><td><b>verygoodadblock</b></td><td><span class="tag">stacks</span></td><td><a href="https://verygoodadblock.org" class="mono">verygoodadblock.org</a></td><td class="mono">pending</td><td><span class="warn pill">https</span></td><td style="color: var(--txt2)">server static</td><td><span class="pill ok">live</span></td></tr></tbody></table></div></div><div class="cols section"><div><h2>Recent Deployments <a class="more" href="/server/deployments">View all →</a></h2><div class="panel"><svg class="chart deployment-chart disabled" viewBox="0 0 640 164" role="img" aria-label="No deployment history"><rect x="1" y="1" width="638" height="162" rx="14" class="chart-shell"></rect><text x="320" y="76" text-anchor="middle" class="chart-empty-title">No deploy records yet</text><text x="320" y="100" text-anchor="middle" class="chart-empty-sub">Deploy again and this timeline will fill in automatically.</text></svg><div class="compact empty"><strong>No recent deployments</strong><span>No deployment history has been recorded yet.</span></div></div></div><div><h2>Queues &amp; Scheduler <a class="more" href="/server/workers">Details →</a></h2><div class="panel"><div class="kv"><span>queue:default ×2</span><span class="pill ok">running</span></div><div class="kv"><span>queue:emails ×1</span><span class="pill ok">running</span></div><div class="kv"><span>scheduler</span><span class="ok pill">on · 36s ago</span></div></div><div style="height: 16px"></div><h2>Backups <a class="more" href="/data/backups">Details →</a></h2><div class="panel"><div class="kv"><span>destination</span><span class="mono">off</span></div><div class="kv"><span>retention</span><span>0 copies</span></div><div class="kv"><span>last run</span><span style="color: var(--txt2)">not configured</span></div></div></div></div></div></body></html>
@@ -1,5 +1,5 @@
1
- <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt3k56ealftvbz"><meta name="title" content="stx Project"><meta name="description" content="A website built with stx templating engine"><meta property="og:title" content="stx Project"><meta property="og:description" content="A website built with stx templating engine"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="stx Project"><meta name="twitter:description" content="A website built with stx templating engine"> <script data-stx-runtime src="/_stx/runtime.c696d17a.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud - Infrastructure map</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-scoped>
2
- function __stx_setup_1787353530352_7() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt3tj2le8bg297"><meta name="title" content="stx Project"><meta name="description" content="A website built with stx templating engine"><meta property="og:title" content="stx Project"><meta property="og:description" content="A website built with stx templating engine"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="stx Project"><meta name="twitter:description" content="A website built with stx templating engine"> <script data-stx-runtime src="/_stx/runtime.c696d17a.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud - Infrastructure map</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-scoped>
2
+ function __stx_setup_1787369295161_7() {
3
3
  const { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
4
4
 
5
5
  var initialTopology = {"mode":"server","project":"sample-project","environment":"production","provider":"hetzner","region":"fsn1","generatedAt":"","layers":[{"index":0,"id":"clients","label":"Clients"},{"index":1,"id":"dns","label":"DNS & TLS"},{"index":2,"id":"edge","label":"Edge"},{"index":3,"id":"routing","label":"Routing"},{"index":4,"id":"apps","label":"Applications"},{"index":5,"id":"runtime","label":"Background runtime"},{"index":6,"id":"data","label":"Data services"},{"index":7,"id":"durability","label":"Durability"}],"groups":[{"id":"box","label":"sample-production-app","sub":"hetzner · fsn1"}],"nodes":[{"id":"internet","label":"Internet","kind":"internet","layer":0,"status":"ok","sub":"Public traffic","facts":[],"external":true},{"id":"dns","label":"example.com","kind":"dns","layer":1,"status":"ok","sub":"DNS & certificates","facts":[],"external":true},{"id":"firewall","label":"Host firewall","kind":"firewall","layer":2,"status":"ok","sub":"Inbound filtering","facts":[],"group":"box"},{"id":"proxy","label":"rpx-gateway","kind":"proxy","layer":3,"status":"ok","sub":"TLS termination & routing","facts":[],"group":"box"},{"id":"site:main","label":"main","kind":"site","layer":4,"status":"ok","sub":"bun","facts":[],"group":"box"},{"id":"site:docs","label":"docs","kind":"site","layer":4,"status":"ok","sub":"static/bun","facts":[],"group":"box"},{"id":"worker:default","label":"default","kind":"worker","layer":5,"status":"ok","sub":"2 processes","facts":[],"group":"box"},{"id":"data:redis","label":"Redis","kind":"cache","layer":6,"status":"ok","sub":"redis","facts":[],"group":"box"},{"id":"data:mysql","label":"MySQL","kind":"database","layer":6,"status":"ok","sub":"mysql","facts":[],"group":"box"},{"id":"backup","label":"Backups","kind":"backup","layer":7,"status":"ok","sub":"off-box","facts":[]}],"links":[{"source":"internet","target":"dns","flow":"request","label":"https"},{"source":"dns","target":"firewall","flow":"request","label":"443/80"},{"source":"firewall","target":"proxy","flow":"request"},{"source":"proxy","target":"site:main","flow":"request"},{"source":"proxy","target":"site:docs","flow":"request"},{"source":"site:main","target":"worker:default","flow":"async","label":"queue"},{"source":"site:main","target":"data:redis","flow":"data","label":"localhost"},{"source":"site:main","target":"data:mysql","flow":"data","label":"localhost"},{"source":"worker:default","target":"data:mysql","flow":"data","label":"localhost"},{"source":"data:mysql","target":"backup","flow":"backup","label":"snapshot"}],"notes":[]};
@@ -858,9 +858,9 @@ zoomBy = __stxBundle_aadcc1d88d59["zoomBy"];
858
858
  zoomTo = __stxBundle_aadcc1d88d59["zoomTo"];
859
859
  return { STAGE_H, STAGE_W, animate, atPointer, builtAtLabel, canvasScale, canvasTransform, clear, counts, dim, dragging, fit, fitScale, flows, focus, geo, groups, hoveredId, isSample, isSnapshot, labelledLinks, lanes, lastUpdatedAt, linkClasses, linkOff, linkOn, links, load, manageHref, model, nodeClasses, nodes, notes, onDown, onMove, onUp, onWheel, panX, panY, pollingError, pollingState, query, refresh, restatus, select, selected, selectedFacts, selectedId, selectedLinks, shapeOf, stageCrop, toggleFlow, visible, zoom, zoomBy, zoomTo, __stxBundle_aadcc1d88d59 };
860
860
  }
861
- window.__stx_latestSetup=__stx_setup_1787353530352_7;
862
- if(window.stx)window.stx._latestSetup=__stx_setup_1787353530352_7;
863
- </script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.906ee17c.css"></head><body data-stx="__stx_setup_1787353530352_7"><a data-stx-scope="stx_scope_nav_10" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>Project</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="" href="/operations/maintenance?env=production">Maintenance & DR</a><a class="" href="/operations/workloads?env=production">Workloads</a><a class="" href="/operations/observability?env=production">Observability</a><a class="" href="/operations/alerts?env=production">Alerts & health</a><a class="" href="/operations/spend?env=production">Spend & budgets</a><a href="/server/metrics?env=production">Metrics</a><a href="/server/services?env=production">Runtime services</a><a class="" href="/operations/jobs?env=production">Workers & schedules</a><a class="" href="/operations/configuration?env=production">Environment &amp; secrets</a><a class="" href="/data/backups?env=production">Backups &amp; recovery</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/actions?env=production">Run operations</a></section><section class="nav-group"><h2>Infrastructure</h2><a class="active" href="/infrastructure/topology?env=production">Infrastructure map</a><a class="" href="/data/services?env=production">Data services</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/firewall?env=production">Network & firewall</a><a href="/server/ssh-keys?env=production">SSH keys</a><a class="" href="/server/fleet?env=production">Fleet inventory</a><a class="" href="/server/capacity?env=production">Capacity & placement</a><a href="/security?env=production">Security posture</a><a href="/server/terminal?env=production">Terminal</a></section><section class="nav-group"><h2>Organization</h2><a class="" href="/server/team?env=production">People & access</a><a class="" href="/account/automation?env=production">API & automation</a></section><section class="nav-group"><h2>Account</h2><a class="" href="/account/security?env=production">Sign-in & security</a></section></div><form method="post" action="/api/logout" class="signout"><button type="submit">Sign out</button></form></aside><dialog class="command-palette" aria-labelledby="command-title"><div class="command-search"><span aria-hidden="true">⌕</span><input type="search" placeholder="Search services, domains, deployments…" aria-label="Search resources" autocomplete="off"><button type="button" class="command-close" aria-label="Close search">Esc</button></div><h2 id="command-title" class="sr-only">Search resources and navigation</h2><div class="command-status" role="status">Start typing to search this project.</div><section class="saved-views" aria-labelledby="saved-views-title"><div class="saved-views-heading"><h3 id="saved-views-title">Saved views</h3><form class="save-view-form"><label class="sr-only" for="save-view-name">Saved view name</label><input id="save-view-name" maxlength="64" placeholder="Name this view" autocomplete="off"><button type="submit">Save current filters</button></form></div><div class="saved-view-list"></div></section><form class="tag-result-form"><label for="tag-result-name">Tag selected resource</label><input id="tag-result-name" maxlength="32" placeholder="customer-facing" pattern="[A-Za-z0-9][A-Za-z0-9 -]{0,31}" autocomplete="off"><input class="tag-color" type="color" value="#5a8be0" aria-label="Tag color"><button type="submit">Add tag</button></form><div class="command-results" role="listbox" aria-label="Search results"></div><footer><span>↑ ↓ navigate</span><span>Enter open</span><span>Esc close</span></footer></dialog><div class="context-bar" aria-label="Current scope"><div class="context-path"><div class="context-breadcrumb"><span>Project</span><i>/</i><strong>production</strong></div><div class="context-filters" aria-label="Active filters"></div></div><span class="scope-safety production">Production scope</span></div> <script data-stx-scoped data-stx-run="always">
861
+ window.__stx_latestSetup=__stx_setup_1787369295161_7;
862
+ if(window.stx)window.stx._latestSetup=__stx_setup_1787369295161_7;
863
+ </script> <style data-stx-cloak>[x-cloak]{display:none !important}</style><link data-crosswind="generated" rel="stylesheet" href="/_stx/crosswind.906ee17c.css"></head><body data-stx="__stx_setup_1787369295161_7"><a data-stx-scope="stx_scope_nav_10" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>Project</strong></div><div class="environment-picker" aria-label="Environment"><span class="context-label">Environment</span><details><summary class="environment-current production"><span>PROD</span><strong>production</strong></summary></details></div><button class="command-trigger" type="button" aria-keyshortcuts="Meta+K Control+K"><span>Search resources</span><kbd>⌘ K</kbd></button><div class="nav-groups"><section class="nav-group"><h2>Overview</h2><a class="" href="/?env=production">Dashboard</a><a href="/server/activity?env=production">Activity</a></section><section class="nav-group"><h2>Applications</h2><a class="" href="/server/sites?env=production">Services</a><a class="" href="/server/deployments?env=production">Deployments</a><a class="" href="/server/logs?env=production">Logs</a><a class="" href="/integrations?env=production">Git integrations</a><a class="" href="/applications/new?env=production">Create application</a><a class="" href="/applications/compose?env=production">Compose applications</a></section><section class="nav-group"><h2>Operations</h2><a class="" href="/operations/queue?env=production">Deployment queue</a><a class="" href="/operations/previews?env=production">Preview environments</a><a class="" href="/operations/releases?env=production">Releases & promotion</a><a class="" href="/operations/regions?env=production">Regions & failover</a><a class="" href="/operations/maintenance?env=production">Maintenance & DR</a><a class="" href="/operations/workloads?env=production">Workloads</a><a class="" href="/operations/observability?env=production">Observability</a><a class="" href="/operations/alerts?env=production">Alerts & health</a><a class="" href="/operations/spend?env=production">Spend & budgets</a><a href="/server/metrics?env=production">Metrics</a><a href="/server/services?env=production">Runtime services</a><a class="" href="/operations/jobs?env=production">Workers & schedules</a><a class="" href="/operations/configuration?env=production">Environment &amp; secrets</a><a class="" href="/data/backups?env=production">Backups &amp; recovery</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/actions?env=production">Run operations</a></section><section class="nav-group"><h2>Infrastructure</h2><a class="active" href="/infrastructure/topology?env=production">Infrastructure map</a><a class="" href="/data/services?env=production">Data services</a><a class="" href="/data/volumes?env=production">Persistent volumes</a><a href="/server/firewall?env=production">Network & firewall</a><a href="/server/ssh-keys?env=production">SSH keys</a><a class="" href="/server/fleet?env=production">Fleet inventory</a><a class="" href="/server/capacity?env=production">Capacity & placement</a><a href="/security?env=production">Security posture</a><a href="/server/terminal?env=production">Terminal</a></section><section class="nav-group"><h2>Organization</h2><a class="" href="/server/team?env=production">People & access</a><a class="" href="/account/automation?env=production">API & automation</a></section><section class="nav-group"><h2>Account</h2><a class="" href="/account/security?env=production">Sign-in & security</a></section></div><form method="post" action="/api/logout" class="signout"><button type="submit">Sign out</button></form></aside><dialog class="command-palette" aria-labelledby="command-title"><div class="command-search"><span aria-hidden="true">⌕</span><input type="search" placeholder="Search services, domains, deployments…" aria-label="Search resources" autocomplete="off"><button type="button" class="command-close" aria-label="Close search">Esc</button></div><h2 id="command-title" class="sr-only">Search resources and navigation</h2><div class="command-status" role="status">Start typing to search this project.</div><section class="saved-views" aria-labelledby="saved-views-title"><div class="saved-views-heading"><h3 id="saved-views-title">Saved views</h3><form class="save-view-form"><label class="sr-only" for="save-view-name">Saved view name</label><input id="save-view-name" maxlength="64" placeholder="Name this view" autocomplete="off"><button type="submit">Save current filters</button></form></div><div class="saved-view-list"></div></section><form class="tag-result-form"><label for="tag-result-name">Tag selected resource</label><input id="tag-result-name" maxlength="32" placeholder="customer-facing" pattern="[A-Za-z0-9][A-Za-z0-9 -]{0,31}" autocomplete="off"><input class="tag-color" type="color" value="#5a8be0" aria-label="Tag color"><button type="submit">Add tag</button></form><div class="command-results" role="listbox" aria-label="Search results"></div><footer><span>↑ ↓ navigate</span><span>Enter open</span><span>Esc close</span></footer></dialog><div class="context-bar" aria-label="Current scope"><div class="context-path"><div class="context-breadcrumb"><span>Project</span><i>/</i><strong>production</strong></div><div class="context-filters" aria-label="Active filters"></div></div><span class="scope-safety production">Production scope</span></div> <script data-stx-scoped data-stx-run="always">
864
864
  (function() {
865
865
  var { batch, computed, configureFetch, defineEmits, defineExpose, definePageMeta, defineProps, defineSlots, defineStore, derived, effect, goBack, goForward, inject, invalidateRoute, isDerived, isSignal, navigate, nextTick, onBeforeMount, onBeforeUnmount, onDestroy, onMount, onMounted, onUnmounted, peek, provide, reactive, ref, refresh, registerStoresClient, setRouteParams, state, untrack, useAsync, useClickOutside, useColorMode, useCookie, useCounter, useDark, useDebounce, useDebouncedValue, useEventListener, useFetch, useFocus, useHead, useId, useInterval, useLocalStorage, useMediaQuery, useMutation, useOptimistic, usePreferredContrast, usePreferredDark, usePreferredLight, usePreferredReducedMotion, useQuery, useReactiveProp, useRef, useRoute, useRouteParam, useRouteParams, useScrollLock, useSearchParams, useSeoMeta, useSessionStorage, useSlots, useStore, useThrottle, useTimeout, useToggle, useWebSocket, watch, watchEffect, watchMultiple, withDefaults } = window.stx;
866
866
  var __destroyHooks = [];