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.
Files changed (208) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +48 -24
  3. package/README.tr.md +46 -22
  4. package/SECURITY.md +63 -34
  5. package/dist/commands/add.d.ts +1 -0
  6. package/dist/commands/add.d.ts.map +1 -1
  7. package/dist/commands/add.js +48 -74
  8. package/dist/commands/add.js.map +1 -1
  9. package/dist/commands/backup.d.ts +2 -11
  10. package/dist/commands/backup.d.ts.map +1 -1
  11. package/dist/commands/backup.js +111 -53
  12. package/dist/commands/backup.js.map +1 -1
  13. package/dist/commands/destroy.d.ts.map +1 -1
  14. package/dist/commands/destroy.js +58 -37
  15. package/dist/commands/destroy.js.map +1 -1
  16. package/dist/commands/doctor.d.ts.map +1 -1
  17. package/dist/commands/doctor.js +16 -30
  18. package/dist/commands/doctor.js.map +1 -1
  19. package/dist/commands/domain.d.ts +2 -9
  20. package/dist/commands/domain.d.ts.map +1 -1
  21. package/dist/commands/domain.js +47 -56
  22. package/dist/commands/domain.js.map +1 -1
  23. package/dist/commands/firewall.d.ts +3 -10
  24. package/dist/commands/firewall.d.ts.map +1 -1
  25. package/dist/commands/firewall.js +28 -51
  26. package/dist/commands/firewall.js.map +1 -1
  27. package/dist/commands/health.d.ts +2 -2
  28. package/dist/commands/health.d.ts.map +1 -1
  29. package/dist/commands/health.js +77 -19
  30. package/dist/commands/health.js.map +1 -1
  31. package/dist/commands/init.d.ts.map +1 -1
  32. package/dist/commands/init.js +28 -306
  33. package/dist/commands/init.js.map +1 -1
  34. package/dist/commands/interactive.d.ts +2 -0
  35. package/dist/commands/interactive.d.ts.map +1 -0
  36. package/dist/commands/interactive.js +357 -0
  37. package/dist/commands/interactive.js.map +1 -0
  38. package/dist/commands/list.d.ts.map +1 -1
  39. package/dist/commands/list.js +4 -2
  40. package/dist/commands/list.js.map +1 -1
  41. package/dist/commands/logs.d.ts.map +1 -1
  42. package/dist/commands/logs.js +9 -1
  43. package/dist/commands/logs.js.map +1 -1
  44. package/dist/commands/maintain.d.ts.map +1 -1
  45. package/dist/commands/maintain.js +28 -47
  46. package/dist/commands/maintain.js.map +1 -1
  47. package/dist/commands/monitor.js +1 -1
  48. package/dist/commands/monitor.js.map +1 -1
  49. package/dist/commands/remove.d.ts.map +1 -1
  50. package/dist/commands/remove.js +25 -0
  51. package/dist/commands/remove.js.map +1 -1
  52. package/dist/commands/restart.d.ts.map +1 -1
  53. package/dist/commands/restart.js +39 -39
  54. package/dist/commands/restart.js.map +1 -1
  55. package/dist/commands/restore.d.ts +2 -13
  56. package/dist/commands/restore.d.ts.map +1 -1
  57. package/dist/commands/restore.js +42 -54
  58. package/dist/commands/restore.js.map +1 -1
  59. package/dist/commands/secure.d.ts +2 -9
  60. package/dist/commands/secure.d.ts.map +1 -1
  61. package/dist/commands/secure.js +2 -97
  62. package/dist/commands/secure.js.map +1 -1
  63. package/dist/commands/snapshot.d.ts.map +1 -1
  64. package/dist/commands/snapshot.js +55 -67
  65. package/dist/commands/snapshot.js.map +1 -1
  66. package/dist/commands/status.d.ts.map +1 -1
  67. package/dist/commands/status.js +33 -16
  68. package/dist/commands/status.js.map +1 -1
  69. package/dist/commands/update.d.ts.map +1 -1
  70. package/dist/commands/update.js +23 -16
  71. package/dist/commands/update.js.map +1 -1
  72. package/dist/constants.d.ts +42 -0
  73. package/dist/constants.d.ts.map +1 -0
  74. package/dist/constants.js +54 -0
  75. package/dist/constants.js.map +1 -0
  76. package/dist/core/backup.d.ts +18 -2
  77. package/dist/core/backup.d.ts.map +1 -1
  78. package/dist/core/backup.js +184 -7
  79. package/dist/core/backup.js.map +1 -1
  80. package/dist/core/deploy.d.ts +4 -0
  81. package/dist/core/deploy.d.ts.map +1 -0
  82. package/dist/core/deploy.js +360 -0
  83. package/dist/core/deploy.js.map +1 -0
  84. package/dist/core/domain.d.ts.map +1 -1
  85. package/dist/core/domain.js +1 -5
  86. package/dist/core/domain.js.map +1 -1
  87. package/dist/core/firewall.d.ts +2 -0
  88. package/dist/core/firewall.d.ts.map +1 -1
  89. package/dist/core/firewall.js +12 -0
  90. package/dist/core/firewall.js.map +1 -1
  91. package/dist/core/logs.js +1 -1
  92. package/dist/core/logs.js.map +1 -1
  93. package/dist/core/maintain.d.ts.map +1 -1
  94. package/dist/core/maintain.js +1 -2
  95. package/dist/core/maintain.js.map +1 -1
  96. package/dist/core/manage.d.ts +10 -1
  97. package/dist/core/manage.d.ts.map +1 -1
  98. package/dist/core/manage.js +45 -7
  99. package/dist/core/manage.js.map +1 -1
  100. package/dist/core/provision.d.ts +2 -1
  101. package/dist/core/provision.d.ts.map +1 -1
  102. package/dist/core/provision.js +8 -13
  103. package/dist/core/provision.js.map +1 -1
  104. package/dist/core/secure.d.ts.map +1 -1
  105. package/dist/core/secure.js +8 -2
  106. package/dist/core/secure.js.map +1 -1
  107. package/dist/core/status.d.ts.map +1 -1
  108. package/dist/core/status.js +2 -1
  109. package/dist/core/status.js.map +1 -1
  110. package/dist/core/tokens.d.ts.map +1 -1
  111. package/dist/core/tokens.js +5 -8
  112. package/dist/core/tokens.js.map +1 -1
  113. package/dist/index.js +17 -4
  114. package/dist/index.js.map +1 -1
  115. package/dist/mcp/server.d.ts.map +1 -1
  116. package/dist/mcp/server.js +13 -7
  117. package/dist/mcp/server.js.map +1 -1
  118. package/dist/mcp/tools/serverBackup.d.ts +2 -7
  119. package/dist/mcp/tools/serverBackup.d.ts.map +1 -1
  120. package/dist/mcp/tools/serverBackup.js +120 -234
  121. package/dist/mcp/tools/serverBackup.js.map +1 -1
  122. package/dist/mcp/tools/serverInfo.d.ts +19 -2
  123. package/dist/mcp/tools/serverInfo.d.ts.map +1 -1
  124. package/dist/mcp/tools/serverInfo.js +122 -57
  125. package/dist/mcp/tools/serverInfo.js.map +1 -1
  126. package/dist/mcp/tools/serverLogs.d.ts +2 -7
  127. package/dist/mcp/tools/serverLogs.d.ts.map +1 -1
  128. package/dist/mcp/tools/serverLogs.js +36 -57
  129. package/dist/mcp/tools/serverLogs.js.map +1 -1
  130. package/dist/mcp/tools/serverMaintain.d.ts +3 -8
  131. package/dist/mcp/tools/serverMaintain.d.ts.map +1 -1
  132. package/dist/mcp/tools/serverMaintain.js +48 -109
  133. package/dist/mcp/tools/serverMaintain.js.map +1 -1
  134. package/dist/mcp/tools/serverManage.d.ts +5 -0
  135. package/dist/mcp/tools/serverManage.d.ts.map +1 -1
  136. package/dist/mcp/tools/serverManage.js +94 -110
  137. package/dist/mcp/tools/serverManage.js.map +1 -1
  138. package/dist/mcp/tools/serverProvision.d.ts +7 -1
  139. package/dist/mcp/tools/serverProvision.d.ts.map +1 -1
  140. package/dist/mcp/tools/serverProvision.js +69 -77
  141. package/dist/mcp/tools/serverProvision.js.map +1 -1
  142. package/dist/mcp/tools/serverSecure.d.ts +2 -7
  143. package/dist/mcp/tools/serverSecure.d.ts.map +1 -1
  144. package/dist/mcp/tools/serverSecure.js +109 -170
  145. package/dist/mcp/tools/serverSecure.js.map +1 -1
  146. package/dist/mcp/utils.d.ts +42 -0
  147. package/dist/mcp/utils.d.ts.map +1 -0
  148. package/dist/mcp/utils.js +61 -0
  149. package/dist/mcp/utils.js.map +1 -0
  150. package/dist/providers/base.d.ts +9 -2
  151. package/dist/providers/base.d.ts.map +1 -1
  152. package/dist/providers/base.js +56 -1
  153. package/dist/providers/base.js.map +1 -1
  154. package/dist/providers/digitalocean.d.ts +3 -3
  155. package/dist/providers/digitalocean.d.ts.map +1 -1
  156. package/dist/providers/digitalocean.js +4 -12
  157. package/dist/providers/digitalocean.js.map +1 -1
  158. package/dist/providers/hetzner.d.ts +3 -3
  159. package/dist/providers/hetzner.d.ts.map +1 -1
  160. package/dist/providers/hetzner.js +8 -13
  161. package/dist/providers/hetzner.js.map +1 -1
  162. package/dist/providers/linode.d.ts +3 -3
  163. package/dist/providers/linode.d.ts.map +1 -1
  164. package/dist/providers/linode.js +3 -11
  165. package/dist/providers/linode.js.map +1 -1
  166. package/dist/providers/vultr.d.ts +3 -3
  167. package/dist/providers/vultr.d.ts.map +1 -1
  168. package/dist/providers/vultr.js +3 -11
  169. package/dist/providers/vultr.js.map +1 -1
  170. package/dist/types/index.d.ts +11 -0
  171. package/dist/types/index.d.ts.map +1 -1
  172. package/dist/utils/cloudInit.d.ts +1 -0
  173. package/dist/utils/cloudInit.d.ts.map +1 -1
  174. package/dist/utils/cloudInit.js +62 -0
  175. package/dist/utils/cloudInit.js.map +1 -1
  176. package/dist/utils/config.js +1 -1
  177. package/dist/utils/config.js.map +1 -1
  178. package/dist/utils/defaults.d.ts.map +1 -1
  179. package/dist/utils/defaults.js +3 -2
  180. package/dist/utils/defaults.js.map +1 -1
  181. package/dist/utils/errorMapper.d.ts.map +1 -1
  182. package/dist/utils/errorMapper.js +5 -1
  183. package/dist/utils/errorMapper.js.map +1 -1
  184. package/dist/utils/modeGuard.d.ts +5 -0
  185. package/dist/utils/modeGuard.d.ts.map +1 -0
  186. package/dist/utils/modeGuard.js +13 -0
  187. package/dist/utils/modeGuard.js.map +1 -0
  188. package/dist/utils/openBrowser.d.ts.map +1 -1
  189. package/dist/utils/openBrowser.js +3 -1
  190. package/dist/utils/openBrowser.js.map +1 -1
  191. package/dist/utils/prompts.d.ts +2 -2
  192. package/dist/utils/prompts.d.ts.map +1 -1
  193. package/dist/utils/prompts.js +8 -9
  194. package/dist/utils/prompts.js.map +1 -1
  195. package/dist/utils/serverSelect.d.ts.map +1 -1
  196. package/dist/utils/serverSelect.js +2 -7
  197. package/dist/utils/serverSelect.js.map +1 -1
  198. package/dist/utils/ssh.d.ts +9 -0
  199. package/dist/utils/ssh.d.ts.map +1 -1
  200. package/dist/utils/ssh.js +175 -15
  201. package/dist/utils/ssh.js.map +1 -1
  202. package/dist/utils/sshKey.d.ts.map +1 -1
  203. package/dist/utils/sshKey.js +3 -0
  204. package/dist/utils/sshKey.js.map +1 -1
  205. package/dist/utils/yamlConfig.d.ts.map +1 -1
  206. package/dist/utils/yamlConfig.js +4 -3
  207. package/dist/utils/yamlConfig.js.map +1 -1
  208. package/package.json +5 -5
