@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
@@ -11,4 +11,9 @@ spec:
11
11
  selector:
12
12
  app: grafana
13
13
  sessionAffinity: None
14
- type: LoadBalancer
14
+ # ClusterIP: this Service is what Prometheus' provisioned datasource and the
15
+ # edge route resolve. Browser access is a separate decision, published by
16
+ # `monitor --grafana-host` (edge route) or `--node-port` (LAN), so a cluster
17
+ # with no LoadBalancer controller does not sit on a Service that never gets an
18
+ # address.
19
+ type: ClusterIP
@@ -10,3 +10,4 @@ spec:
10
10
  - ReadWriteOnce
11
11
  hostPath:
12
12
  path: /data/mariadb
13
+ type: DirectoryOrCreate
@@ -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.2.90",
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.2.90",
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,64 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ SINCE="recent"
5
+ FAIL_ON_AVC="1"
6
+
7
+ while [ "$#" -gt 0 ]; do
8
+ case "$1" in
9
+ --since)
10
+ [ "$#" -ge 2 ] || { echo "--since requires an ausearch time value" >&2; exit 2; }
11
+ SINCE="$2"
12
+ shift 2
13
+ ;;
14
+ --no-fail)
15
+ FAIL_ON_AVC="0"
16
+ shift
17
+ ;;
18
+ -h|--help)
19
+ echo "Usage: $0 [--since recent|today|boot|TIME] [--no-fail]"
20
+ exit 0
21
+ ;;
22
+ *)
23
+ echo "Unknown option: $1" >&2
24
+ exit 2
25
+ ;;
26
+ esac
27
+ done
28
+
29
+ command -v getenforce >/dev/null 2>&1 || {
30
+ echo "SELinux userspace is unavailable. Install policycoreutils." >&2
31
+ exit 2
32
+ }
33
+ command -v ausearch >/dev/null 2>&1 || {
34
+ echo "ausearch is unavailable. Install audit and start auditd." >&2
35
+ exit 2
36
+ }
37
+
38
+ MODE="$(getenforce)"
39
+ echo "SELinux mode: $MODE"
40
+ [ "$MODE" = "Enforcing" ] || echo "WARNING: expected Enforcing mode" >&2
41
+ command -v sestatus >/dev/null 2>&1 && sestatus
42
+
43
+ AUDIT=(ausearch)
44
+ [ "$(id -u)" -eq 0 ] || AUDIT=(sudo ausearch)
45
+ RAW_FILE="$(mktemp /tmp/underpost-selinux-avc.XXXXXX)"
46
+ trap 'rm -f "$RAW_FILE"' EXIT
47
+
48
+ "${AUDIT[@]}" -m AVC,USER_AVC,SELINUX_ERR -ts "$SINCE" --raw > "$RAW_FILE" 2>/dev/null || true
49
+ if ! grep -q '^type=' "$RAW_FILE"; then
50
+ echo "No SELinux AVC denials found since: $SINCE"
51
+ [ "$MODE" = "Enforcing" ]
52
+ exit
53
+ fi
54
+
55
+ echo "SELinux AVC denials found since: $SINCE" >&2
56
+ "${AUDIT[@]}" -m AVC,USER_AVC,SELINUX_ERR -ts "$SINCE" -i || true
57
+ if command -v sealert >/dev/null 2>&1; then
58
+ echo "sealert analysis:"
59
+ sealert -a "$RAW_FILE" || true
60
+ else
61
+ echo "Install setroubleshoot-server for sealert analysis." >&2
62
+ fi
63
+
64
+ [ "$FAIL_ON_AVC" = "0" ] || exit 1
@@ -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}"
File without changes
File without changes
@@ -49,22 +49,38 @@ if [ -z "$(ls -A "$ENGINE_ROOT")" ]; then
49
49
  fi
50
50
 
51
51
  # ---------------------------------------------------------------------------
52
- # NVM and Node.js required for `node bin ...` entrypoints
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
- echo "Installing NVM and Node.js v24.15.0..."
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
62
+ fi
55
63
 
56
- curl -o- https://cdn.jsdelivr.net/gh/nvm-sh/nvm@v0.40.1/install.sh | bash
64
+ sudo dnf install -y policycoreutils policycoreutils-python-utils selinux-policy-targeted audit rsync
57
65
 
58
- export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
59
- # shellcheck disable=SC1090
60
- [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
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
+ }
61
78
 
62
- nvm install 24.15.0
63
- nvm use 24.15.0
64
- nvm alias default 24.15.0
65
- ln -sf "$(command -v node)" /usr/local/bin/node
66
- ln -sf "$(command -v npm)" /usr/local/bin/npm
67
- ln -sf "$(command -v npx)" /usr/local/bin/npx
79
+ if ! system_node_path >/dev/null; then
80
+ echo "Installing system-wide Node.js 24..."
81
+ curl -fsSL https://rpm.nodesource.com/setup_24.x | sudo bash -
82
+ sudo dnf install -y nodejs
83
+ fi
68
84
 
69
85
  echo "
70
86
  ██╗░░░██╗███╗░░██╗██████╗░███████╗██████╗░██████╗░░█████╗░░██████╗████████╗
@@ -81,7 +97,7 @@ cd "$ENGINE_ROOT"
81
97
 
82
98
  # Install JS deps and generate secrets using the local engine entrypoint only.
83
99
  npm install
84
- node bin run secret
100
+ # Cluster Secret administration is a control-plane capability, not part of node bring-up.
85
101
 
86
102
  if [ "$ROLE" = "control" ]; then
87
103
  echo "Installing underpost CLI..."
