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.
- 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 +10 -4
- 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 +105 -55
- package/bin/file.js +33 -4
- package/bin/index.js +33 -51
- package/bin/ssl.js +19 -11
- package/bin/util.js +9 -89
- package/bin/vs.js +25 -2
- package/conf.js +31 -138
- 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 +115 -136
- package/src/api/user/user.model.js +16 -3
- package/src/api/user/user.service.js +1 -1
- package/src/client/components/core/CalendarCore.js +115 -49
- package/src/client/components/core/CommonJs.js +150 -19
- package/src/client/components/core/CssCore.js +6 -0
- package/src/client/components/core/DropDown.js +5 -1
- package/src/client/components/core/Input.js +17 -3
- package/src/client/components/core/Modal.js +10 -5
- package/src/client/components/core/Panel.js +84 -25
- package/src/client/components/core/PanelForm.js +4 -18
- package/src/client/components/core/Translate.js +43 -9
- package/src/client/components/core/Validator.js +9 -1
- package/src/client/services/default/default.management.js +4 -2
- package/src/db/mongo/MongooseDB.js +13 -1
- package/src/index.js +8 -1
- 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 +3 -13
- package/src/server/conf.js +296 -29
- package/src/server/dns.js +2 -3
- package/src/server/logger.js +10 -5
- 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 +2 -0
- package/startup.cjs +12 -0
- package/src/server/prompt-optimizer.js +0 -28
- 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' &&
|
|
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) {
|
package/src/server/logger.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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 };
|
package/src/server/network.js
CHANGED
|
@@ -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,
|
package/src/server/process.js
CHANGED
|
@@ -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
|
-
|
|
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;
|
package/src/server/proxy.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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':
|
package/src/server/runtime.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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)
|
|
485
|
-
if (Lampp.enabled() && Lampp.router)
|
|
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}/
|
|
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
|
};
|
package/src/server/valkey.js
CHANGED
|
@@ -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`);
|