@underpostnet/cyberia 3.3.0 → 3.3.76
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 +17 -5
- package/.github/workflows/coverall.cyberia.ci.yml +39 -14
- package/.github/workflows/cyberia-client.cd.yml +5 -0
- package/.github/workflows/cyberia-server.cd.yml +5 -0
- 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 +3 -0
- package/.github/workflows/engine-cyberia.ci.yml +4 -5
- package/.github/workflows/ghpkg.ci.yml +35 -20
- package/.github/workflows/hardhat.ci.yml +12 -11
- package/.github/workflows/npmpkg.ci.yml +17 -15
- package/.github/workflows/publish.cyberia.ci.yml +44 -0
- package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
- package/.github/workflows/release.cd.yml +1 -0
- package/.prettierignore +1 -0
- package/AGENTS.md +96 -0
- package/CHANGELOG.md +653 -2513
- package/CLI-HELP.md +323 -157
- package/Dockerfile +25 -9
- package/Dockerfile.dev +25 -9
- package/Dockerfile.test +5 -5
- package/README.md +48 -28
- package/bin/build.js +86 -41
- package/bin/build.template.js +8 -3
- package/bin/cyberia.js +1494 -1403
- package/bin/deploy.js +18 -104
- package/bin/index.js +1494 -1403
- package/compose.env +17 -5
- package/conf.js +98 -7
- package/deploy/cyberia-client/deploy.sh +46 -0
- package/deploy/cyberia-client/package.sh +17 -0
- package/deploy/cyberia-client/state.sh +15 -0
- package/deploy/cyberia-server/deploy.sh +46 -0
- package/deploy/cyberia-server/package.sh +17 -0
- package/deploy/cyberia-server/state.sh +15 -0
- package/deploy/dd-cyberia/deploy.sh +9 -29
- package/deploy/dd-cyberia/init.sh +38 -45
- package/deploy/dd-cyberia/package.sh +16 -0
- package/deploy/dd-cyberia/state.sh +14 -0
- package/deploy/dd-cyberia/sync-deploy.sh +133 -147
- package/deploy/lib/config.sh +29 -0
- package/deploy/lib/github-actions-logging.sh +610 -0
- package/deploy/lib/host.sh +194 -0
- package/deploy/lib/state.sh +65 -0
- package/deploy/pwa-microservices-template/deploy.sh +17 -42
- package/deploy/release/deploy.sh +9 -41
- package/deployment.yaml +7 -2
- package/docker-compose.yml +23 -17
- 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 +101 -40
- package/hardhat/package.json +2 -2
- package/manifests/alertmanager/deployment.yaml +81 -0
- package/manifests/blackbox-exporter/deployment.yaml +75 -0
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +32 -7
- package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +32 -7
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/manifests/deployment/mongo-express/deployment.yaml +46 -27
- package/manifests/deployment/mongo-express/kustomization.yaml +9 -0
- package/manifests/deployment/mongo-express/mongo-express-nodeport.yaml +18 -0
- package/manifests/deployment/mongo-express/service.yaml +16 -0
- package/manifests/deployment/mongo-express-no-auth/disable-mongodb-auth.yaml +16 -0
- package/manifests/deployment/mongo-express-no-auth/kustomization.yaml +16 -0
- 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 +87 -12
- package/scripts/event-monitor.sh +56 -0
- package/scripts/k3s-node-setup.sh +27 -14
- package/scripts/kubeadm-node-setup.sh +31 -11
- package/scripts/maas-setup.sh +8 -8
- package/scripts/selinux-normalize.sh +907 -0
- package/scripts/shutdown-machine.sh +843 -0
- package/scripts/test-monitor.sh +5 -5
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +15 -10
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +36 -5
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +7 -2
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +90 -186
- 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 +3 -3
- package/src/api/cyberia-action/cyberia-action.service.js +5 -6
- package/src/api/cyberia-audio/cyberia-audio.controller.js +6 -0
- package/src/api/cyberia-audio/cyberia-audio.model.js +61 -0
- package/src/api/cyberia-audio/cyberia-audio.router.js +21 -0
- package/src/api/cyberia-audio/cyberia-audio.service.js +220 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +2 -4
- package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +10 -19
- package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +13 -35
- package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +17 -34
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
- package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +1 -1
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +2 -2
- 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.model.js +2 -0
- package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
- package/src/api/cyberia-entity/cyberia-entity.service.js +3 -3
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +8 -2
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +31 -20
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +17 -2
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +468 -5
- package/src/api/cyberia-instance/cyberia-fallback-capture.js +502 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +29 -40
- package/src/api/cyberia-instance/cyberia-instance-boot.service.js +5 -5
- package/src/api/cyberia-instance/cyberia-instance-items.js +98 -0
- package/src/api/cyberia-instance/cyberia-instance-map.service.js +35 -142
- package/src/api/cyberia-instance/cyberia-instance.controller.js +2 -5
- package/src/api/cyberia-instance/cyberia-instance.model.js +0 -14
- package/src/api/cyberia-instance/cyberia-instance.router.js +5 -18
- package/src/api/cyberia-instance/cyberia-instance.service.js +5 -45
- package/src/api/cyberia-instance/cyberia-world-generator.js +8 -13
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +49 -75
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +76 -3
- 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 +8 -4
- package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.controller.js +31 -0
- package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.model.js +56 -0
- package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.router.js +33 -0
- package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +189 -0
- package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
- package/src/api/cyberia-quest/cyberia-quest.router.js +4 -4
- package/src/api/cyberia-quest/cyberia-quest.service.js +5 -5
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.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 +403 -214
- package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
- package/src/api/cyberia-skill/cyberia-skill.model.js +6 -6
- 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.ref.js +153 -0
- package/src/api/file/file.ref.json +11 -2
- 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 +47 -12
- package/src/api/object-layer/object-layer.router.js +12 -5
- package/src/api/object-layer/object-layer.service.js +116 -123
- 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 +402 -0
- package/src/cli/baremetal.js +30 -35
- package/src/cli/client.js +306 -0
- package/src/cli/cloud-init.js +3 -3
- package/src/cli/cluster.js +191 -82
- package/src/cli/db.js +120 -68
- package/src/cli/deploy.js +157 -75
- 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-selection.js +115 -0
- package/src/cli/fs.js +159 -343
- package/src/cli/host.js +672 -0
- package/src/cli/image.js +4 -6
- package/src/cli/index.js +343 -151
- 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 +16 -12
- package/src/cli/repository.js +586 -363
- package/src/cli/run.js +398 -843
- package/src/cli/secrets.js +2158 -964
- package/src/cli/ssh.js +478 -279
- package/src/cli/state.js +394 -0
- package/src/cli/static.js +2 -2
- package/src/cli/system.js +1 -1
- package/src/cli/test.js +203 -125
- package/src/cli/vultr.js +61 -21
- package/src/cli/wireguard.js +1112 -306
- package/src/client/components/core/CalendarCore.js +53 -96
- package/src/client/components/core/Docs.js +327 -303
- package/src/client/components/core/FileExplorer.js +0 -21
- package/src/client/components/core/Modal.js +56 -1
- 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/ActionEngineCyberia.js +12 -36
- package/src/client/components/cyberia/EntityEngineCyberia.js +492 -121
- package/src/client/components/cyberia/InstanceEngineCyberia.js +129 -160
- package/src/client/components/cyberia/InstanceSelectionView.js +7 -1
- package/src/client/components/cyberia/MapEngineCyberia.js +175 -69
- package/src/client/components/cyberia/ObjectLayerEngine.js +1011 -97
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +81 -155
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +113 -98
- package/src/client/components/cyberia/SharedDefaultsCyberia.js +215 -56
- package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +2 -35
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +1 -1
- package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +712 -76
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +0 -4
- 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 +15 -15
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +313 -30
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +51 -29
- package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +52 -53
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +16 -11
- package/src/client/public/cyberia-docs/CYBERIA.md +48 -28
- package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +11 -5
- 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/STATS-PROGRESSION.md +217 -0
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +20 -12
- 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-audio/cyberia-audio.service.js +99 -0
- package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +38 -0
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +5 -4
- package/src/client/services/cyberia-instance/cyberia-instance.service.js +0 -40
- package/src/client/services/cyberia-map/cyberia-map.management.js +5 -4
- package/src/client/services/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +138 -0
- package/src/client/services/object-layer/object-layer.management.js +6 -10
- package/src/client/services/object-layer/object-layer.service.js +3 -1
- 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 +92 -77
- package/src/client-builder/client-build-live.js +2 -2
- package/src/client-builder/client-build.js +105 -74
- package/src/client-builder/client-bundle.js +347 -0
- 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/MongoExpress.js +187 -0
- package/src/db/mongo/MongooseDB.js +7 -8
- package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
- package/src/grpc/cyberia/grpc-server.js +6 -8
- package/src/index.js +79 -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 +144 -147
- package/src/projects/cyberia/atlas-sprite-sheet-store.js +391 -0
- package/src/projects/cyberia/besu-genesis-generator.js +8 -17
- package/src/projects/cyberia/boot-contract-fixtures.js +32 -0
- package/src/projects/cyberia/catalog-cyberia.js +54 -10
- package/src/projects/cyberia/gemini-client.js +4 -4
- package/src/projects/cyberia/generate-saga.js +5 -12
- package/src/projects/cyberia/hot-reload-trigger.js +18 -29
- package/src/projects/cyberia/instance-backup.js +210 -0
- package/src/projects/cyberia/instance-data.js +178 -258
- package/src/projects/cyberia/ipfs-client.js +4 -4
- package/src/projects/cyberia/map-preview-generator.js +33 -69
- package/src/projects/cyberia/object-layer.js +153 -320
- package/src/projects/cyberia/seed-audio.js +139 -0
- package/src/projects/cyberia/semantic-layer-generator-skin.js +2 -8
- package/src/projects/cyberia/semantic-layer-generator.js +3 -19
- package/src/projects/cyberia/stat-balance.js +81 -0
- package/src/projects/cyberia/stat-commands.js +23 -0
- package/src/projects/cyberia/stat-contract-generator.js +101 -0
- package/src/projects/underpost/catalog-underpost.js +9 -1
- package/src/proxy.js +4 -7
- package/src/runtime/cyberia-client/Dockerfile +17 -8
- package/src/runtime/cyberia-client/Dockerfile.dev +13 -4
- package/src/runtime/cyberia-server/Dockerfile +18 -6
- package/src/runtime/cyberia-server/Dockerfile.dev +16 -3
- package/src/runtime/engine-cyberia/Dockerfile +25 -9
- package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
- package/src/runtime/engine-cyberia/Dockerfile.test +5 -5
- package/src/runtime/engine-cyberia/compose.env +17 -5
- package/src/runtime/engine-cyberia/docker-compose.yml +23 -17
- 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 +188 -0
- package/src/server/build/execution.js +402 -0
- package/src/server/build/package.js +508 -0
- package/src/server/build/testing.js +578 -0
- package/src/server/{dns.js → network/dns.js} +144 -11
- package/src/server/{forward-proxy.js → network/forward-proxy.js} +10 -18
- package/src/server/{middlewares.js → network/middlewares.js} +11 -5
- 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/{underpost-compression.js → network/underpost-compression.js} +1 -1
- package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +7 -7
- package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +2 -2
- package/src/server/{cri.js → ops/cri.js} +2 -2
- package/src/server/{cron.js → ops/cron.js} +349 -74
- package/src/server/ops/event-notification.js +284 -0
- package/src/server/{logger.js → ops/logger.js} +143 -23
- package/src/server/ops/monitoring.js +1724 -0
- package/src/server/{systemd.js → ops/systemd.js} +55 -1
- package/src/server/{conf.js → runtime/conf.js} +516 -423
- 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 -12
- 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/{selinux.js → security/selinux.js} +1 -1
- package/src/server/{backup.js → storage/backup.js} +17 -8
- package/src/server/{data-query.js → storage/data-query.js} +17 -1
- package/src/server/storage/downloader.js +121 -0
- package/src/server/storage/repository.js +68 -0
- package/src/server/storage/zip.js +153 -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/atlas-sprite-sheet-store.test.js +402 -0
- package/test/integration/app/cyberia/atlas-sprite-sheet.test.js +86 -0
- package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +64 -0
- package/test/integration/app/cyberia/cyberia-entity-type-default.test.js +842 -0
- package/test/integration/app/cyberia/cyberia-instance-conf-coerce.test.js +53 -0
- package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +17 -23
- package/test/integration/app/cyberia/cyberia-instance-items.test.js +90 -0
- package/test/integration/app/cyberia/cyberia-load.test.js +466 -0
- package/test/integration/app/cyberia/cyberia-map-audio-conf.test.js +256 -0
- package/test/integration/app/cyberia/cyberia-stats.test.js +150 -0
- package/test/integration/app/cyberia/fallback-world-capture.test.js +338 -0
- package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
- package/test/integration/app/cyberia/object-layer-item-selection.test.js +56 -0
- package/test/integration/app/cyberia/object-layer-natural-key.test.js +32 -0
- package/test/integration/app/cyberia/seed-audio.test.js +275 -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/{selinux.test.js → integration/infra/1-security/selinux.test.js} +2 -4
- 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 +1187 -0
- package/test/{wireguard-edge.test.js → integration/infra/2-network/wireguard-edge.test.js} +649 -55
- 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/3-cluster/mongo-express-deploy.test.js +156 -0
- package/test/integration/infra/4-ingress/api-cross-origin.test.js +79 -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} +6 -6
- package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +4 -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 +361 -0
- package/test/unit/client-bundle.test.js +313 -0
- package/test/unit/conf-loading.test.js +303 -0
- package/test/unit/conf-resolution.test.js +996 -0
- package/test/unit/coverage-artifact.test.js +221 -0
- package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
- package/test/unit/cyberia/instance-backup.test.js +183 -0
- package/test/unit/cyberia/instance-object-layer-items.test.js +46 -0
- package/test/unit/cyberia/publish-workflow.test.js +22 -0
- package/test/unit/cyberia/stat-balance.test.js +69 -0
- package/test/unit/deploy-env-resolution.test.js +38 -0
- package/test/unit/deploy-log-table.test.js +518 -0
- package/test/unit/downloader-integrity.test.js +98 -0
- package/test/unit/execution-profiles.test.js +219 -0
- package/test/unit/file-reference-registry.test.js +141 -0
- package/test/unit/fleet-sync-source.test.js +149 -0
- package/test/unit/fs-storage-paths.test.js +596 -0
- package/test/unit/logger-redaction.test.js +141 -0
- package/test/unit/package.test.js +457 -0
- package/test/unit/prepare-host.test.js +382 -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 +220 -0
- package/test/unit/zip-archive.test.js +142 -0
- package/vitest.config.js +66 -0
- package/.nycrc +0 -9
- package/deploy/lib/logging.sh +0 -96
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
- package/manifests/mongodb/pv-pvc.yaml +0 -59
- package/scripts/coverall-test-cyberia.sh +0 -24
- package/scripts/coverall-test.sh +0 -24
- package/scripts/link-local-underpost-cli.sh +0 -6
- package/src/api/cyberia-instance/cyberia-fallback-default-items.js +0 -63
- 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/components/cyberia/FallbackWorldEngineCyberia.js +0 -368
- 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/downloader.js +0 -73
- package/src/server/environment.js +0 -98
package/src/cli/db.js
CHANGED
|
@@ -11,14 +11,15 @@ import {
|
|
|
11
11
|
loadConfServerJson,
|
|
12
12
|
loadReplicas,
|
|
13
13
|
mergeFile,
|
|
14
|
-
pathPortAssignmentFactory,
|
|
15
14
|
splitFileFactory,
|
|
16
|
-
} from '../server/conf.js';
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
15
|
+
} from '../server/runtime/conf.js';
|
|
16
|
+
import { pathPortAssignmentFactory } from '../server/network/router.js';
|
|
17
|
+
import { loggerFactory } from '../server/ops/logger.js';
|
|
18
|
+
import { shellExec } from '../server/runtime/process.js';
|
|
19
|
+
import { cli } from '../server/build/execution.js';
|
|
19
20
|
import fs from 'fs-extra';
|
|
20
21
|
import { DataBaseProviderService } from '../db/DataBaseProvider.js';
|
|
21
|
-
import { loadCronDeployEnv } from '../server/cron.js';
|
|
22
|
+
import { loadCronDeployEnv } from '../server/ops/cron.js';
|
|
22
23
|
import { MongoBootstrap } from '../db/mongo/MongoBootstrap.js';
|
|
23
24
|
import Underpost from '../index.js';
|
|
24
25
|
import { timer } from '../client/components/core/CommonJs.js';
|
|
@@ -127,6 +128,11 @@ class UnderpostDB {
|
|
|
127
128
|
|
|
128
129
|
logger.info('Importing MariaDB database', { podName, dbName });
|
|
129
130
|
|
|
131
|
+
if (!Underpost.kubectl.ensureExecReady({ podName, namespace })) {
|
|
132
|
+
logger.error('Pod is not accepting exec streams, skipping import', { podName, dbName });
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
|
|
130
136
|
// Always ensure the database exists first — required for WP even when no backup is available
|
|
131
137
|
Underpost.kubectl.run(
|
|
132
138
|
`kubectl exec -n ${namespace} -i ${podName} -- mariadb -p${password} -e 'CREATE DATABASE IF NOT EXISTS ${dbName};'`,
|
|
@@ -158,9 +164,10 @@ class UnderpostDB {
|
|
|
158
164
|
return false;
|
|
159
165
|
}
|
|
160
166
|
|
|
161
|
-
// Import SQL file
|
|
167
|
+
// Import SQL file. No retry: a replayed import would re-apply whatever the
|
|
168
|
+
// first attempt already wrote.
|
|
162
169
|
const importCmd = `mariadb -u ${user} -p${password} ${dbName} < ${containerSqlPath}`;
|
|
163
|
-
Underpost.kubectl.exec({ podName, namespace, command: importCmd });
|
|
170
|
+
Underpost.kubectl.exec({ podName, namespace, command: importCmd, retries: 0 });
|
|
164
171
|
|
|
165
172
|
logger.info('Successfully imported MariaDB database', { podName, dbName });
|
|
166
173
|
return true;
|
|
@@ -190,6 +197,11 @@ class UnderpostDB {
|
|
|
190
197
|
|
|
191
198
|
logger.info('Exporting MariaDB database', { podName, dbName });
|
|
192
199
|
|
|
200
|
+
if (!Underpost.kubectl.ensureExecReady({ podName, namespace })) {
|
|
201
|
+
logger.error('Pod is not accepting exec streams, skipping export', { podName, dbName });
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
|
|
193
205
|
// Remove existing SQL file in container
|
|
194
206
|
Underpost.kubectl.exec({
|
|
195
207
|
podName,
|
|
@@ -237,12 +249,22 @@ class UnderpostDB {
|
|
|
237
249
|
* @param {string} params.bsonPath - BSON directory path.
|
|
238
250
|
* @param {boolean} params.drop - Whether to drop existing database.
|
|
239
251
|
* @param {boolean} params.preserveUUID - Whether to preserve UUIDs.
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
252
|
+
* @param {string} [params.user=''] - MongoDB username for authenticated restore.
|
|
253
|
+
* @param {string} [params.password=''] - MongoDB password for authenticated restore.
|
|
254
|
+
* @param {string} [params.authDatabase='admin'] - Auth database for restore command.
|
|
243
255
|
* @return {boolean} Success status.
|
|
244
256
|
*/
|
|
245
|
-
_importMongoDB({
|
|
257
|
+
_importMongoDB({
|
|
258
|
+
pod,
|
|
259
|
+
namespace,
|
|
260
|
+
dbName,
|
|
261
|
+
bsonPath,
|
|
262
|
+
drop,
|
|
263
|
+
preserveUUID,
|
|
264
|
+
user = '',
|
|
265
|
+
password = '',
|
|
266
|
+
authDatabase = 'admin',
|
|
267
|
+
}) {
|
|
246
268
|
try {
|
|
247
269
|
const podName = pod.NAME;
|
|
248
270
|
const containerBsonPath = `/${dbName}`;
|
|
@@ -259,6 +281,11 @@ class UnderpostDB {
|
|
|
259
281
|
return true;
|
|
260
282
|
}
|
|
261
283
|
|
|
284
|
+
if (!Underpost.kubectl.ensureExecReady({ podName, namespace })) {
|
|
285
|
+
logger.error('Pod is not accepting exec streams, skipping import', { podName, dbName });
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
|
|
262
289
|
// Remove existing BSON directory in container
|
|
263
290
|
Underpost.kubectl.exec({
|
|
264
291
|
podName,
|
|
@@ -279,11 +306,14 @@ class UnderpostDB {
|
|
|
279
306
|
}
|
|
280
307
|
|
|
281
308
|
// Restore database
|
|
282
|
-
const authFlags =
|
|
283
|
-
|
|
284
|
-
|
|
309
|
+
const authFlags =
|
|
310
|
+
user && password
|
|
311
|
+
? ` --username ${JSON.stringify(user)} --password ${JSON.stringify(password)} --authenticationDatabase ${JSON.stringify(authDatabase)}`
|
|
312
|
+
: '';
|
|
285
313
|
const restoreCmd = `mongorestore -d ${dbName} ${containerBsonPath} --numParallelCollections=1 --numInsertionWorkersPerCollection=1 --batchSize=100 --stopOnError${drop ? ' --drop' : ''}${preserveUUID ? ' --preserveUUID' : ''}${authFlags}`;
|
|
286
|
-
|
|
314
|
+
// Only a `--drop` restore is idempotent; without it a replay would re-apply
|
|
315
|
+
// whatever the interrupted attempt already inserted, so it runs exactly once.
|
|
316
|
+
Underpost.kubectl.exec({ podName, namespace, command: restoreCmd, retries: drop ? undefined : 0 });
|
|
287
317
|
|
|
288
318
|
logger.info('Successfully imported MongoDB database', { podName, dbName });
|
|
289
319
|
return true;
|
|
@@ -303,18 +333,32 @@ class UnderpostDB {
|
|
|
303
333
|
* @param {string} params.dbName - Database name.
|
|
304
334
|
* @param {string} params.outputPath - Output directory path.
|
|
305
335
|
* @param {string} [params.collections=''] - Comma-separated collection list.
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
336
|
+
* @param {string} [params.user=''] - MongoDB username for authenticated dump.
|
|
337
|
+
* @param {string} [params.password=''] - MongoDB password for authenticated dump.
|
|
338
|
+
* @param {string} [params.authDatabase='admin'] - Auth database for dump command.
|
|
309
339
|
* @return {boolean} Success status.
|
|
310
340
|
*/
|
|
311
|
-
_exportMongoDB({
|
|
341
|
+
_exportMongoDB({
|
|
342
|
+
pod,
|
|
343
|
+
namespace,
|
|
344
|
+
dbName,
|
|
345
|
+
outputPath,
|
|
346
|
+
collections = '',
|
|
347
|
+
user = '',
|
|
348
|
+
password = '',
|
|
349
|
+
authDatabase = 'admin',
|
|
350
|
+
}) {
|
|
312
351
|
try {
|
|
313
352
|
const podName = pod.NAME;
|
|
314
353
|
const containerBsonPath = `/${dbName}`;
|
|
315
354
|
|
|
316
355
|
logger.info('Exporting MongoDB database', { podName, dbName, collections });
|
|
317
356
|
|
|
357
|
+
if (!Underpost.kubectl.ensureExecReady({ podName, namespace })) {
|
|
358
|
+
logger.error('Pod is not accepting exec streams, skipping export', { podName, dbName });
|
|
359
|
+
return false;
|
|
360
|
+
}
|
|
361
|
+
|
|
318
362
|
// Remove existing BSON directory in container
|
|
319
363
|
Underpost.kubectl.exec({
|
|
320
364
|
podName,
|
|
@@ -323,19 +367,26 @@ class UnderpostDB {
|
|
|
323
367
|
});
|
|
324
368
|
|
|
325
369
|
// Dump database or specific collections
|
|
326
|
-
const authFlags =
|
|
327
|
-
|
|
328
|
-
|
|
370
|
+
const authFlags =
|
|
371
|
+
user && password
|
|
372
|
+
? ` --username ${JSON.stringify(user)} --password ${JSON.stringify(password)} --authenticationDatabase ${JSON.stringify(authDatabase)}`
|
|
373
|
+
: '';
|
|
374
|
+
|
|
375
|
+
// Serial dump: mongodump defaults to 4 collections at once, and its buffers share the
|
|
376
|
+
// mongod container's memory limit. Parallel dumping is what pushes the container over
|
|
377
|
+
// that limit and gets it OOM-killed mid-backup.
|
|
378
|
+
const dumpFlags = ` -o / --numParallelCollections=1${authFlags}`;
|
|
329
379
|
|
|
330
380
|
if (collections) {
|
|
331
|
-
const
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
381
|
+
for (const collection of collections.split(',').map((c) => c.trim())) {
|
|
382
|
+
Underpost.kubectl.exec({
|
|
383
|
+
podName,
|
|
384
|
+
namespace,
|
|
385
|
+
command: `mongodump -d ${dbName} --collection ${collection}${dumpFlags}`,
|
|
386
|
+
});
|
|
335
387
|
}
|
|
336
388
|
} else {
|
|
337
|
-
|
|
338
|
-
Underpost.kubectl.exec({ podName, namespace, command: dumpCmd });
|
|
389
|
+
Underpost.kubectl.exec({ podName, namespace, command: `mongodump -d ${dbName}${dumpFlags}` });
|
|
339
390
|
}
|
|
340
391
|
|
|
341
392
|
// Copy BSON directory from pod
|
|
@@ -366,9 +417,9 @@ class UnderpostDB {
|
|
|
366
417
|
* @param {string} params.podName - Pod name.
|
|
367
418
|
* @param {string} params.namespace - Namespace.
|
|
368
419
|
* @param {string} params.dbName - Database name.
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
420
|
+
* @param {string} [params.user=''] - MongoDB username for authenticated stats query.
|
|
421
|
+
* @param {string} [params.password=''] - MongoDB password for authenticated stats query.
|
|
422
|
+
* @param {string} [params.authDatabase='admin'] - Auth database for stats query.
|
|
372
423
|
* @return {Object|null} Collection statistics or null on error.
|
|
373
424
|
*/
|
|
374
425
|
_getMongoStats({ podName, namespace, dbName, user = '', password = '', authDatabase = 'admin' }) {
|
|
@@ -379,9 +430,10 @@ class UnderpostDB {
|
|
|
379
430
|
const script = `db.getSiblingDB('${dbName}').getCollectionNames().map(function(c) { return { collection: c, count: db.getSiblingDB('${dbName}')[c].countDocuments() }; })`;
|
|
380
431
|
|
|
381
432
|
// Execute the script
|
|
382
|
-
const authFlags =
|
|
383
|
-
|
|
384
|
-
|
|
433
|
+
const authFlags =
|
|
434
|
+
user && password
|
|
435
|
+
? ` --authenticationDatabase ${JSON.stringify(authDatabase)} -u ${JSON.stringify(user)} -p ${JSON.stringify(password)}`
|
|
436
|
+
: '';
|
|
385
437
|
const command = `sudo kubectl exec -n ${namespace} -i ${podName} -- mongosh --quiet${authFlags} --eval "${script}"`;
|
|
386
438
|
const output = shellExec(command, { stdout: true, silent: true, silentOnError: true });
|
|
387
439
|
|
|
@@ -500,8 +552,6 @@ class UnderpostDB {
|
|
|
500
552
|
console.log('='.repeat(70) + '\n');
|
|
501
553
|
},
|
|
502
554
|
|
|
503
|
-
|
|
504
|
-
|
|
505
555
|
/**
|
|
506
556
|
* Main callback: Initiates database backup workflow.
|
|
507
557
|
* Orchestrates the backup process for multiple deployments, handling
|
|
@@ -524,7 +574,6 @@ class UnderpostDB {
|
|
|
524
574
|
* @param {string} [options.paths=''] - Comma-separated list of paths to filter databases.
|
|
525
575
|
* @param {boolean} [options.allPods=false] - Whether to target all pods in deployment.
|
|
526
576
|
* @param {boolean} [options.primaryPod=false] - Whether to target MongoDB primary pod only.
|
|
527
|
-
* @param {string} [options.primaryPodEnsure=''] - Pod name to ensure MongoDB primary pod is running.
|
|
528
577
|
* @param {boolean} [options.stats=false] - Whether to display database statistics.
|
|
529
578
|
* @param {number} [options.macroRollbackExport=1] - Number of commits to rollback in macro export.
|
|
530
579
|
* @param {boolean} [options.forceClone=false] - Whether to force re-clone Git repository.
|
|
@@ -553,7 +602,6 @@ class UnderpostDB {
|
|
|
553
602
|
paths: '',
|
|
554
603
|
allPods: false,
|
|
555
604
|
primaryPod: false,
|
|
556
|
-
primaryPodEnsure: '',
|
|
557
605
|
stats: false,
|
|
558
606
|
macroRollbackExport: 1,
|
|
559
607
|
forceClone: false,
|
|
@@ -567,14 +615,14 @@ class UnderpostDB {
|
|
|
567
615
|
},
|
|
568
616
|
) {
|
|
569
617
|
// Ensure engine-private is available (clone if inside a deployment
|
|
570
|
-
// container where
|
|
618
|
+
// container where globalClean has already removed it).
|
|
571
619
|
const firstDeployId = deployList !== 'dd' ? deployList.split(',')[0].trim() : '';
|
|
572
620
|
try {
|
|
573
621
|
loadCronDeployEnv();
|
|
574
622
|
const newBackupTimestamp = new Date().getTime();
|
|
575
623
|
const namespace = options.ns && typeof options.ns === 'string' ? options.ns : 'default';
|
|
576
624
|
|
|
577
|
-
if (deployList === 'dd') deployList =
|
|
625
|
+
if (deployList === 'dd') deployList = readDeployRoutes().join(',');
|
|
578
626
|
|
|
579
627
|
// Handle repository backup (git commit+push inside deployment pod)
|
|
580
628
|
if (options.repoBackup) {
|
|
@@ -610,27 +658,13 @@ class UnderpostDB {
|
|
|
610
658
|
export: options.export,
|
|
611
659
|
});
|
|
612
660
|
|
|
613
|
-
if (options.primaryPodEnsure) {
|
|
614
|
-
const primaryPodName = MongoBootstrap.getPrimaryPodName({
|
|
615
|
-
namespace,
|
|
616
|
-
podName: options.primaryPodEnsure,
|
|
617
|
-
username: process.env.MONGODB_USERNAME || process.env.DB_USER || '',
|
|
618
|
-
password: process.env.MONGODB_PASSWORD || process.env.DB_PASSWORD || '',
|
|
619
|
-
authDatabase: process.env.MONGODB_AUTH_DB || 'admin',
|
|
620
|
-
});
|
|
621
|
-
if (!primaryPodName) {
|
|
622
|
-
const baseCommand = options.dev ? 'node bin' : 'underpost';
|
|
623
|
-
const baseClusterCommand = options.dev ? ' --dev' : '';
|
|
624
|
-
let clusterFlag = options.k3s ? ' --k3s' : options.kubeadm ? ' --kubeadm' : '';
|
|
625
|
-
shellExec(`${baseCommand} cluster${baseClusterCommand}${clusterFlag} --mongodb`);
|
|
626
|
-
}
|
|
627
|
-
return;
|
|
628
|
-
}
|
|
629
|
-
|
|
630
661
|
// Track processed repositories to avoid duplicate Git operations
|
|
631
662
|
const processedRepos = new Set();
|
|
632
663
|
// Track processed host+path combinations to avoid duplicates
|
|
633
664
|
const processedHostPaths = new Set();
|
|
665
|
+
// Every database that could not be exported/imported, reported at the end so a
|
|
666
|
+
// partial run is never logged as a success.
|
|
667
|
+
const failedOperations = [];
|
|
634
668
|
|
|
635
669
|
for (const _deployId of deployList.split(',')) {
|
|
636
670
|
const deployId = _deployId.trim();
|
|
@@ -803,10 +837,12 @@ class UnderpostDB {
|
|
|
803
837
|
logger.warn('No MongoDB pods available to check for primary');
|
|
804
838
|
podsToProcess = [];
|
|
805
839
|
} else {
|
|
806
|
-
|
|
840
|
+
// Resolved per database, never cached across them: a member that restarts
|
|
841
|
+
// mid-run triggers a re-election, and a stale primary makes every later
|
|
842
|
+
// dump fail with NotPrimaryOrSecondary.
|
|
807
843
|
const primaryPodName = MongoBootstrap.getPrimaryPodName({
|
|
808
844
|
namespace,
|
|
809
|
-
podName:
|
|
845
|
+
podName: targetPods[0].NAME,
|
|
810
846
|
username: user,
|
|
811
847
|
password,
|
|
812
848
|
authDatabase: 'admin',
|
|
@@ -858,7 +894,7 @@ class UnderpostDB {
|
|
|
858
894
|
}
|
|
859
895
|
|
|
860
896
|
if (options.import === true) {
|
|
861
|
-
Underpost.db._importMariaDB({
|
|
897
|
+
const success = Underpost.db._importMariaDB({
|
|
862
898
|
pod,
|
|
863
899
|
namespace,
|
|
864
900
|
dbName,
|
|
@@ -866,6 +902,7 @@ class UnderpostDB {
|
|
|
866
902
|
password,
|
|
867
903
|
sqlPath: toSqlPath,
|
|
868
904
|
});
|
|
905
|
+
if (!success) failedOperations.push({ deployId, provider, dbName, pod: pod.NAME, op: 'import' });
|
|
869
906
|
}
|
|
870
907
|
|
|
871
908
|
if (options.export === true) {
|
|
@@ -879,6 +916,7 @@ class UnderpostDB {
|
|
|
879
916
|
outputPath,
|
|
880
917
|
});
|
|
881
918
|
exportSucceeded = exportSucceeded || success;
|
|
919
|
+
if (!success) failedOperations.push({ deployId, provider, dbName, pod: pod.NAME, op: 'export' });
|
|
882
920
|
}
|
|
883
921
|
break;
|
|
884
922
|
}
|
|
@@ -900,7 +938,7 @@ class UnderpostDB {
|
|
|
900
938
|
|
|
901
939
|
if (options.import === true) {
|
|
902
940
|
const bsonPath = options.outPath || toBsonPath;
|
|
903
|
-
Underpost.db._importMongoDB({
|
|
941
|
+
const success = Underpost.db._importMongoDB({
|
|
904
942
|
pod,
|
|
905
943
|
namespace,
|
|
906
944
|
dbName,
|
|
@@ -911,6 +949,7 @@ class UnderpostDB {
|
|
|
911
949
|
password,
|
|
912
950
|
authDatabase: 'admin',
|
|
913
951
|
});
|
|
952
|
+
if (!success) failedOperations.push({ deployId, provider, dbName, pod: pod.NAME, op: 'import' });
|
|
914
953
|
}
|
|
915
954
|
|
|
916
955
|
if (options.export === true) {
|
|
@@ -926,6 +965,7 @@ class UnderpostDB {
|
|
|
926
965
|
authDatabase: 'admin',
|
|
927
966
|
});
|
|
928
967
|
exportSucceeded = exportSucceeded || success;
|
|
968
|
+
if (!success) failedOperations.push({ deployId, provider, dbName, pod: pod.NAME, op: 'export' });
|
|
929
969
|
}
|
|
930
970
|
break;
|
|
931
971
|
}
|
|
@@ -956,6 +996,20 @@ class UnderpostDB {
|
|
|
956
996
|
}
|
|
957
997
|
}
|
|
958
998
|
|
|
999
|
+
// Whatever succeeded is already committed above — a partial backup still has
|
|
1000
|
+
// value — but the run must not report success, or a silently empty backup set
|
|
1001
|
+
// looks identical to a healthy one.
|
|
1002
|
+
if (failedOperations.length > 0) {
|
|
1003
|
+
logger.error('Database operation completed with failures', {
|
|
1004
|
+
failed: failedOperations.length,
|
|
1005
|
+
operations: failedOperations,
|
|
1006
|
+
});
|
|
1007
|
+
throw new Error(
|
|
1008
|
+
`Database operation failed for ${failedOperations.length} database(s): ` +
|
|
1009
|
+
failedOperations.map(({ deployId, dbName, op }) => `${deployId}/${dbName} (${op})`).join(', '),
|
|
1010
|
+
);
|
|
1011
|
+
}
|
|
1012
|
+
|
|
959
1013
|
logger.info('Database operation completed successfully');
|
|
960
1014
|
} catch (error) {
|
|
961
1015
|
logger.error('Database operation failed', { error: error.message });
|
|
@@ -1029,15 +1083,13 @@ class UnderpostDB {
|
|
|
1029
1083
|
logger.info('Creating cluster metadata', { deployId, host, path });
|
|
1030
1084
|
|
|
1031
1085
|
const env = 'production';
|
|
1032
|
-
const
|
|
1086
|
+
const deployList = readDeployRoutes();
|
|
1033
1087
|
|
|
1034
|
-
if (
|
|
1035
|
-
logger.error('Deploy
|
|
1036
|
-
throw new Error(`Deploy
|
|
1088
|
+
if (deployList.length === 0) {
|
|
1089
|
+
logger.error('Deploy route table not found', { path: DEPLOY_ROUTES_PATH });
|
|
1090
|
+
throw new Error(`Deploy route table not found: ${DEPLOY_ROUTES_PATH}`);
|
|
1037
1091
|
}
|
|
1038
1092
|
|
|
1039
|
-
const deployList = fs.readFileSync(deployListPath, 'utf8').split(',');
|
|
1040
|
-
|
|
1041
1093
|
const confServerPath = `./engine-private/conf/${deployId}/conf.server.json`;
|
|
1042
1094
|
if (!fs.existsSync(confServerPath)) {
|
|
1043
1095
|
logger.error('Server configuration not found', { path: confServerPath });
|
|
@@ -1223,7 +1275,7 @@ class UnderpostDB {
|
|
|
1223
1275
|
const firstDeployId = deployList !== 'dd' ? deployList.split(',')[0].trim() : '';
|
|
1224
1276
|
try {
|
|
1225
1277
|
loadCronDeployEnv();
|
|
1226
|
-
if (deployList === 'dd') deployList =
|
|
1278
|
+
if (deployList === 'dd') deployList = readDeployRoutes().join(',');
|
|
1227
1279
|
|
|
1228
1280
|
logger.info('Starting File collection cleanup', { deployList, options });
|
|
1229
1281
|
|