cyberia 3.2.12 → 3.2.70

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.
Files changed (194) hide show
  1. package/.env.example +127 -68
  2. package/.github/workflows/cyberia-client.cd.yml +40 -0
  3. package/.github/workflows/cyberia-server.cd.yml +40 -0
  4. package/.github/workflows/docker-image.cyberia-client.ci.yml +49 -0
  5. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +48 -0
  6. package/.github/workflows/docker-image.cyberia-server.ci.yml +69 -0
  7. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +69 -0
  8. package/.github/workflows/docker-image.engine-cyberia.ci.yml +52 -0
  9. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +52 -0
  10. package/.github/workflows/engine-cyberia.cd.yml +34 -24
  11. package/.github/workflows/engine-cyberia.ci.yml +27 -5
  12. package/.github/workflows/ghpkg.ci.yml +89 -1
  13. package/.github/workflows/gitlab.ci.yml +1 -1
  14. package/.github/workflows/hardhat.ci.yml +1 -1
  15. package/.github/workflows/npmpkg.ci.yml +19 -12
  16. package/.github/workflows/publish.ci.yml +2 -2
  17. package/.github/workflows/publish.cyberia.ci.yml +5 -16
  18. package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -8
  19. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  20. package/CHANGELOG.md +451 -1
  21. package/CLI-HELP.md +1040 -1130
  22. package/Dockerfile +141 -43
  23. package/Dockerfile.dev +143 -0
  24. package/Dockerfile.test +165 -0
  25. package/README.md +1 -1
  26. package/baremetal/commission-workflows.json +1 -0
  27. package/bin/build.js +128 -136
  28. package/bin/build.template.js +25 -179
  29. package/bin/cyberia.js +1089 -188
  30. package/bin/deploy.js +6 -3
  31. package/bin/index.js +1089 -188
  32. package/bump.config.js +1 -0
  33. package/compose.env +131 -0
  34. package/conf.js +19 -1
  35. package/deployment.yaml +74 -2
  36. package/docker-compose.yml +316 -0
  37. package/hardhat/hardhat.config.js +2 -2
  38. package/hardhat/package-lock.json +620 -2041
  39. package/hardhat/package.json +7 -5
  40. package/hardhat/scripts/deployObjectLayerToken.js +18 -18
  41. package/hardhat/test/ObjectLayerToken.js +378 -274
  42. package/ipfs/configure-ipfs.sh +13 -0
  43. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  44. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
  45. package/manifests/deployment/dd-cyberia-development/deployment.yaml +74 -2
  46. package/manifests/deployment/dd-cyberia-development/grpc-service.yaml +17 -0
  47. package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +32 -0
  48. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  49. package/mongodb/entrypoint.sh +76 -0
  50. package/nginx.conf +87 -0
  51. package/package.json +34 -22
  52. package/pv-pvc.yaml +32 -0
  53. package/scripts/disk-clean.sh +85 -60
  54. package/scripts/kubeadm-node-setup.sh +317 -0
  55. package/scripts/link-local-underpost-cli.sh +6 -0
  56. package/scripts/rocky-kickstart.sh +877 -185
  57. package/scripts/rpmfusion-ffmpeg-setup.sh +26 -50
  58. package/scripts/test-monitor.sh +248 -0
  59. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +43 -7
  60. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +17 -25
  61. package/src/api/cyberia-action/cyberia-action.controller.js +19 -0
  62. package/src/api/cyberia-action/cyberia-action.model.js +21 -29
  63. package/src/api/cyberia-action/cyberia-action.router.js +42 -7
  64. package/src/api/cyberia-action/cyberia-action.service.js +20 -4
  65. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +58 -57
  66. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +37 -6
  67. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +8 -2
  68. package/src/api/cyberia-entity/cyberia-entity.router.js +39 -7
  69. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +74 -0
  70. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +67 -0
  71. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +63 -0
  72. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +46 -0
  73. package/src/api/cyberia-instance/cyberia-fallback-world.js +62 -10
  74. package/src/api/cyberia-instance/cyberia-instance.model.js +32 -2
  75. package/src/api/cyberia-instance/cyberia-instance.router.js +6 -6
  76. package/src/api/cyberia-instance/cyberia-world-generator.js +116 -3
  77. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +3 -0
  78. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +39 -7
  79. package/src/api/cyberia-map/cyberia-map.router.js +21 -6
  80. package/src/api/cyberia-quest/cyberia-quest.controller.js +38 -0
  81. package/src/api/cyberia-quest/cyberia-quest.router.js +47 -7
  82. package/src/api/cyberia-quest/cyberia-quest.service.js +59 -4
  83. package/src/api/cyberia-saga/cyberia-saga.controller.js +74 -0
  84. package/src/api/cyberia-saga/cyberia-saga.model.js +59 -0
  85. package/src/api/cyberia-saga/cyberia-saga.router.js +63 -0
  86. package/src/api/cyberia-saga/cyberia-saga.service.js +42 -0
  87. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +551 -122
  88. package/src/api/cyberia-skill/cyberia-skill.controller.js +74 -0
  89. package/src/api/cyberia-skill/cyberia-skill.model.js +50 -0
  90. package/src/api/cyberia-skill/cyberia-skill.router.js +63 -0
  91. package/src/api/cyberia-skill/cyberia-skill.service.js +42 -0
  92. package/src/api/ipfs/ipfs.service.js +28 -15
  93. package/src/api/object-layer/object-layer.router.js +25 -15
  94. package/src/api/object-layer/object-layer.service.js +15 -20
  95. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +39 -7
  96. package/src/cli/baremetal.js +717 -16
  97. package/src/cli/cluster.js +80 -5
  98. package/src/cli/deploy.js +326 -292
  99. package/src/cli/docker-compose.js +648 -0
  100. package/src/cli/env.js +12 -6
  101. package/src/cli/fs.js +75 -30
  102. package/src/cli/image.js +187 -55
  103. package/src/cli/index.js +157 -6
  104. package/src/cli/kickstart.js +142 -20
  105. package/src/cli/monitor.js +387 -6
  106. package/src/cli/release.js +72 -15
  107. package/src/cli/repository.js +339 -40
  108. package/src/cli/run.js +678 -186
  109. package/src/cli/secrets.js +82 -48
  110. package/src/cli/ssh.js +234 -0
  111. package/src/cli/static.js +2 -2
  112. package/src/client/components/core/PanelForm.js +44 -44
  113. package/src/client/components/cyberia/ActionEngineCyberia.js +1867 -0
  114. package/src/client/components/cyberia/EntityEngineCyberia.js +585 -0
  115. package/src/client/components/cyberia/InstanceEngineCyberia.js +219 -13
  116. package/src/client/components/cyberia/MapEngineCyberia.js +154 -71
  117. package/src/client/components/cyberia/ObjectLayerEngineModal.js +40 -63
  118. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +34 -20
  119. package/src/client/components/cyberia/SharedDefaultsCyberia.js +195 -4
  120. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +66 -0
  121. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +8 -0
  122. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -0
  123. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +92 -20
  124. package/src/client/public/cyberia-docs/ARCHITECTURE.md +272 -50
  125. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +3 -3
  126. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +39 -22
  127. package/src/client/public/cyberia-docs/CYBERIA-LORE.md +88 -0
  128. package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +394 -0
  129. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +28 -12
  130. package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
  131. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +27 -5
  132. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  133. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  134. package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +99 -0
  135. package/src/client/services/cyberia-instance/cyberia-instance.management.js +2 -2
  136. package/src/client/services/cyberia-map/cyberia-map.management.js +2 -2
  137. package/src/client/services/cyberia-saga/cyberia-saga.service.js +99 -0
  138. package/src/client/services/cyberia-skill/cyberia-skill.service.js +99 -0
  139. package/src/client/services/object-layer/object-layer.management.js +6 -6
  140. package/src/{server → client-builder}/client-build-docs.js +15 -5
  141. package/src/{server → client-builder}/client-build-live.js +3 -3
  142. package/src/{server → client-builder}/client-build.js +25 -22
  143. package/src/{server → client-builder}/client-dev-server.js +3 -3
  144. package/src/{server → client-builder}/client-icons.js +2 -2
  145. package/src/{server → client-builder}/ssr.js +5 -5
  146. package/src/client.build.js +1 -3
  147. package/src/client.dev.js +1 -1
  148. package/src/db/mongo/MongoBootstrap.js +12 -12
  149. package/src/db/mongo/MongooseDB.js +2 -1
  150. package/src/grpc/cyberia/grpc-server.js +255 -70
  151. package/src/index.js +12 -1
  152. package/src/mailer/EmailRender.js +1 -1
  153. package/src/{server → projects/cyberia}/atlas-sprite-sheet-generator.js +2 -2
  154. package/src/{server → projects/cyberia}/besu-genesis-generator.js +3 -3
  155. package/src/projects/cyberia/catalog-cyberia.js +81 -0
  156. package/src/projects/cyberia/gemini-client.js +175 -0
  157. package/src/projects/cyberia/generate-saga.js +2107 -0
  158. package/src/{server → projects/cyberia}/ipfs-client.js +6 -4
  159. package/src/{server → projects/cyberia}/object-layer.js +12 -108
  160. package/src/{server → projects/cyberia}/semantic-layer-generator-floor.js +1 -1
  161. package/src/{server → projects/cyberia}/semantic-layer-generator-resource.js +1 -1
  162. package/src/{server → projects/cyberia}/semantic-layer-generator-skin.js +1 -1
  163. package/src/{server → projects/cyberia}/semantic-layer-generator.js +2 -2
  164. package/src/{server → projects/cyberia}/shape-generator.js +2 -2
  165. package/src/projects/underpost/catalog-underpost.js +60 -0
  166. package/src/runtime/cyberia-client/Dockerfile +31 -83
  167. package/src/runtime/cyberia-client/Dockerfile.dev +23 -30
  168. package/src/runtime/cyberia-server/Dockerfile +23 -42
  169. package/src/runtime/cyberia-server/Dockerfile.dev +20 -35
  170. package/src/runtime/engine-cyberia/Dockerfile +143 -0
  171. package/src/runtime/engine-cyberia/Dockerfile.dev +143 -0
  172. package/src/runtime/engine-cyberia/Dockerfile.test +165 -0
  173. package/src/runtime/engine-cyberia/compose.env +131 -0
  174. package/src/runtime/engine-cyberia/docker-compose.yml +316 -0
  175. package/src/runtime/engine-cyberia/ipfs/configure-ipfs.sh +13 -0
  176. package/src/runtime/engine-cyberia/mongodb/entrypoint.sh +76 -0
  177. package/src/runtime/engine-cyberia/nginx.conf +87 -0
  178. package/src/runtime/express/Express.js +2 -2
  179. package/src/runtime/nginx/Nginx.js +250 -0
  180. package/src/runtime/wp/Dockerfile +3 -3
  181. package/src/server/catalog.js +72 -0
  182. package/src/server/conf.js +415 -60
  183. package/src/server/runtime-status.js +252 -0
  184. package/src/server/start.js +42 -11
  185. package/src/server.js +6 -2
  186. package/test/cyberia-instance-conf-defaults.test.js +140 -0
  187. package/test/deploy-monitor.test.js +267 -0
  188. package/test/shape-generator.test.js +7 -1
  189. package/typedoc.dd-cyberia.json +3 -1
  190. package/typedoc.json +3 -1
  191. package/manifests/deployment/dd-test-development/deployment.yaml +0 -256
  192. package/manifests/deployment/dd-test-development/proxy.yaml +0 -102
  193. /package/src/client/ssr/{Render.js → RootDocument.js} +0 -0
  194. /package/src/{server → client-builder}/client-formatted.js +0 -0
