@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.
Files changed (91) 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 +12 -5
  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 +107 -71
  13. package/bin/file.js +33 -4
  14. package/bin/index.js +35 -54
  15. package/bin/ssl.js +19 -11
  16. package/bin/util.js +27 -89
  17. package/bin/vs.js +25 -2
  18. package/conf.js +32 -132
  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 +16 -35
  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/Account.js +4 -2
  46. package/src/client/components/core/Auth.js +2 -2
  47. package/src/client/components/core/CalendarCore.js +115 -49
  48. package/src/client/components/core/CommonJs.js +150 -19
  49. package/src/client/components/core/Css.js +1 -1
  50. package/src/client/components/core/CssCore.js +6 -0
  51. package/src/client/components/core/Docs.js +2 -1
  52. package/src/client/components/core/DropDown.js +5 -1
  53. package/src/client/components/core/Input.js +17 -3
  54. package/src/client/components/core/JoyStick.js +8 -5
  55. package/src/client/components/core/Modal.js +17 -11
  56. package/src/client/components/core/Panel.js +85 -25
  57. package/src/client/components/core/PanelForm.js +11 -19
  58. package/src/client/components/core/SignUp.js +4 -1
  59. package/src/client/components/core/Translate.js +57 -9
  60. package/src/client/components/core/Validator.js +9 -1
  61. package/src/client/public/default/plantuml/client-conf.svg +1 -1
  62. package/src/client/public/default/plantuml/server-conf.svg +1 -1
  63. package/src/client/public/default/plantuml/server-schema.svg +1 -1
  64. package/src/client/public/default/plantuml/ssr-conf.svg +1 -1
  65. package/src/client/public/default/plantuml/ssr-schema.svg +1 -1
  66. package/src/client/services/core/core.service.js +2 -0
  67. package/src/client/services/default/default.management.js +4 -2
  68. package/src/client/ssr/body/CacheControl.js +2 -1
  69. package/src/client/ssr/body/DefaultSplashScreen.js +3 -3
  70. package/src/client/ssr/offline/Maintenance.js +63 -0
  71. package/src/client/sw/default.sw.js +23 -3
  72. package/src/db/mongo/MongooseDB.js +13 -1
  73. package/src/index.js +15 -0
  74. package/src/runtime/lampp/Lampp.js +1 -13
  75. package/src/runtime/xampp/Xampp.js +0 -13
  76. package/src/server/auth.js +3 -3
  77. package/src/server/client-build.js +8 -17
  78. package/src/server/client-icons.js +1 -1
  79. package/src/server/conf.js +299 -32
  80. package/src/server/dns.js +2 -3
  81. package/src/server/logger.js +18 -11
  82. package/src/server/network.js +0 -36
  83. package/src/server/process.js +25 -2
  84. package/src/server/project.js +39 -0
  85. package/src/server/proxy.js +4 -26
  86. package/src/server/runtime.js +6 -7
  87. package/src/server/ssl.js +1 -1
  88. package/src/server/valkey.js +3 -0
  89. package/startup.cjs +12 -0
  90. package/src/server/prompt-optimizer.js +0 -28
  91. package/startup.js +0 -11
package/bin/index.js CHANGED
@@ -2,75 +2,54 @@
2
2
 
3
3
  import dotenv from 'dotenv';
4
4
  import { shellCd, shellExec } from '../src/server/process.js';
5
- import fs from 'fs-extra';
6
5
  import { Command } from 'commander';
7
- import { MongooseDB } from '../src/db/mongo/MongooseDB.js';
8
- import { loggerFactory, underpostASCI } from '../src/server/logger.js';
6
+ import { actionInitLog, loggerFactory } from '../src/server/logger.js';
7
+ import Underpost from '../src/index.js';
9
8
 
10
9
  dotenv.config();
11
10
 
12
11
  const logger = loggerFactory(import.meta);
13
12
 
14
- const globalBinFolder = `${shellExec(`npm root -g`, {
15
- stdout: true,
16
- silent: true,
17
- disableLog: true,
18
- }).trim()}/underpost`;
19
-
20
13
  const program = new Command();
21
14
 
