@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.
Files changed (83) hide show
  1. package/dist/aws/index.js +2 -14
  2. package/dist/bin/cli.js +784 -785
  3. package/dist/bin/dashboard-server.js +291 -291
  4. package/dist/{chunk-dmzez5f8.js → chunk-33sy72r8.js} +52 -3
  5. package/dist/{chunk-5cz14833.js → chunk-ef2dwfrg.js} +3 -3
  6. package/dist/{chunk-gtz4jar2.js → chunk-eg8ck25v.js} +859 -151
  7. package/dist/{chunk-6hymgy61.js → chunk-gttvakpv.js} +1 -85
  8. package/dist/{chunk-adgz2c49.js → chunk-s9c2x5jv.js} +2 -2
  9. package/dist/deploy/dashboard-bundle-encoding.test.d.ts +1 -0
  10. package/dist/deploy/dashboard-payload.d.ts +20 -0
  11. package/dist/deploy/dashboard-payload.test.d.ts +1 -0
  12. package/dist/deploy/dashboard-topology.d.ts +85 -0
  13. package/dist/deploy/dashboard-topology.test.d.ts +1 -0
  14. package/dist/deploy/egress-collection.d.ts +60 -0
  15. package/dist/deploy/index.d.ts +2 -0
  16. package/dist/deploy/index.js +16 -4
  17. package/dist/dns/index.d.ts +0 -2
  18. package/dist/dns/index.js +2 -14
  19. package/dist/drivers/index.js +1 -1
  20. package/dist/index.d.ts +1 -2
  21. package/dist/index.js +5 -17
  22. package/dist/ui/404.html +1 -0
  23. package/dist/ui/access-denied.html +2 -2
  24. package/dist/ui/account/automation.html +4 -4
  25. package/dist/ui/account/security.html +2 -2
  26. package/dist/ui/applications/compose.html +3 -3
  27. package/dist/ui/applications/new.html +2 -2
  28. package/dist/ui/data/backups.html +22 -9
  29. package/dist/ui/data/services.html +22 -9
  30. package/dist/ui/data/volumes.html +22 -9
  31. package/dist/ui/index.html +22 -9
  32. package/dist/ui/infrastructure/topology.html +2223 -0
  33. package/dist/ui/integrations.html +2 -2
  34. package/dist/ui/operations/alerts.html +22 -9
  35. package/dist/ui/operations/configuration.html +4 -4
  36. package/dist/ui/operations/jobs.html +22 -9
  37. package/dist/ui/operations/maintenance.html +4 -4
  38. package/dist/ui/operations/observability.html +21 -8
  39. package/dist/ui/operations/previews.html +4 -4
  40. package/dist/ui/operations/queue.html +4 -4
  41. package/dist/ui/operations/regions.html +3 -3
  42. package/dist/ui/operations/releases.html +4 -4
  43. package/dist/ui/operations/workloads.html +22 -9
  44. package/dist/ui/security.html +2 -2
  45. package/dist/ui/server/actions.html +4 -4
  46. package/dist/ui/server/activity.html +2 -2
  47. package/dist/ui/server/capacity.html +4 -4
  48. package/dist/ui/server/database.html +4 -4
  49. package/dist/ui/server/deployments.html +4 -4
  50. package/dist/ui/server/diagnostics.html +2 -2
  51. package/dist/ui/server/firewall.html +3 -3
  52. package/dist/ui/server/fleet.html +22 -9
  53. package/dist/ui/server/logs.html +22 -9
  54. package/dist/ui/server/metrics.html +130 -14
  55. package/dist/ui/server/security.html +2 -2
  56. package/dist/ui/server/services.html +2 -2
  57. package/dist/ui/server/sites.html +21 -8
  58. package/dist/ui/server/ssh-keys.html +4 -4
  59. package/dist/ui/server/team.html +4 -4
  60. package/dist/ui/server/terminal.html +1 -1
  61. package/dist/ui/serverless/alarms.html +4 -4
  62. package/dist/ui/serverless/assets.html +2 -2
  63. package/dist/ui/serverless/cost.html +1 -1
  64. package/dist/ui/serverless/data.html +4 -4
  65. package/dist/ui/serverless/deployments.html +2 -2
  66. package/dist/ui/serverless/firewall.html +2 -2
  67. package/dist/ui/serverless/functions.html +4 -4
  68. package/dist/ui/serverless/logs.html +22 -9
  69. package/dist/ui/serverless/metrics.html +2 -2
  70. package/dist/ui/serverless/queues.html +4 -4
  71. package/dist/ui/serverless/secrets.html +4 -4
  72. package/dist/ui/serverless/traces.html +4 -4
  73. package/dist/ui/serverless.html +4 -4
  74. package/dist/ui-src/functions/requestJson.ts +41 -0
  75. package/dist/ui-src/functions/useOpConfirm.ts +132 -0
  76. package/dist/ui-src/functions/usePolling.ts +98 -0
  77. package/dist/ui-src/functions/useTerminal.ts +79 -0
  78. package/dist/ui-src/pages/infrastructure/topology.stx +517 -0
  79. package/dist/ui-src/pages/partials/nav.stx +2 -0
  80. package/dist/ui-src/pages/server/metrics.stx +140 -6
  81. package/dist/ui-src/src/topology.ts +485 -0
  82. package/package.json +3 -3
  83. 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":{' + servicesJson + "}}",
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-6hymgy61.js";
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-adgz2c49.js");
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-adgz2c49.js");
838
+ const { invalidateCache } = await import("./chunk-s9c2x5jv.js");
839
839
  await invalidateCache(infraResult.distributionId);
840
840
  }
841
841
  onProgress?.("complete", "Deployment complete!");