@underpostnet/cyberia 3.2.90 → 3.3.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +1 -0
- package/.env.example +16 -0
- package/.github/workflows/coverall.cyberia.ci.yml +107 -0
- package/.github/workflows/cyberia-client.cd.yml +6 -18
- package/.github/workflows/cyberia-server.cd.yml +6 -18
- package/.github/workflows/docker-image.cyberia-client.ci.yml +8 -5
- package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +8 -3
- package/.github/workflows/docker-image.cyberia-server.ci.yml +8 -5
- package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +8 -5
- package/.github/workflows/docker-image.engine-cyberia.ci.yml +15 -1
- package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +15 -1
- package/.github/workflows/engine-cyberia.cd.yml +6 -78
- package/.github/workflows/engine-cyberia.ci.yml +4 -5
- package/.github/workflows/ghpkg.ci.yml +42 -21
- package/.github/workflows/hardhat.ci.yml +12 -11
- package/.github/workflows/npmpkg.ci.yml +17 -15
- package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -16
- package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
- package/.github/workflows/release.cd.yml +2 -9
- package/.prettierignore +1 -0
- package/AGENTS.md +47 -0
- package/CHANGELOG.md +581 -2417
- package/CLI-HELP.md +416 -127
- package/Dockerfile +25 -9
- package/Dockerfile.dev +25 -9
- package/Dockerfile.test +4 -4
- package/README.md +21 -1
- package/bin/build.js +70 -43
- package/bin/build.template.js +8 -3
- package/bin/cyberia.js +372 -135
- package/bin/deploy.js +18 -104
- package/bin/index.js +372 -135
- package/compose.env +16 -0
- package/conf.js +93 -4
- package/deploy/cyberia-client/deploy.sh +47 -0
- package/deploy/cyberia-client/package.sh +18 -0
- package/deploy/cyberia-client/state.sh +14 -0
- package/deploy/cyberia-server/deploy.sh +47 -0
- package/deploy/cyberia-server/package.sh +18 -0
- package/deploy/cyberia-server/state.sh +14 -0
- package/deploy/dd-cyberia/deploy.sh +22 -0
- package/deploy/dd-cyberia/init.sh +55 -0
- package/deploy/dd-cyberia/package.sh +17 -0
- package/deploy/dd-cyberia/state.sh +14 -0
- package/deploy/dd-cyberia/sync-deploy.sh +116 -0
- package/deploy/lib/github-actions-logging.sh +594 -0
- package/deploy/lib/host.sh +185 -0
- package/deploy/lib/state.sh +62 -0
- package/deploy/pwa-microservices-template/deploy.sh +45 -0
- package/deploy/release/deploy.sh +32 -0
- package/deployment.yaml +7 -2
- package/docker-compose.yml +31 -37
- package/examples/static-page/README.md +19 -19
- package/examples/static-page/ssr-components/CustomPage.js +2 -2
- package/hardhat/hardhat.config.js +1 -6
- package/hardhat/package-lock.json +104 -43
- package/hardhat/package.json +3 -3
- package/manifests/alertmanager/deployment.yaml +81 -0
- package/manifests/blackbox-exporter/deployment.yaml +75 -0
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +36 -7
- package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +77 -0
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/manifests/grafana/deployment.yaml +26 -7
- package/manifests/grafana/kustomization.yaml +1 -0
- package/manifests/grafana/service.yaml +6 -1
- package/manifests/mariadb/pv.yaml +1 -0
- package/manifests/mongodb/statefulset.yaml +9 -2
- package/manifests/mysql/pv-pvc.yaml +14 -1
- package/manifests/postgresql/pv.yaml +12 -1
- package/manifests/postgresql/pvc.yaml +1 -0
- package/manifests/prometheus/deployment.yaml +18 -22
- package/package.json +83 -10
- package/scripts/audit-selinux.sh +64 -0
- package/scripts/event-monitor.sh +56 -0
- package/scripts/gpu-diag.sh +0 -0
- package/scripts/ip-info.sh +0 -0
- package/scripts/k3s-node-setup.sh +30 -14
- package/scripts/kubeadm-node-setup.sh +40 -31
- package/scripts/lxd-vm-setup.sh +0 -0
- package/scripts/maas-nat-firewalld.sh +0 -0
- package/scripts/maas-setup.sh +8 -8
- package/scripts/nat-iptables.sh +2 -0
- package/scripts/rhel-grpc-setup.sh +0 -0
- package/scripts/rocky-kickstart.sh +25 -9
- package/scripts/selinux-normalize.sh +907 -0
- package/scripts/shutdown-machine.sh +843 -0
- package/scripts/test-monitor.sh +3 -3
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +1 -1
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +2 -2
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +2 -2
- package/src/api/core/core.controller.js +1 -1
- package/src/api/core/core.router.js +2 -2
- package/src/api/core/core.service.js +2 -2
- package/src/api/crypto/crypto.controller.js +1 -1
- package/src/api/crypto/crypto.service.js +1 -1
- package/src/api/cyberia-action/cyberia-action.controller.js +1 -1
- package/src/api/cyberia-action/cyberia-action.router.js +1 -1
- package/src/api/cyberia-action/cyberia-action.service.js +2 -2
- package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +1 -1
- package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +1 -1
- package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +2 -2
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +1 -1
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +2 -2
- package/src/api/cyberia-entity/cyberia-entity.controller.js +1 -1
- package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
- package/src/api/cyberia-entity/cyberia-entity.service.js +2 -2
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +1 -1
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +1 -1
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +2 -2
- package/src/api/cyberia-instance/cyberia-fallback-capture.js +466 -0
- package/src/api/cyberia-instance/cyberia-fallback-default-items.js +63 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +16 -1
- package/src/api/cyberia-instance/cyberia-instance-map.service.js +1 -1
- package/src/api/cyberia-instance/cyberia-instance.controller.js +4 -1
- package/src/api/cyberia-instance/cyberia-instance.router.js +15 -2
- package/src/api/cyberia-instance/cyberia-instance.service.js +45 -2
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +1 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +2 -2
- package/src/api/cyberia-map/cyberia-map.controller.js +1 -1
- package/src/api/cyberia-map/cyberia-map.router.js +1 -1
- package/src/api/cyberia-map/cyberia-map.service.js +2 -2
- package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
- package/src/api/cyberia-quest/cyberia-quest.router.js +1 -1
- package/src/api/cyberia-quest/cyberia-quest.service.js +2 -2
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +1 -1
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +2 -2
- package/src/api/cyberia-saga/cyberia-saga.controller.js +1 -1
- package/src/api/cyberia-saga/cyberia-saga.router.js +1 -1
- package/src/api/cyberia-saga/cyberia-saga.service.js +2 -2
- package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +16 -29
- package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
- package/src/api/cyberia-skill/cyberia-skill.router.js +1 -1
- package/src/api/cyberia-skill/cyberia-skill.service.js +2 -2
- package/src/api/default/default.controller.js +1 -1
- package/src/api/default/default.router.js +1 -1
- package/src/api/default/default.service.js +2 -2
- package/src/api/document/document.controller.js +1 -1
- package/src/api/document/document.router.js +1 -1
- package/src/api/document/document.service.js +2 -2
- package/src/api/file/file.controller.js +1 -1
- package/src/api/file/file.router.js +1 -1
- package/src/api/file/file.service.js +2 -2
- package/src/api/instance/instance.controller.js +1 -1
- package/src/api/instance/instance.router.js +1 -1
- package/src/api/instance/instance.service.js +2 -2
- package/src/api/ipfs/ipfs.controller.js +1 -1
- package/src/api/ipfs/ipfs.router.js +2 -2
- package/src/api/ipfs/ipfs.service.js +2 -2
- package/src/api/object-layer/object-layer.controller.js +1 -1
- package/src/api/object-layer/object-layer.model.js +204 -3
- package/src/api/object-layer/object-layer.router.js +2 -2
- package/src/api/object-layer/object-layer.service.js +4 -17
- package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +1 -1
- package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +1 -1
- package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +2 -2
- package/src/api/test/test.controller.js +1 -1
- package/src/api/test/test.service.js +1 -1
- package/src/api/user/guest.service.js +3 -3
- package/src/api/user/user.controller.js +1 -1
- package/src/api/user/user.router.js +2 -2
- package/src/api/user/user.service.js +4 -4
- package/src/api.js +5 -9
- package/src/cli/app.js +391 -0
- package/src/cli/baremetal.js +30 -36
- package/src/cli/client.js +306 -0
- package/src/cli/cloud-init.js +3 -3
- package/src/cli/cluster.js +242 -135
- package/src/cli/db.js +126 -67
- package/src/cli/deploy.js +158 -60
- package/src/cli/docker-compose.js +5 -5
- package/src/cli/domains.js +184 -0
- package/src/cli/dotenv-store.js +143 -0
- package/src/cli/event.js +2281 -0
- package/src/cli/fs.js +3 -3
- package/src/cli/host.js +672 -0
- package/src/cli/image.js +4 -7
- package/src/cli/index.js +426 -134
- package/src/cli/ipfs.js +34 -30
- package/src/cli/kickstart.js +1 -1
- package/src/cli/kubectl.js +218 -41
- package/src/cli/lxd.js +3 -3
- package/src/cli/monitor.js +1359 -26
- package/src/cli/package.js +90 -0
- package/src/cli/release.js +73 -34
- package/src/cli/repository.js +564 -367
- package/src/cli/run.js +362 -654
- package/src/cli/secrets.js +2158 -964
- package/src/cli/ssh.js +651 -331
- package/src/cli/state.js +394 -0
- package/src/cli/static.js +2 -2
- package/src/cli/system.js +26 -13
- package/src/cli/test.js +199 -125
- package/src/cli/vultr.js +623 -0
- package/src/cli/wireguard.js +2930 -0
- package/src/client/components/core/CalendarCore.js +53 -96
- package/src/client/components/core/Docs.js +258 -211
- package/src/client/components/core/FileExplorer.js +0 -21
- package/src/client/components/core/PanelForm.js +4 -4
- package/src/client/components/core/Repository.js +56 -0
- package/src/client/components/core/Translate.js +7 -0
- package/src/client/components/core/{FullScreen.js → ViewModeController.js} +42 -39
- package/src/client/components/core/Wallet.js +0 -11
- package/src/client/components/core/Worker.js +7 -1
- package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +2 -2
- package/src/client/components/cyberia/FallbackWorldEngineCyberia.js +368 -0
- package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +35 -1
- package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +4 -0
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -0
- package/src/client/components/default/AppShellDefault.js +1 -1
- package/src/client/components/default/SettingsDefault.js +2 -2
- package/src/client/components/itemledger/SettingsItemledger.js +2 -2
- package/src/client/components/underpost/AppShellUnderpost.js +3 -2
- package/src/client/components/underpost/SettingsUnderpost.js +2 -2
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +17 -3
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +32 -5
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +1 -1
- package/src/client/public/cyberia-docs/CYBERIA.md +21 -1
- package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +23 -6
- package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
- 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.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144.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.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72.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/white.jpg +0 -0
- package/src/client/public/default/browserconfig.xml +1 -1
- 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 +5 -5
- 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/yandex-browser-50x50.png +0 -0
- package/src/client/public/default/yandex-browser-manifest.json +1 -1
- package/src/client/services/cyberia-instance/cyberia-instance.service.js +40 -0
- package/src/client/services/object-layer/object-layer.management.js +4 -4
- package/src/client/ssr/RootDocument.js +1 -1
- package/src/client/ssr/body/404.js +1 -1
- package/src/client/ssr/body/500.js +1 -1
- package/src/client/ssr/body/CacheControl.js +1 -1
- package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +1 -1
- package/src/client/ssr/body/DefaultSplashScreen.js +1 -1
- package/src/client/ssr/body/SwaggerDarkMode.js +1 -1
- package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +1 -1
- package/src/client/ssr/head/CryptokoynScripts.js +1 -1
- package/src/client/ssr/head/Css.js +1 -1
- package/src/client/ssr/head/CyberiaPortalScripts.js +1 -1
- package/src/client/ssr/head/DefaultScripts.js +1 -1
- package/src/client/ssr/head/ItemledgerScripts.js +1 -1
- package/src/client/ssr/head/Microdata.js +1 -1
- package/src/client/ssr/head/Production.js +1 -1
- package/src/client/ssr/head/Pwa.js +1 -1
- package/src/client/ssr/head/PwaItemledger.js +1 -1
- package/src/client/ssr/head/Seo.js +1 -1
- package/src/client/ssr/head/UnderpostScripts.js +1 -1
- package/src/client/ssr/mailer/DefaultRecoverEmail.js +1 -1
- package/src/client/ssr/mailer/DefaultVerifyEmail.js +1 -1
- package/src/client/ssr/views/Cyberia404.js +7 -5
- package/src/client/ssr/views/CyberiaServerMetrics.js +1 -1
- package/src/client/ssr/views/Maintenance.js +1 -1
- package/src/client/ssr/views/NoNetworkConnection.js +1 -1
- package/src/client/ssr/views/Test.js +1 -1
- package/src/client/sw/core.sw.js +20 -14
- package/src/client-builder/client-build-docs.js +61 -46
- package/src/client-builder/client-build-live.js +2 -2
- package/src/client-builder/client-build.js +58 -44
- package/src/client-builder/client-dev-server.js +3 -3
- package/src/client-builder/client-icons.js +2 -2
- package/src/client-builder/ssr.js +3 -3
- package/src/client.build.js +3 -6
- package/src/client.dev.js +3 -6
- package/src/db/DataBaseProvider.js +186 -3
- package/src/db/mariadb/MariaDB.js +3 -2
- package/src/db/mongo/MongoBootstrap.js +273 -101
- package/src/db/mongo/MongooseDB.js +11 -8
- package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
- package/src/grpc/cyberia/grpc-server.js +1 -1
- package/src/index.js +103 -23
- package/src/mailer/EmailRender.js +2 -2
- package/src/mailer/MailerInterceptor.js +87 -0
- package/src/mailer/MailerProvider.js +50 -6
- package/src/projects/cyberia/atlas-sprite-sheet-generator.js +1 -1
- package/src/projects/cyberia/besu-genesis-generator.js +3 -3
- package/src/projects/cyberia/catalog-cyberia.js +54 -6
- package/src/projects/cyberia/gemini-client.js +1 -1
- package/src/projects/cyberia/generate-saga.js +15 -24
- package/src/projects/cyberia/hot-reload-trigger.js +1 -1
- package/src/projects/cyberia/instance-data.js +22 -3
- package/src/projects/cyberia/ipfs-client.js +4 -4
- package/src/projects/cyberia/map-preview-generator.js +1 -1
- package/src/projects/cyberia/object-layer.js +12 -22
- package/src/projects/cyberia/semantic-layer-generator.js +1 -1
- package/src/projects/underpost/catalog-underpost.js +13 -2
- package/src/proxy.js +4 -7
- package/src/runtime/cyberia-client/Dockerfile +9 -4
- package/src/runtime/cyberia-client/Dockerfile.dev +8 -2
- package/src/runtime/cyberia-server/Dockerfile +9 -4
- package/src/runtime/cyberia-server/Dockerfile.dev +8 -2
- package/src/runtime/engine-cyberia/Dockerfile +25 -9
- package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
- package/src/runtime/engine-cyberia/Dockerfile.test +4 -4
- package/src/runtime/engine-cyberia/compose.env +16 -0
- package/src/runtime/engine-cyberia/docker-compose.yml +31 -37
- package/src/runtime/express/Express.js +32 -27
- package/src/runtime/lampp/Lampp.js +22 -70
- package/src/runtime/nginx/Nginx.js +1 -1
- package/src/runtime/wp/Wp.js +16 -48
- package/src/server/{catalog.js → build/catalog.js} +15 -5
- package/src/server/build/coverage.js +117 -0
- package/src/server/build/execution.js +402 -0
- package/src/server/build/package.js +465 -0
- package/src/server/build/testing.js +528 -0
- package/src/server/{dns.js → network/dns.js} +241 -14
- package/src/server/network/forward-proxy.js +541 -0
- package/src/server/{middlewares.js → network/middlewares.js} +59 -4
- package/src/server/network/node-capability.js +98 -0
- package/src/server/{peer.js → network/peer.js} +3 -3
- package/src/server/{proxy.js → network/proxy.js} +7 -13
- package/src/server/network/router.js +356 -0
- package/src/server/{tls.js → network/tls.js} +2 -2
- package/src/server/network/underpost-compression.js +186 -0
- package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +26 -16
- package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +19 -3
- package/src/server/{cri.js → ops/cri.js} +2 -2
- package/src/server/ops/cron.js +949 -0
- package/src/server/ops/event-notification.js +284 -0
- package/src/server/{logger.js → ops/logger.js} +108 -23
- package/src/server/ops/monitoring.js +1724 -0
- package/src/server/ops/systemd.js +259 -0
- package/src/server/{conf.js → runtime/conf.js} +521 -520
- package/src/server/runtime/config-scope.js +215 -0
- package/src/server/runtime/environment.js +149 -0
- package/src/server/{process.js → runtime/process.js} +153 -13
- package/src/server/{runtime-status.js → runtime/runtime-status.js} +155 -16
- package/src/server/{runtime.js → runtime/runtime.js} +12 -8
- package/src/server/{start.js → runtime/start.js} +128 -39
- package/src/server/{auth.js → security/auth.js} +7 -8
- package/src/server/security/container-storage.js +382 -0
- package/src/server/{crypto.js → security/crypto.js} +1 -1
- package/src/server/security/selinux.js +185 -0
- package/src/server/{backup.js → storage/backup.js} +17 -8
- package/src/server/{data-query.js → storage/data-query.js} +1 -1
- package/src/server/{downloader.js → storage/downloader.js} +2 -2
- package/src/server/storage/repository.js +68 -0
- package/src/server.js +4 -7
- package/src/ws/IoInterface.js +1 -1
- package/src/ws/IoServer.js +1 -1
- package/src/ws/core/core.ws.connection.js +1 -1
- package/src/ws/core/core.ws.emit.js +1 -1
- package/src/ws/core/core.ws.server.js +1 -1
- package/src/ws/default/default.ws.connection.js +1 -1
- package/src/ws/default/default.ws.emit.js +1 -1
- package/src/ws/default/default.ws.server.js +1 -1
- package/test/e2e/event-e2e-public-ingress-down.js +45 -0
- package/test/e2e/event-e2e-wireguard-server-down.js +38 -0
- package/test/e2e/event-e2e-wireguard-spoke-down.js +40 -0
- package/test/{api.test.js → integration/app/api.test.js} +33 -14
- package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +30 -0
- package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +2 -1
- package/test/integration/app/cyberia/cyberia-load.test.js +467 -0
- package/test/integration/app/cyberia/fallback-world-capture.test.js +253 -0
- package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
- package/test/{shape-generator.test.js → integration/app/cyberia/shape-generator.test.js} +1 -1
- package/test/integration/infra/1-security/config-scope.test.js +305 -0
- package/test/integration/infra/1-security/container-storage.test.js +356 -0
- package/test/integration/infra/1-security/in-pod-cli-surface.test.js +86 -0
- package/test/integration/infra/1-security/secret-onboarding.test.js +930 -0
- package/test/integration/infra/1-security/selinux.test.js +69 -0
- package/test/{sops-secret-store.test.js → integration/infra/1-security/sops-secret-store.test.js} +415 -61
- package/test/integration/infra/1-security/systemd-service.test.js +70 -0
- package/test/integration/infra/1-security/underpost-config-secret.test.js +367 -0
- package/test/integration/infra/2-network/dns-firewall.test.js +566 -0
- package/test/integration/infra/2-network/node-capability.test.js +182 -0
- package/test/integration/infra/2-network/wireguard-cli.test.js +1163 -0
- package/test/integration/infra/2-network/wireguard-edge.test.js +1731 -0
- package/test/{cluster-instances.test.js → integration/infra/3-cluster/cluster-instances.test.js} +11 -15
- package/test/{deploy-node-placement.test.js → integration/infra/3-cluster/deploy-node-placement.test.js} +3 -3
- package/test/integration/infra/3-cluster/docker-compose-stack.test.js +313 -0
- package/test/integration/infra/4-ingress/deploy-routes.test.js +379 -0
- package/test/integration/infra/4-ingress/gateway-static-assets.test.js +453 -0
- package/test/{instance-traffic-plan.test.js → integration/infra/4-ingress/instance-traffic-plan.test.js} +10 -6
- package/test/{underpost-gateway.test.js → integration/infra/4-ingress/underpost-gateway.test.js} +47 -6
- package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +56 -4
- package/test/integration/infra/5-observability/cron-jobs.test.js +652 -0
- package/test/{deploy-monitor.test.js → integration/infra/5-observability/deploy-monitor.test.js} +29 -31
- package/test/integration/infra/5-observability/event-notification.test.js +197 -0
- package/test/integration/infra/5-observability/event-remediation.test.js +502 -0
- package/test/integration/infra/5-observability/event-targets.test.js +1174 -0
- package/test/integration/infra/5-observability/monitoring-stack.test.js +902 -0
- package/test/support/shell-harness.js +73 -0
- package/test/unit/build-template.test.js +97 -0
- package/test/unit/build-workflow-offline.test.js +132 -0
- package/test/unit/catalog.test.js +71 -0
- package/test/unit/client-build-docs.test.js +334 -0
- package/test/unit/conf-loading.test.js +303 -0
- package/test/unit/conf-resolution.test.js +979 -0
- package/test/unit/coverage-artifact.test.js +130 -0
- package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
- package/test/unit/deploy-env-resolution.test.js +38 -0
- package/test/unit/deploy-log-table.test.js +447 -0
- package/test/unit/execution-profiles.test.js +219 -0
- package/test/unit/fleet-sync-source.test.js +149 -0
- package/test/unit/logger-redaction.test.js +112 -0
- package/test/unit/package.test.js +403 -0
- package/test/unit/prepare-host.test.js +299 -0
- package/test/unit/process-environment.test.js +18 -0
- package/test/unit/propagation-message.test.js +78 -0
- package/test/unit/redeploy-plan.test.js +24 -0
- package/test/unit/release-bump.test.js +474 -0
- package/test/unit/ssh-output-redaction.test.js +28 -0
- package/test/unit/start-options.test.js +46 -0
- package/test/unit/test-tiers.test.js +193 -0
- package/vitest.config.js +58 -0
- package/.nycrc +0 -9
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
- package/manifests/mongodb/pv-pvc.yaml +0 -59
- package/scripts/link-local-underpost-cli.sh +0 -6
- package/src/api/user/user.build.js +0 -16
- package/src/cli/env.js +0 -177
- package/src/client/components/core/Blockchain.js +0 -41
- package/src/client/components/core/Blog.js +0 -9
- package/src/client/components/core/KeyboardAvoidance.js +0 -145
- package/src/client/public/default/assets/background/dark.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/doc/favicon.ico +0 -0
- package/src/client/public/doc/sitemap +0 -148
- package/src/server/cron.js +0 -476
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import { expect } from 'chai';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import {
|
|
6
|
+
TEST_TIERS,
|
|
7
|
+
UNDERPOST_TESTING,
|
|
8
|
+
coverageIncludeFactory,
|
|
9
|
+
coverageThresholdFactory,
|
|
10
|
+
resolveTestSelection,
|
|
11
|
+
testProjectsFactory,
|
|
12
|
+
testSuiteNames,
|
|
13
|
+
} from '../../src/server/build/testing.js';
|
|
14
|
+
|
|
15
|
+
// The table declares every tier the platform ships. A product build slices the
|
|
16
|
+
// tree, so whether a tier's directory is present here is a catalog question,
|
|
17
|
+
// asserted in catalog.test.js — these are about the table itself.
|
|
18
|
+
describe('test tiers', () => {
|
|
19
|
+
it('names every tier uniquely', () => {
|
|
20
|
+
const names = TEST_TIERS.map(({ name }) => name);
|
|
21
|
+
expect(new Set(names).size).to.equal(names.length);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('never leaves a tier on group order 0', () => {
|
|
25
|
+
// Vitest routes a single-worker project on the default 0 into a bucket it
|
|
26
|
+
// appends after every ordered group, which would run that tier last.
|
|
27
|
+
for (const { name, groupOrder } of TEST_TIERS) expect(groupOrder, name).to.be.greaterThan(0);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('declares tiers in the order they run', () => {
|
|
31
|
+
const orders = TEST_TIERS.map(({ groupOrder }) => groupOrder);
|
|
32
|
+
expect(orders).to.deep.equal([...orders].sort((a, b) => a - b));
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('keeps delegated tiers in the last group', () => {
|
|
36
|
+
// They run after the Vitest pass, so an earlier group order would describe
|
|
37
|
+
// an execution order that does not happen.
|
|
38
|
+
const lastGroup = Math.max(...TEST_TIERS.map(({ groupOrder }) => groupOrder));
|
|
39
|
+
for (const { name, groupOrder, delegate } of TEST_TIERS) if (delegate) expect(groupOrder, name).to.equal(lastGroup);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('exposes only non-delegated tiers as Vitest projects', () => {
|
|
43
|
+
const projects = testProjectsFactory().map(({ test }) => test.name);
|
|
44
|
+
expect(projects).to.deep.equal(TEST_TIERS.filter(({ delegate }) => !delegate).map(({ name }) => name));
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe('test tier selection', () => {
|
|
49
|
+
it('runs every tier when nothing is selected', () => {
|
|
50
|
+
for (const selector of ['', 'all']) {
|
|
51
|
+
const { projects, runVitest, delegated } = resolveTestSelection(selector);
|
|
52
|
+
// No explicit project list: Vitest runs them all, and a product build
|
|
53
|
+
// that strips one must not fail on a name it no longer ships.
|
|
54
|
+
expect(projects, selector).to.be.empty;
|
|
55
|
+
expect(runVitest, selector).to.equal(true);
|
|
56
|
+
expect(
|
|
57
|
+
delegated.map(({ name }) => name),
|
|
58
|
+
selector,
|
|
59
|
+
).to.deep.equal(TEST_TIERS.filter(({ delegate }) => delegate).map(({ name }) => name));
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('expands a suite into its tiers', () => {
|
|
64
|
+
expect(resolveTestSelection('infra').projects).to.deep.equal(
|
|
65
|
+
TEST_TIERS.filter(({ name }) => name.startsWith('infra:')).map(({ name }) => name),
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('skips the Vitest pass when only delegated tiers are selected', () => {
|
|
70
|
+
const { runVitest, delegated } = resolveTestSelection('contracts');
|
|
71
|
+
expect(runVitest).to.equal(false);
|
|
72
|
+
expect(delegated.map(({ name }) => name)).to.deep.equal(['contracts']);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('rejects an unknown selector instead of reporting an empty green run', () => {
|
|
76
|
+
expect(() => resolveTestSelection('not-a-suite')).to.throw(/unknown suite/);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('offers every suite prefix as a selector', () => {
|
|
80
|
+
for (const suite of testSuiteNames()) expect(() => resolveTestSelection(suite), suite).to.not.throw();
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
describe('delegated tier commands', () => {
|
|
85
|
+
const delegated = TEST_TIERS.filter(({ delegate }) => delegate);
|
|
86
|
+
|
|
87
|
+
it('ships at least one delegated tier to assert against', () => {
|
|
88
|
+
expect(delegated).to.not.be.empty;
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('writes results only when a destination is given', () => {
|
|
92
|
+
for (const { name, delegate } of delegated) {
|
|
93
|
+
expect(delegate({}), name).to.not.include('--test-reporter-destination=/');
|
|
94
|
+
expect(delegate({ resultsPath: '/results/TEST-x.xml' }), name).to.include('/results/TEST-x.xml');
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('passes a name filter through to its runner', () => {
|
|
99
|
+
for (const { name, delegate } of delegated) expect(delegate({ grep: 'Burning' }), name).to.include('Burning');
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// Under an outer `npm`, npx resolves the root project as the local prefix and
|
|
103
|
+
// pulls its own copy of a nested tool from the registry, which Hardhat then
|
|
104
|
+
// refuses to run as a non-local installation.
|
|
105
|
+
it('runs nested tooling from the nested install rather than through npx', () => {
|
|
106
|
+
for (const { name, delegate } of delegated) {
|
|
107
|
+
expect(delegate({}), name).to.not.match(/\bnpx\b/);
|
|
108
|
+
expect(delegate({}), name).to.include('./node_modules/.bin/');
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// A directory left behind by an interrupted install passes a `-d` probe while
|
|
113
|
+
// holding none of the binaries the tier runs.
|
|
114
|
+
it('probes the installed binary before skipping the install', () => {
|
|
115
|
+
for (const { name, delegate } of delegated)
|
|
116
|
+
expect(delegate({}), name).to.match(/\[ -x node_modules\/\.bin\/[\w.-]+ \] \|\| npm ci/);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
describe('coverage threshold', () => {
|
|
121
|
+
it('reports without gating until a run opts in', () => {
|
|
122
|
+
// A tier selection measures a slice of the tree, so the whole-suite number is
|
|
123
|
+
// not the bar it should be held to.
|
|
124
|
+
expect(coverageThresholdFactory({})).to.equal(null);
|
|
125
|
+
expect(coverageThresholdFactory({ COVERAGE_ENFORCE: '0' })).to.equal(null);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('gates an opted-in run on the shipped threshold', () => {
|
|
129
|
+
for (const COVERAGE_ENFORCE of ['1', 'true'])
|
|
130
|
+
expect(coverageThresholdFactory({ COVERAGE_ENFORCE }), COVERAGE_ENFORCE).to.equal(
|
|
131
|
+
UNDERPOST_TESTING.coverageThreshold,
|
|
132
|
+
);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
it('lets a repository ratchet its own bar', () => {
|
|
136
|
+
expect(coverageThresholdFactory({ COVERAGE_MIN: '25' })).to.equal(25);
|
|
137
|
+
// An unset repository variable arrives as an empty string, not as absent.
|
|
138
|
+
expect(coverageThresholdFactory({ COVERAGE_ENFORCE: '1', COVERAGE_MIN: '' })).to.equal(
|
|
139
|
+
UNDERPOST_TESTING.coverageThreshold,
|
|
140
|
+
);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it('refuses a bar that is not a percentage', () => {
|
|
144
|
+
for (const COVERAGE_MIN of ['eighty', '-1', '101'])
|
|
145
|
+
expect(() => coverageThresholdFactory({ COVERAGE_MIN }), COVERAGE_MIN).to.throw('COVERAGE_MIN');
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
describe('coverage scope', () => {
|
|
150
|
+
const vitestTiers = TEST_TIERS.filter(({ delegate }) => !delegate);
|
|
151
|
+
|
|
152
|
+
it('makes every Vitest tier accountable for the sources it drives', () => {
|
|
153
|
+
for (const { name, sources } of vitestTiers) expect(sources, name).to.not.be.empty;
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('leaves a delegated tier out of the Vitest report', () => {
|
|
157
|
+
// Its runner measures its own coverage, and this table only feeds Vitest.
|
|
158
|
+
for (const { name, sources, delegate } of TEST_TIERS) if (delegate) expect(sources, name).to.equal(undefined);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it('points every glob at something this tree ships', () => {
|
|
162
|
+
// A source that moved leaves the tier silently measuring nothing, which
|
|
163
|
+
// reads as coverage rather than as the missing measurement it is. A product
|
|
164
|
+
// build slices the tree, so only tiers it kept are asserted.
|
|
165
|
+
for (const { name, directory, sources } of vitestTiers) {
|
|
166
|
+
if (!fs.existsSync(directory)) continue;
|
|
167
|
+
for (const glob of sources) expect(fs.globSync(glob), `${name}: ${glob}`).to.not.be.empty;
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('measures every tier when the run selects none', () => {
|
|
172
|
+
const everySource = new Set(vitestTiers.flatMap(({ sources }) => sources));
|
|
173
|
+
expect(coverageIncludeFactory([])).to.have.members([...everySource]);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('measures only the selected tiers', () => {
|
|
177
|
+
const unit = TEST_TIERS.find(({ name }) => name === 'unit').sources;
|
|
178
|
+
for (const argv of [['--project', 'unit'], ['--project=unit']])
|
|
179
|
+
expect(coverageIncludeFactory(['npx', 'vitest', 'run', ...argv, '--coverage']), argv.join(' ')).to.deep.equal(
|
|
180
|
+
unit,
|
|
181
|
+
);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('counts a source two tiers drive once', () => {
|
|
185
|
+
const include = coverageIncludeFactory(['--project', 'infra:3-cluster', '--project', 'infra:4-ingress']);
|
|
186
|
+
expect(new Set(include).size).to.equal(include.length);
|
|
187
|
+
expect(include).to.include('src/server/runtime/conf.js');
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it('rejects a selection that matches no tier', () => {
|
|
191
|
+
expect(() => coverageIncludeFactory(['--project', 'not-a-tier'])).to.throw(/unknown suite/);
|
|
192
|
+
});
|
|
193
|
+
});
|
package/vitest.config.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { defineConfig } from 'vitest/config';
|
|
2
|
+
import {
|
|
3
|
+
UNDERPOST_TESTING,
|
|
4
|
+
coverageIncludeFactory,
|
|
5
|
+
coverageThresholdFactory,
|
|
6
|
+
testProjectsFactory,
|
|
7
|
+
} from './src/server/build/testing.js';
|
|
8
|
+
|
|
9
|
+
const allureResultsDirectory = process.env[UNDERPOST_TESTING.allureResultsEnvKey];
|
|
10
|
+
const coverageThreshold = coverageThresholdFactory(process.env);
|
|
11
|
+
const coverageInclude = coverageIncludeFactory(process.argv);
|
|
12
|
+
|
|
13
|
+
// Spread into every tier: a Vitest project inherits nothing from the root
|
|
14
|
+
// `test` block, and only `coverage` and `reporters` are read from it.
|
|
15
|
+
const projectDefaults = {
|
|
16
|
+
// Mocha's `describe`/`it` and the hooks stay global, so the suites read the
|
|
17
|
+
// same either side of the migration and carry no runner import.
|
|
18
|
+
globals: true,
|
|
19
|
+
environment: 'node',
|
|
20
|
+
// A tier is only meaningful if its failures are attributable to it, and a
|
|
21
|
+
// suite that reads `dd.routes` or binds a fixed port cannot share a worker
|
|
22
|
+
// with another doing the same.
|
|
23
|
+
fileParallelism: false,
|
|
24
|
+
...(allureResultsDirectory ? { setupFiles: ['allure-vitest/setup'] } : {}),
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default defineConfig({
|
|
28
|
+
test: {
|
|
29
|
+
reporters: [
|
|
30
|
+
'default',
|
|
31
|
+
...(allureResultsDirectory ? [['allure-vitest/reporter', { resultsDir: allureResultsDirectory }]] : []),
|
|
32
|
+
],
|
|
33
|
+
coverage: {
|
|
34
|
+
provider: 'v8',
|
|
35
|
+
reportsDirectory: UNDERPOST_TESTING.coverageDirectory,
|
|
36
|
+
// `lcov` is what Coveralls ingests, `json` is what a merged multi-job
|
|
37
|
+
// report is assembled from, `text` is what a local run reads.
|
|
38
|
+
reporter: ['text', 'lcov', 'json'],
|
|
39
|
+
// Written even when the run fails: the coverage workflows upload the report
|
|
40
|
+
// from a job the threshold step is meant to fail, and without it the badge
|
|
41
|
+
// freezes at the last passing build instead of moving with the tree.
|
|
42
|
+
reportOnFailure: true,
|
|
43
|
+
// The tiers in the selection decide what is measured, so a partial run
|
|
44
|
+
// reports the slice it drives and the whole run reports the whole of it —
|
|
45
|
+
// rather than every module the CLI barrel drags into a worker on import.
|
|
46
|
+
include: coverageInclude,
|
|
47
|
+
// Only the suites themselves: an `include` whitelist already keeps
|
|
48
|
+
// dependencies, bundles and generated assets out, and a directory pattern
|
|
49
|
+
// here is not anchored to the root — `test/**` also excluded the API
|
|
50
|
+
// surfaces named `test`, so the tier covering them reported nothing.
|
|
51
|
+
exclude: ['**/*.{test,spec}.js'],
|
|
52
|
+
// Absent unless the run opted in, so a single-tier run reports its slice
|
|
53
|
+
// instead of failing against a number it never measured.
|
|
54
|
+
...(coverageThreshold === null ? {} : { thresholds: { lines: coverageThreshold } }),
|
|
55
|
+
},
|
|
56
|
+
projects: testProjectsFactory(projectDefaults),
|
|
57
|
+
},
|
|
58
|
+
});
|
package/.nycrc
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
apiVersion: batch/v1
|
|
2
|
-
kind: CronJob
|
|
3
|
-
metadata:
|
|
4
|
-
name: dd-cron-dns
|
|
5
|
-
namespace: default
|
|
6
|
-
labels:
|
|
7
|
-
app: dd-cron-dns
|
|
8
|
-
managed-by: underpost
|
|
9
|
-
spec:
|
|
10
|
-
schedule: "* * * * *"
|
|
11
|
-
concurrencyPolicy: Forbid
|
|
12
|
-
startingDeadlineSeconds: 200
|
|
13
|
-
successfulJobsHistoryLimit: 3
|
|
14
|
-
failedJobsHistoryLimit: 1
|
|
15
|
-
suspend: false
|
|
16
|
-
jobTemplate:
|
|
17
|
-
spec:
|
|
18
|
-
template:
|
|
19
|
-
metadata:
|
|
20
|
-
labels:
|
|
21
|
-
app: dd-cron-dns
|
|
22
|
-
managed-by: underpost
|
|
23
|
-
spec:
|
|
24
|
-
containers:
|
|
25
|
-
- name: dd-cron-dns
|
|
26
|
-
image: underpost/underpost-engine:v3.2.90
|
|
27
|
-
command:
|
|
28
|
-
- /bin/sh
|
|
29
|
-
- -c
|
|
30
|
-
- >
|
|
31
|
-
cd /home/dd/engine &&
|
|
32
|
-
node bin env dd-cron production &&
|
|
33
|
-
node bin cron dd-cron dns --git --kubeadm
|
|
34
|
-
volumeMounts:
|
|
35
|
-
- mountPath: /home/dd/engine
|
|
36
|
-
name: underpost-cron-container-volume
|
|
37
|
-
- mountPath: /usr/lib/node_modules/underpost
|
|
38
|
-
name: underpost-share-env
|
|
39
|
-
volumes:
|
|
40
|
-
- hostPath:
|
|
41
|
-
path: /home/dd/engine
|
|
42
|
-
type: Directory
|
|
43
|
-
name: underpost-cron-container-volume
|
|
44
|
-
- hostPath:
|
|
45
|
-
path: /root/.nvm/versions/node/v24.15.0/lib/node_modules/underpost
|
|
46
|
-
type: DirectoryOrCreate
|
|
47
|
-
name: underpost-share-env
|
|
48
|
-
restartPolicy: OnFailure
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
apiVersion: v1
|
|
2
|
-
kind: PersistentVolume
|
|
3
|
-
metadata:
|
|
4
|
-
name: mongodb-pv-0
|
|
5
|
-
labels:
|
|
6
|
-
app: mongodb
|
|
7
|
-
spec:
|
|
8
|
-
capacity:
|
|
9
|
-
storage: 5Gi
|
|
10
|
-
accessModes:
|
|
11
|
-
- ReadWriteOnce
|
|
12
|
-
persistentVolumeReclaimPolicy: Retain
|
|
13
|
-
storageClassName: mongodb-storage-class
|
|
14
|
-
claimRef:
|
|
15
|
-
namespace: default
|
|
16
|
-
name: mongodb-storage-mongodb-0
|
|
17
|
-
hostPath:
|
|
18
|
-
path: /data/mongodb/v0
|
|
19
|
-
type: DirectoryOrCreate
|
|
20
|
-
---
|
|
21
|
-
apiVersion: v1
|
|
22
|
-
kind: PersistentVolume
|
|
23
|
-
metadata:
|
|
24
|
-
name: mongodb-pv-1
|
|
25
|
-
labels:
|
|
26
|
-
app: mongodb
|
|
27
|
-
spec:
|
|
28
|
-
capacity:
|
|
29
|
-
storage: 5Gi
|
|
30
|
-
accessModes:
|
|
31
|
-
- ReadWriteOnce
|
|
32
|
-
persistentVolumeReclaimPolicy: Retain
|
|
33
|
-
storageClassName: mongodb-storage-class
|
|
34
|
-
claimRef:
|
|
35
|
-
namespace: default
|
|
36
|
-
name: mongodb-storage-mongodb-1
|
|
37
|
-
hostPath:
|
|
38
|
-
path: /data/mongodb/v1
|
|
39
|
-
type: DirectoryOrCreate
|
|
40
|
-
---
|
|
41
|
-
apiVersion: v1
|
|
42
|
-
kind: PersistentVolume
|
|
43
|
-
metadata:
|
|
44
|
-
name: mongodb-pv-2
|
|
45
|
-
labels:
|
|
46
|
-
app: mongodb
|
|
47
|
-
spec:
|
|
48
|
-
capacity:
|
|
49
|
-
storage: 5Gi
|
|
50
|
-
accessModes:
|
|
51
|
-
- ReadWriteOnce
|
|
52
|
-
persistentVolumeReclaimPolicy: Retain
|
|
53
|
-
storageClassName: mongodb-storage-class
|
|
54
|
-
claimRef:
|
|
55
|
-
namespace: default
|
|
56
|
-
name: mongodb-storage-mongodb-2
|
|
57
|
-
hostPath:
|
|
58
|
-
path: /data/mongodb/v2
|
|
59
|
-
type: DirectoryOrCreate
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import fs from 'fs-extra';
|
|
2
|
-
import { faBase64Png, getBufferPngText } from '../../server/client-icons.js';
|
|
3
|
-
|
|
4
|
-
process.exit(0);
|
|
5
|
-
|
|
6
|
-
fs.writeFileSync(
|
|
7
|
-
'./tmp/api-user-invalid-token.png',
|
|
8
|
-
await getBufferPngText({ text: 'Invalid token', textColor: '#ff0000' }),
|
|
9
|
-
'utf8',
|
|
10
|
-
);
|
|
11
|
-
fs.writeFileSync(
|
|
12
|
-
'./tmp/api-user-recover.png',
|
|
13
|
-
Buffer.from(faBase64Png('rotate-left', 50, 50, '#ffffff'), 'base64'),
|
|
14
|
-
'utf8',
|
|
15
|
-
);
|
|
16
|
-
fs.writeFileSync('./tmp/api-user-check.png', Buffer.from(faBase64Png('check', 50, 50), 'base64'), 'utf8');
|
package/src/cli/env.js
DELETED
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Environment module for managing the environment variables of the underpost root
|
|
3
|
-
* @module src/cli/env.js
|
|
4
|
-
* @namespace UnderpostEnv
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { getNpmRootPath, writeEnv } from '../server/conf.js';
|
|
8
|
-
import fs from 'fs-extra';
|
|
9
|
-
import { loggerFactory } from '../server/logger.js';
|
|
10
|
-
import dotenv from 'dotenv';
|
|
11
|
-
import { pbcopy } from '../server/process.js';
|
|
12
|
-
|
|
13
|
-
const logger = loggerFactory(import.meta);
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Guards an env file path against stale directory artifacts.
|
|
17
|
-
* Removes the path if it exists as a directory (e.g. `.env/` created by a previous EISDIR bug).
|
|
18
|
-
* @param {string} envPath - The path to the environment file.
|
|
19
|
-
* @memberof UnderpostEnv
|
|
20
|
-
*/
|
|
21
|
-
const guardEnvPath = (envPath) => {
|
|
22
|
-
if (fs.existsSync(envPath) && !fs.statSync(envPath).isFile()) {
|
|
23
|
-
logger.warn(`Removing stale directory at env path: ${envPath}`);
|
|
24
|
-
fs.removeSync(envPath);
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* @class UnderpostRootEnv
|
|
30
|
-
* @description Manages the environment variables of the underpost root.
|
|
31
|
-
* @memberof UnderpostEnv
|
|
32
|
-
*/
|
|
33
|
-
class UnderpostRootEnv {
|
|
34
|
-
static API = {
|
|
35
|
-
/**
|
|
36
|
-
* @method set
|
|
37
|
-
* @description Sets an environment variable in the underpost root environment.
|
|
38
|
-
* @param {string} key - The key of the environment variable to set.
|
|
39
|
-
* @param {string} value - The value of the environment variable to set.
|
|
40
|
-
* @param {object} options - Options for setting the environment variable.
|
|
41
|
-
* @param {string} [options.deployId=''] - Deployment ID associated with the environment variable.
|
|
42
|
-
* @param {boolean} [options.build=false] - If true, sets the environment variable using custom --deploy-id or all dd.router deploy ids configured.
|
|
43
|
-
* @memberof UnderpostEnv
|
|
44
|
-
*/
|
|
45
|
-
set(key, value, options = { deployId: '', build: false }) {
|
|
46
|
-
const _set = (envPath, key, value) => {
|
|
47
|
-
guardEnvPath(envPath);
|
|
48
|
-
let env = {};
|
|
49
|
-
if (fs.existsSync(envPath)) env = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
|
|
50
|
-
env[key] = value;
|
|
51
|
-
writeEnv(envPath, env);
|
|
52
|
-
};
|
|
53
|
-
if (options.build) {
|
|
54
|
-
const deployIdList = options.deployId
|
|
55
|
-
? [options.deployId]
|
|
56
|
-
: fs.existsSync(`./engine-private/deploy/dd.router`)
|
|
57
|
-
? fs.readFileSync(`./engine-private/deploy/dd.router`, 'utf8').split(',')
|
|
58
|
-
: [DEFAULT_DEPLOY_ID];
|
|
59
|
-
for (const deployId of deployIdList)
|
|
60
|
-
for (const envFile of ['test', 'development', 'production'])
|
|
61
|
-
_set(`./engine-private/conf/${deployId}/.env.${envFile}`, key, value);
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
const exeRootPath = `${getNpmRootPath()}/underpost`;
|
|
65
|
-
fs.ensureDirSync(exeRootPath);
|
|
66
|
-
const envPath = `${exeRootPath}/.env`;
|
|
67
|
-
_set(envPath, key, value);
|
|
68
|
-
},
|
|
69
|
-
/**
|
|
70
|
-
* @method delete
|
|
71
|
-
* @description Deletes an environment variable from the underpost root environment.
|
|
72
|
-
* @param {string} key - The key of the environment variable to delete.
|
|
73
|
-
* @memberof UnderpostEnv
|
|
74
|
-
*/
|
|
75
|
-
delete(key) {
|
|
76
|
-
const exeRootPath = `${getNpmRootPath()}/underpost`;
|
|
77
|
-
const envPath = `${exeRootPath}/.env`;
|
|
78
|
-
guardEnvPath(envPath);
|
|
79
|
-
let env = {};
|
|
80
|
-
if (fs.existsSync(envPath)) env = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
|
|
81
|
-
delete env[key];
|
|
82
|
-
writeEnv(envPath, env);
|
|
83
|
-
},
|
|
84
|
-
/**
|
|
85
|
-
* @method get
|
|
86
|
-
* @description Gets an environment variable from the underpost root environment.
|
|
87
|
-
* @param {string} key - The key of the environment variable to get.
|
|
88
|
-
* @param {string} value - The value of the environment variable to get.
|
|
89
|
-
* @param {object} options - Options for getting the environment variable.
|
|
90
|
-
* @param {boolean} [options.plain=false] - If true, returns the environment variable value as a string.
|
|
91
|
-
* @param {boolean} [options.disableLog=false] - If true, disables logging of the environment variable value.
|
|
92
|
-
* @param {boolean} [options.copy=false] - If true, copies the environment variable value to the clipboard.
|
|
93
|
-
* @memberof UnderpostEnv
|
|
94
|
-
*/
|
|
95
|
-
get(key, value, options = { plain: false, disableLog: false, copy: false }) {
|
|
96
|
-
const exeRootPath = `${getNpmRootPath()}/underpost`;
|
|
97
|
-
const envPath = `${exeRootPath}/.env`;
|
|
98
|
-
if (!fs.existsSync(envPath) || !fs.statSync(envPath).isFile()) return undefined;
|
|
99
|
-
const env = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
|
|
100
|
-
if (!options.disableLog)
|
|
101
|
-
options?.plain === true ? console.log(env[key]) : logger.info(`${key}(${typeof env[key]})`, env[key]);
|
|
102
|
-
if (options.copy === true) pbcopy(env[key]);
|
|
103
|
-
return env[key];
|
|
104
|
-
},
|
|
105
|
-
/**
|
|
106
|
-
* @method list
|
|
107
|
-
* @description Lists all environment variables in the underpost root environment.
|
|
108
|
-
* @param {string} key - Not used for list operation.
|
|
109
|
-
* @param {string} value - Not used for list operation.
|
|
110
|
-
* @param {object} options - Options for listing environment variables.
|
|
111
|
-
* @param {string} [options.filter] - Filter keyword to match against keys or values.
|
|
112
|
-
* @memberof UnderpostEnv
|
|
113
|
-
*/
|
|
114
|
-
list(key, value, options = {}) {
|
|
115
|
-
const exeRootPath = `${getNpmRootPath()}/underpost`;
|
|
116
|
-
const envPath = `${exeRootPath}/.env`;
|
|
117
|
-
guardEnvPath(envPath);
|
|
118
|
-
if (!fs.existsSync(envPath)) {
|
|
119
|
-
logger.warn(`Empty environment variables`);
|
|
120
|
-
return {};
|
|
121
|
-
}
|
|
122
|
-
let env = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
|
|
123
|
-
|
|
124
|
-
// Apply filter if provided
|
|
125
|
-
if (options.filter) {
|
|
126
|
-
const filterKeyword = options.filter.toLowerCase();
|
|
127
|
-
const filtered = {};
|
|
128
|
-
for (const [envKey, envValue] of Object.entries(env)) {
|
|
129
|
-
const keyMatch = envKey.toLowerCase().includes(filterKeyword);
|
|
130
|
-
const valueMatch = String(envValue).toLowerCase().includes(filterKeyword);
|
|
131
|
-
if (keyMatch || valueMatch) {
|
|
132
|
-
filtered[envKey] = envValue;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
env = filtered;
|
|
136
|
-
logger.info(`underpost root (filtered by: ${options.filter})`, env);
|
|
137
|
-
} else {
|
|
138
|
-
logger.info('underpost root', env);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
return env;
|
|
142
|
-
},
|
|
143
|
-
/**
|
|
144
|
-
* @method clean
|
|
145
|
-
* @description Cleans the underpost root environment by removing the environment file.
|
|
146
|
-
* @param {object} options - Options for cleaning the environment.
|
|
147
|
-
* @param {Array<string>} [options.keepKeys=[]] - List of keys to keep in the environment file. If provided, only these keys will be retained.
|
|
148
|
-
* @memberof UnderpostEnv
|
|
149
|
-
*/
|
|
150
|
-
clean(options = { keepKeys: [] }) {
|
|
151
|
-
const { keepKeys } = options;
|
|
152
|
-
const exeRootPath = `${getNpmRootPath()}/underpost`;
|
|
153
|
-
const envPath = `${exeRootPath}/.env`;
|
|
154
|
-
if (keepKeys && keepKeys.length > 0 && fs.existsSync(envPath)) {
|
|
155
|
-
const env = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
|
|
156
|
-
const filteredEnv = Object.fromEntries(Object.entries(env).filter(([key]) => keepKeys.includes(key)));
|
|
157
|
-
writeEnv(envPath, filteredEnv);
|
|
158
|
-
} else {
|
|
159
|
-
fs.removeSync(envPath);
|
|
160
|
-
}
|
|
161
|
-
},
|
|
162
|
-
/**
|
|
163
|
-
* @method isInsideContainer
|
|
164
|
-
* @description Detects whether the current process is running inside a container.
|
|
165
|
-
* Checks for Kubernetes service injection or Docker's .dockerenv marker.
|
|
166
|
-
* @returns {boolean} True if running inside a container.
|
|
167
|
-
* @memberof UnderpostEnv
|
|
168
|
-
*/
|
|
169
|
-
isInsideContainer() {
|
|
170
|
-
return !!process.env.KUBERNETES_SERVICE_HOST || fs.existsSync('/.dockerenv');
|
|
171
|
-
},
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
export default UnderpostRootEnv;
|
|
176
|
-
|
|
177
|
-
export { guardEnvPath };
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { BlockChainService } from '../../services/blockchain/blockchain.service.js';
|
|
2
|
-
import { BtnIcon } from './BtnIcon.js';
|
|
3
|
-
import { dynamicCol } from './Css.js';
|
|
4
|
-
import { EventsUI } from './EventsUI.js';
|
|
5
|
-
import { Input } from './Input.js';
|
|
6
|
-
import { Translate } from './Translate.js';
|
|
7
|
-
|
|
8
|
-
const BlockChainManagement = {
|
|
9
|
-
Render: async function (options) {
|
|
10
|
-
setTimeout(() => {
|
|
11
|
-
EventsUI.onClick(`.btn-upload-blockchain`, async () => {
|
|
12
|
-
// const { result, status } = new BlockChainService.post();
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
return html` ${dynamicCol({ containerSelector: options.idModal, id: 'blockchain' })}
|
|
16
|
-
<div class="fl">
|
|
17
|
-
<div class="in fll blockchain-col-a">
|
|
18
|
-
<div class="in section-mp">
|
|
19
|
-
<div class="in sub-title-modal"><i class="fa-solid fa-sliders"></i> ${Translate.Render('config')}</div>
|
|
20
|
-
<div class="in">
|
|
21
|
-
${await Input.Render({
|
|
22
|
-
id: `blockchain-seed`,
|
|
23
|
-
label: html`<i class="fa-solid fa-pen-to-square"></i> ${Translate.Render('blockchain-seed')}`,
|
|
24
|
-
containerClass: 'section-mp width-mini-box input-container',
|
|
25
|
-
placeholder: true,
|
|
26
|
-
})}
|
|
27
|
-
${await BtnIcon.Render({
|
|
28
|
-
class: `inl section-mp btn-custom btn-upload-blockchain`,
|
|
29
|
-
label: html`<i class="fas fa-plus"></i> ${Translate.Render(`create`)}`,
|
|
30
|
-
})}
|
|
31
|
-
</div>
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
34
|
-
<div class="in fll blockchain-col-b">
|
|
35
|
-
<div class="in section-mp"></div>
|
|
36
|
-
</div>
|
|
37
|
-
</div>`;
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
export { BlockChainManagement };
|