@underpostnet/cyberia 3.3.0 → 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 (471) hide show
  1. package/.dockerignore +1 -0
  2. package/.github/workflows/coverall.cyberia.ci.yml +34 -14
  3. package/.github/workflows/cyberia-client.cd.yml +5 -0
  4. package/.github/workflows/cyberia-server.cd.yml +5 -0
  5. package/.github/workflows/docker-image.cyberia-client.ci.yml +8 -5
  6. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +8 -3
  7. package/.github/workflows/docker-image.cyberia-server.ci.yml +8 -5
  8. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +8 -5
  9. package/.github/workflows/docker-image.engine-cyberia.ci.yml +15 -1
  10. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +15 -1
  11. package/.github/workflows/engine-cyberia.cd.yml +3 -0
  12. package/.github/workflows/engine-cyberia.ci.yml +4 -5
  13. package/.github/workflows/ghpkg.ci.yml +35 -20
  14. package/.github/workflows/hardhat.ci.yml +12 -11
  15. package/.github/workflows/npmpkg.ci.yml +17 -15
  16. package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
  17. package/.github/workflows/release.cd.yml +1 -0
  18. package/.prettierignore +1 -0
  19. package/AGENTS.md +47 -0
  20. package/CHANGELOG.md +565 -2510
  21. package/CLI-HELP.md +306 -147
  22. package/Dockerfile +25 -9
  23. package/Dockerfile.dev +25 -9
  24. package/Dockerfile.test +4 -4
  25. package/README.md +21 -1
  26. package/bin/build.js +66 -41
  27. package/bin/build.template.js +8 -3
  28. package/bin/cyberia.js +308 -91
  29. package/bin/deploy.js +18 -104
  30. package/bin/index.js +308 -91
  31. package/conf.js +91 -4
  32. package/deploy/cyberia-client/deploy.sh +47 -0
  33. package/deploy/cyberia-client/package.sh +18 -0
  34. package/deploy/cyberia-client/state.sh +14 -0
  35. package/deploy/cyberia-server/deploy.sh +47 -0
  36. package/deploy/cyberia-server/package.sh +18 -0
  37. package/deploy/cyberia-server/state.sh +14 -0
  38. package/deploy/dd-cyberia/deploy.sh +6 -26
  39. package/deploy/dd-cyberia/init.sh +35 -43
  40. package/deploy/dd-cyberia/package.sh +17 -0
  41. package/deploy/dd-cyberia/state.sh +14 -0
  42. package/deploy/dd-cyberia/sync-deploy.sh +92 -170
  43. package/deploy/lib/github-actions-logging.sh +594 -0
  44. package/deploy/lib/host.sh +185 -0
  45. package/deploy/lib/state.sh +62 -0
  46. package/deploy/pwa-microservices-template/deploy.sh +12 -39
  47. package/deploy/release/deploy.sh +9 -39
  48. package/deployment.yaml +7 -2
  49. package/docker-compose.yml +7 -7
  50. package/examples/static-page/README.md +19 -19
  51. package/examples/static-page/ssr-components/CustomPage.js +2 -2
  52. package/hardhat/hardhat.config.js +1 -6
  53. package/hardhat/package-lock.json +101 -40
  54. package/hardhat/package.json +2 -2
  55. package/manifests/alertmanager/deployment.yaml +81 -0
  56. package/manifests/blackbox-exporter/deployment.yaml +75 -0
  57. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +32 -7
  58. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +32 -7
  59. package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
  60. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  61. package/manifests/grafana/deployment.yaml +26 -7
  62. package/manifests/grafana/kustomization.yaml +1 -0
  63. package/manifests/grafana/service.yaml +6 -1
  64. package/manifests/mariadb/pv.yaml +1 -0
  65. package/manifests/mongodb/statefulset.yaml +9 -2
  66. package/manifests/mysql/pv-pvc.yaml +14 -1
  67. package/manifests/postgresql/pv.yaml +12 -1
  68. package/manifests/postgresql/pvc.yaml +1 -0
  69. package/manifests/prometheus/deployment.yaml +18 -22
  70. package/package.json +83 -10
  71. package/scripts/event-monitor.sh +56 -0
  72. package/scripts/k3s-node-setup.sh +27 -14
  73. package/scripts/kubeadm-node-setup.sh +31 -11
  74. package/scripts/maas-setup.sh +8 -8
  75. package/scripts/selinux-normalize.sh +907 -0
  76. package/scripts/shutdown-machine.sh +843 -0
  77. package/scripts/test-monitor.sh +3 -3
  78. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +1 -1
  79. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +2 -2
  80. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +2 -2
  81. package/src/api/core/core.controller.js +1 -1
  82. package/src/api/core/core.router.js +2 -2
  83. package/src/api/core/core.service.js +2 -2
  84. package/src/api/crypto/crypto.controller.js +1 -1
  85. package/src/api/crypto/crypto.service.js +1 -1
  86. package/src/api/cyberia-action/cyberia-action.controller.js +1 -1
  87. package/src/api/cyberia-action/cyberia-action.router.js +1 -1
  88. package/src/api/cyberia-action/cyberia-action.service.js +2 -2
  89. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +1 -1
  90. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +1 -1
  91. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +2 -2
  92. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
  93. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +1 -1
  94. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +2 -2
  95. package/src/api/cyberia-entity/cyberia-entity.controller.js +1 -1
  96. package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
  97. package/src/api/cyberia-entity/cyberia-entity.service.js +2 -2
  98. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +1 -1
  99. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +1 -1
  100. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +2 -2
  101. package/src/api/cyberia-instance/cyberia-fallback-capture.js +466 -0
  102. package/src/api/cyberia-instance/cyberia-fallback-world.js +8 -0
  103. package/src/api/cyberia-instance/cyberia-instance-map.service.js +1 -1
  104. package/src/api/cyberia-instance/cyberia-instance.controller.js +1 -1
  105. package/src/api/cyberia-instance/cyberia-instance.router.js +2 -2
  106. package/src/api/cyberia-instance/cyberia-instance.service.js +2 -2
  107. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
  108. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
  109. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +2 -2
  110. package/src/api/cyberia-map/cyberia-map.controller.js +1 -1
  111. package/src/api/cyberia-map/cyberia-map.router.js +1 -1
  112. package/src/api/cyberia-map/cyberia-map.service.js +2 -2
  113. package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
  114. package/src/api/cyberia-quest/cyberia-quest.router.js +1 -1
  115. package/src/api/cyberia-quest/cyberia-quest.service.js +2 -2
  116. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
  117. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +1 -1
  118. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +2 -2
  119. package/src/api/cyberia-saga/cyberia-saga.controller.js +1 -1
  120. package/src/api/cyberia-saga/cyberia-saga.router.js +1 -1
  121. package/src/api/cyberia-saga/cyberia-saga.service.js +2 -2
  122. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +0 -26
  123. package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
  124. package/src/api/cyberia-skill/cyberia-skill.router.js +1 -1
  125. package/src/api/cyberia-skill/cyberia-skill.service.js +2 -2
  126. package/src/api/default/default.controller.js +1 -1
  127. package/src/api/default/default.router.js +1 -1
  128. package/src/api/default/default.service.js +2 -2
  129. package/src/api/document/document.controller.js +1 -1
  130. package/src/api/document/document.router.js +1 -1
  131. package/src/api/document/document.service.js +2 -2
  132. package/src/api/file/file.controller.js +1 -1
  133. package/src/api/file/file.router.js +1 -1
  134. package/src/api/file/file.service.js +2 -2
  135. package/src/api/instance/instance.controller.js +1 -1
  136. package/src/api/instance/instance.router.js +1 -1
  137. package/src/api/instance/instance.service.js +2 -2
  138. package/src/api/ipfs/ipfs.controller.js +1 -1
  139. package/src/api/ipfs/ipfs.router.js +2 -2
  140. package/src/api/ipfs/ipfs.service.js +2 -2
  141. package/src/api/object-layer/object-layer.controller.js +1 -1
  142. package/src/api/object-layer/object-layer.router.js +2 -2
  143. package/src/api/object-layer/object-layer.service.js +3 -3
  144. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +1 -1
  145. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +1 -1
  146. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +2 -2
  147. package/src/api/test/test.controller.js +1 -1
  148. package/src/api/test/test.service.js +1 -1
  149. package/src/api/user/guest.service.js +3 -3
  150. package/src/api/user/user.controller.js +1 -1
  151. package/src/api/user/user.router.js +2 -2
  152. package/src/api/user/user.service.js +4 -4
  153. package/src/api.js +5 -9
  154. package/src/cli/app.js +391 -0
  155. package/src/cli/baremetal.js +30 -35
  156. package/src/cli/client.js +306 -0
  157. package/src/cli/cloud-init.js +3 -3
  158. package/src/cli/cluster.js +184 -82
  159. package/src/cli/db.js +120 -68
  160. package/src/cli/deploy.js +153 -71
  161. package/src/cli/docker-compose.js +5 -5
  162. package/src/cli/domains.js +184 -0
  163. package/src/cli/dotenv-store.js +143 -0
  164. package/src/cli/event.js +2281 -0
  165. package/src/cli/fs.js +3 -3
  166. package/src/cli/host.js +672 -0
  167. package/src/cli/image.js +4 -6
  168. package/src/cli/index.js +322 -142
  169. package/src/cli/ipfs.js +34 -30
  170. package/src/cli/kickstart.js +1 -1
  171. package/src/cli/kubectl.js +218 -41
  172. package/src/cli/lxd.js +3 -3
  173. package/src/cli/monitor.js +1359 -26
  174. package/src/cli/package.js +90 -0
  175. package/src/cli/release.js +16 -12
  176. package/src/cli/repository.js +558 -363
  177. package/src/cli/run.js +331 -650
  178. package/src/cli/secrets.js +2158 -964
  179. package/src/cli/ssh.js +478 -279
  180. package/src/cli/state.js +394 -0
  181. package/src/cli/static.js +2 -2
  182. package/src/cli/system.js +1 -1
  183. package/src/cli/test.js +199 -125
  184. package/src/cli/vultr.js +61 -21
  185. package/src/cli/wireguard.js +1111 -306
  186. package/src/client/components/core/CalendarCore.js +53 -96
  187. package/src/client/components/core/Docs.js +258 -211
  188. package/src/client/components/core/FileExplorer.js +0 -21
  189. package/src/client/components/core/PanelForm.js +4 -4
  190. package/src/client/components/core/Repository.js +56 -0
  191. package/src/client/components/core/Translate.js +7 -0
  192. package/src/client/components/core/{FullScreen.js → ViewModeController.js} +42 -39
  193. package/src/client/components/core/Wallet.js +0 -11
  194. package/src/client/components/core/Worker.js +7 -1
  195. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +2 -2
  196. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +2 -1
  197. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
  198. package/src/client/components/default/AppShellDefault.js +1 -1
  199. package/src/client/components/default/SettingsDefault.js +2 -2
  200. package/src/client/components/itemledger/SettingsItemledger.js +2 -2
  201. package/src/client/components/underpost/AppShellUnderpost.js +3 -2
  202. package/src/client/components/underpost/SettingsUnderpost.js +2 -2
  203. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +32 -5
  204. package/src/client/public/cyberia-docs/CYBERIA.md +21 -1
  205. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +23 -6
  206. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  207. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  208. package/src/client/public/default/android-chrome-144x144.png +0 -0
  209. package/src/client/public/default/android-chrome-192x192.png +0 -0
  210. package/src/client/public/default/android-chrome-256x256.png +0 -0
  211. package/src/client/public/default/android-chrome-36x36.png +0 -0
  212. package/src/client/public/default/android-chrome-384x384.png +0 -0
  213. package/src/client/public/default/android-chrome-48x48.png +0 -0
  214. package/src/client/public/default/android-chrome-512x512.png +0 -0
  215. package/src/client/public/default/android-chrome-72x72.png +0 -0
  216. package/src/client/public/default/android-chrome-96x96.png +0 -0
  217. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  218. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  219. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  220. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  221. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  222. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  223. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  224. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  225. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  226. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  227. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  228. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  229. package/src/client/public/default/apple-touch-icon.png +0 -0
  230. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  231. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  232. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  233. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  234. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  235. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  236. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  237. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  238. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  239. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  240. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  241. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  242. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  243. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  244. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  245. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  246. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  247. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  248. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  249. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  250. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  251. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  252. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  253. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  254. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  255. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  256. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  257. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  258. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  259. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  260. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  261. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  262. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  263. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  264. package/src/client/public/default/assets/background/white.jpg +0 -0
  265. package/src/client/public/default/browserconfig.xml +1 -1
  266. package/src/client/public/default/favicon-16x16.png +0 -0
  267. package/src/client/public/default/favicon-32x32.png +0 -0
  268. package/src/client/public/default/favicon-48x48.png +0 -0
  269. package/src/client/public/default/favicon.ico +0 -0
  270. package/src/client/public/default/manifest.webmanifest +5 -5
  271. package/src/client/public/default/mstile-144x144.png +0 -0
  272. package/src/client/public/default/mstile-150x150.png +0 -0
  273. package/src/client/public/default/mstile-310x150.png +0 -0
  274. package/src/client/public/default/mstile-310x310.png +0 -0
  275. package/src/client/public/default/mstile-70x70.png +0 -0
  276. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  277. package/src/client/public/default/yandex-browser-manifest.json +1 -1
  278. package/src/client/ssr/RootDocument.js +1 -1
  279. package/src/client/ssr/body/404.js +1 -1
  280. package/src/client/ssr/body/500.js +1 -1
  281. package/src/client/ssr/body/CacheControl.js +1 -1
  282. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +1 -1
  283. package/src/client/ssr/body/DefaultSplashScreen.js +1 -1
  284. package/src/client/ssr/body/SwaggerDarkMode.js +1 -1
  285. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +1 -1
  286. package/src/client/ssr/head/CryptokoynScripts.js +1 -1
  287. package/src/client/ssr/head/Css.js +1 -1
  288. package/src/client/ssr/head/CyberiaPortalScripts.js +1 -1
  289. package/src/client/ssr/head/DefaultScripts.js +1 -1
  290. package/src/client/ssr/head/ItemledgerScripts.js +1 -1
  291. package/src/client/ssr/head/Microdata.js +1 -1
  292. package/src/client/ssr/head/Production.js +1 -1
  293. package/src/client/ssr/head/Pwa.js +1 -1
  294. package/src/client/ssr/head/PwaItemledger.js +1 -1
  295. package/src/client/ssr/head/Seo.js +1 -1
  296. package/src/client/ssr/head/UnderpostScripts.js +1 -1
  297. package/src/client/ssr/mailer/DefaultRecoverEmail.js +1 -1
  298. package/src/client/ssr/mailer/DefaultVerifyEmail.js +1 -1
  299. package/src/client/ssr/views/Cyberia404.js +7 -5
  300. package/src/client/ssr/views/CyberiaServerMetrics.js +1 -1
  301. package/src/client/ssr/views/Maintenance.js +1 -1
  302. package/src/client/ssr/views/NoNetworkConnection.js +1 -1
  303. package/src/client/ssr/views/Test.js +1 -1
  304. package/src/client/sw/core.sw.js +20 -14
  305. package/src/client-builder/client-build-docs.js +61 -46
  306. package/src/client-builder/client-build-live.js +2 -2
  307. package/src/client-builder/client-build.js +38 -30
  308. package/src/client-builder/client-dev-server.js +3 -3
  309. package/src/client-builder/client-icons.js +2 -2
  310. package/src/client-builder/ssr.js +3 -3
  311. package/src/client.build.js +3 -6
  312. package/src/client.dev.js +3 -6
  313. package/src/db/DataBaseProvider.js +186 -3
  314. package/src/db/mariadb/MariaDB.js +3 -2
  315. package/src/db/mongo/MongoBootstrap.js +273 -101
  316. package/src/db/mongo/MongooseDB.js +7 -8
  317. package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
  318. package/src/grpc/cyberia/grpc-server.js +1 -1
  319. package/src/index.js +79 -23
  320. package/src/mailer/EmailRender.js +2 -2
  321. package/src/mailer/MailerInterceptor.js +87 -0
  322. package/src/mailer/MailerProvider.js +50 -6
  323. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +1 -1
  324. package/src/projects/cyberia/besu-genesis-generator.js +3 -3
  325. package/src/projects/cyberia/catalog-cyberia.js +53 -10
  326. package/src/projects/cyberia/gemini-client.js +1 -1
  327. package/src/projects/cyberia/generate-saga.js +1 -1
  328. package/src/projects/cyberia/hot-reload-trigger.js +1 -1
  329. package/src/projects/cyberia/instance-data.js +1 -1
  330. package/src/projects/cyberia/ipfs-client.js +4 -4
  331. package/src/projects/cyberia/map-preview-generator.js +1 -1
  332. package/src/projects/cyberia/object-layer.js +1 -1
  333. package/src/projects/cyberia/semantic-layer-generator.js +1 -1
  334. package/src/projects/underpost/catalog-underpost.js +9 -1
  335. package/src/proxy.js +4 -7
  336. package/src/runtime/cyberia-client/Dockerfile +9 -4
  337. package/src/runtime/cyberia-client/Dockerfile.dev +8 -2
  338. package/src/runtime/cyberia-server/Dockerfile +9 -4
  339. package/src/runtime/cyberia-server/Dockerfile.dev +8 -2
  340. package/src/runtime/engine-cyberia/Dockerfile +25 -9
  341. package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
  342. package/src/runtime/engine-cyberia/Dockerfile.test +4 -4
  343. package/src/runtime/engine-cyberia/docker-compose.yml +7 -7
  344. package/src/runtime/express/Express.js +32 -27
  345. package/src/runtime/lampp/Lampp.js +22 -70
  346. package/src/runtime/nginx/Nginx.js +1 -1
  347. package/src/runtime/wp/Wp.js +16 -48
  348. package/src/server/{catalog.js → build/catalog.js} +15 -5
  349. package/src/server/build/coverage.js +117 -0
  350. package/src/server/build/execution.js +402 -0
  351. package/src/server/build/package.js +465 -0
  352. package/src/server/build/testing.js +528 -0
  353. package/src/server/{dns.js → network/dns.js} +144 -11
  354. package/src/server/{forward-proxy.js → network/forward-proxy.js} +10 -18
  355. package/src/server/{middlewares.js → network/middlewares.js} +3 -3
  356. package/src/server/network/node-capability.js +98 -0
  357. package/src/server/{peer.js → network/peer.js} +3 -3
  358. package/src/server/{proxy.js → network/proxy.js} +7 -13
  359. package/src/server/network/router.js +356 -0
  360. package/src/server/{tls.js → network/tls.js} +2 -2
  361. package/src/server/{underpost-compression.js → network/underpost-compression.js} +1 -1
  362. package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +7 -7
  363. package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +2 -2
  364. package/src/server/{cri.js → ops/cri.js} +2 -2
  365. package/src/server/{cron.js → ops/cron.js} +349 -74
  366. package/src/server/ops/event-notification.js +284 -0
  367. package/src/server/{logger.js → ops/logger.js} +108 -23
  368. package/src/server/ops/monitoring.js +1724 -0
  369. package/src/server/{systemd.js → ops/systemd.js} +55 -1
  370. package/src/server/{conf.js → runtime/conf.js} +513 -422
  371. package/src/server/runtime/config-scope.js +215 -0
  372. package/src/server/runtime/environment.js +149 -0
  373. package/src/server/{process.js → runtime/process.js} +153 -12
  374. package/src/server/{runtime-status.js → runtime/runtime-status.js} +155 -16
  375. package/src/server/{runtime.js → runtime/runtime.js} +12 -8
  376. package/src/server/{start.js → runtime/start.js} +128 -39
  377. package/src/server/{auth.js → security/auth.js} +7 -8
  378. package/src/server/security/container-storage.js +382 -0
  379. package/src/server/{crypto.js → security/crypto.js} +1 -1
  380. package/src/server/{selinux.js → security/selinux.js} +1 -1
  381. package/src/server/{backup.js → storage/backup.js} +17 -8
  382. package/src/server/{data-query.js → storage/data-query.js} +1 -1
  383. package/src/server/{downloader.js → storage/downloader.js} +2 -2
  384. package/src/server/storage/repository.js +68 -0
  385. package/src/server.js +4 -7
  386. package/src/ws/IoInterface.js +1 -1
  387. package/src/ws/IoServer.js +1 -1
  388. package/src/ws/core/core.ws.connection.js +1 -1
  389. package/src/ws/core/core.ws.emit.js +1 -1
  390. package/src/ws/core/core.ws.server.js +1 -1
  391. package/src/ws/default/default.ws.connection.js +1 -1
  392. package/src/ws/default/default.ws.emit.js +1 -1
  393. package/src/ws/default/default.ws.server.js +1 -1
  394. package/test/e2e/event-e2e-public-ingress-down.js +45 -0
  395. package/test/e2e/event-e2e-wireguard-server-down.js +38 -0
  396. package/test/e2e/event-e2e-wireguard-spoke-down.js +40 -0
  397. package/test/{api.test.js → integration/app/api.test.js} +33 -14
  398. package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +30 -0
  399. package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +1 -1
  400. package/test/integration/app/cyberia/cyberia-load.test.js +467 -0
  401. package/test/integration/app/cyberia/fallback-world-capture.test.js +253 -0
  402. package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
  403. package/test/{shape-generator.test.js → integration/app/cyberia/shape-generator.test.js} +1 -1
  404. package/test/integration/infra/1-security/config-scope.test.js +305 -0
  405. package/test/integration/infra/1-security/container-storage.test.js +356 -0
  406. package/test/integration/infra/1-security/in-pod-cli-surface.test.js +86 -0
  407. package/test/integration/infra/1-security/secret-onboarding.test.js +930 -0
  408. package/test/{selinux.test.js → integration/infra/1-security/selinux.test.js} +2 -4
  409. package/test/{sops-secret-store.test.js → integration/infra/1-security/sops-secret-store.test.js} +415 -61
  410. package/test/integration/infra/1-security/systemd-service.test.js +70 -0
  411. package/test/integration/infra/1-security/underpost-config-secret.test.js +367 -0
  412. package/test/integration/infra/2-network/dns-firewall.test.js +566 -0
  413. package/test/integration/infra/2-network/node-capability.test.js +182 -0
  414. package/test/integration/infra/2-network/wireguard-cli.test.js +1163 -0
  415. package/test/{wireguard-edge.test.js → integration/infra/2-network/wireguard-edge.test.js} +609 -55
  416. package/test/{cluster-instances.test.js → integration/infra/3-cluster/cluster-instances.test.js} +11 -15
  417. package/test/{deploy-node-placement.test.js → integration/infra/3-cluster/deploy-node-placement.test.js} +3 -3
  418. package/test/integration/infra/3-cluster/docker-compose-stack.test.js +313 -0
  419. package/test/integration/infra/4-ingress/deploy-routes.test.js +379 -0
  420. package/test/integration/infra/4-ingress/gateway-static-assets.test.js +453 -0
  421. package/test/{instance-traffic-plan.test.js → integration/infra/4-ingress/instance-traffic-plan.test.js} +10 -6
  422. package/test/{underpost-gateway.test.js → integration/infra/4-ingress/underpost-gateway.test.js} +6 -6
  423. package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +4 -4
  424. package/test/integration/infra/5-observability/cron-jobs.test.js +652 -0
  425. package/test/{deploy-monitor.test.js → integration/infra/5-observability/deploy-monitor.test.js} +29 -31
  426. package/test/integration/infra/5-observability/event-notification.test.js +197 -0
  427. package/test/integration/infra/5-observability/event-remediation.test.js +502 -0
  428. package/test/integration/infra/5-observability/event-targets.test.js +1174 -0
  429. package/test/integration/infra/5-observability/monitoring-stack.test.js +902 -0
  430. package/test/support/shell-harness.js +73 -0
  431. package/test/unit/build-template.test.js +97 -0
  432. package/test/unit/build-workflow-offline.test.js +132 -0
  433. package/test/unit/catalog.test.js +71 -0
  434. package/test/unit/client-build-docs.test.js +334 -0
  435. package/test/unit/conf-loading.test.js +303 -0
  436. package/test/unit/conf-resolution.test.js +979 -0
  437. package/test/unit/coverage-artifact.test.js +130 -0
  438. package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
  439. package/test/unit/deploy-env-resolution.test.js +38 -0
  440. package/test/unit/deploy-log-table.test.js +447 -0
  441. package/test/unit/execution-profiles.test.js +219 -0
  442. package/test/unit/fleet-sync-source.test.js +149 -0
  443. package/test/unit/logger-redaction.test.js +112 -0
  444. package/test/unit/package.test.js +403 -0
  445. package/test/unit/prepare-host.test.js +299 -0
  446. package/test/unit/process-environment.test.js +18 -0
  447. package/test/unit/propagation-message.test.js +78 -0
  448. package/test/unit/redeploy-plan.test.js +24 -0
  449. package/test/unit/release-bump.test.js +474 -0
  450. package/test/unit/ssh-output-redaction.test.js +28 -0
  451. package/test/unit/start-options.test.js +46 -0
  452. package/test/unit/test-tiers.test.js +193 -0
  453. package/vitest.config.js +58 -0
  454. package/.nycrc +0 -9
  455. package/deploy/lib/logging.sh +0 -96
  456. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
  457. package/manifests/mongodb/pv-pvc.yaml +0 -59
  458. package/scripts/coverall-test-cyberia.sh +0 -24
  459. package/scripts/coverall-test.sh +0 -24
  460. package/scripts/link-local-underpost-cli.sh +0 -6
  461. package/src/api/user/user.build.js +0 -16
  462. package/src/cli/env.js +0 -177
  463. package/src/client/components/core/Blockchain.js +0 -41
  464. package/src/client/components/core/Blog.js +0 -9
  465. package/src/client/components/core/KeyboardAvoidance.js +0 -145
  466. package/src/client/public/default/assets/background/dark.jpg +0 -0
  467. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  468. package/src/client/public/default/assets/background/white0.jpg +0 -0
  469. package/src/client/public/doc/favicon.ico +0 -0
  470. package/src/client/public/doc/sitemap +0 -148
  471. package/src/server/environment.js +0 -98
