quicklify 0.3.3 → 0.4.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 (51) hide show
  1. package/README.md +83 -46
  2. package/SECURITY.md +17 -3
  3. package/dist/commands/destroy.d.ts +2 -0
  4. package/dist/commands/destroy.d.ts.map +1 -0
  5. package/dist/commands/destroy.js +95 -0
  6. package/dist/commands/destroy.js.map +1 -0
  7. package/dist/commands/init.d.ts +2 -1
  8. package/dist/commands/init.d.ts.map +1 -1
  9. package/dist/commands/init.js +164 -96
  10. package/dist/commands/init.js.map +1 -1
  11. package/dist/commands/list.d.ts +2 -0
  12. package/dist/commands/list.d.ts.map +1 -0
  13. package/dist/commands/list.js +22 -0
  14. package/dist/commands/list.js.map +1 -0
  15. package/dist/commands/status.d.ts +2 -0
  16. package/dist/commands/status.d.ts.map +1 -0
  17. package/dist/commands/status.js +89 -0
  18. package/dist/commands/status.js.map +1 -0
  19. package/dist/index.js +17 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/providers/base.d.ts +1 -0
  22. package/dist/providers/base.d.ts.map +1 -1
  23. package/dist/providers/digitalocean.d.ts +1 -0
  24. package/dist/providers/digitalocean.d.ts.map +1 -1
  25. package/dist/providers/digitalocean.js +13 -0
  26. package/dist/providers/digitalocean.js.map +1 -1
  27. package/dist/providers/hetzner.d.ts +1 -0
  28. package/dist/providers/hetzner.d.ts.map +1 -1
  29. package/dist/providers/hetzner.js +13 -0
  30. package/dist/providers/hetzner.js.map +1 -1
  31. package/dist/types/index.d.ts +16 -0
  32. package/dist/types/index.d.ts.map +1 -1
  33. package/dist/utils/cloudInit.d.ts.map +1 -1
  34. package/dist/utils/cloudInit.js +2 -0
  35. package/dist/utils/cloudInit.js.map +1 -1
  36. package/dist/utils/config.d.ts +9 -0
  37. package/dist/utils/config.d.ts.map +1 -0
  38. package/dist/utils/config.js +50 -0
  39. package/dist/utils/config.js.map +1 -0
  40. package/dist/utils/healthCheck.d.ts +2 -0
  41. package/dist/utils/healthCheck.d.ts.map +1 -0
  42. package/dist/utils/healthCheck.js +29 -0
  43. package/dist/utils/healthCheck.js.map +1 -0
  44. package/dist/utils/prompts.d.ts.map +1 -1
  45. package/dist/utils/prompts.js +5 -2
  46. package/dist/utils/prompts.js.map +1 -1
  47. package/dist/utils/providerFactory.d.ts +4 -0
  48. package/dist/utils/providerFactory.d.ts.map +1 -0
  49. package/dist/utils/providerFactory.js +24 -0
  50. package/dist/utils/providerFactory.js.map +1 -0
  51. package/package.json +1 -1
@@ -1,100 +1,157 @@
1
- import { HetznerProvider } from "../providers/hetzner.js";
2
- import { DigitalOceanProvider } from "../providers/digitalocean.js";
1
+ import { createProvider, createProviderWithToken } from "../utils/providerFactory.js";
2
+ import { saveServer } from "../utils/config.js";
3
+ import { waitForCoolify } from "../utils/healthCheck.js";
3
4
  import { BACK_SIGNAL, getProviderConfig, getDeploymentConfig, getLocationConfig, getServerTypeConfig, getServerNameConfig, confirmDeployment, } from "../utils/prompts.js";
4
5
  import { getCoolifyCloudInit } from "../utils/cloudInit.js";
5
6
  import { logger, createSpinner } from "../utils/logger.js";
