underpost 3.2.22 → 3.2.30

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 (57) hide show
  1. package/.github/workflows/ghpkg.ci.yml +1 -1
  2. package/.github/workflows/gitlab.ci.yml +1 -1
  3. package/.github/workflows/npmpkg.ci.yml +1 -1
  4. package/.github/workflows/publish.ci.yml +2 -2
  5. package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -1
  6. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  7. package/CHANGELOG.md +181 -1
  8. package/CLI-HELP.md +61 -2
  9. package/README.md +3 -2
  10. package/baremetal/commission-workflows.json +1 -0
  11. package/bin/build.js +1 -0
  12. package/docker-compose.yml +224 -0
  13. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  14. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
  15. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  16. package/package.json +27 -15
  17. package/scripts/kubeadm-node-setup.sh +317 -0
  18. package/scripts/rocky-kickstart.sh +877 -185
  19. package/scripts/rpmfusion-ffmpeg-setup.sh +26 -50
  20. package/scripts/test-monitor.sh +3 -5
  21. package/src/cli/baremetal.js +717 -16
  22. package/src/cli/cluster.js +3 -1
  23. package/src/cli/deploy.js +118 -9
  24. package/src/cli/docker-compose.js +591 -0
  25. package/src/cli/env.js +11 -2
  26. package/src/cli/fs.js +35 -11
  27. package/src/cli/index.js +89 -0
  28. package/src/cli/kickstart.js +142 -20
  29. package/src/cli/repository.js +153 -11
  30. package/src/cli/run.js +285 -8
  31. package/src/cli/secrets.js +7 -2
  32. package/src/cli/ssh.js +234 -0
  33. package/src/cli/static.js +2 -2
  34. package/src/{server → client-builder}/client-build-docs.js +15 -5
  35. package/src/{server → client-builder}/client-build-live.js +3 -3
  36. package/src/{server → client-builder}/client-build.js +25 -22
  37. package/src/{server → client-builder}/client-dev-server.js +3 -3
  38. package/src/{server → client-builder}/client-icons.js +2 -2
  39. package/src/{server → client-builder}/ssr.js +5 -5
  40. package/src/client.build.js +1 -3
  41. package/src/client.dev.js +1 -1
  42. package/src/db/mongo/MongoBootstrap.js +12 -12
  43. package/src/index.js +12 -1
  44. package/src/mailer/EmailRender.js +1 -1
  45. package/src/{server → projects/underpost}/catalog-underpost.js +1 -2
  46. package/src/runtime/express/Express.js +2 -2
  47. package/src/runtime/nginx/Nginx.js +250 -0
  48. package/src/server/catalog.js +7 -14
  49. package/src/server/conf.js +3 -3
  50. package/src/server/runtime-status.js +18 -1
  51. package/src/server/start.js +12 -2
  52. package/src/server.js +6 -2
  53. package/test/deploy-monitor.test.js +26 -10
  54. package/typedoc.json +3 -1
  55. package/src/server/ipfs-client.js +0 -599
  56. /package/src/client/ssr/{Render.js → RootDocument.js} +0 -0
  57. /package/src/{server → client-builder}/client-formatted.js +0 -0