@@ -55,6 +55,12 @@ spec:
55
55
  - '--keyFile'
56
56
  - '/opt/mongodb/mongodb-keyfile'
57
57
  - '--bind_ip_all'
58
+ # Pinned, not inferred. mongod sizes its cache from the cgroup limit and lands on
59
+ # the 256MB floor, which leaves no headroom for a `mongodump` running in this same
60
+ # container — the dump gets OOM-killed (exit 137), the container restarts, and the
61
+ # replica set re-elects mid-backup.
62
+ - '--wiredTigerCacheSizeGB'
63
+ - '0.25'
58
64
 
59
65
  ports:
60
66
  - containerPort: 27017
@@ -91,10 +97,11 @@ spec:
91
97
  resources:
92
98
  requests:
93
99
  cpu: '100m'
94
- memory: '256Mi'
100
+ memory: '512Mi'
95
101
  limits:
96
102
  cpu: '500m'
97
- memory: '512Mi'
103
+ # 256MB WiredTiger cache + connections + an in-container mongodump/mongorestore.
104
+ memory: '1536Mi'
98
105
  volumes:
99
106
  - name: raw-secret-keyfile-volume
100
107
  secret:
@@ -1,4 +1,9 @@
1
1
  # pv-pvc.yaml
2
+ # The host path lives under /data, the node storage root this platform owns and labels
3
+ # `container_file_t`; a path outside it (the previous '/mnt/data') carries the policy default and
4
+ # is unreadable to the unprivileged container. `claimRef` pins the volume to exactly one claim —
5
+ # without it this PV and postgres-pv-volume were interchangeable `manual`-class volumes over the
6
+ # same directory, so either database could bind either one and both could land on one data tree.
2
7
  apiVersion: v1
