@hypnosis/docker-mcp-server 1.0.4 → 1.3.0

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 (105) hide show
  1. package/README.md +99 -28
  2. package/dist/adapters/database-adapter.d.ts +9 -5
  3. package/dist/adapters/database-adapter.d.ts.map +1 -1
  4. package/dist/adapters/postgresql.d.ts +14 -5
  5. package/dist/adapters/postgresql.d.ts.map +1 -1
  6. package/dist/adapters/postgresql.js +36 -23
  7. package/dist/adapters/postgresql.js.map +1 -1
  8. package/dist/adapters/redis.d.ts +10 -1
  9. package/dist/adapters/redis.d.ts.map +1 -1
  10. package/dist/adapters/redis.js +28 -13
  11. package/dist/adapters/redis.js.map +1 -1
  12. package/dist/adapters/sqlite.d.ts +11 -1
  13. package/dist/adapters/sqlite.d.ts.map +1 -1
  14. package/dist/adapters/sqlite.js +11 -7
  15. package/dist/adapters/sqlite.js.map +1 -1
  16. package/dist/adapters/types.d.ts +7 -0
  17. package/dist/adapters/types.d.ts.map +1 -1
  18. package/dist/discovery/compose-parser.d.ts +4 -0
  19. package/dist/discovery/compose-parser.d.ts.map +1 -1
  20. package/dist/discovery/compose-parser.js +27 -5
  21. package/dist/discovery/compose-parser.js.map +1 -1
  22. package/dist/discovery/project-discovery.d.ts.map +1 -1
  23. package/dist/discovery/project-discovery.js +28 -2
  24. package/dist/discovery/project-discovery.js.map +1 -1
  25. package/dist/discovery/remote-discovery.d.ts +99 -0
  26. package/dist/discovery/remote-discovery.d.ts.map +1 -0
  27. package/dist/discovery/remote-discovery.js +410 -0
  28. package/dist/discovery/remote-discovery.js.map +1 -0
  29. package/dist/discovery/types.d.ts +4 -0
  30. package/dist/discovery/types.d.ts.map +1 -1
  31. package/dist/index.js +76 -24
  32. package/dist/index.js.map +1 -1
  33. package/dist/managers/compose-manager.d.ts +3 -1
  34. package/dist/managers/compose-manager.d.ts.map +1 -1
  35. package/dist/managers/compose-manager.js +10 -1
  36. package/dist/managers/compose-manager.js.map +1 -1
  37. package/dist/managers/container-manager.d.ts +11 -1
  38. package/dist/managers/container-manager.d.ts.map +1 -1
  39. package/dist/managers/container-manager.js +75 -76
  40. package/dist/managers/container-manager.js.map +1 -1
  41. package/dist/tools/container-tools.d.ts +1 -3
  42. package/dist/tools/container-tools.d.ts.map +1 -1
  43. package/dist/tools/container-tools.js +142 -28
  44. package/dist/tools/container-tools.js.map +1 -1
  45. package/dist/tools/database-tools.d.ts +15 -1
  46. package/dist/tools/database-tools.d.ts.map +1 -1
  47. package/dist/tools/database-tools.js +152 -16
  48. package/dist/tools/database-tools.js.map +1 -1
  49. package/dist/tools/discovery-tools.d.ts +22 -0
  50. package/dist/tools/discovery-tools.d.ts.map +1 -0
  51. package/dist/tools/discovery-tools.js +137 -0
  52. package/dist/tools/discovery-tools.js.map +1 -0
  53. package/dist/tools/env-tools.d.ts +1 -2
  54. package/dist/tools/env-tools.d.ts.map +1 -1
  55. package/dist/tools/env-tools.js +123 -22
  56. package/dist/tools/env-tools.js.map +1 -1
  57. package/dist/tools/executor-tool.d.ts +0 -2
  58. package/dist/tools/executor-tool.d.ts.map +1 -1
  59. package/dist/tools/executor-tool.js +27 -9
  60. package/dist/tools/executor-tool.js.map +1 -1
  61. package/dist/tools/mcp-health-tool.d.ts +9 -0
  62. package/dist/tools/mcp-health-tool.d.ts.map +1 -1
  63. package/dist/tools/mcp-health-tool.js +34 -7
  64. package/dist/tools/mcp-health-tool.js.map +1 -1
  65. package/dist/tools/profile-tool.d.ts +39 -0
  66. package/dist/tools/profile-tool.d.ts.map +1 -0
  67. package/dist/tools/profile-tool.js +70 -0
  68. package/dist/tools/profile-tool.js.map +1 -0
  69. package/dist/utils/compose-exec.d.ts +28 -3
  70. package/dist/utils/compose-exec.d.ts.map +1 -1
  71. package/dist/utils/compose-exec.js +100 -26
  72. package/dist/utils/compose-exec.js.map +1 -1
  73. package/dist/utils/docker-client.d.ts +81 -8
  74. package/dist/utils/docker-client.d.ts.map +1 -1
  75. package/dist/utils/docker-client.js +520 -17
  76. package/dist/utils/docker-client.js.map +1 -1
  77. package/dist/utils/profile-resolver.d.ts +58 -0
  78. package/dist/utils/profile-resolver.d.ts.map +1 -0
  79. package/dist/utils/profile-resolver.js +218 -0
  80. package/dist/utils/profile-resolver.js.map +1 -0
  81. package/dist/utils/profiles-file.d.ts +57 -0
  82. package/dist/utils/profiles-file.d.ts.map +1 -0
  83. package/dist/utils/profiles-file.js +167 -0
  84. package/dist/utils/profiles-file.js.map +1 -0
  85. package/dist/utils/remote-compose.d.ts +32 -0
  86. package/dist/utils/remote-compose.d.ts.map +1 -0
  87. package/dist/utils/remote-compose.js +69 -0
  88. package/dist/utils/remote-compose.js.map +1 -0
  89. package/dist/utils/retry.d.ts +49 -0
  90. package/dist/utils/retry.d.ts.map +1 -0
  91. package/dist/utils/retry.js +120 -0
  92. package/dist/utils/retry.js.map +1 -0
  93. package/dist/utils/schema-helpers.d.ts +96 -0
  94. package/dist/utils/schema-helpers.d.ts.map +1 -0
  95. package/dist/utils/schema-helpers.js +61 -0
  96. package/dist/utils/schema-helpers.js.map +1 -0
  97. package/dist/utils/ssh-config.d.ts +104 -0
  98. package/dist/utils/ssh-config.d.ts.map +1 -0
  99. package/dist/utils/ssh-config.js +346 -0
  100. package/dist/utils/ssh-config.js.map +1 -0
  101. package/dist/utils/ssh-exec.d.ts +59 -0
  102. package/dist/utils/ssh-exec.d.ts.map +1 -0
  103. package/dist/utils/ssh-exec.js +159 -0
  104. package/dist/utils/ssh-exec.js.map +1 -0
  105. package/package.json +21 -3
