@stacksjs/ts-cloud 0.12.3 → 0.12.4

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 (65) hide show
  1. package/dist/bin/{chunk-s2grgcpy.js → chunk-dm06r9kd.js} +30 -29
  2. package/dist/bin/{chunk-9rb23kz9.js → chunk-wygaj04z.js} +1 -1
  3. package/dist/bin/{chunk-pp2m8q55.js → chunk-yw55bzp0.js} +1 -1
  4. package/dist/bin/cli.js +4 -4
  5. package/dist/bin/dashboard-server.js +1 -1
  6. package/dist/{chunk-3nmm7cap.js → chunk-v8rd7tpx.js} +1 -1
  7. package/dist/{chunk-n514hj0z.js → chunk-xdpy9p7n.js} +28 -27
  8. package/dist/deploy/index.js +1 -1
  9. package/dist/drivers/index.js +1 -1
  10. package/dist/index.js +1 -1
  11. package/dist/ui/404.html +1 -1
  12. package/dist/ui/accept-invitation.html +1 -1
  13. package/dist/ui/access-denied.html +1 -1
  14. package/dist/ui/account/automation.html +6 -6
  15. package/dist/ui/account/security.html +2 -2
  16. package/dist/ui/applications/compose.html +6 -6
  17. package/dist/ui/applications/new.html +1 -1
  18. package/dist/ui/data/backups.html +5 -5
  19. package/dist/ui/data/services.html +6 -6
  20. package/dist/ui/data/volumes.html +6 -6
  21. package/dist/ui/index.html +6 -6
  22. package/dist/ui/infrastructure/topology.html +6 -6
  23. package/dist/ui/integrations.html +1 -1
  24. package/dist/ui/operations/alerts.html +6 -6
  25. package/dist/ui/operations/configuration.html +5 -5
  26. package/dist/ui/operations/jobs.html +5 -5
  27. package/dist/ui/operations/maintenance.html +6 -6
  28. package/dist/ui/operations/observability.html +6 -6
  29. package/dist/ui/operations/previews.html +6 -6
  30. package/dist/ui/operations/queue.html +6 -6
  31. package/dist/ui/operations/regions.html +6 -6
  32. package/dist/ui/operations/releases.html +6 -6
  33. package/dist/ui/operations/spend.html +6 -6
  34. package/dist/ui/operations/workloads.html +6 -6
  35. package/dist/ui/security.html +1 -1
  36. package/dist/ui/server/actions.html +6 -6
  37. package/dist/ui/server/activity.html +2 -2
  38. package/dist/ui/server/capacity.html +6 -6
  39. package/dist/ui/server/database.html +6 -6
  40. package/dist/ui/server/deployments.html +5 -5
  41. package/dist/ui/server/diagnostics.html +2 -2
  42. package/dist/ui/server/firewall.html +6 -6
  43. package/dist/ui/server/fleet.html +6 -6
  44. package/dist/ui/server/logs.html +6 -6
  45. package/dist/ui/server/metrics.html +5 -5
  46. package/dist/ui/server/security.html +2 -2
  47. package/dist/ui/server/services.html +2 -2
  48. package/dist/ui/server/sites.html +6 -6
  49. package/dist/ui/server/ssh-keys.html +6 -6
  50. package/dist/ui/server/team.html +5 -5
  51. package/dist/ui/server/terminal.html +2 -2
  52. package/dist/ui/serverless/alarms.html +5 -5
  53. package/dist/ui/serverless/assets.html +2 -2
  54. package/dist/ui/serverless/cost.html +2 -2
  55. package/dist/ui/serverless/data.html +6 -6
  56. package/dist/ui/serverless/deployments.html +2 -2
  57. package/dist/ui/serverless/firewall.html +2 -2
  58. package/dist/ui/serverless/functions.html +6 -6
  59. package/dist/ui/serverless/logs.html +6 -6
  60. package/dist/ui/serverless/metrics.html +2 -2
  61. package/dist/ui/serverless/queues.html +6 -6
  62. package/dist/ui/serverless/secrets.html +6 -6
  63. package/dist/ui/serverless/traces.html +6 -6
  64. package/dist/ui/serverless.html +5 -5
  65. package/package.json +3 -3
