cyberia 3.2.22 → 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 (185) 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 +33 -24
  11. package/.github/workflows/engine-cyberia.ci.yml +13 -3
  12. package/.github/workflows/ghpkg.ci.yml +88 -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 +10 -7
  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 +301 -1
  21. package/CLI-HELP.md +71 -6
  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 +31 -0
  28. package/bin/cyberia.js +1080 -184
  29. package/bin/deploy.js +2 -2
  30. package/bin/index.js +1080 -184
  31. package/bump.config.js +1 -0
  32. package/compose.env +131 -0
  33. package/conf.js +18 -1
  34. package/deployment.yaml +2 -2
  35. package/docker-compose.yml +316 -0
  36. package/hardhat/hardhat.config.js +2 -2
  37. package/hardhat/package-lock.json +620 -2041
  38. package/hardhat/package.json +7 -5
  39. package/hardhat/scripts/deployObjectLayerToken.js +18 -18
  40. package/hardhat/test/ObjectLayerToken.js +378 -274
  41. package/ipfs/configure-ipfs.sh +13 -0
  42. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  43. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
  44. package/manifests/deployment/dd-cyberia-development/deployment.yaml +2 -2
  45. package/manifests/deployment/dd-cyberia-development/grpc-service.yaml +17 -0
  46. package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +32 -0
  47. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  48. package/mongodb/entrypoint.sh +76 -0
  49. package/nginx.conf +87 -0
  50. package/package.json +31 -19
  51. package/pv-pvc.yaml +32 -0
  52. package/scripts/disk-clean.sh +85 -60
  53. package/scripts/kubeadm-node-setup.sh +317 -0
  54. package/scripts/rocky-kickstart.sh +877 -185
  55. package/scripts/rpmfusion-ffmpeg-setup.sh +26 -50
  56. package/scripts/test-monitor.sh +3 -5
  57. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +43 -7
  58. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +17 -25
  59. package/src/api/cyberia-action/cyberia-action.controller.js +19 -0
  60. package/src/api/cyberia-action/cyberia-action.model.js +21 -29
  61. package/src/api/cyberia-action/cyberia-action.router.js +42 -7
  62. package/src/api/cyberia-action/cyberia-action.service.js +20 -4
  63. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +58 -57
  64. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +37 -6
  65. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +8 -2
  66. package/src/api/cyberia-entity/cyberia-entity.router.js +39 -7
  67. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +74 -0
  68. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +67 -0
  69. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +63 -0
  70. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +46 -0
  71. package/src/api/cyberia-instance/cyberia-fallback-world.js +62 -10
  72. package/src/api/cyberia-instance/cyberia-instance.model.js +32 -2
  73. package/src/api/cyberia-instance/cyberia-instance.router.js +6 -6
  74. package/src/api/cyberia-instance/cyberia-world-generator.js +116 -3
  75. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +3 -0
  76. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +39 -7
  77. package/src/api/cyberia-map/cyberia-map.router.js +21 -6
  78. package/src/api/cyberia-quest/cyberia-quest.controller.js +38 -0
  79. package/src/api/cyberia-quest/cyberia-quest.router.js +47 -7
  80. package/src/api/cyberia-quest/cyberia-quest.service.js +59 -4
  81. package/src/api/cyberia-saga/cyberia-saga.controller.js +74 -0
  82. package/src/api/cyberia-saga/cyberia-saga.model.js +59 -0
  83. package/src/api/cyberia-saga/cyberia-saga.router.js +63 -0
  84. package/src/api/cyberia-saga/cyberia-saga.service.js +42 -0
  85. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +551 -129
  86. package/src/api/cyberia-skill/cyberia-skill.controller.js +74 -0
  87. package/src/api/cyberia-skill/cyberia-skill.model.js +50 -0
  88. package/src/api/cyberia-skill/cyberia-skill.router.js +63 -0
  89. package/src/api/cyberia-skill/cyberia-skill.service.js +42 -0
  90. package/src/api/ipfs/ipfs.service.js +28 -15
  91. package/src/api/object-layer/object-layer.router.js +25 -15
  92. package/src/api/object-layer/object-layer.service.js +15 -20
  93. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +39 -7
  94. package/src/cli/baremetal.js +717 -16
  95. package/src/cli/cluster.js +80 -5
  96. package/src/cli/deploy.js +127 -11
  97. package/src/cli/docker-compose.js +648 -0
  98. package/src/cli/env.js +11 -2
  99. package/src/cli/fs.js +75 -30
  100. package/src/cli/image.js +129 -51
  101. package/src/cli/index.js +110 -6
  102. package/src/cli/kickstart.js +142 -20
  103. package/src/cli/release.js +46 -4
  104. package/src/cli/repository.js +238 -33
  105. package/src/cli/run.js +520 -114
  106. package/src/cli/secrets.js +82 -48
  107. package/src/cli/ssh.js +234 -0
  108. package/src/cli/static.js +2 -2
  109. package/src/client/components/cyberia/ActionEngineCyberia.js +1867 -0
  110. package/src/client/components/cyberia/EntityEngineCyberia.js +585 -0
  111. package/src/client/components/cyberia/InstanceEngineCyberia.js +219 -13
  112. package/src/client/components/cyberia/MapEngineCyberia.js +154 -71
  113. package/src/client/components/cyberia/ObjectLayerEngineModal.js +40 -63
  114. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +34 -20
  115. package/src/client/components/cyberia/SharedDefaultsCyberia.js +195 -4
  116. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +66 -0
  117. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +8 -0
  118. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -0
  119. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +45 -27
  120. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +3 -3
  121. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +39 -22
  122. package/src/client/public/cyberia-docs/CYBERIA-LORE.md +88 -0
  123. package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +394 -0
  124. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +8 -1
  125. package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
  126. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +5 -5
  127. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  128. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  129. package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +99 -0
  130. package/src/client/services/cyberia-instance/cyberia-instance.management.js +2 -2
  131. package/src/client/services/cyberia-map/cyberia-map.management.js +2 -2
  132. package/src/client/services/cyberia-saga/cyberia-saga.service.js +99 -0
  133. package/src/client/services/cyberia-skill/cyberia-skill.service.js +99 -0
  134. package/src/client/services/object-layer/object-layer.management.js +6 -6
  135. package/src/{server → client-builder}/client-build-docs.js +15 -5
  136. package/src/{server → client-builder}/client-build-live.js +3 -3
  137. package/src/{server → client-builder}/client-build.js +25 -22
  138. package/src/{server → client-builder}/client-dev-server.js +3 -3
  139. package/src/{server → client-builder}/client-icons.js +2 -2
  140. package/src/{server → client-builder}/ssr.js +5 -5
  141. package/src/client.build.js +1 -3
  142. package/src/client.dev.js +1 -1
  143. package/src/db/mongo/MongoBootstrap.js +12 -12
  144. package/src/grpc/cyberia/grpc-server.js +255 -70
  145. package/src/index.js +12 -1
  146. package/src/mailer/EmailRender.js +1 -1
  147. package/src/{server → projects/cyberia}/atlas-sprite-sheet-generator.js +2 -2
  148. package/src/{server → projects/cyberia}/besu-genesis-generator.js +3 -3
  149. package/src/projects/cyberia/catalog-cyberia.js +81 -0
  150. package/src/projects/cyberia/gemini-client.js +175 -0
  151. package/src/projects/cyberia/generate-saga.js +2107 -0
  152. package/src/{server → projects/cyberia}/ipfs-client.js +2 -2
  153. package/src/{server → projects/cyberia}/object-layer.js +12 -108
  154. package/src/{server → projects/cyberia}/semantic-layer-generator-floor.js +1 -1
  155. package/src/{server → projects/cyberia}/semantic-layer-generator-resource.js +1 -1
  156. package/src/{server → projects/cyberia}/semantic-layer-generator-skin.js +1 -1
  157. package/src/{server → projects/cyberia}/semantic-layer-generator.js +2 -2
  158. package/src/{server → projects/cyberia}/shape-generator.js +2 -2
  159. package/src/{server → projects/underpost}/catalog-underpost.js +1 -2
  160. package/src/runtime/cyberia-client/Dockerfile +27 -61
  161. package/src/runtime/cyberia-client/Dockerfile.dev +20 -12
  162. package/src/runtime/cyberia-server/Dockerfile +21 -20
  163. package/src/runtime/cyberia-server/Dockerfile.dev +17 -8
  164. package/src/runtime/engine-cyberia/Dockerfile +143 -0
  165. package/src/runtime/engine-cyberia/Dockerfile.dev +143 -0
  166. package/src/runtime/engine-cyberia/Dockerfile.test +165 -0
  167. package/src/runtime/engine-cyberia/compose.env +131 -0
  168. package/src/runtime/engine-cyberia/docker-compose.yml +316 -0
  169. package/src/runtime/engine-cyberia/ipfs/configure-ipfs.sh +13 -0
  170. package/src/runtime/engine-cyberia/mongodb/entrypoint.sh +76 -0
  171. package/src/runtime/engine-cyberia/nginx.conf +87 -0
  172. package/src/runtime/express/Express.js +2 -2
  173. package/src/runtime/nginx/Nginx.js +250 -0
  174. package/src/server/catalog.js +9 -14
  175. package/src/server/conf.js +3 -6
  176. package/src/server/runtime-status.js +18 -1
  177. package/src/server/start.js +12 -2
  178. package/src/server.js +6 -2
  179. package/test/cyberia-instance-conf-defaults.test.js +140 -0
  180. package/test/deploy-monitor.test.js +26 -10
  181. package/test/shape-generator.test.js +7 -1
  182. package/typedoc.dd-cyberia.json +3 -1
  183. package/typedoc.json +3 -1
  184. /package/src/client/ssr/{Render.js → RootDocument.js} +0 -0
  185. /package/src/{server → client-builder}/client-formatted.js +0 -0
@@ -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';