@@ -2,12 +2,37 @@
2
2
  * Compose Exec
3
3
  * CLI wrapper для docker-compose команд
4
4
  */
5
+ import type { SSHConfig } from './ssh-config.js';
6
+ export interface ComposeExecOptions {
7
+ /** Рабочая директория */
8
+ cwd?: string;
9
+ /** SSH конфигурация для удаленного Docker */
10
+ sshConfig?: SSHConfig | null;
11
+ /** Docker context (альтернатива SSH config) */
12
+ dockerContext?: string;
13
+ }
5
14
  export declare class ComposeExec {
6
15
  /**
7
16
  * Выполнить docker-compose команду
17
+ * Поддерживает SSH через DOCKER_HOST или Docker context
18
+ */
19
+ static run(composeFile: string, args: string[], options?: ComposeExecOptions): string;
20
+ /**
21
+ * Подготовить переменные окружения для выполнения команды
22
+ * Если указан SSH config, устанавливает DOCKER_HOST для удаленного Docker
23
+ */
24
+ private static prepareEnvironment;
25
+ /**
26
+ * Создать Docker context для SSH подключения
27
+ * Используется как альтернатива DOCKER_HOST
28
+ *
29
+ * Примечание: Эта функция создает контекст через Docker CLI.
30
+ * Требует наличия Docker CLI и SSH доступа.
31
+ */
32
+ static createDockerContext(contextName: string, sshConfig: SSHConfig): Promise<void>;
33
+ /**
34
+ * Проверить существование Docker context
8
35
  */
9
- static run(composeFile: string, args: string[], options?: {
10
- cwd?: string;
11
- }): string;
36
+ static contextExists(contextName: string): Promise<boolean>;
12
37
  }