@@ -1,4 +1,4 @@
1
- <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt9ag411j9wvnd"><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.dbee66d1.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud - Create application</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"><style> .wizard-hero{display:flex;justify-content:space-between;gap:20px;align-items:flex-start}.wizard-shell{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:18px;align-items:start}.wizard-main{min-width:0}.stepper{display:grid;grid-template-columns:repeat(6,1fr);gap:5px;margin:18px 0}.step{border:0;background:transparent;color:var(--muted);display:grid;gap:7px;text-align:left;font-size:.7rem;padding:0}.step::before{content:"";height:3px;border-radius:4px;background:var(--line)}.step.active{color:var(--txt)}.step.active::before,.step.done::before{background:var(--accent)} .wizard-card{border:1px solid var(--line);border-radius:13px;background:var(--panel);padding:22px}.wizard-panel{display:none;gap:16px}.wizard-panel.active{display:grid}.wizard-panel h2{margin:0}.wizard-panel>p{margin:-8px 0 0}.choice-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:9px}.choice{position:relative;border:1px solid var(--line);border-radius:10px;padding:14px;display:grid;gap:5px;cursor:pointer}.choice:has(input:checked){border-color:var(--accent);background:rgba(90,139,224,.1)}.choice input{position:absolute;opacity:0}.choice strong{font-size:.9rem}.choice small{color:var(--muted);line-height:1.4} .fields{display:grid;grid-template-columns:1fr 1fr;gap:11px}.fields.three{grid-template-columns:repeat(3,1fr)}label.field{display:grid;gap:6px;color:var(--txt3);font-size:.72rem;font-weight:750;letter-spacing:.035em}.field input,.field select,.field textarea{width:100%;box-sizing:border-box;background:rgba(255,255,255,.045);border:1px solid var(--panel-br);border-radius:8px;padding:10px;color:var(--txt);font:inherit;font-weight:450;letter-spacing:0}.field :is(input,select,textarea):focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(90,139,224,.12)}.field.check{display:flex;align-items:center;gap:8px}.field.check input{width:auto}.conditional[hidden]{display:none}.advanced{border:1px solid var(--line);border-radius:9px;padding:11px}.advanced summary{cursor:pointer;font-weight:700;font-size:.8rem}.advanced>div{display:grid;gap:11px;margin-top:12px} .detect-card,.plan-block,.draft-card,.registry-row{border:1px solid var(--line);border-radius:10px;padding:13px;display:grid;gap:8px}.detect-card.selected{border-color:var(--accent)}.detect-head,.draft-head,.registry-row{display:flex;justify-content:space-between;gap:12px;align-items:flex-start}.evidence{display:flex;gap:6px;flex-wrap:wrap}.evidence span{font-size:.68rem;padding:4px 7px;border-radius:99px;background:rgba(255,255,255,.05);color:var(--muted)}.dropzone{border:1px dashed var(--line);border-radius:11px;padding:24px;text-align:center;color:var(--muted)}.dropzone.drag{border-color:var(--accent);background:rgba(90,139,224,.08)} .wizard-footer{display:flex;justify-content:space-between;gap:10px;margin-top:16px}.footer-group{display:flex;gap:8px;flex-wrap:wrap}.wizard-aside{position:sticky;top:18px;display:grid;gap:14px}.drafts{display:grid;gap:8px;max-height:420px;overflow:auto}.draft-card{background:rgba(255,255,255,.025)}.draft-card h3{margin:0;font-size:.85rem}.draft-card p{margin:0}.review-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}.plan-block h3{margin:0;font-size:.82rem}.plan-block ul{margin:0;padding-left:18px}.config-preview{max-height:310px;overflow:auto;font-size:.72rem;white-space:pre-wrap;word-break:break-word}.issue{color:#ff9ca2}.ok-text{color:#7adba0}.confirm-box{border:1px solid rgba(235,188,82,.45);background:rgba(235,188,82,.07);border-radius:10px;padding:13px}.status-line{min-height:1.3em;color:var(--muted)} @media(max-width:1000px){.wizard-shell{grid-template-columns:1fr}.wizard-aside{position:static;grid-template-columns:1fr 1fr}.choice-grid{grid-template-columns:1fr 1fr}.step span{display:none}}@media(max-width:620px){.fields,.fields.three,.review-grid,.wizard-aside{grid-template-columns:1fr}.choice-grid{grid-template-columns:1fr}.wizard-card{padding:16px}.wizard-hero{display:grid}.wizard-footer{align-items:flex-start}.stepper{gap:3px}} </style><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-auto><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="active" 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>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">
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt9glamdqfsomh"><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.dbee66d1.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud - Create application</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"><style> .wizard-hero{display:flex;justify-content:space-between;gap:20px;align-items:flex-start}.wizard-shell{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:18px;align-items:start}.wizard-main{min-width:0}.stepper{display:grid;grid-template-columns:repeat(6,1fr);gap:5px;margin:18px 0}.step{border:0;background:transparent;color:var(--muted);display:grid;gap:7px;text-align:left;font-size:.7rem;padding:0}.step::before{content:"";height:3px;border-radius:4px;background:var(--line)}.step.active{color:var(--txt)}.step.active::before,.step.done::before{background:var(--accent)} .wizard-card{border:1px solid var(--line);border-radius:13px;background:var(--panel);padding:22px}.wizard-panel{display:none;gap:16px}.wizard-panel.active{display:grid}.wizard-panel h2{margin:0}.wizard-panel>p{margin:-8px 0 0}.choice-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:9px}.choice{position:relative;border:1px solid var(--line);border-radius:10px;padding:14px;display:grid;gap:5px;cursor:pointer}.choice:has(input:checked){border-color:var(--accent);background:rgba(90,139,224,.1)}.choice input{position:absolute;opacity:0}.choice strong{font-size:.9rem}.choice small{color:var(--muted);line-height:1.4} .fields{display:grid;grid-template-columns:1fr 1fr;gap:11px}.fields.three{grid-template-columns:repeat(3,1fr)}label.field{display:grid;gap:6px;color:var(--txt3);font-size:.72rem;font-weight:750;letter-spacing:.035em}.field input,.field select,.field textarea{width:100%;box-sizing:border-box;background:rgba(255,255,255,.045);border:1px solid var(--panel-br);border-radius:8px;padding:10px;color:var(--txt);font:inherit;font-weight:450;letter-spacing:0}.field :is(input,select,textarea):focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px rgba(90,139,224,.12)}.field.check{display:flex;align-items:center;gap:8px}.field.check input{width:auto}.conditional[hidden]{display:none}.advanced{border:1px solid var(--line);border-radius:9px;padding:11px}.advanced summary{cursor:pointer;font-weight:700;font-size:.8rem}.advanced>div{display:grid;gap:11px;margin-top:12px} .detect-card,.plan-block,.draft-card,.registry-row{border:1px solid var(--line);border-radius:10px;padding:13px;display:grid;gap:8px}.detect-card.selected{border-color:var(--accent)}.detect-head,.draft-head,.registry-row{display:flex;justify-content:space-between;gap:12px;align-items:flex-start}.evidence{display:flex;gap:6px;flex-wrap:wrap}.evidence span{font-size:.68rem;padding:4px 7px;border-radius:99px;background:rgba(255,255,255,.05);color:var(--muted)}.dropzone{border:1px dashed var(--line);border-radius:11px;padding:24px;text-align:center;color:var(--muted)}.dropzone.drag{border-color:var(--accent);background:rgba(90,139,224,.08)} .wizard-footer{display:flex;justify-content:space-between;gap:10px;margin-top:16px}.footer-group{display:flex;gap:8px;flex-wrap:wrap}.wizard-aside{position:sticky;top:18px;display:grid;gap:14px}.drafts{display:grid;gap:8px;max-height:420px;overflow:auto}.draft-card{background:rgba(255,255,255,.025)}.draft-card h3{margin:0;font-size:.85rem}.draft-card p{margin:0}.review-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}.plan-block h3{margin:0;font-size:.82rem}.plan-block ul{margin:0;padding-left:18px}.config-preview{max-height:310px;overflow:auto;font-size:.72rem;white-space:pre-wrap;word-break:break-word}.issue{color:#ff9ca2}.ok-text{color:#7adba0}.confirm-box{border:1px solid rgba(235,188,82,.45);background:rgba(235,188,82,.07);border-radius:10px;padding:13px}.status-line{min-height:1.3em;color:var(--muted)} @media(max-width:1000px){.wizard-shell{grid-template-columns:1fr}.wizard-aside{position:static;grid-template-columns:1fr 1fr}.choice-grid{grid-template-columns:1fr 1fr}.step span{display:none}}@media(max-width:620px){.fields,.fields.three,.review-grid,.wizard-aside{grid-template-columns:1fr}.choice-grid{grid-template-columns:1fr}.wizard-card{padding:16px}.wizard-hero{display:grid}.wizard-footer{align-items:flex-start}.stepper{gap:3px}} </style><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-auto><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="active" 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>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">
2
2
  (function() {
3
3
  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;
4
4
  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="mt9ag411j9wvnd"><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.dbee66d1.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
- function __stx_setup_1787700041232_4() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt9glamdqfsomh"><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.dbee66d1.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
+ function __stx_setup_1787710360750_4() {
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_1787700041232_4;
371
- if(window.stx)window.stx._latestSetup=__stx_setup_1787700041232_4;
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_1787700041232_4"><a data-stx-scope="stx_scope_nav_5" 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_1787710360750_4;
371
+ if(window.stx)window.stx._latestSetup=__stx_setup_1787710360750_4;
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_1787710360750_4"><a data-stx-scope="stx_scope_nav_5" 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 = [];
@@ -1,5 +1,5 @@
1
- <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt9ag411j9wvnd"><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.dbee66d1.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
- function __stx_setup_1787700041230_3() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt9glamdqfsomh"><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.dbee66d1.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
+ function __stx_setup_1787710360748_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_1787700041230_3;
335
- if(window.stx)window.stx._latestSetup=__stx_setup_1787700041230_3;
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_1787700041230_3"><a data-stx-scope="stx_scope_nav_4" 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_1787710360748_2;
335
+ if(window.stx)window.stx._latestSetup=__stx_setup_1787710360748_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_1787710360748_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 = [];
@@ -684,6 +684,6 @@ if(window.stx)window.stx._latestSetup=__stx_setup_1787700041230_3;
684
684
 
685
685
 
686
686
  try { if (typeof __stxScopeRenames !== 'undefined' && __stxScopeRenames) { for (var __stxRK in __stxScopeRenames) __scopeRegistration[__stxRK] = __stxScopeRenames[__stxRK]; } } catch (e) { /* no renames */ }
687
- window.stx._scopes['stx_scope_nav_4'] = __scopeRegistration;
687
+ window.stx._scopes['stx_scope_nav_3'] = __scopeRegistration;
688
688
  })();
689
689
  </script> <main class="data-wrap wrap" id="main-content"><div class="crumbs">Infrastructure <span class="sep">/</span> Data services</div><header class="page"><div><h1>Data services</h1><p>Provision, adopt, connect, observe, back up, rotate, upgrade, resize, and retire databases and caches from one lifecycle.</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 sm" @click="createOpen.set(!createOpen())" x-cloak>{{ createOpen()?'Close':'New service' }}</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>Services</b><strong x-cloak>{{ services().length }}</strong><small>current environment</small></article><article class="panel"><b>Available</b><strong x-cloak>{{ services().filter(item=>item.status==='available').length }}</strong><small>healthy and connectable</small></article><article class="panel"><b>Needs attention</b><strong x-cloak>{{ services().filter(item=>['failed','degraded'].includes(item.status)).length }}</strong><small>failed or degraded</small></article><article class="panel"><b>Dependency redeploys</b><strong x-cloak>{{ services().reduce((sum,item)=>sum+(item.dependencies||[]).filter(dep=>dep.requiresRedeploy).length,0) }}</strong><small>after credential rotation</small></article></section><form class="create-grid panel" @show="createOpen()" @submit="createService($event)" x-cloak><div class="wide"><h2>Create or adopt a service</h2><p class="note">Private networking, encryption, deletion protection, and seven-day backup retention are the managed defaults. Previewing never mutates production.</p></div><label>Name<input name="name" required pattern="[a-z0-9][a-z0-9-]{1,62}" placeholder="orders-db"></label><label>Engine<select name="engine" required><option value="postgres">PostgreSQL</option><option value="mysql">MySQL</option><option value="mariadb">MariaDB</option><option value="redis">Redis</option><option value="mongodb">MongoDB</option><option value="libsql">libSQL</option></select></label><label>Provider<select name="provider" required><option value="aws_rds">AWS RDS</option><option value="aws_aurora">AWS Aurora</option><option value="aws_elasticache">AWS ElastiCache</option><option value="server">Server</option><option value="container">Container</option><option value="external">External / adopted</option></select></label><label>Provider ID or placement<input name="placement" placeholder="orders-production"></label><label>Plan<input name="plan" value="db.t4g.micro" placeholder="db.t4g.micro"></label><label>Engine version<input name="engineVersion" placeholder="16.3"></label><label>Storage GB<input name="storageGb" type="number" min="1" value="20"></label><label>Username<input name="username" value="app" autocomplete="off"></label><label>Database<input name="database" placeholder="app"></label><label>Subnet group<input name="subnetGroup" placeholder="private-data"></label><label class="wide">Security group IDs<input name="securityGroupIds" placeholder="sg-database"></label><label class="wide">Allowed public CIDRs<input name="allowedCidrs" placeholder="203.0.113.8/32"><span>Required only for public access. Broad 0.0.0.0/0 is always refused.</span></label><label class="check"><input name="highAvailability" type="checkbox"> High availability</label><label class="check"><input name="publicExposure" type="checkbox"> Public endpoint</label><label class="check wide"><input name="adopt" type="checkbox"> Adopt existing provider ID read-only (no credential or mutation)</label><button class="btn wide" type="submit" :disabled="busy()" x-cloak>{{ busy()?'Creating…':'Review and create' }}</button></form><section class="filters panel"><input type="search" aria-label="Search data services" placeholder="Search name, engine, provider, placement" @input="search.set($event.currentTarget.value)"><select aria-label="Filter engine" @change="engineFilter.set($event.currentTarget.value)"><option value="all">All engines</option><option value="postgres">PostgreSQL</option><option value="mysql">MySQL</option><option value="mariadb">MariaDB</option><option value="redis">Redis</option><option value="mongodb">MongoDB</option><option value="libsql">libSQL</option></select><select aria-label="Filter provider" @change="providerFilter.set($event.currentTarget.value)"><option value="all">All providers</option><option value="aws_rds">RDS</option><option value="aws_aurora">Aurora</option><option value="aws_elasticache">ElastiCache</option><option value="server">Server</option><option value="container">Container</option><option value="external">External</option></select><select aria-label="Filter status" @change="statusFilter.set($event.currentTarget.value)"><option value="all">All states</option><option value="available">Available</option><option value="planning">Planning</option><option value="failed">Failed</option><option value="adopted">Adopted</option><option value="retained">Retained</option></select></section><div class="workspace" :class="{hasDetail:!!selected()}" x-cloak><section class="data-cards" x-cloak><template :for="item in filtered()"><article class="panel service-card" :class="{selected:selected()?.id===item.id}" x-cloak><div class="service-head" x-cloak><div x-cloak><span class="pill" :class="tone(item.status)" x-cloak>{{ item.status }}</span><span class="pill" x-cloak>{{ item.engine }}</span><span class="pill" x-cloak>{{ item.provider }}</span><h2 x-cloak>{{ item.name }}</h2></div><button class="btn ghost sm" @click="inspect(item)">Details</button></div><div class="service-grid"><div><small>Placement</small><b class="mono" x-cloak>{{ item.placement }}</b><span x-cloak>{{ item.plan }} · {{ item.engineVersion || 'provider default' }}</span></div><div><small>Endpoint</small><b class="mono" x-cloak>{{ item.observedState?.endpoint || 'pending' }}</b><span x-cloak>{{ item.publicExposure?'public allowlist':'private network' }}</span></div><div><small>Credential</small><b x-cloak>{{ item.credential?.configured ? item.credential.username : 'not managed' }}</b><span x-cloak>{{ item.credential?.rotatedAt ? 'rotated '+when(item.credential.rotatedAt) : item.credential?.configured ? 'version '+item.credential.version : 'reference only' }}</span></div><div><small>Protection</small><b x-cloak>{{ item.highAvailability?'high availability':'single placement' }}</b><span x-cloak>{{ item.origin }} · {{ item.managementEnabled?'managed':'read-only' }}</span></div></div><div class="actions"><button class="btn ghost sm" @click="runAction(item,'observe')">Refresh status</button><button class="btn ghost sm" @click="runAction(item,'backup')" :disabled="!item.capabilities.actions.backup.supported">Back up</button><button class="btn ghost sm" @click="runAction(item,'restart')">Restart</button><button class="btn ghost sm" @click="runAction(item,'rotate')" :disabled="!item.capabilities.actions.rotate.supported">Rotate credential</button><button class="btn danger sm" @click="runAction(item,'delete')">Retire</button></div><p class="bad note" @show="!!item.observedState?.error" x-cloak>{{ item.observedState.error }}</p></article></template><div class="empty panel" @show="!filtered().length" x-cloak><strong>No matching data services</strong><span>Create a managed service or adopt an existing provider resource read-only.</span></div></section><aside class="detail panel" @show="!!selected()" x-cloak><div class="detail-head"><div><small>Selected service</small><h2 x-cloak>{{ selected()?.name }}</h2></div><button class="btn ghost sm" aria-label="Close details" @click="selected.set(null)">Close</button></div><div class="capability"><h3>Lifecycle operations</h3><p class="note">Every operation is capability-checked and previewed before a durable production job is created.</p><div class="operation-picker" x-cloak><template :for="entry in Object.entries(selected()?.capabilities?.actions || {}).filter(([action])=>action!=='create'&&action!=='connect')"><button class="btn ghost sm" :class="{active:operationAction()===entry[0]}" :disabled="!entry[1].supported" :title="entry[1].explanation" @click="chooseAction(entry[0])" x-cloak>{{ actionLabels[entry[0]] || entry[0] }}</button></template></div><form class="operation-form" @submit="runConfiguredAction($event)"><label @show="operationAction()==='restore'" x-cloak>Backup ID<input name="backupId" placeholder="orders-snapshot"></label><label @show="operationAction()==='restore'" x-cloak>New target ID<input name="targetId" placeholder="orders-restored"></label><label @show="operationAction()==='resize'" x-cloak>Provider plan<input name="plan" :placeholder="selected()?.plan"></label><label @show="operationAction()==='resize'" x-cloak>Storage GB<input name="storageGb" type="number" min="1"></label><label @show="operationAction()==='resize'" x-cloak>Runtime memory MB<input name="memoryMb" type="number" min="16"></label><label @show="operationAction()==='resize'" x-cloak>Runtime CPUs<input name="cpus" type="number" min="0.1" step="0.1"></label><label @show="operationAction()==='version'" x-cloak>Target engine version<input name="engineVersion" placeholder="17.0"></label><label class="check" @show="operationAction()==='version'" x-cloak><input name="compatibilityReviewed" type="checkbox"> Compatibility reviewed</label><label @show="operationAction()==='version'" x-cloak>Pre-upgrade backup ID<input name="versionBackupId" placeholder="pre-upgrade-snapshot"></label><label @show="['logs','slow_queries'].includes(operationAction())" x-cloak>Maximum lines<input name="lines" type="number" min="1" max="2000" value="500"></label><label @show="['users','databases'].includes(operationAction())" x-cloak>Operation<select name="operation"><option value="list">List</option><option value="create" @show="operationAction()==='databases'" x-cloak>Create</option><option value="delete" @show="operationAction()==='databases'" x-cloak>Delete</option></select></label><label @show="operationAction()==='databases'" x-cloak>Database<input name="database" placeholder="analytics"></label><label @show="operationAction()==='delete'" x-cloak>Retention<select name="retention"><option value="final_backup">Final backup, then delete</option><option value="retain">Retain resource unmanaged</option></select></label><label class="check" @show="operationAction()==='expose'" x-cloak><input name="publicExposure" type="checkbox"> Public endpoint</label><label @show="operationAction()==='expose'" x-cloak>Allowed CIDRs<input name="allowedCidrs" placeholder="203.0.113.8/32"></label><button class="btn sm" type="submit" :disabled="busy() || !selected()?.capabilities?.actions?.[operationAction()]?.supported" x-cloak>{{ busy()?'Queueing…':actionLabels[operationAction()] }}</button></form><div class="action-preview"><p class="note" @show="!plan()" x-cloak>Choose an action to inspect support, downtime, confirmation, backup, and compatibility gates.</p><div @show="!!plan()" x-cloak><span class="pill" :class="plan()?.capability?.supported?'ok':'bad'" x-cloak>{{ plan()?.capability?.supported?'supported':'unsupported' }}</span><span class="pill" x-cloak>downtime {{ plan()?.capability?.downtime }}</span><p x-cloak>{{ plan()?.capability?.explanation }}</p><ul><li @show="plan()?.preflight?.backupRequired" x-cloak>Backup required</li><li @show="plan()?.preflight?.compatibilityRequired" x-cloak>Compatibility review required</li><li @show="plan()?.preflight?.retentionChoiceRequired" x-cloak>Retention choice required</li><template :for="warning in plan()?.warnings || []"><li x-cloak>{{ warning }}</li></template></ul></div></div></div><div><h3>Health, metrics, and provider state</h3><div class="observation-grid" x-cloak><template :for="entry in observationEntries(selected())"><div x-cloak><small x-cloak>{{ entry[0] }}</small><code x-cloak>{{ typeof entry[1] === 'object' ? JSON.stringify(entry[1], null, 2) : entry[1] }}</code></div></template></div><p class="note" @show="!observationEntries(selected()).length" x-cloak>Observed state is pending. Run Refresh status after provisioning.</p></div><div><h3>Connections</h3><template :for="item in guidance()"><div class="connection" x-cloak><span class="pill" x-cloak>{{ item.type }}</span><code x-cloak>{{ item.command }}</code><small x-cloak>{{ item.secretRef || 'no managed credential' }}</small><button class="btn ghost sm" @click="copy(item.command,'Connection command')">Copy command</button></div></template><p class="note" @show="!guidance().length" x-cloak>Endpoint discovery is pending. Refresh status after provisioning.</p></div><div><h3>Credentials</h3><p class="note">Secret values are encrypted and omitted from lists, plans, logs, and operation payloads.</p><button class="btn ghost sm" @show="selected()?.credential?.configured" @click="reveal(selected())" x-cloak>Reveal with recent authentication</button></div><div><h3>Recent operations</h3><template :for="operation in serviceOperations(selected())"><div class="operation" x-cloak><span class="pill" :class="tone(operation.state)" x-cloak>{{ operation.state }}</span><b x-cloak>{{ operation.input?.action }}</b><small x-cloak>{{ when(operation.createdAt) }} · attempt {{ operation.attempt }}</small></div></template><p class="note" @show="!serviceOperations(selected()).length" x-cloak>No durable operations yet.</p></div><div><h3>Dependency impact</h3><template :for="dependency in selected()?.dependencies || []"><div class="operation" x-cloak><b class="mono" x-cloak>{{ dependency.resourceId }}</b><span class="pill" :class="dependency.requiresRedeploy?'warn':'ok'" x-cloak>{{ dependency.requiresRedeploy?'redeploy after rotation':'dynamic reference' }}</span></div></template><p class="note" @show="!(selected()?.dependencies || []).length" x-cloak>No application dependencies registered.</p></div></aside></div><section class="credential panel" @show="!!oneTime()" role="alert" x-cloak><div><h2>Credential — copy now</h2><p>This value is deliberately absent from resource lists, logs, and operation history.</p></div><div class="secret" x-cloak><span x-cloak>{{ oneTime()?.username }}</span><code x-cloak>{{ oneTime()?.password }}</code></div><button class="btn ghost sm" @click="navigator.clipboard.writeText(oneTime()?.password || '')">Copy password</button><button class="btn ghost sm" @click="oneTime.set(null)">Hide</button></section></main><style> .data-wrap{max-width:1500px}.header-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.summary{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:14px}.summary article{display:grid;gap:5px}.summary strong{font-size:28px}.summary small,.service-grid small,.detail small{color:var(--txt3)}.create-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-bottom:14px}.create-grid label{display:grid;gap:5px;color:var(--txt3);font-size:11px}.create-grid input,.create-grid select,.filters input,.filters select,.operation-form input,.operation-form select{width:100%;background:var(--bg2);border:1px solid var(--line);border-radius:8px;color:var(--txt);padding:9px}.create-grid label span{font-size:10px}.create-grid .check,.operation-form .check{display:flex;align-items:center;gap:7px}.create-grid .check input,.operation-form .check input{width:auto}.wide{grid-column:1/-1}.filters{display:grid;grid-template-columns:minmax(260px,1fr) repeat(3,170px);gap:8px;margin-bottom:12px}.workspace{display:grid;grid-template-columns:1fr;gap:12px;align-items:start}.workspace.hasDetail{grid-template-columns:minmax(0,1.6fr) minmax(360px,.8fr)}.data-cards{display:grid;gap:10px}.data-cards>.empty{max-width:none;width:100%}.service-card.selected{border-color:var(--accent)}.service-head,.detail-head{display:flex;justify-content:space-between;gap:10px;align-items:center}.service-head>div{display:flex;gap:7px;align-items:center;flex-wrap:wrap}.service-head h2{font-size:17px;margin:0 0 0 3px}.service-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin:14px 0}.service-grid>div{display:grid;gap:4px;min-width:0}.service-grid b,.service-grid span{overflow-wrap:anywhere}.service-grid span{color:var(--txt3);font-size:11px}.actions,.operation-picker{display:flex;gap:6px;flex-wrap:wrap}.operation-picker{margin:10px 0}.operation-picker .active{border-color:var(--accent);color:var(--accent)}.operation-form{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:10px 0}.operation-form label{display:grid;gap:4px;color:var(--txt3);font-size:11px}.operation-form button{grid-column:1/-1}.action-preview{background:var(--bg2);border-radius:8px;padding:10px}.observation-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px;margin-top:9px}.observation-grid>div{display:grid;gap:4px;background:var(--bg2);border-radius:7px;padding:8px;min-width:0}.observation-grid code{white-space:pre-wrap;overflow-wrap:anywhere;font-size:10px}.detail{position:sticky;top:10px;display:grid;gap:18px}.detail h2,.detail h3{margin:0}.capability,.detail>div+div{border-top:1px solid var(--line);padding-top:14px}.capability ul{padding-left:18px;color:var(--txt2)}.connection{display:grid;gap:6px;padding:9px 0;border-bottom:1px solid var(--line)}.connection code{white-space:normal;overflow-wrap:anywhere;font-size:10px}.connection button{justify-self:start}.operation{display:flex;gap:7px;align-items:center;flex-wrap:wrap;padding:7px 0}.operation small{margin-left:auto}.credential{position:fixed;z-index:30;right:18px;bottom:18px;width:min(620px,calc(100vw - 36px));display:grid;grid-template-columns:1fr auto;gap:10px;box-shadow:0 16px 60px #0009;border-color:var(--accent)}.credential h2,.credential p{margin:0}.secret{grid-column:1/-1;display:grid;gap:5px;background:var(--bg2);padding:10px;border-radius:8px}.secret code{overflow-wrap:anywhere}.mono,code{font-family:var(--mono)}@media(max-width:1100px){.workspace.hasDetail{grid-template-columns:1fr}.detail{position:static}.create-grid{grid-template-columns:repeat(2,1fr)}.service-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:760px){.summary{grid-template-columns:repeat(2,1fr)}.filters{grid-template-columns:1fr}.service-grid,.create-grid,.operation-form,.observation-grid{grid-template-columns:1fr}.create-grid>*{grid-column:1!important}}@media(max-width:460px){.summary{grid-template-columns:1fr}.credential{grid-template-columns:1fr}} </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="mt9ag411j9wvnd"><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.dbee66d1.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
- function __stx_setup_1787700041229_2() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt9glamdqfsomh"><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.dbee66d1.js"></script> <script data-stx-composables src="/_stx/chunk.5ddb5087.js"></script> <script data-stx-scoped>
2
+ function __stx_setup_1787710360745_0() {
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_1787700041229_2;
223
- if(window.stx)window.stx._latestSetup=__stx_setup_1787700041229_2;
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_1787700041229_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="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_1787710360745_0;
223
+ if(window.stx)window.stx._latestSetup=__stx_setup_1787710360745_0;
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_1787710360745_0"><a data-stx-scope="stx_scope_nav_1" 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_1787700041229_2;
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_3'] = __scopeRegistration;
575
+ window.stx._scopes['stx_scope_nav_1'] = __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="mt9ag411j9wvnd"><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.dbee66d1.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_1787700044666_31() {
1
+ <!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mt9glamdqfsomh"><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.dbee66d1.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_1787710364260_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_1787700044666_31;
165
- if(window.stx)window.stx._latestSetup=__stx_setup_1787700044666_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_1787700044666_31"><a data-stx-scope="stx_scope_nav_46" 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_1787710364260_31;
165
+ if(window.stx)window.stx._latestSetup=__stx_setup_1787710364260_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_1787710364260_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_1787700044666_31;
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_46'] = __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>