@@ -1,9 +1,10 @@
1
- import { mkdirSync, existsSync, writeFileSync, readFileSync, readdirSync } from "fs";
1
+ import { mkdirSync, existsSync, writeFileSync, readFileSync, readdirSync, rmSync } from "fs";
2
2
  import { join, resolve } from "path";
3
3
  import { spawn } from "child_process";
4
4
  import { sshExec, assertValidIp, sanitizedEnv } from "../utils/ssh.js";
5
5
  import { BACKUPS_DIR } from "../utils/config.js";
6
6
  import { getErrorMessage, mapSshError, sanitizeStderr } from "../utils/errorMapper.js";
7
+ import { SCP_TIMEOUT_MS } from "../constants.js";
7
8
  // ─── Pure Functions (Backup) ─────────────────────────────────────────────────
8
9
  export function formatTimestamp(date) {
9
10
  return date.toISOString().replace(/[:.]/g, "-").replace("T", "_").replace("Z", "");
@@ -65,31 +66,207 @@ export function loadManifest(backupPath) {
65
66
  return undefined;
66
67
  }
67
68
  }
69
+ export function listOrphanBackups(activeServerNames) {
70
+ if (!existsSync(BACKUPS_DIR))
71
+ return [];
72
+ try {
73
+ return readdirSync(BACKUPS_DIR)
74
+ .filter((name) => {
75
+ const fullPath = join(BACKUPS_DIR, name);
76
+ // Only directories that are not in active server list
77
+ return existsSync(fullPath) && !activeServerNames.includes(name);
78
+ })
79
+ .sort();
80
+ }
81
+ catch {
82
+ return [];
83
+ }
84
+ }
85
+ export function cleanupServerBackups(serverName) {
86
+ const dir = getBackupDir(serverName);
87
+ if (!existsSync(dir))
88
+ return { removed: false, path: dir };
89
+ try {
90
+ rmSync(dir, { recursive: true, force: true });
91
+ return { removed: true, path: dir };
92
+ }
93
+ catch {
94
+ return { removed: false, path: dir };
95
+ }
96
+ }
97
+ // ─── Path Validation ─────────────────────────────────────────────────────────
98
+ /**
99
+ * Asserts that a remote SCP path does not contain shell metacharacters.
100
+ * Prevents command injection via crafted remotePath values.
101
+ * Allowed: alphanumeric, hyphens, underscores, dots, forward slashes.
102
+ */
103
+ export function assertSafePath(remotePath) {
104
+ // Reject any path containing shell metacharacters: ; | & $ ` ( ) < > \n \r \t space
105
+ if (/[;|&$`()<>\n\r\t ]/.test(remotePath)) {
106
+ throw new Error(`Unsafe remote path rejected: contains shell metacharacters`);
107
+ }
108
+ }
68
109
  // ─── SCP Functions ───────────────────────────────────────────────────────────
69
- export function scpDownload(ip, remotePath, localPath) {
110
+ export function scpDownload(ip, remotePath, localPath, timeoutMs = SCP_TIMEOUT_MS) {
70
111
  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() });
112
+ assertSafePath(remotePath);
113
+ return new Promise((resolve, reject) => {
114
+ // stdin must be "ignore" — not "inherit". MCP uses stdin for JSON-RPC transport;
115
+ // inheriting it would corrupt the stream. BatchMode=yes prevents interactive prompts.
116
+ const child = spawn("scp", ["-o", "BatchMode=yes", "-o", "StrictHostKeyChecking=accept-new", `root@${ip}:${remotePath}`, localPath], { stdio: ["ignore", "pipe", "pipe"], env: sanitizedEnv() });
73
117
  let stderr = "";
74
118
  child.stderr?.on("data", (data) => {
75
119
  stderr += data.toString();
76
120
  });
77
121
  child.on("close", (code) => resolve({ code: code ?? 1, stderr }));
78
122
  child.on("error", (err) => resolve({ code: 1, stderr: err.message }));
123
+ const timer = setTimeout(() => {
124
+ child.kill("SIGTERM");
125
+ reject(new Error(`SCP download timeout after ${timeoutMs}ms`));
126
+ }, timeoutMs);
127
+ // Clear timer when the process exits normally
128
+ child.on("close", () => clearTimeout(timer));
129
+ child.on("error", () => clearTimeout(timer));
79
130
  });
80
131
  }
81
- export function scpUpload(ip, localPath, remotePath) {
132
+ export function scpUpload(ip, localPath, remotePath, timeoutMs = SCP_TIMEOUT_MS) {
82
133
  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() });
134
+ assertSafePath(remotePath);
135
+ return new Promise((resolve, reject) => {
136
+ // stdin must be "ignore" — not "inherit". MCP uses stdin for JSON-RPC transport;
137
+ // inheriting it would corrupt the stream. BatchMode=yes prevents interactive prompts.
138
+ const child = spawn("scp", ["-o", "BatchMode=yes", "-o", "StrictHostKeyChecking=accept-new", localPath, `root@${ip}:${remotePath}`], { stdio: ["ignore", "pipe", "pipe"], env: sanitizedEnv() });
85
139
  let stderr = "";
86
140
  child.stderr?.on("data", (data) => {
87
141
  stderr += data.toString();
88
142
  });
89
143
  child.on("close", (code) => resolve({ code: code ?? 1, stderr }));
90
144
  child.on("error", (err) => resolve({ code: 1, stderr: err.message }));
145
+ const timer = setTimeout(() => {
146
+ child.kill("SIGTERM");
147
+ reject(new Error(`SCP upload timeout after ${timeoutMs}ms`));
148
+ }, timeoutMs);
149
+ // Clear timer when the process exits normally
150
+ child.on("close", () => clearTimeout(timer));
151
+ child.on("error", () => clearTimeout(timer));
91
152
  });
92
153
  }
154
+ // ─── Pure Functions (Bare Backup) ────────────────────────────────────────────
155
+ export function buildBareConfigTarCommand() {
156
+ return ("tar czf /tmp/bare-config.tar.gz --ignore-failed-read " +
157
+ "-C / " +
158
+ "etc/nginx " +
159
+ "etc/ssh/sshd_config " +
160
+ "etc/ufw " +
161
+ "etc/fail2ban " +
162
+ "etc/crontab " +
163
+ "etc/apt/apt.conf.d/50unattended-upgrades " +
164
+ "2>/dev/null || tar czf /tmp/bare-config.tar.gz --ignore-failed-read -C / etc/ssh/sshd_config");
165
+ }
166
+ export function buildBareRestoreConfigCommand() {
167
+ return "tar xzf /tmp/bare-config.tar.gz -C /";
168
+ }
169
+ export function buildBareCleanupCommand() {
170
+ return "rm -f /tmp/bare-config.tar.gz";
171
+ }
172
+ // ─── Async Wrappers (Bare) ────────────────────────────────────────────────────
173
+ export async function createBareBackup(ip, serverName, provider) {
174
+ assertValidIp(ip);
175
+ try {
176
+ // Step 1: Create config archive on server
177
+ const configResult = await sshExec(ip, buildBareConfigTarCommand());
178
+ if (configResult.code !== 0) {
179
+ return {
180
+ success: false,
181
+ error: "Config backup failed",
182
+ hint: sanitizeStderr(configResult.stderr) || undefined,
183
+ };
184
+ }
185
+ // Step 2: Download
186
+ const timestamp = formatTimestamp(new Date());
187
+ const backupPath = join(getBackupDir(serverName), timestamp);
188
+ mkdirSync(backupPath, { recursive: true, mode: 0o700 });
189
+ const dl = await scpDownload(ip, "/tmp/bare-config.tar.gz", join(backupPath, "bare-config.tar.gz"));
190
+ if (dl.code !== 0) {
191
+ return {
192
+ success: false,
193
+ error: "Failed to download config backup",
194
+ hint: sanitizeStderr(dl.stderr) || undefined,
195
+ };
196
+ }
197
+ // Step 3: Write manifest
198
+ const manifest = {
199
+ serverName,
200
+ provider,
201
+ timestamp,
202
+ coolifyVersion: "n/a",
203
+ files: ["bare-config.tar.gz"],
204
+ mode: "bare",
205
+ };
206
+ writeFileSync(join(backupPath, "manifest.json"), JSON.stringify(manifest, null, 2), { mode: 0o600 });
207
+ // Step 4: Cleanup remote
208
+ await sshExec(ip, buildBareCleanupCommand()).catch(() => { });
209
+ return { success: true, backupPath, manifest };
210
+ }
211
+ catch (error) {
212
+ const hint = mapSshError(error, ip);
213
+ return {
214
+ success: false,
215
+ error: getErrorMessage(error),
216
+ ...(hint ? { hint } : {}),
217
+ };
218
+ }
219
+ }
220
+ export async function restoreBareBackup(ip, serverName, backupId) {
221
+ assertValidIp(ip);
222
+ const baseDir = getBackupDir(serverName);
223
+ const backupPath = join(baseDir, backupId);
224
+ // Path traversal guard
225
+ if (!resolve(backupPath).startsWith(resolve(baseDir))) {
226
+ return { success: false, steps: [], error: "Invalid backupId: path traversal detected" };
227
+ }
228
+ const steps = [];
229
+ const manifest = loadManifest(backupPath);
230
+ if (!manifest) {
231
+ return { success: false, steps, error: `Backup not found or corrupt: ${backupId}` };
232
+ }
233
+ // Verify backup file exists
234
+ const configFile = join(backupPath, "bare-config.tar.gz");
235
+ if (!existsSync(configFile)) {
236
+ return { success: false, steps, error: "Missing backup file: bare-config.tar.gz" };
237
+ }
238
+ try {
239
+ // Upload config archive
240
+ const upload = await scpUpload(ip, configFile, "/tmp/bare-config.tar.gz");
241
+ if (upload.code !== 0) {
242
+ return {
243
+ success: false,
244
+ steps: [{ name: "Upload config", status: "failure", error: sanitizeStderr(upload.stderr) }],
245
+ error: "Upload failed",
246
+ };
247
+ }
248
+ steps.push({ name: "Upload config", status: "success" });
249
+ // Extract config
250
+ const restoreResult = await sshExec(ip, buildBareRestoreConfigCommand());
251
+ if (restoreResult.code !== 0) {
252
+ steps.push({ name: "Restore config", status: "failure", error: sanitizeStderr(restoreResult.stderr) });
253
+ return { success: false, steps, error: "Config restore failed" };
254
+ }
255
+ steps.push({ name: "Restore config", status: "success" });
256
+ // Cleanup
257
+ await sshExec(ip, buildBareCleanupCommand()).catch(() => { });
258
+ return { success: true, steps };
259
+ }
260
+ catch (error) {
261
+ const hint = mapSshError(error, ip);
262
+ return {
263
+ success: false,
264
+ steps,
265
+ error: getErrorMessage(error),
266
+ ...(hint ? { hint } : {}),
267
+ };
268
+ }
269
+ }
93
270
  // ─── Best-Effort Rollback ────────────────────────────────────────────────────
94
271
  export async function tryRestartCoolify(ip) {
95
272
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/core/backup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/core/backup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CloudProvider } from "../providers/base.js";
2
+ export declare function uploadSshKeyToProvider(provider: CloudProvider): Promise<string[]>;
3
+ export declare function deployServer(providerChoice: string, providerWithToken: CloudProvider, region: string, serverSize: string, serverName: string, fullSetup?: boolean, noOpen?: boolean, mode?: string): Promise<void>;
4
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/core/deploy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAoB1D,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA2BvF;AAED,wBAAsB,YAAY,CAChC,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,aAAa,EAChC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,OAAO,EACnB,MAAM,CAAC,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CA+Tf"}
@@ -0,0 +1,360 @@
1
+ import { spawnSync } from "child_process";
2
+ import { getCoolifyCloudInit, getBareCloudInit } from "../utils/cloudInit.js";
3
+ import { logger, createSpinner } from "../utils/logger.js";
4
+ import { getErrorMessage, mapProviderError } from "../utils/errorMapper.js";
5
+ import { openBrowser } from "../utils/openBrowser.js";
6
+ import { assertValidIp, sanitizedEnv, sshExec } from "../utils/ssh.js";
7
+ import { findLocalSshKey, generateSshKey, getSshKeyName } from "../utils/sshKey.js";
8
+ import { saveServer } from "../utils/config.js";
9
+ import { waitForCoolify } from "../utils/healthCheck.js";
10
+ import { BACK_SIGNAL, getServerNameConfig, getLocationConfig, getServerTypeConfig, } from "../utils/prompts.js";
11
+ import { firewallSetup } from "../commands/firewall.js";
12
+ import { secureSetup } from "../commands/secure.js";
13
+ import { IP_WAIT, COOLIFY_MIN_WAIT } from "../constants.js";
14
+ export async function uploadSshKeyToProvider(provider) {
15
+ let publicKey = findLocalSshKey();
16
+ if (!publicKey) {
17
+ logger.info("No SSH key found. Generating one...");
18
+ publicKey = generateSshKey();
19
+ if (publicKey) {
20
+ logger.success("SSH key generated (~/.ssh/id_ed25519)");
21
+ }
22
+ else {
23
+ logger.warning("Could not generate SSH key — falling back to password auth");
24
+ logger.info("Server will require password change on first SSH login");
25
+ logger.warning("Run 'quicklify secure setup' after deployment to harden SSH access");
26
+ return [];
27
+ }
28
+ }
29
+ const spinner = createSpinner("Uploading SSH key to provider...");
30
+ spinner.start();
31
+ try {
32
+ const keyId = await provider.uploadSshKey(getSshKeyName(), publicKey);
33
+ spinner.succeed("SSH key uploaded — password-free access enabled");
34
+ return [keyId];
35
+ }
36
+ catch (error) {
37
+ spinner.fail("SSH key upload failed — falling back to password auth");
38
+ logger.warning(getErrorMessage(error));
39
+ logger.warning("Run 'quicklify secure setup' after deployment to harden SSH access");
40
+ return [];
41
+ }
42
+ }
43
+ export async function deployServer(providerChoice, providerWithToken, region, serverSize, serverName, fullSetup, noOpen, mode) {
44
+ try {
45
+ // Upload SSH key before creating server
46
+ const sshKeyIds = await uploadSshKeyToProvider(providerWithToken);
47
+ const isBare = mode === "bare";
48
+ const cloudInit = isBare ? getBareCloudInit(serverName) : getCoolifyCloudInit(serverName);
49
+ let server;
50
+ let retries = 0;
51
+ const maxRetries = 2;
52
+ const failedTypes = [];
53
+ const failedLocations = [];
54
+ while (!server && retries <= maxRetries) {
55
+ const serverSpinner = createSpinner("Creating VPS server...");
56
+ serverSpinner.start();
57
+ try {
58
+ server = await providerWithToken.createServer({
59
+ name: serverName,
60
+ region,
61
+ size: serverSize,
62
+ cloudInit,
63
+ sshKeyIds,
64
+ });
65
+ serverSpinner.succeed(`Server created (ID: ${server.id})`);
66
+ }
67
+ catch (createError) {
68
+ serverSpinner.fail("Server creation failed");
69
+ const errorMsg = getErrorMessage(createError);
70
+ if (errorMsg.includes("already") && errorMsg.includes("used")) {
71
+ logger.warning(`Server name "${serverName}" is already in use`);
72
+ logger.info("Please choose a different name:");
73
+ let newName = BACK_SIGNAL;
74
+ while (newName === BACK_SIGNAL) {
75
+ newName = await getServerNameConfig();
76
+ }
77
+ serverName = newName;
78
+ retries++;
79
+ }
80
+ else if (errorMsg.includes("location disabled")) {
81
+ failedLocations.push(region);
82
+ logger.warning(`Location "${region}" is currently disabled for new servers`);
83
+ logger.info("Please select a different region and server type:");
84
+ let pickedSize = false;
85
+ while (!pickedSize) {
86
+ let newRegion = BACK_SIGNAL;
87
+ while (newRegion === BACK_SIGNAL) {
88
+ newRegion = await getLocationConfig(providerWithToken, failedLocations);
89
+ }
90
+ region = newRegion;
91
+ const newSize = await getServerTypeConfig(providerWithToken, region, [], mode);
92
+ if (newSize === BACK_SIGNAL)
93
+ continue;
94
+ serverSize = newSize;
95
+ pickedSize = true;
96
+ }
97
+ retries++;
98
+ }
99
+ else if (errorMsg.includes("unavailable") ||
100
+ errorMsg.includes("not available") ||
101
+ errorMsg.includes("sold out") ||
102
+ errorMsg.includes("unsupported")) {
103
+ if (retries < maxRetries) {
104
+ failedTypes.push(serverSize);
105
+ logger.warning(`Server type "${serverSize}" is not available in this location`);
106
+ logger.info("Please select a different server type:");
107
+ let newSize = BACK_SIGNAL;
108
+ while (newSize === BACK_SIGNAL) {
109
+ newSize = await getServerTypeConfig(providerWithToken, region, failedTypes, mode);
110
+ }
111
+ serverSize = newSize;
112
+ retries++;
113
+ }
114
+ else {
115
+ throw createError;
116
+ }
117
+ }
118
+ else {
119
+ throw createError;
120
+ }
121
+ }
122
+ }
123
+ /* istanbul ignore next */
124
+ if (!server) {
125
+ logger.error("Could not create server after multiple attempts");
126
+ process.exit(1);
127
+ }
128
+ // Wait for server to be running
129
+ const statusSpinner = createSpinner("Waiting for server to boot...");
130
+ statusSpinner.start();
131
+ let status = await providerWithToken.getServerStatus(server.id);
132
+ let attempts = 0;
133
+ const maxAttempts = 30;
134
+ while (status !== "running" && attempts < maxAttempts) {
135
+ await new Promise((resolve) => setTimeout(resolve, 1000));
136
+ status = await providerWithToken.getServerStatus(server.id);
137
+ attempts++;
138
+ }
139
+ if (status !== "running") {
140
+ statusSpinner.fail("Server failed to start");
141
+ logger.error("Please check your cloud provider dashboard");
142
+ return;
143
+ }
144
+ statusSpinner.succeed("Server is running");
145
+ // Refresh server details to get final IP (DO/Vultr/Linode assign IP after boot)
146
+ if (server.ip === "pending" || server.ip === "0.0.0.0" || server.ip === "") {
147
+ const ipConfig = IP_WAIT[providerChoice] || { attempts: 10, interval: 3000 };
148
+ const ipSpinner = createSpinner("Waiting for IP address assignment...");
149
+ ipSpinner.start();
150
+ let refreshAttempts = 0;
151
+ while (refreshAttempts < ipConfig.attempts) {
152
+ const details = await providerWithToken.getServerDetails(server.id);
153
+ if (details.ip && details.ip !== "0.0.0.0" && details.ip !== "pending" && details.ip !== "") {
154
+ try {
155
+ assertValidIp(details.ip);
156
+ server.ip = details.ip;
157
+ break;
158
+ }
159
+ catch {
160
+ // Invalid IP format from API — skip and retry
161
+ }
162
+ }
163
+ refreshAttempts++;
164
+ await new Promise((resolve) => setTimeout(resolve, ipConfig.interval));
165
+ }
166
+ if (server.ip === "pending" || server.ip === "0.0.0.0" || server.ip === "") {
167
+ ipSpinner.fail("Could not obtain server IP address");
168
+ logger.warning("The server was created but IP assignment timed out.");
169
+ logger.info(`Check IP later with: quicklify status ${server.id}`);
170
+ }
171
+ else {
172
+ ipSpinner.succeed(`IP address assigned: ${server.ip}`);
173
+ }
174
+ }
175
+ // Health check polling instead of blind wait (skip if no valid IP or bare mode)
176
+ const hasValidIp = server.ip !== "0.0.0.0" && server.ip !== "pending" && server.ip !== "";
177
+ const minWait = COOLIFY_MIN_WAIT[providerChoice] || 60000;
178
+ const ready = !isBare && hasValidIp ? await waitForCoolify(server.ip, minWait) : false;
179
+ // Save server record to config
180
+ saveServer({
181
+ id: server.id,
182
+ name: serverName,
183
+ provider: providerChoice,
184
+ ip: server.ip,
185
+ region,
186
+ size: serverSize,
187
+ createdAt: new Date().toISOString(),
188
+ ...(isBare ? { mode: "bare" } : { mode: "coolify" }),
189
+ });
190
+ // Bare mode: cloud-init wait + optional full setup + show SSH info
191
+ if (isBare) {
192
+ // Wait for SSH + cloud-init to finish (BUG-5)
193
+ if (hasValidIp) {
194
+ const cloudInitSpinner = createSpinner("Waiting for server to accept SSH...");
195
+ cloudInitSpinner.start();
196
+ // Step 1: Wait for SSH to become available (retry up to 60 attempts, 5s apart = 5 min max)
197
+ let sshReady = false;
198
+ for (let attempt = 1; attempt <= 60; attempt++) {
199
+ try {
200
+ await sshExec(server.ip, "echo ok");
201
+ sshReady = true;
202
+ break;
203
+ }
204
+ catch {
205
+ cloudInitSpinner.text = `Waiting for server to accept SSH... (attempt ${attempt}/60)`;
206
+ await new Promise((r) => setTimeout(r, 5000));
207
+ }
208
+ }
209
+ if (sshReady) {
210
+ // Step 2: Wait for cloud-init to finish
211
+ cloudInitSpinner.text = "SSH ready — waiting for cloud-init to finish...";
212
+ try {
213
+ const ciResult = await sshExec(server.ip, "cloud-init status --wait");
214
+ if (ciResult.code === 0) {
215
+ cloudInitSpinner.succeed("Cloud-init completed");
216
+ }
217
+ else {
218
+ cloudInitSpinner.warn("Cloud-init may not have finished — continuing anyway");
219
+ }
220
+ }
221
+ catch {
222
+ cloudInitSpinner.warn("Could not check cloud-init status — continuing anyway");
223
+ }
224
+ }
225
+ else {
226
+ cloudInitSpinner.warn("SSH not available after 5 min — continuing anyway");
227
+ }
228
+ }
229
+ // Full setup: firewall + secure (BUG-1)
230
+ if (fullSetup && hasValidIp) {
231
+ try {
232
+ assertValidIp(server.ip); // Defense-in-depth: IP validated before ssh-keygen
233
+ spawnSync("ssh-keygen", ["-R", server.ip], { stdio: "ignore", env: sanitizedEnv() });
234
+ }
235
+ catch {
236
+ // ssh-keygen not available or no entry — harmless
237
+ }
238
+ logger.title("Running full setup (firewall + security)...");
239
+ try {
240
+ await firewallSetup(server.ip, serverName, false, true);
241
+ }
242
+ catch (error) {
243
+ logger.warning(`Firewall setup failed: ${getErrorMessage(error)}`);
244
+ }
245
+ try {
246
+ await secureSetup(server.ip, serverName, undefined, false, true);
247
+ }
248
+ catch (error) {
249
+ logger.warning(`Security setup failed: ${getErrorMessage(error)}`);
250
+ }
251
+ }
252
+ else if (fullSetup && !hasValidIp) {
253
+ logger.warning("Skipping full setup: server IP not available.");
254
+ }
255
+ // Show bare server info
256
+ logger.title("Bare Server Ready!");
257
+ console.log();
258
+ logger.success(`Bare server ready!`);
259
+ logger.info(`SSH: ssh root@${server.ip}`);
260
+ logger.info(`IP: ${server.ip}`);
261
+ logger.info("Mode: bare (no platform installed)");
262
+ console.log();
263
+ if (!fullSetup) {
264
+ logger.info(" Secure your server:");
265
+ logger.step(` quicklify firewall setup ${serverName}`);
266
+ logger.step(` quicklify secure setup ${serverName}`);
267
+ console.log();
268
+ }
269
+ logger.info(" Server saved to local config. Use 'quicklify list' to see all servers.");
270
+ console.log();
271
+ return;
272
+ }
273
+ // Full setup: auto-configure firewall + SSH hardening
274
+ if (fullSetup && ready) {
275
+ // Clear stale known_hosts entry (cloud providers reuse IPs)
276
+ try {
277
+ assertValidIp(server.ip); // Defense-in-depth: IP validated before ssh-keygen
278
+ spawnSync("ssh-keygen", ["-R", server.ip], { stdio: "ignore", env: sanitizedEnv() });
279
+ }
280
+ catch {
281
+ // ssh-keygen not available or no entry — harmless
282
+ }
283
+ logger.title("Running full setup (firewall + security)...");
284
+ try {
285
+ await firewallSetup(server.ip, serverName, false);
286
+ }
287
+ catch (error) {
288
+ logger.warning(`Firewall setup failed: ${getErrorMessage(error)}`);
289
+ }
290
+ try {
291
+ await secureSetup(server.ip, serverName, undefined, false, true);
292
+ }
293
+ catch (error) {
294
+ logger.warning(`Security setup failed: ${getErrorMessage(error)}`);
295
+ }
296
+ }
297
+ else if (fullSetup && !ready) {
298
+ logger.warning("Skipping full setup: Coolify is not ready yet.");
299
+ logger.info("Run manually later: quicklify firewall setup && quicklify secure setup");
300
+ }
301
+ // Success message
302
+ logger.title("Deployment Successful!");
303
+ console.log();
304
+ logger.success(`Server IP: ${server.ip}`);
305
+ logger.success(`Access Coolify: http://${server.ip}:8000`);
306
+ console.log();
307
+ if (ready) {
308
+ logger.info("Coolify is ready! Open the URL above to get started.");
309
+ if (!noOpen && hasValidIp) {
310
+ openBrowser(`http://${server.ip}:8000`);
311
+ }
312
+ }
313
+ else {
314
+ logger.warning("Coolify did not respond yet. Please check in a few minutes.");
315
+ logger.info(`You can check status later with: quicklify status ${server.ip}`);
316
+ }
317
+ // Onboarding: next steps
318
+ console.log();
319
+ logger.title("What's Next?");
320
+ if (!fullSetup) {
321
+ logger.info(" 1. Secure your server:");
322
+ logger.step(` quicklify firewall setup ${serverName}`);
323
+ logger.step(` quicklify secure setup ${serverName}`);
324
+ console.log();
325
+ logger.info(" 2. Add a domain with SSL:");
326
+ logger.step(` quicklify domain add ${serverName} --domain example.com`);
327
+ console.log();
328
+ logger.info(" 3. Create your first backup:");
329
+ logger.step(` quicklify backup ${serverName}`);
330
+ console.log();
331
+ logger.info(" Tip: Do steps 1-3 automatically next time:");
332
+ logger.step(" quicklify init --full-setup");
333
+ }
334
+ else {
335
+ logger.info(" 1. Add a domain with SSL:");
336
+ logger.step(` quicklify domain add ${serverName} --domain example.com`);
337
+ console.log();
338
+ logger.info(" 2. Create your first backup:");
339
+ logger.step(` quicklify backup ${serverName}`);
340
+ }
341
+ console.log();
342
+ logger.info(" Check your environment anytime:");
343
+ logger.step(" quicklify doctor");
344
+ console.log();
345
+ logger.info(" Server saved to local config. Use 'quicklify list' to see all servers.");
346
+ console.log();
347
+ logger.info(" Docs: https://github.com/omrfc/quicklify");
348
+ console.log(" \u2b50 Love Quicklify? Give us a star: https://github.com/omrfc/quicklify \u2b50");
349
+ console.log();
350
+ }
351
+ catch (error) {
352
+ logger.error(`Deployment failed: ${getErrorMessage(error)}`);
353
+ const hint = mapProviderError(error, providerChoice);
354
+ if (hint) {
355
+ logger.info(hint);
356
+ }
357
+ process.exit(1);
358
+ }
359
+ }
360
+ //# sourceMappingURL=deploy.js.map