13
38
  //# sourceMappingURL=compose-exec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compose-exec.d.ts","sourceRoot":"","sources":["../../src/utils/compose-exec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,qBAAa,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,GAAG,CACR,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7B,MAAM;CA0CV"}
1
+ {"version":3,"file":"compose-exec.d.ts","sourceRoot":"","sources":["../../src/utils/compose-exec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,kBAAkB;IACjC,yBAAyB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,+CAA+C;IAC/C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,WAAW;IACtB;;;OAGG;IACH,MAAM,CAAC,GAAG,CACR,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,kBAAuB,GAC/B,MAAM;IAuDT;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAajC;;;;;;OAMG;WACU,mBAAmB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,IAAI,CAAC;IA4BhB;;OAEG;WACU,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAuBlE"}
@@ -2,46 +2,120 @@
2
2
  * Compose Exec
3
3
  * CLI wrapper для docker-compose команд
4
4
  */
5
- import { execSync } from 'child_process';
5
+ import { spawnSync } from 'child_process';
6
6
  import { logger } from './logger.js';
7
7
  export class ComposeExec {
8
8
  /**
9
9
  * Выполнить docker-compose команду
10
+ * Поддерживает SSH через DOCKER_HOST или Docker context
10
11
  */
11
12
  static run(composeFile, args, options = {}) {
12
- // Строим команду: docker-compose -f <file> <args>
13
- const cmd = `docker-compose -f ${composeFile} ${args.join(' ')}`;
14
- logger.debug(`Executing docker-compose: ${cmd}`);
13
+ // Используем docker compose (v2) вместо docker-compose (v1)
14
+ // docker compose работает везде, docker-compose может отсутствовать
15
+ let cmd = `docker compose -f ${composeFile}`;
16
+ // Добавляем Docker context (если указан)
17
+ if (options.dockerContext) {
18
+ cmd = `docker compose --context ${options.dockerContext} -f ${composeFile}`;
19
+ logger.debug(`Using Docker context: ${options.dockerContext}`);
20
+ }
21
+ cmd = `${cmd} ${args.join(' ')}`;
22
+ logger.debug(`Executing docker compose: ${cmd}`);
15
23
  if (options.cwd) {
16
24
  logger.debug(`Working directory: ${options.cwd}`);
17
25
  }
26
+ // Подготавливаем окружение для выполнения команды
27
+ const env = this.prepareEnvironment(options.sshConfig);
28
+ // Разбиваем команду на части для spawnSync
29
+ const [command, ...commandArgs] = cmd.split(' ');
30
+ const result = spawnSync(command, commandArgs, {
31
+ cwd: options.cwd,
32
+ env: env,
33
+ encoding: 'utf-8',
34
+ stdio: ['pipe', 'pipe', 'pipe'],
35
+ });
36
+ // Проверяем exit code
37
+ if (result.status !== 0 && result.status !== null) {
38
+ // Команда завершилась с ошибкой
39
+ let errorMessage = result.stderr || result.stdout || 'Unknown error';
40
+ // Если есть stdout, добавляем его к сообщению
41
+ if (result.stdout && result.stdout.trim()) {
42
+ errorMessage = `${errorMessage}\n${result.stdout}`;
43
+ }
44
+ logger.error('docker compose command failed:', {
45
+ status: result.status,
46
+ stderr: result.stderr,
47
+ stdout: result.stdout,
48
+ });
49
+ throw new Error(`docker compose failed: ${errorMessage}`);
50
+ }
51
+ // Команда выполнена успешно (status === 0 или null)
52
+ // Возвращаем stdout, игнорируя stderr (он может содержать предупреждения)
53
+ return result.stdout || '';
54
+ }
55
+ /**
56
+ * Подготовить переменные окружения для выполнения команды
57
+ * Если указан SSH config, устанавливает DOCKER_HOST для удаленного Docker
58
+ */
59
+ static prepareEnvironment(sshConfig) {
60
+ const env = { ...process.env };
61
+ // Если указан SSH config, устанавливаем DOCKER_HOST
62
+ if (sshConfig) {
63
+ const dockerHost = `ssh://${sshConfig.username}@${sshConfig.host}:${sshConfig.port || 22}`;
64
+ env.DOCKER_HOST = dockerHost;
65
+ logger.debug(`Setting DOCKER_HOST=${dockerHost} for docker-compose`);
66
+ }
67
+ return env;
68
+ }
69
+ /**
70
+ * Создать Docker context для SSH подключения
71
+ * Используется как альтернатива DOCKER_HOST
72
+ *
73
+ * Примечание: Эта функция создает контекст через Docker CLI.
74
+ * Требует наличия Docker CLI и SSH доступа.
75
+ */
76
+ static async createDockerContext(contextName, sshConfig) {
77
+ const dockerHost = `ssh://${sshConfig.username}@${sshConfig.host}:${sshConfig.port || 22}`;
78
+ const cmd = `docker context create ${contextName} --docker "host=${dockerHost}"`;
79
+ logger.debug(`Creating Docker context: ${cmd}`);
80
+ const [command, ...args] = cmd.split(' ');
81
+ const result = spawnSync(command, args, {
82
+ encoding: 'utf-8',
83
+ stdio: ['pipe', 'pipe', 'pipe'],
84
+ });
85
+ if (result.status !== 0 && result.status !== null) {
86
+ const errorMessage = result.stderr || result.stdout || 'Unknown error';
87
+ // Если контекст уже существует, это не критично
88
+ if (errorMessage.includes('already exists')) {
89
+ logger.warn(`Docker context "${contextName}" already exists`);
90
+ return;
91
+ }
92
+ logger.error(`Failed to create Docker context: ${errorMessage}`);
93
+ throw new Error(`Failed to create Docker context "${contextName}": ${errorMessage}`);
94
+ }
95
+ logger.info(`Docker context "${contextName}" created successfully`);
96
+ }
97
+ /**
98
+ * Проверить существование Docker context
99
+ */
100
+ static async contextExists(contextName) {
18
101
  try {
19
- const output = execSync(cmd, {
20
- cwd: options.cwd,
102
+ const result = spawnSync('docker', ['context', 'ls', '--format', 'json'], {
21
103
  encoding: 'utf-8',
22
104
  stdio: ['pipe', 'pipe', 'pipe'],
23
105
  });
24
- return output;
25
- }
26
- catch (error) {
27
- logger.error('docker-compose command failed:', error);
28
- // Извлекаем полное сообщение об ошибке (включая stderr)
29
- let errorMessage = error.message || String(error);
30
- // Если есть stderr, добавляем его к сообщению
31
- if (error.stderr) {
32
- const stderr = error.stderr.toString ? error.stderr.toString() : String(error.stderr);
33
- if (stderr && !errorMessage.includes(stderr)) {
34
- errorMessage = `${errorMessage}\n${stderr}`;
35
- }
106
+ if (result.status !== 0 && result.status !== null) {
107
+ return false;
36
108
  }
37
- // Если есть stdout (может содержать полезную информацию)
38
- if (error.stdout) {
39
- const stdout = error.stdout.toString ? error.stdout.toString() : String(error.stdout);
40
- if (stdout && stdout.trim()) {
41
- errorMessage = `${errorMessage}\n${stdout}`;
42
- }
43
- }
44
- throw new Error(`docker-compose failed: ${errorMessage}`);
109
+ const output = result.stdout || '';
110
+ const contexts = output
111
+ .trim()
112
+ .split('\n')
113
+ .filter((line) => line.trim())
114
+ .map((line) => JSON.parse(line));
115
+ return contexts.some((ctx) => ctx.Name === contextName);
116
+ }
117
+ catch {
118
+ return false;
45
119
  }
46
120
  }
47
121
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compose-exec.js","sourceRoot":"","sources":["../../src/utils/compose-exec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,GAAG,CACR,WAAmB,EACnB,IAAc,EACd,UAA4B,EAAE;QAE9B,kDAAkD;QAClD,MAAM,GAAG,GAAG,qBAAqB,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAEjE,MAAM,CAAC,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;QACjD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE;gBAC3B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YAEtD,wDAAwD;YACxD,IAAI,YAAY,GAAG,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;YAElD,8CAA8C;YAC9C,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtF,IAAI,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7C,YAAY,GAAG,GAAG,YAAY,KAAK,MAAM,EAAE,CAAC;gBAC9C,CAAC;YACH,CAAC;YAED,yDAAyD;YACzD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtF,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC5B,YAAY,GAAG,GAAG,YAAY,KAAK,MAAM,EAAE,CAAC;gBAC9C,CAAC;YACH,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"compose-exec.js","sourceRoot":"","sources":["../../src/utils/compose-exec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAYrC,MAAM,OAAO,WAAW;IACtB;;;OAGG;IACH,MAAM,CAAC,GAAG,CACR,WAAmB,EACnB,IAAc,EACd,UAA8B,EAAE;QAEhC,4DAA4D;QAC5D,oEAAoE;QACpE,IAAI,GAAG,GAAG,qBAAqB,WAAW,EAAE,CAAC;QAE7C,yCAAyC;QACzC,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,GAAG,GAAG,4BAA4B,OAAO,CAAC,aAAa,OAAO,WAAW,EAAE,CAAC;YAC5E,MAAM,CAAC,KAAK,CAAC,yBAAyB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAEjC,MAAM,CAAC,KAAK,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;QACjD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,kDAAkD;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEvD,2CAA2C;QAC3C,MAAM,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE;YAC7C,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,GAAG;YACR,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,sBAAsB;QACtB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,gCAAgC;YAChC,IAAI,YAAY,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC;YAErE,8CAA8C;YAC9C,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC1C,YAAY,GAAG,GAAG,YAAY,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;YACrD,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;gBAC7C,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC,CAAC;YAEH,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,oDAAoD;QACpD,0EAA0E;QAC1E,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACK,MAAM,CAAC,kBAAkB,CAAC,SAA4B;QAC5D,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAE/B,oDAAoD;QACpD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,UAAU,GAAG,SAAS,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YAC3F,GAAG,CAAC,WAAW,GAAG,UAAU,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC,uBAAuB,UAAU,qBAAqB,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAC9B,WAAmB,EACnB,SAAoB;QAEpB,MAAM,UAAU,GAAG,SAAS,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QAC3F,MAAM,GAAG,GAAG,yBAAyB,WAAW,mBAAmB,UAAU,GAAG,CAAC;QAEjF,MAAM,CAAC,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;QAEhD,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE;YACtC,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC;YAEvE,gDAAgD;YAChD,IAAI,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,mBAAmB,WAAW,kBAAkB,CAAC,CAAC;gBAC9D,OAAO;YACT,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,oCAAoC,YAAY,EAAE,CAAC,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,oCAAoC,WAAW,MAAM,YAAY,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,mBAAmB,WAAW,wBAAwB,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,WAAmB;QAC5C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE;gBACxE,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,MAAM;iBACpB,IAAI,EAAE;iBACN,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBACrC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAE3C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -1,33 +1,106 @@
1
1
  /**
2
2
  * Docker Client Wrapper
3
- * Обёртка над Dockerode для централизованного управления
3
+ * Centralized Docker API management with SSH tunnel support
4
4
  */
5
5
  import Docker from 'dockerode';
6
+ import type { SSHConfig } from './ssh-config.js';
6
7
  /**
7
- * Wrapper над Dockerode для централизованного управления
8
+ * Dockerode wrapper for centralized Docker API management
8
9
  */
9
10
  export declare class DockerClient {
10
11
  private docker;
11
- constructor();
12
+ private sshConfig;
13
+ readonly isRemote: boolean;
14
+ private activeSocketPath;
15
+ private sshProcessPid;
16
+ private tunnelCreationLock;
17
+ private tunnelHealthCheckInterval;
18
+ constructor(sshConfig?: SSHConfig | null);
19
+ /**
20
+ * Get SSH config for comparison
21
+ */
22
+ getSSHConfig(): SSHConfig | null;
23
+ /**
24
+ * Get SSH host for identification
25
+ */
26
+ getSSHHost(): string | null;
27
+ /**
28
+ * Cleanup SSH tunnel (called on shutdown)
29
+ */
30
+ cleanup(): void;
31
+ /**
32
+ * Ensure SSH tunnel is created and recreate Docker client with correct socket
33
+ * With mutex to prevent race conditions
34
+ */
35
+ private ensureSSHTunnel;
36
+ /**
37
+ * Start periodic healthcheck for SSH tunnel
38
+ */
39
+ private startTunnelHealthCheck;
40
+ /**
41
+ * Create SSH tunnel to remote Docker socket
42
+ * @returns Path to local socket file
43
+ */
44
+ private createSSHTunnel;
45
+ /**
46
+ * Wait for socket file creation
47
+ */
48
+ private waitForSocket;
49
+ /**
50
+ * Resolve SSH key path (support for ~)
51
+ */
52
+ private resolveKeyPath;
12
53
  /**
13
54
  * Проверка подключения к Docker
55
+ * С retry логикой для удаленных подключений
14
56
  */
15
57
  ping(): Promise<void>;
16
58
  /**
17
- * Получить native Dockerode instance
59
+ * Get native Dockerode instance
18
60
  */
19
61
  getClient(): Docker;
20
62
  /**
21
- * Список контейнеров
63
+ * List containers
64
+ * With retry logic for remote connections
22
65
  */
23
66
  listContainers(options?: Docker.ContainerListOptions): Promise<Docker.ContainerInfo[]>;
24
67
  /**
25
- * Получить контейнер по ID или имени
68
+ * Get container by ID or name
26
69
  */
27
70
  getContainer(id: string): Docker.Container;
28
71
  }
29
72
  /**
30
- * Получить singleton instance DockerClient
73
+ * Get singleton instance of DockerClient
74
+ * @param sshConfig - SSH configuration (optional, for remote Docker)
75
+ */
76
+ export declare function getDockerClient(sshConfig?: SSHConfig | null): DockerClient;
77
+ /**
78
+ * Reset singleton instance (for testing)
79
+ */
80
+ export declare function resetDockerClient(): void;
81
+ /**
82
+ * Cleanup all Docker clients (for graceful shutdown)
83
+ */
84
+ export declare function cleanupDockerClient(): void;
85
+ /**
86
+ * Get Docker client for specific profile
87
+ * @param profileName - Profile name (undefined = local Docker)
88
+ * @returns DockerClient instance
89
+ *
90
+ * @example
91
+ * // Local Docker (default)
92
+ * const localClient = getDockerClientForProfile();
93
+ *
94
+ * // Remote Docker (production profile)
95
+ * const prodClient = getDockerClientForProfile('production');
96
+ */
97
+ export declare function getDockerClientForProfile(profileName?: string): DockerClient;
98
+ /**
99
+ * Clear client pool (for testing or cleanup)
100
+ */
101
+ export declare function clearClientPool(): void;
102
+ /**
103
+ * Cleanup all Docker clients in pool (for graceful shutdown)
31
104
  */
32
- export declare function getDockerClient(): DockerClient;
105
+ export declare function cleanupAllDockerClients(): void;
33
106
  //# sourceMappingURL=docker-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"docker-client.d.ts","sourceRoot":"","sources":["../../src/utils/docker-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,WAAW,CAAC;AAG/B;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;;IAOvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAY3B;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACG,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,oBAAoB;IAI1D;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,SAAS;CAG3C;AAKD;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAK9C"}
1
+ {"version":3,"file":"docker-client.d.ts","sourceRoot":"","sources":["../../src/utils/docker-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,MAAM,MAAM,WAAW,CAAC;AAM/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAmB;IACpC,SAAgB,QAAQ,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,kBAAkB,CAAgC;IAC1D,OAAO,CAAC,yBAAyB,CAA+B;gBAEpD,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;IAgBxC;;OAEG;IACH,YAAY,IAAI,SAAS,GAAG,IAAI;IAIhC;;OAEG;IACH,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B;;OAEG;IACH,OAAO,IAAI,IAAI;IAuCf;;;OAGG;YACW,eAAe;IA6C7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoC9B;;;OAGG;YACW,eAAe;IAuI7B;;OAEG;YACW,aAAa;IAiB3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAQtB;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC3B;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;;OAGG;IACG,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,oBAAoB;IAsB1D;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,SAAS;CAG3C;AAKD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,YAAY,CA6B1E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C;AAoED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,CA4B5E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAyBtC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAM9C"}