@stacksjs/ts-cloud 0.7.84 → 0.7.86
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/ec2.d.ts +13 -0
- package/dist/aws/index.js +1 -1
- package/dist/bin/cli.js +512 -512
- package/dist/{chunk-8m38yfba.js → chunk-4erbrg3e.js} +6 -45
- package/dist/{chunk-703nkybg.js → chunk-7m60qnc8.js} +10 -0
- package/dist/{chunk-838t87x3.js → chunk-ztbn47we.js} +102 -2
- package/dist/deploy/index.js +17 -7
- package/dist/deploy/server-dns.d.ts +77 -3
- package/dist/drivers/hetzner/state.d.ts +8 -0
- package/dist/drivers/index.js +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.js +15 -5
- package/dist/ui/access-denied.html +2 -2
- package/dist/ui/account/automation.html +3 -3
- package/dist/ui/account/security.html +2 -2
- package/dist/ui/applications/compose.html +4 -4
- package/dist/ui/applications/new.html +2 -2
- package/dist/ui/data/backups.html +4 -4
- package/dist/ui/data/services.html +3 -3
- package/dist/ui/data/volumes.html +4 -4
- package/dist/ui/index.html +4 -4
- package/dist/ui/integrations.html +2 -2
- package/dist/ui/operations/alerts.html +3 -3
- package/dist/ui/operations/configuration.html +4 -4
- package/dist/ui/operations/jobs.html +4 -4
- package/dist/ui/operations/maintenance.html +3 -3
- package/dist/ui/operations/observability.html +4 -4
- package/dist/ui/operations/previews.html +3 -3
- package/dist/ui/operations/queue.html +4 -4
- package/dist/ui/operations/regions.html +3 -3
- package/dist/ui/operations/releases.html +3 -3
- package/dist/ui/operations/workloads.html +3 -3
- package/dist/ui/security.html +2 -2
- package/dist/ui/server/actions.html +3 -3
- 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 +4 -4
- package/dist/ui/server/fleet.html +4 -4
- package/dist/ui/server/logs.html +4 -4
- package/dist/ui/server/metrics.html +3 -3
- package/dist/ui/server/services.html +2 -2
- package/dist/ui/server/sites.html +3 -3
- package/dist/ui/server/ssh-keys.html +4 -4
- package/dist/ui/server/team.html +4 -4
- package/dist/ui/server/terminal.html +2 -2
- package/dist/ui/serverless/alarms.html +4 -4
- package/dist/ui/serverless/assets.html +2 -2
- package/dist/ui/serverless/cost.html +2 -2
- 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 +3 -3
- package/dist/ui/serverless/metrics.html +2 -2
- package/dist/ui/serverless/queues.html +3 -3
- package/dist/ui/serverless/secrets.html +4 -4
- package/dist/ui/serverless/traces.html +4 -4
- package/dist/ui/serverless.html +4 -4
- package/package.json +3 -3
|
@@ -45,7 +45,7 @@ import {
|
|
|
45
45
|
resolveSiteKind,
|
|
46
46
|
resolveUiSource,
|
|
47
47
|
siteInstallBase
|
|
48
|
-
} from "./chunk-
|
|
48
|
+
} from "./chunk-ztbn47we.js";
|
|
49
49
|
import {
|
|
50
50
|
artifactKey,
|
|
51
51
|
buildCloudFormationTemplate,
|
|
@@ -70,7 +70,7 @@ import {
|
|
|
70
70
|
} from "./chunk-1qjyqrc5.js";
|
|
71
71
|
import {
|
|
72
72
|
SSMClient
|
|
73
|
-
} from "./chunk-
|
|
73
|
+
} from "./chunk-7m60qnc8.js";
|
|
74
74
|
import {
|
|
75
75
|
CloudFormationClient
|
|
76
76
|
} from "./chunk-4cjrg98a.js";
|
|
@@ -88,45 +88,6 @@ import {
|
|
|
88
88
|
import {
|
|
89
89
|
__require
|
|
90
90
|
} from "./chunk-v0bahtg2.js";
|
|
91
|
-
// src/deploy/server-dns.ts
|
|
92
|
-
function collectServerDnsDomains(sites = {}) {
|
|
93
|
-
const domains = new Set;
|
|
94
|
-
for (const site of Object.values(sites)) {
|
|
95
|
-
if (!site.domain)
|
|
96
|
-
continue;
|
|
97
|
-
if (site.redirect || site.deploy === "server" || site.start)
|
|
98
|
-
domains.add(site.domain);
|
|
99
|
-
}
|
|
100
|
-
return domains;
|
|
101
|
-
}
|
|
102
|
-
function normalizeName(name) {
|
|
103
|
-
return name.replace(/\.$/, "").toLowerCase();
|
|
104
|
-
}
|
|
105
|
-
function matchesHostname(record, zone, hostname) {
|
|
106
|
-
const recordName = normalizeName(record.name);
|
|
107
|
-
const normalizedZone = normalizeName(zone);
|
|
108
|
-
const normalizedHostname = normalizeName(hostname);
|
|
109
|
-
const relativeName = normalizedHostname === normalizedZone ? "@" : normalizedHostname.endsWith(`.${normalizedZone}`) ? normalizedHostname.slice(0, -(normalizedZone.length + 1)) : normalizedHostname;
|
|
110
|
-
return recordName === normalizedHostname || recordName === relativeName || relativeName === "@" && (recordName === "" || recordName === normalizedZone);
|
|
111
|
-
}
|
|
112
|
-
async function removeStaleServerAddressRecords(provider, zone, hostname, desiredAddress) {
|
|
113
|
-
const listed = await provider.listRecords(zone);
|
|
114
|
-
if (!listed.success)
|
|
115
|
-
return [`could not list A records: ${listed.message || "unknown provider error"}`];
|
|
116
|
-
const matching = listed.records.filter((record) => record.type === "A" && matchesHostname(record, zone, hostname));
|
|
117
|
-
const desiredIndex = matching.findIndex((record) => record.content === desiredAddress);
|
|
118
|
-
if (matching.length <= 1 || desiredIndex === -1)
|
|
119
|
-
return [];
|
|
120
|
-
const warnings = [];
|
|
121
|
-
for (const [index, record] of matching.entries()) {
|
|
122
|
-
if (index === desiredIndex)
|
|
123
|
-
continue;
|
|
124
|
-
const result = await provider.deleteRecord(zone, record);
|
|
125
|
-
if (!result.success)
|
|
126
|
-
warnings.push(`could not remove stale ${record.name} A ${record.content}: ${result.message || "unknown provider error"}`);
|
|
127
|
-
}
|
|
128
|
-
return warnings;
|
|
129
|
-
}
|
|
130
91
|
// src/deploy/dashboard-control-plane.ts
|
|
131
92
|
import { createHash as createHash5 } from "node:crypto";
|
|
132
93
|
|
|
@@ -13016,7 +12977,7 @@ function normalizeHost(value) {
|
|
|
13016
12977
|
throw new Error("Source host must use HTTPS");
|
|
13017
12978
|
return `${url.protocol}//${url.host}${url.pathname.replace(/\/$/, "")}`;
|
|
13018
12979
|
}
|
|
13019
|
-
function
|
|
12980
|
+
function normalizeName(value) {
|
|
13020
12981
|
const name = value.trim();
|
|
13021
12982
|
if (name.length < 2 || name.length > 80)
|
|
13022
12983
|
throw new Error("Connection name must contain 2-80 characters");
|
|
@@ -13207,7 +13168,7 @@ class SourceConnectionStore {
|
|
|
13207
13168
|
id,
|
|
13208
13169
|
input.organizationId,
|
|
13209
13170
|
input.provider,
|
|
13210
|
-
|
|
13171
|
+
normalizeName(input.name),
|
|
13211
13172
|
normalizeHost(input.host),
|
|
13212
13173
|
input.owner?.trim() || null,
|
|
13213
13174
|
input.authKind ?? (encoded ? "access_token" : "none"),
|
|
@@ -13340,7 +13301,7 @@ class SourceConnectionStore {
|
|
|
13340
13301
|
this.run(`INSERT INTO source_deploy_keys (id, connection_id, name, public_key, public_key_fingerprint, private_key_ciphertext, host, host_key, host_key_fingerprint, created_by_actor_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
|
|
13341
13302
|
id,
|
|
13342
13303
|
input.connectionId,
|
|
13343
|
-
|
|
13304
|
+
normalizeName(input.name),
|
|
13344
13305
|
input.publicKey.trim(),
|
|
13345
13306
|
publicFingerprint,
|
|
13346
13307
|
this.encrypt(input.privateKey),
|
|
@@ -49156,4 +49117,4 @@ data: ${JSON.stringify({ cursor: position, at: new Date().toISOString() })}
|
|
|
49156
49117
|
};
|
|
49157
49118
|
return { server, url: `http://${host2}:${server.port}/` };
|
|
49158
49119
|
}
|
|
49159
|
-
export { defaultConfig4 as defaultConfig, getConfig, loadCloudConfig, config5 as config, encodeBase32, decodeBase32, hotp, totp, verifyTotp, matchTotpCounter, totpUri, AUTH_SESSION_IDLE_TTL_MS, AUTH_SESSION_ABSOLUTE_TTL_MS, AUTH_ACTION_TOKEN_TTL_MS, AUTH_MFA_CHALLENGE_TTL_MS, AUTH_OIDC_TRANSACTION_TTL_MS, AuthenticationStore, sendAuthenticationEmail, authEncryptionKeyFile, resolveAuthEncryptionKey, sanitizeOidcReturnPath, discoverOidcProvider, beginOidcAuthorization, completeOidcAuthorization, CONTROL_PLANE_SCHEMA_VERSION, controlPlaneMigrations, AUTHORIZATION_CAPABILITIES, roleCapabilities, scopeContains, authorizeOrganization, effectiveCapabilities, OptimisticConcurrencyError, InvalidOperationTransitionError, UnsupportedSchemaVersionError, controlPlaneDatabaseFile, MAX_CONTROL_PLANE_JSON_BYTES, MAX_CONTROL_PLANE_ERROR_BYTES, sanitizeControlPlaneValue, ControlPlaneStore, searchControlPlane, API_TOKEN_DEFAULT_TTL_MS, API_TOKEN_MAX_TTL_MS, API_IDEMPOTENCY_TTL_MS, AutomationIdentityStore, TsCloudApiError, TsCloudClient, parseCompose, exportCompose, diffCompose, listComposeTemplates, getComposeTemplate, renderComposeTemplate, parseComposeCatalog, planComposeTemplateUpgrade, composeProjectName, buildComposeRuntimeCommand, buildComposeScaleCommand, buildComposeLogsCommand, buildComposeShellCommand, QueueCancellationError, QueueTimeoutError, RetryableOperationError, DurableOperationQueue, DurableQueueWorker, PreviewEnvironmentStore, PreviewEnvironmentService, DEPLOYMENT_QUEUE_KINDS, resolveQueuedDeploymentCommand, createDeploymentQueueHandlers, unsupportedVolumeCapabilities, volumeCapabilities, validateMountPath, validateAttachment, VolumeService, createVolumeQueueHandlers, DockerNamedVolumeDriver, ServerPathVolumeDriver, CloudBlockVolumeDriver, VolumeStore, synchronizeComposeVolumes, completeComposeVolumeDeletion, ComposeApplicationStore, ComposeApplicationService, releaseStrategyCapabilities, assertReleaseStrategy, ReleaseStore, ReleaseService, releaseTrafficPlan, activateImmutableRelease, rollbackImmutableRelease, RELEASE_QUEUE_KINDS, createReleaseQueueHandlers, SourceConnectionStore, SourceProviderError, GithubSourceAdapter, GitlabSourceAdapter, BitbucketSourceAdapter, GiteaSourceAdapter, createSourceAdapter, normalizeSourceEvent, processSourceWebhook, webhookEndpoint, discoverGitRefs, cloneSourceBinding, testSourceConnection, syncSourceRepositories, listSourceReferences, reconcileSourceWebhook, removeSourceWebhook, API_VERSION, openApiDocument, ApiServiceError, requestHash, AutomationApiService, createApiV1Handler, SecurityPostureStore, SECRET_PATTERNS, PreDeployScanner, scanForSecrets, formatScanResults, SecurityScannerRunner, SecretFindingScanner, TrivyImageScanner, AwsIamCapabilityScanner, generateCycloneDxSbom, generateImageSbom, attachSbomToRelease, attachVulnerabilitySummary, createReleaseProvenance, attachProvenanceToRelease, verifyArtifactSignature, securityScope, ensureDefaultSecurityPolicies, recordPreDeploySecretScan, recordSkippedSecretScan, recordDashboardHostPosture, productionChangeReview, secureContainerRelease, runtimeId2 as runtimeId, unsupportedCapabilities, capabilities2 as capabilities, normalizeRuntimeStatus, redactRuntimeConfig, ageSeconds, bytes, discoverRuntimeInventory, ecsWorkloads, lambdaWorkloads, parseDockerInspect, dockerWorkloads, DockerDiscoveryAdapter, parseSystemdRecords, systemdWorkloads, SystemdDiscoveryAdapter, EcsRuntimeAdapter, LambdaRuntimeAdapter, createRuntimeAdapters, resolveRuntimeInventory, authorizeRuntimePath, DIAGNOSTIC_PRESETS, RuntimeOperationService, RuntimeStreamRegistry, DEFAULT_TELEMETRY_POLICY, normalizeTelemetryPolicy, telemetryPolicyKey, loadTelemetryPolicy, saveTelemetryPolicy, telemetryEstimatedMonthlyCost, redactTelemetryText, redactTelemetryValue, pathTemplate, telemetryCursor, telemetryPercentile, telemetryBucketLabel, TelemetryStore, AlertStore, AlertEvaluator, isQuietHours, NotificationRouter, HealthCheckRunner, evaluateTelemetryAlertRules, normalizeScheduleExpression, nextScheduleRuns, previewSchedule, jobProviderCapability, renderServerCron, eventBridgeScheduleInput, reconcileJobObservation, desiredState, ServerCronJobAdapter, EventBridgeJobAdapter, JobProviderReconciler, synchronizeConfiguredJobs, JobService, createJobQueueHandlers, JobStore, dataServiceCapabilities, DataServiceStore, connectionGuidance, DataServiceLifecycle, createDataServiceQueueHandlers, AwsRdsDataAdapter, AwsAuroraDataAdapter, AwsElastiCacheDataAdapter, ServerDataAdapter, ContainerDataAdapter, AwsRdsTransport, AwsAuroraTransport, AwsElastiCacheTransport, BunDockerRuntime, DockerDataTransport, EncryptedDataSecretStore, SystemFleetSshTransport, SshFleetDriver, createFleetQueueHandlers, FleetStore, FleetService, zeroCapacity, capacity, PlacementStore, PlacementService, RemoteBuildService, createRemoteBuildQueueHandlers, TransportRemoteBuildDriver, createServerBuildDriver, createEcsBuildDriver, createAsgBuildDriver, RegionStore, RegionService, createRegionQueueHandlers, AwsRegionalDriver, UnavailableRegionalDriver, canonicalJson, manifestDigest, documentDigest, publicKeyFingerprint, verifyUpdateSignature, updateCompatibility, MaintenanceStore, maintenanceWindowOpen, MaintenanceService, createMaintenanceQueueHandlers, TransportPlatformMaintenanceDriver, ControlPlaneCleanupDriver, TransportDisasterRecoveryDriver,
|
|
49120
|
+
export { defaultConfig4 as defaultConfig, getConfig, loadCloudConfig, config5 as config, encodeBase32, decodeBase32, hotp, totp, verifyTotp, matchTotpCounter, totpUri, AUTH_SESSION_IDLE_TTL_MS, AUTH_SESSION_ABSOLUTE_TTL_MS, AUTH_ACTION_TOKEN_TTL_MS, AUTH_MFA_CHALLENGE_TTL_MS, AUTH_OIDC_TRANSACTION_TTL_MS, AuthenticationStore, sendAuthenticationEmail, authEncryptionKeyFile, resolveAuthEncryptionKey, sanitizeOidcReturnPath, discoverOidcProvider, beginOidcAuthorization, completeOidcAuthorization, CONTROL_PLANE_SCHEMA_VERSION, controlPlaneMigrations, AUTHORIZATION_CAPABILITIES, roleCapabilities, scopeContains, authorizeOrganization, effectiveCapabilities, OptimisticConcurrencyError, InvalidOperationTransitionError, UnsupportedSchemaVersionError, controlPlaneDatabaseFile, MAX_CONTROL_PLANE_JSON_BYTES, MAX_CONTROL_PLANE_ERROR_BYTES, sanitizeControlPlaneValue, ControlPlaneStore, searchControlPlane, API_TOKEN_DEFAULT_TTL_MS, API_TOKEN_MAX_TTL_MS, API_IDEMPOTENCY_TTL_MS, AutomationIdentityStore, TsCloudApiError, TsCloudClient, parseCompose, exportCompose, diffCompose, listComposeTemplates, getComposeTemplate, renderComposeTemplate, parseComposeCatalog, planComposeTemplateUpgrade, composeProjectName, buildComposeRuntimeCommand, buildComposeScaleCommand, buildComposeLogsCommand, buildComposeShellCommand, QueueCancellationError, QueueTimeoutError, RetryableOperationError, DurableOperationQueue, DurableQueueWorker, PreviewEnvironmentStore, PreviewEnvironmentService, DEPLOYMENT_QUEUE_KINDS, resolveQueuedDeploymentCommand, createDeploymentQueueHandlers, unsupportedVolumeCapabilities, volumeCapabilities, validateMountPath, validateAttachment, VolumeService, createVolumeQueueHandlers, DockerNamedVolumeDriver, ServerPathVolumeDriver, CloudBlockVolumeDriver, VolumeStore, synchronizeComposeVolumes, completeComposeVolumeDeletion, ComposeApplicationStore, ComposeApplicationService, releaseStrategyCapabilities, assertReleaseStrategy, ReleaseStore, ReleaseService, releaseTrafficPlan, activateImmutableRelease, rollbackImmutableRelease, RELEASE_QUEUE_KINDS, createReleaseQueueHandlers, SourceConnectionStore, SourceProviderError, GithubSourceAdapter, GitlabSourceAdapter, BitbucketSourceAdapter, GiteaSourceAdapter, createSourceAdapter, normalizeSourceEvent, processSourceWebhook, webhookEndpoint, discoverGitRefs, cloneSourceBinding, testSourceConnection, syncSourceRepositories, listSourceReferences, reconcileSourceWebhook, removeSourceWebhook, API_VERSION, openApiDocument, ApiServiceError, requestHash, AutomationApiService, createApiV1Handler, SecurityPostureStore, SECRET_PATTERNS, PreDeployScanner, scanForSecrets, formatScanResults, SecurityScannerRunner, SecretFindingScanner, TrivyImageScanner, AwsIamCapabilityScanner, generateCycloneDxSbom, generateImageSbom, attachSbomToRelease, attachVulnerabilitySummary, createReleaseProvenance, attachProvenanceToRelease, verifyArtifactSignature, securityScope, ensureDefaultSecurityPolicies, recordPreDeploySecretScan, recordSkippedSecretScan, recordDashboardHostPosture, productionChangeReview, secureContainerRelease, runtimeId2 as runtimeId, unsupportedCapabilities, capabilities2 as capabilities, normalizeRuntimeStatus, redactRuntimeConfig, ageSeconds, bytes, discoverRuntimeInventory, ecsWorkloads, lambdaWorkloads, parseDockerInspect, dockerWorkloads, DockerDiscoveryAdapter, parseSystemdRecords, systemdWorkloads, SystemdDiscoveryAdapter, EcsRuntimeAdapter, LambdaRuntimeAdapter, createRuntimeAdapters, resolveRuntimeInventory, authorizeRuntimePath, DIAGNOSTIC_PRESETS, RuntimeOperationService, RuntimeStreamRegistry, DEFAULT_TELEMETRY_POLICY, normalizeTelemetryPolicy, telemetryPolicyKey, loadTelemetryPolicy, saveTelemetryPolicy, telemetryEstimatedMonthlyCost, redactTelemetryText, redactTelemetryValue, pathTemplate, telemetryCursor, telemetryPercentile, telemetryBucketLabel, TelemetryStore, AlertStore, AlertEvaluator, isQuietHours, NotificationRouter, HealthCheckRunner, evaluateTelemetryAlertRules, normalizeScheduleExpression, nextScheduleRuns, previewSchedule, jobProviderCapability, renderServerCron, eventBridgeScheduleInput, reconcileJobObservation, desiredState, ServerCronJobAdapter, EventBridgeJobAdapter, JobProviderReconciler, synchronizeConfiguredJobs, JobService, createJobQueueHandlers, JobStore, dataServiceCapabilities, DataServiceStore, connectionGuidance, DataServiceLifecycle, createDataServiceQueueHandlers, AwsRdsDataAdapter, AwsAuroraDataAdapter, AwsElastiCacheDataAdapter, ServerDataAdapter, ContainerDataAdapter, AwsRdsTransport, AwsAuroraTransport, AwsElastiCacheTransport, BunDockerRuntime, DockerDataTransport, EncryptedDataSecretStore, SystemFleetSshTransport, SshFleetDriver, createFleetQueueHandlers, FleetStore, FleetService, zeroCapacity, capacity, PlacementStore, PlacementService, RemoteBuildService, createRemoteBuildQueueHandlers, TransportRemoteBuildDriver, createServerBuildDriver, createEcsBuildDriver, createAsgBuildDriver, RegionStore, RegionService, createRegionQueueHandlers, AwsRegionalDriver, UnavailableRegionalDriver, canonicalJson, manifestDigest, documentDigest, publicKeyFingerprint, verifyUpdateSignature, updateCompatibility, MaintenanceStore, maintenanceWindowOpen, MaintenanceService, createMaintenanceQueueHandlers, TransportPlatformMaintenanceDriver, ControlPlaneCleanupDriver, TransportDisasterRecoveryDriver, ensureDashboardActor, initializeDashboardControlPlane, synchronizeDashboardUsers, trackDashboardOperation, dashboardPageRoutes, resolveLegacyDashboardRoute, routesForDashboard, deploySite, createStaticApiOriginDependencies, deployStaticApiOrigin, verifyStaticApiOrigin, estimateStaticApiOriginMonthlyCost, createExistingStaticFullStackDependencies, generateExistingStaticFullStackTemplate, deployExistingStaticFullStack, estimateExistingStaticFullStackMonthlyCost, hashContainerContext, createContainerImageDependencies, buildAndPushContainerImage, infraEnvFromOutputs, buildFunctionEnv, deployServerlessApp, redeployServerlessApp, rollbackServerlessApp, setMaintenance, runRemoteCommand, resolveDashboardData, validateBackupDestination, BackupStore, encryptBackup, decryptBackup, backupCredentialStatus, S3BackupDestinationAdapter, BackupCoordinator, createBackupQueueHandlers, AwsDatabaseBackupSource, compressBackup, decompressBackup, BunFilesystemArchiveRuntime, FilesystemBackupSource, LogicalDatabaseBackupSource, BunDockerVolumeRuntime, DockerVolumeBackupSource, ControlPlaneBackupSource, AwsInfrastructureBackupSource, ConfigurationStore, parseDotenv, serializeDotenv, LocalEncryptedConfigurationBackend, AwsSecretsManagerConfigurationBackend, AwsSsmConfigurationBackend, ExternalConfigurationBackend, ConfigurationService, synchronizeConfiguredConfiguration, sanitizeCloudConfig, dashboardActions, resolveDashboardAction, startLocalDashboardServer };
|
|
@@ -1087,6 +1087,15 @@ class EC2Client {
|
|
|
1087
1087
|
return [];
|
|
1088
1088
|
return Array.isArray(item) ? item : [item];
|
|
1089
1089
|
}
|
|
1090
|
+
parseFirstIpv6Address(item) {
|
|
1091
|
+
for (const eni of this.parseArray(item)) {
|
|
1092
|
+
for (const entry of this.parseArray(eni?.ipv6AddressesSet?.item)) {
|
|
1093
|
+
if (entry?.ipv6Address)
|
|
1094
|
+
return entry.ipv6Address;
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
return;
|
|
1098
|
+
}
|
|
1090
1099
|
parseTags(item) {
|
|
1091
1100
|
return this.parseArray(item).map((t) => ({
|
|
1092
1101
|
Key: t.key,
|
|
@@ -1110,6 +1119,7 @@ class EC2Client {
|
|
|
1110
1119
|
} : undefined,
|
|
1111
1120
|
PrivateIpAddress: i.privateIpAddress,
|
|
1112
1121
|
PublicIpAddress: i.ipAddress,
|
|
1122
|
+
Ipv6Address: this.parseFirstIpv6Address(i.networkInterfaceSet?.item),
|
|
1113
1123
|
SubnetId: i.subnetId,
|
|
1114
1124
|
VpcId: i.vpcId,
|
|
1115
1125
|
SecurityGroups: this.parseArray(i.groupSet?.item).map((g) => ({
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
import {
|
|
13
13
|
EC2Client,
|
|
14
14
|
SSMClient
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-7m60qnc8.js";
|
|
16
16
|
import {
|
|
17
17
|
CloudFormationClient
|
|
18
18
|
} from "./chunk-4cjrg98a.js";
|
|
@@ -27,6 +27,98 @@ import {
|
|
|
27
27
|
import { readFileSync } from "node:fs";
|
|
28
28
|
import { join } from "node:path";
|
|
29
29
|
|
|
30
|
+
// src/deploy/server-dns.ts
|
|
31
|
+
function collectServerDnsDomains(sites = {}) {
|
|
32
|
+
const domains = new Set;
|
|
33
|
+
for (const site of Object.values(sites)) {
|
|
34
|
+
if (!site.domain)
|
|
35
|
+
continue;
|
|
36
|
+
if (site.redirect || site.deploy === "server" || site.start)
|
|
37
|
+
domains.add(site.domain);
|
|
38
|
+
}
|
|
39
|
+
return domains;
|
|
40
|
+
}
|
|
41
|
+
function normalizeName(name) {
|
|
42
|
+
return name.replace(/\.$/, "").toLowerCase();
|
|
43
|
+
}
|
|
44
|
+
function matchesHostname(record, zone, hostname) {
|
|
45
|
+
const recordName = normalizeName(record.name);
|
|
46
|
+
const normalizedZone = normalizeName(zone);
|
|
47
|
+
const normalizedHostname = normalizeName(hostname);
|
|
48
|
+
const relativeName = normalizedHostname === normalizedZone ? "@" : normalizedHostname.endsWith(`.${normalizedZone}`) ? normalizedHostname.slice(0, -(normalizedZone.length + 1)) : normalizedHostname;
|
|
49
|
+
return recordName === normalizedHostname || recordName === relativeName || relativeName === "@" && (recordName === "" || recordName === normalizedZone);
|
|
50
|
+
}
|
|
51
|
+
async function removeStaleServerAddressRecords(provider, zone, hostname, desiredAddress, recordType = "A") {
|
|
52
|
+
const listed = await provider.listRecords(zone);
|
|
53
|
+
if (!listed.success)
|
|
54
|
+
return [`could not list ${recordType} records: ${listed.message || "unknown provider error"}`];
|
|
55
|
+
const matching = listed.records.filter((record) => record.type === recordType && matchesHostname(record, zone, hostname));
|
|
56
|
+
const desiredIndex = matching.findIndex((record) => record.content === desiredAddress);
|
|
57
|
+
if (matching.length <= 1 || desiredIndex === -1)
|
|
58
|
+
return [];
|
|
59
|
+
const warnings = [];
|
|
60
|
+
for (const [index, record] of matching.entries()) {
|
|
61
|
+
if (index === desiredIndex)
|
|
62
|
+
continue;
|
|
63
|
+
const result = await provider.deleteRecord(zone, record);
|
|
64
|
+
if (!result.success)
|
|
65
|
+
warnings.push(`could not remove stale ${record.name} ${recordType} ${record.content}: ${result.message || "unknown provider error"}`);
|
|
66
|
+
}
|
|
67
|
+
return warnings;
|
|
68
|
+
}
|
|
69
|
+
function normalizePublicIpv6(reported) {
|
|
70
|
+
if (!reported)
|
|
71
|
+
return;
|
|
72
|
+
const trimmed = reported.trim();
|
|
73
|
+
if (!trimmed)
|
|
74
|
+
return;
|
|
75
|
+
if (!trimmed.includes("/"))
|
|
76
|
+
return trimmed;
|
|
77
|
+
const [block] = trimmed.split("/");
|
|
78
|
+
if (!block.endsWith("::"))
|
|
79
|
+
return block || undefined;
|
|
80
|
+
return `${block}1`;
|
|
81
|
+
}
|
|
82
|
+
var IPV6_EXCLUDED_HOST_LABELS = new Set(["mail", "smtp", "imap", "mx"]);
|
|
83
|
+
function hostAcceptsIpv6(fqdn) {
|
|
84
|
+
return !IPV6_EXCLUDED_HOST_LABELS.has(fqdn.split(".")[0] ?? "");
|
|
85
|
+
}
|
|
86
|
+
async function reconcileAddressRecords(options) {
|
|
87
|
+
const { provider, zone, fqdn, ipv4, ipv6, ttl = 600 } = options;
|
|
88
|
+
const report = { published: [], warnings: [] };
|
|
89
|
+
const families = [{ type: "A", content: ipv4 }];
|
|
90
|
+
if (ipv6 && hostAcceptsIpv6(fqdn))
|
|
91
|
+
families.push({ type: "AAAA", content: ipv6 });
|
|
92
|
+
for (const { type, content } of families) {
|
|
93
|
+
const result = await provider.upsertRecord(zone, { name: fqdn, type, content, ttl });
|
|
94
|
+
if (result?.success === false) {
|
|
95
|
+
report.warnings.push(`${fqdn} → ${content} failed: ${result.error || result.message || "unknown error"}`);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
report.warnings.push(...(await removeStaleServerAddressRecords(provider, zone, fqdn, content, type)).map((warning) => `${fqdn} cleanup: ${warning}`));
|
|
99
|
+
if (await verifyAddressRecord(provider, zone, fqdn, content, type))
|
|
100
|
+
report.published.push({ fqdn, type, content });
|
|
101
|
+
else
|
|
102
|
+
report.warnings.push(`${fqdn} → ${content} reported success at ${provider.name} but no matching ${type} record exists — create it manually: ${type} ${fqdn} → ${content}`);
|
|
103
|
+
}
|
|
104
|
+
return report;
|
|
105
|
+
}
|
|
106
|
+
async function verifyAddressRecord(provider, zone, fqdn, content, recordType) {
|
|
107
|
+
try {
|
|
108
|
+
if (typeof provider?.listRecords !== "function")
|
|
109
|
+
return true;
|
|
110
|
+
const listed = await provider.listRecords(zone);
|
|
111
|
+
if (!listed?.success || !Array.isArray(listed.records))
|
|
112
|
+
return true;
|
|
113
|
+
return listed.records.some((record) => {
|
|
114
|
+
const name = typeof record?.name === "string" ? record.name.replace(/\.$/, "") : "";
|
|
115
|
+
return record?.type === recordType && name === fqdn && record?.content === content;
|
|
116
|
+
});
|
|
117
|
+
} catch {
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
30
122
|
// src/drivers/shared/package-manager.ts
|
|
31
123
|
var PANTRY_PACKAGES = {
|
|
32
124
|
php: "php.net",
|
|
@@ -1752,6 +1844,7 @@ class AwsDriver {
|
|
|
1752
1844
|
return {
|
|
1753
1845
|
appInstanceId: first.id,
|
|
1754
1846
|
appPublicIp: first.publicIp,
|
|
1847
|
+
appPublicIpv6: first.publicIpv6,
|
|
1755
1848
|
sshUser: "ubuntu",
|
|
1756
1849
|
deployStoragePath: "/var/ts-cloud/staging"
|
|
1757
1850
|
};
|
|
@@ -1834,6 +1927,7 @@ class AwsDriver {
|
|
|
1834
1927
|
return {
|
|
1835
1928
|
appInstanceId: instanceId,
|
|
1836
1929
|
appPublicIp: running.PublicIpAddress,
|
|
1930
|
+
appPublicIpv6: normalizePublicIpv6(running.Ipv6Address),
|
|
1837
1931
|
sshUser: "ubuntu",
|
|
1838
1932
|
deployStoragePath: "/var/ts-cloud/staging"
|
|
1839
1933
|
};
|
|
@@ -1892,6 +1986,7 @@ class AwsDriver {
|
|
|
1892
1986
|
return {
|
|
1893
1987
|
appInstanceId: first?.id,
|
|
1894
1988
|
appPublicIp: first?.publicIp,
|
|
1989
|
+
appPublicIpv6: first?.publicIpv6,
|
|
1895
1990
|
sshUser: "ubuntu",
|
|
1896
1991
|
deployStoragePath: "/var/ts-cloud/staging"
|
|
1897
1992
|
};
|
|
@@ -1961,6 +2056,7 @@ class AwsDriver {
|
|
|
1961
2056
|
id: instance.InstanceId,
|
|
1962
2057
|
name: nameTag,
|
|
1963
2058
|
publicIp: instance.PublicIpAddress,
|
|
2059
|
+
publicIpv6: normalizePublicIpv6(instance.Ipv6Address),
|
|
1964
2060
|
privateIp: instance.PrivateIpAddress,
|
|
1965
2061
|
status: instance.State?.Name
|
|
1966
2062
|
});
|
|
@@ -2613,6 +2709,7 @@ class HetznerDriver {
|
|
|
2613
2709
|
serverId: alreadyRunning.id,
|
|
2614
2710
|
serverName: alreadyRunning.name,
|
|
2615
2711
|
publicIp: alreadyRunning.public_net.ipv4?.ip,
|
|
2712
|
+
publicIpv6: normalizePublicIpv6(alreadyRunning.public_net.ipv6?.ip),
|
|
2616
2713
|
deployStoragePath: "/var/ts-cloud/staging",
|
|
2617
2714
|
sshUser: this.sshUser
|
|
2618
2715
|
};
|
|
@@ -2660,6 +2757,7 @@ class HetznerDriver {
|
|
|
2660
2757
|
serverName: running.name,
|
|
2661
2758
|
firewallId: firewall.id,
|
|
2662
2759
|
publicIp: running.public_net.ipv4?.ip,
|
|
2760
|
+
publicIpv6: normalizePublicIpv6(running.public_net.ipv6?.ip),
|
|
2663
2761
|
deployStoragePath: "/var/ts-cloud/staging",
|
|
2664
2762
|
sshUser: this.sshUser
|
|
2665
2763
|
};
|
|
@@ -3161,6 +3259,7 @@ class HetznerDriver {
|
|
|
3161
3259
|
id: String(server.id),
|
|
3162
3260
|
name: server.name,
|
|
3163
3261
|
publicIp: server.public_net.ipv4?.ip,
|
|
3262
|
+
publicIpv6: normalizePublicIpv6(server.public_net.ipv6?.ip),
|
|
3164
3263
|
privateIp: server.private_net?.[0]?.ip,
|
|
3165
3264
|
status: server.status
|
|
3166
3265
|
});
|
|
@@ -3373,6 +3472,7 @@ ${out}`);
|
|
|
3373
3472
|
deployStoragePath: state.deployStoragePath || "/var/ts-cloud/staging",
|
|
3374
3473
|
appInstanceId: state.serverId ? String(state.serverId) : undefined,
|
|
3375
3474
|
appPublicIp: server?.public_net.ipv4?.ip || state.publicIp,
|
|
3475
|
+
appPublicIpv6: normalizePublicIpv6(server?.public_net.ipv6?.ip) || state.publicIpv6,
|
|
3376
3476
|
sshUser: state.sshUser || this.sshUser,
|
|
3377
3477
|
servicesPrivateIp: state.servicesPrivateIp
|
|
3378
3478
|
};
|
|
@@ -6198,4 +6298,4 @@ function buildCloudFrontOriginConfig(options) {
|
|
|
6198
6298
|
CustomErrorResponses: { Quantity: 0 }
|
|
6199
6299
|
};
|
|
6200
6300
|
}
|
|
6201
|
-
export { PANTRY_PROJECT_DIR, pgAdminCommand, BACKUP_RUNNER_PATH, buildBackupRestoreScript, siteInstallBase, isPhpSite, resolveSiteDeployTarget, resolveSiteKind, validateDeploymentConfig, shipsARelease, DEFAULT_RPX_CERTS_DIR, normalizeRoutePath, deriveRouteId, buildRpxConfig, buildRpxLbConfig, renderRpxLauncher, RPX_DIR, RPX_LAUNCHER_PATH, RPX_SERVICE_NAME, buildRpxProvisionScript, buildRpxFragmentRefreshScript, buildUbuntuBootstrapScript, AwsDriver, resolveHetznerLocation, HetznerClient, resolveHetznerApiToken2 as resolveHetznerApiToken, normalizeSshPublicKey, wrapCloudInitUserData, HetznerDriver, LocalBoxDriver, isBoxMode, createCloudDriver, CloudDriverFactory, cloudDrivers, planHetznerServerResize, isHetznerCapacityError, executeHetznerServerResize, buildSshArgs, sshExec, sshExecOrThrow, scpUpload, waitForSsh, waitForCloudInit, collectHetznerResizeManifest, prepareHetznerResize, verifyHetznerResize, resolveHetznerHostOptimizationPlan, buildHetznerHostOptimizationScript, applyHetznerHostOptimization, collectHetznerHostOptimizationReport, verifyHetznerHostOptimization, resizeCheckpointPath, resizeLockPath, readResizeCheckpoint, writeResizeCheckpoint, acquireResizeLock, ensureSshKey, ensureFirewall, ensureServer, serverPublicIpv4, UBUNTU_2404_AMI_PARAM, buildBoxUserData, HetznerBoxProvisioner, AwsBoxProvisioner, createBoxProvisioner, releasePaths, buildRollbackScript, resolveExecStart, buildSiteDeployScript, buildStaticSiteDeployScript, releaseTarballTmpPath, buildAwsArtifactFetch, buildLocalArtifactFetch, buildHostCleanupScript, MANAGEMENT_DASHBOARD_SITE, dashboardCredentialsFile, resolveDashboardAuth, resolveUiSource, ensureManagementDashboard, buildManagementDashboardArtifact, resolveSiteFramework, deploySiteRelease, deployAllComputeSites, reloadRpxGateway, renewRpxCertificates, MANAGED_CACHE_POLICY_OPTIMIZED, MANAGED_CACHE_POLICY_DISABLED, MANAGED_ORIGIN_REQUEST_POLICY_ALL_VIEWER, buildCloudFrontOriginConfig };
|
|
6301
|
+
export { collectServerDnsDomains, removeStaleServerAddressRecords, normalizePublicIpv6, IPV6_EXCLUDED_HOST_LABELS, hostAcceptsIpv6, reconcileAddressRecords, verifyAddressRecord, PANTRY_PROJECT_DIR, pgAdminCommand, BACKUP_RUNNER_PATH, buildBackupRestoreScript, siteInstallBase, isPhpSite, resolveSiteDeployTarget, resolveSiteKind, validateDeploymentConfig, shipsARelease, DEFAULT_RPX_CERTS_DIR, normalizeRoutePath, deriveRouteId, buildRpxConfig, buildRpxLbConfig, renderRpxLauncher, RPX_DIR, RPX_LAUNCHER_PATH, RPX_SERVICE_NAME, buildRpxProvisionScript, buildRpxFragmentRefreshScript, buildUbuntuBootstrapScript, AwsDriver, resolveHetznerLocation, HetznerClient, resolveHetznerApiToken2 as resolveHetznerApiToken, normalizeSshPublicKey, wrapCloudInitUserData, HetznerDriver, LocalBoxDriver, isBoxMode, createCloudDriver, CloudDriverFactory, cloudDrivers, planHetznerServerResize, isHetznerCapacityError, executeHetznerServerResize, buildSshArgs, sshExec, sshExecOrThrow, scpUpload, waitForSsh, waitForCloudInit, collectHetznerResizeManifest, prepareHetznerResize, verifyHetznerResize, resolveHetznerHostOptimizationPlan, buildHetznerHostOptimizationScript, applyHetznerHostOptimization, collectHetznerHostOptimizationReport, verifyHetznerHostOptimization, resizeCheckpointPath, resizeLockPath, readResizeCheckpoint, writeResizeCheckpoint, acquireResizeLock, ensureSshKey, ensureFirewall, ensureServer, serverPublicIpv4, UBUNTU_2404_AMI_PARAM, buildBoxUserData, HetznerBoxProvisioner, AwsBoxProvisioner, createBoxProvisioner, releasePaths, buildRollbackScript, resolveExecStart, buildSiteDeployScript, buildStaticSiteDeployScript, releaseTarballTmpPath, buildAwsArtifactFetch, buildLocalArtifactFetch, buildHostCleanupScript, MANAGEMENT_DASHBOARD_SITE, dashboardCredentialsFile, resolveDashboardAuth, resolveUiSource, ensureManagementDashboard, buildManagementDashboardArtifact, resolveSiteFramework, deploySiteRelease, deployAllComputeSites, reloadRpxGateway, renewRpxCertificates, MANAGED_CACHE_POLICY_OPTIMIZED, MANAGED_CACHE_POLICY_DISABLED, MANAGED_ORIGIN_REQUEST_POLICY_ALL_VIEWER, buildCloudFrontOriginConfig };
|
package/dist/deploy/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
buildAndPushContainerImage,
|
|
3
3
|
buildFunctionEnv,
|
|
4
|
-
collectServerDnsDomains,
|
|
5
4
|
createContainerImageDependencies,
|
|
6
5
|
createExistingStaticFullStackDependencies,
|
|
7
6
|
createStaticApiOriginDependencies,
|
|
@@ -19,7 +18,6 @@ import {
|
|
|
19
18
|
infraEnvFromOutputs,
|
|
20
19
|
initializeDashboardControlPlane,
|
|
21
20
|
redeployServerlessApp,
|
|
22
|
-
removeStaleServerAddressRecords,
|
|
23
21
|
resolveDashboardAction,
|
|
24
22
|
resolveDashboardData,
|
|
25
23
|
resolveLegacyDashboardRoute,
|
|
@@ -32,7 +30,7 @@ import {
|
|
|
32
30
|
synchronizeDashboardUsers,
|
|
33
31
|
trackDashboardOperation,
|
|
34
32
|
verifyStaticApiOrigin
|
|
35
|
-
} from "../chunk-
|
|
33
|
+
} from "../chunk-4erbrg3e.js";
|
|
36
34
|
import {
|
|
37
35
|
deleteStaticSite,
|
|
38
36
|
deployStaticSite,
|
|
@@ -53,21 +51,28 @@ import"../chunk-50jpda9q.js";
|
|
|
53
51
|
import"../chunk-he9a874b.js";
|
|
54
52
|
import"../chunk-gttvakpv.js";
|
|
55
53
|
import {
|
|
54
|
+
IPV6_EXCLUDED_HOST_LABELS,
|
|
56
55
|
MANAGEMENT_DASHBOARD_SITE,
|
|
57
56
|
buildManagementDashboardArtifact,
|
|
57
|
+
collectServerDnsDomains,
|
|
58
58
|
dashboardCredentialsFile,
|
|
59
59
|
ensureManagementDashboard,
|
|
60
|
+
hostAcceptsIpv6,
|
|
60
61
|
isPhpSite,
|
|
62
|
+
normalizePublicIpv6,
|
|
63
|
+
reconcileAddressRecords,
|
|
64
|
+
removeStaleServerAddressRecords,
|
|
61
65
|
resolveDashboardAuth,
|
|
62
66
|
resolveSiteDeployTarget,
|
|
63
67
|
resolveSiteKind,
|
|
64
68
|
resolveUiSource,
|
|
65
69
|
shipsARelease,
|
|
66
70
|
siteInstallBase,
|
|
67
|
-
validateDeploymentConfig
|
|
68
|
-
|
|
71
|
+
validateDeploymentConfig,
|
|
72
|
+
verifyAddressRecord
|
|
73
|
+
} from "../chunk-ztbn47we.js";
|
|
69
74
|
import"../chunk-1qjyqrc5.js";
|
|
70
|
-
import"../chunk-
|
|
75
|
+
import"../chunk-7m60qnc8.js";
|
|
71
76
|
import"../chunk-4cjrg98a.js";
|
|
72
77
|
import"../chunk-hpv68b4a.js";
|
|
73
78
|
import"../chunk-32e7ya18.js";
|
|
@@ -76,6 +81,7 @@ import"../chunk-zqtpg06c.js";
|
|
|
76
81
|
import"../chunk-v0bahtg2.js";
|
|
77
82
|
export {
|
|
78
83
|
verifyStaticApiOrigin,
|
|
84
|
+
verifyAddressRecord,
|
|
79
85
|
validateDeploymentConfig,
|
|
80
86
|
uploadStaticFiles,
|
|
81
87
|
trackDashboardOperation,
|
|
@@ -97,10 +103,13 @@ export {
|
|
|
97
103
|
resolveDashboardAction,
|
|
98
104
|
removeStaleServerAddressRecords,
|
|
99
105
|
redeployServerlessApp,
|
|
106
|
+
reconcileAddressRecords,
|
|
107
|
+
normalizePublicIpv6,
|
|
100
108
|
isPhpSite,
|
|
101
109
|
invalidateCache,
|
|
102
110
|
initializeDashboardControlPlane,
|
|
103
111
|
infraEnvFromOutputs,
|
|
112
|
+
hostAcceptsIpv6,
|
|
104
113
|
hashContainerContext,
|
|
105
114
|
generateStaticSiteTemplate,
|
|
106
115
|
generateExternalDnsStaticSiteTemplate,
|
|
@@ -129,5 +138,6 @@ export {
|
|
|
129
138
|
buildFunctionEnv,
|
|
130
139
|
buildAndPushServerlessImage,
|
|
131
140
|
buildAndPushContainerImage,
|
|
132
|
-
MANAGEMENT_DASHBOARD_SITE
|
|
141
|
+
MANAGEMENT_DASHBOARD_SITE,
|
|
142
|
+
IPV6_EXCLUDED_HOST_LABELS
|
|
133
143
|
};
|
|
@@ -9,8 +9,82 @@ interface ServerSite {
|
|
|
9
9
|
export declare function collectServerDnsDomains(sites?: Record<string, ServerSite>): Set<string>;
|
|
10
10
|
/**
|
|
11
11
|
* A compute deployment owns one address per managed hostname. After an upsert,
|
|
12
|
-
* remove only duplicate
|
|
13
|
-
* of the desired address and leaving every unrelated record untouched.
|
|
12
|
+
* remove only duplicate address records for that exact hostname, preserving one
|
|
13
|
+
* copy of the desired address and leaving every unrelated record untouched.
|
|
14
|
+
*
|
|
15
|
+
* `recordType` selects the family. It used to be hardcoded to 'A', which meant
|
|
16
|
+
* a dual-stack box could clean up its stale IPv4 records but accumulated stale
|
|
17
|
+
* AAAA ones forever — and a stale AAAA is worse than a stale A, because
|
|
18
|
+
* dual-stack clients prefer IPv6 and would keep landing on the dead address.
|
|
14
19
|
*/
|
|
15
|
-
export declare function removeStaleServerAddressRecords(provider: DnsProvider, zone: string, hostname: string, desiredAddress: string): Promise<string[]>;
|
|
20
|
+
export declare function removeStaleServerAddressRecords(provider: DnsProvider, zone: string, hostname: string, desiredAddress: string, recordType?: 'A' | 'AAAA'): Promise<string[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Turn whatever a provider reports as a box's IPv6 into an address an AAAA
|
|
23
|
+
* record can point at.
|
|
24
|
+
*
|
|
25
|
+
* Providers disagree on what "the server's IPv6" means. Hetzner hands out a
|
|
26
|
+
* routed /64 and reports the block (`2a01:4f8:c014:6186::/64`) while the
|
|
27
|
+
* interface actually holds `::1` inside it; AWS reports a plain address per
|
|
28
|
+
* network interface. Publishing a block verbatim gives an AAAA record nothing
|
|
29
|
+
* answers on, which is the kind of failure that only shows up for the fraction
|
|
30
|
+
* of visitors whose network prefers IPv6 — so every driver runs its value
|
|
31
|
+
* through here rather than reinventing the narrowing.
|
|
32
|
+
*
|
|
33
|
+
* A plain address passes through unchanged.
|
|
34
|
+
*/
|
|
35
|
+
export declare function normalizePublicIpv6(reported: string | undefined | null): string | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Hostname labels that must stay IPv4-only.
|
|
38
|
+
*
|
|
39
|
+
* A box typically runs its mail server on IPv4 alone, and its IPv6 address
|
|
40
|
+
* usually has no PTR — both of which make an AAAA on a mail host actively
|
|
41
|
+
* harmful: senders try the v6 address first, find nothing listening (or get
|
|
42
|
+
* rejected for the missing reverse record) and defer the message. Web traffic
|
|
43
|
+
* has no such constraint, so the exclusion is per-host rather than per-zone.
|
|
44
|
+
*/
|
|
45
|
+
export declare const IPV6_EXCLUDED_HOST_LABELS: ReadonlySet<string>;
|
|
46
|
+
/** Whether `fqdn` should get an AAAA record pointing at the box. */
|
|
47
|
+
export declare function hostAcceptsIpv6(fqdn: string): boolean;
|
|
48
|
+
export interface AddressRecordReport {
|
|
49
|
+
/** Records confirmed present at the provider after the write. */
|
|
50
|
+
published: Array<{
|
|
51
|
+
fqdn: string;
|
|
52
|
+
type: 'A' | 'AAAA';
|
|
53
|
+
content: string;
|
|
54
|
+
}>;
|
|
55
|
+
/** Anything the caller should surface: failed writes, unverified writes, stale-record cleanup problems. */
|
|
56
|
+
warnings: string[];
|
|
57
|
+
}
|
|
58
|
+
interface ReconcileAddressRecordsOptions {
|
|
59
|
+
provider: DnsProvider;
|
|
60
|
+
zone: string;
|
|
61
|
+
fqdn: string;
|
|
62
|
+
ipv4: string;
|
|
63
|
+
/** Omit when the box has no public IPv6; the AAAA pass is then skipped entirely. */
|
|
64
|
+
ipv6?: string;
|
|
65
|
+
ttl?: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Point one hostname at a box on every address family the box actually has.
|
|
69
|
+
*
|
|
70
|
+
* Shared by every driver and by the framework's deploy command so the rules
|
|
71
|
+
* live in one place: upsert, then remove the *other* records of that family for
|
|
72
|
+
* the same hostname (a leftover address round-robins traffic to a dead host —
|
|
73
|
+
* and a stale AAAA is the worse of the two, because dual-stack clients prefer
|
|
74
|
+
* IPv6), then verify against the provider rather than trusting the write.
|
|
75
|
+
*/
|
|
76
|
+
export declare function reconcileAddressRecords(options: ReconcileAddressRecordsOptions): Promise<AddressRecordReport>;
|
|
77
|
+
/**
|
|
78
|
+
* Best-effort post-write check that the record exists at the provider.
|
|
79
|
+
*
|
|
80
|
+
* Returns true when the provider offers no list API or the listing itself
|
|
81
|
+
* fails: verification must never turn a possibly-good write into a false
|
|
82
|
+
* alarm. It exists to catch phantom successes — an upsert that reported OK
|
|
83
|
+
* while editing the wrong record — at providers that can list their zone.
|
|
84
|
+
*
|
|
85
|
+
* The listing is deliberately untyped. Typed listings map to endpoints like
|
|
86
|
+
* Porkbun's retrieveByNameType, whose subdomain-less form returns apex records
|
|
87
|
+
* only, which made verification blind to every non-apex record.
|
|
88
|
+
*/
|
|
89
|
+
export declare function verifyAddressRecord(provider: DnsProvider, zone: string, fqdn: string, content: string, recordType: 'A' | 'AAAA'): Promise<boolean>;
|
|
16
90
|
export {};
|
|
@@ -6,6 +6,14 @@ export interface HetznerDriverState {
|
|
|
6
6
|
serverName?: string;
|
|
7
7
|
firewallId?: number;
|
|
8
8
|
publicIp?: string;
|
|
9
|
+
/**
|
|
10
|
+
* The box's public IPv6 address, already narrowed from the routed /64 the
|
|
11
|
+
* API reports to the address the interface actually holds. Recorded so a
|
|
12
|
+
* deploy can publish AAAA records alongside the A records without having to
|
|
13
|
+
* call the Hetzner API again — attach-mode tenants read this state and never
|
|
14
|
+
* see the server object at all.
|
|
15
|
+
*/
|
|
16
|
+
publicIpv6?: string;
|
|
9
17
|
deployStoragePath?: string;
|
|
10
18
|
sshUser?: string;
|
|
11
19
|
/** Fleet: network/LB ids + the services box private IP, for deploy + teardown. */
|
package/dist/drivers/index.js
CHANGED
|
@@ -68,9 +68,9 @@ import {
|
|
|
68
68
|
waitForSsh,
|
|
69
69
|
wrapCloudInitUserData,
|
|
70
70
|
writeResizeCheckpoint
|
|
71
|
-
} from "../chunk-
|
|
71
|
+
} from "../chunk-ztbn47we.js";
|
|
72
72
|
import"../chunk-1qjyqrc5.js";
|
|
73
|
-
import"../chunk-
|
|
73
|
+
import"../chunk-7m60qnc8.js";
|
|
74
74
|
import"../chunk-4cjrg98a.js";
|
|
75
75
|
import"../chunk-wj3s95p9.js";
|
|
76
76
|
import"../chunk-zqtpg06c.js";
|
package/dist/index.d.ts
CHANGED
|
@@ -30,7 +30,8 @@ export { keyMatchesFilters, migrateObjectStorage, remapKey } from './object-stor
|
|
|
30
30
|
export type { MigrateEndpoint, MigrateError, MigrateOptions, MigratePlanItem, MigrateProgress, MigrateResult, MigrateVerification, } from './object-storage/migrate';
|
|
31
31
|
export * from './ssl';
|
|
32
32
|
export { deployStaticSite, deployStaticSiteFull, uploadStaticFiles, invalidateCache, deleteStaticSite, generateStaticSiteTemplate, deployStaticSiteWithExternalDns, deployStaticSiteWithExternalDnsFull, generateExternalDnsStaticSiteTemplate, deploySite, resolveSiteDeployTarget, resolveSiteKind, validateDeploymentConfig, buildAndPushServerlessImage, buildFunctionEnv, deployServerlessApp, infraEnvFromOutputs, redeployServerlessApp, rollbackServerlessApp, runRemoteCommand, setMaintenance, buildManagementDashboardArtifact, dashboardCredentialsFile, ensureManagementDashboard, MANAGEMENT_DASHBOARD_SITE, resolveDashboardAuth, resolveUiSource, } from './deploy';
|
|
33
|
-
export { collectServerDnsDomains, removeStaleServerAddressRecords } from './deploy/server-dns';
|
|
33
|
+
export { collectServerDnsDomains, hostAcceptsIpv6, IPV6_EXCLUDED_HOST_LABELS, normalizePublicIpv6, reconcileAddressRecords, removeStaleServerAddressRecords, verifyAddressRecord, } from './deploy/server-dns';
|
|
34
|
+
export type { AddressRecordReport } from './deploy/server-dns';
|
|
34
35
|
export type { EnsureDashboardLogger, ResolvedDashboardAuth, StaticSiteConfig, DeployResult, UploadOptions, ExternalDnsStaticSiteConfig, ExternalDnsDeployResult, DeploySiteConfig, DeploySiteResult, StaticSiteDnsProvider, SiteDeployKind, DeploymentValidationResult, BuildImageOptions, BuiltImage, CodeSource, DeployServerlessOptions, ResolvedContext, } from './deploy';
|
|
35
36
|
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';
|
|
36
37
|
export type { CreateCloudDriverOptions } from './drivers/factory';
|
package/dist/index.js
CHANGED
|
@@ -139,7 +139,6 @@ import {
|
|
|
139
139
|
capabilities,
|
|
140
140
|
capacity,
|
|
141
141
|
cloneSourceBinding,
|
|
142
|
-
collectServerDnsDomains,
|
|
143
142
|
completeComposeVolumeDeletion,
|
|
144
143
|
completeOidcAuthorization,
|
|
145
144
|
composeProjectName,
|
|
@@ -234,7 +233,6 @@ import {
|
|
|
234
233
|
releaseStrategyCapabilities,
|
|
235
234
|
releaseTrafficPlan,
|
|
236
235
|
removeSourceWebhook,
|
|
237
|
-
removeStaleServerAddressRecords,
|
|
238
236
|
renderComposeTemplate,
|
|
239
237
|
renderServerCron,
|
|
240
238
|
requestHash,
|
|
@@ -285,7 +283,7 @@ import {
|
|
|
285
283
|
volumeCapabilities,
|
|
286
284
|
webhookEndpoint,
|
|
287
285
|
zeroCapacity
|
|
288
|
-
} from "./chunk-
|
|
286
|
+
} from "./chunk-4erbrg3e.js";
|
|
289
287
|
import {
|
|
290
288
|
deleteStaticSite,
|
|
291
289
|
deployStaticSite,
|
|
@@ -367,6 +365,7 @@ import {
|
|
|
367
365
|
CloudDriverFactory,
|
|
368
366
|
HetznerClient,
|
|
369
367
|
HetznerDriver,
|
|
368
|
+
IPV6_EXCLUDED_HOST_LABELS,
|
|
370
369
|
MANAGEMENT_DASHBOARD_SITE,
|
|
371
370
|
buildHostCleanupScript,
|
|
372
371
|
buildManagementDashboardArtifact,
|
|
@@ -375,6 +374,7 @@ import {
|
|
|
375
374
|
buildStaticSiteDeployScript,
|
|
376
375
|
buildUbuntuBootstrapScript,
|
|
377
376
|
cloudDrivers,
|
|
377
|
+
collectServerDnsDomains,
|
|
378
378
|
createCloudDriver,
|
|
379
379
|
dashboardCredentialsFile,
|
|
380
380
|
deployAllComputeSites,
|
|
@@ -383,7 +383,11 @@ import {
|
|
|
383
383
|
ensureManagementDashboard,
|
|
384
384
|
ensureServer,
|
|
385
385
|
ensureSshKey,
|
|
386
|
+
hostAcceptsIpv6,
|
|
387
|
+
normalizePublicIpv6,
|
|
386
388
|
normalizeSshPublicKey,
|
|
389
|
+
reconcileAddressRecords,
|
|
390
|
+
removeStaleServerAddressRecords,
|
|
387
391
|
resolveDashboardAuth,
|
|
388
392
|
resolveExecStart,
|
|
389
393
|
resolveHetznerApiToken,
|
|
@@ -395,10 +399,11 @@ import {
|
|
|
395
399
|
sshExec,
|
|
396
400
|
sshExecOrThrow,
|
|
397
401
|
validateDeploymentConfig,
|
|
402
|
+
verifyAddressRecord,
|
|
398
403
|
waitForCloudInit,
|
|
399
404
|
waitForSsh,
|
|
400
405
|
wrapCloudInitUserData
|
|
401
|
-
} from "./chunk-
|
|
406
|
+
} from "./chunk-ztbn47we.js";
|
|
402
407
|
import {
|
|
403
408
|
ABTestManager,
|
|
404
409
|
AI,
|
|
@@ -816,7 +821,7 @@ import {
|
|
|
816
821
|
import {
|
|
817
822
|
EC2Client,
|
|
818
823
|
SSMClient
|
|
819
|
-
} from "./chunk-
|
|
824
|
+
} from "./chunk-7m60qnc8.js";
|
|
820
825
|
import {
|
|
821
826
|
CloudFormationClient
|
|
822
827
|
} from "./chunk-4cjrg98a.js";
|
|
@@ -5124,6 +5129,7 @@ export {
|
|
|
5124
5129
|
verifyTotp,
|
|
5125
5130
|
verifyMediaAccessToken,
|
|
5126
5131
|
verifyArtifactSignature,
|
|
5132
|
+
verifyAddressRecord,
|
|
5127
5133
|
validateTemplateSize,
|
|
5128
5134
|
validateTemplate,
|
|
5129
5135
|
validateResourceLimits,
|
|
@@ -5265,6 +5271,7 @@ export {
|
|
|
5265
5271
|
recordDashboardHostPosture,
|
|
5266
5272
|
reconcileSourceWebhook,
|
|
5267
5273
|
reconcileJobObservation,
|
|
5274
|
+
reconcileAddressRecords,
|
|
5268
5275
|
quickHash,
|
|
5269
5276
|
queueManagementManager,
|
|
5270
5277
|
publicKeyFingerprint,
|
|
@@ -5301,6 +5308,7 @@ export {
|
|
|
5301
5308
|
normalizeSourceEvent,
|
|
5302
5309
|
normalizeScheduleExpression,
|
|
5303
5310
|
normalizeRuntimeStatus,
|
|
5311
|
+
normalizePublicIpv6,
|
|
5304
5312
|
nextScheduleRuns,
|
|
5305
5313
|
networkSecurityManager,
|
|
5306
5314
|
needsRenewal,
|
|
@@ -5345,6 +5353,7 @@ export {
|
|
|
5345
5353
|
infraEnvFromOutputs,
|
|
5346
5354
|
imageScanningManager,
|
|
5347
5355
|
hotp,
|
|
5356
|
+
hostAcceptsIpv6,
|
|
5348
5357
|
healthCheckManager,
|
|
5349
5358
|
hashString,
|
|
5350
5359
|
hashManifest,
|
|
@@ -5773,6 +5782,7 @@ export {
|
|
|
5773
5782
|
InvalidOperationTransitionError,
|
|
5774
5783
|
InfrastructureGenerator,
|
|
5775
5784
|
ImageScanningManager,
|
|
5785
|
+
IPV6_EXCLUDED_HOST_LABELS,
|
|
5776
5786
|
IAMClient,
|
|
5777
5787
|
HetznerDriver,
|
|
5778
5788
|
HetznerClient,
|