@caelo-cms/provisioning 0.10.61 → 0.10.64
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/caddy/Caddyfile.production +7 -0
- package/caddy/Caddyfile.staging +7 -0
- package/dist/admin-internal-answer.d.ts +12 -0
- package/dist/admin-internal-answer.d.ts.map +1 -0
- package/dist/admin-internal-answer.js +32 -0
- package/dist/admin-internal-answer.js.map +1 -0
- package/dist/admin-internal-google.d.ts +4 -0
- package/dist/admin-internal-google.d.ts.map +1 -0
- package/dist/admin-internal-google.js +161 -0
- package/dist/admin-internal-google.js.map +1 -0
- package/dist/admin-internal-self-hosted.d.ts +30 -0
- package/dist/admin-internal-self-hosted.d.ts.map +1 -0
- package/dist/admin-internal-self-hosted.js +92 -0
- package/dist/admin-internal-self-hosted.js.map +1 -0
- package/dist/admin-internal.d.ts +33 -12
- package/dist/admin-internal.d.ts.map +1 -1
- package/dist/admin-internal.js +27 -159
- package/dist/admin-internal.js.map +1 -1
- package/dist/agent/command.d.ts +7 -0
- package/dist/agent/command.d.ts.map +1 -1
- package/dist/agent/command.js +1 -0
- package/dist/agent/command.js.map +1 -1
- package/dist/agent/lock.d.ts +13 -1
- package/dist/agent/lock.d.ts.map +1 -1
- package/dist/agent/lock.js +62 -5
- package/dist/agent/lock.js.map +1 -1
- package/dist/agent/run.d.ts +5 -1
- package/dist/agent/run.d.ts.map +1 -1
- package/dist/agent/run.js +8 -1
- package/dist/agent/run.js.map +1 -1
- package/dist/agent-db.js +192 -90
- package/dist/caddy.d.ts.map +1 -1
- package/dist/caddy.js +11 -1
- package/dist/caddy.js.map +1 -1
- package/dist/cli-routing.js +1 -1
- package/dist/cli-routing.js.map +1 -1
- package/dist/cli.js +95 -38
- package/dist/cli.js.map +1 -1
- package/dist/compose.d.ts +7 -0
- package/dist/compose.d.ts.map +1 -1
- package/dist/compose.js +5 -0
- package/dist/compose.js.map +1 -1
- package/dist/converge-job-gcp.d.ts.map +1 -1
- package/dist/converge-job-gcp.js +10 -7
- package/dist/converge-job-gcp.js.map +1 -1
- package/dist/converge-job-preflight.d.ts +21 -0
- package/dist/converge-job-preflight.d.ts.map +1 -0
- package/dist/converge-job-preflight.js +111 -0
- package/dist/converge-job-preflight.js.map +1 -0
- package/dist/converge-job.d.ts +8 -2
- package/dist/converge-job.d.ts.map +1 -1
- package/dist/converge-job.js +14 -0
- package/dist/converge-job.js.map +1 -1
- package/dist/gateway-credentials.d.ts +5 -3
- package/dist/gateway-credentials.d.ts.map +1 -1
- package/dist/gateway-credentials.js +5 -8
- package/dist/gateway-credentials.js.map +1 -1
- package/dist/gcloud.d.ts +29 -0
- package/dist/gcloud.d.ts.map +1 -1
- package/dist/gcloud.js +66 -0
- package/dist/gcloud.js.map +1 -1
- package/dist/infra-contract.d.ts +1 -1
- package/dist/infra-contract.d.ts.map +1 -1
- package/dist/infra-contract.js +10 -1
- package/dist/infra-contract.js.map +1 -1
- package/dist/install-job.d.ts +3 -1
- package/dist/install-job.d.ts.map +1 -1
- package/dist/install-job.js.map +1 -1
- package/dist/install-state.d.ts +10 -0
- package/dist/install-state.d.ts.map +1 -1
- package/dist/install-state.js +12 -0
- package/dist/install-state.js.map +1 -1
- package/dist/lifecycle.d.ts +12 -0
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +113 -28
- package/dist/lifecycle.js.map +1 -1
- package/dist/mcp-iap.d.ts +2 -0
- package/dist/mcp-iap.d.ts.map +1 -1
- package/dist/mcp-iap.js +50 -17
- package/dist/mcp-iap.js.map +1 -1
- package/dist/owner-reset.d.ts +16 -19
- package/dist/owner-reset.d.ts.map +1 -1
- package/dist/owner-reset.js +92 -19
- package/dist/owner-reset.js.map +1 -1
- package/dist/preview-plan.d.ts +71 -0
- package/dist/preview-plan.d.ts.map +1 -0
- package/dist/preview-plan.js +168 -0
- package/dist/preview-plan.js.map +1 -0
- package/dist/public-role-isolation.d.ts +2 -0
- package/dist/public-role-isolation.d.ts.map +1 -1
- package/dist/public-role-isolation.js +9 -3
- package/dist/public-role-isolation.js.map +1 -1
- package/dist/release-contract.d.ts.map +1 -1
- package/dist/release-contract.js +4 -0
- package/dist/release-contract.js.map +1 -1
- package/dist/self-hosted-internal-secret.d.ts +27 -0
- package/dist/self-hosted-internal-secret.d.ts.map +1 -0
- package/dist/self-hosted-internal-secret.js +69 -0
- package/dist/self-hosted-internal-secret.js.map +1 -0
- package/dist/self-hosted-release.d.ts +3 -1
- package/dist/self-hosted-release.d.ts.map +1 -1
- package/dist/self-hosted-release.js +6 -2
- package/dist/self-hosted-release.js.map +1 -1
- package/dist/self-hosted-upgrade.d.ts +13 -1
- package/dist/self-hosted-upgrade.d.ts.map +1 -1
- package/dist/self-hosted-upgrade.js +26 -2
- package/dist/self-hosted-upgrade.js.map +1 -1
- package/dist/stack-converge.d.ts +5 -2
- package/dist/stack-converge.d.ts.map +1 -1
- package/dist/stack-converge.js +73 -8
- package/dist/stack-converge.js.map +1 -1
- package/dist/staging-admin.d.ts +4 -1
- package/dist/staging-admin.d.ts.map +1 -1
- package/dist/staging-admin.js.map +1 -1
- package/dist/state-backend.d.ts +3 -2
- package/dist/state-backend.d.ts.map +1 -1
- package/dist/state-backend.js +3 -2
- package/dist/state-backend.js.map +1 -1
- package/dist/state-command.d.ts +17 -0
- package/dist/state-command.d.ts.map +1 -1
- package/dist/state-command.js +34 -5
- package/dist/state-command.js.map +1 -1
- package/dist/state-migrate.d.ts +14 -3
- package/dist/state-migrate.d.ts.map +1 -1
- package/dist/state-migrate.js +31 -7
- package/dist/state-migrate.js.map +1 -1
- package/dist/state-pulumi.d.ts +0 -2
- package/dist/state-pulumi.d.ts.map +1 -1
- package/dist/state-pulumi.js +19 -20
- package/dist/state-pulumi.js.map +1 -1
- package/dist/static-security-headers.d.ts +86 -0
- package/dist/static-security-headers.d.ts.map +1 -0
- package/dist/static-security-headers.js +126 -0
- package/dist/static-security-headers.js.map +1 -0
- package/dist/static-svg-gcp.d.ts +28 -0
- package/dist/static-svg-gcp.d.ts.map +1 -0
- package/dist/static-svg-gcp.js +106 -0
- package/dist/static-svg-gcp.js.map +1 -0
- package/dist/upgrade/app-roll.d.ts +3 -0
- package/dist/upgrade/app-roll.d.ts.map +1 -1
- package/dist/upgrade/app-roll.js +12 -5
- package/dist/upgrade/app-roll.js.map +1 -1
- package/dist/upgrade/backup.d.ts +2 -0
- package/dist/upgrade/backup.d.ts.map +1 -1
- package/dist/upgrade/backup.js +5 -4
- package/dist/upgrade/backup.js.map +1 -1
- package/dist/upgrade/converge.d.ts +7 -0
- package/dist/upgrade/converge.d.ts.map +1 -1
- package/dist/upgrade/converge.js +19 -7
- package/dist/upgrade/converge.js.map +1 -1
- package/dist/upgrade/gcp-lookup.d.ts +38 -3
- package/dist/upgrade/gcp-lookup.d.ts.map +1 -1
- package/dist/upgrade/gcp-lookup.js +31 -9
- package/dist/upgrade/gcp-lookup.js.map +1 -1
- package/dist/upgrade/health.d.ts +31 -5
- package/dist/upgrade/health.d.ts.map +1 -1
- package/dist/upgrade/health.js +114 -25
- package/dist/upgrade/health.js.map +1 -1
- package/dist/upgrade/release-images.d.ts +17 -0
- package/dist/upgrade/release-images.d.ts.map +1 -1
- package/dist/upgrade/release-images.js +23 -12
- package/dist/upgrade/release-images.js.map +1 -1
- package/dist/upgrade/reporter.d.ts +2 -0
- package/dist/upgrade/reporter.d.ts.map +1 -1
- package/dist/upgrade/reporter.js +1 -0
- package/dist/upgrade/reporter.js.map +1 -1
- package/dist/upgrade/upgrade.d.ts +11 -1
- package/dist/upgrade/upgrade.d.ts.map +1 -1
- package/dist/upgrade/upgrade.js +5 -2
- package/dist/upgrade/upgrade.js.map +1 -1
- package/dist/upgrader-gcp.d.ts +12 -2
- package/dist/upgrader-gcp.d.ts.map +1 -1
- package/dist/upgrader-gcp.js +22 -13
- package/dist/upgrader-gcp.js.map +1 -1
- package/dist/upgrader-iam-preflight.d.ts +16 -3
- package/dist/upgrader-iam-preflight.d.ts.map +1 -1
- package/dist/upgrader-iam-preflight.js +9 -4
- package/dist/upgrader-iam-preflight.js.map +1 -1
- package/dist/upgrader-job.d.ts.map +1 -1
- package/dist/upgrader-job.js +10 -8
- package/dist/upgrader-job.js.map +1 -1
- package/dist/upgrader-reporter.d.ts.map +1 -1
- package/dist/upgrader-reporter.js +1 -0
- package/dist/upgrader-reporter.js.map +1 -1
- package/dist/wizards/gcp-pulumi.d.ts +70 -23
- package/dist/wizards/gcp-pulumi.d.ts.map +1 -1
- package/dist/wizards/gcp-pulumi.js +118 -39
- package/dist/wizards/gcp-pulumi.js.map +1 -1
- package/dist/wizards/gcp.d.ts.map +1 -1
- package/dist/wizards/gcp.js +67 -11
- package/dist/wizards/gcp.js.map +1 -1
- package/package.json +2 -2
- package/src/admin-internal-answer.ts +43 -0
- package/src/admin-internal-google.ts +187 -0
- package/src/admin-internal-self-hosted.test.ts +70 -0
- package/src/admin-internal-self-hosted.ts +128 -0
- package/src/admin-internal.ts +59 -174
- package/src/admin-memory.test.ts +1 -0
- package/src/agent/command.ts +3 -0
- package/src/agent/lock-config.test.ts +57 -2
- package/src/agent/lock.ts +68 -5
- package/src/agent/run.test.ts +18 -1
- package/src/agent/run.ts +17 -6
- package/src/caddy-redirects.test.ts +1 -0
- package/src/caddy.ts +12 -0
- package/src/cli-routing.ts +1 -1
- package/src/cli.ts +102 -44
- package/src/compose.ts +12 -0
- package/src/converge-job-gcp.ts +16 -11
- package/src/converge-job-preflight.test.ts +108 -0
- package/src/converge-job-preflight.ts +124 -0
- package/src/converge-job.test.ts +50 -0
- package/src/converge-job.ts +38 -2
- package/src/gateway-credentials.test.ts +4 -3
- package/src/gateway-credentials.ts +6 -10
- package/src/gateway-env-isolation.test.ts +1 -0
- package/src/gcloud.test.ts +93 -1
- package/src/gcloud.ts +82 -0
- package/src/index.test.ts +38 -1
- package/src/infra-contract.test.ts +4 -3
- package/src/infra-contract.ts +10 -1
- package/src/install-job.ts +5 -2
- package/src/install-state.ts +13 -0
- package/src/lifecycle.ts +134 -28
- package/src/mcp-iap.test.ts +66 -5
- package/src/mcp-iap.ts +55 -17
- package/src/owner-reset-providers.test.ts +370 -0
- package/src/owner-reset.test.ts +2 -2
- package/src/owner-reset.ts +108 -19
- package/src/preview-plan.test.ts +233 -0
- package/src/preview-plan.ts +226 -0
- package/src/public-role-isolation.test.ts +13 -2
- package/src/public-role-isolation.ts +14 -4
- package/src/release-contract.ts +4 -0
- package/src/self-hosted-compose.test.ts +25 -0
- package/src/self-hosted-internal-secret.test.ts +61 -0
- package/src/self-hosted-internal-secret.ts +80 -0
- package/src/self-hosted-release.ts +10 -3
- package/src/self-hosted-upgrade.test.ts +35 -1
- package/src/self-hosted-upgrade.ts +40 -3
- package/src/stack-contract.test.ts +1 -0
- package/src/stack-converge.test.ts +89 -5
- package/src/stack-converge.ts +81 -8
- package/src/staging-admin.test.ts +1 -1
- package/src/staging-admin.ts +2 -1
- package/src/state-backend.ts +3 -2
- package/src/state-command.test.ts +31 -0
- package/src/state-command.ts +35 -8
- package/src/state-migrate.test.ts +58 -7
- package/src/state-migrate.ts +48 -10
- package/src/state-pulumi.ts +20 -21
- package/src/static-security-headers.test.ts +124 -0
- package/src/static-security-headers.ts +154 -0
- package/src/static-svg-gcp.test.ts +133 -0
- package/src/static-svg-gcp.ts +140 -0
- package/src/upgrade/app-roll.ts +18 -7
- package/src/upgrade/backup.ts +14 -5
- package/src/upgrade/converge.ts +25 -7
- package/src/upgrade/gcp-lookup.test.ts +80 -1
- package/src/upgrade/gcp-lookup.ts +61 -11
- package/src/upgrade/health.test.ts +132 -8
- package/src/upgrade/health.ts +169 -31
- package/src/upgrade/release-images.test.ts +17 -0
- package/src/upgrade/release-images.ts +26 -14
- package/src/upgrade/reporter.ts +3 -0
- package/src/upgrade/upgrade.test.ts +137 -8
- package/src/upgrade/upgrade.ts +14 -2
- package/src/upgrader-gcp.ts +28 -13
- package/src/upgrader-iam-preflight.test.ts +6 -3
- package/src/upgrader-iam-preflight.ts +26 -5
- package/src/upgrader-job.ts +14 -6
- package/src/upgrader-reporter.ts +1 -0
- package/src/wizards/gcp-pulumi.test.ts +1 -1
- package/src/wizards/gcp-pulumi.ts +147 -38
- package/src/wizards/gcp.ts +89 -9
- package/src/wizards/stack-work-dir.test.ts +175 -0
- package/stacks/aws/index.ts +40 -0
- package/stacks/azure/index.ts +22 -1
- package/stacks/gcp/README.md +4 -0
- package/stacks/gcp/index.ts +6 -2
- package/stacks/gcp/Pulumi.production.yaml +0 -16
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
2
|
+
/**
|
|
3
|
+
* What a Pulumi preview would change, per resource (#737). `state migrate`
|
|
4
|
+
* used to refuse with "a preview shows 36 change(s)" and the installer ran
|
|
5
|
+
* `pulumi up` blind, so an operator could not tell an IAM tweak from a
|
|
6
|
+
* Cloud SQL replace without assembling a `pulumi preview --diff` by hand.
|
|
7
|
+
*
|
|
8
|
+
* {@link collectPreviewSteps} turns the Automation API's engine events into
|
|
9
|
+
* {@link PlannedStep}s; {@link formatPlan} groups them (creates / updates /
|
|
10
|
+
* REPLACES / DELETES) and names the resources whose replace or delete loses
|
|
11
|
+
* data; {@link writePlanFile} keeps the full diff next to the install.
|
|
12
|
+
*/
|
|
13
|
+
import { writeFileSync } from "node:fs";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
/**
|
|
16
|
+
* The step ops that make one planned change. A replace also emits
|
|
17
|
+
* `create-replacement` / `delete-replaced` sub-steps for the same URN; they
|
|
18
|
+
* are the same change and are not counted again.
|
|
19
|
+
*/
|
|
20
|
+
const PLANNED = {
|
|
21
|
+
create: "create",
|
|
22
|
+
update: "update",
|
|
23
|
+
replace: "replace",
|
|
24
|
+
delete: "delete",
|
|
25
|
+
import: "import",
|
|
26
|
+
"import-replacement": "replace",
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Resources whose replace or delete loses data, by Pulumi type token, with
|
|
30
|
+
* the name an operator knows them by. Replacing any of them is never a
|
|
31
|
+
* "state catching up" detail.
|
|
32
|
+
*/
|
|
33
|
+
const DATA_BEARING = {
|
|
34
|
+
"gcp:sql/databaseInstance:DatabaseInstance": "Cloud SQL instance (all site data)",
|
|
35
|
+
"gcp:sql/database:Database": "Cloud SQL database",
|
|
36
|
+
"gcp:storage/bucket:Bucket": "Cloud Storage bucket (media, published site or state)",
|
|
37
|
+
"gcp:secretmanager/secret:Secret": "Secret Manager secret",
|
|
38
|
+
"gcp:secretmanager/secretVersion:SecretVersion": "Secret Manager secret value",
|
|
39
|
+
"gcp:firebase/project:Project": "Firebase project",
|
|
40
|
+
"gcp:firebase/hostingSite:HostingSite": "Firebase Hosting site",
|
|
41
|
+
"gcp:kms/keyRing:KeyRing": "Cloud KMS key ring",
|
|
42
|
+
"gcp:kms/cryptoKey:CryptoKey": "Cloud KMS key (decrypts the install's state)",
|
|
43
|
+
"gcp:bigquery/dataset:Dataset": "BigQuery dataset (edge logs)",
|
|
44
|
+
};
|
|
45
|
+
/** What a data-bearing resource holds, or null for any other type. */
|
|
46
|
+
export function dataBearingKind(type) {
|
|
47
|
+
return DATA_BEARING[type] ?? null;
|
|
48
|
+
}
|
|
49
|
+
/** Whether `step` would destroy data: a replace or delete of a data-bearing resource. */
|
|
50
|
+
export function losesData(step) {
|
|
51
|
+
return (step.op === "replace" || step.op === "delete") && dataBearingKind(step.type) !== null;
|
|
52
|
+
}
|
|
53
|
+
/** Whether the plan replaces or deletes anything. */
|
|
54
|
+
export function hasReplaceOrDelete(steps) {
|
|
55
|
+
return steps.some((s) => s.op === "replace" || s.op === "delete");
|
|
56
|
+
}
|
|
57
|
+
/** The URN's last `::` segment: the name the program gave the resource. */
|
|
58
|
+
function urnName(urn) {
|
|
59
|
+
return urn.split("::").at(-1) ?? urn;
|
|
60
|
+
}
|
|
61
|
+
/** A fresh {@link PreviewCollector}. */
|
|
62
|
+
export function collectPreviewSteps() {
|
|
63
|
+
const byUrn = new Map();
|
|
64
|
+
return {
|
|
65
|
+
onEvent: (event) => {
|
|
66
|
+
const m = event.resourcePreEvent?.metadata;
|
|
67
|
+
if (!m)
|
|
68
|
+
return;
|
|
69
|
+
const op = PLANNED[m.op];
|
|
70
|
+
// The stack resource itself and providers are bookkeeping, not cloud changes.
|
|
71
|
+
if (!op || m.type === "pulumi:pulumi:Stack" || m.type.startsWith("pulumi:providers:")) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const prior = byUrn.get(m.urn);
|
|
75
|
+
if (prior?.op === "replace")
|
|
76
|
+
return;
|
|
77
|
+
byUrn.set(m.urn, {
|
|
78
|
+
op,
|
|
79
|
+
type: m.type,
|
|
80
|
+
name: urnName(m.urn),
|
|
81
|
+
urn: m.urn,
|
|
82
|
+
diffs: [...(m.diffs ?? [])],
|
|
83
|
+
replaceReasons: op === "replace" ? [...(m.keys ?? [])] : [],
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
steps: () => [...byUrn.values()],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const GROUPS = [
|
|
90
|
+
{ op: "delete", title: "DELETES" },
|
|
91
|
+
{ op: "replace", title: "REPLACES (delete + create)" },
|
|
92
|
+
{ op: "update", title: "Updates in place" },
|
|
93
|
+
{ op: "create", title: "Creates" },
|
|
94
|
+
{ op: "import", title: "Imports" },
|
|
95
|
+
];
|
|
96
|
+
/** One line for `step`: type, name, what changes and why it is replaced. */
|
|
97
|
+
function stepLine(step) {
|
|
98
|
+
const kind = dataBearingKind(step.type);
|
|
99
|
+
const data = losesData(step) && kind ? ` <-- LOSES DATA: ${kind}` : "";
|
|
100
|
+
const why = step.op === "replace" && step.replaceReasons.length > 0
|
|
101
|
+
? ` (replaced because ${step.replaceReasons.join(", ")} changes)`
|
|
102
|
+
: step.diffs.length > 0 && step.op !== "create"
|
|
103
|
+
? ` (${step.diffs.join(", ")})`
|
|
104
|
+
: "";
|
|
105
|
+
return ` ${step.type} ${step.name}${why}${data}`;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* The plan as grouped lines, destructive groups first. Empty plan: one line
|
|
109
|
+
* saying so.
|
|
110
|
+
*/
|
|
111
|
+
export function formatPlan(steps) {
|
|
112
|
+
if (steps.length === 0)
|
|
113
|
+
return ["The preview plans no changes."];
|
|
114
|
+
const lines = [];
|
|
115
|
+
for (const g of GROUPS) {
|
|
116
|
+
const inGroup = steps.filter((s) => s.op === g.op);
|
|
117
|
+
if (inGroup.length === 0)
|
|
118
|
+
continue;
|
|
119
|
+
lines.push(`${g.title} (${inGroup.length}):`, ...inGroup.map(stepLine));
|
|
120
|
+
}
|
|
121
|
+
const lost = steps.filter(losesData);
|
|
122
|
+
if (lost.length > 0) {
|
|
123
|
+
lines.push("", `${lost.length} of these would destroy data: ${lost.map((s) => `${dataBearingKind(s.type)} ${s.name}`).join("; ")}.`);
|
|
124
|
+
}
|
|
125
|
+
return lines;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Write the full plan (every step with every changed property) to a file in
|
|
129
|
+
* `installRoot` and return its path. Names and property paths only, never
|
|
130
|
+
* values: the file holds no secret.
|
|
131
|
+
*
|
|
132
|
+
* @param label what the preview was for, part of the file name (`state-migrate`, `installer`)
|
|
133
|
+
*/
|
|
134
|
+
export function writePlanFile(installRoot, label, steps, now = new Date()) {
|
|
135
|
+
const path = join(installRoot, `plan-${label}-${now.toISOString().replace(/[:.]/g, "-")}.txt`);
|
|
136
|
+
const body = [
|
|
137
|
+
`Pulumi preview (${label}), ${now.toISOString()}: ${steps.length} change(s)`,
|
|
138
|
+
"",
|
|
139
|
+
...formatPlan(steps),
|
|
140
|
+
"",
|
|
141
|
+
"Every step:",
|
|
142
|
+
...steps.map((s) => [
|
|
143
|
+
`- ${s.op} ${s.urn}`,
|
|
144
|
+
...(s.replaceReasons.length > 0
|
|
145
|
+
? [` replaced because: ${s.replaceReasons.join(", ")}`]
|
|
146
|
+
: []),
|
|
147
|
+
...(s.diffs.length > 0 ? [` changes: ${s.diffs.join(", ")}`] : []),
|
|
148
|
+
].join("\n")),
|
|
149
|
+
"",
|
|
150
|
+
].join("\n");
|
|
151
|
+
writeFileSync(path, body, { mode: 0o600 });
|
|
152
|
+
return path;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* The gate for `steps`. A replace or delete is asked about whenever someone
|
|
156
|
+
* can answer. Without a terminal (`--non-interactive`, the install job)
|
|
157
|
+
* replaces and deletes of resources without data go ahead, already listed;
|
|
158
|
+
* a data-bearing one is refused: no flag stands in for that yes.
|
|
159
|
+
*/
|
|
160
|
+
export function planGate(steps, opts) {
|
|
161
|
+
if (!hasReplaceOrDelete(steps))
|
|
162
|
+
return { kind: "proceed" };
|
|
163
|
+
const lost = steps.some(losesData);
|
|
164
|
+
if (opts.interactive)
|
|
165
|
+
return { kind: "confirm", losesData: lost };
|
|
166
|
+
return lost ? { kind: "refuse" } : { kind: "proceed" };
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=preview-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview-plan.js","sourceRoot":"","sources":["../src/preview-plan.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAoBjC;;;;GAIG;AACH,MAAM,OAAO,GAAiD;IAC5D,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,oBAAoB,EAAE,SAAS;CAChC,CAAC;AAEF;;;;GAIG;AACH,MAAM,YAAY,GAAqC;IACrD,2CAA2C,EAAE,oCAAoC;IACjF,2BAA2B,EAAE,oBAAoB;IACjD,2BAA2B,EAAE,uDAAuD;IACpF,iCAAiC,EAAE,uBAAuB;IAC1D,+CAA+C,EAAE,6BAA6B;IAC9E,8BAA8B,EAAE,kBAAkB;IAClD,sCAAsC,EAAE,uBAAuB;IAC/D,yBAAyB,EAAE,oBAAoB;IAC/C,6BAA6B,EAAE,8CAA8C;IAC7E,8BAA8B,EAAE,8BAA8B;CAC/D,CAAC;AAEF,sEAAsE;AACtE,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACpC,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,SAAS,CAAC,IAAiB;IACzC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;AAChG,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,kBAAkB,CAAC,KAA6B;IAC9D,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;AACpE,CAAC;AAED,2EAA2E;AAC3E,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AACvC,CAAC;AAYD,wCAAwC;AACxC,MAAM,UAAU,mBAAmB;IACjC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC7C,OAAO;QACL,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,MAAM,CAAC,GAAG,KAAK,CAAC,gBAAgB,EAAE,QAAQ,CAAC;YAC3C,IAAI,CAAC,CAAC;gBAAE,OAAO;YACf,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzB,8EAA8E;YAC9E,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,qBAAqB,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACtF,OAAO;YACT,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,KAAK,EAAE,EAAE,KAAK,SAAS;gBAAE,OAAO;YACpC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE;gBACf,EAAE;gBACF,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;gBACpB,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC3B,cAAc,EAAE,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;aAC5D,CAAC,CAAC;QACL,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAkE;IAC5E,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;IAClC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,4BAA4B,EAAE;IACtD,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE;IAC3C,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;IAClC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;CACnC,CAAC;AAEF,4EAA4E;AAC5E,SAAS,QAAQ,CAAC,IAAiB;IACjC,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,MAAM,GAAG,GACP,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;QACrD,CAAC,CAAC,sBAAsB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW;QACjE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,KAAK,QAAQ;YAC7C,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YAC/B,CAAC,CAAC,EAAE,CAAC;IACX,OAAO,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAA6B;IACtD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,+BAA+B,CAAC,CAAC;IACjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACnD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,MAAM,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CACR,EAAE,EACF,GAAG,IAAI,CAAC,MAAM,iCAAiC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACrH,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,WAAmB,EACnB,KAAa,EACb,KAA6B,EAC7B,MAAY,IAAI,IAAI,EAAE;IAEtB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,KAAK,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG;QACX,mBAAmB,KAAK,MAAM,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,MAAM,YAAY;QAC5E,EAAE;QACF,GAAG,UAAU,CAAC,KAAK,CAAC;QACpB,EAAE;QACF,aAAa;QACb,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACjB;YACE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE;YACpB,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;gBAC7B,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1D,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACtE,CAAC,IAAI,CAAC,IAAI,CAAC,CACb;QACD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC;AAWD;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CACtB,KAA6B,EAC7B,IAAuC;IAEvC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAClE,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AACzD,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type GcloudRunner, type Sleep } from "./gcloud-retry.js";
|
|
2
2
|
import type { EnsureOutcome } from "./runtime-secrets.js";
|
|
3
|
+
import { type GcloudCredentials } from "./upgrade/gcp-lookup.js";
|
|
3
4
|
/** The gcloud call that leaves `public_role` with no database roles. */
|
|
4
5
|
export declare function revokePublicRoleMembershipsArgs(target: {
|
|
5
6
|
readonly projectId: string;
|
|
@@ -12,6 +13,7 @@ export declare function revokePublicRoleMembershipsArgs(target: {
|
|
|
12
13
|
export declare function revokePublicRoleMemberships(install: {
|
|
13
14
|
readonly projectId: string;
|
|
14
15
|
readonly env: string;
|
|
16
|
+
readonly credentials: GcloudCredentials;
|
|
15
17
|
}, deps?: {
|
|
16
18
|
readonly run?: GcloudRunner;
|
|
17
19
|
readonly sleep?: Sleep;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-role-isolation.d.ts","sourceRoot":"","sources":["../src/public-role-isolation.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAE,KAAK,YAAY,EAA2B,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"public-role-isolation.d.ts","sourceRoot":"","sources":["../src/public-role-isolation.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAE,KAAK,YAAY,EAA2B,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,KAAK,iBAAiB,EAAiB,MAAM,yBAAyB,CAAC;AAEhF,wEAAwE;AACxE,wBAAgB,+BAA+B,CAAC,MAAM,EAAE;IACtD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,GAAG,MAAM,EAAE,CAYX;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE;IACP,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,EAAE,iBAAiB,CAAC;CACzC,EACD,IAAI,GAAE;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAO,GACjE,OAAO,CAAC,aAAa,CAAC,CAyBxB"}
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
import { findSqlInstance } from "./gateway-credentials.js";
|
|
32
32
|
import { gcloud as defaultGcloud } from "./gcloud.js";
|
|
33
33
|
import { realSleep, runWithRetry } from "./gcloud-retry.js";
|
|
34
|
+
import { lookupFailure } from "./upgrade/gcp-lookup.js";
|
|
34
35
|
/** The gcloud call that leaves `public_role` with no database roles. */
|
|
35
36
|
export function revokePublicRoleMembershipsArgs(target) {
|
|
36
37
|
return [
|
|
@@ -52,10 +53,15 @@ export function revokePublicRoleMembershipsArgs(target) {
|
|
|
52
53
|
export async function revokePublicRoleMemberships(install, deps = {}) {
|
|
53
54
|
const run = deps.run ?? defaultGcloud;
|
|
54
55
|
const id = "public_role database role memberships";
|
|
55
|
-
const
|
|
56
|
-
if (
|
|
57
|
-
return {
|
|
56
|
+
const lookup = await findSqlInstance(install, { run });
|
|
57
|
+
if (lookup.status !== "found") {
|
|
58
|
+
return {
|
|
59
|
+
id,
|
|
60
|
+
status: "failed",
|
|
61
|
+
error: lookupFailure(lookup, "Cloud SQL instance", install.credentials),
|
|
62
|
+
};
|
|
58
63
|
}
|
|
64
|
+
const sqlInstance = lookup.name;
|
|
59
65
|
const r = await runWithRetry(run, deps.sleep ?? realSleep, revokePublicRoleMembershipsArgs({ projectId: install.projectId, sqlInstance }));
|
|
60
66
|
if (!r.ok) {
|
|
61
67
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public-role-isolation.js","sourceRoot":"","sources":["../src/public-role-isolation.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAqB,SAAS,EAAE,YAAY,EAAc,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"public-role-isolation.js","sourceRoot":"","sources":["../src/public-role-isolation.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAqB,SAAS,EAAE,YAAY,EAAc,MAAM,mBAAmB,CAAC;AAE3F,OAAO,EAA0B,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEhF,wEAAwE;AACxE,MAAM,UAAU,+BAA+B,CAAC,MAG/C;IACC,OAAO;QACL,KAAK;QACL,OAAO;QACP,cAAc;QACd,aAAa;QACb,cAAc,MAAM,CAAC,WAAW,EAAE;QAClC,iBAAiB;QACjB,yBAAyB;QACzB,aAAa,MAAM,CAAC,SAAS,EAAE;QAC/B,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAIC,EACD,OAAgE,EAAE;IAElE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,aAAa,CAAC;IACtC,MAAM,EAAE,GAAG,uCAAuC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO;YACL,EAAE;YACF,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,aAAa,CAAC,MAAM,EAAE,oBAAoB,EAAE,OAAO,CAAC,WAAW,CAAC;SACxE,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,YAAY,CAC1B,GAAG,EACH,IAAI,CAAC,KAAK,IAAI,SAAS,EACvB,+BAA+B,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,CAC/E,CAAC;IACF,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACV,OAAO;YACL,EAAE;YACF,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,wEAAwE,WAAW,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,4FAA4F;SAC3M,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,6BAA6B,WAAW,EAAE,EAAE,CAAC;AACvF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release-contract.d.ts","sourceRoot":"","sources":["../src/release-contract.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,WAAW,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"release-contract.d.ts","sourceRoot":"","sources":["../src/release-contract.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,WAAW,CAAC;AAEjD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EA4BjD,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGzD"}
|
package/dist/release-contract.js
CHANGED
|
@@ -52,6 +52,10 @@ export const INFRA_CONTRACT_PATHS = [
|
|
|
52
52
|
"packages/provisioning/src/audit-job-setup.ts",
|
|
53
53
|
// #819 — the converge job, its database login and the admin's grant on it.
|
|
54
54
|
"packages/provisioning/src/converge-job-setup.ts",
|
|
55
|
+
// #891 — the edge security headers the stacks attach, and the converge's
|
|
56
|
+
// SVG backfill + CDN purge on `gcp`.
|
|
57
|
+
"packages/provisioning/src/static-security-headers.ts",
|
|
58
|
+
"packages/provisioning/src/static-svg-gcp.ts",
|
|
55
59
|
];
|
|
56
60
|
/**
|
|
57
61
|
* Whether a changed repo-relative path can alter the infrastructure
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"release-contract.js","sourceRoot":"","sources":["../src/release-contract.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC;AAEjD;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,+BAA+B;IAC/B,6CAA6C;IAC7C,6CAA6C;IAC7C,8CAA8C;IAC9C,8CAA8C;IAC9C,wCAAwC;IACxC,yEAAyE;IACzE,oEAAoE;IACpE,mDAAmD;IACnD,+CAA+C;IAC/C,sCAAsC;IACtC,+CAA+C;IAC/C,qEAAqE;IACrE,uDAAuD;IACvD,0CAA0C;IAC1C,uEAAuE;IACvE,uDAAuD;IACvD,6CAA6C;IAC7C,wEAAwE;IACxE,UAAU;IACV,8CAA8C;IAC9C,2EAA2E;IAC3E,iDAAiD;
|
|
1
|
+
{"version":3,"file":"release-contract.js","sourceRoot":"","sources":["../src/release-contract.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC;AAEjD;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,+BAA+B;IAC/B,6CAA6C;IAC7C,6CAA6C;IAC7C,8CAA8C;IAC9C,8CAA8C;IAC9C,wCAAwC;IACxC,yEAAyE;IACzE,oEAAoE;IACpE,mDAAmD;IACnD,+CAA+C;IAC/C,sCAAsC;IACtC,+CAA+C;IAC/C,qEAAqE;IACrE,uDAAuD;IACvD,0CAA0C;IAC1C,uEAAuE;IACvE,uDAAuD;IACvD,6CAA6C;IAC7C,wEAAwE;IACxE,UAAU;IACV,8CAA8C;IAC9C,2EAA2E;IAC3E,iDAAiD;IACjD,yEAAyE;IACzE,qCAAqC;IACrC,sDAAsD;IACtD,6CAA6C;CAC9C,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7E,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** `<caeloDir>/internal-secret.json`. */
|
|
2
|
+
export declare function internalSecretPath(caeloDir: string): string;
|
|
3
|
+
/**
|
|
4
|
+
* The install's internal secret, or null when the file does not exist.
|
|
5
|
+
* Throws on a malformed file rather than guessing a value: a wrong secret
|
|
6
|
+
* would only surface later as every internal call failing its signature.
|
|
7
|
+
*/
|
|
8
|
+
export declare function readInternalSecret(caeloDir: string): string | null;
|
|
9
|
+
/** Write a new internal secret (`init`, or {@link ensureInternalSecret}). */
|
|
10
|
+
export declare function writeInternalSecret(caeloDir: string, secret: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* The secret the Compose file gives the admin. An install whose directory
|
|
13
|
+
* has none (made by a CLI that did not write the file, or with it deleted)
|
|
14
|
+
* gets one created here, and `report` says so.
|
|
15
|
+
*
|
|
16
|
+
* This is creation of a missing secret, not a fallback (CLAUDE.md §2): no
|
|
17
|
+
* stored state depends on a previous value — before #770 the admin never
|
|
18
|
+
* received the secret, so no token was ever signed with it — and the value
|
|
19
|
+
* is written to disk before the Compose file that uses it, so every later
|
|
20
|
+
* render and every host-side command read the same one. Same pattern as
|
|
21
|
+
* the `caeloSecretKek` back-fill in the CLI's `emitConfig`.
|
|
22
|
+
*/
|
|
23
|
+
export declare function ensureInternalSecret(caeloDir: string, deps: {
|
|
24
|
+
readonly randomSecret: () => string;
|
|
25
|
+
readonly report: (line: string) => void;
|
|
26
|
+
}): string;
|
|
27
|
+
//# sourceMappingURL=self-hosted-internal-secret.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-hosted-internal-secret.d.ts","sourceRoot":"","sources":["../src/self-hosted-internal-secret.ts"],"names":[],"mappings":"AAoBA,yCAAyC;AACzC,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBlE;AAED,6EAA6E;AAC7E,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAG1E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE;IAAE,QAAQ,CAAC,YAAY,EAAE,MAAM,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAAE,GACrF,MAAM,CASR"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
2
|
+
/**
|
|
3
|
+
* #770 — the self-hosted install's `/api/internal/*` secret,
|
|
4
|
+
* `.caelo/internal-secret.json` (`{ "secret": "<hex>" }`).
|
|
5
|
+
*
|
|
6
|
+
* `init` has written it since P15.1, but until #770 nothing handed it to the
|
|
7
|
+
* admin container, so the admin's internal endpoints answered "not set" on
|
|
8
|
+
* every self-hosted install. The Compose file now carries it as the admin's
|
|
9
|
+
* `CAELO_INTERNAL_SECRET`, and the host-side commands that call those
|
|
10
|
+
* endpoints (`owner-reset`) sign their tokens with the same file.
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { writePrivateFile } from "./private-file.js";
|
|
15
|
+
/** The admin refuses shorter secrets (apps/admin internal-jwt.ts). */
|
|
16
|
+
const MIN_LENGTH = 32;
|
|
17
|
+
/** `<caeloDir>/internal-secret.json`. */
|
|
18
|
+
export function internalSecretPath(caeloDir) {
|
|
19
|
+
return join(caeloDir, "internal-secret.json");
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The install's internal secret, or null when the file does not exist.
|
|
23
|
+
* Throws on a malformed file rather than guessing a value: a wrong secret
|
|
24
|
+
* would only surface later as every internal call failing its signature.
|
|
25
|
+
*/
|
|
26
|
+
export function readInternalSecret(caeloDir) {
|
|
27
|
+
const path = internalSecretPath(caeloDir);
|
|
28
|
+
if (!existsSync(path))
|
|
29
|
+
return null;
|
|
30
|
+
let secret;
|
|
31
|
+
try {
|
|
32
|
+
secret = JSON.parse(readFileSync(path, "utf8")).secret;
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
throw new Error(`${path} is not valid JSON (${String(e)}); fix it or delete it and run \`cms-provision up\`.`);
|
|
36
|
+
}
|
|
37
|
+
if (typeof secret !== "string" || secret.length < MIN_LENGTH) {
|
|
38
|
+
throw new Error(`${path} has no "secret" of at least ${MIN_LENGTH} characters; fix it or delete it and run \`cms-provision up\`.`);
|
|
39
|
+
}
|
|
40
|
+
return secret;
|
|
41
|
+
}
|
|
42
|
+
/** Write a new internal secret (`init`, or {@link ensureInternalSecret}). */
|
|
43
|
+
export function writeInternalSecret(caeloDir, secret) {
|
|
44
|
+
if (secret.length < MIN_LENGTH)
|
|
45
|
+
throw new Error(`internal secret shorter than ${MIN_LENGTH}`);
|
|
46
|
+
writePrivateFile(internalSecretPath(caeloDir), JSON.stringify({ secret }, null, 2));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The secret the Compose file gives the admin. An install whose directory
|
|
50
|
+
* has none (made by a CLI that did not write the file, or with it deleted)
|
|
51
|
+
* gets one created here, and `report` says so.
|
|
52
|
+
*
|
|
53
|
+
* This is creation of a missing secret, not a fallback (CLAUDE.md §2): no
|
|
54
|
+
* stored state depends on a previous value — before #770 the admin never
|
|
55
|
+
* received the secret, so no token was ever signed with it — and the value
|
|
56
|
+
* is written to disk before the Compose file that uses it, so every later
|
|
57
|
+
* render and every host-side command read the same one. Same pattern as
|
|
58
|
+
* the `caeloSecretKek` back-fill in the CLI's `emitConfig`.
|
|
59
|
+
*/
|
|
60
|
+
export function ensureInternalSecret(caeloDir, deps) {
|
|
61
|
+
const existing = readInternalSecret(caeloDir);
|
|
62
|
+
if (existing !== null)
|
|
63
|
+
return existing;
|
|
64
|
+
const secret = deps.randomSecret();
|
|
65
|
+
writeInternalSecret(caeloDir, secret);
|
|
66
|
+
deps.report(`Created ${internalSecretPath(caeloDir)} — this install had no internal secret; the admin now gets it as CAELO_INTERNAL_SECRET (needed by \`cms-provision owner-reset\`).`);
|
|
67
|
+
return secret;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=self-hosted-internal-secret.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self-hosted-internal-secret.js","sourceRoot":"","sources":["../src/self-hosted-internal-secret.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,sEAAsE;AACtE,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,yCAAyC;AACzC,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAA0B,CAAC,MAAM,CAAC;IACnF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,uBAAuB,MAAM,CAAC,CAAC,CAAC,sDAAsD,CAC9F,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,gCAAgC,UAAU,gEAAgE,CAClH,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,MAAc;IAClE,IAAI,MAAM,CAAC,MAAM,GAAG,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAC;IAC9F,gBAAgB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,IAAsF;IAEtF,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;IACnC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CACT,WAAW,kBAAkB,CAAC,QAAQ,CAAC,mIAAmI,CAC3K,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -13,7 +13,8 @@ export interface HostRunner {
|
|
|
13
13
|
/**
|
|
14
14
|
* Run `argv` to completion. With `stdoutPath`, stdout streams into that
|
|
15
15
|
* file (mode 600) instead of being captured — used for database dumps.
|
|
16
|
-
* With `stdinPath`, that file is the process's stdin (restores)
|
|
16
|
+
* With `stdinPath`, that file is the process's stdin (restores); with
|
|
17
|
+
* `stdinText`, that text is (secrets that must not appear in argv). With
|
|
17
18
|
* `inherit`, stdout + stderr go to the terminal (long pulls and starts
|
|
18
19
|
* the operator should watch) and come back empty.
|
|
19
20
|
*/
|
|
@@ -25,6 +26,7 @@ export interface HostRunOptions {
|
|
|
25
26
|
readonly env?: Readonly<Record<string, string>>;
|
|
26
27
|
readonly stdoutPath?: string;
|
|
27
28
|
readonly stdinPath?: string;
|
|
29
|
+
readonly stdinText?: string;
|
|
28
30
|
readonly inherit?: boolean;
|
|
29
31
|
}
|
|
30
32
|
/** The real runner: Bun.spawn; a missing binary is exit code 127, not a throw. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self-hosted-release.d.ts","sourceRoot":"","sources":["../src/self-hosted-release.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAiC,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAUjF,oCAAoC;AACpC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB
|
|
1
|
+
{"version":3,"file":"self-hosted-release.d.ts","sourceRoot":"","sources":["../src/self-hosted-release.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,7 +27,11 @@ export const bunHostRunner = {
|
|
|
27
27
|
try {
|
|
28
28
|
const proc = Bun.spawn([...argv], {
|
|
29
29
|
...(opts?.env ? { env: { ...process.env, ...opts.env } } : {}),
|
|
30
|
-
stdin: opts?.
|
|
30
|
+
stdin: opts?.stdinText !== undefined
|
|
31
|
+
? Buffer.from(opts.stdinText)
|
|
32
|
+
: opts?.stdinPath
|
|
33
|
+
? Bun.file(opts.stdinPath)
|
|
34
|
+
: "ignore",
|
|
31
35
|
stdout: opts?.stdoutPath ? Bun.file(opts.stdoutPath) : opts?.inherit ? "inherit" : "pipe",
|
|
32
36
|
stderr: opts?.inherit ? "inherit" : "pipe",
|
|
33
37
|
});
|
|
@@ -130,7 +134,7 @@ export async function resolveVerifiedRelease(tag, deps) {
|
|
|
130
134
|
ok: false,
|
|
131
135
|
error: "cosign is required to verify the Caelo release image signatures and was not found on PATH.\n" +
|
|
132
136
|
"Install it (https://docs.sigstore.dev/cosign/system_config/installation/ — e.g. `brew install cosign`,\n" +
|
|
133
|
-
"or the release binary for Linux), then re-run.
|
|
137
|
+
"or the signed release binary for Linux), then re-run.",
|
|
134
138
|
};
|
|
135
139
|
}
|
|
136
140
|
for (const service of RELEASE_SERVICES) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self-hosted-release.js","sourceRoot":"","sources":["../src/self-hosted-release.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,YAAY,EAAsB,MAAM,cAAc,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"self-hosted-release.js","sourceRoot":"","sources":["../src/self-hosted-release.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,18 @@ export interface SelfHostedUpgradeDeps {
|
|
|
27
27
|
* (`convergeSelfHostedRoles`); drops roles a release retired (#635).
|
|
28
28
|
*/
|
|
29
29
|
readonly convergeRoles: () => Promise<ConvergeOutcome>;
|
|
30
|
+
/**
|
|
31
|
+
* Re-writes the Caddyfile from the install's config + domains table and
|
|
32
|
+
* reloads Caddy (#891): the edge headers (the SVG CSP, nosniff) live in
|
|
33
|
+
* the Caddyfile this release's generator writes, so an upgrade that only
|
|
34
|
+
* rolled the containers would leave the install on the old edge config.
|
|
35
|
+
*/
|
|
36
|
+
readonly refreshCaddy: () => Promise<{
|
|
37
|
+
ok: true;
|
|
38
|
+
} | {
|
|
39
|
+
ok: false;
|
|
40
|
+
error: string;
|
|
41
|
+
}>;
|
|
30
42
|
readonly fetchImpl?: typeof fetch;
|
|
31
43
|
readonly sleep?: (ms: number) => Promise<void>;
|
|
32
44
|
readonly now?: () => Date;
|
|
@@ -60,7 +72,7 @@ export type SelfHostedUpgradeResult = {
|
|
|
60
72
|
/** Whether the previous release is running again (true when nothing had changed yet). */
|
|
61
73
|
readonly previousRunning: boolean;
|
|
62
74
|
};
|
|
63
|
-
type UpgradeStage = "target" | "verify" | "converge" | "backup" | "pull" | "migrate" | "roles" | "roll-admin" | "roll-gateway";
|
|
75
|
+
type UpgradeStage = "target" | "verify" | "converge" | "backup" | "pull" | "migrate" | "roles" | "roll-admin" | "roll-gateway" | "caddy";
|
|
64
76
|
/** Where an install from before #696 keeps its original Compose file during the move. */
|
|
65
77
|
export declare function legacyComposePath(caeloDir: string): string;
|
|
66
78
|
/** Where the media of an install from before #696 lives: the checkout's admin cwd. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"self-hosted-upgrade.d.ts","sourceRoot":"","sources":["../src/self-hosted-upgrade.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"self-hosted-upgrade.d.ts","sourceRoot":"","sources":["../src/self-hosted-upgrade.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,9 @@
|
|
|
20
20
|
* was retired in (run-order.ts): past it, nothing running uses it;
|
|
21
21
|
* 6. recreate the admin, health-check it (`/_caelo/health`, which proves
|
|
22
22
|
* the DB pool and roles); then the gateway (`/healthz`);
|
|
23
|
-
* 7.
|
|
23
|
+
* 7. re-write the Caddyfile and reload Caddy — the edge headers live there
|
|
24
|
+
* (#891), and only the new release's generator knows them;
|
|
25
|
+
* 8. record the release in `.caelo/release.json`.
|
|
24
26
|
* Any failure after step 3 puts the previous Compose file back; once a
|
|
25
27
|
* container was recreated the previous images are started again and
|
|
26
28
|
* health-checked (rollback). The database is never restored automatically:
|
|
@@ -178,6 +180,11 @@ export async function upgradeSelfHosted(opts, deps) {
|
|
|
178
180
|
if (!converged.ok) {
|
|
179
181
|
return fail("converge", `${converged.error}\nThe recorded release ${current.version} is not serving healthily — check \`docker compose logs\`.`, false);
|
|
180
182
|
}
|
|
183
|
+
// A run that stopped after the roll (or an install upgraded before the
|
|
184
|
+
// Caddyfile was part of the upgrade) gets this release's edge config.
|
|
185
|
+
const caddy = await refreshCaddy(deps);
|
|
186
|
+
if (!caddy.ok)
|
|
187
|
+
return caddy.failure;
|
|
181
188
|
log.info(`Already on ${current.version} (${shortDigest(images.admin)}); nothing to do.`);
|
|
182
189
|
return { ok: true, status: "already-current", version: current.version };
|
|
183
190
|
}
|
|
@@ -246,12 +253,29 @@ export async function upgradeSelfHosted(opts, deps) {
|
|
|
246
253
|
}
|
|
247
254
|
log.info(`${service} healthy ✓`);
|
|
248
255
|
}
|
|
249
|
-
// 7.
|
|
256
|
+
// 7. The Caddyfile this release generates (edge headers, #891). The new
|
|
257
|
+
// containers already serve; a failure is reported before the release is
|
|
258
|
+
// recorded, so a re-run (the already-current path above) retries it.
|
|
259
|
+
const caddy = await refreshCaddy(deps);
|
|
260
|
+
if (!caddy.ok)
|
|
261
|
+
return caddy.failure;
|
|
262
|
+
// 8. Record.
|
|
250
263
|
log.phase?.("record");
|
|
251
264
|
recordRelease(caeloDir, { version: target.version, images }, { from: current?.version ?? null, to: target.version, outcome: "upgraded" }, now());
|
|
252
265
|
log.step(`Upgraded to ${target.version}. Backup kept at ${backup.dir}`);
|
|
253
266
|
return { ok: true, status: "upgraded", version: target.version };
|
|
254
267
|
}
|
|
268
|
+
/** Step 7: re-write + reload the Caddyfile; on failure, the result to return. */
|
|
269
|
+
async function refreshCaddy(deps) {
|
|
270
|
+
deps.log.step("Re-writing the Caddyfile and reloading Caddy");
|
|
271
|
+
const r = await deps.refreshCaddy();
|
|
272
|
+
if (r.ok)
|
|
273
|
+
return { ok: true };
|
|
274
|
+
return {
|
|
275
|
+
ok: false,
|
|
276
|
+
failure: fail("caddy", `${r.error}\nThe new release is running, but Caddy may still serve the previous Caddyfile (without this release's security headers). Fix the cause, then run \`${selfCommand("regenerate-caddy")}\` or re-run the upgrade.`, false),
|
|
277
|
+
};
|
|
278
|
+
}
|
|
255
279
|
function fail(stage, error, previousRunning) {
|
|
256
280
|
return { ok: false, stage, error, previousRunning };
|
|
257
281
|
}
|