22
- const version = '2.8.0';
23
-
24
- program.name('underpost').description(`underpost.net ci/cd cli ${version}`).version(version);
15
+ program.name('underpost').description(`underpost.net ci/cd cli ${Underpost.version}`).version(Underpost.version);
25
16
 
26
17
  program
27
18
  .command('new <app-name>')
28
19
  .description('Create a new project')
29
- .action(async (appName) => {
30
- console.log(
31
- underpostASCI() +
32
- `
33
- v${version} https://www.nexodev.org/docs
34
- `,
35
- );
36
- await logger.setUpInfo();
37
- const destFolder = `${process.cwd()}/${appName}`;
38
- logger.info('Note: This process may take several minutes to complete');
39
- logger.info('build app', { destFolder });
40
- fs.mkdirSync(destFolder, { recursive: true });
41
- fs.copySync(globalBinFolder, destFolder);
42
- fs.writeFileSync(`${destFolder}/.gitignore`, fs.readFileSync(`${globalBinFolder}/.dockerignore`, 'utf8'), 'utf8');
43
- shellCd(`${destFolder}`);
44
- shellExec(`git init && git add . && git commit -m "Base template implementation"`);
45
- shellExec(`npm run install-template`);
46
- switch (process.platform) {
47
- case 'linux':
48
- try {
49
- await MongooseDB.server();
50
- } catch (error) {
51
- logger.error(error, 'failed to start mongodb server');
52
- }
53
- break;
20
+ .action((...args) => ((args[1] = Underpost.version), new Underpost.project(...args)));
54
21
 
55
- default:
56
- break;
57
- }
58
- shellExec(`npm run dev`);
59
- });
22
+ program
23
+ .command('clone <uri>')
24
+ .description('Clone github repository, if your GITHUB_TOKEN environment exists, it will be used')
25
+ .action(Underpost.project.clone);
60
26
 
61
27
  program
62
- .command('test')
63
- .description('Run tests')
64
- .action(() => {
65
- console.log(
66
- underpostASCI() +
67
- `
68
- v${version} https://www.nexodev.org/docs
69
- `,
70
- );
71
- shellCd(`${globalBinFolder}`);
72
- shellExec(`npm run test`);
73
- });
28
+ .command('pull <path> <uri>')
29
+ .description('Pull github repository, if your GITHUB_TOKEN environment exists, it will be used')
30
+ .action(Underpost.project.pull);
31
+
32
+ program
33
+ .option('--copy')
34
+ .option('--info')
35
+ .option('--empty')
36
+ .command('cmt <path> [commit-type] [sub-module] [message]')
37
+ .description(
38
+ 'Commit github repository, if your GITHUB_TOKEN environment exists, it will be used, use --copy will copy to clipboard message, use --info will see info commit types, use --empty will allow empty files',
39
+ )
40
+ .action((...args) => ((args[4] = options), Underpost.project.commit(...args)));
41
+
42
+ program
43
+ .command('push <path> <uri>')
44
+ .description('Push github repository, if your GITHUB_TOKEN environment exists, it will be used')
45
+ .action(Underpost.project.push);
46
+
47
+ program
48
+ .command('env <deploy-id> [env]')
49
+ .description('Set environment variables files and conf related to <deploy-id>')
50
+ .action(Underpost.project.useEnv);
51
+
52
+ program.command('test').description('Run tests').action(Underpost.runTest);
74
53
 
75
54
  program
76
55
  .command('help')
@@ -79,4 +58,6 @@ program
79
58
  program.outputHelp();
80
59
  });
81
60
 
61
+ const options = program.opts();
62
+
82
63
  program.parse();
package/bin/ssl.js CHANGED
@@ -1,9 +1,7 @@
1
1
  import fs from 'fs';
2
2
  import read from 'read';
3
- import ncp from 'copy-paste';
4
3
  import dotenv from 'dotenv';
5
-
6
- import { getRootDirectory, shellExec } from '../src/server/process.js';
4
+ import { getRootDirectory, pbcopy, shellExec } from '../src/server/process.js';
7
5
  import { loggerFactory } from '../src/server/logger.js';
8
6
  import { Cmd, loadConf } from '../src/server/conf.js';
