@underpostnet/cyberia 3.2.90 → 3.3.73

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 (490) hide show
  1. package/.dockerignore +1 -0
  2. package/.env.example +16 -0
  3. package/.github/workflows/coverall.cyberia.ci.yml +107 -0
  4. package/.github/workflows/cyberia-client.cd.yml +6 -18
  5. package/.github/workflows/cyberia-server.cd.yml +6 -18
  6. package/.github/workflows/docker-image.cyberia-client.ci.yml +8 -5
  7. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +8 -3
  8. package/.github/workflows/docker-image.cyberia-server.ci.yml +8 -5
  9. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +8 -5
  10. package/.github/workflows/docker-image.engine-cyberia.ci.yml +15 -1
  11. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +15 -1
  12. package/.github/workflows/engine-cyberia.cd.yml +6 -78
  13. package/.github/workflows/engine-cyberia.ci.yml +4 -5
  14. package/.github/workflows/ghpkg.ci.yml +42 -21
  15. package/.github/workflows/hardhat.ci.yml +12 -11
  16. package/.github/workflows/npmpkg.ci.yml +17 -15
  17. package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -16
  18. package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
  19. package/.github/workflows/release.cd.yml +2 -9
  20. package/.prettierignore +1 -0
  21. package/AGENTS.md +47 -0
  22. package/CHANGELOG.md +581 -2417
  23. package/CLI-HELP.md +416 -127
  24. package/Dockerfile +25 -9
  25. package/Dockerfile.dev +25 -9
  26. package/Dockerfile.test +4 -4
  27. package/README.md +21 -1
  28. package/bin/build.js +70 -43
  29. package/bin/build.template.js +8 -3
  30. package/bin/cyberia.js +372 -135
  31. package/bin/deploy.js +18 -104
  32. package/bin/index.js +372 -135
  33. package/compose.env +16 -0
  34. package/conf.js +93 -4
  35. package/deploy/cyberia-client/deploy.sh +47 -0
  36. package/deploy/cyberia-client/package.sh +18 -0
  37. package/deploy/cyberia-client/state.sh +14 -0
  38. package/deploy/cyberia-server/deploy.sh +47 -0
  39. package/deploy/cyberia-server/package.sh +18 -0
  40. package/deploy/cyberia-server/state.sh +14 -0
  41. package/deploy/dd-cyberia/deploy.sh +22 -0
  42. package/deploy/dd-cyberia/init.sh +55 -0
  43. package/deploy/dd-cyberia/package.sh +17 -0
  44. package/deploy/dd-cyberia/state.sh +14 -0
  45. package/deploy/dd-cyberia/sync-deploy.sh +116 -0
  46. package/deploy/lib/github-actions-logging.sh +594 -0
  47. package/deploy/lib/host.sh +185 -0
  48. package/deploy/lib/state.sh +62 -0
  49. package/deploy/pwa-microservices-template/deploy.sh +45 -0
  50. package/deploy/release/deploy.sh +32 -0
  51. package/deployment.yaml +7 -2
  52. package/docker-compose.yml +31 -37
  53. package/examples/static-page/README.md +19 -19
  54. package/examples/static-page/ssr-components/CustomPage.js +2 -2
  55. package/hardhat/hardhat.config.js +1 -6
  56. package/hardhat/package-lock.json +104 -43
  57. package/hardhat/package.json +3 -3
  58. package/manifests/alertmanager/deployment.yaml +81 -0
  59. package/manifests/blackbox-exporter/deployment.yaml +75 -0
  60. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +36 -7
  61. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +77 -0
  62. package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
  63. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  64. package/manifests/grafana/deployment.yaml +26 -7
  65. package/manifests/grafana/kustomization.yaml +1 -0
  66. package/manifests/grafana/service.yaml +6 -1
  67. package/manifests/mariadb/pv.yaml +1 -0
  68. package/manifests/mongodb/statefulset.yaml +9 -2
  69. package/manifests/mysql/pv-pvc.yaml +14 -1
  70. package/manifests/postgresql/pv.yaml +12 -1
  71. package/manifests/postgresql/pvc.yaml +1 -0
  72. package/manifests/prometheus/deployment.yaml +18 -22
  73. package/package.json +83 -10
  74. package/scripts/audit-selinux.sh +64 -0
  75. package/scripts/event-monitor.sh +56 -0
  76. package/scripts/gpu-diag.sh +0 -0
  77. package/scripts/ip-info.sh +0 -0
  78. package/scripts/k3s-node-setup.sh +30 -14
  79. package/scripts/kubeadm-node-setup.sh +40 -31
  80. package/scripts/lxd-vm-setup.sh +0 -0
  81. package/scripts/maas-nat-firewalld.sh +0 -0
  82. package/scripts/maas-setup.sh +8 -8
  83. package/scripts/nat-iptables.sh +2 -0
  84. package/scripts/rhel-grpc-setup.sh +0 -0
  85. package/scripts/rocky-kickstart.sh +25 -9
  86. package/scripts/selinux-normalize.sh +907 -0
  87. package/scripts/shutdown-machine.sh +843 -0
  88. package/scripts/test-monitor.sh +3 -3
  89. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +1 -1
  90. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +2 -2
  91. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +2 -2
  92. package/src/api/core/core.controller.js +1 -1
  93. package/src/api/core/core.router.js +2 -2
  94. package/src/api/core/core.service.js +2 -2
  95. package/src/api/crypto/crypto.controller.js +1 -1
  96. package/src/api/crypto/crypto.service.js +1 -1
  97. package/src/api/cyberia-action/cyberia-action.controller.js +1 -1
  98. package/src/api/cyberia-action/cyberia-action.router.js +1 -1
  99. package/src/api/cyberia-action/cyberia-action.service.js +2 -2
  100. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +1 -1
  101. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +1 -1
  102. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +2 -2
  103. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
  104. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +1 -1
  105. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +2 -2
  106. package/src/api/cyberia-entity/cyberia-entity.controller.js +1 -1
  107. package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
  108. package/src/api/cyberia-entity/cyberia-entity.service.js +2 -2
  109. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +1 -1
  110. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +1 -1
  111. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +2 -2
  112. package/src/api/cyberia-instance/cyberia-fallback-capture.js +466 -0
  113. package/src/api/cyberia-instance/cyberia-fallback-default-items.js +63 -0
  114. package/src/api/cyberia-instance/cyberia-fallback-world.js +16 -1
  115. package/src/api/cyberia-instance/cyberia-instance-map.service.js +1 -1
  116. package/src/api/cyberia-instance/cyberia-instance.controller.js +4 -1
  117. package/src/api/cyberia-instance/cyberia-instance.router.js +15 -2
  118. package/src/api/cyberia-instance/cyberia-instance.service.js +45 -2
  119. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
  120. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +1 -0
  121. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
  122. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +2 -2
  123. package/src/api/cyberia-map/cyberia-map.controller.js +1 -1
  124. package/src/api/cyberia-map/cyberia-map.router.js +1 -1
  125. package/src/api/cyberia-map/cyberia-map.service.js +2 -2
  126. package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
  127. package/src/api/cyberia-quest/cyberia-quest.router.js +1 -1
  128. package/src/api/cyberia-quest/cyberia-quest.service.js +2 -2
  129. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
  130. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +1 -1
  131. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +2 -2
  132. package/src/api/cyberia-saga/cyberia-saga.controller.js +1 -1
  133. package/src/api/cyberia-saga/cyberia-saga.router.js +1 -1
  134. package/src/api/cyberia-saga/cyberia-saga.service.js +2 -2
  135. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +16 -29
  136. package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
  137. package/src/api/cyberia-skill/cyberia-skill.router.js +1 -1
  138. package/src/api/cyberia-skill/cyberia-skill.service.js +2 -2
  139. package/src/api/default/default.controller.js +1 -1
  140. package/src/api/default/default.router.js +1 -1
  141. package/src/api/default/default.service.js +2 -2
  142. package/src/api/document/document.controller.js +1 -1
  143. package/src/api/document/document.router.js +1 -1
  144. package/src/api/document/document.service.js +2 -2
  145. package/src/api/file/file.controller.js +1 -1
  146. package/src/api/file/file.router.js +1 -1
  147. package/src/api/file/file.service.js +2 -2
  148. package/src/api/instance/instance.controller.js +1 -1
  149. package/src/api/instance/instance.router.js +1 -1
  150. package/src/api/instance/instance.service.js +2 -2
  151. package/src/api/ipfs/ipfs.controller.js +1 -1
  152. package/src/api/ipfs/ipfs.router.js +2 -2
  153. package/src/api/ipfs/ipfs.service.js +2 -2
  154. package/src/api/object-layer/object-layer.controller.js +1 -1
  155. package/src/api/object-layer/object-layer.model.js +204 -3
  156. package/src/api/object-layer/object-layer.router.js +2 -2
  157. package/src/api/object-layer/object-layer.service.js +4 -17
  158. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +1 -1
  159. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +1 -1
  160. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +2 -2
  161. package/src/api/test/test.controller.js +1 -1
  162. package/src/api/test/test.service.js +1 -1
  163. package/src/api/user/guest.service.js +3 -3
  164. package/src/api/user/user.controller.js +1 -1
  165. package/src/api/user/user.router.js +2 -2
  166. package/src/api/user/user.service.js +4 -4
  167. package/src/api.js +5 -9
  168. package/src/cli/app.js +391 -0
  169. package/src/cli/baremetal.js +30 -36
  170. package/src/cli/client.js +306 -0
  171. package/src/cli/cloud-init.js +3 -3
  172. package/src/cli/cluster.js +242 -135
  173. package/src/cli/db.js +126 -67
  174. package/src/cli/deploy.js +158 -60
  175. package/src/cli/docker-compose.js +5 -5
  176. package/src/cli/domains.js +184 -0
  177. package/src/cli/dotenv-store.js +143 -0
  178. package/src/cli/event.js +2281 -0
  179. package/src/cli/fs.js +3 -3
  180. package/src/cli/host.js +672 -0
  181. package/src/cli/image.js +4 -7
  182. package/src/cli/index.js +426 -134
  183. package/src/cli/ipfs.js +34 -30
  184. package/src/cli/kickstart.js +1 -1
  185. package/src/cli/kubectl.js +218 -41
  186. package/src/cli/lxd.js +3 -3
  187. package/src/cli/monitor.js +1359 -26
  188. package/src/cli/package.js +90 -0
  189. package/src/cli/release.js +73 -34
  190. package/src/cli/repository.js +564 -367
  191. package/src/cli/run.js +362 -654
  192. package/src/cli/secrets.js +2158 -964
  193. package/src/cli/ssh.js +651 -331
  194. package/src/cli/state.js +394 -0
  195. package/src/cli/static.js +2 -2
  196. package/src/cli/system.js +26 -13
  197. package/src/cli/test.js +199 -125
  198. package/src/cli/vultr.js +623 -0
  199. package/src/cli/wireguard.js +2930 -0
  200. package/src/client/components/core/CalendarCore.js +53 -96
  201. package/src/client/components/core/Docs.js +258 -211
  202. package/src/client/components/core/FileExplorer.js +0 -21
  203. package/src/client/components/core/PanelForm.js +4 -4
  204. package/src/client/components/core/Repository.js +56 -0
  205. package/src/client/components/core/Translate.js +7 -0
  206. package/src/client/components/core/{FullScreen.js → ViewModeController.js} +42 -39
  207. package/src/client/components/core/Wallet.js +0 -11
  208. package/src/client/components/core/Worker.js +7 -1
  209. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +2 -2
  210. package/src/client/components/cyberia/FallbackWorldEngineCyberia.js +368 -0
  211. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +35 -1
  212. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +4 -0
  213. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
  214. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -0
  215. package/src/client/components/default/AppShellDefault.js +1 -1
  216. package/src/client/components/default/SettingsDefault.js +2 -2
  217. package/src/client/components/itemledger/SettingsItemledger.js +2 -2
  218. package/src/client/components/underpost/AppShellUnderpost.js +3 -2
  219. package/src/client/components/underpost/SettingsUnderpost.js +2 -2
  220. package/src/client/public/cyberia-docs/ARCHITECTURE.md +17 -3
  221. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +32 -5
  222. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +1 -1
  223. package/src/client/public/cyberia-docs/CYBERIA.md +21 -1
  224. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +23 -6
  225. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  226. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  227. package/src/client/public/default/android-chrome-144x144.png +0 -0
  228. package/src/client/public/default/android-chrome-192x192.png +0 -0
  229. package/src/client/public/default/android-chrome-256x256.png +0 -0
  230. package/src/client/public/default/android-chrome-36x36.png +0 -0
  231. package/src/client/public/default/android-chrome-384x384.png +0 -0
  232. package/src/client/public/default/android-chrome-48x48.png +0 -0
  233. package/src/client/public/default/android-chrome-512x512.png +0 -0
  234. package/src/client/public/default/android-chrome-72x72.png +0 -0
  235. package/src/client/public/default/android-chrome-96x96.png +0 -0
  236. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  237. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  238. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  239. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  240. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  241. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  242. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  243. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  244. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  245. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  246. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  247. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  248. package/src/client/public/default/apple-touch-icon.png +0 -0
  249. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  250. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  251. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  252. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  253. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  254. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  255. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  256. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  257. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  258. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  259. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  260. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  261. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  262. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  263. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  264. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  265. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  266. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  267. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  268. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  269. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  270. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  271. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  272. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  273. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  274. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  275. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  276. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  277. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  278. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  279. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  280. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  281. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  282. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  283. package/src/client/public/default/assets/background/white.jpg +0 -0
  284. package/src/client/public/default/browserconfig.xml +1 -1
  285. package/src/client/public/default/favicon-16x16.png +0 -0
  286. package/src/client/public/default/favicon-32x32.png +0 -0
  287. package/src/client/public/default/favicon-48x48.png +0 -0
  288. package/src/client/public/default/favicon.ico +0 -0
  289. package/src/client/public/default/manifest.webmanifest +5 -5
  290. package/src/client/public/default/mstile-144x144.png +0 -0
  291. package/src/client/public/default/mstile-150x150.png +0 -0
  292. package/src/client/public/default/mstile-310x150.png +0 -0
  293. package/src/client/public/default/mstile-310x310.png +0 -0
  294. package/src/client/public/default/mstile-70x70.png +0 -0
  295. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  296. package/src/client/public/default/yandex-browser-manifest.json +1 -1
  297. package/src/client/services/cyberia-instance/cyberia-instance.service.js +40 -0
  298. package/src/client/services/object-layer/object-layer.management.js +4 -4
  299. package/src/client/ssr/RootDocument.js +1 -1
  300. package/src/client/ssr/body/404.js +1 -1
  301. package/src/client/ssr/body/500.js +1 -1
  302. package/src/client/ssr/body/CacheControl.js +1 -1
  303. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +1 -1
  304. package/src/client/ssr/body/DefaultSplashScreen.js +1 -1
  305. package/src/client/ssr/body/SwaggerDarkMode.js +1 -1
  306. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +1 -1
  307. package/src/client/ssr/head/CryptokoynScripts.js +1 -1
  308. package/src/client/ssr/head/Css.js +1 -1
  309. package/src/client/ssr/head/CyberiaPortalScripts.js +1 -1
  310. package/src/client/ssr/head/DefaultScripts.js +1 -1
  311. package/src/client/ssr/head/ItemledgerScripts.js +1 -1
  312. package/src/client/ssr/head/Microdata.js +1 -1
  313. package/src/client/ssr/head/Production.js +1 -1
  314. package/src/client/ssr/head/Pwa.js +1 -1
  315. package/src/client/ssr/head/PwaItemledger.js +1 -1
  316. package/src/client/ssr/head/Seo.js +1 -1
  317. package/src/client/ssr/head/UnderpostScripts.js +1 -1
  318. package/src/client/ssr/mailer/DefaultRecoverEmail.js +1 -1
  319. package/src/client/ssr/mailer/DefaultVerifyEmail.js +1 -1
  320. package/src/client/ssr/views/Cyberia404.js +7 -5
  321. package/src/client/ssr/views/CyberiaServerMetrics.js +1 -1
  322. package/src/client/ssr/views/Maintenance.js +1 -1
  323. package/src/client/ssr/views/NoNetworkConnection.js +1 -1
  324. package/src/client/ssr/views/Test.js +1 -1
  325. package/src/client/sw/core.sw.js +20 -14
  326. package/src/client-builder/client-build-docs.js +61 -46
  327. package/src/client-builder/client-build-live.js +2 -2
  328. package/src/client-builder/client-build.js +58 -44
  329. package/src/client-builder/client-dev-server.js +3 -3
  330. package/src/client-builder/client-icons.js +2 -2
  331. package/src/client-builder/ssr.js +3 -3
  332. package/src/client.build.js +3 -6
  333. package/src/client.dev.js +3 -6
  334. package/src/db/DataBaseProvider.js +186 -3
  335. package/src/db/mariadb/MariaDB.js +3 -2
  336. package/src/db/mongo/MongoBootstrap.js +273 -101
  337. package/src/db/mongo/MongooseDB.js +11 -8
  338. package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
  339. package/src/grpc/cyberia/grpc-server.js +1 -1
  340. package/src/index.js +103 -23
  341. package/src/mailer/EmailRender.js +2 -2
  342. package/src/mailer/MailerInterceptor.js +87 -0
  343. package/src/mailer/MailerProvider.js +50 -6
  344. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +1 -1
  345. package/src/projects/cyberia/besu-genesis-generator.js +3 -3
  346. package/src/projects/cyberia/catalog-cyberia.js +54 -6
  347. package/src/projects/cyberia/gemini-client.js +1 -1
  348. package/src/projects/cyberia/generate-saga.js +15 -24
  349. package/src/projects/cyberia/hot-reload-trigger.js +1 -1
  350. package/src/projects/cyberia/instance-data.js +22 -3
  351. package/src/projects/cyberia/ipfs-client.js +4 -4
  352. package/src/projects/cyberia/map-preview-generator.js +1 -1
  353. package/src/projects/cyberia/object-layer.js +12 -22
  354. package/src/projects/cyberia/semantic-layer-generator.js +1 -1
  355. package/src/projects/underpost/catalog-underpost.js +13 -2
  356. package/src/proxy.js +4 -7
  357. package/src/runtime/cyberia-client/Dockerfile +9 -4
  358. package/src/runtime/cyberia-client/Dockerfile.dev +8 -2
  359. package/src/runtime/cyberia-server/Dockerfile +9 -4
  360. package/src/runtime/cyberia-server/Dockerfile.dev +8 -2
  361. package/src/runtime/engine-cyberia/Dockerfile +25 -9
  362. package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
  363. package/src/runtime/engine-cyberia/Dockerfile.test +4 -4
  364. package/src/runtime/engine-cyberia/compose.env +16 -0
  365. package/src/runtime/engine-cyberia/docker-compose.yml +31 -37
  366. package/src/runtime/express/Express.js +32 -27
  367. package/src/runtime/lampp/Lampp.js +22 -70
  368. package/src/runtime/nginx/Nginx.js +1 -1
  369. package/src/runtime/wp/Wp.js +16 -48
  370. package/src/server/{catalog.js → build/catalog.js} +15 -5
  371. package/src/server/build/coverage.js +117 -0
  372. package/src/server/build/execution.js +402 -0
  373. package/src/server/build/package.js +465 -0
  374. package/src/server/build/testing.js +528 -0
  375. package/src/server/{dns.js → network/dns.js} +241 -14
  376. package/src/server/network/forward-proxy.js +541 -0
  377. package/src/server/{middlewares.js → network/middlewares.js} +59 -4
  378. package/src/server/network/node-capability.js +98 -0
  379. package/src/server/{peer.js → network/peer.js} +3 -3
  380. package/src/server/{proxy.js → network/proxy.js} +7 -13
  381. package/src/server/network/router.js +356 -0
  382. package/src/server/{tls.js → network/tls.js} +2 -2
  383. package/src/server/network/underpost-compression.js +186 -0
  384. package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +26 -16
  385. package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +19 -3
  386. package/src/server/{cri.js → ops/cri.js} +2 -2
  387. package/src/server/ops/cron.js +949 -0
  388. package/src/server/ops/event-notification.js +284 -0
  389. package/src/server/{logger.js → ops/logger.js} +108 -23
  390. package/src/server/ops/monitoring.js +1724 -0
  391. package/src/server/ops/systemd.js +259 -0
  392. package/src/server/{conf.js → runtime/conf.js} +521 -520
  393. package/src/server/runtime/config-scope.js +215 -0
  394. package/src/server/runtime/environment.js +149 -0
  395. package/src/server/{process.js → runtime/process.js} +153 -13
  396. package/src/server/{runtime-status.js → runtime/runtime-status.js} +155 -16
  397. package/src/server/{runtime.js → runtime/runtime.js} +12 -8
  398. package/src/server/{start.js → runtime/start.js} +128 -39
  399. package/src/server/{auth.js → security/auth.js} +7 -8
  400. package/src/server/security/container-storage.js +382 -0
  401. package/src/server/{crypto.js → security/crypto.js} +1 -1
  402. package/src/server/security/selinux.js +185 -0
  403. package/src/server/{backup.js → storage/backup.js} +17 -8
  404. package/src/server/{data-query.js → storage/data-query.js} +1 -1
  405. package/src/server/{downloader.js → storage/downloader.js} +2 -2
  406. package/src/server/storage/repository.js +68 -0
  407. package/src/server.js +4 -7
  408. package/src/ws/IoInterface.js +1 -1
  409. package/src/ws/IoServer.js +1 -1
  410. package/src/ws/core/core.ws.connection.js +1 -1
  411. package/src/ws/core/core.ws.emit.js +1 -1
  412. package/src/ws/core/core.ws.server.js +1 -1
  413. package/src/ws/default/default.ws.connection.js +1 -1
  414. package/src/ws/default/default.ws.emit.js +1 -1
  415. package/src/ws/default/default.ws.server.js +1 -1
  416. package/test/e2e/event-e2e-public-ingress-down.js +45 -0
  417. package/test/e2e/event-e2e-wireguard-server-down.js +38 -0
  418. package/test/e2e/event-e2e-wireguard-spoke-down.js +40 -0
  419. package/test/{api.test.js → integration/app/api.test.js} +33 -14
  420. package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +30 -0
  421. package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +2 -1
  422. package/test/integration/app/cyberia/cyberia-load.test.js +467 -0
  423. package/test/integration/app/cyberia/fallback-world-capture.test.js +253 -0
  424. package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
  425. package/test/{shape-generator.test.js → integration/app/cyberia/shape-generator.test.js} +1 -1
  426. package/test/integration/infra/1-security/config-scope.test.js +305 -0
  427. package/test/integration/infra/1-security/container-storage.test.js +356 -0
  428. package/test/integration/infra/1-security/in-pod-cli-surface.test.js +86 -0
  429. package/test/integration/infra/1-security/secret-onboarding.test.js +930 -0
  430. package/test/integration/infra/1-security/selinux.test.js +69 -0
  431. package/test/{sops-secret-store.test.js → integration/infra/1-security/sops-secret-store.test.js} +415 -61
  432. package/test/integration/infra/1-security/systemd-service.test.js +70 -0
  433. package/test/integration/infra/1-security/underpost-config-secret.test.js +367 -0
  434. package/test/integration/infra/2-network/dns-firewall.test.js +566 -0
  435. package/test/integration/infra/2-network/node-capability.test.js +182 -0
  436. package/test/integration/infra/2-network/wireguard-cli.test.js +1163 -0
  437. package/test/integration/infra/2-network/wireguard-edge.test.js +1731 -0
  438. package/test/{cluster-instances.test.js → integration/infra/3-cluster/cluster-instances.test.js} +11 -15
  439. package/test/{deploy-node-placement.test.js → integration/infra/3-cluster/deploy-node-placement.test.js} +3 -3
  440. package/test/integration/infra/3-cluster/docker-compose-stack.test.js +313 -0
  441. package/test/integration/infra/4-ingress/deploy-routes.test.js +379 -0
  442. package/test/integration/infra/4-ingress/gateway-static-assets.test.js +453 -0
  443. package/test/{instance-traffic-plan.test.js → integration/infra/4-ingress/instance-traffic-plan.test.js} +10 -6
  444. package/test/{underpost-gateway.test.js → integration/infra/4-ingress/underpost-gateway.test.js} +47 -6
  445. package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +56 -4
  446. package/test/integration/infra/5-observability/cron-jobs.test.js +652 -0
  447. package/test/{deploy-monitor.test.js → integration/infra/5-observability/deploy-monitor.test.js} +29 -31
  448. package/test/integration/infra/5-observability/event-notification.test.js +197 -0
  449. package/test/integration/infra/5-observability/event-remediation.test.js +502 -0
  450. package/test/integration/infra/5-observability/event-targets.test.js +1174 -0
  451. package/test/integration/infra/5-observability/monitoring-stack.test.js +902 -0
  452. package/test/support/shell-harness.js +73 -0
  453. package/test/unit/build-template.test.js +97 -0
  454. package/test/unit/build-workflow-offline.test.js +132 -0
  455. package/test/unit/catalog.test.js +71 -0
  456. package/test/unit/client-build-docs.test.js +334 -0
  457. package/test/unit/conf-loading.test.js +303 -0
  458. package/test/unit/conf-resolution.test.js +979 -0
  459. package/test/unit/coverage-artifact.test.js +130 -0
  460. package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
  461. package/test/unit/deploy-env-resolution.test.js +38 -0
  462. package/test/unit/deploy-log-table.test.js +447 -0
  463. package/test/unit/execution-profiles.test.js +219 -0
  464. package/test/unit/fleet-sync-source.test.js +149 -0
  465. package/test/unit/logger-redaction.test.js +112 -0
  466. package/test/unit/package.test.js +403 -0
  467. package/test/unit/prepare-host.test.js +299 -0
  468. package/test/unit/process-environment.test.js +18 -0
  469. package/test/unit/propagation-message.test.js +78 -0
  470. package/test/unit/redeploy-plan.test.js +24 -0
  471. package/test/unit/release-bump.test.js +474 -0
  472. package/test/unit/ssh-output-redaction.test.js +28 -0
  473. package/test/unit/start-options.test.js +46 -0
  474. package/test/unit/test-tiers.test.js +193 -0
  475. package/vitest.config.js +58 -0
  476. package/.nycrc +0 -9
  477. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
  478. package/manifests/mongodb/pv-pvc.yaml +0 -59
  479. package/scripts/link-local-underpost-cli.sh +0 -6
  480. package/src/api/user/user.build.js +0 -16
  481. package/src/cli/env.js +0 -177
  482. package/src/client/components/core/Blockchain.js +0 -41
  483. package/src/client/components/core/Blog.js +0 -9
  484. package/src/client/components/core/KeyboardAvoidance.js +0 -145
  485. package/src/client/public/default/assets/background/dark.jpg +0 -0
  486. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  487. package/src/client/public/default/assets/background/white0.jpg +0 -0
  488. package/src/client/public/doc/favicon.ico +0 -0
  489. package/src/client/public/doc/sitemap +0 -148
  490. package/src/server/cron.js +0 -476
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Response compression policy for the Nginx workloads on the request path.
3
+ *
4
+ * @module src/server/network/underpost-compression.js
5
+ * @namespace UnderpostCompression
6
+ */
7
+
8
+ /**
9
+ * @constant UNDERPOST_COMPRESSION
10
+ * @description The compression policy both edge workloads render from.
11
+ *
12
+ * `text/html` appears in no type list on purpose: nginx and ngx_brotli both
13
+ * always compress it, and naming it again only invites the two lists to drift.
14
+ * Every entry is a format that is still text on the wire — already-compressed
15
+ * media (png, woff2, mp4) is excluded, since re-encoding it spends CPU to add
16
+ * bytes.
17
+ * @memberof UnderpostCompression
18
+ */
19
+ const UNDERPOST_COMPRESSION = {
20
+ types: [
21
+ 'application/atom+xml',
22
+ 'application/geo+json',
23
+ 'application/javascript',
24
+ 'application/json',
25
+ 'application/ld+json',
26
+ 'application/manifest+json',
27
+ 'application/rss+xml',
28
+ 'application/vnd.api+json',
29
+ 'application/wasm',
30
+ 'application/x-javascript',
31
+ 'application/xhtml+xml',
32
+ 'application/xml',
33
+ 'font/otf',
34
+ 'font/ttf',
35
+ 'image/svg+xml',
36
+ 'image/x-icon',
37
+ 'text/css',
38
+ 'text/javascript',
39
+ 'text/markdown',
40
+ 'text/plain',
41
+ 'text/xml',
42
+ ],
43
+ // Below roughly this size a compressed body plus its headers is no smaller
44
+ // than the original, and can be larger.
45
+ minLength: 512,
46
+ // Level 5 of 9: within a few percent of maximum ratio at a fraction of the
47
+ // CPU. The edge compresses every response of every host, so the cost of a
48
+ // higher level is paid on the shared workload, not on one deploy.
49
+ gzipLevel: 5,
50
+ // Brotli's scale runs to 11, where dynamic compression becomes slower than
51
+ // the transfer it saves. 5 is the usual on-the-fly ceiling.
52
+ brotliLevel: 5,
53
+ filterModule: 'ngx_http_brotli_filter_module.so',
54
+ staticModule: 'ngx_http_brotli_static_module.so',
55
+ defaultImage: 'nginx:alpine',
56
+ env: {
57
+ image: 'UNDERPOST_NGINX_IMAGE',
58
+ brotliModules: 'UNDERPOST_NGINX_BROTLI_MODULES',
59
+ enabled: 'UNDERPOST_NGINX_COMPRESSION',
60
+ },
61
+ };
62
+
63
+ /**
64
+ * @method nginxImageFactory
65
+ * @description The image both edge workloads run.
66
+ *
67
+ * Resolved in one place because the two have to agree: they sit on the same
68
+ * request path, and brotli is a property of the image rather than of the
69
+ * config. An image carrying ngx_brotli is the only way the brotli directives
70
+ * below can be rendered at all.
71
+ * @returns {string} Container image reference.
72
+ * @memberof UnderpostCompression
73
+ */
74
+ const nginxImageFactory = () =>
75
+ `${process.env[UNDERPOST_COMPRESSION.env.image] || ''}`.trim() || UNDERPOST_COMPRESSION.defaultImage;
76
+
77
+ /**
78
+ * @method brotliModuleDirFactory
79
+ * @description Directory holding the brotli dynamic modules, or an empty string
80
+ * when the image is not declared to carry them.
81
+ *
82
+ * Empty is the default and the safe state: gzip alone, on a stock image, with
83
+ * no `load_module` line that could fail to resolve.
84
+ * @returns {string} Absolute directory path, or `''`.
85
+ * @memberof UnderpostCompression
86
+ */
87
+ const brotliModuleDirFactory = () =>
88
+ `${process.env[UNDERPOST_COMPRESSION.env.brotliModules] || ''}`.trim().replace(/\/+$/, '');
89
+
90
+ /**
91
+ * @method compressionEnabledFactory
92
+ * @description Whether responses are compressed at all.
93
+ *
94
+ * The escape hatch for a CPU-bound edge node: compression trades cycles for
95
+ * bytes, and an operator who is out of the former rather than the latter needs
96
+ * to turn it off without editing generated configuration.
97
+ * @returns {boolean} True unless explicitly disabled.
98
+ * @memberof UnderpostCompression
99
+ */
100
+ const compressionEnabledFactory = () =>
101
+ !['off', '0', 'false', 'no'].includes(`${process.env[UNDERPOST_COMPRESSION.env.enabled] || ''}`.trim().toLowerCase());
102
+
103
+ /**
104
+ * @method compressionModulesConfFactory
105
+ * @description The `load_module` lines brotli needs, in nginx's main context.
106
+ *
107
+ * Rendered only alongside the brotli directives that require them, so a config
108
+ * never loads a module it does not use or uses one it did not load — using one
109
+ * that was not loaded is a start-up failure, and the reverse is surface on a
110
+ * workload that has no documents to serve from it.
111
+ * @param {string} [brotliModuleDir] - Directory holding the modules; empty renders nothing.
112
+ * @param {boolean} [enabled] - Whether compression is on at all.
113
+ * @param {boolean} [staticRoot] - Whether the workload serves documents from disk.
114
+ * @returns {string} Main-context directives, or an empty string.
115
+ * @memberof UnderpostCompression
116
+ */
117
+ const compressionModulesConfFactory = ({
118
+ brotliModuleDir = brotliModuleDirFactory(),
119
+ enabled = compressionEnabledFactory(),
120
+ staticRoot = false,
121
+ } = {}) => {
122
+ if (!enabled || !brotliModuleDir) return '';
123
+ return [
124
+ `load_module ${brotliModuleDir}/${UNDERPOST_COMPRESSION.filterModule};`,
125
+ ...(staticRoot ? [`load_module ${brotliModuleDir}/${UNDERPOST_COMPRESSION.staticModule};`] : []),
126
+ ].join('\n');
127
+ };
128
+
129
+ /**
130
+ * @method compressionConfFactory
131
+ * @description The compression block for an nginx `http` context.
132
+ *
133
+ * `gzip_proxied any` is what makes this worth rendering on a reverse proxy at
134
+ * all: the default is `off`, which suppresses compression for exactly the
135
+ * responses these workloads exist to forward. A response the upstream already
136
+ * encoded is passed through untouched either way — nginx never re-compresses
137
+ * one that carries `Content-Encoding`.
138
+ *
139
+ * `*_static` is only rendered where a document root exists. It costs one stat()
140
+ * per request to serve an operator-placed `.gz`/`.br` sibling with no CPU at
141
+ * all, and has nothing to look for on a workload that serves no files.
142
+ * @param {boolean} [enabled] - Whether compression is on at all.
143
+ * @param {string} [brotliModuleDir] - Directory holding the brotli modules; empty renders gzip alone.
144
+ * @param {boolean} [staticRoot] - Whether the workload serves documents from disk.
145
+ * @param {string} [indent] - Leading whitespace for each line.
146
+ * @returns {string} `http`-context directives, or an empty string.
147
+ * @memberof UnderpostCompression
148
+ */
149
+ const compressionConfFactory = ({
150
+ enabled = compressionEnabledFactory(),
151
+ brotliModuleDir = brotliModuleDirFactory(),
152
+ staticRoot = false,
153
+ indent = ' ',
154
+ } = {}) => {
155
+ if (!enabled) return '';
156
+ const types = UNDERPOST_COMPRESSION.types.join(' ');
157
+ const lines = [
158
+ 'gzip on;',
159
+ // Compressed and uncompressed bodies share a URL, so a cache that ignores
160
+ // this header serves one to a client that asked for the other.
161
+ 'gzip_vary on;',
162
+ `gzip_comp_level ${UNDERPOST_COMPRESSION.gzipLevel};`,
163
+ `gzip_min_length ${UNDERPOST_COMPRESSION.minLength};`,
164
+ 'gzip_proxied any;',
165
+ `gzip_types ${types};`,
166
+ ...(staticRoot ? ['gzip_static on;'] : []),
167
+ ];
168
+ if (brotliModuleDir)
169
+ lines.push(
170
+ 'brotli on;',
171
+ `brotli_comp_level ${UNDERPOST_COMPRESSION.brotliLevel};`,
172
+ `brotli_min_length ${UNDERPOST_COMPRESSION.minLength};`,
173
+ `brotli_types ${types};`,
174
+ ...(staticRoot ? ['brotli_static on;'] : []),
175
+ );
176
+ return lines.map((line) => `${indent}${line}`).join('\n');
177
+ };
178
+
179
+ export {
180
+ UNDERPOST_COMPRESSION,
181
+ brotliModuleDirFactory,
182
+ compressionConfFactory,
183
+ compressionEnabledFactory,
184
+ compressionModulesConfFactory,
185
+ nginxImageFactory,
186
+ };
@@ -23,18 +23,19 @@
23
23
  * `www.cyberiaonline.com` + `/` + 404 becomes