3
8
  kind: PersistentVolume
4
9
  metadata:
@@ -7,12 +12,19 @@ metadata:
7
12
  type: local
8
13
  spec:
9
14
  storageClassName: manual
15
+ persistentVolumeReclaimPolicy: Retain
10
16
  capacity:
11
17
  storage: 20Gi
12
18
  accessModes:
13
19
  - ReadWriteOnce
20
+ claimRef:
21
+ apiVersion: v1
22
+ kind: PersistentVolumeClaim
23
+ namespace: default
24
+ name: mysql-pv-claim
14
25
  hostPath:
15
- path: '/mnt/data'
26
+ path: '/data/mysql'
27
+ type: DirectoryOrCreate
16
28
  ---
17
29
  apiVersion: v1
18
30
  kind: PersistentVolumeClaim
@@ -20,6 +32,7 @@ metadata:
20
32
  name: mysql-pv-claim
21
33
  spec:
22
34
  storageClassName: manual
35
+ volumeName: mysql-pv
23
36
  accessModes:
24
37
  - ReadWriteOnce
25
38
  resources:
@@ -1,3 +1,7 @@
1
+ # The host path lives under /data, the node storage root this platform owns and labels
2
+ # `container_file_t`. `claimRef` pins the volume to exactly one claim: this PV and mysql-pv were
3
+ # previously interchangeable `manual`-class volumes over the same '/mnt/data' directory, so either
4
+ # database could bind either one and both could end up writing one data tree.
1
5
  kind: PersistentVolume