@@ -0,0 +1,224 @@
1
+ # Production-style Docker Compose stack mirroring the Kubernetes development
2
+ # environment defined under manifests/{mongodb,valkey,deployment/dd-default-development}.
3
+ #
4
+ # Mapping summary (K8s -> Compose):
5
+ # StatefulSet mongodb (replSet rs0, keyFile auth) -> mongodb + mongodb-keyfile-init + mongodb-rs-init
6
+ # StatefulSet valkey-service -> valkey-service
7
+ # Deployment dd-default-development-blue -> app
8
+ # HTTPProxy default.net / www.default.net (Contour) -> proxy (nginx reverse proxy)
9
+ # Service type LoadBalancer / NodePort -> published host ports via the proxy
10
+ # Secret mongodb-secret / mongodb-keyfile -> .env values + generated keyfile volume
11
+ # PVC mongodb-storage / volumeClaimTemplates -> named volumes
12
+
13
+ name: dd-default-development
14
+
15
+ services:
16
+ # --- MongoDB -------------------------------------------------------------
17
+ # Mirrors manifests/mongodb/statefulset.yaml: replSet rs0, keyFile cluster
18
+ # auth, --auth, bind to all interfaces. Single-node replica set for local dev.
19
+ #
20
+ # Bootstrap follows src/db/mongo/MongoBootstrap.js rather than the image's
21
+ # MONGO_INITDB_ROOT_USERNAME auto-init (whose temp server + keyFile combination
22
+ # is unreliable). The generated entrypoint (docker/mongodb/entrypoint.sh)
23
+ # generates the keyfile, starts mongod, and bootstraps the replica set + root
24
+ # user over the loopback localhost exception. The healthcheck gates readiness
25
+ # on an authenticated writable primary.
26
+ mongodb:
27
+ image: ${MONGO_IMAGE:-mongo:latest}
28
+ container_name: dd-mongodb
29
+ entrypoint: ["bash", "/docker-init/entrypoint.sh"]
30
+ environment:
31
+ MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME:?set MONGO_INITDB_ROOT_USERNAME in docker/compose.env}
32
+ MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD:?set MONGO_INITDB_ROOT_PASSWORD in docker/compose.env}
33
+ DB_REPLICA_SET: ${DB_REPLICA_SET:-rs0}
34
+ volumes:
35
+ - ./docker/mongodb:/docker-init:ro
36
+ - mongodb-keyfile:/opt/keyfile
37
+ - mongodb-data:/data/db
38
+ networks:
39
+ - dd-internal
40
+ expose:
41
+ - "27017"
42
+ ports:
43
+ - "${MONGO_HOST_PORT:-27017}:27017"
44
+ healthcheck:
45
+ test:
46
+ - CMD-SHELL
47
+ - >
48
+ mongosh --quiet -u "$$MONGO_INITDB_ROOT_USERNAME" -p "$$MONGO_INITDB_ROOT_PASSWORD"
49
+ --authenticationDatabase admin --eval "db.hello().isWritablePrimary" | grep -q true
50
+ interval: 10s
51
+ timeout: 5s
52
+ retries: 20
53
+ start_period: 60s
54
+ restart: unless-stopped
55
+
56
+ # --- Valkey --------------------------------------------------------------
57
+ # Mirrors manifests/valkey/statefulset.yaml.
58
+ valkey-service:
59
+ image: ${VALKEY_IMAGE:-valkey/valkey:latest}
60
+ container_name: dd-valkey
61
+ command: ["valkey-server", "--port", "6379", "--bind", "0.0.0.0", "--protected-mode", "no"]
62
+ volumes:
63
+ - valkey-data:/data
64
+ networks:
65
+ - dd-internal
66
+ expose:
67
+ - "6379"
68
+ # NodePort equivalent (manifests/valkey/valkey-nodeport.yaml nodePort 32079).
69
+ ports:
70
+ - "${VALKEY_NODEPORT:-32079}:6379"
71
+ healthcheck:
72
+ test: ["CMD", "valkey-cli", "-p", "6379", "ping"]
73
+ interval: 10s
74
+ timeout: 5s
75
+ retries: 10
76
+ start_period: 10s
77
+ restart: unless-stopped
78
+
79
+ # --- Application ---------------------------------------------------------
80
+ # Mirrors manifests/deployment/dd-default-development/deployment.yaml
81
+ # (dd-default-development-blue). Connection targets use Docker service
82
+ # discovery instead of hardcoded localhost.
83
+ app:
84
+ image: ${APP_IMAGE:-underpost/underpost-engine}:${APP_TAG:-v3.2.22}
85
+ container_name: dd-app
86
+ # The start command is supplied by the generated override docker/compose.app.yml
87
+ # (see `underpost docker-compose --generate --deploy-id <id>`), keeping this
88
+ # file deployment-agnostic.
89
+ environment:
90
+ NODE_ENV: ${NODE_ENV:-development}
91
+ DB_PROVIDER: ${DB_PROVIDER:-mongoose}
92
+ DB_HOST: ${DB_HOST:-mongodb://mongodb:27017}
93
+ DB_NAME: ${DB_NAME:-default}
94
+ DB_REPLICA_SET: ${DB_REPLICA_SET:-rs0}
95
+ DB_AUTH_SOURCE: ${DB_AUTH_SOURCE:-admin}
96
+ DB_USER: ${MONGO_INITDB_ROOT_USERNAME:?}
97
+ DB_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD:?}
98
+ VALKEY_HOST: ${VALKEY_HOST:-valkey-service}
99
+ VALKEY_PORT: ${VALKEY_PORT:-6379}
100
+ networks:
101
+ - dd-internal
102
+ expose:
103
+ - "4001"
104
+ - "4002"
105
+ - "4003"
106
+ - "4004"
107
+ # Direct access to the LoadBalancer-equivalent ports (manifest 4001-4004).
108
+ ports:
109
+ - "${APP_PORT_4001:-4001}:4001"
110
+ - "${APP_PORT_4002:-4002}:4002"
111
+ - "${APP_PORT_4003:-4003}:4003"
112
+ - "${APP_PORT_4004:-4004}:4004"
113
+ healthcheck:
114
+ test: ["CMD-SHELL", "timeout 2 bash -c '</dev/tcp/127.0.0.1/4001' || exit 1"]
115
+ interval: 15s
116
+ timeout: 5s
117
+ retries: 5
118
+ start_period: 60s
119
+ depends_on:
120
+ mongodb:
121
+ condition: service_healthy
122
+ valkey-service:
123
+ condition: service_healthy
124
+ restart: unless-stopped
125
+
126
+ # --- Reverse proxy / NodePort-equivalent load balancer -------------------
127
+ # Mirrors manifests/deployment/dd-default-development/proxy.yaml (Contour
128
+ # HTTPProxy) using nginx with websocket upgrade support.
129
+ proxy:
130
+ image: ${PROXY_IMAGE:-nginx:stable-alpine}
131
+ container_name: dd-proxy
132
+ volumes:
133
+ - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
134
+ networks:
135
+ - dd-internal
136
+ ports:
137
+ - "${PROXY_HTTP_PORT:-80}:80"
138
+ healthcheck:
139
+ test: ["CMD", "wget", "-q", "-O", "-", "http://127.0.0.1/healthz"]
140
+ interval: 15s
141
+ timeout: 5s
142
+ retries: 5
143
+ start_period: 10s
144
+ depends_on:
145
+ app:
146
+ condition: service_started
147
+ restart: unless-stopped
148
+
149
+ # --- Monitoring: Prometheus ----------------------------------------------
150
+ # Mirrors manifests/prometheus/deployment.yaml. Scrapes the app's /metrics
151
+ # endpoint (prom-client) over the internal network. Config is generated by
152
+ # `underpost docker-compose --generate` into docker/prometheus/prometheus.yml.
153
+ prometheus:
154
+ image: ${PROMETHEUS_IMAGE:-prom/prometheus:latest}
155
+ container_name: dd-prometheus
156
+ command:
157
+ - --config.file=/etc/prometheus/prometheus.yml
158
+ - --storage.tsdb.path=/prometheus
159
+ volumes:
160
+ - ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
161
+ - prometheus-data:/prometheus
162
+ networks:
163
+ - dd-internal
164
+ expose:
165
+ - "9090"
166
+ ports:
167
+ - "${PROMETHEUS_PORT:-9090}:9090"
168
+ healthcheck:
169
+ test: ["CMD", "wget", "-q", "-O", "-", "http://127.0.0.1:9090/-/healthy"]
170
+ interval: 15s
171
+ timeout: 5s
172
+ retries: 5
173
+ start_period: 15s
174
+ depends_on:
175
+ app:
176
+ condition: service_started
177
+ restart: unless-stopped
178
+
179
+ # --- Monitoring: Grafana -------------------------------------------------
180
+ # Mirrors manifests/grafana/deployment.yaml. Prometheus datasource is
181
+ # pre-provisioned (generated) so dashboards work out of the box.
182
+ grafana:
183
+ image: ${GRAFANA_IMAGE:-grafana/grafana:latest}
184
+ container_name: dd-grafana
185
+ environment:
186
+ GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-admin}
187
+ GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASSWORD:-admin}
188
+ GF_USERS_ALLOW_SIGN_UP: "false"
189
+ volumes:
190
+ - ./docker/grafana/provisioning:/etc/grafana/provisioning:ro
191
+ - grafana-data:/var/lib/grafana
192
+ networks:
193
+ - dd-internal
194
+ expose:
195
+ - "3000"
196
+ ports:
197
+ - "${GRAFANA_PORT:-3000}:3000"
198
+ healthcheck:
199
+ test: ["CMD", "wget", "-q", "-O", "-", "http://127.0.0.1:3000/api/health"]
200
+ interval: 15s
201
+ timeout: 5s
202
+ retries: 5
203
+ start_period: 15s
204
+ depends_on:
205
+ prometheus:
206
+ condition: service_started
207
+ restart: unless-stopped
208
+
209
+ networks:
210
+ dd-internal:
211
+ name: dd-internal
212
+ driver: bridge
213
+
214
+ volumes:
215
+ mongodb-data:
216
+ name: dd-mongodb-data
217
+ mongodb-keyfile:
218
+ name: dd-mongodb-keyfile
219
+ valkey-data:
220
+ name: dd-valkey-data
221
+ prometheus-data:
222
+ name: dd-prometheus-data
223
+ grafana-data:
224
+ name: dd-grafana-data
@@ -23,7 +23,7 @@ spec:
23
23
  spec:
