cyberia 3.0.3 → 3.2.5

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 (296) hide show
  1. package/{.env.production → .env.example} +20 -4
  2. package/.github/workflows/engine-cyberia.cd.yml +43 -10
  3. package/.github/workflows/engine-cyberia.ci.yml +48 -26
  4. package/.github/workflows/ghpkg.ci.yml +5 -5
  5. package/.github/workflows/gitlab.ci.yml +1 -1
  6. package/.github/workflows/hardhat.ci.yml +82 -0
  7. package/.github/workflows/npmpkg.ci.yml +60 -14
  8. package/.github/workflows/publish.ci.yml +26 -7
  9. package/.github/workflows/publish.cyberia.ci.yml +5 -5
  10. package/.github/workflows/pwa-microservices-template-page.cd.yml +6 -7
  11. package/.github/workflows/pwa-microservices-template-test.ci.yml +4 -4
  12. package/.github/workflows/release.cd.yml +14 -8
  13. package/.vscode/extensions.json +9 -8
  14. package/.vscode/settings.json +3 -2
  15. package/CHANGELOG.md +643 -1
  16. package/CLI-HELP.md +132 -57
  17. package/Dockerfile +4 -2
  18. package/README.md +347 -22
  19. package/WHITE-PAPER.md +1540 -0
  20. package/bin/build.js +21 -12
  21. package/bin/cyberia.js +2640 -106
  22. package/bin/deploy.js +258 -372
  23. package/bin/file.js +5 -1
  24. package/bin/index.js +2640 -106
  25. package/bin/vs.js +3 -3
  26. package/conf.js +169 -105
  27. package/deployment.yaml +236 -20
  28. package/hardhat/.env.example +31 -0
  29. package/hardhat/README.md +531 -0
  30. package/hardhat/WHITE-PAPER.md +1540 -0
  31. package/hardhat/contracts/ObjectLayerToken.sol +391 -0
  32. package/hardhat/deployments/.gitkeep +0 -0
  33. package/hardhat/deployments/hardhat-ObjectLayerToken.json +11 -0
  34. package/hardhat/hardhat.config.js +136 -0
  35. package/hardhat/ignition/modules/ObjectLayerToken.js +21 -0
  36. package/hardhat/networks/besu-object-layer.network.json +138 -0
  37. package/hardhat/package-lock.json +4323 -0
  38. package/hardhat/package.json +36 -0
  39. package/hardhat/scripts/deployObjectLayerToken.js +98 -0
  40. package/hardhat/test/ObjectLayerToken.js +592 -0
  41. package/hardhat/types/ethers-contracts/ObjectLayerToken.ts +690 -0
  42. package/hardhat/types/ethers-contracts/common.ts +92 -0
  43. package/hardhat/types/ethers-contracts/factories/ObjectLayerToken__factory.ts +1055 -0
  44. package/hardhat/types/ethers-contracts/factories/index.ts +4 -0
  45. package/hardhat/types/ethers-contracts/hardhat.d.ts +47 -0
  46. package/hardhat/types/ethers-contracts/index.ts +6 -0
  47. package/jsdoc.dd-cyberia.json +68 -0
  48. package/jsdoc.json +65 -49
  49. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +5 -4
  50. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +5 -4
  51. package/manifests/deployment/dd-cyberia-development/deployment.yaml +562 -0
  52. package/manifests/deployment/dd-cyberia-development/proxy.yaml +297 -0
  53. package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +132 -0
  54. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  55. package/manifests/deployment/dd-test-development/deployment.yaml +88 -74
  56. package/manifests/deployment/dd-test-development/proxy.yaml +13 -4
  57. package/manifests/deployment/playwright/deployment.yaml +1 -1
  58. package/manifests/pv-pvc-dd.yaml +1 -1
  59. package/nodemon.json +1 -1
  60. package/package.json +60 -48
  61. package/proxy.yaml +118 -10
  62. package/pv-pvc.yaml +132 -0
  63. package/scripts/k3s-node-setup.sh +1 -1
  64. package/scripts/ports-ls.sh +2 -0
  65. package/scripts/rhel-grpc-setup.sh +56 -0
  66. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +47 -1
  67. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +17 -2
  68. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +5 -0
  69. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +80 -7
  70. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +93 -0
  71. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +36 -0
  72. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +29 -0
  73. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +51 -0
  74. package/src/api/cyberia-entity/cyberia-entity.controller.js +74 -0
  75. package/src/api/cyberia-entity/cyberia-entity.model.js +24 -0
  76. package/src/api/cyberia-entity/cyberia-entity.router.js +27 -0
  77. package/src/api/cyberia-entity/cyberia-entity.service.js +42 -0
  78. package/src/api/cyberia-instance/cyberia-fallback-world.js +368 -0
  79. package/src/api/cyberia-instance/cyberia-instance.controller.js +92 -0
  80. package/src/api/cyberia-instance/cyberia-instance.model.js +84 -0
  81. package/src/api/cyberia-instance/cyberia-instance.router.js +63 -0
  82. package/src/api/cyberia-instance/cyberia-instance.service.js +191 -0
  83. package/src/api/cyberia-instance/cyberia-portal-connector.js +486 -0
  84. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +74 -0
  85. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +413 -0
  86. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +228 -0
  87. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +27 -0
  88. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +42 -0
  89. package/src/api/cyberia-map/cyberia-map.controller.js +79 -0
  90. package/src/api/cyberia-map/cyberia-map.model.js +30 -0
  91. package/src/api/cyberia-map/cyberia-map.router.js +40 -0
  92. package/src/api/cyberia-map/cyberia-map.service.js +74 -0
  93. package/src/api/document/document.service.js +1 -1
  94. package/src/api/file/file.controller.js +3 -1
  95. package/src/api/file/file.ref.json +18 -0
  96. package/src/api/file/file.service.js +28 -5
  97. package/src/api/ipfs/ipfs.controller.js +4 -25
  98. package/src/api/ipfs/ipfs.model.js +43 -34
  99. package/src/api/ipfs/ipfs.router.js +8 -13
  100. package/src/api/ipfs/ipfs.service.js +56 -104
  101. package/src/api/object-layer/README.md +347 -22
  102. package/src/api/object-layer/object-layer.controller.js +6 -2
  103. package/src/api/object-layer/object-layer.model.js +12 -8
  104. package/src/api/object-layer/object-layer.router.js +698 -42
  105. package/src/api/object-layer/object-layer.service.js +119 -37
  106. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +1 -2
  107. package/src/api/user/user.router.js +10 -5
  108. package/src/api/user/user.service.js +15 -14
  109. package/src/cli/baremetal.js +6 -10
  110. package/src/cli/cloud-init.js +0 -3
  111. package/src/cli/cluster.js +7 -7
  112. package/src/cli/db.js +723 -857
  113. package/src/cli/deploy.js +215 -105
  114. package/src/cli/env.js +34 -5
  115. package/src/cli/fs.js +5 -4
  116. package/src/cli/image.js +0 -3
  117. package/src/cli/index.js +83 -15
  118. package/src/cli/kubectl.js +211 -0
  119. package/src/cli/monitor.js +5 -6
  120. package/src/cli/release.js +284 -0
  121. package/src/cli/repository.js +708 -62
  122. package/src/cli/run.js +371 -151
  123. package/src/cli/secrets.js +73 -2
  124. package/src/cli/ssh.js +1 -1
  125. package/src/cli/test.js +3 -3
  126. package/src/client/Cryptokoyn.index.js +3 -4
  127. package/src/client/CyberiaPortal.index.js +3 -4
  128. package/src/client/Default.index.js +3 -4
  129. package/src/client/Itemledger.index.js +4 -963
  130. package/src/client/Underpost.index.js +3 -4
  131. package/src/client/components/core/AgGrid.js +20 -5
  132. package/src/client/components/core/Alert.js +2 -2
  133. package/src/client/components/core/AppStore.js +69 -0
  134. package/src/client/components/core/CalendarCore.js +2 -2
  135. package/src/client/components/core/Content.js +22 -3
  136. package/src/client/components/core/Docs.js +30 -6
  137. package/src/client/components/core/DropDown.js +137 -17
  138. package/src/client/components/core/FileExplorer.js +71 -4
  139. package/src/client/components/core/Input.js +1 -1
  140. package/src/client/components/core/Keyboard.js +2 -2
  141. package/src/client/components/core/LogIn.js +2 -2
  142. package/src/client/components/core/LogOut.js +2 -2
  143. package/src/client/components/core/Modal.js +20 -7
  144. package/src/client/components/core/Panel.js +0 -1
  145. package/src/client/components/core/PanelForm.js +19 -19
  146. package/src/client/components/core/RichText.js +1 -2
  147. package/src/client/components/core/SocketIo.js +82 -29
  148. package/src/client/components/core/SocketIoHandler.js +75 -0
  149. package/src/client/components/core/Stream.js +143 -95
  150. package/src/client/components/core/Webhook.js +40 -7
  151. package/src/client/components/cryptokoyn/AppStoreCryptokoyn.js +5 -0
  152. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +3 -3
  153. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +2 -2
  154. package/src/client/components/cryptokoyn/MenuCryptokoyn.js +3 -3
  155. package/src/client/components/cryptokoyn/SocketIoCryptokoyn.js +3 -51
  156. package/src/client/components/cyberia/InstanceEngineCyberia.js +700 -0
  157. package/src/client/components/cyberia/MapEngineCyberia.js +1359 -2
  158. package/src/client/components/cyberia/ObjectLayerEngineModal.js +17 -6
  159. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +92 -54
  160. package/src/client/components/cyberia-portal/AppStoreCyberiaPortal.js +5 -0
  161. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +217 -30
  162. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +44 -2
  163. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +3 -4
  164. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +2 -2
  165. package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +104 -9
  166. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +5 -0
  167. package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +3 -49
  168. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -0
  169. package/src/client/components/default/AppStoreDefault.js +5 -0
  170. package/src/client/components/default/LogInDefault.js +3 -3
  171. package/src/client/components/default/LogOutDefault.js +2 -2
  172. package/src/client/components/default/MenuDefault.js +5 -5
  173. package/src/client/components/default/SocketIoDefault.js +3 -51
  174. package/src/client/components/itemledger/AppStoreItemledger.js +5 -0
  175. package/src/client/components/itemledger/LogInItemledger.js +3 -3
  176. package/src/client/components/itemledger/LogOutItemledger.js +2 -2
  177. package/src/client/components/itemledger/MenuItemledger.js +3 -3
  178. package/src/client/components/itemledger/SocketIoItemledger.js +3 -51
  179. package/src/client/components/underpost/AppStoreUnderpost.js +5 -0
  180. package/src/client/components/underpost/CssUnderpost.js +59 -0
  181. package/src/client/components/underpost/LogInUnderpost.js +6 -3
  182. package/src/client/components/underpost/LogOutUnderpost.js +4 -2
  183. package/src/client/components/underpost/MenuUnderpost.js +104 -18
  184. package/src/client/components/underpost/RoutesUnderpost.js +2 -0
  185. package/src/client/components/underpost/SocketIoUnderpost.js +3 -51
  186. package/src/client/public/cryptokoyn/assets/logo/base-icon.png +0 -0
  187. package/src/client/public/cryptokoyn/browserconfig.xml +12 -0
  188. package/src/client/public/cryptokoyn/microdata.json +85 -0
  189. package/src/client/public/cryptokoyn/site.webmanifest +57 -0
  190. package/src/client/public/cryptokoyn/sitemap +3 -3
  191. package/src/client/public/default/sitemap +3 -3
  192. package/src/client/public/itemledger/browserconfig.xml +2 -2
  193. package/src/client/public/itemledger/manifest.webmanifest +4 -4
  194. package/src/client/public/itemledger/microdata.json +71 -0
  195. package/src/client/public/itemledger/sitemap +3 -3
  196. package/src/client/public/itemledger/yandex-browser-manifest.json +2 -2
  197. package/src/client/public/test/sitemap +3 -3
  198. package/src/client/services/core/core.service.js +20 -8
  199. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +105 -0
  200. package/src/client/services/cyberia-entity/cyberia-entity.management.js +57 -0
  201. package/src/client/services/cyberia-entity/cyberia-entity.service.js +105 -0
  202. package/src/client/services/cyberia-instance/cyberia-instance.management.js +194 -0
  203. package/src/client/services/cyberia-instance/cyberia-instance.service.js +122 -0
  204. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +105 -0
  205. package/src/client/services/cyberia-map/cyberia-map.management.js +193 -0
  206. package/src/client/services/cyberia-map/cyberia-map.service.js +126 -0
  207. package/src/client/services/instance/instance.management.js +2 -2
  208. package/src/client/services/ipfs/ipfs.service.js +3 -23
  209. package/src/client/services/object-layer/object-layer.management.js +3 -3
  210. package/src/client/services/object-layer/object-layer.service.js +21 -0
  211. package/src/client/services/user/user.management.js +2 -2
  212. package/src/client/ssr/body/404.js +15 -11
  213. package/src/client/ssr/body/500.js +15 -11
  214. package/src/client/ssr/body/SwaggerDarkMode.js +285 -0
  215. package/src/client/ssr/head/PwaItemledger.js +60 -0
  216. package/src/client/ssr/offline/NoNetworkConnection.js +11 -10
  217. package/src/client/ssr/pages/CyberiaServerMetrics.js +1 -1
  218. package/src/client/ssr/pages/Test.js +11 -10
  219. package/src/client.build.js +0 -3
  220. package/src/client.dev.js +0 -3
  221. package/src/db/DataBaseProvider.js +17 -2
  222. package/src/db/mariadb/MariaDB.js +14 -9
  223. package/src/db/mongo/MongooseDB.js +17 -1
  224. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +305 -0
  225. package/src/grpc/cyberia/README.md +326 -0
  226. package/src/grpc/cyberia/grpc-server.js +530 -0
  227. package/src/index.js +24 -1
  228. package/src/proxy.js +0 -3
  229. package/src/runtime/express/Dockerfile +4 -0
  230. package/src/runtime/express/Express.js +33 -10
  231. package/src/runtime/lampp/Dockerfile +13 -2
  232. package/src/runtime/lampp/Lampp.js +33 -17
  233. package/src/runtime/wp/Dockerfile +68 -0
  234. package/src/runtime/wp/Wp.js +639 -0
  235. package/src/server/auth.js +36 -15
  236. package/src/server/backup.js +39 -12
  237. package/src/server/besu-genesis-generator.js +1630 -0
  238. package/src/server/client-build-docs.js +133 -17
  239. package/src/server/client-build-live.js +9 -18
  240. package/src/server/client-build.js +229 -101
  241. package/src/server/client-dev-server.js +14 -13
  242. package/src/server/client-formatted.js +109 -57
  243. package/src/server/conf.js +391 -164
  244. package/src/server/cron.js +27 -24
  245. package/src/server/dns.js +29 -12
  246. package/src/server/downloader.js +0 -2
  247. package/src/server/ipfs-client.js +24 -1
  248. package/src/server/logger.js +27 -9
  249. package/src/server/object-layer.js +217 -103
  250. package/src/server/peer.js +8 -2
  251. package/src/server/process.js +1 -50
  252. package/src/server/proxy.js +4 -8
  253. package/src/server/runtime.js +30 -9
  254. package/src/server/semantic-layer-generator-floor.js +359 -0
  255. package/src/server/semantic-layer-generator-skin.js +1294 -0
  256. package/src/server/semantic-layer-generator.js +116 -555
  257. package/src/server/ssr.js +0 -3
  258. package/src/server/start.js +19 -12
  259. package/src/server/tls.js +0 -2
  260. package/src/server.js +0 -4
  261. package/src/ws/IoInterface.js +1 -10
  262. package/src/ws/IoServer.js +14 -33
  263. package/src/ws/core/channels/core.ws.chat.js +65 -20
  264. package/src/ws/core/channels/core.ws.mailer.js +113 -32
  265. package/src/ws/core/channels/core.ws.stream.js +90 -31
  266. package/src/ws/core/core.ws.connection.js +12 -33
  267. package/src/ws/core/core.ws.emit.js +10 -26
  268. package/src/ws/core/core.ws.server.js +25 -58
  269. package/src/ws/default/channels/default.ws.main.js +53 -12
  270. package/src/ws/default/default.ws.connection.js +26 -13
  271. package/src/ws/default/default.ws.server.js +30 -12
  272. package/.env.development +0 -43
  273. package/.env.test +0 -43
  274. package/hardhat/contracts/CryptoKoyn.sol +0 -59
  275. package/hardhat/contracts/ItemLedger.sol +0 -73
  276. package/hardhat/contracts/Lock.sol +0 -34
  277. package/hardhat/hardhat.config.cjs +0 -45
  278. package/hardhat/ignition/modules/Lock.js +0 -18
  279. package/hardhat/networks/cryptokoyn-itemledger.network.json +0 -29
  280. package/hardhat/scripts/deployCryptokoyn.cjs +0 -25
  281. package/hardhat/scripts/deployItemledger.cjs +0 -25
  282. package/hardhat/test/Lock.js +0 -126
  283. package/hardhat/white-paper.md +0 -581
  284. package/src/client/components/cryptokoyn/CommonCryptokoyn.js +0 -29
  285. package/src/client/components/cryptokoyn/ElementsCryptokoyn.js +0 -38
  286. package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +0 -38
  287. package/src/client/components/default/ElementsDefault.js +0 -38
  288. package/src/client/components/itemledger/CommonItemledger.js +0 -29
  289. package/src/client/components/itemledger/ElementsItemledger.js +0 -38
  290. package/src/client/components/underpost/CommonUnderpost.js +0 -29
  291. package/src/client/components/underpost/ElementsUnderpost.js +0 -38
  292. package/src/ws/core/management/core.ws.chat.js +0 -8
  293. package/src/ws/core/management/core.ws.mailer.js +0 -16
  294. package/src/ws/core/management/core.ws.stream.js +0 -8
  295. package/src/ws/default/management/default.ws.main.js +0 -8
  296. package/white-paper.md +0 -581