2
6
  apiVersion: v1
3
7
  metadata:
@@ -7,9 +11,16 @@ metadata:
7
11
  app: postgres
8
12
  spec:
9
13
  storageClassName: manual
14
+ persistentVolumeReclaimPolicy: Retain
10
15
  capacity:
11
16
  storage: 5Gi
12
17
  accessModes:
13
18
  - ReadWriteMany
19
+ claimRef:
20
+ apiVersion: v1
21
+ kind: PersistentVolumeClaim
22
+ namespace: default
23
+ name: postgres-pv-claim
14
24
  hostPath:
15
- path: '/mnt/data'
25
+ path: '/data/postgresql'
26
+ type: DirectoryOrCreate
@@ -6,6 +6,7 @@ metadata:
6
6
  app: postgres
7
7
  spec:
8
8
  storageClassName: manual
9
+ volumeName: postgres-pv-volume
9
10
  accessModes:
10
11
  - ReadWriteMany
11
12
  resources:
@@ -1,25 +1,3 @@
1
- ---
2
- apiVersion: v1
3
- kind: ConfigMap
4
- metadata:
5
- name: prometheus-config
6
- labels:
7
- app: prometheus
8
- data:
9
- prometheus.yml: |
10
- global:
11
- scrape_interval: 30s
12
- evaluation_interval: 30s
13
-
14
- scrape_configs:
15
- - job_name: 'scraper'
16
- metrics_path: /metrics
17
- scheme: https
18
- static_configs:
19
- - targets: []
20
- # tls_config:
21
- # insecure_skip_verify: true
22
-
23
1
  ---
