@underpostnet/cyberia 3.3.0 → 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/.github/workflows/coverall.cyberia.ci.yml +34 -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/pwa-microservices-template-test.ci.yml +2 -2
- package/.github/workflows/release.cd.yml +1 -0
- package/.prettierignore +1 -0
- package/AGENTS.md +47 -0
- package/CHANGELOG.md +565 -2510
- package/CLI-HELP.md +306 -147
- package/Dockerfile +25 -9
- package/Dockerfile.dev +25 -9
- package/Dockerfile.test +4 -4
- package/README.md +21 -1
- package/bin/build.js +66 -41
- package/bin/build.template.js +8 -3
- package/bin/cyberia.js +308 -91
- package/bin/deploy.js +18 -104
- package/bin/index.js +308 -91
- package/conf.js +91 -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 +6 -26
- package/deploy/dd-cyberia/init.sh +35 -43
- package/deploy/dd-cyberia/package.sh +17 -0
- package/deploy/dd-cyberia/state.sh +14 -0
- package/deploy/dd-cyberia/sync-deploy.sh +92 -170
- 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 +12 -39
- package/deploy/release/deploy.sh +9 -39
- package/deployment.yaml +7 -2
- package/docker-compose.yml +7 -7
- 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/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/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 +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-world.js +8 -0
- package/src/api/cyberia-instance/cyberia-instance-map.service.js +1 -1
- package/src/api/cyberia-instance/cyberia-instance.controller.js +1 -1
- package/src/api/cyberia-instance/cyberia-instance.router.js +2 -2
- package/src/api/cyberia-instance/cyberia-instance.service.js +2 -2
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
- 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 +0 -26
- 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.router.js +2 -2
- package/src/api/object-layer/object-layer.service.js +3 -3
- 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 -35
- package/src/cli/client.js +306 -0
- package/src/cli/cloud-init.js +3 -3
- package/src/cli/cluster.js +184 -82
- package/src/cli/db.js +120 -68
- package/src/cli/deploy.js +153 -71
- 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 -6
- package/src/cli/index.js +322 -142
- 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 +558 -363
- package/src/cli/run.js +331 -650
- 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 +199 -125
- package/src/cli/vultr.js +61 -21
- package/src/cli/wireguard.js +1111 -306
- 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-portal/AppShellCyberiaPortal.js +2 -1
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
- 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/CYBERIA-CLI.md +32 -5
- 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/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 +38 -30
- 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 +7 -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 +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 +1 -1
- package/src/projects/cyberia/besu-genesis-generator.js +3 -3
- package/src/projects/cyberia/catalog-cyberia.js +53 -10
- package/src/projects/cyberia/gemini-client.js +1 -1
- package/src/projects/cyberia/generate-saga.js +1 -1
- package/src/projects/cyberia/hot-reload-trigger.js +1 -1
- package/src/projects/cyberia/instance-data.js +1 -1
- 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 +1 -1
- package/src/projects/cyberia/semantic-layer-generator.js +1 -1
- package/src/projects/underpost/catalog-underpost.js +9 -1
- 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/docker-compose.yml +7 -7
- 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} +144 -11
- package/src/server/{forward-proxy.js → network/forward-proxy.js} +10 -18
- package/src/server/{middlewares.js → network/middlewares.js} +3 -3
- 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} +108 -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} +513 -422
- 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} +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} +1 -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/{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 +1163 -0
- package/test/{wireguard-edge.test.js → integration/infra/2-network/wireguard-edge.test.js} +609 -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/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 +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/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/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/environment.js +0 -98
|
@@ -14,7 +14,6 @@ RUN make -f Web.mk clean all BUILD_MODE=${BUILD_MODE} OUTPUT_DIR=bin/
|
|
|
14
14
|
|
|
15
15
|
# --- Runtime Image ---
|
|
16
16
|
FROM rockylinux/rockylinux:9 AS runtime
|
|
17
|
-
ARG UNDERPOST_VERSION=3.3.0
|
|
18
17
|
ARG NODE_VERSION=24.15.0
|
|
19
18
|
|
|
20
19
|
RUN set -eux; \
|
|
@@ -28,9 +27,15 @@ RUN set -eux; \
|
|
|
28
27
|
curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
|
|
29
28
|
| tar -xJ -C /usr/local --strip-components=1; \
|
|
30
29
|
node --version; npm --version; \
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
dnf clean all; rm -rf /var/cache/dnf
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
COPY underpost-cli.tgz /tmp/underpost-cli.tgz
|
|
34
|
+
RUN set -eux; \
|
|
35
|
+
npm install -g /tmp/underpost-cli.tgz --omit=dev; \
|
|
36
|
+
rm -f /tmp/underpost-cli.tgz; \
|
|
37
|
+
npm cache clean --force; \
|
|
38
|
+
underpost --version
|
|
34
39
|
|
|
35
40
|
# Path + server layout is the contract with conf.instances.json mmo-client cmd,
|
|
36
41
|
# which execs `python3 /home/dd/engine/cyberia-client/docker-driver.py <port>
|
|
@@ -43,7 +43,6 @@ RUN make -f Web.mk all BUILD_MODE=${BUILD_MODE} OUTPUT_DIR=bin/
|
|
|
43
43
|
# --- Runtime Image ---
|
|
44
44
|
FROM rockylinux/rockylinux:9 AS runtime
|
|
45
45
|
|
|
46
|
-
ARG UNDERPOST_VERSION=3.3.0
|
|
47
46
|
ARG NODE_VERSION=24.15.0
|
|
48
47
|
RUN set -eux; \
|
|
49
48
|
dnf -y update; \
|
|
@@ -60,9 +59,16 @@ RUN set -eux; \
|
|
|
60
59
|
curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
|
|
61
60
|
| tar -xJ -C /usr/local --strip-components=1; \
|
|
62
61
|
node --version; npm --version; \
|
|
63
|
-
npm install -g underpost@${UNDERPOST_VERSION}; \
|
|
64
62
|
dnf clean all
|
|
65
63
|
|
|
64
|
+
|
|
65
|
+
COPY underpost-cli.tgz /tmp/underpost-cli.tgz
|
|
66
|
+
RUN set -eux; \
|
|
67
|
+
npm install -g /tmp/underpost-cli.tgz --omit=dev; \
|
|
68
|
+
rm -f /tmp/underpost-cli.tgz; \
|
|
69
|
+
npm cache clean --force; \
|
|
70
|
+
underpost --version
|
|
71
|
+
|
|
66
72
|
WORKDIR /home/dd/engine/cyberia-client
|
|
67
73
|
|
|
68
74
|
COPY --from=builder /cyberia-client/docker-driver.py ./docker-driver.py
|
|
@@ -11,7 +11,6 @@ RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o server ./cmd/cyberia-se
|
|
|
11
11
|
|
|
12
12
|
# --- Runtime Image ---
|
|
13
13
|
FROM rockylinux/rockylinux:9 AS runtime
|
|
14
|
-
ARG UNDERPOST_VERSION=3.3.0
|
|
15
14
|
ARG NODE_VERSION=24.15.0
|
|
16
15
|
|
|
17
16
|
RUN set -eux; \
|
|
@@ -25,9 +24,15 @@ RUN set -eux; \
|
|
|
25
24
|
curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
|
|
26
25
|
| tar -xJ -C /usr/local --strip-components=1; \
|
|
27
26
|
node --version; npm --version; \
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
dnf clean all; rm -rf /var/cache/dnf
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
COPY underpost-cli.tgz /tmp/underpost-cli.tgz
|
|
31
|
+
RUN set -eux; \
|
|
32
|
+
npm install -g /tmp/underpost-cli.tgz --omit=dev; \
|
|
33
|
+
rm -f /tmp/underpost-cli.tgz; \
|
|
34
|
+
npm cache clean --force; \
|
|
35
|
+
underpost --version
|
|
31
36
|
|
|
32
37
|
# Path is the contract with conf.instances.json mmo-server cmd, which execs
|
|
33
38
|
# /home/dd/engine/cyberia-server/server in both development and production.
|
|
@@ -25,7 +25,6 @@ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
|
|
|
25
25
|
# --- Runtime Image ---
|
|
26
26
|
FROM rockylinux/rockylinux:9 AS runtime
|
|
27
27
|
|
|
28
|
-
ARG UNDERPOST_VERSION=3.3.0
|
|
29
28
|
ARG NODE_VERSION=24.15.0
|
|
30
29
|
RUN set -eux; \
|
|
31
30
|
dnf -y update; \
|
|
@@ -42,9 +41,16 @@ RUN set -eux; \
|
|
|
42
41
|
curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
|
|
43
42
|
| tar -xJ -C /usr/local --strip-components=1; \
|
|
44
43
|
node --version; npm --version; \
|
|
45
|
-
npm install -g underpost@${UNDERPOST_VERSION}; \
|
|
46
44
|
dnf clean all
|
|
47
45
|
|
|
46
|
+
|
|
47
|
+
COPY underpost-cli.tgz /tmp/underpost-cli.tgz
|
|
48
|
+
RUN set -eux; \
|
|
49
|
+
npm install -g /tmp/underpost-cli.tgz --omit=dev; \
|
|
50
|
+
rm -f /tmp/underpost-cli.tgz; \
|
|
51
|
+
npm cache clean --force; \
|
|
52
|
+
underpost --version
|
|
53
|
+
|
|
48
54
|
WORKDIR /home/dd/engine/cyberia-server
|
|
49
55
|
|
|
50
56
|
COPY --from=builder /build/server ./server
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# Stage 1 — builder: clone the private deploy, build it, then scrub secrets.
|
|
7
7
|
# ---------------------------------------------------------------------------
|
|
8
8
|
FROM rockylinux/rockylinux:9 AS builder
|
|
9
|
-
ARG UNDERPOST_VERSION=3.3.
|
|
9
|
+
ARG UNDERPOST_VERSION=3.3.73
|
|
10
10
|
# Pin Node to an exact patch: dnf's nodejs:24 module lags (24.14.1) while
|
|
11
11
|
# underpost's dependencies require >=24.15.0, so install the official binary.
|
|
12
12
|
ARG NODE_VERSION=24.15.0
|
|
@@ -14,7 +14,7 @@ ENV NODE_ENV=production
|
|
|
14
14
|
|
|
15
15
|
RUN set -eux; \
|
|
16
16
|
# `sudo` is required because underpost's build steps shell out to
|
|
17
|
-
# `sudo cp`/`sudo rm` (src/server/start.js); the build runs as root so sudo
|
|
17
|
+
# `sudo cp`/`sudo rm` (src/server/runtime/start.js); the build runs as root so sudo
|
|
18
18
|
# is just a passthrough, but the binary must exist.
|
|
19
19
|
dnf install -y git openssl tar xz sudo; \
|
|
20
20
|
arch="$(uname -m)"; \
|
|
@@ -26,10 +26,22 @@ RUN set -eux; \
|
|
|
26
26
|
curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
|
|
27
27
|
| tar -xJ -C /usr/local --strip-components=1; \
|
|
28
28
|
node --version; npm --version; \
|
|
29
|
-
npm install -g underpost@${UNDERPOST_VERSION}; \
|
|
30
29
|
dnf clean all; rm -rf /var/cache/dnf; \
|
|
31
30
|
npm cache clean --force
|
|
32
31
|
|
|
32
|
+
|
|
33
|
+
# The builder's own `underpost clone` calls below run on this same CLI, and the runtime stage
|
|
34
|
+
# inherits it through `COPY --from=builder /usr/local/`.
|
|
35
|
+
COPY underpost-cli.tgz /tmp/underpost-cli.tgz
|
|
36
|
+
RUN set -eux; \
|
|
37
|
+
npm install -g /tmp/underpost-cli.tgz --omit=dev; \
|
|
38
|
+
rm -f /tmp/underpost-cli.tgz; \
|
|
39
|
+
npm cache clean --force; \
|
|
40
|
+
underpost --version; \
|
|
41
|
+
# The staged package must be the pinned release: a drift here would ship a CLI the
|
|
42
|
+
# deployment manifests were not built against.
|
|
43
|
+
underpost --version | grep -Fq "${UNDERPOST_VERSION}"
|
|
44
|
+
|
|
33
45
|
WORKDIR /home/dd
|
|
34
46
|
|
|
35
47
|
# Comma-separated instance codes to provision (backup dir + optional saga).
|
|
@@ -38,7 +50,7 @@ WORKDIR /home/dd
|
|
|
38
50
|
# `--build-arg INSTANCE_CODES=...`. Declared as an ARG (not a marker-wrapped
|
|
39
51
|
# shell string) so the value is clean — a `/** … */` literal in the shell would
|
|
40
52
|
# glob-expand in the `for` loop below.
|
|
41
|
-
ARG INSTANCE_CODES="amethyst-strata-expansion,FOREST"
|
|
53
|
+
ARG INSTANCE_CODES="amethyst-strata-expansion,FOREST,TEST"
|
|
42
54
|
|
|
43
55
|
RUN --mount=type=secret,id=github_username \
|
|
44
56
|
# --mount=type=secret,id=github_token \
|
|
@@ -83,7 +95,7 @@ RUN --mount=type=secret,id=github_username \
|
|
|
83
95
|
cd /home/dd/engine; \
|
|
84
96
|
# --- install deps + env, then replay build-safe itc provisioning ----------
|
|
85
97
|
npm install; \
|
|
86
|
-
node bin env dd-cyberia
|
|
98
|
+
node bin app load --env production --args deploy-id=dd-cyberia; \
|
|
87
99
|
( cd /home/dd/engine/hardhat && npm install --include=dev ); \
|
|
88
100
|
# --- build the client bundle (assets are now in place) --------------------
|
|
89
101
|
cd /home/dd/engine; \
|
|
@@ -136,11 +148,15 @@ COPY --from=builder /usr/local/ /usr/local/
|
|
|
136
148
|
RUN dnf install -y libstdc++ git sudo && dnf clean all && rm -rf /var/cache/dnf && \
|
|
137
149
|
useradd --create-home --home-dir /home/dd --shell /usr/sbin/nologin dd && \
|
|
138
150
|
# The runtime runs as `dd`, but `underpost start --build` shells out to `sudo cp`/`sudo rm`
|
|
139
|
-
# (src/server/start.js). Grant passwordless sudo so those succeed without a TTY/password.
|
|
151
|
+
# (src/server/runtime/start.js). Grant passwordless sudo so those succeed without a TTY/password.
|
|
140
152
|
printf 'dd ALL=(ALL) NOPASSWD:ALL\n' > /etc/sudoers.d/dd && chmod 0440 /etc/sudoers.d/dd && \
|
|
141
|
-
# underpost persists its global env
|
|
142
|
-
#
|
|
143
|
-
|
|
153
|
+
# underpost persists its global env and container state under
|
|
154
|
+
# `$(npm root -g)/underpost` (getUnderpostRootPath). That path is a STORE directory, not
|
|
155
|
+
# the CLI package tree: the staged package installs under its own package name, and
|
|
156
|
+
# `underpost start --build` re-links the bin at the pulled checkout without moving the
|
|
157
|
+
# store (src/server/runtime/start.js#linkRuntimeCli). Create it here — the non-root
|
|
158
|
+
# runtime user cannot mkdir inside /usr/local itself (EACCES on the first state write).
|
|
159
|
+
mkdir -p "$(npm root -g)/underpost" && chown -R dd:dd "$(npm root -g)/underpost"
|
|
144
160
|
|
|
145
161
|
# Copy ONLY the scrubbed runtime tree — no .git, no token, no caches.
|
|
146
162
|
COPY --from=builder --chown=dd:dd /home/dd/engine /home/dd/engine
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# Stage 1 — builder: clone the private deploy, build it, then scrub secrets.
|
|
7
7
|
# ---------------------------------------------------------------------------
|
|
8
8
|
FROM rockylinux/rockylinux:9 AS builder
|
|
9
|
-
ARG UNDERPOST_VERSION=3.3.
|
|
9
|
+
ARG UNDERPOST_VERSION=3.3.73
|
|
10
10
|
# Pin Node to an exact patch: dnf's nodejs:24 module lags (24.14.1) while
|
|
11
11
|
# underpost's dependencies require >=24.15.0, so install the official binary.
|
|
12
12
|
ARG NODE_VERSION=24.15.0
|
|
@@ -14,7 +14,7 @@ ENV NODE_ENV=development
|
|
|
14
14
|
|
|
15
15
|
RUN set -eux; \
|
|
16
16
|
# `sudo` is required because underpost's build steps shell out to
|
|
17
|
-
# `sudo cp`/`sudo rm` (src/server/start.js); the build runs as root so sudo
|
|
17
|
+
# `sudo cp`/`sudo rm` (src/server/runtime/start.js); the build runs as root so sudo
|
|
18
18
|
# is just a passthrough, but the binary must exist.
|
|
19
19
|
dnf install -y git openssl tar xz sudo; \
|
|
20
20
|
arch="$(uname -m)"; \
|
|
@@ -26,10 +26,22 @@ RUN set -eux; \
|
|
|
26
26
|
curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
|
|
27
27
|
| tar -xJ -C /usr/local --strip-components=1; \
|
|
28
28
|
node --version; npm --version; \
|
|
29
|
-
npm install -g underpost@${UNDERPOST_VERSION}; \
|
|
30
29
|
dnf clean all; rm -rf /var/cache/dnf; \
|
|
31
30
|
npm cache clean --force
|
|
32
31
|
|
|
32
|
+
|
|
33
|
+
# The builder's own `underpost clone` calls below run on this same CLI, and the runtime stage
|
|
34
|
+
# inherits it through `COPY --from=builder /usr/local/`.
|
|
35
|
+
COPY underpost-cli.tgz /tmp/underpost-cli.tgz
|
|
36
|
+
RUN set -eux; \
|
|
37
|
+
npm install -g /tmp/underpost-cli.tgz --omit=dev; \
|
|
38
|
+
rm -f /tmp/underpost-cli.tgz; \
|
|
39
|
+
npm cache clean --force; \
|
|
40
|
+
underpost --version; \
|
|
41
|
+
# The staged package must be the pinned release: a drift here would ship a CLI the
|
|
42
|
+
# deployment manifests were not built against.
|
|
43
|
+
underpost --version | grep -Fq "${UNDERPOST_VERSION}"
|
|
44
|
+
|
|
33
45
|
WORKDIR /home/dd
|
|
34
46
|
|
|
35
47
|
# Comma-separated instance codes to provision (backup dir + optional saga).
|
|
@@ -38,7 +50,7 @@ WORKDIR /home/dd
|
|
|
38
50
|
# `--build-arg INSTANCE_CODES=...`. Declared as an ARG (not a marker-wrapped
|
|
39
51
|
# shell string) so the value is clean — a `/** … */` literal in the shell would
|
|
40
52
|
# glob-expand in the `for` loop below.
|
|
41
|
-
ARG INSTANCE_CODES="amethyst-strata-expansion,FOREST"
|
|
53
|
+
ARG INSTANCE_CODES="amethyst-strata-expansion,FOREST,TEST"
|
|
42
54
|
|
|
43
55
|
RUN --mount=type=secret,id=github_username \
|
|
44
56
|
# --mount=type=secret,id=github_token \
|
|
@@ -83,7 +95,7 @@ RUN --mount=type=secret,id=github_username \
|
|
|
83
95
|
cd /home/dd/engine; \
|
|
84
96
|
# --- install deps + env, then replay build-safe itc provisioning ----------
|
|
85
97
|
npm install; \
|
|
86
|
-
node bin env dd-cyberia
|
|
98
|
+
node bin app load --env development --args deploy-id=dd-cyberia; \
|
|
87
99
|
( cd /home/dd/engine/hardhat && npm install --include=dev ); \
|
|
88
100
|
# --- build the client bundle (assets are now in place) --------------------
|
|
89
101
|
cd /home/dd/engine; \
|
|
@@ -136,11 +148,15 @@ COPY --from=builder /usr/local/ /usr/local/
|
|
|
136
148
|
RUN dnf install -y libstdc++ git sudo && dnf clean all && rm -rf /var/cache/dnf && \
|
|
137
149
|
useradd --create-home --home-dir /home/dd --shell /usr/sbin/nologin dd && \
|
|
138
150
|
# The runtime runs as `dd`, but `underpost start --build` shells out to `sudo cp`/`sudo rm`
|
|
139
|
-
# (src/server/start.js). Grant passwordless sudo so those succeed without a TTY/password.
|
|
151
|
+
# (src/server/runtime/start.js). Grant passwordless sudo so those succeed without a TTY/password.
|
|
140
152
|
printf 'dd ALL=(ALL) NOPASSWD:ALL\n' > /etc/sudoers.d/dd && chmod 0440 /etc/sudoers.d/dd && \
|
|
141
|
-
# underpost persists its global env
|
|
142
|
-
#
|
|
143
|
-
|
|
153
|
+
# underpost persists its global env and container state under
|
|
154
|
+
# `$(npm root -g)/underpost` (getUnderpostRootPath). That path is a STORE directory, not
|
|
155
|
+
# the CLI package tree: the staged package installs under its own package name, and
|
|
156
|
+
# `underpost start --build` re-links the bin at the pulled checkout without moving the
|
|
157
|
+
# store (src/server/runtime/start.js#linkRuntimeCli). Create it here — the non-root
|
|
158
|
+
# runtime user cannot mkdir inside /usr/local itself (EACCES on the first state write).
|
|
159
|
+
mkdir -p "$(npm root -g)/underpost" && chown -R dd:dd "$(npm root -g)/underpost"
|
|
144
160
|
|
|
145
161
|
# Copy ONLY the scrubbed runtime tree — no .git, no token, no caches.
|
|
146
162
|
COPY --from=builder --chown=dd:dd /home/dd/engine /home/dd/engine
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
# Stage 1 — builder: clone the private deploy, build it, then scrub secrets.
|
|
7
7
|
# ---------------------------------------------------------------------------
|
|
8
8
|
FROM rockylinux/rockylinux:9 AS builder
|
|
9
|
-
ARG UNDERPOST_VERSION=3.3.
|
|
9
|
+
ARG UNDERPOST_VERSION=3.3.73
|
|
10
10
|
# Pin Node to an exact patch: dnf's nodejs:24 module lags (24.14.1) while
|
|
11
11
|
# underpost's dependencies require >=24.15.0, so install the official binary.
|
|
12
12
|
ARG NODE_VERSION=24.15.0
|
|
@@ -14,7 +14,7 @@ ENV NODE_ENV=development
|
|
|
14
14
|
|
|
15
15
|
RUN set -eux; \
|
|
16
16
|
# `sudo` is required because underpost's build steps shell out to
|
|
17
|
-
# `sudo cp`/`sudo rm` (src/server/start.js); the build runs as root so sudo
|
|
17
|
+
# `sudo cp`/`sudo rm` (src/server/runtime/start.js); the build runs as root so sudo
|
|
18
18
|
# is just a passthrough, but the binary must exist.
|
|
19
19
|
dnf install -y git openssl tar xz sudo; \
|
|
20
20
|
arch="$(uname -m)"; \
|
|
@@ -71,7 +71,7 @@ RUN --mount=type=secret,id=github_token \
|
|
|
71
71
|
\
|
|
72
72
|
# --- install deps + env, then replay build-safe itc provisioning ----------
|
|
73
73
|
npm install; \
|
|
74
|
-
node bin env dd-cyberia
|
|
74
|
+
node bin app load --env development --args deploy-id=dd-cyberia; \
|
|
75
75
|
node bin fs --pull --recursive --deploy-id dd-cyberia --storage-file-path './engine-private/conf/dd-cyberia/storage.engine-cyberia.json'; \
|
|
76
76
|
( cd /home/dd/engine/hardhat && npm install --include=dev ); \
|
|
77
77
|
( cd /home/dd/engine && underpost clone underpostnet/cyberia-server ); \
|
|
@@ -140,7 +140,7 @@ COPY --from=builder /usr/local/ /usr/local/
|
|
|
140
140
|
RUN dnf install -y libstdc++ git sudo && dnf clean all && rm -rf /var/cache/dnf && \
|
|
141
141
|
useradd --create-home --home-dir /home/dd --shell /usr/sbin/nologin dd && \
|
|
142
142
|
# The runtime runs as `dd`, but `underpost start --build` shells out to `sudo cp`/`sudo rm`
|
|
143
|
-
# (src/server/start.js). Grant passwordless sudo so those succeed without a TTY/password.
|
|
143
|
+
# (src/server/runtime/start.js). Grant passwordless sudo so those succeed without a TTY/password.
|
|
144
144
|
printf 'dd ALL=(ALL) NOPASSWD:ALL\n' > /etc/sudoers.d/dd && chmod 0440 /etc/sudoers.d/dd && \
|
|
145
145
|
# underpost persists its global env at $(npm root -g)/underpost/.env; the
|
|
146
146
|
# non-root runtime user must be able to write it (fixes EACCES on start).
|
|
@@ -135,7 +135,7 @@ services:
|
|
|
135
135
|
# server starts but rejects connections until seeded). Serves REST/WS on 4005
|
|
136
136
|
# and the engine gRPC data service on 50051.
|
|
137
137
|
engine-cyberia-runtime:
|
|
138
|
-
image: ${ENGINE_CYBERIA_IMAGE:-underpost/engine-cyberia-dev}:${ENGINE_CYBERIA_TAG:-v3.3.
|
|
138
|
+
image: ${ENGINE_CYBERIA_IMAGE:-underpost/engine-cyberia-dev}:${ENGINE_CYBERIA_TAG:-v3.3.73}
|
|
139
139
|
container_name: dd-cyberia-engine
|
|
140
140
|
command:
|
|
141
141
|
- /bin/sh
|
|
@@ -190,7 +190,7 @@ services:
|
|
|
190
190
|
# gateway on host port 8081, so one port can route every instance path.
|
|
191
191
|
|
|
192
192
|
cyberia-server-runtime:
|
|
193
|
-
image: ${CYBERIA_SERVER_IMAGE:-underpost/cyberia-server-dev}:${CYBERIA_SERVER_TAG:-v3.3.
|
|
193
|
+
image: ${CYBERIA_SERVER_IMAGE:-underpost/cyberia-server-dev}:${CYBERIA_SERVER_TAG:-v3.3.73}
|
|
194
194
|
container_name: dd-cyberia-server
|
|
195
195
|
environment:
|
|
196
196
|
INSTANCE_CODE: amethyst-strata-expansion
|
|
@@ -226,7 +226,7 @@ services:
|
|
|
226
226
|
restart: unless-stopped
|
|
227
227
|
|
|
228
228
|
cyberia-server-forest:
|
|
229
|
-
image: ${CYBERIA_SERVER_IMAGE:-underpost/cyberia-server-dev}:${CYBERIA_SERVER_TAG:-v3.3.
|
|
229
|
+
image: ${CYBERIA_SERVER_IMAGE:-underpost/cyberia-server-dev}:${CYBERIA_SERVER_TAG:-v3.3.73}
|
|
230
230
|
container_name: dd-cyberia-server-forest
|
|
231
231
|
environment:
|
|
232
232
|
INSTANCE_CODE: FOREST
|
|
@@ -262,7 +262,7 @@ services:
|
|
|
262
262
|
restart: unless-stopped
|
|
263
263
|
|
|
264
264
|
cyberia-server-test:
|
|
265
|
-
image: ${CYBERIA_SERVER_IMAGE:-underpost/cyberia-server-dev}:${CYBERIA_SERVER_TAG:-v3.3.
|
|
265
|
+
image: ${CYBERIA_SERVER_IMAGE:-underpost/cyberia-server-dev}:${CYBERIA_SERVER_TAG:-v3.3.73}
|
|
266
266
|
container_name: dd-cyberia-server-test
|
|
267
267
|
environment:
|
|
268
268
|
INSTANCE_CODE: TEST
|
|
@@ -309,7 +309,7 @@ services:
|
|
|
309
309
|
# cyberia-server-test -> cyberia-client-test
|
|
310
310
|
|
|
311
311
|
cyberia-client-runtime:
|
|
312
|
-
image: ${CYBERIA_CLIENT_IMAGE:-underpost/cyberia-client-dev}:${CYBERIA_CLIENT_TAG:-v3.3.
|
|
312
|
+
image: ${CYBERIA_CLIENT_IMAGE:-underpost/cyberia-client-dev}:${CYBERIA_CLIENT_TAG:-v3.3.73}
|
|
313
313
|
container_name: dd-cyberia-client
|
|
314
314
|
environment:
|
|
315
315
|
CYBERIA_PORT: '8081'
|
|
@@ -334,7 +334,7 @@ services:
|
|
|
334
334
|
restart: unless-stopped
|
|
335
335
|
|
|
336
336
|
cyberia-client-forest:
|
|
337
|
-
image: ${CYBERIA_CLIENT_IMAGE:-underpost/cyberia-client-dev}:${CYBERIA_CLIENT_TAG:-v3.3.
|
|
337
|
+
image: ${CYBERIA_CLIENT_IMAGE:-underpost/cyberia-client-dev}:${CYBERIA_CLIENT_TAG:-v3.3.73}
|
|
338
338
|
container_name: dd-cyberia-client-forest
|
|
339
339
|
environment:
|
|
340
340
|
CYBERIA_PORT: '8081'
|
|
@@ -359,7 +359,7 @@ services:
|
|
|
359
359
|
restart: unless-stopped
|
|
360
360
|
|
|
361
361
|
cyberia-client-test:
|
|
362
|
-
image: ${CYBERIA_CLIENT_IMAGE:-underpost/cyberia-client-dev}:${CYBERIA_CLIENT_TAG:-v3.3.
|
|
362
|
+
image: ${CYBERIA_CLIENT_IMAGE:-underpost/cyberia-client-dev}:${CYBERIA_CLIENT_TAG:-v3.3.73}
|
|
363
363
|
container_name: dd-cyberia-client-test
|
|
364
364
|
environment:
|
|
365
365
|
CYBERIA_PORT: '8081'
|
|
@@ -12,18 +12,19 @@ import swaggerUi from 'swagger-ui-express';
|
|
|
12
12
|
import compression from 'compression';
|
|
13
13
|
import { createServer } from 'http';
|
|
14
14
|
|
|
15
|
-
import { loggerFactory, loggerMiddleware } from '../../server/logger.js';
|
|
15
|
+
import { loggerFactory, loggerMiddleware } from '../../server/ops/logger.js';
|
|
16
16
|
import { getCapVariableName, newInstance } from '../../client/components/core/CommonJs.js';
|
|
17
17
|
import { MailerProvider } from '../../mailer/MailerProvider.js';
|
|
18
18
|
import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
|
|
19
|
-
import { createPeerServer } from '../../server/peer.js';
|
|
20
|
-
import { createValkeyConnection } from '../../
|
|
21
|
-
import { applySecurity, authMiddlewareFactory } from '../../server/auth.js';
|
|
19
|
+
import { createPeerServer } from '../../server/network/peer.js';
|
|
20
|
+
import { createValkeyConnection } from '../../db/valkey/Valkey.js';
|
|
21
|
+
import { applySecurity, authMiddlewareFactory } from '../../server/security/auth.js';
|
|
22
22
|
import { ssrMiddlewareFactory } from '../../client-builder/ssr.js';
|
|
23
23
|
import { buildSwaggerUiOptions } from '../../client-builder/client-build-docs.js';
|
|
24
24
|
|
|
25
|
-
import { shellExec } from '../../server/process.js';
|
|
26
|
-
import { devProxyHostFactory, isDevProxyContext, isTlsDevProxy } from '../../server/conf.js';
|
|
25
|
+
import { shellExec } from '../../server/runtime/process.js';
|
|
26
|
+
import { devProxyHostFactory, isDevProxyContext, isTlsDevProxy } from '../../server/runtime/conf.js';
|
|
27
|
+
import { metricsPathFactory } from '../../server/ops/monitoring.js';
|
|
27
28
|
|
|
28
29
|
import Underpost from '../../index.js';
|
|
29
30
|
|
|
@@ -113,8 +114,9 @@ class ExpressService {
|
|
|
113
114
|
return next();
|
|
114
115
|
});
|
|
115
116
|
|
|
116
|
-
// Metrics endpoint
|
|
117
|
-
|
|
117
|
+
// Metrics endpoint. The route is shared with the Prometheus scrape config
|
|
118
|
+
// so a target can never point at a path this server does not serve.
|
|
119
|
+
app.get(metricsPathFactory(path), async (req, res) => {
|
|
118
120
|
res.set('Content-Type', promRegister.contentType);
|
|
119
121
|
return res.end(await promRegister.metrics());
|
|
120
122
|
});
|
|
@@ -163,19 +165,22 @@ class ExpressService {
|
|
|
163
165
|
// Create HTTP server for regular instances (required for WebSockets)
|
|
164
166
|
const server = createServer({}, app);
|
|
165
167
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
168
|
+
// Swagger path definition. The UI is served by every instance that renders the
|
|
169
|
+
// client, so a split client/API deployment keeps `api-docs` same-origin with the
|
|
170
|
+
// page that frames it.
|
|
171
|
+
const swaggerJsonPath = `./public/${host}${path === '/' ? path : `${path}/`}swagger-output.json`;
|
|
172
|
+
const swaggerPath = `${path === '/' ? `/api-docs` : `${path}/api-docs`}`;
|
|
173
|
+
const swaggerEnabled = fs.existsSync(swaggerJsonPath);
|
|
174
|
+
|
|
175
|
+
// Flag swagger requests before security middleware
|
|
176
|
+
if (swaggerEnabled) {
|
|
177
|
+
app.use(swaggerPath, (req, res, next) => {
|
|
178
|
+
res.locals.isSwagger = true;
|
|
179
|
+
next();
|
|
180
|
+
});
|
|
181
|
+
}
|
|
178
182
|
|
|
183
|
+
if (!apiBaseHost) {
|
|
179
184
|
// Security and CORS — must run before swagger-ui so CSP headers are included in swagger responses
|
|
180
185
|
if (process.env.NODE_ENV === 'development' && useLocalSsl)
|
|
181
186
|
origins = origins.map((origin) => origin.replace('http', 'https'));
|
|
@@ -184,13 +189,6 @@ class ExpressService {
|
|
|
184
189
|
origin: origins,
|
|
185
190
|
});
|
|
186
191
|
|
|
187
|
-
// Swagger UI setup (after security middleware so responses carry correct CSP headers)
|
|
188
|
-
if (fs.existsSync(swaggerJsonPath)) {
|
|
189
|
-
const swaggerDoc = JSON.parse(fs.readFileSync(swaggerJsonPath, 'utf8'));
|
|
190
|
-
const swaggerUiOptions = await buildSwaggerUiOptions();
|
|
191
|
-
app.use(swaggerPath, swaggerUi.serve, swaggerUi.setup(swaggerDoc, swaggerUiOptions));
|
|
192
|
-
}
|
|
193
|
-
|
|
194
192
|
// Database and Valkey connections
|
|
195
193
|
if (db && apis) await DataBaseProviderService.load({ apis, host, path, db });
|
|
196
194
|
|
|
@@ -261,6 +259,13 @@ class ExpressService {
|
|
|
261
259
|
}
|
|
262
260
|
}
|
|
263
261
|
|
|
262
|
+
// Swagger UI setup (after security middleware so responses carry correct CSP headers)
|
|
263
|
+
if (swaggerEnabled) {
|
|
264
|
+
const swaggerDoc = JSON.parse(fs.readFileSync(swaggerJsonPath, 'utf8'));
|
|
265
|
+
const swaggerUiOptions = await buildSwaggerUiOptions();
|
|
266
|
+
app.use(swaggerPath, swaggerUi.serve, swaggerUi.setup(swaggerDoc, swaggerUiOptions));
|
|
267
|
+
}
|
|
268
|
+
|
|
264
269
|
// SSR middleware loading
|
|
265
270
|
const ssr = await ssrMiddlewareFactory({ app, directory, rootHostPath, path });
|
|
266
271
|
for (const [_, ssrMiddleware] of Object.entries(ssr)) app.use(ssrMiddleware);
|
|
@@ -6,8 +6,9 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import fs from 'fs-extra';
|
|
9
|
-
import { getRootDirectory, shellCd, shellExec } from '../../server/process.js';
|
|
10
|
-
import { loggerFactory } from '../../server/logger.js';
|
|
9
|
+
import { getRootDirectory, shellCd, shellExec } from '../../server/runtime/process.js';
|
|
10
|
+
import { loggerFactory } from '../../server/ops/logger.js';
|
|
11
|
+
import Underpost from '../../index.js';
|
|
11
12
|
|
|
12
13
|
const logger = loggerFactory(import.meta);
|
|
13
14
|
|
|
@@ -71,12 +72,8 @@ class LamppService {
|
|
|
71
72
|
* @memberof LamppService
|
|
72
73
|
*/
|
|
73
74
|
async initService(options = { daemon: false }) {
|
|
74
|
-
let cmd;
|
|
75
|
-
|
|
76
|
-
// 1. Write the current virtual host router configuration
|
|
77
75
|
fs.writeFileSync(`/opt/lampp/etc/extra/httpd-vhosts.conf`, this.router || '', 'utf8');
|
|
78
76
|
|
|
79
|
-
// 2. Ensure the vhosts file is included in the main httpd.conf
|
|
80
77
|
const httpdConfPath = `/opt/lampp/etc/httpd.conf`;
|
|
81
78
|
fs.writeFileSync(
|
|
82
79
|
httpdConfPath,
|
|
@@ -86,12 +83,9 @@ class LamppService {
|
|
|
86
83
|
'utf8',
|
|
87
84
|
);
|
|
88
85
|
|
|
89
|
-
|
|
90
|
-
cmd = `sudo /opt/lampp/lampp stop`;
|
|
91
|
-
shellExec(cmd);
|
|
86
|
+
shellExec(`sudo /opt/lampp/lampp stop`);
|
|
92
87
|
|
|
93
|
-
//
|
|
94
|
-
// Modify httpd.conf (port 80)
|
|
88
|
+
// Every vhost declares its own Listen, so the stock 80/443 directives would double-bind.
|
|
95
89
|
if (!fs.readFileSync(httpdConfPath, 'utf8').match(/# Listen 80/))
|
|
96
90
|
fs.writeFileSync(
|
|
97
91
|
httpdConfPath,
|
|
@@ -99,7 +93,6 @@ class LamppService {
|
|
|
99
93
|
'utf8',
|
|
100
94
|
);
|
|
101
95
|
|
|
102
|
-
// Modify httpd-ssl.conf (port 443)
|
|
103
96
|
const httpdSslConfPath = `/opt/lampp/etc/extra/httpd-ssl.conf`;
|
|
104
97
|
if (fs.existsSync(httpdSslConfPath) && !fs.readFileSync(httpdSslConfPath, 'utf8').match(/# Listen 443/))
|
|
105
98
|
fs.writeFileSync(
|
|
@@ -108,7 +101,8 @@ class LamppService {
|
|
|
108
101
|
'utf8',
|
|
109
102
|
);
|
|
110
103
|
|
|
111
|
-
//
|
|
104
|
+
// The startup script aborts when 80/443 are already held by the ingress proxy; short-circuit
|
|
105
|
+
// its probes so the service still comes up behind one.
|
|
112
106
|
const lamppScriptPath = `/opt/lampp/lampp`;
|
|
113
107
|
if (!fs.readFileSync(lamppScriptPath, 'utf8').match(/testport 443 && false/))
|
|
114
108
|
fs.writeFileSync(
|
|
@@ -123,9 +117,7 @@ class LamppService {
|
|
|
123
117
|
'utf8',
|
|
124
118
|
);
|
|
125
119
|
|
|
126
|
-
|
|
127
|
-
cmd = `sudo /opt/lampp/lampp start`;
|
|
128
|
-
shellExec(cmd);
|
|
120
|
+
shellExec(`sudo /opt/lampp/lampp start`);
|
|
129
121
|
}
|
|
130
122
|
|
|
131
123
|
/**
|
|
@@ -217,13 +209,15 @@ class LamppService {
|
|
|
217
209
|
* @param {string} options.path - The base path for error documents (e.g., '/app').
|
|
218
210
|
* @param {string} [options.directory] - Optional absolute path to the document root.
|
|
219
211
|
* @param {string} [options.rootHostPath] - Relative path from the root directory to the document root, used if `directory` is not provided.
|
|
212
|
+
* @param {string} [options.repository] - Repository backing the document root. Each conf route
|
|
213
|
+
* declares its own, so one host serves as many repositories as it has routes.
|
|
220
214
|
* @param {boolean} [options.redirect] - If true, enables RewriteEngine for redirection.
|
|
221
215
|
* @param {string} [options.redirectTarget] - The target URL for redirection.
|
|
222
216
|
* @param {boolean} [options.resetRouter] - If true, clears the existing router configuration before appending the new one.
|
|
223
217
|
* @returns {{disabled: boolean}} An object indicating if the service is disabled.
|
|
224
218
|
* @memberof LamppService
|
|
225
219
|
*/
|
|
226
|
-
createApp({ port, host, path, directory, rootHostPath, redirect, redirectTarget, resetRouter }) {
|
|
220
|
+
createApp({ port, host, path, directory, rootHostPath, repository, redirect, redirectTarget, resetRouter }) {
|
|
227
221
|
if (!this.enabled()) return { disabled: true };
|
|
228
222
|
|
|
229
223
|
if (!this.ports.includes(port)) this.ports.push(port);
|
|
@@ -231,7 +225,17 @@ class LamppService {
|
|
|
231
225
|
|
|
232
226
|
const documentRoot = directory ? directory : `${getRootDirectory()}${rootHostPath}`;
|
|
233
227
|
|
|
234
|
-
|
|
228
|
+
if (repository) {
|
|
229
|
+
const { accessible } = Underpost.repo.provisionSiteRoot({ host, siteRoot: documentRoot, repository });
|
|
230
|
+
// The checkout keeps its `.git` so the backup pipeline can commit and push it back; the
|
|
231
|
+
// vhost below denies it over HTTP.
|
|
232
|
+
if (accessible) Underpost.repo.initLocalRepo({ path: documentRoot, origin: repository });
|
|
233
|
+
// The vhost is still emitted, so the host answers rather than vanishing from the router —
|
|
234
|
+
// but Apache cannot stat a DocumentRoot that was never created and turns every request into
|
|
235
|
+
// a blanket 403. Named here, because that 403 carries nothing pointing back at this step.
|
|
236
|
+
else logger.error(`${host}: ${documentRoot} not provisioned — this vhost will answer 403 until it is`);
|
|
237
|
+
}
|
|
238
|
+
|
|
235
239
|
this.appendRouter(`
|
|
236
240
|
Listen ${port}
|
|
237
241
|
|
|
@@ -305,55 +309,3 @@ Listen ${port}
|
|
|
305
309
|
const Lampp = new LamppService();
|
|
306
310
|
|
|
307
311
|
export { Lampp };
|
|
308
|
-
|
|
309
|
-
// -- helper info --
|
|
310
|
-
|
|
311
|
-
// ERR too many redirects:
|
|
312
|
-
// Check: SELECT * FROM database.wp_options where option_name = 'siteurl' or option_name = 'home';
|
|
313
|
-
// Check: wp-config.php
|
|
314
|
-
// if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
|
|
315
|
-
// $_SERVER['HTTPS'] = 'on';
|
|
316
|
-
// }
|
|
317
|
-
// For plugins:
|
|
318
|
-
// define( 'FS_METHOD', 'direct' );
|
|
319
|
-
|
|
320
|
-
// ErrorDocument 404 /custom_404.html
|
|
321
|
-
// ErrorDocument 500 /custom_50x.html
|
|
322
|
-
// ErrorDocument 502 /custom_50x.html
|
|
323
|
-
// ErrorDocument 503 /custom_50x.html
|
|
324
|
-
// ErrorDocument 504 /custom_50x.html
|
|
325
|
-
|
|
326
|
-
// Respond When Error Pages are Directly Requested
|
|
327
|
-
|
|
328
|
-
// <Files "custom_404.html">
|
|
329
|
-
// <If "-z %{ENV:REDIRECT_STATUS}">
|
|
330
|
-
// RedirectMatch 404 ^/custom_404.html$
|
|
331
|
-
// </If>
|
|
332
|
-
// </Files>
|
|
333
|
-
|
|
334
|
-
// <Files "custom_50x.html">
|
|
335
|
-
// <If "-z %{ENV:REDIRECT_STATUS}">
|
|
336
|
-
// RedirectMatch 404 ^/custom_50x.html$
|
|
337
|
-
// </If>
|
|
338
|
-
// </Files>
|
|
339
|
-
|
|
340
|
-
// Add www or https with htaccess rewrite
|
|
341
|
-
|
|
342
|
-
// Options +FollowSymLinks
|
|
343
|
-
// RewriteEngine On
|
|
344
|
-
// RewriteCond %{HTTP_HOST} ^example.com [NC]
|
|
345
|
-
// RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]
|
|
346
|
-
|
|
347
|
-
// Redirect http to https with htaccess rewrite
|
|
348
|
-
|
|
349
|
-
// RewriteEngine On
|
|
350
|
-
// RewriteCond %{SERVER_PORT} 80
|
|
351
|
-
// RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
|
|
352
|
-
|
|
353
|
-
// Redirect to HTTPS with www subdomain
|
|
354
|
-
|
|
355
|
-
// RewriteEngine On
|
|
356
|
-
// RewriteCond %{HTTPS} off [OR]
|
|
357
|
-
// RewriteCond %{HTTP_HOST} ^www\. [NC]
|
|
358
|
-
// RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
|
|
359
|
-
// RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
|