24
24
  * `www.cyberiaonline.com/root/status-pages/404/index.html`.
25
25
  *
26
- * @module src/server/underpost-gateway.js
26
+ * @module src/server/network/underpost-gateway.js
27
27
  * @namespace UnderpostGateway
28
28
  */
29
29
 
30
30
  import crypto from 'node:crypto';
31
31
  import fs from 'fs-extra';
32
32
  import nodePath from 'node:path';
33
- import { timer } from '../client/components/core/CommonJs.js';
34
- import { instanceStatusPageEntriesFactory, loadConfServerJson, loadReplicas } from './conf.js';
35
- import Underpost from '../index.js';
36
- import { loggerFactory } from './logger.js';
37
- import { shellExec } from './process.js';
33
+ import { timer } from '../../client/components/core/CommonJs.js';
34
+ import { instanceStatusPageEntriesFactory, loadConfServerJson, loadReplicas } from '../runtime/conf.js';
35
+ import { compressionConfFactory, compressionModulesConfFactory, nginxImageFactory } from './underpost-compression.js';
36
+ import Underpost from '../../index.js';
37
+ import { loggerFactory } from '../ops/logger.js';
38
+ import { shellExec } from '../runtime/process.js';
38
39
 
39
40
  const logger = loggerFactory(import.meta);
