underpost 2.8.1 → 2.8.41

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 (74) hide show
  1. package/.dockerignore +1 -0
  2. package/.github/workflows/ghpkg.yml +14 -11
  3. package/.github/workflows/pwa-microservices-template.page.yml +10 -3
  4. package/.vscode/extensions.json +17 -71
  5. package/.vscode/settings.json +10 -4
  6. package/AUTHORS.md +16 -5
  7. package/CHANGELOG.md +63 -3
  8. package/Dockerfile +41 -62
  9. package/README.md +1 -28
  10. package/bin/build.js +278 -0
  11. package/bin/db.js +2 -24
  12. package/bin/deploy.js +105 -55
  13. package/bin/file.js +33 -4
  14. package/bin/index.js +33 -51
  15. package/bin/ssl.js +19 -11
  16. package/bin/util.js +9 -89
  17. package/bin/vs.js +25 -2
  18. package/conf.js +31 -138
  19. package/docker-compose.yml +1 -1
  20. package/manifests/core/kustomization.yaml +11 -0
  21. package/manifests/core/underpost-engine-backup-access.yaml +16 -0
  22. package/manifests/core/underpost-engine-backup-pv-pvc.yaml +22 -0
  23. package/manifests/core/underpost-engine-headless-service.yaml +10 -0
  24. package/manifests/core/underpost-engine-mongodb-backup-cronjob.yaml +40 -0
  25. package/manifests/core/underpost-engine-mongodb-configmap.yaml +26 -0
  26. package/manifests/core/underpost-engine-pv-pvc.yaml +23 -0
  27. package/manifests/core/underpost-engine-statefulset.yaml +91 -0
  28. package/manifests/deployment/mongo-express.yaml +60 -0
  29. package/manifests/deployment/phpmyadmin.yaml +54 -0
  30. package/manifests/kind-config.yaml +12 -0
  31. package/manifests/letsencrypt-prod.yaml +15 -0
  32. package/manifests/mariadb/config.yaml +10 -0
  33. package/manifests/mariadb/kustomization.yaml +9 -0
  34. package/manifests/mariadb/pv.yaml +12 -0
  35. package/manifests/mariadb/pvc.yaml +10 -0
  36. package/manifests/mariadb/secret.yaml +8 -0
  37. package/manifests/mariadb/service.yaml +10 -0
  38. package/manifests/mariadb/statefulset.yaml +55 -0
  39. package/manifests/valkey/kustomization.yaml +7 -0
  40. package/manifests/valkey/underpost-engine-valkey-service.yaml +17 -0
  41. package/manifests/valkey/underpost-engine-valkey-statefulset.yaml +39 -0
  42. package/package.json +115 -136
  43. package/src/api/user/user.model.js +16 -3
  44. package/src/api/user/user.service.js +1 -1
  45. package/src/client/components/core/CalendarCore.js +115 -49
  46. package/src/client/components/core/CommonJs.js +150 -19
  47. package/src/client/components/core/CssCore.js +6 -0
  48. package/src/client/components/core/DropDown.js +5 -1
  49. package/src/client/components/core/Input.js +17 -3
  50. package/src/client/components/core/Modal.js +10 -5
  51. package/src/client/components/core/Panel.js +84 -25
  52. package/src/client/components/core/PanelForm.js +4 -18
  53. package/src/client/components/core/Translate.js +43 -9
  54. package/src/client/components/core/Validator.js +9 -1
  55. package/src/client/services/default/default.management.js +4 -2
  56. package/src/db/mongo/MongooseDB.js +13 -1
  57. package/src/index.js +8 -1
  58. package/src/runtime/lampp/Lampp.js +1 -13
  59. package/src/runtime/xampp/Xampp.js +0 -13
  60. package/src/server/auth.js +3 -3
  61. package/src/server/client-build.js +3 -13
  62. package/src/server/conf.js +296 -29
  63. package/src/server/dns.js +2 -3
  64. package/src/server/logger.js +10 -5
  65. package/src/server/network.js +0 -36
  66. package/src/server/process.js +25 -2
  67. package/src/server/project.js +39 -0
  68. package/src/server/proxy.js +4 -26
  69. package/src/server/runtime.js +6 -7
  70. package/src/server/ssl.js +1 -1
  71. package/src/server/valkey.js +2 -0
  72. package/startup.cjs +12 -0
  73. package/src/server/prompt-optimizer.js +0 -28
  74. package/startup.js +0 -11
