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
@@ -79,6 +79,7 @@ class ExpressService {
79
79
  peer,
80
80
  valkey,
81
81
  apiBaseHost,
82
+ grpc,
82
83
  redirectTarget,
83
84
  rootHostPath,
84
85
  confSSR,
@@ -135,7 +136,17 @@ class ExpressService {
135
136
  });
136
137
 
137
138
  // Static file serving
138
- app.use('/', express.static(directory ? directory : `.${rootHostPath}`));
139
+ app.use(
140
+ '/',
141
+ express.static(directory ? directory : `.${rootHostPath}`, {
142
+ setHeaders: (res, filePath) => {
143
+ if (filePath.includes('/assets/')) {
144
+ res.set('Access-Control-Allow-Origin', '*');
145
+ res.set('Cross-Origin-Resource-Policy', 'cross-origin');
146
+ }
147
+ },
148
+ }),
149
+ );
139
150
 
140
151
  // Handle redirection-only instances
141
152
  if (redirect) {
@@ -165,14 +176,7 @@ class ExpressService {
165
176
  });
166
177
  }
167
178
 
168
- // Swagger UI setup
169
- if (fs.existsSync(swaggerJsonPath)) {
170
- const swaggerDoc = JSON.parse(fs.readFileSync(swaggerJsonPath, 'utf8'));
171
- const swaggerUiOptions = await buildSwaggerUiOptions();
172
- app.use(swaggerPath, swaggerUi.serve, swaggerUi.setup(swaggerDoc, swaggerUiOptions));
173
- }
174
-
175
- // Security and CORS
179
+ // Security and CORS — must run before swagger-ui so CSP headers are included in swagger responses
176
180
  if (process.env.NODE_ENV === 'development' && useLocalSsl)
177
181
  origins = origins.map((origin) => origin.replace('http', 'https'));
178
182
 
@@ -180,6 +184,13 @@ class ExpressService {
180
184
  origin: origins,
181
185
  });
182
186
 
187
+ // Swagger UI setup (after security middleware so responses carry correct CSP headers)
188
+ if (fs.existsSync(swaggerJsonPath)) {
189
+ const swaggerDoc = JSON.parse(fs.readFileSync(swaggerJsonPath, 'utf8'));
190
+ const swaggerUiOptions = await buildSwaggerUiOptions();
191
+ app.use(swaggerPath, swaggerUi.serve, swaggerUi.setup(swaggerDoc, swaggerUiOptions));
192
+ }
193
+
183
194
  // Database and Valkey connections
184
195
  if (db && apis) await DataBaseProvider.load({ apis, host, path, db });
185
196
 
@@ -198,6 +209,12 @@ class ExpressService {
198
209
  });
199
210
  }
200
211
 
212
+ // gRPC server
213
+ if (path === '/' && grpc && grpc.module) {
214
+ const { GrpcServer } = await import(`../../grpc/${grpc.module}/grpc-server.js`);
215
+ await GrpcServer.start({ host, path, port: grpc.port || 50051 });
216
+ }
217
+
201
218
  // API router loading