24
24
  containers:
25
25
  - name: dd-cron-backup
26
- image: underpost/underpost-engine:v3.2.22
26
+ image: underpost/underpost-engine:v3.2.30
27
27
  command:
28
28
  - /bin/sh
29
29
  - -c
@@ -23,7 +23,7 @@ spec:
23
23
  spec:
24
24
  containers:
25
25
  - name: dd-cron-dns
26
- image: underpost/underpost-engine:v3.2.22
26
+ image: underpost/underpost-engine:v3.2.30
27
27
  command:
28
28
  - /bin/sh
29
29
  - -c
@@ -17,7 +17,7 @@ spec:
17
17
  spec:
18
18
  containers:
19
19
  - name: dd-default-development-blue
20
- image: underpost/underpost-engine:v3.2.22
20
+ image: underpost/underpost-engine:v3.2.30
21
21
  # resources:
22
22
  # requests:
23
23
  # memory: "124Ki"
@@ -98,7 +98,7 @@ spec:
98
98
  spec:
99
99
  containers:
100
100
  - name: dd-default-development-green
101
- image: underpost/underpost-engine:v3.2.22
101
+ image: underpost/underpost-engine:v3.2.30
102
102
  # resources:
103
103
  # requests:
104
104
  # memory: "124Ki"
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "type": "module",
3
3
  "main": "src/index.js",
