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.
- 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 +34 -24
- package/.github/workflows/engine-cyberia.ci.yml +27 -5
- package/.github/workflows/ghpkg.ci.yml +89 -1
- package/.github/workflows/gitlab.ci.yml +1 -1
- package/.github/workflows/hardhat.ci.yml +1 -1
- package/.github/workflows/npmpkg.ci.yml +19 -12
- 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 +451 -1
- package/CLI-HELP.md +1040 -1130
- 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 +128 -136
- package/bin/build.template.js +25 -179
- package/bin/cyberia.js +1089 -188
- package/bin/deploy.js +6 -3
- package/bin/index.js +1089 -188
- package/bump.config.js +1 -0
- package/compose.env +131 -0
- package/conf.js +19 -1
- package/deployment.yaml +74 -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 +2 -2
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +74 -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 +34 -22
- package/pv-pvc.yaml +32 -0
- package/scripts/disk-clean.sh +85 -60
- package/scripts/kubeadm-node-setup.sh +317 -0
- package/scripts/link-local-underpost-cli.sh +6 -0
- package/scripts/rocky-kickstart.sh +877 -185
- package/scripts/rpmfusion-ffmpeg-setup.sh +26 -50
- package/scripts/test-monitor.sh +248 -0
- 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 -122
- 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 +326 -292
- package/src/cli/docker-compose.js +648 -0
- package/src/cli/env.js +12 -6
- package/src/cli/fs.js +75 -30
- package/src/cli/image.js +187 -55
- package/src/cli/index.js +157 -6
- package/src/cli/kickstart.js +142 -20
- package/src/cli/monitor.js +387 -6
- package/src/cli/release.js +72 -15
- package/src/cli/repository.js +339 -40
- package/src/cli/run.js +678 -186
- 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/core/PanelForm.js +44 -44
- 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 +92 -20
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +272 -50
- 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 +28 -12
- package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
- package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +27 -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/db/mongo/MongooseDB.js +2 -1
- 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 +6 -4
- 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/projects/underpost/catalog-underpost.js +60 -0
- package/src/runtime/cyberia-client/Dockerfile +31 -83
- package/src/runtime/cyberia-client/Dockerfile.dev +23 -30
- package/src/runtime/cyberia-server/Dockerfile +23 -42
- package/src/runtime/cyberia-server/Dockerfile.dev +20 -35
- 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/runtime/wp/Dockerfile +3 -3
- package/src/server/catalog.js +72 -0
- package/src/server/conf.js +415 -60
- package/src/server/runtime-status.js +252 -0
- package/src/server/start.js +42 -11
- package/src/server.js +6 -2
- package/test/cyberia-instance-conf-defaults.test.js +140 -0
- package/test/deploy-monitor.test.js +267 -0
- package/test/shape-generator.test.js +7 -1
- package/typedoc.dd-cyberia.json +3 -1
- package/typedoc.json +3 -1
- package/manifests/deployment/dd-test-development/deployment.yaml +0 -256
- package/manifests/deployment/dd-test-development/proxy.yaml +0 -102
- /package/src/client/ssr/{Render.js → RootDocument.js} +0 -0
- /package/src/{server → client-builder}/client-formatted.js +0 -0
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exported singleton instance of the NginxService class.
|
|
3
|
+
* Manages dynamic generation of nginx reverse-proxy router configuration used
|
|
4
|
+
* by the Docker Compose development stack. Mirrors the conventions of
|
|
5
|
+
* {@link module:src/runtime/lampp/Lampp.js LamppService}.
|
|
6
|
+
* @module src/runtime/nginx/Nginx.js
|
|
7
|
+
* @namespace NginxService
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import fs from 'fs-extra';
|
|
11
|
+
import path from 'path';
|
|
12
|
+
import { loggerFactory } from '../../server/logger.js';
|
|
13
|
+
|
|
14
|
+
const logger = loggerFactory(import.meta);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @class NginxService
|
|
18
|
+
* @description Builds nginx `server` blocks (the router) for fronting upstream
|
|
19
|
+
* application services and writes the rendered configuration to disk. The
|
|
20
|
+
* router is accumulated in memory via {@link NginxService#createApp} and
|
|
21
|
+
* flushed with {@link NginxService#writeConf}, keeping config generation
|
|
22
|
+
* decoupled from the filesystem location it is written to.
|
|
23
|
+
* @memberof NginxService
|
|
24
|
+
*/
|
|
25
|
+
class NginxService {
|
|
26
|
+
/**
|
|
27
|
+
* @type {string}
|
|
28
|
+
* @description Accumulated nginx `server { ... }` blocks (the router definition).
|
|
29
|
+
* @memberof NginxService
|
|
30
|
+
*/
|
|
31
|
+
router = '';
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @type {Set<string>}
|
|
35
|
+
* @description Upstream blocks keyed by upstream name to avoid duplicates.
|
|
36
|
+
* @memberof NginxService
|
|
37
|
+
*/
|
|
38
|
+
upstreams;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @type {boolean}
|
|
42
|
+
* @description Whether a default_server catch-all block has been emitted.
|
|
43
|
+
* @memberof NginxService
|
|
44
|
+
*/
|
|
45
|
+
hasDefaultServer;
|
|
46
|
+
|
|
47
|
+
constructor() {
|
|
48
|
+
this.reset();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Resets the in-memory router, upstreams, and default-server flag.
|
|
53
|
+
* @method reset
|
|
54
|
+
* @returns {void}
|
|
55
|
+
* @memberof NginxService
|
|
56
|
+
*/
|
|
57
|
+
reset() {
|
|
58
|
+
this.router = '';
|
|
59
|
+
this.upstreams = new Map();
|
|
60
|
+
this.hasDefaultServer = false;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Appends a raw render fragment to the router string.
|
|
65
|
+
* @method appendRouter
|
|
66
|
+
* @param {string} render - The configuration fragment to append.
|
|
67
|
+
* @returns {string} The complete, updated router configuration string.
|
|
68
|
+
* @memberof NginxService
|
|
69
|
+
*/
|
|
70
|
+
appendRouter(render) {
|
|
71
|
+
if (!this.router) return (this.router = render);
|
|
72
|
+
return (this.router += render);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Clears the in-memory router configuration.
|
|
77
|
+
* @method removeRouter
|
|
78
|
+
* @returns {void}
|
|
79
|
+
* @memberof NginxService
|
|
80
|
+
*/
|
|
81
|
+
removeRouter() {
|
|
82
|
+
this.reset();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Registers a named upstream pointing at a container service:port.
|
|
87
|
+
* Idempotent: repeated names with the same target are collapsed.
|
|
88
|
+
* @method addUpstream
|
|
89
|
+
* @param {string} name - The upstream identifier.
|
|
90
|
+
* @param {string} service - The Docker service name (resolved via service discovery).
|
|
91
|
+
* @param {number} port - The upstream container port.
|
|
92
|
+
* @returns {string} The upstream name.
|
|
93
|
+
* @memberof NginxService
|
|
94
|
+
*/
|
|
95
|
+
addUpstream(name, service, port) {
|
|
96
|
+
this.upstreams.set(name, `upstream ${name} { server ${service}:${port}; }`);
|
|
97
|
+
return name;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Renders the standard proxy directive block shared by all locations,
|
|
102
|
+
* including websocket upgrade headers and forwarded headers.
|
|
103
|
+
* @method proxyLocation
|
|
104
|
+
* @param {string} location - The location path (e.g. '/', '/peer').
|
|
105
|
+
* @param {string} upstream - The upstream name to proxy to.
|
|
106
|
+
* @returns {string} The rendered `location { ... }` block.
|
|
107
|
+
* @memberof NginxService
|
|
108
|
+
*/
|
|
109
|
+
proxyLocation(location, upstream) {
|
|
110
|
+
return `
|
|
111
|
+
location ${location} {
|
|
112
|
+
proxy_pass http://${upstream};
|
|
113
|
+
proxy_set_header Host $host;
|
|
114
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
115
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
116
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
117
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
118
|
+
proxy_set_header Connection $connection_upgrade;
|
|
119
|
+
proxy_read_timeout 3600s;
|
|
120
|
+
}
|
|
121
|
+
`;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Renders the `/healthz` location used by the proxy container healthcheck.
|
|
126
|
+
* @method healthLocation
|
|
127
|
+
* @returns {string} The rendered health-check location block.
|
|
128
|
+
* @memberof NginxService
|
|
129
|
+
*/
|
|
130
|
+
healthLocation() {
|
|
131
|
+
return `
|
|
132
|
+
location = /healthz {
|
|
133
|
+
access_log off;
|
|
134
|
+
return 200 "ok\\n";
|
|
135
|
+
add_header Content-Type text/plain;
|
|
136
|
+
}
|
|
137
|
+
`;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Creates an nginx virtual-host (`server`) entry for a host and appends it to
|
|
142
|
+
* the router. Each route maps a URL prefix to an upstream service:port with
|
|
143
|
+
* websocket support, mirroring the Contour HTTPProxy route model.
|
|
144
|
+
*
|
|
145
|
+
* @method createApp
|
|
146
|
+
* @param {object} options - Virtual host options.
|
|
147
|
+
* @param {string} options.host - The `server_name` (e.g. 'default.net').
|
|
148
|
+
* @param {number} [options.listen=80] - The listen port.
|
|
149
|
+
* @param {Array<{location: string, service: string, port: number}>} options.routes
|
|
150
|
+
* - Route table. Longer prefixes should precede '/' for correct matching.
|
|
151
|
+
* @param {boolean} [options.resetRouter] - Clear the router before appending.
|
|
152
|
+
* @returns {string} The complete, updated router configuration string.
|
|
153
|
+
* @memberof NginxService
|
|
154
|
+
*/
|
|
155
|
+
createApp({ host, listen = 80, routes = [], resetRouter = false }) {
|
|
156
|
+
if (resetRouter) this.removeRouter();
|
|
157
|
+
|
|
158
|
+
const safeHost = host.replace(/[^a-zA-Z0-9]/g, '_');
|
|
159
|
+
const locationBlocks = routes
|
|
160
|
+
.map(({ location, service, port }) => {
|
|
161
|
+
const upstreamName = this.addUpstream(`up_${safeHost}_${port}`, service, port);
|
|
162
|
+
return this.proxyLocation(location, upstreamName);
|
|
163
|
+
})
|
|
164
|
+
.join('');
|
|
165
|
+
|
|
166
|
+
this.appendRouter(`
|
|
167
|
+
server {
|
|
168
|
+
listen ${listen};
|
|
169
|
+
server_name ${host};
|
|
170
|
+
${this.healthLocation()}${locationBlocks}}
|
|
171
|
+
`);
|
|
172
|
+
|
|
173
|
+
return this.router;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Emits a `default_server` catch-all that forwards to the given upstream and
|
|
178
|
+
* answers the health probe for unmatched Host headers. Safe to call once.
|
|
179
|
+
*
|
|
180
|
+
* @method createDefaultServer
|
|
181
|
+
* @param {object} options - Default server options.
|
|
182
|
+
* @param {string} options.service - The Docker service name to fall back to.
|
|
183
|
+
* @param {number} options.port - The upstream container port.
|
|
184
|
+
* @param {number} [options.listen=80] - The listen port.
|
|
185
|
+
* @returns {string} The complete, updated router configuration string.
|
|
186
|
+
* @memberof NginxService
|
|
187
|
+
*/
|
|
188
|
+
createDefaultServer({ service, port, listen = 80 }) {
|
|
189
|
+
if (this.hasDefaultServer) return this.router;
|
|
190
|
+
this.hasDefaultServer = true;
|
|
191
|
+
const upstreamName = this.addUpstream('up_default', service, port);
|
|
192
|
+
this.appendRouter(`
|
|
193
|
+
server {
|
|
194
|
+
listen ${listen} default_server;
|
|
195
|
+
server_name _;
|
|
196
|
+
${this.healthLocation()}${this.proxyLocation('/', upstreamName)}}
|
|
197
|
+
`);
|
|
198
|
+
return this.router;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Renders the full nginx config document: the websocket connection map, all
|
|
203
|
+
* upstream blocks, the global `proxy_http_version`, and the accumulated router.
|
|
204
|
+
* @method render
|
|
205
|
+
* @returns {string} The complete nginx configuration file content.
|
|
206
|
+
* @memberof NginxService
|
|
207
|
+
*/
|
|
208
|
+
render() {
|
|
209
|
+
const upstreamBlocks = Array.from(this.upstreams.values()).join('\n');
|
|
210
|
+
return `# Generated by src/runtime/nginx/Nginx.js — do not hand-edit.
|
|
211
|
+
# Reverse proxy derived from manifests/deployment/*/proxy.yaml (Contour HTTPProxy).
|
|
212
|
+
# Upstreams resolve container services via the Docker internal network.
|
|
213
|
+
|
|
214
|
+
map $http_upgrade $connection_upgrade {
|
|
215
|
+
default upgrade;
|
|
216
|
+
'' close;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
${upstreamBlocks}
|
|
220
|
+
|
|
221
|
+
proxy_http_version 1.1;
|
|
222
|
+
${this.router}`;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Writes the rendered configuration to the given path, creating parent
|
|
227
|
+
* directories as needed. Idempotent and safe to rerun.
|
|
228
|
+
* @method writeConf
|
|
229
|
+
* @param {string} confPath - Absolute or relative destination path.
|
|
230
|
+
* @returns {string} The path written.
|
|
231
|
+
* @memberof NginxService
|
|
232
|
+
*/
|
|
233
|
+
writeConf(confPath) {
|
|
234
|
+
const target = path.resolve(confPath);
|
|
235
|
+
fs.mkdirpSync(path.dirname(target));
|
|
236
|
+
fs.writeFileSync(target, this.render(), 'utf8');
|
|
237
|
+
logger.info(`nginx config written`, { path: target, upstreams: this.upstreams.size });
|
|
238
|
+
return target;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* @description Exported singleton instance of the NginxService class.
|
|
244
|
+
* @type {NginxService}
|
|
245
|
+
* @memberof NginxService
|
|
246
|
+
*/
|
|
247
|
+
const Nginx = new NginxService();
|
|
248
|
+
|
|
249
|
+
export { Nginx, NginxService };
|
|
250
|
+
export default Nginx;
|
|
@@ -3,7 +3,7 @@ FROM rockylinux:9
|
|
|
3
3
|
# System packages
|
|
4
4
|
RUN dnf -y update && \
|
|
5
5
|
dnf -y install epel-release && \
|
|
6
|
-
dnf -y install --allowerasing \
|
|
6
|
+
dnf -y install --allowerasing --nobest \
|
|
7
7
|
bzip2 \
|
|
8
8
|
sudo \
|
|
9
9
|
curl \
|
|
@@ -20,8 +20,8 @@ RUN dnf -y update && \
|
|
|
20
20
|
perl && \
|
|
21
21
|
dnf clean all
|
|
22
22
|
|
|
23
|
-
# Download and install XAMPP (PHP 8.2)
|
|
24
|
-
RUN curl -L -o /tmp/xampp-linux-installer.run "https://sourceforge.net/projects/xampp/files/XAMPP%20Linux/8.2.12/xampp-linux-x64-8.2.12-0-installer.run" && \
|
|
23
|
+
# Download and install XAMPP (PHP 8.2) with retry logic for flaky SourceForge transfers
|
|
24
|
+
RUN curl -L --retry 5 --retry-delay 10 --retry-max-time 180 -o /tmp/xampp-linux-installer.run "https://sourceforge.net/projects/xampp/files/XAMPP%20Linux/8.2.12/xampp-linux-x64-8.2.12-0-installer.run" && \
|
|
25
25
|
chmod +x /tmp/xampp-linux-installer.run && \
|
|
26
26
|
bash -c "/tmp/xampp-linux-installer.run --mode unattended" && \
|
|
27
27
|
ln -sf /opt/lampp/lampp /usr/bin/lampp
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic product-catalog resolver.
|
|
3
|
+
*
|
|
4
|
+
* Product catalogs (`catalog-<suffix>.js`, e.g. `catalog-cyberia`, `catalog-prototype`)
|
|
5
|
+
* are loaded lazily by deploy id via ES dynamic `import()` so the base build
|
|
6
|
+
* (`bin/build`) and template assembly (`bin/build.template`) never statically
|
|
7
|
+
* depend on any product module. Removing a product catalog simply makes its
|
|
8
|
+
* deploy id resolve to the empty catalog — nothing else breaks.
|
|
9
|
+
*
|
|
10
|
+
* Each product catalog default-exports the uniform shape documented in
|
|
11
|
+
* {@link module:src/server/catalog-cyberia}.
|
|
12
|
+
*
|
|
13
|
+
* @module src/server/catalog.js
|
|
14
|
+
* @namespace Catalog
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import fs from 'fs-extra';
|
|
18
|
+
import { fileURLToPath } from 'node:url';
|
|
19
|
+
import * as path from 'node:path';
|
|
20
|
+
|
|
21
|
+
/** Empty product catalog returned for deploy ids without a dedicated module. */
|
|
22
|
+
const EMPTY_CATALOG = {
|
|
23
|
+
sourceMoves: [],
|
|
24
|
+
privateConfPaths: [],
|
|
25
|
+
templatePaths: [],
|
|
26
|
+
stripPaths: [],
|
|
27
|
+
moves: [],
|
|
28
|
+
copies: [],
|
|
29
|
+
keywords: [],
|
|
30
|
+
description: '',
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Loads a single deploy id's product catalog. The suffix after `dd-` selects the
|
|
35
|
+
* module (`dd-cyberia` → `catalog-cyberia.js`). Returns {@link EMPTY_CATALOG} when
|
|
36
|
+
* the deploy id has no dedicated catalog or the module cannot be loaded.
|
|
37
|
+
*
|
|
38
|
+
* @method loadDeployCatalog
|
|
39
|
+
* @param {string} deployId - A concrete deploy id (e.g. `dd-cyberia`).
|
|
40
|
+
* @returns {Promise<object>} The product catalog (uniform shape).
|
|
41
|
+
* @memberof Catalog
|
|
42
|
+
*/
|
|
43
|
+
const loadDeployCatalog = async (deployId) => {
|
|
44
|
+
const suffix = (deployId ?? '').split('dd-')[1];
|
|
45
|
+
if (!suffix) return EMPTY_CATALOG;
|
|
46
|
+
if (fs.existsSync(`./src/projects/${suffix}/catalog-${suffix}.js`)) {
|
|
47
|
+
const mod = await import(`../projects/${suffix}/catalog-${suffix}.js`);
|
|
48
|
+
return { ...EMPTY_CATALOG, ...(mod.default ?? {}) };
|
|
49
|
+
}
|
|
50
|
+
return EMPTY_CATALOG;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Loads every product catalog present alongside this module (`catalog-*.js`,
|
|
55
|
+
* excluding the base `catalog-underpost` and this resolver). Used to aggregate
|
|
56
|
+
* product `stripPaths` for the base template without naming any product.
|
|
57
|
+
*
|
|
58
|
+
* @method loadProductCatalogs
|
|
59
|
+
* @returns {Promise<object[]>} Loaded product catalogs (uniform shape).
|
|
60
|
+
* @memberof Catalog
|
|
61
|
+
*/
|
|
62
|
+
const loadProductCatalogs = async () => {
|
|
63
|
+
const catalogs = [];
|
|
64
|
+
for (const file of await fs.readdir('./src/projects')) {
|
|
65
|
+
if (file === 'underpost') continue;
|
|
66
|
+
const mod = await import(`../projects/${file}/catalog-${file}.js`);
|
|
67
|
+
if (mod.default) catalogs.push({ ...EMPTY_CATALOG, ...mod.default });
|
|
68
|
+
}
|
|
69
|
+
return catalogs;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export { loadDeployCatalog, loadProductCatalogs, EMPTY_CATALOG };
|