@underpostnet/underpost 2.8.0 → 2.8.4
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/.dockerignore +1 -0
- package/.github/workflows/ghpkg.yml +14 -11
- package/.github/workflows/pwa-microservices-template.page.yml +10 -3
- package/.vscode/extensions.json +17 -71
- package/.vscode/settings.json +12 -5
- package/AUTHORS.md +16 -5
- package/CHANGELOG.md +63 -3
- package/Dockerfile +41 -62
- package/README.md +1 -28
- package/bin/build.js +278 -0
- package/bin/db.js +2 -24
- package/bin/deploy.js +107 -71
- package/bin/file.js +33 -4
- package/bin/index.js +35 -54
- package/bin/ssl.js +19 -11
- package/bin/util.js +27 -89
- package/bin/vs.js +25 -2
- package/conf.js +32 -132
- package/docker-compose.yml +1 -1
- package/manifests/core/kustomization.yaml +11 -0
- package/manifests/core/underpost-engine-backup-access.yaml +16 -0
- package/manifests/core/underpost-engine-backup-pv-pvc.yaml +22 -0
- package/manifests/core/underpost-engine-headless-service.yaml +10 -0
- package/manifests/core/underpost-engine-mongodb-backup-cronjob.yaml +40 -0
- package/manifests/core/underpost-engine-mongodb-configmap.yaml +26 -0
- package/manifests/core/underpost-engine-pv-pvc.yaml +23 -0
- package/manifests/core/underpost-engine-statefulset.yaml +91 -0
- package/manifests/deployment/mongo-express.yaml +60 -0
- package/manifests/deployment/phpmyadmin.yaml +54 -0
- package/manifests/kind-config.yaml +12 -0
- package/manifests/letsencrypt-prod.yaml +15 -0
- package/manifests/mariadb/config.yaml +10 -0
- package/manifests/mariadb/kustomization.yaml +9 -0
- package/manifests/mariadb/pv.yaml +12 -0
- package/manifests/mariadb/pvc.yaml +10 -0
- package/manifests/mariadb/secret.yaml +8 -0
- package/manifests/mariadb/service.yaml +10 -0
- package/manifests/mariadb/statefulset.yaml +55 -0
- package/manifests/valkey/kustomization.yaml +7 -0
- package/manifests/valkey/underpost-engine-valkey-service.yaml +17 -0
- package/manifests/valkey/underpost-engine-valkey-statefulset.yaml +39 -0
- package/package.json +16 -35
- package/src/api/user/user.model.js +16 -3
- package/src/api/user/user.service.js +1 -1
- package/src/client/components/core/Account.js +4 -2
- package/src/client/components/core/Auth.js +2 -2
- package/src/client/components/core/CalendarCore.js +115 -49
- package/src/client/components/core/CommonJs.js +150 -19
- package/src/client/components/core/Css.js +1 -1
- package/src/client/components/core/CssCore.js +6 -0
- package/src/client/components/core/Docs.js +2 -1
- package/src/client/components/core/DropDown.js +5 -1
- package/src/client/components/core/Input.js +17 -3
- package/src/client/components/core/JoyStick.js +8 -5
- package/src/client/components/core/Modal.js +17 -11
- package/src/client/components/core/Panel.js +85 -25
- package/src/client/components/core/PanelForm.js +11 -19
- package/src/client/components/core/SignUp.js +4 -1
- package/src/client/components/core/Translate.js +57 -9
- package/src/client/components/core/Validator.js +9 -1
- package/src/client/public/default/plantuml/client-conf.svg +1 -1
- package/src/client/public/default/plantuml/server-conf.svg +1 -1
- package/src/client/public/default/plantuml/server-schema.svg +1 -1
- package/src/client/public/default/plantuml/ssr-conf.svg +1 -1
- package/src/client/public/default/plantuml/ssr-schema.svg +1 -1
- package/src/client/services/core/core.service.js +2 -0
- package/src/client/services/default/default.management.js +4 -2
- package/src/client/ssr/body/CacheControl.js +2 -1
- package/src/client/ssr/body/DefaultSplashScreen.js +3 -3
- package/src/client/ssr/offline/Maintenance.js +63 -0
- package/src/client/sw/default.sw.js +23 -3
- package/src/db/mongo/MongooseDB.js +13 -1
- package/src/index.js +15 -0
- package/src/runtime/lampp/Lampp.js +1 -13
- package/src/runtime/xampp/Xampp.js +0 -13
- package/src/server/auth.js +3 -3
- package/src/server/client-build.js +8 -17
- package/src/server/client-icons.js +1 -1
- package/src/server/conf.js +299 -32
- package/src/server/dns.js +2 -3
- package/src/server/logger.js +18 -11
- package/src/server/network.js +0 -36
- package/src/server/process.js +25 -2
- package/src/server/project.js +39 -0
- package/src/server/proxy.js +4 -26
- package/src/server/runtime.js +6 -7
- package/src/server/ssl.js +1 -1
- package/src/server/valkey.js +3 -0
- package/startup.cjs +12 -0
- package/src/server/prompt-optimizer.js +0 -28
- package/startup.js +0 -11
package/bin/build.js
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import { loggerFactory } from '../src/server/logger.js';
|
|
3
|
+
import { shellExec } from '../src/server/process.js';
|
|
4
|
+
import dotenv from 'dotenv';
|
|
5
|
+
import { getCapVariableName } from '../src/client/components/core/CommonJs.js';
|
|
6
|
+
import { buildProxyRouter, buildPortProxyRouter, Config, getPathsSSR, buildKindPorts } from '../src/server/conf.js';
|
|
7
|
+
|
|
8
|
+
const baseConfPath = './engine-private/conf/dd-cron/.env.production';
|
|
9
|
+
if (fs.existsSync(baseConfPath)) dotenv.config({ path: baseConfPath, override: true });
|
|
10
|
+
|
|
11
|
+
const logger = loggerFactory(import.meta);
|
|
12
|
+
|
|
13
|
+
// (async () => {
|
|
14
|
+
// return;
|
|
15
|
+
// const files = await fs.readdir(`./src`);
|
|
16
|
+
// for (const relativePath of files) {
|
|
17
|
+
// }
|
|
18
|
+
// })();
|
|
19
|
+
|
|
20
|
+
const confName = process.argv[2];
|
|
21
|
+
const basePath = '../pwa-microservices-template';
|
|
22
|
+
const repoName = `engine-${confName.split('dd-')[1]}-private`;
|
|
23
|
+
const repoNameBackUp = `engine-${confName.split('dd-')[1]}-cron-backups`;
|
|
24
|
+
const gitUrl = `https://${process.env.GITHUB_TOKEN}@github.com/underpostnet/${repoName}.git`;
|
|
25
|
+
const gitBackUpUrl = `https://${process.env.GITHUB_TOKEN}@github.com/underpostnet/${repoNameBackUp}.git`;
|
|
26
|
+
|
|
27
|
+
logger.info('', {
|
|
28
|
+
confName,
|
|
29
|
+
// gitUrl,
|
|
30
|
+
repoName,
|
|
31
|
+
repoNameBackUp,
|
|
32
|
+
basePath,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
if (process.argv.includes('info')) process.exit(0);
|
|
36
|
+
|
|
37
|
+
if (process.argv.includes('proxy')) {
|
|
38
|
+
const env = process.argv.includes('development') ? 'development' : 'production';
|
|
39
|
+
process.env.NODE_ENV = env;
|
|
40
|
+
process.env.PORT = process.env.NODE_ENV === 'development' ? 4000 : 3000;
|
|
41
|
+
process.argv[2] = 'proxy';
|
|
42
|
+
process.argv[3] = fs.readFileSync('./engine-private/deploy/dd-router', 'utf8').trim();
|
|
43
|
+
|
|
44
|
+
await Config.build();
|
|
45
|
+
process.env.NODE_ENV = 'production';
|
|
46
|
+
const router = buildPortProxyRouter(443, buildProxyRouter());
|
|
47
|
+
const confServer = JSON.parse(fs.readFileSync(`./engine-private/conf/${confName}/conf.server.json`, 'utf8'));
|
|
48
|
+
const confHosts = Object.keys(confServer);
|
|
49
|
+
|
|
50
|
+
for (const host of Object.keys(router)) {
|
|
51
|
+
if (!confHosts.find((_host) => host.match(_host))) {
|
|
52
|
+
delete router[host];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const ports = Object.values(router).map((p) => p.split(':')[2]);
|
|
57
|
+
|
|
58
|
+
const fromPort = ports[0];
|
|
59
|
+
const toPort = ports[ports.length - 1];
|
|
60
|
+
|
|
61
|
+
logger.info('port range', { fromPort, toPort, router });
|
|
62
|
+
|
|
63
|
+
const deploymentYamlFilePath = `./engine-private/conf/${confName}/build/${env}/deployment.yaml`;
|
|
64
|
+
|
|
65
|
+
const deploymentYamlParts = fs.readFileSync(deploymentYamlFilePath, 'utf8').split('ports:');
|
|
66
|
+
deploymentYamlParts[1] =
|
|
67
|
+
buildKindPorts(fromPort, toPort) +
|
|
68
|
+
` type: LoadBalancer
|
|
69
|
+
`;
|
|
70
|
+
|
|
71
|
+
fs.writeFileSync(
|
|
72
|
+
deploymentYamlFilePath,
|
|
73
|
+
deploymentYamlParts.join(`ports:
|
|
74
|
+
`),
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
let proxyYaml = '';
|
|
78
|
+
let secretYaml = '';
|
|
79
|
+
|
|
80
|
+
for (const host of Object.keys(confServer)) {
|
|
81
|
+
if (env === 'production')
|
|
82
|
+
secretYaml += `
|
|
83
|
+
---
|
|
84
|
+
apiVersion: cert-manager.io/v1
|
|
85
|
+
kind: Certificate
|
|
86
|
+
metadata:
|
|
87
|
+
name: ${host}
|
|
88
|
+
spec:
|
|
89
|
+
commonName: ${host}
|
|
90
|
+
dnsNames:
|
|
91
|
+
- ${host}
|
|
92
|
+
issuerRef:
|
|
93
|
+
name: letsencrypt-prod
|
|
94
|
+
kind: ClusterIssuer
|
|
95
|
+
secretName: ${host}`;
|
|
96
|
+
|
|
97
|
+
const pathPortConditions = [];
|
|
98
|
+
for (const path of Object.keys(confServer[host])) {
|
|
99
|
+
const { peer } = confServer[host][path];
|
|
100
|
+
const port = parseInt(router[`${host}${path === '/' ? '' : path}`].split(':')[2]);
|
|
101
|
+
// logger.info('', { host, port, path });
|
|
102
|
+
pathPortConditions.push({
|
|
103
|
+
port,
|
|
104
|
+
path,
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
if (peer) {
|
|
108
|
+
// logger.info('', { host, port: port + 1, path: '/peer' });
|
|
109
|
+
pathPortConditions.push({
|
|
110
|
+
port: port + 1,
|
|
111
|
+
path: '/peer',
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// logger.info('', { host, pathPortConditions });
|
|
116
|
+
proxyYaml += `
|
|
117
|
+
---
|
|
118
|
+
apiVersion: projectcontour.io/v1
|
|
119
|
+
kind: HTTPProxy
|
|
120
|
+
metadata:
|
|
121
|
+
name: ${host}
|
|
122
|
+
spec:
|
|
123
|
+
virtualhost:
|
|
124
|
+
fqdn: ${host}${
|
|
125
|
+
env === 'development'
|
|
126
|
+
? ''
|
|
127
|
+
: `
|
|
128
|
+
tls:
|
|
129
|
+
secretName: ${host}`
|
|
130
|
+
}
|
|
131
|
+
routes:`;
|
|
132
|
+
for (const conditionObj of pathPortConditions) {
|
|
133
|
+
const { path, port } = conditionObj;
|
|
134
|
+
proxyYaml += `
|
|
135
|
+
- conditions:
|
|
136
|
+
- prefix: ${path}
|
|
137
|
+
enableWebsockets: true
|
|
138
|
+
services:
|
|
139
|
+
- name: ${confName}-${env}-service
|
|
140
|
+
port: ${port}`;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
const yamlPath = `./engine-private/conf/${confName}/build/${env}/proxy.yaml`;
|
|
144
|
+
fs.writeFileSync(yamlPath, proxyYaml, 'utf8');
|
|
145
|
+
if (env === 'production') {
|
|
146
|
+
const yamlPath = `./engine-private/conf/${confName}/build/${env}/secret.yaml`;
|
|
147
|
+
fs.writeFileSync(yamlPath, secretYaml, 'utf8');
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
process.exit(0);
|
|
151
|
+
}
|
|
152
|
+
if (process.argv.includes('conf')) {
|
|
153
|
+
if (!fs.existsSync(`../${repoName}`)) {
|
|
154
|
+
shellExec(`cd .. && git clone ${gitUrl}`, { silent: true });
|
|
155
|
+
} else {
|
|
156
|
+
shellExec(`cd ../${repoName} && git pull`);
|
|
157
|
+
}
|
|
158
|
+
const toPath = `../${repoName}/conf/${confName}`;
|
|
159
|
+
fs.removeSync(toPath);
|
|
160
|
+
fs.mkdirSync(toPath, { recursive: true });
|
|
161
|
+
fs.copySync(`./engine-private/conf/${confName}`, toPath);
|
|
162
|
+
shellExec(
|
|
163
|
+
`cd ../${repoName}` +
|
|
164
|
+
` && git add .` +
|
|
165
|
+
` && git commit -m "ci(engine-core-conf): ⚙️ Update ${confName} conf"` +
|
|
166
|
+
` && git push`,
|
|
167
|
+
);
|
|
168
|
+
process.exit(0);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (process.argv.includes('cron-backups')) {
|
|
172
|
+
if (!fs.existsSync(`../${repoNameBackUp}`)) {
|
|
173
|
+
shellExec(`cd .. && git clone ${gitBackUpUrl}`, { silent: true });
|
|
174
|
+
} else {
|
|
175
|
+
shellExec(`cd ../${repoNameBackUp} && git pull`);
|
|
176
|
+
}
|
|
177
|
+
const serverConf = JSON.parse(fs.readFileSync(`./engine-private/conf/${confName}/conf.server.json`, 'utf8'));
|
|
178
|
+
for (const host of Object.keys(serverConf)) {
|
|
179
|
+
for (let path of Object.keys(serverConf[host])) {
|
|
180
|
+
path = path.replaceAll('/', '-');
|
|
181
|
+
const toPath = `../${repoNameBackUp}/${host}${path}`;
|
|
182
|
+
const fromPath = `./engine-private/cron-backups/${host}${path}`;
|
|
183
|
+
if (fs.existsSync(fromPath)) {
|
|
184
|
+
if (fs.existsSync(toPath)) fs.removeSync(toPath);
|
|
185
|
+
logger.info('Build', { fromPath, toPath });
|
|
186
|
+
fs.copySync(fromPath, toPath);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
shellExec(
|
|
191
|
+
`cd ../${repoNameBackUp}` +
|
|
192
|
+
` && git add .` +
|
|
193
|
+
` && git commit -m "ci(engine-core-cron-backups): ⚙️ Update ${confName} cron backups"` +
|
|
194
|
+
` && git push`,
|
|
195
|
+
);
|
|
196
|
+
process.exit(0);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (process.argv.includes('test')) {
|
|
200
|
+
fs.mkdirSync(`${basePath}/engine-private/conf`, { recursive: true });
|
|
201
|
+
fs.copySync(`./engine-private/conf/${confName}`, `${basePath}/engine-private/conf/${confName}`);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const { DefaultConf } = await import(`../conf.${confName}.js`);
|
|
205
|
+
|
|
206
|
+
{
|
|
207
|
+
for (const host of Object.keys(DefaultConf.server)) {
|
|
208
|
+
for (const path of Object.keys(DefaultConf.server[host])) {
|
|
209
|
+
const { apis, ws } = DefaultConf.server[host][path];
|
|
210
|
+
if (apis)
|
|
211
|
+
for (const api of apis) {
|
|
212
|
+
{
|
|
213
|
+
const originPath = `./src/api/${api}`;
|
|
214
|
+
logger.info(`Build`, originPath);
|
|
215
|
+
fs.copySync(originPath, `${basePath}/src/api/${api}`);
|
|
216
|
+
}
|
|
217
|
+
{
|
|
218
|
+
const originPath = `./src/client/services/${api}`;
|
|
219
|
+
logger.info(`Build`, originPath);
|
|
220
|
+
fs.copySync(originPath, `${basePath}/src/client/services/${api}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if (ws && ws !== 'core' && ws !== 'default') {
|
|
225
|
+
fs.copySync(`./src/ws/${ws}`, `${basePath}/src/ws/${ws}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
{
|
|
232
|
+
for (const client of Object.keys(DefaultConf.client)) {
|
|
233
|
+
const capName = getCapVariableName(client);
|
|
234
|
+
for (const component of Object.keys(DefaultConf.client[client].components)) {
|
|
235
|
+
const originPath = `./src/client/components/${component}`;
|
|
236
|
+
if (fs.existsSync(originPath)) {
|
|
237
|
+
logger.info(`Build`, originPath);
|
|
238
|
+
fs.copySync(originPath, `${basePath}/src/client/components/${component}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
{
|
|
242
|
+
const originPath = `./src/client/${capName}.index.js`;
|
|
243
|
+
if (fs.existsSync(originPath)) {
|
|
244
|
+
logger.info(`Build`, originPath);
|
|
245
|
+
fs.copyFileSync(originPath, `${basePath}/src/client/${capName}.index.js`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
{
|
|
249
|
+
const originPath = `./src/client/public/${client}`;
|
|
250
|
+
if (fs.existsSync(originPath)) {
|
|
251
|
+
logger.info(`Build`, originPath);
|
|
252
|
+
fs.copySync(originPath, `${basePath}/src/client/public/${client}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
{
|
|
259
|
+
for (const client of Object.keys(DefaultConf.ssr)) {
|
|
260
|
+
const ssrPaths = getPathsSSR(DefaultConf.ssr[client]);
|
|
261
|
+
for (const originPath of ssrPaths) {
|
|
262
|
+
if (fs.existsSync(originPath)) {
|
|
263
|
+
logger.info(`Build`, originPath);
|
|
264
|
+
fs.copySync(originPath, `${basePath}/${originPath}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
fs.copyFileSync(`./conf.${confName}.js`, `${basePath}/conf.js`);
|
|
270
|
+
fs.copyFileSync(
|
|
271
|
+
`./.github/workflows/engine.${confName.split('dd-')[1]}.ci.yml`,
|
|
272
|
+
`${basePath}/.github/workflows/engine.${confName.split('dd-')[1]}.ci.yml`,
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
const packageJson = JSON.parse(fs.readFileSync(`${basePath}/package.json`, 'utf8'));
|
|
276
|
+
packageJson.name = repoName;
|
|
277
|
+
fs.writeFileSync(`${basePath}/package.json`, JSON.stringify(packageJson, null, 4), 'utf8');
|
|
278
|
+
}
|
package/bin/db.js
CHANGED
|
@@ -4,10 +4,9 @@ import { loggerFactory } from '../src/server/logger.js';
|
|
|
4
4
|
import { MariaDB } from '../src/db/mariadb/MariaDB.js';
|
|
5
5
|
import { Xampp } from '../src/runtime/xampp/Xampp.js';
|
|
6
6
|
import { Lampp } from '../src/runtime/lampp/Lampp.js';
|
|
7
|
-
import { getCapVariableName, getRestoreCronCmd, loadConf } from '../src/server/conf.js';
|
|
7
|
+
import { getCapVariableName, getRestoreCronCmd, loadConf, splitFileFactory } from '../src/server/conf.js';
|
|
8
8
|
import { DataBaseProvider } from '../src/db/DataBaseProvider.js';
|
|
9
9
|
import { hashPassword } from '../src/server/auth.js';
|
|
10
|
-
import splitFile from 'split-file';
|
|
11
10
|
|
|
12
11
|
const logger = loggerFactory(import.meta);
|
|
13
12
|
|
|
@@ -101,28 +100,7 @@ try {
|
|
|
101
100
|
|
|
102
101
|
cmd = `mysqldump -u ${user} -p${password} ${name} > ${cmdBackupPath}`;
|
|
103
102
|
shellExec(cmd);
|
|
104
|
-
|
|
105
|
-
const maxSizeInBytes = 1024 * 1024 * 50; // 50 mb
|
|
106
|
-
const fileSizeInBytes = stats.size;
|
|
107
|
-
if (fileSizeInBytes > maxSizeInBytes) {
|
|
108
|
-
await new Promise((resolve) => {
|
|
109
|
-
splitFile
|
|
110
|
-
.splitFileBySize(cmdBackupPath, maxSizeInBytes) // 50 mb
|
|
111
|
-
.then((names) => {
|
|
112
|
-
fs.writeFileSync(
|
|
113
|
-
`${cmdBackupPath.split('/').slice(0, -1).join('/')}/${name}-parths.json`,
|
|
114
|
-
JSON.stringify(names, null, 4),
|
|
115
|
-
'utf8',
|
|
116
|
-
);
|
|
117
|
-
resolve();
|
|
118
|
-
})
|
|
119
|
-
.catch((err) => {
|
|
120
|
-
console.log('Error: ', err);
|
|
121
|
-
resolve();
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
fs.removeSync(cmdBackupPath);
|
|
125
|
-
}
|
|
103
|
+
await splitFileFactory(name, cmdBackupPath);
|
|
126
104
|
}
|
|
127
105
|
break;
|
|
128
106
|
case 'import':
|
package/bin/deploy.js
CHANGED
|
@@ -4,7 +4,7 @@ import axios from 'axios';
|
|
|
4
4
|
import dotenv from 'dotenv';
|
|
5
5
|
import plantuml from 'plantuml';
|
|
6
6
|
|
|
7
|
-
import { shellCd, shellExec } from '../src/server/process.js';
|
|
7
|
+
import { pbcopy, shellCd, shellExec } from '../src/server/process.js';
|
|
8
8
|
import { loggerFactory } from '../src/server/logger.js';
|
|
9
9
|
import {
|
|
10
10
|
Config,
|
|
@@ -29,7 +29,6 @@ import {
|
|
|
29
29
|
} from '../src/server/conf.js';
|
|
30
30
|
import { buildClient } from '../src/server/client-build.js';
|
|
31
31
|
import { range, setPad, timer, uniqueArray } from '../src/client/components/core/CommonJs.js';
|
|
32
|
-
import simpleGit from 'simple-git';
|
|
33
32
|
import { MongooseDB } from '../src/db/mongo/MongooseDB.js';
|
|
34
33
|
import { Lampp } from '../src/runtime/lampp/Lampp.js';
|
|
35
34
|
import { DefaultConf } from '../conf.js';
|
|
@@ -139,8 +138,7 @@ try {
|
|
|
139
138
|
}
|
|
140
139
|
break;
|
|
141
140
|
case 'conf': {
|
|
142
|
-
loadConf(process.argv[3]);
|
|
143
|
-
if (process.argv[4]) fs.writeFileSync(`.env`, fs.readFileSync(`.env.${process.argv[4]}`, 'utf8'), 'utf8');
|
|
141
|
+
loadConf(process.argv[3], process.argv[4]);
|
|
144
142
|
break;
|
|
145
143
|
}
|
|
146
144
|
case 'run':
|
|
@@ -307,7 +305,7 @@ try {
|
|
|
307
305
|
}
|
|
308
306
|
|
|
309
307
|
case 'adminer': {
|
|
310
|
-
const directory = '/dd/engine/public/adminer';
|
|
308
|
+
const directory = '/home/dd/engine/public/adminer';
|
|
311
309
|
// const host = '127.0.0.1';
|
|
312
310
|
const host = 'localhost';
|
|
313
311
|
const port = 80;
|
|
@@ -337,7 +335,7 @@ try {
|
|
|
337
335
|
|
|
338
336
|
case 'pma':
|
|
339
337
|
{
|
|
340
|
-
const directory = '/dd/engine/public/phpmyadmin';
|
|
338
|
+
const directory = '/home/dd/engine/public/phpmyadmin';
|
|
341
339
|
// const host = '127.0.0.1';
|
|
342
340
|
const host = 'localhost';
|
|
343
341
|
const port = 80;
|
|
@@ -454,14 +452,16 @@ try {
|
|
|
454
452
|
}
|
|
455
453
|
break;
|
|
456
454
|
|
|
457
|
-
case 'update-
|
|
455
|
+
case 'update-dependencies':
|
|
458
456
|
const files = await fs.readdir(`./engine-private/conf`, { recursive: true });
|
|
459
457
|
const originPackage = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
|
|
460
458
|
for (const relativePath of files) {
|
|
461
459
|
const filePah = `./engine-private/conf/${relativePath.replaceAll(`\\`, '/')}`;
|
|
462
460
|
if (filePah.split('/').pop() === 'package.json') {
|
|
463
|
-
|
|
464
|
-
|
|
461
|
+
const deployPackage = JSON.parse(fs.readFileSync(filePah), 'utf8');
|
|
462
|
+
deployPackage.dependencies = originPackage.dependencies;
|
|
463
|
+
deployPackage.devDependencies = originPackage.devDependencies;
|
|
464
|
+
fs.writeFileSync(filePah, JSON.stringify(deployPackage, null, 4), 'utf8');
|
|
465
465
|
}
|
|
466
466
|
}
|
|
467
467
|
break;
|
|
@@ -731,6 +731,16 @@ try {
|
|
|
731
731
|
originPackage.version = newVersion;
|
|
732
732
|
fs.writeFileSync(filePah, JSON.stringify(originPackage, null, 4), 'utf8');
|
|
733
733
|
}
|
|
734
|
+
if (filePah.split('/').pop() === 'deployment.yaml') {
|
|
735
|
+
fs.writeFileSync(
|
|
736
|
+
filePah,
|
|
737
|
+
fs
|
|
738
|
+
.readFileSync(filePah, 'utf8')
|
|
739
|
+
.replaceAll(`v${version}`, `v${newVersion}`)
|
|
740
|
+
.replaceAll(`engine.version: ${version}`, `engine.version: ${newVersion}`),
|
|
741
|
+
'utf8',
|
|
742
|
+
);
|
|
743
|
+
}
|
|
734
744
|
}
|
|
735
745
|
}
|
|
736
746
|
|
|
@@ -752,60 +762,37 @@ try {
|
|
|
752
762
|
);
|
|
753
763
|
|
|
754
764
|
fs.writeFileSync(
|
|
755
|
-
`./src/
|
|
756
|
-
fs
|
|
757
|
-
.readFileSync(`./src/client/components/core/Docs.js`, 'utf8')
|
|
758
|
-
.replaceAll(`/engine/${version}`, `/engine/${newVersion}`),
|
|
765
|
+
`./src/index.js`,
|
|
766
|
+
fs.readFileSync(`./src/index.js`, 'utf8').replaceAll(`${version}`, `${newVersion}`),
|
|
759
767
|
'utf8',
|
|
760
768
|
);
|
|
761
769
|
|
|
762
|
-
|
|
763
|
-
`./src/client/ssr/body/CacheControl.js`,
|
|
764
|
-
fs.readFileSync(`./src/client/ssr/body/CacheControl.js`, 'utf8').replaceAll(`v${version}`, `v${newVersion}`),
|
|
765
|
-
'utf8',
|
|
766
|
-
);
|
|
767
|
-
|
|
768
|
-
fs.writeFileSync(
|
|
769
|
-
`./bin/index.js`,
|
|
770
|
-
fs.readFileSync(`./bin/index.js`, 'utf8').replaceAll(`${version}`, `${newVersion}`),
|
|
771
|
-
'utf8',
|
|
772
|
-
);
|
|
773
|
-
|
|
774
|
-
shellExec(`node bin/deploy update-package`);
|
|
770
|
+
shellExec(`node bin/deploy update-dependencies`);
|
|
775
771
|
shellExec(`auto-changelog`);
|
|
776
772
|
}
|
|
777
773
|
break;
|
|
778
774
|
|
|
779
775
|
case 'update-authors': {
|
|
780
|
-
//
|
|
781
|
-
const logs = await simpleGit().log();
|
|
782
|
-
|
|
776
|
+
// #### Ordered by first contribution.
|
|
783
777
|
fs.writeFileSync(
|
|
784
778
|
'./AUTHORS.md',
|
|
785
779
|
`# Authors
|
|
786
780
|
|
|
787
|
-
#### Ordered by first contribution.
|
|
788
781
|
|
|
789
|
-
${
|
|
790
|
-
`)}
|
|
782
|
+
${shellExec(`git log | grep Author: | sort -u`, { stdout: true }).split(`\n`).join(`\n\n\n`)}
|
|
791
783
|
|
|
792
784
|
#### Generated by [underpost.net](https://underpost.net)`,
|
|
793
785
|
'utf8',
|
|
794
786
|
);
|
|
795
787
|
|
|
796
|
-
|
|
797
|
-
// date: '2024-09-16T17:10:13-03:00',
|
|
798
|
-
// message: 'update',
|
|
799
|
-
// refs: '',
|
|
800
|
-
// body: '',
|
|
801
|
-
// author_name: 'fcoverdugo',
|
|
802
|
-
// author_email: 'fcoverdugoa@underpost.net'
|
|
788
|
+
break;
|
|
803
789
|
}
|
|
804
790
|
|
|
805
791
|
case 'restore-macro-db':
|
|
806
792
|
{
|
|
807
793
|
const deployGroupId = process.argv[3];
|
|
808
|
-
|
|
794
|
+
const deployId = process.argv[4];
|
|
795
|
+
await restoreMacroDb(deployGroupId, deployId);
|
|
809
796
|
}
|
|
810
797
|
|
|
811
798
|
break;
|
|
@@ -840,10 +827,10 @@ ${uniqueArray(logs.all.map((log) => `- ${log.author_name} ([${log.author_email}]
|
|
|
840
827
|
shellExec(`bin/besu --help`);
|
|
841
828
|
|
|
842
829
|
// Set env path
|
|
843
|
-
// export PATH=$PATH:/dd/besu-24.9.1/bin
|
|
830
|
+
// export PATH=$PATH:/home/dd/besu-24.9.1/bin
|
|
844
831
|
|
|
845
832
|
// Open src
|
|
846
|
-
// shellExec(`sudo code /dd/besu-24.9.1 --user-data-dir="/root/.vscode-root" --no-sandbox`);
|
|
833
|
+
// shellExec(`sudo code /home/dd/besu-24.9.1 --user-data-dir="/root/.vscode-root" --no-sandbox`);
|
|
847
834
|
}
|
|
848
835
|
|
|
849
836
|
break;
|
|
@@ -861,23 +848,43 @@ ${uniqueArray(logs.all.map((log) => `- ${log.author_name} ([${log.author_email}]
|
|
|
861
848
|
}
|
|
862
849
|
|
|
863
850
|
case 'update-default-conf': {
|
|
864
|
-
const
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
`,
|
|
879
|
-
'utf8'
|
|
880
|
-
|
|
851
|
+
const defaultServer = DefaultConf.server['default.net']['/'];
|
|
852
|
+
let confName = process.argv[3];
|
|
853
|
+
if (confName === 'ghpkg') {
|
|
854
|
+
confName = undefined;
|
|
855
|
+
const host = 'underpostnet.github.io';
|
|
856
|
+
const path = '/pwa-microservices-template-ghpkg';
|
|
857
|
+
DefaultConf.server = {
|
|
858
|
+
[host]: { [path]: defaultServer },
|
|
859
|
+
};
|
|
860
|
+
DefaultConf.server[host][path].apiBaseProxyPath = '/';
|
|
861
|
+
DefaultConf.server[host][path].apiBaseHost = 'www.nexodev.org';
|
|
862
|
+
} else if (confName) {
|
|
863
|
+
DefaultConf.client = JSON.parse(fs.readFileSync(`./engine-private/conf/${confName}/conf.client.json`, 'utf8'));
|
|
864
|
+
DefaultConf.server = JSON.parse(fs.readFileSync(`./engine-private/conf/${confName}/conf.server.json`, 'utf8'));
|
|
865
|
+
DefaultConf.ssr = JSON.parse(fs.readFileSync(`./engine-private/conf/${confName}/conf.ssr.json`, 'utf8'));
|
|
866
|
+
DefaultConf.cron = JSON.parse(fs.readFileSync(`./engine-private/conf/${confName}/conf.cron.json`, 'utf8'));
|
|
867
|
+
|
|
868
|
+
for (const host of Object.keys(DefaultConf.server)) {
|
|
869
|
+
for (const path of Object.keys(DefaultConf.server[host])) {
|
|
870
|
+
DefaultConf.server[host][path].db = defaultServer.db;
|
|
871
|
+
DefaultConf.server[host][path].mailer = defaultServer.mailer;
|
|
872
|
+
|
|
873
|
+
delete DefaultConf.server[host][path]._wp_client;
|
|
874
|
+
delete DefaultConf.server[host][path]._wp_git;
|
|
875
|
+
delete DefaultConf.server[host][path]._wp_directory;
|
|
876
|
+
delete DefaultConf.server[host][path].wp;
|
|
877
|
+
delete DefaultConf.server[host][path].git;
|
|
878
|
+
delete DefaultConf.server[host][path].directory;
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
const sepRender = '/**/';
|
|
883
|
+
const confRawPaths = fs.readFileSync('./conf.js', 'utf8').split(sepRender);
|
|
884
|
+
confRawPaths[1] = `${JSON.stringify(DefaultConf)};`;
|
|
885
|
+
const targetConfPath = `./conf${confName ? `.${confName}` : ''}.js`;
|
|
886
|
+
fs.writeFileSync(targetConfPath, confRawPaths.join(sepRender), 'utf8');
|
|
887
|
+
shellExec(`prettier --write ${targetConfPath}`);
|
|
881
888
|
|
|
882
889
|
break;
|
|
883
890
|
}
|
|
@@ -893,7 +900,11 @@ ${uniqueArray(logs.all.map((log) => `- ${log.author_name} ([${log.author_email}]
|
|
|
893
900
|
}
|
|
894
901
|
case 'ssh-import-client-keys': {
|
|
895
902
|
const host = process.argv[3];
|
|
896
|
-
shellExec(
|
|
903
|
+
shellExec(
|
|
904
|
+
`node bin/deploy set-ssh-keys ./engine-private/deploy/ssh_host_rsa_key ${host ? ` ${host}` : ``} ${
|
|
905
|
+
process.argv.includes('clean') ? 'clean' : ''
|
|
906
|
+
}`,
|
|
907
|
+
);
|
|
897
908
|
break;
|
|
898
909
|
}
|
|
899
910
|
case 'ssh-keys': {
|
|
@@ -958,14 +969,24 @@ ${uniqueArray(logs.all.map((log) => `- ${log.author_name} ([${log.author_email}]
|
|
|
958
969
|
}
|
|
959
970
|
|
|
960
971
|
case 'ssh': {
|
|
961
|
-
if (
|
|
962
|
-
shellExec(`sudo
|
|
963
|
-
|
|
964
|
-
shellExec(`sudo
|
|
972
|
+
if (process.argv.includes('rocky')) {
|
|
973
|
+
shellExec(`sudo systemctl enable sshd`);
|
|
974
|
+
|
|
975
|
+
shellExec(`sudo systemctl start sshd`);
|
|
976
|
+
|
|
977
|
+
shellExec(`sudo systemctl status sshd`);
|
|
978
|
+
|
|
979
|
+
shellExec(`sudo ss -lt`);
|
|
980
|
+
} else {
|
|
981
|
+
if (!process.argv.includes('server')) {
|
|
982
|
+
shellExec(`sudo apt update`);
|
|
983
|
+
shellExec(`sudo apt install openssh-server -y`);
|
|
984
|
+
shellExec(`sudo apt install ssh-askpass`);
|
|
985
|
+
}
|
|
986
|
+
shellExec(`sudo systemctl enable ssh`);
|
|
987
|
+
shellExec(`sudo systemctl restart ssh`);
|
|
988
|
+
shellExec(`sudo systemctl status ssh`);
|
|
965
989
|
}
|
|
966
|
-
shellExec(`sudo systemctl enable ssh`);
|
|
967
|
-
shellExec(`sudo systemctl restart ssh`);
|
|
968
|
-
shellExec(`sudo systemctl status ssh`);
|
|
969
990
|
// sudo service ssh restart
|
|
970
991
|
shellExec(`ip a`);
|
|
971
992
|
|
|
@@ -1023,11 +1044,26 @@ ${uniqueArray(logs.all.map((log) => `- ${log.author_name} ([${log.author_email}]
|
|
|
1023
1044
|
|
|
1024
1045
|
case 'valkey': {
|
|
1025
1046
|
if (!process.argv.includes('server')) {
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1047
|
+
if (process.argv.includes('rocky')) {
|
|
1048
|
+
// shellExec(`yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm`);
|
|
1049
|
+
// shellExec(`sudo percona-release enable valkey experimental`);
|
|
1050
|
+
shellExec(`sudo dnf install valkey`);
|
|
1051
|
+
shellExec(`chown -R valkey:valkey /etc/valkey`);
|
|
1052
|
+
shellExec(`chown -R valkey:valkey /var/lib/valkey`);
|
|
1053
|
+
shellExec(`chown -R valkey:valkey /var/log/valkey`);
|
|
1054
|
+
shellExec(`sudo systemctl enable valkey.service`);
|
|
1055
|
+
shellExec(`sudo systemctl start valkey`);
|
|
1056
|
+
shellExec(`valkey-cli ping`);
|
|
1057
|
+
} else {
|
|
1058
|
+
shellExec(`cd /home/dd && git clone https://github.com/valkey-io/valkey.git`);
|
|
1059
|
+
shellExec(`cd /home/dd/valkey && make`);
|
|
1060
|
+
shellExec(`apt install valkey-tools`); // valkey-cli
|
|
1061
|
+
}
|
|
1029
1062
|
}
|
|
1030
|
-
|
|
1063
|
+
if (process.argv.includes('rocky')) {
|
|
1064
|
+
shellExec(`sudo systemctl stop valkey`);
|
|
1065
|
+
shellExec(`sudo systemctl start valkey`);
|
|
1066
|
+
} else shellExec(`cd /home/dd/valkey && ./src/valkey-server`);
|
|
1031
1067
|
|
|
1032
1068
|
break;
|
|
1033
1069
|
}
|
package/bin/file.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'fs-extra';
|
|
2
2
|
|
|
3
3
|
import { loggerFactory } from '../src/server/logger.js';
|
|
4
|
-
import { cap, getCapVariableName, getDirname } from '../src/client/components/core/CommonJs.js';
|
|
4
|
+
import { cap, getCapVariableName, getDirname, newInstance } from '../src/client/components/core/CommonJs.js';
|
|
5
5
|
import { shellCd, shellExec } from '../src/server/process.js';
|
|
6
6
|
import walk from 'ignore-walk';
|
|
7
7
|
import { validateTemplatePath } from '../src/server/conf.js';
|
|
@@ -78,7 +78,7 @@ try {
|
|
|
78
78
|
fs.copySync(`./src/client/public/default`, `../pwa-microservices-template/src/client/public/default`);
|
|
79
79
|
|
|
80
80
|
shellCd('../pwa-microservices-template');
|
|
81
|
-
for (const deletePath of ['
|
|
81
|
+
for (const deletePath of ['README.md', 'package-lock.json', 'package.json']) {
|
|
82
82
|
shellExec(`git checkout ${deletePath}`);
|
|
83
83
|
}
|
|
84
84
|
for (const deletePath of [
|
|
@@ -86,13 +86,42 @@ try {
|
|
|
86
86
|
'.github/workflows/docker-image.yml',
|
|
87
87
|
'.github/workflows/deploy.ssh.yml',
|
|
88
88
|
'.github/workflows/deploy.api-rest.yml',
|
|
89
|
+
'.github/workflows/engine.lampp.ci.yml',
|
|
90
|
+
'.github/workflows/engine.core.ci.yml',
|
|
91
|
+
'.github/workflows/engine.cyberia.ci.yml',
|
|
89
92
|
'bin/web3.js',
|
|
90
93
|
'bin/cyberia.js',
|
|
91
|
-
'src/ipfs.js',
|
|
92
|
-
'src/k8s.js',
|
|
93
94
|
]) {
|
|
94
95
|
fs.removeSync('../pwa-microservices-template/' + deletePath);
|
|
95
96
|
}
|
|
97
|
+
shellCd('../engine');
|
|
98
|
+
const originPackageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8'));
|
|
99
|
+
const templatePackageJson = JSON.parse(fs.readFileSync('../pwa-microservices-template/package.json', 'utf8'));
|
|
100
|
+
templatePackageJson.dependencies = originPackageJson.dependencies;
|
|
101
|
+
templatePackageJson.devDependencies = originPackageJson.devDependencies;
|
|
102
|
+
templatePackageJson.version = originPackageJson.version;
|
|
103
|
+
fs.writeFileSync(
|
|
104
|
+
'../pwa-microservices-template/package.json',
|
|
105
|
+
JSON.stringify(templatePackageJson, null, 4),
|
|
106
|
+
'utf8',
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const originPackageLockJson = JSON.parse(fs.readFileSync('./package-lock.json', 'utf8'));
|
|
110
|
+
const templatePackageLockJson = JSON.parse(
|
|
111
|
+
fs.readFileSync('../pwa-microservices-template/package-lock.json', 'utf8'),
|
|
112
|
+
);
|
|
113
|
+
const originBasePackageLock = newInstance(templatePackageLockJson.packages['']);
|
|
114
|
+
templatePackageLockJson.version = originPackageLockJson.version;
|
|
115
|
+
templatePackageLockJson.packages = originPackageLockJson.packages;
|
|
116
|
+
templatePackageLockJson.packages[''].name = originBasePackageLock.name;
|
|
117
|
+
templatePackageLockJson.packages[''].version = originPackageLockJson.version;
|
|
118
|
+
templatePackageLockJson.packages[''].hasInstallScript = originBasePackageLock.hasInstallScript;
|
|
119
|
+
templatePackageLockJson.packages[''].license = originBasePackageLock.license;
|
|
120
|
+
fs.writeFileSync(
|
|
121
|
+
'../pwa-microservices-template/package-lock.json',
|
|
122
|
+
JSON.stringify(templatePackageLockJson, null, 4),
|
|
123
|
+
'utf8',
|
|
124
|
+
);
|
|
96
125
|
}
|
|
97
126
|
|
|
98
127
|
break;
|