@caelo-cms/provisioning 0.10.49 → 0.10.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/caddy/Caddyfile.production +4 -0
  2. package/caddy/Caddyfile.staging +4 -0
  3. package/dist/agent-db.js +4 -0
  4. package/dist/caddy-redirects.d.ts +15 -0
  5. package/dist/caddy-redirects.d.ts.map +1 -0
  6. package/dist/caddy-redirects.js +65 -0
  7. package/dist/caddy-redirects.js.map +1 -0
  8. package/dist/caddy.d.ts +22 -2
  9. package/dist/caddy.d.ts.map +1 -1
  10. package/dist/caddy.js +66 -17
  11. package/dist/caddy.js.map +1 -1
  12. package/dist/cli-routing.d.ts.map +1 -1
  13. package/dist/cli-routing.js +7 -0
  14. package/dist/cli-routing.js.map +1 -1
  15. package/dist/cli.js +248 -254
  16. package/dist/cli.js.map +1 -1
  17. package/dist/compose.d.ts +54 -2
  18. package/dist/compose.d.ts.map +1 -1
  19. package/dist/compose.js +86 -32
  20. package/dist/compose.js.map +1 -1
  21. package/dist/gcp-names.d.ts +12 -0
  22. package/dist/gcp-names.d.ts.map +1 -1
  23. package/dist/gcp-names.js +21 -0
  24. package/dist/gcp-names.js.map +1 -1
  25. package/dist/gcp-url-map.d.ts +27 -0
  26. package/dist/gcp-url-map.d.ts.map +1 -0
  27. package/dist/gcp-url-map.js +62 -0
  28. package/dist/gcp-url-map.js.map +1 -0
  29. package/dist/index.d.ts +0 -1
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +0 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/infra-contract.d.ts +20 -1
  34. package/dist/infra-contract.d.ts.map +1 -1
  35. package/dist/infra-contract.js +39 -1
  36. package/dist/infra-contract.js.map +1 -1
  37. package/dist/public-role-isolation.d.ts +19 -0
  38. package/dist/public-role-isolation.d.ts.map +1 -0
  39. package/dist/public-role-isolation.js +69 -0
  40. package/dist/public-role-isolation.js.map +1 -0
  41. package/dist/release-contract.d.ts.map +1 -1
  42. package/dist/release-contract.js +3 -0
  43. package/dist/release-contract.js.map +1 -1
  44. package/dist/release-manifest.d.ts.map +1 -1
  45. package/dist/release-manifest.js +2 -1
  46. package/dist/release-manifest.js.map +1 -1
  47. package/dist/self-hosted-backup.d.ts +86 -0
  48. package/dist/self-hosted-backup.d.ts.map +1 -0
  49. package/dist/self-hosted-backup.js +350 -0
  50. package/dist/self-hosted-backup.js.map +1 -0
  51. package/dist/self-hosted-release.d.ts +12 -3
  52. package/dist/self-hosted-release.d.ts.map +1 -1
  53. package/dist/self-hosted-release.js +6 -4
  54. package/dist/self-hosted-release.js.map +1 -1
  55. package/dist/self-hosted-start.d.ts +50 -0
  56. package/dist/self-hosted-start.d.ts.map +1 -0
  57. package/dist/self-hosted-start.js +59 -0
  58. package/dist/self-hosted-start.js.map +1 -0
  59. package/dist/self-hosted-upgrade.d.ts +30 -0
  60. package/dist/self-hosted-upgrade.d.ts.map +1 -1
  61. package/dist/self-hosted-upgrade.js +29 -7
  62. package/dist/self-hosted-upgrade.js.map +1 -1
  63. package/dist/tar-entries.d.ts +14 -0
  64. package/dist/tar-entries.d.ts.map +1 -0
  65. package/dist/tar-entries.js +104 -0
  66. package/dist/tar-entries.js.map +1 -0
  67. package/dist/upgrade/converge.d.ts +2 -2
  68. package/dist/upgrade/converge.d.ts.map +1 -1
  69. package/dist/upgrade/converge.js +44 -2
  70. package/dist/upgrade/converge.js.map +1 -1
  71. package/dist/upgrader-assess.d.ts.map +1 -1
  72. package/dist/upgrader-assess.js +2 -1
  73. package/dist/upgrader-assess.js.map +1 -1
  74. package/dist/url-map-redirects-access.d.ts +15 -0
  75. package/dist/url-map-redirects-access.d.ts.map +1 -0
  76. package/dist/url-map-redirects-access.js +81 -0
  77. package/dist/url-map-redirects-access.js.map +1 -0
  78. package/dist/wizard.d.ts.map +1 -1
  79. package/dist/wizard.js +3 -1
  80. package/dist/wizard.js.map +1 -1
  81. package/dist/wizards/gcp.d.ts.map +1 -1
  82. package/dist/wizards/gcp.js +45 -0
  83. package/dist/wizards/gcp.js.map +1 -1
  84. package/package.json +2 -2
  85. package/src/admin-memory.test.ts +2 -2
  86. package/src/caddy-redirects.docker.test.ts +255 -0
  87. package/src/caddy-redirects.test.ts +115 -0
  88. package/src/caddy-redirects.ts +68 -0
  89. package/src/caddy-validate.test.ts +119 -0
  90. package/src/caddy.test.ts +108 -0
  91. package/src/caddy.ts +89 -20
  92. package/src/cli-routing.test.ts +12 -0
  93. package/src/cli-routing.ts +7 -0
  94. package/src/cli.ts +299 -287
  95. package/src/compose.ts +106 -34
  96. package/src/gcp-names.ts +23 -0
  97. package/src/gcp-url-map.test.ts +150 -0
  98. package/src/gcp-url-map.ts +81 -0
  99. package/src/index.test.ts +18 -146
  100. package/src/index.ts +0 -9
  101. package/src/infra-contract.test.ts +39 -0
  102. package/src/infra-contract.ts +42 -1
  103. package/src/public-role-isolation.test.ts +89 -0
  104. package/src/public-role-isolation.ts +83 -0
  105. package/src/release-contract.ts +3 -0
  106. package/src/release-manifest.test.ts +12 -0
  107. package/src/release-manifest.ts +2 -1
  108. package/src/self-hosted-backup.test.ts +344 -0
  109. package/src/self-hosted-backup.ts +480 -0
  110. package/src/self-hosted-compose.test.ts +88 -4
  111. package/src/self-hosted-release.ts +22 -7
  112. package/src/self-hosted-start.test.ts +68 -0
  113. package/src/self-hosted-start.ts +123 -0
  114. package/src/self-hosted-upgrade.ts +35 -8
  115. package/src/stack-contract.test.ts +2 -2
  116. package/src/tar-entries.test.ts +52 -0
  117. package/src/tar-entries.ts +116 -0
  118. package/src/upgrade/converge.ts +51 -4
  119. package/src/upgrade/upgrade.test.ts +78 -1
  120. package/src/upgrader-assess.test.ts +22 -0
  121. package/src/upgrader-assess.ts +2 -1
  122. package/src/url-map-redirects-access.test.ts +88 -0
  123. package/src/url-map-redirects-access.ts +89 -0
  124. package/src/wizard.ts +3 -1
  125. package/src/wizards/gcp.ts +48 -0
  126. package/stacks/aws/index.ts +34 -2
  127. package/stacks/azure/index.ts +13 -0
  128. package/stacks/gcp/index.ts +24 -17
  129. package/stacks/gcp-firebase/index.ts +7 -0
  130. package/stacks/self-hosted/Pulumi.yaml +2 -2
  131. package/stacks/self-hosted/README.md +3 -3
  132. package/stacks/self-hosted/index.ts +45 -22
  133. package/dist/redirects-emit.d.ts +0 -52
  134. package/dist/redirects-emit.d.ts.map +0 -1
  135. package/dist/redirects-emit.js +0 -111
  136. package/dist/redirects-emit.js.map +0 -1
  137. package/src/redirects-emit.ts +0 -175
