@styleflow.app/flowpress-deploy 1.0.0-beta.3 → 1.0.0-beta.31

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 (175) hide show
  1. package/CHANGELOG.md +162 -0
  2. package/README.md +5 -0
  3. package/composer.json +1 -1
  4. package/containers/cms/Dockerfile +35 -0
  5. package/containers/cms/Dockerfile.dockerignore +20 -0
  6. package/containers/cms/healthz.php +17 -0
  7. package/containers/cms/install-languages.sh +16 -0
  8. package/containers/cms/mpm.conf +10 -0
  9. package/containers/cms/php.ini +16 -0
  10. package/containers/cms/sanitize-integrations.php +14 -0
  11. package/containers/cms/sanitize.php +40 -0
  12. package/containers/cms/smtp.php +13 -0
  13. package/containers/cms/vhost.conf +61 -0
  14. package/containers/cms/wp-cli.yml +1 -0
  15. package/containers/local/cms/Dockerfile +18 -0
  16. package/containers/local/cms/entrypoint.sh +7 -0
  17. package/containers/local/cms/php.ini +8 -0
  18. package/containers/local/cms/vhost.conf +14 -0
  19. package/containers/local/runtimes.json +14 -0
  20. package/containers/local/web/Dockerfile +8 -0
  21. package/containers/local/web/entrypoint.sh +21 -0
  22. package/containers/php-runtime/Dockerfile +21 -0
  23. package/containers/web-ssr/Dockerfile +27 -0
  24. package/containers/web-ssr/Dockerfile.dockerignore +10 -0
  25. package/containers/web-static/Caddyfile +40 -0
  26. package/containers/web-static/Dockerfile +17 -0
  27. package/containers/web-static/Dockerfile.dockerignore +7 -0
  28. package/dist/development.d.ts +12 -0
  29. package/dist/development.d.ts.map +1 -0
  30. package/dist/development.js +57 -0
  31. package/dist/development.js.map +1 -0
  32. package/dist/node-fetch.d.ts +3 -0
  33. package/dist/node-fetch.d.ts.map +1 -0
  34. package/dist/node-fetch.js +20 -0
  35. package/dist/node-fetch.js.map +1 -0
  36. package/dist/ops/bootstrap.d.ts +24 -0
  37. package/dist/ops/bootstrap.d.ts.map +1 -0
  38. package/dist/ops/bootstrap.js +156 -0
  39. package/dist/ops/bootstrap.js.map +1 -0
  40. package/dist/ops/build.d.ts +45 -0
  41. package/dist/ops/build.d.ts.map +1 -0
  42. package/dist/ops/build.js +119 -0
  43. package/dist/ops/build.js.map +1 -0
  44. package/dist/ops/check.d.ts +14 -0
  45. package/dist/ops/check.d.ts.map +1 -0
  46. package/dist/ops/check.js +42 -0
  47. package/dist/ops/check.js.map +1 -0
  48. package/dist/ops/cli.d.ts +3 -0
  49. package/dist/ops/cli.d.ts.map +1 -0
  50. package/dist/ops/cli.js +198 -0
  51. package/dist/ops/cli.js.map +1 -0
  52. package/dist/ops/cms-migrate.d.ts +14 -0
  53. package/dist/ops/cms-migrate.d.ts.map +1 -0
  54. package/dist/ops/cms-migrate.js +133 -0
  55. package/dist/ops/cms-migrate.js.map +1 -0
  56. package/dist/ops/cms-template/command.d.mts +19 -0
  57. package/dist/ops/cms-template/command.d.mts.map +1 -0
  58. package/dist/ops/cms-template/command.mjs +145 -0
  59. package/dist/ops/cms-template/command.mjs.map +1 -0
  60. package/dist/ops/cms-template/confirm.d.mts +11 -0
  61. package/dist/ops/cms-template/confirm.d.mts.map +1 -0
  62. package/dist/ops/cms-template/confirm.mjs +18 -0
  63. package/dist/ops/cms-template/confirm.mjs.map +1 -0
  64. package/dist/ops/cms-template/entry.d.mts +2 -0
  65. package/dist/ops/cms-template/entry.d.mts.map +1 -0
  66. package/dist/ops/cms-template/entry.mjs +22 -0
  67. package/dist/ops/cms-template/entry.mjs.map +1 -0
  68. package/dist/ops/cms-template/git.d.mts +7 -0
  69. package/dist/ops/cms-template/git.d.mts.map +1 -0
  70. package/dist/ops/cms-template/git.mjs +22 -0
  71. package/dist/ops/cms-template/git.mjs.map +1 -0
  72. package/dist/ops/cms-template/plan.d.mts +7 -0
  73. package/dist/ops/cms-template/plan.d.mts.map +1 -0
  74. package/dist/ops/cms-template/plan.mjs +54 -0
  75. package/dist/ops/cms-template/plan.mjs.map +1 -0
  76. package/dist/ops/cms-template/store.d.mts +21 -0
  77. package/dist/ops/cms-template/store.d.mts.map +1 -0
  78. package/dist/ops/cms-template/store.mjs +184 -0
  79. package/dist/ops/cms-template/store.mjs.map +1 -0
  80. package/dist/ops/cms-template/target.d.mts +15 -0
  81. package/dist/ops/cms-template/target.d.mts.map +1 -0
  82. package/dist/ops/cms-template/target.mjs +24 -0
  83. package/dist/ops/cms-template/target.mjs.map +1 -0
  84. package/dist/ops/cms-template/transport.d.mts +26 -0
  85. package/dist/ops/cms-template/transport.d.mts.map +1 -0
  86. package/dist/ops/cms-template/transport.mjs +115 -0
  87. package/dist/ops/cms-template/transport.mjs.map +1 -0
  88. package/dist/ops/config.d.ts +54 -0
  89. package/dist/ops/config.d.ts.map +1 -0
  90. package/dist/ops/config.js +221 -0
  91. package/dist/ops/config.js.map +1 -0
  92. package/dist/ops/coolify.d.ts +2 -0
  93. package/dist/ops/coolify.d.ts.map +1 -0
  94. package/dist/ops/coolify.js +44 -0
  95. package/dist/ops/coolify.js.map +1 -0
  96. package/dist/ops/data.d.ts +31 -0
  97. package/dist/ops/data.d.ts.map +1 -0
  98. package/dist/ops/data.js +165 -0
  99. package/dist/ops/data.js.map +1 -0
  100. package/dist/ops/deploy.d.ts +38 -0
  101. package/dist/ops/deploy.d.ts.map +1 -0
  102. package/dist/ops/deploy.js +127 -0
  103. package/dist/ops/deploy.js.map +1 -0
  104. package/dist/ops/editorial.d.ts +23 -0
  105. package/dist/ops/editorial.d.ts.map +1 -0
  106. package/dist/ops/editorial.js +79 -0
  107. package/dist/ops/editorial.js.map +1 -0
  108. package/dist/ops/environment-files.d.ts +9 -0
  109. package/dist/ops/environment-files.d.ts.map +1 -0
  110. package/dist/ops/environment-files.js +127 -0
  111. package/dist/ops/environment-files.js.map +1 -0
  112. package/dist/ops/environment.d.ts +31 -0
  113. package/dist/ops/environment.d.ts.map +1 -0
  114. package/dist/ops/environment.js +165 -0
  115. package/dist/ops/environment.js.map +1 -0
  116. package/dist/ops/features.d.ts +12 -0
  117. package/dist/ops/features.d.ts.map +1 -0
  118. package/dist/ops/features.js +71 -0
  119. package/dist/ops/features.js.map +1 -0
  120. package/dist/ops/health.d.ts +26 -0
  121. package/dist/ops/health.d.ts.map +1 -0
  122. package/dist/ops/health.js +27 -0
  123. package/dist/ops/health.js.map +1 -0
  124. package/dist/ops/local.d.ts +198 -0
  125. package/dist/ops/local.d.ts.map +1 -0
  126. package/dist/ops/local.js +187 -0
  127. package/dist/ops/local.js.map +1 -0
  128. package/dist/ops/media-config.d.ts +61 -0
  129. package/dist/ops/media-config.d.ts.map +1 -0
  130. package/dist/ops/media-config.js +96 -0
  131. package/dist/ops/media-config.js.map +1 -0
  132. package/dist/ops/media.d.ts +47 -0
  133. package/dist/ops/media.d.ts.map +1 -0
  134. package/dist/ops/media.js +81 -0
  135. package/dist/ops/media.js.map +1 -0
  136. package/dist/ops/monitor.d.ts +25 -0
  137. package/dist/ops/monitor.d.ts.map +1 -0
  138. package/dist/ops/monitor.js +143 -0
  139. package/dist/ops/monitor.js.map +1 -0
  140. package/dist/ops/process.d.ts +9 -0
  141. package/dist/ops/process.d.ts.map +1 -0
  142. package/dist/ops/process.js +56 -0
  143. package/dist/ops/process.js.map +1 -0
  144. package/dist/ops/provision.d.ts +41 -0
  145. package/dist/ops/provision.d.ts.map +1 -0
  146. package/dist/ops/provision.js +268 -0
  147. package/dist/ops/provision.js.map +1 -0
  148. package/dist/ops/registry.d.ts +14 -0
  149. package/dist/ops/registry.d.ts.map +1 -0
  150. package/dist/ops/registry.js +112 -0
  151. package/dist/ops/registry.js.map +1 -0
  152. package/dist/ops/release.d.ts +26 -0
  153. package/dist/ops/release.d.ts.map +1 -0
  154. package/dist/ops/release.js +79 -0
  155. package/dist/ops/release.js.map +1 -0
  156. package/dist/ops/runtimes.d.ts +16 -0
  157. package/dist/ops/runtimes.d.ts.map +1 -0
  158. package/dist/ops/runtimes.js +70 -0
  159. package/dist/ops/runtimes.js.map +1 -0
  160. package/dist/ops/s3.d.ts +8 -0
  161. package/dist/ops/s3.d.ts.map +1 -0
  162. package/dist/ops/s3.js +38 -0
  163. package/dist/ops/s3.js.map +1 -0
  164. package/dist/ops/static-config.d.ts +14 -0
  165. package/dist/ops/static-config.d.ts.map +1 -0
  166. package/dist/ops/static-config.js +92 -0
  167. package/dist/ops/static-config.js.map +1 -0
  168. package/dist/ops/storage.d.ts +39 -0
  169. package/dist/ops/storage.d.ts.map +1 -0
  170. package/dist/ops/storage.js +108 -0
  171. package/dist/ops/storage.js.map +1 -0
  172. package/flowpress-deploy.php +2 -2
  173. package/includes/pilot-aliases.php +69 -0
  174. package/package.json +43 -6
  175. package/schema/deployment.schema.json +306 -0
