@styleflow.app/flowpress-deploy 1.0.0-beta.2 → 1.0.0-beta.20

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 (117) hide show
  1. package/CHANGELOG.md +111 -0
  2. package/README.md +5 -0
  3. package/containers/cms/Dockerfile +35 -0
  4. package/containers/cms/Dockerfile.dockerignore +20 -0
  5. package/containers/cms/healthz.php +17 -0
  6. package/containers/cms/install-languages.sh +16 -0
  7. package/containers/cms/mpm.conf +10 -0
  8. package/containers/cms/php.ini +16 -0
  9. package/containers/cms/sanitize-integrations.php +14 -0
  10. package/containers/cms/sanitize.php +37 -0
  11. package/containers/cms/smtp.php +13 -0
  12. package/containers/cms/vhost.conf +61 -0
  13. package/containers/cms/wp-cli.yml +1 -0
  14. package/containers/local/cms/Dockerfile +18 -0
  15. package/containers/local/cms/entrypoint.sh +7 -0
  16. package/containers/local/cms/php.ini +8 -0
  17. package/containers/local/cms/vhost.conf +14 -0
  18. package/containers/local/web/Dockerfile +8 -0
  19. package/containers/local/web/entrypoint.sh +10 -0
  20. package/containers/php-runtime/Dockerfile +21 -0
  21. package/containers/web-ssr/Dockerfile +27 -0
  22. package/containers/web-ssr/Dockerfile.dockerignore +10 -0
  23. package/containers/web-static/Caddyfile +40 -0
  24. package/containers/web-static/Dockerfile +17 -0
  25. package/containers/web-static/Dockerfile.dockerignore +7 -0
  26. package/dist/development.d.ts +4 -0
  27. package/dist/development.d.ts.map +1 -0
  28. package/dist/development.js +10 -0
  29. package/dist/development.js.map +1 -0
  30. package/dist/node-fetch.d.ts +3 -0
  31. package/dist/node-fetch.d.ts.map +1 -0
  32. package/dist/node-fetch.js +20 -0
  33. package/dist/node-fetch.js.map +1 -0
  34. package/dist/ops/bootstrap.d.ts +21 -0
  35. package/dist/ops/bootstrap.d.ts.map +1 -0
  36. package/dist/ops/bootstrap.js +123 -0
  37. package/dist/ops/bootstrap.js.map +1 -0
  38. package/dist/ops/build.d.ts +39 -0
  39. package/dist/ops/build.d.ts.map +1 -0
  40. package/dist/ops/build.js +110 -0
  41. package/dist/ops/build.js.map +1 -0
  42. package/dist/ops/check.d.ts +18 -0
  43. package/dist/ops/check.d.ts.map +1 -0
  44. package/dist/ops/check.js +46 -0
  45. package/dist/ops/check.js.map +1 -0
  46. package/dist/ops/cli.d.ts +3 -0
  47. package/dist/ops/cli.d.ts.map +1 -0
  48. package/dist/ops/cli.js +166 -0
  49. package/dist/ops/cli.js.map +1 -0
  50. package/dist/ops/config.d.ts +54 -0
  51. package/dist/ops/config.d.ts.map +1 -0
  52. package/dist/ops/config.js +202 -0
  53. package/dist/ops/config.js.map +1 -0
  54. package/dist/ops/coolify.d.ts +2 -0
  55. package/dist/ops/coolify.d.ts.map +1 -0
  56. package/dist/ops/coolify.js +44 -0
  57. package/dist/ops/coolify.js.map +1 -0
  58. package/dist/ops/data.d.ts +31 -0
  59. package/dist/ops/data.d.ts.map +1 -0
  60. package/dist/ops/data.js +163 -0
  61. package/dist/ops/data.js.map +1 -0
  62. package/dist/ops/deploy.d.ts +38 -0
  63. package/dist/ops/deploy.d.ts.map +1 -0
  64. package/dist/ops/deploy.js +127 -0
  65. package/dist/ops/deploy.js.map +1 -0
  66. package/dist/ops/editorial.d.ts +23 -0
  67. package/dist/ops/editorial.d.ts.map +1 -0
  68. package/dist/ops/editorial.js +79 -0
  69. package/dist/ops/editorial.js.map +1 -0
  70. package/dist/ops/environment-files.d.ts +9 -0
  71. package/dist/ops/environment-files.d.ts.map +1 -0
  72. package/dist/ops/environment-files.js +125 -0
  73. package/dist/ops/environment-files.js.map +1 -0
  74. package/dist/ops/environment.d.ts +29 -0
  75. package/dist/ops/environment.d.ts.map +1 -0
  76. package/dist/ops/environment.js +159 -0
  77. package/dist/ops/environment.js.map +1 -0
  78. package/dist/ops/health.d.ts +26 -0
  79. package/dist/ops/health.d.ts.map +1 -0
  80. package/dist/ops/health.js +27 -0
  81. package/dist/ops/health.js.map +1 -0
  82. package/dist/ops/local.d.ts +161 -0
  83. package/dist/ops/local.d.ts.map +1 -0
  84. package/dist/ops/local.js +173 -0
  85. package/dist/ops/local.js.map +1 -0
  86. package/dist/ops/monitor.d.ts +23 -0
  87. package/dist/ops/monitor.d.ts.map +1 -0
  88. package/dist/ops/monitor.js +143 -0
  89. package/dist/ops/monitor.js.map +1 -0
  90. package/dist/ops/process.d.ts +9 -0
  91. package/dist/ops/process.d.ts.map +1 -0
  92. package/dist/ops/process.js +56 -0
  93. package/dist/ops/process.js.map +1 -0
  94. package/dist/ops/provision.d.ts +41 -0
  95. package/dist/ops/provision.d.ts.map +1 -0
  96. package/dist/ops/provision.js +268 -0
  97. package/dist/ops/provision.js.map +1 -0
  98. package/dist/ops/registry.d.ts +7 -0
  99. package/dist/ops/registry.d.ts.map +1 -0
  100. package/dist/ops/registry.js +73 -0
  101. package/dist/ops/registry.js.map +1 -0
  102. package/dist/ops/release.d.ts +26 -0
  103. package/dist/ops/release.d.ts.map +1 -0
  104. package/dist/ops/release.js +79 -0
  105. package/dist/ops/release.js.map +1 -0
  106. package/dist/ops/s3.d.ts +8 -0
  107. package/dist/ops/s3.d.ts.map +1 -0
  108. package/dist/ops/s3.js +38 -0
  109. package/dist/ops/s3.js.map +1 -0
  110. package/dist/ops/static-config.d.ts +14 -0
  111. package/dist/ops/static-config.d.ts.map +1 -0
  112. package/dist/ops/static-config.js +96 -0
  113. package/dist/ops/static-config.js.map +1 -0
  114. package/flowpress-deploy.php +2 -2
  115. package/includes/automatic-build.php +22 -5
  116. package/package.json +40 -6
  117. package/schema/deployment.schema.json +185 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/ops/environment.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEpG,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAAC,OAAO,WAAW,EAAE,CAAC;AAAC,CAAC;AAAC,MAAM,CAAC;IAAC,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;AAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACpG,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;AACxL,MAAM,UAAU,QAAQ,CAAC,GAAG,EAAE,GAAG;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IAClF,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,GAAG,EAAE,GAAG;IAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACjC,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QAAC,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,mCAAmC,CAAC,CAAC;IAAC,CAAC;IACnG,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IACrI,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,UAAU,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,2BAA2B,CAAC,CAAC;IAAC,CAAC;AACjG,CAAC;AACD,MAAM,UAAU,IAAI,CAAC,GAAG,EAAE,GAAG;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,GAAG,CAAC,CAAC;IACxG,OAAO,KAAK,CAAC;AACf,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,GAAG,IAAI,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1I,MAAM,UAAU,WAAW,CAAC,GAAG;IAC7B,MAAM,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YACjL,OAAO,GAAG,CAAC,MAAM,CAAC;QACpB,CAAC,CAAC,CAAC,CAAC,CAAC;AACP,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,GAAG,IAAI,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACrG,MAAM,UAAU,eAAe,CAAC,GAAG;IACjC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAC7G,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAChF,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC;AACD,MAAM,UAAU,mBAAmB,CAAC,KAAK,EAAE,GAAG;IAC5C,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QAAC,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;IACrD,OAAO,IAAI,CAAC,GAAG,EAAE,sCAAsC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;QAC/E,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/F,CAAC;AACD,MAAM,UAAU,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,GAAG,EAAE;IAC5D,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,MAAM,CAAC;IACvE,MAAM,QAAQ,GAAG;QACf,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,GAAG,UAAU,CAAC,CAAC;QACvF,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAClE,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;KAClD,CAAC;IACF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC;IACnD,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC;IACvD,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,QAAQ,IAAI,OAAO,CAAC;IACpE,MAAM,MAAM,GAAG;QACb,GAAG,QAAQ;QACX,GAAG,SAAS;QACZ,OAAO,EAAE,IAAI;QACb,iBAAiB,EAAE,SAAS,CAAC,iBAAiB,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC9I,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,QAAQ;QACxC,WAAW,EAAE,SAAS,CAAC,WAAW,IAAI,OAAO;QAC7C,mBAAmB,EAAE,SAAS,CAAC,mBAAmB,IAAI,MAAM,CAAC,UAAU,IAAI,OAAO,GAAG,oBAAoB;QACzG,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,OAAO,GAAG,KAAK;QAC3B,MAAM,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;QAC3F,wBAAwB,EAAE,WAAW;QACrC,uBAAuB,EAAE,QAAQ,CAAC,KAAK;QACvC,eAAe,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;QACtC,sBAAsB,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAC7F,yBAAyB,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;QAClH,mBAAmB,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;QAC/H,uBAAuB,EAAE,SAAS,CAAC,uBAAuB,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI;QACzJ,WAAW,EAAE,SAAS,CAAC,WAAW,IAAI,gBAAgB,GAAG,IAAI;KAC9D,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,YAAY;QAAE,MAAM,CAAC,YAAY,GAAG,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC;IACrH,IAAI,CAAC,MAAM,CAAC,YAAY;QAAE,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IACpE,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAChR,MAAM,CAAC,wBAAwB,GAAG,SAAS,CAAC,wBAAwB,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAClG,MAAM,CAAC,0BAA0B,GAAG,SAAS,CAAC,0BAA0B,IAAI,IAAI,CAAC;IACjF,MAAM,CAAC,8BAA8B,GAAG,SAAS,CAAC,8BAA8B,IAAI,IAAI,CAAC;IACzF,MAAM,CAAC,iBAAiB,GAAG,SAAS,CAAC,iBAAiB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC/F,0FAA0F;IAC1F,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AAC7E,CAAC;AACD,MAAM,UAAU,eAAe,CAAC,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG;IACjF,MAAM,QAAQ,GAAG,IAAI,IAAI,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC;IAC7F,OAAO,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AACxD,CAAC;AACD,MAAM,UAAU,0BAA0B,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC;IACrH,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,uBAAuB,IAAI,IAAI,CAAC,CAAC;IAC3D,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC;IAC/G,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,EAAE,GAAG,GAAG,EAAE,eAAe,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,oCAAoC,EAAE,IAAI,EAAE,CAAC;IAC1H,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACzF,OAAO;QACL,GAAG,GAAG;QACN,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC;QAC/C,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC;QAC/D,eAAe,EAAE,eAAe,CAAC,MAAM,CAAC;QACxC,oCAAoC,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;KAC1E,CAAC;AACJ,CAAC;AACD,MAAM,UAAU,uBAAuB,KAAK,OAAO,0BAA0B,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC;AACnG,MAAM,UAAU,cAAc,CAAC,IAAI,EAAE,IAAI;IACvC,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,aAAa,EAAE,qBAAqB,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,QAAQ;QAC9N,0BAA0B,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,gCAAgC,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,wBAAwB;QACtU,iCAAiC,EAAE,4BAA4B,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,oCAAoC,EAAE,qCAAqC,EAAE,qBAAqB,EAAE,iBAAiB,CAAC,CAAC;IACrP,IAAI,MAAM,CAAC,mBAAmB,KAAK,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAC/J,IAAI,MAAM,CAAC,uBAAuB,KAAK,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,4BAA4B,EAAE,8BAA8B,EAAE,4BAA4B,EAAE,4BAA4B,CAAC,CAAC;IAC5M,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;QAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzG,OAAO,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,GAAG,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC;AACnP,CAAC"}