@@ -8,7 +8,7 @@ import { loggerFactory } from './logger.js';
8
8
  import { shellExec } from './process.js';
9
9
  import fs from 'fs-extra';
10
10
  import Underpost from '../index.js';
11
- import { getUnderpostRootPath } from './conf.js';
11
+ import { getUnderpostRootPath, loadCronDeployEnv } from './conf.js';
12
12
 
13
13
  const logger = loggerFactory(import.meta);
14
14
 
@@ -16,7 +16,7 @@ const volumeHostPath = '/home/dd';
16
16
  const enginePath = '/home/dd/engine';
17
17
  const cronVolumeName = 'underpost-cron-container-volume';
18
18
  const shareEnvVolumeName = 'underpost-share-env';
19
- const underpostContainerEnvPath = '/usr/lib/node_modules/underpost/.env';
19
+ const underpostContainerEnvDir = '/usr/lib/node_modules/underpost';
20
20
 
21
21
  /**
22
22
  * Generates a Kubernetes CronJob YAML manifest string.
@@ -33,7 +33,9 @@ const underpostContainerEnvPath = '/usr/lib/node_modules/underpost/.env';
33
33
  * @param {string} [params.cmd] - Optional pre-script commands to run before cron execution
34
34
  * @param {boolean} [params.suspend=false] - Whether the CronJob is suspended
35
35
  * @param {boolean} [params.dryRun=false] - Pass --dry-run flag to the cron command inside the container
36
- * @param {boolean} [params.ssh=false] - Execute backup commands via SSH on the remote node
36
+ * @param {boolean} [params.k3s=false] - Pass --k3s flag to the cron command inside the container
37
+ * @param {boolean} [params.kind=false] - Pass --kind flag to the cron command inside the container
38
+ * @param {boolean} [params.kubeadm=false] - Pass --kubeadm flag to the cron command inside the container
37
39
  * @returns {string} Kubernetes CronJob YAML manifest
38
40
  * @memberof UnderpostCron
39
41
  */