24
2
  apiVersion: apps/v1
25
3
  kind: Deployment
@@ -37,6 +15,7 @@ spec:
37
15
  labels:
38
16
  app: prometheus
39
17
  spec:
18
+ serviceAccountName: prometheus
40
19
  containers:
41
20
  - name: prometheus
42
21
  image: prom/prometheus:latest
@@ -51,8 +30,22 @@ spec:
51
30
  volumeMounts:
52
31
  - name: prometheus-config
53
32
  mountPath: /etc/prometheus/
33
+ - name: prometheus-rules
34
+ mountPath: /etc/prometheus/rules/
54
35
  - name: prometheus-data
55
36
  mountPath: /prometheus
37
+ readinessProbe:
38
+ httpGet:
39
+ path: /-/ready
40
+ port: 9090
41
+ initialDelaySeconds: 10
42
+ periodSeconds: 15
43
+ livenessProbe:
44
+ httpGet:
45
+ path: /-/healthy
46
+ port: 9090
47
+ initialDelaySeconds: 30
48
+ periodSeconds: 20
56
49
  resources:
57
50
  requests:
58
51
  memory: '200Mi'
@@ -61,6 +54,9 @@ spec:
61
54
  - name: prometheus-config
62
55
  configMap:
63
56
  name: prometheus-config
57
+ - name: prometheus-rules
58
+ configMap:
59
+ name: prometheus-rules
64
60
  - name: prometheus-data
65
61
  emptyDir: {}
66
62
 
package/package.json CHANGED
@@ -2,13 +2,13 @@
2
2
  "type": "module",
3
3
  "main": "src/index.js",
4
4
  "name": "@underpostnet/cyberia",
5
- "version": "3.3.0",
5
+ "version": "3.3.73",
6
6
  "description": "Cyberia CLI — toolchain for the Cyberia MMO data layer, content pipeline, persistence, gRPC services, and ERC-1155 lifecycle on Hyperledger Besu.",
7
7
  "scripts": {
8
8
  "start": "node --max-old-space-size=8192 src/server",
9
9
  "build": "node bin client",
10
- "test": "NODE_ENV=test c8 mocha",
11
- "test:monitor": "NODE_ENV=test c8 mocha test/deploy-monitor.test.js",
10
+ "test": "node bin test",
11
+ "test:coverage": "COVERAGE_ENFORCE=1 node bin test unit,infra,app,cyberia",
12
12
  "dev": "NODE_ENV=development nodemon src/server",
13
13
  "dev:container": "NODE_ENV=development node src/server",
14
14
  "prod:container": "NODE_ENV=production node src/server",
@@ -17,7 +17,7 @@
17
17
  "dev:proxy": "NODE_ENV=development node src/proxy proxy",
18
18
  "docs": "typedoc --options typedoc.json",
19
19
  "install:global": "npm install -g prettier",
20
- "install:test": "npm install -g mocha && npm install -g c8 && npm install -g coveralls-next",
20
+ "install:test": "npm install -g coveralls-next",
21
21
  "install": "npm run install:global && npm run install:test",
22
22
  "prettier": "prettier --write .",
23
23
  "fix": "npm audit fix --force && npm audit",
@@ -26,7 +26,6 @@
26
26
  "security:secrets:ci": "gitleaks detect --source . --config .gitleaks.toml --redact=1",
27
27
  "security:deps": "npm audit",
28
28
  "security": "npm run security:secrets:ci && npm run security:deps",
29
- "clean": "node bin env clean && node bin run clean",
30
29
  "docker:generate": "node bin docker-compose --generate --deploy-id dd-cyberia --docker-compose-id cyberia",
31
30
  "docker:up": "node bin docker-compose --up --deploy-id dd-cyberia --docker-compose-id cyberia",
32
31
  "docker:up:build": "node bin docker-compose --up --build --deploy-id dd-cyberia --docker-compose-id cyberia",
@@ -41,7 +40,8 @@
41
40
  "docker:reset": "node bin docker-compose --reset --deploy-id dd-cyberia --docker-compose-id cyberia"
42
41
  },
