@stacksjs/ts-cloud 0.7.14 → 0.7.16

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 (37) hide show
  1. package/dist/bin/cli.js +457 -457
  2. package/dist/{chunk-9ra8b9b4.js → chunk-296n8hvt.js} +2 -2
  3. package/dist/{chunk-vsgkcpqw.js → chunk-49nmy775.js} +6 -8
  4. package/dist/{chunk-fy85hcfy.js → chunk-d1370frz.js} +15 -14
  5. package/dist/{chunk-jg4f2ybx.js → chunk-hb06vk29.js} +44 -18
  6. package/dist/{chunk-m03vddvr.js → chunk-qgnyzfmx.js} +1 -1
  7. package/dist/deploy/index.js +6 -4
  8. package/dist/deploy/management-dashboard.d.ts +9 -1
  9. package/dist/deploy/site-target.d.ts +17 -0
  10. package/dist/drivers/index.js +2 -2
  11. package/dist/drivers/shared/releases.d.ts +12 -0
  12. package/dist/drivers/shared/rpx-gateway.d.ts +8 -0
  13. package/dist/index.js +6 -4
  14. package/dist/ui/index.html +3 -3
  15. package/dist/ui/server/actions.html +3 -3
  16. package/dist/ui/server/backups.html +3 -3
  17. package/dist/ui/server/database.html +3 -3
  18. package/dist/ui/server/deployments.html +3 -3
  19. package/dist/ui/server/firewall.html +3 -3
  20. package/dist/ui/server/logs.html +3 -3
  21. package/dist/ui/server/services.html +3 -3
  22. package/dist/ui/server/sites.html +3 -3
  23. package/dist/ui/server/ssh-keys.html +3 -3
  24. package/dist/ui/server/terminal.html +3 -3
  25. package/dist/ui/server/workers.html +3 -3
  26. package/dist/ui/serverless/alarms.html +3 -3
  27. package/dist/ui/serverless/assets.html +3 -3
  28. package/dist/ui/serverless/data.html +3 -3
  29. package/dist/ui/serverless/deployments.html +3 -3
  30. package/dist/ui/serverless/functions.html +3 -3
  31. package/dist/ui/serverless/logs.html +3 -3
  32. package/dist/ui/serverless/queues.html +3 -3
  33. package/dist/ui/serverless/scheduler.html +3 -3
  34. package/dist/ui/serverless/secrets.html +3 -3
  35. package/dist/ui/serverless/traces.html +3 -3
  36. package/dist/ui/serverless.html +3 -3
  37. package/package.json +3 -3
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  buildAndPushServerlessImage
3
- } from "./chunk-m03vddvr.js";
3
+ } from "./chunk-qgnyzfmx.js";
4
4
  import"./chunk-hsk6fe6x.js";
5
- import"./chunk-vsgkcpqw.js";
5
+ import"./chunk-49nmy775.js";
6
6
  import"./chunk-arsh1g5h.js";
7
7
  import"./chunk-v0bahtg2.js";
8
8
  export {
@@ -21948,13 +21948,11 @@ function hasManagementDashboardSite(config) {
21948
21948
  if (!site)
21949
21949
  return false;
21950
21950
  const root = site.root ?? "";
21951
- return name === "dashboard" || root === "ui/dist" || root.endsWith("/ui/dist") || root.endsWith("/dist/ui");
21951
+ return isManagementDashboardSiteName(name) || root === "ui/dist" || root.endsWith("/ui/dist") || root.endsWith("/dist/ui");
21952
21952
  });
21953
21953
  }
21954
21954
  var MANAGEMENT_DASHBOARD_SITE_PREFIX = "dashboard-";