6
- function createProvider(providerName) {
7
- switch (providerName) {
8
- case "hetzner":
9
- return new HetznerProvider("");
10
- case "digitalocean":
11
- return new DigitalOceanProvider("");
12
- default:
13
- throw new Error(`Unknown provider: ${providerName}`);
7
+ export async function initCommand(options = {}) {
8
+ const isNonInteractive = options.provider !== undefined;
9
+ logger.title("Quicklify - Deploy Coolify in minutes");
10
+ let providerChoice;
11
+ let apiToken;
12
+ let region;
13
+ let serverSize;
14
+ let serverName;
15
+ // Step 1: Select cloud provider
16
+ if (options.provider) {
17
+ if (!["hetzner", "digitalocean"].includes(options.provider)) {
18
+ logger.error(`Invalid provider: ${options.provider}. Use "hetzner" or "digitalocean".`);
19
+ process.exit(1);
20
+ return;
21
+ }
22
+ providerChoice = options.provider;
14
23
  }
15
- }
16
- function createProviderWithToken(providerName, token) {
17
- switch (providerName) {
18
- case "hetzner":
19
- return new HetznerProvider(token);
20
- case "digitalocean":
21
- return new DigitalOceanProvider(token);
22
- /* istanbul ignore next */
23
- default:
24
- throw new Error(`Unknown provider: ${providerName}`);
24
+ else {
25
+ const result = await getProviderConfig();
26
+ providerChoice = result.provider;
25
27
  }
26
- }
27
- export async function initCommand() {
28
- logger.title("Quicklify - Deploy Coolify in 4 minutes");
29
- // Step 1: Select cloud provider
30
- const { provider: providerChoice } = await getProviderConfig();
31
28
  const provider = createProvider(providerChoice);
32
29
  logger.info(`Using ${provider.displayName}`);
33
- // Step 2: Get API token
34
- const config = await getDeploymentConfig(provider);
35
- // Create provider with actual token for API calls
36
- const providerWithToken = createProviderWithToken(providerChoice, config.apiToken);
30
+ // Step 2: Get API token (flag > env var > interactive prompt)
31
+ if (options.token) {
32
+ apiToken = options.token;
33
+ }
34
+ else if (providerChoice === "hetzner" && process.env.HETZNER_TOKEN) {
35
+ apiToken = process.env.HETZNER_TOKEN;
36
+ }
37
+ else if (providerChoice === "digitalocean" && process.env.DIGITALOCEAN_TOKEN) {
38
+ apiToken = process.env.DIGITALOCEAN_TOKEN;
39
+ }
40
+ else if (isNonInteractive) {
41
+ logger.error("API token required. Use --token or set HETZNER_TOKEN/DIGITALOCEAN_TOKEN env var");
42
+ process.exit(1);
43
+ return;
44
+ }
45
+ else {
46
+ const config = await getDeploymentConfig(provider);
47
+ apiToken = config.apiToken;
48
+ }
37
49
  // Step 3: Validate API token
50
+ const providerWithToken = createProviderWithToken(providerChoice, apiToken);
38
51
  const tokenSpinner = createSpinner("Validating API token...");
39
52
  tokenSpinner.start();
40
- const isValid = await providerWithToken.validateToken(config.apiToken);
53
+ const isValid = await providerWithToken.validateToken(apiToken);
41
54
  if (!isValid) {
42
55
  tokenSpinner.fail("Invalid API token");
43
56
  logger.error("Please check your API token and try again");
57
+ if (isNonInteractive) {
58
+ process.exit(1);
59
+ return;
60
+ }
44
61
  return;
45
62
  }
46
63
  tokenSpinner.succeed("API token validated");
47
- // Steps 4-7: Configuration with back navigation
48
- let step = 4;
49
- while (step >= 4 && step <= 7) {
50
- switch (step) {
51
- case 4: {
52
- const region = await getLocationConfig(providerWithToken);
53
- if (region === BACK_SIGNAL)
54
- break;
55
- config.region = region;
56
- step = 5;
57
- break;
58
- }
59
- case 5: {
60
- const serverSize = await getServerTypeConfig(providerWithToken, config.region);
61
- if (serverSize === BACK_SIGNAL) {
62
- step = 4;
63
- break;
64
- }
65
- config.serverSize = serverSize;
66
- step = 6;
67
- break;
68
- }
69
- case 6: {
70
- const serverName = await getServerNameConfig();
71
- if (serverName === BACK_SIGNAL) {
64
+ // Step 4: Region
65
+ if (options.region) {
66
+ region = options.region;
67
+ }
68
+ else {
69
+ // Interactive region selection with back navigation
70
+ let step = 4;
71
+ region = "";
72
+ serverSize = "";
73
+ serverName = "";
74
+ while (step >= 4 && step <= 7) {
75
+ switch (step) {
76
+ case 4: {
77
+ const r = await getLocationConfig(providerWithToken);
78
+ if (r === BACK_SIGNAL)
79
+ break;
80
+ region = r;
72
81
  step = 5;
73
82
  break;
74
83
  }
75
- config.serverName = serverName;
76
- step = 7;
77
- break;
78
- }
79
- case 7: {
80
- const confirmed = await confirmDeployment(config, providerWithToken);
81
- if (confirmed === BACK_SIGNAL) {
84
+ case 5: {
85
+ const s = await getServerTypeConfig(providerWithToken, region);
86
+ if (s === BACK_SIGNAL) {
87
+ step = 4;
88
+ break;
89
+ }
90
+ serverSize = s;
82
91
  step = 6;
83
92
  break;
84
93
  }
85
- if (!confirmed) {
86
- logger.warning("Deployment cancelled");
87
- return;
94
+ case 6: {
95
+ const n = await getServerNameConfig();
96
+ if (n === BACK_SIGNAL) {
97
+ step = 5;
98
+ break;
99
+ }
100
+ serverName = n;
101
+ step = 7;
102
+ break;
103
+ }
104
+ case 7: {
105
+ const config = {
106
+ provider: providerChoice,
107
+ apiToken,
108
+ region,
109
+ serverSize,
110
+ serverName,
111
+ };
112
+ const confirmed = await confirmDeployment(config, providerWithToken);
113
+ if (confirmed === BACK_SIGNAL) {
114
+ step = 6;
115
+ break;
116
+ }
117
+ if (!confirmed) {
118
+ logger.warning("Deployment cancelled");
119
+ return;
120
+ }
121
+ step = 8;
122
+ break;
88
123
  }
89
- step = 8;
90
- break;
91
124
  }
92
125
  }
126
+ // Deploy
127
+ return deployServer(providerChoice, providerWithToken, region, serverSize, serverName);
128
+ }
129
+ // Non-interactive or partially interactive: size, name
130
+ if (options.size) {
131
+ serverSize = options.size;
132
+ }
133
+ else {
134
+ let s = BACK_SIGNAL;
135
+ while (s === BACK_SIGNAL) {
136
+ s = await getServerTypeConfig(providerWithToken, region);
137
+ }
138
+ serverSize = s;
139
+ }
140
+ if (options.name) {
141
+ serverName = options.name;
142
+ }
143
+ else {
144
+ let n = BACK_SIGNAL;
145
+ while (n === BACK_SIGNAL) {
146
+ n = await getServerNameConfig();
147
+ }
148
+ serverName = n;
93
149
  }
150
+ return deployServer(providerChoice, providerWithToken, region, serverSize, serverName);
151
+ }
152
+ async function deployServer(providerChoice, providerWithToken, region, serverSize, serverName) {
94
153
  try {
95
- // Generate cloud-init script
96
- const cloudInit = getCoolifyCloudInit(config.serverName);
97
- // Create server with retry on unavailable server type
154
+ const cloudInit = getCoolifyCloudInit(serverName);
98
155
  let server;
99
156
  let retries = 0;
100
157
  const maxRetries = 2;
@@ -105,9 +162,9 @@ export async function initCommand() {
105
162
  serverSpinner.start();
106
163
  try {
107
164
  server = await providerWithToken.createServer({
108
- name: config.serverName,
109
- region: config.region,
110
- size: config.serverSize,
165
+ name: serverName,
166
+ region,
167
+ size: serverSize,
111
168
  cloudInit,
112
169
  });
113
170
  serverSpinner.succeed(`Server created (ID: ${server.id})`);
@@ -116,18 +173,18 @@ export async function initCommand() {
116
173
  serverSpinner.fail("Server creation failed");
117
174
  const errorMsg = createError instanceof Error ? createError.message : "";
118
175
  if (errorMsg.includes("already") && errorMsg.includes("used")) {
119
- logger.warning(`Server name "${config.serverName}" is already in use`);
176
+ logger.warning(`Server name "${serverName}" is already in use`);
120
177
  logger.info("Please choose a different name:");
121
178
  let newName = BACK_SIGNAL;
122
179
  while (newName === BACK_SIGNAL) {
123
180
  newName = await getServerNameConfig();
124
181
  }
125
- config.serverName = newName;
182
+ serverName = newName;
126
183
  retries++;
127
184
  }
128
185
  else if (errorMsg.includes("location disabled")) {
129
- failedLocations.push(config.region);
130
- logger.warning(`Location "${config.region}" is currently disabled for new servers`);
186
+ failedLocations.push(region);
187
+ logger.warning(`Location "${region}" is currently disabled for new servers`);
131
188
  logger.info("Please select a different region and server type:");
132
189
  let pickedSize = false;
133
190
  while (!pickedSize) {
@@ -135,11 +192,11 @@ export async function initCommand() {
135
192
  while (newRegion === BACK_SIGNAL) {
136
193
  newRegion = await getLocationConfig(providerWithToken, failedLocations);
137
194
  }
138
- config.region = newRegion;
139
- const newSize = await getServerTypeConfig(providerWithToken, config.region);
195
+ region = newRegion;
196
+ const newSize = await getServerTypeConfig(providerWithToken, region);
140
197
  if (newSize === BACK_SIGNAL)
141
- continue; // back to region
142
- config.serverSize = newSize;
198
+ continue;
199
+ serverSize = newSize;
143
200
  pickedSize = true;
144
201
  }
145
202
  retries++;
@@ -149,14 +206,14 @@ export async function initCommand() {
149
206
  errorMsg.includes("sold out") ||
150
207
  errorMsg.includes("unsupported")) {
151
208
  if (retries < maxRetries) {
152
- failedTypes.push(config.serverSize);
153
- logger.warning(`Server type "${config.serverSize}" is not available in this location`);
209
+ failedTypes.push(serverSize);
210
+ logger.warning(`Server type "${serverSize}" is not available in this location`);
154
211
  logger.info("Please select a different server type:");
155
212
  let newSize = BACK_SIGNAL;
156
213
  while (newSize === BACK_SIGNAL) {
157
- newSize = await getServerTypeConfig(providerWithToken, config.region, failedTypes);
214
+ newSize = await getServerTypeConfig(providerWithToken, region, failedTypes);
158
215
  }
159
- config.serverSize = newSize;
216
+ serverSize = newSize;
160
217
  retries++;
161
218
  }
162
219
  else {
@@ -195,24 +252,35 @@ export async function initCommand() {
195
252
  const details = await providerWithToken.getServerDetails(server.id);
196
253
  server.ip = details.ip;
197
254
  }
198
- // Installing Coolify
255
+ // Health check polling instead of blind wait
199
256
  const isDigitalOcean = providerChoice === "digitalocean";
200
- const waitTime = isDigitalOcean ? 300000 : 180000; // DO: 5 min, Hetzner: 3 min
201
- const waitLabel = isDigitalOcean ? "4-6" : "3-5";
202
- const installSpinner = createSpinner(`Installing Coolify (this takes ${waitLabel} minutes)...`);
203
- installSpinner.start();
204
- // Wait for Coolify installation (cloud-init runs in background)
205
- await new Promise((resolve) => setTimeout(resolve, waitTime));
206
- installSpinner.succeed("Coolify installation completed");
257
+ const minWait = isDigitalOcean ? 120000 : 60000;
258
+ const ready = await waitForCoolify(server.ip, minWait);
259
+ // Save server record to config
260
+ saveServer({
261
+ id: server.id,
262
+ name: serverName,
263
+ provider: providerChoice,
264
+ ip: server.ip,
265
+ region,
266
+ size: serverSize,
267
+ createdAt: new Date().toISOString(),
268
+ });
207
269
  // Success message
208
- const extraWait = isDigitalOcean ? "3-5" : "1-2";
209
270
  logger.title("Deployment Successful!");
210
271
  console.log();
211
272
  logger.success(`Server IP: ${server.ip}`);
212
273
  logger.success(`Access Coolify: http://${server.ip}:8000`);
213
274
  console.log();
214
- logger.info("Default credentials will be shown on first login");
215
- logger.info(`Please wait ${extraWait} more minutes for Coolify to fully initialize`);
275
+ if (ready) {
276
+ logger.info("Coolify is ready! Open the URL above to get started.");
277
+ }
278
+ else {
279
+ logger.warning("Coolify did not respond yet. Please check in a few minutes.");
280
+ logger.info(`You can check status later with: quicklify status ${server.ip}`);
281
+ }
282
+ logger.warning("Set up a domain and enable SSL in Coolify for production use.");
283
+ logger.info("Server saved to local config. Use 'quicklify list' to see all servers.");
216
284
  console.log();
217
285
  }
218
286
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function listCommand(): Promise<void>;
2
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBjD"}
@@ -0,0 +1,22 @@
1
+ import { getServers } from "../utils/config.js";
2
+ import { logger } from "../utils/logger.js";
3
+ export async function listCommand() {
4
+ const servers = getServers();
5
+ if (servers.length === 0) {
6
+ logger.info("No servers found. Deploy one with: quicklify init");
7
+ return;
8
+ }
9
+ logger.title("Registered Servers");
10
+ // Table header
11
+ const header = `${"ID".padEnd(12)} ${"Name".padEnd(20)} ${"Provider".padEnd(14)} ${"IP".padEnd(16)} ${"Region".padEnd(10)} ${"Created".padEnd(12)}`;
12
+ console.log(header);
13
+ console.log("─".repeat(header.length));
14
+ // Table rows
15
+ for (const server of servers) {
16
+ const created = server.createdAt ? server.createdAt.split("T")[0] : "N/A";
17
+ console.log(`${server.id.padEnd(12)} ${server.name.padEnd(20)} ${server.provider.padEnd(14)} ${server.ip.padEnd(16)} ${server.region.padEnd(10)} ${created.padEnd(12)}`);
18
+ }
19
+ console.log();
20
+ logger.info(`Total: ${servers.length} server(s)`);
21
+ }
22
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAEnC,eAAe;IACf,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IACpJ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvC,aAAa;IACb,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC1E,OAAO,CAAC,GAAG,CACT,GAAG,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAC5J,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,MAAM,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function statusCommand(query?: string): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AA8BA,wBAAsB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmEjE"}
@@ -0,0 +1,89 @@
1
+ import axios from "axios";
2
+ import inquirer from "inquirer";
3
+ import { getServers, findServer } from "../utils/config.js";
4
+ import { createProviderWithToken } from "../utils/providerFactory.js";
5
+ import { logger, createSpinner } from "../utils/logger.js";
6
+ async function selectServer() {
7
+ const servers = getServers();
8
+ if (servers.length === 0) {
9
+ logger.info("No servers found. Deploy one with: quicklify init");
10
+ return undefined;
11
+ }
12
+ const { serverId } = await inquirer.prompt([
13
+ {
14
+ type: "list",
15
+ name: "serverId",
16
+ message: "Select a server:",
17
+ choices: servers.map((s) => ({
18
+ name: `${s.name} (${s.ip}) - ${s.provider}`,
19
+ value: s.id,
20
+ })),
21
+ },
22
+ ]);
23
+ return servers.find((s) => s.id === serverId);
24
+ }
25
+ export async function statusCommand(query) {
26
+ let server;
27
+ if (query) {
28
+ server = findServer(query);
29
+ if (!server) {
30
+ logger.error(`Server not found: ${query}`);
31
+ return;
32
+ }
33
+ }
34
+ else {
35
+ server = await selectServer();
36
+ if (!server)
37
+ return;
38
+ }
39
+ // Ask for API token
40
+ const { apiToken } = await inquirer.prompt([
41
+ {
42
+ type: "password",
43
+ name: "apiToken",
44
+ message: `Enter your ${server.provider} API token:`,
45
+ validate: (input) => (input.trim().length > 0 ? true : "API token is required"),
46
+ },
47
+ ]);
48
+ const spinner = createSpinner("Checking server status...");
49
+ spinner.start();
50
+ try {
51
+ const provider = createProviderWithToken(server.provider, apiToken.trim());
52
+ // Check server status via provider API
53
+ const serverStatus = await provider.getServerStatus(server.id);
54
+ // Check Coolify health
55
+ let coolifyStatus = "unknown";
56
+ try {
57
+ await axios.get(`http://${server.ip}:8000`, {
58
+ timeout: 5000,
59
+ validateStatus: () => true,
60
+ });
61
+ coolifyStatus = "running";
62
+ }
63
+ catch {
64
+ coolifyStatus = "not reachable";
65
+ }
66
+ spinner.succeed("Status retrieved");
67
+ console.log();
68
+ logger.info(`Name: ${server.name}`);
69
+ logger.info(`Provider: ${server.provider}`);
70
+ logger.info(`IP: ${server.ip}`);
71
+ logger.info(`Region: ${server.region}`);
72
+ logger.info(`Size: ${server.size}`);
73
+ logger.info(`Server Status: ${serverStatus}`);
74
+ logger.info(`Coolify Status: ${coolifyStatus}`);
75
+ console.log();
76
+ if (coolifyStatus === "running") {
77
+ logger.success(`Access Coolify: http://${server.ip}:8000`);
78
+ logger.warning("Running on HTTP. Set up a domain + SSL for production use.");
79
+ }
80
+ else {
81
+ logger.warning("Coolify is not reachable. It may still be installing.");
82
+ }
83
+ }
84
+ catch (error) {
85
+ spinner.fail("Failed to check status");
86
+ logger.error(error instanceof Error ? error.message : String(error));
87
+ }
88
+ }
89
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -4,6 +4,9 @@ import { readFileSync } from "fs";
4
4
  import { fileURLToPath } from "url";
5
5
  import { dirname, join } from "path";
6
6
  import { initCommand } from "./commands/init.js";
7
+ import { listCommand } from "./commands/list.js";
8
+ import { statusCommand } from "./commands/status.js";
9
+ import { destroyCommand } from "./commands/destroy.js";
7
10
  const __filename = fileURLToPath(import.meta.url);
8
11
  const __dirname = dirname(__filename);
9
12
  const pkg = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf-8"));
@@ -15,6 +18,20 @@ program
15
18
  program
16
19
  .command("init")
17
20
  .description("Deploy a new Coolify instance on a cloud provider")
21
+ .option("--provider <provider>", "Cloud provider (hetzner, digitalocean)")
22
+ .option("--token <token>", "API token (or set HETZNER_TOKEN / DIGITALOCEAN_TOKEN env var)")
23
+ .option("--region <region>", "Server region")
24
+ .option("--size <size>", "Server size")
25
+ .option("--name <name>", "Server name")
18
26
  .action(initCommand);
27
+ program.command("list").description("List all registered servers").action(listCommand);
28
+ program
29
+ .command("status [query]")
30
+ .description("Check server and Coolify status")
31
+ .action(statusCommand);
32
+ program
33
+ .command("destroy [query]")
34
+ .description("Destroy a registered server")
35
+ .action(destroyCommand);
19
36
  program.parse();
20
37
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAElF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAElF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,uBAAuB,EAAE,wCAAwC,CAAC;KACzE,MAAM,CAAC,iBAAiB,EAAE,+DAA+D,CAAC;KAC1F,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;KAC5C,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC;KACtC,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC;KACtC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,6BAA6B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvF,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -10,5 +10,6 @@ export interface CloudProvider {
10
10
  createServer(config: ServerConfig): Promise<ServerResult>;
11
11
  getServerStatus(serverId: string): Promise<string>;
12
12
  getServerDetails(serverId: string): Promise<ServerResult>;
13
+ destroyServer(serverId: string): Promise<void>;
13
14
  }
14
15
  //# sourceMappingURL=base.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAExF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,UAAU,IAAI,MAAM,EAAE,CAAC;IACvB,cAAc,IAAI,UAAU,EAAE,CAAC;IAC/B,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACjE,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC3D"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAExF,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,UAAU,IAAI,MAAM,EAAE,CAAC;IACvB,cAAc,IAAI,UAAU,EAAE,CAAC;IAC/B,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACjE,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1D,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD"}
@@ -10,6 +10,7 @@ export declare class DigitalOceanProvider implements CloudProvider {
10
10
  createServer(config: ServerConfig): Promise<ServerResult>;
11
11
  getServerDetails(serverId: string): Promise<ServerResult>;
12
12
  getServerStatus(serverId: string): Promise<string>;
13
+ destroyServer(serverId: string): Promise<void>;
13
14
  getRegions(): Region[];
14
15
  getServerSizes(): ServerSize[];
15
16
  getAvailableLocations(): Promise<Region[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"digitalocean.d.ts","sourceRoot":"","sources":["../../src/providers/digitalocean.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuBxF,qBAAa,oBAAqB,YAAW,aAAa;IACxD,IAAI,SAAkB;IACtB,WAAW,SAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAqC;gBAExC,QAAQ,EAAE,MAAM;IAItB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW9C,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAyCzD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAezD,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAexD,UAAU,IAAI,MAAM,EAAE;IAWtB,cAAc,IAAI,UAAU,EAAE;IASxB,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAiB1C,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CA6BvE"}
1
+ {"version":3,"file":"digitalocean.d.ts","sourceRoot":"","sources":["../../src/providers/digitalocean.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuBxF,qBAAa,oBAAqB,YAAW,aAAa;IACxD,IAAI,SAAkB;IACtB,WAAW,SAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAqC;gBAExC,QAAQ,EAAE,MAAM;IAItB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW9C,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAyCzD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAezD,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAelD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpD,UAAU,IAAI,MAAM,EAAE;IAWtB,cAAc,IAAI,UAAU,EAAE;IASxB,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAiB1C,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CA6BvE"}
@@ -74,6 +74,19 @@ export class DigitalOceanProvider {
74
74
  throw new Error(`Failed to get server status: ${error instanceof Error ? error.message : String(error)}`);
75
75
  }
76
76
  }
77
+ async destroyServer(serverId) {
78
+ try {
79
+ await axios.delete(`${this.baseUrl}/droplets/${serverId}`, {
80
+ headers: { Authorization: `Bearer ${this.apiToken}` },
81
+ });
82
+ }
83
+ catch (error) {
84
+ if (axios.isAxiosError(error)) {
85
+ throw new Error(`Failed to destroy server: ${error.response?.data?.message || error.message}`);
86
+ }
87
+ throw new Error(`Failed to destroy server: ${error instanceof Error ? error.message : String(error)}`);
88
+ }
89
+ }
77
90
  getRegions() {
78
91
  return [
79
92
  { id: "nyc1", name: "New York 1", location: "USA" },