@stacksjs/ts-cloud 0.7.35 → 0.7.37

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 (35) hide show
  1. package/dist/bin/cli.js +317 -317
  2. package/dist/{chunk-k9se7m8j.js → chunk-3c46eypc.js} +23 -7
  3. package/dist/{chunk-94myv1cx.js → chunk-ndwv4y6c.js} +1 -1
  4. package/dist/deploy/index.js +2 -2
  5. package/dist/drivers/hetzner/firewall-rules.d.ts +2 -0
  6. package/dist/drivers/index.d.ts +1 -1
  7. package/dist/drivers/index.js +3 -1
  8. package/dist/drivers/shared/deploy-script.d.ts +7 -0
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.js +4 -2
  11. package/dist/ui/index.html +3 -3
  12. package/dist/ui/server/actions.html +3 -3
  13. package/dist/ui/server/backups.html +3 -3
  14. package/dist/ui/server/database.html +3 -3
  15. package/dist/ui/server/deployments.html +3 -3
  16. package/dist/ui/server/firewall.html +3 -3
  17. package/dist/ui/server/logs.html +3 -3
  18. package/dist/ui/server/services.html +3 -3
  19. package/dist/ui/server/sites.html +3 -3
  20. package/dist/ui/server/ssh-keys.html +3 -3
  21. package/dist/ui/server/team.html +3 -3
  22. package/dist/ui/server/terminal.html +3 -3
  23. package/dist/ui/server/workers.html +3 -3
  24. package/dist/ui/serverless/alarms.html +3 -3
  25. package/dist/ui/serverless/assets.html +3 -3
  26. package/dist/ui/serverless/data.html +3 -3
  27. package/dist/ui/serverless/deployments.html +3 -3
  28. package/dist/ui/serverless/functions.html +3 -3
  29. package/dist/ui/serverless/logs.html +3 -3
  30. package/dist/ui/serverless/queues.html +3 -3
  31. package/dist/ui/serverless/scheduler.html +3 -3
  32. package/dist/ui/serverless/secrets.html +3 -3
  33. package/dist/ui/serverless/traces.html +3 -3
  34. package/dist/ui/serverless.html +3 -3
  35. package/package.json +3 -3