@@ -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,161 @@
1
+ export function localConfiguration(root: any, manifest: any): {
2
+ env: import("dotenv-expand").DotenvParseOutput | undefined;
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
+ build: {
37
+ context: string;
38
+ dockerfile: string;
39
+ };
40
+ image: string;
41
+ restart: string;
42
+ depends_on: {
43
+ db: {
44
+ condition: string;
45
+ };
46
+ };
47
+ env_file: {
48
+ path: string;
49
+ format: string;
50
+ }[];
51
+ ports: string[];
52
+ volumes: string[];
53
+ healthcheck: {
54
+ test: string[];
55
+ interval: string;
56
+ timeout: string;
57
+ retries: number;
58
+ };
59
+ };
60
+ web: {
61
+ container_name: string;
62
+ build: {
63
+ context: string;
64
+ dockerfile: string;
65
+ };
66
+ image: string;
67
+ restart: string;
68
+ init: boolean;
69
+ env_file: {
70
+ path: string;
71
+ format: string;
72
+ }[];
73
+ environment: {
74
+ FLOWPRESS_WEB_PACKAGE: any;
75
+ NODE_EXTRA_CA_CERTS: string;
76
+ ASTRO_DEV_BACKGROUND: string;
77
+ npm_config_store_dir: string;
78
+ };
79
+ volumes: string[];
80
+ ports: string[];
81
+ healthcheck: {
82
+ test: string[];
83
+ interval: string;
84
+ timeout: string;
85
+ retries: number;
86
+ start_period: string;
87
+ };
88
+ };
89
+ proxy: {
90
+ container_name: string;
91
+ image: string;
92
+ restart: string;
93
+ ports: string[];
94
+ volumes: string[];
95
+ networks: {
96
+ default: {
97
+ aliases: any;
98
+ };
99
+ };
100
+ healthcheck: {
101
+ test: string[];
102
+ interval: string;
103
+ timeout: string;
104
+ retries: number;
105
+ };
106
+ };
107
+ };
108
+ volumes: {
109
+ "cms-db": {
110
+ name: string;
111
+ };
112
+ "pnpm-store": {
113
+ name: string;
114
+ };
115
+ };
116
+ };
117
+ export function localCaddy(config: any): string;
118
+ export function prepareLocal(root: any, manifest: any): {
119
+ env: import("dotenv-expand").DotenvParseOutput | undefined;
120
+ cms: any;
121
+ web: any;
122
+ project: string;
123
+ https: number;
124
+ origins: any[];
125
+ hostnames: string[];
126
+ webPort: number;
127
+ cmsPort: number;
128
+ dbPort: number;
129
+ };
130
+ export function localCommand(root: any, manifest: any, command?: string, args?: any[]): Promise<{
131
+ started: string[];
132
+ frontend: string;
133
+ backend: string;
134
+ stopped?: undefined;
135
+ dataPreserved?: undefined;
136
+ file?: undefined;
137
+ } | {
138
+ stopped: boolean;
139
+ dataPreserved: boolean;
140
+ started?: undefined;
141
+ frontend?: undefined;
142
+ backend?: undefined;
143
+ file?: undefined;
144
+ } | {
145
+ frontend: any;
146
+ backend: any;
147
+ started?: undefined;
148
+ stopped?: undefined;
149
+ dataPreserved?: undefined;
150
+ file?: undefined;
151
+ } | {
152
+ file: string;
153
+ started?: undefined;
154
+ frontend?: undefined;
155
+ backend?: undefined;
156
+ stopped?: undefined;
157
+ dataPreserved?: undefined;
158
+ } | undefined>;
159
+ export function localRuntime(root: any): string;
160
+ export function localComposeArgs(root: any): any[];
161
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/ops/local.js"],"names":[],"mappings":"AAaA;;;;;;;;;;;EAeC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BC;AAED,gDAUC;AA6BD;;;;;;;;;;;EAcC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA+BC;AA1IM,gDAAiE;AACjE,mDAAyH"}
@@ -0,0 +1,173 @@
1
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
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
+ const recipes = fileURLToPath(new URL("../../containers", import.meta.url));
10
+ export const localRuntime = root => join(root, ".local/flowpress/local");
11
+ export const localComposeArgs = root => ["compose", "--project-directory", root, "-f", join(localRuntime(root), "compose.yaml")];
12
+ export function localConfiguration(root, manifest) {
13
+ const env = manifestEnvironment(root, "local");
14
+ const profile = manifest.environments.local.profile || manifest.profile;
15
+ const cms = profiles[profile].includes("cms"), web = profiles[profile].some(value => value.startsWith("web-"));
16
+ const origins = [...(web ? siteOrigins(env) : []), ...(cms ? [env.BACKEND_URL, ...(manifest.environments.local.backendAliases || [])] : [])];
17
+ if (!origins.length)
18
+ throw new Error("Local development requires a CMS or frontend.");
19
+ const https = port(env, "LOCAL_HTTPS_PORT");
20
+ for (const origin of origins) {
21
+ const url = new URL(origin);
22
+ if (url.protocol !== "https:" || Number(url.port || 443) !== https)
23
+ throw new Error("Local URLs must use HTTPS and the development HTTPS port.");
24
+ if (!/^local\.(?:backend\.)?[^/]+$/.test(url.hostname))
25
+ throw new Error("Use local.<domain> and local.backend.<domain> for development URLs.");
26
+ }
27
+ if (cms && !new URL(env.BACKEND_URL).hostname.startsWith("local.backend."))
28
+ throw new Error("The local CMS must use local.backend.<domain>.");
29
+ return { env, cms, web, project: identity(root).slug, https, origins, hostnames: [...new Set(origins.map(origin => new URL(origin).hostname))],
30
+ webPort: port(env, "LOCAL_ASTRO_PORT"), cmsPort: port(env, "LOCAL_BACKEND_HTTP_PORT"), dbPort: port(env, "LOCAL_DB_PORT") };
31
+ }
32
+ export function localServices(config, root) {
33
+ const { env, project, cms, web, https, hostnames, webPort, cmsPort, dbPort } = config;
34
+ const runtime = localRuntime(root), certs = join(runtime, "certs"), volume = name => project + "_" + name;
35
+ const services = {}, volumes = {}, expose = (port, target) => ["127.0.0.1:" + port + ":" + target];
36
+ const rawEnv = file => [{ path: join(runtime, file + ".env"), format: "raw" }];
37
+ if (cms) {
38
+ volumes["cms-db"] = { name: volume("db_data") };
39
+ 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"],
40
+ 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" } };
41
+ services.cms = { container_name: volume("cms"), build: { context: recipes, dockerfile: "local/cms/Dockerfile" }, image: project + "-local-cms", restart: "unless-stopped",
42
+ depends_on: { db: { condition: "service_healthy" } }, env_file: rawEnv("cms"), ports: expose(cmsPort, 80), volumes: [root + ":/workspace", certs + ":/certs:ro"],
43
+ healthcheck: { test: ["CMD", "php", "-r", '$s=@fsockopen("127.0.0.1",80);exit($s?0:1);'], interval: "3s", timeout: "3s", retries: 30 } };
44
+ }
45
+ if (web) {
46
+ const webName = readJson(join(root, "apps/web/package.json")).name;
47
+ const mounts = [root + ":/workspace", certs + ":/certs:ro"];
48
+ for (const [key, directory] of Object.entries({ "node-modules": "node_modules", "web-modules": "apps/web/node_modules", "ui-modules": "packages/ui/node_modules", "astro-cache": "apps/web/.astro" })) {
49
+ volumes[key] = { name: volume(key.replaceAll("-", "_")) };
50
+ mounts.push(key + ":/workspace/" + directory);
51
+ }
52
+ volumes["pnpm-store"] = { name: volume("pnpm_store") };
53
+ mounts.push("pnpm-store:/pnpm/store");
54
+ services.web = { container_name: volume("web"), build: { context: recipes, dockerfile: "local/web/Dockerfile" }, image: "flowpress-local-web:22.23.2", restart: "unless-stopped", init: true,
55
+ 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" },
56
+ volumes: mounts, ports: expose(webPort, webPort),
57
+ healthcheck: { test: ["CMD", "node", "-e", `fetch('http://127.0.0.1:${webPort}/healthz.json').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))`], interval: "5s", timeout: "4s", retries: 120, start_period: "15s" } };
58
+ }
59
+ services.proxy = { container_name: volume("proxy"), image: "caddy:2.10-alpine", restart: "unless-stopped", ports: expose(https, https),
60
+ volumes: [join(runtime, "Caddyfile") + ":/etc/caddy/Caddyfile:ro", certs + ":/certs:ro"],
61
+ networks: { default: { aliases: hostnames } },
62
+ healthcheck: { test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1:2019/config/"], interval: "3s", timeout: "3s", retries: 20 } };
63
+ return { name: project, services, volumes };
64
+ }
65
+ export function localCaddy(config) {
66
+ const { env, https, cms, web } = config;
67
+ const sites = [];
68
+ function site(origins, upstream) {
69
+ sites.push(origins.map(origin => new URL(origin).hostname + ":" + https).join(", ") + " {\n"
70
+ + " tls /certs/local-dev.pem /certs/local-dev-key.pem\n reverse_proxy " + upstream + " {\n header_up X-Forwarded-Proto https\n }\n}");
71
+ }
72
+ if (web)
73
+ site(siteOrigins(env), "web:" + config.webPort);
74
+ if (cms)
75
+ site([env.BACKEND_URL, ...config.origins.filter(origin => !siteOrigins(env).includes(origin) && origin !== env.BACKEND_URL)], "cms:80");
76
+ return "{\n auto_https disable_redirects\n admin 0.0.0.0:2019\n}\n\n" + sites.join("\n\n") + "\n";
77
+ }
78
+ function writePrivate(file, values) {
79
+ const content = Object.entries(values).filter(([, value]) => value !== undefined).map(([key, value]) => {
80
+ if (/[\r\n]/.test(String(value)))
81
+ throw new Error("Multiline local environment value: " + key);
82
+ return key + "=" + value;
83
+ }).join("\n") + "\n";
84
+ writeFileSync(file, content, { mode: 0o600 });
85
+ }
86
+ function certificates(config, root) {
87
+ const certs = join(localRuntime(root), "certs");
88
+ mkdirSync(certs, { recursive: true });
89
+ 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));
90
+ const missing = config.hostnames.filter(host => !hosts.includes(host));
91
+ if (missing.length) {
92
+ const line = "127.0.0.1 " + missing.join(" ");
93
+ console.info("[local] Adding hosts: " + line);
94
+ run("sudo", ["tee", "-a", "/etc/hosts"], { input: "\n" + line + "\n", stdio: ["pipe", "inherit", "inherit"] });
95
+ }
96
+ const ca = join(capture("mkcert", ["-CAROOT"]), "rootCA.pem");
97
+ if (!existsSync(ca))
98
+ run("mkcert", ["-install"]);
99
+ copyFileSync(ca, join(certs, "local-dev-root-ca.pem"));
100
+ const domains = [...config.hostnames, "localhost", "127.0.0.1", "::1"].sort().join("\n");
101
+ const recorded = join(certs, "domains.txt");
102
+ if (!existsSync(recorded) || readFileSync(recorded, "utf8") !== domains) {
103
+ run("mkcert", ["-cert-file", join(certs, "local-dev.pem"), "-key-file", join(certs, "local-dev-key.pem"), ...domains.split("\n")]);
104
+ writeFileSync(recorded, domains);
105
+ }
106
+ }
107
+ export function prepareLocal(root, manifest) {
108
+ synchronizeEnvironmentFiles(root, { manifest, apply: true, localSecrets: true });
109
+ const config = localConfiguration(root, manifest), { env } = config, runtime = localRuntime(root);
110
+ mkdirSync(runtime, { recursive: true, mode: 0o700 });
111
+ if (config.cms) {
112
+ for (const key of ["DB_NAME", "DB_USER", "DB_PASSWORD", "DB_ROOT_PASSWORD", "DB_PREFIX"])
113
+ required(env, key);
114
+ 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 });
115
+ 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" });
116
+ }
117
+ 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))));
118
+ // Escape only Compose interpolation. Environment files use raw format.
119
+ writeFileSync(join(runtime, "compose.yaml"), stringify(localServices(config, root)).replaceAll("$", "$$").replaceAll("$$$$MARIADB", "$$MARIADB"));
120
+ writeFileSync(join(runtime, "Caddyfile"), localCaddy(config));
121
+ return config;
122
+ }
123
+ export async function localCommand(root, manifest, command = "start", args = []) {
124
+ if (command === "start") {
125
+ run("docker", ["info"], { stdio: "ignore" });
126
+ const config = prepareLocal(root, manifest);
127
+ certificates(config, root);
128
+ if (config.cms && !existsSync(join(root, "apps/cms/vendor/autoload.php")))
129
+ run("composer", ["install", "--working-dir=apps/cms", "--no-interaction", "--prefer-dist"], { cwd: root });
130
+ console.info("[local] Starting " + Object.keys(localServices(config, root).services).join(", ") + "…");
131
+ run("docker", [...localComposeArgs(root), "up", "-d", "--build", "--wait", "--wait-timeout", "600"], { cwd: root });
132
+ console.info("[local] Frontend: " + config.env.SITE_URL + "\n[local] Backend: " + config.env.BACKEND_URL);
133
+ return { started: Object.keys(localServices(config, root).services), frontend: config.env.SITE_URL, backend: config.env.BACKEND_URL };
134
+ }
135
+ if (!existsSync(join(localRuntime(root), "compose.yaml")))
136
+ throw new Error("Run flowpress-ops local start first.");
137
+ if (command === "stop") {
138
+ run("docker", [...localComposeArgs(root), "stop"]);
139
+ return { stopped: true, dataPreserved: true };
140
+ }
141
+ if (command === "status" || command === "doctor") {
142
+ console.log(capture("docker", [...localComposeArgs(root), "ps"]));
143
+ return { frontend: manifest.environments.local.frontendUrl, backend: manifest.environments.local.backendUrl };
144
+ }
145
+ if (command === "logs") {
146
+ run("docker", [...localComposeArgs(root), "logs", "--tail", "100", ...args]);
147
+ return;
148
+ }
149
+ if (command === "exec") {
150
+ if (!args.length)
151
+ throw new Error("Use local exec <service> <command>.");
152
+ run("docker", [...localComposeArgs(root), "exec", "-T", ...args]);
153
+ return;
154
+ }
155
+ if (command === "backup") {
156
+ const directory = join(root, "db");
157
+ mkdirSync(directory, { recursive: true });
158
+ const file = join(directory, identity(root).slug + "-" + new Date().toISOString().replaceAll(":", "-") + ".sql");
159
+ const dump = capture("docker", [...localComposeArgs(root), "exec", "-T", "db", "sh", "-c", 'mariadb-dump -u"$MARIADB_USER" -p"$MARIADB_PASSWORD" --single-transaction "$MARIADB_DATABASE"']);
160
+ writeFileSync(file, dump + "\n", { mode: 0o600 });
161
+ return { file };
162
+ }
163
+ if (command === "datagrip") {
164
+ const config = localConfiguration(root, manifest);
165
+ const file = join(root, ".idea/dataSources.xml");
166
+ mkdirSync(dirname(file), { recursive: true });
167
+ const xml = value => String(value).replace(/[<>&"']/g, character => ({ "<": "&lt;", ">": "&gt;", "&": "&amp;", '"': "&quot;", "'": "&apos;" })[character]);
168
+ 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`);
169
+ return { file };
170
+ }
171
+ throw new Error("Use local start|stop|status|doctor|logs|exec|backup|datagrip.");
172
+ }
173
+ //# 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,23 @@
1
+ export function backupRun(root: any, manifest: any, name: any): Promise<{
2
+ environment: any;
3
+ database: string;
4
+ uploads: string;
5
+ filename: any;
6
+ }>;
7
+ export function backupVerify(root: any, manifest: any, name: any): Promise<{
8
+ environment: any;
9
+ database: {
10
+ tables: number;
11
+ home: any;
12
+ };
13
+ uploads: {
14
+ files: number;
15
+ };
16
+ offsite: boolean;
17
+ }>;
18
+ export function status(root: any, manifest: any, only: any): Promise<{
19
+ ok: boolean;
20
+ checkedAt: string;
21
+ environments: {};
22
+ }>;
23
+ //# sourceMappingURL=monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitor.d.ts","sourceRoot":"","sources":["../../src/ops/monitor.js"],"names":[],"mappings":"AAYA;;;;;GAgBC;AAQD;;;;;;;;;;GAsCC;AACD;;;;GAgCC"}
@@ -0,0 +1,143 @@
1
+ import { mkdtempSync, rmSync, mkdirSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { allowedComponents, loadState, operatorEnvironment, readEnv } from "./config.js";
5
+ import { coolifyClient } from "./coolify.js";
6
+ import { backupHealth, providerTimestamp } from "./health.js";
7
+ import { s3Get, s3List } from "./s3.js";
8
+ import { safeArchiveEntries } from "./data.js";
9
+ import { capture, run, sleep } from "./process.js";
10
+ import { imageMetadata } from "./registry.js";
11
+ const list = data => Array.isArray(data) ? data : data?.executions || data?.data || [];
12
+ export async function backupRun(root, manifest, name) {
13
+ allowedComponents(manifest, name, ["cms"]);
14
+ const state = loadState(root, name);
15
+ const api = coolifyClient(state.platform.coolifyUrl, operatorEnvironment(root).COOLIFY_TOKEN);
16
+ const before = Date.now() - 2000;
17
+ await api("PATCH", "/databases/" + state.platform.poolUuid + "/backups/" + state.database.backupUuid, { backup_now: true });
18
+ const app = state.apps.cms;
19
+ await api("POST", "/applications/" + app.uuid + "/storages/" + app.uploadsStorageUuid + "/backups/run");
20
+ for (let attempt = 0; attempt < 90; attempt++) {
21
+ const executions = list(await api("GET", "/databases/" + state.platform.poolUuid + "/backups/" + state.database.backupUuid + "/executions"));
22
+ const last = executions.filter(item => providerTimestamp(item.created_at) >= before).sort((a, b) => b.created_at.localeCompare(a.created_at))[0];
23
+ if (last?.status === "failed")
24
+ throw new Error("Offsite database backup failed.");
25
+ if (last?.status === "success")
26
+ return { environment: name, database: "success", uploads: "queued", filename: last.filename };
27
+ await sleep(4000);
28
+ }
29
+ throw new Error("Offsite database backup timed out.");
30
+ }
31
+ async function bucketConfig(root, state, api) {
32
+ const secret = readEnv(join(root, ".secrets/backup.env"));
33
+ if (secret.BACKUP_S3_ENDPOINT)
34
+ return { endpoint: secret.BACKUP_S3_ENDPOINT, bucket: secret.BACKUP_S3_BUCKET, region: secret.BACKUP_S3_REGION, user: secret.BACKUP_S3_ACCESS_KEY_ID + ":" + secret.BACKUP_S3_SECRET_ACCESS_KEY };
35
+ const storage = await api("GET", "/s3-storages/" + state.platform.backupStorageUuid);
36
+ if (!storage.key || !storage.secret)
37
+ throw new Error("Set private .secrets/backup.env to verify the offsite backup objects.");
38
+ return { endpoint: storage.endpoint, bucket: storage.bucket, region: storage.region, user: storage.key + ":" + storage.secret };
39
+ }
40
+ export async function backupVerify(root, manifest, name) {
41
+ allowedComponents(manifest, name, ["cms"]);
42
+ const state = loadState(root, name), values = readEnv(join(root, ".secrets", name + ".env"));
43
+ const api = coolifyClient(state.platform.coolifyUrl, operatorEnvironment(root).COOLIFY_TOKEN);
44
+ const bucket = await bucketConfig(root, state, api);
45
+ const objects = s3List(bucket, "data/coolify/backups/").filter(item => item.size > 0).sort((a, b) => b.modified.localeCompare(a.modified));
46
+ const database = objects.find(item => item.key.includes(state.platform.poolUuid) && item.key.includes(state.database.name));
47
+ const uploads = objects.find(item => item.key.includes(state.apps.cms.name + "-uploads"));
48
+ if (!database || !uploads)
49
+ throw new Error("Both nonempty offsite database and uploads backups are required.");
50
+ const directory = mkdtempSync(join(tmpdir(), "flowpress-restore-"));
51
+ const id = "flowpress-restore-" + process.pid;
52
+ try {
53
+ const file = join(directory, database.key.endsWith(".gz") ? "database.sql.gz" : "database.sql");
54
+ s3Get(bucket, database.key, file);
55
+ if (file.endsWith(".gz"))
56
+ run("gunzip", ["-k", file]);
57
+ run("docker", ["run", "--rm", "-d", "--network", "none", "--memory", "1536m", "--name", id, "-e", "MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1", "-e", "MARIADB_DATABASE=restore", "mariadb:11.4"], { stdio: "ignore" });
58
+ for (let attempt = 0; attempt < 60; attempt++) {
59
+ try {
60
+ capture("docker", ["exec", id, "healthcheck.sh", "--connect", "--innodb_initialized"]);
61
+ break;
62
+ }
63
+ catch {
64
+ if (attempt === 59)
65
+ throw new Error("Restore test database did not start.");
66
+ await sleep(2000);
67
+ }
68
+ }
69
+ const { readFileSync } = await import("node:fs");
70
+ run("docker", ["exec", "-i", id, "mariadb", "-uroot", "restore"], { input: readFileSync(file.replace(/\.gz$/, "")), stdio: ["pipe", "pipe", "pipe"] });
71
+ if (!/^[a-zA-Z0-9_]+$/.test(values.DB_PREFIX || ""))
72
+ throw new Error("Unsafe WordPress table prefix.");
73
+ const query = sql => capture("docker", ["exec", id, "mariadb", "-uroot", "-N", "restore", "-e", sql]);
74
+ const home = query("SELECT option_value FROM " + values.DB_PREFIX + "options WHERE option_name='home'");
75
+ const tables = Number(query("SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='restore'"));
76
+ if (tables < 10 || new URL(home).origin !== new URL(state.apps.cms.url).origin)
77
+ throw new Error("Restored database identity mismatch.");
78
+ const archive = join(directory, "uploads.tar.gz");
79
+ s3Get(bucket, uploads.key, archive);
80
+ const options = ["run", "--rm", "--network", "none", "--read-only", "--user", String(process.getuid?.() || 0) + ":" + String(process.getgid?.() || 0),
81
+ "--cap-drop", "ALL", "--security-opt", "no-new-privileges", "--tmpfs", "/restore:rw,size=1g,mode=1777", "-v", archive + ":/backup.tar.gz:ro", "alpine:3.22"];
82
+ safeArchiveEntries(capture("docker", [...options, "tar", "-tzf", "/backup.tar.gz"]).split("\n").filter(Boolean));
83
+ const files = capture("docker", [...options, "sh", "-ec", 'tar -xzf /backup.tar.gz -C /restore; find /restore -type f | wc -l']);
84
+ if (Number(files) < 1)
85
+ throw new Error("Restored uploads are empty.");
86
+ return { environment: name, database: { tables, home }, uploads: { files: Number(files) }, offsite: true };
87
+ }
88
+ finally {
89
+ try {
90
+ run("docker", ["rm", "-fv", id], { stdio: "ignore" });
91
+ }
92
+ catch { /* startup may have failed */ }
93
+ rmSync(directory, { recursive: true, force: true });
94
+ }
95
+ }
96
+ export async function status(root, manifest, only) {
97
+ const report = { ok: true, checkedAt: new Date().toISOString(), environments: {} };
98
+ for (const name of only ? [only] : Object.keys(manifest.environments)) {
99
+ const state = loadState(root, name);
100
+ if (!Object.keys(state.apps || {}).length) {
101
+ report.environments[name] = { active: false, ok: true };
102
+ continue;
103
+ }
104
+ const result = { active: true, ok: true, apps: {}, backups: {} };
105
+ const api = coolifyClient(state.platform.coolifyUrl, operatorEnvironment(root).COOLIFY_TOKEN);
106
+ for (const [component, app] of Object.entries(state.apps)) {
107
+ try {
108
+ const current = await api("GET", "/applications/" + app.uuid);
109
+ const response = await fetch(app.url + app.health + "?status=" + Date.now(), { signal: AbortSignal.timeout(10000), redirect: "error" });
110
+ const data = await response.json();
111
+ const configuredSha = (await imageMetadata(app.repository + ":" + current.docker_registry_image_tag, operatorEnvironment(root)))?.sha;
112
+ const ok = current.status === "running:healthy" && response.ok && data.status === "ok" && Boolean(configuredSha) && data.release === configuredSha;
113
+ result.apps[component] = { ok, status: current.status, release: data.release };
114
+ if (!ok)
115
+ result.ok = false;
116
+ }
117
+ catch {
118
+ result.apps[component] = { ok: false, status: "unknown" };
119
+ result.ok = false;
120
+ }
121
+ }
122
+ if (state.database?.backupUuid) {
123
+ try {
124
+ const executions = list(await api("GET", "/databases/" + state.platform.poolUuid + "/backups/" + state.database.backupUuid + "/executions"));
125
+ const bucket = await bucketConfig(root, state, api);
126
+ const objects = s3List(bucket, "data/coolify/backups/");
127
+ result.backups.database = backupHealth({ executions, objects: objects.filter(item => item.key.includes(state.platform.poolUuid) && item.key.includes(state.database.name)), maxAgeHours: 36 });
128
+ result.backups.uploads = backupHealth({ objects: objects.filter(item => item.key.includes(state.apps.cms.name + "-uploads")), maxAgeHours: 36 });
129
+ if (!result.backups.database.ok || !result.backups.uploads.ok)
130
+ result.ok = false;
131
+ }
132
+ catch {
133
+ result.backups = { ok: false, status: "unknown" };
134
+ result.ok = false;
135
+ }
136
+ }
137
+ report.environments[name] = result;
138
+ if (!result.ok)
139
+ report.ok = false;
140
+ }
141
+ return report;
142
+ }
143
+ //# sourceMappingURL=monitor.js.map