@hypnosis/docker-mcp-server 1.0.4 → 1.2.1

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 (79) hide show
  1. package/README.md +87 -28
  2. package/dist/adapters/redis.d.ts.map +1 -1
  3. package/dist/adapters/redis.js +18 -6
  4. package/dist/adapters/redis.js.map +1 -1
  5. package/dist/discovery/compose-parser.d.ts +4 -0
  6. package/dist/discovery/compose-parser.d.ts.map +1 -1
  7. package/dist/discovery/compose-parser.js +25 -0
  8. package/dist/discovery/compose-parser.js.map +1 -1
  9. package/dist/discovery/project-discovery.d.ts.map +1 -1
  10. package/dist/discovery/project-discovery.js +24 -0
  11. package/dist/discovery/project-discovery.js.map +1 -1
  12. package/dist/discovery/remote-discovery.d.ts +99 -0
  13. package/dist/discovery/remote-discovery.d.ts.map +1 -0
  14. package/dist/discovery/remote-discovery.js +410 -0
  15. package/dist/discovery/remote-discovery.js.map +1 -0
  16. package/dist/discovery/types.d.ts +4 -0
  17. package/dist/discovery/types.d.ts.map +1 -1
  18. package/dist/index.js +85 -12
  19. package/dist/index.js.map +1 -1
  20. package/dist/managers/compose-manager.d.ts +3 -1
  21. package/dist/managers/compose-manager.d.ts.map +1 -1
  22. package/dist/managers/compose-manager.js +10 -1
  23. package/dist/managers/compose-manager.js.map +1 -1
  24. package/dist/managers/container-manager.d.ts +9 -1
  25. package/dist/managers/container-manager.d.ts.map +1 -1
  26. package/dist/managers/container-manager.js +67 -75
  27. package/dist/managers/container-manager.js.map +1 -1
  28. package/dist/tools/container-tools.d.ts +7 -1
  29. package/dist/tools/container-tools.d.ts.map +1 -1
  30. package/dist/tools/container-tools.js +156 -18
  31. package/dist/tools/container-tools.js.map +1 -1
  32. package/dist/tools/database-tools.d.ts.map +1 -1
  33. package/dist/tools/database-tools.js +36 -4
  34. package/dist/tools/database-tools.js.map +1 -1
  35. package/dist/tools/discovery-tools.d.ts +29 -0
  36. package/dist/tools/discovery-tools.d.ts.map +1 -0
  37. package/dist/tools/discovery-tools.js +173 -0
  38. package/dist/tools/discovery-tools.js.map +1 -0
  39. package/dist/tools/env-tools.d.ts +5 -0
  40. package/dist/tools/env-tools.d.ts.map +1 -1
  41. package/dist/tools/env-tools.js +158 -15
  42. package/dist/tools/env-tools.js.map +1 -1
  43. package/dist/tools/executor-tool.d.ts +5 -0
  44. package/dist/tools/executor-tool.d.ts.map +1 -1
  45. package/dist/tools/executor-tool.js +60 -5
  46. package/dist/tools/executor-tool.js.map +1 -1
  47. package/dist/tools/mcp-health-tool.d.ts +11 -0
  48. package/dist/tools/mcp-health-tool.d.ts.map +1 -1
  49. package/dist/tools/mcp-health-tool.js +25 -4
  50. package/dist/tools/mcp-health-tool.js.map +1 -1
  51. package/dist/tools/profile-tool.d.ts +46 -0
  52. package/dist/tools/profile-tool.d.ts.map +1 -0
  53. package/dist/tools/profile-tool.js +91 -0
  54. package/dist/tools/profile-tool.js.map +1 -0
  55. package/dist/utils/compose-exec.d.ts +28 -3
  56. package/dist/utils/compose-exec.d.ts.map +1 -1
  57. package/dist/utils/compose-exec.js +100 -26
  58. package/dist/utils/compose-exec.js.map +1 -1
  59. package/dist/utils/docker-client.d.ts +73 -8
  60. package/dist/utils/docker-client.d.ts.map +1 -1
  61. package/dist/utils/docker-client.js +492 -16
  62. package/dist/utils/docker-client.js.map +1 -1
  63. package/dist/utils/profiles-file.d.ts +57 -0
  64. package/dist/utils/profiles-file.d.ts.map +1 -0
  65. package/dist/utils/profiles-file.js +167 -0
  66. package/dist/utils/profiles-file.js.map +1 -0
  67. package/dist/utils/retry.d.ts +49 -0
  68. package/dist/utils/retry.d.ts.map +1 -0
  69. package/dist/utils/retry.js +120 -0
  70. package/dist/utils/retry.js.map +1 -0
  71. package/dist/utils/ssh-config.d.ts +104 -0
  72. package/dist/utils/ssh-config.d.ts.map +1 -0
  73. package/dist/utils/ssh-config.js +346 -0
  74. package/dist/utils/ssh-config.js.map +1 -0
  75. package/dist/utils/ssh-exec.d.ts +59 -0
  76. package/dist/utils/ssh-exec.d.ts.map +1 -0
  77. package/dist/utils/ssh-exec.js +156 -0
  78. package/dist/utils/ssh-exec.js.map +1 -0
  79. package/package.json +21 -3
