@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,40 @@
1
+ # Static production frontend. Cloudflare terminates TLS and caches at the edge;
2
+ # Traefik forwards plain HTTP to port 8080.
3
+ {
4
+ admin off
5
+ auto_https off
6
+ persist_config off
7
+ servers {
8
+ trusted_proxies static private_ranges
9
+ }
10
+ }
11
+
12
+ :8080 {
13
+ header X-Content-Type-Options nosniff
14
+ header Referrer-Policy strict-origin-when-cross-origin
15
+ @internal path /.container* /.flowpress* /.env* /server/*
16
+ respond @internal 404
17
+ root * /srv/site
18
+ encode zstd gzip
19
+
20
+ # Redirects, headers and media proxies generated from the Astro build.
21
+ import /srv/site/.container/routes.caddy
22
+
23
+ header /healthz.json Cache-Control "no-store"
24
+ header /_astro/* Cache-Control "public, max-age=31536000, immutable"
25
+ # HTML revalidates in browsers; Cloudflare keeps it at the edge until the
26
+ # deploy purge (see docs/wiki/deploy/06-cloudflare.md).
27
+ @html path / *.html */
28
+ header @html Cache-Control "public, max-age=0, must-revalidate"
29
+
30
+ file_server {
31
+ hide .container .flowpress-baseline.json .flowpress-fingerprint _redirects _headers _routes.json
32
+ }
33
+
34
+ handle_errors 404 {
35
+ header Cache-Control "no-store"
36
+ header CDN-Cache-Control "no-store"
37
+ rewrite * /404.html
38
+ file_server
39
+ }
40
+ }
@@ -0,0 +1,17 @@
1
+ # syntax=docker/dockerfile:1.7
2
+ FROM caddy:2.10-alpine
3
+ RUN apk add --no-cache libcap && setcap -r /usr/bin/caddy && apk del libcap \
4
+ && find / -xdev -perm /6000 -type f -exec chmod a-s {} + 2>/dev/null
5
+ COPY --from=flowpress /web-static/Caddyfile /etc/caddy/Caddyfile
6
+ ARG DIST_DIR
7
+ COPY $DIST_DIR/ /srv/site/
8
+ RUN test -f /srv/site/.container/routes.caddy && caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
9
+ ARG RELEASE_SHA=unknown
10
+ ARG FRONTEND_BUILD_ID=unknown
11
+ ENV RELEASE_SHA=$RELEASE_SHA
12
+ LABEL org.opencontainers.image.revision=$RELEASE_SHA
13
+ LABEL app.flowpress.build-id=$FRONTEND_BUILD_ID
14
+ USER 65534:65534
15
+ EXPOSE 8080
16
+ HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 CMD wget -q -O /dev/null http://127.0.0.1:8080/healthz.json || exit 1
17
+ CMD ["caddy", "run", "--config", "/etc/caddy/Caddyfile", "--adapter", "caddyfile"]
@@ -0,0 +1,7 @@
1
+ .git
2
+ node_modules
3
+ .env*
4
+ .secrets
5
+ .local
6
+ apps/cms
7
+ docs
@@ -0,0 +1,12 @@
1
+ export function prepareDevelopmentSafelist(output: any, fallback: any): {
2
+ source: string;
3
+ };
4
+ export function waitForHttp(url: any, options?: {}): Promise<any>;
5
+ export function refreshGeneratedFile(options: any): Promise<{
6
+ source: string;
7
+ warning?: undefined;
8
+ } | {
9
+ source: string;
10
+ warning: string;
11
+ }>;
12
+ //# sourceMappingURL=development.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development.d.ts","sourceRoot":"","sources":["../src/development.js"],"names":[],"mappings":"AAKA;;EAIC;AAED,kEAyBC;AAGD;;;;;;GAqBC"}
@@ -0,0 +1,57 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { existsSync, readFileSync, writeFileSync } from "node:fs";
3
+ // Development must not scan every remote WordPress route before opening the
4
+ // server. Strict builds still refresh the complete safelist from the CMS.
5
+ export function prepareDevelopmentSafelist(output, fallback) {
6
+ const cached = existsSync(output) && readFileSync(output, "utf8").trim();
7
+ if (!cached)
8
+ writeFileSync(output, fallback);
9
+ return { source: cached ? "cache" : "structural" };
10
+ }
11
+ export async function waitForHttp(url, options = {}) {
12
+ const timeoutMs = options.timeoutMs ?? 60_000;
13
+ const intervalMs = options.intervalMs ?? 500;
14
+ const fetchImplementation = options.fetchImplementation ?? fetch;
15
+ const deadline = Date.now() + timeoutMs;
16
+ let lastError;
17
+ do {
18
+ try {
19
+ const response = await fetchImplementation(url, {
20
+ redirect: "manual",
21
+ signal: AbortSignal.timeout(Math.min(5_000, timeoutMs))
22
+ });
23
+ if (response.status > 0)
24
+ return response;
25
+ }
26
+ catch (error) {
27
+ lastError = error;
28
+ }
29
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
30
+ } while (Date.now() < deadline);
31
+ throw new Error(`Timed out waiting for ${url}.`, lastError === undefined ? undefined : { cause: lastError });
32
+ }
33
+ export async function refreshGeneratedFile(options) {
34
+ try {
35
+ const generated = await options.generate();
36
+ await writeFile(options.outputPath, generated);
37
+ return { source: "cms" };
38
+ }
39
+ catch (error) {
40
+ if (options.mode === "strict")
41
+ throw error;
42
+ const message = error instanceof Error ? error.message : String(error);
43
+ const existing = await readFile(options.outputPath, "utf8").catch(() => "");
44
+ if (existing.trim()) {
45
+ return {
46
+ source: "cache",
47
+ warning: `CMS unavailable; preserved generated cache. ${message}`
48
+ };
49
+ }
50
+ await writeFile(options.outputPath, options.structuralFallback);
51
+ return {
52
+ source: "structural",
53
+ warning: `CMS unavailable; wrote structural fallback. ${message}`
54
+ };
55
+ }
56
+ }
57
+ //# sourceMappingURL=development.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"development.js","sourceRoot":"","sources":["../src/development.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Fetch adapter for proxies running on Node, whose fetch decompresses bodies. */
2
+ export declare const nodeProxyFetch: typeof fetch;
3
+ //# sourceMappingURL=node-fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-fetch.d.ts","sourceRoot":"","sources":["../src/node-fetch.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,eAAO,MAAM,cAAc,EAAE,OAAO,KAgBnC,CAAC"}
@@ -0,0 +1,20 @@
1
+ /** Fetch adapter for proxies running on Node, whose fetch decompresses bodies. */
2
+ export const nodeProxyFetch = async (input, init) => {
3
+ const headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : undefined));
4
+ headers.set("accept-encoding", "identity");
5
+ const response = await fetch(input, { ...init, headers });
6
+ const encoding = response.headers.get("content-encoding")?.trim().toLowerCase();
7
+ const method = init?.method ?? (input instanceof Request ? input.method : "GET");
8
+ if (method === "HEAD" || !response.body || !encoding || !/^(gzip|deflate|br)$/.test(encoding))
9
+ return response;
10
+ // A server ignoring identity negotiation must not label decoded bytes as gzip.
11
+ if (response.status === 206) {
12
+ await response.body.cancel();
13
+ throw new Error("Encoded partial media response cannot be proxied safely.");
14
+ }
15
+ const decodedHeaders = new Headers(response.headers);
16
+ decodedHeaders.delete("content-encoding");
17
+ decodedHeaders.delete("content-length");
18
+ return new Response(response.body, { status: response.status, statusText: response.statusText, headers: decodedHeaders });
19
+ };
20
+ //# sourceMappingURL=node-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-fetch.js","sourceRoot":"","sources":["../src/node-fetch.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,CAAC,MAAM,cAAc,GAAiB,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;IAChE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChF,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,CAAC,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjF,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC/G,+EAA+E;IAC/E,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACrD,cAAc,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC1C,cAAc,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACxC,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;AAC5H,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ export function sharedRuntimeRegistryPolicy(api: any, project: any, { apply }?: {
2
+ apply?: boolean | undefined;
3
+ }): Promise<string[]>;
4
+ export function provisionRegistry(root: any, manifest: any, { file, apply }?: {
5
+ apply?: boolean | undefined;
6
+ }): Promise<{
7
+ changes: string[];
8
+ applied: boolean;
9
+ credentials?: undefined;
10
+ } | {
11
+ changes: string[];
12
+ applied: boolean;
13
+ credentials: string;
14
+ }>;
15
+ export function provisionDns(root: any, manifest: any, name: any, { file, apply }?: {
16
+ apply?: boolean | undefined;
17
+ }): Promise<{
18
+ host: string;
19
+ exists: boolean;
20
+ applied: boolean;
21
+ target: any;
22
+ frontendChanged: boolean;
23
+ }>;
24
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/ops/bootstrap.js"],"names":[],"mappings":"AAIA;;sBAwBC;AAED;;;;;;;;;;GAoFC;AACD;;;;;;;;GAqBC"}
@@ -0,0 +1,156 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { identity, operatorEnvironment, platformConfig, publicPlatform, writeJson, readJson } from "./config.js";
4
+ export async function sharedRuntimeRegistryPolicy(api, project, { apply = false } = {}) {
5
+ if (project.name !== "flowpress")
6
+ throw new Error("Shared runtime policies only apply to the flowpress project.");
7
+ const changes = [], id = project.project_id;
8
+ const quota = (await api("GET", "/quotas?page_size=100")).find(item => item.ref?.name === "flowpress");
9
+ if (quota && quota.hard.storage !== -1 && quota.hard.storage < 8 * 1024 ** 3) {
10
+ changes.push("Raise shared FlowPress registry quota to 8 GiB");
11
+ if (apply)
12
+ await api("PUT", "/quotas/" + quota.id, { hard: { ...quota.hard, storage: 8 * 1024 ** 3 } });
13
+ }
14
+ const metadata = await api("GET", "/projects/" + id);
15
+ const selectors = { tag_selectors: [{ kind: "doublestar", decoration: "matches", pattern: "runtime-*" }], scope_selectors: { repository: [{ kind: "doublestar", decoration: "repoMatches", pattern: "{local-cms,local-web}" }] } };
16
+ const retention = metadata.metadata?.retention_id && await api("GET", "/retentions/" + metadata.metadata.retention_id);
17
+ if (retention && !retention.rules.some(item => item.template === "always" && item.tag_selectors?.some(tag => tag.pattern === "runtime-*"))) {
18
+ changes.push("Protect published shared runtime versions from retention");
19
+ if (apply) {
20
+ retention.rules.push({ priority: 0, disabled: false, action: "retain", template: "always", ...selectors });
21
+ await api("PUT", "/retentions/" + metadata.metadata.retention_id, retention);
22
+ }
23
+ }
24
+ const immutable = await api("GET", "/projects/" + id + "/immutabletagrules");
25
+ if (!immutable.some(item => !item.disabled && item.tag_selectors?.some(tag => tag.pattern === "runtime-*"))) {
26
+ changes.push("Make shared runtime version tags immutable");
27
+ if (apply)
28
+ await api("POST", "/projects/" + id + "/immutabletagrules", { disabled: false, action: "immutable", template: "immutable_template", ...selectors });
29
+ }
30
+ return changes;
31
+ }
32
+ export async function provisionRegistry(root, manifest, { file, apply = false } = {}) {
33
+ const platform = platformConfig(root, manifest, file), operator = operatorEnvironment(root);
34
+ const username = operator.HARBOR_ADMIN_USER, password = operator.HARBOR_ADMIN_PASSWORD;
35
+ if (!username || !password || !operator.HARBOR_API_URL)
36
+ throw new Error("Set private HARBOR_API_URL/HARBOR_ADMIN_USER/HARBOR_ADMIN_PASSWORD.");
37
+ const api = async (method, path, body) => {
38
+ const response = await fetch(operator.HARBOR_API_URL.replace(/\/$/, "") + "/api/v2.0" + path, {
39
+ method, redirect: "error", signal: AbortSignal.timeout(30000),
40
+ headers: { authorization: "Basic " + Buffer.from(username + ":" + password).toString("base64"), "content-type": "application/json" },
41
+ ...(body ? { body: JSON.stringify(body) } : {}),
42
+ });
43
+ if (!response.ok)
44
+ throw new Error("Harbor " + method + " " + path + " refused (HTTP " + response.status + ").");
45
+ const text = await response.text();
46
+ return text ? JSON.parse(text) : {};
47
+ };
48
+ const projects = [platform.registryProject, "flowpress"];
49
+ const changes = [];
50
+ const existing = await api("GET", "/projects?page_size=100");
51
+ for (const name of projects) {
52
+ if (!/^[a-z0-9][a-z0-9_.-]+$/.test(name))
53
+ throw new Error("Invalid Harbor project.");
54
+ if (!existing.some(project => project.name === name)) {
55
+ changes.push("Create private Harbor project " + name);
56
+ if (apply)
57
+ await api("POST", "/projects", { project_name: name, public: false, storage_limit: (name === "flowpress" ? 8 : 5) * 1024 ** 3 });
58
+ }
59
+ }
60
+ if (!apply) {
61
+ const shared = existing.find(project => project.name === "flowpress");
62
+ if (shared)
63
+ changes.push(...await sharedRuntimeRegistryPolicy(api, shared));
64
+ return { changes, applied: false };
65
+ }
66
+ const current = await api("GET", "/projects?page_size=100");
67
+ const robots = await api("GET", "/robots?page_size=100");
68
+ const privateFile = join(root, ".secrets/registry-created.json");
69
+ const created = readJson(privateFile, {});
70
+ for (const name of projects) {
71
+ const project = current.find(item => item.name === name);
72
+ const robotName = name + "-ci";
73
+ const expected = "robot$" + robotName;
74
+ if (!robots.some(robot => robot.name === expected)) {
75
+ const robot = await api("POST", "/robots", {
76
+ name: robotName, description: "FlowPress build/push for " + name, duration: 365, level: "system",
77
+ permissions: [{ kind: "project", namespace: name, access: [{ resource: "repository", action: "pull" }, { resource: "repository", action: "push" }] },
78
+ ...(name === "flowpress" ? [] : [{ kind: "project", namespace: "flowpress", access: [{ resource: "repository", action: "pull" }] }])],
79
+ });
80
+ created[name] = { name: robot.name, secret: robot.secret };
81
+ writeJson(privateFile, created, 0o600);
82
+ }
83
+ const existingRobot = robots.find(robot => robot.name === expected);
84
+ if (name !== "flowpress" && existingRobot) {
85
+ const detail = await api("GET", "/robots/" + existingRobot.id);
86
+ if (!detail.permissions.some(permission => permission.namespace === "flowpress")) {
87
+ detail.permissions.push({ kind: "project", namespace: "flowpress", access: [{ resource: "repository", action: "pull" }] });
88
+ await api("PUT", "/robots/" + existingRobot.id, { name: detail.name, level: detail.level, description: detail.description, duration: detail.duration, disable: detail.disable, permissions: detail.permissions });
89
+ }
90
+ }
91
+ const metadata = await api("GET", "/projects/" + project.project_id);
92
+ if (metadata.metadata?.retention_id) {
93
+ const retention = await api("GET", "/retentions/" + metadata.metadata.retention_id);
94
+ const selector = retention.rules?.flatMap(rule => rule.tag_selectors || []).find(item => item.pattern === "{staging,production,preview,latest}");
95
+ if (selector) {
96
+ selector.pattern = "{staging,production,preview,latest,staging-previous,production-previous,preview-previous}";
97
+ await api("PUT", "/retentions/" + metadata.metadata.retention_id, retention);
98
+ }
99
+ }
100
+ if (!metadata.metadata?.retention_id)
101
+ await api("POST", "/retentions", {
102
+ algorithm: "or", scope: { level: "project", ref: project.project_id },
103
+ trigger: { kind: "Schedule", settings: { cron: "0 0 1 * * *" } },
104
+ rules: [
105
+ { id: 0, priority: 0, disabled: false, action: "retain", template: "always", tag_selectors: [{ kind: "doublestar", decoration: "matches", pattern: "{staging,production,preview,latest,staging-previous,production-previous,preview-previous}" }], scope_selectors: { repository: [{ kind: "doublestar", decoration: "repoMatches", pattern: "**" }] } },
106
+ { id: 0, priority: 0, disabled: false, action: "retain", template: "latestPushedK", params: { latestPushedK: 3 }, tag_selectors: [{ kind: "doublestar", decoration: "matches", pattern: "**" }], scope_selectors: { repository: [{ kind: "doublestar", decoration: "repoMatches", pattern: "**" }] } },
107
+ ],
108
+ });
109
+ }
110
+ changes.push(...await sharedRuntimeRegistryPolicy(api, current.find(project => project.name === "flowpress"), { apply: true }));
111
+ // Add pull scope without replacing permissions belonging to existing installations.
112
+ const nodes = robots.find(robot => robot.name === "robot$nodes-pull");
113
+ if (!nodes)
114
+ throw new Error("The existing nodes-pull robot was not found.");
115
+ const detail = await api("GET", "/robots/" + nodes.id);
116
+ let changed = false;
117
+ for (const name of projects)
118
+ if (!detail.permissions.some(permission => permission.namespace === name)) {
119
+ detail.permissions.push({ kind: "project", namespace: name, access: [{ resource: "repository", action: "pull" }] });
120
+ changed = true;
121
+ }
122
+ if (changed)
123
+ await api("PUT", "/robots/" + nodes.id, { name: detail.name, level: detail.level, description: detail.description, duration: detail.duration, disable: detail.disable, permissions: detail.permissions });
124
+ if (Object.keys(created).length)
125
+ writeJson(privateFile, created, 0o600);
126
+ return { changes, applied: true, credentials: Object.keys(created).length ? ".secrets/registry-created.json" : "existing" };
127
+ }
128
+ export async function provisionDns(root, manifest, name, { file, apply = false } = {}) {
129
+ const target = manifest.environments[name];
130
+ if (!target?.publish.includes("cms"))
131
+ throw new Error("CMS publication is disabled.");
132
+ const platform = platformConfig(root, manifest, file), operator = operatorEnvironment(root);
133
+ const { coolifyClient } = await import("./coolify.js");
134
+ const server = await coolifyClient(platform.coolifyUrl, operator.COOLIFY_TOKEN)("GET", "/servers/" + platform.serverUuid);
135
+ const host = new URL(target.backendUrl).hostname;
136
+ const api = async (method, path, body) => {
137
+ const res = await fetch("https://api.cloudflare.com/client/v4" + path, { method, redirect: "error", signal: AbortSignal.timeout(30000), headers: { authorization: "Bearer " + operator.CLOUDFLARE_API_TOKEN, "content-type": "application/json" }, ...(body ? { body: JSON.stringify(body) } : {}) });
138
+ const data = await res.json();
139
+ if (!res.ok || !data.success)
140
+ throw new Error("DNS API refused " + method + " (HTTP " + res.status + ").");
141
+ return data.result;
142
+ };
143
+ let zone;
144
+ const labels = host.split(".");
145
+ for (let offset = 0; offset < labels.length - 1 && !zone; offset++)
146
+ zone = (await api("GET", "/zones?name=" + labels.slice(offset).join(".")))[0];
147
+ if (!zone)
148
+ throw new Error("No accessible DNS zone for the staging backend.");
149
+ const existing = await api("GET", "/zones/" + zone.id + "/dns_records?name=" + host);
150
+ if (existing.length && !existing.some(item => item.type === "A" && item.content === server.ip))
151
+ throw new Error("An existing DNS record has a different target; no record was changed.");
152
+ if (!existing.length && apply)
153
+ await api("POST", "/zones/" + zone.id + "/dns_records", { type: "A", name: host, content: server.ip, proxied: true, ttl: 1, comment: "FlowPress staging backend" });
154
+ return { host, exists: Boolean(existing.length), applied: apply, target: server.ip, frontendChanged: false };
155
+ }
156
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/ops/bootstrap.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export function registryLogin(platform: any, operator: any): void;
2
+ export function inspectDigest(image: any): any;
3
+ export function buildDestination({ push, load }?: {
4
+ push?: boolean | undefined;
5
+ load?: boolean | undefined;
6
+ }): "--push" | "--load";
7
+ export function buildBase(root: any, platform: any, { push, load }?: {
8
+ push?: boolean | undefined;
9
+ load?: boolean | undefined;
10
+ }): {
11
+ image: string;
12
+ };
13
+ export function frontendBuild(root: any, manifest: any, name: any, { sha, buildId }: {
14
+ sha: any;
15
+ buildId: any;
16
+ }): {
17
+ env: Record<string, string>;
18
+ dist: string;
19
+ };
20
+ export function build(root: any, manifest: any, name: any, component: any, { sha, buildId, push, load, file, skipFrontend }?: {
21
+ push?: boolean | undefined;
22
+ load?: boolean | undefined;
23
+ skipFrontend?: boolean | undefined;
24
+ }): Promise<{
25
+ component: any;
26
+ environment: any;
27
+ repository: string;
28
+ tag: string;
29
+ digest: string;
30
+ sha: any;
31
+ pushed: boolean;
32
+ reused: boolean;
33
+ } | {
34
+ component: any;
35
+ environment: any;
36
+ repository: string;
37
+ tag: string;
38
+ digest: any;
39
+ sha: any;
40
+ buildId: any;
41
+ pushed: boolean;
42
+ }>;
43
+ export const packageRoot: string;
44
+ export const containers: string;
45
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/ops/build.js"],"names":[],"mappings":"AAYA,kEAGC;AACD,+CAKC;AACD;;;wBAGC;AACD;;;;;EAOC;AACD;;;;;;EAqBC;AACD;;;;;;;;;;;;;;;;;;;;;;GAgDC;AA9FD,iCAA6E;AAC7E,gCAA0D"}
@@ -0,0 +1,119 @@
1
+ import { withoutMediaCredentials } from "./media-config.js";
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { join, resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { allowedComponents, identity, imageRepository, loadState, operatorEnvironment, platformConfig, readJson, releaseTag, targetConfig, writeJson } from "./config.js";
6
+ import { manifestEnvironment, resolveFrontendEnvironment, shellEnvironment } from "./environment.js";
7
+ import { buildRoutesCaddy } from "./static-config.js";
8
+ import { capture, run } from "./process.js";
9
+ import { existingDigest } from "./registry.js";
10
+ export const packageRoot = fileURLToPath(new URL("../../", import.meta.url));
11
+ export const containers = join(packageRoot, "containers");
12
+ export function registryLogin(platform, operator) {
13
+ if (!operator.REGISTRY_USERNAME || !operator.REGISTRY_PASSWORD)
14
+ throw new Error("Missing registry push/pull credentials.");
15
+ capture("docker", ["login", platform.registry, "--username", operator.REGISTRY_USERNAME, "--password-stdin"], { input: operator.REGISTRY_PASSWORD + "\n" });
16
+ }
17
+ export function inspectDigest(image) {
18
+ const result = capture("docker", ["buildx", "imagetools", "inspect", image, "--format", "{{json .Manifest}}"]);
19
+ const digest = JSON.parse(result).digest;
20
+ if (!/^sha256:[a-f0-9]{64}$/.test(digest || ""))
21
+ throw new Error("Registry returned no valid manifest digest.");
22
+ return digest;
23
+ }
24
+ export function buildDestination({ push = false, load = false } = {}) {
25
+ if (push === load)
26
+ throw new Error("Choose exactly one build destination: --push for CI/registry or --load for a local image test.");
27
+ return push ? "--push" : "--load";
28
+ }
29
+ export function buildBase(root, platform, { push = false, load = false } = {}) {
30
+ const destination = buildDestination({ push, load });
31
+ const version = readJson(join(packageRoot, "package.json")).version;
32
+ const image = platform.registry + "/flowpress/php-runtime:" + version;
33
+ if (push)
34
+ registryLogin(platform, operatorEnvironment(root));
35
+ run("docker", ["buildx", "build", "--platform", "linux/amd64", "--file", join(containers, "php-runtime", "Dockerfile"), "--tag", image, destination, containers]);
36
+ return { image: push ? image.slice(0, image.lastIndexOf(":")) + "@" + inspectDigest(image) : image };
37
+ }
38
+ export function frontendBuild(root, manifest, name, { sha, buildId }) {
39
+ const values = manifestEnvironment(root, name, { ...process.env, RELEASE_SHA: sha, FRONTEND_BUILD_ID: buildId });
40
+ const env = resolveFrontendEnvironment(values, target => manifestEnvironment(root, target, {}));
41
+ const web = readJson(join(root, "apps/web/package.json"));
42
+ const childEnv = withoutMediaCredentials({ ...process.env, ...shellEnvironment(env), RELEASE_SHA: sha, FRONTEND_BUILD_ID: buildId });
43
+ const dist = resolve(root, env.SF_DIST_DIR);
44
+ if (!dist.startsWith(root + "/"))
45
+ throw new Error("Build output must stay inside the project.");
46
+ run("pnpm", ["styleflow:build"], { cwd: root, env: childEnv });
47
+ run("pnpm", ["--filter", web.name, "build"], { cwd: root, env: childEnv });
48
+ if (env.ASTRO_OUTPUT_MODE === "static") {
49
+ if (!existsSync(join(dist, "index.html")))
50
+ throw new Error("Static build has no index.html.");
51
+ const read = name => existsSync(join(dist, name)) ? readFileSync(join(dist, name), "utf8") : "";
52
+ mkdirSync(join(dist, ".container"), { recursive: true });
53
+ writeFileSync(join(dist, ".container", "routes.caddy"), buildRoutesCaddy({
54
+ redirects: read("_redirects"), headers: read("_headers"),
55
+ media: env.FLOWPRESS_MEDIA && env.FLOWPRESS_MEDIA !== env.BACKEND_URL ? env.FLOWPRESS_MEDIA : env.BACKEND_URL + "/app/uploads",
56
+ backend: env.BACKEND_URL,
57
+ }));
58
+ writeJson(join(dist, "healthz.json"), { status: "ok", release: sha, buildId, environment: name, output: "static", backendTarget: env.FRONTEND_BACKEND_TARGET });
59
+ }
60
+ return { env, dist: env.SF_DIST_DIR };
61
+ }
62
+ export async function build(root, manifest, name, component, { sha, buildId, push = false, load = false, file, skipFrontend = false } = {}) {
63
+ const destination = buildDestination({ push, load });
64
+ const target = targetConfig(manifest, name);
65
+ const supported = component === "cms" ? ["backend", "headless-static", "headless-ssr"] : null;
66
+ if (supported && !supported.includes(target.profile || manifest.profile))
67
+ throw new Error("Profile does not contain a CMS.");
68
+ if (!["cms", "web-static", "web-ssr"].includes(component))
69
+ throw new Error("Unknown component.");
70
+ if (push)
71
+ allowedComponents(manifest, name, [component]);
72
+ const platform = platformConfig(root, manifest, file);
73
+ const project = identity(root);
74
+ const revision = sha || capture("git", ["rev-parse", "HEAD"], { cwd: root });
75
+ const id = buildId || String(Date.now());
76
+ const tag = releaseTag(component, name, revision, id);
77
+ const repository = imageRepository(platform, project.slug, component);
78
+ const operator = operatorEnvironment(root);
79
+ if (push)
80
+ registryLogin(platform, operator);
81
+ mkdirSync(join(root, ".local/flowpress"), { recursive: true, mode: 0o700 });
82
+ if (push && component === "cms") {
83
+ const digest = await existingDigest(repository + ":" + tag, operator);
84
+ if (digest) {
85
+ const result = { component, environment: name, repository, tag, digest, sha: revision, pushed: true, reused: true };
86
+ writeJson(join(root, ".local/flowpress", "release-" + name + "-" + component + ".json"), result, 0o600);
87
+ return result;
88
+ }
89
+ }
90
+ const metadata = join(root, ".local/flowpress", "build-" + name + "-" + component + ".json");
91
+ const args = ["buildx", "build", "--platform", "linux/amd64", "--file", join(containers, component, "Dockerfile"),
92
+ "--build-context", "flowpress=" + containers, "--tag", repository + ":" + tag,
93
+ "--build-arg", "RELEASE_SHA=" + revision, "--metadata-file", metadata, destination,
94
+ "--label", "io.flowpress.managed=true", "--label", "io.flowpress.kind=application", "--label", "io.flowpress.project=" + project.slug];
95
+ if (component !== "cms")
96
+ args.push("--build-arg", "FRONTEND_BUILD_ID=" + id);
97
+ if (component === "cms") {
98
+ if (!platform.phpImage)
99
+ throw new Error("Build and pin the shared PHP runtime first.");
100
+ args.push("--build-arg", "FLOWPRESS_PHP_IMAGE=" + platform.phpImage);
101
+ const authFile = join(root, "apps/cms/auth.json");
102
+ const composerAuth = operator.COMPOSER_AUTH || (existsSync(authFile) ? readFileSync(authFile, "utf8") : "");
103
+ if (!composerAuth)
104
+ throw new Error("COMPOSER_AUTH or private apps/cms/auth.json is required.");
105
+ args.push("--secret", "id=composer_auth,env=COMPOSER_AUTH");
106
+ run("docker", [...args, "."], { cwd: root, env: { ...process.env, COMPOSER_AUTH: composerAuth } });
107
+ }
108
+ else {
109
+ const frontend = skipFrontend ? { dist: manifestEnvironment(root, name).SF_DIST_DIR } : frontendBuild(root, manifest, name, { sha: revision, buildId: id });
110
+ const web = readJson(join(root, "apps/web/package.json"));
111
+ args.push("--build-arg", "DIST_DIR=" + frontend.dist, "--build-arg", "WEB_PACKAGE=" + web.name);
112
+ run("docker", [...args, "."], { cwd: root });
113
+ }
114
+ const digest = push ? inspectDigest(repository + ":" + tag) : undefined;
115
+ const result = { component, environment: name, repository, tag, digest, sha: revision, buildId: component === "cms" ? undefined : id, pushed: push };
116
+ writeJson(join(root, ".local/flowpress", "release-" + name + "-" + component + ".json"), result, 0o600);
117
+ return result;
118
+ }
119
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/ops/build.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export function checkProject(root: any, kind: any): {
2
+ features: any;
3
+ valid: boolean;
4
+ } | {
5
+ phpFiles: number;
6
+ checks?: undefined;
7
+ manifest?: undefined;
8
+ } | {
9
+ checks: string[];
10
+ manifest: string;
11
+ phpFiles?: undefined;
12
+ };
13
+ export const projectChecks: string[];
14
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/ops/check.js"],"names":[],"mappings":"AAOA;;;;;;;;;;;EAwBC;AAzBD,qCAAwN"}