quicklify 1.1.0 → 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.
- package/LICENSE +1 -1
- package/README.md +48 -24
- package/README.tr.md +46 -22
- package/SECURITY.md +63 -34
- package/dist/commands/add.d.ts +1 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +48 -74
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/backup.d.ts +2 -11
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +111 -53
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/destroy.d.ts.map +1 -1
- package/dist/commands/destroy.js +58 -37
- package/dist/commands/destroy.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +16 -30
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/domain.d.ts +2 -9
- package/dist/commands/domain.d.ts.map +1 -1
- package/dist/commands/domain.js +47 -56
- package/dist/commands/domain.js.map +1 -1
- package/dist/commands/firewall.d.ts +3 -10
- package/dist/commands/firewall.d.ts.map +1 -1
- package/dist/commands/firewall.js +28 -51
- package/dist/commands/firewall.js.map +1 -1
- package/dist/commands/health.d.ts +2 -2
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +77 -19
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +28 -306
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/interactive.d.ts +2 -0
- package/dist/commands/interactive.d.ts.map +1 -0
- package/dist/commands/interactive.js +357 -0
- package/dist/commands/interactive.js.map +1 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +4 -2
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +9 -1
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/maintain.d.ts.map +1 -1
- package/dist/commands/maintain.js +28 -47
- package/dist/commands/maintain.js.map +1 -1
- package/dist/commands/monitor.js +1 -1
- package/dist/commands/monitor.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +25 -0
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/restart.d.ts.map +1 -1
- package/dist/commands/restart.js +39 -39
- package/dist/commands/restart.js.map +1 -1
- package/dist/commands/restore.d.ts +2 -13
- package/dist/commands/restore.d.ts.map +1 -1
- package/dist/commands/restore.js +42 -54
- package/dist/commands/restore.js.map +1 -1
- package/dist/commands/secure.d.ts +2 -9
- package/dist/commands/secure.d.ts.map +1 -1
- package/dist/commands/secure.js +2 -97
- package/dist/commands/secure.js.map +1 -1
- package/dist/commands/snapshot.d.ts.map +1 -1
- package/dist/commands/snapshot.js +55 -67
- package/dist/commands/snapshot.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +33 -16
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +23 -16
- package/dist/commands/update.js.map +1 -1
- package/dist/constants.d.ts +42 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +54 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/backup.d.ts +18 -2
- package/dist/core/backup.d.ts.map +1 -1
- package/dist/core/backup.js +184 -7
- package/dist/core/backup.js.map +1 -1
- package/dist/core/deploy.d.ts +4 -0
- package/dist/core/deploy.d.ts.map +1 -0
- package/dist/core/deploy.js +360 -0
- package/dist/core/deploy.js.map +1 -0
- package/dist/core/domain.d.ts.map +1 -1
- package/dist/core/domain.js +1 -5
- package/dist/core/domain.js.map +1 -1
- package/dist/core/firewall.d.ts +2 -0
- package/dist/core/firewall.d.ts.map +1 -1
- package/dist/core/firewall.js +12 -0
- package/dist/core/firewall.js.map +1 -1
- package/dist/core/logs.js +1 -1
- package/dist/core/logs.js.map +1 -1
- package/dist/core/maintain.d.ts.map +1 -1
- package/dist/core/maintain.js +1 -2
- package/dist/core/maintain.js.map +1 -1
- package/dist/core/manage.d.ts +10 -1
- package/dist/core/manage.d.ts.map +1 -1
- package/dist/core/manage.js +45 -7
- package/dist/core/manage.js.map +1 -1
- package/dist/core/provision.d.ts +2 -1
- package/dist/core/provision.d.ts.map +1 -1
- package/dist/core/provision.js +8 -13
- package/dist/core/provision.js.map +1 -1
- package/dist/core/secure.d.ts.map +1 -1
- package/dist/core/secure.js +8 -2
- package/dist/core/secure.js.map +1 -1
- package/dist/core/status.d.ts.map +1 -1
- package/dist/core/status.js +2 -1
- package/dist/core/status.js.map +1 -1
- package/dist/core/tokens.d.ts.map +1 -1
- package/dist/core/tokens.js +5 -8
- package/dist/core/tokens.js.map +1 -1
- package/dist/index.js +17 -4
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +13 -7
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/serverBackup.d.ts +2 -7
- package/dist/mcp/tools/serverBackup.d.ts.map +1 -1
- package/dist/mcp/tools/serverBackup.js +120 -234
- package/dist/mcp/tools/serverBackup.js.map +1 -1
- package/dist/mcp/tools/serverInfo.d.ts +19 -2
- package/dist/mcp/tools/serverInfo.d.ts.map +1 -1
- package/dist/mcp/tools/serverInfo.js +122 -57
- package/dist/mcp/tools/serverInfo.js.map +1 -1
- package/dist/mcp/tools/serverLogs.d.ts +2 -7
- package/dist/mcp/tools/serverLogs.d.ts.map +1 -1
- package/dist/mcp/tools/serverLogs.js +36 -57
- package/dist/mcp/tools/serverLogs.js.map +1 -1
- package/dist/mcp/tools/serverMaintain.d.ts +3 -8
- package/dist/mcp/tools/serverMaintain.d.ts.map +1 -1
- package/dist/mcp/tools/serverMaintain.js +48 -109
- package/dist/mcp/tools/serverMaintain.js.map +1 -1
- package/dist/mcp/tools/serverManage.d.ts +5 -0
- package/dist/mcp/tools/serverManage.d.ts.map +1 -1
- package/dist/mcp/tools/serverManage.js +94 -110
- package/dist/mcp/tools/serverManage.js.map +1 -1
- package/dist/mcp/tools/serverProvision.d.ts +7 -1
- package/dist/mcp/tools/serverProvision.d.ts.map +1 -1
- package/dist/mcp/tools/serverProvision.js +69 -77
- package/dist/mcp/tools/serverProvision.js.map +1 -1
- package/dist/mcp/tools/serverSecure.d.ts +2 -7
- package/dist/mcp/tools/serverSecure.d.ts.map +1 -1
- package/dist/mcp/tools/serverSecure.js +109 -170
- package/dist/mcp/tools/serverSecure.js.map +1 -1
- package/dist/mcp/utils.d.ts +42 -0
- package/dist/mcp/utils.d.ts.map +1 -0
- package/dist/mcp/utils.js +61 -0
- package/dist/mcp/utils.js.map +1 -0
- package/dist/providers/base.d.ts +9 -2
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +56 -1
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/digitalocean.d.ts +3 -3
- package/dist/providers/digitalocean.d.ts.map +1 -1
- package/dist/providers/digitalocean.js +4 -12
- package/dist/providers/digitalocean.js.map +1 -1
- package/dist/providers/hetzner.d.ts +3 -3
- package/dist/providers/hetzner.d.ts.map +1 -1
- package/dist/providers/hetzner.js +8 -13
- package/dist/providers/hetzner.js.map +1 -1
- package/dist/providers/linode.d.ts +3 -3
- package/dist/providers/linode.d.ts.map +1 -1
- package/dist/providers/linode.js +3 -11
- package/dist/providers/linode.js.map +1 -1
- package/dist/providers/vultr.d.ts +3 -3
- package/dist/providers/vultr.d.ts.map +1 -1
- package/dist/providers/vultr.js +3 -11
- package/dist/providers/vultr.js.map +1 -1
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/cloudInit.d.ts +1 -0
- package/dist/utils/cloudInit.d.ts.map +1 -1
- package/dist/utils/cloudInit.js +62 -0
- package/dist/utils/cloudInit.js.map +1 -1
- package/dist/utils/config.js +1 -1
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/defaults.d.ts.map +1 -1
- package/dist/utils/defaults.js +3 -2
- package/dist/utils/defaults.js.map +1 -1
- package/dist/utils/errorMapper.d.ts.map +1 -1
- package/dist/utils/errorMapper.js +5 -1
- package/dist/utils/errorMapper.js.map +1 -1
- package/dist/utils/modeGuard.d.ts +5 -0
- package/dist/utils/modeGuard.d.ts.map +1 -0
- package/dist/utils/modeGuard.js +13 -0
- package/dist/utils/modeGuard.js.map +1 -0
- package/dist/utils/openBrowser.d.ts.map +1 -1
- package/dist/utils/openBrowser.js +3 -1
- package/dist/utils/openBrowser.js.map +1 -1
- package/dist/utils/prompts.d.ts +2 -2
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/prompts.js +8 -9
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/serverSelect.d.ts.map +1 -1
- package/dist/utils/serverSelect.js +2 -7
- package/dist/utils/serverSelect.js.map +1 -1
- package/dist/utils/ssh.d.ts +9 -0
- package/dist/utils/ssh.d.ts.map +1 -1
- package/dist/utils/ssh.js +175 -15
- package/dist/utils/ssh.js.map +1 -1
- package/dist/utils/sshKey.d.ts.map +1 -1
- package/dist/utils/sshKey.js +3 -0
- package/dist/utils/sshKey.js.map +1 -1
- package/dist/utils/yamlConfig.d.ts.map +1 -1
- package/dist/utils/yamlConfig.js +4 -3
- package/dist/utils/yamlConfig.js.map +1 -1
- package/package.json +5 -5
package/dist/commands/domain.js
CHANGED
|
@@ -2,67 +2,16 @@ 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
|
-
|
|
8
|
-
|
|
9
|
-
export function isValidDomain(domain) {
|
|
10
|
-
// RFC 1035 compliant domain validation
|
|
11
|
-
const pattern = /^(?!-)[a-zA-Z0-9-]{1,63}(?<!-)(\.[a-zA-Z0-9-]{1,63})*\.[a-zA-Z]{2,}$/;
|
|
12
|
-
return pattern.test(domain);
|
|
13
|
-
}
|
|
14
|
-
export function sanitizeDomain(input) {
|
|
15
|
-
let domain = input.trim();
|
|
16
|
-
// Strip protocol prefix
|
|
17
|
-
domain = domain.replace(/^https?:\/\//, "");
|
|
18
|
-
// Strip trailing slash
|
|
19
|
-
domain = domain.replace(/\/+$/, "");
|
|
20
|
-
// Strip port
|
|
21
|
-
domain = domain.replace(/:\d+$/, "");
|
|
22
|
-
return domain;
|
|
23
|
-
}
|
|
24
|
-
export function escapePsqlString(input) {
|
|
25
|
-
return input.replace(/'/g, "''");
|
|
26
|
-
}
|
|
27
|
-
export function buildSetFqdnCommand(domain, ssl) {
|
|
28
|
-
if (/[^a-zA-Z0-9.:_-]/.test(domain)) {
|
|
29
|
-
throw new Error(`Invalid domain for FQDN command: ${domain}`);
|
|
30
|
-
}
|
|
31
|
-
const protocol = ssl ? "https" : "http";
|
|
32
|
-
const url = escapePsqlString(`${protocol}://${domain}`);
|
|
33
|
-
return [
|
|
34
|
-
`docker exec ${COOLIFY_DB_CONTAINER} psql -U ${COOLIFY_DB_USER} -d ${COOLIFY_DB_NAME} -c "UPDATE instance_settings SET fqdn='${url}' WHERE id=0;"`,
|
|
35
|
-
`cd ${COOLIFY_SOURCE_DIR} && docker compose -f docker-compose.yml -f docker-compose.prod.yml restart coolify`,
|
|
36
|
-
].join(" && ");
|
|
37
|
-
}
|
|
38
|
-
export function buildGetFqdnCommand() {
|
|
39
|
-
return `docker exec ${COOLIFY_DB_CONTAINER} psql -U ${COOLIFY_DB_USER} -d ${COOLIFY_DB_NAME} -t -c "SELECT fqdn FROM instance_settings WHERE id=0;"`;
|
|
40
|
-
}
|
|
41
|
-
export function buildCoolifyCheckCommand() {
|
|
42
|
-
return `docker ps --filter name=${COOLIFY_DB_CONTAINER} --format '{{.Names}}' 2>/dev/null`;
|
|
43
|
-
}
|
|
44
|
-
export function buildDnsCheckCommand(domain) {
|
|
45
|
-
const safeDomain = domain.replace(/[^a-zA-Z0-9.-]/g, "");
|
|
46
|
-
return `dig +short A ${safeDomain} 2>/dev/null || getent ahosts ${safeDomain} 2>/dev/null | head -1 | awk '{print $1}'`;
|
|
47
|
-
}
|
|
48
|
-
export function parseDnsResult(stdout) {
|
|
49
|
-
// dig +short returns just IP addresses, getent returns IP + hostname
|
|
50
|
-
const ipMatch = stdout.match(/\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/);
|
|
51
|
-
return ipMatch ? ipMatch[1] : null;
|
|
52
|
-
}
|
|
53
|
-
export function parseFqdn(stdout) {
|
|
54
|
-
// psql -t output: just the value with possible leading/trailing whitespace
|
|
55
|
-
const trimmed = stdout.trim();
|
|
56
|
-
if (!trimmed)
|
|
57
|
-
return null;
|
|
58
|
-
return trimmed;
|
|
59
|
-
}
|
|
5
|
+
import { COOLIFY_DB_CONTAINER } from "../constants.js";
|
|
6
|
+
import { requireCoolifyMode } from "../utils/modeGuard.js";
|
|
7
|
+
import { isValidDomain, sanitizeDomain, escapePsqlString, buildSetFqdnCommand, buildGetFqdnCommand, buildCoolifyCheckCommand, buildDnsCheckCommand, parseDnsResult, parseFqdn, } from "../core/domain.js";
|
|
8
|
+
export { isValidDomain, sanitizeDomain, escapePsqlString, buildSetFqdnCommand, buildGetFqdnCommand, buildCoolifyCheckCommand, buildDnsCheckCommand, parseDnsResult, parseFqdn, };
|
|
60
9
|
export async function domainCommand(subcommand, query, options) {
|
|
61
10
|
if (!checkSshAvailable()) {
|
|
62
11
|
logger.error("SSH client not found. Please install OpenSSH.");
|
|
63
12
|
return;
|
|
64
13
|
}
|
|
65
|
-
const validSubcommands = ["add", "remove", "check", "list"];
|
|
14
|
+
const validSubcommands = ["add", "remove", "check", "list", "info"];
|
|
66
15
|
const sub = subcommand || "list";
|
|
67
16
|
if (!validSubcommands.includes(sub)) {
|
|
68
17
|
logger.error(`Invalid subcommand: ${sub}. Choose from: ${validSubcommands.join(", ")}`);
|
|
@@ -71,6 +20,11 @@ export async function domainCommand(subcommand, query, options) {
|
|
|
71
20
|
const server = await resolveServer(query, "Select a server for domain management:");
|
|
72
21
|
if (!server)
|
|
73
22
|
return;
|
|
23
|
+
const modeError = requireCoolifyMode(server, "domain");
|
|
24
|
+
if (modeError) {
|
|
25
|
+
logger.error(modeError);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
74
28
|
const dryRun = options?.dryRun || false;
|
|
75
29
|
switch (sub) {
|
|
76
30
|
case "add":
|
|
@@ -85,6 +39,9 @@ export async function domainCommand(subcommand, query, options) {
|
|
|
85
39
|
case "list":
|
|
86
40
|
await domainList(server.ip, server.name);
|
|
87
41
|
break;
|
|
42
|
+
case "info":
|
|
43
|
+
await domainInfo(server.ip, server.name);
|
|
44
|
+
break;
|
|
88
45
|
}
|
|
89
46
|
}
|
|
90
47
|
async function domainAdd(ip, name, options, dryRun) {
|
|
@@ -245,4 +202,38 @@ async function domainList(ip, name) {
|
|
|
245
202
|
logger.info(hint);
|
|
246
203
|
}
|
|
247
204
|
}
|
|
205
|
+
async function domainInfo(ip, name) {
|
|
206
|
+
const spinner = createSpinner(`Fetching domain info for ${name}...`);
|
|
207
|
+
spinner.start();
|
|
208
|
+
try {
|
|
209
|
+
const result = await sshExec(ip, buildGetFqdnCommand());
|
|
210
|
+
if (result.code !== 0) {
|
|
211
|
+
spinner.fail("Failed to fetch domain info");
|
|
212
|
+
if (result.stderr)
|
|
213
|
+
logger.error(result.stderr);
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
const fqdn = parseFqdn(result.stdout);
|
|
217
|
+
spinner.succeed(`Domain info for ${name}`);
|
|
218
|
+
console.log();
|
|
219
|
+
logger.info(`Server: ${name} (${ip})`);
|
|
220
|
+
if (fqdn) {
|
|
221
|
+
logger.info(`FQDN: ${fqdn}`);
|
|
222
|
+
const isHttps = fqdn.startsWith("https://");
|
|
223
|
+
logger.info(`SSL: ${isHttps ? "enabled" : "disabled"}`);
|
|
224
|
+
logger.info(`URL: ${fqdn}`);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
logger.info(`FQDN: not set (using IP)`);
|
|
228
|
+
logger.info(`URL: http://${ip}:8000`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
spinner.fail("Failed to fetch domain info");
|
|
233
|
+
logger.error(getErrorMessage(error));
|
|
234
|
+
const hint = mapSshError(error, ip);
|
|
235
|
+
if (hint)
|
|
236
|
+
logger.info(hint);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
248
239
|
//# sourceMappingURL=domain.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domain.js","sourceRoot":"","sources":["../../src/commands/domain.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":"domain.js","sourceRoot":"","sources":["../../src/commands/domain.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
export
|
|
3
|
-
export declare const COOLIFY_PORTS: number[];
|
|
4
|
-
export declare function isValidPort(port: number): boolean;
|
|
5
|
-
export declare function isProtectedPort(port: number): boolean;
|
|
6
|
-
export declare function buildUfwRuleCommand(action: "allow" | "delete allow", port: number, protocol?: FirewallProtocol): string;
|
|
7
|
-
export declare function buildFirewallSetupCommand(): string;
|
|
8
|
-
export declare function buildUfwStatusCommand(): string;
|
|
9
|
-
export declare function parseUfwStatus(stdout: string): FirewallStatus;
|
|
1
|
+
import { PROTECTED_PORTS, COOLIFY_PORTS, BARE_PORTS, isValidPort, isProtectedPort, buildUfwRuleCommand, buildFirewallSetupCommand, buildBareFirewallSetupCommand, buildUfwStatusCommand, parseUfwStatus } from "../core/firewall.js";
|
|
2
|
+
export { PROTECTED_PORTS, COOLIFY_PORTS, BARE_PORTS, isValidPort, isProtectedPort, buildUfwRuleCommand, buildFirewallSetupCommand, buildBareFirewallSetupCommand, buildUfwStatusCommand, parseUfwStatus, };
|
|
10
3
|
export declare function firewallCommand(subcommand?: string, query?: string, options?: {
|
|
11
4
|
port?: string;
|
|
12
5
|
protocol?: string;
|
|
13
6
|
dryRun?: boolean;
|
|
14
7
|
}): Promise<void>;
|
|
15
|
-
export declare function firewallSetup(ip: string, name: string, dryRun: boolean): Promise<void>;
|
|
8
|
+
export declare function firewallSetup(ip: string, name: string, dryRun: boolean, isBare?: boolean): Promise<void>;
|
|
16
9
|
//# sourceMappingURL=firewall.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firewall.d.ts","sourceRoot":"","sources":["../../src/commands/firewall.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"firewall.d.ts","sourceRoot":"","sources":["../../src/commands/firewall.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,eAAe,EACf,aAAa,EACb,UAAU,EACV,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,EACrB,cAAc,EACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,aAAa,EACb,UAAU,EACV,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,yBAAyB,EACzB,6BAA6B,EAC7B,qBAAqB,EACrB,cAAc,GACf,CAAC;AAGF,wBAAsB,eAAe,CACnC,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/D,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,EACf,MAAM,CAAC,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CAsCf"}
|
|
@@ -3,49 +3,9 @@ import { resolveServer } from "../utils/serverSelect.js";
|
|
|
3
3
|
import { checkSshAvailable, sshExec } from "../utils/ssh.js";
|
|
4
4
|
import { logger, createSpinner } from "../utils/logger.js";
|
|
5
5
|
import { getErrorMessage, mapSshError } from "../utils/errorMapper.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
export
|
|
9
|
-
return Number.isInteger(port) && port >= 1 && port <= 65535;
|
|
10
|
-
}
|
|
11
|
-
export function isProtectedPort(port) {
|
|
12
|
-
return PROTECTED_PORTS.includes(port);
|
|
13
|
-
}
|
|
14
|
-
export function buildUfwRuleCommand(action, port, protocol = "tcp") {
|
|
15
|
-
return `ufw ${action} ${port}/${protocol}`;
|
|
16
|
-
}
|
|
17
|
-
export function buildFirewallSetupCommand() {
|
|
18
|
-
const commands = [
|
|
19
|
-
"apt-get install -y ufw",
|
|
20
|
-
"ufw default deny incoming",
|
|
21
|
-
"ufw default allow outgoing",
|
|
22
|
-
...COOLIFY_PORTS.map((p) => `ufw allow ${p}/tcp`),
|
|
23
|
-
"ufw allow 22/tcp",
|
|
24
|
-
'echo "y" | ufw enable',
|
|
25
|
-
];
|
|
26
|
-
return commands.join(" && ");
|
|
27
|
-
}
|
|
28
|
-
export function buildUfwStatusCommand() {
|
|
29
|
-
return "ufw status numbered";
|
|
30
|
-
}
|
|
31
|
-
export function parseUfwStatus(stdout) {
|
|
32
|
-
const lines = stdout.split("\n");
|
|
33
|
-
const active = stdout.toLowerCase().includes("status: active");
|
|
34
|
-
const rules = [];
|
|
35
|
-
for (const line of lines) {
|
|
36
|
-
// Match lines like: [ 1] 22/tcp ALLOW IN Anywhere
|
|
37
|
-
const match = line.match(/\[\s*\d+\]\s+(\d+)\/(tcp|udp)\s+(ALLOW|DENY)\s+IN\s+(.*)/i);
|
|
38
|
-
if (match) {
|
|
39
|
-
rules.push({
|
|
40
|
-
port: parseInt(match[1], 10),
|
|
41
|
-
protocol: match[2].toLowerCase(),
|
|
42
|
-
action: match[3].toUpperCase(),
|
|
43
|
-
from: match[4].trim() || "Anywhere",
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return { active, rules };
|
|
48
|
-
}
|
|
6
|
+
import { isBareServer } from "../utils/modeGuard.js";
|
|
7
|
+
import { PROTECTED_PORTS, COOLIFY_PORTS, BARE_PORTS, isValidPort, isProtectedPort, buildUfwRuleCommand, buildFirewallSetupCommand, buildBareFirewallSetupCommand, buildUfwStatusCommand, parseUfwStatus, } from "../core/firewall.js";
|
|
8
|
+
export { PROTECTED_PORTS, COOLIFY_PORTS, BARE_PORTS, isValidPort, isProtectedPort, buildUfwRuleCommand, buildFirewallSetupCommand, buildBareFirewallSetupCommand, buildUfwStatusCommand, parseUfwStatus, };
|
|
49
9
|
export async function firewallCommand(subcommand, query, options) {
|
|
50
10
|
if (!checkSshAvailable()) {
|
|
51
11
|
logger.error("SSH client not found. Please install OpenSSH.");
|
|
@@ -62,9 +22,11 @@ export async function firewallCommand(subcommand, query, options) {
|
|
|
62
22
|
return;
|
|
63
23
|
const dryRun = options?.dryRun || false;
|
|
64
24
|
switch (sub) {
|
|
65
|
-
case "setup":
|
|
66
|
-
|
|
25
|
+
case "setup": {
|
|
26
|
+
const bare = isBareServer(server);
|
|
27
|
+
await firewallSetup(server.ip, server.name, dryRun, bare);
|
|
67
28
|
break;
|
|
29
|
+
}
|
|
68
30
|
case "add":
|
|
69
31
|
await firewallAdd(server.ip, server.name, options, dryRun);
|
|
70
32
|
break;
|
|
@@ -79,8 +41,8 @@ export async function firewallCommand(subcommand, query, options) {
|
|
|
79
41
|
break;
|
|
80
42
|
}
|
|
81
43
|
}
|
|
82
|
-
export async function firewallSetup(ip, name, dryRun) {
|
|
83
|
-
const command = buildFirewallSetupCommand();
|
|
44
|
+
export async function firewallSetup(ip, name, dryRun, isBare) {
|
|
45
|
+
const command = isBare ? buildBareFirewallSetupCommand() : buildFirewallSetupCommand();
|
|
84
46
|
if (dryRun) {
|
|
85
47
|
logger.title("Dry Run - Firewall Setup");
|
|
86
48
|
logger.info(`Server: ${name} (${ip})`);
|
|
@@ -104,7 +66,12 @@ export async function firewallSetup(ip, name, dryRun) {
|
|
|
104
66
|
return;
|
|
105
67
|
}
|
|
106
68
|
spinner.succeed("Firewall configured successfully");
|
|
107
|
-
|
|
69
|
+
if (isBare) {
|
|
70
|
+
logger.success(`UFW enabled with web ports (${BARE_PORTS.join(", ")}) + SSH (22)`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
logger.success(`UFW enabled with Coolify ports (${COOLIFY_PORTS.join(", ")}) + SSH (22)`);
|
|
74
|
+
}
|
|
108
75
|
}
|
|
109
76
|
catch (error) {
|
|
110
77
|
spinner.fail("Failed to setup firewall");
|
|
@@ -248,16 +215,26 @@ async function firewallStatusCheck(ip, name) {
|
|
|
248
215
|
const spinner = createSpinner(`Checking firewall status on ${name}...`);
|
|
249
216
|
spinner.start();
|
|
250
217
|
try {
|
|
251
|
-
const result = await sshExec(ip,
|
|
218
|
+
const result = await sshExec(ip, buildUfwStatusCommand());
|
|
252
219
|
if (result.code !== 0) {
|
|
253
220
|
spinner.fail("Failed to check firewall status");
|
|
254
221
|
if (result.stderr)
|
|
255
222
|
logger.error(result.stderr);
|
|
256
223
|
return;
|
|
257
224
|
}
|
|
258
|
-
const
|
|
259
|
-
if (active) {
|
|
225
|
+
const status = parseUfwStatus(result.stdout);
|
|
226
|
+
if (status.active) {
|
|
260
227
|
spinner.succeed(`UFW is active on ${name}`);
|
|
228
|
+
if (status.rules.length > 0) {
|
|
229
|
+
console.log();
|
|
230
|
+
logger.info(`Open ports (${status.rules.length} rules):`);
|
|
231
|
+
for (const rule of status.rules) {
|
|
232
|
+
logger.step(`${rule.port}/${rule.protocol} → ${rule.action} from ${rule.from}`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
logger.info("No rules configured.");
|
|
237
|
+
}
|
|
261
238
|
}
|
|
262
239
|
else {
|
|
263
240
|
spinner.warn(`UFW is inactive on ${name}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firewall.js","sourceRoot":"","sources":["../../src/commands/firewall.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,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":"firewall.js","sourceRoot":"","sources":["../../src/commands/firewall.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { ServerRecord } from "../types/index.js";
|
|
2
2
|
export interface HealthResult {
|
|
3
3
|
server: ServerRecord;
|
|
4
|
-
status: "healthy" | "unhealthy" | "unreachable";
|
|
4
|
+
status: "healthy" | "unhealthy" | "unreachable" | "host-key-mismatch";
|
|
5
5
|
responseTime: number;
|
|
6
6
|
}
|
|
7
7
|
export declare function checkServerHealth(server: ServerRecord): Promise<HealthResult>;
|
|
8
|
-
export declare function healthCommand(): Promise<void>;
|
|
8
|
+
export declare function healthCommand(query?: string): Promise<void>;
|
|
9
9
|
//# sourceMappingURL=health.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,aAAa,GAAG,mBAAmB,CAAC;IACtE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CA+BnF;AAED,wBAAsB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFjE"}
|
package/dist/commands/health.js
CHANGED
|
@@ -1,15 +1,33 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import { getServers, findServer } from "../utils/config.js";
|
|
2
|
+
import { checkCoolifyHealth } from "../core/status.js";
|
|
3
|
+
import { sshExec, isHostKeyMismatch } from "../utils/ssh.js";
|
|
4
|
+
import { isBareServer } from "../utils/modeGuard.js";
|
|
3
5
|
import { logger, createSpinner } from "../utils/logger.js";
|
|
4
6
|
export async function checkServerHealth(server) {
|
|
5
7
|
const start = Date.now();
|
|
8
|
+
if (isBareServer(server)) {
|
|
9
|
+
// Bare servers: check reachability via SSH
|
|
10
|
+
try {
|
|
11
|
+
const result = await sshExec(server.ip, "echo ok");
|
|
12
|
+
const responseTime = Date.now() - start;
|
|
13
|
+
if (result.code === 0) {
|
|
14
|
+
return { server, status: "healthy", responseTime };
|
|
15
|
+
}
|
|
16
|
+
if (isHostKeyMismatch(result.stderr)) {
|
|
17
|
+
return { server, status: "host-key-mismatch", responseTime };
|
|
18
|
+
}
|
|
19
|
+
return { server, status: "unreachable", responseTime };
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
const responseTime = Date.now() - start;
|
|
23
|
+
return { server, status: "unreachable", responseTime };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Coolify servers: HTTP-based health check
|
|
6
27
|
try {
|
|
7
|
-
const
|
|
8
|
-
timeout: 5000,
|
|
9
|
-
validateStatus: () => true,
|
|
10
|
-
});
|
|
28
|
+
const healthStatus = await checkCoolifyHealth(server.ip);
|
|
11
29
|
const responseTime = Date.now() - start;
|
|
12
|
-
const status =
|
|
30
|
+
const status = healthStatus === "running" ? "healthy" : "unreachable";
|
|
13
31
|
return { server, status, responseTime };
|
|
14
32
|
}
|
|
15
33
|
catch {
|
|
@@ -17,37 +35,77 @@ export async function checkServerHealth(server) {
|
|
|
17
35
|
return { server, status: "unreachable", responseTime };
|
|
18
36
|
}
|
|
19
37
|
}
|
|
20
|
-
export async function healthCommand() {
|
|
21
|
-
|
|
38
|
+
export async function healthCommand(query) {
|
|
39
|
+
let servers = getServers();
|
|
22
40
|
if (servers.length === 0) {
|
|
23
41
|
logger.info("No servers found. Deploy one with: quicklify init");
|
|
24
42
|
return;
|
|
25
43
|
}
|
|
44
|
+
// If query provided, filter to matching server
|
|
45
|
+
if (query) {
|
|
46
|
+
const found = findServer(query);
|
|
47
|
+
if (!found) {
|
|
48
|
+
logger.error(`Server not found: ${query}`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
servers = [found];
|
|
52
|
+
}
|
|
26
53
|
const spinner = createSpinner(`Checking health of ${servers.length} server(s)...`);
|
|
27
54
|
spinner.start();
|
|
28
55
|
const results = await Promise.all(servers.map(checkServerHealth));
|
|
29
56
|
spinner.succeed("Health check complete");
|
|
30
57
|
console.log();
|
|
31
58
|
// Table header
|
|
32
|
-
const header = `${"Name".padEnd(20)} ${"IP".padEnd(16)} ${"Status".padEnd(
|
|
59
|
+
const header = `${"Name".padEnd(20)} ${"IP".padEnd(16)} ${"Status".padEnd(22)} ${"Response".padEnd(10)}`;
|
|
33
60
|
console.log(header);
|
|
34
61
|
console.log("─".repeat(header.length));
|
|
35
62
|
// Table rows
|
|
63
|
+
const hostKeyMismatches = [];
|
|
36
64
|
for (const result of results) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
65
|
+
let statusStr;
|
|
66
|
+
let timeStr;
|
|
67
|
+
if (result.status === "healthy") {
|
|
68
|
+
statusStr = "✔ healthy";
|
|
69
|
+
timeStr = `${result.responseTime}ms`;
|
|
70
|
+
}
|
|
71
|
+
else if (result.status === "unhealthy") {
|
|
72
|
+
statusStr = "⚠ unhealthy";
|
|
73
|
+
timeStr = `${result.responseTime}ms`;
|
|
74
|
+
}
|
|
75
|
+
else if (result.status === "host-key-mismatch") {
|
|
76
|
+
statusStr = "⚠ host key changed";
|
|
77
|
+
timeStr = "n/a";
|
|
78
|
+
hostKeyMismatches.push(result);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
statusStr = "✖ unreachable";
|
|
82
|
+
timeStr = "timeout";
|
|
83
|
+
}
|
|
84
|
+
console.log(`${result.server.name.padEnd(20)} ${result.server.ip.padEnd(16)} ${statusStr.padEnd(22)} ${timeStr.padEnd(10)}`);
|
|
44
85
|
}
|
|
45
86
|
console.log();
|
|
87
|
+
// Show actionable hint for host key mismatches
|
|
88
|
+
if (hostKeyMismatches.length > 0) {
|
|
89
|
+
for (const r of hostKeyMismatches) {
|
|
90
|
+
logger.warning(`Run: ssh-keygen -R ${r.server.ip} to fix host key mismatch (or it will auto-fix on next SSH operation)`);
|
|
91
|
+
}
|
|
92
|
+
console.log();
|
|
93
|
+
}
|
|
46
94
|
const healthy = results.filter((r) => r.status === "healthy").length;
|
|
47
95
|
const unhealthy = results.filter((r) => r.status === "unhealthy").length;
|
|
48
96
|
const unreachable = results.filter((r) => r.status === "unreachable").length;
|
|
49
|
-
|
|
50
|
-
|
|
97
|
+
const hostKeyCount = hostKeyMismatches.length;
|
|
98
|
+
if (unreachable > 0 || unhealthy > 0 || hostKeyCount > 0) {
|
|
99
|
+
const parts = [];
|
|
100
|
+
if (healthy > 0)
|
|
101
|
+
parts.push(`${healthy} healthy`);
|
|
102
|
+
if (unhealthy > 0)
|
|
103
|
+
parts.push(`${unhealthy} unhealthy`);
|
|
104
|
+
if (unreachable > 0)
|
|
105
|
+
parts.push(`${unreachable} unreachable`);
|
|
106
|
+
if (hostKeyCount > 0)
|
|
107
|
+
parts.push(`${hostKeyCount} host key changed`);
|
|
108
|
+
logger.warning(parts.join(", "));
|
|
51
109
|
}
|
|
52
110
|
else {
|
|
53
111
|
logger.success(`All ${healthy} server(s) are healthy`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/commands/health.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAkBrD,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+N1E"}
|