43
42
  "bin": {
44
- "cyberia": "bin/index.js"
43
+ "cyberia": "bin/index.js",
44
+ "underpost": "bin/index.js"
45
45
  },
46
46
  "repository": {
47
47
  "type": "git",
@@ -72,12 +72,12 @@
72
72
  },
73
73
  "homepage": "https://github.com/underpostnet/engine-cyberia#readme",
74
74
  "dependencies": {
75
- "underpost": "^3.3.0",
75
+ "underpost": "^3.3.73",
76
76
  "adm-zip": "^0.6.0",
77
77
  "maxrects-packer": "^2.7.3",
78
78
  "pngjs": "^7.0.0",
79
79
  "jimp": "^1.6.0",
80
- "sharp": "^0.34.5",
80
+ "sharp": "^0.35.3",
81
81
  "ethers": "~6.16.0"
82
82
  },
83
83
  "publishConfig": {
@@ -90,12 +90,85 @@
90
90
  "minimatch": "^10.2.2",
91
91
  "glob": "^11.0.0",
92
92
  "diff": ">=8.0.3",
93
- "js-yaml": ">=3.14.2",
93
+ "js-yaml": "$js-yaml",
94
94
  "debug": ">=4.3.6",
95
95
  "serialize-javascript": ">=7.0.5",
96
96
  "router": {
97
97
  "path-to-regexp": ">=8.4.0"
98
98
  },
99
99
  "ws": "^8.20.2"
100
+ },
101
+ "devDependencies": {
102
+ "@fortawesome/fontawesome-free": "^7.3.1",
103
+ "@fullcalendar/rrule": "^7.0.2",
104
+ "@grpc/grpc-js": "^1.14.4",
105
+ "@grpc/proto-loader": "^0.8.1",
106
+ "@neodrag/vanilla": "^2.3.1",
107
+ "@vitest/coverage-v8": "4.1.11",
108
+ "ag-grid-community": "^36.1.0",
109
+ "allure-vitest": "3.11.0",
110
+ "axios": "^1.20.0",
111
+ "bumpp": "^12.2.2",
112
+ "chai": "^6.2.2",
113
+ "clipboardy": "^5.3.2",
114
+ "cloudinary": "^2.11.0",
115
+ "colors": "^1.4.0",
116
+ "commander": "^15.0.0",
117
+ "compression": "^1.7.4",
118
+ "cookie-parser": "^1.4.7",
119
+ "cors": "^2.8.6",
120
+ "d3": "^7.9.0",
121
+ "dexie": "^4.4.5",
122
+ "dotenv": "^17.4.2",
123
+ "easymde": "^2.21.0",
124
+ "esbuild": "^0.28.2",
125
+ "escape-string-regexp": "^5.0.0",
126
+ "express": "^5.2.1",
127
+ "express-fileupload": "^1.4.3",
128
+ "express-rate-limit": "^8.6.2",
129
+ "express-slow-down": "^3.1.1",
130
+ "fast-json-stable-stringify": "^2.1.0",
131
+ "favicons": "^7.3.1",
132
+ "fs-extra": "^11.4.0",
133
+ "fullcalendar": "^7.0.2",
134
+ "helmet": "^8.3.0",
135
+ "html-minifier-terser": "^7.2.0",
136
+ "http-proxy-middleware": "^4.2.0",
137
+ "ignore-walk": "^9.0.0",
138
+ "iovalkey": "^0.4.0",
139
+ "json-colorizer": "^3.0.1",
140
+ "js-yaml": "^5.4.1",
141
+ "jsonwebtoken": "^9.0.3",
142
+ "mariadb": "^3.5.3",
143
+ "mongoose": "^9.9.4",
144
+ "morgan": "^1.12.0",
145
+ "marked": "^18.0.11",
146
+ "nodemailer": "^9.0.6",
147
+ "nodemon": "^3.0.1",
148
+ "peer": "^1.0.2",
149
+ "peerjs": "^1.5.5",
150
+ "prom-client": "^15.1.2",
151
+ "read": "^6.0.0",
152
+ "rrule": "^2.8.1",
153
+ "shelljs": "^0.10.0",
154
+ "sitemap": "^9.0.1",
155
+ "socket.io": "^4.8.3",
156
+ "sortablejs": "^1.15.0",
157
+ "split-file": "^2.3.0",
158
+ "swagger-autogen": "^2.23.7",
159
+ "swagger-ui-express": "^5.0.0",
160
+ "typedoc": "^0.28.20",
161
+ "typescript": "6.0.3",
162
+ "validator": "^13.15.35",
163
+ "vanilla-jsoneditor": "^3.13.0",
164
+ "vitest": "4.1.11",
165
+ "winston": "^3.19.0",
166
+ "workbox-background-sync": "^7.4.1",
167
+ "workbox-cacheable-response": "^7.4.1",
168
+ "workbox-core": "^7.4.1",
169
+ "workbox-expiration": "^7.4.1",
170
+ "workbox-precaching": "^7.4.1",
171
+ "workbox-routing": "^7.4.1",
172
+ "workbox-strategies": "^7.4.1"
100
173
  }