@@ -0,0 +1,350 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /**
3
+ * `cms-provision backup` / `restore` for a self-hosted Compose install
4
+ * (issue #707).
5
+ *
6
+ * A backup is one `.tar.gz` holding everything an install's content lives
7
+ * in:
8
+ * manifest.json format version, Caelo version, timestamp
9
+ * db/cms_admin.dump pg_dump -Fc (the same dumps `upgrade` takes)
10
+ * db/cms_public.dump
11
+ * db/globals.sql the cluster's roles — reference only, see restore
12
+ * files.tar the published site (`/srv/caelo`) and the uploaded
13
+ * media (`/data/media`), read through the admin's
14
+ * own mounts
15
+ * Secrets (`.caelo/config.json`, incl. the KEK that decrypts stored
16
+ * provider keys) are NOT in the archive: it may be copied off-host, and a
17
+ * restore targets the install whose config is already there.
18
+ *
19
+ * pg_dump rather than pgBackRest: the old sidecar never had access to the
20
+ * data volume and no stanza was ever created, so it could not back up
21
+ * anything. WAL streaming / point-in-time recovery (CMS_REQUIREMENTS §13.2)
22
+ * needs pgBackRest inside the Postgres image and is tracked separately.
23
+ *
24
+ * Files go through a one-off admin container (`docker compose run`), not
25
+ * the host: the admin writes them as root, which the operator's user may
26
+ * not be able to replace.
27
+ *
28
+ * Backup stops the admin and the gateway for its duration (a short outage):
29
+ * the two databases and the files are separate steps, and a write between
30
+ * them would give an archive whose parts do not match each other.
31
+ *
32
+ * Restore order: list + check the archive and its files.tar WITHOUT
33
+ * extracting (only the expected members, relative paths, no member below a
34
+ * symlink — nothing on the install changes otherwise) → stop the Caelo
35
+ * services → drop + re-create both databases with the role convergence
36
+ * (roles, passwords and grants come from config.json, never from the
37
+ * archive, so a restore cannot reset the superuser's password) →
38
+ * pg_restore → converge again (re-applies the gateway grants the restored
39
+ * functions define) → migrate with the install's admin image (a backup of
40
+ * an older release has its older schema) → replace the files → start
41
+ * everything and health-check it → re-render + reload the Caddyfile from
42
+ * the restored domains table.
43
+ */
44
+ import { chmodSync, existsSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync, } from "node:fs";
45
+ import { basename, join } from "node:path";
46
+ import { gunzipSync } from "node:zlib";
47
+ import { COMPOSE_APP_SERVICES, MEDIA_ROOT, SITE_OUTPUT_ROOT } from "./compose.js";
48
+ import { compose, DATABASE_DUMPS, dumpDatabases, runMigrations, waitHealthy, } from "./self-hosted-upgrade.js";
49
+ import { escapesRoot, listTarEntries, normalizeMemberName } from "./tar-entries.js";
50
+ /** The archive layout's version; a restore refuses any other. */
51
+ export const BACKUP_FORMAT = 1;
52
+ const MANIFEST = "manifest.json";
53
+ const DB_DIR = "db";
54
+ const FILES_TAR = "files.tar";
55
+ /** The content directories inside the admin container, as `tar -C /` paths. */
56
+ const CONTENT_PATHS = [SITE_OUTPUT_ROOT, MEDIA_ROOT].map((p) => p.replace(/^\//, ""));
57
+ /**
58
+ * Write a backup archive of the install to `to` (mode 600). Postgres must
59
+ * be running. The admin and the gateway are stopped while it runs and
60
+ * started (and health-checked) again afterwards, whatever the outcome.
61
+ */
62
+ export async function backupSelfHosted(to, caeloVersion, deps) {
63
+ const { caeloDir, runner, log } = deps;
64
+ const at = (deps.now ?? (() => new Date()))();
65
+ const ready = await runner.run(compose(caeloDir, "exec", "-T", "postgres", "pg_isready", "-U", "caelo"));
66
+ if (ready.exitCode !== 0) {
67
+ return {
68
+ ok: false,
69
+ error: `Postgres is not running, so nothing was backed up. Start it with \`docker compose -f ${caeloDir}/docker-compose.yml up -d postgres\` and re-run.`,
70
+ };
71
+ }
72
+ log("Stopping the admin and the gateway for a consistent snapshot …");
73
+ const stop = await runner.run(compose(caeloDir, "stop", ...COMPOSE_APP_SERVICES));
74
+ if (stop.exitCode !== 0) {
75
+ return { ok: false, error: `Could not stop the Caelo services: ${tail(stop.stderr)}` };
76
+ }
77
+ const work = workDir(caeloDir, "backup", at);
78
+ let result;
79
+ try {
80
+ result = await writeArchive(to, caeloVersion, work, deps);
81
+ }
82
+ finally {
83
+ rmSync(work, { recursive: true, force: true });
84
+ }
85
+ log("Starting the admin and the gateway again …");
86
+ const started = await startAppServices(deps);
87
+ if (!started.ok) {
88
+ return {
89
+ ok: false,
90
+ error: `${result.ok ? `The backup was written to ${result.path}, but` : `${result.error}\nAlso,`} the services did not come back: ${started.error}`,
91
+ };
92
+ }
93
+ return result;
94
+ }
95
+ /** The dumps, files.tar and manifest into `work`, then one .tar.gz at `to`. */
96
+ async function writeArchive(to, caeloVersion, work, deps) {
97
+ const { caeloDir, runner, log } = deps;
98
+ log("Dumping the databases (pg_dump) …");
99
+ const dumped = await dumpDatabases(caeloDir, runner, join(work, DB_DIR));
100
+ if (!dumped.ok)
101
+ return { ok: false, error: dumped.error };
102
+ log("Archiving the published site and the uploaded media …");
103
+ const files = await runner.run(compose(caeloDir, "run", "--rm", "--no-deps", "-T", "--entrypoint", "tar", "caelo-admin", "-C", "/", "-cf", "-", ...CONTENT_PATHS), { stdoutPath: join(work, FILES_TAR) });
104
+ if (files.exitCode !== 0) {
105
+ return { ok: false, error: `Could not archive the site + media files: ${tail(files.stderr)}` };
106
+ }
107
+ const manifest = {
108
+ format: BACKUP_FORMAT,
109
+ caeloVersion,
110
+ createdAt: (deps.now ?? (() => new Date()))().toISOString(),
111
+ };
112
+ writeFileSync(join(work, MANIFEST), `${JSON.stringify(manifest, null, 2)}\n`, { mode: 0o600 });
113
+ log(`Writing ${to} …`);
114
+ // COPYFILE_DISABLE: macOS's bsdtar would add `._*` AppleDouble members
115
+ // for extended attributes, which a restore refuses as unexpected.
116
+ const tar = await runner.run(["tar", "-czf", to, "-C", work, "."], {
117
+ env: { COPYFILE_DISABLE: "1" },
118
+ });
119
+ if (tar.exitCode !== 0) {
120
+ return { ok: false, error: `Could not write ${to}: ${tail(tar.stderr)}` };
121
+ }
122
+ chmodSync(to, 0o600);
123
+ return { ok: true, path: to };
124
+ }
125
+ /** `up -d` the admin + gateway, then health-check both. */
126
+ async function startAppServices(deps) {
127
+ const { caeloDir, runner } = deps;
128
+ const up = await runner.run(compose(caeloDir, "up", "-d", ...COMPOSE_APP_SERVICES));
129
+ if (up.exitCode !== 0)
130
+ return { ok: false, error: `docker compose up failed: ${tail(up.stderr)}` };
131
+ for (const service of ["admin", "gateway"]) {
132
+ const healthy = await waitHealthy(service, caeloDir, {
133
+ runner,
134
+ ...(deps.sleep ? { sleep: deps.sleep } : {}),
135
+ ...(deps.healthAttempts !== undefined ? { healthAttempts: deps.healthAttempts } : {}),
136
+ ...(deps.healthIntervalMs !== undefined ? { healthIntervalMs: deps.healthIntervalMs } : {}),
137
+ });
138
+ if (!healthy.ok)
139
+ return { ok: false, error: `the ${service} is not healthy: ${healthy.error}` };
140
+ }
141
+ return { ok: true };
142
+ }
143
+ /** Replace the install's databases and content files with the backup at `from`. */
144
+ export async function restoreSelfHosted(from, deps) {
145
+ const { caeloDir, runner, log } = deps;
146
+ if (!existsSync(from))
147
+ return unchanged(`${from} does not exist.`);
148
+ const work = workDir(caeloDir, "restore", (deps.now ?? (() => new Date()))());
149
+ try {
150
+ log(`Checking ${basename(from)} …`);
151
+ const members = checkArchiveMembers(from);
152
+ if (!members.ok)
153
+ return unchanged(members.error);
154
+ const untar = await runner.run(["tar", "-xzf", from, "-C", work]);
155
+ if (untar.exitCode !== 0) {
156
+ return unchanged(`${from} is not a readable backup archive: ${tail(untar.stderr)}`);
157
+ }
158
+ const checked = checkArchive(work);
159
+ if (!checked.ok)
160
+ return unchanged(checked.error);
161
+ const files = checkFilesTar(join(work, FILES_TAR));
162
+ if (!files.ok)
163
+ return unchanged(files.error);
164
+ log("Stopping the admin and the gateway …");
165
+ const stop = await runner.run(compose(caeloDir, "stop", ...COMPOSE_APP_SERVICES));
166
+ if (stop.exitCode !== 0) {
167
+ return unchanged(`Could not stop the Caelo services: ${tail(stop.stderr)}`);
168
+ }
169
+ const pg = await runner.run(compose(caeloDir, "up", "-d", "--wait", "postgres"));
170
+ if (pg.exitCode !== 0) {
171
+ return changed(`Postgres did not become healthy: ${tail(pg.stderr)}`);
172
+ }
173
+ log("Replacing the databases …");
174
+ const drop = await runner.run(compose(caeloDir, "exec", "-T", "postgres", "psql", "-U", "caelo", "-d", "postgres", "-v", "ON_ERROR_STOP=1", "-c", "DROP DATABASE IF EXISTS cms_admin WITH (FORCE)", "-c", "DROP DATABASE IF EXISTS cms_public WITH (FORCE)"));
175
+ if (drop.exitCode !== 0)
176
+ return changed(`Could not drop the databases: ${tail(drop.stderr)}`);
177
+ const created = await deps.convergeRoles();
178
+ if (!created.ok)
179
+ return changed(`Could not re-create the databases: ${created.error}`);
180
+ for (const db of ["cms_admin", "cms_public"]) {
181
+ const r = await runner.run(compose(caeloDir, "exec", "-T", "postgres", "pg_restore", "-U", "caelo", "-d", db, "--exit-on-error", "--single-transaction"), { stdinPath: join(work, DB_DIR, DATABASE_DUMPS[db]) });
182
+ if (r.exitCode !== 0)
183
+ return changed(`pg_restore of ${db} failed: ${tail(r.stderr)}`);
184
+ }
185
+ const granted = await deps.convergeRoles();
186
+ if (!granted.ok)
187
+ return changed(`Could not re-apply the role grants: ${granted.error}`);
188
+ log("Applying the migrations of the running release …");
189
+ const migrated = await runMigrations(caeloDir, runner);
190
+ if (!migrated.ok)
191
+ return changed(migrated.error);
192
+ log("Replacing the published site and the uploaded media …");
193
+ const dirs = CONTENT_PATHS.map((p) => `/${p}`).join(" ");
194
+ const replaced = await runner.run(compose(caeloDir, "run", "--rm", "--no-deps", "-T", "--entrypoint", "sh", "caelo-admin", "-c", `set -e; find ${dirs} -mindepth 1 -delete; tar -C / -xf -`), { stdinPath: join(work, FILES_TAR) });
195
+ if (replaced.exitCode !== 0) {
196
+ return changed(`Could not restore the site + media files: ${tail(replaced.stderr)}`);
197
+ }
198
+ log("Starting everything …");
199
+ const up = await runner.run(compose(caeloDir, "up", "-d", "--remove-orphans"));
200
+ if (up.exitCode !== 0)
201
+ return changed(`docker compose up failed: ${tail(up.stderr)}`);
202
+ for (const service of ["admin", "gateway"]) {
203
+ const healthy = await waitHealthy(service, caeloDir, {
204
+ runner,
205
+ ...(deps.sleep ? { sleep: deps.sleep } : {}),
206
+ ...(deps.healthAttempts !== undefined ? { healthAttempts: deps.healthAttempts } : {}),
207
+ ...(deps.healthIntervalMs !== undefined ? { healthIntervalMs: deps.healthIntervalMs } : {}),
208
+ });
209
+ if (!healthy.ok)
210
+ return changed(`The ${service} is not healthy after the restore: ${healthy.error}`);
211
+ }
212
+ const caddy = await deps.refreshCaddy();
213
+ if (!caddy.ok)
214
+ return changed(`Could not reload Caddy with the restored domains: ${caddy.error}`);
215
+ return { ok: true, manifest: checked.manifest };
216
+ }
217
+ finally {
218
+ rmSync(work, { recursive: true, force: true });
219
+ }
220
+ }
221
+ /** Whether an unpacked archive has every part a restore needs, in a format this CLI reads. */
222
+ export function checkArchive(dir) {
223
+ const manifestPath = join(dir, MANIFEST);
224
+ if (!existsSync(manifestPath)) {
225
+ return { ok: false, error: "The archive has no manifest.json — it is not a Caelo backup." };
226
+ }
227
+ let manifest;
228
+ try {
229
+ manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
230
+ }
231
+ catch (e) {
232
+ return { ok: false, error: `manifest.json is not JSON: ${e.message}` };
233
+ }
234
+ if (manifest.format !== BACKUP_FORMAT) {
235
+ return {
236
+ ok: false,
237
+ error: `The backup has format ${manifest.format}; this provisioner restores format ${BACKUP_FORMAT}. Use the provisioner of Caelo ${manifest.caeloVersion}.`,
238
+ };
239
+ }
240
+ for (const part of [
241
+ join(DB_DIR, DATABASE_DUMPS.cms_admin),
242
+ join(DB_DIR, DATABASE_DUMPS.cms_public),
243
+ FILES_TAR,
244
+ ]) {
245
+ if (!existsSync(join(dir, part)) || statSync(join(dir, part)).size === 0) {
246
+ return { ok: false, error: `The archive is incomplete: ${part} is missing or empty.` };
247
+ }
248
+ }
249
+ return { ok: true, manifest };
250
+ }
251
+ /** The members a backup archive may hold — anything else is refused before extraction. */
252
+ const ARCHIVE_MEMBERS = new Set([
253
+ "",
254
+ MANIFEST,
255
+ DB_DIR,
256
+ ...Object.values(DATABASE_DUMPS).map((f) => `${DB_DIR}/${f}`),
257
+ FILES_TAR,
258
+ ]);
259
+ /**
260
+ * Whether the .tar.gz at `path` holds only the members a backup writes, as
261
+ * plain files and directories — checked before `tar -x` writes anything.
262
+ */
263
+ export function checkArchiveMembers(path) {
264
+ let entries;
265
+ try {
266
+ entries = listTarEntries(gunzipSync(readFileSync(path)));
267
+ }
268
+ catch (e) {
269
+ return {
270
+ ok: false,
271
+ error: `${path} is not a readable backup archive (${e.message}).`,
272
+ };
273
+ }
274
+ for (const e of entries) {
275
+ const name = normalizeMemberName(e.name);
276
+ if (escapesRoot(e.name) || !ARCHIVE_MEMBERS.has(name)) {
277
+ return {
278
+ ok: false,
279
+ error: `The archive holds an unexpected member ${JSON.stringify(e.name)} — it is not a Caelo backup.`,
280
+ };
281
+ }
282
+ if (e.type !== (name === "" || name === DB_DIR ? "directory" : "file")) {
283
+ return {
284
+ ok: false,
285
+ error: `The archive member ${JSON.stringify(e.name)} is a ${e.type}, not what a Caelo backup writes.`,
286
+ };
287
+ }
288
+ }
289
+ return { ok: true };
290
+ }
291
+ /**
292
+ * Whether files.tar only writes below the site and media directories:
293
+ * relative paths without `..`, files / directories / relative symlinks
294
+ * inside the tree, and no member below a symlink (which would write
295
+ * wherever the link points).
296
+ */
297
+ export function checkFilesTar(path) {
298
+ let entries;
299
+ try {
300
+ entries = listTarEntries(readFileSync(path));
301
+ }
302
+ catch (e) {
303
+ return { ok: false, error: `files.tar is not readable (${e.message}).` };
304
+ }
305
+ const symlinks = [];
306
+ const refuse = (e, why) => ({
307
+ ok: false,
308
+ error: `files.tar member ${JSON.stringify(e.name)} ${why} — the archive is not a Caelo backup.`,
309
+ });
310
+ for (const e of entries) {
311
+ const name = normalizeMemberName(e.name);
312
+ if (escapesRoot(e.name))
313
+ return refuse(e, "points outside the content directories");
314
+ if (!CONTENT_PATHS.some((root) => name === root || name.startsWith(`${root}/`))) {
315
+ return refuse(e, "is outside the site and media directories");
316
+ }
317
+ if (symlinks.some((link) => name.startsWith(`${link}/`)))
318
+ return refuse(e, "lies below a symlink");
319
+ if (e.type === "symlink") {
320
+ const target = e.linkTarget ?? "";
321
+ if (target === "" || escapesRoot(target))
322
+ return refuse(e, "links outside its directory");
323
+ symlinks.push(name);
324
+ }
325
+ else if (e.type === "other") {
326
+ return refuse(e, "is not a file, directory or symlink");
327
+ }
328
+ }
329
+ return { ok: true };
330
+ }
331
+ /** A scratch dir under `.caelo/backups/` (mode 700) — same filesystem, never world-readable. */
332
+ function workDir(caeloDir, kind, at) {
333
+ const dir = join(caeloDir, "backups", `.${kind}-${at.toISOString().replace(/[:.]/g, "-")}`);
334
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
335
+ return dir;
336
+ }
337
+ function unchanged(error) {
338
+ return {
339
+ ok: false,
340
+ error: `${error} Nothing on the install was changed.`,
341
+ installChanged: false,
342
+ };
343
+ }
344
+ function changed(error) {
345
+ return { ok: false, error, installChanged: true };
346
+ }
347
+ function tail(s) {
348
+ return s.trim().split("\n").slice(-5).join("\n").slice(0, 800);
349
+ }
350
+ //# sourceMappingURL=self-hosted-backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-hosted-backup.js","sourceRoot":"","sources":["../src/self-hosted-backup.ts"],"names":[],"mappings":"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"}
@@ -13,10 +13,19 @@ 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). With
17
+ * `inherit`, stdout + stderr go to the terminal (long pulls and starts
18
+ * the operator should watch) and come back empty.
16
19
  */
17
- run(argv: readonly string[], opts?: {
18
- readonly stdoutPath?: string;
19
- }): Promise<CommandResult>;
20
+ run(argv: readonly string[], opts?: HostRunOptions): Promise<CommandResult>;
21
+ }
22
+ /** See {@link HostRunner.run}. */
23
+ export interface HostRunOptions {
24
+ /** Extra environment variables on top of the CLI's own. */
25
+ readonly env?: Readonly<Record<string, string>>;
26
+ readonly stdoutPath?: string;
27
+ readonly stdinPath?: string;
28
+ readonly inherit?: boolean;
20
29
  }
