@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
@@ -16,7 +16,7 @@
16
16
 
17
17
  import crypto from 'crypto';
18
18
  import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
19
- import { loggerFactory } from '../../server/logger.js';
19
+ import { loggerFactory } from '../../server/ops/logger.js';
20
20
  import {
21
21
  CYBERIA_INSTANCE_CONF_DEFAULTS as FALLBACK_CONFIG_DEFAULTS,
22
22
  DEFAULT_DEAD_ITEM_ID,
@@ -29,6 +29,7 @@ import {
29
29
  DefaultCyberiaItems,
30
30
  } from '../../client/components/cyberia/SharedDefaultsCyberia.js';
31
31
  import { generateFallbackWorld } from '../../api/cyberia-instance/cyberia-fallback-world.js';
32
+ import { getFallbackDefaultItems } from '../../api/cyberia-instance/cyberia-fallback-default-items.js';
32
33
 
33
34
  const logger = loggerFactory(import.meta);
34
35
 
@@ -421,6 +422,7 @@ function toInstanceConfig(gc) {
421
422
  botAggroRange: gc.botAggroRange ?? fb.botAggroRange,
422
423
  defaultPlayerWidth: gc.defaultPlayerWidth ?? fb.defaultPlayerWidth,
423
424
  defaultPlayerHeight: gc.defaultPlayerHeight ?? fb.defaultPlayerHeight,
425
+ playerBaseSpeed: gc.playerBaseSpeed ?? fb.playerBaseSpeed,
424
426
  playerBaseLifeRegenMin: gc.playerBaseLifeRegenMin ?? fb.playerBaseLifeRegenMin,
425
427
  playerBaseLifeRegenMax: gc.playerBaseLifeRegenMax ?? fb.playerBaseLifeRegenMax,
426
428
  sumStatsLimit: gc.sumStatsLimit ?? fb.sumStatsLimit,
@@ -553,7 +555,7 @@ async function fetchFullInstance(models, requestedInstanceCode) {
553
555
  // ── Fallback: instance not found → return a multi-map procedural world ──
554
556
  if (!inst) {
555
557
  logger.info(`Instance "${instanceCode}" not found — returning fallback world.`);
556
- const world = generateFallbackWorld();
558
+ const world = generateFallbackWorld({ itemIds: getFallbackDefaultItems() });
557
559
  const fallbackConf = buildFallbackConfig();
558
560
 
559
561
  // Collect all objectLayerItemIds from the generated maps so the
@@ -599,6 +601,23 @@ async function fetchFullInstance(models, requestedInstanceCode) {
599
601
 
600
602
  const fallbackConfig = buildFallbackInstanceConfig(fallbackConf, world.instance.itemIds);
601
603
 
604
+ // Opaque version over everything mutable in this payload, mirroring the
605
+ // persisted path below. A constant here would make hot reload a silent
606
+ // no-op: WorldBuilder.ReloadWorld skips the rebuild — and therefore
607
+ // ApplyInstanceConfig — whenever the version is unchanged. The world
608
+ // geometry itself is deterministic (code defaults + seed), so the inputs
609
+ // that can actually differ are the staged default items and the
610
+ // ObjectLayer docs, which are the only things read from the DB here.
611
+ const fallbackVersionParts = ['fallback'];
612
+ for (const entry of world.instance.itemIds || []) {
613
+ fallbackVersionParts.push(`${entry.id}:${entry.defaultPlayerInventory ? 1 : 0}`);
614
+ }
615
+ for (const doc of fallbackOlDocs) fallbackVersionParts.push(String(doc.sha256 || doc._id));
616
+ const fallbackVersion = `fallback-${crypto
617
+ .createHash('sha256')
618
+ .update(fallbackVersionParts.join('|'))
619
+ .digest('hex')}`;
620
+
602
621
  return {
603
622
  instance: toInstanceMsg({ ...world.instance, _id: '', seed: instanceCode }),
604
623
  maps: world.maps.map((m) => ({
@@ -613,7 +632,7 @@ async function fetchFullInstance(models, requestedInstanceCode) {
613
632
  })),
614
633
  objectLayers: fallbackOlDocs.map(toObjectLayerMsg),
615
634
  config: fallbackConfig,
616
- version: 'fallback',
635
+ version: fallbackVersion,
617
636
  // Mission content for the procedural fallback comes straight from
618
637
  // the canonical defaults — no DB, fully self-contained.
619
638
  actions: DefaultCyberiaActions.map(toActionMsg),
@@ -11,7 +11,7 @@
11
11
  * @namespace IpfsClient
12
12
  */
13
13
  import stringify from 'fast-json-stable-stringify';
14
- import { loggerFactory } from '../../server/logger.js';
14
+ import { loggerFactory } from '../../server/ops/logger.js';
15
15
  import Underpost from '../../index.js';
16
16
  const logger = loggerFactory(import.meta);
17
17
  const DEFAULT_IPFS_HTTP_TIMEOUT_MS = Number(process.env.IPFS_HTTP_TIMEOUT_MS || 10000);
@@ -48,21 +48,21 @@ const fetchWithTimeout = async (url, options = {}, { kind = 'kubo', label = url
48
48
  */
49
49
  const getIpfsApiUrl = () =>
50
50
  process.env.IPFS_API_URL ||
51
- `http://${process.env.NODE_ENV === 'development' && !Underpost.env.isInsideContainer() ? 'localhost' : 'ipfs-cluster'}:5001`;
51
+ `http://${process.env.NODE_ENV === 'development' && !Underpost.state.isInsideContainer() ? 'localhost' : 'ipfs-cluster'}:5001`;
52
52
  /**
53
53
  * Base URL of the IPFS Cluster REST API (port 9094).
54
54
  * @returns {string}
55
55
  */
56
56
  const getClusterApiUrl = () =>
57
57
  process.env.IPFS_CLUSTER_API_URL ||
58
- `http://${process.env.NODE_ENV === 'development' && !Underpost.env.isInsideContainer() ? 'localhost' : 'ipfs-cluster'}:9094`;
58
+ `http://${process.env.NODE_ENV === 'development' && !Underpost.state.isInsideContainer() ? 'localhost' : 'ipfs-cluster'}:9094`;
59
59
  /**
60
60
  * Base URL of the IPFS HTTP Gateway (port 8080).
61
61
  * @returns {string}
62
62
  */
63
63
  const getGatewayUrl = () =>
64
64
  process.env.IPFS_GATEWAY_URL ||
65
- `http://${process.env.NODE_ENV === 'development' && !Underpost.env.isInsideContainer() ? 'localhost' : 'ipfs-cluster'}:8080`;
65
+ `http://${process.env.NODE_ENV === 'development' && !Underpost.state.isInsideContainer() ? 'localhost' : 'ipfs-cluster'}:8080`;
66
66
  // ─────────────────────────────────────────────────────────
67
67
  // Core: add content
68
68
  // ─────────────────────────────────────────────────────────
@@ -21,7 +21,7 @@
21
21
  import crypto from 'crypto';
22
22
  import fs from 'fs-extra';
23
23
  import sharp from 'sharp';
24
- import { loggerFactory } from '../../server/logger.js';
24
+ import { loggerFactory } from '../../server/ops/logger.js';
25
25
  import {
26
26
  ENTITY_TYPE_TO_ITEM_TYPES,
27
27
  getDefaultCyberiaItemById,
@@ -10,16 +10,14 @@ import path from 'path';
10
10
  import { PNG } from 'pngjs';
11
11
  import sharp from 'sharp';
12
12
  import { Jimp, intToRGBA, rgbaToInt } from 'jimp';
13
- import crypto from 'crypto';
14
- import stringify from 'fast-json-stable-stringify';
15
-
13
+ import { computeObjectLayerSha256 } from '../../api/object-layer/object-layer.model.js';
16
14
  import { range } from '../../client/components/core/CommonJs.js';
17
15
  import {
18
16
  generateRandomStats,
19
17
  getKeyframeDirectionsByCode,
20
18
  OBJECT_LAYER_DIRECTION_NAME_TO_CODE,
21
19
  } from '../../client/components/cyberia/SharedDefaultsCyberia.js';
22
- import { loggerFactory } from '../../server/logger.js';
20
+ import { loggerFactory } from '../../server/ops/logger.js';
23
21
 
24
22
  const logger = loggerFactory(import.meta);
25
23
 
@@ -450,7 +448,7 @@ export class ObjectLayerEngine {
450
448
  * @memberof CyberiaObjectLayer
451
449
  */
452
450
  static computeSha256(data) {
453
- return crypto.createHash('sha256').update(stringify(data)).digest('hex');
451
+ return computeObjectLayerSha256(data);
454
452
  }
455
453
 
456
454
  /**
@@ -642,23 +640,15 @@ export class ObjectLayerEngine {
642
640
  }
643
641
 
644
642
  // 4. Atomic create/upsert - ObjectLayer is fully populated with all CIDs
645
- let objectLayer;
646
- const existingByItemId = await ObjectLayer.findOne({ 'data.item.id': objectLayerData.data.item.id });
647
- if (existingByItemId) {
648
- const oldRenderFramesId = existingByItemId.objectLayerRenderFramesId;
649
- logger.info(
650
- `ObjectLayer for item "${objectLayerData.data.item.id}" exists (${existingByItemId._id}), replacing atomically...`,
651
- );
652
- objectLayer = await ObjectLayer.findByIdAndUpdate(existingByItemId._id, objectLayerData, {
653
- returnDocument: 'after',
654
- }).populate('objectLayerRenderFramesId');
655
- if (oldRenderFramesId && !oldRenderFramesId.equals(objectLayerRenderFramesDoc._id)) {
656
- await ObjectLayerRenderFrames.findByIdAndDelete(oldRenderFramesId);
657
- }
658
- } else {
659
- objectLayer = await (await ObjectLayer.create(objectLayerData)).populate('objectLayerRenderFramesId');
660
- logger.info(`ObjectLayer created successfully with id: ${objectLayer._id}`);
643
+ const existingByItemId = await ObjectLayer.findByItemId(objectLayerData.data.item.id);
644
+ const oldRenderFramesId = existingByItemId?.objectLayerRenderFramesId;
645
+
646
+ const objectLayer = await (await ObjectLayer.upsertByItemId(objectLayerData)).populate('objectLayerRenderFramesId');
647
+
648
+ if (oldRenderFramesId && !oldRenderFramesId.equals(objectLayerRenderFramesDoc._id)) {
649
+ await ObjectLayerRenderFrames.findByIdAndDelete(oldRenderFramesId);
661
650
  }
651
+ logger.info(`ObjectLayer for item "${objectLayerData.data.item.id}" persisted with id: ${objectLayer._id}`);
662
652
 
663
653
  return { objectLayer, objectLayerRenderFramesDoc };
664
654
  }
@@ -848,7 +838,7 @@ export class ObjectLayerEngine {
848
838
  * @memberof CyberiaObjectLayer
849
839
  */
850
840
  static async resolveCanonicalCid({ itemId, ObjectLayer, ipfsClient = null, options }) {
851
- const objectLayer = await ObjectLayer.findOne({ 'data.item.id': itemId });
841
+ const objectLayer = await ObjectLayer.findByItemId(itemId);
852
842
  if (!objectLayer) {
853
843
  throw new Error(`ObjectLayer "${itemId}" not found in database`);
854
844
  }
@@ -19,7 +19,7 @@
19
19
  import crypto from 'crypto';
20
20
 
21
21
  import { createRng, seedToInt, createNoise2D, generateShape, listShapes } from './shape-generator.js';
22
- import { loggerFactory } from '../../server/logger.js';
22
+ import { loggerFactory } from '../../server/ops/logger.js';
23
23
 
24
24
  import { registerFloorSemantics } from './semantic-layer-generator-floor.js';
25
25
  import { registerSkinSemantics } from './semantic-layer-generator-skin.js';
@@ -18,13 +18,24 @@ const TEMPLATE_RESTORE_PATHS = [
18
18
  `./.github/workflows/gitlab.ci.yml`,
19
19
  `./.github/workflows/publish.ci.yml`,
20
20
  `./.github/workflows/release.cd.yml`,
21
- `./src/client/services/user/guest.service.js`,
21
+ `./deploy/lib`,
22
+ './deploy/release',
23
+ './deploy/pwa-microservices-template',
24
+ './src/client/services/user/guest.service.js',
22
25
  './src/api/user/guest.service.js',
23
26
  './src/ws/IoInterface.js',
24
27
  './src/ws/IoServer.js',
25
28
  './manifests/deployment/dd-default-development',
26
29
  ];
27
30
 
31
+ /**
32
+ * Template checkout entries a rebuild keeps. Everything else is reconstructed from
33
+ * the engine tree, so a file the engine no longer produces cannot survive a build.
34
+ * @constant {string[]}
35
+ * @memberof UnderpostCatalog
36
+ */
37
+ const TEMPLATE_PRESERVED_ENTRIES = ['.git', 'node_modules'];
38
+
28
39
  /**
29
40
  * npm keywords for the standalone Underpost platform / template package.
30
41
  * @constant {string[]}
@@ -57,4 +68,4 @@ const TEMPLATE_KEYWORDS = [
57
68
  const TEMPLATE_DESCRIPTION =
58
69
  'Underpost Platform — end-to-end CI/CD and application-delivery toolchain CLI. Covers bare metal, Kubernetes, K3s, kubeadm, LXD, container/image orchestration, secrets, databases, cron jobs, monitoring, SSH, runners, PWA + Workbox delivery, and release orchestration. Extensible via downstream CLIs.';
59
70
 
60
- export { TEMPLATE_RESTORE_PATHS, TEMPLATE_KEYWORDS, TEMPLATE_DESCRIPTION };
71
+ export { TEMPLATE_RESTORE_PATHS, TEMPLATE_PRESERVED_ENTRIES, TEMPLATE_KEYWORDS, TEMPLATE_DESCRIPTION };
package/src/proxy.js CHANGED
@@ -1,12 +1,9 @@
1
1
  'use strict';
2
2
 
3
- // https://nodejs.org/api
4
- // https://expressjs.com/en/4x/api.html
5
-
6
- import { loggerFactory } from './server/logger.js';
7
- import { buildProxy } from './server/proxy.js';
8
- import { ProcessController } from './server/process.js';
9
- import { Config } from './server/conf.js';
3
+ import { loggerFactory } from './server/ops/logger.js';
4
+ import { buildProxy } from './server/network/proxy.js';
5
+ import { ProcessController } from './server/runtime/process.js';
6
+ import { Config } from './server/runtime/conf.js';
10
7
 
11
8
  await Config.build(process.argv[2], process.argv[3], process.argv[4]);
12
9
 
@@ -14,7 +14,6 @@ RUN make -f Web.mk clean all BUILD_MODE=${BUILD_MODE} OUTPUT_DIR=bin/
14
14
 
15
15
  # --- Runtime Image ---
16
16
  FROM rockylinux/rockylinux:9 AS runtime
17
- ARG UNDERPOST_VERSION=3.2.90
18
17
  ARG NODE_VERSION=24.15.0
19
18
 
20
19
  RUN set -eux; \
@@ -28,9 +27,15 @@ RUN set -eux; \
28
27
  curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
29
28
  | tar -xJ -C /usr/local --strip-components=1; \
30
29
  node --version; npm --version; \
31
- npm install -g underpost@${UNDERPOST_VERSION}; \
32
- dnf clean all; rm -rf /var/cache/dnf; \
33
- npm cache clean --force
30
+ dnf clean all; rm -rf /var/cache/dnf
31
+
32
+
33
+ COPY underpost-cli.tgz /tmp/underpost-cli.tgz
34
+ RUN set -eux; \
35
+ npm install -g /tmp/underpost-cli.tgz --omit=dev; \
36
+ rm -f /tmp/underpost-cli.tgz; \
37
+ npm cache clean --force; \
38
+ underpost --version
34
39
 
35
40
  # Path + server layout is the contract with conf.instances.json mmo-client cmd,
36
41
  # which execs `python3 /home/dd/engine/cyberia-client/docker-driver.py <port>
@@ -43,7 +43,6 @@ RUN make -f Web.mk all BUILD_MODE=${BUILD_MODE} OUTPUT_DIR=bin/
43
43
  # --- Runtime Image ---
44
44
  FROM rockylinux/rockylinux:9 AS runtime
45
45
 
46
- ARG UNDERPOST_VERSION=3.2.90
47
46
  ARG NODE_VERSION=24.15.0
48
47
  RUN set -eux; \
49
48
  dnf -y update; \
@@ -60,9 +59,16 @@ RUN set -eux; \
60
59
  curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
61
60
  | tar -xJ -C /usr/local --strip-components=1; \
62
61
  node --version; npm --version; \
63
- npm install -g underpost@${UNDERPOST_VERSION}; \
64
62
  dnf clean all
65
63
 
64
+
65
+ COPY underpost-cli.tgz /tmp/underpost-cli.tgz
66
+ RUN set -eux; \
67
+ npm install -g /tmp/underpost-cli.tgz --omit=dev; \
68
+ rm -f /tmp/underpost-cli.tgz; \
69
+ npm cache clean --force; \
70
+ underpost --version
71
+
66
72
  WORKDIR /home/dd/engine/cyberia-client
67
73
 
68
74
  COPY --from=builder /cyberia-client/docker-driver.py ./docker-driver.py
@@ -11,7 +11,6 @@ RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o server ./cmd/cyberia-se
11
11
 
12
12
  # --- Runtime Image ---
13
13
  FROM rockylinux/rockylinux:9 AS runtime
14
- ARG UNDERPOST_VERSION=3.2.90
15
14
  ARG NODE_VERSION=24.15.0
16
15
 
17
16
  RUN set -eux; \
@@ -25,9 +24,15 @@ RUN set -eux; \
25
24
  curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
26
25
  | tar -xJ -C /usr/local --strip-components=1; \
27
26
  node --version; npm --version; \
28
- npm install -g underpost@${UNDERPOST_VERSION}; \
29
- dnf clean all; rm -rf /var/cache/dnf; \
30
- npm cache clean --force
27
+ dnf clean all; rm -rf /var/cache/dnf
28
+
29
+
30
+ COPY underpost-cli.tgz /tmp/underpost-cli.tgz
31
+ RUN set -eux; \
32
+ npm install -g /tmp/underpost-cli.tgz --omit=dev; \
33
+ rm -f /tmp/underpost-cli.tgz; \
34
+ npm cache clean --force; \
35
+ underpost --version
31
36
 
32
37
  # Path is the contract with conf.instances.json mmo-server cmd, which execs
33
38
  # /home/dd/engine/cyberia-server/server in both development and production.
@@ -25,7 +25,6 @@ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
25
25
  # --- Runtime Image ---
26
26
  FROM rockylinux/rockylinux:9 AS runtime
27
27
 
28
- ARG UNDERPOST_VERSION=3.2.90
29
28
  ARG NODE_VERSION=24.15.0
30
29
  RUN set -eux; \
31
30
  dnf -y update; \
@@ -42,9 +41,16 @@ RUN set -eux; \
42
41
  curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
43
42
  | tar -xJ -C /usr/local --strip-components=1; \
44
43
  node --version; npm --version; \
45
- npm install -g underpost@${UNDERPOST_VERSION}; \
46
44
  dnf clean all
47
45
 
46
+
47
+ COPY underpost-cli.tgz /tmp/underpost-cli.tgz
48
+ RUN set -eux; \
49
+ npm install -g /tmp/underpost-cli.tgz --omit=dev; \
50
+ rm -f /tmp/underpost-cli.tgz; \
51
+ npm cache clean --force; \
52
+ underpost --version
53
+
48
54
  WORKDIR /home/dd/engine/cyberia-server
49
55
 
50
56
  COPY --from=builder /build/server ./server
@@ -6,7 +6,7 @@
6
6
  # Stage 1 — builder: clone the private deploy, build it, then scrub secrets.
7
7
  # ---------------------------------------------------------------------------
8
8
  FROM rockylinux/rockylinux:9 AS builder
9
- ARG UNDERPOST_VERSION=3.2.90
9
+ ARG UNDERPOST_VERSION=3.3.73
10
10
  # Pin Node to an exact patch: dnf's nodejs:24 module lags (24.14.1) while
11
11
  # underpost's dependencies require >=24.15.0, so install the official binary.
12
12
  ARG NODE_VERSION=24.15.0
@@ -14,7 +14,7 @@ ENV NODE_ENV=production
14
14
 
15
15
  RUN set -eux; \
16
16
  # `sudo` is required because underpost's build steps shell out to
17
- # `sudo cp`/`sudo rm` (src/server/start.js); the build runs as root so sudo
17
+ # `sudo cp`/`sudo rm` (src/server/runtime/start.js); the build runs as root so sudo
18
18
  # is just a passthrough, but the binary must exist.
19
19
  dnf install -y git openssl tar xz sudo; \
20
20
  arch="$(uname -m)"; \
@@ -26,10 +26,22 @@ RUN set -eux; \
26
26
  curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
27
27
  | tar -xJ -C /usr/local --strip-components=1; \
28
28
  node --version; npm --version; \
29
- npm install -g underpost@${UNDERPOST_VERSION}; \
30
29
  dnf clean all; rm -rf /var/cache/dnf; \
31
30
  npm cache clean --force
32
31
 
32
+
33
+ # The builder's own `underpost clone` calls below run on this same CLI, and the runtime stage
34
+ # inherits it through `COPY --from=builder /usr/local/`.
35
+ COPY underpost-cli.tgz /tmp/underpost-cli.tgz
36
+ RUN set -eux; \
37
+ npm install -g /tmp/underpost-cli.tgz --omit=dev; \
38
+ rm -f /tmp/underpost-cli.tgz; \
39
+ npm cache clean --force; \
40
+ underpost --version; \
41
+ # The staged package must be the pinned release: a drift here would ship a CLI the
42
+ # deployment manifests were not built against.
43
+ underpost --version | grep -Fq "${UNDERPOST_VERSION}"
44
+
33
45
  WORKDIR /home/dd
34
46
 
35
47
  # Comma-separated instance codes to provision (backup dir + optional saga).
@@ -38,7 +50,7 @@ WORKDIR /home/dd
38
50
  # `--build-arg INSTANCE_CODES=...`. Declared as an ARG (not a marker-wrapped
39
51
  # shell string) so the value is clean — a `/** … */` literal in the shell would
40
52
  # glob-expand in the `for` loop below.
41
- ARG INSTANCE_CODES="amethyst-strata-expansion,FOREST"
53
+ ARG INSTANCE_CODES="amethyst-strata-expansion,FOREST,TEST"
42
54
 
43
55
  RUN --mount=type=secret,id=github_username \
44
56
  # --mount=type=secret,id=github_token \
@@ -83,7 +95,7 @@ RUN --mount=type=secret,id=github_username \
83
95
  cd /home/dd/engine; \
84
96
  # --- install deps + env, then replay build-safe itc provisioning ----------
85
97
  npm install; \
86
- node bin env dd-cyberia production; \
98
+ node bin app load --env production --args deploy-id=dd-cyberia; \
87
99
  ( cd /home/dd/engine/hardhat && npm install --include=dev ); \
88
100
  # --- build the client bundle (assets are now in place) --------------------
89
101
  cd /home/dd/engine; \
@@ -136,11 +148,15 @@ COPY --from=builder /usr/local/ /usr/local/
136
148
  RUN dnf install -y libstdc++ git sudo && dnf clean all && rm -rf /var/cache/dnf && \
137
149
  useradd --create-home --home-dir /home/dd --shell /usr/sbin/nologin dd && \
138
150
  # The runtime runs as `dd`, but `underpost start --build` shells out to `sudo cp`/`sudo rm`
139
- # (src/server/start.js). Grant passwordless sudo so those succeed without a TTY/password.
151
+ # (src/server/runtime/start.js). Grant passwordless sudo so those succeed without a TTY/password.
140
152
  printf 'dd ALL=(ALL) NOPASSWD:ALL\n' > /etc/sudoers.d/dd && chmod 0440 /etc/sudoers.d/dd && \
141
- # underpost persists its global env at $(npm root -g)/underpost/.env; the
142
- # non-root runtime user must be able to write it (fixes EACCES on start).
143
- chown -R dd:dd /usr/local/lib/node_modules/underpost
153
+ # underpost persists its global env and container state under
154
+ # `$(npm root -g)/underpost` (getUnderpostRootPath). That path is a STORE directory, not
155
+ # the CLI package tree: the staged package installs under its own package name, and
156
+ # `underpost start --build` re-links the bin at the pulled checkout without moving the
157
+ # store (src/server/runtime/start.js#linkRuntimeCli). Create it here — the non-root
158
+ # runtime user cannot mkdir inside /usr/local itself (EACCES on the first state write).
159
+ mkdir -p "$(npm root -g)/underpost" && chown -R dd:dd "$(npm root -g)/underpost"
144
160
 
145
161
  # Copy ONLY the scrubbed runtime tree — no .git, no token, no caches.
146
162
  COPY --from=builder --chown=dd:dd /home/dd/engine /home/dd/engine
@@ -6,7 +6,7 @@
6
6
  # Stage 1 — builder: clone the private deploy, build it, then scrub secrets.
7
7
  # ---------------------------------------------------------------------------
8
8
  FROM rockylinux/rockylinux:9 AS builder
9
- ARG UNDERPOST_VERSION=3.2.90
9
+ ARG UNDERPOST_VERSION=3.3.73
10
10
  # Pin Node to an exact patch: dnf's nodejs:24 module lags (24.14.1) while
11
11
  # underpost's dependencies require >=24.15.0, so install the official binary.
12
12
  ARG NODE_VERSION=24.15.0
@@ -14,7 +14,7 @@ ENV NODE_ENV=development
14
14
 
15
15
  RUN set -eux; \
16
16
  # `sudo` is required because underpost's build steps shell out to
17
- # `sudo cp`/`sudo rm` (src/server/start.js); the build runs as root so sudo
17
+ # `sudo cp`/`sudo rm` (src/server/runtime/start.js); the build runs as root so sudo
18
18
  # is just a passthrough, but the binary must exist.
19
19
  dnf install -y git openssl tar xz sudo; \
20
20
  arch="$(uname -m)"; \
@@ -26,10 +26,22 @@ RUN set -eux; \
26
26
  curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
27
27
  | tar -xJ -C /usr/local --strip-components=1; \
28
28
  node --version; npm --version; \
29
- npm install -g underpost@${UNDERPOST_VERSION}; \
30
29
  dnf clean all; rm -rf /var/cache/dnf; \
31
30
  npm cache clean --force
32
31
 
32
+
33
+ # The builder's own `underpost clone` calls below run on this same CLI, and the runtime stage
34
+ # inherits it through `COPY --from=builder /usr/local/`.
35
+ COPY underpost-cli.tgz /tmp/underpost-cli.tgz
36
+ RUN set -eux; \
37
+ npm install -g /tmp/underpost-cli.tgz --omit=dev; \
38
+ rm -f /tmp/underpost-cli.tgz; \
39
+ npm cache clean --force; \
40
+ underpost --version; \
41
+ # The staged package must be the pinned release: a drift here would ship a CLI the
42
+ # deployment manifests were not built against.
43
+ underpost --version | grep -Fq "${UNDERPOST_VERSION}"
44
+
33
45
  WORKDIR /home/dd
34
46
 
35
47
  # Comma-separated instance codes to provision (backup dir + optional saga).
@@ -38,7 +50,7 @@ WORKDIR /home/dd
38
50
  # `--build-arg INSTANCE_CODES=...`. Declared as an ARG (not a marker-wrapped
39
51
  # shell string) so the value is clean — a `/** … */` literal in the shell would
40
52
  # glob-expand in the `for` loop below.
41
- ARG INSTANCE_CODES="amethyst-strata-expansion,FOREST"
53
+ ARG INSTANCE_CODES="amethyst-strata-expansion,FOREST,TEST"
42
54
 
43
55
  RUN --mount=type=secret,id=github_username \
44
56
  # --mount=type=secret,id=github_token \
@@ -83,7 +95,7 @@ RUN --mount=type=secret,id=github_username \
83
95
  cd /home/dd/engine; \
84
96
  # --- install deps + env, then replay build-safe itc provisioning ----------
85
97
  npm install; \
86
- node bin env dd-cyberia development; \
98
+ node bin app load --env development --args deploy-id=dd-cyberia; \
87
99
  ( cd /home/dd/engine/hardhat && npm install --include=dev ); \
88
100
  # --- build the client bundle (assets are now in place) --------------------
89
101
  cd /home/dd/engine; \
@@ -136,11 +148,15 @@ COPY --from=builder /usr/local/ /usr/local/
136
148
  RUN dnf install -y libstdc++ git sudo && dnf clean all && rm -rf /var/cache/dnf && \
137
149
  useradd --create-home --home-dir /home/dd --shell /usr/sbin/nologin dd && \
138
150
  # The runtime runs as `dd`, but `underpost start --build` shells out to `sudo cp`/`sudo rm`
139
- # (src/server/start.js). Grant passwordless sudo so those succeed without a TTY/password.
151
+ # (src/server/runtime/start.js). Grant passwordless sudo so those succeed without a TTY/password.
140
152
  printf 'dd ALL=(ALL) NOPASSWD:ALL\n' > /etc/sudoers.d/dd && chmod 0440 /etc/sudoers.d/dd && \
141
- # underpost persists its global env at $(npm root -g)/underpost/.env; the
142
- # non-root runtime user must be able to write it (fixes EACCES on start).
143
- chown -R dd:dd /usr/local/lib/node_modules/underpost
153
+ # underpost persists its global env and container state under
154
+ # `$(npm root -g)/underpost` (getUnderpostRootPath). That path is a STORE directory, not
155
+ # the CLI package tree: the staged package installs under its own package name, and
156
+ # `underpost start --build` re-links the bin at the pulled checkout without moving the
157
+ # store (src/server/runtime/start.js#linkRuntimeCli). Create it here — the non-root
158
+ # runtime user cannot mkdir inside /usr/local itself (EACCES on the first state write).
159
+ mkdir -p "$(npm root -g)/underpost" && chown -R dd:dd "$(npm root -g)/underpost"
144
160
 
145
161
  # Copy ONLY the scrubbed runtime tree — no .git, no token, no caches.
146
162
  COPY --from=builder --chown=dd:dd /home/dd/engine /home/dd/engine
@@ -6,7 +6,7 @@
6
6
  # Stage 1 — builder: clone the private deploy, build it, then scrub secrets.
7
7
  # ---------------------------------------------------------------------------
8
8
  FROM rockylinux/rockylinux:9 AS builder
9
- ARG UNDERPOST_VERSION=3.2.90
9
+ ARG UNDERPOST_VERSION=3.3.73
10
10
  # Pin Node to an exact patch: dnf's nodejs:24 module lags (24.14.1) while
11
11
  # underpost's dependencies require >=24.15.0, so install the official binary.
12
12
  ARG NODE_VERSION=24.15.0
@@ -14,7 +14,7 @@ ENV NODE_ENV=development
14
14
 
15
15
  RUN set -eux; \
16
16
  # `sudo` is required because underpost's build steps shell out to
17
- # `sudo cp`/`sudo rm` (src/server/start.js); the build runs as root so sudo
17
+ # `sudo cp`/`sudo rm` (src/server/runtime/start.js); the build runs as root so sudo
18
18
  # is just a passthrough, but the binary must exist.
19
19
  dnf install -y git openssl tar xz sudo; \
20
20
  arch="$(uname -m)"; \
@@ -71,7 +71,7 @@ RUN --mount=type=secret,id=github_token \
71
71
  \
72
72
  # --- install deps + env, then replay build-safe itc provisioning ----------
73
73
  npm install; \
74
- node bin env dd-cyberia development; \
74
+ node bin app load --env development --args deploy-id=dd-cyberia; \
75
75
  node bin fs --pull --recursive --deploy-id dd-cyberia --storage-file-path './engine-private/conf/dd-cyberia/storage.engine-cyberia.json'; \
76
76
  ( cd /home/dd/engine/hardhat && npm install --include=dev ); \
77
77
  ( cd /home/dd/engine && underpost clone underpostnet/cyberia-server ); \
@@ -140,7 +140,7 @@ COPY --from=builder /usr/local/ /usr/local/
140
140
  RUN dnf install -y libstdc++ git sudo && dnf clean all && rm -rf /var/cache/dnf && \
141
141
  useradd --create-home --home-dir /home/dd --shell /usr/sbin/nologin dd && \
142
142
  # The runtime runs as `dd`, but `underpost start --build` shells out to `sudo cp`/`sudo rm`
143
- # (src/server/start.js). Grant passwordless sudo so those succeed without a TTY/password.
143
+ # (src/server/runtime/start.js). Grant passwordless sudo so those succeed without a TTY/password.
144
144
  printf 'dd ALL=(ALL) NOPASSWD:ALL\n' > /etc/sudoers.d/dd && chmod 0440 /etc/sudoers.d/dd && \
145
145
  # underpost persists its global env at $(npm root -g)/underpost/.env; the
146
146
  # non-root runtime user must be able to write it (fixes EACCES on start).
@@ -70,6 +70,22 @@ CYBERIA_DEFAULT_INSTANCE=amethyst-strata-expansion
70
70
  CYBERIA_SERVER_APP_ENV=development
71
71
  CYBERIA_SERVER_LOG_LEVEL=
72
72
 
73
+ # --- cyberia-server WebSocket admission and rate limits ----------------------
74
+ # Unset keeps the built-in default. An explicit 0 turns that one limit off.
75
+ # The startup log prints the effective profile ("ws limits: ...").
76
+ #
77
+ # Set CYBERIA_DISABLE_CONNECTION_LIMITS=1 to turn every limit off. The load test
78
+ # (test/cyberia-load.test.js) drives every simulated client from one address, so
79
+ # it needs this. NEVER enable it on a public deploy.
80
+ CYBERIA_DISABLE_CONNECTION_LIMITS=
81
+ CYBERIA_MAX_CONNECTIONS=
82
+ CYBERIA_MAX_CONNECTIONS_PER_IP=
83
+ CYBERIA_CONNECT_RATE_PER_IP=
84
+ CYBERIA_CONNECT_BURST_PER_IP=
85
+ CYBERIA_MESSAGE_RATE=
86
+ CYBERIA_MESSAGE_BURST=
87
+ CYBERIA_MAX_STRIKES=
88
+
73
89
  # --- engine-cyberia runtime env (loaded into the container via env_file) -----
74
90
  # The dd-cyberia engine (engine-private/conf/dd-cyberia/conf.server.json) needs
75
91
  # these to boot: DB auth + per-site DB names, the base PORT (the cyberia host is