101
- }
174
+ }
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ NAMESPACE="${NAMESPACE:-default}"
5
+ TARGET_URL="${TARGET_URL:-https://underpost.net/}"
6
+ ENVOY_NAMESPACE="${ENVOY_NAMESPACE:-envoy-gateway-system}"
7
+
8
+ COLOR_CYAN='\033[0;36m'
9
+ COLOR_GREEN='\033[0;32m'
10
+ COLOR_YELLOW='\033[1;33m'
11
+ COLOR_RED='\033[0;31m'
12
+ COLOR_NC='\033[0m'
13
+
14
+ echo -e "${COLOR_CYAN}=== 1. Active Probes Status (Prometheus Instant Query) ===${COLOR_NC}"
15
+ kubectl exec -n "$NAMESPACE" deployment/prometheus -c prometheus -- \
16
+ promtool query instant http://localhost:9090 'probe_success' || true
17
+
18
+ echo -e "\n${COLOR_CYAN}=== 2. Currently Firing Alerts ===${COLOR_NC}"
19
+ kubectl exec -n "$NAMESPACE" deployment/prometheus -c prometheus -- \
20
+ promtool query instant http://localhost:9090 'ALERTS{alertstate="firing"}' || true
21
+
22
+ echo -e "\n${COLOR_CYAN}=== 3. Blackbox Exporter Live Test (${TARGET_URL}) ===${COLOR_NC}"
23
+ ENCODED_URL=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$TARGET_URL', safe=''))" 2>/dev/null || echo "https%3A%2F%2Funderpost.net%2F")
24
+ kubectl get --raw "/api/v1/namespaces/$NAMESPACE/services/blackbox-exporter:9115/proxy/probe?module=http_2xx&target=${ENCODED_URL}" | grep -E "probe_success|probe_http_status_code" || true
25
+
26
+ echo -e "\n${COLOR_CYAN}=== 4. Prometheus Logs (Rule Evaluation & Scraping) ===${COLOR_NC}"
27
+ kubectl logs -n "$NAMESPACE" -l app=prometheus --tail=50 --all-containers=true
28
+
29
+ echo -e "\n${COLOR_CYAN}=== 5. Alertmanager Logs (Notifications & Dispatch) ===${COLOR_NC}"
30
+ kubectl logs -n "$NAMESPACE" -l app=alertmanager --tail=50 --all-containers=true
31
+
32
+ echo -e "\n${COLOR_CYAN}=== 6. Blackbox Exporter Logs (ICMP/HTTP Probes Execution) ===${COLOR_NC}"
33
+ kubectl logs -n "$NAMESPACE" -l app=blackbox-exporter --tail=50 --all-containers=true
34
+
35
+ echo -e "\n${COLOR_CYAN}=== 7. WireGuard Interface Status ===${COLOR_NC}"
36
+ if command -v wg &> /dev/null; then
37
+ echo -e "${COLOR_YELLOW}[Host WireGuard Status]${COLOR_NC}"
38
+ wg show || true
39
+
40
+ echo -e "\n${COLOR_YELLOW}[WireGuard Systemd Services]${COLOR_NC}"
41
+ systemctl list-units --type=service 'wg-quick*' --no-pager || true
42
+ else
43
+ echo -e "${COLOR_YELLOW}'wg' CLI tool is not installed on the host.${COLOR_NC}"
44
+ fi
45
+
46
+ echo -e "\n${COLOR_CYAN}=== 8. Ingress & Gateway Diagnostics ===${COLOR_NC}"
47
+ if kubectl get ns "$ENVOY_NAMESPACE" &>/dev/null; then
48
+ echo -e "${COLOR_YELLOW}[Targeting namespace: ${ENVOY_NAMESPACE}]${COLOR_NC}"
49
+ kubectl get pods -n "$ENVOY_NAMESPACE" || true
50
+ else
51
+ echo -e "${COLOR_YELLOW}[Namespace '${ENVOY_NAMESPACE}' not found. Searching cluster-wide for Ingress/Envoy resources...]${COLOR_NC}"
52
+ kubectl get pods -A -l "app.kubernetes.io/name in (envoy-gateway, envoy, ingress-nginx, ingress)" 2>/dev/null || \
53
+ kubectl get pods -A | grep -E "envoy|ingress|gateway" || true
54
+ fi
55
+
56
+ echo -e "\n${COLOR_GREEN}Done checking cluster monitoring state.${COLOR_NC}"
@@ -50,23 +50,36 @@ fi
50
50
 
51
51
  # ---------------------------------------------------------------------------
52
52
  # System-wide Node.js is required by service units under SELinux.
53
+ #
54
+ # RHEL/Rocky only. An underpost node is an SELinux-Enforcing RHEL host: the storage labeling,
55
+ # the systemd units and the CRI bring-up below are all written against that policy, so a
56
+ # package manager that is merely present is not evidence the rest of this script applies.
57
+ # Commissioning a Debian/Ubuntu machine that is not an underpost node is `underpost baremetal`.
53
58
  # ---------------------------------------------------------------------------
54
- if command -v dnf >/dev/null 2>&1; then
55
- sudo dnf install -y policycoreutils policycoreutils-python-utils selinux-policy-targeted audit
59
+ if ! command -v dnf >/dev/null 2>&1; then
60
+ echo "ERROR: underpost nodes are RHEL/Rocky only; dnf was not found" >&2
61
+ exit 1
56
62
  fi
57
63
 
58
- if ! command -v node >/dev/null 2>&1 || ! node --version 2>/dev/null | grep -q '^v24'; then
64
+ sudo dnf install -y policycoreutils policycoreutils-python-utils selinux-policy-targeted audit rsync
65
+
66
+ # `command -v node` is not the question this step asks: an nvm runtime under $HOME answers it and
67
+ # is exactly what a unit cannot execute. Only a Node 24 at a system path counts.
68
+ system_node_path() {
69
+ local candidate
70
+ for candidate in /usr/bin/node /usr/local/bin/node /bin/node; do
71
+ if [ -x "$candidate" ] && "$candidate" --version 2>/dev/null | grep -q '^v24'; then
72
+ printf '%s' "$candidate"
73
+ return 0
74
+ fi
75
+ done
76
+ return 1
77
+ }
78
+
79
+ if ! system_node_path >/dev/null; then
59
80
  echo "Installing system-wide Node.js 24..."
60
- if command -v dnf >/dev/null 2>&1; then
61
- curl -fsSL https://rpm.nodesource.com/setup_24.x | sudo bash -
62
- sudo dnf install -y nodejs
63
- elif command -v apt-get >/dev/null 2>&1; then
64
- curl -fsSL https://deb.nodesource.com/setup_24.x | sudo bash -
65
- sudo apt-get install -y nodejs
66
- else
67
- echo "ERROR: a supported system package manager is required for Node.js 24" >&2
68
- exit 1
69
- fi
81
+ curl -fsSL https://rpm.nodesource.com/setup_24.x | sudo bash -
82
+ sudo dnf install -y nodejs
70
83
  fi
71
84
 
72
85
  echo "
@@ -84,7 +97,7 @@ cd "$ENGINE_ROOT"
84
97
 
85
98
  # Install JS deps and generate secrets using the local engine entrypoint only.
86
99
  npm install
87
- node bin run secret
100
+ # Cluster Secret administration is a control-plane capability, not part of node bring-up.
88
101
 
89
102
  if [ "$ROLE" = "control" ]; then
90
103
  echo "Installing underpost CLI..."
@@ -148,16 +148,37 @@ fi
148
148
  # ---------------------------------------------------------------------------
149
149
  # 0. Base prerequisites.
150
150
  # ---------------------------------------------------------------------------