21
30
  /** The real runner: Bun.spawn; a missing binary is exit code 127, not a throw. */
22
31
  export declare const bunHostRunner: HostRunner;
@@ -1 +1 @@
1
- {"version":3,"file":"self-hosted-release.d.ts","sourceRoot":"","sources":["../src/self-hosted-release.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"self-hosted-release.d.ts","sourceRoot":"","sources":["../src/self-hosted-release.ts"],"names":[],"mappings":"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"}
@@ -26,13 +26,15 @@ export const bunHostRunner = {
26
26
  async run(argv, opts) {
27
27
  try {
28
28
  const proc = Bun.spawn([...argv], {
29
- stdout: opts?.stdoutPath ? Bun.file(opts.stdoutPath) : "pipe",
30
- stderr: "pipe",
29
+ ...(opts?.env ? { env: { ...process.env, ...opts.env } } : {}),
30
+ stdin: opts?.stdinPath ? Bun.file(opts.stdinPath) : "ignore",
31
+ stdout: opts?.stdoutPath ? Bun.file(opts.stdoutPath) : opts?.inherit ? "inherit" : "pipe",
32
+ stderr: opts?.inherit ? "inherit" : "pipe",
31
33
  });
32
- const stdout = opts?.stdoutPath
34
+ const stdout = opts?.stdoutPath || opts?.inherit
33
35
  ? ""
34
36
  : await new Response(proc.stdout).text();
35
- const stderr = await new Response(proc.stderr).text();
37
+ const stderr = opts?.inherit ? "" : await new Response(proc.stderr).text();
36
38
  return { exitCode: await proc.exited, stdout, stderr };
37
39
  }
38
40
  catch (e) {
@@ -1 +1 @@
1
- {"version":3,"file":"self-hosted-release.js","sourceRoot":"","sources":["../src/self-hosted-release.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"self-hosted-release.js","sourceRoot":"","sources":["../src/self-hosted-release.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Start (or converge) a self-hosted Compose install — what `init` and `up`
3
+ * run after writing `.caelo/`, so one command ends with a serving install
4
+ * (CLAUDE.md §11.C, issue #707) instead of printing steps to copy.
5
+ *
6
+ * Order, and why:
7
+ * 1. pull every image, with the progress on the terminal (the admin image
8
+ * is large; a silent multi-minute step reads as a hang);
9
+ * 2. start Postgres and wait for its health check — on a fresh volume its
10
+ * first start runs bootstrap.sh (roles + databases);
11
+ * 3. apply the migrations with the install's admin image;
12
+ * 4. start everything (`--remove-orphans` drops services an older Compose
13
+ * file had, e.g. the pgBackRest sidecar);
14
+ * 5. health-check the admin (`/_caelo/health` proves the DB pool and its
15
+ * role) and the gateway;
16
+ * 6. reload Caddy — Compose does not restart a running Caddy when only
17
+ * its bind-mounted Caddyfile changed, so a re-run `up` would otherwise
18
+ * keep serving the old vhosts.
19
+ * Every step converges, so a re-run after a failure picks up where it
20
+ * stopped.
21
+ */
22
+ import type { HostRunner } from "./self-hosted-release.js";
23
+ export interface StartDeps {
24
+ readonly caeloDir: string;
25
+ readonly runner: HostRunner;
26
+ readonly log: (message: string) => void;
27
+ /** Health probe attempts per service and the pause between them. */
28
+ readonly healthAttempts?: number;
29
+ readonly healthIntervalMs?: number;
30
+ readonly sleep?: (ms: number) => Promise<void>;
31
+ }
32
+ export type StartResult = {
33
+ readonly ok: true;
34
+ } | {
35
+ readonly ok: false;
36
+ readonly stage: StartStage;
37
+ readonly error: string;
38
+ };
39
+ type StartStage = "pull" | "postgres" | "migrate" | "start" | "health" | "caddy";
40
+ /** Bring the install's Compose stack up and prove it serves. Never throws for an expected failure. */
41
+ export declare function startSelfHosted(deps: StartDeps): Promise<StartResult>;
42
+ /** `caddy reload` in the running Caddy container with the current Caddyfile. */
43
+ export declare function reloadCaddy(caeloDir: string, runner: HostRunner): Promise<{
44
+ ok: true;
45
+ } | {
46
+ ok: false;
47
+ error: string;
48
+ }>;
49
+ export {};
50
+ //# sourceMappingURL=self-hosted-start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-hosted-start.d.ts","sourceRoot":"","sources":["../src/self-hosted-start.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAG3D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,oEAAoE;IACpE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,KAAK,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEjF,sGAAsG;AACtG,wBAAsB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAgD3E;AAED,gFAAgF;AAChF,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBtD"}
@@ -0,0 +1,59 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ import { compose, runMigrations, waitHealthy } from "./self-hosted-upgrade.js";
3
+ /** Bring the install's Compose stack up and prove it serves. Never throws for an expected failure. */
4
+ export async function startSelfHosted(deps) {
5
+ const { caeloDir, runner, log } = deps;
6
+ log("Pulling the images …");
7
+ const pull = await runner.run(compose(caeloDir, "pull"), { inherit: true });
8
+ if (pull.exitCode !== 0) {
9
+ return fail("pull", "docker compose pull failed (see above). Check the network and re-run.");
10
+ }
11
+ log("Starting Postgres …");
12
+ const pg = await runner.run(compose(caeloDir, "up", "-d", "--wait", "postgres"), {
13
+ inherit: true,
14
+ });
15
+ if (pg.exitCode !== 0) {
16
+ return fail("postgres", `Postgres did not become healthy (see above; \`docker compose -f ${caeloDir}/docker-compose.yml logs postgres\`).`);
17
+ }
18
+ log("Applying the database migrations …");
19
+ const migrated = await runMigrations(caeloDir, runner);
20
+ if (!migrated.ok)
21
+ return fail("migrate", migrated.error);
22
+ log("Starting Caddy, the admin and the gateway …");
23
+ const up = await runner.run(compose(caeloDir, "up", "-d", "--remove-orphans"), {
24
+ inherit: true,
25
+ });
26
+ if (up.exitCode !== 0)
27
+ return fail("start", "docker compose up failed (see above).");
28
+ for (const service of ["admin", "gateway"]) {
29
+ log(`Waiting for the ${service} to answer its health check …`);
30
+ const healthy = await waitHealthy(service, caeloDir, {
31
+ runner,
32
+ ...(deps.sleep ? { sleep: deps.sleep } : {}),
33
+ ...(deps.healthAttempts !== undefined ? { healthAttempts: deps.healthAttempts } : {}),
34
+ ...(deps.healthIntervalMs !== undefined ? { healthIntervalMs: deps.healthIntervalMs } : {}),
35
+ });
36
+ if (!healthy.ok) {
37
+ return fail("health", `The ${service} is not healthy: ${healthy.error}. See \`docker compose -f ${caeloDir}/docker-compose.yml logs caelo-${service}\`.`);
38
+ }
39
+ }
40
+ log("Reloading Caddy …");
41
+ const reloaded = await reloadCaddy(caeloDir, runner);
42
+ if (!reloaded.ok)
43
+ return fail("caddy", reloaded.error);
44
+ return { ok: true };
45
+ }
46
+ /** `caddy reload` in the running Caddy container with the current Caddyfile. */
47
+ export async function reloadCaddy(caeloDir, runner) {
48
+ const r = await runner.run(compose(caeloDir, "exec", "-T", "caddy", "caddy", "reload", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"));
49
+ if (r.exitCode === 0)
50
+ return { ok: true };
51
+ return {
52
+ ok: false,
53
+ error: `caddy reload failed: ${r.stderr.trim().split("\n").slice(-3).join("\n")}`,
54
+ };
55
+ }
56
+ function fail(stage, error) {
57
+ return { ok: false, stage, error };
58
+ }
59
+ //# sourceMappingURL=self-hosted-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-hosted-start.js","sourceRoot":"","sources":["../src/self-hosted-start.ts"],"names":[],"mappings":"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"}
@@ -74,6 +74,8 @@ export declare function adoptLegacyMedia(caeloDir: string): {
74
74
  error: string;
75
75
  };
76
76
  export declare function composePath(caeloDir: string): string;
77
+ /** `docker compose -f <file>` — every Compose call targets the install's file explicitly. */
78
+ export declare function compose(caeloDir: string, ...args: string[]): string[];
77
79
  /**
78
80
  * Upgrade a self-hosted install to `opts.version` (or the newest stable
79
81
  * release). Never throws for an expected failure; the result says which
@@ -92,6 +94,24 @@ export declare function backupDatabases(caeloDir: string, runner: HostRunner, at
92
94
  ok: false;
93
95
  error: string;
94
96
  }>;
97
+ /** The files {@link dumpDatabases} writes, and what each holds. */
98
+ export declare const DATABASE_DUMPS: {
99
+ /** The cluster's roles (reference only — restores re-create them from config.json). */
100
+ readonly globals: "globals.sql";
101
+ readonly cms_admin: "cms_admin.dump";
102
+ readonly cms_public: "cms_public.dump";
103
+ };
104
+ /**
105
+ * pg_dump both databases (custom format) plus the cluster's roles into
106
+ * `dir` (created mode 700) from the running Postgres container. Every dump
107
+ * must exit 0 and be non-empty.
108
+ */
109
+ export declare function dumpDatabases(caeloDir: string, runner: HostRunner, dir: string): Promise<{
110
+ ok: true;
111
+ } | {
112
+ ok: false;
113
+ error: string;
114
+ }>;
95
115
  /**
96
116
  * Apply the committed migrations (cms_admin, then cms_public) with the
97
117
  * admin image the Compose file names, as a one-off container — the
@@ -104,5 +124,15 @@ export declare function runMigrations(caeloDir: string, runner: HostRunner): Pro
104
124
  ok: false;
105
125
  error: string;
106
126
  }>;
127
+ /**
128
+ * Probe `service` inside its container until it answers healthy, or give up
129
+ * after `healthAttempts` tries (default 45, 2 s apart).
130
+ */
131
+ export declare function waitHealthy(service: "admin" | "gateway", caeloDir: string, deps: Pick<SelfHostedUpgradeDeps, "runner" | "sleep" | "healthAttempts" | "healthIntervalMs">): Promise<{
132
+ ok: true;
133
+ } | {
134
+ ok: false;
135
+ error: string;
136
+ }>;
107
137
  export {};
108
138
  //# sourceMappingURL=self-hosted-upgrade.d.ts.map