@stacksjs/ts-cloud 0.16.92 → 0.16.94
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.
- package/dist/aws/index.js +1 -1
- package/dist/bin/{chunk-eb591jvz.js → chunk-1g2bnvz2.js} +1 -1
- package/dist/bin/{chunk-v72zwetk.js → chunk-d892pf66.js} +38 -38
- package/dist/bin/{chunk-00arzt4m.js → chunk-x9pqayv4.js} +1 -1
- package/dist/bin/cli.js +4 -4
- package/dist/bin/dashboard-server.js +1 -1
- package/dist/{chunk-zwayp7fz.js → chunk-1kagq9vp.js} +2 -2
- package/dist/{chunk-72p2tdpe.js → chunk-316cbffs.js} +105 -105
- package/dist/{chunk-sjfc9my3.js → chunk-3t5a5gr2.js} +5 -5
- package/dist/{chunk-1087xz1v.js → chunk-4afz3x6w.js} +14 -14
- package/dist/{chunk-fne338jr.js → chunk-4bysqvjh.js} +7 -7
- package/dist/{chunk-zjkxhvn0.js → chunk-71p77ycz.js} +93 -93
- package/dist/{chunk-hcbrgyfz.js → chunk-7y1pknej.js} +2 -2
- package/dist/{chunk-q7yf28cc.js → chunk-7zjf2493.js} +1 -1
- package/dist/chunk-92tv9xar.js +1 -0
- package/dist/{chunk-a77mhcs7.js → chunk-93xknw91.js} +3 -3
- package/dist/{chunk-cjm5j58y.js → chunk-bxn4n4qa.js} +146 -146
- package/dist/{chunk-xs9m0v31.js → chunk-bxq80y73.js} +4 -4
- package/dist/{chunk-1psh3mhm.js → chunk-byt4re1c.js} +1 -1
- package/dist/chunk-bzdfx427.js +138 -0
- package/dist/{chunk-by7hejhg.js → chunk-cjqw4ns4.js} +2 -2
- package/dist/chunk-cq34675f.js +1 -0
- package/dist/chunk-jntyd5zv.js +2 -0
- package/dist/{chunk-zy3kr4s2.js → chunk-kken64a9.js} +3 -3
- package/dist/chunk-m580e9rp.js +1 -0
- package/dist/{chunk-fe6m7wb0.js → chunk-n6tgqd7d.js} +19 -19
- package/dist/{chunk-tpvmpmxj.js → chunk-p1agrrnq.js} +2 -2
- package/dist/chunk-q1a389m2.js +1 -0
- package/dist/{chunk-qra9k26f.js → chunk-r2gtxb7n.js} +1 -1
- package/dist/{chunk-h6kptkce.js → chunk-sp0ne2ax.js} +2 -2
- package/dist/{chunk-c6kb5c5v.js → chunk-stqg97mh.js} +4 -4
- package/dist/{chunk-kcem6dzk.js → chunk-tes38y8x.js} +2 -2
- package/dist/{chunk-7d9ek8rc.js → chunk-vaczx33v.js} +4 -4
- package/dist/chunk-vpce5x9x.js +1 -0
- package/dist/chunk-w2gsveze.js +1 -0
- package/dist/{chunk-4m5gpp6w.js → chunk-wggeew90.js} +5 -5
- package/dist/{chunk-jz6dacx1.js → chunk-wnevarf9.js} +2 -2
- package/dist/{chunk-sxqe8e9c.js → chunk-x1k1sbgf.js} +7 -7
- package/dist/{chunk-byr76jcy.js → chunk-xa2ahxxa.js} +19 -19
- package/dist/{chunk-9f18pebj.js → chunk-z1087cap.js} +5 -5
- package/dist/chunk-z5dqpsek.js +1 -0
- package/dist/{chunk-x7cnfn7y.js → chunk-zpkf2jt2.js} +2 -2
- package/dist/deploy/index.js +1 -1
- package/dist/dns/index.js +1 -1
- package/dist/drivers/index.d.ts +2 -2
- package/dist/drivers/index.js +1 -1
- package/dist/drivers/shared/rpx-gateway.d.ts +14 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +37 -37
- package/dist/mail/index.js +2 -2
- package/dist/operations/index.js +1 -1
- package/dist/protection/index.js +1 -1
- package/dist/spend/index.js +1 -1
- package/dist/ui/404.html +1 -1
- package/dist/ui/accept-invitation.html +1 -1
- package/dist/ui/access-denied.html +1 -1
- package/dist/ui/account/automation.html +5 -5
- package/dist/ui/account/security.html +2 -2
- package/dist/ui/applications/compose.html +6 -6
- package/dist/ui/applications/new.html +1 -1
- package/dist/ui/data/backups.html +6 -6
- package/dist/ui/data/services.html +6 -6
- package/dist/ui/data/volumes.html +6 -6
- package/dist/ui/index.html +6 -6
- package/dist/ui/infrastructure/topology.html +5 -5
- package/dist/ui/integrations.html +2 -2
- package/dist/ui/operations/alerts.html +6 -6
- package/dist/ui/operations/configuration.html +6 -6
- package/dist/ui/operations/jobs.html +5 -5
- package/dist/ui/operations/maintenance.html +6 -6
- package/dist/ui/operations/observability.html +6 -6
- package/dist/ui/operations/previews.html +6 -6
- package/dist/ui/operations/queue.html +5 -5
- package/dist/ui/operations/regions.html +6 -6
- package/dist/ui/operations/releases.html +5 -5
- package/dist/ui/operations/spend.html +6 -6
- package/dist/ui/operations/workloads.html +6 -6
- package/dist/ui/security.html +2 -2
- package/dist/ui/server/actions.html +6 -6
- package/dist/ui/server/activity.html +1 -1
- package/dist/ui/server/capacity.html +6 -6
- package/dist/ui/server/database.html +6 -6
- package/dist/ui/server/deployments.html +5 -5
- package/dist/ui/server/diagnostics.html +2 -2
- package/dist/ui/server/firewall.html +6 -6
- package/dist/ui/server/fleet.html +6 -6
- package/dist/ui/server/logs.html +6 -6
- package/dist/ui/server/metrics.html +5 -5
- package/dist/ui/server/security.html +2 -2
- package/dist/ui/server/services.html +2 -2
- package/dist/ui/server/sites.html +6 -6
- package/dist/ui/server/ssh-keys.html +6 -6
- package/dist/ui/server/team.html +6 -6
- package/dist/ui/server/terminal.html +2 -2
- package/dist/ui/serverless/alarms.html +6 -6
- package/dist/ui/serverless/assets.html +2 -2
- package/dist/ui/serverless/cost.html +2 -2
- package/dist/ui/serverless/data.html +6 -6
- package/dist/ui/serverless/deployments.html +2 -2
- package/dist/ui/serverless/firewall.html +1 -1
- package/dist/ui/serverless/functions.html +6 -6
- package/dist/ui/serverless/logs.html +5 -5
- package/dist/ui/serverless/metrics.html +2 -2
- package/dist/ui/serverless/queues.html +6 -6
- package/dist/ui/serverless/secrets.html +6 -6
- package/dist/ui/serverless/traces.html +6 -6
- package/dist/ui/serverless.html +5 -5
- package/package.json +3 -3
- package/dist/chunk-0v77443p.js +0 -1
- package/dist/chunk-4khjjgd3.js +0 -1
- package/dist/chunk-872fdms3.js +0 -1
- package/dist/chunk-bazah9w0.js +0 -1
- package/dist/chunk-dmv3vryr.js +0 -138
- package/dist/chunk-qs7814ya.js +0 -1
- package/dist/chunk-sd5a61c6.js +0 -1
- package/dist/chunk-t1wq0ckc.js +0 -2
- package/dist/chunk-zft558kj.js +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="
|
|
2
|
-
function
|
|
1
|
+
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mw38cr1cy9hsmq"><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> <script data-stx-composables src="/_stx/chunk.9fd39d5b.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud · Queues</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-scoped>
|
|
2
|
+
function __stx_setup_1793864078785_35() {
|
|
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 initialQueues = [{"name":"acme-production-default","short":"default","visible":0,"inFlight":2,"delayed":0,"processed":12830,"oldestSec":0,"concurrency":10,"tries":3,"visTimeout":720,"dlq":0},{"name":"acme-production-emails","short":"emails","visible":4,"inFlight":1,"delayed":0,"processed":9210,"oldestSec":14,"concurrency":5,"tries":3,"visTimeout":720,"dlq":1}];
|
|
@@ -176,9 +176,9 @@ target = __stxBundle_63f5dee5d607["target"];
|
|
|
176
176
|
typed = __stxBundle_63f5dee5d607["typed"];
|
|
177
177
|
return { askOp, busy, canRun, cancelOp, confirmDanger, confirmLabel, confirmTok, confirmVerb, dlq, dlqLoaded, dlqMsg, fmtQueue, loadDlq, loadQueues, opOutput, opShown, pending, rows, runOp, target, typed, __stxBundle_63f5dee5d607 };
|
|
178
178
|
}
|
|
179
|
-
window.__stx_latestSetup=
|
|
180
|
-
if(window.stx)window.stx._latestSetup=
|
|
181
|
-
</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="
|
|
179
|
+
window.__stx_latestSetup=__stx_setup_1793864078785_35;
|
|
180
|
+
if(window.stx)window.stx._latestSetup=__stx_setup_1793864078785_35;
|
|
181
|
+
</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_1793864078785_35"><a data-stx-scope="stx_scope_nav_49" 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>acme</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 & secrets</a><a class="" href="/data/backups?env=production">Backups & 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>acme</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">
|
|
182
182
|
(function() {
|
|
183
183
|
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;
|
|
184
184
|
var __destroyHooks = [];
|
|
@@ -529,6 +529,6 @@ if(window.stx)window.stx._latestSetup=__stx_setup_1793817930729_34;
|
|
|
529
529
|
|
|
530
530
|
|
|
531
531
|
try { if (typeof __stxScopeRenames !== 'undefined' && __stxScopeRenames) { for (var __stxRK in __stxScopeRenames) __scopeRegistration[__stxRK] = __stxScopeRenames[__stxRK]; } } catch (e) { /* no renames */ }
|
|
532
|
-
window.stx._scopes['
|
|
532
|
+
window.stx._scopes['stx_scope_nav_49'] = __scopeRegistration;
|
|
533
533
|
})();
|
|
534
534
|
</script> <div class="wrap"><div class="crumbs"><a href="/serverless">Serverless</a><span class="sep">/</span> Queues</div><header class="page"><div><h1>Queues</h1><p>SQS queues feeding the queue worker (one job per invocation) with a shared dead-letter queue.</p></div></header><div class="section"><div class="panel"><table @show="rows().length > 0" x-cloak><thead><tr><th scope="col">Queue</th><th scope="col">Visible</th><th scope="col">In-flight</th><th scope="col">Oldest</th><th scope="col">Concurrency</th><th scope="col">Tries</th><th scope="col">Vis. timeout</th><th scope="col">Processed</th><th scope="col">DLQ</th><th scope="col" class="table-actions">Action</th></tr></thead><tbody><template :for="q in rows()"><tr><td x-cloak><b x-cloak>{{ q.short }}</b><div class="mono" style="font-size:11px;color:var(--txt3)" x-cloak>{{ q.name }}</div></td><td x-cloak>{{ q.visible }}</td><td x-cloak>{{ q.inFlight }}</td><td class="mono" x-cloak>{{ q.oldestSec }}s</td><td x-cloak>{{ q.concurrency }}</td><td x-cloak>{{ q.tries }}</td><td class="mono" x-cloak>{{ q.visTimeout }}s</td><td style="color:var(--txt2)" x-cloak>{{ fmtQueue(q.processed) }}</td><td x-cloak><span class="bad pill" @show="q.dlq > 0" x-cloak>{{ q.dlq }}</span><span style="color:var(--txt3)" @show="!q.dlq" x-cloak>0</span></td><td class="table-actions"><button class="btn danger sm" type="button" :aria-label="'Purge queue ' + q.short" @click="askOp('purge-queue:' + q.short, q.short, 'purge the ' + q.short + ' queue')">Purge</button></td></tr></template></tbody></table><div class="empty" @show="rows().length === 0" x-cloak><strong>No queues configured</strong><span>Add a queue definition to the serverless application to process background jobs.</span></div></div></div><div class="section"><h2>Dead-letter queue</h2><div class="panel"><div class="filters"><div class="select-filter"><span>Redrive into</span><select :value="target()" @change="target.set($event.target.value)"><template :for="n in queueNames"><option :value="n">{{ n }}</option></template></select></div><div class="row-actions"><button class="btn ghost sm" type="button" :disabled="busy()" @click="loadDlq()">Refresh</button><button class="btn ghost sm" type="button" :disabled="busy()" @click="askOp('redrive', target(), 'move DLQ messages into ' + target(), 'redrive')">Redrive</button><button class="btn danger sm" type="button" :disabled="busy()" @click="askOp('purge-dlq', 'dead-letter queue', 'permanently purge the dead-letter queue', 'purge')">Purge DLQ</button></div></div><table @show="dlq().length > 0" x-cloak><thead><tr><th scope="col">Message ID</th><th scope="col">Body</th></tr></thead><tbody><template :for="m in dlq()"><tr><td class="mono" style="font-size:11px" x-cloak>{{ m.id }}</td><td class="mono" style="font-size:11px;color:var(--txt2);max-width:640px;overflow:hidden;text-overflow:ellipsis" x-cloak>{{ m.body }}</td></tr></template></tbody></table><div class="compact empty" @show="dlqLoaded() && dlq().length === 0 && !dlqMsg()" x-cloak><strong>No failed messages</strong><span>The dead-letter queue is empty.</span></div><p class="note" @show="dlqMsg() !== ''" x-cloak>{{ dlqMsg() }}</p><div class="op-confirm panel" @show="pending() !== null" role="group" aria-labelledby="op-confirm-prompt" x-cloak><span id="op-confirm-prompt" x-cloak>Type <b class="mono" x-cloak>{{ confirmTok() }}</b> to {{ confirmVerb() }}:</span><input data-stx-ref="opConfirmInput" class="op-confirm-input" :value="typed()" @input="typed.set($event.target.value)" @keydown.enter="runOp()" placeholder="confirm" autocomplete="off" aria-labelledby="op-confirm-prompt"><button type="button" class="btn sm" :class="{ danger: confirmDanger() }" :disabled="!canRun()" @click="runOp()" x-cloak>{{ confirmLabel() }}</button><button type="button" class="btn ghost sm" :disabled="busy()" @click="cancelOp()">Cancel</button></div><pre class="action-output op-output" @show="opShown()" aria-live="polite" x-cloak>{{ opOutput() }}</pre><p class="note">Redrive receives messages from the DLQ and re-sends them to the selected source queue (peeked messages stay put). Purge is irreversible.</p></div></div></div></body></html>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="
|
|
2
|
-
function
|
|
1
|
+
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mw38cr1cy9hsmq"><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> <script data-stx-composables src="/_stx/chunk.9fd39d5b.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud · Secrets</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-scoped>
|
|
2
|
+
function __stx_setup_1793864078784_34() {
|
|
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 initialSecrets = [{"key":"APP_KEY","source":"acme/production/app-key","updated":"14d ago"},{"key":"DB_PASSWORD","source":"acme/production/db","updated":"14d ago"},{"key":"STRIPE_SECRET","source":"acme/production/stripe","updated":"3d ago"},{"key":"MAIL_PASSWORD","source":"acme/production/mail","updated":"21d ago"}];
|
|
@@ -204,9 +204,9 @@ typed = __stxBundle_3cab4dcb7f42["typed"];
|
|
|
204
204
|
value = __stxBundle_3cab4dcb7f42["value"];
|
|
205
205
|
return { askDelete, askOp, busy, canRun, cancelOp, confirmDanger, confirmLabel, confirmTok, confirmVerb, msg, msgOk, opOutput, opShown, pending, pickSource, refresh, requestSetSecret, rows, runOp, secretId, setSecret, typed, value, __stxBundle_3cab4dcb7f42 };
|
|
206
206
|
}
|
|
207
|
-
window.__stx_latestSetup=
|
|
208
|
-
if(window.stx)window.stx._latestSetup=
|
|
209
|
-
</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="
|
|
207
|
+
window.__stx_latestSetup=__stx_setup_1793864078784_34;
|
|
208
|
+
if(window.stx)window.stx._latestSetup=__stx_setup_1793864078784_34;
|
|
209
|
+
</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_1793864078784_34"><a data-stx-scope="stx_scope_nav_48" class="skip-link" href="#main-content">Skip to content</a><button class="nav-toggle-button" type="button" aria-label="Open navigation" aria-controls="primary-navigation" aria-expanded="false"><span></span><span></span><span></span></button><button class="nav-scrim" type="button" aria-label="Close navigation"></button><aside class="app-sidebar" id="primary-navigation" aria-label="Primary navigation"><a class="brand" href="/?env=production"><span class="dot"></span><span>ts-cloud</span></a><div class="sidebar-context"><span class="context-label">Project</span><strong>acme</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 & secrets</a><a class="" href="/data/backups?env=production">Backups & 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>acme</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">
|
|
210
210
|
(function() {
|
|
211
211
|
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;
|
|
212
212
|
var __destroyHooks = [];
|
|
@@ -557,6 +557,6 @@ if(window.stx)window.stx._latestSetup=__stx_setup_1793817930728_33;
|
|
|
557
557
|
|
|
558
558
|
|
|
559
559
|
try { if (typeof __stxScopeRenames !== 'undefined' && __stxScopeRenames) { for (var __stxRK in __stxScopeRenames) __scopeRegistration[__stxRK] = __stxScopeRenames[__stxRK]; } } catch (e) { /* no renames */ }
|
|
560
|
-
window.stx._scopes['
|
|
560
|
+
window.stx._scopes['stx_scope_nav_48'] = __scopeRegistration;
|
|
561
561
|
})();
|
|
562
562
|
</script> <div class="wrap"><div class="crumbs"><a href="/serverless">Serverless</a><span class="sep">/</span> Secrets</div><header class="page"><div><h1>Secrets</h1><p>Stored in AWS Secrets Manager and injected into the functions at deploy. Values are write-only and never displayed.</p></div></header><div class="section"><div class="panel"><table><thead><tr><th scope="col">Key</th><th scope="col">Secret source</th><th scope="col">Value</th><th scope="col">Updated</th><th scope="col" class="table-actions">Actions</th></tr></thead><tbody><template :for="s in rows()"><tr><td class="mono" x-cloak><b x-cloak>{{ s.key }}</b></td><td class="mono" style="color:var(--txt3)" x-cloak>{{ s.source ?? s.secretId }}</td><td class="mono" style="letter-spacing:2px;color:var(--txt3)">••••••••</td><td style="color:var(--txt3)" x-cloak>{{ s.updated ?? '-' }}</td><td class="table-actions"><div class="row-actions" style="justify-content:flex-end"><button class="btn ghost sm" type="button" :aria-label="'Set value for ' + (s.source ?? s.secretId)" @click="pickSource(s.source ?? s.secretId)">Set value</button><button class="btn danger sm" type="button" :aria-label="'Delete ' + (s.source ?? s.secretId)" @click="askDelete(s.source ?? s.secretId)">Delete</button></div></td></tr></template><tr @show="rows().length === 0" x-cloak><td colspan="5"><div class="compact empty"><strong>No secrets referenced</strong><span>Add secrets under <span class="mono">app.secrets</span> in your cloud config, then set their values here.</span></div></td></tr></tbody></table><div class="op-confirm panel" @show="pending() !== null" role="group" aria-labelledby="op-confirm-prompt" x-cloak><span id="op-confirm-prompt" x-cloak>Type <b class="mono" x-cloak>{{ confirmTok() }}</b> to {{ confirmVerb() }}:</span><input data-stx-ref="opConfirmInput" class="op-confirm-input" :value="typed()" @input="typed.set($event.target.value)" @keydown.enter="runOp()" placeholder="confirm" autocomplete="off" aria-labelledby="op-confirm-prompt"><button type="button" class="btn sm" :class="{ danger: confirmDanger() }" :disabled="!canRun()" @click="runOp()" x-cloak>{{ confirmLabel() }}</button><button type="button" class="btn ghost sm" :disabled="busy()" @click="cancelOp()">Cancel</button></div><pre class="action-output op-output" @show="opShown()" aria-live="polite" x-cloak>{{ opOutput() }}</pre></div></div><div class="section"><h2>Set a secret value</h2><div class="panel"><div class="form-grid"><div class="field-block"><label for="secret-id">Secret id (source path)</label><input id="secret-id" :value="secretId()" @input="secretId.set($event.target.value)" placeholder="acme/production/stripe" autocomplete="off"></div><div class="field-block"><label for="secret-value">Value (write-only)</label><input id="secret-value" type="password" :value="value()" @input="value.set($event.target.value)" placeholder="new secret value" autocomplete="off"></div><div class="form-actions"><button class="btn" type="button" :disabled="busy()" @click="requestSetSecret()">Save secret</button><span class="msg" :class="{ ok: msgOk(), bad: msg() && !msgOk() }" x-cloak>{{ msg() }}</span></div></div><p class="note">Setting a value creates the Secrets Manager entry if it does not exist. The new value is injected into the functions on the next <span class="mono">cloud deploy:serverless</span>.</p></div></div></div></body></html>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="
|
|
2
|
-
function
|
|
1
|
+
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mw38cr1cy9hsmq"><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 · Traces</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-scoped>
|
|
2
|
+
function __stx_setup_1793864078720_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 initialTraces = [];
|
|
@@ -42,9 +42,9 @@ onMount(() => {
|
|
|
42
42
|
|
|
43
43
|
return { traces, minutes, note, loading, filter, shown, tone, load, setWindow };
|
|
44
44
|
}
|
|
45
|
-
window.__stx_latestSetup=
|
|
46
|
-
if(window.stx)window.stx._latestSetup=
|
|
47
|
-
</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="
|
|
45
|
+
window.__stx_latestSetup=__stx_setup_1793864078720_31;
|
|
46
|
+
if(window.stx)window.stx._latestSetup=__stx_setup_1793864078720_31;
|
|
47
|
+
</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_1793864078720_31"><a data-stx-scope="stx_scope_nav_45" 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>acme</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 & secrets</a><a class="" href="/data/backups?env=production">Backups & 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>acme</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">
|
|
48
48
|
(function() {
|
|
49
49
|
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;
|
|
50
50
|
var __destroyHooks = [];
|
|
@@ -395,6 +395,6 @@ if(window.stx)window.stx._latestSetup=__stx_setup_1793817930728_32;
|
|
|
395
395
|
|
|
396
396
|
|
|
397
397
|
try { if (typeof __stxScopeRenames !== 'undefined' && __stxScopeRenames) { for (var __stxRK in __stxScopeRenames) __scopeRegistration[__stxRK] = __stxScopeRenames[__stxRK]; } } catch (e) { /* no renames */ }
|
|
398
|
-
window.stx._scopes['
|
|
398
|
+
window.stx._scopes['stx_scope_nav_45'] = __scopeRegistration;
|
|
399
399
|
})();
|
|
400
400
|
</script> <div class="wrap"><div class="crumbs"><a href="/serverless">Serverless</a><span class="sep">/</span> Traces</div><header class="page"><div><h1>Traces</h1><p>Distributed traces from AWS X-Ray for the HTTP function, newest first.</p></div><div class="header-actions"><button class="btn ghost sm" type="button" :disabled="loading()" @click="load()">Refresh</button></div></header><div class="section"><div class="panel"><div class="filters"><div class="segmented" role="group" aria-label="Time window"><button type="button" :class="{ active: minutes() === 15 }" @click="setWindow(15)">15m</button><button type="button" :class="{ active: minutes() === 30 }" @click="setWindow(30)">30m</button><button type="button" :class="{ active: minutes() === 60 }" @click="setWindow(60)">1h</button><button type="button" :class="{ active: minutes() === 180 }" @click="setWindow(180)">3h</button></div><div class="segmented" role="group" aria-label="Status filter"><button type="button" :class="{ active: filter() === 'all' }" @click="filter.set('all')">All</button><button type="button" :class="{ active: filter() === 'ok' }" @click="filter.set('ok')">OK</button><button type="button" :class="{ active: filter() === 'error' }" @click="filter.set('error')">Error</button><button type="button" :class="{ active: filter() === 'fault' }" @click="filter.set('fault')">Fault</button><button type="button" :class="{ active: filter() === 'throttle' }" @click="filter.set('throttle')">Throttle</button></div></div><table @show="shown().length > 0" x-cloak><thead><tr><th scope="col">Trace</th><th scope="col">Method</th><th scope="col">URL</th><th scope="col">HTTP</th><th scope="col">Response</th><th scope="col">Duration</th><th scope="col">Status</th></tr></thead><tbody><template :for="t in shown()"><tr><td class="mono" style="font-size:11px" x-cloak>{{ t.id }}</td><td class="mono" x-cloak>{{ t.method }}</td><td class="mono" style="font-size:11px;color:var(--txt2);max-width:420px;overflow:hidden;text-overflow:ellipsis" x-cloak>{{ t.url }}</td><td class="mono" x-cloak>{{ t.httpStatus }}</td><td class="mono" x-cloak>{{ t.responseMs }}ms</td><td class="mono" x-cloak>{{ t.durationMs }}ms</td><td x-cloak><span class="pill" :class="tone(t.status)" x-cloak>{{ t.status }}</span></td></tr></template></tbody></table><div class="compact empty" @show="shown().length === 0" x-cloak><strong>No traces</strong><span x-cloak>{{ note() || 'No traces match this filter.' }}</span></div><p class="note" @show="note() !== '' && shown().length > 0" x-cloak>{{ note() }}</p><p class="note">Traces need active tracing enabled on the Lambda functions. Set tracing in your serverless app config and redeploy.</p></div></div></div></body></html>
|
package/dist/ui/serverless.html
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="
|
|
2
|
-
function
|
|
1
|
+
<!DOCTYPE html><html lang="en" data-theme="dark"><head><meta charset="UTF-8"><meta name="stx-build" content="mw38cr1cy9hsmq"><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> <script data-stx-composables src="/_stx/chunk.9fd39d5b.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ts-cloud · Serverless</title><link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='3' y='3' width='26' height='26' rx='8' fill='%235a8be0'/%3E%3C/svg%3E"><link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_stx/style.448ab192.css"> <script data-stx-scoped>
|
|
2
|
+
function __stx_setup_1793864079347_36() {
|
|
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 initialMaintenance = false;
|
|
@@ -180,9 +180,9 @@ runOp = __stxBundle_0bd12f9ee3a9["runOp"];
|
|
|
180
180
|
typed = __stxBundle_0bd12f9ee3a9["typed"];
|
|
181
181
|
return { appCmd, askAppCmd, askOp, busy, canRun, cancelAppCmd, cancelOp, cmdBusy, cmdCanRun, cmdOut, cmdPending, cmdShown, cmdTyped, confirmDanger, confirmLabel, confirmTok, confirmVerb, maint, opOutput, opShown, pending, runAppCmd, runOp, typed, __stxBundle_0bd12f9ee3a9 };
|
|
182
182
|
}
|
|
183
|
-
window.__stx_latestSetup=
|
|
184
|
-
if(window.stx)window.stx._latestSetup=
|
|
185
|
-
</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="
|
|
183
|
+
window.__stx_latestSetup=__stx_setup_1793864079347_36;
|
|
184
|
+
if(window.stx)window.stx._latestSetup=__stx_setup_1793864079347_36;
|
|
185
|
+
</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_1793864079347_36"><a data-stx-scope="stx_scope_nav_51" 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 & secrets</a><a class="" href="/data/backups?env=production">Backups & 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">
|
|
186
186
|
(function() {
|
|
187
187
|
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;
|
|
188
188
|
var __destroyHooks = [];
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stacksjs/ts-cloud",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.16.
|
|
4
|
+
"version": "0.16.94",
|
|
5
5
|
"description": "A lightweight, performant infrastructure-as-code library and CLI for deploying both server-based (EC2) and serverless applications.",
|
|
6
6
|
"author": "Chris Breuer <chris@stacksjs.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -106,8 +106,8 @@
|
|
|
106
106
|
},
|
|
107
107
|
"dependencies": {
|
|
108
108
|
"@stacksjs/ts-xml": "^0.1.2",
|
|
109
|
-
"@ts-cloud/aws-types": "0.16.
|
|
110
|
-
"@ts-cloud/core": "0.16.
|
|
109
|
+
"@ts-cloud/aws-types": "0.16.94",
|
|
110
|
+
"@ts-cloud/core": "0.16.94",
|
|
111
111
|
"hash-wasm": "^4.12.0"
|
|
112
112
|
},
|
|
113
113
|
"devDependencies": {
|
package/dist/chunk-0v77443p.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{nu,N,iu,ga,MS,eh,FS,US,QS,HS,GS,VS,qS,jS}from"./chunk-sjfc9my3.js";export{GS as clearSigningKeyCache,ga as createPresignedUrl,MS as createPresignedUrlAsync,nu as detectServiceRegion,VS as getSigningKeyCacheSize,qS as isNodeCryptoAvailable,jS as isWebCryptoAvailable,eh as makeAWSRequest,US as makeAWSRequestAsync,FS as makeAWSRequestOnce,HS as parseJSONResponse,QS as parseXMLResponse,N as signRequest,iu as signRequestAsync};
|
package/dist/chunk-4khjjgd3.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{uu}from"./chunk-kcem6dzk.js";export{uu as assertComputeResidency};
|
package/dist/chunk-872fdms3.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{wc}from"./chunk-c6kb5c5v.js";import"./chunk-hcbrgyfz.js";import"./chunk-7d9ek8rc.js";import"./chunk-72p2tdpe.js";import"./chunk-sjfc9my3.js";export{wc as buildAndPushServerlessImage};
|
package/dist/chunk-bazah9w0.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ie}from"./chunk-h6kptkce.js";import"./chunk-7d9ek8rc.js";import"./chunk-72p2tdpe.js";import"./chunk-sjfc9my3.js";export{ie as RDSClient};
|
package/dist/chunk-dmv3vryr.js
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import{un,fr}from"./chunk-72p2tdpe.js";import{Wr,d}from"./chunk-x7cnfn7y.js";import{isIP as A}from"node:net";var yo="/etc/rpx/certs",N="/etc/rpx/local-ca",k="rpx-root-ca.crt";function So(e=N){return`${e.replace(/\/+$/,"")}/${k}`}function Io(e){if(e.toLowerCase().endsWith(".local"))return!1;return e.split(".").length===2}function bo(e,t={}){let r=new Set;for(let o of Object.values(e)){if(!o?.domain)continue;if(d(o)==="bucket")continue;r.add(o.domain)}let n=new Set;for(let o of Object.values(e)){if(!o?.domain||d(o)==="bucket")continue;for(let u of o.aliases??[]){let i=String(u).trim().toLowerCase();if(i&&i!==o.domain)n.add(i)}}if(t.autoWww!==!1)for(let o of[...r]){if(!Io(o))continue;r.add(`www.${o}`)}for(let o of n)r.add(o);return[...r]}var B=["1.1.1.1","8.8.8.8"],I="/var/www/acme-challenge";function W(e){if(typeof e==="string")return{to:e};let t={to:e.to};if(e.status!=null)t.status=e.status;if(e.preservePath!=null)t.preservePath=e.preservePath;return t}function G(e){let t=e.auth;if(!t||t.enabled===!1||!t.password)return;return{username:t.username||"admin",password:t.password,...t.realm?{realm:t.realm}:{}}}function yd(e){if(!e)return;return e.tls??"local-ca"}function Np(e,t){if(e.cloud?.provider!=="ssh")return;let r=e.ssh?.lan;if(!r)return;return{...r.hostname?{hostname:r.hostname}:{},tls:r.tls??"local-ca",...t?{ip:t}:{}}}function Bp(e){if(e.cloud?.provider!=="ssh")return;return e.ssh?.profile}function U(e){let t=e.trim().toLowerCase();if(!t||t.startsWith("*")||t.includes(":")||t.includes("/")||t.includes(" "))return!1;if(A(t)!==0)return!1;return t.endsWith(".local")||!t.includes(".")}function X(e,t,r){let n=[],o=new Set,u=(g,a)=>{let p=g.trim().toLowerCase();if(!p||o.has(p))return;o.add(p),n.push({host:p,source:a})},i=t.hostname?.trim(),c=(i||`${r}.local`).toLowerCase();if(u(c,i?"ssh.lan.hostname":`the ssh provider's default LAN name for project "${r}"`),Object.entries(e).some(([g,a])=>!!a&&fr(g)))u(`dashboard.${c}`,"the management dashboard site");for(let[g,a]of Object.entries(e)){if(!a?.domain)continue;if(d(a)==="bucket")continue;if(!U(a.domain))continue;u(a.domain,`site "${g}"`)}return n}function F(e,t){if(!t?.length)return;return t.find((r)=>{let n=(r.startsWith(".")?r.slice(1):r).toLowerCase();return e===n||e.endsWith(`.${n}`)})}function j(e,t){if(!t?.enabled)return;for(let{host:r,source:n}of e){let o=F(r,t.allowedSuffixes);if(!o)continue;throw Error(`The LAN certificate authority and public on-demand TLS both claim "${r}". LAN source: ${n}. Public source: the on-demand TLS allowed suffix "${o}", which is derived from the site domains. A host is either LAN-only, with a certificate signed by the box's own CA, or public, with one issued by Let's Encrypt, never both. Give the LAN a name no site domain covers (ssh.lan.hostname), or take that domain out of the sites this deploy routes.`)}}function H(e){let t=e.split(".");return t.length>=3&&t[0]==="*"&&t.slice(1).every((r)=>/^[a-z0-9-]+$/i.test(r))}function O(e,t={}){let{wildcardCerts:r,...n}=e;return JSON.stringify({...t,...n},null,2)}function lA(e){if(!e||e==="/")return;let t=`/${e}`.replace(/\/+/g,"/").replace(/\/+$/,"");if(!t.startsWith("/"))t=`/${t}`;return t===""||t==="/"?void 0:t}function Sd(e,t){let n=(t?`${e}${t}`:e).replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,128);return n.length>0?n:"rpx"}function Y(e,t){if(!t||t.length===0)return`localhost:${e}`;return t.map((r)=>`${r.privateIp??r.publicIp}:${e}`)}function M(e,t,r){let n=(t.wwwRoot??"/var/www").replace(/\/+$/,""),o=t.slug??"app",u=t.proxy.certsDir??yo,i=t.proxy.loadBalancer,c=[],f=new Set,g=new Map;for(let[l,s]of Object.entries(e)){if(!s||!s.domain)continue;let y=d(s);if(y==="bucket")continue;let E=c.length,T=[...new Set((s.aliases??[]).map((m)=>String(m).trim().toLowerCase()).filter((m)=>m&&m!==s.domain))],v=()=>{let m=c.slice(E).filter((h)=>h.to===s.domain);for(let h of T){for(let P of m)c.push({...P,to:h,id:Sd(h,P.path)});if(H(h)){if(!g.has(h))g.set(h,{domain:h,dnsEnvFile:`${n}/${o}-${l}/shared/.env`})}else f.add(h)}},S=lA(s.path),_=Sd(s.domain,S),C=G(s);if(y==="redirect"){c.push({to:s.domain,path:S,redirect:W(s.redirect),id:_,...C?{auth:C}:{}}),f.add(s.domain),v();continue}if(y==="proxy"){let m=Wr(s);if(m.length===0)continue;let h=m.length===1?m[0]:m;c.push({to:s.domain,path:S,from:h,id:_,...C?{auth:C}:{},...Array.isArray(h)&&i?{loadBalancer:i}:{}}),f.add(s.domain),v();continue}if(y==="server-app"){if(typeof s.port!=="number")continue;let m=Y(s.port,r);c.push({to:s.domain,path:S,from:m,id:_,...C?{auth:C}:{},...Array.isArray(m)&&i?{loadBalancer:i}:{}})}else c.push({to:s.domain,path:S,static:{dir:`${n}/${o}-${l}/current`,spa:s.spa??!1,pathRewriteStyle:s.pathRewriteStyle??"directory"},cleanUrls:s.pathRewriteStyle!=="flat",...C?{auth:C}:{},id:_});f.add(s.domain),v()}if(t.proxy.autoWww!==!1)for(let l of[...f]){if(!Io(l))continue;let s=`www.${l}`;if(f.has(s))continue;c.push({to:s,redirect:{to:`https://${l}`},id:Sd(s)}),f.add(s)}c.sort((l,s)=>{if(l.to!==s.to)return l.to.localeCompare(s.to);return(s.path?.length??0)-(l.path?.length??0)});let a={proxies:c,productionCerts:{certsDir:u,certsDirServerNames:[...f,...g.keys()]},https:!0,hostsManagement:!1,cleanup:{hosts:!1,certs:!1},...g.size>0?{wildcardCerts:[...g.values()]}:{}};if(t.proxy.onDemandTls&&f.size>0)a.onDemandTls={enabled:!0,allowedSuffixes:[...f],email:t.proxy.onDemandTlsEmail,certsDir:u,staging:t.proxy.onDemandTlsStaging??!1};if(t.proxy.onDemandTls)a.acmeChallengeWebroot=t.proxy.acmeWebroot??I;let p=t.proxy.cdn,w=p?.frontedHosts?.length?p.frontedHosts:[...f];if(p?.secret&&w.length>0)a.originGuard={header:p.secretHeader??"X-Origin-Verify",value:p.secret,hosts:w};if(t.lan)if(yd(t.lan)==="off")a.https=!1;else{let l=X(e,t.lan,o);j(l,a.onDemandTls);let s=t.lan.ip&&A(t.lan.ip)!==0?[t.lan.ip]:[];a.localCa={dir:N,hosts:l.map((y)=>y.host),...s.length>0?{ips:s}:{},installTrust:!0}}return a}function x(e,t){return M({...e,...t.mail?un(t.mail):{}},t)}function nr(e,t,r){return M({...e,...r.mail?un(r.mail):{}},r,t)}function HI(e){return`// Generated by ts-cloud — rpx reverse-proxy gateway.
|
|
2
|
-
// Routes are derived from the \`sites\` model on every \`buddy deploy\`.
|
|
3
|
-
import { startProxies } from '@stacksjs/rpx'
|
|
4
|
-
|
|
5
|
-
const config = ${O(e)} as const
|
|
6
|
-
|
|
7
|
-
// Verbose is the hard default for ts-cloud-installed gateways (RPX_VERBOSE=false
|
|
8
|
-
// opts out) — without it rpx's TLS/routing diagnostics never reach the journal.
|
|
9
|
-
await startProxies({ verbose: process.env.RPX_VERBOSE !== 'false', ...config } as any)
|
|
10
|
-
`}function z(e){return e?.webServer==="rpx"||e?.proxy?.engine==="rpx"}var Co="/etc/rpx",R="/opt/rpx-gateway",xp="/etc/rpx/gateway.ts",vt="/etc/rpx/gateway",Je="rpx-gateway.service",K="/etc/rpx/sites.d";function J(e=K,t=yo){return`// Generated by ts-cloud — rpx gateway assembler.
|
|
11
|
-
// Merges every app's fragment in ${e} so independent deploys compose
|
|
12
|
-
// without clobbering each other. Each deploy writes only its own <slug>.json.
|
|
13
|
-
import { startProxies } from '@stacksjs/rpx'
|
|
14
|
-
import { readdirSync, readFileSync } from 'node:fs'
|
|
15
|
-
|
|
16
|
-
const dir = ${JSON.stringify(e)}
|
|
17
|
-
const proxies = []
|
|
18
|
-
const seen = new Set()
|
|
19
|
-
const owners = new Map()
|
|
20
|
-
const suffixes = new Set()
|
|
21
|
-
const guardHosts = new Set()
|
|
22
|
-
let email
|
|
23
|
-
let certsDir = ${JSON.stringify(t)}
|
|
24
|
-
let acmeChallengeWebroot
|
|
25
|
-
let guard
|
|
26
|
-
let anyProduction = false
|
|
27
|
-
// LAN certificate authority, unioned across fragments. It is gateway-wide, but
|
|
28
|
-
// it is carried per fragment because THIS file is rewritten wholesale by every
|
|
29
|
-
// deploy on the box: a co-tenant's deploy would erase a CA baked in here, while
|
|
30
|
-
// a fragment belongs to the project that configured it.
|
|
31
|
-
let localCa
|
|
32
|
-
const localCaHosts = new Set()
|
|
33
|
-
const localCaIps = new Set()
|
|
34
|
-
// TLS stays on unless every fragment asks for plain HTTP.
|
|
35
|
-
let fragmentCount = 0
|
|
36
|
-
let anyTls = false
|
|
37
|
-
let files = []
|
|
38
|
-
try { files = readdirSync(dir).filter(n => n.endsWith('.json')).sort() } catch {}
|
|
39
|
-
for (const f of files) {
|
|
40
|
-
let frag
|
|
41
|
-
// Fragments are written atomically (temp + rename by ts-cloud), so a parse
|
|
42
|
-
// failure here means a genuinely corrupt fragment, not a mid-write read. Log
|
|
43
|
-
// it LOUD — a silent skip drops that app's whole host from the routing table,
|
|
44
|
-
// which then answers 404 until someone notices. We still continue so one bad
|
|
45
|
-
// fragment can't take every other app down, but the drop is now visible.
|
|
46
|
-
try { frag = JSON.parse(readFileSync(dir + '/' + f, 'utf8')) }
|
|
47
|
-
catch (err) { console.error('[rpx-assembler] SKIPPING malformed fragment ' + f + ' — its host(s) will 404 until fixed: ' + err); continue }
|
|
48
|
-
fragmentCount++
|
|
49
|
-
if (frag.https !== false) anyTls = true
|
|
50
|
-
if (frag.localCa) {
|
|
51
|
-
if (!localCa) localCa = { dir: frag.localCa.dir }
|
|
52
|
-
else if (frag.localCa.dir !== localCa.dir) console.warn('[rpx-assembler] ' + f + ' asks for a local CA in ' + frag.localCa.dir + '; the box already uses ' + localCa.dir + ', so its hosts join that CA instead')
|
|
53
|
-
for (const h of frag.localCa.hosts ?? []) localCaHosts.add(h)
|
|
54
|
-
for (const ip of frag.localCa.ips ?? []) localCaIps.add(ip)
|
|
55
|
-
if (frag.localCa.installTrust) localCa.installTrust = true
|
|
56
|
-
if (localCa.validityDays === undefined) localCa.validityDays = frag.localCa.validityDays
|
|
57
|
-
if (localCa.renewBeforeDays === undefined) localCa.renewBeforeDays = frag.localCa.renewBeforeDays
|
|
58
|
-
}
|
|
59
|
-
for (const p of frag.proxies ?? []) {
|
|
60
|
-
const key = p.id || (p.to + (p.path ?? ''))
|
|
61
|
-
if (seen.has(key)) {
|
|
62
|
-
console.warn('[rpx-assembler] duplicate route ' + key + ' in ' + f + ' ignored; first declared by ' + owners.get(key))
|
|
63
|
-
continue
|
|
64
|
-
}
|
|
65
|
-
seen.add(key)
|
|
66
|
-
owners.set(key, f)
|
|
67
|
-
proxies.push(p)
|
|
68
|
-
}
|
|
69
|
-
for (const s of frag.onDemandTls?.allowedSuffixes ?? []) suffixes.add(s)
|
|
70
|
-
email ??= frag.onDemandTls?.email
|
|
71
|
-
// One gateway, one ACME directory: production wins any disagreement between
|
|
72
|
-
// co-tenants, and a fragment predating the flag counts as production. A
|
|
73
|
-
// staging cert chains to an untrusted root, so defaulting the other way
|
|
74
|
-
// breaks every client of every tenant that wanted a real cert.
|
|
75
|
-
if (frag.onDemandTls && frag.onDemandTls.staging !== true) anyProduction = true
|
|
76
|
-
if (frag.productionCerts?.certsDir) certsDir = frag.productionCerts.certsDir
|
|
77
|
-
acmeChallengeWebroot ??= frag.acmeChallengeWebroot
|
|
78
|
-
if (frag.originGuard) {
|
|
79
|
-
// One gateway means one origin-guard secret (rpx takes a single
|
|
80
|
-
// header/value). A tenant whose secret disagrees with the adopted one must
|
|
81
|
-
// NOT have its hosts guarded: its CDN would send a different value, the
|
|
82
|
-
// gateway would reject every request, and a working host would go dark.
|
|
83
|
-
// Unguarded is weaker but serving, and the mismatch is logged.
|
|
84
|
-
guard ??= { header: frag.originGuard.header, value: frag.originGuard.value }
|
|
85
|
-
if (frag.originGuard.header === guard.header && frag.originGuard.value === guard.value) {
|
|
86
|
-
for (const h of frag.originGuard.hosts ?? []) guardHosts.add(h)
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
console.warn('[rpx-assembler] origin-guard secret in ' + f + ' differs from the one already in force; its hosts stay unguarded rather than rejecting all traffic')
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
if (localCa) {
|
|
94
|
-
localCa.hosts = [...localCaHosts]
|
|
95
|
-
if (localCaIps.size > 0) localCa.ips = [...localCaIps]
|
|
96
|
-
}
|
|
97
|
-
const config = {
|
|
98
|
-
proxies,
|
|
99
|
-
productionCerts: {
|
|
100
|
-
certsDir,
|
|
101
|
-
// A shared host's cert directory also contains mail and retired-site PEMs.
|
|
102
|
-
// Keep those files on disk for their owners, but do not turn them into live
|
|
103
|
-
// OpenSSL SNI contexts when no current route can select them.
|
|
104
|
-
certsDirServerNames: [...new Set(proxies.map(p => p.to).filter(Boolean))],
|
|
105
|
-
},
|
|
106
|
-
https: fragmentCount === 0 ? true : anyTls,
|
|
107
|
-
hostsManagement: false,
|
|
108
|
-
cleanup: { hosts: false, certs: false },
|
|
109
|
-
// Verbose is the hard default for ts-cloud-installed gateways: without it,
|
|
110
|
-
// rpx's TLS/routing diagnostics (tlsx on-demand 'refused issuance',
|
|
111
|
-
// 'issuance failed', 'adopted existing on-disk cert') never reach the systemd
|
|
112
|
-
// journal and a production TLS failure looks like "nothing happens". Silence
|
|
113
|
-
// it by setting RPX_VERBOSE=false on the systemd unit.
|
|
114
|
-
verbose: process.env.RPX_VERBOSE !== 'false',
|
|
115
|
-
...(suffixes.size > 0 ? { onDemandTls: { enabled: true, allowedSuffixes: [...suffixes], email, certsDir, staging: !anyProduction } } : {}),
|
|
116
|
-
...(acmeChallengeWebroot ? { acmeChallengeWebroot } : {}),
|
|
117
|
-
...(guard ? { originGuard: { header: guard.header, value: guard.value, hosts: [...guardHosts] } } : {}),
|
|
118
|
-
...(localCa && localCa.hosts.length > 0 ? { localCa } : {}),
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
await startProxies(config)
|
|
122
|
-
`}function b(e,t,r,n="0644"){return[`__tsc_tmp="$(mktemp "${e}.XXXXXX")"`,`cat > "$__tsc_tmp" <<'${r}'`,t,r,`mv -f "$__tsc_tmp" ${e}`,`chmod ${n} ${e}`]}function q(e){return`'${e.replaceAll("'","'\\''")}'`}function D(e,t,r,n){if(!n.preserveManagementDashboardRoutes)return b(e,t,r,"0600");let o=`
|
|
123
|
-
const { readFileSync, writeFileSync } = require('node:fs')
|
|
124
|
-
const currentPath = process.env.TS_CLOUD_RPX_CURRENT_FRAGMENT
|
|
125
|
-
const candidatePath = process.env.TS_CLOUD_RPX_CANDIDATE_FRAGMENT
|
|
126
|
-
const isDashboard = route => /^(?:dashboard|cloud)\\./i.test(String(route?.to || ''))
|
|
127
|
-
const current = JSON.parse(readFileSync(currentPath, 'utf8'))
|
|
128
|
-
const candidate = JSON.parse(readFileSync(candidatePath, 'utf8'))
|
|
129
|
-
const retained = Array.isArray(current.proxies) ? current.proxies.filter(isDashboard) : []
|
|
130
|
-
const next = Array.isArray(candidate.proxies) ? candidate.proxies.filter(route => !isDashboard(route)) : []
|
|
131
|
-
candidate.proxies = [...next, ...retained]
|
|
132
|
-
writeFileSync(candidatePath, JSON.stringify(candidate, null, 2) + '\\n', { mode: 0o600 })
|
|
133
|
-
`.trim();return[`__tsc_fragment_candidate="$(mktemp "${e}.candidate.XXXXXX")"`,`cat > "$__tsc_fragment_candidate" <<'${r}'`,t,r,'chmod 0600 "$__tsc_fragment_candidate"',`if [ -f ${e} ]; then TS_CLOUD_RPX_CURRENT_FRAGMENT=${e} TS_CLOUD_RPX_CANDIDATE_FRAGMENT="$__tsc_fragment_candidate" ${n.bunBin} -e ${q(o)}; fi`,`mv -f "$__tsc_fragment_candidate" ${e}`,`chmod 0600 ${e}`]}var Q={high:"256M",max:"384M"},Z={high:"512M",max:"768M"};function Id(e){return`rpx-cert-renew-${(e||"app").replace(/[^a-z0-9._-]+/gi,"-")}.service`}function bd(e){let t=new Set;for(let r of e.proxies){let n=r.to;if(!n||n.startsWith("*")||n.includes(":")||!n.includes("."))continue;t.add(n)}return[...t]}function ee(e){if(e.length===0)return[];let t=["# Wildcards: dns-01 (Porkbun), keys read from the site's env file for tlsx alone.","dns_env() {",' [ -r "$1" ] || return 0',` sed -n "s/^$2=//p" "$1" | tail -n 1 | sed -e 's/^"\\(.*\\)"$/\\1/' -e "s/^'\\(.*\\)'$/\\1/"`,"}","wildcard() {",' apex="$1"',' envfile="$2"',' name="*.$apex"',' key=$(dns_env "$envfile" PORKBUN_API_KEY)',' secret=$(dns_env "$envfile" PORKBUN_SECRET_KEY)',' if [ -z "$key" ] || [ -z "$secret" ]; then',' echo "wildcard $name skipped: no PORKBUN_API_KEY / PORKBUN_SECRET_KEY in $envfile (non-fatal)"'," return 0"," fi",' if [ ! -s "$CERTS/_wildcard.$apex.crt" ]; then',' PORKBUN_API_KEY="$key" PORKBUN_SECRET_KEY="$secret" $TLSX acme:issue -d "$name" --method dns-01 --dns-provider porkbun --dir "$CERTS" --prod --email "$EMAIL" || echo "issue $name failed (non-fatal)"'," else",' PORKBUN_API_KEY="$key" PORKBUN_SECRET_KEY="$secret" $TLSX acme:renew --domains "$name" --method dns-01 --dir "$CERTS" --days 30 --prod --email "$EMAIL" || echo "renew $name failed (non-fatal)"'," fi","}"];for(let r of e){let n=r.domain.replace(/^\*\./,"");t.push(`wildcard '${n}' '${r.dnsEnvFile.replace(/'/g,"")}'`)}return t}function L(e){let{config:t,proxy:r}=e,n=t.acmeChallengeWebroot,o=bd(t);if(!r.onDemandTls||!n||o.length===0)return[];let u=e.bunBin??"/usr/local/bin/bun",i=r.tlsxVersion??"latest",c=t.productionCerts.certsDir,f=r.onDemandTlsEmail??`webmaster@${o[0]}`,g=`${u} ${R}/node_modules/@stacksjs/tlsx/dist/bin/cli.js`,a=o.join(","),p=o.join(" "),w=(e.slug||"app").replace(/[^a-z0-9._-]+/gi,"-"),l=`${Co}/renew-certs-${w}.sh`,s=Id(w),y=`rpx-cert-renew-${w}.timer`,E=t.wildcardCerts??[],T=E.length>0?"tlsx http-01 + dns-01 wildcard":"tlsx http-01",v=["#!/bin/sh",`# Generated by ts-cloud — issue/renew rpx gateway TLS certs via ${T}.`,"# The running gateway serves the challenge from $WEBROOT on :80, so this needs","# no downtime and no DNS credentials. Reloads the gateway only if a cert changed.","set -u",`CERTS='${c}'`,`WEBROOT='${n}'`,`EMAIL='${f}'`,`TLSX="${g}"`,`BUN='${u}'`,`DOMAINS='${a}'`,"DNS_ATTEMPTS='24'","DNS_DELAY_SECONDS='5'",`DNS_RESOLVERS='${B.join(" ")}'`,"dns_resolves() {",' d="$1"'," for ns in $DNS_RESOLVERS; do",` if $BUN --eval "const{Resolver}=require('node:dns');const r=new Resolver();r.setServers([process.argv[1]]);r.resolve4(process.argv[2],e=>process.exit(e?1:0))" "$ns" "$d" >/dev/null 2>&1; then`," return 0"," fi"," done",' getent ahosts "$d" >/dev/null 2>&1',"}","wait_for_dns() {",' d="$1"'," attempt=1",' while ! dns_resolves "$d"; do',' if [ "$attempt" -ge "$DNS_ATTEMPTS" ]; then',' echo "DNS for $d did not become resolvable after $DNS_ATTEMPTS attempts" >&2'," return 1"," fi",' echo "Waiting for public DNS before ACME: $d (attempt $attempt/$DNS_ATTEMPTS)"',' sleep "$DNS_DELAY_SECONDS"'," attempt=$((attempt + 1))"," done","}",'before=$(cat "$CERTS"/*.crt 2>/dev/null | sha256sum)',`for d in ${p}; do`,' if [ ! -s "$CERTS/$d.crt" ]; then',' if wait_for_dns "$d"; then',' $TLSX acme:issue -d "$d" --method http-01 --webroot "$WEBROOT" --dir "$CERTS" --prod --email "$EMAIL" || echo "issue $d failed (non-fatal)"'," else",' echo "issue $d skipped until DNS resolves (non-fatal)"'," fi"," # rpx reloads its SNI set when a PEM appears. Complete that reload"," # before the next hostname starts http-01, or :80 can disappear in"," # the middle of the following challenge on a multi-domain deploy.",` [ -s "$CERTS/$d.crt" ] && systemctl restart ${Je}`," fi","done",'$TLSX acme:renew --domains "$DOMAINS" --method http-01 --webroot "$WEBROOT" --dir "$CERTS" --days 30 --prod --email "$EMAIL" || echo "renew: some domains failed (non-fatal)"',...ee(E),'rm -f "$CERTS"/*.chain.crt','after=$(cat "$CERTS"/*.crt 2>/dev/null | sha256sum)',`[ "$before" = "$after" ] || systemctl restart ${Je}`].join(`
|
|
134
|
-
`),S=["[Unit]",`Description=Issue/renew rpx gateway TLS certs for ${w} (${T})`,`After=network-online.target ${Je}`,"Wants=network-online.target","","[Service]","Type=oneshot",`ExecStart=${l}`].join(`
|
|
135
|
-
`),_=["[Unit]",`Description=Daily rpx gateway TLS cert issuance/renewal for ${w}`,"","[Timer]","OnCalendar=*-*-* 03:30:00","RandomizedDelaySec=1h","Persistent=true","","[Install]","WantedBy=timers.target"].join(`
|
|
136
|
-
`);return[`mkdir -p ${n}`,...e.tenant?[]:[`(cd ${R} && ${u} add @stacksjs/tlsx@${i}) || true`],...b(l,v,"TS_CLOUD_RENEW_EOF"),`chmod +x ${l}`,...b(`/etc/systemd/system/${s}`,S,"TS_CLOUD_RENEW_SVC_EOF"),...b(`/etc/systemd/system/${y}`,_,"TS_CLOUD_RENEW_TIMER_EOF"),"systemctl daemon-reload",`systemctl enable --now ${y} || true`,`${l} || true`]}function V(e){let{config:t,proxy:r}=e,n=e.bunBin??"/usr/local/bin/bun",o=r.version??"latest",u=t.productionCerts.certsDir,i=(e.slug||"app").replace(/[^a-z0-9._-]+/gi,"-"),c=O(t,{slug:i}),f=J(K,u);if(e.tenant)return["set -euo pipefail",`if [ ! -x ${vt} ] || [ ! -d ${R}/node_modules/@stacksjs/rpx ]; then`,` echo "ts-cloud: no rpx gateway on this box. This project attaches to another project's compute, so it does not provision one - deploy the owning project first." >&2`," exit 1","fi",`mkdir -p ${K} ${u}`,`__tsc_rpx_before="$(sha256sum ${K}/${i}.json 2>/dev/null | cut -d' ' -f1 || true)"`,...D(`${K}/${i}.json`,c,"TS_CLOUD_RPX_FRAGMENT_EOF",{bunBin:n,preserveManagementDashboardRoutes:e.preserveManagementDashboardRoutes}),`__tsc_rpx_after="$(sha256sum ${K}/${i}.json 2>/dev/null | cut -d' ' -f1 || true)"`,`if [ "$__tsc_rpx_before" != "$__tsc_rpx_after" ] || ! systemctl is-active --quiet ${Je}; then`,` systemctl restart ${Je}`,"else",` echo "[ts-cloud] rpx routes for ${i} unchanged - leaving the shared gateway alone"`,"fi",...L(e)];let a=[`Environment=RPX_UPSTREAM_TIMEOUT=${r.upstreamTimeout??60}`];if(typeof r.maxUpstreamConns==="number")a.push(`Environment=RPX_MAX_UPSTREAM_CONNS=${r.maxUpstreamConns}`);let p=e.profile==="raspberry-pi"?Q:Z,w=r.memoryHigh??p.high,l=r.memoryMax??p.max;return["set -euo pipefail",`mkdir -p ${Co} ${K} ${u} ${R}`,`rm -rf ${R}.next ${R}.prev`,`mkdir -p ${R}.next`,`(cd ${R}.next && ${n} add @stacksjs/rpx@${o})`,`mv ${R} ${R}.prev`,`mv ${R}.next ${R}`,`rm -rf ${R}.prev`,`ln -sfn ${R}/node_modules ${Co}/node_modules`,...D(`${K}/${i}.json`,c,"TS_CLOUD_RPX_FRAGMENT_EOF",{bunBin:n,preserveManagementDashboardRoutes:e.preserveManagementDashboardRoutes}),...b(xp,f,"TS_CLOUD_RPX_EOF"),`${n} build --production --compile --outfile ${vt}.next ${xp}`,`chmod 0755 ${vt}.next`,`mv -f ${vt}.next ${vt}`,...b(`/etc/systemd/system/${Je}`,["[Unit]","Description=rpx reverse-proxy gateway (managed by ts-cloud)","After=network.target network-online.target","Wants=network-online.target","","[Service]","Type=simple",`ExecStart=${vt}`,`WorkingDirectory=${R}`,"Environment=BUN_INSTALL=/root/.bun","Environment=APP_ENV=production","Environment=NODE_ENV=production",...a,"MemoryAccounting=true",`MemoryHigh=${w}`,`MemoryMax=${l}`,"CPUWeight=500","IOWeight=500","OOMPolicy=stop","Restart=always","RestartSec=5","StartLimitIntervalSec=120","StartLimitBurst=5",`ExecStartPre=/bin/sh -c 'for p in 80 443; do fuser -k -n tcp "$p" 2>/dev/null || true; done; sleep 1'`,"LimitNOFILE=1048576","AmbientCapabilities=CAP_NET_BIND_SERVICE","","[Install]","WantedBy=multi-user.target"].join(`
|
|
137
|
-
`),"TS_CLOUD_RPX_UNIT_EOF"),"systemctl daemon-reload","systemctl disable --now bun-gateway.service 2>/dev/null || true","systemctl disable --now bun-gateway-renew.timer bun-gateway-renew.service 2>/dev/null || true","rm -f /etc/systemd/system/bun-gateway-renew.timer /etc/systemd/system/bun-gateway-renew.service","systemctl disable --now ts-cloud-nginx.service 2>/dev/null || true",`for timer in /etc/systemd/system/rpx-cert-renew-*.timer; do [ -e "$timer" ] || continue; unit="$(basename "$timer")"; tenant="\${unit#rpx-cert-renew-}"; tenant="\${tenant%.timer}"; [ -f "${K}/$tenant.json" ] && continue; systemctl disable --now "$unit" 2>/dev/null || true; rm -f "$timer" "/etc/systemd/system/rpx-cert-renew-$tenant.service" "${Co}/renew-certs-$tenant.sh"; done`,`systemctl enable ${Je}`,`systemctl restart ${Je}`,...L(e)]}function xe(e){let t=(e.slug||"app").replace(/[^a-z0-9._-]+/gi,"-"),r=O(e.config,{slug:t});return["set -euo pipefail",`mkdir -p ${K}`,...D(`${K}/${t}.json`,r,"TS_CLOUD_RPX_FRAGMENT_EOF",{bunBin:"/usr/local/bin/bun",preserveManagementDashboardRoutes:e.preserveManagementDashboardRoutes}),`systemctl restart ${Je}`]}
|
|
138
|
-
export{yo,So,Io,bo,yd,Np,Bp,lA,Sd,x,nr,HI,z,Co,R,xp,vt,Je,K,Id,bd,V,xe};
|
package/dist/chunk-qs7814ya.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Wn,Kh}from"./chunk-zy3kr4s2.js";import"./chunk-tpvmpmxj.js";import"./chunk-1psh3mhm.js";import"./chunk-7d9ek8rc.js";import"./chunk-72p2tdpe.js";import"./chunk-sjfc9my3.js";export{Wn as EmailClient,Kh as email};
|
package/dist/chunk-sd5a61c6.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Xe,Op,_p,xi,n,g,uA}from"./chunk-7d9ek8rc.js";import"./chunk-72p2tdpe.js";import"./chunk-sjfc9my3.js";export{n as AWSClient,g as buildQueryParams,_p as canonicalUriFor,xi as coerceXmlValues,uA as detectCredentialSource,Xe as resolveS3Endpoint,Op as signingNameFor};
|
package/dist/chunk-t1wq0ckc.js
DELETED
package/dist/chunk-zft558kj.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Os,_s,Ls,$s,vc,Tc}from"./chunk-9f18pebj.js";import"./chunk-1087xz1v.js";import"./chunk-zwayp7fz.js";import"./chunk-tpvmpmxj.js";import"./chunk-by7hejhg.js";import"./chunk-1psh3mhm.js";import"./chunk-7d9ek8rc.js";import"./chunk-72p2tdpe.js";import"./chunk-sjfc9my3.js";export{vc as deleteStaticSite,_s as deployStaticSite,Tc as deployStaticSiteFull,Os as generateStaticSiteTemplate,$s as invalidateCache,Ls as uploadStaticFiles};
|