quicklify 1.0.5 → 1.1.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 (121) hide show
  1. package/README.md +42 -5
  2. package/README.tr.md +42 -5
  3. package/SECURITY.md +42 -9
  4. package/bin/quicklify-mcp +5 -0
  5. package/dist/commands/backup.d.ts.map +1 -1
  6. package/dist/commands/backup.js +2 -4
  7. package/dist/commands/backup.js.map +1 -1
  8. package/dist/commands/init.d.ts.map +1 -1
  9. package/dist/commands/init.js +44 -12
  10. package/dist/commands/init.js.map +1 -1
  11. package/dist/commands/logs.d.ts +3 -2
  12. package/dist/commands/logs.d.ts.map +1 -1
  13. package/dist/commands/logs.js +6 -11
  14. package/dist/commands/logs.js.map +1 -1
  15. package/dist/commands/monitor.d.ts +3 -9
  16. package/dist/commands/monitor.d.ts.map +1 -1
  17. package/dist/commands/monitor.js +2 -47
  18. package/dist/commands/monitor.js.map +1 -1
  19. package/dist/commands/ssh.d.ts.map +1 -1
  20. package/dist/commands/ssh.js +4 -1
  21. package/dist/commands/ssh.js.map +1 -1
  22. package/dist/commands/status.d.ts.map +1 -1
  23. package/dist/commands/status.js +25 -74
  24. package/dist/commands/status.js.map +1 -1
  25. package/dist/core/backup.d.ts +43 -0
  26. package/dist/core/backup.d.ts.map +1 -0
  27. package/dist/core/backup.js +259 -0
  28. package/dist/core/backup.js.map +1 -0
  29. package/dist/core/domain.d.ts +30 -0
  30. package/dist/core/domain.d.ts.map +1 -0
  31. package/dist/core/domain.js +174 -0
  32. package/dist/core/domain.js.map +1 -0
  33. package/dist/core/firewall.d.ts +25 -0
  34. package/dist/core/firewall.d.ts.map +1 -0
  35. package/dist/core/firewall.js +146 -0
  36. package/dist/core/firewall.js.map +1 -0
  37. package/dist/core/logs.d.ts +28 -0
  38. package/dist/core/logs.d.ts.map +1 -0
  39. package/dist/core/logs.js +129 -0
  40. package/dist/core/logs.js.map +1 -0
  41. package/dist/core/maintain.d.ts +41 -0
  42. package/dist/core/maintain.d.ts.map +1 -0
  43. package/dist/core/maintain.js +180 -0
  44. package/dist/core/maintain.js.map +1 -0
  45. package/dist/core/manage.d.ts +34 -0
  46. package/dist/core/manage.d.ts.map +1 -0
  47. package/dist/core/manage.js +203 -0
  48. package/dist/core/manage.js.map +1 -0
  49. package/dist/core/provision.d.ts +18 -0
  50. package/dist/core/provision.d.ts.map +1 -0
  51. package/dist/core/provision.js +197 -0
  52. package/dist/core/provision.js.map +1 -0
  53. package/dist/core/secure.d.ts +29 -0
  54. package/dist/core/secure.d.ts.map +1 -0
  55. package/dist/core/secure.js +198 -0
  56. package/dist/core/secure.js.map +1 -0
  57. package/dist/core/snapshot.d.ts +22 -0
  58. package/dist/core/snapshot.d.ts.map +1 -0
  59. package/dist/core/snapshot.js +58 -0
  60. package/dist/core/snapshot.js.map +1 -0
  61. package/dist/core/status.d.ts +12 -0
  62. package/dist/core/status.d.ts.map +1 -0
  63. package/dist/core/status.js +43 -0
  64. package/dist/core/status.js.map +1 -0
  65. package/dist/core/tokens.d.ts +4 -0
  66. package/dist/core/tokens.d.ts.map +1 -0
  67. package/dist/core/tokens.js +23 -0
  68. package/dist/core/tokens.js.map +1 -0
  69. package/dist/mcp/index.d.ts +3 -0
  70. package/dist/mcp/index.d.ts.map +1 -0
  71. package/dist/mcp/index.js +16 -0
  72. package/dist/mcp/index.js.map +1 -0
  73. package/dist/mcp/server.d.ts +3 -0
  74. package/dist/mcp/server.d.ts.map +1 -0
  75. package/dist/mcp/server.js +105 -0
  76. package/dist/mcp/server.js.map +1 -0
  77. package/dist/mcp/tools/serverBackup.d.ts +29 -0
  78. package/dist/mcp/tools/serverBackup.d.ts.map +1 -0
  79. package/dist/mcp/tools/serverBackup.js +376 -0
  80. package/dist/mcp/tools/serverBackup.js.map +1 -0
  81. package/dist/mcp/tools/serverInfo.d.ts +20 -0
  82. package/dist/mcp/tools/serverInfo.d.ts.map +1 -0
  83. package/dist/mcp/tools/serverInfo.js +219 -0
  84. package/dist/mcp/tools/serverInfo.js.map +1 -0
  85. package/dist/mcp/tools/serverLogs.d.ts +30 -0
  86. package/dist/mcp/tools/serverLogs.d.ts.map +1 -0
  87. package/dist/mcp/tools/serverLogs.js +145 -0
  88. package/dist/mcp/tools/serverLogs.js.map +1 -0
  89. package/dist/mcp/tools/serverMaintain.d.ts +22 -0
  90. package/dist/mcp/tools/serverMaintain.d.ts.map +1 -0
  91. package/dist/mcp/tools/serverMaintain.js +217 -0
  92. package/dist/mcp/tools/serverMaintain.js.map +1 -0
  93. package/dist/mcp/tools/serverManage.d.ts +33 -0
  94. package/dist/mcp/tools/serverManage.d.ts.map +1 -0
  95. package/dist/mcp/tools/serverManage.js +207 -0
  96. package/dist/mcp/tools/serverManage.js.map +1 -0
  97. package/dist/mcp/tools/serverProvision.d.ts +31 -0
  98. package/dist/mcp/tools/serverProvision.d.ts.map +1 -0
  99. package/dist/mcp/tools/serverProvision.js +125 -0
  100. package/dist/mcp/tools/serverProvision.js.map +1 -0
  101. package/dist/mcp/tools/serverSecure.d.ts +40 -0
  102. package/dist/mcp/tools/serverSecure.d.ts.map +1 -0
  103. package/dist/mcp/tools/serverSecure.js +396 -0
  104. package/dist/mcp/tools/serverSecure.js.map +1 -0
  105. package/dist/providers/vultr.d.ts.map +1 -1
  106. package/dist/providers/vultr.js +7 -1
  107. package/dist/providers/vultr.js.map +1 -1
  108. package/dist/types/index.d.ts +0 -1
  109. package/dist/types/index.d.ts.map +1 -1
  110. package/dist/utils/errorMapper.d.ts +1 -0
  111. package/dist/utils/errorMapper.d.ts.map +1 -1
  112. package/dist/utils/errorMapper.js +20 -0
  113. package/dist/utils/errorMapper.js.map +1 -1
  114. package/dist/utils/openBrowser.d.ts.map +1 -1
  115. package/dist/utils/openBrowser.js +6 -1
  116. package/dist/utils/openBrowser.js.map +1 -1
  117. package/dist/utils/ssh.d.ts +1 -0
  118. package/dist/utils/ssh.d.ts.map +1 -1
  119. package/dist/utils/ssh.js +6 -2
  120. package/dist/utils/ssh.js.map +1 -1
  121. package/package.json +6 -3
