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.
- package/README.md +42 -5
- package/README.tr.md +42 -5
- package/SECURITY.md +42 -9
- package/bin/quicklify-mcp +5 -0
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +2 -4
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +44 -12
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/logs.d.ts +3 -2
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +6 -11
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/monitor.d.ts +3 -9
- package/dist/commands/monitor.d.ts.map +1 -1
- package/dist/commands/monitor.js +2 -47
- package/dist/commands/monitor.js.map +1 -1
- package/dist/commands/ssh.d.ts.map +1 -1
- package/dist/commands/ssh.js +4 -1
- package/dist/commands/ssh.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +25 -74
- package/dist/commands/status.js.map +1 -1
- package/dist/core/backup.d.ts +43 -0
- package/dist/core/backup.d.ts.map +1 -0
- package/dist/core/backup.js +259 -0
- package/dist/core/backup.js.map +1 -0
- package/dist/core/domain.d.ts +30 -0
- package/dist/core/domain.d.ts.map +1 -0
- package/dist/core/domain.js +174 -0
- package/dist/core/domain.js.map +1 -0
- package/dist/core/firewall.d.ts +25 -0
- package/dist/core/firewall.d.ts.map +1 -0
- package/dist/core/firewall.js +146 -0
- package/dist/core/firewall.js.map +1 -0
- package/dist/core/logs.d.ts +28 -0
- package/dist/core/logs.d.ts.map +1 -0
- package/dist/core/logs.js +129 -0
- package/dist/core/logs.js.map +1 -0
- package/dist/core/maintain.d.ts +41 -0
- package/dist/core/maintain.d.ts.map +1 -0
- package/dist/core/maintain.js +180 -0
- package/dist/core/maintain.js.map +1 -0
- package/dist/core/manage.d.ts +34 -0
- package/dist/core/manage.d.ts.map +1 -0
- package/dist/core/manage.js +203 -0
- package/dist/core/manage.js.map +1 -0
- package/dist/core/provision.d.ts +18 -0
- package/dist/core/provision.d.ts.map +1 -0
- package/dist/core/provision.js +197 -0
- package/dist/core/provision.js.map +1 -0
- package/dist/core/secure.d.ts +29 -0
- package/dist/core/secure.d.ts.map +1 -0
- package/dist/core/secure.js +198 -0
- package/dist/core/secure.js.map +1 -0
- package/dist/core/snapshot.d.ts +22 -0
- package/dist/core/snapshot.d.ts.map +1 -0
- package/dist/core/snapshot.js +58 -0
- package/dist/core/snapshot.js.map +1 -0
- package/dist/core/status.d.ts +12 -0
- package/dist/core/status.d.ts.map +1 -0
- package/dist/core/status.js +43 -0
- package/dist/core/status.js.map +1 -0
- package/dist/core/tokens.d.ts +4 -0
- package/dist/core/tokens.d.ts.map +1 -0
- package/dist/core/tokens.js +23 -0
- package/dist/core/tokens.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +16 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +105 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/serverBackup.d.ts +29 -0
- package/dist/mcp/tools/serverBackup.d.ts.map +1 -0
- package/dist/mcp/tools/serverBackup.js +376 -0
- package/dist/mcp/tools/serverBackup.js.map +1 -0
- package/dist/mcp/tools/serverInfo.d.ts +20 -0
- package/dist/mcp/tools/serverInfo.d.ts.map +1 -0
- package/dist/mcp/tools/serverInfo.js +219 -0
- package/dist/mcp/tools/serverInfo.js.map +1 -0
- package/dist/mcp/tools/serverLogs.d.ts +30 -0
- package/dist/mcp/tools/serverLogs.d.ts.map +1 -0
- package/dist/mcp/tools/serverLogs.js +145 -0
- package/dist/mcp/tools/serverLogs.js.map +1 -0
- package/dist/mcp/tools/serverMaintain.d.ts +22 -0
- package/dist/mcp/tools/serverMaintain.d.ts.map +1 -0
- package/dist/mcp/tools/serverMaintain.js +217 -0
- package/dist/mcp/tools/serverMaintain.js.map +1 -0
- package/dist/mcp/tools/serverManage.d.ts +33 -0
- package/dist/mcp/tools/serverManage.d.ts.map +1 -0
- package/dist/mcp/tools/serverManage.js +207 -0
- package/dist/mcp/tools/serverManage.js.map +1 -0
- package/dist/mcp/tools/serverProvision.d.ts +31 -0
- package/dist/mcp/tools/serverProvision.d.ts.map +1 -0
- package/dist/mcp/tools/serverProvision.js +125 -0
- package/dist/mcp/tools/serverProvision.js.map +1 -0
- package/dist/mcp/tools/serverSecure.d.ts +40 -0
- package/dist/mcp/tools/serverSecure.d.ts.map +1 -0
- package/dist/mcp/tools/serverSecure.js +396 -0
- package/dist/mcp/tools/serverSecure.js.map +1 -0
- package/dist/providers/vultr.d.ts.map +1 -1
- package/dist/providers/vultr.js +7 -1
- package/dist/providers/vultr.js.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/errorMapper.d.ts +1 -0
- package/dist/utils/errorMapper.d.ts.map +1 -1
- package/dist/utils/errorMapper.js +20 -0
- package/dist/utils/errorMapper.js.map +1 -1
- package/dist/utils/openBrowser.d.ts.map +1 -1
- package/dist/utils/openBrowser.js +6 -1
- package/dist/utils/openBrowser.js.map +1 -1
- package/dist/utils/ssh.d.ts +1 -0
- package/dist/utils/ssh.d.ts.map +1 -1
- package/dist/utils/ssh.js +6 -2
- package/dist/utils/ssh.js.map +1 -1
- package/package.json +6 -3
package/dist/commands/monitor.js
CHANGED
|
@@ -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
|
-
|
|
6
|
-
|
|
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":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
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,
|
|
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"}
|
package/dist/commands/ssh.js
CHANGED
|
@@ -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
|
|
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
|
}
|
package/dist/commands/ssh.js.map
CHANGED
|
@@ -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;
|
|
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":"
|
|
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"}
|
package/dist/commands/status.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
86
|
-
|
|
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
|
-
|
|
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
|
-
|
|
123
|
-
|
|
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":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAI3B,MAAM,mBAAmB,GACvB,4GAA4G,CAAC;AAO/G,SAAS,gBAAgB,CAAC,OAAuB;IAC/C,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IACjI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QACrD,MAAM,UAAU,GAAG,CAAC,CAAC,aAAa,CAAC;QACnC,OAAO,CAAC,GAAG,CACT,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CACzI,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAuB;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACrD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,aAAa,MAAM,WAAW,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,IAAI,OAAO,CAAC,MAAM,iCAAiC,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,aAAa,CAAC,sBAAsB,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;IACnF,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE/D,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAAoB;IAClD,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,+BAA+B,CAAC,CAAC;IAC/D,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;YAEhD,uBAAuB;YACvB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1D,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC/B,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACvC,IAAI,MAAM,CAAC,MAAM;gBAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAc,EAAE,OAAuB;IACzE,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;QACjB,OAAO,SAAS,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,sDAAsD;IACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE9F,MAAM,OAAO,GAAG,aAAa,CAAC,2BAA2B,CAAC,CAAC;IAC3D,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAClE,MAAM,aAAa,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE1D,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAEpC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,CAAC,OAAO,CAAC,0BAA0B,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC;YAExE,sEAAsE;YACtE,IAAI,OAAO,EAAE,SAAS,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBACrD,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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
|