@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,185 @@
1
+ # Host preparation for deploy/<deploy-id>/*.sh. Sourced, never executed directly.
2
+ # Requires lib/github-actions-logging.sh for deploy_step.
3
+
4
+ # The host configuration store, if this node has one.
5
+ #
6
+ # Every step below drives the CLI through `sudo`, so the store the CLI writes is root's, not the
7
+ # store of whoever sourced this file. Both are looked at, the sourcing account first, so a script
8
+ # run as root and a script run as an operator with sudo read the same node configuration.
9
+ #
10
+ # Usage: host_config_path
11
+ host_config_path() {
12
+ local root path
13
+
14
+ root="$(npm root -g 2>/dev/null)" || root=''
15
+ path="$root/underpost/.env"
16
+ if [ -n "$root" ] && [ -f "$path" ]; then
17
+ printf '%s' "$path"
18
+ return 0
19
+ fi
20
+
21
+ # Only when the sourcing account has no store of its own: `sudo -n` is non-interactive, so a
22
+ # host without passwordless sudo declines instead of prompting.
23
+ root="$(sudo -n -- /bin/bash -lc 'npm root -g' 2>/dev/null)" || root=''
24
+ path="$root/underpost/.env"
25
+ [ -n "$root" ] && [ -f "$path" ] && printf '%s' "$path"
26
+
27
+ return 0
28
+ }
29
+
30
+ # One key of this node's resolved host configuration, read straight out of the store the host
31
+ # domain owns (`underpost host get|set`). Pure shell for the same reason `deploy_id_from_repo`
32
+ # is: it resolves the manifest that makes that CLI runnable, so it cannot ask the CLI.
33
+ #
34
+ # Usage: host_config <key>
35
+ host_config() {
36
+ local key="$1" path value
37
+
38
+ path="$(host_config_path)"
39
+ [ -n "$path" ] || return 0
40
+
41
+ value="$(sed -n "s/^[[:space:]]*${key}[[:space:]]*=[[:space:]]*//p" "$path" | tail -n 1)"
42
+ value="${value%"${value##*[![:space:]]}"}"
43
+ value="${value%\"}"
44
+ value="${value#\"}"
45
+ value="${value%\'}"
46
+ value="${value#\'}"
47
+ printf '%s' "$value"
48
+ }
49
+
50
+ # The repository pair a node prepares itself from: the environment, then the node's own host
51
+ # configuration, where `underpost wireguard --sync` records the pair it moved the node onto.
52
+ # Named nowhere else — left empty, the pull resolves the pairing itself.
53
+ ENGINE_SRC_REPO="${ENGINE_SRC_REPO:-$(host_config ENGINE_SRC_REPO)}"
54
+ ENGINE_SRC_PRIVATE_REPO="${ENGINE_SRC_PRIVATE_REPO:-$(host_config ENGINE_SRC_PRIVATE_REPO)}"
55
+
56
+ # The deploy id a source repository belongs to: `engine-cyberia` and `engine-test-cyberia` are
57
+ # both `dd-cyberia`. Pure shell on purpose — it resolves the manifest that makes the CLI
58
+ # runnable, so it cannot be resolved by running the CLI. Prints nothing for a repository that
59
+ # names no deploy (the monorepo itself), which callers read as "leave the checkout's own".
60
+ #
61
+ # Usage: deploy_id_from_repo [owner/repo]
62
+ deploy_id_from_repo() {
63
+ local name="${1:-$ENGINE_SRC_REPO}"
64
+ name="${name##*/}"
65
+ name="${name#engine-test-}"
66
+ name="${name#engine-}"
67
+ name="${name%-private}"
68
+
69
+ [ -n "$name" ] && [ "$name" != "engine" ] && printf 'dd-%s' "$name"
70
+ }
71
+
72
+ # Installs the node's dependencies from the deploy's own package manifest and links the checkout's
73
+ # CLI globally. Every later bare `underpost` command must execute this checkout, never a package
74
+ # left behind by an older image or host preparation.
75
+ #
76
+ # A deploy id owns its dependency set the same way it owns the rest of its configuration, and
77
+ # `engine-private/conf/<deploy-id>/package.json` is where that set lives. The checkout's own
78
+ # manifest is not it: a product tree declares only what it publishes, so installing against it
79
+ # prunes packages the CLI imports — and the CLI is what pulls and repairs the checkout, so the
80
+ # node loses the ability to fix itself. A deploy with no manifest of its own installs the
81
+ # checkout's, which is the previous behaviour.
82
+ #
83
+ # Usage: install_deploy_dependencies <engine-root> [deploy-id]
84
+ install_deploy_dependencies() {
85
+ local engine_root="${1:-/home/dd/engine}"
86
+ local deploy_id="$2"
87
+ local manifest="engine-private/conf/$deploy_id/package.json"
88
+
89
+ if [ -n "$deploy_id" ] && [ -f "$engine_root/$manifest" ]; then
90
+ deploy_step "Install dependencies ($deploy_id)" \
91
+ sudo -n -- /bin/bash -lc "cd $engine_root && cp -a ./$manifest ./package.json && npm install"
92
+ else
93
+ deploy_step "Install dependencies" \
94
+ sudo -n -- /bin/bash -lc "cd $engine_root && npm install"
95
+ fi
96
+
97
+ deploy_step "Link underpost CLI" \
98
+ sudo -n -- /bin/bash -lc \
99
+ "cd $engine_root && npm link --force && test \"\$(readlink -f \"\$(command -v underpost)\")\" = \"\$(readlink -f ./bin/index.js)\""
100
+ }
101
+
102
+ # Brings a node to the state every deploy assumes: the engine source at HEAD, its dependencies
103
+ # installed, its CLI globally linked, and the host configuration loaded into the underpost root
104
+ # env store. `host load` is the one entry point for that store — see `underpost host`.
105
+ #
106
+ # Dependencies are installed before the pull, not only after: the pull runs through this
107
+ # checkout's own CLI, so a tree whose node_modules no longer match its manifest cannot repair
108
+ # itself — the entrypoint fails to import long before it can replace the source. They are
109
+ # installed again after it, because the pull resets the checkout to its remote and takes
110
+ # `package.json` with it.
111
+ prepare_host() {
112
+ local engine_root="${1:-/home/dd/engine}"
113
+ local src_repo="${2:-$ENGINE_SRC_REPO}"
114
+ local src_private_repo="${3:-$ENGINE_SRC_PRIVATE_REPO}"
115
+ local deploy_id="${4:-$(deploy_id_from_repo "$src_repo")}"
116
+
117
+ install_deploy_dependencies "$engine_root" "$deploy_id"
118
+
119
+ deploy_step "Pull repository" \
120
+ sudo -n -- /bin/bash -lc \
121
+ "cd $engine_root && node bin run pull $src_repo${src_private_repo:+ --repo-engine-private $src_private_repo}"
122
+
123
+ install_deploy_dependencies "$engine_root" "$deploy_id"
124
+
125
+ deploy_step "Load host config" \
126
+ sudo -n -- /bin/bash -lc "cd $engine_root && node bin host load"
127
+ }
128
+
129
+ # Whether a tracked path carries uncommitted changes, as `1` or empty.
130
+ #
131
+ # An asset repository is committed only when it actually changed, so this stays outside
132
+ # `deploy_step`: its stdout is the value the caller branches on, and a step's logging would
133
+ # swallow it. The engine root is a parameter rather than an inherited global so a script that
134
+ # drives more than one checkout cannot read the wrong one.
135
+ #
136
+ # Usage: has_changes <path> [engine-root]
137
+ has_changes() {
138
+ local path="$1"
139
+ local engine_root="${2:-${ENGINE_ROOT:-/home/dd/engine}}"
140
+
141
+ sudo -n -- /bin/bash -lc \
142
+ "cd $engine_root && node bin cmt $path --has-changes" | tr -d '\n'
143
+ }
144
+
145
+ # The in-pod bootstrap, emitted as a `--cmd` payload (comma-separated: `underpost deploy`
146
+ # splits on commas, one shell command per element).
147
+ #
148
+ # A pod starts from an image whose global `underpost` is only as new as the last image build,
149
+ # and the engine shells out to that bare command on every production path
150
+ # (`options.dev ? 'node bin' : 'underpost'`). Replacing the image's engine with this deploy's
151
+ # own source and repointing the global bin at it is what makes the pod run the CLI that
152
+ # deployed it rather than the one its image was published with.
153
+ #
154
+ # Pair it with `--skip-pull-repo-base` on the `underpost start` that follows: this *is* the pull
155
+ # `start --build` performs, so leaving it on clones and installs the same tree twice.
156
+ #
157
+ # In-pod bootstrap, emitted as a `--cmd` payload (comma-separated). Three stages, in order:
158
+ # the deploy's own source replaces the image's engine and the global bin is repointed at it;
159
+ # that CLI then stamps `container-status`, which is why the stamp cannot come first — an image
160
+ # predating the state domain answers `unknown command 'state'`. The caller appends the start.
161
+ #
162
+ # The global npm prefix is handed to the container user before either npm call: the manifest's
163
+ # `install` hook installs global tooling and `npm link` publishes the CLI there, and both write
164
+ # a tree the image left owned by root.
165
+ #
166
+ # Usage: pod_bootstrap_cmd <deploy-id> [env] [owner/repo]
167
+ pod_bootstrap_cmd() {
168
+ local deploy_id="$1"
169
+ local env="${2:-production}"
170
+ local repo="${3:-underpostnet/engine-test-${deploy_id#dd-}}"
171
+ local name="${repo##*/}"
172
+
173
+ printf '%s' "cd /home/dd, \
174
+ underpost clone ${repo}, \
175
+ mkdir -p /home/dd/engine, \
176
+ cp -a /home/dd/${name}/. /home/dd/engine/, \
177
+ rm -rf /home/dd/${name}, \
178
+ cd /home/dd/engine, \
179
+ sudo mkdir -p \$(npm prefix -g)/lib/node_modules \$(npm prefix -g)/bin, \
180
+ sudo chown -R \$(id -u):\$(id -g) \$(npm prefix -g)/lib/node_modules \$(npm prefix -g)/bin, \
181
+ npm install, \
182
+ npm link --force, \
183
+ test \"\$(readlink -f \"\$(command -v underpost)\")\" = \"\$(readlink -f ./bin/index.js)\", \
184
+ underpost state set container-status ${deploy_id}-${env}-build-deployment"
185
+ }
@@ -0,0 +1,62 @@
1
+ # Runtime telemetry streaming. Sourced, never executed directly.
2
+ #
3
+ # The one source of streamed state for every context. Nothing here is conditional on GitHub
4
+ # Actions: annotations are just the rendering the state domain picks when it detects a workflow.
5
+
6
+ STATE_ENV="${STATE_ENV:-production}"
7
+ STATE_NAMESPACE="${STATE_NAMESPACE:-default}"
8
+ STATE_STREAM="${STATE_STREAM:-1}"
9
+ # Seconds between frames. The live table is the default; 0 observes once and exits, which is
10
+ # what a non-interactive caller wants.
11
+ STATE_WATCH="${STATE_WATCH:-2}"
12
+
13
+ # Streams one observation of a deployment's live execution state, health and metrics.
14
+ #
15
+ # Not wrapped in deploy_step: run_quiet prints only pattern-matched lines and discards its debug
16
+ # log on success, so the payload never reached the terminal. The target defaults to the caller's
17
+ # directory name.
18
+ #
19
+ # Usage: stream_state <engine-root> [deploy-id] [instance-id]
20
+ stream_state() {
21
+ local engine_root="${1:-/home/dd/engine}"
22
+ local deploy_id="${2:-$(basename "$(cd "$(dirname "${BASH_SOURCE[1]}")" && pwd)")}"
23
+ local instance_id="${3:-}"
24
+ local args="deploy-id=${deploy_id}"
25
+ local target="$deploy_id"
26
+
27
+ [ "$STATE_STREAM" = "0" ] && return 0
28
+
29
+ if [ -n "$instance_id" ]; then
30
+ args="${args},instance-id=${instance_id}"
31
+ target="${deploy_id}/${instance_id}"
32
+ fi
33
+
34
+ deploy_start "Runtime state ${target}"
35
+
36
+ if [ "$STATE_WATCH" != "0" ]; then
37
+ # In-place redraw, the same shape run_quiet uses for the deploy table: the cursor is
38
+ # parked above the block and each frame overwrites it. Runs until interrupted.
39
+ local refresh=0 frame lines=0
40
+ printf '\033[?25l'
41
+ trap 'printf "\033[?25h\n"; return 0' INT
42
+ while true; do
43
+ refresh=$((refresh + 1))
44
+ frame=$(sudo -n -- /bin/bash -lc \
45
+ "cd ${engine_root} && node bin state status \
46
+ --env ${STATE_ENV} \
47
+ --namespace ${STATE_NAMESPACE} \
48
+ --args ${args},refresh=${refresh}" 2>/dev/null)
49
+ [ "$lines" -gt 0 ] && printf '\033[%dA' "$lines"
50
+ printf '%s\n' "$frame" | while IFS= read -r line; do printf '%s\033[K\n' "$line"; done
51
+ lines=$(printf '%s\n' "$frame" | wc -l)
52
+ sleep "$STATE_WATCH"
53
+ done
54
+ fi
55
+
56
+ # RUN_QUIET_CI survives the SSH hop; unset in an ordinary shell, where this prints JSON.
57
+ sudo -n -- /bin/bash -lc \
58
+ "cd ${engine_root} && RUN_QUIET_CI=${RUN_QUIET_CI:-} node bin state publish \
59
+ --env ${STATE_ENV} \
60
+ --namespace ${STATE_NAMESPACE} \
61
+ --args ${args}"
62
+ }
@@ -0,0 +1,45 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ source "$SCRIPT_DIR/../lib/github-actions-logging.sh"
6
+
7
+ # Runs in the workflow's rockylinux:9 container against the checked-out
8
+ # workspace instead of over SSH, so the repository root is this script's
9
+ # grandparent rather than a fixed remote path.
10
+ REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
11
+
12
+ main() {
13
+ deploy_start "Starting github pages deploy"
14
+
15
+ cd "$REPO_ROOT"
16
+
17
+ deploy_step "Install required packages" \
18
+ dnf install -y sudo tar gzip bzip2 git
19
+
20
+ deploy_step "Install curl" \
21
+ dnf install -y curl --allowerasing
22
+
23
+ deploy_step "Add Node.js repository" \
24
+ bash -c "curl -fsSL https://rpm.nodesource.com/setup_24.x | bash -"
25
+
26
+ deploy_step "Install Node.js" \
27
+ dnf install nodejs -y
28
+
29
+ deploy_step "Install dependencies" \
30
+ npm install
31
+
32
+ deploy_step "Build dd-github-pages configuration" \
33
+ node bin new --default-conf --conf-workflow-id dd-github-pages
34
+
35
+ deploy_step "Create dd-github-pages deployment" \
36
+ node bin new --deploy-id dd-github-pages
37
+
38
+ deploy_step "Load dd-github-pages production environment" \
39
+ node bin app load --env production --args deploy-id=dd-github-pages
40
+
41
+ deploy_step "Build dd-github-pages client" \
42
+ env NODE_ENV=production node bin client dd-github-pages '' underpostnet.github.io /pwa-microservices-template-ghpkg
43
+ }
44
+
45
+ main "$@"
@@ -0,0 +1,32 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+
4
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ source "$SCRIPT_DIR/../lib/github-actions-logging.sh"
6
+ source "$SCRIPT_DIR/../lib/host.sh"
7
+
8
+ ENGINE_ROOT=/home/dd/engine
9
+
10
+ main() {
11
+ deploy_start "Starting remote release deploy"
12
+
13
+ prepare_host "$ENGINE_ROOT"
14
+
15
+ deploy_step "Install underpost CLI" \
16
+ sudo -n -- /bin/bash -lc \
17
+ "cd $ENGINE_ROOT && npm install -g underpost"
18
+
19
+ deploy_step "Resync secrets" \
20
+ sudo -n -- /bin/bash -lc \
21
+ "cd $ENGINE_ROOT && node bin host load"
22
+
23
+ deploy_step "Configure git" \
24
+ sudo -n -- /bin/bash -lc \
25
+ "cd $ENGINE_ROOT && node bin run --dev git-conf"
26
+
27
+ deploy_step "Build and publish docker images" \
28
+ sudo -n -- /bin/bash -lc \
29
+ "cd $ENGINE_ROOT && node bin run docker-image"
30
+ }
31
+
32
+ main "$@"
package/deployment.yaml CHANGED
@@ -20,11 +20,17 @@ spec:
20
20
  spec:
21
21
  containers:
22
22
  - name: dd-cyberia-development-blue
23
- image: underpost/underpost-engine:v3.2.90
23
+ image: underpost/underpost-engine:v3.3.73
24
24
  imagePullPolicy: IfNotPresent
25
25
  envFrom:
26
26
  - secretRef:
27
27
  name: underpost-config
28
+ # The deployment's own environment, with its .env.<env>.oci overlay already
29
+ # applied by 'app apply'. Optional so a deployment predating that Secret still
30
+ # starts; the in-pod 'app load' resolves the same overlay as a second path.
31
+ - secretRef:
32
+ name: dd-cyberia-development-env
33
+ optional: true
28
34
  env:
29
35
  - name: UNDERPOST_INTERNAL_PORT
30
36
  value: "4004"
@@ -33,7 +39,6 @@ spec:
33
39
  - /bin/sh
34
40
  - -c
35
41
  - >
36
- underpost secret underpost --create-from-env &&
37
42
  underpost start --build --run dd-cyberia development
38
43
  readinessProbe:
39
44
  {
@@ -4,36 +4,6 @@
4
4
  # (MongoDB + Valkey + IPFS), then the Cyberia content-authority engine and its
5
5
  # per-instance server/client tiers, fronted by an nginx reverse proxy.
6
6
  #
7
- # Canonical location (custom docker-compose workflow):
8
- # engine-private/conf/dd-cyberia/docker-compose/cyberia/
9
- # ├── docker-compose.yml (this file — the ENTIRE stack, single source)
10
- # ├── compose.env (working env-file, used as-is — not generated)
11
- # ├── nginx.conf (custom per-variant sub-path routing)
12
- # └── mongodb/entrypoint.sh (replica-set bootstrap)
13
- # All bind mounts below are relative to this directory: the CLI runs compose with
14
- # `--project-directory` pinned here (see src/cli/docker-compose.js).
15
- #
16
- # Multi-instance: one engine-cyberia (content + asset authority) feeds three
17
- # cyberia-server + three cyberia-client tiers, one per conf.instances.json
18
- # multiInstance variant (amethyst-strata-expansion "/", FOREST "/FOREST",
19
- # TEST "/TEST"). This custom workflow owns nginx.conf and the services below;
20
- # keep both in sync when its instance topology changes.
21
- #
22
- # Startup is a strict health-gated chain: the stable gateway starts after the
23
- # engine, then each server/client pipeline advances independently:
24
- # mongodb + valkey -> engine runtime -> proxy -> 3x server -> 3x client
25
- #
26
- # Architecture boundaries (see CLAUDE.md "Cyberia architecture boundaries"):
27
- # engine-cyberia — content, validation, persistence, gRPC(:50051)+REST(:4005)
28
- # data services, asset metadata. The authority layer.
29
- # cyberia-server — authoritative real-time simulation / tick processing (Go).
30
- # cyberia-client — rendering, input, prediction, presentation (WASM bundle).
31
- #
32
- # Usage:
33
- # underpost docker-compose --up --deploy-id dd-cyberia --docker-compose-id cyberia
34
- # (or the docker:cyberia:* npm scripts). The engine-cyberia image bakes the
35
- # dd-cyberia build at image-build time, so no private-repo credentials are
36
- # required at container start.
37
7
 
38
8
  name: dd-cyberia
39
9
 
@@ -165,7 +135,7 @@ services:
165
135
  # server starts but rejects connections until seeded). Serves REST/WS on 4005
166
136
  # and the engine gRPC data service on 50051.
167
137
  engine-cyberia-runtime:
168
- image: ${ENGINE_CYBERIA_IMAGE:-underpost/engine-cyberia-dev}:${ENGINE_CYBERIA_TAG:-v3.2.90}
138
+ image: ${ENGINE_CYBERIA_IMAGE:-underpost/engine-cyberia-dev}:${ENGINE_CYBERIA_TAG:-v3.3.73}
169
139
  container_name: dd-cyberia-engine
170
140
  command:
171
141
  - /bin/sh
@@ -220,7 +190,7 @@ services:
220
190
  # gateway on host port 8081, so one port can route every instance path.
221
191
 
222
192
  cyberia-server-runtime:
223
- image: ${CYBERIA_SERVER_IMAGE:-underpost/cyberia-server-dev}:${CYBERIA_SERVER_TAG:-v3.2.90}
193
+ image: ${CYBERIA_SERVER_IMAGE:-underpost/cyberia-server-dev}:${CYBERIA_SERVER_TAG:-v3.3.73}
224
194
  container_name: dd-cyberia-server
225
195
  environment:
226
196
  INSTANCE_CODE: amethyst-strata-expansion
@@ -232,6 +202,14 @@ services:
232
202
  STATIC_DIR: ${CYBERIA_SERVER_STATIC_DIR:-/home/dd/engine/cyberia-server/public}
233
203
  APP_ENV: ${CYBERIA_SERVER_APP_ENV:-development}
234
204
  LOG_LEVEL: ${CYBERIA_SERVER_LOG_LEVEL:-}
205
+ CYBERIA_DISABLE_CONNECTION_LIMITS: ${CYBERIA_DISABLE_CONNECTION_LIMITS:-}
206
+ CYBERIA_MAX_CONNECTIONS: ${CYBERIA_MAX_CONNECTIONS:-}
207
+ CYBERIA_MAX_CONNECTIONS_PER_IP: ${CYBERIA_MAX_CONNECTIONS_PER_IP:-}
208
+ CYBERIA_CONNECT_RATE_PER_IP: ${CYBERIA_CONNECT_RATE_PER_IP:-}
209
+ CYBERIA_CONNECT_BURST_PER_IP: ${CYBERIA_CONNECT_BURST_PER_IP:-}
210
+ CYBERIA_MESSAGE_RATE: ${CYBERIA_MESSAGE_RATE:-}
211
+ CYBERIA_MESSAGE_BURST: ${CYBERIA_MESSAGE_BURST:-}
212
+ CYBERIA_MAX_STRIKES: ${CYBERIA_MAX_STRIKES:-}
235
213
  networks:
236
214
  - dd-cyberia-internal
237
215
  expose:
@@ -248,7 +226,7 @@ services:
248
226
  restart: unless-stopped
249
227
 
250
228
  cyberia-server-forest:
251
- image: ${CYBERIA_SERVER_IMAGE:-underpost/cyberia-server-dev}:${CYBERIA_SERVER_TAG:-v3.2.90}
229
+ image: ${CYBERIA_SERVER_IMAGE:-underpost/cyberia-server-dev}:${CYBERIA_SERVER_TAG:-v3.3.73}
252
230
  container_name: dd-cyberia-server-forest
253
231
  environment:
254
232
  INSTANCE_CODE: FOREST
@@ -260,6 +238,14 @@ services:
260
238
  STATIC_DIR: ${CYBERIA_SERVER_STATIC_DIR:-/home/dd/engine/cyberia-server/public}
261
239
  APP_ENV: ${CYBERIA_SERVER_APP_ENV:-development}
262
240
  LOG_LEVEL: ${CYBERIA_SERVER_LOG_LEVEL:-}
241
+ CYBERIA_DISABLE_CONNECTION_LIMITS: ${CYBERIA_DISABLE_CONNECTION_LIMITS:-}
242
+ CYBERIA_MAX_CONNECTIONS: ${CYBERIA_MAX_CONNECTIONS:-}
243
+ CYBERIA_MAX_CONNECTIONS_PER_IP: ${CYBERIA_MAX_CONNECTIONS_PER_IP:-}
244
+ CYBERIA_CONNECT_RATE_PER_IP: ${CYBERIA_CONNECT_RATE_PER_IP:-}
245
+ CYBERIA_CONNECT_BURST_PER_IP: ${CYBERIA_CONNECT_BURST_PER_IP:-}
246
+ CYBERIA_MESSAGE_RATE: ${CYBERIA_MESSAGE_RATE:-}
247
+ CYBERIA_MESSAGE_BURST: ${CYBERIA_MESSAGE_BURST:-}
248
+ CYBERIA_MAX_STRIKES: ${CYBERIA_MAX_STRIKES:-}
263
249
  networks:
264
250
  - dd-cyberia-internal
265
251
  expose:
@@ -276,7 +262,7 @@ services:
276
262
  restart: unless-stopped
277
263
 
278
264
  cyberia-server-test:
279
- image: ${CYBERIA_SERVER_IMAGE:-underpost/cyberia-server-dev}:${CYBERIA_SERVER_TAG:-v3.2.90}
265
+ image: ${CYBERIA_SERVER_IMAGE:-underpost/cyberia-server-dev}:${CYBERIA_SERVER_TAG:-v3.3.73}
280
266
  container_name: dd-cyberia-server-test
281
267
  environment:
282
268
  INSTANCE_CODE: TEST
@@ -288,6 +274,14 @@ services:
288
274
  STATIC_DIR: ${CYBERIA_SERVER_STATIC_DIR:-/home/dd/engine/cyberia-server/public}
289
275
  APP_ENV: ${CYBERIA_SERVER_APP_ENV:-development}
290
276
  LOG_LEVEL: ${CYBERIA_SERVER_LOG_LEVEL:-}
277
+ CYBERIA_DISABLE_CONNECTION_LIMITS: ${CYBERIA_DISABLE_CONNECTION_LIMITS:-}
278
+ CYBERIA_MAX_CONNECTIONS: ${CYBERIA_MAX_CONNECTIONS:-}
279
+ CYBERIA_MAX_CONNECTIONS_PER_IP: ${CYBERIA_MAX_CONNECTIONS_PER_IP:-}
280
+ CYBERIA_CONNECT_RATE_PER_IP: ${CYBERIA_CONNECT_RATE_PER_IP:-}
281
+ CYBERIA_CONNECT_BURST_PER_IP: ${CYBERIA_CONNECT_BURST_PER_IP:-}
282
+ CYBERIA_MESSAGE_RATE: ${CYBERIA_MESSAGE_RATE:-}
283
+ CYBERIA_MESSAGE_BURST: ${CYBERIA_MESSAGE_BURST:-}
284
+ CYBERIA_MAX_STRIKES: ${CYBERIA_MAX_STRIKES:-}
291
285
  networks:
292
286
  - dd-cyberia-internal
293
287
  expose:
@@ -315,7 +309,7 @@ services:
315
309
  # cyberia-server-test -> cyberia-client-test
316
310
 
317
311
  cyberia-client-runtime:
318
- image: ${CYBERIA_CLIENT_IMAGE:-underpost/cyberia-client-dev}:${CYBERIA_CLIENT_TAG:-v3.2.90}
312
+ image: ${CYBERIA_CLIENT_IMAGE:-underpost/cyberia-client-dev}:${CYBERIA_CLIENT_TAG:-v3.3.73}
319
313
  container_name: dd-cyberia-client
320
314
  environment:
321
315
  CYBERIA_PORT: '8081'
@@ -340,7 +334,7 @@ services:
340
334
  restart: unless-stopped
341
335
 
342
336
  cyberia-client-forest:
343
- image: ${CYBERIA_CLIENT_IMAGE:-underpost/cyberia-client-dev}:${CYBERIA_CLIENT_TAG:-v3.2.90}
337
+ image: ${CYBERIA_CLIENT_IMAGE:-underpost/cyberia-client-dev}:${CYBERIA_CLIENT_TAG:-v3.3.73}
344
338
  container_name: dd-cyberia-client-forest
345
339
  environment:
346
340
  CYBERIA_PORT: '8081'
@@ -365,7 +359,7 @@ services:
365
359
  restart: unless-stopped
366
360
 
367
361
  cyberia-client-test:
368
- image: ${CYBERIA_CLIENT_IMAGE:-underpost/cyberia-client-dev}:${CYBERIA_CLIENT_TAG:-v3.2.90}
362
+ image: ${CYBERIA_CLIENT_IMAGE:-underpost/cyberia-client-dev}:${CYBERIA_CLIENT_TAG:-v3.3.73}
369
363
  container_name: dd-cyberia-client-test
370
364
  environment:
371
365
  CYBERIA_PORT: '8081'
@@ -54,23 +54,23 @@ When `--output-path` is provided, the server serves the directory containing the
54
54
 
55
55
  See [`static-config-example.json`](./static-config-example.json) for a complete working example.
56
56
 
57
- | Field | Type | Description |
58
- |-------|------|-------------|
59
- | `page` | `string` | Path to the SSR component to render |
60
- | `outputPath` | `string` | Output HTML file path |
61
- | `buildPath` | `string` | Base path for static documents or assets (default: `"/"`) |
62
- | `env` | `string` | `"production"` or `"development"` |
63
- | `minify` | `boolean` | Minify HTML output |
64
- | `lang` | `string` | HTML `lang` attribute |
65
- | `dir` | `string` | HTML `dir` attribute (`ltr`/`rtl`) |
66
- | `metadata` | `object` | SEO metadata (title, description, keywords, author, themeColor, canonicalURL, thumbnail, locale, siteName) |
67
- | `scripts` | `object` | `{ head: [...], body: [...] }` — inline or external scripts |
68
- | `styles` | `array` | Inline (`content`) or external (`href`) stylesheets |
69
- | `icons` | `object` | `favicon`, `appleTouchIcon`, `manifest` paths |
70
- | `headComponents` | `array` | SSR component paths injected into `<head>` |
71
- | `bodyComponents` | `array` | SSR component paths injected into `<body>` |
72
- | `microdata` | `array` | JSON-LD structured data objects |
73
- | `customPayload` | `object` | Arbitrary data injected into the render payload |
57
+ | Field | Type | Description |
58
+ | ---------------- | --------- | ---------------------------------------------------------------------------------------------------------- |
59
+ | `page` | `string` | Path to the SSR component to render |
60
+ | `outputPath` | `string` | Output HTML file path |
61
+ | `buildPath` | `string` | Base path for static documents or assets (default: `"/"`) |
62
+ | `env` | `string` | `"production"` or `"development"` |
63
+ | `minify` | `boolean` | Minify HTML output |
64
+ | `lang` | `string` | HTML `lang` attribute |
65
+ | `dir` | `string` | HTML `dir` attribute (`ltr`/`rtl`) |
66
+ | `metadata` | `object` | SEO metadata (title, description, keywords, author, themeColor, canonicalURL, thumbnail, locale, siteName) |
67
+ | `scripts` | `object` | `{ head: [...], body: [...] }` — inline or external scripts |
68
+ | `styles` | `array` | Inline (`content`) or external (`href`) stylesheets |
69
+ | `icons` | `object` | `favicon`, `appleTouchIcon`, `manifest` paths |
70
+ | `headComponents` | `array` | SSR component paths injected into `<head>` |
71
+ | `bodyComponents` | `array` | SSR component paths injected into `<body>` |
72
+ | `microdata` | `array` | JSON-LD structured data objects |
73
+ | `customPayload` | `object` | Arbitrary data injected into the render payload |
74
74
 
75
75
  ## CLI Flags
76
76
 
@@ -138,10 +138,10 @@ underpost static --page <path> # SSR component path
138
138
 
139
139
  The page content is defined in an SSR component file. See [`ssr-components/CustomPage.js`](./ssr-components/CustomPage.js) for an example.
140
140
 
141
- A component exports an `SrrComponent` function that returns an HTML template literal:
141
+ A component exports an `SSRComponent` function that returns an HTML template literal:
142
142
 
143
143
  ```js
144
- SrrComponent = () => html`
144
+ SSRComponent = () => html`
145
145
  <div>
146
146
  <h1>Hello World</h1>
147
147
  <p>Your page content here.</p>
@@ -5,10 +5,10 @@
5
5
 
6
6
  /**
7
7
  * SSR Component Example for rendering a custom landing page
8
- * @function SrrComponent
8
+ * @function SSRComponent
9
9
  * @returns {string} HTML string for the page body
10
10
  */
11
- SrrComponent = () => html`
11
+ SSRComponent = () => html`
12
12
  <!-- Main Container -->
13
13
  <div class="custom-page">
14
14
  <!-- Hero Section -->
@@ -3,7 +3,7 @@
3
3
  // Supports deployment to Hyperledger Besu (IBFT2/QBFT) private networks
4
4
  // running on kubeadm-managed Kubernetes clusters (manifests/besu/).
5
5
  //
6
- // Compatible with: Hardhat 3.x + Ethers v6 + hardhat-toolbox-mocha-ethers
6
+ // Compatible with: Hardhat 3.x + viem + hardhat-toolbox-viem
7
7
 
8
8
  import { defineConfig } from 'hardhat/config';
9
9
  import hardhatToolboxViem from '@nomicfoundation/hardhat-toolbox-viem';
@@ -126,11 +126,6 @@ const config = defineConfig({
126
126
  outputFile: process.env.GAS_REPORT_FILE || undefined,
127
127
  noColors: !!process.env.GAS_REPORT_FILE,
128
128
  },
129
-
130
- // ── Mocha (test runner) ─────────────────────────────────────────────────────
131
- mocha: {
132
- timeout: 60000,
133
- },
134
129
  });
135
130
 
136
131
  export default config;