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
package/bin/deploy.js
ADDED
|
@@ -0,0 +1,1293 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import axios from 'axios';
|
|
3
|
+
|
|
4
|
+
import dotenv from 'dotenv';
|
|
5
|
+
|
|
6
|
+
import { pbcopy, shellCd, shellExec } from '../src/server/process.js';
|
|
7
|
+
import { loggerFactory } from '../src/server/logger.js';
|
|
8
|
+
import {
|
|
9
|
+
Config,
|
|
10
|
+
addApiConf,
|
|
11
|
+
addClientConf,
|
|
12
|
+
buildApiSrc,
|
|
13
|
+
buildClientSrc,
|
|
14
|
+
cloneConf,
|
|
15
|
+
loadConf,
|
|
16
|
+
loadReplicas,
|
|
17
|
+
addWsConf,
|
|
18
|
+
buildWsSrc,
|
|
19
|
+
cloneSrcComponents,
|
|
20
|
+
getDataDeploy,
|
|
21
|
+
buildReplicaId,
|
|
22
|
+
Cmd,
|
|
23
|
+
writeEnv,
|
|
24
|
+
buildCliDoc,
|
|
25
|
+
} from '../src/server/conf.js';
|
|
26
|
+
import { buildClient } from '../src/server/client-build.js';
|
|
27
|
+
import { DefaultConf } from '../conf.js';
|
|
28
|
+
import colors from 'colors';
|
|
29
|
+
import { program } from '../src/cli/index.js';
|
|
30
|
+
import { getLocalIPv4Address, ip } from '../src/server/dns.js';
|
|
31
|
+
import { timer } from '../src/client/components/core/CommonJs.js';
|
|
32
|
+
|
|
33
|
+
colors.enable();
|
|
34
|
+
|
|
35
|
+
const logger = loggerFactory(import.meta);
|
|
36
|
+
|
|
37
|
+
logger.info('argv', process.argv);
|
|
38
|
+
|
|
39
|
+
const [exe, dir, operator] = process.argv;
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
switch (operator) {
|
|
43
|
+
case 'add-nodejs-app-client-conf':
|
|
44
|
+
{
|
|
45
|
+
const toOptions = {
|
|
46
|
+
deployId: process.argv[3],
|
|
47
|
+
clientId: process.argv[4],
|
|
48
|
+
host: process.argv[5],
|
|
49
|
+
path: process.argv[6],
|
|
50
|
+
};
|
|
51
|
+
const fromOptions = { deployId: process.argv[7], clientId: process.argv[8] };
|
|
52
|
+
addClientConf({ toOptions, fromOptions });
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
case 'build-nodejs-conf-app':
|
|
56
|
+
{
|
|
57
|
+
const toOptions = { deployId: process.argv[3], clientId: process.argv[4] };
|
|
58
|
+
const fromOptions = { deployId: process.argv[5], clientId: process.argv[6] };
|
|
59
|
+
cloneConf({ toOptions, fromOptions });
|
|
60
|
+
}
|
|
61
|
+
break;
|
|
62
|
+
case 'clone-nodejs-src-client-components':
|
|
63
|
+
{
|
|
64
|
+
const fromOptions = { componentsFolder: process.argv[3] };
|
|
65
|
+
const toOptions = { componentsFolder: process.argv[4] };
|
|
66
|
+
cloneSrcComponents({ toOptions, fromOptions });
|
|
67
|
+
}
|
|
68
|
+
break;
|
|
69
|
+
case 'build-nodejs-src-app':
|
|
70
|
+
{
|
|
71
|
+
const toOptions = { deployId: process.argv[3], clientId: process.argv[4] };
|
|
72
|
+
const fromOptions = { deployId: process.argv[5], clientId: process.argv[6] };
|
|
73
|
+
buildClientSrc({ toOptions, fromOptions });
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
case 'build-nodejs-conf-api':
|
|
77
|
+
{
|
|
78
|
+
const toOptions = { apiId: process.argv[3], deployId: process.argv[4], clientId: process.argv[5] };
|
|
79
|
+
const fromOptions = { apiId: process.argv[6], deployId: process.argv[7], clientId: process.argv[8] };
|
|
80
|
+
addApiConf({ toOptions, fromOptions });
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
case 'build-nodejs-src-api':
|
|
84
|
+
{
|
|
85
|
+
const toOptions = { apiId: process.argv[3], deployId: process.argv[4], clientId: process.argv[5] };
|
|
86
|
+
const fromOptions = { apiId: process.argv[6], deployId: process.argv[7], clientId: process.argv[8] };
|
|
87
|
+
buildApiSrc({ toOptions, fromOptions });
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
case 'build-nodejs-conf-ws':
|
|
91
|
+
{
|
|
92
|
+
const toOptions = {
|
|
93
|
+
wsId: process.argv[3],
|
|
94
|
+
deployId: process.argv[4],
|
|
95
|
+
host: process.argv[5],
|
|
96
|
+
paths: process.argv[6],
|
|
97
|
+
};
|
|
98
|
+
const fromOptions = {
|
|
99
|
+
wsId: process.argv[7],
|
|
100
|
+
deployId: process.argv[8],
|
|
101
|
+
host: process.argv[9],
|
|
102
|
+
paths: process.argv[10],
|
|
103
|
+
};
|
|
104
|
+
addWsConf({ toOptions, fromOptions });
|
|
105
|
+
}
|
|
106
|
+
break;
|
|
107
|
+
case 'build-nodejs-src-ws':
|
|
108
|
+
{
|
|
109
|
+
const toOptions = {
|
|
110
|
+
wsId: process.argv[3],
|
|
111
|
+
deployId: process.argv[4],
|
|
112
|
+
host: process.argv[5],
|
|
113
|
+
paths: process.argv[6],
|
|
114
|
+
};
|
|
115
|
+
const fromOptions = {
|
|
116
|
+
wsId: process.argv[7],
|
|
117
|
+
deployId: process.argv[8],
|
|
118
|
+
host: process.argv[9],
|
|
119
|
+
paths: process.argv[10],
|
|
120
|
+
};
|
|
121
|
+
buildWsSrc({ toOptions, fromOptions });
|
|
122
|
+
}
|
|
123
|
+
break;
|
|
124
|
+
case 'conf': {
|
|
125
|
+
let subConf = process.argv[5] ?? '';
|
|
126
|
+
|
|
127
|
+
if (!['current', 'clean'].includes(process.argv[3]))
|
|
128
|
+
dotenv.config({ path: `./engine-private/conf/${process.argv[3]}/.env.${process.argv[4]}`, override: true });
|
|
129
|
+
|
|
130
|
+
loadConf(process.argv[3], subConf);
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
case 'new-nodejs-app':
|
|
135
|
+
{
|
|
136
|
+
const deployId = process.argv[3];
|
|
137
|
+
const clientId = process.argv[4];
|
|
138
|
+
|
|
139
|
+
shellExec(`node bin/deploy build-nodejs-conf-app ${deployId} ${clientId}`);
|
|
140
|
+
|
|
141
|
+
shellExec(`node bin/deploy build-nodejs-src-app ${deployId} ${clientId}`);
|
|
142
|
+
|
|
143
|
+
shellExec(`node bin/deploy build-full-client ${deployId}`);
|
|
144
|
+
|
|
145
|
+
shellExec(`npm run dev ${deployId}`);
|
|
146
|
+
}
|
|
147
|
+
break;
|
|
148
|
+
case 'test-new-api':
|
|
149
|
+
{
|
|
150
|
+
const port = process.argv[3];
|
|
151
|
+
const apiId = process.argv[4];
|
|
152
|
+
let url = `http://localhost:${port}/api/${apiId}`;
|
|
153
|
+
{
|
|
154
|
+
logger.info(`POST REQUEST`, url);
|
|
155
|
+
const result = await axios.post(url, {});
|
|
156
|
+
url += '/' + result.data.data._id;
|
|
157
|
+
logger.info(`POST RESULT ${url}`, result.data);
|
|
158
|
+
}
|
|
159
|
+
{
|
|
160
|
+
logger.info(`GET REQUEST`, url);
|
|
161
|
+
const result = await axios.get(url);
|
|
162
|
+
logger.info(`GET RESULT ${url}`, result.data);
|
|
163
|
+
}
|
|
164
|
+
{
|
|
165
|
+
logger.info(`DELETE REQUEST`, url);
|
|
166
|
+
const result = await axios.delete(url);
|
|
167
|
+
logger.info(`DELETE RESULT ${url}`, result.data);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
break;
|
|
171
|
+
case 'new-nodejs-api':
|
|
172
|
+
{
|
|
173
|
+
const apiId = process.argv[3];
|
|
174
|
+
const deployId = process.argv[4];
|
|
175
|
+
const clientId = process.argv[5];
|
|
176
|
+
|
|
177
|
+
shellExec(`node bin/deploy build-nodejs-conf-api ${apiId} ${deployId} ${clientId}`);
|
|
178
|
+
|
|
179
|
+
shellExec(`node bin/deploy build-nodejs-src-api ${apiId} ${deployId} ${clientId}`);
|
|
180
|
+
|
|
181
|
+
// shellExec(`npm run dev ${deployId}`);
|
|
182
|
+
}
|
|
183
|
+
break;
|
|
184
|
+
case 'new-nodejs-ws':
|
|
185
|
+
{
|
|
186
|
+
const wsId = process.argv[3];
|
|
187
|
+
const deployId = process.argv[4];
|
|
188
|
+
const host = process.argv[5];
|
|
189
|
+
const paths = process.argv[6];
|
|
190
|
+
|
|
191
|
+
shellExec(`node bin/deploy build-nodejs-conf-ws ${wsId} ${deployId} ${host} ${paths}`);
|
|
192
|
+
|
|
193
|
+
shellExec(`node bin/deploy build-nodejs-src-ws ${wsId} ${deployId} ${host} ${paths}`);
|
|
194
|
+
|
|
195
|
+
shellExec(`npm run dev ${deployId}`);
|
|
196
|
+
}
|
|
197
|
+
break;
|
|
198
|
+
case 'build-full-client':
|
|
199
|
+
{
|
|
200
|
+
dotenv.config({ override: true });
|
|
201
|
+
if (!process.argv[3]) process.argv[3] = 'dd-default';
|
|
202
|
+
const { deployId } = loadConf(process.argv[3], process.argv[4] ?? '');
|
|
203
|
+
|
|
204
|
+
let argHost = process.argv[5] ? process.argv[5].split(',') : [];
|
|
205
|
+
let argPath = process.argv[6] ? process.argv[6].split(',') : [];
|
|
206
|
+
let deployIdSingleReplicas = [];
|
|
207
|
+
const serverConf = deployId
|
|
208
|
+
? JSON.parse(fs.readFileSync(`./conf/conf.server.json`, 'utf8'))
|
|
209
|
+
: Config.default.server;
|
|
210
|
+
for (const host of Object.keys(serverConf)) {
|
|
211
|
+
for (const path of Object.keys(serverConf[host])) {
|
|
212
|
+
if (argHost.length && argPath.length && (!argHost.includes(host) || !argPath.includes(path))) {
|
|
213
|
+
delete serverConf[host][path];
|
|
214
|
+
} else {
|
|
215
|
+
serverConf[host][path].liteBuild = process.argv.includes('l') ? true : false;
|
|
216
|
+
serverConf[host][path].minifyBuild = process.env.NODE_ENV === 'production' ? true : false;
|
|
217
|
+
if (serverConf[host][path].singleReplica && serverConf[host][path].replicas) {
|
|
218
|
+
deployIdSingleReplicas = deployIdSingleReplicas.concat(
|
|
219
|
+
serverConf[host][path].replicas.map((replica) => buildReplicaId({ deployId, replica })),
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
fs.writeFileSync(`./conf/conf.server.json`, JSON.stringify(serverConf, null, 4), 'utf-8');
|
|
226
|
+
await buildClient();
|
|
227
|
+
|
|
228
|
+
for (const replicaDeployId of deployIdSingleReplicas) {
|
|
229
|
+
shellExec(Cmd.conf(replicaDeployId, process.env.NODE_ENV));
|
|
230
|
+
shellExec(Cmd.build(replicaDeployId));
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
break;
|
|
234
|
+
|
|
235
|
+
case 'update-dependencies':
|
|
236
|
+
const files = await fs.readdir(`./engine-private/conf`, { recursive: true });
|
|
237
|
+
const originPackage = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
|
|
238
|
+
for (const relativePath of files) {
|
|
239
|
+
const filePah = `./engine-private/conf/${relativePath.replaceAll(`\\`, '/')}`;
|
|
240
|
+
if (filePah.split('/').pop() === 'package.json') {
|
|
241
|
+
const deployPackage = JSON.parse(fs.readFileSync(filePah), 'utf8');
|
|
242
|
+
deployPackage.dependencies = originPackage.dependencies;
|
|
243
|
+
deployPackage.devDependencies = originPackage.devDependencies;
|
|
244
|
+
fs.writeFileSync(filePah, JSON.stringify(deployPackage, null, 4), 'utf8');
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
break;
|
|
248
|
+
|
|
249
|
+
case 'sync-env-port':
|
|
250
|
+
const dataDeploy = getDataDeploy({ deployGroupId: process.argv[3], disableSyncEnvPort: true });
|
|
251
|
+
const dataEnv = [
|
|
252
|
+
{ env: 'production', port: 3000 },
|
|
253
|
+
{ env: 'development', port: 4000 },
|
|
254
|
+
{ env: 'test', port: 5000 },
|
|
255
|
+
];
|
|
256
|
+
let port = 0;
|
|
257
|
+
const singleReplicaHosts = [];
|
|
258
|
+
for (const deployIdObj of dataDeploy) {
|
|
259
|
+
const { deployId, replicaHost } = deployIdObj;
|
|
260
|
+
if (replicaHost && !singleReplicaHosts.includes(replicaHost)) singleReplicaHosts.push(replicaHost);
|
|
261
|
+
const baseConfPath = fs.existsSync(`./engine-private/replica/${deployId}`)
|
|
262
|
+
? `./engine-private/replica`
|
|
263
|
+
: `./engine-private/conf`;
|
|
264
|
+
for (const envInstanceObj of dataEnv) {
|
|
265
|
+
const envPath = `${baseConfPath}/${deployId}/.env.${envInstanceObj.env}`;
|
|
266
|
+
const envObj = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
|
|
267
|
+
envObj.PORT = envInstanceObj.port + port - singleReplicaHosts.length - (replicaHost ? 1 : 0);
|
|
268
|
+
|
|
269
|
+
writeEnv(envPath, envObj);
|
|
270
|
+
}
|
|
271
|
+
const serverConf = loadReplicas(
|
|
272
|
+
JSON.parse(fs.readFileSync(`${baseConfPath}/${deployId}/conf.server.json`, 'utf8')),
|
|
273
|
+
);
|
|
274
|
+
for (const host of Object.keys(serverConf)) port += Object.keys(serverConf[host]).length;
|
|
275
|
+
}
|
|
276
|
+
break;
|
|
277
|
+
|
|
278
|
+
case 'build-single-replica': {
|
|
279
|
+
const deployId = process.argv[3];
|
|
280
|
+
const host = process.argv[4];
|
|
281
|
+
const path = process.argv[5];
|
|
282
|
+
const serverConf = loadReplicas(
|
|
283
|
+
JSON.parse(fs.readFileSync(`./engine-private/conf/${deployId}/conf.server.json`, 'utf8')),
|
|
284
|
+
);
|
|
285
|
+
|
|
286
|
+
if (serverConf[host][path].replicas) {
|
|
287
|
+
{
|
|
288
|
+
let replicaIndex = -1;
|
|
289
|
+
for (const replica of serverConf[host][path].replicas) {
|
|
290
|
+
replicaIndex++;
|
|
291
|
+
const replicaDeployId = `${deployId}-${serverConf[host][path].replicas[replicaIndex].slice(1)}`;
|
|
292
|
+
// fs.mkdirSync(`./engine-private/replica/${deployId}${replicaIndex}`, { recursive: true });
|
|
293
|
+
await fs.copy(`./engine-private/conf/${deployId}`, `./engine-private/replica/${replicaDeployId}`);
|
|
294
|
+
fs.writeFileSync(
|
|
295
|
+
`./engine-private/replica/${replicaDeployId}/package.json`,
|
|
296
|
+
fs
|
|
297
|
+
.readFileSync(`./engine-private/replica/${replicaDeployId}/package.json`, 'utf8')
|
|
298
|
+
.replaceAll(`${deployId}`, `${replicaDeployId}`),
|
|
299
|
+
'utf8',
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
{
|
|
304
|
+
let replicaIndex = -1;
|
|
305
|
+
for (const replica of serverConf[host][path].replicas) {
|
|
306
|
+
replicaIndex++;
|
|
307
|
+
const replicaDeployId = `${deployId}-${serverConf[host][path].replicas[replicaIndex].slice(1)}`;
|
|
308
|
+
let replicaServerConf = JSON.parse(
|
|
309
|
+
fs.readFileSync(`./engine-private/replica/${replicaDeployId}/conf.server.json`, 'utf8'),
|
|
310
|
+
);
|
|
311
|
+
|
|
312
|
+
const singleReplicaConf = replicaServerConf[host][path];
|
|
313
|
+
singleReplicaConf.replicas = undefined;
|
|
314
|
+
singleReplicaConf.singleReplica = undefined;
|
|
315
|
+
|
|
316
|
+
replicaServerConf = {};
|
|
317
|
+
replicaServerConf[host] = {};
|
|
318
|
+
replicaServerConf[host][replica] = singleReplicaConf;
|
|
319
|
+
|
|
320
|
+
fs.writeFileSync(
|
|
321
|
+
`./engine-private/replica/${replicaDeployId}/conf.server.json`,
|
|
322
|
+
JSON.stringify(replicaServerConf, null, 4),
|
|
323
|
+
'utf8',
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
case 'rename-package': {
|
|
332
|
+
const name = process.argv[3];
|
|
333
|
+
const originPackage = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
|
|
334
|
+
originPackage.name = name;
|
|
335
|
+
fs.writeFileSync(`./package.json`, JSON.stringify(originPackage, null, 4), 'utf8');
|
|
336
|
+
|
|
337
|
+
const originPackageLockJson = JSON.parse(fs.readFileSync(`./package-lock.json`, 'utf8'));
|
|
338
|
+
originPackageLockJson.name = name;
|
|
339
|
+
originPackageLockJson.packages[''].name = name;
|
|
340
|
+
fs.writeFileSync(`./package-lock.json`, JSON.stringify(originPackageLockJson, null, 4), 'utf8');
|
|
341
|
+
|
|
342
|
+
break;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
case 'set-repo': {
|
|
346
|
+
const originPackage = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
|
|
347
|
+
originPackage.repository = {
|
|
348
|
+
type: 'git',
|
|
349
|
+
url: `git+https://github.com/${process.argv[3]}.git`,
|
|
350
|
+
};
|
|
351
|
+
fs.writeFileSync(`./package.json`, JSON.stringify(originPackage, null, 4), 'utf8');
|
|
352
|
+
|
|
353
|
+
break;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
case 'clean-core-repo': {
|
|
357
|
+
shellCd(`/home/dd/engine`);
|
|
358
|
+
shellExec(`git reset`);
|
|
359
|
+
shellExec(`git checkout .`);
|
|
360
|
+
shellExec(`git clean -f -d`);
|
|
361
|
+
shellCd(`/home/dd/engine/engine-private`);
|
|
362
|
+
shellExec(`git reset`);
|
|
363
|
+
shellExec(`git checkout .`);
|
|
364
|
+
shellExec(`git clean -f -d`);
|
|
365
|
+
shellCd(`/home/dd/engine`);
|
|
366
|
+
break;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
case 'version-build': {
|
|
370
|
+
shellCd(`/home/dd/engine`);
|
|
371
|
+
shellExec(`node bin/deploy clean-core-repo`);
|
|
372
|
+
shellExec(`node bin pull . ${process.env.GITHUB_USERNAME}/engine`);
|
|
373
|
+
shellExec(`node bin run kill 4001`);
|
|
374
|
+
shellExec(`node bin run kill 4002`);
|
|
375
|
+
shellExec(`node bin run kill 4003`);
|
|
376
|
+
shellExec(`npm run update-template`);
|
|
377
|
+
shellExec(`cd ../pwa-microservices-template && npm install`);
|
|
378
|
+
shellExec(`cd ../pwa-microservices-template && npm run build && timeout 5s npm run dev`, {
|
|
379
|
+
async: true,
|
|
380
|
+
});
|
|
381
|
+
await timer(5500);
|
|
382
|
+
const templateRunnerResult = fs.readFileSync(`../pwa-microservices-template/logs/start.js/all.log`, 'utf8');
|
|
383
|
+
logger.info('Test template runner result');
|
|
384
|
+
console.log(templateRunnerResult);
|
|
385
|
+
if (!templateRunnerResult || templateRunnerResult.toLowerCase().match('error')) {
|
|
386
|
+
logger.error('Test template runner result failed');
|
|
387
|
+
break;
|
|
388
|
+
}
|
|
389
|
+
shellCd(`/home/dd/engine`);
|
|
390
|
+
shellExec(`node bin/deploy clean-core-repo`);
|
|
391
|
+
const originPackageJson = JSON.parse(fs.readFileSync(`package.json`, 'utf8'));
|
|
392
|
+
const newVersion = process.argv[3] ?? originPackageJson.version;
|
|
393
|
+
const node = process.argv[4] ?? 'kind-control-plane';
|
|
394
|
+
const { version } = originPackageJson;
|
|
395
|
+
originPackageJson.version = newVersion;
|
|
396
|
+
fs.writeFileSync(`package.json`, JSON.stringify(originPackageJson, null, 4), 'utf8');
|
|
397
|
+
|
|
398
|
+
const originPackageLockJson = JSON.parse(fs.readFileSync(`package-lock.json`, 'utf8'));
|
|
399
|
+
originPackageLockJson.version = newVersion;
|
|
400
|
+
originPackageLockJson.packages[''].version = newVersion;
|
|
401
|
+
fs.writeFileSync(`package-lock.json`, JSON.stringify(originPackageLockJson, null, 4), 'utf8');
|
|
402
|
+
|
|
403
|
+
if (fs.existsSync(`./engine-private/conf`)) {
|
|
404
|
+
const files = await fs.readdir(`./engine-private/conf`, { recursive: true });
|
|
405
|
+
for (const relativePath of files) {
|
|
406
|
+
const filePah = `./engine-private/conf/${relativePath.replaceAll(`\\`, '/')}`;
|
|
407
|
+
if (filePah.split('/').pop() === 'package.json') {
|
|
408
|
+
const originPackage = JSON.parse(fs.readFileSync(filePah, 'utf8'));
|
|
409
|
+
originPackage.version = newVersion;
|
|
410
|
+
fs.writeFileSync(filePah, JSON.stringify(originPackage, null, 4), 'utf8');
|
|
411
|
+
}
|
|
412
|
+
if (filePah.split('/').pop() === 'deployment.yaml') {
|
|
413
|
+
fs.writeFileSync(
|
|
414
|
+
filePah,
|
|
415
|
+
fs
|
|
416
|
+
.readFileSync(filePah, 'utf8')
|
|
417
|
+
.replaceAll(`v${version}`, `v${newVersion}`)
|
|
418
|
+
.replaceAll(`engine.version: ${version}`, `engine.version: ${newVersion}`),
|
|
419
|
+
'utf8',
|
|
420
|
+
);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
fs.writeFileSync(
|
|
426
|
+
`./manifests/deployment/dd-default-development/deployment.yaml`,
|
|
427
|
+
fs
|
|
428
|
+
.readFileSync(`./manifests/deployment/dd-default-development/deployment.yaml`, 'utf8')
|
|
429
|
+
.replaceAll(`underpost:v${version}`, `underpost:v${newVersion}`),
|
|
430
|
+
'utf8',
|
|
431
|
+
);
|
|
432
|
+
|
|
433
|
+
if (fs.existsSync(`./.github/workflows/docker-image.ci.yml`))
|
|
434
|
+
fs.writeFileSync(
|
|
435
|
+
`./.github/workflows/docker-image.ci.yml`,
|
|
436
|
+
fs
|
|
437
|
+
.readFileSync(`./.github/workflows/docker-image.ci.yml`, 'utf8')
|
|
438
|
+
.replaceAll(`underpost-engine:v${version}`, `underpost-engine:v${newVersion}`),
|
|
439
|
+
'utf8',
|
|
440
|
+
);
|
|
441
|
+
|
|
442
|
+
fs.writeFileSync(
|
|
443
|
+
`./src/index.js`,
|
|
444
|
+
fs.readFileSync(`./src/index.js`, 'utf8').replaceAll(`${version}`, `${newVersion}`),
|
|
445
|
+
'utf8',
|
|
446
|
+
);
|
|
447
|
+
shellExec(`node bin/deploy cli-docs ${version} ${newVersion}`);
|
|
448
|
+
shellExec(`node bin/deploy update-dependencies`);
|
|
449
|
+
shellExec(`auto-changelog`);
|
|
450
|
+
shellExec(`node bin/build dd`);
|
|
451
|
+
shellExec(
|
|
452
|
+
`node bin deploy --kubeadm --build-manifest --sync --info-router --replicas 1 --node ${node} dd production`,
|
|
453
|
+
);
|
|
454
|
+
shellExec(
|
|
455
|
+
`node bin deploy --kubeadm --build-manifest --sync --info-router --replicas 1 --node ${node} dd development `,
|
|
456
|
+
);
|
|
457
|
+
for (const deployId of fs.readFileSync(`./engine-private/deploy/dd.router`, 'utf8').split(`,`)) {
|
|
458
|
+
fs.copySync(
|
|
459
|
+
`./engine-private/conf/${deployId}/build/development/deployment.yaml`,
|
|
460
|
+
`./manifests/deployment/${deployId}-development/deployment.yaml`,
|
|
461
|
+
);
|
|
462
|
+
fs.copySync(
|
|
463
|
+
`./engine-private/conf/${deployId}/build/development/proxy.yaml`,
|
|
464
|
+
`./manifests/deployment/${deployId}-development/proxy.yaml`,
|
|
465
|
+
);
|
|
466
|
+
}
|
|
467
|
+
shellExec(`sudo rm -rf ./engine-private/conf/dd-default`);
|
|
468
|
+
shellExec(`node bin new --deploy-id dd-default`);
|
|
469
|
+
console.log(fs.existsSync(`./engine-private/conf/dd-default`));
|
|
470
|
+
shellExec(`sudo rm -rf ./engine-private/conf/dd-default`);
|
|
471
|
+
shellExec(`node bin/deploy build-env`);
|
|
472
|
+
break;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
case 'version-deploy': {
|
|
476
|
+
shellExec(
|
|
477
|
+
`underpost secret underpost --create-from-file /home/dd/engine/engine-private/conf/dd-cron/.env.production`,
|
|
478
|
+
);
|
|
479
|
+
shellExec(`node bin/build dd conf`);
|
|
480
|
+
shellExec(`git add . && cd ./engine-private && git add .`);
|
|
481
|
+
shellExec(`node bin cmt . ci package-pwa-microservices-template`);
|
|
482
|
+
shellExec(`node bin cmt ./engine-private ci package-pwa-microservices-template`);
|
|
483
|
+
shellExec(`node bin push . ${process.env.GITHUB_USERNAME}/engine`);
|
|
484
|
+
shellExec(`cd ./engine-private && node ../bin push . ${process.env.GITHUB_USERNAME}/engine-private`);
|
|
485
|
+
break;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
case 'update-authors': {
|
|
489
|
+
// #### Ordered by first contribution.
|
|
490
|
+
fs.writeFileSync(
|
|
491
|
+
'./AUTHORS.md',
|
|
492
|
+
`# Authors
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
${shellExec(`git log | grep Author: | sort -u`, { stdout: true }).split(`\n`).join(`\n\n\n`)}
|
|
496
|
+
|
|
497
|
+
#### Generated by [underpost.net](https://underpost.net)`,
|
|
498
|
+
'utf8',
|
|
499
|
+
);
|
|
500
|
+
|
|
501
|
+
break;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
case 'heb': {
|
|
505
|
+
// https://besu.hyperledger.org/
|
|
506
|
+
// https://github.com/hyperledger/besu/archive/refs/tags/24.9.1.tar.gz
|
|
507
|
+
|
|
508
|
+
switch (process.platform) {
|
|
509
|
+
case 'linux':
|
|
510
|
+
{
|
|
511
|
+
shellCd(`..`);
|
|
512
|
+
|
|
513
|
+
// Download the Linux binary
|
|
514
|
+
shellExec(`wget https://github.com/hyperledger/besu/releases/download/24.9.1/besu-24.9.1.tar.gz`);
|
|
515
|
+
|
|
516
|
+
// Unzip the file:
|
|
517
|
+
shellExec(`tar -xvzf besu-24.9.1.tar.gz`);
|
|
518
|
+
|
|
519
|
+
shellCd(`besu-24.9.1`);
|
|
520
|
+
|
|
521
|
+
shellExec(`bin/besu --help`);
|
|
522
|
+
|
|
523
|
+
// Set env path
|
|
524
|
+
// export PATH=$PATH:/home/dd/besu-24.9.1/bin
|
|
525
|
+
|
|
526
|
+
// Open src
|
|
527
|
+
// shellExec(`sudo code /home/dd/besu-24.9.1 --user-data-dir="/root/.vscode-root" --no-sandbox`);
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
break;
|
|
531
|
+
|
|
532
|
+
default:
|
|
533
|
+
break;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
break;
|
|
537
|
+
}
|
|
538
|
+
case 'build-env': {
|
|
539
|
+
const buildEnv = (privateEnvPath, originEnv, env) => {
|
|
540
|
+
const privateEnv = dotenv.parse(fs.readFileSync(privateEnvPath, 'utf8'));
|
|
541
|
+
for (const key of Object.keys(privateEnv)) {
|
|
542
|
+
if (key in env) {
|
|
543
|
+
console.warn(`Key ${key} already exists in origin env`);
|
|
544
|
+
continue;
|
|
545
|
+
}
|
|
546
|
+
if (key in originEnv) {
|
|
547
|
+
console.warn(`Key ${key} already exists in origin env`);
|
|
548
|
+
env[key] = originEnv[key];
|
|
549
|
+
continue;
|
|
550
|
+
}
|
|
551
|
+
env[key] =
|
|
552
|
+
`${key}`.toUpperCase().match('API') ||
|
|
553
|
+
`${key}`.toUpperCase().match('KEY') ||
|
|
554
|
+
`${key}`.toUpperCase().match('SECRET') ||
|
|
555
|
+
`${key}`.toUpperCase().match('TOKEN') ||
|
|
556
|
+
`${key}`.toUpperCase().match('PASSWORD') ||
|
|
557
|
+
`${key}`.toUpperCase().match('MAC')
|
|
558
|
+
? 'changethis'
|
|
559
|
+
: isNaN(parseFloat(privateEnv[key]))
|
|
560
|
+
? `${privateEnv[key]}`.match(`@`)
|
|
561
|
+
? 'admin@default.net'
|
|
562
|
+
: 'changethis'
|
|
563
|
+
: privateEnv[key];
|
|
564
|
+
}
|
|
565
|
+
return env;
|
|
566
|
+
};
|
|
567
|
+
for (let envPath of ['.env.development', '.env.production', '.env.test']) {
|
|
568
|
+
const originEnv = dotenv.parse(fs.readFileSync(`./${envPath}`, 'utf8'));
|
|
569
|
+
|
|
570
|
+
let env = {};
|
|
571
|
+
env = buildEnv(`./engine-private/conf/dd-cron/${envPath}`, originEnv, env);
|
|
572
|
+
env = buildEnv(`./engine-private/conf/dd-core/${envPath}`, originEnv, env);
|
|
573
|
+
writeEnv(envPath, env);
|
|
574
|
+
}
|
|
575
|
+
break;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
case 'update-default-conf': {
|
|
579
|
+
const defaultServer = DefaultConf.server['default.net']['/'];
|
|
580
|
+
let confName = process.argv[3];
|
|
581
|
+
let defaultConf = false;
|
|
582
|
+
if (confName === 'dd-github-pages') {
|
|
583
|
+
const host = `${process.env.GITHUB_USERNAME ?? 'underpostnet'}.github.io`;
|
|
584
|
+
const path = '/pwa-microservices-template-ghpkg';
|
|
585
|
+
DefaultConf.server = {
|
|
586
|
+
[host]: { [path]: defaultServer },
|
|
587
|
+
};
|
|
588
|
+
DefaultConf.server[host][path].apiBaseProxyPath = '/';
|
|
589
|
+
DefaultConf.server[host][path].apiBaseHost = 'www.nexodev.org';
|
|
590
|
+
defaultConf = true;
|
|
591
|
+
} else if (confName === 'template') {
|
|
592
|
+
const host = 'default.net';
|
|
593
|
+
const path = '/';
|
|
594
|
+
DefaultConf.server[host][path].valkey = {
|
|
595
|
+
port: 6379,
|
|
596
|
+
host: 'valkey-service.default.svc.cluster.local',
|
|
597
|
+
};
|
|
598
|
+
// mongodb-0.mongodb-service
|
|
599
|
+
DefaultConf.server[host][path].db.host = 'mongodb://mongodb-service:27017';
|
|
600
|
+
defaultConf = true;
|
|
601
|
+
} else if (confName && fs.existsSync(`./engine-private/conf/${confName}`)) {
|
|
602
|
+
DefaultConf.client = JSON.parse(fs.readFileSync(`./engine-private/conf/${confName}/conf.client.json`, 'utf8'));
|
|
603
|
+
DefaultConf.server = JSON.parse(fs.readFileSync(`./engine-private/conf/${confName}/conf.server.json`, 'utf8'));
|
|
604
|
+
DefaultConf.ssr = JSON.parse(fs.readFileSync(`./engine-private/conf/${confName}/conf.ssr.json`, 'utf8'));
|
|
605
|
+
// DefaultConf.cron = JSON.parse(fs.readFileSync(`./engine-private/conf/${confName}/conf.cron.json`, 'utf8'));
|
|
606
|
+
|
|
607
|
+
for (const host of Object.keys(DefaultConf.server)) {
|
|
608
|
+
for (const path of Object.keys(DefaultConf.server[host])) {
|
|
609
|
+
DefaultConf.server[host][path].db = defaultServer.db;
|
|
610
|
+
DefaultConf.server[host][path].mailer = defaultServer.mailer;
|
|
611
|
+
|
|
612
|
+
delete DefaultConf.server[host][path]._wp_client;
|
|
613
|
+
delete DefaultConf.server[host][path]._wp_git;
|
|
614
|
+
delete DefaultConf.server[host][path]._wp_directory;
|
|
615
|
+
delete DefaultConf.server[host][path].wp;
|
|
616
|
+
delete DefaultConf.server[host][path].git;
|
|
617
|
+
delete DefaultConf.server[host][path].directory;
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
const sepRender = '/**/';
|
|
622
|
+
const confRawPaths = fs.readFileSync('./conf.js', 'utf8').split(sepRender);
|
|
623
|
+
confRawPaths[1] = `${JSON.stringify(DefaultConf)};`;
|
|
624
|
+
const targetConfPath = `./conf${defaultConf ? '' : `.${confName}`}.js`;
|
|
625
|
+
fs.writeFileSync(targetConfPath, confRawPaths.join(sepRender), 'utf8');
|
|
626
|
+
shellExec(`prettier --write ${targetConfPath}`);
|
|
627
|
+
|
|
628
|
+
switch (confName) {
|
|
629
|
+
case 'dd-github-pages':
|
|
630
|
+
{
|
|
631
|
+
if (fs.exists(`./engine-private/conf/${confName}`)) fs.removeSync(`./engine-private/conf/${confName}`);
|
|
632
|
+
shellExec(`node bin new --deploy-id ${confName}`);
|
|
633
|
+
}
|
|
634
|
+
break;
|
|
635
|
+
|
|
636
|
+
default:
|
|
637
|
+
break;
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
break;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
case 'ssh': {
|
|
644
|
+
// only import + start
|
|
645
|
+
// node bin/deploy ssh root@<host> <password> import
|
|
646
|
+
|
|
647
|
+
// generate + import + start
|
|
648
|
+
// node bin/deploy ssh root@<host> <password>
|
|
649
|
+
|
|
650
|
+
const host = process.argv[3] ?? `root@${await ip.public.ipv4()}`;
|
|
651
|
+
const domain = host.split('@')[1];
|
|
652
|
+
const user = 'root'; // host.split('@')[0];
|
|
653
|
+
const password = process.argv[4] ?? '';
|
|
654
|
+
const port = 22;
|
|
655
|
+
|
|
656
|
+
const setUpSSH = () => {
|
|
657
|
+
// Required port forwarding mapping
|
|
658
|
+
// ssh TCP 2222 22 <local-server-ip>
|
|
659
|
+
// ssh UDP 2222 22 <local-server-ip>
|
|
660
|
+
|
|
661
|
+
// Remote connect via public key
|
|
662
|
+
// ssh -i <key-path> <user>@<host>:2222
|
|
663
|
+
|
|
664
|
+
shellExec(`cat ./engine-private/deploy/id_rsa.pub > ~/.ssh/authorized_keys`);
|
|
665
|
+
|
|
666
|
+
// local trust on first use validator
|
|
667
|
+
// check ~/.ssh/known_hosts
|
|
668
|
+
|
|
669
|
+
// shellExec(`sudo sed -i -e "s@#PasswordAuthentication yes@PasswordAuthentication no@g" /etc/ssh/sshd_config`);
|
|
670
|
+
// shellExec(`sudo sed -i -e "s@#UsePAM no@UsePAM yes@g" /etc/ssh/sshd_config`);
|
|
671
|
+
|
|
672
|
+
// Include /etc/ssh/sshd_config.d/*.conf
|
|
673
|
+
// sudo tee /etc/ssh/sshd_config.d/99-custom.conf
|
|
674
|
+
shellExec(`sudo tee /etc/ssh/sshd_config <<EOF
|
|
675
|
+
PasswordAuthentication no
|
|
676
|
+
ChallengeResponseAuthentication yes
|
|
677
|
+
UsePAM yes
|
|
678
|
+
PubkeyAuthentication Yes
|
|
679
|
+
RSAAuthentication Yes
|
|
680
|
+
PermitRootLogin Yes
|
|
681
|
+
X11Forwarding yes
|
|
682
|
+
X11DisplayOffset 10
|
|
683
|
+
LoginGraceTime 120
|
|
684
|
+
StrictModes yes
|
|
685
|
+
SyslogFacility AUTH
|
|
686
|
+
LogLevel INFO
|
|
687
|
+
#HostKey /etc/ssh/ssh_host_ecdsa_key
|
|
688
|
+
HostKey /etc/ssh/ssh_host_ed25519_key
|
|
689
|
+
#HostKey /etc/ssh/ssh_host_rsa_key
|
|
690
|
+
AuthorizedKeysFile ~/.ssh/authorized_keys
|
|
691
|
+
Subsystem sftp /usr/libexec/openssh/sftp-server
|
|
692
|
+
ListenAddress 0.0.0.0
|
|
693
|
+
ListenAddress ::
|
|
694
|
+
ListenAddress ${domain}
|
|
695
|
+
ListenAddress ${domain}:22
|
|
696
|
+
EOF`);
|
|
697
|
+
|
|
698
|
+
shellExec(`sudo chmod 700 ~/.ssh/`);
|
|
699
|
+
shellExec(`sudo chmod 600 ~/.ssh/authorized_keys`);
|
|
700
|
+
shellExec(`sudo chmod 644 ~/.ssh/known_hosts`);
|
|
701
|
+
shellExec(`sudo chmod 600 ~/.ssh/id_rsa`);
|
|
702
|
+
shellExec(`sudo chmod 600 /etc/ssh/ssh_host_ed25519_key`);
|
|
703
|
+
shellExec(`chown -R ${user}:${user} ~/.ssh`);
|
|
704
|
+
|
|
705
|
+
shellExec(`ufw allow ${port}/tcp`);
|
|
706
|
+
shellExec(`ufw allow ${port}/udp`);
|
|
707
|
+
shellExec(`ufw allow ssh`);
|
|
708
|
+
shellExec(`ufw allow from 192.168.0.0/16 to any port 22`);
|
|
709
|
+
|
|
710
|
+
// active ssh-agent
|
|
711
|
+
shellExec('eval `ssh-agent -s`' + ` && ssh-add ~/.ssh/id_rsa` + ` && ssh-add -l`);
|
|
712
|
+
// remove all
|
|
713
|
+
// shellExec(`ssh-add -D`);
|
|
714
|
+
// remove single
|
|
715
|
+
// shellExec(`ssh-add -d ~/.ssh/id_rsa`);
|
|
716
|
+
|
|
717
|
+
// shellExec(`echo "@${host.split(`@`)[1]} * $(cat ~/.ssh/id_rsa.pub)" > ~/.ssh/known_hosts`);
|
|
718
|
+
shellExec('eval `ssh-agent -s`' + `&& ssh-keyscan -H -t ed25519 ${host.split(`@`)[1]} > ~/.ssh/known_hosts`);
|
|
719
|
+
// shellExec(`sudo echo "" > ~/.ssh/known_hosts`);
|
|
720
|
+
|
|
721
|
+
// ssh-copy-id -i ~/.ssh/id_rsa.pub -p <port_number> <username>@<host>
|
|
722
|
+
// shellExec(`ssh-copy-id -i ~/.ssh/id_rsa.pub -p ${port} ${host}`);
|
|
723
|
+
// debug:
|
|
724
|
+
// shellExec(`ssh -vvv ${host}`);
|
|
725
|
+
|
|
726
|
+
shellExec(`sudo cp ./engine-private/deploy/id_rsa ~/.ssh/id_rsa`);
|
|
727
|
+
shellExec(`sudo cp ./engine-private/deploy/id_rsa.pub ~/.ssh/id_rsa.pub`);
|
|
728
|
+
|
|
729
|
+
shellExec(`sudo echo "" > /etc/ssh/ssh_host_ecdsa_key`);
|
|
730
|
+
shellExec(`sudo cp ./engine-private/deploy/id_rsa /etc/ssh/ssh_host_ed25519_key`);
|
|
731
|
+
shellExec(`sudo echo "" > /etc/ssh/ssh_host_rsa_key`);
|
|
732
|
+
|
|
733
|
+
shellExec(`sudo echo "" > /etc/ssh/ssh_host_ecdsa_key.pub`);
|
|
734
|
+
shellExec(`sudo cp ./engine-private/deploy/id_rsa.pub /etc/ssh/ssh_host_ed25519_key.pub`);
|
|
735
|
+
shellExec(`sudo echo "" > /etc/ssh/ssh_host_rsa_key.pub`);
|
|
736
|
+
|
|
737
|
+
shellExec(`sudo systemctl enable sshd`);
|
|
738
|
+
shellExec(`sudo systemctl restart sshd`);
|
|
739
|
+
|
|
740
|
+
const status = shellExec(`sudo systemctl status sshd`, { silent: true, stdout: true });
|
|
741
|
+
console.log(
|
|
742
|
+
status.match('running') ? status.replaceAll(`running`, `running`.green) : `ssh service not running`.red,
|
|
743
|
+
);
|
|
744
|
+
};
|
|
745
|
+
|
|
746
|
+
if (process.argv.includes('import')) {
|
|
747
|
+
setUpSSH();
|
|
748
|
+
break;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
shellExec(`sudo rm -rf ./id_rsa`);
|
|
752
|
+
shellExec(`sudo rm -rf ./id_rsa.pub`);
|
|
753
|
+
|
|
754
|
+
if (process.argv.includes('legacy'))
|
|
755
|
+
shellExec(`ssh-keygen -t rsa -b 4096 -f id_rsa -N "${password}" -q -C "${host}"`);
|
|
756
|
+
else shellExec(`ssh-keygen -t ed25519 -f id_rsa -N "${password}" -q -C "${host}"`);
|
|
757
|
+
|
|
758
|
+
shellExec(`sudo cp ./id_rsa ~/.ssh/id_rsa`);
|
|
759
|
+
shellExec(`sudo cp ./id_rsa.pub ~/.ssh/id_rsa.pub`);
|
|
760
|
+
|
|
761
|
+
shellExec(`sudo cp ./id_rsa ./engine-private/deploy/id_rsa`);
|
|
762
|
+
shellExec(`sudo cp ./id_rsa.pub ./engine-private/deploy/id_rsa.pub`);
|
|
763
|
+
|
|
764
|
+
shellExec(`sudo rm -rf ./id_rsa`);
|
|
765
|
+
shellExec(`sudo rm -rf ./id_rsa.pub`);
|
|
766
|
+
setUpSSH();
|
|
767
|
+
break;
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
case 'maas-db': {
|
|
771
|
+
// DROP, ALTER, CREATE, WITH ENCRYPTED
|
|
772
|
+
// sudo -u <user> -h <host> psql <db-name>
|
|
773
|
+
shellExec(`DB_PG_MAAS_NAME=${process.env.DB_PG_MAAS_NAME}`);
|
|
774
|
+
shellExec(`DB_PG_MAAS_PASS=${process.env.DB_PG_MAAS_PASS}`);
|
|
775
|
+
shellExec(`DB_PG_MAAS_USER=${process.env.DB_PG_MAAS_USER}`);
|
|
776
|
+
shellExec(`DB_PG_MAAS_HOST=${process.env.DB_PG_MAAS_HOST}`);
|
|
777
|
+
shellExec(
|
|
778
|
+
`sudo -i -u postgres psql -c "CREATE USER \"$DB_PG_MAAS_USER\" WITH ENCRYPTED PASSWORD '$DB_PG_MAAS_PASS'"`,
|
|
779
|
+
);
|
|
780
|
+
shellExec(
|
|
781
|
+
`sudo -i -u postgres psql -c "ALTER USER \"$DB_PG_MAAS_USER\" WITH ENCRYPTED PASSWORD '$DB_PG_MAAS_PASS'"`,
|
|
782
|
+
);
|
|
783
|
+
const actions = ['LOGIN', 'SUPERUSER', 'INHERIT', 'CREATEDB', 'CREATEROLE', 'REPLICATION'];
|
|
784
|
+
shellExec(`sudo -i -u postgres psql -c "ALTER USER \"$DB_PG_MAAS_USER\" WITH ${actions.join(' ')}"`);
|
|
785
|
+
shellExec(`sudo -i -u postgres psql -c "\\du"`);
|
|
786
|
+
|
|
787
|
+
shellExec(`sudo -i -u postgres createdb -O "$DB_PG_MAAS_USER" "$DB_PG_MAAS_NAME"`);
|
|
788
|
+
|
|
789
|
+
shellExec(`sudo -i -u postgres psql -c "\\l"`);
|
|
790
|
+
break;
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
case 'cli-docs': {
|
|
794
|
+
buildCliDoc(program, process.argv[3], process.argv[4]);
|
|
795
|
+
break;
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
case 'postgresql': {
|
|
799
|
+
if (process.argv.includes('install')) {
|
|
800
|
+
shellExec(`sudo dnf install -y postgresql-server postgresql`);
|
|
801
|
+
shellExec(`sudo postgresql-setup --initdb`);
|
|
802
|
+
shellExec(`chown postgres /var/lib/pgsql/data`);
|
|
803
|
+
shellExec(`sudo systemctl enable postgresql.service`);
|
|
804
|
+
shellExec(`sudo systemctl start postgresql.service`);
|
|
805
|
+
} else {
|
|
806
|
+
shellExec(`sudo systemctl enable postgresql.service`);
|
|
807
|
+
shellExec(`sudo systemctl restart postgresql.service`);
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
shellExec(`sudo systemctl status postgresql.service`);
|
|
811
|
+
|
|
812
|
+
// sudo systemctl stop postgresql
|
|
813
|
+
// sudo systemctl disable postgresql
|
|
814
|
+
|
|
815
|
+
// psql login
|
|
816
|
+
// psql -U <user> -h 127.0.0.1 -W <db-name>
|
|
817
|
+
|
|
818
|
+
// gedit /var/lib/pgsql/data/pg_hba.conf
|
|
819
|
+
// host <db-name> <db-user> <db-host> md5
|
|
820
|
+
// local all postgres trust
|
|
821
|
+
// # "local" is for Unix domain socket connections only
|
|
822
|
+
// local all all md5
|
|
823
|
+
// # IPv4 local connections:
|
|
824
|
+
// host all all 127.0.0.1/32 md5
|
|
825
|
+
// # IPv6 local connections:
|
|
826
|
+
// host all all ::1/128 md5
|
|
827
|
+
|
|
828
|
+
// gedit /var/lib/pgsql/data/postgresql.conf
|
|
829
|
+
// listen_addresses = '*'
|
|
830
|
+
|
|
831
|
+
break;
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
case 'postgresql-17': {
|
|
835
|
+
if (process.argv.includes('install')) {
|
|
836
|
+
shellExec(`sudo dnf module reset postgresql -y`);
|
|
837
|
+
shellExec(`sudo dnf -qy module disable postgresql`);
|
|
838
|
+
shellExec(
|
|
839
|
+
`sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm`,
|
|
840
|
+
);
|
|
841
|
+
shellExec(`sudo dnf -qy module disable postgresql`);
|
|
842
|
+
shellExec(`sudo dnf install -y postgresql17 postgresql17-server postgresql17-contrib`);
|
|
843
|
+
|
|
844
|
+
shellExec(`sudo /usr/pgsql-17/bin/postgresql-17-setup initdb`);
|
|
845
|
+
}
|
|
846
|
+
if (process.argv.includes('uninstall')) {
|
|
847
|
+
shellExec(`sudo systemctl stop postgresql-17`);
|
|
848
|
+
shellExec(`sudo systemctl disable postgresql-17`);
|
|
849
|
+
|
|
850
|
+
// Remove PostgreSQL 17 packages and repo
|
|
851
|
+
shellExec(`sudo dnf remove -y postgresql17 postgresql17-server postgresql17-contrib`);
|
|
852
|
+
shellExec(`sudo rpm -e pgdg-redhat-repo-$(rpm -q pgdg-redhat-repo --qf '%{VERSION}-%{RELEASE}') || true`);
|
|
853
|
+
shellExec(`sudo rm -f /etc/yum.repos.d/pgdg-redhat-*.repo`);
|
|
854
|
+
|
|
855
|
+
// Clean up data, logs, config, and the postgres user
|
|
856
|
+
shellExec(`sudo rm -rf /var/lib/pgsql/17 /var/log/pgsql`);
|
|
857
|
+
shellExec(`sudo rm -rf /etc/postgresql`);
|
|
858
|
+
} else {
|
|
859
|
+
shellExec(`sudo systemctl enable postgresql-17`);
|
|
860
|
+
shellExec(`sudo systemctl start postgresql-17`);
|
|
861
|
+
}
|
|
862
|
+
break;
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
case 'postgresql-14': {
|
|
866
|
+
if (process.argv.includes('install')) {
|
|
867
|
+
shellExec(`sudo dnf module reset postgresql -y`);
|
|
868
|
+
shellExec(`sudo dnf -qy module disable postgresql`);
|
|
869
|
+
|
|
870
|
+
shellExec(`sudo systemctl stop postgresql-14`);
|
|
871
|
+
shellExec(`sudo systemctl disable postgresql-14`);
|
|
872
|
+
|
|
873
|
+
shellExec(`sudo dnf remove -y postgresql14 postgresql14-server postgresql14-contrib`);
|
|
874
|
+
shellExec(`sudo rm -rf /var/lib/pgsql`);
|
|
875
|
+
|
|
876
|
+
shellExec(`sudo dnf install postgresql14 postgresql14-server postgresql14-contrib -y`);
|
|
877
|
+
}
|
|
878
|
+
if (process.argv.includes('uninstall')) {
|
|
879
|
+
shellExec(`sudo systemctl stop postgresql-14`);
|
|
880
|
+
shellExec(`sudo systemctl disable postgresql-14`);
|
|
881
|
+
shellExec(`sudo dnf remove -y postgresql14 postgresql14-server postgresql14-contrib`);
|
|
882
|
+
shellExec(`sudo rm -rf /var/lib/pgsql /var/log/pgsql /etc/postgresql`);
|
|
883
|
+
} else {
|
|
884
|
+
shellExec(`sudo /usr/pgsql-14/bin/postgresql-14-setup initdb`);
|
|
885
|
+
shellExec(`sudo systemctl start postgresql-14`);
|
|
886
|
+
shellExec(`sudo systemctl enable postgresql-14`);
|
|
887
|
+
shellExec(`sudo systemctl status postgresql-14`);
|
|
888
|
+
// sudo dnf install postgresql14-contrib
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
break;
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
case 'pg-stop': {
|
|
895
|
+
shellExec(`sudo systemctl stop postgresql-14`);
|
|
896
|
+
shellExec(`sudo systemctl disable postgresql-14`);
|
|
897
|
+
break;
|
|
898
|
+
}
|
|
899
|
+
case 'pg-start': {
|
|
900
|
+
shellExec(`sudo systemctl enable postgresql-14`);
|
|
901
|
+
shellExec(`sudo systemctl restart postgresql-14`);
|
|
902
|
+
break;
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
case 'pg-list-db': {
|
|
906
|
+
shellExec(`sudo -i -u postgres psql -c "\\l"`);
|
|
907
|
+
break;
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
case 'pg-list-table': {
|
|
911
|
+
shellExec(`sudo -i -u postgres psql -c "\\dt *.*"`);
|
|
912
|
+
// schema_name.*
|
|
913
|
+
break;
|
|
914
|
+
}
|
|
915
|
+
case 'pg-drop-db': {
|
|
916
|
+
shellExec(`sudo -i -u postgres psql -c "DROP DATABASE ${process.argv[3]} WITH (FORCE)"`);
|
|
917
|
+
shellExec(`sudo -i -u postgres psql -c "DROP USER ${process.argv[4]}"`);
|
|
918
|
+
break;
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
case 'maas-stop': {
|
|
922
|
+
shellExec(`sudo snap stop maas`);
|
|
923
|
+
break;
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
case 'mount': {
|
|
927
|
+
const mounts = shellExec(`mount`).split(`\n`);
|
|
928
|
+
console.table(
|
|
929
|
+
mounts
|
|
930
|
+
.filter((l) => l.trim())
|
|
931
|
+
.map(
|
|
932
|
+
(o) => (
|
|
933
|
+
(o = o.split(' ')),
|
|
934
|
+
{
|
|
935
|
+
path: o[2],
|
|
936
|
+
type: o[4],
|
|
937
|
+
permissions: o[5],
|
|
938
|
+
}
|
|
939
|
+
),
|
|
940
|
+
),
|
|
941
|
+
);
|
|
942
|
+
break;
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
case 'create-ports': {
|
|
946
|
+
const cmd = [];
|
|
947
|
+
const commissioningDeviceIp = getLocalIPv4Address();
|
|
948
|
+
for (const port of ['5240']) {
|
|
949
|
+
const name = 'maas';
|
|
950
|
+
cmd.push(`${name}:${port}-${port}:${commissioningDeviceIp}`);
|
|
951
|
+
}
|
|
952
|
+
pbcopy(`node engine-private/r create-port ${cmd}`);
|
|
953
|
+
break;
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
case 'fastapi-models': {
|
|
957
|
+
shellExec(`chmod +x ../full-stack-fastapi-template/backend/initial_data.sh`);
|
|
958
|
+
shellExec(`../full-stack-fastapi-template/backend/initial_data.sh`);
|
|
959
|
+
shellExec(`../full-stack-fastapi-template/backend/initial_data.sh`);
|
|
960
|
+
break;
|
|
961
|
+
}
|
|
962
|
+
|
|
963
|
+
case 'fastapi': {
|
|
964
|
+
// node bin/deploy fastapi reset
|
|
965
|
+
// node bin/deploy fastapi reset build-back build-front secret run-back run-front
|
|
966
|
+
// https://github.com/NonsoEchendu/full-stack-fastapi-project
|
|
967
|
+
// https://github.com/fastapi/full-stack-fastapi-template
|
|
968
|
+
const path = `../full-stack-fastapi-template`;
|
|
969
|
+
const VITE_API_URL = `http://localhost:8000`;
|
|
970
|
+
|
|
971
|
+
if (process.argv.includes('reset')) shellExec(`sudo rm -rf ${path}`);
|
|
972
|
+
|
|
973
|
+
if (!fs.existsSync(path))
|
|
974
|
+
shellExec(`cd .. && git clone https://github.com/fastapi/full-stack-fastapi-template.git`);
|
|
975
|
+
|
|
976
|
+
shellExec(`cd ${path} && git checkout . && git clean -f -d`);
|
|
977
|
+
const password = fs.readFileSync(`/home/dd/engine/engine-private/postgresql-password`, 'utf8');
|
|
978
|
+
|
|
979
|
+
fs.writeFileSync(
|
|
980
|
+
`${path}/.env`,
|
|
981
|
+
fs
|
|
982
|
+
.readFileSync(`${path}/.env`, 'utf8')
|
|
983
|
+
.replace(`FIRST_SUPERUSER=admin@example.com`, `FIRST_SUPERUSER=development@underpost.net`)
|
|
984
|
+
.replace(`FIRST_SUPERUSER_PASSWORD=changethis`, `FIRST_SUPERUSER_PASSWORD=${password}`)
|
|
985
|
+
.replace(`SECRET_KEY=changethis`, `SECRET_KEY=${password}`)
|
|
986
|
+
.replace(`POSTGRES_DB=app`, `POSTGRES_DB=postgresdb`)
|
|
987
|
+
.replace(`POSTGRES_USER=postgres`, `POSTGRES_USER=admin`)
|
|
988
|
+
.replace(`POSTGRES_PASSWORD=changethis`, `POSTGRES_PASSWORD=${password}`),
|
|
989
|
+
'utf8',
|
|
990
|
+
);
|
|
991
|
+
fs.writeFileSync(
|
|
992
|
+
`${path}/backend/app/core/db.py`,
|
|
993
|
+
fs
|
|
994
|
+
.readFileSync(`${path}/backend/app/core/db.py`, 'utf8')
|
|
995
|
+
.replace(` # from sqlmodel import SQLModel`, ` from sqlmodel import SQLModel`)
|
|
996
|
+
.replace(` # SQLModel.metadata.create_all(engine)`, ` SQLModel.metadata.create_all(engine)`),
|
|
997
|
+
|
|
998
|
+
'utf8',
|
|
999
|
+
);
|
|
1000
|
+
|
|
1001
|
+
fs.copySync(`./manifests/deployment/fastapi/initial_data.sh`, `${path}/backend/initial_data.sh`);
|
|
1002
|
+
|
|
1003
|
+
fs.writeFileSync(
|
|
1004
|
+
`${path}/frontend/Dockerfile`,
|
|
1005
|
+
fs
|
|
1006
|
+
.readFileSync(`${path}/frontend/Dockerfile`, 'utf8')
|
|
1007
|
+
.replace('ARG VITE_API_URL=${VITE_API_URL}', `ARG VITE_API_URL='${VITE_API_URL}'`),
|
|
1008
|
+
'utf8',
|
|
1009
|
+
);
|
|
1010
|
+
|
|
1011
|
+
fs.writeFileSync(
|
|
1012
|
+
`${path}/frontend/.env`,
|
|
1013
|
+
fs
|
|
1014
|
+
.readFileSync(`${path}/frontend/.env`, 'utf8')
|
|
1015
|
+
.replace(`VITE_API_URL=http://localhost:8000`, `VITE_API_URL=${VITE_API_URL}`)
|
|
1016
|
+
.replace(`MAILCATCHER_HOST=http://localhost:1080`, `MAILCATCHER_HOST=http://localhost:1081`),
|
|
1017
|
+
|
|
1018
|
+
'utf8',
|
|
1019
|
+
);
|
|
1020
|
+
|
|
1021
|
+
if (process.argv.includes('models')) {
|
|
1022
|
+
shellExec(`node bin/deploy fastapi-models`);
|
|
1023
|
+
break;
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
if (process.argv.includes('build-back')) {
|
|
1027
|
+
const imageName = `fastapi-backend:latest`;
|
|
1028
|
+
shellExec(`sudo podman pull docker.io/library/python:3.10`);
|
|
1029
|
+
shellExec(`sudo podman pull ghcr.io/astral-sh/uv:0.5.11`);
|
|
1030
|
+
shellExec(`sudo rm -rf ${path}/${imageName.replace(':', '_')}.tar`);
|
|
1031
|
+
const args = [
|
|
1032
|
+
`node bin dockerfile-image-build --path ${path}/backend/`,
|
|
1033
|
+
`--image-name=${imageName} --image-path=${path}`,
|
|
1034
|
+
`--podman-save --${process.argv.includes('kubeadm') ? 'kubeadm' : 'kind'}-load --reset`,
|
|
1035
|
+
];
|
|
1036
|
+
shellExec(args.join(' '));
|
|
1037
|
+
}
|
|
1038
|
+
if (process.argv.includes('build-front')) {
|
|
1039
|
+
const imageName = `fastapi-frontend:latest`;
|
|
1040
|
+
shellExec(`sudo podman pull docker.io/library/node:20`);
|
|
1041
|
+
shellExec(`sudo podman pull docker.io/library/nginx:1`);
|
|
1042
|
+
shellExec(`sudo rm -rf ${path}/${imageName.replace(':', '_')}.tar`);
|
|
1043
|
+
const args = [
|
|
1044
|
+
`node bin dockerfile-image-build --path ${path}/frontend/`,
|
|
1045
|
+
`--image-name=${imageName} --image-path=${path}`,
|
|
1046
|
+
`--podman-save --${process.argv.includes('kubeadm') ? 'kubeadm' : 'kind'}-load --reset`,
|
|
1047
|
+
];
|
|
1048
|
+
shellExec(args.join(' '));
|
|
1049
|
+
}
|
|
1050
|
+
if (process.argv.includes('secret')) {
|
|
1051
|
+
{
|
|
1052
|
+
const secretSelector = `fastapi-postgres-credentials`;
|
|
1053
|
+
shellExec(`sudo kubectl delete secret ${secretSelector}`);
|
|
1054
|
+
shellExec(
|
|
1055
|
+
`sudo kubectl create secret generic ${secretSelector}` +
|
|
1056
|
+
` --from-literal=POSTGRES_DB=postgresdb` +
|
|
1057
|
+
` --from-literal=POSTGRES_USER=admin` +
|
|
1058
|
+
` --from-file=POSTGRES_PASSWORD=/home/dd/engine/engine-private/postgresql-password`,
|
|
1059
|
+
);
|
|
1060
|
+
}
|
|
1061
|
+
{
|
|
1062
|
+
const secretSelector = `fastapi-backend-config-secret`;
|
|
1063
|
+
shellExec(`sudo kubectl delete secret ${secretSelector}`);
|
|
1064
|
+
shellExec(
|
|
1065
|
+
`sudo kubectl create secret generic ${secretSelector}` +
|
|
1066
|
+
` --from-file=SECRET_KEY=/home/dd/engine/engine-private/postgresql-password` +
|
|
1067
|
+
` --from-literal=FIRST_SUPERUSER=development@underpost.net` +
|
|
1068
|
+
` --from-file=FIRST_SUPERUSER_PASSWORD=/home/dd/engine/engine-private/postgresql-password`,
|
|
1069
|
+
);
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
if (process.argv.includes('run-back')) {
|
|
1073
|
+
shellExec(`sudo kubectl apply -f ./manifests/deployment/fastapi/backend-deployment.yml`);
|
|
1074
|
+
shellExec(`sudo kubectl apply -f ./manifests/deployment/fastapi/backend-service.yml`);
|
|
1075
|
+
}
|
|
1076
|
+
if (process.argv.includes('run-front')) {
|
|
1077
|
+
shellExec(`sudo kubectl apply -f ./manifests/deployment/fastapi/frontend-deployment.yml`);
|
|
1078
|
+
shellExec(`sudo kubectl apply -f ./manifests/deployment/fastapi/frontend-service.yml`);
|
|
1079
|
+
}
|
|
1080
|
+
break;
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
case 'conda': {
|
|
1084
|
+
// set -e
|
|
1085
|
+
// ENV_NAME="${1:-cuda_env}"
|
|
1086
|
+
// eval "$(conda shell.bash hook)"
|
|
1087
|
+
// conda activate "${ENV_NAME}"
|
|
1088
|
+
shellExec(
|
|
1089
|
+
`export PATH="/root/miniconda3/bin:$PATH" && conda init && conda config --set auto_activate_base false`,
|
|
1090
|
+
);
|
|
1091
|
+
shellExec(`conda env list`);
|
|
1092
|
+
break;
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
case 'kafka': {
|
|
1096
|
+
// https://medium.com/@martin.hodges/deploying-kafka-on-a-kind-kubernetes-cluster-for-development-and-testing-purposes-ed7adefe03cb
|
|
1097
|
+
const imageName = `doughgle/kafka-kraft`;
|
|
1098
|
+
shellExec(`docker pull ${imageName}`);
|
|
1099
|
+
if (!process.argv.includes('kubeadm'))
|
|
1100
|
+
shellExec(
|
|
1101
|
+
`${process.argv.includes('kubeadm') ? `ctr -n k8s.io images import` : `kind load docker-image`} ${imageName}`,
|
|
1102
|
+
);
|
|
1103
|
+
shellExec(`kubectl create namespace kafka`);
|
|
1104
|
+
shellExec(`kubectl apply -f ./manifests/deployment/kafka/deployment.yaml`);
|
|
1105
|
+
// kubectl logs kafka-0 -n kafka | grep STARTED
|
|
1106
|
+
// kubectl logs kafka-1 -n kafka | grep STARTED
|
|
1107
|
+
// kubectl logs kafka-2 -n kafka | grep STARTED
|
|
1108
|
+
|
|
1109
|
+
// kafka-topics.sh --create --topic my-topic --bootstrap-server kafka-svc:9092
|
|
1110
|
+
// kafka-topics.sh --list --topic my-topic --bootstrap-server kafka-svc:9092
|
|
1111
|
+
// kafka-topics.sh --delete --topic my-topic --bootstrap-server kafka-svc:9092
|
|
1112
|
+
|
|
1113
|
+
// kafka-console-producer.sh --bootstrap-server kafka-svc:9092 --topic my-topic
|
|
1114
|
+
// kafka-console-consumer.sh --bootstrap-server kafka-svc:9092 --topic my-topic
|
|
1115
|
+
break;
|
|
1116
|
+
}
|
|
1117
|
+
|
|
1118
|
+
case 'nvidia-gpu-operator': {
|
|
1119
|
+
// https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
|
|
1120
|
+
shellExec(`curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
|
|
1121
|
+
sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo`);
|
|
1122
|
+
|
|
1123
|
+
const NVIDIA_CONTAINER_TOOLKIT_VERSION = '1.17.8-1';
|
|
1124
|
+
|
|
1125
|
+
shellExec(`sudo dnf install -y \
|
|
1126
|
+
nvidia-container-toolkit-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
|
|
1127
|
+
nvidia-container-toolkit-base-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
|
|
1128
|
+
libnvidia-container-tools-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
|
|
1129
|
+
libnvidia-container1-${NVIDIA_CONTAINER_TOOLKIT_VERSION}`);
|
|
1130
|
+
|
|
1131
|
+
// https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/getting-started.html
|
|
1132
|
+
|
|
1133
|
+
shellExec(`kubectl create ns gpu-operator`);
|
|
1134
|
+
shellExec(`kubectl label --overwrite ns gpu-operator pod-security.kubernetes.io/enforce=privileged`);
|
|
1135
|
+
|
|
1136
|
+
shellExec(`helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
|
|
1137
|
+
&& helm repo update`);
|
|
1138
|
+
|
|
1139
|
+
// shellExec(`helm install --wait --generate-name \
|
|
1140
|
+
// -n gpu-operator --create-namespace \
|
|
1141
|
+
// nvidia/gpu-operator \
|
|
1142
|
+
// --version=v25.3.1 \
|
|
1143
|
+
// --set toolkit.version=v1.16.1-ubi8`);
|
|
1144
|
+
|
|
1145
|
+
shellExec(`helm install --wait --generate-name \
|
|
1146
|
+
-n gpu-operator --create-namespace \
|
|
1147
|
+
nvidia/gpu-operator \
|
|
1148
|
+
--version=v25.3.1 \
|
|
1149
|
+
--set driver.enabled=false \
|
|
1150
|
+
--set driver.repository=nvcr.io/nvidia \
|
|
1151
|
+
--set cdi.enabled=true \
|
|
1152
|
+
--set cdi.default=true \
|
|
1153
|
+
--set toolkit.env[0].name=CONTAINERD_CONFIG \
|
|
1154
|
+
--set toolkit.env[0].value=/etc/containerd/config.toml \
|
|
1155
|
+
--set toolkit.env[1].name=CONTAINERD_SOCKET \
|
|
1156
|
+
--set toolkit.env[1].value=/run/containerd/containerd.sock \
|
|
1157
|
+
--set toolkit.env[2].name=CONTAINERD_RUNTIME_CLASS \
|
|
1158
|
+
--set toolkit.env[2].value=nvidia \
|
|
1159
|
+
--set-string toolkit.env[3].name=CONTAINERD_SET_AS_DEFAULT \
|
|
1160
|
+
--set-string toolkit.env[3].value=true`);
|
|
1161
|
+
|
|
1162
|
+
// Check gpu drivers
|
|
1163
|
+
shellExec(
|
|
1164
|
+
`break;kubectl get nodes -o json | jq '.items[].metadata.labels | keys | any(startswith("feature.node.kubernetes.io"))'`,
|
|
1165
|
+
);
|
|
1166
|
+
break;
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
case 'kubeflow-spark-operator': {
|
|
1170
|
+
// Use case:
|
|
1171
|
+
// Data Processing Pipelines: Used for ETL tasks where Spark can handle large data volumes efficiently.
|
|
1172
|
+
// Real-Time Analytics: Processing data from streaming sources (e.g., Kafka) for real-time analytics.
|
|
1173
|
+
// Machine Learning and Data Science: Training and deploying machine learning models at scale using Spark MLlib.
|
|
1174
|
+
|
|
1175
|
+
shellExec(`helm repo add spark-operator https://kubeflow.github.io/spark-operator`);
|
|
1176
|
+
shellExec(`helm install spark-operator spark-operator/spark-operator \
|
|
1177
|
+
--namespace spark-operator \
|
|
1178
|
+
--create-namespace \
|
|
1179
|
+
--wait`);
|
|
1180
|
+
|
|
1181
|
+
const image = `spark:3.5.5`;
|
|
1182
|
+
shellExec(`sudo docker pull ${image}`);
|
|
1183
|
+
if (!process.argv.includes('kubeadm'))
|
|
1184
|
+
shellExec(
|
|
1185
|
+
`sudo ${
|
|
1186
|
+
process.argv.includes('kubeadm') ? `ctr -n k8s.io images import` : `kind load docker-image`
|
|
1187
|
+
} ${image}`,
|
|
1188
|
+
);
|
|
1189
|
+
shellExec(`kubectl apply -f ./manifests/deployment/spark/spark-pi-py.yaml`);
|
|
1190
|
+
|
|
1191
|
+
// Check the status of the Spark job:
|
|
1192
|
+
// kubectl get sparkapplications.sparkoperator.k8s.io -n default
|
|
1193
|
+
// kubectl get sparkapplication
|
|
1194
|
+
|
|
1195
|
+
// Check case log:
|
|
1196
|
+
// kubectl logs -f spark-pi-python-driver
|
|
1197
|
+
// kubectl logs -f spark-pi-python-driver | grep Pi
|
|
1198
|
+
// kubectl describe sparkapplication spark-gpu-test
|
|
1199
|
+
|
|
1200
|
+
// Uninstall:
|
|
1201
|
+
// kubectl delete sparkapplications.sparkoperator.k8s.io spark-pi-python -n default
|
|
1202
|
+
// helm delete spark-operator -n spark-operator
|
|
1203
|
+
|
|
1204
|
+
// Gpu plugins:
|
|
1205
|
+
// https://github.com/NVIDIA/spark-rapids
|
|
1206
|
+
// RAPIDS Accelerator
|
|
1207
|
+
break;
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
case 'udpate-version-files': {
|
|
1211
|
+
const oldNpmVersion = process.argv[3];
|
|
1212
|
+
const oldNodeVersion = process.argv[4];
|
|
1213
|
+
const oldNodeMajorVersion = oldNodeVersion.split('.')[0];
|
|
1214
|
+
const nodeVersion = shellExec(`node --version`, { stdout: true }).trim().replace('v', '');
|
|
1215
|
+
const newNodeMajorVersion = nodeVersion.split('.')[0];
|
|
1216
|
+
const npmVersion = shellExec(`npm --version`, { stdout: true }).trim();
|
|
1217
|
+
|
|
1218
|
+
fs.writeFileSync(
|
|
1219
|
+
`README.md`,
|
|
1220
|
+
fs
|
|
1221
|
+
.readFileSync(`README.md`, 'utf8')
|
|
1222
|
+
.replaceAll(oldNodeVersion, nodeVersion)
|
|
1223
|
+
.replaceAll(oldNpmVersion, npmVersion),
|
|
1224
|
+
);
|
|
1225
|
+
fs.writeFileSync(
|
|
1226
|
+
`manifests/lxd/underpost-setup.sh`,
|
|
1227
|
+
fs
|
|
1228
|
+
.readFileSync(`manifests/lxd/underpost-setup.sh`, 'utf8')
|
|
1229
|
+
.replaceAll(oldNodeVersion, nodeVersion)
|
|
1230
|
+
.replaceAll(oldNpmVersion, npmVersion),
|
|
1231
|
+
);
|
|
1232
|
+
fs.writeFileSync(
|
|
1233
|
+
`src/client/public/nexodev/docs/references/Getting started.md`,
|
|
1234
|
+
fs
|
|
1235
|
+
.readFileSync(`src/client/public/nexodev/docs/references/Getting started.md`, 'utf8')
|
|
1236
|
+
.replaceAll(oldNodeVersion, nodeVersion)
|
|
1237
|
+
.replaceAll(oldNpmVersion, npmVersion),
|
|
1238
|
+
);
|
|
1239
|
+
|
|
1240
|
+
const workflowFiles = [
|
|
1241
|
+
`./.github/workflows/coverall.ci.yml`,
|
|
1242
|
+
|
|
1243
|
+
`./.github/workflows/engine-core.ci.yml`,
|
|
1244
|
+
|
|
1245
|
+
`./.github/workflows/engine-cyberia.ci.yml`,
|
|
1246
|
+
|
|
1247
|
+
`./.github/workflows/engine-lampp.ci.yml`,
|
|
1248
|
+
|
|
1249
|
+
`./.github/workflows/engine-test.ci.yml`,
|
|
1250
|
+
|
|
1251
|
+
`./.github/workflows/ghpkg.ci.yml`,
|
|
1252
|
+
|
|
1253
|
+
`./.github/workflows/npmpkg.ci.yml`,
|
|
1254
|
+
|
|
1255
|
+
`./.github/workflows/publish.ci.yml`,
|
|
1256
|
+
|
|
1257
|
+
`./.github/workflows/pwa-microservices-template-page.cd.yml`,
|
|
1258
|
+
|
|
1259
|
+
`./.github/workflows/pwa-microservices-template-test.ci.yml`,
|
|
1260
|
+
|
|
1261
|
+
`./.github/workflows/test-api-rest.cd.yml`,
|
|
1262
|
+
|
|
1263
|
+
`./src/runtime/lampp/Dockerfile`,
|
|
1264
|
+
|
|
1265
|
+
`./Dockerfile`,
|
|
1266
|
+
];
|
|
1267
|
+
|
|
1268
|
+
workflowFiles.forEach((file) => {
|
|
1269
|
+
fs.writeFileSync(
|
|
1270
|
+
file,
|
|
1271
|
+
fs
|
|
1272
|
+
.readFileSync(file, 'utf8')
|
|
1273
|
+
.replaceAll(oldNodeMajorVersion + '.x', newNodeMajorVersion + '.x')
|
|
1274
|
+
.replaceAll(oldNodeVersion, nodeVersion)
|
|
1275
|
+
.replaceAll(oldNpmVersion, npmVersion),
|
|
1276
|
+
);
|
|
1277
|
+
});
|
|
1278
|
+
pbcopy(`nvm alias default v${nodeVersion}`);
|
|
1279
|
+
break;
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
case 'tls': {
|
|
1283
|
+
fs.mkdirSync(`./engine-private/ssl/localhost`, { recursive: true });
|
|
1284
|
+
const targetDir = `./engine-private/ssl/localhost`;
|
|
1285
|
+
const domains = ['localhost', '127.0.0.1', '::1'];
|
|
1286
|
+
shellExec(`chmod +x ./scripts/ssl.sh`);
|
|
1287
|
+
shellExec(`./scripts/ssl.sh ${targetDir} "${domains.join(' ')}"`);
|
|
1288
|
+
break;
|
|
1289
|
+
}
|
|
1290
|
+
}
|
|
1291
|
+
} catch (error) {
|
|
1292
|
+
logger.error(error, error.stack);
|
|
1293
|
+
}
|