@styleflow.app/flowpress-deploy 1.0.0-beta.3 → 1.0.0-beta.30
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/CHANGELOG.md +156 -0
- package/README.md +5 -0
- package/composer.json +1 -1
- package/containers/cms/Dockerfile +35 -0
- package/containers/cms/Dockerfile.dockerignore +20 -0
- package/containers/cms/healthz.php +17 -0
- package/containers/cms/install-languages.sh +16 -0
- package/containers/cms/mpm.conf +10 -0
- package/containers/cms/php.ini +16 -0
- package/containers/cms/sanitize-integrations.php +14 -0
- package/containers/cms/sanitize.php +40 -0
- package/containers/cms/smtp.php +13 -0
- package/containers/cms/vhost.conf +61 -0
- package/containers/cms/wp-cli.yml +1 -0
- package/containers/local/cms/Dockerfile +18 -0
- package/containers/local/cms/entrypoint.sh +7 -0
- package/containers/local/cms/php.ini +8 -0
- package/containers/local/cms/vhost.conf +14 -0
- package/containers/local/runtimes.json +14 -0
- package/containers/local/web/Dockerfile +8 -0
- package/containers/local/web/entrypoint.sh +21 -0
- package/containers/php-runtime/Dockerfile +21 -0
- package/containers/web-ssr/Dockerfile +27 -0
- package/containers/web-ssr/Dockerfile.dockerignore +10 -0
- package/containers/web-static/Caddyfile +40 -0
- package/containers/web-static/Dockerfile +17 -0
- package/containers/web-static/Dockerfile.dockerignore +7 -0
- package/dist/development.d.ts +12 -0
- package/dist/development.d.ts.map +1 -0
- package/dist/development.js +57 -0
- package/dist/development.js.map +1 -0
- package/dist/node-fetch.d.ts +3 -0
- package/dist/node-fetch.d.ts.map +1 -0
- package/dist/node-fetch.js +20 -0
- package/dist/node-fetch.js.map +1 -0
- package/dist/ops/bootstrap.d.ts +24 -0
- package/dist/ops/bootstrap.d.ts.map +1 -0
- package/dist/ops/bootstrap.js +156 -0
- package/dist/ops/bootstrap.js.map +1 -0
- package/dist/ops/build.d.ts +45 -0
- package/dist/ops/build.d.ts.map +1 -0
- package/dist/ops/build.js +119 -0
- package/dist/ops/build.js.map +1 -0
- package/dist/ops/check.d.ts +14 -0
- package/dist/ops/check.d.ts.map +1 -0
- package/dist/ops/check.js +42 -0
- package/dist/ops/check.js.map +1 -0
- package/dist/ops/cli.d.ts +3 -0
- package/dist/ops/cli.d.ts.map +1 -0
- package/dist/ops/cli.js +198 -0
- package/dist/ops/cli.js.map +1 -0
- package/dist/ops/cms-migrate.d.ts +14 -0
- package/dist/ops/cms-migrate.d.ts.map +1 -0
- package/dist/ops/cms-migrate.js +133 -0
- package/dist/ops/cms-migrate.js.map +1 -0
- package/dist/ops/cms-template/command.d.mts +19 -0
- package/dist/ops/cms-template/command.d.mts.map +1 -0
- package/dist/ops/cms-template/command.mjs +145 -0
- package/dist/ops/cms-template/command.mjs.map +1 -0
- package/dist/ops/cms-template/confirm.d.mts +11 -0
- package/dist/ops/cms-template/confirm.d.mts.map +1 -0
- package/dist/ops/cms-template/confirm.mjs +18 -0
- package/dist/ops/cms-template/confirm.mjs.map +1 -0
- package/dist/ops/cms-template/entry.d.mts +2 -0
- package/dist/ops/cms-template/entry.d.mts.map +1 -0
- package/dist/ops/cms-template/entry.mjs +22 -0
- package/dist/ops/cms-template/entry.mjs.map +1 -0
- package/dist/ops/cms-template/git.d.mts +7 -0
- package/dist/ops/cms-template/git.d.mts.map +1 -0
- package/dist/ops/cms-template/git.mjs +22 -0
- package/dist/ops/cms-template/git.mjs.map +1 -0
- package/dist/ops/cms-template/plan.d.mts +7 -0
- package/dist/ops/cms-template/plan.d.mts.map +1 -0
- package/dist/ops/cms-template/plan.mjs +54 -0
- package/dist/ops/cms-template/plan.mjs.map +1 -0
- package/dist/ops/cms-template/store.d.mts +21 -0
- package/dist/ops/cms-template/store.d.mts.map +1 -0
- package/dist/ops/cms-template/store.mjs +184 -0
- package/dist/ops/cms-template/store.mjs.map +1 -0
- package/dist/ops/cms-template/target.d.mts +15 -0
- package/dist/ops/cms-template/target.d.mts.map +1 -0
- package/dist/ops/cms-template/target.mjs +24 -0
- package/dist/ops/cms-template/target.mjs.map +1 -0
- package/dist/ops/cms-template/transport.d.mts +26 -0
- package/dist/ops/cms-template/transport.d.mts.map +1 -0
- package/dist/ops/cms-template/transport.mjs +115 -0
- package/dist/ops/cms-template/transport.mjs.map +1 -0
- package/dist/ops/config.d.ts +54 -0
- package/dist/ops/config.d.ts.map +1 -0
- package/dist/ops/config.js +221 -0
- package/dist/ops/config.js.map +1 -0
- package/dist/ops/coolify.d.ts +2 -0
- package/dist/ops/coolify.d.ts.map +1 -0
- package/dist/ops/coolify.js +44 -0
- package/dist/ops/coolify.js.map +1 -0
- package/dist/ops/data.d.ts +31 -0
- package/dist/ops/data.d.ts.map +1 -0
- package/dist/ops/data.js +165 -0
- package/dist/ops/data.js.map +1 -0
- package/dist/ops/deploy.d.ts +38 -0
- package/dist/ops/deploy.d.ts.map +1 -0
- package/dist/ops/deploy.js +127 -0
- package/dist/ops/deploy.js.map +1 -0
- package/dist/ops/editorial.d.ts +23 -0
- package/dist/ops/editorial.d.ts.map +1 -0
- package/dist/ops/editorial.js +79 -0
- package/dist/ops/editorial.js.map +1 -0
- package/dist/ops/environment-files.d.ts +9 -0
- package/dist/ops/environment-files.d.ts.map +1 -0
- package/dist/ops/environment-files.js +128 -0
- package/dist/ops/environment-files.js.map +1 -0
- package/dist/ops/environment.d.ts +31 -0
- package/dist/ops/environment.d.ts.map +1 -0
- package/dist/ops/environment.js +165 -0
- package/dist/ops/environment.js.map +1 -0
- package/dist/ops/features.d.ts +12 -0
- package/dist/ops/features.d.ts.map +1 -0
- package/dist/ops/features.js +71 -0
- package/dist/ops/features.js.map +1 -0
- package/dist/ops/health.d.ts +26 -0
- package/dist/ops/health.d.ts.map +1 -0
- package/dist/ops/health.js +27 -0
- package/dist/ops/health.js.map +1 -0
- package/dist/ops/local.d.ts +198 -0
- package/dist/ops/local.d.ts.map +1 -0
- package/dist/ops/local.js +187 -0
- package/dist/ops/local.js.map +1 -0
- package/dist/ops/media-config.d.ts +61 -0
- package/dist/ops/media-config.d.ts.map +1 -0
- package/dist/ops/media-config.js +96 -0
- package/dist/ops/media-config.js.map +1 -0
- package/dist/ops/media.d.ts +31 -0
- package/dist/ops/media.d.ts.map +1 -0
- package/dist/ops/media.js +74 -0
- package/dist/ops/media.js.map +1 -0
- package/dist/ops/monitor.d.ts +25 -0
- package/dist/ops/monitor.d.ts.map +1 -0
- package/dist/ops/monitor.js +143 -0
- package/dist/ops/monitor.js.map +1 -0
- package/dist/ops/process.d.ts +9 -0
- package/dist/ops/process.d.ts.map +1 -0
- package/dist/ops/process.js +56 -0
- package/dist/ops/process.js.map +1 -0
- package/dist/ops/provision.d.ts +41 -0
- package/dist/ops/provision.d.ts.map +1 -0
- package/dist/ops/provision.js +268 -0
- package/dist/ops/provision.js.map +1 -0
- package/dist/ops/registry.d.ts +14 -0
- package/dist/ops/registry.d.ts.map +1 -0
- package/dist/ops/registry.js +112 -0
- package/dist/ops/registry.js.map +1 -0
- package/dist/ops/release.d.ts +26 -0
- package/dist/ops/release.d.ts.map +1 -0
- package/dist/ops/release.js +79 -0
- package/dist/ops/release.js.map +1 -0
- package/dist/ops/runtimes.d.ts +16 -0
- package/dist/ops/runtimes.d.ts.map +1 -0
- package/dist/ops/runtimes.js +70 -0
- package/dist/ops/runtimes.js.map +1 -0
- package/dist/ops/s3.d.ts +8 -0
- package/dist/ops/s3.d.ts.map +1 -0
- package/dist/ops/s3.js +38 -0
- package/dist/ops/s3.js.map +1 -0
- package/dist/ops/static-config.d.ts +14 -0
- package/dist/ops/static-config.d.ts.map +1 -0
- package/dist/ops/static-config.js +92 -0
- package/dist/ops/static-config.js.map +1 -0
- package/dist/ops/storage.d.ts +39 -0
- package/dist/ops/storage.d.ts.map +1 -0
- package/dist/ops/storage.js +108 -0
- package/dist/ops/storage.js.map +1 -0
- package/flowpress-deploy.php +2 -2
- package/includes/pilot-aliases.php +69 -0
- package/package.json +43 -6
- package/schema/deployment.schema.json +306 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/ops/environment.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function featurePackages(id: any): {
|
|
2
|
+
npm: string;
|
|
3
|
+
composer: string;
|
|
4
|
+
};
|
|
5
|
+
export function readFeatures(root: any): any;
|
|
6
|
+
export function checkFeatures(root: any, id: any): {
|
|
7
|
+
features: any;
|
|
8
|
+
valid: boolean;
|
|
9
|
+
};
|
|
10
|
+
export function featureCommand(root: any, args: any, execute?: typeof run): any;
|
|
11
|
+
import { run } from "./process.js";
|
|
12
|
+
//# sourceMappingURL=features.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../src/ops/features.js"],"names":[],"mappings":"AAIA;;;EAGC;AACD,6CAUC;AACD;;;EAQC;AACD,gFAyBC;oBAnDmB,cAAc"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, rmSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { run } from "./process.js";
|
|
4
|
+
export function featurePackages(id) {
|
|
5
|
+
if (!/^[a-z][a-z0-9-]*$/.test(id || ""))
|
|
6
|
+
throw new Error("Invalid FlowPress feature id.");
|
|
7
|
+
return { npm: "@styleflow.app/flowpress-" + id, composer: "flowpress/" + id };
|
|
8
|
+
}
|
|
9
|
+
export function readFeatures(root) {
|
|
10
|
+
const value = JSON.parse(readFileSync(join(root, "flowpress.features.json"), "utf8"));
|
|
11
|
+
if (value.schemaVersion !== 1 || !Array.isArray(value.features))
|
|
12
|
+
throw new Error("Invalid feature manifest.");
|
|
13
|
+
const ids = new Set();
|
|
14
|
+
for (const entry of value.features) {
|
|
15
|
+
const packages = featurePackages(entry.id);
|
|
16
|
+
if (ids.has(entry.id) || packages.npm !== entry.npm || packages.composer !== entry.composer || !/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(entry.version))
|
|
17
|
+
throw new Error("Invalid or duplicate feature entry: " + entry.id);
|
|
18
|
+
ids.add(entry.id);
|
|
19
|
+
}
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
export function checkFeatures(root, id) {
|
|
23
|
+
const manifest = readFeatures(root);
|
|
24
|
+
const entries = manifest.features.filter(entry => id ? entry.id === id : entry.enabled);
|
|
25
|
+
if (id && !entries.length)
|
|
26
|
+
throw new Error("Feature not installed: " + id);
|
|
27
|
+
const pkg = JSON.parse(readFileSync(join(root, "package.json"), "utf8"));
|
|
28
|
+
const composer = JSON.parse(readFileSync(join(root, "apps/cms/composer.json"), "utf8"));
|
|
29
|
+
for (const entry of entries)
|
|
30
|
+
if ((pkg.dependencies?.[entry.npm] || pkg.devDependencies?.[entry.npm]) !== entry.version || composer.require?.[entry.composer] !== entry.version)
|
|
31
|
+
throw new Error("Feature " + entry.id + " dependencies do not match its exact manifest version.");
|
|
32
|
+
return { features: entries.map(entry => entry.id), valid: true };
|
|
33
|
+
}
|
|
34
|
+
export function featureCommand(root, args, execute = run) {
|
|
35
|
+
const [action, id] = args;
|
|
36
|
+
if (action === "check")
|
|
37
|
+
return checkFeatures(root, id);
|
|
38
|
+
const manifest = readFeatures(root);
|
|
39
|
+
if (action === "list")
|
|
40
|
+
return manifest;
|
|
41
|
+
if (!["install", "remove"].includes(action))
|
|
42
|
+
throw new Error("Use feature list|check|install|remove [id] [--version <exact>].");
|
|
43
|
+
const packages = featurePackages(id);
|
|
44
|
+
const index = args.indexOf("--version");
|
|
45
|
+
const version = index < 0 ? "" : args[index + 1];
|
|
46
|
+
if (action === "install" && !/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(version || ""))
|
|
47
|
+
throw new Error("Feature versions must be exact immutable versions.");
|
|
48
|
+
if (action === "remove" && !manifest.features.some(entry => entry.id === id))
|
|
49
|
+
throw new Error("Feature not installed: " + id);
|
|
50
|
+
const files = ["package.json", "pnpm-lock.yaml", "apps/cms/composer.json", "apps/cms/composer.lock", "flowpress.features.json"];
|
|
51
|
+
const before = new Map(files.map(file => [join(root, file), existsSync(join(root, file)) ? readFileSync(join(root, file)) : null]));
|
|
52
|
+
try {
|
|
53
|
+
execute("pnpm", action === "install" ? ["add", "--workspace-root", "--save-exact", packages.npm + "@" + version] : ["remove", "--workspace-root", packages.npm], { cwd: root });
|
|
54
|
+
execute("composer", action === "install" ? ["require", packages.composer + ":" + version, "--no-interaction"] : ["remove", packages.composer, "--no-interaction"], { cwd: join(root, "apps/cms") });
|
|
55
|
+
const features = manifest.features.filter(entry => entry.id !== id);
|
|
56
|
+
if (action === "install")
|
|
57
|
+
features.push({ id, version, ...packages, enabled: true });
|
|
58
|
+
writeFileSync(join(root, "flowpress.features.json"), JSON.stringify({ schemaVersion: 1, features: features.sort((a, b) => a.id.localeCompare(b.id)) }, null, 2) + "\n");
|
|
59
|
+
checkFeatures(root);
|
|
60
|
+
return { feature: id, action };
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
for (const [path, content] of before)
|
|
64
|
+
if (content === null)
|
|
65
|
+
rmSync(path, { force: true });
|
|
66
|
+
else
|
|
67
|
+
writeFileSync(path, content);
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.js","sourceRoot":"","sources":["../../src/ops/features.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export function providerTimestamp(value: any): number;
|
|
2
|
+
export function backupHealth({ executions, objects, maxAgeHours, now }: {
|
|
3
|
+
executions?: never[] | undefined;
|
|
4
|
+
objects: any;
|
|
5
|
+
maxAgeHours: any;
|
|
6
|
+
now?: number | undefined;
|
|
7
|
+
}): {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
lastAttempt: {
|
|
10
|
+
status: any;
|
|
11
|
+
created_at: any;
|
|
12
|
+
} | null;
|
|
13
|
+
lastSuccess: {
|
|
14
|
+
status: any;
|
|
15
|
+
created_at: any;
|
|
16
|
+
} | null;
|
|
17
|
+
latestObject: any;
|
|
18
|
+
ageHours: number | null;
|
|
19
|
+
maxAgeHours: any;
|
|
20
|
+
issues: string[];
|
|
21
|
+
};
|
|
22
|
+
export namespace backupMaxAgeHours {
|
|
23
|
+
let daily: number;
|
|
24
|
+
let weekly: number;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/ops/health.js"],"names":[],"mappings":"AAAA,sDAGC;AAID;;;;;;;;;;;;;;;;;;;EAeC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export function providerTimestamp(value) {
|
|
2
|
+
if (typeof value !== "string")
|
|
3
|
+
return NaN;
|
|
4
|
+
return Date.parse(/(?:Z|[+-]\d{2}:\d{2})$/i.test(value) ? value : value + "Z");
|
|
5
|
+
}
|
|
6
|
+
export const backupMaxAgeHours = { daily: 36, weekly: 8 * 24 };
|
|
7
|
+
export function backupHealth({ executions = [], objects, maxAgeHours, now = Date.now() }) {
|
|
8
|
+
const sorted = [...executions].sort((a, b) => Date.parse(b.created_at) - Date.parse(a.created_at));
|
|
9
|
+
const lastAttempt = sorted[0] ?? null;
|
|
10
|
+
const lastSuccess = sorted.find((item) => item.status === "success") ?? null;
|
|
11
|
+
const latestObject = objects === undefined ? null : [...objects].filter((item) => item.size > 0)
|
|
12
|
+
.sort((a, b) => Date.parse(b.modified) - Date.parse(a.modified))[0] ?? null;
|
|
13
|
+
const timestamp = latestObject?.modified || lastSuccess?.created_at;
|
|
14
|
+
const ageHours = timestamp ? (now - Date.parse(timestamp)) / 3_600_000 : null;
|
|
15
|
+
const issues = [];
|
|
16
|
+
if (!timestamp)
|
|
17
|
+
issues.push("no successful backup");
|
|
18
|
+
if (ageHours !== null && (!Number.isFinite(ageHours) || ageHours > maxAgeHours || ageHours < -1))
|
|
19
|
+
issues.push("backup stale or invalid timestamp");
|
|
20
|
+
if (lastAttempt && !["success", "running", "in_progress", "in-progress"].includes(lastAttempt.status))
|
|
21
|
+
issues.push("last backup attempt failed");
|
|
22
|
+
if (objects !== undefined && !latestObject)
|
|
23
|
+
issues.push("no nonempty offsite backup object");
|
|
24
|
+
const summary = (attempt) => attempt ? { status: attempt.status, created_at: attempt.created_at } : null;
|
|
25
|
+
return { ok: !issues.length, lastAttempt: summary(lastAttempt), lastSuccess: summary(lastSuccess), latestObject, ageHours, maxAgeHours, issues };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/ops/health.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
export function localConfiguration(root: any, manifest: any): {
|
|
2
|
+
env: Record<string, string>;
|
|
3
|
+
cms: any;
|
|
4
|
+
web: any;
|
|
5
|
+
project: string;
|
|
6
|
+
https: number;
|
|
7
|
+
origins: any[];
|
|
8
|
+
hostnames: string[];
|
|
9
|
+
webPort: number;
|
|
10
|
+
cmsPort: number;
|
|
11
|
+
dbPort: number;
|
|
12
|
+
};
|
|
13
|
+
export function localServices(config: any, root: any): {
|
|
14
|
+
name: any;
|
|
15
|
+
services: {
|
|
16
|
+
db: {
|
|
17
|
+
container_name: string;
|
|
18
|
+
image: string;
|
|
19
|
+
restart: string;
|
|
20
|
+
env_file: {
|
|
21
|
+
path: string;
|
|
22
|
+
format: string;
|
|
23
|
+
}[];
|
|
24
|
+
ports: string[];
|
|
25
|
+
volumes: string[];
|
|
26
|
+
healthcheck: {
|
|
27
|
+
test: string[];
|
|
28
|
+
interval: string;
|
|
29
|
+
timeout: string;
|
|
30
|
+
retries: number;
|
|
31
|
+
start_period: string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
cms: {
|
|
35
|
+
container_name: string;
|
|
36
|
+
image: any;
|
|
37
|
+
pull_policy: string;
|
|
38
|
+
restart: string;
|
|
39
|
+
depends_on: {
|
|
40
|
+
db: {
|
|
41
|
+
condition: string;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
env_file: {
|
|
45
|
+
path: string;
|
|
46
|
+
format: string;
|
|
47
|
+
}[];
|
|
48
|
+
ports: string[];
|
|
49
|
+
volumes: string[];
|
|
50
|
+
healthcheck: {
|
|
51
|
+
test: string[];
|
|
52
|
+
interval: string;
|
|
53
|
+
timeout: string;
|
|
54
|
+
retries: number;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
web: {
|
|
58
|
+
container_name: string;
|
|
59
|
+
image: any;
|
|
60
|
+
pull_policy: string;
|
|
61
|
+
restart: string;
|
|
62
|
+
init: boolean;
|
|
63
|
+
env_file: {
|
|
64
|
+
path: string;
|
|
65
|
+
format: string;
|
|
66
|
+
}[];
|
|
67
|
+
environment: {
|
|
68
|
+
FLOWPRESS_WEB_PACKAGE: any;
|
|
69
|
+
NODE_EXTRA_CA_CERTS: string;
|
|
70
|
+
ASTRO_DEV_BACKGROUND: string;
|
|
71
|
+
npm_config_store_dir: string;
|
|
72
|
+
};
|
|
73
|
+
volumes: string[];
|
|
74
|
+
ports: string[];
|
|
75
|
+
healthcheck: {
|
|
76
|
+
test: string[];
|
|
77
|
+
interval: string;
|
|
78
|
+
timeout: string;
|
|
79
|
+
retries: number;
|
|
80
|
+
start_period: string;
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
proxy: {
|
|
84
|
+
container_name: string;
|
|
85
|
+
image: string;
|
|
86
|
+
restart: string;
|
|
87
|
+
ports: string[];
|
|
88
|
+
volumes: string[];
|
|
89
|
+
networks: {
|
|
90
|
+
default: {
|
|
91
|
+
aliases: any;
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
healthcheck: {
|
|
95
|
+
test: string[];
|
|
96
|
+
interval: string;
|
|
97
|
+
timeout: string;
|
|
98
|
+
retries: number;
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
volumes: {
|
|
103
|
+
"cms-db": {
|
|
104
|
+
name: string;
|
|
105
|
+
};
|
|
106
|
+
"pnpm-store": {
|
|
107
|
+
name: string;
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
export function localCaddy(config: any): string;
|
|
112
|
+
export function prepareLocal(root: any, manifest: any, { images }?: {}): {
|
|
113
|
+
env: Record<string, string>;
|
|
114
|
+
cms: any;
|
|
115
|
+
web: any;
|
|
116
|
+
project: string;
|
|
117
|
+
https: number;
|
|
118
|
+
origins: any[];
|
|
119
|
+
hostnames: string[];
|
|
120
|
+
webPort: number;
|
|
121
|
+
cmsPort: number;
|
|
122
|
+
dbPort: number;
|
|
123
|
+
};
|
|
124
|
+
export function localCommand(root: any, manifest: any, command?: string, args?: any[]): Promise<{
|
|
125
|
+
project: any;
|
|
126
|
+
applied: boolean;
|
|
127
|
+
candidates: any;
|
|
128
|
+
deleted: any[];
|
|
129
|
+
skipped: {
|
|
130
|
+
id: any;
|
|
131
|
+
reason: string;
|
|
132
|
+
}[];
|
|
133
|
+
preserved: string;
|
|
134
|
+
usage: any;
|
|
135
|
+
} | {
|
|
136
|
+
project: string;
|
|
137
|
+
usage: any;
|
|
138
|
+
volumes: any;
|
|
139
|
+
images: any;
|
|
140
|
+
note: string;
|
|
141
|
+
started?: undefined;
|
|
142
|
+
frontend?: undefined;
|
|
143
|
+
backend?: undefined;
|
|
144
|
+
stopped?: undefined;
|
|
145
|
+
dataPreserved?: undefined;
|
|
146
|
+
file?: undefined;
|
|
147
|
+
} | {
|
|
148
|
+
started: string[];
|
|
149
|
+
frontend: string;
|
|
150
|
+
backend: string;
|
|
151
|
+
project?: undefined;
|
|
152
|
+
usage?: undefined;
|
|
153
|
+
volumes?: undefined;
|
|
154
|
+
images?: undefined;
|
|
155
|
+
note?: undefined;
|
|
156
|
+
stopped?: undefined;
|
|
157
|
+
dataPreserved?: undefined;
|
|
158
|
+
file?: undefined;
|
|
159
|
+
} | {
|
|
160
|
+
stopped: boolean;
|
|
161
|
+
dataPreserved: boolean;
|
|
162
|
+
project?: undefined;
|
|
163
|
+
usage?: undefined;
|
|
164
|
+
volumes?: undefined;
|
|
165
|
+
images?: undefined;
|
|
166
|
+
note?: undefined;
|
|
167
|
+
started?: undefined;
|
|
168
|
+
frontend?: undefined;
|
|
169
|
+
backend?: undefined;
|
|
170
|
+
file?: undefined;
|
|
171
|
+
} | {
|
|
172
|
+
frontend: any;
|
|
173
|
+
backend: any;
|
|
174
|
+
project?: undefined;
|
|
175
|
+
usage?: undefined;
|
|
176
|
+
volumes?: undefined;
|
|
177
|
+
images?: undefined;
|
|
178
|
+
note?: undefined;
|
|
179
|
+
started?: undefined;
|
|
180
|
+
stopped?: undefined;
|
|
181
|
+
dataPreserved?: undefined;
|
|
182
|
+
file?: undefined;
|
|
183
|
+
} | {
|
|
184
|
+
file: string;
|
|
185
|
+
project?: undefined;
|
|
186
|
+
usage?: undefined;
|
|
187
|
+
volumes?: undefined;
|
|
188
|
+
images?: undefined;
|
|
189
|
+
note?: undefined;
|
|
190
|
+
started?: undefined;
|
|
191
|
+
frontend?: undefined;
|
|
192
|
+
backend?: undefined;
|
|
193
|
+
stopped?: undefined;
|
|
194
|
+
dataPreserved?: undefined;
|
|
195
|
+
} | undefined>;
|
|
196
|
+
export function localRuntime(root: any): string;
|
|
197
|
+
export function localComposeArgs(root: any): any[];
|
|
198
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/ops/local.js"],"names":[],"mappings":"AAcA;;;;;;;;;;;EAeC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCC;AAED,gDAUC;AA6BD;;;;;;;;;;;EAgBC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAuCC;AAtJM,gDAAiE;AACjE,mDAAyH"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { mediaEnvironment } from "./media-config.js";
|
|
2
|
+
import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { stringify } from "yaml";
|
|
5
|
+
import { manifestEnvironment, port, required, shellEnvironment, siteOrigins } from "./environment.js";
|
|
6
|
+
import { identity, profiles, readJson } from "./config.js";
|
|
7
|
+
import { synchronizeEnvironmentFiles } from "./environment-files.js";
|
|
8
|
+
import { capture, run } from "./process.js";
|
|
9
|
+
import { runtimeImages, ensureLocalImages } from "./runtimes.js";
|
|
10
|
+
import { dockerInventory, storageScope, cleanLocalImages } from "./storage.js";
|
|
11
|
+
export const localRuntime = root => join(root, ".local/flowpress/local");
|
|
12
|
+
export const localComposeArgs = root => ["compose", "--project-directory", root, "-f", join(localRuntime(root), "compose.yaml")];
|
|
13
|
+
export function localConfiguration(root, manifest) {
|
|
14
|
+
const env = manifestEnvironment(root, "local");
|
|
15
|
+
const profile = manifest.environments.local.profile || manifest.profile;
|
|
16
|
+
const cms = profiles[profile].includes("cms"), web = profiles[profile].some(value => value.startsWith("web-"));
|
|
17
|
+
const origins = [...(web ? siteOrigins(env) : []), ...(cms ? [env.BACKEND_URL, ...(manifest.environments.local.backendAliases || [])] : [])];
|
|
18
|
+
if (!origins.length)
|
|
19
|
+
throw new Error("Local development requires a CMS or frontend.");
|
|
20
|
+
const https = port(env, "LOCAL_HTTPS_PORT");
|
|
21
|
+
for (const origin of origins) {
|
|
22
|
+
const url = new URL(origin);
|
|
23
|
+
if (url.protocol !== "https:" || Number(url.port || 443) !== https)
|
|
24
|
+
throw new Error("Local URLs must use HTTPS and the development HTTPS port.");
|
|
25
|
+
if (!/^local\.(?:backend\.)?[^/]+$/.test(url.hostname))
|
|
26
|
+
throw new Error("Use local.<domain> and local.backend.<domain> for development URLs.");
|
|
27
|
+
}
|
|
28
|
+
if (cms && !new URL(env.BACKEND_URL).hostname.startsWith("local.backend."))
|
|
29
|
+
throw new Error("The local CMS must use local.backend.<domain>.");
|
|
30
|
+
return { env, cms, web, project: identity(root).slug, https, origins, hostnames: [...new Set(origins.map(origin => new URL(origin).hostname))],
|
|
31
|
+
webPort: port(env, "LOCAL_ASTRO_PORT"), cmsPort: port(env, "LOCAL_BACKEND_HTTP_PORT"), dbPort: port(env, "LOCAL_DB_PORT") };
|
|
32
|
+
}
|
|
33
|
+
export function localServices(config, root) {
|
|
34
|
+
const { env, project, cms, web, https, hostnames, webPort, cmsPort, dbPort } = config;
|
|
35
|
+
const runtime = localRuntime(root), certs = join(runtime, "certs"), volume = name => project + "_" + name;
|
|
36
|
+
const services = {}, volumes = {}, expose = (port, target) => ["127.0.0.1:" + port + ":" + target];
|
|
37
|
+
const rawEnv = file => [{ path: join(runtime, file + ".env"), format: "raw" }];
|
|
38
|
+
if (cms) {
|
|
39
|
+
volumes["cms-db"] = { name: volume("db_data") };
|
|
40
|
+
services.db = { container_name: volume("db"), image: "mariadb:11.4", restart: "unless-stopped", env_file: rawEnv("db"), ports: expose(dbPort, 3306), volumes: ["cms-db:/var/lib/mysql"],
|
|
41
|
+
healthcheck: { test: ["CMD-SHELL", 'mariadb-admin ping -h 127.0.0.1 -uroot -p"$MARIADB_ROOT_PASSWORD" --silent'], interval: "3s", timeout: "3s", retries: 30, start_period: "10s" } };
|
|
42
|
+
services.cms = { container_name: volume("cms"), image: (config.images || runtimeImages()).cms, pull_policy: "missing", restart: "unless-stopped",
|
|
43
|
+
depends_on: { db: { condition: "service_healthy" } }, env_file: rawEnv("cms"), ports: expose(cmsPort, 80), volumes: [root + ":/workspace", certs + ":/certs:ro"],
|
|
44
|
+
healthcheck: { test: ["CMD", "php", "-r", 'exit(@fsockopen("127.0.0.1",80)?0:1);'], interval: "3s", timeout: "3s", retries: 30 } };
|
|
45
|
+
}
|
|
46
|
+
if (web) {
|
|
47
|
+
const webName = readJson(join(root, "apps/web/package.json")).name;
|
|
48
|
+
const mounts = [root + ":/workspace", certs + ":/certs:ro"];
|
|
49
|
+
const directories = { "node-modules": "node_modules", "web-modules": "apps/web/node_modules", "ui-modules": "packages/ui/node_modules", "astro-cache": "apps/web/.astro", "vite-cache": ".local/vite-cache" };
|
|
50
|
+
if (existsSync(join(root, "apps/cms/package.json")))
|
|
51
|
+
directories["cms-modules"] = "apps/cms/node_modules";
|
|
52
|
+
for (const [key, directory] of Object.entries(directories)) {
|
|
53
|
+
volumes[key] = { name: volume(key.replaceAll("-", "_")) };
|
|
54
|
+
mounts.push(key + ":/workspace/" + directory);
|
|
55
|
+
}
|
|
56
|
+
volumes["pnpm-store"] = { name: volume("pnpm_store") };
|
|
57
|
+
mounts.push("pnpm-store:/pnpm/store");
|
|
58
|
+
services.web = { container_name: volume("web"), image: (config.images || runtimeImages()).web, pull_policy: "missing", restart: "unless-stopped", init: true,
|
|
59
|
+
env_file: rawEnv("web"), environment: { FLOWPRESS_WEB_PACKAGE: webName, NODE_EXTRA_CA_CERTS: "/certs/local-dev-root-ca.pem", ASTRO_DEV_BACKGROUND: "1", npm_config_store_dir: "/pnpm/store" },
|
|
60
|
+
volumes: mounts, ports: expose(webPort, webPort),
|
|
61
|
+
healthcheck: { test: ["CMD", "node", "-e", `fetch('http://127.0.0.1:${webPort}/healthz.json',{signal:AbortSignal.timeout(18000)}).then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))`], interval: "5s", timeout: "20s", retries: 24, start_period: "300s" } };
|
|
62
|
+
}
|
|
63
|
+
services.proxy = { container_name: volume("proxy"), image: "caddy:2.10-alpine", restart: "unless-stopped", ports: expose(https, https),
|
|
64
|
+
volumes: [join(runtime, "Caddyfile") + ":/etc/caddy/Caddyfile:ro", certs + ":/certs:ro"],
|
|
65
|
+
networks: { default: { aliases: hostnames } },
|
|
66
|
+
healthcheck: { test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1:2019/config/"], interval: "3s", timeout: "3s", retries: 20 } };
|
|
67
|
+
return { name: project, services, volumes };
|
|
68
|
+
}
|
|
69
|
+
export function localCaddy(config) {
|
|
70
|
+
const { env, https, cms, web } = config;
|
|
71
|
+
const sites = [];
|
|
72
|
+
function site(origins, upstream) {
|
|
73
|
+
sites.push(origins.map(origin => new URL(origin).hostname + ":" + https).join(", ") + " {\n"
|
|
74
|
+
+ " tls /certs/local-dev.pem /certs/local-dev-key.pem\n reverse_proxy " + upstream + " {\n header_up X-Forwarded-Proto https\n }\n}");
|
|
75
|
+
}
|
|
76
|
+
if (web)
|
|
77
|
+
site(siteOrigins(env), "web:" + config.webPort);
|
|
78
|
+
if (cms)
|
|
79
|
+
site([env.BACKEND_URL, ...config.origins.filter(origin => !siteOrigins(env).includes(origin) && origin !== env.BACKEND_URL)], "cms:80");
|
|
80
|
+
return "{\n auto_https disable_redirects\n admin 0.0.0.0:2019\n}\n\n" + sites.join("\n\n") + "\n";
|
|
81
|
+
}
|
|
82
|
+
function writePrivate(file, values) {
|
|
83
|
+
const content = Object.entries(values).filter(([, value]) => value !== undefined).map(([key, value]) => {
|
|
84
|
+
if (/[\r\n]/.test(String(value)))
|
|
85
|
+
throw new Error("Multiline local environment value: " + key);
|
|
86
|
+
return key + "=" + value;
|
|
87
|
+
}).join("\n") + "\n";
|
|
88
|
+
writeFileSync(file, content, { mode: 0o600 });
|
|
89
|
+
}
|
|
90
|
+
function certificates(config, root) {
|
|
91
|
+
const certs = join(localRuntime(root), "certs");
|
|
92
|
+
mkdirSync(certs, { recursive: true });
|
|
93
|
+
const hosts = readFileSync("/etc/hosts", "utf8").split("\n").map(line => line.split("#")[0].trim().split(/\s+/)).filter(fields => ["127.0.0.1", "::1"].includes(fields[0])).flatMap(fields => fields.slice(1));
|
|
94
|
+
const missing = config.hostnames.filter(host => !hosts.includes(host));
|
|
95
|
+
if (missing.length) {
|
|
96
|
+
const line = "127.0.0.1 " + missing.join(" ");
|
|
97
|
+
console.info("[local] Adding hosts: " + line);
|
|
98
|
+
run("sudo", ["tee", "-a", "/etc/hosts"], { input: "\n" + line + "\n", stdio: ["pipe", "inherit", "inherit"] });
|
|
99
|
+
}
|
|
100
|
+
const ca = join(capture("mkcert", ["-CAROOT"]), "rootCA.pem");
|
|
101
|
+
if (!existsSync(ca))
|
|
102
|
+
run("mkcert", ["-install"]);
|
|
103
|
+
copyFileSync(ca, join(certs, "local-dev-root-ca.pem"));
|
|
104
|
+
const domains = [...config.hostnames, "localhost", "127.0.0.1", "::1"].sort().join("\n");
|
|
105
|
+
const recorded = join(certs, "domains.txt");
|
|
106
|
+
if (!existsSync(recorded) || readFileSync(recorded, "utf8") !== domains) {
|
|
107
|
+
run("mkcert", ["-cert-file", join(certs, "local-dev.pem"), "-key-file", join(certs, "local-dev-key.pem"), ...domains.split("\n")]);
|
|
108
|
+
writeFileSync(recorded, domains);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export function prepareLocal(root, manifest, { images } = {}) {
|
|
112
|
+
synchronizeEnvironmentFiles(root, { manifest, apply: true, localSecrets: true });
|
|
113
|
+
const config = localConfiguration(root, manifest), { env } = config, runtime = localRuntime(root);
|
|
114
|
+
config.images = images || runtimeImages();
|
|
115
|
+
mkdirSync(runtime, { recursive: true, mode: 0o700 });
|
|
116
|
+
if (config.cms) {
|
|
117
|
+
mediaEnvironment(manifest, "local", env, { strict: true });
|
|
118
|
+
for (const key of ["DB_NAME", "DB_USER", "DB_PASSWORD", "DB_ROOT_PASSWORD", "DB_PREFIX"])
|
|
119
|
+
required(env, key);
|
|
120
|
+
writePrivate(join(runtime, "db.env"), { MARIADB_DATABASE: env.DB_NAME, MARIADB_USER: env.DB_USER, MARIADB_PASSWORD: env.DB_PASSWORD, MARIADB_ROOT_PASSWORD: env.DB_ROOT_PASSWORD });
|
|
121
|
+
writePrivate(join(runtime, "cms.env"), { ...Object.fromEntries(Object.entries(shellEnvironment(env)).filter(([key]) => !/^(DB_ROOT_PASSWORD|COMPOSER_AUTH|WP_PASSWORD)$/.test(key))), DB_HOST: "db:3306" });
|
|
122
|
+
}
|
|
123
|
+
writePrivate(join(runtime, "web.env"), Object.fromEntries(Object.entries(env).filter(([key]) => /^(APP_ENV|ASTRO_OUTPUT_MODE|SITE_URL|SITE_ALIASES_JSON|BACKEND_URL|BACKEND_GRAPHQL_URL|FRONTEND_BACKEND_TARGET|FLOWPRESS_COMPOSITION_MODE|FLOWPRESS_MEDIA|LOCAL_ASTRO_PORT|SF_DIST_DIR|PROJECT_NAME|PROJECT_SLUG)$/.test(key))));
|
|
124
|
+
// Escape only Compose interpolation. Environment files use raw format.
|
|
125
|
+
writeFileSync(join(runtime, "compose.yaml"), stringify(localServices(config, root)).replaceAll("$", () => "$$"));
|
|
126
|
+
writeFileSync(join(runtime, "Caddyfile"), localCaddy(config));
|
|
127
|
+
return config;
|
|
128
|
+
}
|
|
129
|
+
export async function localCommand(root, manifest, command = "start", args = []) {
|
|
130
|
+
if (command === "storage" || command === "clean") {
|
|
131
|
+
const inventory = dockerInventory(), scope = storageScope(root, manifest);
|
|
132
|
+
if (command === "storage")
|
|
133
|
+
return { project: scope.project, usage: inventory.usage, volumes: inventory.details?.Volumes?.filter(item => item.Name.startsWith(scope.project + "_")),
|
|
134
|
+
images: cleanLocalImages(inventory, scope).candidates, note: "Shared layers are counted once by Docker. Virtual image sizes cannot be added to estimate reclaimed bytes. Volumes and global build cache are reported only." };
|
|
135
|
+
return cleanLocalImages(inventory, scope, { apply: args.includes("--apply"), includeLegacy: args.includes("--include-legacy") });
|
|
136
|
+
}
|
|
137
|
+
if (command === "start") {
|
|
138
|
+
run("docker", ["info"], { stdio: "ignore" });
|
|
139
|
+
const config = prepareLocal(root, manifest);
|
|
140
|
+
ensureLocalImages(Object.values(localServices(config, root).services).map(service => service.image));
|
|
141
|
+
certificates(config, root);
|
|
142
|
+
if (config.cms && !existsSync(join(root, "apps/cms/vendor/autoload.php")))
|
|
143
|
+
run("composer", ["install", "--working-dir=apps/cms", "--no-interaction", "--prefer-dist"], { cwd: root });
|
|
144
|
+
console.info("[local] Starting " + Object.keys(localServices(config, root).services).join(", ") + "…");
|
|
145
|
+
run("docker", [...localComposeArgs(root), "up", "-d", "--no-build", "--pull", "never", "--wait", "--wait-timeout", "600"], { cwd: root });
|
|
146
|
+
console.info("[local] Frontend: " + config.env.SITE_URL + "\n[local] Backend: " + config.env.BACKEND_URL);
|
|
147
|
+
return { started: Object.keys(localServices(config, root).services), frontend: config.env.SITE_URL, backend: config.env.BACKEND_URL };
|
|
148
|
+
}
|
|
149
|
+
if (!existsSync(join(localRuntime(root), "compose.yaml")))
|
|
150
|
+
throw new Error("Run flowpress-ops local start first.");
|
|
151
|
+
if (command === "stop") {
|
|
152
|
+
run("docker", [...localComposeArgs(root), "stop"]);
|
|
153
|
+
return { stopped: true, dataPreserved: true };
|
|
154
|
+
}
|
|
155
|
+
if (command === "status" || command === "doctor") {
|
|
156
|
+
console.log(capture("docker", [...localComposeArgs(root), "ps"]));
|
|
157
|
+
return { frontend: manifest.environments.local.frontendUrl, backend: manifest.environments.local.backendUrl };
|
|
158
|
+
}
|
|
159
|
+
if (command === "logs") {
|
|
160
|
+
run("docker", [...localComposeArgs(root), "logs", "--tail", "100", ...args]);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (command === "exec") {
|
|
164
|
+
if (!args.length)
|
|
165
|
+
throw new Error("Use local exec <service> <command>.");
|
|
166
|
+
run("docker", [...localComposeArgs(root), "exec", "-T", ...args]);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (command === "backup") {
|
|
170
|
+
const directory = join(root, "db");
|
|
171
|
+
mkdirSync(directory, { recursive: true });
|
|
172
|
+
const file = join(directory, identity(root).slug + "-" + new Date().toISOString().replaceAll(":", "-") + ".sql");
|
|
173
|
+
const dump = capture("docker", [...localComposeArgs(root), "exec", "-T", "db", "sh", "-c", 'mariadb-dump -u"$MARIADB_USER" -p"$MARIADB_PASSWORD" --single-transaction "$MARIADB_DATABASE"']);
|
|
174
|
+
writeFileSync(file, dump + "\n", { mode: 0o600 });
|
|
175
|
+
return { file };
|
|
176
|
+
}
|
|
177
|
+
if (command === "datagrip") {
|
|
178
|
+
const config = localConfiguration(root, manifest);
|
|
179
|
+
const file = join(root, ".idea/dataSources.xml");
|
|
180
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
181
|
+
const xml = value => String(value).replace(/[<>&"']/g, character => ({ "<": "<", ">": ">", "&": "&", '"': """, "'": "'" })[character]);
|
|
182
|
+
writeFileSync(file, `<project version="4"><component name="DataSourceManagerImpl" format="xml"><data-source source="LOCAL" name="${xml(config.project)}"><driver-ref>mariadb</driver-ref><jdbc-driver>org.mariadb.jdbc.Driver</jdbc-driver><jdbc-url>jdbc:mariadb://127.0.0.1:${config.dbPort}/${xml(config.env.DB_NAME)}</jdbc-url><user-name>${xml(config.env.DB_USER)}</user-name></data-source></component></project>\n`);
|
|
183
|
+
return { file };
|
|
184
|
+
}
|
|
185
|
+
throw new Error("Use local start|stop|status|doctor|logs|exec|backup|datagrip|storage|clean.");
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/ops/local.js"],"names":[],"mappings":"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"}
|