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/bin/index.js CHANGED
@@ -2,22 +2,14 @@
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';
9
7
  import Underpost from '../src/index.js';
10
8
 
11
9
  dotenv.config();
12
10
 
13
11
  const logger = loggerFactory(import.meta);
14
12
 
15
- const globalBinFolder = `${shellExec(`npm root -g`, {
16
- stdout: true,
17
- silent: true,
18
- disableLog: true,
19
- }).trim()}/underpost`;
20
-
21
13
  const program = new Command();
22
14
 
23
15
  program.name('underpost').description(`underpost.net ci/cd cli ${Underpost.version}`).version(Underpost.version);
@@ -25,51 +17,39 @@ program.name('underpost').description(`underpost.net ci/cd cli ${Underpost.versi
25
17
  program
26
18
  .command('new <app-name>')
27
19
  .description('Create a new project')
28
- .action(async (appName) => {
29
- console.log(
30
- underpostASCI() +
31
- `
32
- ${Underpost.version} https://www.nexodev.org/docs
33
- `,
34
- );
35
- await logger.setUpInfo();
36
- const destFolder = `${process.cwd()}/${appName}`;
37
- logger.info('Note: This process may take several minutes to complete');
38
- logger.info('build app', { destFolder });
39
- fs.mkdirSync(destFolder, { recursive: true });
40
- fs.copySync(globalBinFolder, destFolder);
41
- fs.writeFileSync(`${destFolder}/.gitignore`, fs.readFileSync(`${globalBinFolder}/.dockerignore`, 'utf8'), 'utf8');
42
- shellCd(`${destFolder}`);
43
- shellExec(`git init && git add . && git commit -m "Base template implementation"`);
44
- shellExec(`npm run install-template`);
45
- switch (process.platform) {
46
- case 'linux':
47
- try {
48
- await MongooseDB.server();
49
- } catch (error) {
50
- logger.error(error, 'failed to start mongodb server');
51
- }
52
- break;
20
+ .action((...args) => ((args[1] = Underpost.version), new Underpost.project(...args)));
53
21
 
54
- default:
55
- break;
56
- }
57
- shellExec(`npm run dev`);
58
- });
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);
59
26
 
60
27
  program
61
- .command('test')
62
- .description('Run tests')
63
- .action(() => {
64
- console.log(
65
- underpostASCI() +
66
- `
67
- ${Underpost.version} https://www.nexodev.org/docs
68
- `,
69
- );
70
- shellCd(`${globalBinFolder}`);
71
- shellExec(`npm run test`);
72
- });
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);
73
53
 
74
54
  program
75
55
  .command('help')
@@ -78,4 +58,6 @@ program
78
58
  program.outputHelp();
79
59
  });
80
60
 
61
+ const options = program.opts();
62
+
81
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,10 @@ 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';
16
13
  import keyword_extractor from 'keyword-extractor';
17
14
 
18
15
  const httpsAgent = new https.Agent({
@@ -29,35 +26,10 @@ const operator = process.argv[2];
29
26
  try {
30
27
  // let cmd;
31
28
  switch (operator) {
32
- case 'cls':
33
- fs.removeSync('./public');
34
- fs.removeSync('./logs');
35
- fs.removeSync('./conf');
36
- // fs.removeSync('./engine-private');
37
- // fs.removeSync('./node_modules');
38
- break;
39
29
  case 'log':
40
- (() => {
41
- const logPath = `./logs/${process.argv[3]}/${process.argv[4]}.log`;
42
- logger.info('Read', logPath);
43
- console.log(fs.readFileSync(logPath, 'utf8'));
44
- })();
45
- break;
46
- case 'kill-ports':
47
- if (!process.argv[3]) process.argv[3] = '22,80,443,3000-3020';
48
- for (const port of process.argv[3].split(',')) {
49
- const rangePort = port.split('-');
50
- if (rangePort[1])
51
- for (const port of range(parseInt(rangePort[0]), parseInt(rangePort[1]))) {
52
- logger.info('clean port', port);
53
- await network.port.portClean(port);
54
- }
55
- else {
56
- logger.info('clean port', parseInt(port));
57
- await network.port.portClean(port);
58
- }
59
- }
30
+ console.log(fs.readFileSync(process.argv[3], 'utf8'));
60
31
  break;
32
+
61
33
  case 'system-info':
62
34
  await (async () => {
63
35
  for (const infoKey of Object.keys(si)) {
@@ -74,56 +46,6 @@ try {
74
46
  }
75
47
  })();
76
48
  break;
77
- case 'export-git-changes':
78
- {
79
- const baseFrom = process.argv[3];
80
- const baseTo = process.argv[4];
81
- // if (fs.existsSync(baseTo)) fs.removeSync(baseTo);
82
- shellCd(baseFrom);
83
- {
84
- try {
85
- let output = shellExec('git status', { silent: true, stdout: true });
86
- console.log('output:', output);
87
- output = output
88
- .split(`to discard changes in working directory)`)[1]
89
- .split(`Untracked files:`)[0]
90
- .split('modified:')
91
- .map((c) => c.trim().replaceAll(`\n`, ''));
92
- output[output.length - 1] = output[output.length - 1].split('no changes added to commit')[0];
93
- output.shift();
94
- for (const fromPath of output) {
95
- const from = `${baseFrom}/${fromPath}`;
96
- const to = `${baseTo}/${fromPath}`;
97
- logger.info('Copy path', { from, to });
98
- fs.copySync(from, to);
99
- }
100
- } catch (error) {
101
- logger.error(error);
102
- }
103
- }
104
- {
105
- try {
106
- let output = shellExec('git status', { silent: true, stdout: true });
107
- console.log('output:', output);
108
- output = output
109
- .split(`to include in what will be committed)`)[1]
110
- .split(`no changes added to commit`)[0]
111
- .split(`\n`)
112
- .map((l) => l.trim())
113
- .filter((l) => l);
114
-
115
- for (const fromPath of output) {
116
- const from = `${baseFrom}/${fromPath}`;
117
- const to = `${baseTo}/${fromPath}`;
118
- logger.info('Copy path', { from, to });
119
- fs.copySync(from, to);
120
- }
121
- } catch (error) {
122
- logger.error(error);
123
- }
124
- }
125
- }
126
- break;
127
49
  case 'delete-empty-folder':
128
50
  function cleanEmptyFoldersRecursively(folder) {
129
51
  if (!fs.existsSync(folder)) {
@@ -190,12 +112,6 @@ try {
190
112
  fs.writeFileSync('b64-image', `data:image/jpg;base64,${fs.readFileSync(process.argv[3]).toString('base64')}`);
191
113
  break;
192
114
 
193
- case 'get-ip': {
194
- const response = await axios.get(process.argv[3]);
195
- logger.info(process.argv[3] + ' IP', response.request.socket.remoteAddress);
196
- break;
197
- }
198
-
199
115
  case 'clean-env': {
200
116
  shellExec(`git checkout package.json`);
201
117
  shellExec(`git checkout .env.production`);
@@ -222,6 +138,10 @@ try {
222
138
  console.log(extraction_result.join(', '));
223
139
  break;
224
140
  }
141
+
142
+ case 'build-ports': {
143
+ pbcopy(buildKindPorts(process.argv[3], process.argv[4]));
144
+ }
225
145
  default:
226
146
  break;
227
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,4 +1,8 @@
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: {
@@ -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,35 +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
- path: '/maintenance',
198
- title: 'Server Maintenance',
199
- client: 'Maintenance',
200
- head: [],
201
- body: [],
202
- },
203
- ],
204
- pages: [
205
- {
206
- path: '/test',
207
- title: 'Test',
208
- client: 'Test',
209
- head: [],
210
- body: [],
211
- },
136
+ { path: '/offline', title: 'No Network Connection', client: 'NoNetworkConnection', head: [], body: [] },
137
+ { path: '/maintenance', title: 'Server Maintenance', client: 'Maintenance', head: [], body: [] },
212
138
  ],
139
+ pages: [{ path: '/test', title: 'Test', client: 'Test', head: [], body: [] }],
213
140
  },
214
141
  },
215
142
  server: {
@@ -227,24 +154,14 @@ const DefaultConf = {
227
154
  ws: 'core',
228
155
  peer: true,
229
156
  proxy: [80, 443],
230
- db: {
231
- provider: 'mongoose',
232
- host: 'mongodb://127.0.0.1:27017',
233
- name: 'default',
234
- },
157
+ db: { provider: 'mongoose', host: 'mongodb://127.0.0.1:27017', name: 'default' },
235
158
  mailer: {
236
- sender: {
237
- email: 'noreply@default.net',
238
- name: 'Default',
239
- },
159
+ sender: { email: 'noreply@default.net', name: 'Default' },
240
160
  transport: {
241
161
  host: 'smtp.default.com',
242
162
  port: 465,
243
163
  secure: true,
244
- auth: {
245
- user: 'noreply@default.net',
246
- pass: '',
247
- },
164
+ auth: { user: 'noreply@default.net', pass: '' },
248
165
  },
249
166
  },
250
167
  },
@@ -262,35 +179,11 @@ const DefaultConf = {
262
179
  },
263
180
  },
264
181
  cron: {
265
- ipDaemon: {
266
- ip: null,
267
- },
268
- records: {
269
- A: [
270
- {
271
- host: 'example.com',
272
- dns: 'dondominio',
273
- api_key: '???',
274
- user: '???',
275
- },
276
- ],
277
- },
278
- backups: [
279
- {
280
- deployGroupId: 'default-group',
281
- },
282
- ],
283
- jobs: {
284
- dns: {
285
- expression: '* * * * *',
286
- enabled: true,
287
- },
288
- backups: {
289
- expression: '0 1 * * *',
290
- enabled: true,
291
- },
292
- },
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 } },
293
186
  },
294
- };
187
+ }; /**/
295
188
 
296
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.1'
61
+ engine.version: '2.8.41'
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