@@ -49,7 +51,9 @@ const cronJobYamlFactory = ({
49
51
  cmd,
50
52
  suspend = false,
51
53
  dryRun = false,
52
- ssh = false,
54
+ k3s = false,
55
+ kind = false,
56
+ kubeadm = false,
53
57
  }) => {
54
58
  const containerImage = image || `underpost/underpost-engine:${Underpost.version}`;
55
59
 
@@ -60,10 +64,12 @@ const cronJobYamlFactory = ({
60
64
  .replace(/^-|-$/g, '')
61
65
  .substring(0, 52);
62
66
 
63
- const cmdPart = cmd ? `${cmd} && ` : '';
64
- const cronBin = dev ? 'node bin' : 'underpost';
65
- const flags = `${git ? '--git ' : ''}${dev ? '--dev ' : ''}${dryRun ? '--dry-run ' : ''}${ssh ? '--ssh ' : ''}`;
66
- const cronCommand = `${cmdPart}${cronBin} cron ${flags}${deployList} ${jobList}`;
67
+ const cronBin = 'node bin'; // dev ? 'node bin' : 'underpost';
68
+ const flags = `${git ? '--git ' : ''}${dev ? '--dev ' : ''}${dryRun ? '--dry-run ' : ''}${k3s ? '--k3s ' : ''}${kind ? '--kind ' : ''}${kubeadm ? '--kubeadm ' : ''}`;
69
+ const commands = [`cd ${enginePath}`]; // `node bin run secret`
70
+ if (cmd) commands.push(cmd);
71
+ commands.push(`${cronBin} cron ${deployList} ${jobList} ${flags}`);
72
+ const fullCommand = commands.join(' &&\n ');
67
73
 
68
74
  return `apiVersion: batch/v1
69
75
  kind: CronJob
@@ -95,13 +101,12 @@ spec:
95
101
  - /bin/sh
96
102
  - -c
97
103
  - >
98
- ${cronCommand}
104
+ ${fullCommand}
99
105
  volumeMounts:
100
106
  - mountPath: ${enginePath}
101
107
  name: ${cronVolumeName}
102
- - mountPath: ${underpostContainerEnvPath}
108
+ - mountPath: ${underpostContainerEnvDir}
103
109
  name: ${shareEnvVolumeName}
104
- subPath: .env
105
110
  volumes:
106
111
  - hostPath:
107
112
  path: ${enginePath}
@@ -183,7 +188,6 @@ class UnderpostCron {
183
188
  * @param {boolean} [options.kubeadm] - Use kubeadm cluster context (apply directly on host)
184
189
  * @param {boolean} [options.dryRun] - Preview cron jobs without executing them
185
190
  * @param {boolean} [options.createJobNow] - After applying, immediately create a Job from each CronJob (requires --apply)
186
- * @param {boolean} [options.ssh] - Execute backup commands via SSH on the remote node
187
191
  * @memberof UnderpostCron
188
192
  */
189
193
  callback: async function (
@@ -191,6 +195,7 @@ class UnderpostCron {
191
195
  jobList = Object.keys(Underpost.cron.JOB).join(','),
192
196
  options = {},
193
197
  ) {
198
+ loadCronDeployEnv();
194
199
  if (options.setupStart) return await Underpost.cron.setupDeployStart(options.setupStart, options);
195
200
 
196
201
  if (options.generateK8sCronjobs) return await Underpost.cron.generateK8sCronJobs(options);
@@ -226,7 +231,6 @@ class UnderpostCron {
226
231
  * @param {boolean} [options.k3s] - k3s cluster context (apply directly on host)
227
232
  * @param {boolean} [options.kind] - kind cluster context (apply via kind-worker container)
228
233
  * @param {boolean} [options.kubeadm] - kubeadm cluster context (apply directly on host)
229
- * @param {boolean} [options.ssh] - Execute backup commands via SSH on the remote node
230
234
  * @memberof UnderpostCron
231
235
  */
232
236
  setupDeployStart: async function (deployId, options = {}) {
@@ -268,21 +272,19 @@ class UnderpostCron {
268
272
  logger.warn(`package.json not found for deploy-id: ${deployId}`, { path: packageJsonPath });
269
273
  }
270
274
 
271
- // Generate and apply cron job manifests for this deploy-id
272
275
  await Underpost.cron.generateK8sCronJobs({
273
276
  deployId,
274
277
  namespace: options.namespace,
275
278
  image: options.image,
276
279
  apply: options.apply,
277
280
  createJobNow: options.createJobNow,
278
- git: true,
279
- dev: true,
280
- kubeadm: true,
281
- ssh: true,
282
- cmd: ` cd ${enginePath} && node bin env ${deployId} production`,
283
- k3s: false,
284
- kind: false,
285
- dryRun: false,
281
+ git: !!options.git,
282
+ dev: !!options.dev,
283
+ kubeadm: !!options.kubeadm,
284
+ cmd: options.cmd || `node bin env ${deployId} production`,
285
+ k3s: !!options.k3s,
286
+ kind: !!options.kind,
287
+ dryRun: !!options.dryRun,
286
288
  });
287
289
  },
288
290
 
@@ -304,7 +306,6 @@ class UnderpostCron {
304
306
  * @param {boolean} [options.kubeadm=false] - kubeadm cluster context (apply directly on host)
305
307
  * @param {boolean} [options.createJobNow=false] - After applying, create a Job from each CronJob immediately
306
308
  * @param {boolean} [options.dryRun=false] - Pass --dry-run=client to kubectl commands
307
- * @param {boolean} [options.ssh=false] - Execute backup commands via SSH on the remote node
308
309
  * @memberof UnderpostCron
309
310
  */
310
311
  generateK8sCronJobs: async function (options = {}) {
@@ -361,7 +362,9 @@ class UnderpostCron {
361
362
  cmd: options.cmd,
362
363
  suspend: false,
363
364
  dryRun: !!options.dryRun,
364
- ssh: !!options.ssh,
365
+ k3s: !!options.k3s,
366
+ kind: !!options.kind,
367
+ kubeadm: !!options.kubeadm,
365
368
  });
366
369
 
367
370
  const yamlFilePath = `${outputDir}/${cronJobName}.yaml`;
package/src/server/dns.js CHANGED
@@ -5,7 +5,6 @@
5
5
  * @namespace UnderpostDns
6
6
  */
7
7
  import axios from 'axios';
8
- import dotenv from 'dotenv';
9
8
  import fs from 'fs';
10
9
  import validator from 'validator';
11
10
  import { loggerFactory } from './logger.js';
@@ -13,11 +12,9 @@ import dns from 'node:dns';
13
12
  import os from 'node:os';
14
13
  import { shellExec, pbcopy } from './process.js';
15
14
  import Underpost from '../index.js';
16
- import { writeEnv } from './conf.js';
15
+ import { writeEnv, readConfJson, loadCronDeployEnv } from './conf.js';
17
16
  import { resolveDeployId } from './cron.js';
18
17
 
19
- dotenv.config();
20
-
21
18
  const logger = loggerFactory(import.meta);
22
19
 
23
20
  /**
@@ -268,6 +265,8 @@ class Dns {
268
265
  * @returns {Promise<void>}
269
266
  */
270
267
  static async callback(deployList) {
268
+ // loadCronDeployEnv();
269
+
271
270
  const isOnline = await Dns.isInternetConnection();
272
271
 
273
272
  if (!isOnline) return;
@@ -288,16 +287,15 @@ class Dns {
288
287
 
289
288
  for (const _deployId of deployList.split(',')) {
290
289
  const deployId = _deployId.trim();
291
- const privateCronConfPath = `./engine-private/conf/${deployId}/conf.cron.json`;
292
- const confCronPath = fs.existsSync(privateCronConfPath) ? privateCronConfPath : './conf/conf.cron.json';
293
290
 
294
- if (!fs.existsSync(confCronPath)) {
295
- logger.warn(`Cron config file not found for deployId: ${deployId} at ${confCronPath}`);
291
+ let confCronData;
292
+ try {
293
+ confCronData = readConfJson(deployId, 'cron', { resolve: true });
294
+ } catch (error) {
295
+ logger.warn(`Cron config file not found for deployId: ${deployId}`, { message: error.message });
296
296
  continue;
297
297
  }
298
298
 
299
- const confCronData = JSON.parse(fs.readFileSync(confCronPath, 'utf8'));
300
-
301
299
  if (!confCronData.records) {
302
300
  logger.warn(`'records' field missing in cron config for deployId: ${deployId}`);
303
301
  continue;
@@ -365,8 +363,26 @@ class Dns {
365
363
  */
366
364
  dondominio: (options) => {
367
365
  const { user, api_key, host, dns, ip } = options;
366
+
367
+ // Validate that required credentials are present before making any request
368
+ if (!user || !api_key) {
369
+ logger.error(
370
+ `${dns} update aborted: missing credentials. ` +
371
+ `Ensure DDNS_USER and DDNS_API_KEY environment variables are set ` +
372
+ `or provide 'user' and 'api_key' in cron records configuration.`,
373
+ { host, hasUser: !!user, hasApiKey: !!api_key },
374
+ );
375
+ return Promise.resolve(false);
376
+ }
377
+
378
+ if (!host) {
379
+ logger.error(`${dns} update aborted: missing host. Set DDNS_HOST or provide 'host' in cron records.`);
380
+ return Promise.resolve(false);
381
+ }
382
+
368
383
  const url = `https://dondns.dondominio.com/json/?user=${user}&password=${api_key}&host=${host}&ip=${ip}`;
369
- logger.info(`${dns} update ip url`, url);
384
+ // Log the update attempt without exposing the full URL containing credentials
385
+ logger.info(`${dns} update ip request`, { host, ip });
370
386
 
371
387
  // Prevent live IP update in non-production environments
372
388
  if (process.env.NODE_ENV !== 'production') {
@@ -382,7 +398,8 @@ class Dns {
382
398
  return resolve(true);
383
399
  })
384
400
  .catch((error) => {
385
- logger.error(error, `${dns} update ip error: ${error.message}`);
401
+ // Only log the error message the full error object contains the request URL with credentials
402
+ logger.error(`${dns} update ip error`, { message: error.message, host, ip });
386
403
  return resolve(false);
387
404
  });
388
405
  });
@@ -7,8 +7,6 @@
7
7
  import axios from 'axios';
8
8
  import fs from 'fs';
9
9
  import { loggerFactory } from './logger.js';
10
- import dotenv from 'dotenv';
11
- dotenv.config();
12
10
 
13
11
  const logger = loggerFactory(import.meta);
14
12
 
@@ -244,7 +244,11 @@ const unpinCid = async (cid) => {
244
244
  });
