@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,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What each node role is allowed to do, as one table the rest of the platform reads.
|
|
3
|
+
*
|
|
4
|
+
* The roles are the three the topology already defines — `hub`, `control`, `worker` — and this
|
|
5
|
+
* module adds no fourth. What it adds is a single answer to a question that was previously spread
|
|
6
|
+
* across the commands that happened to ask it: `wireguard` knew HAProxy is hub-only, `event` knew
|
|
7
|
+
* the dispatcher is control-only, and the sync steps knew cron publication is control-only, but
|
|
8
|
+
* nothing stated the boundary those three agree on.
|
|
9
|
+
*
|
|
10
|
+
* The distinction the table exists to hold is between a Kubernetes **node** and a Kubernetes
|
|
11
|
+
* **administrator**. A worker runs the kubelet and joins the cluster; that is node runtime, and it
|
|
12
|
+
* is not permission to administer the cluster it belongs to. Being managed by the host domain is
|
|
13
|
+
* not permission either — `underpost host` is node-level operational configuration, and every role
|
|
14
|
+
* has it.
|
|
15
|
+
*
|
|
16
|
+
* @module src/server/network/node-capability.js
|
|
17
|
+
* @namespace NodeCapability
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @constant NODE_CAPABILITIES
|
|
22
|
+
* @description Capabilities held by each role, derived from the operations the repository
|
|
23
|
+
* actually gates: HAProxy and the forward proxy refuse to configure themselves off the hub, the
|
|
24
|
+
* dispatcher refuses to install off a control node, and the sync sequence publishes CronJobs from
|
|
25
|
+
* the control node alone.
|
|
26
|
+
* @memberof NodeCapability
|
|
27
|
+
*/
|
|
28
|
+
const NODE_CAPABILITIES = Object.freeze({
|
|
29
|
+
hub: Object.freeze([
|
|
30
|
+
'host-configuration',
|
|
31
|
+
'wireguard-hub',
|
|
32
|
+
'haproxy',
|
|
33
|
+
'forward-proxy',
|
|
34
|
+
'edge-routing',
|
|
35
|
+
'node-metrics',
|
|
36
|
+
]),
|
|
37
|
+
control: Object.freeze([
|
|
38
|
+
'host-configuration',
|
|
39
|
+
'wireguard-spoke',
|
|
40
|
+
'kubernetes-node',
|
|
41
|
+
'kubernetes-administration',
|
|
42
|
+
'cluster-secret-administration',
|
|
43
|
+
'cron-publication',
|
|
44
|
+
'event-service',
|
|
45
|
+
'node-metrics',
|
|
46
|
+
]),
|
|
47
|
+
worker: Object.freeze(['host-configuration', 'wireguard-spoke', 'kubernetes-node', 'node-metrics']),
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
/** The roles the topology defines. Ordered hub-first, as every fleet listing is. */
|
|
51
|
+
const NODE_ROLES = Object.freeze(Object.keys(NODE_CAPABILITIES));
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Capabilities that reach the Kubernetes API with cluster-wide authority.
|
|
55
|
+
*
|
|
56
|
+
* Named apart from the rest because they are the ones a role must never acquire by side effect:
|
|
57
|
+
* possessing `kubectl`, joining the cluster, or carrying the host environment are each a reason
|
|
58
|
+
* someone might assume these follow, and none of them is.
|
|
59
|
+
* @memberof NodeCapability
|
|
60
|
+
*/
|
|
61
|
+
const CLUSTER_ADMIN_CAPABILITIES = Object.freeze([
|
|
62
|
+
'kubernetes-administration',
|
|
63
|
+
'cluster-secret-administration',
|
|
64
|
+
'cron-publication',
|
|
65
|
+
]);
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Whether a role holds a capability.
|
|
69
|
+
* @param {string} role - `hub`, `control` or `worker`.
|
|
70
|
+
* @param {string} capability - Capability name.
|
|
71
|
+
* @returns {boolean} True when the role holds it.
|
|
72
|
+
* @memberof NodeCapability
|
|
73
|
+
*/
|
|
74
|
+
const roleHasCapability = (role, capability) => (NODE_CAPABILITIES[role] || []).includes(capability);
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Refuses an operation the role does not hold the capability for.
|
|
78
|
+
*
|
|
79
|
+
* Fail-closed on an unknown role as well as an unheld capability: a node whose document names a
|
|
80
|
+
* role this table does not define has no capabilities, rather than the union of the ones it might
|
|
81
|
+
* have meant.
|
|
82
|
+
* @param {object} params - Assertion context.
|
|
83
|
+
* @param {string} params.role - Role of the node the operation would run on.
|
|
84
|
+
* @param {string} params.capability - Capability the operation requires.
|
|
85
|
+
* @param {string} params.operation - Operation being attempted, named in the refusal.
|
|
86
|
+
* @throws {Error} When the role does not hold the capability.
|
|
87
|
+
* @memberof NodeCapability
|
|
88
|
+
*/
|
|
89
|
+
const assertRoleCapability = ({ role, capability, operation }) => {
|
|
90
|
+
if (roleHasCapability(role, capability)) return;
|
|
91
|
+
const held = NODE_CAPABILITIES[role];
|
|
92
|
+
throw new Error(
|
|
93
|
+
`[capability] ${operation} requires '${capability}', which the '${role || '(unset)'}' role does not hold; ` +
|
|
94
|
+
(held ? `it holds ${held.join(', ')}` : `known roles are ${NODE_ROLES.join(', ')}`),
|
|
95
|
+
);
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export { CLUSTER_ADMIN_CAPABILITIES, NODE_CAPABILITIES, NODE_ROLES, assertRoleCapability, roleHasCapability };
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
* Initializes and configures the PeerJS server instance, typically running
|
|
4
4
|
* alongside a main Node.js application.
|
|
5
5
|
*
|
|
6
|
-
* @module src/server/peer.js
|
|
6
|
+
* @module src/server/network/peer.js
|
|
7
7
|
* @namespace Peer
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { PeerServer } from 'peer';
|
|
11
11
|
import dotenv from 'dotenv';
|
|
12
|
-
import { loggerFactory } from '
|
|
13
|
-
import Underpost from '
|
|
12
|
+
import { loggerFactory } from '../ops/logger.js';
|
|
13
|
+
import Underpost from '../../index.js';
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Logger instance for this module, utilizing the framework's factory.
|
|
@@ -1,26 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Manages the creation and configuration of the reverse proxy server,
|
|
3
3
|
* including handling HTTP/HTTPS listeners and routing based on host configuration.
|
|
4
|
-
* @module src/server/proxy.js
|
|
4
|
+
* @module src/server/network/proxy.js
|
|
5
5
|
* @namespace ProxyService
|
|
6
6
|
*/
|
|
7
7
|
'use strict';
|
|
8
8
|
|
|
9
9
|
import express from 'express';
|
|
10
10
|
import { createProxyMiddleware } from 'http-proxy-middleware';
|
|
11
|
-
import { loggerFactory, loggerMiddleware } from '
|
|
12
|
-
import {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
getTlsHosts,
|
|
17
|
-
isDevProxyContext,
|
|
18
|
-
isTlsDevProxy,
|
|
19
|
-
} from './conf.js';
|
|
20
|
-
|
|
21
|
-
import { shellExec } from './process.js';
|
|
11
|
+
import { loggerFactory, loggerMiddleware } from '../ops/logger.js';
|
|
12
|
+
import { etcHostFactory, getTlsHosts, isDevProxyContext, isTlsDevProxy } from '../runtime/conf.js';
|
|
13
|
+
import { buildPortProxyRouter, buildProxyRouter } from './router.js';
|
|
14
|
+
|
|
15
|
+
import { shellExec } from '../runtime/process.js';
|
|
22
16
|
import fs from 'fs-extra';
|
|
23
|
-
import Underpost from '
|
|
17
|
+
import Underpost from '../../index.js';
|
|
24
18
|
|
|
25
19
|
const logger = loggerFactory(import.meta);
|
|
26
20
|
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The deploy route registry, and the routers built from it.
|
|
3
|
+
*
|
|
4
|
+
* Two levels of "route" meet here, which is why they share a module:
|
|
5
|
+
*
|
|
6
|
+
* - `engine-private/deploy/dd.routes` lists the deploy ids this engine serves.
|
|
7
|
+
* It is the cluster's route table at the deploy level, and every command that
|
|
8
|
+
* accepts the `dd` meta id expands it through this file.
|
|
9
|
+
* - The proxy routers map `<host><path>` to the local port a runtime bound, and
|
|
10
|
+
* are derived from each deploy's `conf.server.json`.
|
|
11
|
+
*
|
|
12
|
+
* Keeping both here means the file path is written once and the port arithmetic
|
|
13
|
+
* lives beside the list it is computed for.
|
|
14
|
+
*
|
|
15
|
+
* @module src/server/network/router.js
|
|
16
|
+
* @namespace ServerRouter
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import fs from 'fs-extra';
|
|
20
|
+
import { newInstance, orderArrayFromAttrInt, range } from '../../client/components/core/CommonJs.js';
|
|
21
|
+
import { loggerFactory } from '../ops/logger.js';
|
|
22
|
+
import { Config, DEFAULT_DEPLOY_ID, isDevProxyContext, isTlsDevProxy, loadConfServerJson } from '../runtime/conf.js';
|
|
23
|
+
|
|
24
|
+
const logger = loggerFactory(import.meta);
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @constant DEPLOY_ROUTES_PATH
|
|
28
|
+
* @description The deploy route table: a comma separated list of the deploy ids
|
|
29
|
+
* this engine serves.
|
|
30
|
+
* @memberof ServerRouter
|
|
31
|
+
*/
|
|
32
|
+
const DEPLOY_ROUTES_PATH = './engine-private/deploy/dd.routes';
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @method deployRoutesExists
|
|
36
|
+
* @description Whether the route table is present.
|
|
37
|
+
* @returns {boolean} True when the engine has a route table.
|
|
38
|
+
* @memberof ServerRouter
|
|
39
|
+
*/
|
|
40
|
+
const deployRoutesExists = () => fs.existsSync(DEPLOY_ROUTES_PATH);
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @method readDeployRoutes
|
|
44
|
+
* @description The deploy ids in the route table, trimmed and without empties.
|
|
45
|
+
* @returns {string[]} Deploy ids, empty when no table exists.
|
|
46
|
+
* @memberof ServerRouter
|
|
47
|
+
*/
|
|
48
|
+
const readDeployRoutes = () =>
|
|
49
|
+
deployRoutesExists() ? parseDeployRoutes(fs.readFileSync(DEPLOY_ROUTES_PATH, 'utf8')) : [];
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* @method parseDeployRoutes
|
|
53
|
+
* @description Parses route table contents. Kept separate from the read so the
|
|
54
|
+
* parsing is testable without a checkout.
|
|
55
|
+
* @param {string} [contents] - Raw route table contents.
|
|
56
|
+
* @returns {string[]} Deploy ids, trimmed, empties dropped.
|
|
57
|
+
* @memberof ServerRouter
|
|
58
|
+
*/
|
|
59
|
+
const parseDeployRoutes = (contents = '') =>
|
|
60
|
+
`${contents || ''}`
|
|
61
|
+
.split(',')
|
|
62
|
+
.map((id) => id.trim())
|
|
63
|
+
.filter(Boolean);
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @method registerDeployRoute
|
|
67
|
+
* @description Appends a deploy id to the route table, creating it when absent.
|
|
68
|
+
*
|
|
69
|
+
* Idempotent: a deploy already routed is left alone rather than listed twice,
|
|
70
|
+
* which would make every `dd` fan-out build and deploy it twice.
|
|
71
|
+
* @param {string} deployId - Deploy id to route.
|
|
72
|
+
* @returns {string[]} The resulting route table.
|
|
73
|
+
* @memberof ServerRouter
|
|
74
|
+
*/
|
|
75
|
+
const registerDeployRoute = (deployId) => {
|
|
76
|
+
const id = `${deployId || ''}`.trim();
|
|
77
|
+
if (!id) return readDeployRoutes();
|
|
78
|
+
const routes = readDeployRoutes();
|
|
79
|
+
if (routes.includes(id)) return routes;
|
|
80
|
+
routes.push(id);
|
|
81
|
+
fs.outputFileSync(DEPLOY_ROUTES_PATH, routes.join(','), 'utf8');
|
|
82
|
+
return routes;
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* @method resolveDeployList
|
|
87
|
+
* @description Resolves the concrete deploy ids a run should iterate over.
|
|
88
|
+
*
|
|
89
|
+
* The meta deploy id `dd` fans out to the route table; when no table exists
|
|
90
|
+
* (e.g. the private repository is not checked out) it falls back to
|
|
91
|
+
* {@link ServerConfBuilder.DEFAULT_DEPLOY_ID}. Any other value is parsed as a
|
|
92
|
+
* comma separated list.
|
|
93
|
+
* @param {string} deployId - A deploy id, a comma separated list, or the `dd` meta id.
|
|
94
|
+
* @returns {string[]} Ordered list of concrete deploy ids.
|
|
95
|
+
* @memberof ServerRouter
|
|
96
|
+
*/
|
|
97
|
+
const resolveDeployList = (deployId) => {
|
|
98
|
+
if (deployId !== 'dd') return parseDeployRoutes(deployId);
|
|
99
|
+
const routes = readDeployRoutes();
|
|
100
|
+
return routes.length > 0 ? routes : parseDeployRoutes(DEFAULT_DEPLOY_ID);
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* @method buildProxyRouter
|
|
105
|
+
* @description Builds the proxy router.
|
|
106
|
+
* @memberof ServerRouter
|
|
107
|
+
*/
|
|
108
|
+
const buildProxyRouter = () => {
|
|
109
|
+
const confServer = newInstance(Config.default.server);
|
|
110
|
+
let currentPort = parseInt(process.env.PORT) + 1;
|
|
111
|
+
const proxyRouter = {};
|
|
112
|
+
for (const host of Object.keys(confServer)) {
|
|
113
|
+
for (const path of Object.keys(confServer[host])) {
|
|
114
|
+
if (confServer[host][path].singleReplica) continue;
|
|
115
|
+
|
|
116
|
+
if (isDevProxyContext()) confServer[host][path].proxy = [isTlsDevProxy() ? 443 : 80];
|
|
117
|
+
|
|
118
|
+
confServer[host][path].port = newInstance(currentPort);
|
|
119
|
+
for (const port of confServer[host][path].proxy) {
|
|
120
|
+
if (!(port in proxyRouter)) proxyRouter[port] = {};
|
|
121
|
+
proxyRouter[port][`${host}${path}`] = {
|
|
122
|
+
// target: `http://${host}:${confServer[host][path].port}${path}`,
|
|
123
|
+
target: `http://localhost:${confServer[host][path].port}`,
|
|
124
|
+
// target: `http://127.0.0.1:${confServer[host][path].port}`,
|
|
125
|
+
proxy: confServer[host][path].proxy,
|
|
126
|
+
redirect: confServer[host][path].redirect,
|
|
127
|
+
host,
|
|
128
|
+
path,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
currentPort++;
|
|
132
|
+
if (confServer[host][path].peer) {
|
|
133
|
+
const peerPath = path === '/' ? `/peer` : `${path}/peer`;
|
|
134
|
+
confServer[host][peerPath] = newInstance(confServer[host][path]);
|
|
135
|
+
confServer[host][peerPath].port = newInstance(currentPort);
|
|
136
|
+
for (const port of confServer[host][path].proxy) {
|
|
137
|
+
if (!(port in proxyRouter)) proxyRouter[port] = {};
|
|
138
|
+
proxyRouter[port][`${host}${peerPath}`] = {
|
|
139
|
+
// target: `http://${host}:${confServer[host][peerPath].port}${peerPath}`,
|
|
140
|
+
target: `http://localhost:${confServer[host][peerPath].port}`,
|
|
141
|
+
// target: `http://127.0.0.1:${confServer[host][peerPath].port}`,
|
|
142
|
+
proxy: confServer[host][peerPath].proxy,
|
|
143
|
+
host,
|
|
144
|
+
path: peerPath,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
currentPort++;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return proxyRouter;
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @method pathPortAssignmentFactory
|
|
157
|
+
* @description Creates the path port assignment.
|
|
158
|
+
* @param {string} deployId - The deploy ID.
|
|
159
|
+
* @param {object} router - The router.
|
|
160
|
+
* @param {object} confServer - The server configuration.
|
|
161
|
+
* @memberof ServerRouter
|
|
162
|
+
*/
|
|
163
|
+
const pathPortAssignmentFactory = async (deployId, router, confServer) => {
|
|
164
|
+
const pathPortAssignmentData = {};
|
|
165
|
+
for (const host of Object.keys(confServer)) {
|
|
166
|
+
const pathPortAssignment = [];
|
|
167
|
+
for (const path of Object.keys(confServer[host])) {
|
|
168
|
+
const { peer } = confServer[host][path];
|
|
169
|
+
if (!router[`${host}${path === '/' ? '' : path}`]) continue;
|
|
170
|
+
const port = parseInt(router[`${host}${path === '/' ? '' : path}`].split(':')[2]);
|
|
171
|
+
// logger.info('', { host, port, path });
|
|
172
|
+
pathPortAssignment.push({
|
|
173
|
+
port,
|
|
174
|
+
path,
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
if (peer) {
|
|
178
|
+
// logger.info('', { host, port: port + 1, path: '/peer' });
|
|
179
|
+
pathPortAssignment.push({
|
|
180
|
+
port: port + 1,
|
|
181
|
+
path: `${path === '/' ? '' : path}/peer`,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
pathPortAssignmentData[host] = pathPortAssignment;
|
|
186
|
+
}
|
|
187
|
+
if (fs.existsSync(`./engine-private/replica`)) {
|
|
188
|
+
const singleReplicas = await fs.readdir(`./engine-private/replica`);
|
|
189
|
+
for (let replica of singleReplicas) {
|
|
190
|
+
if (replica.startsWith(deployId)) {
|
|
191
|
+
const replicaServerConf = loadConfServerJson(`./engine-private/replica/${replica}/conf.server.json`);
|
|
192
|
+
for (const host of Object.keys(replicaServerConf)) {
|
|
193
|
+
const pathPortAssignment = [];
|
|
194
|
+
for (const path of Object.keys(replicaServerConf[host])) {
|
|
195
|
+
const { peer } = replicaServerConf[host][path];
|
|
196
|
+
if (!router[`${host}${path === '/' ? '' : path}`]) continue;
|
|
197
|
+
const port = parseInt(router[`${host}${path === '/' ? '' : path}`].split(':')[2]);
|
|
198
|
+
// logger.info('', { host, port, path });
|
|
199
|
+
pathPortAssignment.push({
|
|
200
|
+
port,
|
|
201
|
+
path,
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
if (peer) {
|
|
205
|
+
// logger.info('', { host, port: port + 1, path: '/peer' });
|
|
206
|
+
pathPortAssignment.push({
|
|
207
|
+
port: port + 1,
|
|
208
|
+
path: `${path === '/' ? '' : path}/peer`,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
pathPortAssignmentData[host] = pathPortAssignmentData[host].concat(pathPortAssignment);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return pathPortAssignmentData;
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* @method deployRangePortFactory
|
|
222
|
+
* @description Creates the deploy range port factory.
|
|
223
|
+
* @param {object} router - The router.
|
|
224
|
+
* @returns {object} - The deploy range port factory.
|
|
225
|
+
* @memberof ServerRouter
|
|
226
|
+
*/
|
|
227
|
+
const deployRangePortFactory = (router) => {
|
|
228
|
+
const ports = Object.values(router).map((p) => parseInt(p.split(':')[2]));
|
|
229
|
+
const fromPort = Math.min(...ports);
|
|
230
|
+
const toPort = Math.max(...ports);
|
|
231
|
+
return { ports, fromPort, toPort };
|
|
232
|
+
};
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* @method buildKindPorts
|
|
236
|
+
* @description Builds the kind ports.
|
|
237
|
+
* @param {number} from - The from port.
|
|
238
|
+
* @param {number} to - The to port.
|
|
239
|
+
* @returns {string} - The kind ports.
|
|
240
|
+
* @memberof ServerRouter
|
|
241
|
+
*/
|
|
242
|
+
const buildKindPorts = (from, to) =>
|
|
243
|
+
range(parseInt(from), parseInt(to))
|
|
244
|
+
.map(
|
|
245
|
+
(port) => ` - name: 'tcp-${port}'
|
|
246
|
+
protocol: TCP
|
|
247
|
+
port: ${port}
|
|
248
|
+
targetPort: ${port}
|
|
249
|
+
- name: 'udp-${port}'
|
|
250
|
+
protocol: UDP
|
|
251
|
+
port: ${port}
|
|
252
|
+
targetPort: ${port}
|
|
253
|
+
`,
|
|
254
|
+
)
|
|
255
|
+
.join('\n');
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* @method buildPortProxyRouter
|
|
259
|
+
* @description Builds the port proxy router.
|
|
260
|
+
* @param {object} options - The options.
|
|
261
|
+
* @param {number} [options.port=4000] - The port.
|
|
262
|
+
* @param {object} options.proxyRouter - The proxy router.
|
|
263
|
+
* @param {object} [options.hosts] - The hosts.
|
|
264
|
+
* @param {boolean} [options.orderByPathLength=false] - Whether to order by path length.
|
|
265
|
+
* @param {boolean} [options.devProxyContext=false] - Whether to use dev proxy context.
|
|
266
|
+
* @returns {object} - The port proxy router.
|
|
267
|
+
* @memberof ServerRouter
|
|
268
|
+
*/
|
|
269
|
+
const buildPortProxyRouter = (
|
|
270
|
+
options = { port: 4000, proxyRouter, hosts, orderByPathLength: false, devProxyContext: false },
|
|
271
|
+
) => {
|
|
272
|
+
let { port, proxyRouter, hosts, orderByPathLength } = options;
|
|
273
|
+
hosts = hosts || proxyRouter[port] || {};
|
|
274
|
+
|
|
275
|
+
const router = {};
|
|
276
|
+
// build router
|
|
277
|
+
Object.keys(hosts).map((hostKey) => {
|
|
278
|
+
let { host, path, target, proxy, peer } = hosts[hostKey];
|
|
279
|
+
|
|
280
|
+
if (!proxy.includes(port)) {
|
|
281
|
+
logger.warn('Proxy port not set on conf', { port, host, path, proxy, target });
|
|
282
|
+
if (process.env.NODE_ENV === 'production') {
|
|
283
|
+
logger.warn('Omitting host', { host, path, target });
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// ${process.env.NODE_ENV === 'development' && !isDevProxyContext() ? `:${port}` : ''}
|
|
288
|
+
const absoluteHost = [80, 443].includes(port)
|
|
289
|
+
? `${host}${path === '/' ? '' : path}`
|
|
290
|
+
: `${host}:${port}${path === '/' ? '' : path}`;
|
|
291
|
+
|
|
292
|
+
if (absoluteHost in router)
|
|
293
|
+
logger.warn('Overwrite: Absolute host already exists on router', { absoluteHost, target });
|
|
294
|
+
|
|
295
|
+
if (options.devProxyContext === true) {
|
|
296
|
+
const appDevPort = parseInt(target.split(':')[2]) - process.env.DEV_PROXY_PORT_OFFSET;
|
|
297
|
+
router[absoluteHost] = `http://localhost:${appDevPort}`;
|
|
298
|
+
} else router[absoluteHost] = target;
|
|
299
|
+
}); // order router
|
|
300
|
+
|
|
301
|
+
if (Object.keys(router).length === 0) return router;
|
|
302
|
+
|
|
303
|
+
const devApiConfPath = `./engine-private/conf/${process.argv[3]}/conf.server.dev.${process.argv[4]}-dev-api.json`;
|
|
304
|
+
if (options.devProxyContext === true && process.env.NODE_ENV === 'development' && fs.existsSync(devApiConfPath)) {
|
|
305
|
+
const confDevApiServer = JSON.parse(fs.readFileSync(devApiConfPath, 'utf8'));
|
|
306
|
+
let devApiHosts = [];
|
|
307
|
+
let origins = [];
|
|
308
|
+
for (const _host of Object.keys(confDevApiServer))
|
|
309
|
+
for (const _path of Object.keys(confDevApiServer[_host])) {
|
|
310
|
+
if (confDevApiServer[_host][_path].origins && confDevApiServer[_host][_path].origins.length) {
|
|
311
|
+
origins.push(...confDevApiServer[_host][_path].origins);
|
|
312
|
+
if (_path !== 'peer' && devApiHosts.length === 0)
|
|
313
|
+
devApiHosts.push(
|
|
314
|
+
`${_host}${[80, 443].includes(port) && isDevProxyContext() ? '' : `:${port}`}${_path == '/' ? '' : _path}`,
|
|
315
|
+
);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
origins = Array.from(new Set(origins));
|
|
319
|
+
console.log({
|
|
320
|
+
origins,
|
|
321
|
+
devApiHosts,
|
|
322
|
+
});
|
|
323
|
+
for (const devApiHost of devApiHosts) {
|
|
324
|
+
if (devApiHost in router) {
|
|
325
|
+
const target = router[devApiHost];
|
|
326
|
+
delete router[devApiHost];
|
|
327
|
+
router[`${devApiHost}/${process.env.BASE_API}`] = target;
|
|
328
|
+
router[`${devApiHost}/socket.io`] = target;
|
|
329
|
+
for (const origin of origins) router[devApiHost] = origin;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
if (orderByPathLength === true) {
|
|
335
|
+
const reOrderRouter = {};
|
|
336
|
+
for (const absoluteHostKey of orderArrayFromAttrInt(Object.keys(router), 'length'))
|
|
337
|
+
reOrderRouter[absoluteHostKey] = router[absoluteHostKey];
|
|
338
|
+
return reOrderRouter;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
return router;
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
export {
|
|
345
|
+
DEPLOY_ROUTES_PATH,
|
|
346
|
+
buildKindPorts,
|
|
347
|
+
buildPortProxyRouter,
|
|
348
|
+
buildProxyRouter,
|
|
349
|
+
deployRangePortFactory,
|
|
350
|
+
deployRoutesExists,
|
|
351
|
+
parseDeployRoutes,
|
|
352
|
+
pathPortAssignmentFactory,
|
|
353
|
+
readDeployRoutes,
|
|
354
|
+
registerDeployRoute,
|
|
355
|
+
resolveDeployList,
|
|
356
|
+
};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Transport Layer Security (TLS) / SSL utilities and HTTPS server creation and management.
|
|
3
|
-
* @module src/server/tls.js
|
|
3
|
+
* @module src/server/network/tls.js
|
|
4
4
|
* @namespace UnderpostTLS
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import fs from 'fs-extra';
|
|
8
8
|
import https from 'https';
|
|
9
9
|
import path from 'path';
|
|
10
|
-
import { loggerFactory } from '
|
|
10
|
+
import { loggerFactory } from '../ops/logger.js';
|
|
11
11
|
|
|
12
12
|
const logger = loggerFactory(import.meta);
|
|
13
13
|
|