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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../src/core/domain.ts"],"names":[],"mappings":"AAYA,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,CAUxE;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG5D;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIvD;AAID,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,wBAAsB,SAAS,CAC7B,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,GAAG,GAAE,OAAc,GAClB,OAAO,CAAC,YAAY,CAAC,CAoCvB;AAED,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA+BpE;AAED,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqBrE;AAED,wBAAsB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoClF"}
@@ -0,0 +1,174 @@
1
+ import { sshExec, assertValidIp } from "../utils/ssh.js";
2
+ import { getErrorMessage, mapSshError } from "../utils/errorMapper.js";
3
+ // ─── Constants ──────────────────────────────────────────────────────────────
4
+ const COOLIFY_SOURCE_DIR = "/data/coolify/source";
5
+ const COOLIFY_DB_CONTAINER = "coolify-db";
6
+ const COOLIFY_DB_USER = "coolify";
7
+ const COOLIFY_DB_NAME = "coolify";
8
+ // ─── Pure Functions ─────────────────────────────────────────────────────────
9
+ export function isValidDomain(domain) {
10
+ const pattern = /^(?!-)[a-zA-Z0-9-]{1,63}(?<!-)(\.[a-zA-Z0-9-]{1,63})*\.[a-zA-Z]{2,}$/;
11
+ return pattern.test(domain);
12
+ }
13
+ export function sanitizeDomain(input) {
14
+ let domain = input.trim();
15
+ domain = domain.replace(/^https?:\/\//, "");
16
+ domain = domain.replace(/\/+$/, "");
17
+ domain = domain.replace(/:\d+$/, "");
18
+ return domain;
19
+ }
20
+ export function escapePsqlString(input) {
21
+ return input.replace(/'/g, "''");
22
+ }
23
+ export function buildSetFqdnCommand(domain, ssl) {
24
+ if (/[^a-zA-Z0-9.:_-]/.test(domain)) {
25
+ throw new Error(`Invalid domain for FQDN command: ${domain}`);
26
+ }
27
+ const protocol = ssl ? "https" : "http";
28
+ const url = escapePsqlString(`${protocol}://${domain}`);
29
+ return [
30
+ `docker exec ${COOLIFY_DB_CONTAINER} psql -U ${COOLIFY_DB_USER} -d ${COOLIFY_DB_NAME} -c "UPDATE instance_settings SET fqdn='${url}' WHERE id=0;"`,
31
+ `cd ${COOLIFY_SOURCE_DIR} && docker compose -f docker-compose.yml -f docker-compose.prod.yml restart coolify`,
32
+ ].join(" && ");
33
+ }
34
+ export function buildGetFqdnCommand() {
35
+ 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;"`;
36
+ }
37
+ export function buildCoolifyCheckCommand() {
38
+ return `docker ps --filter name=${COOLIFY_DB_CONTAINER} --format '{{.Names}}' 2>/dev/null`;
39
+ }
40
+ export function buildDnsCheckCommand(domain) {
41
+ const safeDomain = domain.replace(/[^a-zA-Z0-9.-]/g, "");
42
+ return `dig +short A ${safeDomain} 2>/dev/null || getent ahosts ${safeDomain} 2>/dev/null | head -1 | awk '{print $1}'`;
43
+ }
44
+ export function parseDnsResult(stdout) {
45
+ const ipMatch = stdout.match(/\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/);
46
+ return ipMatch ? ipMatch[1] : null;
47
+ }
48
+ export function parseFqdn(stdout) {
49
+ const trimmed = stdout.trim();
50
+ if (!trimmed)
51
+ return null;
52
+ return trimmed;
53
+ }
54
+ // ─── Async Wrappers ─────────────────────────────────────────────────────────
55
+ export async function setDomain(ip, domain, ssl = true) {
56
+ assertValidIp(ip);
57
+ const cleanDomain = sanitizeDomain(domain);
58
+ if (!isValidDomain(cleanDomain)) {
59
+ return { success: false, error: `Invalid domain: ${cleanDomain}` };
60
+ }
61
+ try {
62
+ // Check if coolify-db container is running
63
+ const checkResult = await sshExec(ip, buildCoolifyCheckCommand());
64
+ if (!checkResult.stdout.includes(COOLIFY_DB_CONTAINER)) {
65
+ return {
66
+ success: false,
67
+ error: "Coolify database container not found. Is Coolify installed and running?",
68
+ };
69
+ }
70
+ const command = buildSetFqdnCommand(cleanDomain, ssl);
71
+ const result = await sshExec(ip, command);
72
+ if (result.code !== 0) {
73
+ return {
74
+ success: false,
75
+ error: `Failed to set domain (exit code ${result.code})`,
76
+ };
77
+ }
78
+ return { success: true };
79
+ }
80
+ catch (error) {
81
+ const hint = mapSshError(error, ip);
82
+ return {
83
+ success: false,
84
+ error: getErrorMessage(error),
85
+ ...(hint ? { hint } : {}),
86
+ };
87
+ }
88
+ }
89
+ export async function removeDomain(ip) {
90
+ assertValidIp(ip);
91
+ try {
92
+ // Check if coolify-db container is running
93
+ const checkResult = await sshExec(ip, buildCoolifyCheckCommand());
94
+ if (!checkResult.stdout.includes(COOLIFY_DB_CONTAINER)) {
95
+ return {
96
+ success: false,
97
+ error: "Coolify database container not found. Is Coolify installed and running?",
98
+ };
99
+ }
100
+ const command = buildSetFqdnCommand(`${ip}:8000`, false);
101
+ const result = await sshExec(ip, command);
102
+ if (result.code !== 0) {
103
+ return {
104
+ success: false,
105
+ error: `Failed to remove domain (exit code ${result.code})`,
106
+ };
107
+ }
108
+ return { success: true };
109
+ }
110
+ catch (error) {
111
+ const hint = mapSshError(error, ip);
112
+ return {
113
+ success: false,
114
+ error: getErrorMessage(error),
115
+ ...(hint ? { hint } : {}),
116
+ };
117
+ }
118
+ }
119
+ export async function getDomain(ip) {
120
+ assertValidIp(ip);
121
+ try {
122
+ const result = await sshExec(ip, buildGetFqdnCommand());
123
+ if (result.code !== 0) {
124
+ return {
125
+ fqdn: null,
126
+ error: `Failed to get domain (exit code ${result.code})`,
127
+ };
128
+ }
129
+ return { fqdn: parseFqdn(result.stdout) };
130
+ }
131
+ catch (error) {
132
+ const hint = mapSshError(error, ip);
133
+ return {
134
+ fqdn: null,
135
+ error: getErrorMessage(error),
136
+ ...(hint ? { hint } : {}),
137
+ };
138
+ }
139
+ }
140
+ export async function checkDns(ip, domain) {
141
+ assertValidIp(ip);
142
+ const cleanDomain = sanitizeDomain(domain);
143
+ if (!isValidDomain(cleanDomain)) {
144
+ return { resolvedIp: null, match: false, error: `Invalid domain: ${cleanDomain}` };
145
+ }
146
+ try {
147
+ const result = await sshExec(ip, buildDnsCheckCommand(cleanDomain));
148
+ const resolvedIp = parseDnsResult(result.stdout);
149
+ if (!resolvedIp) {
150
+ return {
151
+ resolvedIp: null,
152
+ match: false,
153
+ hint: `No A record found for ${cleanDomain}. Add an A record pointing to ${ip}`,
154
+ };
155
+ }
156
+ return {
157
+ resolvedIp,
158
+ match: resolvedIp === ip,
159
+ ...(resolvedIp !== ip
160
+ ? { hint: `DNS mismatch: ${cleanDomain} → ${resolvedIp} (expected ${ip}). Update your A record.` }
161
+ : {}),
162
+ };
163
+ }
164
+ catch (error) {
165
+ const hint = mapSshError(error, ip);
166
+ return {
167
+ resolvedIp: null,
168
+ match: false,
169
+ error: getErrorMessage(error),
170
+ ...(hint ? { hint } : {}),
171
+ };
172
+ }
173
+ }
174
+ //# sourceMappingURL=domain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.js","sourceRoot":"","sources":["../../src/core/domain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { FirewallStatus, FirewallProtocol } from "../types/index.js";
2
+ export declare const PROTECTED_PORTS: number[];
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 buildFirewallSetupCommand(): string;
7
+ export declare function buildUfwRuleCommand(action: "allow" | "delete allow", port: number, protocol?: FirewallProtocol): string;
8
+ export declare function buildUfwStatusCommand(): string;
9
+ export declare function parseUfwStatus(stdout: string): FirewallStatus;
10
+ export interface FirewallResult {
11
+ success: boolean;
12
+ error?: string;
13
+ hint?: string;
14
+ warning?: string;
15
+ }
16
+ export interface FirewallStatusResult {
17
+ status: FirewallStatus;
18
+ error?: string;
19
+ hint?: string;
20
+ }
21
+ export declare function setupFirewall(ip: string): Promise<FirewallResult>;
22
+ export declare function addFirewallRule(ip: string, port: number, protocol?: FirewallProtocol): Promise<FirewallResult>;
23
+ export declare function removeFirewallRule(ip: string, port: number, protocol?: FirewallProtocol): Promise<FirewallResult>;
24
+ export declare function getFirewallStatus(ip: string): Promise<FirewallStatusResult>;
25
+ //# sourceMappingURL=firewall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firewall.d.ts","sourceRoot":"","sources":["../../src/core/firewall.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAgB,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIxF,eAAO,MAAM,eAAe,UAAO,CAAC;AACpC,eAAO,MAAM,aAAa,UAA8B,CAAC;AAIzD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAUlD;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,GAAG,cAAc,EAChC,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,gBAAwB,GACjC,MAAM,CAER;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CAkB7D;AAID,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoBvE;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,gBAAwB,GACjC,OAAO,CAAC,cAAc,CAAC,CAwBzB;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,gBAAwB,GACjC,OAAO,CAAC,cAAc,CAAC,CAkCzB;AAED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoBjF"}
@@ -0,0 +1,146 @@
1
+ import { sshExec, assertValidIp } from "../utils/ssh.js";
2
+ import { getErrorMessage, mapSshError } from "../utils/errorMapper.js";
3
+ // ─── Constants ──────────────────────────────────────────────────────────────
4
+ export const PROTECTED_PORTS = [22];
5
+ export const COOLIFY_PORTS = [80, 443, 8000, 6001, 6002];
6
+ // ─── Pure Functions ─────────────────────────────────────────────────────────
7
+ export function isValidPort(port) {
8
+ return Number.isInteger(port) && port >= 1 && port <= 65535;
9
+ }
10
+ export function isProtectedPort(port) {
11
+ return PROTECTED_PORTS.includes(port);
12
+ }
13
+ export function buildFirewallSetupCommand() {
14
+ const commands = [
15
+ "apt-get install -y ufw",
16
+ "ufw default deny incoming",
17
+ "ufw default allow outgoing",
18
+ ...COOLIFY_PORTS.map((p) => `ufw allow ${p}/tcp`),
19
+ "ufw allow 22/tcp",
20
+ 'echo "y" | ufw enable',
21
+ ];
22
+ return commands.join(" && ");
23
+ }
24
+ export function buildUfwRuleCommand(action, port, protocol = "tcp") {
25
+ return `ufw ${action} ${port}/${protocol}`;
26
+ }
27
+ export function buildUfwStatusCommand() {
28
+ return "ufw status numbered";
29
+ }
30
+ export function parseUfwStatus(stdout) {
31
+ const lines = stdout.split("\n");
32
+ const active = stdout.toLowerCase().includes("status: active");
33
+ const rules = [];
34
+ for (const line of lines) {
35
+ const match = line.match(/\[\s*\d+\]\s+(\d+)\/(tcp|udp)\s+(ALLOW|DENY)\s+IN\s+(.*)/i);
36
+ if (match) {
37
+ rules.push({
38
+ port: parseInt(match[1], 10),
39
+ protocol: match[2].toLowerCase(),
40
+ action: match[3].toUpperCase(),
41
+ from: match[4].trim() || "Anywhere",
42
+ });
43
+ }
44
+ }
45
+ return { active, rules };
46
+ }
47
+ // ─── Async Wrappers ─────────────────────────────────────────────────────────
48
+ export async function setupFirewall(ip) {
49
+ assertValidIp(ip);
50
+ try {
51
+ const result = await sshExec(ip, buildFirewallSetupCommand());
52
+ if (result.code !== 0) {
53
+ return {
54
+ success: false,
55
+ error: `Firewall setup failed (exit code ${result.code})`,
56
+ };
57
+ }
58
+ return { success: true };
59
+ }
60
+ catch (error) {
61
+ const hint = mapSshError(error, ip);
62
+ return {
63
+ success: false,
64
+ error: getErrorMessage(error),
65
+ ...(hint ? { hint } : {}),
66
+ };
67
+ }
68
+ }
69
+ export async function addFirewallRule(ip, port, protocol = "tcp") {
70
+ assertValidIp(ip);
71
+ if (!isValidPort(port)) {
72
+ return { success: false, error: `Invalid port: ${port}. Must be 1-65535.` };
73
+ }
74
+ try {
75
+ const result = await sshExec(ip, buildUfwRuleCommand("allow", port, protocol));
76
+ if (result.code !== 0) {
77
+ return {
78
+ success: false,
79
+ error: `Failed to add rule for port ${port}/${protocol}`,
80
+ };
81
+ }
82
+ return { success: true };
83
+ }
84
+ catch (error) {
85
+ const hint = mapSshError(error, ip);
86
+ return {
87
+ success: false,
88
+ error: getErrorMessage(error),
89
+ ...(hint ? { hint } : {}),
90
+ };
91
+ }
92
+ }
93
+ export async function removeFirewallRule(ip, port, protocol = "tcp") {
94
+ assertValidIp(ip);
95
+ if (!isValidPort(port)) {
96
+ return { success: false, error: `Invalid port: ${port}. Must be 1-65535.` };
97
+ }
98
+ if (isProtectedPort(port)) {
99
+ return { success: false, error: `Port ${port} is protected (SSH access). Cannot remove.` };
100
+ }
101
+ const warning = COOLIFY_PORTS.includes(port)
102
+ ? `Port ${port} is used by Coolify. Removing it may break Coolify access.`
103
+ : undefined;
104
+ try {
105
+ const result = await sshExec(ip, buildUfwRuleCommand("delete allow", port, protocol));
106
+ if (result.code !== 0) {
107
+ return {
108
+ success: false,
109
+ error: `Failed to remove rule for port ${port}/${protocol}`,
110
+ ...(warning ? { warning } : {}),
111
+ };
112
+ }
113
+ return { success: true, ...(warning ? { warning } : {}) };
114
+ }
115
+ catch (error) {
116
+ const hint = mapSshError(error, ip);
117
+ return {
118
+ success: false,
119
+ error: getErrorMessage(error),
120
+ ...(hint ? { hint } : {}),
121
+ ...(warning ? { warning } : {}),
122
+ };
123
+ }
124
+ }
125
+ export async function getFirewallStatus(ip) {
126
+ assertValidIp(ip);
127
+ try {
128
+ const result = await sshExec(ip, buildUfwStatusCommand());
129
+ if (result.code !== 0) {
130
+ return {
131
+ status: { active: false, rules: [] },
132
+ error: `Failed to get firewall status (exit code ${result.code})`,
133
+ };
134
+ }
135
+ return { status: parseUfwStatus(result.stdout) };
136
+ }
137
+ catch (error) {
138
+ const hint = mapSshError(error, ip);
139
+ return {
140
+ status: { active: false, rules: [] },
141
+ error: getErrorMessage(error),
142
+ ...(hint ? { hint } : {}),
143
+ };
144
+ }
145
+ }
146
+ //# sourceMappingURL=firewall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"firewall.js","sourceRoot":"","sources":["../../src/core/firewall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export type LogService = "coolify" | "docker" | "system";
2
+ export interface SystemMetrics {
3
+ cpu: string;
4
+ ramUsed: string;
5
+ ramTotal: string;
6
+ diskUsed: string;
7
+ diskTotal: string;
8
+ diskPercent: string;
9
+ }
10
+ export interface LogResult {
11
+ logs: string;
12
+ service: LogService;
13
+ lines: number;
14
+ error?: string;
15
+ hint?: string;
16
+ }
17
+ export interface MetricsResult {
18
+ metrics: SystemMetrics;
19
+ containers?: string;
20
+ error?: string;
21
+ hint?: string;
22
+ }
23
+ export declare function buildLogCommand(service: LogService, lines: number, follow?: boolean): string;
24
+ export declare function buildMonitorCommand(includeContainers: boolean): string;
25
+ export declare function parseMetrics(stdout: string): SystemMetrics;
26
+ export declare function fetchServerLogs(ip: string, service: LogService, lines: number): Promise<LogResult>;
27
+ export declare function fetchServerMetrics(ip: string, includeContainers: boolean): Promise<MetricsResult>;
28
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/core/logs.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAWD,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,OAAe,GAAG,MAAM,CASnG;AAED,wBAAgB,mBAAmB,CAAC,iBAAiB,EAAE,OAAO,GAAG,MAAM,CAQtE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CA4C1D;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,SAAS,CAAC,CA2BpB;AAED,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,MAAM,EACV,iBAAiB,EAAE,OAAO,GACzB,OAAO,CAAC,aAAa,CAAC,CAiCxB"}
@@ -0,0 +1,129 @@
1
+ import { sshExec } from "../utils/ssh.js";
2
+ import { getErrorMessage, mapSshError, sanitizeStderr } from "../utils/errorMapper.js";
3
+ const EMPTY_METRICS = {
4
+ cpu: "N/A",
5
+ ramUsed: "N/A",
6
+ ramTotal: "N/A",
7
+ diskUsed: "N/A",
8
+ diskTotal: "N/A",
9
+ diskPercent: "N/A",
10
+ };
11
+ export function buildLogCommand(service, lines, follow = false) {
12
+ switch (service) {
13
+ case "coolify":
14
+ return `docker logs coolify --tail ${lines}${follow ? " --follow" : ""}`;
15
+ case "docker":
16
+ return `journalctl -u docker --no-pager -n ${lines}${follow ? " -f" : ""}`;
17
+ case "system":
18
+ return `journalctl --no-pager -n ${lines}${follow ? " -f" : ""}`;
19
+ }
20
+ }
21
+ export function buildMonitorCommand(includeContainers) {
22
+ let command = "top -bn1 | head -5 && echo '---SEPARATOR---' && free -h && echo '---SEPARATOR---' && df -h --total | grep -E '(Filesystem|total)'";
23
+ if (includeContainers) {
24
+ command +=
25
+ " && echo '---SEPARATOR---' && docker ps --format 'table {{.Names}}\\t{{.Status}}\\t{{.Ports}}'";
26
+ }
27
+ return command;
28
+ }
29
+ export function parseMetrics(stdout) {
30
+ const lines = stdout.split("\n");
31
+ let cpu = "N/A";
32
+ for (const line of lines) {
33
+ if (line.includes("Cpu") || line.includes("cpu")) {
34
+ const idleMatch = line.match(/([\d.]+)\s*(?:%?\s*)?id/);
35
+ if (idleMatch) {
36
+ const idle = parseFloat(idleMatch[1]);
37
+ cpu = `${(100 - idle).toFixed(1)}%`;
38
+ }
39
+ break;
40
+ }
41
+ }
42
+ let ramUsed = "N/A";
43
+ let ramTotal = "N/A";
44
+ for (const line of lines) {
45
+ if (line.startsWith("Mem:")) {
46
+ const parts = line.split(/\s+/);
47
+ if (parts.length >= 3) {
48
+ ramTotal = parts[1];
49
+ ramUsed = parts[2];
50
+ }
51
+ break;
52
+ }
53
+ }
54
+ let diskUsed = "N/A";
55
+ let diskTotal = "N/A";
56
+ let diskPercent = "N/A";
57
+ for (const line of lines) {
58
+ if (line.startsWith("total") || line.includes("/dev/")) {
59
+ const parts = line.split(/\s+/);
60
+ if (parts.length >= 5) {
61
+ diskTotal = parts[1];
62
+ diskUsed = parts[2];
63
+ diskPercent = parts[4];
64
+ }
65
+ if (line.startsWith("total"))
66
+ break;
67
+ }
68
+ }
69
+ return { cpu, ramUsed, ramTotal, diskUsed, diskTotal, diskPercent };
70
+ }
71
+ export async function fetchServerLogs(ip, service, lines) {
72
+ try {
73
+ const command = buildLogCommand(service, lines, false);
74
+ const result = await sshExec(ip, command);
75
+ if (result.code !== 0) {
76
+ const hint = mapSshError(new Error(result.stderr || "SSH command failed"), ip);
77
+ return {
78
+ logs: result.stdout || "",
79
+ service,
80
+ lines,
81
+ error: sanitizeStderr(result.stderr) || `Exit code ${result.code}`,
82
+ ...(hint ? { hint } : {}),
83
+ };
84
+ }
85
+ return { logs: result.stdout, service, lines };
86
+ }
87
+ catch (error) {
88
+ const hint = mapSshError(error, ip);
89
+ return {
90
+ logs: "",
91
+ service,
92
+ lines,
93
+ error: getErrorMessage(error),
94
+ ...(hint ? { hint } : {}),
95
+ };
96
+ }
97
+ }
98
+ export async function fetchServerMetrics(ip, includeContainers) {
99
+ try {
100
+ const command = buildMonitorCommand(includeContainers);
101
+ const result = await sshExec(ip, command);
102
+ if (result.code !== 0) {
103
+ const hint = mapSshError(new Error(result.stderr || "SSH command failed"), ip);
104
+ return {
105
+ metrics: { ...EMPTY_METRICS },
106
+ error: sanitizeStderr(result.stderr) || `Exit code ${result.code}`,
107
+ ...(hint ? { hint } : {}),
108
+ };
109
+ }
110
+ const metrics = parseMetrics(result.stdout);
111
+ let containers;
112
+ if (includeContainers) {
113
+ const sections = result.stdout.split("---SEPARATOR---");
114
+ if (sections.length >= 4) {
115
+ containers = sections[3].trim();
116
+ }
117
+ }
118
+ return { metrics, ...(containers ? { containers } : {}) };
119
+ }
120
+ catch (error) {
121
+ const hint = mapSshError(error, ip);
122
+ return {
123
+ metrics: { ...EMPTY_METRICS },
124
+ error: getErrorMessage(error),
125
+ ...(hint ? { hint } : {}),
126
+ };
127
+ }
128
+ }
129
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/core/logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { ServerRecord } from "../types/index.js";
2
+ export interface StepResult {
3
+ step: number;
4
+ name: string;
5
+ status: "success" | "failure" | "skipped";
6
+ detail?: string;
7
+ error?: string;
8
+ hint?: string;
9
+ }
10
+ export interface MaintainResult {
11
+ server: string;
12
+ ip: string;
13
+ provider: string;
14
+ steps: StepResult[];
15
+ success: boolean;
16
+ }
17
+ export interface UpdateResult {
18
+ success: boolean;
19
+ output?: string;
20
+ error?: string;
21
+ hint?: string;
22
+ }
23
+ export interface RestartResult {
24
+ success: boolean;
25
+ finalStatus?: string;
26
+ error?: string;
27
+ hint?: string;
28
+ }
29
+ export declare function executeCoolifyUpdate(ip: string): Promise<UpdateResult>;
30
+ export declare function pollCoolifyHealth(ip: string, maxAttempts: number, intervalMs: number): Promise<boolean>;
31
+ export declare function rebootAndWait(server: ServerRecord, apiToken: string, maxAttempts?: number, intervalMs?: number, initialWaitMs?: number): Promise<RestartResult>;
32
+ export interface MaintainOptions {
33
+ skipReboot?: boolean;
34
+ healthPollAttempts?: number;
35
+ healthPollIntervalMs?: number;
36
+ rebootMaxAttempts?: number;
37
+ rebootIntervalMs?: number;
38
+ rebootInitialWaitMs?: number;
39
+ }
40
+ export declare function maintainServer(server: ServerRecord, apiToken: string, options?: MaintainOptions): Promise<MaintainResult>;
41
+ //# sourceMappingURL=maintain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maintain.d.ts","sourceRoot":"","sources":["../../src/core/maintain.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAQtD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAoB5E;AAED,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CASlB;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAAW,EACxB,UAAU,GAAE,MAAa,EACzB,aAAa,GAAE,MAAc,GAC5B,OAAO,CAAC,aAAa,CAAC,CA0CxB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAqGzB"}