cyberia 2.8.885
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.
- package/.dockerignore +15 -0
- package/.env.development +45 -0
- package/.env.production +50 -0
- package/.env.test +45 -0
- package/.github/workflows/engine-cyberia.cd.yml +31 -0
- package/.github/workflows/engine-cyberia.ci.yml +60 -0
- package/.github/workflows/ghpkg.ci.yml +87 -0
- package/.github/workflows/npmpkg.ci.yml +72 -0
- package/.github/workflows/publish.ci.yml +84 -0
- package/.github/workflows/publish.cyberia.ci.yml +84 -0
- package/.github/workflows/pwa-microservices-template-page.cd.yml +72 -0
- package/.github/workflows/pwa-microservices-template-test.ci.yml +33 -0
- package/.github/workflows/release.cd.yml +37 -0
- package/.nycrc +9 -0
- package/.prettierignore +13 -0
- package/.prettierrc +9 -0
- package/.vscode/extensions.json +51 -0
- package/.vscode/settings.json +87 -0
- package/AUTHORS.md +21 -0
- package/CHANGELOG.md +205 -0
- package/Dockerfile +28 -0
- package/LICENSE +21 -0
- package/README.md +85 -0
- package/bin/build.js +209 -0
- package/bin/cron.js +47 -0
- package/bin/cyberia.js +145 -0
- package/bin/db.js +199 -0
- package/bin/deploy.js +1293 -0
- package/bin/file.js +197 -0
- package/bin/hwt.js +49 -0
- package/bin/index.js +145 -0
- package/bin/ssl.js +63 -0
- package/bin/util.js +80 -0
- package/bin/vs.js +74 -0
- package/cli.md +714 -0
- package/conf.js +204 -0
- package/deployment.yaml +138 -0
- package/jsconfig.json +7 -0
- package/jsdoc.json +32 -0
- package/manifests/deployment/adminer/deployment.yaml +32 -0
- package/manifests/deployment/adminer/kustomization.yaml +7 -0
- package/manifests/deployment/adminer/service.yaml +13 -0
- package/manifests/deployment/dd-default-development/deployment.yaml +167 -0
- package/manifests/deployment/dd-default-development/proxy.yaml +46 -0
- package/manifests/deployment/dd-test-development/deployment.yaml +174 -0
- package/manifests/deployment/dd-test-development/proxy.yaml +51 -0
- package/manifests/deployment/fastapi/backend-deployment.yml +120 -0
- package/manifests/deployment/fastapi/backend-service.yml +19 -0
- package/manifests/deployment/fastapi/frontend-deployment.yml +54 -0
- package/manifests/deployment/fastapi/frontend-service.yml +15 -0
- package/manifests/deployment/fastapi/initial_data.sh +56 -0
- package/manifests/deployment/kafka/deployment.yaml +69 -0
- package/manifests/deployment/mongo-express/deployment.yaml +60 -0
- package/manifests/deployment/phpmyadmin/deployment.yaml +54 -0
- package/manifests/deployment/spark/spark-pi-py.yaml +21 -0
- package/manifests/deployment/tensorflow/tf-gpu-test.yaml +65 -0
- package/manifests/envoy-service-nodeport.yaml +23 -0
- package/manifests/grafana/deployment.yaml +57 -0
- package/manifests/grafana/kustomization.yaml +7 -0
- package/manifests/grafana/pvc.yaml +12 -0
- package/manifests/grafana/service.yaml +14 -0
- package/manifests/kind-config-dev.yaml +12 -0
- package/manifests/kind-config.yaml +12 -0
- package/manifests/kubeadm-calico-config.yaml +119 -0
- package/manifests/kubelet-config.yaml +65 -0
- package/manifests/letsencrypt-prod.yaml +15 -0
- package/manifests/lxd/lxd-admin-profile.yaml +17 -0
- package/manifests/lxd/lxd-preseed.yaml +30 -0
- package/manifests/lxd/underpost-setup.sh +163 -0
- package/manifests/mariadb/config.yaml +10 -0
- package/manifests/mariadb/kustomization.yaml +9 -0
- package/manifests/mariadb/pv.yaml +12 -0
- package/manifests/mariadb/pvc.yaml +10 -0
- package/manifests/mariadb/secret.yaml +8 -0
- package/manifests/mariadb/service.yaml +10 -0
- package/manifests/mariadb/statefulset.yaml +56 -0
- package/manifests/mariadb/storage-class.yaml +10 -0
- package/manifests/mongodb/backup-access.yaml +16 -0
- package/manifests/mongodb/backup-cronjob.yaml +42 -0
- package/manifests/mongodb/backup-pv-pvc.yaml +22 -0
- package/manifests/mongodb/configmap.yaml +26 -0
- package/manifests/mongodb/headless-service.yaml +10 -0
- package/manifests/mongodb/kustomization.yaml +11 -0
- package/manifests/mongodb/pv-pvc.yaml +23 -0
- package/manifests/mongodb/statefulset.yaml +126 -0
- package/manifests/mongodb/storage-class.yaml +9 -0
- package/manifests/mongodb-4.4/kustomization.yaml +7 -0
- package/manifests/mongodb-4.4/pv-pvc.yaml +23 -0
- package/manifests/mongodb-4.4/service-deployment.yaml +63 -0
- package/manifests/mysql/kustomization.yaml +7 -0
- package/manifests/mysql/pv-pvc.yaml +27 -0
- package/manifests/mysql/statefulset.yaml +55 -0
- package/manifests/postgresql/configmap.yaml +9 -0
- package/manifests/postgresql/kustomization.yaml +10 -0
- package/manifests/postgresql/pv.yaml +15 -0
- package/manifests/postgresql/pvc.yaml +13 -0
- package/manifests/postgresql/service.yaml +10 -0
- package/manifests/postgresql/statefulset.yaml +37 -0
- package/manifests/prometheus/deployment.yaml +82 -0
- package/manifests/valkey/kustomization.yaml +7 -0
- package/manifests/valkey/service.yaml +11 -0
- package/manifests/valkey/statefulset.yaml +38 -0
- package/nodemon.json +6 -0
- package/package.json +118 -0
- package/proxy.yaml +35 -0
- package/scripts/device-scan.sh +43 -0
- package/scripts/gpu-diag.sh +19 -0
- package/scripts/maas-setup.sh +120 -0
- package/scripts/nat-iptables.sh +26 -0
- package/scripts/nvim.sh +91 -0
- package/scripts/snap-clean.sh +26 -0
- package/scripts/ssh-cluster-info.sh +14 -0
- package/scripts/ssl.sh +164 -0
- package/src/api/blockchain/blockchain.controller.js +51 -0
- package/src/api/blockchain/blockchain.model.js +90 -0
- package/src/api/blockchain/blockchain.router.js +21 -0
- package/src/api/blockchain/blockchain.service.js +24 -0
- package/src/api/core/core.controller.js +69 -0
- package/src/api/core/core.model.js +11 -0
- package/src/api/core/core.router.js +24 -0
- package/src/api/core/core.service.js +35 -0
- package/src/api/crypto/crypto.controller.js +51 -0
- package/src/api/crypto/crypto.model.js +23 -0
- package/src/api/crypto/crypto.router.js +20 -0
- package/src/api/crypto/crypto.service.js +64 -0
- package/src/api/default/default.controller.js +74 -0
- package/src/api/default/default.model.js +20 -0
- package/src/api/default/default.router.js +27 -0
- package/src/api/default/default.service.js +40 -0
- package/src/api/document/document.controller.js +66 -0
- package/src/api/document/document.model.js +51 -0
- package/src/api/document/document.router.js +24 -0
- package/src/api/document/document.service.js +133 -0
- package/src/api/file/file.controller.js +67 -0
- package/src/api/file/file.model.js +19 -0
- package/src/api/file/file.router.js +22 -0
- package/src/api/file/file.service.js +100 -0
- package/src/api/instance/instance.controller.js +69 -0
- package/src/api/instance/instance.model.js +40 -0
- package/src/api/instance/instance.router.js +34 -0
- package/src/api/instance/instance.service.js +70 -0
- package/src/api/ipfs/ipfs.controller.js +51 -0
- package/src/api/ipfs/ipfs.model.js +17 -0
- package/src/api/ipfs/ipfs.router.js +20 -0
- package/src/api/ipfs/ipfs.service.js +25 -0
- package/src/api/object-layer/README.md +85 -0
- package/src/api/object-layer/object-layer.controller.js +69 -0
- package/src/api/object-layer/object-layer.model.js +181 -0
- package/src/api/object-layer/object-layer.router.js +29 -0
- package/src/api/object-layer/object-layer.service.js +49 -0
- package/src/api/test/test.controller.js +59 -0
- package/src/api/test/test.model.js +14 -0
- package/src/api/test/test.router.js +21 -0
- package/src/api/test/test.service.js +35 -0
- package/src/api/user/postman_collection.json +216 -0
- package/src/api/user/user.build.js +16 -0
- package/src/api/user/user.controller.js +35 -0
- package/src/api/user/user.model.js +100 -0
- package/src/api/user/user.router.js +400 -0
- package/src/api/user/user.service.js +500 -0
- package/src/api.js +23 -0
- package/src/cli/baremetal.js +1310 -0
- package/src/cli/cloud-init.js +548 -0
- package/src/cli/cluster.js +834 -0
- package/src/cli/cron.js +95 -0
- package/src/cli/db.js +414 -0
- package/src/cli/deploy.js +661 -0
- package/src/cli/env.js +101 -0
- package/src/cli/fs.js +256 -0
- package/src/cli/image.js +156 -0
- package/src/cli/index.js +436 -0
- package/src/cli/lxd.js +402 -0
- package/src/cli/monitor.js +260 -0
- package/src/cli/repository.js +274 -0
- package/src/cli/run.js +728 -0
- package/src/cli/script.js +85 -0
- package/src/cli/secrets.js +71 -0
- package/src/cli/ssh.js +46 -0
- package/src/cli/test.js +159 -0
- package/src/client/Cyberia.index.js +50 -0
- package/src/client/CyberiaAdmin.index.js +34 -0
- package/src/client/CyberiaPortal.index.js +36 -0
- package/src/client/Default.index.js +84 -0
- package/src/client/components/core/404.js +20 -0
- package/src/client/components/core/500.js +20 -0
- package/src/client/components/core/Account.js +326 -0
- package/src/client/components/core/AgGrid.js +191 -0
- package/src/client/components/core/Alert.js +77 -0
- package/src/client/components/core/Auth.js +342 -0
- package/src/client/components/core/Badge.js +32 -0
- package/src/client/components/core/Blockchain.js +41 -0
- package/src/client/components/core/Blog.js +9 -0
- package/src/client/components/core/BtnIcon.js +111 -0
- package/src/client/components/core/CalendarCore.js +464 -0
- package/src/client/components/core/Chat.js +64 -0
- package/src/client/components/core/ColorPalette.js +5267 -0
- package/src/client/components/core/CommonJs.js +1010 -0
- package/src/client/components/core/Content.js +196 -0
- package/src/client/components/core/Css.js +1099 -0
- package/src/client/components/core/CssCore.js +882 -0
- package/src/client/components/core/D3Chart.js +44 -0
- package/src/client/components/core/Docs.js +376 -0
- package/src/client/components/core/DropDown.js +223 -0
- package/src/client/components/core/EventsUI.js +133 -0
- package/src/client/components/core/FileExplorer.js +707 -0
- package/src/client/components/core/FullScreen.js +36 -0
- package/src/client/components/core/Input.js +383 -0
- package/src/client/components/core/JoyStick.js +80 -0
- package/src/client/components/core/Keyboard.js +73 -0
- package/src/client/components/core/LoadingAnimation.js +159 -0
- package/src/client/components/core/LogIn.js +190 -0
- package/src/client/components/core/LogOut.js +63 -0
- package/src/client/components/core/Logger.js +29 -0
- package/src/client/components/core/Modal.js +2494 -0
- package/src/client/components/core/NotificationManager.js +84 -0
- package/src/client/components/core/ObjectLayerEngine.js +1229 -0
- package/src/client/components/core/ObjectLayerEngineModal.js +443 -0
- package/src/client/components/core/Pagination.js +207 -0
- package/src/client/components/core/Panel.js +772 -0
- package/src/client/components/core/PanelForm.js +627 -0
- package/src/client/components/core/Polyhedron.js +162 -0
- package/src/client/components/core/Recover.js +207 -0
- package/src/client/components/core/Responsive.js +82 -0
- package/src/client/components/core/RichText.js +43 -0
- package/src/client/components/core/Router.js +317 -0
- package/src/client/components/core/Scroll.js +76 -0
- package/src/client/components/core/SignUp.js +125 -0
- package/src/client/components/core/SocketIo.js +74 -0
- package/src/client/components/core/Stream.js +113 -0
- package/src/client/components/core/ToggleSwitch.js +101 -0
- package/src/client/components/core/ToolTip.js +90 -0
- package/src/client/components/core/Translate.js +522 -0
- package/src/client/components/core/Validator.js +115 -0
- package/src/client/components/core/VanillaJs.js +423 -0
- package/src/client/components/core/Wallet.js +106 -0
- package/src/client/components/core/WebComponent.js +44 -0
- package/src/client/components/core/Webhook.js +25 -0
- package/src/client/components/core/Worker.js +371 -0
- package/src/client/components/core/windowGetDimensions.js +269 -0
- package/src/client/components/cyberia/BagCyberia.js +1253 -0
- package/src/client/components/cyberia/BiomeCyberia.js +130 -0
- package/src/client/components/cyberia/CharacterCyberia.js +321 -0
- package/src/client/components/cyberia/CommonCyberia.js +1834 -0
- package/src/client/components/cyberia/CssCyberia.js +816 -0
- package/src/client/components/cyberia/ElementPreviewCyberia.js +183 -0
- package/src/client/components/cyberia/ElementsCyberia.js +146 -0
- package/src/client/components/cyberia/InteractionPanelCyberia.js +1043 -0
- package/src/client/components/cyberia/JoyStickCyberia.js +53 -0
- package/src/client/components/cyberia/LogInCyberia.js +68 -0
- package/src/client/components/cyberia/LogOutCyberia.js +24 -0
- package/src/client/components/cyberia/MainUserCyberia.js +424 -0
- package/src/client/components/cyberia/MapCyberia.js +160 -0
- package/src/client/components/cyberia/MatrixCyberia.js +147 -0
- package/src/client/components/cyberia/MenuCyberia.js +575 -0
- package/src/client/components/cyberia/PixiCyberia.js +1639 -0
- package/src/client/components/cyberia/PointAndClickMovementCyberia.js +146 -0
- package/src/client/components/cyberia/QuestCyberia.js +1420 -0
- package/src/client/components/cyberia/RoutesCyberia.js +47 -0
- package/src/client/components/cyberia/SettingsCyberia.js +16 -0
- package/src/client/components/cyberia/SignUpCyberia.js +14 -0
- package/src/client/components/cyberia/SkillCyberia.js +124 -0
- package/src/client/components/cyberia/SocketIoCyberia.js +211 -0
- package/src/client/components/cyberia/TileCyberia.js +685 -0
- package/src/client/components/cyberia/TranslateCyberia.js +96 -0
- package/src/client/components/cyberia/UniverseCyberia.js +14 -0
- package/src/client/components/cyberia/WebhookCyberia.js +13 -0
- package/src/client/components/cyberia/WikiCyberia.js +144 -0
- package/src/client/components/cyberia/WorldCyberia.js +680 -0
- package/src/client/components/cyberia-admin/BiomeCyberiaAdmin.js +978 -0
- package/src/client/components/cyberia-admin/CommonCyberiaAdmin.js +29 -0
- package/src/client/components/cyberia-admin/CssCyberiaAdmin.js +15 -0
- package/src/client/components/cyberia-admin/ElementsCyberiaAdmin.js +38 -0
- package/src/client/components/cyberia-admin/InstanceEngineCyberiaAdmin.js +180 -0
- package/src/client/components/cyberia-admin/LogInCyberiaAdmin.js +34 -0
- package/src/client/components/cyberia-admin/LogOutCyberiaAdmin.js +24 -0
- package/src/client/components/cyberia-admin/MenuCyberiaAdmin.js +660 -0
- package/src/client/components/cyberia-admin/RoutesCyberiaAdmin.js +57 -0
- package/src/client/components/cyberia-admin/ServerCyberiaAdmin.js +129 -0
- package/src/client/components/cyberia-admin/SettingsCyberiaAdmin.js +16 -0
- package/src/client/components/cyberia-admin/SignUpCyberiaAdmin.js +11 -0
- package/src/client/components/cyberia-admin/SocketIoCyberiaAdmin.js +53 -0
- package/src/client/components/cyberia-admin/TranslateCyberiaAdmin.js +7 -0
- package/src/client/components/cyberia-biome/CityCyberiaBiome.js +209 -0
- package/src/client/components/cyberia-biome/CityInteriorCyberiaBiome.js +253 -0
- package/src/client/components/cyberia-biome/ColorChaosCyberiaBiome.js +26 -0
- package/src/client/components/cyberia-biome/ForestCyberiaBiome.js +191 -0
- package/src/client/components/cyberia-biome/GridBaseCyberiaBiome.js +364 -0
- package/src/client/components/cyberia-biome/SeedCityCyberiaBiome.js +347 -0
- package/src/client/components/cyberia-biome/ShopCyberiaBiome.js +12 -0
- package/src/client/components/cyberia-biome/SpaceCyberiaBiome.js +58 -0
- package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +29 -0
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +132 -0
- package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +38 -0
- package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +18 -0
- package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +12 -0
- package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +487 -0
- package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +45 -0
- package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +136 -0
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +16 -0
- package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +11 -0
- package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +52 -0
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +12 -0
- package/src/client/components/default/CommonDefault.js +29 -0
- package/src/client/components/default/CssDefault.js +27 -0
- package/src/client/components/default/ElementsDefault.js +38 -0
- package/src/client/components/default/LogInDefault.js +14 -0
- package/src/client/components/default/LogOutDefault.js +10 -0
- package/src/client/components/default/MenuDefault.js +743 -0
- package/src/client/components/default/RoutesDefault.js +48 -0
- package/src/client/components/default/SettingsDefault.js +16 -0
- package/src/client/components/default/SignUpDefault.js +9 -0
- package/src/client/components/default/SocketIoDefault.js +54 -0
- package/src/client/components/default/TranslateDefault.js +7 -0
- package/src/client/public/default/android-chrome-144x144.png +0 -0
- package/src/client/public/default/android-chrome-192x192.png +0 -0
- package/src/client/public/default/android-chrome-256x256.png +0 -0
- package/src/client/public/default/android-chrome-36x36.png +0 -0
- package/src/client/public/default/android-chrome-384x384.png +0 -0
- package/src/client/public/default/android-chrome-48x48.png +0 -0
- package/src/client/public/default/android-chrome-512x512.png +0 -0
- package/src/client/public/default/android-chrome-72x72.png +0 -0
- package/src/client/public/default/android-chrome-96x96.png +0 -0
- package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
- package/src/client/public/default/apple-touch-icon-114x114-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
- package/src/client/public/default/apple-touch-icon-152x152-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
- package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
- package/src/client/public/default/apple-touch-icon-180x180-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
- package/src/client/public/default/apple-touch-icon-76x76-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
- package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
- package/src/client/public/default/assets/background/dark.jpg +0 -0
- package/src/client/public/default/assets/background/dark.svg +557 -0
- package/src/client/public/default/assets/background/white.jpg +0 -0
- package/src/client/public/default/assets/background/white0-min.jpg +0 -0
- package/src/client/public/default/assets/background/white0.jpg +0 -0
- package/src/client/public/default/assets/logo/base-icon.png +0 -0
- package/src/client/public/default/assets/logo/underpost.gif +0 -0
- package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-default-avatar.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
- package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
- package/src/client/public/default/browserconfig.xml +12 -0
- package/src/client/public/default/favicon-16x16.png +0 -0
- package/src/client/public/default/favicon-32x32.png +0 -0
- package/src/client/public/default/favicon-48x48.png +0 -0
- package/src/client/public/default/favicon.ico +0 -0
- package/src/client/public/default/manifest.webmanifest +69 -0
- package/src/client/public/default/mstile-144x144.png +0 -0
- package/src/client/public/default/mstile-150x150.png +0 -0
- package/src/client/public/default/mstile-310x150.png +0 -0
- package/src/client/public/default/mstile-310x310.png +0 -0
- package/src/client/public/default/mstile-70x70.png +0 -0
- package/src/client/public/default/plantuml/client-conf.svg +1 -0
- package/src/client/public/default/plantuml/client-schema.svg +1 -0
- package/src/client/public/default/plantuml/cron-conf.svg +1 -0
- package/src/client/public/default/plantuml/cron-schema.svg +1 -0
- package/src/client/public/default/plantuml/server-conf.svg +1 -0
- package/src/client/public/default/plantuml/server-schema.svg +1 -0
- package/src/client/public/default/plantuml/ssr-conf.svg +1 -0
- package/src/client/public/default/plantuml/ssr-schema.svg +1 -0
- package/src/client/public/default/safari-pinned-tab.svg +24 -0
- package/src/client/public/default/site.webmanifest +69 -0
- package/src/client/public/default/sitemap +148 -0
- package/src/client/public/default/yandex-browser-50x50.png +0 -0
- package/src/client/public/default/yandex-browser-manifest.json +9 -0
- package/src/client/public/doc/favicon.ico +0 -0
- package/src/client/public/doc/sitemap +148 -0
- package/src/client/public/test/favicon.ico +0 -0
- package/src/client/public/test/sitemap +148 -0
- package/src/client/services/blockchain/blockchain.service.js +73 -0
- package/src/client/services/core/core.service.js +165 -0
- package/src/client/services/crypto/crypto.service.js +73 -0
- package/src/client/services/default/default.management.js +450 -0
- package/src/client/services/default/default.service.js +98 -0
- package/src/client/services/document/document.service.js +97 -0
- package/src/client/services/file/file.service.js +72 -0
- package/src/client/services/instance/instance.management.js +78 -0
- package/src/client/services/instance/instance.service.js +97 -0
- package/src/client/services/ipfs/ipfs.service.js +73 -0
- package/src/client/services/object-layer/object-layer.service.js +93 -0
- package/src/client/services/test/test.service.js +73 -0
- package/src/client/services/user/user.management.js +56 -0
- package/src/client/services/user/user.service.js +108 -0
- package/src/client/ssr/Render.js +237 -0
- package/src/client/ssr/body/404.js +73 -0
- package/src/client/ssr/body/500.js +72 -0
- package/src/client/ssr/body/CacheControl.js +114 -0
- package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +90 -0
- package/src/client/ssr/body/CyberiaSplashScreenLore.js +424 -0
- package/src/client/ssr/body/DefaultSplashScreen.js +90 -0
- package/src/client/ssr/email/DefaultRecoverEmail.js +21 -0
- package/src/client/ssr/email/DefaultVerifyEmail.js +17 -0
- package/src/client/ssr/head/Css.js +241 -0
- package/src/client/ssr/head/CyberiaAdminScripts.js +6 -0
- package/src/client/ssr/head/CyberiaPortalScripts.js +6 -0
- package/src/client/ssr/head/CyberiaScripts.js +6 -0
- package/src/client/ssr/head/DefaultScripts.js +6 -0
- package/src/client/ssr/head/Microdata.js +11 -0
- package/src/client/ssr/head/Production.js +1 -0
- package/src/client/ssr/head/Pwa.js +146 -0
- package/src/client/ssr/head/Seo.js +15 -0
- package/src/client/ssr/mailer/DefaultRecoverEmail.js +21 -0
- package/src/client/ssr/mailer/DefaultVerifyEmail.js +17 -0
- package/src/client/ssr/offline/Maintenance.js +63 -0
- package/src/client/ssr/offline/NoNetworkConnection.js +67 -0
- package/src/client/ssr/pages/404.js +12 -0
- package/src/client/ssr/pages/500.js +12 -0
- package/src/client/ssr/pages/Test.js +198 -0
- package/src/client/ssr/pages/maintenance.js +14 -0
- package/src/client/ssr/pages/offline.js +21 -0
- package/src/client/sw/default.sw.js +108 -0
- package/src/client/sw/template.sw.js +84 -0
- package/src/client.build.js +22 -0
- package/src/client.dev.js +24 -0
- package/src/db/DataBaseProvider.js +98 -0
- package/src/db/mariadb/MariaDB.js +66 -0
- package/src/db/mongo/MongooseDB.js +70 -0
- package/src/index.js +198 -0
- package/src/mailer/EmailRender.js +116 -0
- package/src/mailer/MailerProvider.js +213 -0
- package/src/monitor.js +24 -0
- package/src/proxy.js +22 -0
- package/src/runtime/express/Express.js +256 -0
- package/src/runtime/lampp/Dockerfile +50 -0
- package/src/runtime/lampp/Lampp.js +343 -0
- package/src/server/auth.js +689 -0
- package/src/server/backup.js +96 -0
- package/src/server/client-build-docs.js +205 -0
- package/src/server/client-build-live.js +109 -0
- package/src/server/client-build.js +690 -0
- package/src/server/client-dev-server.js +87 -0
- package/src/server/client-formatted.js +87 -0
- package/src/server/client-icons.js +108 -0
- package/src/server/conf.js +1071 -0
- package/src/server/crypto.js +210 -0
- package/src/server/dns.js +276 -0
- package/src/server/downloader.js +74 -0
- package/src/server/json-schema.js +77 -0
- package/src/server/logger.js +197 -0
- package/src/server/network.js +72 -0
- package/src/server/object-layer.js +294 -0
- package/src/server/peer.js +69 -0
- package/src/server/process.js +171 -0
- package/src/server/proxy.js +110 -0
- package/src/server/runtime.js +170 -0
- package/src/server/ssr.js +127 -0
- package/src/server/start.js +161 -0
- package/src/server/tls.js +251 -0
- package/src/server/valkey.js +293 -0
- package/src/server.js +25 -0
- package/src/ws/IoInterface.js +139 -0
- package/src/ws/IoServer.js +88 -0
- package/src/ws/core/channels/core.ws.chat.js +23 -0
- package/src/ws/core/channels/core.ws.mailer.js +35 -0
- package/src/ws/core/channels/core.ws.stream.js +31 -0
- package/src/ws/core/core.ws.connection.js +62 -0
- package/src/ws/core/core.ws.emit.js +53 -0
- package/src/ws/core/core.ws.server.js +76 -0
- package/src/ws/core/management/core.ws.chat.js +8 -0
- package/src/ws/core/management/core.ws.mailer.js +16 -0
- package/src/ws/core/management/core.ws.stream.js +8 -0
- package/src/ws/cyberia/channels/cyberia.ws.bot.js +56 -0
- package/src/ws/cyberia/channels/cyberia.ws.skill.js +51 -0
- package/src/ws/cyberia/channels/cyberia.ws.user.js +437 -0
- package/src/ws/cyberia/cyberia.ws.connection.js +36 -0
- package/src/ws/cyberia/cyberia.ws.emit.js +14 -0
- package/src/ws/cyberia/cyberia.ws.server.js +67 -0
- package/src/ws/cyberia/management/cyberia.ws.bot.js +669 -0
- package/src/ws/cyberia/management/cyberia.ws.skill.js +441 -0
- package/src/ws/cyberia/management/cyberia.ws.user.js +188 -0
- package/src/ws/default/channels/default.ws.main.js +16 -0
- package/src/ws/default/default.ws.connection.js +22 -0
- package/src/ws/default/default.ws.emit.js +14 -0
- package/src/ws/default/default.ws.server.js +20 -0
- package/src/ws/default/management/default.ws.main.js +8 -0
- package/test/api.test.js +53 -0
- package/test/crypto.test.js +117 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A service dedicated to creating and configuring an Express.js application
|
|
3
|
+
* instance based on server configuration data.
|
|
4
|
+
* @module src/runtime/express/Express.js
|
|
5
|
+
* @namespace ExpressService
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
import express from 'express';
|
|
10
|
+
import fileUpload from 'express-fileupload';
|
|
11
|
+
import swaggerUi from 'swagger-ui-express';
|
|
12
|
+
import compression from 'compression';
|
|
13
|
+
import { createServer } from 'http';
|
|
14
|
+
|
|
15
|
+
import UnderpostStartUp from '../../server/start.js';
|
|
16
|
+
import { loggerFactory, loggerMiddleware } from '../../server/logger.js';
|
|
17
|
+
import { getCapVariableName, newInstance } from '../../client/components/core/CommonJs.js';
|
|
18
|
+
import { MailerProvider } from '../../mailer/MailerProvider.js';
|
|
19
|
+
import { DataBaseProvider } from '../../db/DataBaseProvider.js';
|
|
20
|
+
import { createPeerServer } from '../../server/peer.js';
|
|
21
|
+
import { createValkeyConnection } from '../../server/valkey.js';
|
|
22
|
+
import { applySecurity, authMiddlewareFactory } from '../../server/auth.js';
|
|
23
|
+
import { ssrMiddlewareFactory } from '../../server/ssr.js';
|
|
24
|
+
import { TLS } from '../../server/tls.js';
|
|
25
|
+
import { shellExec } from '../../server/process.js';
|
|
26
|
+
|
|
27
|
+
const logger = loggerFactory(import.meta);
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @class ExpressService
|
|
31
|
+
* @description A service dedicated to creating and configuring an Express.js application
|
|
32
|
+
* instance based on server configuration data.
|
|
33
|
+
* @memberof ExpressService
|
|
34
|
+
*/
|
|
35
|
+
class ExpressService {
|
|
36
|
+
/**
|
|
37
|
+
* Creates and configures a complete Express application instance for a specific host/path configuration.
|
|
38
|
+
*
|
|
39
|
+
* @method createApp
|
|
40
|
+
* @memberof ExpressService
|
|
41
|
+
* @param {string} config.host - The host name for the instance (e.g., 'www.example.com').
|
|
42
|
+
* @param {string} config.path - The URL path for the instance (e.g., '/', '/api/v1').
|
|
43
|
+
* @param {number} config.port - The primary listening port for the instance.
|
|
44
|
+
* @param {string} config.client - The client associated with the instance (used for SSR/Mailer configuration lookup).
|
|
45
|
+
* @param {string[]} [config.apis] - A list of API names to load and attach routers for.
|
|
46
|
+
* @param {string[]} config.origins - Allowed origins for CORS.
|
|
47
|
+
* @param {string} [config.directory] - The directory for static files (if overriding default).
|
|
48
|
+
* @param {boolean} [config.useLocalSsl] - Whether to use local SSL for the instance.
|
|
49
|
+
* @param {string} [config.ws] - The WebSocket server name to use.
|
|
50
|
+
* @param {object} [config.mailer] - Mailer configuration.
|
|
51
|
+
* @param {object} [config.db] - Database configuration.
|
|
52
|
+
* @param {string} [config.redirect] - URL or flag to indicate an HTTP redirect should be configured.
|
|
53
|
+
* @param {boolean} [config.peer] - Whether to enable the peer server.
|
|
54
|
+
* @param {object} [config.valkey] - Valkey connection configuration.
|
|
55
|
+
* @param {string} [config.apiBaseHost] - Base host for the API (if running separate API).
|
|
56
|
+
* @param {string} config.redirectTarget - The full target URL for redirection (used if `redirect` is true).
|
|
57
|
+
* @param {string} config.rootHostPath - The root path for public host assets (e.g., `/public/hostname`).
|
|
58
|
+
* @param {object} config.confSSR - The SSR configuration object, used to look up Mailer templates.
|
|
59
|
+
* @param {import('prom-client').Counter<string>} config.promRequestCounter - Prometheus request counter instance.
|
|
60
|
+
* @param {import('prom-client').Registry} config.promRegister - Prometheus register instance for metrics.
|
|
61
|
+
* @returns {Promise<{portsUsed: number}>} An object indicating how many additional ports were used (e.g., for PeerServer).
|
|
62
|
+
*/
|
|
63
|
+
async createApp({
|
|
64
|
+
host,
|
|
65
|
+
path,
|
|
66
|
+
port,
|
|
67
|
+
client,
|
|
68
|
+
apis,
|
|
69
|
+
origins,
|
|
70
|
+
directory,
|
|
71
|
+
useLocalSsl,
|
|
72
|
+
ws,
|
|
73
|
+
mailer,
|
|
74
|
+
db,
|
|
75
|
+
redirect,
|
|
76
|
+
peer,
|
|
77
|
+
valkey,
|
|
78
|
+
apiBaseHost,
|
|
79
|
+
redirectTarget,
|
|
80
|
+
rootHostPath,
|
|
81
|
+
confSSR,
|
|
82
|
+
promRequestCounter,
|
|
83
|
+
promRegister,
|
|
84
|
+
}) {
|
|
85
|
+
let portsUsed = 0;
|
|
86
|
+
const runningData = {
|
|
87
|
+
host,
|
|
88
|
+
path,
|
|
89
|
+
runtime: 'nodejs',
|
|
90
|
+
client,
|
|
91
|
+
meta: import.meta,
|
|
92
|
+
apis,
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const app = express();
|
|
96
|
+
|
|
97
|
+
if (process.env.NODE_ENV === 'production') app.set('trust proxy', true);
|
|
98
|
+
|
|
99
|
+
app.use((req, res, next) => {
|
|
100
|
+
res.on('finish', () => {
|
|
101
|
+
promRequestCounter.inc({
|
|
102
|
+
instance: `${host}:${port}${path}`,
|
|
103
|
+
method: req.method,
|
|
104
|
+
status_code: res.statusCode,
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
return next();
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
// Metrics endpoint
|
|
111
|
+
app.get(`${path === '/' ? '' : path}/metrics`, async (req, res) => {
|
|
112
|
+
res.set('Content-Type', promRegister.contentType);
|
|
113
|
+
return res.end(await promRegister.metrics());
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// Logging, Compression, and Body Parsers
|
|
117
|
+
app.use(loggerMiddleware(import.meta));
|
|
118
|
+
app.use(compression({ filter: (req, res) => !req.headers['x-no-compression'] && compression.filter(req, res) }));
|
|
119
|
+
app.use(express.json({ limit: '100MB' }));
|
|
120
|
+
app.use(express.urlencoded({ extended: true, limit: '20MB' }));
|
|
121
|
+
app.use(fileUpload());
|
|
122
|
+
|
|
123
|
+
if (process.env.NODE_ENV === 'development') app.set('json spaces', 2);
|
|
124
|
+
|
|
125
|
+
// Language handling middleware
|
|
126
|
+
app.use((req, res, next) => {
|
|
127
|
+
const lang = req.headers['accept-language'] || 'en';
|
|
128
|
+
req.lang = typeof lang === 'string' && lang.toLowerCase().match('es') ? 'es' : 'en';
|
|
129
|
+
return next();
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// Static file serving
|
|
133
|
+
app.use('/', express.static(directory ? directory : `.${rootHostPath}`));
|
|
134
|
+
|
|
135
|
+
// Handle redirection-only instances
|
|
136
|
+
if (redirect) {
|
|
137
|
+
app.use((req, res, next) => {
|
|
138
|
+
if (process.env.NODE_ENV === 'production' && !req.url.startsWith(`/.well-known/acme-challenge`)) {
|
|
139
|
+
return res.status(302).redirect(redirectTarget + req.url);
|
|
140
|
+
}
|
|
141
|
+
return next();
|
|
142
|
+
});
|
|
143
|
+
await UnderpostStartUp.API.listenPortController(app, port, runningData);
|
|
144
|
+
return { portsUsed };
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Create HTTP server for regular instances (required for WebSockets)
|
|
148
|
+
const server = createServer({}, app);
|
|
149
|
+
|
|
150
|
+
if (!apiBaseHost) {
|
|
151
|
+
// Swagger path definition
|
|
152
|
+
const swaggerJsonPath = `./public/${host}${path === '/' ? path : `${path}/`}swagger-output.json`;
|
|
153
|
+
const swaggerPath = `${path === '/' ? `/api-docs` : `${path}/api-docs`}`;
|
|
154
|
+
|
|
155
|
+
// Flag swagger requests before security middleware
|
|
156
|
+
if (fs.existsSync(swaggerJsonPath)) {
|
|
157
|
+
app.use(swaggerPath, (req, res, next) => {
|
|
158
|
+
res.locals.isSwagger = true;
|
|
159
|
+
next();
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Swagger UI setup
|
|
164
|
+
if (fs.existsSync(swaggerJsonPath)) {
|
|
165
|
+
const swaggerDoc = JSON.parse(fs.readFileSync(swaggerJsonPath, 'utf8'));
|
|
166
|
+
// Reusing swaggerPath defined outside, removing unnecessary redeclaration
|
|
167
|
+
app.use(swaggerPath, swaggerUi.serve, swaggerUi.setup(swaggerDoc));
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Security and CORS
|
|
171
|
+
if (process.env.NODE_ENV === 'development' && useLocalSsl)
|
|
172
|
+
origins = origins.map((origin) => origin.replace('http', 'https'));
|
|
173
|
+
|
|
174
|
+
applySecurity(app, {
|
|
175
|
+
origin: origins,
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
// Database and Valkey connections
|
|
179
|
+
if (db && apis) await DataBaseProvider.load({ apis, host, path, db });
|
|
180
|
+
if (valkey) await createValkeyConnection({ host, path }, valkey);
|
|
181
|
+
|
|
182
|
+
// Mailer setup
|
|
183
|
+
if (mailer) {
|
|
184
|
+
const mailerSsrConf = confSSR[getCapVariableName(client)];
|
|
185
|
+
await MailerProvider.load({
|
|
186
|
+
id: `${host}${path}`,
|
|
187
|
+
meta: `mailer-${host}${path}`,
|
|
188
|
+
host,
|
|
189
|
+
path,
|
|
190
|
+
...mailer,
|
|
191
|
+
templates: mailerSsrConf ? mailerSsrConf.mailer : {},
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// API router loading
|
|
196
|
+
if (apis && apis.length > 0) {
|
|
197
|
+
const authMiddleware = authMiddlewareFactory({ host, path });
|
|
198
|
+
const apiPath = `${path === '/' ? '' : path}/${process.env.BASE_API}`;
|
|
199
|
+
for (const api of apis) {
|
|
200
|
+
logger.info(`Build api server`, `${host}${apiPath}/${api}`);
|
|
201
|
+
const { ApiRouter } = await import(`../../api/${api}/${api}.router.js`);
|
|
202
|
+
const router = ApiRouter({ host, path, apiPath, mailer, db, authMiddleware, origins });
|
|
203
|
+
app.use(`${apiPath}/${api}`, router);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// WebSocket server setup
|
|
208
|
+
if (ws) {
|
|
209
|
+
const { createIoServer } = await import(`../../ws/${ws}/${ws}.ws.server.js`);
|
|
210
|
+
const { options, meta, ioServer } = await createIoServer(server, { host, path, db, port, origins });
|
|
211
|
+
|
|
212
|
+
// Listen on the main port for the WS server
|
|
213
|
+
await UnderpostStartUp.API.listenPortController(ioServer, port, {
|
|
214
|
+
runtime: 'nodejs',
|
|
215
|
+
client: null,
|
|
216
|
+
host,
|
|
217
|
+
path: options.path,
|
|
218
|
+
meta,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Peer server setup
|
|
223
|
+
if (peer) {
|
|
224
|
+
portsUsed++; // Peer server uses one additional port
|
|
225
|
+
const peerPort = newInstance(port + portsUsed); // portsUsed is 1 here
|
|
226
|
+
const { options, meta, peerServer } = await createPeerServer({
|
|
227
|
+
port: peerPort,
|
|
228
|
+
origins,
|
|
229
|
+
path,
|
|
230
|
+
});
|
|
231
|
+
await UnderpostStartUp.API.listenPortController(peerServer, peerPort, {
|
|
232
|
+
runtime: 'nodejs',
|
|
233
|
+
client: null,
|
|
234
|
+
host,
|
|
235
|
+
path: options.path,
|
|
236
|
+
meta,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// SSR middleware loading
|
|
242
|
+
const ssr = await ssrMiddlewareFactory({ app, directory, rootHostPath, path });
|
|
243
|
+
for (const [_, ssrMiddleware] of Object.entries(ssr)) app.use(ssrMiddleware);
|
|
244
|
+
|
|
245
|
+
// Start listening on the main port
|
|
246
|
+
if (useLocalSsl && process.env.NODE_ENV === 'development') {
|
|
247
|
+
if (!TLS.validateSecureContext()) shellExec(`node bin/deploy tls`);
|
|
248
|
+
const { ServerSSL } = await TLS.createSslServer(app);
|
|
249
|
+
await UnderpostStartUp.API.listenPortController(ServerSSL, port, runningData);
|
|
250
|
+
} else await UnderpostStartUp.API.listenPortController(server, port, runningData);
|
|
251
|
+
|
|
252
|
+
return { portsUsed };
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
export default new ExpressService();
|
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
net-tools \
|
|
11
|
+
openssh-server \
|
|
12
|
+
nano \
|
|
13
|
+
vim-enhanced \
|
|
14
|
+
less \
|
|
15
|
+
openssl-devel \
|
|
16
|
+
wget \
|
|
17
|
+
git \
|
|
18
|
+
gnupg2 \
|
|
19
|
+
libnsl \
|
|
20
|
+
perl && \
|
|
21
|
+
dnf clean all
|
|
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" && \
|
|
25
|
+
chmod +x /tmp/xampp-linux-installer.run && \
|
|
26
|
+
bash -c "/tmp/xampp-linux-installer.run --mode unattended" && \
|
|
27
|
+
ln -sf /opt/lampp/lampp /usr/bin/lampp
|
|
28
|
+
|
|
29
|
+
# --- Create /xampp/htdocs (static root) and set permissions
|
|
30
|
+
RUN mkdir -p /opt/lampp/htdocs && \
|
|
31
|
+
chown -R root:root /opt/lampp/htdocs && \
|
|
32
|
+
chmod -R a+rX /opt/lampp/htdocs
|
|
33
|
+
|
|
34
|
+
# Install Node.js
|
|
35
|
+
RUN curl -fsSL https://rpm.nodesource.com/setup_24.x | bash -
|
|
36
|
+
RUN dnf install nodejs -y
|
|
37
|
+
RUN dnf clean all
|
|
38
|
+
|
|
39
|
+
# Verify Node.js and npm versions
|
|
40
|
+
RUN node --version
|
|
41
|
+
RUN npm --version
|
|
42
|
+
|
|
43
|
+
# Set working directory
|
|
44
|
+
WORKDIR /home/dd
|
|
45
|
+
|
|
46
|
+
EXPOSE 22
|
|
47
|
+
EXPOSE 80
|
|
48
|
+
EXPOSE 443
|
|
49
|
+
EXPOSE 3000-3100
|
|
50
|
+
EXPOSE 4000-4100
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exported singleton instance of the LamppService class.
|
|
3
|
+
* This object is used to interact with the Lampp configuration and service.
|
|
4
|
+
* @module src/runtime/lampp/Lampp.js
|
|
5
|
+
* @namespace LamppService
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
import { getRootDirectory, shellCd, shellExec } from '../../server/process.js';
|
|
10
|
+
import { loggerFactory } from '../../server/logger.js';
|
|
11
|
+
|
|
12
|
+
const logger = loggerFactory(import.meta);
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @class LamppService
|
|
16
|
+
* @description Provides utilities for managing the XAMPP (Lampp) service on Linux,
|
|
17
|
+
* including initialization, router configuration, and virtual host creation.
|
|
18
|
+
* It manages the server's configuration files and controls the service process.
|
|
19
|
+
* @memberof LamppService
|
|
20
|
+
*/
|
|
21
|
+
class LamppService {
|
|
22
|
+
/**
|
|
23
|
+
* @private
|
|
24
|
+
* @type {string | undefined}
|
|
25
|
+
* @description Stores the accumulated Apache virtual host configuration (router definition).
|
|
26
|
+
* @memberof LamppService
|
|
27
|
+
*/
|
|
28
|
+
router;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @public
|
|
32
|
+
* @type {number[]}
|
|
33
|
+
* @description A list of ports currently configured and listened to by the Lampp service.
|
|
34
|
+
* @memberof LamppService
|
|
35
|
+
*/
|
|
36
|
+
ports;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Creates an instance of LamppService.
|
|
40
|
+
* Initializes the router configuration and ports list.
|
|
41
|
+
* @method constructor
|
|
42
|
+
* @memberof LamppService
|
|
43
|
+
*/
|
|
44
|
+
constructor() {
|
|
45
|
+
this.router = undefined;
|
|
46
|
+
this.ports = [];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Checks if the XAMPP (Lampp) service appears to be installed based on the presence of its main configuration file.
|
|
51
|
+
*
|
|
52
|
+
* @method enabled
|
|
53
|
+
* @memberof LamppService
|
|
54
|
+
* @returns {boolean} True if the configuration file exists, indicating Lampp is likely installed.
|
|
55
|
+
* @throws {Error} If the configuration file does not exist.
|
|
56
|
+
* @memberof LamppService
|
|
57
|
+
*/
|
|
58
|
+
enabled() {
|
|
59
|
+
return fs.existsSync('/opt/lampp/etc/httpd.conf');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Initializes or restarts the Lampp Apache service.
|
|
64
|
+
* This method configures virtual hosts, disables default ports (80/443) in the main config
|
|
65
|
+
* to avoid conflicts, and starts or stops the service using shell commands.
|
|
66
|
+
*
|
|
67
|
+
* @method initService
|
|
68
|
+
* @param {object} [options={daemon: false}] - Options for service initialization.
|
|
69
|
+
* @param {boolean} [options.daemon=false] - Flag to indicate if the service should be run as a daemon (currently unused in logic).
|
|
70
|
+
* @returns {Promise<void>}
|
|
71
|
+
* @memberof LamppService
|
|
72
|
+
*/
|
|
73
|
+
async initService(options = { daemon: false }) {
|
|
74
|
+
let cmd;
|
|
75
|
+
|
|
76
|
+
// 1. Write the current virtual host router configuration
|
|
77
|
+
fs.writeFileSync(`/opt/lampp/etc/extra/httpd-vhosts.conf`, this.router || '', 'utf8');
|
|
78
|
+
|
|
79
|
+
// 2. Ensure the vhosts file is included in the main httpd.conf
|
|
80
|
+
const httpdConfPath = `/opt/lampp/etc/httpd.conf`;
|
|
81
|
+
fs.writeFileSync(
|
|
82
|
+
httpdConfPath,
|
|
83
|
+
fs
|
|
84
|
+
.readFileSync(httpdConfPath, 'utf8')
|
|
85
|
+
.replace(`#Include etc/extra/httpd-vhosts.conf`, `Include etc/extra/httpd-vhosts.conf`),
|
|
86
|
+
'utf8',
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
// 3. Stop the service before making port changes
|
|
90
|
+
cmd = `sudo /opt/lampp/lampp stop`;
|
|
91
|
+
shellExec(cmd);
|
|
92
|
+
|
|
93
|
+
// 4. Comment out default port Listen directives (80 and 443) to prevent conflicts
|
|
94
|
+
// Modify httpd.conf (port 80)
|
|
95
|
+
if (!fs.readFileSync(httpdConfPath, 'utf8').match(/# Listen 80/))
|
|
96
|
+
fs.writeFileSync(
|
|
97
|
+
httpdConfPath,
|
|
98
|
+
fs.readFileSync(httpdConfPath, 'utf8').replace(`Listen 80`, `# Listen 80`),
|
|
99
|
+
'utf8',
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
// Modify httpd-ssl.conf (port 443)
|
|
103
|
+
const httpdSslConfPath = `/opt/lampp/etc/extra/httpd-ssl.conf`;
|
|
104
|
+
if (fs.existsSync(httpdSslConfPath) && !fs.readFileSync(httpdSslConfPath, 'utf8').match(/# Listen 443/))
|
|
105
|
+
fs.writeFileSync(
|
|
106
|
+
httpdSslConfPath,
|
|
107
|
+
fs.readFileSync(httpdSslConfPath, 'utf8').replace(`Listen 443`, `# Listen 443`),
|
|
108
|
+
'utf8',
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
// 5. Modify the lampp startup script to bypass port checking for 80 and 443
|
|
112
|
+
const lamppScriptPath = `/opt/lampp/lampp`;
|
|
113
|
+
if (!fs.readFileSync(lamppScriptPath, 'utf8').match(/testport 443 && false/))
|
|
114
|
+
fs.writeFileSync(
|
|
115
|
+
lamppScriptPath,
|
|
116
|
+
fs.readFileSync(lamppScriptPath, 'utf8').replace(`testport 443`, `testport 443 && false`),
|
|
117
|
+
'utf8',
|
|
118
|
+
);
|
|
119
|
+
if (!fs.readFileSync(lamppScriptPath, 'utf8').match(/testport 80 && false/))
|
|
120
|
+
fs.writeFileSync(
|
|
121
|
+
lamppScriptPath,
|
|
122
|
+
fs.readFileSync(lamppScriptPath, 'utf8').replace(`testport 80`, `testport 80 && false`),
|
|
123
|
+
'utf8',
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
// 6. Start the service
|
|
127
|
+
cmd = `sudo /opt/lampp/lampp start`;
|
|
128
|
+
if (this.router) fs.writeFileSync(`./tmp/lampp-router.conf`, this.router, 'utf-8');
|
|
129
|
+
shellExec(cmd);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Appends new Apache VirtualHost configuration content to the internal router string.
|
|
134
|
+
* If a router config file exists from a previous run, it loads it first.
|
|
135
|
+
*
|
|
136
|
+
* @method appendRouter
|
|
137
|
+
* @param {string} render - The new VirtualHost configuration string to append.
|
|
138
|
+
* @returns {string} The complete, updated router configuration string.
|
|
139
|
+
* @memberof LamppService
|
|
140
|
+
*/
|
|
141
|
+
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
|
+
}
|
|
149
|
+
return (this.router += render);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Resets the internal router configuration and removes the temporary configuration file.
|
|
154
|
+
*
|
|
155
|
+
* @memberof LamppService
|
|
156
|
+
* @returns {void}
|
|
157
|
+
*/
|
|
158
|
+
removeRouter() {
|
|
159
|
+
this.router = undefined;
|
|
160
|
+
if (fs.existsSync(`./tmp/lampp-router.conf`)) fs.rmSync(`./tmp/lampp-router.conf`);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Installs and configures the Lampp service on Linux.
|
|
165
|
+
* This includes downloading the installer, running it, and setting up initial configurations.
|
|
166
|
+
* Only runs on the 'linux' platform.
|
|
167
|
+
*
|
|
168
|
+
* @method install
|
|
169
|
+
* @returns {Promise<void>}
|
|
170
|
+
* @memberof LamppService
|
|
171
|
+
*/
|
|
172
|
+
async install() {
|
|
173
|
+
if (process.platform === 'linux') {
|
|
174
|
+
if (!fs.existsSync(`./engine-private/setup`)) fs.mkdirSync(`./engine-private/setup`, { recursive: true });
|
|
175
|
+
|
|
176
|
+
shellCd(`./engine-private/setup`);
|
|
177
|
+
|
|
178
|
+
if (!process.argv.includes(`server`)) {
|
|
179
|
+
// Download and run the XAMPP installer
|
|
180
|
+
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`,
|
|
182
|
+
);
|
|
183
|
+
shellExec(`sudo chmod +x xampp-linux-installer.run`);
|
|
184
|
+
shellExec(
|
|
185
|
+
`sudo ./xampp-linux-installer.run --mode unattended && \\` +
|
|
186
|
+
// Create symlink for easier access
|
|
187
|
+
`ln -sf /opt/lampp/lampp /usr/bin/lampp && \\` +
|
|
188
|
+
// Allow all access to xampp config (security measure override)
|
|
189
|
+
`sed -i.bak s'/Require local/Require all granted/g' /opt/lampp/etc/extra/httpd-xampp.conf && \\` +
|
|
190
|
+
// Enable display errors in PHP
|
|
191
|
+
`sed -i.bak s'/display_errors=Off/display_errors=On/g' /opt/lampp/etc/php.ini && \\` +
|
|
192
|
+
// Allow including custom Apache configuration files
|
|
193
|
+
`mkdir /opt/lampp/apache2/conf.d && \\` +
|
|
194
|
+
`echo "IncludeOptional /opt/lampp/apache2/conf.d/*.conf" >> /opt/lampp/etc/httpd.conf && \\` +
|
|
195
|
+
// Create /www directory and symlink it to htdocs
|
|
196
|
+
`mkdir /www && \\` +
|
|
197
|
+
`ln -s /www /opt/lampp/htdocs`,
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Copy log files to standard names for easier consumption
|
|
202
|
+
if (fs.existsSync(`/opt/lampp/logs/access_log`))
|
|
203
|
+
fs.copySync(`/opt/lampp/logs/access_log`, `/opt/lampp/logs/access.log`);
|
|
204
|
+
if (fs.existsSync(`/opt/lampp/logs/error_log`))
|
|
205
|
+
fs.copySync(`/opt/lampp/logs/error_log`, `/opt/lampp/logs/error.log`);
|
|
206
|
+
if (fs.existsSync(`/opt/lampp/logs/php_error_log`))
|
|
207
|
+
fs.copySync(`/opt/lampp/logs/php_error_log`, `/opt/lampp/logs/php_error.log`);
|
|
208
|
+
if (fs.existsSync(`/opt/lampp/logs/ssl_request_log`))
|
|
209
|
+
fs.copySync(`/opt/lampp/logs/ssl_request_log`, `/opt/lampp/logs/ssl_request.log`);
|
|
210
|
+
|
|
211
|
+
// Initialize the service after installation
|
|
212
|
+
await this.initService({ daemon: true });
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Creates and appends a new Apache VirtualHost entry to the router configuration for a web application.
|
|
218
|
+
* The router is then applied by calling {@link LamppService#initService}.
|
|
219
|
+
*
|
|
220
|
+
* @method createApp
|
|
221
|
+
* @param {object} options - Configuration options for the new web application.
|
|
222
|
+
* @param {number} options.port - The port the VirtualHost should listen on.
|
|
223
|
+
* @param {string} options.host - The ServerName/host for the VirtualHost.
|
|
224
|
+
* @param {string} options.path - The base path for error documents (e.g., '/app').
|
|
225
|
+
* @param {string} [options.directory] - Optional absolute path to the document root.
|
|
226
|
+
* @param {string} [options.rootHostPath] - Relative path from the root directory to the document root, used if `directory` is not provided.
|
|
227
|
+
* @param {boolean} [options.redirect] - If true, enables RewriteEngine for redirection.
|
|
228
|
+
* @param {string} [options.redirectTarget] - The target URL for redirection.
|
|
229
|
+
* @param {boolean} [options.resetRouter] - If true, clears the existing router configuration before appending the new one.
|
|
230
|
+
* @returns {{disabled: boolean}} An object indicating if the service is disabled.
|
|
231
|
+
* @memberof LamppService
|
|
232
|
+
*/
|
|
233
|
+
createApp({ port, host, path, directory, rootHostPath, redirect, redirectTarget, resetRouter }) {
|
|
234
|
+
if (!this.enabled()) return { disabled: true };
|
|
235
|
+
|
|
236
|
+
if (!this.ports.includes(port)) this.ports.push(port);
|
|
237
|
+
if (resetRouter) this.removeRouter();
|
|
238
|
+
|
|
239
|
+
const documentRoot = directory ? directory : `${getRootDirectory()}${rootHostPath}`;
|
|
240
|
+
|
|
241
|
+
// Append the new VirtualHost configuration
|
|
242
|
+
this.appendRouter(`
|
|
243
|
+
Listen ${port}
|
|
244
|
+
|
|
245
|
+
<VirtualHost *:${port}>
|
|
246
|
+
DocumentRoot "${documentRoot}"
|
|
247
|
+
ServerName ${host}:${port}
|
|
248
|
+
|
|
249
|
+
<Directory "${documentRoot}">
|
|
250
|
+
Options Indexes FollowSymLinks MultiViews
|
|
251
|
+
AllowOverride All
|
|
252
|
+
Require all granted
|
|
253
|
+
</Directory>
|
|
254
|
+
|
|
255
|
+
${
|
|
256
|
+
redirect
|
|
257
|
+
? `
|
|
258
|
+
RewriteEngine on
|
|
259
|
+
|
|
260
|
+
# Exclude the ACME challenge path for certificate renewals
|
|
261
|
+
RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge
|
|
262
|
+
RewriteRule ^(.*)$ ${redirectTarget}%{REQUEST_URI} [R=302,L]
|
|
263
|
+
`
|
|
264
|
+
: ''
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
# Custom Error Documents
|
|
268
|
+
ErrorDocument 400 ${path === '/' ? '' : path}/400.html
|
|
269
|
+
ErrorDocument 404 ${path === '/' ? '' : path}/400.html
|
|
270
|
+
ErrorDocument 500 ${path === '/' ? '' : path}/500.html
|
|
271
|
+
ErrorDocument 502 ${path === '/' ? '' : path}/500.html
|
|
272
|
+
ErrorDocument 503 ${path === '/' ? '' : path}/500.html
|
|
273
|
+
ErrorDocument 504 ${path === '/' ? '' : path}/500.html
|
|
274
|
+
|
|
275
|
+
</VirtualHost>
|
|
276
|
+
|
|
277
|
+
`);
|
|
278
|
+
|
|
279
|
+
return { disabled: false };
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* @description Exported singleton instance of the LamppService class.
|
|
285
|
+
* This object is used to interact with the Lampp configuration and service.
|
|
286
|
+
* @memberof LamppService
|
|
287
|
+
* @type {LamppService}
|
|
288
|
+
*/
|
|
289
|
+
const Lampp = new LamppService();
|
|
290
|
+
|
|
291
|
+
export { Lampp };
|
|
292
|
+
|
|
293
|
+
// -- helper info --
|
|
294
|
+
|
|
295
|
+
// ERR too many redirects:
|
|
296
|
+
// Check: SELECT * FROM database.wp_options where option_name = 'siteurl' or option_name = 'home';
|
|
297
|
+
// Check: wp-config.php
|
|
298
|
+
// if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
|
|
299
|
+
// $_SERVER['HTTPS'] = 'on';
|
|
300
|
+
// }
|
|
301
|
+
// For plugins:
|
|
302
|
+
// define( 'FS_METHOD', 'direct' );
|
|
303
|
+
|
|
304
|
+
// ErrorDocument 404 /custom_404.html
|
|
305
|
+
// ErrorDocument 500 /custom_50x.html
|
|
306
|
+
// ErrorDocument 502 /custom_50x.html
|
|
307
|
+
// ErrorDocument 503 /custom_50x.html
|
|
308
|
+
// ErrorDocument 504 /custom_50x.html
|
|
309
|
+
|
|
310
|
+
// Respond When Error Pages are Directly Requested
|
|
311
|
+
|
|
312
|
+
// <Files "custom_404.html">
|
|
313
|
+
// <If "-z %{ENV:REDIRECT_STATUS}">
|
|
314
|
+
// RedirectMatch 404 ^/custom_404.html$
|
|
315
|
+
// </If>
|
|
316
|
+
// </Files>
|
|
317
|
+
|
|
318
|
+
// <Files "custom_50x.html">
|
|
319
|
+
// <If "-z %{ENV:REDIRECT_STATUS}">
|
|
320
|
+
// RedirectMatch 404 ^/custom_50x.html$
|
|
321
|
+
// </If>
|
|
322
|
+
// </Files>
|
|
323
|
+
|
|
324
|
+
// Add www or https with htaccess rewrite
|
|
325
|
+
|
|
326
|
+
// Options +FollowSymLinks
|
|
327
|
+
// RewriteEngine On
|
|
328
|
+
// RewriteCond %{HTTP_HOST} ^example.com [NC]
|
|
329
|
+
// RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
|
|
330
|
+
|
|
331
|
+
// Redirect http to https with htaccess rewrite
|
|
332
|
+
|
|
333
|
+
// RewriteEngine On
|
|
334
|
+
// RewriteCond %{SERVER_PORT} 80
|
|
335
|
+
// RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
|
|
336
|
+
|
|
337
|
+
// Redirect to HTTPS with www subdomain
|
|
338
|
+
|
|
339
|
+
// RewriteEngine On
|
|
340
|
+
// RewriteCond %{HTTPS} off [OR]
|
|
341
|
+
// RewriteCond %{HTTP_HOST} ^www\. [NC]
|
|
342
|
+
// RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
|
|
343
|
+
// RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
|