245
245
  if (!clusterRes.ok) {
246
246
  const text = await clusterRes.text();
247
- logger.warn(`IPFS Cluster unpin failed (${clusterRes.status}): ${text}`);
247
+ if (clusterRes.status === 404) {
248
+ logger.info(`IPFS Cluster unpin – CID already not pinned: ${cid}`);
249
+ } else {
250
+ logger.warn(`IPFS Cluster unpin failed (${clusterRes.status}): ${text}`);
251
+ }
248
252
  } else {
249
253
  logger.info(`IPFS Cluster unpin OK – CID: ${cid}`);
250
254
  }
@@ -428,6 +432,25 @@ const IpfsClient = {
428
432
  listClusterPins,
429
433
  listKuboPins,
430
434
  removeMfsPath,
435
+ /**
436
+ * Check whether a single CID is currently pinned on the local Kubo node.
437
+ * Uses the pin/ls?arg=<cid> endpoint which returns only that one pin
438
+ * (much cheaper than fetching the full list).
439
+ *
440
+ * @param {string} cid - IPFS Content Identifier to check.
441
+ * @returns {Promise<boolean>} true when the CID is pinned.
442
+ */
443
+ isCidPinned: async (cid) => {
444
+ const kuboUrl = getIpfsApiUrl();
445
+ try {
446
+ const res = await fetch(`${kuboUrl}/api/v0/pin/ls?arg=${encodeURIComponent(cid)}&type=all`, { method: 'POST' });
447
+ if (!res.ok) return false;
448
+ const json = await res.json();
449
+ return !!(json.Keys && json.Keys[cid]);
450
+ } catch {
451
+ return false;
452
+ }
453
+ },
431
454
  };