4
4
  "name": "underpost",
5
- "version": "3.2.22",
5
+ "version": "3.2.30",
6
6
  "description": "Underpost Platform — end-to-end CI/CD and application-delivery toolchain CLI. Covers bare metal, Kubernetes, K3s, kubeadm, LXD, container/image orchestration, secrets, databases, cron jobs, monitoring, SSH, runners, PWA + Workbox delivery, and release orchestration. Extensible via downstream CLIs.",
7
7
  "scripts": {
8
8
  "start": "node --max-old-space-size=8192 src/server",
@@ -26,7 +26,18 @@
26
26
  "security:secrets:ci": "gitleaks detect --source . --config .gitleaks.toml --redact=1",
27
27
  "security:deps": "npm audit",
28
28
  "security": "npm run security:secrets:ci && npm run security:deps",
29
- "clean": "node bin env clean && node bin run clean"
29
+ "clean": "node bin env clean && node bin run clean",
30
+ "docker:generate": "node bin docker-compose --generate",
31
+ "docker:up": "node bin docker-compose --up",
32
+ "docker:up:build": "node bin docker-compose --up --build",
33
+ "docker:down": "node bin docker-compose --down",
34
+ "docker:down:volumes": "node bin docker-compose --down --volumes",
35
+ "docker:restart": "node bin docker-compose --restart",
36
+ "docker:build": "node bin docker-compose --build",
37
+ "docker:pull": "node bin docker-compose --pull",
38
+ "docker:logs": "node bin docker-compose --logs",
39
+ "docker:status": "node bin docker-compose --status",
40
+ "docker:shell": "node bin docker-compose --shell"
30
41
  },