@@ -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 => ({ "<": "&lt;", ">": "&gt;", "&": "&amp;", '"': "&quot;", "'": "&apos;" })[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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"}
@@ -0,0 +1,61 @@
1
+ export function validateMediaValue(value: any): any;
2
+ export function mediaConfiguration(manifest: any, name: any): {
3
+ storage: any;
4
+ provider: any;
5
+ shared: any;
6
+ prefix: any;
7
+ publicUrl: any;
8
+ };
9
+ export function mediaCredentialKeys(provider: any): string[];
10
+ export function mediaEnvironment(manifest: any, name: any, values?: {}, { strict }?: {
11
+ strict?: boolean | undefined;
12
+ }): {
13
+ config: {
14
+ publicUrl: any;
15
+ storage: any;
16
+ provider: any;
17
+ shared: any;
18
+ prefix: any;
19
+ };
20
+ missing: any;
21
+ values: {
22
+ FLOWPRESS_MEDIA_STORAGE: any;
23
+ FLOWPRESS_MEDIA_PROVIDER: any;
24
+ FLOWPRESS_MEDIA_SHARED: string;
25
+ FLOWPRESS_MEDIA_PREFIX: any;
26
+ FLOWPRESS_MEDIA: any;
27
+ };
28
+ };
29
+ export function sharedMediaImport(manifest: any, name: any, source: any, loadEnvironment: any): boolean;
30
+ /** Environment-owned native Advanced Media Offloader configuration. */
31
+ export const mediaProviders: Readonly<{
32
+ aws_s3: {
33
+ prefix: string;
34
+ required: string[];
35
+ };
36
+ cloudflare_r2: {
37
+ prefix: string;
38
+ required: string[];
39
+ };
40
+ digitalocean: {
41
+ prefix: string;
42
+ required: string[];
43
+ };
44
+ backblaze_b2: {
45
+ prefix: string;
46
+ required: string[];
47
+ };
48
+ wasabi: {
49
+ prefix: string;
50
+ required: string[];
51
+ };
52
+ minio: {
53
+ prefix: string;
54
+ required: string[];
55
+ };
56
+ }>;
57
+ export const mediaFields: string[];
58
+ export function withoutMediaCredentials(values: any): {
59
+ [k: string]: any;
60
+ };
61
+ //# sourceMappingURL=media-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-config.d.ts","sourceRoot":"","sources":["../../src/ops/media-config.js"],"names":[],"mappings":"AAUA,oDAQC;AACD;;;;;;EAaC;AACD,6DAGC;AAOD;;;;;;;;;;;;;;;;;;EAiBC;AAGD,wGAWC;AA1ED,uEAAuE;AACvE;;;;;;;;;;;;;;;;;;;;;;;;;GAOG;AACH,mCAAiJ;AA4B1I;;EAAiI"}
@@ -0,0 +1,96 @@
1
+ /** Environment-owned native Advanced Media Offloader configuration. */
2
+ export const mediaProviders = Object.freeze({
3
+ aws_s3: { prefix: 'AWS', required: ['KEY', 'SECRET', 'BUCKET', 'DOMAIN'] },
4
+ cloudflare_r2: { prefix: 'CLOUDFLARE_R2', required: ['KEY', 'SECRET', 'BUCKET', 'DOMAIN', 'ENDPOINT'] },
5
+ digitalocean: { prefix: 'DOS', required: ['KEY', 'SECRET', 'BUCKET', 'DOMAIN', 'ENDPOINT'] },
6
+ backblaze_b2: { prefix: 'BACKBLAZE_B2', required: ['KEY', 'SECRET', 'BUCKET', 'DOMAIN', 'ENDPOINT'] },
7
+ wasabi: { prefix: 'WASABI', required: ['KEY', 'SECRET', 'BUCKET', 'DOMAIN'] },
8
+ minio: { prefix: 'MINIO', required: ['KEY', 'SECRET', 'BUCKET', 'DOMAIN', 'ENDPOINT'] },
9
+ });
10
+ export const mediaFields = ['KEY', 'SECRET', 'BUCKET', 'DOMAIN', 'ENDPOINT', 'REGION', 'PATH_STYLE_ENDPOINT', 'APPEND_BUCKET_TO_DOMAIN', 'NAME'];
11
+ export function validateMediaValue(value) {
12
+ if (!value || typeof value !== 'object' || Array.isArray(value) || !['local', 's3'].includes(value.storage))
13
+ throw new Error('Schema 2 media requires storage: local|s3.');
14
+ if (Object.keys(value).some(key => !['storage', 'provider', 'shared', 'prefix'].includes(key)))
15
+ throw new Error('Unknown media configuration property.');
16
+ if (value.storage === 'local' && Object.keys(value).some(key => key !== 'storage'))
17
+ throw new Error('Local media cannot declare cloud settings.');
18
+ if (value.storage === 's3' && !mediaProviders[value.provider])
19
+ throw new Error('Unsupported Advanced Media Offloader provider.');
20
+ if (value.shared !== undefined && typeof value.shared !== 'boolean')
21
+ throw new Error('media.shared must be boolean.');
22
+ if (value.prefix !== undefined && (typeof value.prefix !== 'string' || /(?:^|\/)\.\.(?:\/|$)|[\\\r\n?#]/.test(value.prefix) || value.prefix.startsWith('/')))
23
+ throw new Error('Invalid relative media prefix.');
24
+ return value;
25
+ }
26
+ export function mediaConfiguration(manifest, name) {
27
+ const target = manifest.environments[name];
28
+ if (!target)
29
+ throw new Error('Unknown media environment: ' + name);
30
+ const sourceName = target.backend || name, source = manifest.environments[sourceName];
31
+ if (!source)
32
+ throw new Error('Unknown media backend: ' + sourceName);
33
+ const value = source.media ?? manifest.media;
34
+ if (manifest.schemaVersion === 1) {
35
+ if (!['local', 's3'].includes(value))
36
+ throw new Error('Schema 1 media must be local|s3. Migrate explicitly before using media objects.');
37
+ return { storage: value, provider: value === 's3' ? 'cloudflare_r2' : '', shared: false, prefix: sourceName === 'production' ? '' : sourceName, publicUrl: source.mediaUrl || '' };
38
+ }
39
+ validateMediaValue(value);
40
+ if (value.storage === 's3' && !source.mediaUrl)
41
+ throw new Error('Cloud media requires mediaUrl for ' + sourceName + '.');
42
+ return { storage: value.storage, provider: value.provider || '', shared: value.shared || false, prefix: value.storage === 'local' ? '' : value.prefix ?? (value.shared || sourceName === 'production' ? '' : sourceName), publicUrl: source.mediaUrl || '' };
43
+ }
44
+ export function mediaCredentialKeys(provider) {
45
+ const definition = mediaProviders[provider];
46
+ return definition ? mediaFields.map(field => 'ADVMO_' + definition.prefix + '_' + field) : [];
47
+ }
48
+ export const withoutMediaCredentials = values => Object.fromEntries(Object.entries(values).filter(([key]) => !key.startsWith('ADVMO_')));
49
+ function normalizedUrl(value) {
50
+ const url = new URL(value);
51
+ if (!['https:', 'http:'].includes(url.protocol) || url.username || url.password || url.search || url.hash)
52
+ throw new Error('Invalid media endpoint or public URL.');
53
+ return url.href.replace(/\/$/, '');
54
+ }
55
+ export function mediaEnvironment(manifest, name, values = {}, { strict = false } = {}) {
56
+ const config = mediaConfiguration(manifest, name), credentials = {}, definition = mediaProviders[config.provider];
57
+ for (const key of mediaCredentialKeys(config.provider))
58
+ if (values[key] !== undefined && values[key] !== '')
59
+ credentials[key] = values[key];
60
+ const prefix = definition ? 'ADVMO_' + definition.prefix + '_' : '';
61
+ const domain = credentials[prefix + 'DOMAIN'];
62
+ let publicUrl = config.publicUrl || domain || '';
63
+ if (publicUrl)
64
+ publicUrl = normalizedUrl(publicUrl);
65
+ if (domain && manifest.schemaVersion === 2) {
66
+ let effectiveDomain = normalizedUrl(domain);
67
+ if (config.provider === 'minio' && !['false', '0'].includes(String(credentials[prefix + 'APPEND_BUCKET_TO_DOMAIN'])))
68
+ effectiveDomain += '/' + credentials[prefix + 'BUCKET'];
69
+ if (effectiveDomain !== publicUrl)
70
+ throw new Error('mediaUrl conflicts with ' + prefix + 'DOMAIN for ' + name + '.');
71
+ }
72
+ if (credentials[prefix + 'ENDPOINT'])
73
+ normalizedUrl(credentials[prefix + 'ENDPOINT']);
74
+ for (const field of ['PATH_STYLE_ENDPOINT', 'APPEND_BUCKET_TO_DOMAIN'])
75
+ if (credentials[prefix + field] !== undefined && !['true', 'false', '0', '1'].includes(String(credentials[prefix + field])))
76
+ throw new Error('Invalid boolean ' + prefix + field + '.');
77
+ const missing = config.storage === 's3' ? definition.required.map(field => prefix + field).filter(key => !String(credentials[key] || '').trim()) : [];
78
+ if (strict && missing.length)
79
+ throw new Error('Incomplete media configuration for ' + name + ': ' + missing.join(', '));
80
+ return { config: { ...config, publicUrl }, missing, values: { FLOWPRESS_MEDIA_STORAGE: config.storage, FLOWPRESS_MEDIA_PROVIDER: config.provider, FLOWPRESS_MEDIA_SHARED: String(config.shared), FLOWPRESS_MEDIA_PREFIX: config.prefix, FLOWPRESS_MEDIA: publicUrl, ...credentials } };
81
+ }
82
+ // Imported attachment paths can be retained only for a proven shared namespace.
83
+ export function sharedMediaImport(manifest, name, source, loadEnvironment) {
84
+ const target = mediaConfiguration(manifest, name);
85
+ if (manifest.schemaVersion !== 2 || target.storage !== 's3' || !target.shared)
86
+ return false;
87
+ const origin = mediaConfiguration(manifest, source);
88
+ const key = 'ADVMO_' + mediaProviders[target.provider].prefix + '_BUCKET';
89
+ const targetBucket = loadEnvironment(name)[key], sourceBucket = loadEnvironment(source)[key];
90
+ if (origin.storage !== 's3' || !origin.shared || target.provider !== origin.provider || target.prefix !== origin.prefix
91
+ || normalizedUrl(target.publicUrl) !== normalizedUrl(origin.publicUrl) || !targetBucket || targetBucket !== sourceBucket) {
92
+ throw new Error('Shared media import requires matching source/target provider, bucket, mediaUrl and prefix. Configure both profiles explicitly before preparing data.');
93
+ }
94
+ return true;
95
+ }
96
+ //# sourceMappingURL=media-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-config.js","sourceRoot":"","sources":["../../src/ops/media-config.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export function migrateMediaManifest(root: any, { apply }?: {
2
+ apply?: boolean | undefined;
3
+ }): {
4
+ changed: boolean;
5
+ applied: boolean;
6
+ schemaVersion?: undefined;
7
+ manifest?: undefined;
8
+ } | {
9
+ changed: boolean;
10
+ applied: boolean;
11
+ schemaVersion: number;
12
+ manifest: any;
13
+ };
14
+ export function mediaProgram(check: any): string;
15
+ export function mediaRuntimeValidation(config: any, runtime: any): {
16
+ configurationMatches: false;
17
+ ok: boolean;
18
+ error: string;
19
+ requiredCore?: undefined;
20
+ } | {
21
+ configurationMatches: true;
22
+ ok: boolean;
23
+ error: string;
24
+ requiredCore: string;
25
+ } | {
26
+ configurationMatches: true;
27
+ ok: boolean;
28
+ error?: undefined;
29
+ requiredCore?: undefined;
30
+ };
31
+ export function mediaCommand(root: any, manifest: any, command: any, name: any): {
32
+ credentials: {
33
+ complete: boolean;
34
+ missing: any;
35
+ present: {
36
+ [k: string]: boolean;
37
+ };
38
+ };
39
+ ok: boolean;
40
+ publicUrl: any;
41
+ storage: any;
42
+ provider: any;
43
+ shared: any;
44
+ prefix: any;
45
+ environment: any;
46
+ };
47
+ //# sourceMappingURL=media.d.ts.map