@@ -2,53 +2,8 @@ import { resolveServer } from "../utils/serverSelect.js";
2
2
  import { checkSshAvailable, sshExec } from "../utils/ssh.js";
3
3
  import { logger, createSpinner } from "../utils/logger.js";
4
4
  import { getErrorMessage, mapSshError } from "../utils/errorMapper.js";
5
- export function parseMetrics(stdout) {
6
- const lines = stdout.split("\n");
7
- // Parse CPU from top output - look for %Cpu(s) line
8
- let cpu = "N/A";
9
- for (const line of lines) {
10
- if (line.includes("Cpu") || line.includes("cpu")) {
11
- // Match patterns like "0.0 us" or "0.0%us"
12
- const idleMatch = line.match(/([\d.]+)\s*(?:%?\s*)?id/);
13
- if (idleMatch) {
14
- const idle = parseFloat(idleMatch[1]);
15
- cpu = `${(100 - idle).toFixed(1)}%`;
16
- }
17
- break;
18
- }
19
- }
20
- // Parse RAM from free -h output
21
- let ramUsed = "N/A";
22
- let ramTotal = "N/A";
23
- for (const line of lines) {
24
- if (line.startsWith("Mem:")) {
25
- const parts = line.split(/\s+/);
26
- if (parts.length >= 3) {
27
- ramTotal = parts[1];
28
- ramUsed = parts[2];
29
- }
30
- break;
31
- }
32
- }
33
- // Parse Disk from df -h output - look for "total" line
34
- let diskUsed = "N/A";
35
- let diskTotal = "N/A";
36
- let diskPercent = "N/A";
37
- for (const line of lines) {
38
- if (line.startsWith("total") || line.includes("/dev/")) {
39
- const parts = line.split(/\s+/);
40
- if (parts.length >= 5) {
41
- diskTotal = parts[1];
42
- diskUsed = parts[2];
43
- diskPercent = parts[4];
44
- }
45
- // Prefer "total" line over individual disk lines
46
- if (line.startsWith("total"))
47
- break;
48
- }
49
- }
50
- return { cpu, ramUsed, ramTotal, diskUsed, diskTotal, diskPercent };
51
- }
5
+ import { parseMetrics } from "../core/logs.js";
6
+ export { parseMetrics };
52
7
  export async function monitorCommand(query, options) {
53
8
  if (!checkSshAvailable()) {
54
9
  logger.error("SSH client not found. Please install OpenSSH.");
@@ -1 +1 @@
1
- {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/commands/monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/commands/monitor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/commands/ssh.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0B9F"}
1
+ {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/commands/ssh.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B9F"}
@@ -25,7 +25,10 @@ export async function sshCommand(query, options) {
25
25
  else {
26
26
  logger.info(`Connecting to ${server.name} (${server.ip})...`);
27
27
  const exitCode = await sshConnect(server.ip);
28
- if (exitCode !== 0) {
28
+ if (exitCode === 130) {
29
+ // Ctrl+C — normal user-initiated exit, no warning needed
30
+ }
31
+ else if (exitCode !== 0) {
29
32
  logger.warning(`SSH session ended with code ${exitCode}`);
30
33
  }
31
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/commands/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAc,EAAE,OAA8B;IAC7E,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,4BAA4B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,OAAO,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/commands/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAc,EAAE,OAA8B;IAC7E,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,4BAA4B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;YACrB,yDAAyD;QAC3D,CAAC;aAAM,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAYA,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAwHD,wBAAsB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgE1F"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAgBA,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAiFD,wBAAsB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C1F"}
@@ -1,56 +1,11 @@
1
- import axios from "axios";
2
1
  import { getServers } from "../utils/config.js";
3
2
  import { resolveServer, promptApiToken, collectProviderTokens } from "../utils/serverSelect.js";
4
- import { createProviderWithToken } from "../utils/providerFactory.js";
5
3
  import { checkSshAvailable, sshExec } from "../utils/ssh.js";
6
4
  import { logger, createSpinner } from "../utils/logger.js";
7
5
  import { getErrorMessage, mapProviderError, mapSshError } from "../utils/errorMapper.js";
6
+ import { getCloudServerStatus, checkAllServersStatus, checkCoolifyHealth, } from "../core/status.js";
8
7
  const COOLIFY_RESTART_CMD = "cd /data/coolify/source && docker compose -f docker-compose.yml -f docker-compose.prod.yml restart coolify";
9
- async function checkSingleServer(server, apiToken) {
10
- try {
11
- let serverStatus;
12
- if (server.id.startsWith("manual-")) {
13
- serverStatus = "unknown (manual)";
14
- }
15
- else {
16
- const provider = createProviderWithToken(server.provider, apiToken);
17
- serverStatus = await provider.getServerStatus(server.id);
18
- }
19
- let coolifyStatus = "unknown";
20
- try {
21
- await axios.get(`http://${server.ip}:8000`, {
22
- timeout: 5000,
23
- validateStatus: () => true,
24
- });
25
- coolifyStatus = "running";
26
- }
27
- catch {
28
- coolifyStatus = "not reachable";
29
- }
30
- return { server, serverStatus, coolifyStatus };
31
- }
32
- catch (error) {
33
- return {
34
- server,
35
- serverStatus: "error",
36
- coolifyStatus: "unknown",
37
- error: getErrorMessage(error),
38
- };
39
- }
40
- }
41
- async function statusAll() {
42
- const servers = getServers();
43
- if (servers.length === 0) {
44
- logger.info("No servers found. Deploy one with: quicklify init");
45
- return;
46
- }
47
- const tokenMap = await collectProviderTokens(servers);
48
- const spinner = createSpinner(`Checking status of ${servers.length} server(s)...`);
49
- spinner.start();
50
- const results = await Promise.all(servers.map((s) => checkSingleServer(s, tokenMap.get(s.provider))));
51
- spinner.succeed("Status check complete");
52
- console.log();
53
- // Table header
8
+ function printStatusTable(results) {
54
9
  const header = `${"Name".padEnd(20)} ${"IP".padEnd(16)} ${"Provider".padEnd(14)} ${"Server".padEnd(12)} ${"Coolify".padEnd(14)}`;
55
10
  console.log(header);
56
11
  console.log("─".repeat(header.length));
@@ -59,7 +14,8 @@ async function statusAll() {
59
14
  const coolifyStr = r.coolifyStatus;
60
15
  console.log(`${r.server.name.padEnd(20)} ${r.server.ip.padEnd(16)} ${r.server.provider.padEnd(14)} ${serverStr.padEnd(12)} ${coolifyStr.padEnd(14)}`);
61
16
  }
62
- console.log();
17
+ }
18
+ function printStatusSummary(results) {
63
19
  const running = results.filter((r) => r.coolifyStatus === "running").length;
64
20
  const errors = results.filter((r) => r.error).length;
65
21
  if (errors > 0) {
@@ -69,6 +25,22 @@ async function statusAll() {
69
25
  logger.success(`${running}/${results.length} server(s) with Coolify running`);
70
26
  }
71
27
  }
28
+ async function statusAll() {
29
+ const servers = getServers();
30
+ if (servers.length === 0) {
31
+ logger.info("No servers found. Deploy one with: quicklify init");
32
+ return;
33
+ }
34
+ const tokenMap = await collectProviderTokens(servers);
35
+ const spinner = createSpinner(`Checking status of ${servers.length} server(s)...`);
36
+ spinner.start();
37
+ const results = await checkAllServersStatus(servers, tokenMap);
38
+ spinner.succeed("Status check complete");
39
+ console.log();
40
+ printStatusTable(results);
41
+ console.log();
42
+ printStatusSummary(results);
43
+ }
72
44
  async function autostartCoolify(server) {
73
45
  if (!checkSshAvailable()) {
74
46
  logger.warning("SSH not available. Cannot autostart Coolify.");
@@ -82,14 +54,11 @@ async function autostartCoolify(server) {
82
54
  spinner.succeed("Coolify restart command sent");
83
55
  // Wait and check again
84
56
  await new Promise((resolve) => setTimeout(resolve, 5000));
85
- try {
86
- await axios.get(`http://${server.ip}:8000`, {
87
- timeout: 5000,
88
- validateStatus: () => true,
89
- });
57
+ const healthStatus = await checkCoolifyHealth(server.ip);
58
+ if (healthStatus === "running") {
90
59
  logger.success("Coolify is now running!");
91
60
  }
92
- catch {
61
+ else {
93
62
  logger.warning("Coolify may still be starting. Check again in a moment.");
94
63
  }
95
64
  }
@@ -119,26 +88,8 @@ export async function statusCommand(query, options) {
119
88
  const spinner = createSpinner("Checking server status...");
120
89
  spinner.start();
121
90
  try {
122
- let serverStatus;
123
- if (server.id.startsWith("manual-")) {
124
- serverStatus = "unknown (manual)";
125
- }
126
- else {
127
- const provider = createProviderWithToken(server.provider, apiToken);
128
- serverStatus = await provider.getServerStatus(server.id);
129
- }
130
- // Check Coolify health
131
- let coolifyStatus = "unknown";
132
- try {
133
- await axios.get(`http://${server.ip}:8000`, {
134
- timeout: 5000,
135
- validateStatus: () => true,
136
- });
137
- coolifyStatus = "running";
138
- }
139
- catch {
140
- coolifyStatus = "not reachable";
141
- }
91
+ const serverStatus = await getCloudServerStatus(server, apiToken);
92
+ const coolifyStatus = await checkCoolifyHealth(server.ip);
142
93
  spinner.succeed("Status retrieved");
143
94
  console.log();
144
95
  logger.info(`Name: ${server.name}`);
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { BackupManifest } from "../types/index.js";
2
+ export declare function formatTimestamp(date: Date): string;
3
+ export declare function getBackupDir(serverName: string): string;
4
+ export declare function buildPgDumpCommand(): string;
5
+ export declare function buildConfigTarCommand(): string;
6
+ export declare function buildCleanupCommand(): string;
7
+ export declare function buildCoolifyVersionCommand(): string;
8
+ export declare function buildStopCoolifyCommand(): string;
9
+ export declare function buildStartCoolifyCommand(): string;
10
+ export declare function buildStartDbCommand(): string;
11
+ export declare function buildRestoreDbCommand(): string;
12
+ export declare function buildRestoreConfigCommand(): string;
13
+ export declare function listBackups(serverName: string): string[];
14
+ export declare function loadManifest(backupPath: string): BackupManifest | undefined;
15
+ export declare function scpDownload(ip: string, remotePath: string, localPath: string): Promise<{
16
+ code: number;
17
+ stderr: string;
18
+ }>;
19
+ export declare function scpUpload(ip: string, localPath: string, remotePath: string): Promise<{
20
+ code: number;
21
+ stderr: string;
22
+ }>;
23
+ export declare function tryRestartCoolify(ip: string): Promise<void>;
24
+ export interface BackupResult {
25
+ success: boolean;
26
+ backupPath?: string;
27
+ manifest?: BackupManifest;
28
+ error?: string;
29
+ hint?: string;
30
+ }
31
+ export interface RestoreResult {
32
+ success: boolean;
33
+ steps: Array<{
34
+ name: string;
35
+ status: "success" | "failure";
36
+ error?: string;
37
+ }>;
38
+ error?: string;
39
+ hint?: string;
40
+ }
41
+ export declare function createBackup(ip: string, serverName: string, provider: string): Promise<BackupResult>;
42
+ export declare function restoreBackup(ip: string, serverName: string, backupId: string): Promise<RestoreResult>;
43
+ //# sourceMappingURL=backup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/core/backup.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIxD,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAElD;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAID,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAID,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAWxD;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAQ3E;AAID,wBAAgB,WAAW,CACzB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAe3C;AAED,wBAAgB,SAAS,CACvB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAe3C;AAID,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMjE;AAID,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CAyEvB;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,CAAC,CAsHxB"}
@@ -0,0 +1,259 @@
1
+ import { mkdirSync, existsSync, writeFileSync, readFileSync, readdirSync } from "fs";
2
+ import { join, resolve } from "path";
3
+ import { spawn } from "child_process";
4
+ import { sshExec, assertValidIp, sanitizedEnv } from "../utils/ssh.js";
5
+ import { BACKUPS_DIR } from "../utils/config.js";
6
+ import { getErrorMessage, mapSshError, sanitizeStderr } from "../utils/errorMapper.js";
7
+ // ─── Pure Functions (Backup) ─────────────────────────────────────────────────
8
+ export function formatTimestamp(date) {
9
+ return date.toISOString().replace(/[:.]/g, "-").replace("T", "_").replace("Z", "");
10
+ }
11
+ export function getBackupDir(serverName) {
12
+ return join(BACKUPS_DIR, serverName);
13
+ }
14
+ export function buildPgDumpCommand() {
15
+ return "docker exec coolify-db pg_dump -U coolify -d coolify | gzip > /tmp/coolify-backup.sql.gz";
16
+ }
17
+ export function buildConfigTarCommand() {
18
+ return "tar czf /tmp/coolify-config.tar.gz -C /data/coolify/source .env docker-compose.yml docker-compose.prod.yml 2>/dev/null || tar czf /tmp/coolify-config.tar.gz -C /data/coolify/source .env docker-compose.yml";
19
+ }
20
+ export function buildCleanupCommand() {
21
+ return "rm -f /tmp/coolify-backup.sql.gz /tmp/coolify-config.tar.gz";
22
+ }
23
+ export function buildCoolifyVersionCommand() {
24
+ return "docker inspect coolify --format '{{.Config.Image}}' 2>/dev/null | sed 's/.*://' || echo unknown";
25
+ }
26
+ // ─── Pure Functions (Restore) ────────────────────────────────────────────────
27
+ export function buildStopCoolifyCommand() {
28
+ return "cd /data/coolify/source && docker compose -f docker-compose.yml -f docker-compose.prod.yml stop";
29
+ }
30
+ export function buildStartCoolifyCommand() {
31
+ return "cd /data/coolify/source && docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d";
32
+ }
33
+ export function buildStartDbCommand() {
34
+ return "cd /data/coolify/source && docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d postgres && sleep 3";
35
+ }
36
+ export function buildRestoreDbCommand() {
37
+ return "gunzip -c /tmp/coolify-backup.sql.gz | docker exec -i coolify-db psql -U coolify -d coolify";
38
+ }
39
+ export function buildRestoreConfigCommand() {
40
+ return "tar xzf /tmp/coolify-config.tar.gz -C /data/coolify/source";
41
+ }
42
+ // ─── Semi-Pure Functions (FS Read) ───────────────────────────────────────────
43
+ export function listBackups(serverName) {
44
+ const dir = getBackupDir(serverName);
45
+ if (!existsSync(dir))
46
+ return [];
47
+ try {
48
+ return readdirSync(dir)
49
+ .filter((name) => existsSync(join(dir, name, "manifest.json")))
50
+ .sort()
51
+ .reverse();
52
+ }
53
+ catch {
54
+ return [];
55
+ }
56
+ }
57
+ export function loadManifest(backupPath) {
58
+ const manifestPath = join(backupPath, "manifest.json");
59
+ if (!existsSync(manifestPath))
60
+ return undefined;
61
+ try {
62
+ return JSON.parse(readFileSync(manifestPath, "utf-8"));
63
+ }
64
+ catch {
65
+ return undefined;
66
+ }
67
+ }
68
+ // ─── SCP Functions ───────────────────────────────────────────────────────────
69
+ export function scpDownload(ip, remotePath, localPath) {
70
+ assertValidIp(ip);
71
+ return new Promise((resolve) => {
72
+ const child = spawn("scp", ["-o", "StrictHostKeyChecking=accept-new", `root@${ip}:${remotePath}`, localPath], { stdio: ["inherit", "pipe", "pipe"], env: sanitizedEnv() });
73
+ let stderr = "";
74
+ child.stderr?.on("data", (data) => {
75
+ stderr += data.toString();
76
+ });
77
+ child.on("close", (code) => resolve({ code: code ?? 1, stderr }));
78
+ child.on("error", (err) => resolve({ code: 1, stderr: err.message }));
79
+ });
80
+ }
81
+ export function scpUpload(ip, localPath, remotePath) {
82
+ assertValidIp(ip);
83
+ return new Promise((resolve) => {
84
+ const child = spawn("scp", ["-o", "StrictHostKeyChecking=accept-new", localPath, `root@${ip}:${remotePath}`], { stdio: ["inherit", "pipe", "pipe"], env: sanitizedEnv() });
85
+ let stderr = "";
86
+ child.stderr?.on("data", (data) => {
87
+ stderr += data.toString();
88
+ });
89
+ child.on("close", (code) => resolve({ code: code ?? 1, stderr }));
90
+ child.on("error", (err) => resolve({ code: 1, stderr: err.message }));
91
+ });
92
+ }
93
+ // ─── Best-Effort Rollback ────────────────────────────────────────────────────
94
+ export async function tryRestartCoolify(ip) {
95
+ try {
96
+ await sshExec(ip, buildStartCoolifyCommand());
97
+ }
98
+ catch {
99
+ // Best-effort — swallow errors
100
+ }
101
+ }
102
+ // ─── Async Wrappers ─────────────────────────────────────────────────────────
103
+ export async function createBackup(ip, serverName, provider) {
104
+ assertValidIp(ip);
105
+ try {
106
+ // Step 1: Get Coolify version (best-effort)
107
+ const versionResult = await sshExec(ip, buildCoolifyVersionCommand());
108
+ const coolifyVersion = versionResult.code === 0 ? versionResult.stdout.trim() : "unknown";
109
+ // Step 2: Database backup
110
+ const dbResult = await sshExec(ip, buildPgDumpCommand());
111
+ if (dbResult.code !== 0) {
112
+ return {
113
+ success: false,
114
+ error: "Database backup failed",
115
+ hint: sanitizeStderr(dbResult.stderr) || undefined,
116
+ };
117
+ }
118
+ // Step 3: Config backup
119
+ const configResult = await sshExec(ip, buildConfigTarCommand());
120
+ if (configResult.code !== 0) {
121
+ return {
122
+ success: false,
123
+ error: "Config backup failed",
124
+ hint: sanitizeStderr(configResult.stderr) || undefined,
125
+ };
126
+ }
127
+ // Step 4: Create local directory and download
128
+ const timestamp = formatTimestamp(new Date());
129
+ const backupPath = join(getBackupDir(serverName), timestamp);
130
+ mkdirSync(backupPath, { recursive: true, mode: 0o700 });
131
+ const dbDl = await scpDownload(ip, "/tmp/coolify-backup.sql.gz", join(backupPath, "coolify-backup.sql.gz"));
132
+ if (dbDl.code !== 0) {
133
+ return { success: false, error: "Failed to download database backup", hint: sanitizeStderr(dbDl.stderr) || undefined };
134
+ }
135
+ const configDl = await scpDownload(ip, "/tmp/coolify-config.tar.gz", join(backupPath, "coolify-config.tar.gz"));
136
+ if (configDl.code !== 0) {
137
+ return { success: false, error: "Failed to download config backup", hint: sanitizeStderr(configDl.stderr) || undefined };
138
+ }
139
+ // Step 5: Write manifest
140
+ const manifest = {
141
+ serverName,
142
+ provider,
143
+ timestamp,
144
+ coolifyVersion,
145
+ files: ["coolify-backup.sql.gz", "coolify-config.tar.gz"],
146
+ };
147
+ writeFileSync(join(backupPath, "manifest.json"), JSON.stringify(manifest, null, 2), { mode: 0o600 });
148
+ // Step 6: Cleanup remote (best-effort)
149
+ await sshExec(ip, buildCleanupCommand()).catch(() => { });
150
+ return { success: true, backupPath, manifest };
151
+ }
152
+ catch (error) {
153
+ const hint = mapSshError(error, ip);
154
+ return {
155
+ success: false,
156
+ error: getErrorMessage(error),
157
+ ...(hint ? { hint } : {}),
158
+ };
159
+ }
160
+ }
161
+ export async function restoreBackup(ip, serverName, backupId) {
162
+ assertValidIp(ip);
163
+ const baseDir = getBackupDir(serverName);
164
+ const backupPath = join(baseDir, backupId);
165
+ // Path traversal guard
166
+ if (!resolve(backupPath).startsWith(resolve(baseDir))) {
167
+ return { success: false, steps: [], error: "Invalid backupId: path traversal detected" };
168
+ }
169
+ const steps = [];
170
+ // Validate manifest
171
+ const manifest = loadManifest(backupPath);
172
+ if (!manifest) {
173
+ return {
174
+ success: false,
175
+ steps,
176
+ error: `Backup not found or corrupt: ${backupId}`,
177
+ };
178
+ }
179
+ // Verify backup files exist
180
+ for (const file of manifest.files) {
181
+ if (!existsSync(join(backupPath, file))) {
182
+ return {
183
+ success: false,
184
+ steps,
185
+ error: `Missing backup file: ${file}`,
186
+ };
187
+ }
188
+ }
189
+ try {
190
+ // Upload backup files (before stopping Coolify — safe to fail here)
191
+ const dbUpload = await scpUpload(ip, join(backupPath, "coolify-backup.sql.gz"), "/tmp/coolify-backup.sql.gz");
192
+ if (dbUpload.code !== 0) {
193
+ return {
194
+ success: false,
195
+ steps: [{ name: "Upload database backup", status: "failure", error: sanitizeStderr(dbUpload.stderr) }],
196
+ error: "Failed to upload database backup",
197
+ };
198
+ }
199
+ const configUpload = await scpUpload(ip, join(backupPath, "coolify-config.tar.gz"), "/tmp/coolify-config.tar.gz");
200
+ if (configUpload.code !== 0) {
201
+ return {
202
+ success: false,
203
+ steps: [{ name: "Upload config backup", status: "failure", error: sanitizeStderr(configUpload.stderr) }],
204
+ error: "Failed to upload config backup",
205
+ };
206
+ }
207
+ // Step 1: Stop Coolify
208
+ const stopResult = await sshExec(ip, buildStopCoolifyCommand());
209
+ if (stopResult.code !== 0) {
210
+ steps.push({ name: "Stop Coolify", status: "failure", error: sanitizeStderr(stopResult.stderr) });
211
+ return { success: false, steps, error: "Failed to stop Coolify" };
212
+ }
213
+ steps.push({ name: "Stop Coolify", status: "success" });
214
+ // Step 2: Start DB only
215
+ const dbStartResult = await sshExec(ip, buildStartDbCommand());
216
+ if (dbStartResult.code !== 0) {
217
+ steps.push({ name: "Start database", status: "failure", error: sanitizeStderr(dbStartResult.stderr) });
218
+ await tryRestartCoolify(ip);
219
+ return { success: false, steps, error: "Failed to start database" };
220
+ }
221
+ steps.push({ name: "Start database", status: "success" });
222
+ // Step 3: Restore database
223
+ const restoreDbResult = await sshExec(ip, buildRestoreDbCommand());
224
+ if (restoreDbResult.code !== 0) {
225
+ steps.push({ name: "Restore database", status: "failure", error: sanitizeStderr(restoreDbResult.stderr) });
226
+ await tryRestartCoolify(ip);
227
+ return { success: false, steps, error: "Database restore failed" };
228
+ }
229
+ steps.push({ name: "Restore database", status: "success" });
230
+ // Step 4: Restore config
231
+ const restoreConfigResult = await sshExec(ip, buildRestoreConfigCommand());
232
+ if (restoreConfigResult.code !== 0) {
233
+ steps.push({ name: "Restore config", status: "failure", error: sanitizeStderr(restoreConfigResult.stderr) });
234
+ await tryRestartCoolify(ip);
235
+ return { success: false, steps, error: "Config restore failed" };
236
+ }
237
+ steps.push({ name: "Restore config", status: "success" });
238
+ // Step 5: Start Coolify
239
+ const startResult = await sshExec(ip, buildStartCoolifyCommand());
240
+ if (startResult.code !== 0) {
241
+ steps.push({ name: "Start Coolify", status: "failure", error: sanitizeStderr(startResult.stderr) });
242
+ return { success: false, steps, error: "Failed to start Coolify" };
243
+ }
244
+ steps.push({ name: "Start Coolify", status: "success" });
245
+ // Cleanup remote (best-effort)
246
+ await sshExec(ip, buildCleanupCommand()).catch(() => { });
247
+ return { success: true, steps };
248
+ }
249
+ catch (error) {
250
+ const hint = mapSshError(error, ip);
251
+ return {
252
+ success: false,
253
+ steps,
254
+ error: getErrorMessage(error),
255
+ ...(hint ? { hint } : {}),
256
+ };
257
+ }
258
+ }
259
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/core/backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGvF,gFAAgF;AAEhF,MAAM,UAAU,eAAe,CAAC,IAAU;IACxC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,OAAO,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,0FAA0F,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,8MAA8M,CAAC;AACxN,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,6DAA6D,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO,iGAAiG,CAAC;AAC3G,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,uBAAuB;IACrC,OAAO,iGAAiG,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,kGAAkG,CAAC;AAC5G,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,sHAAsH,CAAC;AAChI,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,6FAA6F,CAAC;AACvG,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,OAAO,4DAA4D,CAAC;AACtE,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,GAAG,CAAC;aACpB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;aAC9D,IAAI,EAAE;aACN,OAAO,EAAE,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,WAAW,CACzB,EAAU,EACV,UAAkB,EAClB,SAAiB;IAEjB,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CACjB,KAAK,EACL,CAAC,IAAI,EAAE,kCAAkC,EAAE,QAAQ,EAAE,IAAI,UAAU,EAAE,EAAE,SAAS,CAAC,EACjF,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,CAC5D,CAAC;QACF,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAClE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,EAAU,EACV,SAAiB,EACjB,UAAkB;IAElB,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CACjB,KAAK,EACL,CAAC,IAAI,EAAE,kCAAkC,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,UAAU,EAAE,CAAC,EACjF,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,CAC5D,CAAC;QACF,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAClE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAU;IAChD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,EAAE,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;AACH,CAAC;AAmBD,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAAU,EACV,UAAkB,EAClB,QAAgB;IAEhB,aAAa,CAAC,EAAE,CAAC,CAAC;IAElB,IAAI,CAAC;QACH,4CAA4C;QAC5C,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACtE,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1F,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACzD,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,wBAAwB;gBAC/B,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,SAAS;aACnD,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAChE,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,sBAAsB;gBAC7B,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,SAAS;aACvD,CAAC;QACJ,CAAC;QAED,8CAA8C;QAC9C,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;QAC7D,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAExD,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,EAAE,EACF,4BAA4B,EAC5B,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAC1C,CAAC;QACF,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QACzH,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,WAAW,CAChC,EAAE,EACF,4BAA4B,EAC5B,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAC1C,CAAC;QACF,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kCAAkC,EAAE,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC3H,CAAC;QAED,yBAAyB;QACzB,MAAM,QAAQ,GAAmB;YAC/B,UAAU;YACV,QAAQ;YACR,SAAS;YACT,cAAc;YACd,KAAK,EAAE,CAAC,uBAAuB,EAAE,uBAAuB,CAAC;SAC1D,CAAC;QACF,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAErG,uCAAuC;QACvC,MAAM,OAAO,CAAC,EAAE,EAAE,mBAAmB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1B,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAU,EACV,UAAkB,EAClB,QAAgB;IAEhB,aAAa,CAAC,EAAE,CAAC,CAAC;IAElB,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE3C,uBAAuB;IACvB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACtD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,2CAA2C,EAAE,CAAC;IAC3F,CAAC;IAED,MAAM,KAAK,GAA2E,EAAE,CAAC;IAEzF,oBAAoB;IACpB,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK;YACL,KAAK,EAAE,gCAAgC,QAAQ,EAAE;SAClD,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK;gBACL,KAAK,EAAE,wBAAwB,IAAI,EAAE;aACtC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,oEAAoE;QACpE,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,EAAE,EACF,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,EACzC,4BAA4B,CAC7B,CAAC;QACF,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtG,KAAK,EAAE,kCAAkC;aAC1C,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,SAAS,CAClC,EAAE,EACF,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,EACzC,4BAA4B,CAC7B,CAAC;QACF,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxG,KAAK,EAAE,gCAAgC;aACxC,CAAC;QACJ,CAAC;QAED,uBAAuB;QACvB,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAChE,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAClG,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;QACpE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAExD,wBAAwB;QACxB,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC/D,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACvG,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC;YAC5B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;QACtE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAE1D,2BAA2B;QAC3B,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,qBAAqB,EAAE,CAAC,CAAC;QACnE,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3G,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC;YAC5B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;QACrE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAE5D,yBAAyB;QACzB,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAC3E,IAAI,mBAAmB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7G,MAAM,iBAAiB,CAAC,EAAE,CAAC,CAAC;YAC5B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QACnE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAE1D,wBAAwB;QACxB,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,EAAE,EAAE,wBAAwB,EAAE,CAAC,CAAC;QAClE,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpG,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;QACrE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAEzD,+BAA+B;QAC/B,MAAM,OAAO,CAAC,EAAE,EAAE,mBAAmB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEzD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK;YACL,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1B,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ export declare function isValidDomain(domain: string): boolean;
2
+ export declare function sanitizeDomain(input: string): string;
3
+ export declare function escapePsqlString(input: string): string;
4
+ export declare function buildSetFqdnCommand(domain: string, ssl: boolean): string;
5
+ export declare function buildGetFqdnCommand(): string;
6
+ export declare function buildCoolifyCheckCommand(): string;
7
+ export declare function buildDnsCheckCommand(domain: string): string;
8
+ export declare function parseDnsResult(stdout: string): string | null;
9
+ export declare function parseFqdn(stdout: string): string | null;
10
+ export interface DomainResult {
11
+ success: boolean;
12
+ error?: string;
13
+ hint?: string;
14
+ }
15
+ export interface DomainInfoResult {
16
+ fqdn: string | null;
17
+ error?: string;
18
+ hint?: string;
19
+ }
20
+ export interface DnsCheckResult {
21
+ resolvedIp: string | null;
22
+ match: boolean;
23
+ error?: string;
24
+ hint?: string;
25
+ }
26
+ export declare function setDomain(ip: string, domain: string, ssl?: boolean): Promise<DomainResult>;
27
+ export declare function removeDomain(ip: string): Promise<DomainResult>;
28
+ export declare function getDomain(ip: string): Promise<DomainInfoResult>;
29
+ export declare function checkDns(ip: string, domain: string): Promise<DnsCheckResult>;
30
+ //# sourceMappingURL=domain.d.ts.map