underpost 2.8.52 → 2.8.55
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/CHANGELOG.md +24 -0
- package/bin/build.js +20 -4
- package/bin/deploy.js +64 -52
- package/bin/hwt.js +0 -10
- package/bin/index.js +21 -16
- package/bin/util.js +0 -7
- package/conf.js +0 -2
- package/docker-compose.yml +1 -1
- package/manifests/mongodb-4.4/kustomization.yaml +7 -0
- package/manifests/mongodb-4.4/service-deployment.yaml +63 -0
- package/package.json +2 -1
- package/src/cli/cluster.js +19 -19
- package/src/cli/cron.js +1 -1
- package/src/cli/deploy.js +43 -30
- package/src/cli/image.js +1 -18
- package/src/cli/script.js +25 -1
- package/src/cli/test.js +28 -4
- package/src/db/mongo/MongooseDB.js +17 -1
- package/src/index.js +1 -1
- package/src/server/backup.js +2 -2
- package/src/server/conf.js +4 -10
- package/src/server/dns.js +37 -44
- package/src/server/downloader.js +0 -8
- package/test/api.test.js +0 -8
- package/manifests/core/kustomization.yaml +0 -11
- package/manifests/core/underpost-engine-backup-access.yaml +0 -16
- package/manifests/core/underpost-engine-backup-pv-pvc.yaml +0 -22
- package/manifests/core/underpost-engine-headless-service.yaml +0 -10
- package/manifests/core/underpost-engine-mongodb-backup-cronjob.yaml +0 -40
- package/manifests/core/underpost-engine-mongodb-configmap.yaml +0 -26
- package/manifests/core/underpost-engine-statefulset.yaml +0 -91
- /package/manifests/{core/underpost-engine-pv-pvc.yaml → mongodb-4.4/pv-pvc.yaml} +0 -0
package/src/cli/deploy.js
CHANGED
|
@@ -180,28 +180,42 @@ spec:
|
|
|
180
180
|
async callback(
|
|
181
181
|
deployList = 'default',
|
|
182
182
|
env = 'development',
|
|
183
|
-
options = { remove: false, infoRouter: false, sync: false, buildManifest: false },
|
|
183
|
+
options = { remove: false, infoRouter: false, sync: false, buildManifest: false, infoUtil: false, expose: false },
|
|
184
184
|
) {
|
|
185
|
+
if (options.infoUtil === true)
|
|
186
|
+
return logger.info(`
|
|
187
|
+
kubectl rollout restart deployment/deployment-name
|
|
188
|
+
kubectl rollout undo deployment/deployment-name
|
|
189
|
+
kubectl scale statefulsets <stateful-set-name> --replicas=<new-replicas>
|
|
190
|
+
`);
|
|
185
191
|
if (deployList === 'dd' && fs.existsSync(`./engine-private/deploy/dd.router`))
|
|
186
192
|
deployList = fs.readFileSync(`./engine-private/deploy/dd.router`, 'utf8');
|
|
187
193
|
if (options.sync) UnderpostDeploy.API.sync(deployList);
|
|
188
194
|
if (options.buildManifest === true) await UnderpostDeploy.API.buildManifest(deployList, env);
|
|
189
195
|
if (options.infoRouter === true)
|
|
190
196
|
return logger.info('router', await UnderpostDeploy.API.routerFactory(deployList, env));
|
|
197
|
+
const etcHost = (
|
|
198
|
+
concat,
|
|
199
|
+
) => `127.0.0.1 ${concat} localhost localhost.localdomain localhost4 localhost4.localdomain4
|
|
200
|
+
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6`;
|
|
201
|
+
let concatHots = '';
|
|
191
202
|
|
|
192
203
|
for (const _deployId of deployList.split(',')) {
|
|
193
204
|
const deployId = _deployId.trim();
|
|
194
205
|
if (!deployId) continue;
|
|
195
|
-
|
|
206
|
+
if (options.expose === true) {
|
|
207
|
+
const svc = UnderpostDeploy.API.get(deployId, 'svc')[0];
|
|
208
|
+
const port = parseInt(svc[`PORT(S)`].split('/TCP')[0]);
|
|
209
|
+
logger.info(deployId, {
|
|
210
|
+
svc,
|
|
211
|
+
port,
|
|
212
|
+
});
|
|
213
|
+
shellExec(`sudo kubectl port-forward -n default svc/${svc.NAME} ${port}:${port}`, { async: true });
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
196
216
|
shellExec(`sudo kubectl delete svc ${deployId}-${env}-service`);
|
|
197
217
|
shellExec(`sudo kubectl delete deployment ${deployId}-${env}`);
|
|
198
218
|
|
|
199
|
-
const etcHost = (
|
|
200
|
-
concat,
|
|
201
|
-
) => `127.0.0.1 ${concat} localhost localhost.localdomain localhost4 localhost4.localdomain4
|
|
202
|
-
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6`;
|
|
203
|
-
let concatHots = '';
|
|
204
|
-
|
|
205
219
|
const confServer = JSON.parse(fs.readFileSync(`./engine-private/conf/${deployId}/conf.server.json`, 'utf8'));
|
|
206
220
|
for (const host of Object.keys(confServer)) {
|
|
207
221
|
shellExec(`sudo kubectl delete HTTPProxy ${host}`);
|
|
@@ -219,38 +233,37 @@ spec:
|
|
|
219
233
|
shellExec(`sudo kubectl apply -f ./${manifestsPath}/proxy.yaml`);
|
|
220
234
|
if (env === 'production') shellExec(`sudo kubectl apply -f ./${manifestsPath}/secret.yaml`);
|
|
221
235
|
}
|
|
236
|
+
}
|
|
237
|
+
let renderHosts;
|
|
238
|
+
switch (process.platform) {
|
|
239
|
+
case 'linux':
|
|
240
|
+
{
|
|
241
|
+
switch (env) {
|
|
242
|
+
case 'development':
|
|
243
|
+
renderHosts = etcHost(concatHots);
|
|
244
|
+
fs.writeFileSync(`/etc/hosts`, renderHosts, 'utf8');
|
|
222
245
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
switch (process.platform) {
|
|
226
|
-
case 'linux':
|
|
227
|
-
{
|
|
228
|
-
switch (env) {
|
|
229
|
-
case 'development':
|
|
230
|
-
renderHosts = etcHost(concatHots);
|
|
231
|
-
fs.writeFileSync(`/etc/hosts`, renderHosts, 'utf8');
|
|
232
|
-
|
|
233
|
-
break;
|
|
246
|
+
break;
|
|
234
247
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
}
|
|
248
|
+
default:
|
|
249
|
+
break;
|
|
238
250
|
}
|
|
239
|
-
|
|
251
|
+
}
|
|
252
|
+
break;
|
|
240
253
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
254
|
+
default:
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
if (renderHosts)
|
|
244
258
|
logger.info(
|
|
245
259
|
`
|
|
246
260
|
` + renderHosts,
|
|
247
261
|
);
|
|
248
|
-
}
|
|
249
262
|
},
|
|
250
|
-
|
|
251
|
-
const raw = shellExec(`sudo kubectl get
|
|
263
|
+
get(deployId, kindType = 'pods') {
|
|
264
|
+
const raw = shellExec(`sudo kubectl get ${kindType} --all-namespaces -o wide`, {
|
|
252
265
|
stdout: true,
|
|
253
|
-
disableLog:
|
|
266
|
+
disableLog: true,
|
|
254
267
|
silent: true,
|
|
255
268
|
});
|
|
256
269
|
|
package/src/cli/image.js
CHANGED
|
@@ -54,23 +54,6 @@ class UnderpostImage {
|
|
|
54
54
|
{
|
|
55
55
|
const lamppPublicPath = '/xampp/htdocs/online';
|
|
56
56
|
shellExec(`sudo mkdir -p ${lamppPublicPath}`);
|
|
57
|
-
|
|
58
|
-
{
|
|
59
|
-
shellExec(
|
|
60
|
-
`cd ${lamppPublicPath} && git clone https://${process.env.GITHUB_TOKEN}@github.com/${process.env.DD_LAMPP_REPO_0}`,
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
shellExec(`cd ${lamppPublicPath} && sudo ${process.env.DD_LAMPP_SCRIPT_0}`);
|
|
64
|
-
|
|
65
|
-
shellExec(
|
|
66
|
-
`sudo sed -i -e "s@define( 'DB_HOST', 'localhost' );@define( 'DB_HOST', '${process.env.MARIADB_HOST}' );@g" ${lamppPublicPath}/${process.env.DD_LAMPP_REPO_0_FOLDER}/wp-config.php`,
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
{
|
|
70
|
-
shellExec(
|
|
71
|
-
`cd ${lamppPublicPath} && git clone https://${process.env.GITHUB_TOKEN}@github.com/${process.env.DD_LAMPP_REPO_1}`,
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
57
|
}
|
|
75
58
|
break;
|
|
76
59
|
|
|
@@ -109,7 +92,7 @@ class UnderpostImage {
|
|
|
109
92
|
shellExec(`node bin/deploy conf ${deployId} ${env}`);
|
|
110
93
|
shellExec(`node bin/deploy build-full-client ${deployId}`);
|
|
111
94
|
if (options.run === true) {
|
|
112
|
-
const runCmd = env === 'production' ? '
|
|
95
|
+
const runCmd = env === 'production' ? 'run prod-img' : 'run dev-img';
|
|
113
96
|
if (fs.existsSync(`./engine-private/replica`)) {
|
|
114
97
|
const replicas = await fs.readdir(`./engine-private/replica`);
|
|
115
98
|
for (const replica of replicas) {
|
package/src/cli/script.js
CHANGED
|
@@ -2,6 +2,7 @@ import { getNpmRootPath } from '../server/conf.js';
|
|
|
2
2
|
import { loggerFactory } from '../server/logger.js';
|
|
3
3
|
import { shellExec } from '../server/process.js';
|
|
4
4
|
import fs from 'fs-extra';
|
|
5
|
+
import UnderpostDeploy from './deploy.js';
|
|
5
6
|
|
|
6
7
|
const logger = loggerFactory(import.meta);
|
|
7
8
|
|
|
@@ -13,8 +14,31 @@ class UnderpostScript {
|
|
|
13
14
|
packageJson.scripts[key] = value;
|
|
14
15
|
fs.writeFileSync(`${npmRoot}/package.json`, JSON.stringify(packageJson, null, 4));
|
|
15
16
|
},
|
|
16
|
-
run(key) {
|
|
17
|
+
run(key, value, options) {
|
|
17
18
|
const npmRoot = `${getNpmRootPath()}/underpost`;
|
|
19
|
+
const packageJson = JSON.parse(fs.readFileSync(`${npmRoot}/package.json`, 'utf8'));
|
|
20
|
+
if (options.itc === true) {
|
|
21
|
+
value = packageJson.scripts[key];
|
|
22
|
+
const podScriptPath = `${options.itcPath && typeof options.itcPath === 'string' ? options.itcPath : '/'}${value
|
|
23
|
+
.split('/')
|
|
24
|
+
.pop()}`;
|
|
25
|
+
const nameSpace = options.ns && typeof options.ns === 'string' ? options.ns : 'default';
|
|
26
|
+
const podMatch = options.podName && typeof options.podName === 'string' ? options.podName : key;
|
|
27
|
+
|
|
28
|
+
if (fs.existsSync(`${value}`)) {
|
|
29
|
+
for (const pod of UnderpostDeploy.API.get(podMatch)) {
|
|
30
|
+
shellExec(`sudo kubectl cp ${value} ${nameSpace}/${pod.NAME}:${podScriptPath}`);
|
|
31
|
+
const cmd = `node ${podScriptPath}`;
|
|
32
|
+
shellExec(`sudo kubectl exec -i ${pod.NAME} -- sh -c "${cmd}"`);
|
|
33
|
+
}
|
|
34
|
+
} else {
|
|
35
|
+
for (const pod of UnderpostDeploy.API.get(podMatch)) {
|
|
36
|
+
shellExec(`sudo kubectl exec -i ${pod.NAME} -- sh -c "${value}"`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
18
42
|
shellExec(`cd ${npmRoot} && npm run ${key}`);
|
|
19
43
|
},
|
|
20
44
|
get(key) {
|
package/src/cli/test.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { timer } from '../client/components/core/CommonJs.js';
|
|
1
2
|
import { MariaDB } from '../db/mariadb/MariaDB.js';
|
|
2
3
|
import { getNpmRootPath } from '../server/conf.js';
|
|
3
4
|
import { actionInitLog, loggerFactory, setUpInfo } from '../server/logger.js';
|
|
@@ -28,9 +29,17 @@ class UnderpostTest {
|
|
|
28
29
|
actionInitLog();
|
|
29
30
|
shellExec(`cd ${getNpmRootPath()}/underpost && npm run test`);
|
|
30
31
|
},
|
|
31
|
-
async callback(deployList = '', options = {
|
|
32
|
+
async callback(deployList = '', options = { itc: false, sh: false, logs: false }) {
|
|
33
|
+
if (
|
|
34
|
+
options.podName &&
|
|
35
|
+
typeof options.podName === 'string' &&
|
|
36
|
+
options.podStatus &&
|
|
37
|
+
typeof options.podStatus === 'string'
|
|
38
|
+
)
|
|
39
|
+
return await UnderpostTest.API.podStatusMonitor(options.podName, options.podStatus);
|
|
40
|
+
|
|
32
41
|
if (options.sh === true || options.logs === true) {
|
|
33
|
-
const [pod] = UnderpostDeploy.API.
|
|
42
|
+
const [pod] = UnderpostDeploy.API.get(deployList);
|
|
34
43
|
if (pod) {
|
|
35
44
|
if (options.sh) return pbcopy(`sudo kubectl exec -it ${pod.NAME} -- sh`);
|
|
36
45
|
if (options.logs) return shellExec(`sudo kubectl logs -f ${pod.NAME}`);
|
|
@@ -41,7 +50,7 @@ class UnderpostTest {
|
|
|
41
50
|
for (const _deployId of deployList.split(',')) {
|
|
42
51
|
const deployId = _deployId.trim();
|
|
43
52
|
if (!deployId) continue;
|
|
44
|
-
if (options.
|
|
53
|
+
if (options.itc === true)
|
|
45
54
|
switch (deployId) {
|
|
46
55
|
case 'dd-lampp':
|
|
47
56
|
{
|
|
@@ -64,7 +73,7 @@ class UnderpostTest {
|
|
|
64
73
|
break;
|
|
65
74
|
}
|
|
66
75
|
else {
|
|
67
|
-
const pods = UnderpostDeploy.API.
|
|
76
|
+
const pods = UnderpostDeploy.API.get(deployId);
|
|
68
77
|
if (pods.length > 0)
|
|
69
78
|
for (const deployData of pods) {
|
|
70
79
|
const { NAME } = deployData;
|
|
@@ -77,6 +86,21 @@ class UnderpostTest {
|
|
|
77
86
|
}
|
|
78
87
|
} else return UnderpostTest.API.run();
|
|
79
88
|
},
|
|
89
|
+
podStatusMonitor(podName, status = 'Running', deltaMs = 1000) {
|
|
90
|
+
return new Promise(async (resolve) => {
|
|
91
|
+
let index = 0;
|
|
92
|
+
logger.info(`Loading ${podName} instance`, { status, deltaMs });
|
|
93
|
+
const _monitor = async () => {
|
|
94
|
+
await timer(deltaMs);
|
|
95
|
+
const result = UnderpostDeploy.API.get(podName).find((p) => p.STATUS === status);
|
|
96
|
+
logger.info(`Testing pod ${podName}... ${result ? 1 : 0}/1 - elapsed time ${deltaMs * (index + 1)}ms`);
|
|
97
|
+
if (result) return resolve();
|
|
98
|
+
index++;
|
|
99
|
+
return _monitor();
|
|
100
|
+
};
|
|
101
|
+
await _monitor();
|
|
102
|
+
});
|
|
103
|
+
},
|
|
80
104
|
};
|
|
81
105
|
}
|
|
82
106
|
|
|
@@ -79,7 +79,19 @@ const MongooseDB = {
|
|
|
79
79
|
if (process.argv.includes('rocky')) {
|
|
80
80
|
// https://github.com/mongodb/mongodb-selinux
|
|
81
81
|
// https://www.mongodb.com/docs/v7.0/tutorial/install-mongodb-enterprise-on-red-hat/
|
|
82
|
-
|
|
82
|
+
// https://www.mongodb.com/docs/v6.0/tutorial/install-mongodb-on-red-hat/
|
|
83
|
+
// https://www.mongodb.com/docs/v4.4/tutorial/install-mongodb-on-red-hat/
|
|
84
|
+
// dnf install selinux-policy-devel
|
|
85
|
+
// git clone https://github.com/mongodb/mongodb-selinux
|
|
86
|
+
// cd mongodb-selinux
|
|
87
|
+
// make
|
|
88
|
+
// sudo make install
|
|
89
|
+
// yum list installed | grep mongo
|
|
90
|
+
// sudo yum erase $(rpm -qa | grep mongodb)
|
|
91
|
+
// remove service
|
|
92
|
+
// sudo systemctl reset-failed
|
|
93
|
+
// MongoDB 5.0+ requires a CPU with AVX support
|
|
94
|
+
// check: grep avx /proc/cpuinfo
|
|
83
95
|
}
|
|
84
96
|
logger.info('install legacy 4.4');
|
|
85
97
|
shellExec(`wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -`);
|
|
@@ -112,9 +124,13 @@ const MongooseDB = {
|
|
|
112
124
|
shellExec(`sudo systemctl unmask mongod`);
|
|
113
125
|
shellExec(`sudo pkill -f mongod`);
|
|
114
126
|
shellExec(`sudo systemctl enable mongod.service`);
|
|
127
|
+
|
|
115
128
|
shellExec(`sudo chown -R mongodb:mongodb /var/lib/mongodb`);
|
|
116
129
|
shellExec(`sudo chown mongodb:mongodb /tmp/mongodb-27017.sock`);
|
|
117
130
|
|
|
131
|
+
shellExec(`sudo chown -R mongod:mongod /var/lib/mongodb`);
|
|
132
|
+
shellExec(`sudo chown mongod:mongod /tmp/mongodb-27017.sock`);
|
|
133
|
+
|
|
118
134
|
logger.info('run server');
|
|
119
135
|
shellExec(`sudo service mongod restart`);
|
|
120
136
|
|
package/src/index.js
CHANGED
package/src/server/backup.js
CHANGED
|
@@ -9,7 +9,7 @@ dotenv.config();
|
|
|
9
9
|
const logger = loggerFactory(import.meta);
|
|
10
10
|
|
|
11
11
|
class BackUp {
|
|
12
|
-
static callback = async function (deployList, options = {
|
|
12
|
+
static callback = async function (deployList, options = { itc: false }) {
|
|
13
13
|
if ((!deployList || deployList === 'dd') && fs.existsSync(`./engine-private/deploy/dd.router`))
|
|
14
14
|
deployList = fs.readFileSync(`./engine-private/deploy/dd.router`, 'utf8');
|
|
15
15
|
|
|
@@ -25,7 +25,7 @@ class BackUp {
|
|
|
25
25
|
const deployId = _deployId.trim();
|
|
26
26
|
if (!deployId) continue;
|
|
27
27
|
|
|
28
|
-
if (options.
|
|
28
|
+
if (!(options.itc === true)) {
|
|
29
29
|
shellExec(`underpost db --export ${deployId}`);
|
|
30
30
|
continue;
|
|
31
31
|
}
|
package/src/server/conf.js
CHANGED
|
@@ -19,17 +19,8 @@ import { DefaultConf } from '../../conf.js';
|
|
|
19
19
|
import read from 'read';
|
|
20
20
|
import splitFile from 'split-file';
|
|
21
21
|
import axios from 'axios';
|
|
22
|
-
import https from 'https';
|
|
23
22
|
import { ssrFactory } from './client-formatted.js';
|
|
24
23
|
|
|
25
|
-
// axios.defaults.baseURL = BASE_URL;
|
|
26
|
-
|
|
27
|
-
// const httpsAgent = new https.Agent({
|
|
28
|
-
// rejectUnauthorized: false,
|
|
29
|
-
// });
|
|
30
|
-
|
|
31
|
-
// axios.defaults.httpsAgent = httpsAgent;
|
|
32
|
-
|
|
33
24
|
colors.enable();
|
|
34
25
|
|
|
35
26
|
dotenv.config();
|
|
@@ -1004,7 +995,7 @@ const Cmd = {
|
|
|
1004
995
|
syncPorts: (deployGroupId) => `node bin/deploy sync-env-port ${deployGroupId}`,
|
|
1005
996
|
cron: (deployList, jobList, name, expression, options) =>
|
|
1006
997
|
`pm2 start ./bin/index.js --no-autorestart --instances 1 --cron "${expression}" --name ${name} -- cron ${
|
|
1007
|
-
options?.
|
|
998
|
+
options?.itc ? `--itc ` : ''
|
|
1008
999
|
}${deployList} ${jobList}`,
|
|
1009
1000
|
};
|
|
1010
1001
|
|
|
@@ -1082,6 +1073,8 @@ const getNpmRootPath = () =>
|
|
|
1082
1073
|
silent: true,
|
|
1083
1074
|
}).trim();
|
|
1084
1075
|
|
|
1076
|
+
const getUnderpostRootPath = () => `${getNpmRootPath()}/underpost`;
|
|
1077
|
+
|
|
1085
1078
|
const writeEnv = (envPath, envObj) =>
|
|
1086
1079
|
fs.writeFileSync(
|
|
1087
1080
|
envPath,
|
|
@@ -1127,5 +1120,6 @@ export {
|
|
|
1127
1120
|
buildPortProxyRouter,
|
|
1128
1121
|
splitFileFactory,
|
|
1129
1122
|
getNpmRootPath,
|
|
1123
|
+
getUnderpostRootPath,
|
|
1130
1124
|
writeEnv,
|
|
1131
1125
|
};
|
package/src/server/dns.js
CHANGED
|
@@ -1,17 +1,10 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
2
|
import dotenv from 'dotenv';
|
|
3
3
|
import fs from 'fs';
|
|
4
|
-
import https from 'https';
|
|
5
4
|
import validator from 'validator';
|
|
6
5
|
import { ip } from './network.js';
|
|
7
6
|
import { loggerFactory } from './logger.js';
|
|
8
|
-
import
|
|
9
|
-
|
|
10
|
-
const httpsAgent = new https.Agent({
|
|
11
|
-
rejectUnauthorized: false,
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
axios.defaults.httpsAgent = httpsAgent;
|
|
7
|
+
import UnderpostRootEnv from '../cli/env.js';
|
|
15
8
|
|
|
16
9
|
dotenv.config();
|
|
17
10
|
|
|
@@ -30,47 +23,47 @@ class Dns {
|
|
|
30
23
|
// Forward the router's TCP/UDP ports to the LAN device's IP address
|
|
31
24
|
for (const _deployId of deployList.split(',')) {
|
|
32
25
|
const deployId = _deployId.trim();
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
const privateCronConfPath = `./engine-private/conf/${deployId}/conf.cron.json`;
|
|
27
|
+
const confCronPath = fs.existsSync(privateCronConfPath) ? privateCronConfPath : './conf/conf.cron.json';
|
|
28
|
+
const confCronData = JSON.parse(fs.readFileSync(confCronPath, 'utf8'));
|
|
36
29
|
|
|
37
|
-
|
|
30
|
+
let testIp;
|
|
38
31
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const currentIp =
|
|
46
|
-
? fs.readFileSync(`./engine-private/deploy/${ipFileName}`, 'utf8')
|
|
47
|
-
: undefined;
|
|
32
|
+
try {
|
|
33
|
+
testIp = await ip.public.ipv4();
|
|
34
|
+
} catch (error) {
|
|
35
|
+
logger.error(error, { testIp, stack: error.stack });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const currentIp = UnderpostRootEnv.API.get('ip');
|
|
48
39
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
40
|
+
if (testIp && typeof testIp === 'string' && validator.isIP(testIp) && currentIp !== testIp) {
|
|
41
|
+
logger.info(`new ip`, testIp);
|
|
42
|
+
for (const recordType of Object.keys(confCronData.records)) {
|
|
43
|
+
switch (recordType) {
|
|
44
|
+
case 'A':
|
|
45
|
+
for (const dnsProvider of confCronData.records[recordType]) {
|
|
46
|
+
if (typeof Dns.services.updateIp[dnsProvider.dns] === 'function')
|
|
47
|
+
await Dns.services.updateIp[dnsProvider.dns]({ ...dnsProvider, ip: testIp });
|
|
48
|
+
}
|
|
49
|
+
break;
|
|
59
50
|
|
|
60
|
-
|
|
61
|
-
|
|
51
|
+
default:
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
62
54
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
55
|
+
try {
|
|
56
|
+
const ipUrlTest = `https://${process.env.DEFAULT_DEPLOY_HOST}`;
|
|
57
|
+
const response = await axios.get(ipUrlTest);
|
|
58
|
+
const verifyIp = response.request.socket.remoteAddress;
|
|
59
|
+
logger.info(ipUrlTest + ' verify ip', verifyIp);
|
|
60
|
+
if (verifyIp === testIp) {
|
|
61
|
+
logger.info('ip updated successfully', testIp);
|
|
62
|
+
UnderpostRootEnv.API.set('ip', testIp);
|
|
63
|
+
} else logger.error('ip not updated', testIp);
|
|
64
|
+
} catch (error) {
|
|
65
|
+
logger.error(error, error.stack);
|
|
66
|
+
logger.error('ip not updated', testIp);
|
|
74
67
|
}
|
|
75
68
|
}
|
|
76
69
|
}
|
package/src/server/downloader.js
CHANGED
|
@@ -2,16 +2,8 @@ import axios from 'axios';
|
|
|
2
2
|
import fs from 'fs';
|
|
3
3
|
import { loggerFactory } from './logger.js';
|
|
4
4
|
import dotenv from 'dotenv';
|
|
5
|
-
import https from 'https';
|
|
6
|
-
|
|
7
5
|
dotenv.config();
|
|
8
6
|
|
|
9
|
-
const httpsAgent = new https.Agent({
|
|
10
|
-
rejectUnauthorized: false,
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
axios.defaults.httpsAgent = httpsAgent;
|
|
14
|
-
|
|
15
7
|
const logger = loggerFactory(import.meta);
|
|
16
8
|
|
|
17
9
|
const Downloader = (url, fullPath, options = { method: 'get', responseType: 'stream' }) =>
|
package/test/api.test.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
import axios from 'axios';
|
|
4
4
|
import dotenv from 'dotenv';
|
|
5
|
-
import https from 'https';
|
|
6
5
|
|
|
7
6
|
import { expect } from 'chai';
|
|
8
7
|
import { loggerFactory } from '../src/server/logger.js';
|
|
@@ -20,13 +19,6 @@ const BASE_URL =
|
|
|
20
19
|
? `http://localhost:${PORT}/${process.env.BASE_API}`
|
|
21
20
|
: `https://www.nexodev.org/api`;
|
|
22
21
|
|
|
23
|
-
axios.defaults.baseURL = BASE_URL;
|
|
24
|
-
|
|
25
|
-
const httpsAgent = new https.Agent({
|
|
26
|
-
rejectUnauthorized: false,
|
|
27
|
-
});
|
|
28
|
-
axios.defaults.httpsAgent = httpsAgent;
|
|
29
|
-
|
|
30
22
|
describe(`GET 'Test' API Request `, async () => {
|
|
31
23
|
{
|
|
32
24
|
const url = `${BASE_URL}/test/youtube-id/?url=https://www.youtube.com/watch?v=o4f42SbyDMk`;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
# kubectl apply -k core/.
|
|
3
|
-
apiVersion: kustomize.config.k8s.io/v1beta1
|
|
4
|
-
kind: Kustomization
|
|
5
|
-
resources:
|
|
6
|
-
- underpost-engine-pv-pvc.yaml
|
|
7
|
-
- underpost-engine-headless-service.yaml
|
|
8
|
-
- underpost-engine-statefulset.yaml
|
|
9
|
-
- underpost-engine-backup-pv-pvc.yaml
|
|
10
|
-
- underpost-engine-mongodb-backup-cronjob.yaml
|
|
11
|
-
- underpost-engine-backup-access.yaml
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
apiVersion: v1
|
|
2
|
-
kind: Pod
|
|
3
|
-
metadata:
|
|
4
|
-
name: backup-access
|
|
5
|
-
spec:
|
|
6
|
-
containers:
|
|
7
|
-
- name: busybox
|
|
8
|
-
image: busybox
|
|
9
|
-
command: ['sh', '-c', 'sleep 3600']
|
|
10
|
-
volumeMounts:
|
|
11
|
-
- name: backup-storage
|
|
12
|
-
mountPath: /backup
|
|
13
|
-
volumes:
|
|
14
|
-
- name: backup-storage
|
|
15
|
-
persistentVolumeClaim:
|
|
16
|
-
claimName: backup-pvc
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
apiVersion: v1
|
|
2
|
-
kind: PersistentVolume
|
|
3
|
-
metadata:
|
|
4
|
-
name: backup-pv
|
|
5
|
-
spec:
|
|
6
|
-
capacity:
|
|
7
|
-
storage: 5Gi
|
|
8
|
-
accessModes:
|
|
9
|
-
- ReadWriteOnce
|
|
10
|
-
hostPath:
|
|
11
|
-
path: /mnt/backup
|
|
12
|
-
---
|
|
13
|
-
apiVersion: v1
|
|
14
|
-
kind: PersistentVolumeClaim
|
|
15
|
-
metadata:
|
|
16
|
-
name: backup-pvc
|
|
17
|
-
spec:
|
|
18
|
-
accessModes:
|
|
19
|
-
- ReadWriteOnce
|
|
20
|
-
resources:
|
|
21
|
-
requests:
|
|
22
|
-
storage: 5Gi
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
apiVersion: batch/v1
|
|
2
|
-
kind: CronJob
|
|
3
|
-
metadata:
|
|
4
|
-
name: mongodb-backup
|
|
5
|
-
spec:
|
|
6
|
-
schedule: '*/5 * * * *' # Runs backup every five minutes
|
|
7
|
-
jobTemplate:
|
|
8
|
-
spec:
|
|
9
|
-
template:
|
|
10
|
-
spec:
|
|
11
|
-
containers:
|
|
12
|
-
- name: mongodump
|
|
13
|
-
image: docker.io/library/mongo:latest
|
|
14
|
-
command:
|
|
15
|
-
- sh
|
|
16
|
-
- -c
|
|
17
|
-
- |
|
|
18
|
-
# Perform backup
|
|
19
|
-
mongodump -u $MONGO_INITDB_ROOT_USERNAME -p $MONGO_INITDB_ROOT_PASSWORD --host=mongodb-service --port=27017 --out=/backup/$(date +\%Y-\%m-\%dT\%H-\%M-\%S)
|
|
20
|
-
# Remove backups older than 7 days
|
|
21
|
-
find /backup -type d -mtime +7 -exec rm -rf {} +
|
|
22
|
-
volumeMounts:
|
|
23
|
-
- name: backup-storage
|
|
24
|
-
mountPath: /backup
|
|
25
|
-
env:
|
|
26
|
-
- name: MONGO_INITDB_ROOT_USERNAME
|
|
27
|
-
valueFrom:
|
|
28
|
-
secretKeyRef:
|
|
29
|
-
name: mongodb-secret
|
|
30
|
-
key: username
|
|
31
|
-
- name: MONGO_INITDB_ROOT_PASSWORD
|
|
32
|
-
valueFrom:
|
|
33
|
-
secretKeyRef:
|
|
34
|
-
name: mongodb-secret
|
|
35
|
-
key: password
|
|
36
|
-
restartPolicy: Never
|
|
37
|
-
volumes:
|
|
38
|
-
- name: backup-storage
|
|
39
|
-
persistentVolumeClaim:
|
|
40
|
-
claimName: backup-pvc
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# origin conf: /etc/mongod.conf
|
|
2
|
-
apiVersion: v1
|
|
3
|
-
kind: ConfigMap
|
|
4
|
-
metadata:
|
|
5
|
-
name: mongodb-config-file
|
|
6
|
-
namespace: default
|
|
7
|
-
data:
|
|
8
|
-
mongod.conf: |
|
|
9
|
-
storage:
|
|
10
|
-
dbPath: /data/db
|
|
11
|
-
systemLog:
|
|
12
|
-
destination: file
|
|
13
|
-
logAppend: true
|
|
14
|
-
path: /var/log/mongodb/mongod.log
|
|
15
|
-
replication:
|
|
16
|
-
replSetName: rs0
|
|
17
|
-
net:
|
|
18
|
-
bindIp: 127.0.0.1
|
|
19
|
-
port: 27017
|
|
20
|
-
processManagement:
|
|
21
|
-
fork: true
|
|
22
|
-
setParameter:
|
|
23
|
-
enableLocalhostAuthBypass: false
|
|
24
|
-
security:
|
|
25
|
-
authorization: enabled
|
|
26
|
-
keyFile: /etc/mongodb-keyfile
|