432
455
 
433
456
  export { IpfsClient };
@@ -6,16 +6,14 @@
6
6
 
7
7
  'use strict';
8
8
 
9
- import dotenv from 'dotenv';
10
9
  import winston from 'winston';
11
10
  import morgan from 'morgan';
12
- import colorize from 'json-colorizer';
11
+ import { colorize, color } from 'json-colorizer';
13
12
  import colors from 'colors';
14
13
  import v8 from 'v8';
15
14
  import { clearTerminalStringColor, formatBytes } from '../client/components/core/CommonJs.js';
16
15
 
17
16
  colors.enable();
18
- dotenv.config();
19
17
 
20
18
  // Define your severity levels.
21
19
  // With them, You can create log files,
@@ -60,14 +58,34 @@ const format = (meta) =>
60
58
  winston.format.colorize({ all: true }),
61
59
  // Define the format of the message showing the timestamp, the level and the message
62
60
  winston.format.printf((info) => {
63
- const symbols = Object.getOwnPropertySymbols(info);
61
+ const splatKey = Symbol.for('splat');
62
+ const splat = info[splatKey];
63
+ const hasSplat = Array.isArray(splat) && splat.length > 0 && splat[0] !== undefined;
64
+ let splatStr = '';
65
+ if (hasSplat) {
66
+ const seen = new WeakSet();
67
+ splatStr = JSON.stringify(
68
+ splat[0],
69
+ (key, value) => {
70
+ if (typeof value === 'function') return `[Function: ${value.name || 'anonymous'}]`;
71
+ if (typeof value === 'object' && value !== null) {
72
+ if (seen.has(value)) return '[Circular]';
73
+ seen.add(value);
74
+ }
75
+ return value;
76
+ },
77
+ 4,
78
+ );
79
+ }
64
80
  return `${`[${meta}]`.green} ${info.timestamp} ${info.level} ${
65
- symbols[1]
66
- ? `${clearTerminalStringColor(info.message)}: ${colorize(JSON.stringify(info[symbols[1]][0], null, 4), {
81
+ hasSplat
82
+ ? `${clearTerminalStringColor(info.message)}: ${colorize(splatStr, {
67
83
  colors: {
68
- STRING_KEY: 'green',
69
- STRING_LITERAL: 'magenta.bold',
70
- NUMBER_LITERAL: '#FF0000',
84
+ StringKey: color.green,
85
+ StringLiteral: color.magenta,
86
+ NumberLiteral: color.red,
87
+ BooleanLiteral: color.cyan,
88
+ NullLiteral: color.white,
71
89
  },
72
90
  })}`
73
91
  : info.message