202
219
  if (apis && apis.length > 0) {
203
220
  const authMiddleware = authMiddlewareFactory({ host, path });
@@ -249,7 +266,13 @@ class ExpressService {
249
266
  for (const [_, ssrMiddleware] of Object.entries(ssr)) app.use(ssrMiddleware);
250
267
 
251
268
  // Start listening on the main port
252
- if (useLocalSsl && process.env.NODE_ENV === 'development') {
269
+ // When behind a dev proxy (isDevProxyContext), the proxy handles TLS termination,
270
+ // so backend servers should listen on plain HTTP to be reachable via http://localhost:PORT
271
+ if (
272
+ (useLocalSsl || process.argv.find((arg) => arg === 'tls')) &&
273
+ process.env.NODE_ENV === 'development' &&
274
+ !isDevProxyContext()
275
+ ) {
253
276
  if (!Underpost.tls.validateSecureContext()) shellExec(`node bin/deploy tls`);
254
277
  const { ServerSSL } = await Underpost.tls.createSslServer(app);
255
278
  await Underpost.start.listenPortController(ServerSSL, port, runningData);
@@ -20,8 +20,8 @@ RUN dnf -y update && \
20
20
  perl && \
21
21
  dnf clean all
22
22
 
23
- # --- Download and install XAMPP
24
- RUN curl -L -o /tmp/xampp-linux-installer.run "https://sourceforge.net/projects/xampp/files/XAMPP%20Linux/7.4.33/xampp-linux-x64-7.4.33-0-installer.run" && \
23
+ # --- Download and install XAMPP (PHP 8.2)
24
+ RUN curl -L -o /tmp/xampp-linux-installer.run "https://sourceforge.net/projects/xampp/files/XAMPP%20Linux/8.2.12/xampp-linux-x64-8.2.12-0-installer.run" && \
25
25
  chmod +x /tmp/xampp-linux-installer.run && \
26
26
  bash -c "/tmp/xampp-linux-installer.run --mode unattended" && \
27
27
  ln -sf /opt/lampp/lampp /usr/bin/lampp
@@ -31,6 +31,13 @@ RUN mkdir -p /opt/lampp/htdocs && \
31
31
  chown -R root:root /opt/lampp/htdocs && \
32
32
  chmod -R a+rX /opt/lampp/htdocs
33
33
 
34
+ # Add XAMPP binaries and /usr/local/bin to PATH for all shells
35
+ ENV PATH="/opt/lampp/bin:/usr/local/bin:${PATH}"
36
+ RUN echo 'export PATH="/opt/lampp/bin:/usr/local/bin:${PATH}"' > /etc/profile.d/lampp.sh
37
+
38
+ # Provide a no-op sendmail so PHP plugins don't error on mail calls
39
+ RUN printf '#!/bin/sh\ncat > /dev/null\n' > /usr/sbin/sendmail && chmod +x /usr/sbin/sendmail
40
+
34
41
  # Install Node.js
35
42
  RUN curl -fsSL https://rpm.nodesource.com/setup_24.x | bash -
36
43
  RUN dnf install nodejs -y
@@ -40,6 +47,10 @@ RUN dnf clean all
40
47
  RUN node --version
41
48
  RUN npm --version
42
49
 
50
+ # Create non-root user for secure container execution (cron jobs, init containers)
51
+ # Deployment containers override to root via securityContext when npm install -g is needed
52
+ RUN useradd -m -u 1000 -s /bin/bash dd
53
+
43
54
  # Set working directory
44
55
  WORKDIR /home/dd
45
56
 
@@ -21,11 +21,11 @@ const logger = loggerFactory(import.meta);
21
21
  class LamppService {
22
22
  /**
23
23
  * @method
24
- * @type {string | undefined}
24
+ * @type {string}
25
25
  * @description Stores the accumulated Apache virtual host configuration (router definition).
26
26
  * @memberof LamppService
27
27
  */
28
- router;
28
+ router = '';
29
29
 
30
30
  /**
31
31
  * @public
@@ -42,7 +42,7 @@ class LamppService {
42
42
  * @memberof LamppService
43
43
  */
44
44
  constructor() {
45
- this.router = undefined;
45
+ this.router = '';
46
46
  this.ports = [];
47
47
  }
48
48
 
@@ -125,7 +125,6 @@ class LamppService {
125
125
 
126
126
  // 6. Start the service
127
127
  cmd = `sudo /opt/lampp/lampp start`;
128
- if (this.router) fs.writeFileSync(`./tmp/lampp-router.conf`, this.router, 'utf-8');
129
128
  shellExec(cmd);
130
129
  }
131
130
 
@@ -139,13 +138,7 @@ class LamppService {
139
138
  * @memberof LamppService
140
139
  */
141
140
  appendRouter(render) {
142
- if (!this.router) {
143
- if (fs.existsSync(`./tmp/lampp-router.conf`)) {
144
- this.router = fs.readFileSync(`./tmp/lampp-router.conf`, 'utf-8');
145
- return this.router + render;
146
- }
147
- return (this.router = render);
148
- }
141
+ if (!this.router) return (this.router = render);
149
142
  return (this.router += render);
150
143
  }
151
144
 
@@ -154,10 +147,10 @@ class LamppService {
154
147
  *
155
148
  * @memberof LamppService
156
149
  * @returns {void}
150
+ * @method removeRouter
157
151
  */
158
152
  removeRouter() {
159
- this.router = undefined;
160
- if (fs.existsSync(`./tmp/lampp-router.conf`)) fs.rmSync(`./tmp/lampp-router.conf`);
153
+ this.router = '';
161
154
  }
162
155
 
163
156
  /**
@@ -176,9 +169,9 @@ class LamppService {
176
169
  shellCd(`./engine-private/setup`);
177
170
 
178
171
  if (!process.argv.includes(`server`)) {
179
- // Download and run the XAMPP installer
172
+ // Download and run the XAMPP installer (PHP 8.2)
180
173
  shellExec(
181
- `curl -Lo xampp-linux-installer.run https://sourceforge.net/projects/xampp/files/XAMPP%20Linux/7.4.30/xampp-linux-x64-7.4.30-1-installer.run?from_af=true`,
174
+ `curl -Lo xampp-linux-installer.run https://sourceforge.net/projects/xampp/files/XAMPP%20Linux/8.2.12/xampp-linux-x64-8.2.12-0-installer.run`,
182
175
  );
183
176
  shellExec(`sudo chmod +x xampp-linux-installer.run`);
184
177
  shellExec(
@@ -244,14 +237,37 @@ Listen ${port}
244
237
 
245
238
  <VirtualHost *:${port}>
246
239
  DocumentRoot "${documentRoot}"
247
- ServerName ${host}:${port}
240
+ ServerName ${host}
241
+ UseCanonicalName Off
242
+ ServerSignature Off
248
243
 
249
244
  <Directory "${documentRoot}">
250
- Options Indexes FollowSymLinks MultiViews
245
+ Options FollowSymLinks MultiViews
251
246
  AllowOverride All
252
247
  Require all granted
253
248
  </Directory>
254
249
 
250
+ # Block access to .git directories and files
251
+ RedirectMatch 404 /\\.git
252
+
253
+ # Block access to hidden dotfiles (.env, .htpasswd, etc.)
254
+ <FilesMatch "^\\.(env|htpasswd|htaccess\\.bak|DS_Store)">
255
+ Require all denied
256
+ </FilesMatch>
257
+
258
+ # Block access to sensitive engine files
259
+ <FilesMatch "(wp-config\\.php\\.bak|wp-config-sample\\.php|\\.sql|\\.sql\\.gz)$">
260
+ Require all denied
261
+ </FilesMatch>
262
+
263
+ # Security headers
264
+ <IfModule mod_headers.c>
265
+ Header always set X-Content-Type-Options "nosniff"
266
+ Header always set X-Frame-Options "SAMEORIGIN"
267
+ Header always set Referrer-Policy "strict-origin-when-cross-origin"
268
+ Header always unset X-Powered-By
269
+ </IfModule>
270
+
255
271
  ${
256
272
  redirect
257
273
  ? `
@@ -0,0 +1,68 @@
1
+ FROM rockylinux:9
2
+
3
+ # Update and install required packages
4
+ RUN dnf -y update && \
5
+ dnf -y install epel-release && \
6
+ dnf -y install --allowerasing \
7
+ bzip2 \
8
+ sudo \
9
+ curl \
10
+ unzip \
11
+ net-tools \
12
+ openssh-server \
13
+ nano \
14
+ vim-enhanced \
15
+ less \
16
+ openssl-devel \
17
+ wget \
18
+ git \
19
+ gnupg2 \
20
+ libnsl \
21
+ perl && \
22
+ dnf clean all
23
+
24
+ # --- Download and install XAMPP (PHP 8.2)
25
+ RUN curl -L -o /tmp/xampp-linux-installer.run "https://sourceforge.net/projects/xampp/files/XAMPP%20Linux/8.2.12/xampp-linux-x64-8.2.12-0-installer.run" && \
26
+ chmod +x /tmp/xampp-linux-installer.run && \
27
+ bash -c "/tmp/xampp-linux-installer.run --mode unattended" && \
28
+ ln -sf /opt/lampp/lampp /usr/bin/lampp
29
+
30
+ # --- Create /xampp/htdocs (static root) and set permissions
31
+ RUN mkdir -p /opt/lampp/htdocs && \
32
+ chown -R root:root /opt/lampp/htdocs && \
33
+ chmod -R a+rX /opt/lampp/htdocs
34
+
35
+ # Add XAMPP binaries and /usr/local/bin to PATH for all shells
36
+ ENV PATH="/opt/lampp/bin:/usr/local/bin:${PATH}"
37
+ RUN echo 'export PATH="/opt/lampp/bin:/usr/local/bin:${PATH}"' > /etc/profile.d/lampp.sh
38
+
39
+ # Provide a no-op sendmail so WP plugins don't error on mail calls
40
+ RUN printf '#!/bin/sh\ncat > /dev/null\n' > /usr/sbin/sendmail && chmod +x /usr/sbin/sendmail
41
+
42
+ # Install WP-CLI
43
+ RUN curl -sL https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar -o /usr/local/bin/wp && \
44
+ chmod +x /usr/local/bin/wp && \
45
+ wp --info --allow-root
46
+
47
+ # Install Node.js
48
+ RUN curl -fsSL https://rpm.nodesource.com/setup_24.x | bash -
49
+ RUN dnf install nodejs -y
50
+ RUN dnf clean all
51
+
52
+ # Verify Node.js and npm versions
53
+ RUN node --version
54
+ RUN npm --version
55
+
56
+ # Create non-root user for secure container execution (cron jobs, init containers)
57
+ # Deployment containers override to root via securityContext when npm install -g is needed
58
+ RUN useradd -m -u 1000 -s /bin/bash dd
59
+
60
+ # Set working directory
61
+ WORKDIR /home/dd
62
+
63
+ EXPOSE 22
64
+ EXPOSE 80
65
+ EXPOSE 443
66
+ EXPOSE 3000-3100
67
+ EXPOSE 4000-4100
68
+