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.
- package/.github/workflows/ghpkg.ci.yml +1 -1
- package/.github/workflows/gitlab.ci.yml +1 -1
- package/.github/workflows/npmpkg.ci.yml +1 -1
- package/.github/workflows/publish.ci.yml +2 -2
- package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -1
- package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
- package/CHANGELOG.md +181 -1
- package/CLI-HELP.md +61 -2
- package/README.md +3 -2
- package/baremetal/commission-workflows.json +1 -0
- package/bin/build.js +1 -0
- package/docker-compose.yml +224 -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-default-development/deployment.yaml +2 -2
- package/package.json +27 -15
- 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/cli/baremetal.js +717 -16
- package/src/cli/cluster.js +3 -1
- package/src/cli/deploy.js +118 -9
- package/src/cli/docker-compose.js +591 -0
- package/src/cli/env.js +11 -2
- package/src/cli/fs.js +35 -11
- package/src/cli/index.js +89 -0
- package/src/cli/kickstart.js +142 -20
- package/src/cli/repository.js +153 -11
- package/src/cli/run.js +285 -8
- package/src/cli/secrets.js +7 -2
- package/src/cli/ssh.js +234 -0
- package/src/cli/static.js +2 -2
- 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/index.js +12 -1
- package/src/mailer/EmailRender.js +1 -1
- package/src/{server → projects/underpost}/catalog-underpost.js +1 -2
- package/src/runtime/express/Express.js +2 -2
- package/src/runtime/nginx/Nginx.js +250 -0
- package/src/server/catalog.js +7 -14
- package/src/server/conf.js +3 -3
- package/src/server/runtime-status.js +18 -1
- package/src/server/start.js +12 -2
- package/src/server.js +6 -2
- package/test/deploy-monitor.test.js +26 -10
- package/typedoc.json +3 -1
- package/src/server/ipfs-client.js +0 -599
- /package/src/client/ssr/{Render.js → RootDocument.js} +0 -0
- /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
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
70
|
-
"axios": "^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.
|
|
92
|
+
"dexie": "^4.4.4",
|
|
82
93
|
"dotenv": "^17.4.2",
|
|
83
94
|
"easymde": "^2.21.0",
|
|
84
|
-
"esbuild": "^0.28.
|
|
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.
|
|
104
|
+
"fullcalendar": "^6.1.21",
|
|
94
105
|
"helmet": "^8.2.0",
|
|
95
106
|
"html-minifier-terser": "^7.2.0",
|
|
96
|
-
"http-proxy-middleware": "^4.
|
|
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.
|
|
112
|
+
"mariadb": "^3.5.3",
|
|
113
|
+
"marked": "^18.0.5",
|
|
102
114
|
"mocha": "^11.7.6",
|
|
103
|
-
"
|
|
104
|
-
"
|
|
105
|
-
"
|
|
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
|
}
|