@taon-dev/cloud 21.0.213 → 21.0.216
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/VERIFIED-BUILD-DATA.jsonc +3 -3
- package/bin/cloud +5 -0
- package/bin/cloud-debug +5 -0
- package/bin/cloud-debug-brk +4 -0
- package/browser/fesm2022/cloud-browser.mjs +1 -1
- package/browser/fesm2022/cloud-browser.mjs.map +1 -1
- package/browser/package.json +1 -1
- package/browser/types/cloud-browser.d.ts +1 -1
- package/browser-prod/fesm2022/cloud-browser-prod.mjs +1 -1
- package/browser-prod/fesm2022/cloud-browser-prod.mjs.map +1 -1
- package/browser-prod/package.json +1 -1
- package/browser-prod/types/cloud-browser-prod.d.ts +1 -1
- package/html/assets/generated/pwa/html-pwa.html +60 -0
- package/lib/build-info._auto-generated_.d.ts +1 -1
- package/lib/build-info._auto-generated_.js +1 -1
- package/lib/package.json +1 -1
- package/lib/traefik/traefik.provider.js +1 -1
- package/lib/traefik/traefik.provider.js.map +1 -1
- package/lib-esm/app.d.ts +3 -0
- package/lib-esm/app.electron.d.ts +1 -0
- package/lib-esm/app.electron.js +2 -0
- package/lib-esm/app.electron.js.map +1 -0
- package/lib-esm/app.hosts.d.ts +95 -0
- package/lib-esm/app.hosts.js +157 -0
- package/lib-esm/app.hosts.js.map +1 -0
- package/lib-esm/app.js +460 -0
- package/lib-esm/app.js.map +1 -0
- package/lib-esm/app.vscode.d.ts +9 -0
- package/lib-esm/app.vscode.js +37 -0
- package/lib-esm/app.vscode.js.map +1 -0
- package/lib-esm/cli.d.ts +1 -0
- package/lib-esm/cli.js +4 -0
- package/lib-esm/cli.js.map +1 -0
- package/lib-esm/index.d.ts +1 -0
- package/lib-esm/index.js +2 -0
- package/lib-esm/index.js.map +1 -0
- package/lib-esm/lib/build-info._auto-generated_.d.ts +24 -0
- package/lib-esm/lib/build-info._auto-generated_.js +27 -0
- package/lib-esm/lib/build-info._auto-generated_.js.map +1 -0
- package/lib-esm/lib/constants.d.ts +1 -0
- package/lib-esm/lib/constants.js +3 -0
- package/lib-esm/lib/constants.js.map +1 -0
- package/lib-esm/lib/env/env.angular-node-app.d.ts +67 -0
- package/lib-esm/lib/env/env.angular-node-app.js +137 -0
- package/lib-esm/lib/env/env.angular-node-app.js.map +1 -0
- package/lib-esm/lib/env/env.docs-webapp.d.ts +67 -0
- package/lib-esm/lib/env/env.docs-webapp.js +137 -0
- package/lib-esm/lib/env/env.docs-webapp.js.map +1 -0
- package/lib-esm/lib/env/env.electron-app.d.ts +67 -0
- package/lib-esm/lib/env/env.electron-app.js +137 -0
- package/lib-esm/lib/env/env.electron-app.js.map +1 -0
- package/lib-esm/lib/env/env.mobile-app.d.ts +67 -0
- package/lib-esm/lib/env/env.mobile-app.js +137 -0
- package/lib-esm/lib/env/env.mobile-app.js.map +1 -0
- package/lib-esm/lib/env/env.npm-lib-and-cli-tool.d.ts +67 -0
- package/lib-esm/lib/env/env.npm-lib-and-cli-tool.js +137 -0
- package/lib-esm/lib/env/env.npm-lib-and-cli-tool.js.map +1 -0
- package/lib-esm/lib/env/env.vscode-plugin.d.ts +67 -0
- package/lib-esm/lib/env/env.vscode-plugin.js +137 -0
- package/lib-esm/lib/env/env.vscode-plugin.js.map +1 -0
- package/lib-esm/lib/env/index.d.ts +6 -0
- package/lib-esm/lib/env/index.js +7 -0
- package/lib-esm/lib/env/index.js.map +1 -0
- package/lib-esm/lib/index._auto-generated_.d.ts +25 -0
- package/lib-esm/lib/index._auto-generated_.js +33 -0
- package/lib-esm/lib/index._auto-generated_.js.map +1 -0
- package/lib-esm/lib/index.d.ts +4 -0
- package/lib-esm/lib/index.js +5 -0
- package/lib-esm/lib/index.js.map +1 -0
- package/lib-esm/lib/instances/index.d.ts +4 -0
- package/lib-esm/lib/instances/index.js +6 -0
- package/lib-esm/lib/instances/index.js.map +1 -0
- package/lib-esm/lib/instances/instances.context.d.ts +19 -0
- package/lib-esm/lib/instances/instances.context.js +64 -0
- package/lib-esm/lib/instances/instances.context.js.map +1 -0
- package/lib-esm/lib/instances/instances.controller.d.ts +10 -0
- package/lib-esm/lib/instances/instances.controller.js +61 -0
- package/lib-esm/lib/instances/instances.controller.js.map +1 -0
- package/lib-esm/lib/instances/instances.d.ts +9 -0
- package/lib-esm/lib/instances/instances.defaults-values.d.ts +2 -0
- package/lib-esm/lib/instances/instances.defaults-values.js +5 -0
- package/lib-esm/lib/instances/instances.defaults-values.js.map +1 -0
- package/lib-esm/lib/instances/instances.js +40 -0
- package/lib-esm/lib/instances/instances.js.map +1 -0
- package/lib-esm/lib/instances/instances.repository.d.ts +6 -0
- package/lib-esm/lib/instances/instances.repository.js +17 -0
- package/lib-esm/lib/instances/instances.repository.js.map +1 -0
- package/lib-esm/lib/instances/instances.terminal-ui.d.ts +11 -0
- package/lib-esm/lib/instances/instances.terminal-ui.js +154 -0
- package/lib-esm/lib/instances/instances.terminal-ui.js.map +1 -0
- package/lib-esm/lib/instances/instances.worker.d.ts +18 -0
- package/lib-esm/lib/instances/instances.worker.js +42 -0
- package/lib-esm/lib/instances/instances.worker.js.map +1 -0
- package/lib-esm/lib/models.d.ts +8 -0
- package/lib-esm/lib/models.js +10 -0
- package/lib-esm/lib/models.js.map +1 -0
- package/lib-esm/lib/my-organization-proj.d.ts +1 -0
- package/lib-esm/lib/my-organization-proj.js +3 -0
- package/lib-esm/lib/my-organization-proj.js.map +1 -0
- package/lib-esm/lib/processes/index.d.ts +4 -0
- package/lib-esm/lib/processes/index.js +6 -0
- package/lib-esm/lib/processes/index.js.map +1 -0
- package/lib-esm/lib/processes/processes.context.d.ts +19 -0
- package/lib-esm/lib/processes/processes.context.js +21 -0
- package/lib-esm/lib/processes/processes.context.js.map +1 -0
- package/lib-esm/lib/processes/processes.controller.d.ts +13 -0
- package/lib-esm/lib/processes/processes.controller.js +168 -0
- package/lib-esm/lib/processes/processes.controller.js.map +1 -0
- package/lib-esm/lib/processes/processes.d.ts +24 -0
- package/lib-esm/lib/processes/processes.defaults-values.d.ts +2 -0
- package/lib-esm/lib/processes/processes.defaults-values.js +6 -0
- package/lib-esm/lib/processes/processes.defaults-values.js.map +1 -0
- package/lib-esm/lib/processes/processes.js +159 -0
- package/lib-esm/lib/processes/processes.js.map +1 -0
- package/lib-esm/lib/processes/processes.models.d.ts +33 -0
- package/lib-esm/lib/processes/processes.models.js +43 -0
- package/lib-esm/lib/processes/processes.models.js.map +1 -0
- package/lib-esm/lib/processes/processes.repository.d.ts +18 -0
- package/lib-esm/lib/processes/processes.repository.js +194 -0
- package/lib-esm/lib/processes/processes.repository.js.map +1 -0
- package/lib-esm/lib/processes/processes.terminal-ui.d.ts +19 -0
- package/lib-esm/lib/processes/processes.terminal-ui.js +378 -0
- package/lib-esm/lib/processes/processes.terminal-ui.js.map +1 -0
- package/lib-esm/lib/processes/processes.utils.d.ts +6 -0
- package/lib-esm/lib/processes/processes.utils.js +83 -0
- package/lib-esm/lib/processes/processes.utils.js.map +1 -0
- package/lib-esm/lib/processes/processes.worker.controller.d.ts +3 -0
- package/lib-esm/lib/processes/processes.worker.controller.js +13 -0
- package/lib-esm/lib/processes/processes.worker.controller.js.map +1 -0
- package/lib-esm/lib/processes/processes.worker.d.ts +18 -0
- package/lib-esm/lib/processes/processes.worker.js +52 -0
- package/lib-esm/lib/processes/processes.worker.js.map +1 -0
- package/lib-esm/lib/start-cli.d.ts +7 -0
- package/lib-esm/lib/start-cli.js +43 -0
- package/lib-esm/lib/start-cli.js.map +1 -0
- package/lib-esm/lib/traefik/traefik.models.d.ts +20 -0
- package/lib-esm/lib/traefik/traefik.models.js +2 -0
- package/lib-esm/lib/traefik/traefik.models.js.map +1 -0
- package/lib-esm/lib/traefik/traefik.provider.d.ts +42 -0
- package/lib-esm/lib/traefik/traefik.provider.js +575 -0
- package/lib-esm/lib/traefik/traefik.provider.js.map +1 -0
- package/lib-esm/lib/traefik/treafik-service.provider.d.ts +41 -0
- package/lib-esm/lib/traefik/treafik-service.provider.js +211 -0
- package/lib-esm/lib/traefik/treafik-service.provider.js.map +1 -0
- package/lib-prod/build-info._auto-generated_.d.ts +1 -1
- package/lib-prod/build-info._auto-generated_.js +1 -1
- package/lib-prod/instances/instances.context.js.map +1 -1
- package/lib-prod/instances/instances.controller.js.map +1 -1
- package/lib-prod/instances/instances.js.map +1 -1
- package/lib-prod/instances/instances.repository.js.map +1 -1
- package/lib-prod/instances/instances.terminal-ui.js.map +1 -1
- package/lib-prod/package.json +1 -1
- package/lib-prod/processes/processes.context.js.map +1 -1
- package/lib-prod/processes/processes.controller.js.map +1 -1
- package/lib-prod/processes/processes.js.map +1 -1
- package/lib-prod/processes/processes.repository.js.map +1 -1
- package/lib-prod/processes/processes.terminal-ui.js.map +1 -1
- package/lib-prod/processes/processes.utils.js.map +1 -1
- package/lib-prod/processes/processes.worker.controller.js.map +1 -1
- package/lib-prod/processes/processes.worker.js.map +1 -1
- package/lib-prod/traefik/traefik.provider.js +2 -2
- package/lib-prod/traefik/traefik.provider.js.map +1 -1
- package/lib-prod/traefik/treafik-service.provider.js.map +1 -1
- package/package.json +6 -2
- package/src.js +4 -20
- package/websql/fesm2022/cloud-websql.mjs +1 -1
- package/websql/fesm2022/cloud-websql.mjs.map +1 -1
- package/websql/package.json +1 -1
- package/websql/types/cloud-websql.d.ts +1 -1
- package/websql-prod/fesm2022/cloud-websql-prod.mjs +1 -1
- package/websql-prod/fesm2022/cloud-websql-prod.mjs.map +1 -1
- package/websql-prod/package.json +1 -1
- package/websql-prod/types/cloud-websql-prod.d.ts +1 -1
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
//#region imports
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import { config } from 'tnp-core/lib';
|
|
4
|
+
import { _, chalk, child_process, crossPlatformPath, path, UtilsOs, UtilsTerminal, } from 'tnp-core/lib';
|
|
5
|
+
import { UtilsNetwork } from 'tnp-core/lib';
|
|
6
|
+
import { globalSpinner, taonBasePathToGlobalDockerTemplatesFn, } from 'tnp-core/lib';
|
|
7
|
+
import { BaseCliWorker, Helpers, HelpersTaon, UtilsDocker, } from 'tnp-helpers/lib';
|
|
8
|
+
import { TaonCloudStatus } from '../models';
|
|
9
|
+
// import type { TaonProjectsWorker } from '../taon.worker';
|
|
10
|
+
import { TraefikServiceProvider } from './treafik-service.provider';
|
|
11
|
+
//#endregion
|
|
12
|
+
export class TraefikProvider {
|
|
13
|
+
pathToTraefikComposeSourceTemplateFilesCwd;
|
|
14
|
+
//#region fields & getters
|
|
15
|
+
service = new TraefikServiceProvider(this);
|
|
16
|
+
cloudIps = [];
|
|
17
|
+
taonCloudStatus = TaonCloudStatus.NOT_STARED;
|
|
18
|
+
reverseProxyNetworkName = 'traefik-net';
|
|
19
|
+
//#region fields & getters / cloud is enabled
|
|
20
|
+
get cloudIsEnabled() {
|
|
21
|
+
//#region @backendFunc
|
|
22
|
+
return (this.taonCloudStatus === TaonCloudStatus.ENABLED_NOT_SECURE ||
|
|
23
|
+
this.taonCloudStatus === TaonCloudStatus.ENABLED_SECURED);
|
|
24
|
+
//#endregion
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
//#region fields & getters / is dev mode
|
|
28
|
+
get isDevMode() {
|
|
29
|
+
//#region @backendFunc
|
|
30
|
+
return (this.taonCloudStatus === TaonCloudStatus.ENABLED_NOT_SECURE ||
|
|
31
|
+
this.taonCloudStatus === TaonCloudStatus.STARTING_NOT_SECURE_MODE ||
|
|
32
|
+
Helpers.exists([
|
|
33
|
+
this.pathToTraefikComposeDestCwd,
|
|
34
|
+
`traefik-compose.local-dev.yml`,
|
|
35
|
+
]));
|
|
36
|
+
//#endregion
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
//#region fields & getters / get path to compose dest
|
|
40
|
+
/**
|
|
41
|
+
* Path to traefik docker compose cwd where
|
|
42
|
+
* compose will be started
|
|
43
|
+
*/
|
|
44
|
+
get pathToTraefikComposeDestCwd() {
|
|
45
|
+
//#region @backendFunc
|
|
46
|
+
const pathToComposeDest = crossPlatformPath([
|
|
47
|
+
taonBasePathToGlobalDockerTemplatesFn(),
|
|
48
|
+
path.basename(this.pathToTraefikComposeSourceTemplateFilesCwd()),
|
|
49
|
+
]);
|
|
50
|
+
return pathToComposeDest;
|
|
51
|
+
//#endregion
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
//#endregion
|
|
55
|
+
constructor(
|
|
56
|
+
/**
|
|
57
|
+
* Path to traefik docker compose template files
|
|
58
|
+
*/
|
|
59
|
+
pathToTraefikComposeSourceTemplateFilesCwd) {
|
|
60
|
+
this.pathToTraefikComposeSourceTemplateFilesCwd = pathToTraefikComposeSourceTemplateFilesCwd;
|
|
61
|
+
}
|
|
62
|
+
//#region protected methods
|
|
63
|
+
//#region protected methods / set enabled mode
|
|
64
|
+
setEnabledMode() {
|
|
65
|
+
if (this.isDevMode) {
|
|
66
|
+
this.taonCloudStatus = TaonCloudStatus.ENABLED_NOT_SECURE;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
this.taonCloudStatus = TaonCloudStatus.ENABLED_SECURED;
|
|
70
|
+
}
|
|
71
|
+
BaseCliWorker.cloudIp.next(_.first(this.cloudIps));
|
|
72
|
+
BaseCliWorker.isCloudEnable.next(true);
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
//#region protected methods / check if docker enabled
|
|
76
|
+
async checkIfDockerEnabled() {
|
|
77
|
+
//#region @backendFunc
|
|
78
|
+
Helpers.taskStarted(`Checking if docker is enabled...`);
|
|
79
|
+
const isEnableDocker = await UtilsOs.isDockerAvailable();
|
|
80
|
+
if (!isEnableDocker) {
|
|
81
|
+
Helpers.error(`
|
|
82
|
+
|
|
83
|
+
Docker is not enabled, please enable docker to use cloud features
|
|
84
|
+
|
|
85
|
+
`, true, true);
|
|
86
|
+
await UtilsTerminal.pressAnyKeyToContinueAsync();
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
Helpers.taskDone(`Docker is enabled!`);
|
|
90
|
+
return true;
|
|
91
|
+
//#endregion
|
|
92
|
+
}
|
|
93
|
+
//#endregion
|
|
94
|
+
//#region protected methods / delete traefik network
|
|
95
|
+
async deleteTraefikNetwork() {
|
|
96
|
+
//#region @backendFunc
|
|
97
|
+
try {
|
|
98
|
+
child_process.execSync(`docker network rm ${this.reverseProxyNetworkName}`, { stdio: 'inherit' });
|
|
99
|
+
console.log(`🗑️ Network deleted: ${this.reverseProxyNetworkName}`);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.log(`ℹ️ Network '${this.reverseProxyNetworkName}' probably does not exist, skipping.`);
|
|
103
|
+
}
|
|
104
|
+
//#endregion
|
|
105
|
+
}
|
|
106
|
+
//#endregion
|
|
107
|
+
//#region protected methods / make sure traefik network created
|
|
108
|
+
async makeSureTraefikNetworkCreated() {
|
|
109
|
+
//#region @backendFunc
|
|
110
|
+
try {
|
|
111
|
+
child_process.execSync(`docker network create ${this.reverseProxyNetworkName}`, {
|
|
112
|
+
stdio: 'ignore',
|
|
113
|
+
});
|
|
114
|
+
console.log(`✅ Network created: ${this.reverseProxyNetworkName}`);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.log(`ℹ️ Network '${this.reverseProxyNetworkName}' probably already exists, skipping.`);
|
|
118
|
+
}
|
|
119
|
+
//#endregion
|
|
120
|
+
}
|
|
121
|
+
//#endregion
|
|
122
|
+
//#region protected methods / select mode explain
|
|
123
|
+
async selectModeExplain() {
|
|
124
|
+
//#region @backendFunc
|
|
125
|
+
UtilsTerminal.clearConsole();
|
|
126
|
+
Helpers.info(`Taon Cloud Modes Explanation:
|
|
127
|
+
=> ${chalk.bold.yellow('DEV MODE (ENABLED_NOT_SECURE)')}:
|
|
128
|
+
In this mode, Taon Cloud is enabled without SSL/TLS encryption.
|
|
129
|
+
This mode is suitable for development and testing purposes.
|
|
130
|
+
=> ${chalk.bold.green('PRODUCTION MODE (ENABLED_SECURED)')}:
|
|
131
|
+
In this mode, Taon Cloud is enabled with SSL/TLS encryption.
|
|
132
|
+
This mode is intended for production environments where security is crucial.
|
|
133
|
+
`);
|
|
134
|
+
await UtilsTerminal.pressAnyKeyToContinueAsync();
|
|
135
|
+
//#endregion
|
|
136
|
+
}
|
|
137
|
+
//#endregion
|
|
138
|
+
//#region protected methods / select mode
|
|
139
|
+
async selectMode(options) {
|
|
140
|
+
//#region @backendFunc
|
|
141
|
+
options = options || {};
|
|
142
|
+
// options.skipDisabled = options.skipDisabled || false;
|
|
143
|
+
while (true) {
|
|
144
|
+
try {
|
|
145
|
+
let status;
|
|
146
|
+
const isOsWithoutGui = !UtilsOs.isRunningInOsWithGraphicsCapableEnvironment();
|
|
147
|
+
const optSecure = {
|
|
148
|
+
[TaonCloudStatus.STARTING_SECURE_MODE]: 'Enable Taon Cloud (PRODUCTION MODE)',
|
|
149
|
+
};
|
|
150
|
+
const optNotSecure = {
|
|
151
|
+
[TaonCloudStatus.STARTING_NOT_SECURE_MODE]: 'Enable Taon Cloud (DEV MODE)',
|
|
152
|
+
};
|
|
153
|
+
const optExplain = {
|
|
154
|
+
explain: {
|
|
155
|
+
name: '< Explain Taon Cloud modes >',
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
const choices = isOsWithoutGui
|
|
159
|
+
? {
|
|
160
|
+
...optSecure,
|
|
161
|
+
...optNotSecure,
|
|
162
|
+
...optExplain,
|
|
163
|
+
}
|
|
164
|
+
: {
|
|
165
|
+
...optExplain,
|
|
166
|
+
...optNotSecure,
|
|
167
|
+
...optSecure,
|
|
168
|
+
};
|
|
169
|
+
const answer = await UtilsTerminal.select({
|
|
170
|
+
choices: choices,
|
|
171
|
+
question: `Select Taon Cloud mode:`,
|
|
172
|
+
});
|
|
173
|
+
if (answer === 'explain') {
|
|
174
|
+
await this.selectModeExplain();
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
status = answer;
|
|
178
|
+
return status;
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
if (!(await UtilsTerminal.pressAnyKeyToTryAgainErrorOccurred(error))) {
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//#endregion
|
|
187
|
+
}
|
|
188
|
+
//#endregion
|
|
189
|
+
//#region protected methods / get worker terminal actions
|
|
190
|
+
async checkIfTraefikIsRunning(options) {
|
|
191
|
+
//#region @backendFunc
|
|
192
|
+
let tries = 0;
|
|
193
|
+
options = options || {};
|
|
194
|
+
if (options.waitUntilHealthy) {
|
|
195
|
+
options.maxTries = options.maxTries || 50;
|
|
196
|
+
}
|
|
197
|
+
const execAsync = promisify(child_process.exec);
|
|
198
|
+
globalSpinner.instance.start(`Traefik health: checking...`);
|
|
199
|
+
while (true) {
|
|
200
|
+
tries++;
|
|
201
|
+
if (options.maxTries && tries > options.maxTries) {
|
|
202
|
+
globalSpinner.instance.fail(`Traefik is not running or not healthy after ${tries} tries`);
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
const { stdout } = await execAsync(process.platform === 'win32'
|
|
207
|
+
? `docker inspect --format="{{json .State.Health.Status}}" traefik`
|
|
208
|
+
: `docker inspect --format='{{json .State.Health.Status}}' traefik`);
|
|
209
|
+
const status = stdout.trim().replace(/"/g, '');
|
|
210
|
+
globalSpinner.instance.text = `Traefik health: ${status}`;
|
|
211
|
+
if (status === 'healthy') {
|
|
212
|
+
globalSpinner.instance.succeed(`Traefik is ready`);
|
|
213
|
+
await UtilsTerminal.wait(1);
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
if (status === 'unhealthy') {
|
|
217
|
+
if (options.waitUntilHealthy) {
|
|
218
|
+
globalSpinner.instance.text =
|
|
219
|
+
'Traefik state is not healthy yet, waiting...';
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
globalSpinner.instance.fail(`Traefik state is not running or not healthy`);
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
if (options.waitUntilHealthy) {
|
|
229
|
+
globalSpinner.instance.text =
|
|
230
|
+
'Traefik is not healthy yet, waiting...';
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
globalSpinner.instance.fail('Traefik is not running or not healthy');
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
await UtilsTerminal.wait(1);
|
|
238
|
+
}
|
|
239
|
+
//#endregion
|
|
240
|
+
}
|
|
241
|
+
//#endregion
|
|
242
|
+
//#region protected methods / select cloud ips
|
|
243
|
+
async selectCloudIps() {
|
|
244
|
+
//#region @backendFunc
|
|
245
|
+
//#region select ip type
|
|
246
|
+
const localIps = await UtilsNetwork.getLocalIpAddresses();
|
|
247
|
+
const optPublic = {
|
|
248
|
+
usePublic: {
|
|
249
|
+
name: 'Use Public IP Address (recommended on server)',
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
const optLocal = {
|
|
253
|
+
useLocal: {
|
|
254
|
+
name: 'Use Local IP Address',
|
|
255
|
+
},
|
|
256
|
+
};
|
|
257
|
+
const isOsWithoutGui = !UtilsOs.isRunningInOsWithGraphicsCapableEnvironment();
|
|
258
|
+
const choicesIpType = isOsWithoutGui
|
|
259
|
+
? {
|
|
260
|
+
...optPublic,
|
|
261
|
+
...optLocal,
|
|
262
|
+
}
|
|
263
|
+
: {
|
|
264
|
+
...optLocal,
|
|
265
|
+
...optPublic,
|
|
266
|
+
};
|
|
267
|
+
const useIp = await UtilsTerminal.select({
|
|
268
|
+
choices: choicesIpType,
|
|
269
|
+
});
|
|
270
|
+
//#endregion
|
|
271
|
+
if (useIp === 'usePublic') {
|
|
272
|
+
//#region use public ip
|
|
273
|
+
while (true) {
|
|
274
|
+
try {
|
|
275
|
+
Helpers.info(`Detecting public IP address...`);
|
|
276
|
+
let publicIp = await UtilsNetwork.getCurrentPublicIpAddress();
|
|
277
|
+
const choicesPublicIp = {
|
|
278
|
+
confirm: {
|
|
279
|
+
name: `Use detected public IP: ${chalk.bold(publicIp)}`,
|
|
280
|
+
},
|
|
281
|
+
manual: {
|
|
282
|
+
name: 'Enter public IP manually',
|
|
283
|
+
},
|
|
284
|
+
abort: {
|
|
285
|
+
name: '< abort and go back >',
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
const selectedChoice = await UtilsTerminal.select({
|
|
289
|
+
choices: choicesPublicIp,
|
|
290
|
+
question: `Select option for public IP address:`,
|
|
291
|
+
});
|
|
292
|
+
if (selectedChoice === 'abort') {
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
if (selectedChoice === 'manual') {
|
|
296
|
+
publicIp = await UtilsTerminal.input({
|
|
297
|
+
question: `Enter public IP address to be used by Taon Cloud:`,
|
|
298
|
+
required: true,
|
|
299
|
+
validate: ip => {
|
|
300
|
+
return UtilsNetwork.isValidIp(ip);
|
|
301
|
+
},
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
this.cloudIps.length = 0;
|
|
305
|
+
this.cloudIps.push(publicIp);
|
|
306
|
+
if (!(await this.areCloudIpsValid())) {
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
return true;
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
if (!(await UtilsTerminal.pressAnyKeyToTryAgainErrorOccurred(error))) {
|
|
313
|
+
return false;
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
continue;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
//#endregion
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
//#region use local ip
|
|
324
|
+
let i = 0;
|
|
325
|
+
while (true) {
|
|
326
|
+
i++;
|
|
327
|
+
try {
|
|
328
|
+
if (i > 1) {
|
|
329
|
+
const shouldContinue = await UtilsTerminal.confirm({
|
|
330
|
+
message: `Selecting again IP addresses. Do you want to continue?`,
|
|
331
|
+
defaultValue: true,
|
|
332
|
+
});
|
|
333
|
+
if (!shouldContinue) {
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
const choices = [
|
|
338
|
+
...localIps
|
|
339
|
+
.filter(f => f.family === 'IPv4')
|
|
340
|
+
.map(ip => ({
|
|
341
|
+
name: `Local IP: ${ip.address} (${ip.type})`,
|
|
342
|
+
value: ip.address,
|
|
343
|
+
})),
|
|
344
|
+
];
|
|
345
|
+
const selected = await UtilsTerminal.select({
|
|
346
|
+
choices: choices,
|
|
347
|
+
question: `Select IP addresses to be used by Taon Cloud:`,
|
|
348
|
+
});
|
|
349
|
+
this.cloudIps.length = 0;
|
|
350
|
+
this.cloudIps.push(selected);
|
|
351
|
+
if (!(await this.areCloudIpsValid())) {
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
return true;
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
if (!(await UtilsTerminal.pressAnyKeyToTryAgainErrorOccurred(error))) {
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
//#endregion
|
|
364
|
+
}
|
|
365
|
+
//#endregion
|
|
366
|
+
}
|
|
367
|
+
//#endregion
|
|
368
|
+
//#endregion
|
|
369
|
+
//#region public methods
|
|
370
|
+
//#region protected methods / validate ips
|
|
371
|
+
async areCloudIpsValid() {
|
|
372
|
+
//#region @backendFunc
|
|
373
|
+
for (const localIp of this.cloudIps) {
|
|
374
|
+
Helpers.info(`Validating IP address (ping): ${localIp}...`);
|
|
375
|
+
if (!(await UtilsNetwork.checkIfServerPings(localIp))) {
|
|
376
|
+
Helpers.error(`Server with IP ${localIp} is not reachable! Please select only reachable IPs.`, true, true);
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return true;
|
|
381
|
+
//#endregion
|
|
382
|
+
}
|
|
383
|
+
//#endregion
|
|
384
|
+
//#region public methods / initial cloud status check
|
|
385
|
+
async initialCloudStatusCheck() {
|
|
386
|
+
//#region @backendFunc
|
|
387
|
+
const isDockerRunning = await UtilsOs.isDockerAvailable();
|
|
388
|
+
if (isDockerRunning) {
|
|
389
|
+
Helpers.logInfo(`Docker is running.. checking if Traefik is enabled...`);
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
const ipFromYml = this.service.getIpFromYml();
|
|
395
|
+
if (!ipFromYml) {
|
|
396
|
+
console.warn(`Can find ip from traefik dynamic config yml, assuming Traefik is not configured.`);
|
|
397
|
+
Helpers.info(`Shutting down Traefik if running...`);
|
|
398
|
+
await this.stopTraefik();
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
this.cloudIps.push(ipFromYml);
|
|
402
|
+
const isTraefikRunning = await this.checkIfTraefikIsRunning();
|
|
403
|
+
if (isTraefikRunning) {
|
|
404
|
+
Helpers.info(`Traefik is running with IP: ${ipFromYml}`);
|
|
405
|
+
Helpers.info(`Restarting Traefik to refresh new settings...`);
|
|
406
|
+
await this.restartTraefik();
|
|
407
|
+
this.setEnabledMode();
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
console.warn(`Traefik is not running even if configured with IP: ${ipFromYml}`);
|
|
411
|
+
Helpers.info(`Shutting down Traefik if running...`);
|
|
412
|
+
await this.stopTraefik();
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
//#endregion
|
|
416
|
+
}
|
|
417
|
+
//#endregion
|
|
418
|
+
//#region public methods / restart traefik
|
|
419
|
+
async restartTraefik(options) {
|
|
420
|
+
//#region @backendFunc
|
|
421
|
+
options = options || {};
|
|
422
|
+
if (options.hardRestart) {
|
|
423
|
+
await this.stopTraefik();
|
|
424
|
+
await this.startTraefik();
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
console.log(`🚀 Restarting Traefik ${this.isDevMode ? 'DEV' : 'PROD'}...`);
|
|
428
|
+
const execAsync = promisify(child_process.exec);
|
|
429
|
+
try {
|
|
430
|
+
await execAsync(`docker compose -f ` +
|
|
431
|
+
` traefik-compose${this.isDevMode ? '.local-dev' : ''}.yml down`, {
|
|
432
|
+
cwd: this.pathToTraefikComposeDestCwd,
|
|
433
|
+
});
|
|
434
|
+
await execAsync(`docker compose -f ` +
|
|
435
|
+
` traefik-compose${this.isDevMode ? '.local-dev' : ''}.yml up -d traefik`, {
|
|
436
|
+
cwd: this.pathToTraefikComposeDestCwd,
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
catch (error) {
|
|
440
|
+
config.frameworkName === 'tnp' && console.error(error);
|
|
441
|
+
Helpers.warn('Error restarting Traefik:');
|
|
442
|
+
}
|
|
443
|
+
//#endregion
|
|
444
|
+
}
|
|
445
|
+
//#endregion
|
|
446
|
+
//#region public methods / start traefik
|
|
447
|
+
async startTraefik() {
|
|
448
|
+
//#region @backendFunc
|
|
449
|
+
if (!(await this.checkIfDockerEnabled())) {
|
|
450
|
+
return false;
|
|
451
|
+
}
|
|
452
|
+
this.taonCloudStatus = await this.selectMode({
|
|
453
|
+
skipDisabled: true,
|
|
454
|
+
});
|
|
455
|
+
if (!(await this.selectCloudIps())) {
|
|
456
|
+
console.error('No IPs selected, cannot start Traefik');
|
|
457
|
+
this.taonCloudStatus = TaonCloudStatus.NOT_STARED;
|
|
458
|
+
return false;
|
|
459
|
+
}
|
|
460
|
+
await this.makeSureTraefikNetworkCreated();
|
|
461
|
+
console.log(`🚀 Starting Traefik ${this.isDevMode ? 'DEV' : 'PROD'}...`);
|
|
462
|
+
const execAsync = promisify(child_process.exec);
|
|
463
|
+
Helpers.removeFolderIfExists(this.pathToTraefikComposeDestCwd);
|
|
464
|
+
HelpersTaon.copy(this.pathToTraefikComposeSourceTemplateFilesCwd(), this.pathToTraefikComposeDestCwd, {
|
|
465
|
+
recursive: true,
|
|
466
|
+
});
|
|
467
|
+
this.service.initServiceReadme();
|
|
468
|
+
// remove not used file
|
|
469
|
+
Helpers.removeFileIfExists([
|
|
470
|
+
this.pathToTraefikComposeDestCwd,
|
|
471
|
+
`traefik-compose${!this.isDevMode ? '.local-dev' : ''}.yml`,
|
|
472
|
+
]);
|
|
473
|
+
await execAsync(`docker compose -f ` +
|
|
474
|
+
` traefik-compose${this.isDevMode ? '.local-dev' : ''}.yml up -d traefik`, {
|
|
475
|
+
cwd: this.pathToTraefikComposeDestCwd,
|
|
476
|
+
});
|
|
477
|
+
// Wait until container health becomes healthy
|
|
478
|
+
const isTraefikRunning = await this.checkIfTraefikIsRunning({
|
|
479
|
+
waitUntilHealthy: true,
|
|
480
|
+
});
|
|
481
|
+
if (isTraefikRunning) {
|
|
482
|
+
this.setEnabledMode();
|
|
483
|
+
for (const cloudIp of this.cloudIps) {
|
|
484
|
+
const workers = BaseCliWorker.getAllWorkersStartedInSystemFromCurrentCli();
|
|
485
|
+
await this.service.registerWorkers(cloudIp, workers);
|
|
486
|
+
}
|
|
487
|
+
await this.restartTraefik();
|
|
488
|
+
}
|
|
489
|
+
else {
|
|
490
|
+
this.taonCloudStatus = TaonCloudStatus.NOT_STARED;
|
|
491
|
+
}
|
|
492
|
+
return isTraefikRunning;
|
|
493
|
+
//#endregion
|
|
494
|
+
}
|
|
495
|
+
//#endregion
|
|
496
|
+
//#region public methods / stop traefik
|
|
497
|
+
async stopTraefik() {
|
|
498
|
+
//#region @backendFunc
|
|
499
|
+
this.taonCloudStatus = TaonCloudStatus.KILLING;
|
|
500
|
+
console.log('Stopping Traefik...');
|
|
501
|
+
await this.deleteTraefikNetwork();
|
|
502
|
+
const execAsync = promisify(child_process.exec);
|
|
503
|
+
const localDevFileBasename = `traefik-compose.local-dev.yml`;
|
|
504
|
+
const prodFileBasename = `traefik-compose.yml`;
|
|
505
|
+
// Start traefik in detached mode
|
|
506
|
+
const devFileExists = Helpers.exists([
|
|
507
|
+
this.pathToTraefikComposeDestCwd,
|
|
508
|
+
localDevFileBasename,
|
|
509
|
+
]);
|
|
510
|
+
const prodFileExists = Helpers.exists([
|
|
511
|
+
this.pathToTraefikComposeDestCwd,
|
|
512
|
+
prodFileBasename,
|
|
513
|
+
]);
|
|
514
|
+
let composeDownBothFiles = devFileExists && prodFileExists;
|
|
515
|
+
if (!Helpers.exists(this.pathToTraefikComposeDestCwd)) {
|
|
516
|
+
HelpersTaon.copy(this.pathToTraefikComposeSourceTemplateFilesCwd(), this.pathToTraefikComposeDestCwd, {
|
|
517
|
+
recursive: true,
|
|
518
|
+
});
|
|
519
|
+
composeDownBothFiles = true;
|
|
520
|
+
}
|
|
521
|
+
const composeDownFile = async (filename) => {
|
|
522
|
+
return await execAsync(`docker compose -f ${filename} down`, {
|
|
523
|
+
cwd: this.pathToTraefikComposeDestCwd,
|
|
524
|
+
});
|
|
525
|
+
};
|
|
526
|
+
if (composeDownBothFiles) {
|
|
527
|
+
Helpers.logInfo('Composing down both dev and production mode traefik...');
|
|
528
|
+
try {
|
|
529
|
+
await composeDownFile(localDevFileBasename);
|
|
530
|
+
}
|
|
531
|
+
catch (error) {
|
|
532
|
+
console.log('Error stopping Traefik dev mode');
|
|
533
|
+
}
|
|
534
|
+
try {
|
|
535
|
+
await composeDownFile(prodFileBasename);
|
|
536
|
+
}
|
|
537
|
+
catch (error) {
|
|
538
|
+
console.log('Error stopping Traefik production mode');
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
while (true) {
|
|
543
|
+
try {
|
|
544
|
+
if (Helpers.exists([
|
|
545
|
+
this.pathToTraefikComposeDestCwd,
|
|
546
|
+
localDevFileBasename,
|
|
547
|
+
])) {
|
|
548
|
+
Helpers.logInfo('Composing down dev mode traefik...');
|
|
549
|
+
await composeDownFile(localDevFileBasename);
|
|
550
|
+
}
|
|
551
|
+
if (Helpers.exists([this.pathToTraefikComposeDestCwd, prodFileBasename])) {
|
|
552
|
+
Helpers.logInfo('Composing down production mode traefik...');
|
|
553
|
+
await composeDownFile(prodFileBasename);
|
|
554
|
+
}
|
|
555
|
+
break;
|
|
556
|
+
}
|
|
557
|
+
catch (error) {
|
|
558
|
+
Helpers.error('Error stopping Traefik', true, true);
|
|
559
|
+
const tryAgain = await UtilsTerminal.pressAnyKeyToTryAgainErrorOccurred(error);
|
|
560
|
+
if (!tryAgain) {
|
|
561
|
+
break;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
await UtilsDocker.cleanImagesAndContainersByDockerLabel('org.opencontainers.image.title', 'Traefik');
|
|
567
|
+
Helpers.removeFolderIfExists(this.pathToTraefikComposeDestCwd);
|
|
568
|
+
this.taonCloudStatus = TaonCloudStatus.NOT_STARED;
|
|
569
|
+
BaseCliWorker.isCloudEnable.next(false);
|
|
570
|
+
// docker compose rm -f traefik
|
|
571
|
+
// docker compose down --remove-orphans
|
|
572
|
+
//#endregion
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
//# sourceMappingURL=traefik.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traefik.provider.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { BaseCliWorker } from 'tnp-helpers/lib';
|
|
2
|
+
import { TraefikProvider } from './traefik.provider';
|
|
3
|
+
export declare class TraefikServiceProvider {
|
|
4
|
+
private traefikProvider;
|
|
5
|
+
constructor(traefikProvider: TraefikProvider);
|
|
6
|
+
protected get dynamicServicesRelativePathPart(): string;
|
|
7
|
+
protected getRuleFromIp(options: {
|
|
8
|
+
publicOrLocalIp: string;
|
|
9
|
+
worker?: BaseCliWorker<any, any>;
|
|
10
|
+
}): string;
|
|
11
|
+
protected yamlPathForServiceName(options: {
|
|
12
|
+
ipAsServiceName: string;
|
|
13
|
+
}): string;
|
|
14
|
+
getIpFromYml(): string | undefined;
|
|
15
|
+
initServiceReadme(): void;
|
|
16
|
+
registerWorkers(publicOrLocalIp: string, workers: BaseCliWorker<any, any>[], options?: {
|
|
17
|
+
/**
|
|
18
|
+
* If true, Traefik will be restarted after registering the service
|
|
19
|
+
*/
|
|
20
|
+
restartTraefikAfterRegister?: boolean;
|
|
21
|
+
}): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* @deprecated
|
|
24
|
+
*/
|
|
25
|
+
register(publicOrLocalIp: string, localhostPort: number, options?: {
|
|
26
|
+
/**
|
|
27
|
+
* If true, Traefik will be restarted after registering the service
|
|
28
|
+
*/
|
|
29
|
+
restartTraefikAfterRegister?: boolean;
|
|
30
|
+
}): Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Remove traefik routes for service
|
|
33
|
+
* @param serviceId service name to unregister (kebab-case)
|
|
34
|
+
*/
|
|
35
|
+
unregister(publicOrLocalIp: string): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Check if a service is already registered in Traefik
|
|
38
|
+
* (by verifying if dynamic YAML config exists)
|
|
39
|
+
*/
|
|
40
|
+
isRegistered(publicOrLocalIp: string): Promise<boolean>;
|
|
41
|
+
}
|