@@ -0,0 +1,131 @@
1
+ # Working env-file for the Cyberia ecosystem compose stack (custom workflow).
2
+ # Used as-is by the CLI (not generated). Set real credentials here, then run:
3
+ # underpost docker-compose --up --deploy-id dd-cyberia --docker-compose-id cyberia
4
+ #
5
+ # Loaded explicitly via --env-file so container service-discovery values (the
6
+ # Docker network hostnames below) are not overridden by any host-local .env.
7
+
8
+ # --- Ecosystem images (dev variants, published by docker-image.*.dev.ci.yml) --
9
+ # This stack is development-only, so it uses the `-dev` images built from the
10
+ # Dockerfile.dev variants (debug builds + live-inspection tooling).
11
+ MONGO_IMAGE=mongo:latest
12
+ VALKEY_IMAGE=valkey/valkey:latest
13
+ ENGINE_CYBERIA_IMAGE=underpost/engine-cyberia-dev
14
+ ENGINE_CYBERIA_TAG=v3.2.70
15
+ CYBERIA_SERVER_IMAGE=underpost/cyberia-server-dev
16
+ CYBERIA_SERVER_TAG=v3.2.70
17
+ CYBERIA_CLIENT_IMAGE=underpost/cyberia-client-dev
18
+ CYBERIA_CLIENT_TAG=v3.2.70
19
+ PROXY_IMAGE=nginx:stable-alpine
20
+ IPFS_IMAGE=ipfs/kubo:latest
21
+ IPFS_CLUSTER_IMAGE=ipfs/ipfs-cluster:latest
22
+
23
+ # --- Private-repo bootstrap (engine-cyberia clones the private dd-cyberia conf) -
24
+ # The engine-cyberia image ships only the underpost CLI; at start it runs the
25
+ # `underpost start --build` bootstrap, which clones ${GITHUB_USERNAME}/engine-cyberia.
26
+ GITHUB_USERNAME=underpostnet
27
+ GITHUB_TOKEN=change_me_private_repo_token
28
+
29
+ # --- MongoDB (translation of Secret mongodb-secret) --------------------------
30
+ MONGO_INITDB_ROOT_USERNAME=admin
31
+ MONGO_INITDB_ROOT_PASSWORD=change_me_dev_password
32
+
33
+ # --- Application DB / cache connection (Docker service discovery, not localhost)
34
+ NODE_ENV=development
35
+ DB_PROVIDER=mongoose
36
+ DB_HOST=mongodb://mongodb:27017
37
+ DB_REPLICA_SET=rs0
38
+ DB_AUTH_SOURCE=admin
39
+ VALKEY_HOST=valkey-service
40
+ VALKEY_PORT=6379
41
+
42
+ # --- Cyberia instance wiring (compose service DNS) ---------------------------
43
+ # cyberia-server -> engine-cyberia authority endpoints. INTERNAL only: these use
44
+ # the docker service DNS (engine-cyberia) and must never leak to browser clients.
45
+ INSTANCE_CODE=amethyst-strata-expansion
46
+ ENGINE_API_BASE_URL=http://engine-cyberia:4005
47
+ ENGINE_GRPC_ADDRESS=engine-cyberia:50051
48
+
49
+ # Client-visible Content Authority origin, forwarded to browser/Raylib clients
50
+ # for every engine-cyberia content/asset/metadata request. Host-reachable
51
+ # (docker publishes engine-cyberia :4005). Distinct from ENGINE_API_BASE_URL:
52
+ # the two responsibilities must never overwrite each other.
53
+ ENGINE_PUBLIC_URL=http://localhost:4005
54
+ ENGINE_GRPC_RELOAD_INTERVAL_SEC=300
55
+
56
+ # cyberia-server logging. This is the dev stack, so default to DEBUG. Set
57
+ # CYBERIA_SERVER_LOG_LEVEL (debug|info|warn|error) to override the APP_ENV
58
+ # fallback without touching APP_ENV.
59
+ CYBERIA_SERVER_APP_ENV=development
60
+ CYBERIA_SERVER_LOG_LEVEL=
61
+
62
+ # --- engine-cyberia runtime env (loaded into the container via env_file) -----
63
+ # The dd-cyberia engine (engine-private/conf/dd-cyberia/conf.server.json) needs
64
+ # these to boot: DB auth + per-site DB names, the base PORT (the cyberia host is
65
+ # assigned PORT+1 = 4005, which the healthcheck/nginx target), JWT, and mailer.
66
+ # Secrets are DEV PLACEHOLDERS — no real credentials ship in the public image.
67
+ PORT=4004
68
+ NODE_OPTIONS=--max-old-space-size=8192
69
+ BASE_API=api
70
+ DEFAULT_DEPLOY_ID=dd-cyberia
71
+ DEPLOY_ID=dd-cyberia
72
+ DEFAULT_DEPLOY_HOST=www.cyberiaonline.com
73
+ DEFAULT_DEPLOY_PATH=/
74
+ DISABLE_API_RATE_LIMIT=true
75
+ DOTENV_CONFIG_QUIET=true
76
+ ACCESS_EXPIRE_MINUTES=1440
77
+ REFRESH_EXPIRE_MINUTES=5
78
+ DEV_PROXY_PORT_OFFSET=0
79
+ JWT_SECRET=change_me_dev_jwt_secret
80
+
81
+ # DB auth (must match the MONGO_INITDB_ROOT_* creds above) + per-site DB names.
82
+ DB_USER=admin
83
+ DB_PASSWORD=change_me_dev_password
84
+
85
+ DB_NAME_CYBERIA=cyberia
86
+
87
+ # Mailer / SMTP (dev placeholders — mailer stays inert without real creds).
88
+ MAILER_SENDER_NAME=CYBERIA
89
+ MAILER_SENDER_EMAIL=noreply@example.com
90
+ SMTP_HOST=smtp.example.com
91
+ SMTP_PORT=465
92
+ SMTP_AUTH_USER=change_me
93
+ SMTP_AUTH_PASS=change_me
94
+ MAILER_SENDER_NAME_CYBERIA=CYBERIA
95
+ MAILER_SENDER_EMAIL_CYBERIA=noreply@example.com
96
+ SMTP_HOST_CYBERIA=smtp.example.com
97
+ SMTP_PORT_CYBERIA=465
98
+ SMTP_AUTH_USER_CYBERIA=change_me
99
+ SMTP_AUTH_PASS_CYBERIA=change_me
100
+
101
+ # Third-party integrations (dev placeholders).
102
+ CLOUDINARY_CLOUD_NAME=change_me
103
+ CLOUDINARY_API_KEY=change_me
104
+ CLOUDINARY_API_SECRET=change_me
105
+ GEMINI_API_KEY=change_me
106
+ HUGGINGFACE_API_KEY=change_me
107
+ DEFAULT_ADMIN_EMAIL=admin@example.com
108
+ DEFAULT_ADMIN_PASSWORD=change_me
109
+
110
+ # --- IPFS endpoints ----------------------------------------------------------
111
+ # Kubo (content plane) is the `ipfs` service; the Cluster REST API (:9094, pin
112
+ # replication) is the `ipfs-cluster` service. Override only to target a
113
+ # different node.
114
+ IPFS_API_URL=http://ipfs:5001
115
+ IPFS_GATEWAY_URL=http://ipfs:8080
116
+ IPFS_CLUSTER_API_URL=http://ipfs-cluster:9094
117
+ # 32-byte hex shared secret for the ipfs-cluster consensus (dev default is set
118
+ # in docker-compose.yml). Override for a real/shared cluster.
119
+ # CLUSTER_SECRET=
120
+
121
+ # --- Host-published ports ----------------------------------------------------
122
+ PROXY_HTTP_PORT=80
123
+ IPFS_API_PORT=5001
124
+ IPFS_GATEWAY_PORT=8080
125
+ IPFS_CLUSTER_API_PORT=9094
126
+ MONGO_HOST_PORT=27017
127
+ VALKEY_NODEPORT=32079
128
+ ENGINE_CYBERIA_REST_PORT=4005
129
+ ENGINE_CYBERIA_GRPC_PORT=50051
130
+ CYBERIA_SERVER_PORT=8081
131
+ CYBERIA_CLIENT_PORT=8082
@@ -0,0 +1,316 @@
1
+ # Cyberia ecosystem Docker Compose stack — canonical custom workflow.
2
+ #
3
+ # Orchestrates the entire Cyberia MMORPG on the underpost platform base
4
+ # (MongoDB + Valkey), then replaces the default engine template with the Cyberia
5
+ # content-authority engine and its two custom instances, fronted by an nginx
6
+ # reverse proxy — the same topology as the root docker-compose.yml, specialized
7
+ # for the dd-cyberia deploy.
8
+ #
9
+ # Canonical location (custom docker-compose workflow):
10
+ # engine-private/conf/dd-cyberia/docker-compose/cyberia/
11
+ # ├── docker-compose.yml (this file)
12
+ # ├── compose.env (working env-file, used as-is — not generated)
13
+ # ├── nginx.conf (reverse-proxy config, used as-is — not generated)
14
+ # └── mongodb/entrypoint.sh (only generated infra: replica-set bootstrap)
15
+ # All bind mounts below are relative to this directory: the CLI runs compose
16
+ # with `--project-directory` pinned here (see src/cli/docker-compose.js).
17
+ #
18
+ # Architecture boundaries (see CLAUDE.md "Cyberia architecture boundaries"):
19
+ # engine-cyberia — content, validation, persistence, gRPC(:50051)+REST(:4005)
20
+ # data services, asset metadata. The authority layer.
21
+ # cyberia-server — authoritative real-time simulation / tick processing (Go).
22
+ # cyberia-client — rendering, input, prediction, presentation (WASM bundle).
23
+ #
24
+ # Usage:
25
+ # underpost docker-compose --up --deploy-id dd-cyberia --docker-compose-id cyberia
26
+ # (or the docker:cyberia:* npm scripts). The engine-cyberia image bakes the
27
+ # dd-cyberia build at image-build time, so no private-repo credentials are
28
+ # required at container start.
29
+
30
+ name: dd-cyberia
31
+
32
+ services:
33
+ # --- MongoDB -------------------------------------------------------------
34
+ # Identical bootstrap to the root docker-compose.yml: replSet rs0, keyFile
35
+ # cluster auth, replica-set + root-user init over the loopback localhost
36
+ # exception. Uses ./mongodb/entrypoint.sh, generated into this canonical dir
37
+ # by `underpost docker-compose --generate --docker-compose-id cyberia ...`.
38
+ mongodb:
39
+ image: ${MONGO_IMAGE:-mongo:latest}
40
+ container_name: dd-cyberia-mongodb
41
+ entrypoint: ['bash', '/docker-init/entrypoint.sh']
42
+ environment:
43
+ MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME:?set MONGO_INITDB_ROOT_USERNAME in compose.env}
44
+ MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD:?set MONGO_INITDB_ROOT_PASSWORD in compose.env}
45
+ DB_REPLICA_SET: ${DB_REPLICA_SET:-rs0}
46
+ volumes:
47
+ - ./mongodb:/docker-init:ro
48
+ - mongodb-keyfile:/opt/keyfile
49
+ - mongodb-data:/data/db
50
+ networks:
51
+ - dd-cyberia-internal
52
+ expose:
53
+ - '27017'
54
+ ports:
55
+ - '${MONGO_HOST_PORT:-27017}:27017'
56
+ healthcheck:
57
+ test:
58
+ - CMD-SHELL
59
+ - >
60
+ mongosh --quiet -u "$$MONGO_INITDB_ROOT_USERNAME" -p "$$MONGO_INITDB_ROOT_PASSWORD"
61
+ --authenticationDatabase admin --eval "db.hello().isWritablePrimary" | grep -q true
62
+ interval: 10s
63
+ timeout: 5s
64
+ retries: 20
65
+ start_period: 60s
66
+ restart: unless-stopped
67
+
68
+ # --- Valkey --------------------------------------------------------------
69
+ valkey-service:
70
+ image: ${VALKEY_IMAGE:-valkey/valkey:latest}
71
+ container_name: dd-cyberia-valkey
72
+ command: ['valkey-server', '--port', '6379', '--bind', '0.0.0.0', '--protected-mode', 'no']
73
+ volumes:
74
+ - valkey-data:/data
75
+ networks:
76
+ - dd-cyberia-internal
77
+ expose:
78
+ - '6379'
79
+ ports:
80
+ - '${VALKEY_NODEPORT:-32079}:6379'
81
+ healthcheck:
82
+ test: ['CMD', 'valkey-cli', '-p', '6379', 'ping']
83
+ interval: 10s
84
+ timeout: 5s
85
+ retries: 10
86
+ start_period: 10s
87
+ restart: unless-stopped
88
+
89
+ # --- IPFS (Kubo daemon) --------------------------------------------------
90
+ # Content plane: add / pin / cat / files (MFS). The engine reaches it at
91
+ # http://ipfs:5001 (RPC) and http://ipfs:8080 (gateway) via the
92
+ # IPFS_API_URL / IPFS_GATEWAY_URL overrides in compose.env. The init hook
93
+ # binds the API/gateway to 0.0.0.0 (default is loopback-only) so both the
94
+ # engine and the ipfs-cluster service can reach the daemon.
95
+ ipfs:
96
+ image: ${IPFS_IMAGE:-ipfs/kubo:latest}
97
+ container_name: dd-cyberia-ipfs
98
+ volumes:
99
+ - ./ipfs/configure-ipfs.sh:/container-init.d/001-configure-ipfs.sh:ro
100
+ - ipfs-data:/data/ipfs
101
+ networks:
102
+ - dd-cyberia-internal
103
+ expose:
104
+ - '5001'
105
+ - '8080'
106
+ - '4001'
107
+ ports:
108
+ - '${IPFS_API_PORT:-5001}:5001'
109
+ - '${IPFS_GATEWAY_PORT:-8080}:8080'
110
+ healthcheck:
111
+ test: ['CMD-SHELL', 'ipfs --api=/ip4/127.0.0.1/tcp/5001 id >/dev/null 2>&1 || exit 1']
112
+ interval: 15s
113
+ timeout: 5s
114
+ retries: 5
115
+ start_period: 40s
116
+ restart: unless-stopped
117
+
118
+ # --- IPFS Cluster (pin orchestration) ------------------------------------
119
+ # Single-node dev equivalent of manifests/ipfs (StatefulSet ipfs-cluster).
120
+ # Serves the Cluster REST API on :9094 (ipfs-client.js IPFS_CLUSTER_API_URL);
121
+ # the engine POSTs /pins/<cid> here to replicate pins. It drives the shared
122
+ # Kubo daemon above via CLUSTER_IPFSHTTP_NODEMULTIADDRESS and starts only once
123
+ # Kubo is healthy, so the engine (which waits for this service to be healthy)
124
+ # never races an unreachable cluster.
125
+ ipfs-cluster:
126
+ image: ${IPFS_CLUSTER_IMAGE:-ipfs/ipfs-cluster:latest}
127
+ container_name: dd-cyberia-ipfs-cluster
128
+ depends_on:
129
+ ipfs:
130
+ condition: service_healthy
131
+ environment:
132
+ CLUSTER_PEERNAME: dd-cyberia-cluster
133
+ # 32-byte hex shared secret. Fixed dev default keeps the cluster identity
134
+ # stable across restarts; override in compose.env for anything shared.
135
+ CLUSTER_SECRET: ${CLUSTER_SECRET:-0e1d2c3b4a59687778695a4b3c2d1e0f0e1d2c3b4a59687778695a4b3c2d1e0f}
136
+ CLUSTER_IPFSHTTP_NODEMULTIADDRESS: /dns4/ipfs/tcp/5001
137
+ CLUSTER_RESTAPI_HTTPLISTENMULTIADDRESS: /ip4/0.0.0.0/tcp/9094
138
+ CLUSTER_CRDT_TRUSTEDPEERS: '*'
139
+ volumes:
140
+ - ipfs-cluster-data:/data/ipfs-cluster
141
+ networks:
142
+ - dd-cyberia-internal
143
+ expose:
144
+ - '9094'
145
+ - '9096'
146
+ ports:
147
+ - '${IPFS_CLUSTER_API_PORT:-9094}:9094'
148
+ healthcheck:
149
+ test: ['CMD-SHELL', 'ipfs-cluster-ctl --host /ip4/127.0.0.1/tcp/9094 id >/dev/null 2>&1 || exit 1']
150
+ interval: 15s
151
+ timeout: 5s
152
+ retries: 5
153
+ start_period: 40s
154
+ restart: unless-stopped
155
+
156
+ # --- engine-cyberia (content authority) ----------------------------------
157
+ # The underpost Node engine for deploy dd-cyberia. The image bakes the
158
+ # dd-cyberia build at image-build time (see src/runtime/engine-cyberia/
159
+ # Dockerfile), so the container start only runs `underpost start --run`.
160
+ # Serves the portal/REST/WS on 4005 and the engine gRPC data service on
161
+ # 50051 (conf.server.json www.cyberiaonline.com.grpc).
162
+ engine-cyberia:
163
+ image: ${ENGINE_CYBERIA_IMAGE:-underpost/engine-cyberia-dev}:${ENGINE_CYBERIA_TAG:-v3.2.70}
164
+ container_name: dd-cyberia-engine
165
+ command:
166
+ - /bin/sh
167
+ - -c
168
+ - >
169
+ node bin/cyberia ol --drop &&
170
+ node bin/cyberia run-workflow drop-db &&
171
+ node bin/cyberia instance amethyst-strata-expansion --import &&
172
+ underpost start --run dd-cyberia development
173
+ env_file:
174
+ - ./compose.env
175
+ environment:
176
+ NODE_ENV: ${NODE_ENV:-development}
177
+ DB_PROVIDER: ${DB_PROVIDER:-mongoose}
178
+ DB_HOST: ${DB_HOST:-mongodb://mongodb:27017}
179
+ DB_REPLICA_SET: ${DB_REPLICA_SET:-rs0}
180
+ DB_AUTH_SOURCE: ${DB_AUTH_SOURCE:-admin}
181
+ DB_USER: ${MONGO_INITDB_ROOT_USERNAME:?}
182
+ DB_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD:?}
183
+ VALKEY_HOST: ${VALKEY_HOST:-valkey-service}
184
+ VALKEY_PORT: ${VALKEY_PORT:-6379}
185
+ networks:
186
+ - dd-cyberia-internal
187
+ expose:
188
+ - '4005'
189
+ - '50051'
190
+ ports:
191
+ - '${ENGINE_CYBERIA_REST_PORT:-4005}:4005'
192
+ - '${ENGINE_CYBERIA_GRPC_PORT:-50051}:50051'
193
+ healthcheck:
194
+ test: ['CMD-SHELL', "timeout 2 bash -c '</dev/tcp/127.0.0.1/4005' || exit 1"]
195
+ interval: 15s
196
+ timeout: 5s
197
+ retries: 5
198
+ # The dd-cyberia build is baked into the image; start just runs the
199
+ # engine, so a moderate start_period covers DB connect + listen.
200
+ start_period: 120s
201
+ depends_on:
202
+ mongodb:
203
+ condition: service_healthy
204
+ valkey-service:
205
+ condition: service_healthy
206
+ ipfs:
207
+ condition: service_healthy
208
+ ipfs-cluster:
209
+ condition: service_healthy
210
+ restart: unless-stopped
211
+
212
+ # --- cyberia-server (authoritative simulation) ---------------------------
213
+ # Go MMO runtime. Reads the engine authority endpoints from the environment
214
+ # (compose service DNS) instead of the K8s {{grpc-service-dns}} template used
215
+ # in conf.instances.json. Uses the published image's default ENTRYPOINT.
216
+ cyberia-server:
217
+ image: ${CYBERIA_SERVER_IMAGE:-underpost/cyberia-server-dev}:${CYBERIA_SERVER_TAG:-v3.2.70}
218
+ container_name: dd-cyberia-server
219
+ environment:
220
+ INSTANCE_CODE: ${INSTANCE_CODE:-FOREST}
221
+ ENGINE_API_BASE_URL: ${ENGINE_API_BASE_URL:-http://engine-cyberia:4005}
222
+ ENGINE_PUBLIC_URL: ${ENGINE_PUBLIC_URL:-http://localhost:4005}
223
+ ENGINE_GRPC_ADDRESS: ${ENGINE_GRPC_ADDRESS:-engine-cyberia:50051}
224
+ ENGINE_GRPC_RELOAD_INTERVAL_SEC: ${ENGINE_GRPC_RELOAD_INTERVAL_SEC:-300}
225
+ STATIC_DIR: ${CYBERIA_SERVER_STATIC_DIR:-/home/dd/engine/cyberia-server/public}
226
+ APP_ENV: ${CYBERIA_SERVER_APP_ENV:-development}
227
+ LOG_LEVEL: ${CYBERIA_SERVER_LOG_LEVEL:-}
228
+ networks:
229
+ - dd-cyberia-internal
230
+ expose:
231
+ - '8081'
232
+ ports:
233
+ - '${CYBERIA_SERVER_PORT:-8081}:8081'
234
+ healthcheck:
235
+ test: ['CMD-SHELL', "timeout 2 bash -c '</dev/tcp/127.0.0.1/8081' || exit 1"]
236
+ interval: 15s
237
+ timeout: 5s
238
+ retries: 5
239
+ start_period: 30s
240
+ depends_on:
241
+ engine-cyberia:
242
+ condition: service_healthy
243
+ restart: unless-stopped
244
+
245
+ # --- cyberia-client (presentation) ---------------------------------------
246
+ # Python static-file server for the pre-built WASM bundle. The -dev image's
247
+ # docker-driver.py defaults to CYBERIA_PORT=8082; override to 8081 so the whole
248
+ # ecosystem (nginx upstream, healthcheck) stays on a single internal port.
249
+ cyberia-client:
250
+ image: ${CYBERIA_CLIENT_IMAGE:-underpost/cyberia-client-dev}:${CYBERIA_CLIENT_TAG:-v3.2.70}
251
+ container_name: dd-cyberia-client
252
+ environment:
253
+ CYBERIA_PORT: '8081'
254
+ networks:
255
+ - dd-cyberia-internal
256
+ expose:
257
+ - '8081'
258
+ ports:
259
+ - '${CYBERIA_CLIENT_PORT:-8082}:8081'
260
+ healthcheck:
261
+ test: ['CMD-SHELL', "timeout 2 bash -c '</dev/tcp/127.0.0.1/8081' || exit 1"]
262
+ interval: 15s
263
+ timeout: 5s
264
+ retries: 5
265
+ start_period: 20s
266
+ # Last stage of the sequential chain: only start once cyberia-server is
267
+ # healthy (which itself gates on engine-cyberia -> mongodb/valkey).
268
+ depends_on:
269
+ cyberia-server:
270
+ condition: service_healthy
271
+ restart: unless-stopped
272
+
273
+ # --- Reverse proxy -------------------------------------------------------
274
+ # Routes the three cyberiaonline.com hosts to their upstreams with websocket
275
+ # upgrade support. Config source of truth: ./nginx.conf (this dir).
276
+ proxy:
277
+ image: ${PROXY_IMAGE:-nginx:stable-alpine}
278
+ container_name: dd-cyberia-proxy
279
+ volumes:
280
+ - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
281
+ networks:
282
+ - dd-cyberia-internal
283
+ ports:
284
+ - '${PROXY_HTTP_PORT:-80}:80'
285
+ healthcheck:
286
+ test: ['CMD', 'wget', '-q', '-O', '-', 'http://127.0.0.1/healthz']
287
+ interval: 15s
288
+ timeout: 5s
289
+ retries: 5
290
+ start_period: 10s
291
+ # Fronts the stack only after every tier reports healthy.
292
+ depends_on:
293
+ engine-cyberia:
294
+ condition: service_healthy
295
+ cyberia-server:
296
+ condition: service_healthy
297
+ cyberia-client:
298
+ condition: service_healthy
299
+ restart: unless-stopped
300
+
301
+ networks:
302
+ dd-cyberia-internal:
303
+ name: dd-cyberia-internal
304
+ driver: bridge
305
+
306
+ volumes:
307
+ mongodb-data:
308
+ name: dd-cyberia-mongodb-data
309
+ mongodb-keyfile:
310
+ name: dd-cyberia-mongodb-keyfile
311
+ valkey-data:
312
+ name: dd-cyberia-valkey-data
313
+ ipfs-data:
314
+ name: dd-cyberia-ipfs-data
315
+ ipfs-cluster-data:
316
+ name: dd-cyberia-ipfs-cluster-data
@@ -0,0 +1,13 @@
1
+ #!/bin/sh
2
+ # Kubo /container-init.d hook — runs after `ipfs init`, before the daemon starts.
3
+ # Compose equivalent of the Addresses/Datastore config in manifests/ipfs
4
+ # configmap.yaml (configure-ipfs.sh). Binds the RPC API (5001) and gateway
5
+ # (8080) to all interfaces so the engine and ipfs-cluster containers can reach
6
+ # the daemon at http://ipfs:5001 (ipfs-client.js IPFS_API_URL).
7
+ set -e
8
+
9
+ ipfs config Addresses.API /ip4/0.0.0.0/tcp/5001
10
+ ipfs config Addresses.Gateway /ip4/0.0.0.0/tcp/8080
11
+ ipfs config --json Swarm.ConnMgr.HighWater 2000
12
+ ipfs config --json Datastore.BloomFilterSize 1048576
13
+ ipfs config Datastore.StorageMax 100GB
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env bash
2
+ # Generated by 'underpost docker-compose --generate' — do not hand-edit.
3
+ set -e
4
+
5
+ KEYFILE=/opt/keyfile/mongodb-keyfile
6
+ RS="${DB_REPLICA_SET:-rs0}"
7
+ MEMBER_HOST="mongodb:27017"
8
+
9
+ if [ ! -s "$KEYFILE" ]; then
10
+ openssl rand -base64 756 > "$KEYFILE"
11
+ fi
12
+ chmod 400 "$KEYFILE"
13
+ chown 999:999 "$KEYFILE"
14
+ mkdir -p /data/db
15
+ chown -R 999:999 /data/db
16
+
17
+ # One-time replica-set + root-user bootstrap via the localhost exception,
18
+ # performed in the background once mongod accepts loopback connections.
19
+ (
20
+ for i in $(seq 1 60); do
21
+ if mongosh --quiet --host 127.0.0.1 --eval 'db.adminCommand({ ping: 1 })' >/dev/null 2>&1; then
22
+ break
23
+ fi
24
+ sleep 1
25
+ done
26
+
27
+ cat > /tmp/mongo-bootstrap.js <<JS
28
+ var RS = "$RS";
29
+ var HOST = "$MEMBER_HOST";
30
+ var U = "$MONGO_INITDB_ROOT_USERNAME";
31
+ var P = "$MONGO_INITDB_ROOT_PASSWORD";
32
+ function waitPrimary() {
33
+ for (var i = 0; i < 60; i++) {
34
+ var h = db.hello();
35
+ if (h.isWritablePrimary) return true;
36
+ sleep(1000);
37
+ }
38
+ return false;
39
+ }
40
+ var initialized = false;
41
+ try {
42
+ var s = rs.status();
43
+ if (s && s.ok === 1) initialized = true;
44
+ } catch (e) {
45
+ var m = String(e);
46
+ if (m.indexOf("requires authentication") >= 0 || m.indexOf("not authorized") >= 0 || m.indexOf("Unauthorized") >= 0) {
47
+ initialized = true;
48
+ } else if (m.indexOf("NotYetInitialized") < 0 && m.indexOf("no replset config") < 0) {
49
+ throw e;
50
+ }
51
+ }
52
+ if (!initialized) {
53
+ rs.initiate({ _id: RS, members: [{ _id: 0, host: HOST }] });
54
+ waitPrimary();
55
+ var admin = db.getSiblingDB("admin");
56
+ try {
57
+ admin.createUser({ user: U, pwd: P, roles: [{ role: "root", db: "admin" }] });
58
+ print("BOOTSTRAP_USER_CREATED");
59
+ } catch (e) {
60
+ var s2 = String(e);
61
+ if (s2.indexOf("already exists") < 0 && s2.indexOf("not authorized") < 0 && s2.indexOf("requires authentication") < 0) {
62
+ throw e;
63
+ }
64
+ print("BOOTSTRAP_USER_SKIP");
65
+ }
66
+ print("BOOTSTRAP_DONE");
67
+ } else {
68
+ print("BOOTSTRAP_ALREADY_INITIALIZED");
69
+ }
70
+ JS
71
+
72
+ mongosh --quiet --host 127.0.0.1 /tmp/mongo-bootstrap.js > /tmp/mongo-bootstrap.log 2>&1 || true
73
+ ) &
74
+
75
+ exec gosu mongodb mongod \
76
+ --replSet "$RS" --auth --clusterAuthMode keyFile --keyFile "$KEYFILE" --bind_ip_all
@@ -0,0 +1,87 @@
1
+ # Reverse proxy for the Cyberia ecosystem compose stack (custom workflow:
2
+ # --deploy-id dd-cyberia --docker-compose-id cyberia). Hand-authored source of
3
+ # truth for this stack — used as-is (not generated). Mirrors the render format
4
+ # of src/runtime/nginx/Nginx.js (websocket upgrade map, named upstreams,
5
+ # proxy_http_version 1.1, per-host servers).
6
+ #
7
+ # Host -> upstream mapping (matches engine-private/conf/dd-cyberia hosts):
8
+ # www.cyberiaonline.com -> engine-cyberia:4005 (portal + REST + WS authority)
9
+ # server.cyberiaonline.com -> cyberia-server:8081 (Go MMO simulation / websocket)
10
+ # client.cyberiaonline.com -> cyberia-client:8081 (WASM presentation bundle)
11
+
12
+ map $http_upgrade $connection_upgrade {
13
+ default upgrade;
14
+ '' close;
15
+ }
16
+
17
+ upstream up_engine_cyberia { server engine-cyberia:4005; }
18
+ upstream up_cyberia_server { server cyberia-server:8081; }
19
+ upstream up_cyberia_client { server cyberia-client:8081; }
20
+
21
+ proxy_http_version 1.1;
22
+
23
+ server {
24
+ listen 80 default_server;
25
+ server_name _ cyberiaonline.com www.cyberiaonline.com;
26
+
27
+ location = /healthz {
28
+ access_log off;
29
+ return 200 "ok\n";
30
+ add_header Content-Type text/plain;
31
+ }
32
+
33
+ location / {
34
+ proxy_pass http://up_engine_cyberia;
35
+ proxy_set_header Host $host;
36
+ proxy_set_header X-Real-IP $remote_addr;
37
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
38
+ proxy_set_header X-Forwarded-Proto $scheme;
39
+ proxy_set_header Upgrade $http_upgrade;
40
+ proxy_set_header Connection $connection_upgrade;
41
+ proxy_read_timeout 3600s;
42
+ }
43
+ }
44
+
45
+ server {
46
+ listen 80;
47
+ server_name server.cyberiaonline.com;
48
+
49
+ location = /healthz {
50
+ access_log off;
51
+ return 200 "ok\n";
52
+ add_header Content-Type text/plain;
53
+ }
54
+
55
+ location / {
56
+ proxy_pass http://up_cyberia_server;
57
+ proxy_set_header Host $host;
58
+ proxy_set_header X-Real-IP $remote_addr;
59
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
60
+ proxy_set_header X-Forwarded-Proto $scheme;
61
+ proxy_set_header Upgrade $http_upgrade;
62
+ proxy_set_header Connection $connection_upgrade;
63
+ proxy_read_timeout 3600s;
64
+ }
65
+ }
66
+
67
+ server {
68
+ listen 80;
69
+ server_name client.cyberiaonline.com;
70
+
71
+ location = /healthz {
72
+ access_log off;
73
+ return 200 "ok\n";
74
+ add_header Content-Type text/plain;
75
+ }
76
+
77
+ location / {
78
+ proxy_pass http://up_cyberia_client;
79
+ proxy_set_header Host $host;
80
+ proxy_set_header X-Real-IP $remote_addr;
81
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
82
+ proxy_set_header X-Forwarded-Proto $scheme;
83
+ proxy_set_header Upgrade $http_upgrade;
84
+ proxy_set_header Connection $connection_upgrade;
85
+ proxy_read_timeout 3600s;
86
+ }
87
+ }
@@ -19,8 +19,8 @@ import { DataBaseProviderService } from '../../db/DataBaseProvider.js';
19
19
  import { createPeerServer } from '../../server/peer.js';
20
20
  import { createValkeyConnection } from '../../server/valkey.js';
21
21
  import { applySecurity, authMiddlewareFactory } from '../../server/auth.js';
22
- import { ssrMiddlewareFactory } from '../../server/ssr.js';
23
- import { buildSwaggerUiOptions } from '../../server/client-build-docs.js';
22
+ import { ssrMiddlewareFactory } from '../../client-builder/ssr.js';
23
+ import { buildSwaggerUiOptions } from '../../client-builder/client-build-docs.js';
24
24
 
25
25
  import { shellExec } from '../../server/process.js';
26
26
  import { devProxyHostFactory, isDevProxyContext, isTlsDevProxy } from '../../server/conf.js';