@stacksjs/ts-cloud 0.7.104 → 0.7.108
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 +2 -14
- package/dist/bin/cli.js +784 -785
- package/dist/bin/dashboard-server.js +291 -291
- package/dist/{chunk-dmzez5f8.js → chunk-33sy72r8.js} +52 -3
- package/dist/{chunk-5cz14833.js → chunk-ef2dwfrg.js} +3 -3
- package/dist/{chunk-gtz4jar2.js → chunk-eg8ck25v.js} +859 -151
- package/dist/{chunk-6hymgy61.js → chunk-gttvakpv.js} +1 -85
- package/dist/{chunk-adgz2c49.js → chunk-s9c2x5jv.js} +2 -2
- package/dist/deploy/dashboard-bundle-encoding.test.d.ts +1 -0
- package/dist/deploy/dashboard-payload.d.ts +20 -0
- package/dist/deploy/dashboard-payload.test.d.ts +1 -0
- package/dist/deploy/dashboard-topology.d.ts +85 -0
- package/dist/deploy/dashboard-topology.test.d.ts +1 -0
- package/dist/deploy/egress-collection.d.ts +60 -0
- package/dist/deploy/index.d.ts +2 -0
- package/dist/deploy/index.js +16 -4
- package/dist/dns/index.d.ts +0 -2
- package/dist/dns/index.js +2 -14
- package/dist/drivers/index.js +1 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.js +5 -17
- package/dist/ui/404.html +1 -0
- package/dist/ui/access-denied.html +2 -2
- package/dist/ui/account/automation.html +4 -4
- package/dist/ui/account/security.html +2 -2
- package/dist/ui/applications/compose.html +3 -3
- package/dist/ui/applications/new.html +2 -2
- package/dist/ui/data/backups.html +22 -9
- package/dist/ui/data/services.html +22 -9
- package/dist/ui/data/volumes.html +22 -9
- package/dist/ui/index.html +22 -9
- package/dist/ui/infrastructure/topology.html +2223 -0
- package/dist/ui/integrations.html +2 -2
- package/dist/ui/operations/alerts.html +22 -9
- package/dist/ui/operations/configuration.html +4 -4
- package/dist/ui/operations/jobs.html +22 -9
- package/dist/ui/operations/maintenance.html +4 -4
- package/dist/ui/operations/observability.html +21 -8
- package/dist/ui/operations/previews.html +4 -4
- package/dist/ui/operations/queue.html +4 -4
- package/dist/ui/operations/regions.html +3 -3
- package/dist/ui/operations/releases.html +4 -4
- package/dist/ui/operations/workloads.html +22 -9
- package/dist/ui/security.html +2 -2
- package/dist/ui/server/actions.html +4 -4
- package/dist/ui/server/activity.html +2 -2
- package/dist/ui/server/capacity.html +4 -4
- package/dist/ui/server/database.html +4 -4
- package/dist/ui/server/deployments.html +4 -4
- package/dist/ui/server/diagnostics.html +2 -2
- package/dist/ui/server/firewall.html +3 -3
- package/dist/ui/server/fleet.html +22 -9
- package/dist/ui/server/logs.html +22 -9
- package/dist/ui/server/metrics.html +130 -14
- package/dist/ui/server/security.html +2 -2
- package/dist/ui/server/services.html +2 -2
- package/dist/ui/server/sites.html +21 -8
- package/dist/ui/server/ssh-keys.html +4 -4
- package/dist/ui/server/team.html +4 -4
- package/dist/ui/server/terminal.html +1 -1
- package/dist/ui/serverless/alarms.html +4 -4
- package/dist/ui/serverless/assets.html +2 -2
- package/dist/ui/serverless/cost.html +1 -1
- package/dist/ui/serverless/data.html +4 -4
- package/dist/ui/serverless/deployments.html +2 -2
- package/dist/ui/serverless/firewall.html +2 -2
- package/dist/ui/serverless/functions.html +4 -4
- package/dist/ui/serverless/logs.html +22 -9
- package/dist/ui/serverless/metrics.html +2 -2
- package/dist/ui/serverless/queues.html +4 -4
- package/dist/ui/serverless/secrets.html +4 -4
- package/dist/ui/serverless/traces.html +4 -4
- package/dist/ui/serverless.html +4 -4
- package/dist/ui-src/functions/requestJson.ts +41 -0
- package/dist/ui-src/functions/useOpConfirm.ts +132 -0
- package/dist/ui-src/functions/usePolling.ts +98 -0
- package/dist/ui-src/functions/useTerminal.ts +79 -0
- package/dist/ui-src/pages/infrastructure/topology.stx +517 -0
- package/dist/ui-src/pages/partials/nav.stx +2 -0
- package/dist/ui-src/pages/server/metrics.stx +140 -6
- package/dist/ui-src/src/topology.ts +485 -0
- package/package.json +3 -3
- package/dist/dns/mail-records.d.ts +0 -82
|
@@ -752,9 +752,12 @@ function buildAutoUpdatesScript(enabled3 = true) {
|
|
|
752
752
|
// src/drivers/shared/monitoring.ts
|
|
753
753
|
var METRICS_PATH = "/var/lib/ts-cloud/metrics.json";
|
|
754
754
|
var ALERT_STATE_PATH = "/var/lib/ts-cloud/alert-state";
|
|
755
|
+
var BANDWIDTH_STATE_PATH = "/var/lib/ts-cloud/bandwidth-state";
|
|
756
|
+
var BANDWIDTH_ALERT_STATE_PATH = "/var/lib/ts-cloud/bandwidth-alert-state";
|
|
755
757
|
var DEFAULT_CPU_LOAD_PER_CORE = 2;
|
|
756
758
|
var DEFAULT_MEM_PERCENT = 90;
|
|
757
759
|
var DEFAULT_DISK_PERCENT = 90;
|
|
760
|
+
var DEFAULT_BANDWIDTH_PERCENT = 80;
|
|
758
761
|
var SERVICE_PROBES = [
|
|
759
762
|
["nginx", 80],
|
|
760
763
|
["https", 443],
|
|
@@ -769,17 +772,21 @@ var SERVICE_PROBES = [
|
|
|
769
772
|
function resolveMonitoring(monitoring = true) {
|
|
770
773
|
const obj = typeof monitoring === "object" ? monitoring : {};
|
|
771
774
|
const enabled3 = typeof monitoring === "boolean" ? monitoring : monitoring.enabled !== false;
|
|
775
|
+
const bandwidthTb = Number(obj.alerts?.bandwidthTb ?? 0);
|
|
772
776
|
return {
|
|
773
777
|
enabled: enabled3,
|
|
774
778
|
cpuLoadPerCore: obj.alerts?.cpuLoadPerCore ?? DEFAULT_CPU_LOAD_PER_CORE,
|
|
775
779
|
memPercent: obj.alerts?.memPercent ?? DEFAULT_MEM_PERCENT,
|
|
776
|
-
diskPercent: obj.alerts?.diskPercent ?? DEFAULT_DISK_PERCENT
|
|
780
|
+
diskPercent: obj.alerts?.diskPercent ?? DEFAULT_DISK_PERCENT,
|
|
781
|
+
bandwidthTb: Number.isFinite(bandwidthTb) && bandwidthTb > 0 ? bandwidthTb : 0,
|
|
782
|
+
bandwidthPercent: obj.alerts?.bandwidthPercent ?? DEFAULT_BANDWIDTH_PERCENT
|
|
777
783
|
};
|
|
778
784
|
}
|
|
779
785
|
function buildMonitoringScript(monitoring = true) {
|
|
780
|
-
const { enabled: enabled3, cpuLoadPerCore, memPercent, diskPercent } = resolveMonitoring(monitoring);
|
|
786
|
+
const { enabled: enabled3, cpuLoadPerCore, memPercent, diskPercent, bandwidthTb, bandwidthPercent } = resolveMonitoring(monitoring);
|
|
781
787
|
if (!enabled3)
|
|
782
788
|
return [];
|
|
789
|
+
const bandwidthBudgetBytes = Math.round(bandwidthTb * 1000 ** 4);
|
|
783
790
|
const probeLines = SERVICE_PROBES.map(([name, port]) => `SVC_${name.toUpperCase()}=$(probe ${port})`);
|
|
784
791
|
const servicesJson = SERVICE_PROBES.map(([name]) => `"${name}":"$SVC_${name.toUpperCase()}"`).join(",");
|
|
785
792
|
return [
|
|
@@ -798,6 +805,36 @@ EOF`,
|
|
|
798
805
|
`UPTIME_SEC=$(cut -d' ' -f1 /proc/uptime | cut -d. -f1)`,
|
|
799
806
|
`RX_BYTES=$(awk -F'[: ]+' 'NR>2 && $2!="lo"{rx+=$3} END{print rx+0}' /proc/net/dev)`,
|
|
800
807
|
`TX_BYTES=$(awk -F'[: ]+' 'NR>2 && $2!="lo"{tx+=$11} END{print tx+0}' /proc/net/dev)`,
|
|
808
|
+
"NOW_EPOCH=$(date -u +%s); TODAY=$(date -u +%Y-%m-%d); MONTH=$(date -u +%Y-%m)",
|
|
809
|
+
`if [ -r ${BANDWIDTH_STATE_PATH} ]; then . ${BANDWIDTH_STATE_PATH}; fi`,
|
|
810
|
+
"PREV_EPOCH=${PREV_EPOCH:-0}; PREV_RX=${PREV_RX:-0}; PREV_TX=${PREV_TX:-0}",
|
|
811
|
+
"DAY_KEY=${DAY_KEY:-$TODAY}; MONTH_KEY=${MONTH_KEY:-$MONTH}",
|
|
812
|
+
"DAY_RX=${DAY_RX:-0}; DAY_TX=${DAY_TX:-0}; MONTH_RX=${MONTH_RX:-0}; MONTH_TX=${MONTH_TX:-0}",
|
|
813
|
+
"ELAPSED=$(( NOW_EPOCH - PREV_EPOCH ))",
|
|
814
|
+
'if [ "$PREV_EPOCH" -le 0 ] || [ "$ELAPSED" -le 0 ] || [ "$RX_BYTES" -lt "$PREV_RX" ] || [ "$TX_BYTES" -lt "$PREV_TX" ]; then',
|
|
815
|
+
" DELTA_RX=0; DELTA_TX=0; ELAPSED=0",
|
|
816
|
+
"else",
|
|
817
|
+
" DELTA_RX=$(( RX_BYTES - PREV_RX )); DELTA_TX=$(( TX_BYTES - PREV_TX ))",
|
|
818
|
+
"fi",
|
|
819
|
+
'if [ "$DAY_KEY" != "$TODAY" ]; then DAY_KEY=$TODAY; DAY_RX=0; DAY_TX=0; fi',
|
|
820
|
+
'if [ "$MONTH_KEY" != "$MONTH" ]; then MONTH_KEY=$MONTH; MONTH_RX=0; MONTH_TX=0; fi',
|
|
821
|
+
"DAY_RX=$(( DAY_RX + DELTA_RX )); DAY_TX=$(( DAY_TX + DELTA_TX ))",
|
|
822
|
+
"MONTH_RX=$(( MONTH_RX + DELTA_RX )); MONTH_TX=$(( MONTH_TX + DELTA_TX ))",
|
|
823
|
+
'if [ "$ELAPSED" -gt 0 ]; then RX_RATE=$(( DELTA_RX / ELAPSED )); TX_RATE=$(( DELTA_TX / ELAPSED )); else RX_RATE=0; TX_RATE=0; fi',
|
|
824
|
+
`cat > ${BANDWIDTH_STATE_PATH}.tmp <<BWSTATE`,
|
|
825
|
+
"PREV_EPOCH=$NOW_EPOCH",
|
|
826
|
+
"PREV_RX=$RX_BYTES",
|
|
827
|
+
"PREV_TX=$TX_BYTES",
|
|
828
|
+
"RX_RATE=$RX_RATE",
|
|
829
|
+
"TX_RATE=$TX_RATE",
|
|
830
|
+
"DAY_KEY=$DAY_KEY",
|
|
831
|
+
"DAY_RX=$DAY_RX",
|
|
832
|
+
"DAY_TX=$DAY_TX",
|
|
833
|
+
"MONTH_KEY=$MONTH_KEY",
|
|
834
|
+
"MONTH_RX=$MONTH_RX",
|
|
835
|
+
"MONTH_TX=$MONTH_TX",
|
|
836
|
+
"BWSTATE",
|
|
837
|
+
`mv -f ${BANDWIDTH_STATE_PATH}.tmp ${BANDWIDTH_STATE_PATH}`,
|
|
801
838
|
"probe(){ (exec 3<>/dev/tcp/127.0.0.1/$1) 2>/dev/null && echo up || echo down; }",
|
|
802
839
|
...probeLines,
|
|
803
840
|
"LOAD=${LOAD:-0}; CPUS=${CPUS:-1}; MEM_TOTAL=${MEM_TOTAL:-0}; MEM_USED=${MEM_USED:-0}",
|
|
@@ -805,7 +842,7 @@ EOF`,
|
|
|
805
842
|
"UPTIME_SEC=${UPTIME_SEC:-0}; RX_BYTES=${RX_BYTES:-0}; TX_BYTES=${TX_BYTES:-0}",
|
|
806
843
|
"MEM_PCT=$(( MEM_TOTAL > 0 ? MEM_USED * 100 / MEM_TOTAL : 0 ))",
|
|
807
844
|
`cat > ${METRICS_PATH}.tmp <<JSON`,
|
|
808
|
-
'{"load":$LOAD,"cpus":$CPUS,"memTotalMb":$MEM_TOTAL,"memUsedMb":$MEM_USED,"memUsedPct":$MEM_PCT,"swapTotalMb":$SWAP_TOTAL,"swapUsedMb":$SWAP_USED,"diskUsedPct":$DISK_PCT,"uptimeSec":$UPTIME_SEC,"network":{"rxBytes":$RX_BYTES,"txBytes":$TX_BYTES},"services":{
|
|
845
|
+
'{"load":$LOAD,"cpus":$CPUS,"memTotalMb":$MEM_TOTAL,"memUsedMb":$MEM_USED,"memUsedPct":$MEM_PCT,"swapTotalMb":$SWAP_TOTAL,"swapUsedMb":$SWAP_USED,"diskUsedPct":$DISK_PCT,"uptimeSec":$UPTIME_SEC,' + '"network":{"rxBytes":$RX_BYTES,"txBytes":$TX_BYTES,"rxBytesPerSec":$RX_RATE,"txBytesPerSec":$TX_RATE,' + '"dayKey":"$DAY_KEY","rxBytesToday":$DAY_RX,"txBytesToday":$DAY_TX,' + `"monthKey":"$MONTH_KEY","rxBytesMonth":$MONTH_RX,"txBytesMonth":$MONTH_TX,"budgetBytes":${bandwidthBudgetBytes}},"services":{` + servicesJson + "}}",
|
|
809
846
|
"JSON",
|
|
810
847
|
`mv -f ${METRICS_PATH}.tmp ${METRICS_PATH}`,
|
|
811
848
|
'ALERTS=""',
|
|
@@ -820,6 +857,18 @@ EOF`,
|
|
|
820
857
|
' if [ "$PREV" = alert ] && [ -x /usr/local/bin/ts-cloud-notify ]; then /usr/local/bin/ts-cloud-notify "✅ $(hostname): resource usage back to normal" || true; fi',
|
|
821
858
|
` echo ok > ${ALERT_STATE_PATH}`,
|
|
822
859
|
"fi",
|
|
860
|
+
...bandwidthBudgetBytes > 0 ? [
|
|
861
|
+
"BW_TOTAL=$(( MONTH_RX + MONTH_TX ))",
|
|
862
|
+
`BW_PCT=$(( BW_TOTAL * 100 / ${bandwidthBudgetBytes} ))`,
|
|
863
|
+
`BW_PREV=$(cat ${BANDWIDTH_ALERT_STATE_PATH} 2>/dev/null || echo ok)`,
|
|
864
|
+
`if [ "$BW_PCT" -ge ${bandwidthPercent} ]; then`,
|
|
865
|
+
` if [ "$BW_PREV" != alert ] && [ -x /usr/local/bin/ts-cloud-notify ]; then /usr/local/bin/ts-cloud-notify "⚠️ $(hostname): bandwidth at \${BW_PCT}% of the ${bandwidthTb} TB monthly allowance ($MONTH_KEY)" || true; fi`,
|
|
866
|
+
` echo alert > ${BANDWIDTH_ALERT_STATE_PATH}`,
|
|
867
|
+
"else",
|
|
868
|
+
` if [ "$BW_PREV" = alert ] && [ -x /usr/local/bin/ts-cloud-notify ]; then /usr/local/bin/ts-cloud-notify "✅ $(hostname): bandwidth back under the monthly allowance (\${BW_PCT}%)" || true; fi`,
|
|
869
|
+
` echo ok > ${BANDWIDTH_ALERT_STATE_PATH}`,
|
|
870
|
+
"fi"
|
|
871
|
+
] : [],
|
|
823
872
|
"TS_CLOUD_METRICS_EOF",
|
|
824
873
|
"chmod +x /usr/local/bin/ts-cloud-metrics.sh",
|
|
825
874
|
`cat > /etc/systemd/system/ts-cloud-metrics.service <<'TS_CLOUD_METRICS_SVC_EOF'`,
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
Route53Provider,
|
|
8
8
|
UnifiedDnsValidator,
|
|
9
9
|
createDnsProvider
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-gttvakpv.js";
|
|
11
11
|
import {
|
|
12
12
|
CloudFormationClient
|
|
13
13
|
} from "./chunk-4cjrg98a.js";
|
|
@@ -815,7 +815,7 @@ async function deployStaticSiteWithExternalDnsFull(config) {
|
|
|
815
815
|
}
|
|
816
816
|
}
|
|
817
817
|
onProgress?.("upload", "Uploading files to S3...");
|
|
818
|
-
const { uploadStaticFiles } = await import("./chunk-
|
|
818
|
+
const { uploadStaticFiles } = await import("./chunk-s9c2x5jv.js");
|
|
819
819
|
const uploadResult = await uploadStaticFiles({
|
|
820
820
|
sourceDir,
|
|
821
821
|
bucket: infraResult.bucket,
|
|
@@ -835,7 +835,7 @@ async function deployStaticSiteWithExternalDnsFull(config) {
|
|
|
835
835
|
}
|
|
836
836
|
if (infraResult.distributionId && uploadResult.uploaded > 0) {
|
|
837
837
|
onProgress?.("invalidate", "Invalidating CloudFront cache...");
|
|
838
|
-
const { invalidateCache } = await import("./chunk-
|
|
838
|
+
const { invalidateCache } = await import("./chunk-s9c2x5jv.js");
|
|
839
839
|
await invalidateCache(infraResult.distributionId);
|
|
840
840
|
}
|
|
841
841
|
onProgress?.("complete", "Deployment complete!");
|