31
42
  "bin": {
32
43
  "underpost": "bin/index.js"
@@ -61,13 +72,13 @@
61
72
  "homepage": "https://github.com/underpostnet/pwa-microservices-template#readme",
62
73
  "dependencies": {
63
74
  "@fortawesome/fontawesome-free": "^7.2.0",
64
- "@fullcalendar/rrule": "^6.1.20",
75
+ "@fullcalendar/rrule": "^6.1.21",
65
76
  "@grpc/grpc-js": "^1.14.4",
66
77
  "@grpc/proto-loader": "^0.8.1",
67
78
  "@neodrag/vanilla": "^2.3.1",
68
79
  "adm-zip": "^0.5.17",
69
- "ag-grid-community": "^35.3.0",
70
- "axios": "^1.16.1",
80
+ "ag-grid-community": "^35.3.1",
81
+ "axios": "^1.18.0",
71
82
  "bumpp": "^11.1.0",
72
83
  "chai": "^6.2.2",
73
84
  "clipboardy": "^5.3.1",
@@ -78,10 +89,10 @@
78
89
  "cookie-parser": "^1.4.7",
79
90
  "cors": "^2.8.6",
80
91
  "d3": "^7.9.0",
81
- "dexie": "^4.4.3",
92
+ "dexie": "^4.4.4",
82
93
  "dotenv": "^17.4.2",
83
94
  "easymde": "^2.21.0",
84
- "esbuild": "^0.28.0",
95
+ "esbuild": "^0.28.1",
85
96
  "escape-string-regexp": "^5.0.0",
86
97
  "express": "^5.2.1",
87
98
  "express-fileupload": "^1.4.3",
@@ -90,20 +101,20 @@
90
101
  "fast-json-stable-stringify": "^2.1.0",
91
102
  "favicons": "^7.3.0",
92
103
  "fs-extra": "^11.3.5",
93
- "fullcalendar": "^6.1.15",
104
+ "fullcalendar": "^6.1.21",
94
105
  "helmet": "^8.2.0",
95
106
  "html-minifier-terser": "^7.2.0",
96
- "http-proxy-middleware": "^4.0.0",
107
+ "http-proxy-middleware": "^4.1.1",
97
108
  "ignore-walk": "^9.0.0",
98
109
  "iovalkey": "^0.3.3",
99
110
  "json-colorizer": "^3.0.1",
100
111
  "jsonwebtoken": "^9.0.3",
101
- "mariadb": "^3.2.2",
112
+ "mariadb": "^3.5.3",
113
+ "marked": "^18.0.5",
102
114
  "mocha": "^11.7.6",
103
- "marked": "^18.0.4",
104
- "mongoose": "^9.6.3",
105
- "morgan": "^1.10.0",
106
- "nodemailer": "^8.0.10",
115
+ "mongoose": "^9.7.1",
116
+ "morgan": "^1.11.0",
117
+ "nodemailer": "^9.0.0",
107
118
  "nodemon": "^3.0.1",
108
119
  "peer": "^1.0.2",
109
120
  "peerjs": "^1.5.5",
@@ -145,6 +156,7 @@
145
156
  "serialize-javascript": ">=7.0.5",
146
157
  "router": {
147
158
  "path-to-regexp": ">=8.4.0"
148
- }
159
+ },
160
+ "ws": "^8.20.2"
149
161
  }
150
162
  }