9
7
  import { buildSSL } from '../src/server/ssl.js';
@@ -24,9 +22,9 @@ try {
24
22
  for (const host of hosts.split(',')) {
25
23
  if (host in confServer) {
26
24
  const directory = confServer[host]['/']?.['directory'] ? confServer[host]['/']['directory'] : undefined;
27
- cmd = `certbot certonly --webroot --webroot-path ${
25
+ cmd = `sudo certbot certonly --webroot --webroot-path ${
28
26
  directory ? directory : `${getRootDirectory()}/public/${host}`
29
- } -d ${host}`;
27
+ } --cert-name ${host} -d ${host}`;
30
28
  // directory ? directory : `${getRootDirectory()}/public/${host}`
31
29
  // directory ? directory : `${getRootDirectory()}/public/www.${host.split('.').slice(-2).join('.')}`
32
30
 
@@ -38,16 +36,26 @@ try {
38
36
  // certbot delete --cert-name <domain>
39
37
 
40
38
  logger.info(`Run the following command`, cmd);
41
- await ncp.copy(cmd);
42
- await read({ prompt: 'Command copy to clipboard, press enter to continue.\n' });
39
+ try {
40
+ await pbcopy(cmd);
41
+ await read({ prompt: 'Command copy to clipboard, press enter to continue.\n' });
42
+ } catch (error) {
43
+ logger.error(error);
44
+ }
43
45
  // Certificate
44
- await buildSSL(host);
46
+ if (process.argv.includes('build')) await buildSSL(host);
45
47
  logger.info('Certificate saved', host);
46
48
  } else throw new Error(`host not found: ${host}`);
47
49
  }
48
-
49
- cmd = `certbot renew --dry-run`;
50
- await ncp.copy(cmd);
50
+ // check for renewal conf:
51
+ // /etc/letsencrypt/renewal
52
+ // /etc/letsencrypt/live
53
+ cmd = `sudo certbot renew --dry-run`;
54
+ try {
55
+ await pbcopy(cmd);
56
+ } catch (error) {
57
+ logger.error(error);
58
+ }
51
59
  logger.info(`run the following command for renewal. Command copy to clipboard`, cmd);
52
60
  logger.info(`success install SLL`, hosts);
53
61
  } catch (error) {
package/bin/util.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import fs from 'fs-extra';
2
- import merge from 'deepmerge';
3
2
  import si from 'systeminformation';
4
3
  import * as dir from 'path';
5
4
  import { svg } from 'font-awesome-assets';
@@ -7,12 +6,11 @@ import axios from 'axios';
7
6
  import https from 'https';
8
7
 
9
8
  import { loggerFactory } from '../src/server/logger.js';
10
- import { shellCd, shellExec } from '../src/server/process.js';
11
- import { range, s4 } from '../src/client/components/core/CommonJs.js';
12
- import { network } from '../src/server/network.js';
13
- import { Config } from '../src/server/conf.js';
9
+ import { pbcopy, shellExec } from '../src/server/process.js';
10
+ import { buildKindPorts } from '../src/server/conf.js';
14
11
  import { FileFactory } from '../src/api/file/file.service.js';
15
- import { buildTextImg, faBase64Png, getBufferPngText } from '../src/server/client-icons.js';
12
+ import { faBase64Png, getBufferPngText } from '../src/server/client-icons.js';
13
+ import keyword_extractor from 'keyword-extractor';
16
14
 
17
15
  const httpsAgent = new https.Agent({
18
16
  rejectUnauthorized: false,
@@ -28,35 +26,10 @@ const operator = process.argv[2];
28
26
  try {
29
27
  // let cmd;
30
28
  switch (operator) {
31
- case 'cls':
32
- fs.removeSync('./public');
33
- fs.removeSync('./logs');
34
- fs.removeSync('./conf');
35
- // fs.removeSync('./engine-private');
36
- // fs.removeSync('./node_modules');
37
- break;
38
29
  case 'log':
39
- (() => {
40
- const logPath = `./logs/${process.argv[3]}/${process.argv[4]}.log`;
41
- logger.info('Read', logPath);
42
- console.log(fs.readFileSync(logPath, 'utf8'));
43
- })();
44
- break;
45
- case 'kill-ports':
46
- if (!process.argv[3]) process.argv[3] = '22,80,443,3000-3020';
47
- for (const port of process.argv[3].split(',')) {
48
- const rangePort = port.split('-');
49
- if (rangePort[1])
50
- for (const port of range(parseInt(rangePort[0]), parseInt(rangePort[1]))) {
51
- logger.info('clean port', port);
52
- await network.port.portClean(port);
53
- }
54
- else {
55
- logger.info('clean port', parseInt(port));
56
- await network.port.portClean(port);
57
- }
58
- }
30
+ console.log(fs.readFileSync(process.argv[3], 'utf8'));
59
31
  break;
32
+
60
33
  case 'system-info':
61
34
  await (async () => {
62
35
  for (const infoKey of Object.keys(si)) {
@@ -73,56 +46,6 @@ try {
73
46
  }
74
47
  })();
75
48
  break;
76
- case 'export-git-changes':
77
- {
78
- const baseFrom = process.argv[3];
79
- const baseTo = process.argv[4];
80
- // if (fs.existsSync(baseTo)) fs.removeSync(baseTo);
81
- shellCd(baseFrom);
82
- {
83
- try {
84
- let output = shellExec('git status', { silent: true, stdout: true });
85
- console.log('output:', output);
86
- output = output
87
- .split(`to discard changes in working directory)`)[1]
88
- .split(`Untracked files:`)[0]
89
- .split('modified:')
90
- .map((c) => c.trim().replaceAll(`\n`, ''));
91
- output[output.length - 1] = output[output.length - 1].split('no changes added to commit')[0];
92
- output.shift();
93
- for (const fromPath of output) {
94
- const from = `${baseFrom}/${fromPath}`;
95
- const to = `${baseTo}/${fromPath}`;
96
- logger.info('Copy path', { from, to });
97
- fs.copySync(from, to);
98
- }
99
- } catch (error) {
100
- logger.error(error);
101
- }
102
- }
103
- {
104
- try {
105
- let output = shellExec('git status', { silent: true, stdout: true });
106
- console.log('output:', output);
107
- output = output
108
- .split(`to include in what will be committed)`)[1]
109
- .split(`no changes added to commit`)[0]
110
- .split(`\n`)
111
- .map((l) => l.trim())
112
- .filter((l) => l);
113
-
114
- for (const fromPath of output) {
115
- const from = `${baseFrom}/${fromPath}`;
116
- const to = `${baseTo}/${fromPath}`;
117
- logger.info('Copy path', { from, to });
118
- fs.copySync(from, to);
119
- }
120
- } catch (error) {
121
- logger.error(error);
122
- }
123
- }
124
- }
125
- break;
126
49
  case 'delete-empty-folder':
127
50
  function cleanEmptyFoldersRecursively(folder) {
128
51
  if (!fs.existsSync(folder)) {
@@ -189,12 +112,6 @@ try {
189
112
  fs.writeFileSync('b64-image', `data:image/jpg;base64,${fs.readFileSync(process.argv[3]).toString('base64')}`);
190
113
  break;
191
114
 
192
- case 'get-ip': {
193
- const response = await axios.get(process.argv[3]);
194
- logger.info(process.argv[3] + ' IP', response.request.socket.remoteAddress);
195
- break;
196
- }
197
-
198
115
  case 'clean-env': {
199
116
  shellExec(`git checkout package.json`);
200
117
  shellExec(`git checkout .env.production`);
@@ -203,7 +120,28 @@ try {
203
120
  shellExec(`git checkout jsdoc.json`);
204
121
  break;
205
122
  }
123
+ case 'get-keys': {
124
+ const sentence = fs.existsSync('./_')
125
+ ? fs.readFileSync('./_', 'utf8')
126
+ : process.argv[3]
127
+ ? process.argv[3]
128
+ : 'President Obama woke up Monday facing a Congressional defeat that many in both parties believed could hobble his presidency.';
129
+
130
+ // Extract the keywords
131
+ const extraction_result = keyword_extractor.extract(sentence, {
132
+ language: 'english',
133
+ remove_digits: true,
134
+ // return_changed_case: true,
135
+ // remove_duplicates: false,
136
+ });
206
137
 
138
+ console.log(extraction_result.join(', '));
139
+ break;
140
+ }
141
+
142
+ case 'build-ports': {
143
+ pbcopy(buildKindPorts(process.argv[3], process.argv[4]));
144
+ }
207
145
  default:
208
146
  break;
209
147
  }
package/bin/vs.js CHANGED
@@ -1,18 +1,40 @@
1
1
  import fs from 'fs-extra';
2
2
  import { shellExec } from '../src/server/process.js';
3
+ import { loggerFactory } from '../src/server/logger.js';
4
+
5
+ const logger = loggerFactory(import.meta);
3
6
 
4
7
  switch (process.argv[2]) {
8
+ case 'info': {
9
+ logger.info('Formatted', 'Ctrl shift I');
10
+ logger.info('Command', 'Ctrl shift P');
11
+ logger.info('Search', 'Ctrl shift F');
12
+ logger.info('Debug', 'Ctrl shift D');
13
+ logger.info('New File', 'Ctrl N');
14
+ logger.info('Change tab', 'Ctrl Tab');
15
+ logger.info('Fold All', 'Ctrl K + Ctrl 0');
16
+ logger.info('Unfold All', 'Ctrl K + Ctrl J');
17
+ logger.info('Close All tabs', 'Ctrl K + W');
18
+ logger.info('Go to line number', 'Ctrl G');
19
+ logger.info('Change current project folder', 'Ctrl K + Ctrl O');
20
+ logger.info('Open new vs windows', 'Ctrl Shift N');
21
+ logger.info('Close current vs windows', 'Ctrl Shift W');
22
+ logger.info('Preview md', 'Ctrl shift V');
23
+ logger.warn('Terminal shortcut configure with command pallette', 'Ctl shift T');
24
+ break;
25
+ }
5
26
  case 'import':
6
27
  {
7
28
  const extensions = JSON.parse(fs.readFileSync(`./.vscode/extensions.json`, 'utf8'));
8
29
  extensions.recommendations.map((extension) => {
9
- if (extension) shellExec(`code --install-extension ${extension}`);
30
+ if (extension)
31
+ shellExec(`sudo code --user-data-dir="/root/.vscode-root" --no-sandbox --install-extension ${extension}`);
10
32
  });
11
33
  }
12
34
  break;
13
35
  case 'export':
14
36
  {
15
- shellExec(`code --list-extensions > vs-extensions.txt`);
37
+ shellExec(`sudo code --user-data-dir="/root/.vscode-root" --no-sandbox --list-extensions > vs-extensions.txt`);
16
38
  fs.writeFileSync(
17
39
  `./.vscode/extensions.json`,
18
40
  JSON.stringify(
@@ -31,5 +53,6 @@ switch (process.argv[2]) {
31
53
  }
32
54
  break;
33
55
  default:
56
+ shellExec(`sudo code ${process.argv[2]} --user-data-dir="/root/.vscode-root" --no-sandbox`);
34
57
  break;
35
58
  }
package/conf.js CHANGED
@@ -1,9 +1,13 @@
1
- const DefaultConf = {
1
+ import dotenv from 'dotenv';
2
+
3
+ dotenv.config();
4
+
5
+ const DefaultConf = /**/ {
2
6
  client: {
3
7
  default: {
4
8
  metadata: {
5
9
  title: 'Demo App',
6
- backgroundImage: './src/client/public/default/assets/background/white0-min.jpg',
10
+ backgroundImage: 'assets/background/white0-min.jpg',
7
11
  description: 'Web application',
8
12
  keywords: ['web', 'app', 'spa', 'demo', 'github-pages'],
9
13
  author: 'https://github.com/underpostnet',
@@ -75,58 +79,16 @@ const DefaultConf = {
75
79
  ],
76
80
  },
77
81
  views: [
78
- {
79
- path: '/',
80
- title: 'Home',
81
- client: 'Default',
82
- ssr: 'Default',
83
- },
84
- {
85
- path: '/home',
86
- title: 'Home',
87
- client: 'Default',
88
- ssr: 'Default',
89
- },
90
- {
91
- path: '/settings',
92
- client: 'Default',
93
- ssr: 'Default',
94
- },
95
- {
96
- path: '/log-in',
97
- client: 'Default',
98
- ssr: 'Default',
99
- },
100
- {
101
- path: '/sign-up',
102
- client: 'Default',
103
- ssr: 'Default',
104
- },
105
- {
106
- path: '/log-out',
107
- client: 'Default',
108
- ssr: 'Default',
109
- },
110
- {
111
- path: '/account',
112
- client: 'Default',
113
- ssr: 'Default',
114
- },
115
- {
116
- path: '/docs',
117
- client: 'Default',
118
- ssr: 'Default',
119
- },
120
- {
121
- path: '/recover',
122
- client: 'Default',
123
- ssr: 'Default',
124
- },
125
- {
126
- path: '/default-management',
127
- client: 'Default',
128
- ssr: 'Default',
129
- },
82
+ { path: '/', title: 'Home', client: 'Default', ssr: 'Default' },
83
+ { path: '/home', title: 'Home', client: 'Default', ssr: 'Default' },
84
+ { path: '/settings', client: 'Default', ssr: 'Default' },
85
+ { path: '/log-in', client: 'Default', ssr: 'Default' },
86
+ { path: '/sign-up', client: 'Default', ssr: 'Default' },
87
+ { path: '/log-out', client: 'Default', ssr: 'Default' },
88
+ { path: '/account', client: 'Default', ssr: 'Default' },
89
+ { path: '/docs', client: 'Default', ssr: 'Default' },
90
+ { path: '/recover', client: 'Default', ssr: 'Default' },
91
+ { path: '/default-management', client: 'Default', ssr: 'Default' },
130
92
  { client: 'Default', ssr: 'Default', path: '/404', title: '404 Not Found' },
131
93
  { client: 'Default', ssr: 'Default', path: '/500', title: '500 Server Error' },
132
94
  ],
@@ -137,24 +99,15 @@ const DefaultConf = {
137
99
  import_name: '@neodrag/vanilla',
138
100
  import_name_build: '/dist/@neodrag-vanilla/index.js',
139
101
  },
140
- {
141
- folder: './node_modules/@fortawesome/fontawesome-free',
142
- public_folder: '/dist/fontawesome',
143
- },
102
+ { folder: './node_modules/@fortawesome/fontawesome-free', public_folder: '/dist/fontawesome' },
144
103
  {
145
104
  folder: './node_modules/sortablejs/modular',
146
105
  public_folder: '/dist/sortablejs',
147
106
  import_name: 'sortablejs',
148
107
  import_name_build: '/dist/sortablejs/sortable.complete.esm.js',
149
108
  },
150
- {
151
- folder: './node_modules/validator',
152
- public_folder: '/dist/validator',
153
- },
154
- {
155
- folder: './node_modules/@loadingio/css-spinner/entries',
156
- public_folder: '/dist/loadingio',
157
- },
109
+ { folder: './node_modules/validator', public_folder: '/dist/validator' },
110
+ { folder: './node_modules/@loadingio/css-spinner/entries', public_folder: '/dist/loadingio' },
158
111
  {
159
112
  import_name: 'ag-grid-community',
160
113
  import_name_build: '/dist/ag-grid-community/ag-grid-community.auto.complete.esm.min.js',
@@ -169,10 +122,7 @@ const DefaultConf = {
169
122
  import_name: 'socket.io/client-dist/socket.io.esm.min.js',
170
123
  import_name_build: '/dist/socket.io/socket.io.esm.min.js',
171
124
  },
172
- {
173
- folder: './node_modules/peerjs/dist',
174
- public_folder: '/dist/peerjs',
175
- },
125
+ { folder: './node_modules/peerjs/dist', public_folder: '/dist/peerjs' },
176
126
  ],
177
127
  services: ['default', 'core', 'user', 'test', 'file'],
178
128
  },
@@ -181,28 +131,12 @@ const DefaultConf = {
181
131
  Default: {
182
132
  head: ['Seo', 'Pwa', 'Css', 'DefaultScripts', 'Production'],
183
133
  body: ['CacheControl', 'DefaultSplashScreen', '404', '500'],
184
- mailer: {
185
- userVerifyEmail: 'DefaultVerifyEmail',
186
- userRecoverEmail: 'DefaultRecoverEmail',
187
- },
134
+ mailer: { userVerifyEmail: 'DefaultVerifyEmail', userRecoverEmail: 'DefaultRecoverEmail' },
188
135
  offline: [
189
- {
190
- path: '/offline',
191
- title: 'No Network Connection',
192
- client: 'NoNetworkConnection',
193
- head: [],
194
- body: [],
195
- },
196
- ],
197
- pages: [
198
- {
199
- path: '/test',
200
- title: 'Test',
201
- client: 'Test',
202
- head: [],
203
- body: [],
204
- },
136
+ { path: '/offline', title: 'No Network Connection', client: 'NoNetworkConnection', head: [], body: [] },
137
+ { path: '/maintenance', title: 'Server Maintenance', client: 'Maintenance', head: [], body: [] },
205
138
  ],
139
+ pages: [{ path: '/test', title: 'Test', client: 'Test', head: [], body: [] }],
206
140
  },
207
141
  },
208
142
  server: {
@@ -220,24 +154,14 @@ const DefaultConf = {
220
154
  ws: 'core',
221
155
  peer: true,
222
156
  proxy: [80, 443],
223
- db: {
224
- provider: 'mongoose',
225
- host: 'mongodb://127.0.0.1:27017',
226
- name: 'default',
227
- },
157
+ db: { provider: 'mongoose', host: 'mongodb://127.0.0.1:27017', name: 'default' },
228
158
  mailer: {
229
- sender: {
230
- email: 'noreply@default.net',
231
- name: 'Default',
232
- },
159
+ sender: { email: 'noreply@default.net', name: 'Default' },
233
160
  transport: {
234
161
  host: 'smtp.default.com',
235
162
  port: 465,
236
163
  secure: true,
237
- auth: {
238
- user: 'noreply@default.net',
239
- pass: '',
240
- },
164
+ auth: { user: 'noreply@default.net', pass: '' },
241
165
  },
242
166
  },
243
167
  },
@@ -255,35 +179,11 @@ const DefaultConf = {
255
179
  },
256
180
  },
257
181
  cron: {
258
- ipDaemon: {
259
- ip: null,
260
- },
261
- records: {
262
- A: [
263
- {
264
- host: 'example.com',
265
- dns: 'dondominio',
266
- api_key: '???',
267
- user: '???',
268
- },
269
- ],
270
- },
271
- backups: [
272
- {
273
- deployGroupId: 'default-group',
274
- },
275
- ],
276
- jobs: {
277
- dns: {
278
- expression: '* * * * *',
279
- enabled: true,
280
- },
281
- backups: {
282
- expression: '0 1 * * *',
283
- enabled: true,
284
- },
285
- },
182
+ ipDaemon: { ip: null },
183
+ records: { A: [{ host: 'example.com', dns: 'dondominio', api_key: '???', user: '???' }] },
184
+ backups: [{ deployGroupId: 'default-group' }],
185
+ jobs: { dns: { expression: '* * * * *', enabled: true }, backups: { expression: '0 1 * * *', enabled: true } },
286
186
  },
287
- };
187
+ }; /**/
288
188
 
289
189
  export { DefaultConf };
@@ -58,7 +58,7 @@ services:
58
58
  cpus: '0.25'
59
59
  memory: 20M
60
60
  labels: # labels in Compose file instead of Dockerfile
61
- engine.version: '2.8.0'
61
+ engine.version: '2.8.4'
62
62
  networks:
63
63
  - load-balancer
64
64
 
@@ -0,0 +1,11 @@
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
@@ -0,0 +1,16 @@
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
@@ -0,0 +1,22 @@
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
@@ -0,0 +1,10 @@
1
+ apiVersion: v1
2
+ kind: Service
3
+ metadata:
4
+ name: mongodb-service
5
+ spec:
6
+ clusterIP: None
7
+ selector:
8
+ app: mongodb
9
+ ports:
10
+ - port: 27017