package/src/server/dns.js CHANGED
@@ -2,10 +2,9 @@ import axios from 'axios';
2
2
  import dotenv from 'dotenv';
3
3
  import fs from 'fs';
4
4
  import https from 'https';
5
-
5
+ import validator from 'validator';
6
6
  import { ip } from './network.js';
7
7
  import { loggerFactory } from './logger.js';
8
- import { isIPv4 } from 'is-ip';
9
8
  import { shellExec } from './process.js';
10
9
 
11
10
  const httpsAgent = new https.Agent({
@@ -48,7 +47,7 @@ const Dns = {
48
47
  } catch (error) {
49
48
  logger.error(error, { testIp, stack: error.stack });
50
49
  }
51
- if (testIp && typeof testIp === 'string' && isIPv4(testIp) && Dns.ip !== testIp) {
50
+ if (testIp && typeof testIp === 'string' && validator.isIP(testIp) && Dns.ip !== testIp) {
52
51
  logger.info(`New ip`, testIp);
53
52
  for (const recordType of Object.keys(confCronData.records)) {
54
53
  switch (recordType) {
@@ -12,7 +12,6 @@ import morgan from 'morgan';
12
12
  import colorize from 'json-colorizer';
13
13
  import colors from 'colors';
14
14
  import v8 from 'v8';
15
- import isAdmin from 'is-admin';
16
15
  import { clearTerminalStringColor, formatBytes } from '../client/components/core/CommonJs.js';
17
16
 
18
17
  colors.enable();
@@ -79,8 +78,7 @@ const format = (meta) =>
79
78
  *
80
79
  * This function is used to log details about
81
80
  * the execution context, such as command-line arguments,
82
- * environment variables, the process's administrative privileges,
83
- * and the maximum available heap space size.
81
+ * environment variables, and the maximum available heap space size.
84
82
  *
85
83
  * @param {winston.Logger} logger - A pre-configured Winston logger object.
86
84
  * @memberof Logger
@@ -90,7 +88,6 @@ const setUpInfo = async (logger = new winston.Logger()) => {
90
88
  logger.info('argv', process.argv);
91
89
  logger.info('platform', process.platform);
92
90
  logger.info('env', process.env.NODE_ENV);
93
- logger.info('admin', await isAdmin());
94
91
  logger.info('--max-old-space-size', {
95
92
  total_available_size: formatBytes(v8.getHeapStatistics().total_available_size),
96
93
  });
@@ -189,4 +186,12 @@ const underpostASCI = () => `
189
186
  ░╚═════╝░╚═╝░░╚══╝╚═════╝░╚══════╝╚═╝░░╚═╝╚═╝░░░░░░╚════╝░╚═════╝░░░░╚═╝░░░
190
187
  `;
191
188
 
192
- export { loggerFactory, loggerMiddleware, setUpInfo, underpostASCI };
189
+ const actionInitLog = (version = '0.0.0') =>
190
+ console.log(
191
+ underpostASCI() +
192
+ `
193
+ ${version} https://www.nexodev.org/docs
194
+ `,
195
+ );
196
+
197
+ export { loggerFactory, loggerMiddleware, setUpInfo, underpostASCI, actionInitLog };
@@ -1,10 +1,7 @@
1
- import detect from 'detect-port';
2
1
  import fs from 'fs-extra';
3
2
 
4
3
  import { publicIp, publicIpv4, publicIpv6 } from 'public-ip';
5
- import { killPortProcess } from 'kill-port-process';
6
4
  import { loggerFactory } from './logger.js';
7
- import { orderArrayFromAttrInt } from '../client/components/core/CommonJs.js';
8
5
  import { DataBaseProvider } from '../db/DataBaseProvider.js';
9
6
  import { getDeployId } from './conf.js';
10
7
 
@@ -15,38 +12,6 @@ import { getDeployId } from './conf.js';
15
12
 
16
13
  const logger = loggerFactory(import.meta);
17
14
 
18
- const network = {
19
- port: {
20
- status: async (ports) => {
21
- const status = [];
22
- for (const port of ports) {
23
- status.push({
24
- port,
25
- open: await new Promise((resolve) =>
26
- detect(port)
27
- .then((_port) => {
28
- if (port == _port)
29
- // `port: ${port} was not occupied`
30
- return resolve(false);
31
-
32
- // `port: ${port} was occupied, try port: ${_port}`
33
- return resolve(true);
34
- })
35
- .catch((error) => resolve(`${error.message}`)),
36
- ),
37
- });
38
- }
39
- return status;
40
- },
41
- kill: async (ports) => await killPortProcess(ports),
42
- portClean: async function (port) {
43
- const [portStatus] = await this.status([port]);
44
- // logger.info('port status', portStatus);
45
- if (portStatus.open) await this.kill([port]);
46
- },
47
- },
48
- };
49
-
50
15
  const ip = {
51
16
  public: {
52
17
  get: async () => await publicIp(), // => 'fe80::200:f8ff:fe21:67cf'
@@ -202,7 +167,6 @@ const listenPortController = async (server, port, metadata) =>
202
167
 
203
168
  export {
204
169
  ip,
205
- network,
206
170
  listenPortController,
207
171
  networkRouter,
208
172
  netWorkCron,
@@ -3,8 +3,8 @@
3
3
  import shell from 'shelljs';
4
4
  import dotenv from 'dotenv';
5
5
  import fs from 'fs-extra';
6
-
7
6
  import { loggerFactory } from './logger.js';
7
+ import clipboard from 'clipboardy';
8
8
 
9
9
  dotenv.config();
10
10
 
@@ -63,4 +63,27 @@ const shellCd = (cd, options = { disableLog: false }) => {
63
63
  return shell.cd(cd);
64
64
  };
65
65
 
66
- export { ProcessController, getRootDirectory, shellExec, shellCd };
66
+ function pbcopy(data) {
67
+ switch (process.platform) {
68
+ case 'linux':
69
+ {
70
+ // sudo dnf install xclip
71
+ // sudo apt update
72
+ // sudo apt install xclip
73
+ // paste: xclip -o
74
+ // copy:
75
+ // shellExec(`echo "${data}" | xclip -sel clip`, { async: true });
76
+ }
77
+
78
+ break;
79
+
80
+ default:
81
+ break;
82
+ }
83
+
84
+ clipboard.writeSync(data || '🦄');
85
+
86
+ logger.info(`copied to clipboard`, clipboard.readSync());
87
+ }
88
+
89
+ export { ProcessController, getRootDirectory, shellExec, shellCd, pbcopy };
@@ -0,0 +1,39 @@
1
+ import { loadConf, newProject, repoClone, repoCommit, repoPull, repoPush } from './conf.js';
2
+
3
+ class Project {
4
+ constructor(repositoryName, version) {
5
+ return newProject(repositoryName, version);
6
+ }
7
+
8
+ static clone(gitUri = 'underpostnet/pwa-microservices-template') {
9
+ return repoClone(gitUri);
10
+ }
11
+
12
+ static useEnv(deployId = 'default', env = 'production') {
13
+ return loadConf(deployId, env);
14
+ }
15
+
16
+ static pull(repoPath = './', gitUri = 'underpostnet/pwa-microservices-template') {
17
+ return repoPull(repoPath, gitUri);
18
+ }
19
+
20
+ static commit(
21
+ repoPath = './',
22
+ commitType = 'feat',
23
+ subModule = '',
24
+ message = '',
25
+ options = {
26
+ copy: false,
27
+ info: false,
28
+ empty: false,
29
+ },
30
+ ) {
31
+ return repoCommit(repoPath, commitType, subModule, message, options);
32
+ }
33
+
34
+ static push(repoPath = './', gitUri = 'underpostnet/pwa-microservices-template') {
35
+ return repoPush(repoPath, gitUri);
36
+ }
37
+ }
38
+
39
+ export default Project;
@@ -5,10 +5,9 @@ import dotenv from 'dotenv';
5
5
 
6
6
  import { createProxyMiddleware } from 'http-proxy-middleware';
7
7
  import { loggerFactory, loggerMiddleware } from './logger.js';
8
- import { listenPortController, network } from './network.js';
9
- import { orderArrayFromAttrInt } from '../client/components/core/CommonJs.js';
8
+ import { listenPortController } from './network.js';
10
9
  import { createSslServer, sslRedirectMiddleware } from './ssl.js';
11
- import { buildProxyRouter, maintenanceMiddleware } from './conf.js';
10
+ import { buildPortProxyRouter, buildProxyRouter, maintenanceMiddleware } from './conf.js';
12
11
 
13
12
  dotenv.config();
14
13
 
@@ -16,7 +15,7 @@ const logger = loggerFactory(import.meta);
16
15
 
17
16
  const buildProxy = async () => {
18
17
  // default target
19
- await network.port.portClean(process.env.PORT);
18
+
20
19
  express().listen(process.env.PORT);
21
20
 
22
21
  const proxyRouter = buildProxyRouter();
@@ -57,27 +56,7 @@ const buildProxy = async () => {
57
56
  // '^/target-path': '/',
58
57
  },
59
58
  };
60
- if (!process.argv.includes('maintenance')) {
61
- // build router
62
- Object.keys(hosts).map((hostKey) => {
63
- let { host, path, target, proxy, peer } = hosts[hostKey];
64
- if (process.env.NODE_ENV === 'development') host = `localhost`;
65
-
66
- if (!proxy.includes(port)) return;
67
- const absoluteHost = [80, 443].includes(port)
68
- ? `${host}${path === '/' ? '' : path}`
69
- : `${host}:${port}${path === '/' ? '' : path}`;
70
-
71
- if (!(absoluteHost in options.router)) options.router[absoluteHost] = target;
72
- });
73
- if (Object.keys(options.router).length === 0) continue;
74
-
75
- // order router
76
- const router = {};
77
- for (const absoluteHostKey of orderArrayFromAttrInt(Object.keys(options.router), 'length'))
78
- router[absoluteHostKey] = options.router[absoluteHostKey];
79
- options.router = router;
80
- }
59
+ if (!process.argv.includes('maintenance')) options.router = buildPortProxyRouter(port, proxyRouter);
81
60
 
82
61
  const filter = false
83
62
  ? (pathname, req) => {
@@ -86,7 +65,6 @@ const buildProxy = async () => {
86
65
  }
87
66
  : proxyPath;
88
67
  app.use(proxyPath, createProxyMiddleware(filter, options));
89
- await network.port.portClean(port);
90
68
 
91
69
  switch (process.env.NODE_ENV) {
92
70
  case 'production':
@@ -9,7 +9,7 @@ import compression from 'compression';
9
9
 
10
10
  import { createServer } from 'http';
11
11
  import { getRootDirectory } from './process.js';
12
- import { network, listenPortController, saveRuntimeRouter, logRuntimeRouter, listenServerFactory } from './network.js';
12
+ import { listenPortController, saveRuntimeRouter, logRuntimeRouter, listenServerFactory } from './network.js';
13
13
  import { loggerFactory, loggerMiddleware } from './logger.js';
14
14
  import { getCapVariableName, newInstance } from '../client/components/core/CommonJs.js';
15
15
  import { Xampp } from '../runtime/xampp/Xampp.js';
@@ -295,7 +295,7 @@ export PATH=$PATH:/opt/lampp/bin`,
295
295
  logger.info('Build static server runtime', `${host}${path}`);
296
296
  currentPort += 2;
297
297
  const staticPort = newInstance(currentPort);
298
- await network.port.portClean(staticPort);
298
+
299
299
  await listenPortController(app, staticPort, runningData);
300
300
  currentPort++;
301
301
  continue;
@@ -346,7 +346,7 @@ export PATH=$PATH:/opt/lampp/bin`,
346
346
  // changeOrigin: true,
347
347
  // }),
348
348
  // );
349
- await network.port.portClean(port);
349
+
350
350
  await listenPortController(app, port, runningData);
351
351
  break;
352
352
  }
@@ -460,7 +460,7 @@ export PATH=$PATH:/opt/lampp/bin`,
460
460
  host,
461
461
  path,
462
462
  });
463
- await network.port.portClean(peerPort);
463
+
464
464
  await listenPortController(peerServer, peerPort, {
465
465
  runtime: 'nodejs',
466
466
  client: null,
@@ -470,7 +470,6 @@ export PATH=$PATH:/opt/lampp/bin`,
470
470
  });
471
471
  }
472
472
 
473
- await network.port.portClean(port);
474
473
  await listenPortController(server, port, runningData);
475
474
 
476
475
  break;
@@ -481,8 +480,8 @@ export PATH=$PATH:/opt/lampp/bin`,
481
480
  }
482
481
  }
483
482
 
484
- if (Xampp.enabled() && Xampp.router) await Xampp.initService({ daemon: true });
485
- if (Lampp.enabled() && Lampp.router) await Lampp.initService({ daemon: true });
483
+ if (Xampp.enabled() && Xampp.router) Xampp.initService();
484
+ if (Lampp.enabled() && Lampp.router) Lampp.initService();
486
485
 
487
486
  saveRuntimeRouter();
488
487
  logRuntimeRouter();
package/src/server/ssl.js CHANGED
@@ -70,7 +70,7 @@ const validateSecureContext = (host) => {
70
70
  const buildSecureContext = (host) => {
71
71
  return {
72
72
  key: fs.readFileSync(`./engine-private/ssl/${host}/key.key`, 'utf8'),
73
- cert: fs.readFileSync(`./engine-private/ssl/${host}/crt.crt`, 'utf8'),
73
+ cert: fs.readFileSync(`./engine-private/ssl/${host}/ca_bundle.crt`, 'utf8'),
74
74
  ca: fs.readFileSync(`./engine-private/ssl/${host}/ca_bundle.crt`, 'utf8'),
75
75
  };
76
76
  };
@@ -21,6 +21,8 @@ const selectDtoFactory = (payload, select) => {
21
21
 
22
22
  const valkeyClientFactory = async () => {
23
23
  const valkey = new Valkey({
24
+ // port: 6379,
25
+ // host: 'service-valkey.default.svc.cluster.local',
24
26
  retryStrategy: (attempt) => {
25
27
  if (attempt === 1) {
26
28
  valkey.disconnect();
package/startup.cjs ADDED
@@ -0,0 +1,12 @@
1
+ const shell = require('shelljs');
2
+
3
+ // /usr/bin/supervisord -n
4
+ // /usr/sbin/sshd -D
5
+
6
+ shell.exec(`/usr/bin/supervisord -n`, { async: true });
7
+
8
+ // shell.exec(`sudo /opt/lampp/lampp start`, { async: true });
9
+
10
+ // shell.exec(`/usr/bin/mongod -f /etc/mongod.conf`, { async: true });
11
+
12
+ shell.exec(`underpost new app`);
@@ -1,28 +0,0 @@
1
- // https://github.com/xenova/transformers.js/blob/f43d3dd348fd7b293008802590bb3a1afa218dc7/src/models.js#L10
2
-
3
- import { AutoModelForSeq2SeqLM, AutoTokenizer } from '@xenova/transformers';
4
- import { loggerFactory } from './logger.js';
5
- import dotenv from 'dotenv';
6
-
7
- dotenv.config();
8
-
9
- const logger = loggerFactory(import.meta);
10
-
11
- const tokenizer = await AutoTokenizer.from_pretrained('Xenova/t5-small');
12
-
13
- const model = await AutoModelForSeq2SeqLM.from_pretrained('Xenova/t5-small');
14
-
15
- const prompt = 'translate English to German: I love transformers!';
16
-
17
- logger.info('input', { prompt });
18
-
19
- const tokenizerData = await tokenizer(prompt);
20
-
21
- const { input_ids } = tokenizerData;
22
-
23
- const outputs = await model.generate(input_ids);
24
-
25
- for (const output of outputs) {
26
- const decoded = tokenizer.decode(output, { skip_special_tokens: true });
27
- logger.info('decoded', { decoded });
28
- }
package/startup.js DELETED
@@ -1,11 +0,0 @@
1
- import { shellExec } from './src/server/process.js';
2
-
3
- // /usr/bin/supervisord -n
4
- // /usr/sbin/sshd -D
5
- shellExec(`/usr/bin/supervisord -n`, { async: true });
6
-
7
- shellExec(`sudo /opt/lampp/lampp start`, { async: true });
8
-
9
- shellExec(`/usr/bin/mongod -f /etc/mongod.conf`, { async: true });
10
-
11
- shellExec(`underpost new app server`);