@taon-dev/cloud 21.0.207
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 +5 -0
- package/assets/shared/shared_folder_info.txt +7 -0
- package/browser/README.md +24 -0
- package/browser/fesm2022/cloud-browser.mjs +3290 -0
- package/browser/fesm2022/cloud-browser.mjs.map +1 -0
- package/browser/package.json +23 -0
- package/browser/types/cloud-browser.d.ts +793 -0
- package/browser-prod/README.md +24 -0
- package/browser-prod/fesm2022/cloud-browser-prod.mjs +3289 -0
- package/browser-prod/fesm2022/cloud-browser-prod.mjs.map +1 -0
- package/browser-prod/package.json +23 -0
- package/browser-prod/types/cloud-browser-prod.d.ts +791 -0
- package/browser-prod.re-export.json +1 -0
- package/browser-prod.split-namespaces.json +10 -0
- package/cli.d.ts +1 -0
- package/cli.js +8 -0
- package/cli.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.js +18 -0
- package/index.js.map +1 -0
- package/lib/build-info._auto-generated_.d.ts +24 -0
- package/lib/build-info._auto-generated_.js +30 -0
- package/lib/build-info._auto-generated_.js.map +1 -0
- package/lib/constants.d.ts +1 -0
- package/lib/constants.js +6 -0
- package/lib/constants.js.map +1 -0
- package/lib/env/env.angular-node-app.d.ts +67 -0
- package/lib/env/env.angular-node-app.js +141 -0
- package/lib/env/env.angular-node-app.js.map +1 -0
- package/lib/env/env.docs-webapp.d.ts +67 -0
- package/lib/env/env.docs-webapp.js +141 -0
- package/lib/env/env.docs-webapp.js.map +1 -0
- package/lib/env/env.electron-app.d.ts +67 -0
- package/lib/env/env.electron-app.js +141 -0
- package/lib/env/env.electron-app.js.map +1 -0
- package/lib/env/env.mobile-app.d.ts +67 -0
- package/lib/env/env.mobile-app.js +141 -0
- package/lib/env/env.mobile-app.js.map +1 -0
- package/lib/env/env.npm-lib-and-cli-tool.d.ts +67 -0
- package/lib/env/env.npm-lib-and-cli-tool.js +141 -0
- package/lib/env/env.npm-lib-and-cli-tool.js.map +1 -0
- package/lib/env/env.vscode-plugin.d.ts +67 -0
- package/lib/env/env.vscode-plugin.js +141 -0
- package/lib/env/env.vscode-plugin.js.map +1 -0
- package/lib/env/index.d.ts +6 -0
- package/lib/env/index.js +23 -0
- package/lib/env/index.js.map +1 -0
- package/lib/index._auto-generated_.d.ts +27 -0
- package/lib/index._auto-generated_.js +49 -0
- package/lib/index._auto-generated_.js.map +1 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +21 -0
- package/lib/index.js.map +1 -0
- package/lib/instances/index.d.ts +5 -0
- package/lib/instances/index.js +22 -0
- package/lib/instances/index.js.map +1 -0
- package/lib/instances/instances-api.service.d.ts +7 -0
- package/lib/instances/instances.context.d.ts +19 -0
- package/lib/instances/instances.context.js +73 -0
- package/lib/instances/instances.context.js.map +1 -0
- package/lib/instances/instances.controller.d.ts +10 -0
- package/lib/instances/instances.controller.js +76 -0
- package/lib/instances/instances.controller.js.map +1 -0
- package/lib/instances/instances.d.ts +9 -0
- package/lib/instances/instances.defaults-values.d.ts +2 -0
- package/lib/instances/instances.defaults-values.js +8 -0
- package/lib/instances/instances.defaults-values.js.map +1 -0
- package/lib/instances/instances.js +52 -0
- package/lib/instances/instances.js.map +1 -0
- package/lib/instances/instances.repository.d.ts +6 -0
- package/lib/instances/instances.repository.js +26 -0
- package/lib/instances/instances.repository.js.map +1 -0
- package/lib/instances/instances.terminal-ui.d.ts +11 -0
- package/lib/instances/instances.terminal-ui.js +158 -0
- package/lib/instances/instances.terminal-ui.js.map +1 -0
- package/lib/instances/instances.worker.d.ts +18 -0
- package/lib/instances/instances.worker.js +46 -0
- package/lib/instances/instances.worker.js.map +1 -0
- package/lib/models.d.ts +8 -0
- package/lib/models.js +13 -0
- package/lib/models.js.map +1 -0
- package/lib/my-organization-proj.d.ts +1 -0
- package/lib/my-organization-proj.js +6 -0
- package/lib/my-organization-proj.js.map +1 -0
- package/lib/package.json +4 -0
- package/lib/processes/index.d.ts +5 -0
- package/lib/processes/index.js +22 -0
- package/lib/processes/index.js.map +1 -0
- package/lib/processes/processes-api.service.d.ts +5 -0
- package/lib/processes/processes.context.d.ts +19 -0
- package/lib/processes/processes.context.js +24 -0
- package/lib/processes/processes.context.js.map +1 -0
- package/lib/processes/processes.controller.d.ts +13 -0
- package/lib/processes/processes.controller.js +183 -0
- package/lib/processes/processes.controller.js.map +1 -0
- package/lib/processes/processes.d.ts +24 -0
- package/lib/processes/processes.defaults-values.d.ts +2 -0
- package/lib/processes/processes.defaults-values.js +9 -0
- package/lib/processes/processes.defaults-values.js.map +1 -0
- package/lib/processes/processes.js +171 -0
- package/lib/processes/processes.js.map +1 -0
- package/lib/processes/processes.models.d.ts +33 -0
- package/lib/processes/processes.models.js +46 -0
- package/lib/processes/processes.models.js.map +1 -0
- package/lib/processes/processes.repository.d.ts +18 -0
- package/lib/processes/processes.repository.js +203 -0
- package/lib/processes/processes.repository.js.map +1 -0
- package/lib/processes/processes.terminal-ui.d.ts +19 -0
- package/lib/processes/processes.terminal-ui.js +382 -0
- package/lib/processes/processes.terminal-ui.js.map +1 -0
- package/lib/processes/processes.utils.d.ts +6 -0
- package/lib/processes/processes.utils.js +86 -0
- package/lib/processes/processes.utils.js.map +1 -0
- package/lib/processes/processes.worker.controller.d.ts +3 -0
- package/lib/processes/processes.worker.controller.js +22 -0
- package/lib/processes/processes.worker.controller.js.map +1 -0
- package/lib/processes/processes.worker.d.ts +18 -0
- package/lib/processes/processes.worker.js +56 -0
- package/lib/processes/processes.worker.js.map +1 -0
- package/lib/start-cli.d.ts +7 -0
- package/lib/start-cli.js +46 -0
- package/lib/start-cli.js.map +1 -0
- package/lib/traefik/traefik.models.d.ts +20 -0
- package/lib/traefik/traefik.models.js +3 -0
- package/lib/traefik/traefik.models.js.map +1 -0
- package/lib/traefik/traefik.provider.d.ts +42 -0
- package/lib/traefik/traefik.provider.js +579 -0
- package/lib/traefik/traefik.provider.js.map +1 -0
- package/lib/traefik/treafik-service.provider.d.ts +41 -0
- package/lib/traefik/treafik-service.provider.js +215 -0
- package/lib/traefik/treafik-service.provider.js.map +1 -0
- package/lib-prod/build-info._auto-generated_.d.ts +24 -0
- package/lib-prod/build-info._auto-generated_.js +27 -0
- package/lib-prod/build-info._auto-generated_.js.map +1 -0
- package/lib-prod/constants.d.ts +1 -0
- package/lib-prod/constants.js +3 -0
- package/lib-prod/constants.js.map +1 -0
- package/lib-prod/env/env.angular-node-app.d.ts +67 -0
- package/lib-prod/env/env.angular-node-app.js +137 -0
- package/lib-prod/env/env.angular-node-app.js.map +1 -0
- package/lib-prod/env/env.docs-webapp.d.ts +67 -0
- package/lib-prod/env/env.docs-webapp.js +137 -0
- package/lib-prod/env/env.docs-webapp.js.map +1 -0
- package/lib-prod/env/env.electron-app.d.ts +67 -0
- package/lib-prod/env/env.electron-app.js +137 -0
- package/lib-prod/env/env.electron-app.js.map +1 -0
- package/lib-prod/env/env.mobile-app.d.ts +67 -0
- package/lib-prod/env/env.mobile-app.js +137 -0
- package/lib-prod/env/env.mobile-app.js.map +1 -0
- package/lib-prod/env/env.npm-lib-and-cli-tool.d.ts +67 -0
- package/lib-prod/env/env.npm-lib-and-cli-tool.js +137 -0
- package/lib-prod/env/env.npm-lib-and-cli-tool.js.map +1 -0
- package/lib-prod/env/env.vscode-plugin.d.ts +67 -0
- package/lib-prod/env/env.vscode-plugin.js +137 -0
- package/lib-prod/env/env.vscode-plugin.js.map +1 -0
- package/lib-prod/env/index.d.ts +6 -0
- package/lib-prod/env/index.js +7 -0
- package/lib-prod/env/index.js.map +1 -0
- package/lib-prod/index._auto-generated_.d.ts +25 -0
- package/lib-prod/index._auto-generated_.js +33 -0
- package/lib-prod/index._auto-generated_.js.map +1 -0
- package/lib-prod/index.d.ts +4 -0
- package/lib-prod/index.js +5 -0
- package/lib-prod/index.js.map +1 -0
- package/lib-prod/instances/index.d.ts +4 -0
- package/lib-prod/instances/index.js +6 -0
- package/lib-prod/instances/index.js.map +1 -0
- package/lib-prod/instances/instances.context.d.ts +19 -0
- package/lib-prod/instances/instances.context.js +64 -0
- package/lib-prod/instances/instances.context.js.map +1 -0
- package/lib-prod/instances/instances.controller.d.ts +10 -0
- package/lib-prod/instances/instances.controller.js +61 -0
- package/lib-prod/instances/instances.controller.js.map +1 -0
- package/lib-prod/instances/instances.d.ts +9 -0
- package/lib-prod/instances/instances.defaults-values.d.ts +2 -0
- package/lib-prod/instances/instances.defaults-values.js +5 -0
- package/lib-prod/instances/instances.defaults-values.js.map +1 -0
- package/lib-prod/instances/instances.js +40 -0
- package/lib-prod/instances/instances.js.map +1 -0
- package/lib-prod/instances/instances.repository.d.ts +6 -0
- package/lib-prod/instances/instances.repository.js +17 -0
- package/lib-prod/instances/instances.repository.js.map +1 -0
- package/lib-prod/instances/instances.terminal-ui.d.ts +11 -0
- package/lib-prod/instances/instances.terminal-ui.js +154 -0
- package/lib-prod/instances/instances.terminal-ui.js.map +1 -0
- package/lib-prod/instances/instances.worker.d.ts +18 -0
- package/lib-prod/instances/instances.worker.js +42 -0
- package/lib-prod/instances/instances.worker.js.map +1 -0
- package/lib-prod/models.d.ts +8 -0
- package/lib-prod/models.js +10 -0
- package/lib-prod/models.js.map +1 -0
- package/lib-prod/my-organization-proj.d.ts +1 -0
- package/lib-prod/my-organization-proj.js +3 -0
- package/lib-prod/my-organization-proj.js.map +1 -0
- package/lib-prod/package.json +4 -0
- package/lib-prod/processes/index.d.ts +4 -0
- package/lib-prod/processes/index.js +6 -0
- package/lib-prod/processes/index.js.map +1 -0
- package/lib-prod/processes/processes.context.d.ts +19 -0
- package/lib-prod/processes/processes.context.js +21 -0
- package/lib-prod/processes/processes.context.js.map +1 -0
- package/lib-prod/processes/processes.controller.d.ts +13 -0
- package/lib-prod/processes/processes.controller.js +168 -0
- package/lib-prod/processes/processes.controller.js.map +1 -0
- package/lib-prod/processes/processes.d.ts +24 -0
- package/lib-prod/processes/processes.defaults-values.d.ts +2 -0
- package/lib-prod/processes/processes.defaults-values.js +6 -0
- package/lib-prod/processes/processes.defaults-values.js.map +1 -0
- package/lib-prod/processes/processes.js +159 -0
- package/lib-prod/processes/processes.js.map +1 -0
- package/lib-prod/processes/processes.models.d.ts +33 -0
- package/lib-prod/processes/processes.models.js +43 -0
- package/lib-prod/processes/processes.models.js.map +1 -0
- package/lib-prod/processes/processes.repository.d.ts +18 -0
- package/lib-prod/processes/processes.repository.js +194 -0
- package/lib-prod/processes/processes.repository.js.map +1 -0
- package/lib-prod/processes/processes.terminal-ui.d.ts +19 -0
- package/lib-prod/processes/processes.terminal-ui.js +378 -0
- package/lib-prod/processes/processes.terminal-ui.js.map +1 -0
- package/lib-prod/processes/processes.utils.d.ts +4 -0
- package/lib-prod/processes/processes.utils.js +82 -0
- package/lib-prod/processes/processes.utils.js.map +1 -0
- package/lib-prod/processes/processes.worker.controller.d.ts +3 -0
- package/lib-prod/processes/processes.worker.controller.js +13 -0
- package/lib-prod/processes/processes.worker.controller.js.map +1 -0
- package/lib-prod/processes/processes.worker.d.ts +18 -0
- package/lib-prod/processes/processes.worker.js +52 -0
- package/lib-prod/processes/processes.worker.js.map +1 -0
- package/lib-prod/start-cli.d.ts +7 -0
- package/lib-prod/start-cli.js +43 -0
- package/lib-prod/start-cli.js.map +1 -0
- package/lib-prod/traefik/traefik.models.d.ts +20 -0
- package/lib-prod/traefik/traefik.models.js +2 -0
- package/lib-prod/traefik/traefik.models.js.map +1 -0
- package/lib-prod/traefik/traefik.provider.d.ts +42 -0
- package/lib-prod/traefik/traefik.provider.js +575 -0
- package/lib-prod/traefik/traefik.provider.js.map +1 -0
- package/lib-prod/traefik/treafik-service.provider.d.ts +41 -0
- package/lib-prod/traefik/treafik-service.provider.js +211 -0
- package/lib-prod/traefik/treafik-service.provider.js.map +1 -0
- package/lib-prod.re-export.json +1 -0
- package/lib-prod.split-namespaces.json +10 -0
- package/package.json +36 -0
- package/scss/global.scss +93 -0
- package/scss/index.scss +2 -0
- package/scss/lib/index.scss +1 -0
- package/scss/vars.scss +7 -0
- package/src.d.ts +6 -0
- package/src.js +20 -0
- package/websql/README.md +24 -0
- package/websql/fesm2022/cloud-websql.mjs +3385 -0
- package/websql/fesm2022/cloud-websql.mjs.map +1 -0
- package/websql/package.json +23 -0
- package/websql/types/cloud-websql.d.ts +793 -0
- package/websql-prod/README.md +24 -0
- package/websql-prod/fesm2022/cloud-websql-prod.mjs +3384 -0
- package/websql-prod/fesm2022/cloud-websql-prod.mjs.map +1 -0
- package/websql-prod/package.json +23 -0
- package/websql-prod/types/cloud-websql-prod.d.ts +791 -0
- package/websql-prod.re-export.json +1 -0
- package/websql-prod.split-namespaces.json +10 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//#region tnp-helpers cli template
|
|
2
|
+
// import { Helpers, BaseCommandLineFeature } from 'tnp-helpers/src';
|
|
3
|
+
// import { BaseProject, BaseStartConfig } from 'tnp-helpers/src'; // @backend
|
|
4
|
+
// class $Version extends BaseCommandLineFeature<{}> {
|
|
5
|
+
// public _() {
|
|
6
|
+
// console.log(`Hello world from cli`);
|
|
7
|
+
// this._exit();
|
|
8
|
+
// }
|
|
9
|
+
// }
|
|
10
|
+
//#endregion
|
|
11
|
+
/**
|
|
12
|
+
*
|
|
13
|
+
* @param argsv process.argsv
|
|
14
|
+
* @param filename needed if you want ipc communicaiton
|
|
15
|
+
*/
|
|
16
|
+
export async function startCli(argsv, filename) {
|
|
17
|
+
//#region @backendFunc
|
|
18
|
+
console.log('Hello from cli');
|
|
19
|
+
console.log({ argsv });
|
|
20
|
+
process.exit(0);
|
|
21
|
+
//#region start config
|
|
22
|
+
// new BaseStartConfig({
|
|
23
|
+
// ProjectClass: BaseProject,
|
|
24
|
+
// functionsOrClasses: [
|
|
25
|
+
// {
|
|
26
|
+
// classOrFnName: '$Version',
|
|
27
|
+
// funcOrClass: $Version,
|
|
28
|
+
// },
|
|
29
|
+
// ],
|
|
30
|
+
// argsv,
|
|
31
|
+
// useStringArrForArgsFunctions: true,
|
|
32
|
+
// shortArgsReplaceConfig: {
|
|
33
|
+
// v: 'version',
|
|
34
|
+
// },
|
|
35
|
+
// callbackNotRecognizedCommand: async () => {
|
|
36
|
+
// Helpers.error(`Command not recognized`, false, true);
|
|
37
|
+
// },
|
|
38
|
+
// });
|
|
39
|
+
//#endregion
|
|
40
|
+
//#endregion
|
|
41
|
+
}
|
|
42
|
+
export default startCli;
|
|
43
|
+
//# sourceMappingURL=start-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-cli.js","sourceRoot":"","sources":[""],"names":[],"mappings":"AAAA,kCAAkC;AAClC,qEAAqE;AACrE,8EAA8E;AAE9E,sDAAsD;AACtD,iBAAiB;AACjB,2CAA2C;AAC3C,oBAAoB;AACpB,MAAM;AACN,IAAI;AACJ,YAAY;AAEZ;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAAe,EAAE,QAAgB;IAC9D,sBAAsB;IACtB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEhB,sBAAsB;IACtB,wBAAwB;IACxB,+BAA+B;IAC/B,0BAA0B;IAC1B,QAAQ;IACR,mCAAmC;IACnC,+BAA+B;IAC/B,SAAS;IACT,OAAO;IACP,WAAW;IACX,wCAAwC;IACxC,8BAA8B;IAC9B,oBAAoB;IACpB,OAAO;IACP,gDAAgD;IAChD,4DAA4D;IAC5D,OAAO;IACP,MAAM;IACN,YAAY;IACZ,YAAY;AACd,CAAC;AAED,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface TraefikConfig {
|
|
2
|
+
http: {
|
|
3
|
+
routers: Record<string, TraefikRouter>;
|
|
4
|
+
services: Record<string, TraefikService>;
|
|
5
|
+
};
|
|
6
|
+
}
|
|
7
|
+
export interface TraefikRouter {
|
|
8
|
+
rule: string;
|
|
9
|
+
service: string;
|
|
10
|
+
entryPoints: string[];
|
|
11
|
+
tls?: Record<string, any> | null;
|
|
12
|
+
}
|
|
13
|
+
export interface TraefikService {
|
|
14
|
+
loadBalancer: {
|
|
15
|
+
servers: TraefikServer[];
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface TraefikServer {
|
|
19
|
+
url: string;
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traefik.models.js","sourceRoot":"","sources":[""],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { TaonCloudStatus } from '../models';
|
|
2
|
+
import { TraefikServiceProvider } from './treafik-service.provider';
|
|
3
|
+
export declare class TraefikProvider {
|
|
4
|
+
/**
|
|
5
|
+
* Path to traefik docker compose template files
|
|
6
|
+
*/
|
|
7
|
+
private readonly pathToTraefikComposeSourceTemplateFilesCwd;
|
|
8
|
+
service: TraefikServiceProvider;
|
|
9
|
+
readonly cloudIps: string[];
|
|
10
|
+
protected taonCloudStatus: TaonCloudStatus;
|
|
11
|
+
protected reverseProxyNetworkName: string;
|
|
12
|
+
get cloudIsEnabled(): boolean;
|
|
13
|
+
get isDevMode(): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Path to traefik docker compose cwd where
|
|
16
|
+
* compose will be started
|
|
17
|
+
*/
|
|
18
|
+
get pathToTraefikComposeDestCwd(): string;
|
|
19
|
+
constructor(
|
|
20
|
+
/**
|
|
21
|
+
* Path to traefik docker compose template files
|
|
22
|
+
*/
|
|
23
|
+
pathToTraefikComposeSourceTemplateFilesCwd: () => string);
|
|
24
|
+
protected setEnabledMode(): void;
|
|
25
|
+
protected checkIfDockerEnabled(): Promise<boolean>;
|
|
26
|
+
protected deleteTraefikNetwork(): Promise<void>;
|
|
27
|
+
protected makeSureTraefikNetworkCreated(): Promise<void>;
|
|
28
|
+
protected selectModeExplain(): Promise<void>;
|
|
29
|
+
protected selectMode(options?: {}): Promise<TaonCloudStatus>;
|
|
30
|
+
protected checkIfTraefikIsRunning(options?: {
|
|
31
|
+
waitUntilHealthy?: boolean;
|
|
32
|
+
maxTries?: number;
|
|
33
|
+
}): Promise<boolean>;
|
|
34
|
+
protected selectCloudIps(): Promise<boolean>;
|
|
35
|
+
protected areCloudIpsValid(): Promise<boolean>;
|
|
36
|
+
initialCloudStatusCheck(): Promise<void>;
|
|
37
|
+
restartTraefik(options?: {
|
|
38
|
+
hardRestart?: boolean;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
startTraefik(): Promise<boolean>;
|
|
41
|
+
stopTraefik(): Promise<void>;
|
|
42
|
+
}
|
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
//#region imports
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import { config } from 'tnp-core/lib-prod';
|
|
4
|
+
import { chalk, child_process, crossPlatformPath, path, ___NS__first, UtilsOs__NS__isDockerAvailable, UtilsOs__NS__isRunningInOsWithGraphicsCapableEnvironment, UtilsTerminal__NS__clearConsole, UtilsTerminal__NS__confirm, UtilsTerminal__NS__input, UtilsTerminal__NS__pressAnyKeyToContinueAsync, UtilsTerminal__NS__pressAnyKeyToTryAgainErrorOccurred, UtilsTerminal__NS__select, UtilsTerminal__NS__wait } from 'tnp-core/lib-prod';
|
|
5
|
+
import { UtilsNetwork__NS__checkIfServerPings, UtilsNetwork__NS__getCurrentPublicIpAddress, UtilsNetwork__NS__getLocalIpAddresses, UtilsNetwork__NS__isValidIp } from 'tnp-core/lib-prod';
|
|
6
|
+
import { globalSpinner, taonBasePathToGlobalDockerTemplates, } from 'tnp-core/lib-prod';
|
|
7
|
+
import { BaseCliWorker, Helpers__NS__error, Helpers__NS__exists, Helpers__NS__info, Helpers__NS__logInfo, Helpers__NS__removeFileIfExists, Helpers__NS__removeFolderIfExists, Helpers__NS__taskDone, Helpers__NS__taskStarted, Helpers__NS__warn, HelpersTaon__NS__copy, UtilsDocker__NS__cleanImagesAndContainersByDockerLabel } from 'tnp-helpers/lib-prod';
|
|
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__NS__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
|
+
taonBasePathToGlobalDockerTemplates,
|
|
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(___NS__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__NS__taskStarted(`Checking if docker is enabled...`);
|
|
79
|
+
const isEnableDocker = await UtilsOs__NS__isDockerAvailable();
|
|
80
|
+
if (!isEnableDocker) {
|
|
81
|
+
Helpers__NS__error(`
|
|
82
|
+
|
|
83
|
+
Docker is not enabled, please enable docker to use cloud features
|
|
84
|
+
|
|
85
|
+
`, true, true);
|
|
86
|
+
await UtilsTerminal__NS__pressAnyKeyToContinueAsync();
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
Helpers__NS__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__NS__clearConsole();
|
|
126
|
+
Helpers__NS__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__NS__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__NS__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__NS__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__NS__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__NS__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__NS__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__NS__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__NS__isRunningInOsWithGraphicsCapableEnvironment();
|
|
258
|
+
const choicesIpType = isOsWithoutGui
|
|
259
|
+
? {
|
|
260
|
+
...optPublic,
|
|
261
|
+
...optLocal,
|
|
262
|
+
}
|
|
263
|
+
: {
|
|
264
|
+
...optLocal,
|
|
265
|
+
...optPublic,
|
|
266
|
+
};
|
|
267
|
+
const useIp = await UtilsTerminal__NS__select({
|
|
268
|
+
choices: choicesIpType,
|
|
269
|
+
});
|
|
270
|
+
//#endregion
|
|
271
|
+
if (useIp === 'usePublic') {
|
|
272
|
+
//#region use public ip
|
|
273
|
+
while (true) {
|
|
274
|
+
try {
|
|
275
|
+
Helpers__NS__info(`Detecting public IP address...`);
|
|
276
|
+
let publicIp = await UtilsNetwork__NS__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__NS__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__NS__input({
|
|
297
|
+
question: `Enter public IP address to be used by Taon Cloud:`,
|
|
298
|
+
required: true,
|
|
299
|
+
validate: ip => {
|
|
300
|
+
return UtilsNetwork__NS__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__NS__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__NS__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__NS__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__NS__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__NS__info(`Validating IP address (ping): ${localIp}...`);
|
|
375
|
+
if (!(await UtilsNetwork__NS__checkIfServerPings(localIp))) {
|
|
376
|
+
Helpers__NS__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__NS__isDockerAvailable();
|
|
388
|
+
if (isDockerRunning) {
|
|
389
|
+
Helpers__NS__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__NS__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__NS__info(`Traefik is running with IP: ${ipFromYml}`);
|
|
405
|
+
Helpers__NS__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__NS__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__NS__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__NS__removeFolderIfExists(this.pathToTraefikComposeDestCwd);
|
|
464
|
+
HelpersTaon__NS__copy(this.pathToTraefikComposeSourceTemplateFilesCwd(), this.pathToTraefikComposeDestCwd, {
|
|
465
|
+
recursive: true,
|
|
466
|
+
});
|
|
467
|
+
this.service.initServiceReadme();
|
|
468
|
+
// remove not used file
|
|
469
|
+
Helpers__NS__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__NS__exists([
|
|
507
|
+
this.pathToTraefikComposeDestCwd,
|
|
508
|
+
localDevFileBasename,
|
|
509
|
+
]);
|
|
510
|
+
const prodFileExists = Helpers__NS__exists([
|
|
511
|
+
this.pathToTraefikComposeDestCwd,
|
|
512
|
+
prodFileBasename,
|
|
513
|
+
]);
|
|
514
|
+
let composeDownBothFiles = devFileExists && prodFileExists;
|
|
515
|
+
if (!Helpers__NS__exists(this.pathToTraefikComposeDestCwd)) {
|
|
516
|
+
HelpersTaon__NS__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__NS__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__NS__exists([
|
|
545
|
+
this.pathToTraefikComposeDestCwd,
|
|
546
|
+
localDevFileBasename,
|
|
547
|
+
])) {
|
|
548
|
+
Helpers__NS__logInfo('Composing down dev mode traefik...');
|
|
549
|
+
await composeDownFile(localDevFileBasename);
|
|
550
|
+
}
|
|
551
|
+
if (Helpers__NS__exists([this.pathToTraefikComposeDestCwd, prodFileBasename])) {
|
|
552
|
+
Helpers__NS__logInfo('Composing down production mode traefik...');
|
|
553
|
+
await composeDownFile(prodFileBasename);
|
|
554
|
+
}
|
|
555
|
+
break;
|
|
556
|
+
}
|
|
557
|
+
catch (error) {
|
|
558
|
+
Helpers__NS__error('Error stopping Traefik', true, true);
|
|
559
|
+
const tryAgain = await UtilsTerminal__NS__pressAnyKeyToTryAgainErrorOccurred(error);
|
|
560
|
+
if (!tryAgain) {
|
|
561
|
+
break;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
await UtilsDocker__NS__cleanImagesAndContainersByDockerLabel('org.opencontainers.image.title', 'Traefik');
|
|
567
|
+
Helpers__NS__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
|