@@ -3,7 +3,10 @@
3
3
  * MCP server self-diagnostics
4
4
  */
5
5
  import { CallToolRequest, Tool } from '@modelcontextprotocol/sdk/types.js';
6
+ import type { SSHConfig } from '../utils/ssh-config.js';
6
7
  export declare class MCPHealthTool {
8
+ private sshConfig;
9
+ constructor(sshConfig?: SSHConfig | null);
7
10
  /**
8
11
  * Register health tool
9
12
  */
@@ -36,6 +39,14 @@ export declare class MCPHealthTool {
36
39
  status: 'ok' | 'failed';
37
40
  message?: string;
38
41
  latency?: number;
42
+ mode?: 'local' | 'remote';
43
+ };
44
+ ssh?: {
45
+ status: 'ok' | 'not_configured';
46
+ host?: string;
47
+ port?: number;
48
+ username?: string;
49
+ tunnelActive?: boolean;
39
50
  };
40
51
  discovery: {
41
52
  status: 'ok' | 'failed';
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-health-tool.d.ts","sourceRoot":"","sources":["../../src/tools/mcp-health-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,eAAe,EACf,IAAI,EACL,MAAM,oCAAoC,CAAC;AAO5C,qBAAa,aAAa;IACxB;;OAEG;IACH,OAAO,IAAI,IAAI;IAWf;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,eAAe;;;;;;;;;;;;;IA0BzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QACrB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;QAC7C,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE;YACN,MAAM,EAAE;gBACN,MAAM,EAAE,IAAI,GAAG,QAAQ,CAAC;gBACxB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,OAAO,CAAC,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,SAAS,EAAE;gBACT,MAAM,EAAE,IAAI,GAAG,QAAQ,CAAC;gBACxB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,YAAY,CAAC,EAAE,OAAO,CAAC;gBACvB,WAAW,CAAC,EAAE,MAAM,CAAC;aACtB,CAAC;YACF,QAAQ,EAAE;gBACR,MAAM,EAAE,IAAI,CAAC;gBACb,UAAU,EAAE,MAAM,EAAE,CAAC;gBACrB,KAAK,EAAE,MAAM,CAAC;aACf,CAAC;YACF,KAAK,EAAE;gBACL,MAAM,EAAE,IAAI,CAAC;gBACb,IAAI,EAAE,MAAM,CAAC;gBACb,GAAG,EAAE,MAAM,CAAC;aACb,CAAC;YACF,MAAM,EAAE;gBACN,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC;gBACzB,QAAQ,EAAE,MAAM,CAAC;gBACjB,SAAS,EAAE,MAAM,CAAC;gBAClB,GAAG,EAAE,MAAM,CAAC;aACb,CAAC;SACH,CAAC;KACH,CAAC;CAkFH"}
1
+ {"version":3,"file":"mcp-health-tool.d.ts","sourceRoot":"","sources":["../../src/tools/mcp-health-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,eAAe,EACf,IAAI,EACL,MAAM,oCAAoC,CAAC;AAM5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAmB;gBAExB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI;IAIxC;;OAEG;IACH,OAAO,IAAI,IAAI;IAWf;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,eAAe;;;;;;;;;;;;;IA0BzC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QACrB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;QAC7C,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE;YACN,MAAM,EAAE;gBACN,MAAM,EAAE,IAAI,GAAG,QAAQ,CAAC;gBACxB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;aAC3B,CAAC;YACF,GAAG,CAAC,EAAE;gBACJ,MAAM,EAAE,IAAI,GAAG,gBAAgB,CAAC;gBAChC,IAAI,CAAC,EAAE,MAAM,CAAC;gBACd,IAAI,CAAC,EAAE,MAAM,CAAC;gBACd,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAClB,YAAY,CAAC,EAAE,OAAO,CAAC;aACxB,CAAC;YACF,SAAS,EAAE;gBACT,MAAM,EAAE,IAAI,GAAG,QAAQ,CAAC;gBACxB,OAAO,CAAC,EAAE,MAAM,CAAC;gBACjB,YAAY,CAAC,EAAE,OAAO,CAAC;gBACvB,WAAW,CAAC,EAAE,MAAM,CAAC;aACtB,CAAC;YACF,QAAQ,EAAE;gBACR,MAAM,EAAE,IAAI,CAAC;gBACb,UAAU,EAAE,MAAM,EAAE,CAAC;gBACrB,KAAK,EAAE,MAAM,CAAC;aACf,CAAC;YACF,KAAK,EAAE;gBACL,MAAM,EAAE,IAAI,CAAC;gBACb,IAAI,EAAE,MAAM,CAAC;gBACb,GAAG,EAAE,MAAM,CAAC;aACb,CAAC;YACF,MAAM,EAAE;gBACN,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC;gBACzB,QAAQ,EAAE,MAAM,CAAC;gBACjB,SAAS,EAAE,MAAM,CAAC;gBAClB,GAAG,EAAE,MAAM,CAAC;aACb,CAAC;SACH,CAAC;KACH,CAAC;CAmGH"}
@@ -8,6 +8,10 @@ import { adapterRegistry } from '../adapters/adapter-registry.js';
8
8
  import { projectConfigCache } from '../utils/cache.js';
9
9
  import { logger } from '../utils/logger.js';
10
10
  export class MCPHealthTool {
11
+ sshConfig;
12
+ constructor(sshConfig) {
13
+ this.sshConfig = sshConfig || null;
14
+ }
11
15
  /**
12
16
  * Register health tool
13
17
  */
@@ -63,15 +67,32 @@ export class MCPHealthTool {
63
67
  checks.docker = {
64
68
  status: 'ok',
65
69
  latency,
70
+ mode: this.sshConfig ? 'remote' : 'local',
66
71
  };
67
72
  }
68
73
  catch (error) {
69
74
  checks.docker = {
70
75
  status: 'failed',
71
76
  message: error.message || 'Docker connection failed',
77
+ mode: this.sshConfig ? 'remote' : 'local',
78
+ };
79
+ }
80
+ // 2. SSH Status (if configured)
81
+ if (this.sshConfig) {
82
+ checks.ssh = {
83
+ status: 'ok',
84
+ host: this.sshConfig.host,
85
+ port: this.sshConfig.port || 22,
86
+ username: this.sshConfig.username,
87
+ tunnelActive: checks.docker.status === 'ok',
88
+ };
89
+ }
90
+ else {
91
+ checks.ssh = {
92
+ status: 'not_configured',
72
93
  };
73
94
  }
74
- // 2. Project Discovery
95
+ // 3. Project Discovery
75
96
  try {
76
97
  const projectDiscovery = new ProjectDiscovery();
77
98
  const project = await projectDiscovery.findProject();
@@ -88,20 +109,20 @@ export class MCPHealthTool {
88
109
  projectFound: false,
89
110
  };
90
111
  }
91
- // 3. Adapters Registry
112
+ // 4. Adapters Registry
92
113
  const registeredTypes = adapterRegistry.getRegisteredTypes();
93
114
  checks.adapters = {
94
115
  status: 'ok',
95
116
  registered: registeredTypes,
96
117
  count: registeredTypes.length,
97
118
  };
98
- // 4. Cache Status
119
+ // 5. Cache Status
99
120
  checks.cache = {
100
121
  status: 'ok',
101
122
  size: projectConfigCache.size(),
102
123
  ttl: 60, // seconds (hardcoded, as not exported in Cache)
103
124
  };
104
- // 5. Memory Usage
125
+ // 6. Memory Usage
105
126
  const mem = process.memoryUsage();
106
127
  const heapUsedMB = Math.round(mem.heapUsed / 1024 / 1024);
107
128
  const heapTotalMB = Math.round(mem.heapTotal / 1024 / 1024);
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-health-tool.js","sourceRoot":"","sources":["../../src/tools/mcp-health-tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-health-tool.js","sourceRoot":"","sources":["../../src/tools/mcp-health-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Profile Management Tool
3
+ * Show and manage SSH profiles
4
+ */
5
+ import { CallToolRequest, Tool } from '@modelcontextprotocol/sdk/types.js';
6
+ import type { SSHConfig } from '../utils/ssh-config.js';
7
+ export declare class ProfileTool {
8
+ private sshConfig;
9
+ private profilesFile;
10
+ constructor(sshConfig?: SSHConfig | null, profilesFile?: string);
11
+ /**
12
+ * Register profile tool
13
+ */
14
+ getTool(): Tool;
15
+ /**
16
+ * Handle tool call
17
+ */
18
+ handleCall(request: CallToolRequest): Promise<{
19
+ content: {
20
+ type: string;
21
+ text: string;
22
+ }[];
23
+ isError?: undefined;
24
+ } | {
25
+ content: {
26
+ type: string;
27
+ text: string;
28
+ }[];
29
+ isError: boolean;
30
+ }>;
31
+ /**
32
+ * Get profile information
33
+ */
34
+ getProfileInfo(): Promise<{
35
+ mode: 'local' | 'remote';
36
+ current?: {
37
+ host: string;
38
+ port: number;
39
+ username: string;
40
+ };
41
+ profilesFile?: string;
42
+ availableProfiles?: string[];
43
+ defaultProfile?: string;
44
+ }>;
45
+ }
46
+ //# sourceMappingURL=profile-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-tool.d.ts","sourceRoot":"","sources":["../../src/tools/profile-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,eAAe,EACf,IAAI,EACL,MAAM,oCAAoC,CAAC;AAG5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,YAAY,CAAqB;gBAE7B,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM;IAK/D;;OAEG;IACH,OAAO,IAAI,IAAI;IAWf;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,eAAe;;;;;;;;;;;;;IA0BzC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC;QAC9B,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;QACzB,OAAO,CAAC,EAAE;YACR,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CAoCH"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Profile Management Tool
3
+ * Show and manage SSH profiles
4
+ */
5
+ import { logger } from '../utils/logger.js';
6
+ import { loadProfilesFile } from '../utils/profiles-file.js';
7
+ export class ProfileTool {
8
+ sshConfig;
9
+ profilesFile;
10
+ constructor(sshConfig, profilesFile) {
11
+ this.sshConfig = sshConfig || null;
12
+ this.profilesFile = profilesFile;
13
+ }
14
+ /**
15
+ * Register profile tool
16
+ */
17
+ getTool() {
18
+ return {
19
+ name: 'docker_profile_info',
20
+ description: 'Show current SSH profile and available profiles',
21
+ inputSchema: {
22
+ type: 'object',
23
+ properties: {},
24
+ },
25
+ };
26
+ }
27
+ /**
28
+ * Handle tool call
29
+ */
30
+ async handleCall(request) {
31
+ try {
32
+ const info = await this.getProfileInfo();
33
+ return {
34
+ content: [
35
+ {
36
+ type: 'text',
37
+ text: JSON.stringify(info, null, 2),
38
+ },
39
+ ],
40
+ };
41
+ }
42
+ catch (error) {
43
+ logger.error('Profile info failed:', error);
44
+ return {
45
+ content: [
46
+ {
47
+ type: 'text',
48
+ text: `Error: ${error.message}`,
49
+ },
50
+ ],
51
+ isError: true,
52
+ };
53
+ }
54
+ }
55
+ /**
56
+ * Get profile information
57
+ */
58
+ async getProfileInfo() {
59
+ // Local mode
60
+ if (!this.sshConfig) {
61
+ return {
62
+ mode: 'local',
63
+ };
64
+ }
65
+ // Remote mode
66
+ const result = {
67
+ mode: 'remote',
68
+ current: {
69
+ host: this.sshConfig.host,
70
+ port: this.sshConfig.port || 22,
71
+ username: this.sshConfig.username,
72
+ },
73
+ };
74
+ // Load profiles file if available
75
+ if (this.profilesFile) {
76
+ result.profilesFile = this.profilesFile;
77
+ try {
78
+ const profilesResult = loadProfilesFile(this.profilesFile);
79
+ if (profilesResult.config) {
80
+ result.availableProfiles = Object.keys(profilesResult.config.profiles);
81
+ result.defaultProfile = profilesResult.config.default;
82
+ }
83
+ }
84
+ catch (error) {
85
+ logger.warn(`Failed to load profiles file: ${error.message}`);
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+ }
91
+ //# sourceMappingURL=profile-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-tool.js","sourceRoot":"","sources":["../../src/tools/profile-tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG7D,MAAM,OAAO,WAAW;IACd,SAAS,CAAmB;IAC5B,YAAY,CAAqB;IAEzC,YAAY,SAA4B,EAAE,YAAqB;QAC7D,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC;QACnC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO;YACL,IAAI,EAAE,qBAAqB;YAC3B,WAAW,EAAE,iDAAiD;YAC9D,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACf;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,OAAwB;QACvC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAEzC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;qBACpC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC5C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE;qBAChC;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAWlB,aAAa;QACb,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO;gBACL,IAAI,EAAE,OAAO;aACd,CAAC;QACJ,CAAC;QAED,cAAc;QACd,MAAM,MAAM,GAAQ;YAClB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;gBACzB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE;gBAC/B,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ;aAClC;SACF,CAAC;QAEF,kCAAkC;QAClC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YAExC,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAE3D,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;oBAC1B,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACvE,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC;gBACxD,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
@@ -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":"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"}
@@ -1,33 +1,98 @@
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
+ private isRemote;
14
+ private activeSocketPath;
15
+ private sshProcessPid;
16
+ private tunnelCreationLock;
17
+ private tunnelHealthCheckInterval;
18
+ constructor(sshConfig?: SSHConfig | null);
19
+ /**
20
+ * Cleanup SSH tunnel (called on shutdown)
21
+ */
22
+ cleanup(): void;
23
+ /**
24
+ * Ensure SSH tunnel is created and recreate Docker client with correct socket
25
+ * With mutex to prevent race conditions
26
+ */
27
+ private ensureSSHTunnel;
28
+ /**
29
+ * Start periodic healthcheck for SSH tunnel
30
+ */
31
+ private startTunnelHealthCheck;
32
+ /**
33
+ * Create SSH tunnel to remote Docker socket
34
+ * @returns Path to local socket file
35
+ */
36
+ private createSSHTunnel;
37
+ /**
38
+ * Wait for socket file creation
39
+ */
40
+ private waitForSocket;
41
+ /**
42
+ * Resolve SSH key path (support for ~)
43
+ */
44
+ private resolveKeyPath;
12
45
  /**
13
46
  * Проверка подключения к Docker
47
+ * С retry логикой для удаленных подключений
14
48
  */
15
49
  ping(): Promise<void>;
16
50
  /**
17
- * Получить native Dockerode instance
51
+ * Get native Dockerode instance
18
52
  */
19
53
  getClient(): Docker;
20
54
  /**
21
- * Список контейнеров
55
+ * List containers
56
+ * With retry logic for remote connections
22
57
  */
23
58
  listContainers(options?: Docker.ContainerListOptions): Promise<Docker.ContainerInfo[]>;
24
59
  /**
25
- * Получить контейнер по ID или имени
60
+ * Get container by ID or name
26
61
  */
27
62
  getContainer(id: string): Docker.Container;
28
63
  }
29
64
  /**
30
- * Получить singleton instance DockerClient
65
+ * Get singleton instance of DockerClient
66
+ * @param sshConfig - SSH configuration (optional, for remote Docker)
67
+ */
68
+ export declare function getDockerClient(sshConfig?: SSHConfig | null): DockerClient;
69
+ /**
70
+ * Reset singleton instance (for testing)
71
+ */
72
+ export declare function resetDockerClient(): void;
73
+ /**
74
+ * Cleanup all Docker clients (for graceful shutdown)
75
+ */
76
+ export declare function cleanupDockerClient(): void;
77
+ /**
78
+ * Get Docker client for specific profile
79
+ * @param profileName - Profile name (undefined = local Docker)
80
+ * @returns DockerClient instance
81
+ *
82
+ * @example
83
+ * // Local Docker (default)
84
+ * const localClient = getDockerClientForProfile();
85
+ *
86
+ * // Remote Docker (production profile)
87
+ * const prodClient = getDockerClientForProfile('production');
88
+ */
89
+ export declare function getDockerClientForProfile(profileName?: string): DockerClient;
90
+ /**
91
+ * Clear client pool (for testing or cleanup)
92
+ */
93
+ export declare function clearClientPool(): void;
94
+ /**
95
+ * Cleanup all Docker clients in pool (for graceful shutdown)
31
96
  */
32
- export declare function getDockerClient(): DockerClient;
97
+ export declare function cleanupAllDockerClients(): void;
33
98
  //# 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,OAAO,CAAC,QAAQ,CAAU;IAC1B,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,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,CAU1E;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"}