@@ -116,7 +132,7 @@ if [ "$ROLE" = "control" ]; then
116
132
  curl -sfL https://get.k3s.io | \
117
133
  K3S_URL="https://${CONTROL_IP}:6443" \
118
134
  K3S_TOKEN="${K3S_TOKEN}" \
119
- sh -s - agent
135
+ sh -s - agent $(if command -v selinuxenabled >/dev/null 2>&1 && selinuxenabled; then printf '%s' '--selinux'; fi)
120
136
 
121
137
  echo ""
122
138
  echo "K3s worker joined https://${CONTROL_IP}:6443 successfully."
@@ -5,8 +5,8 @@ set -euo pipefail
5
5
  # Underpost Kubeadm Node Setup (bare-metal physical node)
6
6
  #
7
7
  # Mirrors scripts/k3s-node-setup.sh but for kubeadm on real hardware: it runs on
8
- # the freshly deployed OS (disk-installed Rocky) after first boot, installs NVM +
9
- # Node.js, ensures the engine source is present, and drives the cluster bring-up
8
+ # the freshly deployed OS (disk-installed Rocky) after first boot, installs
9
+ # system-wide Node.js, ensures the engine source is present, and drives the cluster bring-up
10
10
  # through the local engine entrypoint `node bin cluster` (src/cli/cluster.js) —
11
11
  # reusing its kubeadm + Contour + host-init logic instead of reimplementing it.
12
12
  #
@@ -146,33 +146,43 @@ if [ "$JOIN_ONLY" = "1" ]; then
146
146
  fi
147
147
 
148
148
  # ---------------------------------------------------------------------------
149
- # 0. Base prerequisites — a minimal @core Rocky install lacks tar/xz/git, which
150
- # NVM needs to extract Node.js and the engine clone needs. Install them first.
149
+ # 0. Base prerequisites.
151
150
  # ---------------------------------------------------------------------------
152
- log "Installing base prerequisites (tar, xz, gzip, git, curl)..."
153
- sudo dnf install -y tar xz gzip bzip2 git curl ca-certificates which findutils 2>/dev/null \
154
- || dnf install -y tar xz gzip bzip2 git curl ca-certificates which findutils
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
+
159
+ log "Installing base prerequisites..."
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
155
162
 
156
163
  # ---------------------------------------------------------------------------
157
- # 1. NVM and Node.js required for the `node bin ...` entrypoints. Idempotent so
158
- # a retried run does not reinstall Node from scratch.
164
+ # 1. System-wide Node.js. Home-directory runtimes cannot be used by hardened
165
+ # systemd services under SELinux.
159
166
  # ---------------------------------------------------------------------------
160
- if command -v node >/dev/null 2>&1 && node --version 2>/dev/null | grep -q '^v24'; then
161
- log "Node.js $(node --version) already installed; skipping NVM setup"
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"
162
182
  else
163
- log "Installing NVM and Node.js v24.15.0..."
164
- curl -o- https://cdn.jsdelivr.net/gh/nvm-sh/nvm@v0.40.1/install.sh | bash
165
-
166
- export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
167
- # shellcheck disable=SC1090
168
- [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
169
-
170
- nvm install 24.15.0
171
- nvm use 24.15.0
172
- nvm alias default 24.15.0
173
- ln -sf "$(command -v node)" /usr/local/bin/node
174
- ln -sf "$(command -v npm)" /usr/local/bin/npm
175
- ln -sf "$(command -v npx)" /usr/local/bin/npx
183
+ log "Installing system-wide Node.js 24..."
184
+ curl -fsSL https://rpm.nodesource.com/setup_24.x | sudo bash -
185
+ sudo dnf install -y nodejs
176
186
  fi
177
187
 
178
188
  echo "
@@ -189,7 +199,7 @@ Bringing up underpost kubeadm node (role=$ROLE) from $ENGINE_ROOT
189
199
  # ---------------------------------------------------------------------------
190
200
  # 2. Engine source — required by `node bin cluster` (manifests + CLI).
191
201
  # Normalizes any (custom-named) repo into the canonical paths, mirroring
192
- # 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
193
203
  # target, so the working tree is always $ENGINE_ROOT regardless of repo name.
194
204
  # ---------------------------------------------------------------------------
195
205
  command -v git >/dev/null 2>&1 || sudo dnf install -y git
@@ -259,10 +269,8 @@ fi
259
269
 
260
270
  cd "$ENGINE_ROOT"
261
271
 
262
- # Clone + normalize the private secrets repo into $ENGINE_ROOT/engine-private
263
- # (where `node bin run secret` reads engine-private/conf/.../.env.production),
264
- # regardless of the private repo's name. The token is masked in logs and then
265
- # 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.
266
274
  if [ -n "$GITHUB_TOKEN" ]; then
267
275
  PRIV_URL="https://${GITHUB_USERNAME:-x-access-token}:${GITHUB_TOKEN}@${ENGINE_PRIVATE_REPO#https://}"
268
276
  if clone_or_pull "$PRIV_URL" "$ENGINE_PRIVATE_BRANCH" "$ENGINE_ROOT/engine-private" "origin" "$GITHUB_TOKEN"; then
@@ -275,10 +283,11 @@ else
275
283
  log "WARNING: GITHUB_TOKEN not provided; engine-private not cloned — secrets will be unavailable"
276
284
  fi
277
285
 
278
- # 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.
279
289
  npm install
280
290
  npm install -g underpost
281
- node bin run secret
282
291
 
283
292
  # ---------------------------------------------------------------------------
284
293
  # 3. Host prerequisites (Docker, CRI-O, kubelet/kubeadm/kubectl, ...) via cluster.js
File without changes
File without changes