151
+ # RHEL/Rocky only. An underpost node is an SELinux-Enforcing RHEL host: the storage labeling, the
152
+ # systemd units and the CRI bring-up below are all written against that policy. Commissioning a
153
+ # Debian/Ubuntu machine that is not an underpost node is `underpost baremetal`.
154
+ if ! command -v dnf >/dev/null 2>&1; then
155
+ echo "ERROR: underpost nodes are RHEL/Rocky only; dnf was not found" >&2
156
+ exit 1
157
+ fi
158
+
151
159
  log "Installing base prerequisites..."
152
- sudo dnf install -y tar xz gzip bzip2 git curl ca-certificates which findutils policycoreutils policycoreutils-python-utils selinux-policy-targeted audit 2>/dev/null \
153
- || dnf install -y tar xz gzip bzip2 git curl ca-certificates which findutils policycoreutils policycoreutils-python-utils selinux-policy-targeted audit
160
+ sudo dnf install -y tar xz gzip bzip2 git curl rsync ca-certificates which findutils policycoreutils policycoreutils-python-utils selinux-policy-targeted audit 2>/dev/null \
161
+ || dnf install -y tar xz gzip bzip2 git curl rsync ca-certificates which findutils policycoreutils policycoreutils-python-utils selinux-policy-targeted audit
154
162
 
155
163
  # ---------------------------------------------------------------------------
156
164
  # 1. System-wide Node.js. Home-directory runtimes cannot be used by hardened
157
165
  # systemd services under SELinux.
158
166
  # ---------------------------------------------------------------------------
159
- if command -v node >/dev/null 2>&1 && node --version 2>/dev/null | grep -q '^v24'; then
160
- log "Node.js $(node --version) already installed"
167
+ # `command -v node` is not the question this step asks: an nvm runtime under $HOME answers it and
168
+ # is exactly what a unit cannot execute. Only a Node 24 at a system path counts.
169
+ system_node_path() {
170
+ local candidate
171
+ for candidate in /usr/bin/node /usr/local/bin/node /bin/node; do
172
+ if [ -x "$candidate" ] && "$candidate" --version 2>/dev/null | grep -q '^v24'; then
173
+ printf '%s' "$candidate"
174
+ return 0
175
+ fi
176
+ done
177
+ return 1
178
+ }
179
+
180
+ if node_path="$(system_node_path)"; then
181
+ log "System-wide Node.js $("$node_path" --version) already installed at $node_path"
161
182
  else
162
183
  log "Installing system-wide Node.js 24..."
163
184
  curl -fsSL https://rpm.nodesource.com/setup_24.x | sudo bash -
@@ -178,7 +199,7 @@ Bringing up underpost kubeadm node (role=$ROLE) from $ENGINE_ROOT
178
199
  # ---------------------------------------------------------------------------
179
200
  # 2. Engine source — required by `node bin cluster` (manifests + CLI).
180
201
  # Normalizes any (custom-named) repo into the canonical paths, mirroring
181
- # src/server/start.js: clone into a temp dir then copy the contents into the
202
+ # src/server/runtime/start.js: clone into a temp dir then copy the contents into the
182
203
  # target, so the working tree is always $ENGINE_ROOT regardless of repo name.
183
204
  # ---------------------------------------------------------------------------
184
205
  command -v git >/dev/null 2>&1 || sudo dnf install -y git
@@ -248,10 +269,8 @@ fi
248
269
 
249
270
  cd "$ENGINE_ROOT"
250
271
 
251
- # Clone + normalize the private secrets repo into $ENGINE_ROOT/engine-private
252
- # (where `node bin run secret` reads engine-private/conf/.../.env.production),
253
- # regardless of the private repo's name. The token is masked in logs and then
254
- # stripped from the saved remote URL.
272
+ # Clone + normalize the private secrets repo into $ENGINE_ROOT/engine-private, regardless of the
273
+ # private repo's name. The token is masked in logs and then stripped from the saved remote URL.
255
274
  if [ -n "$GITHUB_TOKEN" ]; then
256
275
  PRIV_URL="https://${GITHUB_USERNAME:-x-access-token}:${GITHUB_TOKEN}@${ENGINE_PRIVATE_REPO#https://}"
257
276
  if clone_or_pull "$PRIV_URL" "$ENGINE_PRIVATE_BRANCH" "$ENGINE_ROOT/engine-private" "origin" "$GITHUB_TOKEN"; then
@@ -264,10 +283,11 @@ else
264
283
  log "WARNING: GITHUB_TOKEN not provided; engine-private not cloned — secrets will be unavailable"
265
284
  fi
266
285
 
267
- # Install JS deps and generate secrets using the local engine entrypoint.
286
+ # Install JS deps using the local engine entrypoint. Cluster Secret administration is not part of
287
+ # node bring-up: it is a control-plane capability, projected by `cron --setup-start --apply` on the
288
+ # control node. A worker joining the cluster has no business writing cluster-wide Secrets.
268
289
  npm install
269
290
  npm install -g underpost
270
- node bin run secret
271
291
 
272
292
  # ---------------------------------------------------------------------------
273
293
  # 3. Host prerequisites (Docker, CRI-O, kubelet/kubeadm/kubectl, ...) via cluster.js
@@ -18,14 +18,14 @@ cd /home/dd/engine
18
18
  underpost secret underpost --create-from-file /home/dd/engine/engine-private/conf/dd-cron/.env.production
19
19
 
20
20
  # Extract configuration values from secrets
21
- DB_PG_MAAS_USER=$(node bin config get --plain DB_PG_MAAS_USER)
22
- DB_PG_MAAS_PASS=$(node bin config get --plain DB_PG_MAAS_PASS)
23
- DB_PG_MAAS_HOST=$(node bin config get --plain DB_PG_MAAS_HOST)
24
- DB_PG_MAAS_NAME=$(node bin config get --plain DB_PG_MAAS_NAME)
25
-
26
- MAAS_ADMIN_USERNAME=$(node bin config get --plain MAAS_ADMIN_USERNAME)
27
- MAAS_ADMIN_EMAIL=$(node bin config get --plain MAAS_ADMIN_EMAIL)
28
- MAAS_ADMIN_PASS=$(node bin config get --plain MAAS_ADMIN_PASS)
21
+ DB_PG_MAAS_USER=$(node bin host get --plain DB_PG_MAAS_USER)
22
+ DB_PG_MAAS_PASS=$(node bin host get --plain DB_PG_MAAS_PASS)
23
+ DB_PG_MAAS_HOST=$(node bin host get --plain DB_PG_MAAS_HOST)
24
+ DB_PG_MAAS_NAME=$(node bin host get --plain DB_PG_MAAS_NAME)
25
+
26
+ MAAS_ADMIN_USERNAME=$(node bin host get --plain MAAS_ADMIN_USERNAME)
27
+ MAAS_ADMIN_EMAIL=$(node bin host get --plain MAAS_ADMIN_EMAIL)
28
+ MAAS_ADMIN_PASS=$(node bin host get --plain MAAS_ADMIN_PASS)
29
29
 
30
30
  # Initialize MAAS region+rack controller
31
31
  maas init region+rack \