40
41
 
@@ -51,7 +52,7 @@ const UNDERPOST_GATEWAY = {
51
52
  configMapName: 'underpost-gateway-nginx',
52
53
  claimName: 'pvc-underpost-gateway',
53
54
  volumeName: 'pv-underpost-gateway',
54
- image: 'nginx:alpine',
55
+ image: nginxImageFactory(),
55
56
  root: '/var/www/static',
56
57
  port: 80,
57
58
  healthPath: '/healthz',
@@ -189,13 +190,24 @@ const defaultStatusPagePath = (status = 404) => `${UNDERPOST_GATEWAY.defaultHost
189
190
  * 200. That status is what stops the document being stored: the PWA service
190
191
  * worker caches navigations for hours and would otherwise keep serving the
191
192
  * fallback long after the host's real page landed in the tree.
193
+ *
194
+ * Compression is applied here rather than further out because this is the last
195
+ * hop that holds a response body in the clear — and, for every host whose
196
+ * errors are intercepted, the hop every site path already passes through. See
197
+ * {@link module:src/server/network/underpost-compression.js}.
198
+ * @param {string} [resolver] - Cluster DNS ClusterIP.
199
+ * @param {object} [compression] - Overrides for the compression policy.
192
200
  * @returns {string} nginx.conf contents.
193
201
  * @memberof UnderpostGateway
194
202
  */
195
- const nginxConfFactory = ({ resolver = UNDERPOST_GATEWAY.resolver } = {}) => `worker_processes auto;
203
+ const nginxConfFactory = ({ resolver = UNDERPOST_GATEWAY.resolver, compression = {} } = {}) => {
204
+ const policy = { ...compression, staticRoot: true };
205
+ const modules = compressionModulesConfFactory(policy);
206
+ const compress = compressionConfFactory(policy);
207
+ return `worker_processes auto;
196
208
  error_log /dev/stderr warn;
197
209
  pid /tmp/nginx.pid;
198
-
210
+ ${modules ? `${modules}\n` : ''}
199
211
  events {
200
212
  worker_connections 1024;
201
213
  }
@@ -206,12 +218,7 @@ http {
206
218
  sendfile on;
207
219
  tcp_nopush on;
208
220
  server_tokens off;
209
-
210
- gzip on;
211
- gzip_vary on;
212
- gzip_min_length 512;
213
- gzip_types text/html text/css text/plain application/javascript application/json image/svg+xml;
214
-
221
+ ${compress ? `\n${compress}\n` : ''}
215
222
  log_format concise '$remote_addr "$request" $status $body_bytes_sent "$host"';
216
223
  access_log /dev/stdout concise;
217
224
 
@@ -259,6 +266,7 @@ http {
259
266
  }
260
267
  }
261
268
  `;
269
+ };
262
270
 
263
271
  /**
264
272
  * @method statusPageLocationsFactory
@@ -388,6 +396,7 @@ ${blocks
388
396
  * @param {string} hostPath - Node directory backing the static root.
389
397
  * @param {string} [nodeName] - Node the hostPath volume is pinned to.
390
398
  * @param {string} [storage] - Volume size.
399
+ * @param {object} [compression] - Overrides for the compression policy.
391
400
  * @returns {string} Multi-document YAML.
392
401
  * @memberof UnderpostGateway
393
402
  */
@@ -397,8 +406,9 @@ const underpostGatewayManifestsFactory = ({
397
406
  nodeName = '',
398
407
  storage = '1Gi',
399
408
  resolver,
409
+ compression = {},
400
410
  } = {}) => {
401
- const nginxConf = nginxConfFactory({ resolver });
411
+ const nginxConf = nginxConfFactory({ resolver, compression });
402
412
  // The config is mounted with `subPath`, which Kubernetes never refreshes in
403
413
  // place, and the pod template is otherwise identical across rebuilds — so
404
414
  // without this annotation an edited nginx.conf reaches the ConfigMap and
@@ -20,10 +20,12 @@
20
20
  * holding every host's certificate and re-negotiating ALPN. Passing the bytes
21
21
  * through keeps certificates, HTTP/2 and mTLS exactly where they already work.
22
22
  *
23
- * @module src/server/underpost-ingress.js
23
+ * @module src/server/network/underpost-ingress.js
24
24
  * @namespace UnderpostIngress
25
25
  */
26
26
 
27
+ import { compressionConfFactory, compressionModulesConfFactory, nginxImageFactory } from './underpost-compression.js';
28
+
27
29
  /**
28
30
  * @constant UNDERPOST_INGRESS
29
31
  * @description Identity of the underpost ingress workload. One deployment fronts every
@@ -33,7 +35,7 @@
33
35
  const UNDERPOST_INGRESS = {
34
36
  name: 'underpost-ingress',
35
37
  configMapName: 'underpost-ingress-nginx',
36
- image: 'nginx:alpine',
38
+ image: nginxImageFactory(),
37
39
  httpPort: 80,
38
40
  httpsPort: 443,
39
41
  healthPort: 8090,
@@ -100,10 +102,17 @@ const underpostIngressHostMapFactory = ({ contourHosts = [], gatewayHosts = [],
100
102
  * that owns most of the routing rather than a rejection, so a host whose route
101
103
  * object has not been applied yet still reaches a data plane that can answer it
102
104
  * — including with its own 404.
105
+ *
106
+ * Compression is rendered for `:80` alone, and that asymmetry is the same split
107
+ * the module makes everywhere else: an L7 hop holds a body it can encode, while
108
+ * `:443` carries bytes this process never decrypts. Whatever leaves through the
109
+ * tunnel on that port was compressed where TLS terminates — see
110
+ * {@link module:src/server/network/underpost-compression.js}.
103
111
  * @param {Array<object>} [entries] - Host table from {@link UnderpostIngress.underpostIngressHostMapFactory}.
104
112
  * @param {object} backends - `{contour: {http, tls}, gateway: {http, tls}}`; a missing stack is omitted.
105
113
  * @param {string} [defaultBackend] - Backend for an unmatched hostname.
106
114
  * @param {string} [resolver] - Cluster DNS ClusterIP.
115
+ * @param {object} [compression] - Overrides for the compression policy.
107
116
  * @returns {string} nginx.conf contents.
108
117
  * @memberof UnderpostIngress
109
118
  */
@@ -112,6 +121,7 @@ const underpostIngressConfFactory = ({
112
121
  backends = {},
113
122
  defaultBackend = 'gateway',
114
123
  resolver = UNDERPOST_INGRESS.resolver,
124
+ compression = {},
115
125
  } = {}) => {
116
126
  const available = Object.keys(backends).filter((name) => backends[name]?.http && backends[name]?.tls);
117
127
  // With one stack installed the map still renders, so the same workload serves
@@ -121,17 +131,23 @@ const underpostIngressConfFactory = ({
121
131
  const routable = entries.filter((entry) => entry?.host && available.includes(entry.backend));
122
132
  const mapEntries = (kind) =>
123
133
  routable.map((entry) => ` ${entry.host} ${backends[entry.backend][kind]};`).join('\n') || '';
134
+ // No `staticRoot`: this workload proxies every byte and serves no documents,
135
+ // so there is never a pre-compressed sibling on disk to prefer.
136
+ const policy = { ...compression, staticRoot: false };
137
+ const modules = compressionModulesConfFactory(policy);
138
+ const compress = compressionConfFactory(policy);
124
139
 
125
140
  return `worker_processes auto;
126
141
  error_log /dev/stderr warn;
127
142
  pid /tmp/nginx.pid;
128
-
143
+ ${modules ? `${modules}\n` : ''}
129
144
  events {
130
145
  worker_connections 4096;
131
146
  }
132
147
 
133
148
  http {
134
149
  server_tokens off;
150
+ ${compress ? `\n${compress}\n` : ''}
135
151
  log_format underpost_ingress '$remote_addr "$request" $status "$host" -> $underpost_ingress_http_upstream';
136
152
  access_log /dev/stdout underpost_ingress;
137
153
 
@@ -3,11 +3,11 @@
3
3
  * that shells out to `crictl`: the cluster CLI, image management, and the
4
4
  * database bootstraps. Lives under `src/server` so the db layer can import it
5
5
  * without depending on the CLI god-object.
6
- * @module src/server/cri.js
6
+ * @module src/server/ops/cri.js
7
7
  * @namespace CriEndpoint
8
8
  */
9
9
 
10
- import { shellExec } from './process.js';
10
+ import { shellExec } from '../runtime/process.js';
11
11
 
12
12
  const CRIO_SOCKET_PATH = '/var/run/crio/crio.sock';
13
13