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.
- package/.env.example +127 -68
- package/.github/workflows/cyberia-client.cd.yml +40 -0
- package/.github/workflows/cyberia-server.cd.yml +40 -0
- package/.github/workflows/docker-image.cyberia-client.ci.yml +49 -0
- package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +48 -0
- package/.github/workflows/docker-image.cyberia-server.ci.yml +69 -0
- package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +69 -0
- package/.github/workflows/docker-image.engine-cyberia.ci.yml +52 -0
- package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +52 -0
- package/.github/workflows/engine-cyberia.cd.yml +33 -24
- package/.github/workflows/engine-cyberia.ci.yml +13 -3
- package/.github/workflows/ghpkg.ci.yml +88 -1
- package/.github/workflows/gitlab.ci.yml +1 -1
- package/.github/workflows/hardhat.ci.yml +1 -1
- package/.github/workflows/npmpkg.ci.yml +10 -7
- package/.github/workflows/publish.ci.yml +2 -2
- package/.github/workflows/publish.cyberia.ci.yml +5 -16
- package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -8
- package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
- package/CHANGELOG.md +301 -1
- package/CLI-HELP.md +71 -6
- package/Dockerfile +141 -43
- package/Dockerfile.dev +143 -0
- package/Dockerfile.test +165 -0
- package/README.md +1 -1
- package/baremetal/commission-workflows.json +1 -0
- package/bin/build.js +31 -0
- package/bin/cyberia.js +1080 -184
- package/bin/deploy.js +2 -2
- package/bin/index.js +1080 -184
- package/bump.config.js +1 -0
- package/compose.env +131 -0
- package/conf.js +18 -1
- package/deployment.yaml +2 -2
- package/docker-compose.yml +316 -0
- package/hardhat/hardhat.config.js +2 -2
- package/hardhat/package-lock.json +620 -2041
- package/hardhat/package.json +7 -5
- package/hardhat/scripts/deployObjectLayerToken.js +18 -18
- package/hardhat/test/ObjectLayerToken.js +378 -274
- package/ipfs/configure-ipfs.sh +13 -0
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +2 -2
- package/manifests/deployment/dd-cyberia-development/grpc-service.yaml +17 -0
- package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +32 -0
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/mongodb/entrypoint.sh +76 -0
- package/nginx.conf +87 -0
- package/package.json +31 -19
- package/pv-pvc.yaml +32 -0
- package/scripts/disk-clean.sh +85 -60
- package/scripts/kubeadm-node-setup.sh +317 -0
- package/scripts/rocky-kickstart.sh +877 -185
- package/scripts/rpmfusion-ffmpeg-setup.sh +26 -50
- package/scripts/test-monitor.sh +3 -5
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +43 -7
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +17 -25
- package/src/api/cyberia-action/cyberia-action.controller.js +19 -0
- package/src/api/cyberia-action/cyberia-action.model.js +21 -29
- package/src/api/cyberia-action/cyberia-action.router.js +42 -7
- package/src/api/cyberia-action/cyberia-action.service.js +20 -4
- package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +58 -57
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +37 -6
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +8 -2
- package/src/api/cyberia-entity/cyberia-entity.router.js +39 -7
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +74 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +67 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +63 -0
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +46 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +62 -10
- package/src/api/cyberia-instance/cyberia-instance.model.js +32 -2
- package/src/api/cyberia-instance/cyberia-instance.router.js +6 -6
- package/src/api/cyberia-instance/cyberia-world-generator.js +116 -3
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +3 -0
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +39 -7
- package/src/api/cyberia-map/cyberia-map.router.js +21 -6
- package/src/api/cyberia-quest/cyberia-quest.controller.js +38 -0
- package/src/api/cyberia-quest/cyberia-quest.router.js +47 -7
- package/src/api/cyberia-quest/cyberia-quest.service.js +59 -4
- package/src/api/cyberia-saga/cyberia-saga.controller.js +74 -0
- package/src/api/cyberia-saga/cyberia-saga.model.js +59 -0
- package/src/api/cyberia-saga/cyberia-saga.router.js +63 -0
- package/src/api/cyberia-saga/cyberia-saga.service.js +42 -0
- package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +551 -129
- package/src/api/cyberia-skill/cyberia-skill.controller.js +74 -0
- package/src/api/cyberia-skill/cyberia-skill.model.js +50 -0
- package/src/api/cyberia-skill/cyberia-skill.router.js +63 -0
- package/src/api/cyberia-skill/cyberia-skill.service.js +42 -0
- package/src/api/ipfs/ipfs.service.js +28 -15
- package/src/api/object-layer/object-layer.router.js +25 -15
- package/src/api/object-layer/object-layer.service.js +15 -20
- package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +39 -7
- package/src/cli/baremetal.js +717 -16
- package/src/cli/cluster.js +80 -5
- package/src/cli/deploy.js +127 -11
- package/src/cli/docker-compose.js +648 -0
- package/src/cli/env.js +11 -2
- package/src/cli/fs.js +75 -30
- package/src/cli/image.js +129 -51
- package/src/cli/index.js +110 -6
- package/src/cli/kickstart.js +142 -20
- package/src/cli/release.js +46 -4
- package/src/cli/repository.js +238 -33
- package/src/cli/run.js +520 -114
- package/src/cli/secrets.js +82 -48
- package/src/cli/ssh.js +234 -0
- package/src/cli/static.js +2 -2
- package/src/client/components/cyberia/ActionEngineCyberia.js +1867 -0
- package/src/client/components/cyberia/EntityEngineCyberia.js +585 -0
- package/src/client/components/cyberia/InstanceEngineCyberia.js +219 -13
- package/src/client/components/cyberia/MapEngineCyberia.js +154 -71
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +40 -63
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +34 -20
- package/src/client/components/cyberia/SharedDefaultsCyberia.js +195 -4
- package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +66 -0
- package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +8 -0
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +8 -0
- package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +45 -27
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +3 -3
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +39 -22
- package/src/client/public/cyberia-docs/CYBERIA-LORE.md +88 -0
- package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +394 -0
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +8 -1
- package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
- package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +5 -5
- package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
- package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +99 -0
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +2 -2
- package/src/client/services/cyberia-map/cyberia-map.management.js +2 -2
- package/src/client/services/cyberia-saga/cyberia-saga.service.js +99 -0
- package/src/client/services/cyberia-skill/cyberia-skill.service.js +99 -0
- package/src/client/services/object-layer/object-layer.management.js +6 -6
- package/src/{server → client-builder}/client-build-docs.js +15 -5
- package/src/{server → client-builder}/client-build-live.js +3 -3
- package/src/{server → client-builder}/client-build.js +25 -22
- package/src/{server → client-builder}/client-dev-server.js +3 -3
- package/src/{server → client-builder}/client-icons.js +2 -2
- package/src/{server → client-builder}/ssr.js +5 -5
- package/src/client.build.js +1 -3
- package/src/client.dev.js +1 -1
- package/src/db/mongo/MongoBootstrap.js +12 -12
- package/src/grpc/cyberia/grpc-server.js +255 -70
- package/src/index.js +12 -1
- package/src/mailer/EmailRender.js +1 -1
- package/src/{server → projects/cyberia}/atlas-sprite-sheet-generator.js +2 -2
- package/src/{server → projects/cyberia}/besu-genesis-generator.js +3 -3
- package/src/projects/cyberia/catalog-cyberia.js +81 -0
- package/src/projects/cyberia/gemini-client.js +175 -0
- package/src/projects/cyberia/generate-saga.js +2107 -0
- package/src/{server → projects/cyberia}/ipfs-client.js +2 -2
- package/src/{server → projects/cyberia}/object-layer.js +12 -108
- package/src/{server → projects/cyberia}/semantic-layer-generator-floor.js +1 -1
- package/src/{server → projects/cyberia}/semantic-layer-generator-resource.js +1 -1
- package/src/{server → projects/cyberia}/semantic-layer-generator-skin.js +1 -1
- package/src/{server → projects/cyberia}/semantic-layer-generator.js +2 -2
- package/src/{server → projects/cyberia}/shape-generator.js +2 -2
- package/src/{server → projects/underpost}/catalog-underpost.js +1 -2
- package/src/runtime/cyberia-client/Dockerfile +27 -61
- package/src/runtime/cyberia-client/Dockerfile.dev +20 -12
- package/src/runtime/cyberia-server/Dockerfile +21 -20
- package/src/runtime/cyberia-server/Dockerfile.dev +17 -8
- package/src/runtime/engine-cyberia/Dockerfile +143 -0
- package/src/runtime/engine-cyberia/Dockerfile.dev +143 -0
- package/src/runtime/engine-cyberia/Dockerfile.test +165 -0
- package/src/runtime/engine-cyberia/compose.env +131 -0
- package/src/runtime/engine-cyberia/docker-compose.yml +316 -0
- package/src/runtime/engine-cyberia/ipfs/configure-ipfs.sh +13 -0
- package/src/runtime/engine-cyberia/mongodb/entrypoint.sh +76 -0
- package/src/runtime/engine-cyberia/nginx.conf +87 -0
- package/src/runtime/express/Express.js +2 -2
- package/src/runtime/nginx/Nginx.js +250 -0
- package/src/server/catalog.js +9 -14
- package/src/server/conf.js +3 -6
- package/src/server/runtime-status.js +18 -1
- package/src/server/start.js +12 -2
- package/src/server.js +6 -2
- package/test/cyberia-instance-conf-defaults.test.js +140 -0
- package/test/deploy-monitor.test.js +26 -10
- package/test/shape-generator.test.js +7 -1
- package/typedoc.dd-cyberia.json +3 -1
- package/typedoc.json +3 -1
- /package/src/client/ssr/{Render.js → RootDocument.js} +0 -0
- /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 '../../
|
|
23
|
-
import { buildSwaggerUiOptions } from '../../
|
|
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';
|