@@ -2320,7 +2320,7 @@ function buildFleetServicesBoxProvision(config) {
2320
2320
 
2321
2321
  // src/drivers/hetzner/firewall-rules.ts
2322
2322
  function buildHetznerFirewallRules(config) {
2323
- const openPorts = new Set([80, 443, ...config.sitePorts]);
2323
+ const openPorts = new Set([80, 443, ...config.sitePorts, ...config.allowedPorts ?? []]);
2324
2324
  if (config.allowSsh) {
2325
2325
  openPorts.add(22);
2326
2326
  }
@@ -2460,7 +2460,8 @@ class HetznerDriver {
2460
2460
  const firewallName = `${slug}-${environment}-app-fw`;
2461
2461
  const { firewall } = await this.ensureFirewall(firewallName, labels, buildHetznerFirewallRules({
2462
2462
  allowSsh: compute.allowSsh !== false,
2463
- sitePorts
2463
+ sitePorts,
2464
+ allowedPorts: compute.firewall?.allowedPorts
2464
2465
  }));
2465
2466
  const sshKeyId = await this.ensureSshKey(slug, environment, labels);
2466
2467
  const existing = await readDriverState(stackName);
@@ -2563,7 +2564,7 @@ class HetznerDriver {
2563
2564
  const netName = `${slug}-${environment}-net`;
2564
2565
  const networks = await this.client.listNetworks().catch(() => []);
2565
2566
  const network = networks.find((n) => n.name === netName) ?? await this.client.createNetwork({ name: netName, labels: tsCloudLabels(slug, environment, "app") });
2566
- const { firewall: appFw } = await this.ensureFirewall(`${slug}-${environment}-app-fw`, tsCloudLabels(slug, environment, "app"), buildHetznerFirewallRules({ allowSsh: true, sitePorts: [] }));
2567
+ const { firewall: appFw } = await this.ensureFirewall(`${slug}-${environment}-app-fw`, tsCloudLabels(slug, environment, "app"), buildHetznerFirewallRules({ allowSsh: true, sitePorts: [], allowedPorts: compute.firewall?.allowedPorts }));
2567
2568
  const { firewall: svcFw } = await this.ensureFirewall(`${slug}-${environment}-services-fw`, tsCloudLabels(slug, environment, "services"), [
2568
2569
  { direction: "in", protocol: "tcp", port: "22", source_ips: ["0.0.0.0/0", "::/0"] },
2569
2570
  { direction: "in", protocol: "tcp", port: "3306", source_ips: [network.ip_range] },
@@ -2726,7 +2727,7 @@ class HetznerDriver {
2726
2727
  description: `ts-cloud port ${port} (private, LB-only)`
2727
2728
  }))
2728
2729
  ]);
2729
- const { firewall: lbFw } = await this.ensureFirewall(`${slug}-${environment}-lb-fw`, tsCloudLabels(slug, environment, "lb"), buildHetznerFirewallRules({ allowSsh: true, sitePorts: [] }));
2730
+ const { firewall: lbFw } = await this.ensureFirewall(`${slug}-${environment}-lb-fw`, tsCloudLabels(slug, environment, "lb"), buildHetznerFirewallRules({ allowSsh: true, sitePorts: [], allowedPorts: compute.firewall?.allowedPorts }));
2730
2731
  const all = await this.client.listServers().catch(() => []);
2731
2732
  const newServerIds = [];
2732
2733
  let servicesServerId;
@@ -3948,7 +3949,21 @@ function buildAwsArtifactFetch(bucket, key, region, destPath) {
3948
3949
  }
3949
3950
  function buildLocalArtifactFetch(localPath, destPath) {
3950
3951
  return [
3951
- `cp "${localPath}" ${destPath}`
3952
+ `mv "${localPath}" ${destPath}`
3953
+ ];
3954
+ }
3955
+ function buildHostCleanupScript() {
3956
+ return [
3957
+ 'echo "[ts-cloud] host cleanup (disk before): $(df -h / | tail -1)"',
3958
+ "find /var/ts-cloud/staging -xdev -maxdepth 1 -type f -mmin +60 -delete 2>/dev/null || true",
3959
+ 'find /tmp -xdev -maxdepth 1 -type f -name "*-release.tar.gz" -mmin +60 -delete 2>/dev/null || true',
3960
+ "find /root/.bun/install/cache -xdev -type f -mtime +7 -delete 2>/dev/null || true",
3961
+ "find /root/.bun/install/cache -xdev -depth -type d -empty -delete 2>/dev/null || true",
3962
+ "journalctl --vacuum-time=14d --vacuum-size=512M >/dev/null 2>&1 || true",
3963
+ 'if command -v docker >/dev/null 2>&1; then docker image prune --all --force --filter "until=168h" >/dev/null 2>&1 || true; fi',
3964
+ 'if command -v podman >/dev/null 2>&1; then podman image prune --all --force --filter "until=168h" >/dev/null 2>&1 || true; fi',
3965
+ "if command -v apt-get >/dev/null 2>&1; then apt-get clean >/dev/null 2>&1 || true; fi",
3966
+ 'echo "[ts-cloud] host cleanup (disk after): $(df -h / | tail -1)"'
3952
3967
  ];
3953
3968
  }
3954
3969
  // src/drivers/shared/compute-deploy.ts
@@ -4842,7 +4857,8 @@ async function deploySiteRelease(driver, options, logger = noopLogger2) {
4842
4857
  ...baseScript,
4843
4858
  ...staticVhost,
4844
4859
  ...staticSsl,
4845
- ...servicesScript
4860
+ ...servicesScript,
4861
+ ...buildHostCleanupScript()
4846
4862
  ];
4847
4863
  logger.step(`Deploying to ${targets.length} target(s)...`);
4848
4864
  const result = await driver.runRemoteDeploy({
@@ -5154,4 +5170,4 @@ function buildCloudFrontOriginConfig(options) {
5154
5170
  CustomErrorResponses: { Quantity: 0 }
5155
5171
  };
5156
5172
  }
5157
- export { siteInstallBase, isPhpSite, resolveSiteDeployTarget, resolveSiteKind, validateDeploymentConfig, PANTRY_PROJECT_DIR, pgAdminCommand, DEFAULT_RPX_CERTS_DIR, normalizeRoutePath, deriveRouteId, buildRpxConfig, buildRpxLbConfig, renderRpxLauncher, RPX_DIR, RPX_LAUNCHER_PATH, RPX_SERVICE_NAME, buildRpxProvisionScript, buildRpxFragmentRefreshScript, BACKUP_RUNNER_PATH, buildBackupRestoreScript, buildUbuntuBootstrapScript, AwsDriver, resolveHetznerLocation, HetznerClient, resolveHetznerApiToken2 as resolveHetznerApiToken, normalizeSshPublicKey, wrapCloudInitUserData, HetznerDriver, LocalBoxDriver, isBoxMode, createCloudDriver, CloudDriverFactory, cloudDrivers, ensureSshKey, ensureFirewall, ensureServer, serverPublicIpv4, buildSshArgs, sshExec, sshExecOrThrow, scpUpload, waitForSsh, waitForCloudInit, UBUNTU_2404_AMI_PARAM, buildBoxUserData, HetznerBoxProvisioner, AwsBoxProvisioner, createBoxProvisioner, releasePaths, buildRollbackScript, resolveExecStart, buildSiteDeployScript, buildStaticSiteDeployScript, releaseTarballTmpPath, buildAwsArtifactFetch, buildLocalArtifactFetch, MANAGEMENT_DASHBOARD_SITE, DASHBOARD_CREDENTIALS_FILE, resolveDashboardAuth, resolveUiSource, ensureManagementDashboard, buildManagementDashboardArtifact, resolveSiteFramework, deploySiteRelease, deployAllComputeSites, reloadRpxGateway, MANAGED_CACHE_POLICY_OPTIMIZED, MANAGED_CACHE_POLICY_DISABLED, MANAGED_ORIGIN_REQUEST_POLICY_ALL_VIEWER, buildCloudFrontOriginConfig };
5173
+ export { siteInstallBase, isPhpSite, resolveSiteDeployTarget, resolveSiteKind, validateDeploymentConfig, PANTRY_PROJECT_DIR, pgAdminCommand, DEFAULT_RPX_CERTS_DIR, normalizeRoutePath, deriveRouteId, buildRpxConfig, buildRpxLbConfig, renderRpxLauncher, RPX_DIR, RPX_LAUNCHER_PATH, RPX_SERVICE_NAME, buildRpxProvisionScript, buildRpxFragmentRefreshScript, BACKUP_RUNNER_PATH, buildBackupRestoreScript, buildUbuntuBootstrapScript, AwsDriver, resolveHetznerLocation, HetznerClient, resolveHetznerApiToken2 as resolveHetznerApiToken, normalizeSshPublicKey, wrapCloudInitUserData, HetznerDriver, LocalBoxDriver, isBoxMode, createCloudDriver, CloudDriverFactory, cloudDrivers, ensureSshKey, ensureFirewall, ensureServer, serverPublicIpv4, buildSshArgs, sshExec, sshExecOrThrow, scpUpload, waitForSsh, waitForCloudInit, UBUNTU_2404_AMI_PARAM, buildBoxUserData, HetznerBoxProvisioner, AwsBoxProvisioner, createBoxProvisioner, releasePaths, buildRollbackScript, resolveExecStart, buildSiteDeployScript, buildStaticSiteDeployScript, releaseTarballTmpPath, buildAwsArtifactFetch, buildLocalArtifactFetch, buildHostCleanupScript, MANAGEMENT_DASHBOARD_SITE, DASHBOARD_CREDENTIALS_FILE, resolveDashboardAuth, resolveUiSource, ensureManagementDashboard, buildManagementDashboardArtifact, resolveSiteFramework, deploySiteRelease, deployAllComputeSites, reloadRpxGateway, MANAGED_CACHE_POLICY_OPTIMIZED, MANAGED_CACHE_POLICY_DISABLED, MANAGED_ORIGIN_REQUEST_POLICY_ALL_VIEWER, buildCloudFrontOriginConfig };
@@ -29,7 +29,7 @@ import {
29
29
  resolveSiteKind,
30
30
  resolveUiSource,
31
31
  siteInstallBase
32
- } from "./chunk-k9se7m8j.js";
32
+ } from "./chunk-3c46eypc.js";
33
33
  import {
34
34
  artifactKey,
35
35
  composeServerlessAppTemplate,
@@ -12,7 +12,7 @@ import {
12
12
  sanitizeCloudConfig,
13
13
  setMaintenance,
14
14
  startLocalDashboardServer
15
- } from "../chunk-94myv1cx.js";
15
+ } from "../chunk-ndwv4y6c.js";
16
16
  import {
17
17
  buildAndPushServerlessImage
18
18
  } from "../chunk-tskj9fay.js";
@@ -30,7 +30,7 @@ import {
30
30
  resolveUiSource,
31
31
  siteInstallBase,
32
32
  validateDeploymentConfig
33
- } from "../chunk-k9se7m8j.js";
33
+ } from "../chunk-3c46eypc.js";
34
34
  import"../chunk-stt1z5cx.js";
35
35
  import"../chunk-93hjhs78.js";
36
36
  import {
@@ -1,6 +1,8 @@
1
1
  export interface HetznerFirewallRuleInput {
2
2
  allowSsh?: boolean;
3
3
  sitePorts: number[];
4
+ /** Operator-owned public TCP ports from compute.firewall.allowedPorts. */
5
+ allowedPorts?: number[];
4
6
  }
5
7
  export type HetznerInboundFirewallRule = {
6
8
  direction: 'in';
@@ -10,7 +10,7 @@ export { buildSshArgs, scpUpload, sshExec, sshExecOrThrow, waitForCloudInit, wai
10
10
  export type { RemoteExecOptions, RemoteExecResult, WaitOptions } from './shared/remote-exec';
11
11
  export { AwsBoxProvisioner, buildBoxUserData, createBoxProvisioner, HetznerBoxProvisioner, UBUNTU_2404_AMI_PARAM, } from './shared/box-provision';
12
12
  export type { AwsBoxProvisionerOptions, BoxPort, BoxProviderName, BoxProvisioner, BoxSpec, CreateBoxProvisionerOptions, ProvisionedBox, } from './shared/box-provision';
13
- export { buildAwsArtifactFetch, buildLocalArtifactFetch, buildSiteDeployScript, buildStaticSiteDeployScript, releaseTarballTmpPath, resolveExecStart, } from './shared/deploy-script';
13
+ export { buildAwsArtifactFetch, buildHostCleanupScript, buildLocalArtifactFetch, buildSiteDeployScript, buildStaticSiteDeployScript, releaseTarballTmpPath, resolveExecStart, } from './shared/deploy-script';
14
14
  export { deployAllComputeSites, deploySiteRelease, reloadRpxGateway } from './shared/compute-deploy';
15
15
  export { buildRpxConfig, buildRpxFragmentRefreshScript, buildRpxLbConfig, buildRpxProvisionScript, deriveRouteId, normalizeRoutePath, renderRpxLauncher, DEFAULT_RPX_CERTS_DIR, RPX_DIR, RPX_LAUNCHER_PATH, RPX_SERVICE_NAME, } from './shared/rpx-gateway';
16
16
  export type { BuildRpxConfigOptions, BuildRpxFragmentRefreshOptions, BuildRpxProvisionOptions, RpxGatewayConfig, RpxLbAppBox, RpxRoute, } from './shared/rpx-gateway';
@@ -17,6 +17,7 @@ import {
17
17
  buildAwsArtifactFetch,
18
18
  buildBoxUserData,
19
19
  buildCloudFrontOriginConfig,
20
+ buildHostCleanupScript,
20
21
  buildLocalArtifactFetch,
21
22
  buildRpxConfig,
22
23
  buildRpxFragmentRefreshScript,
@@ -50,7 +51,7 @@ import {
50
51
  waitForCloudInit,
51
52
  waitForSsh,
52
53
  wrapCloudInitUserData
53
- } from "../chunk-k9se7m8j.js";
54
+ } from "../chunk-3c46eypc.js";
54
55
  import"../chunk-stt1z5cx.js";
55
56
  import"../chunk-93hjhs78.js";
56
57
  import"../chunk-qpj3edwz.js";
@@ -91,6 +92,7 @@ export {
91
92
  buildRpxFragmentRefreshScript,
92
93
  buildRpxConfig,
93
94
  buildLocalArtifactFetch,
95
+ buildHostCleanupScript,
94
96
  buildCloudFrontOriginConfig,
95
97
  buildBoxUserData,
96
98
  buildAwsArtifactFetch,
@@ -113,3 +113,10 @@ export declare function buildStaticSiteDeployScript(options: BuildStaticSiteDepl
113
113
  export declare function releaseTarballTmpPath(slug: string | undefined, siteName: string, releaseId: string): string;
114
114
  export declare function buildAwsArtifactFetch(bucket: string, key: string, region: string, destPath: string): string[];
115
115
  export declare function buildLocalArtifactFetch(localPath: string, destPath: string): string[];
116
+ /**
117
+ * Bounded, multi-tenant-safe host maintenance run after a successful deploy.
118
+ * Current and rollback releases are deliberately out of scope: their retention
119
+ * is managed by buildPruneReleases. This only removes abandoned staging/temp
120
+ * archives, aged package caches, unused container images, and old journals.
121
+ */
122
+ export declare function buildHostCleanupScript(): string[];
package/dist/index.d.ts CHANGED
@@ -11,7 +11,7 @@ export type { MigrateEndpoint, MigrateError, MigrateOptions, MigratePlanItem, Mi
11
11
  export * from './ssl';
12
12
  export { deployStaticSite, deployStaticSiteFull, uploadStaticFiles, invalidateCache, deleteStaticSite, generateStaticSiteTemplate, deployStaticSiteWithExternalDns, deployStaticSiteWithExternalDnsFull, generateExternalDnsStaticSiteTemplate, deploySite, resolveSiteDeployTarget, resolveSiteKind, validateDeploymentConfig, buildAndPushServerlessImage, buildFunctionEnv, deployServerlessApp, infraEnvFromOutputs, redeployServerlessApp, rollbackServerlessApp, runRemoteCommand, setMaintenance, buildManagementDashboardArtifact, DASHBOARD_CREDENTIALS_FILE, ensureManagementDashboard, MANAGEMENT_DASHBOARD_SITE, resolveDashboardAuth, resolveUiSource, } from './deploy';
13
13
  export type { EnsureDashboardLogger, ResolvedDashboardAuth, StaticSiteConfig, DeployResult, UploadOptions, ExternalDnsStaticSiteConfig, ExternalDnsDeployResult, DeploySiteConfig, DeploySiteResult, StaticSiteDnsProvider, SiteDeployKind, DeploymentValidationResult, BuildImageOptions, BuiltImage, CodeSource, DeployServerlessOptions, ResolvedContext, } from './deploy';
14
- export { createCloudDriver, CloudDriverFactory, cloudDrivers, AwsDriver, HetznerDriver, HetznerClient, resolveHetznerApiToken, normalizeSshPublicKey, ensureFirewall, ensureServer, ensureSshKey, serverPublicIpv4, sshExec, sshExecOrThrow, scpUpload, waitForSsh, waitForCloudInit, buildSshArgs, generateUbuntuAppCloudInit, wrapCloudInitUserData, buildSiteDeployScript, buildStaticSiteDeployScript, resolveExecStart, deployAllComputeSites, deploySiteRelease, } from './drivers';
14
+ export { createCloudDriver, CloudDriverFactory, cloudDrivers, AwsDriver, HetznerDriver, HetznerClient, resolveHetznerApiToken, normalizeSshPublicKey, ensureFirewall, ensureServer, ensureSshKey, serverPublicIpv4, sshExec, sshExecOrThrow, scpUpload, waitForSsh, waitForCloudInit, buildSshArgs, generateUbuntuAppCloudInit, wrapCloudInitUserData, buildHostCleanupScript, buildSiteDeployScript, buildStaticSiteDeployScript, resolveExecStart, deployAllComputeSites, deploySiteRelease, } from './drivers';
15
15
  export type { CreateCloudDriverOptions } from './drivers/factory';
16
16
  export { dashboardActions, resolveDashboardAction, sanitizeCloudConfig, startLocalDashboardServer, } from './deploy/local-dashboard-server';
17
17
  export type { DashboardAction, LocalDashboardServer, LocalDashboardServerOptions, } from './deploy/local-dashboard-server';
package/dist/index.js CHANGED
@@ -55,7 +55,7 @@ import {
55
55
  sanitizeCloudConfig,
56
56
  setMaintenance,
57
57
  startLocalDashboardServer
58
- } from "./chunk-94myv1cx.js";
58
+ } from "./chunk-ndwv4y6c.js";
59
59
  import {
60
60
  buildAndPushServerlessImage
61
61
  } from "./chunk-tskj9fay.js";
@@ -77,6 +77,7 @@ import {
77
77
  HetznerClient,
78
78
  HetznerDriver,
79
79
  MANAGEMENT_DASHBOARD_SITE,
80
+ buildHostCleanupScript,
80
81
  buildManagementDashboardArtifact,
81
82
  buildSiteDeployScript,
82
83
  buildSshArgs,
@@ -105,7 +106,7 @@ import {
105
106
  waitForCloudInit,
106
107
  waitForSsh,
107
108
  wrapCloudInitUserData
108
- } from "./chunk-k9se7m8j.js";
109
+ } from "./chunk-3c46eypc.js";
109
110
  import {
110
111
  ABTestManager,
111
112
  AI,
@@ -4964,6 +4965,7 @@ export {
4964
4965
  buildOptimizationManager,
4965
4966
  buildNodeRuntimeLayerZip,
4966
4967
  buildManagementDashboardArtifact,
4968
+ buildHostCleanupScript,
4967
4969
  buildFunctionEnv,
4968
4970
  buildCloudFormationTemplate,
4969
4971
  buildBunRuntimeLayerZip,