21955
- function dashboardSiteName(domain, primary) {
21956
- if (primary)
21957
- return "dashboard";
21955
+ function managementDashboardSiteName(domain) {
21958
21956
  return MANAGEMENT_DASHBOARD_SITE_PREFIX + domain.replace(/^dashboard\./, "").replace(/\./g, "-");
21959
21957
  }
21960
21958
  function isManagementDashboardSiteName(name) {
@@ -21980,11 +21978,11 @@ function resolveManagementDashboardSites(config, environment, opts) {
21980
21978
  ...build,
21981
21979
  ...auth2
21982
21980
  };
21983
- return [{ name: "dashboard", site }];
21981
+ return [{ name: managementDashboardSiteName(domain), site }];
21984
21982
  }
21985
21983
  const domains = resolveDashboardDomains(config, environment, opts.domain);
21986
- return domains.map((domain, i) => ({
21987
- name: dashboardSiteName(domain, i === 0),
21984
+ return domains.map((domain) => ({
21985
+ name: managementDashboardSiteName(domain),
21988
21986
  site: {
21989
21987
  root: opts.uiRoot,
21990
21988
  deploy: "server",
@@ -46154,4 +46152,4 @@ class ResourceManagementManager {
46154
46152
  }
46155
46153
  var resourceManagementManager = new ResourceManagementManager;
46156
46154
 
46157
- export { detectServiceRegion, signRequest, signRequestAsync, createPresignedUrl, createPresignedUrlAsync, makeAWSRequest, makeAWSRequestOnce, makeAWSRequestAsync, parseXMLResponse, parseJSONResponse, clearSigningKeyCache, getSigningKeyCacheSize, isNodeCryptoAvailable, isWebCryptoAvailable, QueuePresets, RealtimePresets, detectDeploymentTargets, resolveDeploymentMode, deploymentCoexistenceError, resolveCloudProvider, TemplateBuilder, Pseudo, generateResourceName, generateLogicalId, getTimestamp, sanitizeName, resolveProjectStackName, resolveSiteStackName, resolveSiteResourceName, resolveSiteBucketName, resolveStorageBucketName, resolveDeployBucketName, resolveServerlessAppStackName, resolveServerlessArtifactBucketName, resolveServerlessAssetBucketName, DependencyGraph, analyzeStackDiff, formatDiff, Storage, Registry, CDN, DNS, Security, Compute, Network, FileSystem, Email, exports_incoming_call, Phone, Queue, JobLoader, StacksIntegration, exports_send, SMS, AI, Database, Cache, Permissions, ApiGateway, Messaging, Workflow, Monitoring, Auth, Deployment, AssetHasher, Secrets, ParameterStore, Search, Redirects, Communication, Fn2, Arn, AWS_PSEUDO_PARAMETERS, CloudFormationBuilder, buildCloudFormationTemplate, createStaticSitePreset, createNodeJsServerPreset, createNodeJsServerlessPreset, createServerlessNodePreset, createFullStackAppPreset, createApiBackendPreset, createWordPressPreset, createJamstackPreset, createMicroservicesPreset, createRealtimeAppPreset, createDataPipelinePreset, createMLApiPreset, createTraditionalWebAppPreset, createLaravelPreset, createServerlessLaravelPreset, createDashboardSite, resolveDashboardDomain, resolveDashboardDomains, hasManagementDashboardSite, MANAGEMENT_DASHBOARD_SITE_PREFIX, isManagementDashboardSiteName, resolveManagementDashboardSites, resolveManagementDashboardSite, extendPreset, composePresets, createPreset, mergeInfrastructure, withMonitoring, withSecurity, withDatabase, withCache, withCDN, withQueue, fromEnvironment, fromSharedCredentials, fromEC2Metadata, fromECSMetadata, fromWebIdentity, getCredentials, createCredentialProvider, resolveCredentials, resolveRegion, getAccountId, S3Error, createS3Client, CloudError, ConfigurationError, CredentialError, DeploymentError, ValidationError, AWSAPIError, ErrorCodes, getErrorDetails, createError, DebugLogger, validateConfiguration, detectMisconfigurations, validateCredentials, checkIAMPermissions, getRequiredPermissions, suggestIAMPolicy, DEFAULT_SERVICE_LIMITS, checkServiceQuotas, getQuotaUsageSummary, suggestQuotaIncrease, FileCache, TemplateCache, templateCache, hashFile, hashString, hashBuffer, hashDirectory, hashManifest, quickHash, findChangedFiles, HashCache, parallel, batch, parallelMap, parallelWithRetry, sequence, withTimeout, RateLimiter, chunk, processInChunks, diffTemplates, getDiffSummary, requiresReplacement, categorizeChanges, getDeploymentStrategy, getDiffStats, cloud_config_schema_default, validateAgainstSchema, defaultLocalConfig, getLocalConfig, isLocalDevelopment, getLocalEndpoint, getLocalCredentials, getLocalEnvVars, MockCloudFormation, MockS3, MockDynamoDB, createMockAWS, PreviewEnvironmentManager, previewManager, generatePreviewWorkflow, generateCleanupWorkflow, generateCostReportWorkflow, PreviewNotificationService, previewNotifications, formatTable, formatTree, formatProgressBar, formatBytes, formatDuration, formatList, formatKeyValue, ProgressBar, MultiStepProgress, Spinner, TaskList, suggestCommand, formatSuggestion, isLikelyTypo, getContextualHelp, searchCommands, autocomplete, suggestFlags, formatFlagSuggestions, getCommandUsage, validateCommand, REPL, REPLContext, REPLCommandBuilder, CommandHistory, formatHistory, formatHistoryStats, MultiRegionManager, multiRegionManager, CrossRegionReferenceManager, GlobalResourceManager, RegionPairManager, StackDependencyManager, crossRegionReferenceManager, globalResourceManager, regionPairManager, stackDependencyManager, AWS_REGIONS, getRegion, getAllRegions, getRegionsByLocation, getRegionsByCompliance, getRegionsByPricingTier, isValidRegion, getClosestRegion, suggestRegions, suggestRegionPairs, formatRegion, formatRegionList, getRegionStats, MultiAccountManager, OrganizationManager, multiAccountManager, organizationManager, RECOMMENDED_ACCOUNT_STRUCTURES, RECOMMENDED_SCPS, COMMON_CROSS_ACCOUNT_ROLES, getRecommendedStructure, generateCrossAccountRoleCF, validateAccountStructure, formatAccountStructure, generateDeploymentWorkflow, generateMultiEnvWorkflow, generatePRPreviewWorkflow, generateScheduledWorkflow, generateMatrixWorkflow, generateDeploymentPipeline, generateMultiEnvPipeline, generatePreviewPipeline, generateScheduledPipeline, generateManualPipeline, generateDeploymentConfig, generateMultiEnvConfig, generateScheduledConfig, generateApprovalConfig, generateParallelConfig, BackupManager, backupManager, DisasterRecoveryManager, drManager, AWSConfigManager, awsConfigManager, CloudTrailManager, cloudTrailManager, GuardDutyManager, guardDutyManager, SecurityHubManager, securityHubManager, BlueGreenManager, blueGreenManager, CanaryManager, canaryManager, ABTestManager, abTestManager, ProgressiveDeploymentManager, progressiveDeploymentManager, XRayManager, xrayManager, MetricsManager, metricsManager, LogsManager, logsManager, SyntheticsManager, syntheticsManager, MigrationManager, migrationManager, ReplicaManager, replicaManager, PerformanceManager, performanceManager, DatabaseUserManager, databaseUserManager, SecretsRotationManager, secretsRotationManager, SecretsManager, secretsManager, CertificateManager, certificateManager, SecurityScanningManager, securityScanningManager, ImageScanningManager, imageScanningManager, BuildOptimizationManager, buildOptimizationManager, ContainerRegistryManager, containerRegistryManager, ServiceMeshManager, serviceMeshManager, LambdaLayersManager, lambdaLayersManager, LambdaVersionsManager, lambdaVersionsManager, LambdaConcurrencyManager, lambdaConcurrencyManager, LambdaDestinationsManager, lambdaDestinationsManager, LambdaVPCManager, lambdaVPCManager, LambdaDLQManager, lambdaDLQManager, Route53RoutingManager, route53RoutingManager, DNSSECManager, dnssecManager, Route53ResolverManager, route53ResolverManager, BounceComplaintHandler, bounceComplaintHandler, EmailAnalyticsManager, emailAnalyticsManager, SenderReputationManager, senderReputationManager, EmailTemplateManager, emailTemplateManager, exports_advanced, exports_inbound, exports_advanced2, exports_advanced3, FIFOQueueManager, fifoQueueManager, DLQMonitoringManager, dlqMonitoringManager, BatchProcessingManager, batchProcessingManager, QueueManagementManager, queueManagementManager, createZip, generateBootstrap, runBuildHooks, sha256, artifactKey, packageServerlessApp, MANAGED_NODE_VERSIONS, resolveServerlessRuntime, resolveQueues, resolveQueueNames, composeServerlessAppTemplate, PHP_LAYER_EXTENSIONS, phpLayerPackages, phpLayerBuildStage, generatePhpLayerDockerfile, generateAppImageDockerfile, sharedRuntimeLoop, buildNodeRuntimeLayerZip, buildBunRuntimeLayerZip, resolveApp, eventToRequest, responseToResult, createHttpHandler, createQueueHandler, createCliHandler, createHandlers, generatePhpFpmConfig, phpRuntimeLayerAssets, laravelServerlessEnvDefaults, LARAVEL_SERVERLESS_BUILD_STEPS, buildPhpRuntimeLayerZip, PHP_DEFAULT_EXCLUDES, runPhpBuildHooks, collectPhpAppEntries, packagePhpApp, StaticSiteManager, staticSiteManager, StorageAdvancedManager, storageAdvancedManager, HealthCheckManager, healthCheckManager, NetworkSecurityManager, networkSecurityManager, ResourceManagementManager, resourceManagementManager };
46155
+ export { detectServiceRegion, signRequest, signRequestAsync, createPresignedUrl, createPresignedUrlAsync, makeAWSRequest, makeAWSRequestOnce, makeAWSRequestAsync, parseXMLResponse, parseJSONResponse, clearSigningKeyCache, getSigningKeyCacheSize, isNodeCryptoAvailable, isWebCryptoAvailable, QueuePresets, RealtimePresets, detectDeploymentTargets, resolveDeploymentMode, deploymentCoexistenceError, resolveCloudProvider, TemplateBuilder, Pseudo, generateResourceName, generateLogicalId, getTimestamp, sanitizeName, resolveProjectStackName, resolveSiteStackName, resolveSiteResourceName, resolveSiteBucketName, resolveStorageBucketName, resolveDeployBucketName, resolveServerlessAppStackName, resolveServerlessArtifactBucketName, resolveServerlessAssetBucketName, DependencyGraph, analyzeStackDiff, formatDiff, Storage, Registry, CDN, DNS, Security, Compute, Network, FileSystem, Email, exports_incoming_call, Phone, Queue, JobLoader, StacksIntegration, exports_send, SMS, AI, Database, Cache, Permissions, ApiGateway, Messaging, Workflow, Monitoring, Auth, Deployment, AssetHasher, Secrets, ParameterStore, Search, Redirects, Communication, Fn2, Arn, AWS_PSEUDO_PARAMETERS, CloudFormationBuilder, buildCloudFormationTemplate, createStaticSitePreset, createNodeJsServerPreset, createNodeJsServerlessPreset, createServerlessNodePreset, createFullStackAppPreset, createApiBackendPreset, createWordPressPreset, createJamstackPreset, createMicroservicesPreset, createRealtimeAppPreset, createDataPipelinePreset, createMLApiPreset, createTraditionalWebAppPreset, createLaravelPreset, createServerlessLaravelPreset, createDashboardSite, resolveDashboardDomain, resolveDashboardDomains, hasManagementDashboardSite, MANAGEMENT_DASHBOARD_SITE_PREFIX, managementDashboardSiteName, isManagementDashboardSiteName, resolveManagementDashboardSites, resolveManagementDashboardSite, extendPreset, composePresets, createPreset, mergeInfrastructure, withMonitoring, withSecurity, withDatabase, withCache, withCDN, withQueue, fromEnvironment, fromSharedCredentials, fromEC2Metadata, fromECSMetadata, fromWebIdentity, getCredentials, createCredentialProvider, resolveCredentials, resolveRegion, getAccountId, S3Error, createS3Client, CloudError, ConfigurationError, CredentialError, DeploymentError, ValidationError, AWSAPIError, ErrorCodes, getErrorDetails, createError, DebugLogger, validateConfiguration, detectMisconfigurations, validateCredentials, checkIAMPermissions, getRequiredPermissions, suggestIAMPolicy, DEFAULT_SERVICE_LIMITS, checkServiceQuotas, getQuotaUsageSummary, suggestQuotaIncrease, FileCache, TemplateCache, templateCache, hashFile, hashString, hashBuffer, hashDirectory, hashManifest, quickHash, findChangedFiles, HashCache, parallel, batch, parallelMap, parallelWithRetry, sequence, withTimeout, RateLimiter, chunk, processInChunks, diffTemplates, getDiffSummary, requiresReplacement, categorizeChanges, getDeploymentStrategy, getDiffStats, cloud_config_schema_default, validateAgainstSchema, defaultLocalConfig, getLocalConfig, isLocalDevelopment, getLocalEndpoint, getLocalCredentials, getLocalEnvVars, MockCloudFormation, MockS3, MockDynamoDB, createMockAWS, PreviewEnvironmentManager, previewManager, generatePreviewWorkflow, generateCleanupWorkflow, generateCostReportWorkflow, PreviewNotificationService, previewNotifications, formatTable, formatTree, formatProgressBar, formatBytes, formatDuration, formatList, formatKeyValue, ProgressBar, MultiStepProgress, Spinner, TaskList, suggestCommand, formatSuggestion, isLikelyTypo, getContextualHelp, searchCommands, autocomplete, suggestFlags, formatFlagSuggestions, getCommandUsage, validateCommand, REPL, REPLContext, REPLCommandBuilder, CommandHistory, formatHistory, formatHistoryStats, MultiRegionManager, multiRegionManager, CrossRegionReferenceManager, GlobalResourceManager, RegionPairManager, StackDependencyManager, crossRegionReferenceManager, globalResourceManager, regionPairManager, stackDependencyManager, AWS_REGIONS, getRegion, getAllRegions, getRegionsByLocation, getRegionsByCompliance, getRegionsByPricingTier, isValidRegion, getClosestRegion, suggestRegions, suggestRegionPairs, formatRegion, formatRegionList, getRegionStats, MultiAccountManager, OrganizationManager, multiAccountManager, organizationManager, RECOMMENDED_ACCOUNT_STRUCTURES, RECOMMENDED_SCPS, COMMON_CROSS_ACCOUNT_ROLES, getRecommendedStructure, generateCrossAccountRoleCF, validateAccountStructure, formatAccountStructure, generateDeploymentWorkflow, generateMultiEnvWorkflow, generatePRPreviewWorkflow, generateScheduledWorkflow, generateMatrixWorkflow, generateDeploymentPipeline, generateMultiEnvPipeline, generatePreviewPipeline, generateScheduledPipeline, generateManualPipeline, generateDeploymentConfig, generateMultiEnvConfig, generateScheduledConfig, generateApprovalConfig, generateParallelConfig, BackupManager, backupManager, DisasterRecoveryManager, drManager, AWSConfigManager, awsConfigManager, CloudTrailManager, cloudTrailManager, GuardDutyManager, guardDutyManager, SecurityHubManager, securityHubManager, BlueGreenManager, blueGreenManager, CanaryManager, canaryManager, ABTestManager, abTestManager, ProgressiveDeploymentManager, progressiveDeploymentManager, XRayManager, xrayManager, MetricsManager, metricsManager, LogsManager, logsManager, SyntheticsManager, syntheticsManager, MigrationManager, migrationManager, ReplicaManager, replicaManager, PerformanceManager, performanceManager, DatabaseUserManager, databaseUserManager, SecretsRotationManager, secretsRotationManager, SecretsManager, secretsManager, CertificateManager, certificateManager, SecurityScanningManager, securityScanningManager, ImageScanningManager, imageScanningManager, BuildOptimizationManager, buildOptimizationManager, ContainerRegistryManager, containerRegistryManager, ServiceMeshManager, serviceMeshManager, LambdaLayersManager, lambdaLayersManager, LambdaVersionsManager, lambdaVersionsManager, LambdaConcurrencyManager, lambdaConcurrencyManager, LambdaDestinationsManager, lambdaDestinationsManager, LambdaVPCManager, lambdaVPCManager, LambdaDLQManager, lambdaDLQManager, Route53RoutingManager, route53RoutingManager, DNSSECManager, dnssecManager, Route53ResolverManager, route53ResolverManager, BounceComplaintHandler, bounceComplaintHandler, EmailAnalyticsManager, emailAnalyticsManager, SenderReputationManager, senderReputationManager, EmailTemplateManager, emailTemplateManager, exports_advanced, exports_inbound, exports_advanced2, exports_advanced3, FIFOQueueManager, fifoQueueManager, DLQMonitoringManager, dlqMonitoringManager, BatchProcessingManager, batchProcessingManager, QueueManagementManager, queueManagementManager, createZip, generateBootstrap, runBuildHooks, sha256, artifactKey, packageServerlessApp, MANAGED_NODE_VERSIONS, resolveServerlessRuntime, resolveQueues, resolveQueueNames, composeServerlessAppTemplate, PHP_LAYER_EXTENSIONS, phpLayerPackages, phpLayerBuildStage, generatePhpLayerDockerfile, generateAppImageDockerfile, sharedRuntimeLoop, buildNodeRuntimeLayerZip, buildBunRuntimeLayerZip, resolveApp, eventToRequest, responseToResult, createHttpHandler, createQueueHandler, createCliHandler, createHandlers, generatePhpFpmConfig, phpRuntimeLayerAssets, laravelServerlessEnvDefaults, LARAVEL_SERVERLESS_BUILD_STEPS, buildPhpRuntimeLayerZip, PHP_DEFAULT_EXCLUDES, runPhpBuildHooks, collectPhpAppEntries, packagePhpApp, StaticSiteManager, staticSiteManager, StorageAdvancedManager, storageAdvancedManager, HealthCheckManager, healthCheckManager, NetworkSecurityManager, networkSecurityManager, ResourceManagementManager, resourceManagementManager };
@@ -6,7 +6,7 @@ import {
6
6
  step,
7
7
  success,
8
8
  warn
9
- } from "./chunk-m03vddvr.js";
9
+ } from "./chunk-qgnyzfmx.js";
10
10
  import {
11
11
  CloudWatchLogsClient,
12
12
  CostExplorerClient,
@@ -25,8 +25,9 @@ import {
25
25
  releasePaths,
26
26
  resolveSiteFramework,
27
27
  resolveSiteKind,
28
- resolveUiSource
29
- } from "./chunk-jg4f2ybx.js";
28
+ resolveUiSource,
29
+ siteInstallBase
30
+ } from "./chunk-hb06vk29.js";
30
31
  import {
31
32
  artifactKey,
32
33
  composeServerlessAppTemplate,
@@ -40,7 +41,7 @@ import {
40
41
  resolveServerlessArtifactBucketName,
41
42
  resolveServerlessAssetBucketName,
42
43
  resolveServerlessRuntime
43
- } from "./chunk-vsgkcpqw.js";
44
+ } from "./chunk-49nmy775.js";
44
45
  import {
45
46
  deployStaticSiteWithExternalDnsFull
46
47
  } from "./chunk-d7p84vz5.js";
@@ -345,7 +346,7 @@ async function deployServerlessApp(config, environment, opts = {}) {
345
346
  }
346
347
  if (imageMode) {
347
348
  step("Building + pushing container image");
348
- const { buildAndPushServerlessImage } = await import("./chunk-9ra8b9b4.js");
349
+ const { buildAndPushServerlessImage } = await import("./chunk-296n8hvt.js");
349
350
  const built = await buildAndPushServerlessImage({
350
351
  app,
351
352
  projectRoot,
@@ -10284,13 +10285,13 @@ function shellSingleQuote(value) {
10284
10285
  function sedReplacement(value) {
10285
10286
  return value.replace(/[\\&/]/g, "\\$&");
10286
10287
  }
10287
- function deployHistoryScript(siteNames) {
10288
+ function deployHistoryScript(siteNames, slug) {
10288
10289
  if (siteNames.length === 0)
10289
10290
  return ["true"];
10290
10291
  return [
10291
10292
  "set +e",
10292
10293
  ...siteNames.map((siteName) => {
10293
- const historyPath = shellSingleQuote(`/var/www/${siteName}/.ts-cloud/deploy-history.log`);
10294
+ const historyPath = shellSingleQuote(`${siteInstallBase(slug, siteName)}/.ts-cloud/deploy-history.log`);
10294
10295
  const prefix = sedReplacement(siteName);
10295
10296
  return `TS_CLOUD_HISTORY=${historyPath}; { [ -f "$TS_CLOUD_HISTORY" ] && tail -n 24 "$TS_CLOUD_HISTORY" | sed "s/^/DEPLOY=${prefix}\\t/"; } || true`;
10296
10297
  }),
@@ -10673,7 +10674,7 @@ function resolveConfigOnlyServerDashboardData(config6, environment) {
10673
10674
  const kind = resolveSiteKind(site);
10674
10675
  return {
10675
10676
  ...s,
10676
- root: kind === "server-static" ? `/var/www/${s.name}` : `/var/www/${s.name}/current`,
10677
+ root: kind === "server-static" ? siteInstallBase(config6.project.slug, s.name) : `${siteInstallBase(config6.project.slug, s.name)}/current`,
10677
10678
  branch: kind === "server-static" ? "build artifact" : "main",
10678
10679
  build: site.build,
10679
10680
  php: site.php ?? site.phpVersion,
@@ -10754,7 +10755,7 @@ async function resolveServerDashboardData(config6, environment) {
10754
10755
  const siteNames = Object.keys(config6.sites ?? {});
10755
10756
  const historyResult = await driver.runRemoteDeploy({
10756
10757
  targets: [targets[0]],
10757
- commands: deployHistoryScript(siteNames),
10758
+ commands: deployHistoryScript(siteNames, config6.project.slug),
10758
10759
  comment: `ts-cloud dashboard:deploy-history ${config6.project.slug}`,
10759
10760
  tags: { Project: config6.project.slug, Environment: environment, Role: "app" }
10760
10761
  });
@@ -11013,7 +11014,7 @@ async function rollbackComputeSite(ctx, options) {
11013
11014
  const targets = await findTargets(ctx);
11014
11015
  if (targets.length === 0)
11015
11016
  return { success: false, error: `No '${ctx.role || "app"}' servers found for ${ctx.slug}/${ctx.environment}.` };
11016
- const appBase = `/var/www/${options.siteName}`;
11017
+ const appBase = siteInstallBase(ctx.slug, options.siteName);
11017
11018
  const paths = releasePaths(appBase, options.to || "unused");
11018
11019
  const commands = [
11019
11020
  "set -uo pipefail",
@@ -11139,8 +11140,8 @@ function serviceCommand(verb, target) {
11139
11140
  function pantryEnvEval() {
11140
11141
  return `eval "$(cd ${PANTRY_PROJECT_DIR} && pantry env 2>/dev/null)"`;
11141
11142
  }
11142
- function siteArtisanCommand(site, artisan) {
11143
- const current = `/var/www/${site}/current`;
11143
+ function siteArtisanCommand(slug, site, artisan) {
11144
+ const current = `${siteInstallBase(slug, site)}/current`;
11144
11145
  return [
11145
11146
  "set -uo pipefail",
11146
11147
  `[ -d ${current} ] || { echo "site ${site} has no current release" >&2; exit 1; }`,
@@ -11149,7 +11150,7 @@ function siteArtisanCommand(site, artisan) {
11149
11150
  }
11150
11151
  function workerRestartCommand(framework, slug, site) {
11151
11152
  if (framework === "laravel")
11152
- return siteArtisanCommand(site, "queue:restart");
11153
+ return siteArtisanCommand(slug, site, "queue:restart");
11153
11154
  const pattern = `${slug}-${site}-queue-*.service`;
11154
11155
  return [
11155
11156
  "set -uo pipefail",
@@ -11161,7 +11162,7 @@ function workerRestartCommand(framework, slug, site) {
11161
11162
  }
11162
11163
  function schedulerRunCommand(framework, slug, site) {
11163
11164
  if (framework === "laravel")
11164
- return siteArtisanCommand(site, "schedule:run");
11165
+ return siteArtisanCommand(slug, site, "schedule:run");
11165
11166
  const unit = `${slug}-${site}-scheduler.service`;
11166
11167
  return [
11167
11168
  "set -uo pipefail",
@@ -5,7 +5,7 @@ import {
5
5
  resolveCloudProvider,
6
6
  resolveManagementDashboardSites,
7
7
  resolveProjectStackName
8
- } from "./chunk-vsgkcpqw.js";
8
+ } from "./chunk-49nmy775.js";
9
9
  import {
10
10
  EC2Client,
11
11
  SSMClient
@@ -1659,6 +1659,9 @@ runcmd:
1659
1659
  }
1660
1660
 
1661
1661
  // src/deploy/site-target.ts
1662
+ function siteInstallBase(slug, siteName) {
1663
+ return `/var/www/${slug}-${siteName}`;
1664
+ }
1662
1665
  var PHP_SITE_TYPES = new Set([
1663
1666
  "laravel",
1664
1667
  "php",
@@ -1815,6 +1818,7 @@ function resolveServerAppFrom(port, appBoxes) {
1815
1818
  }
1816
1819
  function buildRpxConfigInternal(sites, options, appBoxes) {
1817
1820
  const wwwRoot = (options.wwwRoot ?? "/var/www").replace(/\/+$/, "");
1821
+ const installSlug = options.slug ?? "app";
1818
1822
  const certsDir = options.proxy.certsDir ?? DEFAULT_RPX_CERTS_DIR;
1819
1823
  const loadBalancer = options.proxy.loadBalancer;
1820
1824
  const proxies = [];
@@ -1849,7 +1853,7 @@ function buildRpxConfigInternal(sites, options, appBoxes) {
1849
1853
  proxies.push({
1850
1854
  to: site.domain,
1851
1855
  path,
1852
- static: `${wwwRoot}/${name}/current`,
1856
+ static: `${wwwRoot}/${installSlug}-${name}/current`,
1853
1857
  cleanUrls: site.pathRewriteStyle !== "flat",
1854
1858
  spa: site.spa ?? false,
1855
1859
  ...auth ? { auth } : {},
@@ -2302,7 +2306,7 @@ class HetznerDriver {
2302
2306
  const sitePorts = this.collectUpstreamPorts(sites);
2303
2307
  const rpxProvision = compute.proxy?.engine === "rpx" ? buildRpxProvisionScript({
2304
2308
  proxy: compute.proxy,
2305
- config: buildRpxConfig(sites, { proxy: compute.proxy }),
2309
+ config: buildRpxConfig(sites, { proxy: compute.proxy, slug: config.project.slug }),
2306
2310
  slug: config.project.slug,
2307
2311
  bunBin: compute.runtime === "node" || compute.runtime === "deno" ? undefined : "/usr/local/bin/bun"
2308
2312
  }) : undefined;
@@ -2651,7 +2655,7 @@ class HetznerDriver {
2651
2655
  const rpxProxy = compute.proxy?.engine === "rpx" ? compute.proxy : { engine: "rpx" };
2652
2656
  const lbRpxProvision = buildRpxProvisionScript({
2653
2657
  proxy: rpxProxy,
2654
- config: buildRpxLbConfig(sites, appBoxes, { proxy: rpxProxy }),
2658
+ config: buildRpxLbConfig(sites, appBoxes, { proxy: rpxProxy, slug }),
2655
2659
  slug,
2656
2660
  bunBin: appProvisionScripts.runtime === "node" || appProvisionScripts.runtime === "deno" ? undefined : "/usr/local/bin/bun"
2657
2661
  });
@@ -3548,6 +3552,24 @@ function buildPruneReleases(paths, keep = DEFAULT_KEEP_RELEASES) {
3548
3552
  "done"
3549
3553
  ];
3550
3554
  }
3555
+ function siteOwnerPath(base) {
3556
+ return `${deployMetaDir(base)}/owner`;
3557
+ }
3558
+ function buildSiteOwnerGuard(base, slug) {
3559
+ const owner = siteOwnerPath(base);
3560
+ return [
3561
+ `if [ -f "${owner}" ]; then`,
3562
+ ` TS_CLOUD_OWNER=$(cat "${owner}")`,
3563
+ ` if [ "$TS_CLOUD_OWNER" != "${slug}" ]; then`,
3564
+ ` echo "[ts-cloud] REFUSING deploy: ${base} belongs to project '$TS_CLOUD_OWNER', not '${slug}'. Another project on this box derives the same site key — give one of them a distinct site name/domain, or remove ${owner} to transfer ownership." >&2`,
3565
+ " exit 1",
3566
+ " fi",
3567
+ "else",
3568
+ ` mkdir -p "$(dirname "${owner}")"`,
3569
+ ` printf '%s\\n' "${slug}" > "${owner}"`,
3570
+ "fi"
3571
+ ];
3572
+ }
3551
3573
  function buildDeployHistoryHeader(base, options) {
3552
3574
  const meta = deployMetaDir(base);
3553
3575
  const log = deployLogPath(base, options.releaseId);
@@ -3827,7 +3849,7 @@ function buildManagementDashboardArtifact(site, options) {
3827
3849
  logger.warn(`Management dashboard: build output not found at ${root} — skipping dashboard artifact.`);
3828
3850
  return null;
3829
3851
  }
3830
- const tarball = join4(tmpdir(), `${options.slug}-${MANAGEMENT_DASHBOARD_SITE}-${options.sha}.tar.gz`);
3852
+ const tarball = join4(tmpdir(), `${options.slug}-${options.siteName ?? MANAGEMENT_DASHBOARD_SITE}-${options.sha}.tar.gz`);
3831
3853
  execSync2(`tar czf "${tarball}" -C "${root}" .`, { stdio: "inherit" });
3832
3854
  return tarball;
3833
3855
  } catch (error) {
@@ -4366,26 +4388,26 @@ async function deploySiteRelease(driver, options, logger = noopLogger2) {
4366
4388
  if (isPhpSite(site)) {
4367
4389
  const compute2 = config.infrastructure?.compute;
4368
4390
  const phpVersion = site.phpVersion ?? compute2?.php?.default ?? compute2?.php?.versions?.[0];
4369
- const appBase = `/var/www/${siteName}`;
4391
+ const appBase2 = siteInstallBase(slug, siteName);
4370
4392
  const dbEnv = outputs.servicesPrivateIp ? buildFleetServicesEnv(outputs.servicesPrivateIp, config.infrastructure?.appDatabase) : buildManagedDbEnv(config.infrastructure?.appDatabase);
4371
4393
  const siteWithEnv = Object.keys(dbEnv).length > 0 ? { ...site, env: { ...dbEnv, ...site.env || {} } } : site;
4372
4394
  const deployScript = buildLaravelDeployScript({
4373
4395
  siteName,
4374
4396
  site: siteWithEnv,
4375
4397
  releaseId: sha,
4376
- appBase,
4398
+ appBase: appBase2,
4377
4399
  defaultPhpVersion: phpVersion
4378
4400
  });
4379
4401
  const useNginx = compute2?.webServer !== "rpx";
4380
4402
  const sslProvider = resolveSslProvider(site);
4381
4403
  const customCert = sslProvider === "custom" && site.ssl?.certPath && site.ssl?.keyPath ? { certPath: site.ssl.certPath, keyPath: site.ssl.keyPath } : undefined;
4382
- const poolScript = site.isolation ? buildPhpFpmPoolScript({ siteName, appBase }) : [];
4404
+ const poolScript = site.isolation ? buildPhpFpmPoolScript({ siteName, appBase: appBase2 }) : [];
4383
4405
  const vhostScript = useNginx ? buildNginxVhostScript({
4384
4406
  siteName,
4385
4407
  domain: site.domain || siteName,
4386
4408
  aliases: site.aliases,
4387
4409
  type: site.type,
4388
- appDir: `${appBase}/current`,
4410
+ appDir: `${appBase2}/current`,
4389
4411
  webDirectory: site.webDirectory,
4390
4412
  phpVersion,
4391
4413
  fastcgiPass: site.isolation ? phpFpmPoolListen(siteName) : undefined,
@@ -4399,12 +4421,12 @@ async function deploySiteRelease(driver, options, logger = noopLogger2) {
4399
4421
  security: site.security
4400
4422
  }) : [];
4401
4423
  const sslScript = useNginx ? buildSslScript(site) : [];
4402
- const servicesScript2 = siteHasServices(site) ? buildSiteServicesScript({ slug, siteName, site, phpVersion, appBase }) : [];
4424
+ const servicesScript2 = siteHasServices(site) ? buildSiteServicesScript({ slug, siteName, site, phpVersion, appBase: appBase2 }) : [];
4403
4425
  const healthCheckScript = useNginx ? buildHealthCheckScript(site) : [];
4404
4426
  logger.step(`Deploying PHP site '${siteName}' to ${targets.length} target(s)...`);
4405
4427
  const phpResult = await driver.runRemoteDeploy({
4406
4428
  targets,
4407
- commands: [...deployScript, ...poolScript, ...vhostScript, ...sslScript, ...servicesScript2, ...healthCheckScript],
4429
+ commands: [...buildSiteOwnerGuard(appBase2, slug), ...deployScript, ...poolScript, ...vhostScript, ...sslScript, ...servicesScript2, ...healthCheckScript],
4408
4430
  comment: `ts-cloud deploy ${slug}/${siteName}@${sha}`,
4409
4431
  tags: { Project: slug, Environment: environment, Role: "app" }
4410
4432
  });
@@ -4437,14 +4459,17 @@ async function deploySiteRelease(driver, options, logger = noopLogger2) {
4437
4459
  });
4438
4460
  const artifactFetch = driver.name === "aws" ? buildAwsArtifactFetch(outputs.deployBucketName, remoteKey, config.project.region || "us-east-1", siteName) : buildLocalArtifactFetch(uploadResult.artifactRef, siteName);
4439
4461
  const kind = resolveSiteKind(site);
4462
+ const appBase = siteInstallBase(slug, siteName);
4440
4463
  const baseScript = kind === "server-static" ? buildStaticSiteDeployScript({
4441
4464
  siteName,
4465
+ appDir: appBase,
4442
4466
  artifactFetch,
4443
4467
  releaseId: sha,
4444
4468
  preStartCommands: site.preStart
4445
4469
  }) : buildSiteDeployScript({
4446
4470
  siteName,
4447
4471
  slug,
4472
+ appDir: appBase,
4448
4473
  artifactFetch,
4449
4474
  releaseId: sha,
4450
4475
  execStart: resolveExecStart(site.start, runtime),
@@ -4461,7 +4486,7 @@ async function deploySiteRelease(driver, options, logger = noopLogger2) {
4461
4486
  domain: site.domain,
4462
4487
  aliases: site.aliases,
4463
4488
  type: site.type === "spa" ? "spa" : "static",
4464
- appDir: `/var/www/${siteName}/current`,
4489
+ appDir: `${appBase}/current`,
4465
4490
  webDirectory: "",
4466
4491
  redirects: site.redirects,
4467
4492
  auth: site.auth && site.auth.enabled !== false && site.auth.password ? { username: site.auth.username || "admin", password: site.auth.password, realm: site.auth.realm } : undefined,
@@ -4472,13 +4497,14 @@ async function deploySiteRelease(driver, options, logger = noopLogger2) {
4472
4497
  security: site.security
4473
4498
  }) : [];
4474
4499
  const staticSsl = wantsNginxStatic ? buildSslScript(site) : [];
4475
- const servicesScript = siteHasServices(site) ? buildSiteServicesScript({ slug, siteName, site, appBase: `/var/www/${siteName}` }) : [];
4500
+ const servicesScript = siteHasServices(site) ? buildSiteServicesScript({ slug, siteName, site, appBase }) : [];
4476
4501
  const remoteScript = [
4477
- ...buildDeployHistoryHeader(`/var/www/${siteName}`, {
4502
+ ...buildDeployHistoryHeader(appBase, {
4478
4503
  releaseId: sha,
4479
4504
  commit: sha,
4480
4505
  branch: site.branch ?? "main"
4481
4506
  }),
4507
+ ...buildSiteOwnerGuard(appBase, slug),
4482
4508
  ...baseScript,
4483
4509
  ...staticVhost,
4484
4510
  ...staticSsl,
@@ -4521,7 +4547,7 @@ async function deployAllComputeSites(options) {
4521
4547
  let dashboardTarball = null;
4522
4548
  const dashboardTarballBySite = new Map;
4523
4549
  if (injectedDashboardSites.length > 0) {
4524
- dashboardTarball = buildManagementDashboardArtifact(config.sites?.[injectedDashboardSites[0]], { cwd, slug, sha, logger: { info: logger.info, warn: logger.warn } });
4550
+ dashboardTarball = buildManagementDashboardArtifact(config.sites?.[injectedDashboardSites[0]], { cwd, slug, sha, siteName: injectedDashboardSites[0], logger: { info: logger.info, warn: logger.warn } });
4525
4551
  if (!dashboardTarball) {
4526
4552
  logger.warn("Management dashboard: no artifact available — skipping dashboard site(s) for this deploy.");
4527
4553
  for (const name of injectedDashboardSites) {
@@ -4530,7 +4556,7 @@ async function deployAllComputeSites(options) {
4530
4556
  }
4531
4557
  } else {
4532
4558
  for (const name of injectedDashboardSites) {
4533
- if (name === MANAGEMENT_DASHBOARD_SITE) {
4559
+ if (name === injectedDashboardSites[0]) {
4534
4560
  dashboardTarballBySite.set(name, dashboardTarball);
4535
4561
  continue;
4536
4562
  }
@@ -4601,7 +4627,7 @@ async function reloadRpxGateway(options) {
4601
4627
  if (proxy?.engine !== "rpx")
4602
4628
  return true;
4603
4629
  const sites = routeSource.sites || {};
4604
- const rpxConfig = buildRpxConfig(sites, { proxy });
4630
+ const rpxConfig = buildRpxConfig(sites, { proxy, slug: config.project.slug });
4605
4631
  if (rpxConfig.proxies.length === 0) {
4606
4632
  logger.warn("rpx gateway: no server sites with a domain to route — skipping gateway reload.");
4607
4633
  return true;
@@ -4715,4 +4741,4 @@ function buildCloudFrontOriginConfig(options) {
4715
4741
  CustomErrorResponses: { Quantity: 0 }
4716
4742
  };
4717
4743
  }
4718
- export { isPhpSite, resolveSiteDeployTarget, resolveSiteKind, validateDeploymentConfig, PANTRY_PROJECT_DIR, BACKUP_RUNNER_PATH, buildBackupRestoreScript, buildUbuntuBootstrapScript, AwsDriver, HetznerClient, resolveHetznerApiToken, normalizeSshPublicKey, wrapCloudInitUserData, DEFAULT_RPX_CERTS_DIR, normalizeRoutePath, deriveRouteId, buildRpxConfig, buildRpxLbConfig, renderRpxLauncher, RPX_DIR, RPX_LAUNCHER_PATH, RPX_SERVICE_NAME, buildRpxProvisionScript, 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, 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 };
4744
+ export { siteInstallBase, isPhpSite, resolveSiteDeployTarget, resolveSiteKind, validateDeploymentConfig, PANTRY_PROJECT_DIR, BACKUP_RUNNER_PATH, buildBackupRestoreScript, buildUbuntuBootstrapScript, AwsDriver, HetznerClient, resolveHetznerApiToken, normalizeSshPublicKey, wrapCloudInitUserData, DEFAULT_RPX_CERTS_DIR, normalizeRoutePath, deriveRouteId, buildRpxConfig, buildRpxLbConfig, renderRpxLauncher, RPX_DIR, RPX_LAUNCHER_PATH, RPX_SERVICE_NAME, buildRpxProvisionScript, 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, 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 };
@@ -8,7 +8,7 @@ import {
8
8
  phpRuntimeLayerAssets,
9
9
  runPhpBuildHooks,
10
10
  sha256
11
- } from "./chunk-vsgkcpqw.js";
11
+ } from "./chunk-49nmy775.js";
12
12
 
13
13
  // src/deploy/serverless-image.ts
14
14
  import { execFileSync } from "node:child_process";
@@ -12,10 +12,10 @@ import {
12
12
  sanitizeCloudConfig,
13
13
  setMaintenance,
14
14
  startLocalDashboardServer
15
- } from "../chunk-fy85hcfy.js";
15
+ } from "../chunk-d1370frz.js";
16
16
  import {
17
17
  buildAndPushServerlessImage
18
- } from "../chunk-m03vddvr.js";
18
+ } from "../chunk-qgnyzfmx.js";
19
19
  import"../chunk-b82pbxyp.js";
20
20
  import"../chunk-hsk6fe6x.js";
21
21
  import {
@@ -28,9 +28,10 @@ import {
28
28
  resolveSiteDeployTarget,
29
29
  resolveSiteKind,
30
30
  resolveUiSource,
31
+ siteInstallBase,
31
32
  validateDeploymentConfig
32
- } from "../chunk-jg4f2ybx.js";
33
- import"../chunk-vsgkcpqw.js";
33
+ } from "../chunk-hb06vk29.js";
34
+ import"../chunk-49nmy775.js";
34
35
  import"../chunk-93hjhs78.js";
35
36
  import {
36
37
  deleteStaticSite,
@@ -54,6 +55,7 @@ export {
54
55
  validateDeploymentConfig,
55
56
  uploadStaticFiles,
56
57
  startLocalDashboardServer,
58
+ siteInstallBase,
57
59
  setMaintenance,
58
60
  sanitizeCloudConfig,
59
61
  runRemoteCommand,
@@ -20,7 +20,13 @@
20
20
  * - `TS_CLOUD_UI_DISABLE` set truthy to skip auto-deploy
21
21
  */
22
22
  import type { CloudConfig } from '@ts-cloud/core';
23
- /** Site key under which the management dashboard is auto-injected. */
23
+ /**
24
+ * Legacy site key for the management dashboard. Auto-injected dashboards are
25
+ * now keyed per domain (`dashboard-<apex-dashed>`, see
26
+ * `managementDashboardSiteName` in `@ts-cloud/core`) so tenants sharing a box
27
+ * via `attachTo` never collide on `/var/www/dashboard`. This bare key remains
28
+ * only for hand-configured dashboards and pre-0.8 deploys.
29
+ */
24
30
  export declare const MANAGEMENT_DASHBOARD_SITE = "dashboard";
25
31
  /** Where an auto-generated dashboard password is persisted (per project checkout). */
26
32
  export declare const DASHBOARD_CREDENTIALS_FILE: string;
@@ -68,6 +74,8 @@ export interface BuildDashboardArtifactOptions {
68
74
  cwd?: string;
69
75
  slug: string;
70
76
  sha: string;
77
+ /** Site key the tarball is staged under. @default MANAGEMENT_DASHBOARD_SITE */
78
+ siteName?: string;
71
79
  logger?: EnsureDashboardLogger;
72
80
  }
73
81
  /**
@@ -10,6 +10,23 @@ import type { CloudConfig, SiteConfig, SiteDeployTarget } from '@ts-cloud/core';
10
10
  * the gateway answers `domain` with an HTTP redirect.
11
11
  */
12
12
  export type SiteDeployKind = 'bucket' | 'server-app' | 'server-static' | 'server-php' | 'redirect';
13
+ /**
14
+ * On-disk base directory for a site's atomic release tree
15
+ * (`<base>/releases/<sha>` + `<base>/current`).
16
+ *
17
+ * Namespaced by the project **slug** so that on a shared / multi-tenant box
18
+ * (`cloud.attachTo`) two projects — or a tenant and the box owner — can never
19
+ * collide on the same `/var/www/<name>` path. A bare `/var/www/<siteName>`
20
+ * meant that e.g. every project with a `main` site fought over `/var/www/main`,
21
+ * silently overwriting each other's releases and round-robining stale responses
22
+ * on the shared port. This mirrors the systemd unit naming (`<slug>-<siteName>`)
23
+ * so a release directory and the service that runs it share one identity.
24
+ *
25
+ * MUST be the single source of truth for the install path — deploy, rpx routing
26
+ * (server-static), rollback/ops, and dashboard data all derive from it, so they
27
+ * can never diverge.
28
+ */
29
+ export declare function siteInstallBase(slug: string, siteName: string): string;
13
30
  /**
14
31
  * A PHP/Laravel site: deployed to the compute box via git clone into atomic
15
32
  * release directories and served by nginx + php-fpm. Identified by a PHP
@@ -48,8 +48,8 @@ import {
48
48
  waitForCloudInit,
49
49
  waitForSsh,
50
50
  wrapCloudInitUserData
51
- } from "../chunk-jg4f2ybx.js";
52
- import"../chunk-vsgkcpqw.js";
51
+ } from "../chunk-hb06vk29.js";
52
+ import"../chunk-49nmy775.js";
53
53
  import"../chunk-93hjhs78.js";
54
54
  import"../chunk-qpj3edwz.js";
55
55
  import"../chunk-vd87cpvn.js";
@@ -77,6 +77,18 @@ export declare function buildRollbackScript(paths: ReleasePaths, options?: {
77
77
  * at the newest, so it is never pruned.
78
78
  */
79
79
  export declare function buildPruneReleases(paths: ReleasePaths, keep?: number): string[];
80
+ /** Owner marker recording which project a site's base dir belongs to. */
81
+ export declare function siteOwnerPath(base: string): string;
82
+ /**
83
+ * Guard a site's base dir against cross-project deploys on a shared box
84
+ * (`attachTo`): the first deploy stamps `<base>/.ts-cloud/owner` with the
85
+ * project slug; a later deploy whose slug differs fails loudly instead of
86
+ * silently overwriting another tenant's releases. Two projects can only trip
87
+ * this by deriving the same site key (e.g. both claiming the same domain),
88
+ * which is a config conflict the operator must resolve — not one deploys
89
+ * should paper over. Emitted before anything mutates the dir.
90
+ */
91
+ export declare function buildSiteOwnerGuard(base: string, slug: string): string[];
80
92
  export interface DeployHistoryOptions {
81
93
  /** This deploy's release id. */
82
94
  releaseId: string;
@@ -138,6 +138,14 @@ export interface BuildRpxConfigOptions {
138
138
  proxy: ComputeProxyConfig;
139
139
  /** Directory static sites are shipped to. @default '/var/www' */
140
140
  wwwRoot?: string;
141
+ /**
142
+ * Project slug — server-static routes are served from the slug-namespaced
143
+ * install dir (`<wwwRoot>/<slug>-<name>/current`), matching where the deploy
144
+ * ships them (see {@link siteInstallBase}). Omitted ⇒ `app` (single-tenant
145
+ * back-compat). MUST be set on a shared box or static routes point at the
146
+ * wrong directory.
147
+ */
148
+ slug?: string;
141
149
  }
142
150
  /**
143
151
  * Normalize a path prefix to a leading-slash, no-trailing-slash form, or
package/dist/index.js CHANGED
@@ -55,10 +55,10 @@ import {
55
55
  sanitizeCloudConfig,
56
56
  setMaintenance,
57
57
  startLocalDashboardServer
58
- } from "./chunk-fy85hcfy.js";
58
+ } from "./chunk-d1370frz.js";
59
59
  import {
60
60
  buildAndPushServerlessImage
61
- } from "./chunk-m03vddvr.js";
61
+ } from "./chunk-qgnyzfmx.js";
62
62
  import {
63
63
  CloudWatchLogsClient,
64
64
  EFSClient,
@@ -105,7 +105,7 @@ import {
105
105
  waitForCloudInit,
106
106
  waitForSsh,
107
107
  wrapCloudInitUserData
108
- } from "./chunk-jg4f2ybx.js";
108
+ } from "./chunk-hb06vk29.js";
109
109
  import {
110
110
  ABTestManager,
111
111
  AI,
@@ -412,6 +412,7 @@ import {
412
412
  makeAWSRequest,
413
413
  makeAWSRequestAsync,
414
414
  makeAWSRequestOnce,
415
+ managementDashboardSiteName,
415
416
  mergeInfrastructure,
416
417
  metricsManager,
417
418
  migrationManager,
@@ -503,7 +504,7 @@ import {
503
504
  withSecurity,
504
505
  withTimeout,
505
506
  xrayManager
506
- } from "./chunk-vsgkcpqw.js";
507
+ } from "./chunk-49nmy775.js";
507
508
  import {
508
509
  EC2Client,
509
510
  SSMClient
@@ -4757,6 +4758,7 @@ export {
4757
4758
  migrateObjectStorage,
4758
4759
  metricsManager,
4759
4760
  mergeInfrastructure,
4761
+ managementDashboardSiteName,
4760
4762
  makeAWSRequestOnce,
4761
4763
  makeAWSRequestAsync,
4762
4764
  makeAWSRequest,