quicklify 0.9.0 → 1.0.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 (85) hide show
  1. package/README.md +103 -598
  2. package/README.tr.md +178 -0
  3. package/dist/commands/add.d.ts +9 -0
  4. package/dist/commands/add.d.ts.map +1 -0
  5. package/dist/commands/add.js +151 -0
  6. package/dist/commands/add.js.map +1 -0
  7. package/dist/commands/backup.d.ts +1 -0
  8. package/dist/commands/backup.d.ts.map +1 -1
  9. package/dist/commands/backup.js +104 -1
  10. package/dist/commands/backup.js.map +1 -1
  11. package/dist/commands/domain.d.ts +1 -0
  12. package/dist/commands/domain.d.ts.map +1 -1
  13. package/dist/commands/domain.js +4 -1
  14. package/dist/commands/domain.js.map +1 -1
  15. package/dist/commands/init.d.ts.map +1 -1
  16. package/dist/commands/init.js +20 -6
  17. package/dist/commands/init.js.map +1 -1
  18. package/dist/commands/maintain.d.ts +9 -0
  19. package/dist/commands/maintain.d.ts.map +1 -0
  20. package/dist/commands/maintain.js +288 -0
  21. package/dist/commands/maintain.js.map +1 -0
  22. package/dist/commands/remove.d.ts +2 -0
  23. package/dist/commands/remove.d.ts.map +1 -0
  24. package/dist/commands/remove.js +25 -0
  25. package/dist/commands/remove.js.map +1 -0
  26. package/dist/commands/restart.d.ts.map +1 -1
  27. package/dist/commands/restart.js +4 -0
  28. package/dist/commands/restart.js.map +1 -1
  29. package/dist/commands/restore.js +3 -3
  30. package/dist/commands/restore.js.map +1 -1
  31. package/dist/commands/snapshot.d.ts +8 -0
  32. package/dist/commands/snapshot.d.ts.map +1 -0
  33. package/dist/commands/snapshot.js +199 -0
  34. package/dist/commands/snapshot.js.map +1 -0
  35. package/dist/commands/status.d.ts +6 -1
  36. package/dist/commands/status.d.ts.map +1 -1
  37. package/dist/commands/status.js +120 -7
  38. package/dist/commands/status.js.map +1 -1
  39. package/dist/commands/update.d.ts +5 -1
  40. package/dist/commands/update.d.ts.map +1 -1
  41. package/dist/commands/update.js +101 -14
  42. package/dist/commands/update.js.map +1 -1
  43. package/dist/index.js +38 -4
  44. package/dist/index.js.map +1 -1
  45. package/dist/providers/base.d.ts +5 -1
  46. package/dist/providers/base.d.ts.map +1 -1
  47. package/dist/providers/digitalocean.d.ts +5 -1
  48. package/dist/providers/digitalocean.d.ts.map +1 -1
  49. package/dist/providers/digitalocean.js +74 -0
  50. package/dist/providers/digitalocean.js.map +1 -1
  51. package/dist/providers/hetzner.d.ts +5 -1
  52. package/dist/providers/hetzner.d.ts.map +1 -1
  53. package/dist/providers/hetzner.js +77 -2
  54. package/dist/providers/hetzner.js.map +1 -1
  55. package/dist/providers/linode.d.ts +25 -0
  56. package/dist/providers/linode.d.ts.map +1 -0
  57. package/dist/providers/linode.js +291 -0
  58. package/dist/providers/linode.js.map +1 -0
  59. package/dist/providers/vultr.d.ts +25 -0
  60. package/dist/providers/vultr.d.ts.map +1 -0
  61. package/dist/providers/vultr.js +262 -0
  62. package/dist/providers/vultr.js.map +1 -0
  63. package/dist/types/index.d.ts +9 -0
  64. package/dist/types/index.d.ts.map +1 -1
  65. package/dist/utils/config.d.ts +1 -0
  66. package/dist/utils/config.d.ts.map +1 -1
  67. package/dist/utils/config.js +7 -0
  68. package/dist/utils/config.js.map +1 -1
  69. package/dist/utils/prompts.d.ts.map +1 -1
  70. package/dist/utils/prompts.js +2 -0
  71. package/dist/utils/prompts.js.map +1 -1
  72. package/dist/utils/providerFactory.d.ts.map +1 -1
  73. package/dist/utils/providerFactory.js +10 -0
  74. package/dist/utils/providerFactory.js.map +1 -1
  75. package/dist/utils/serverSelect.d.ts +1 -0
  76. package/dist/utils/serverSelect.d.ts.map +1 -1
  77. package/dist/utils/serverSelect.js +37 -6
  78. package/dist/utils/serverSelect.js.map +1 -1
  79. package/dist/utils/templates.d.ts.map +1 -1
  80. package/dist/utils/templates.js +6 -0
  81. package/dist/utils/templates.js.map +1 -1
  82. package/dist/utils/yamlConfig.d.ts.map +1 -1
  83. package/dist/utils/yamlConfig.js +9 -4
  84. package/dist/utils/yamlConfig.js.map +1 -1
  85. package/package.json +3 -1
@@ -0,0 +1,199 @@
1
+ import inquirer from "inquirer";
2
+ import { getServers } from "../utils/config.js";
3
+ import { resolveServer, promptApiToken, collectProviderTokens } from "../utils/serverSelect.js";
4
+ import { createProviderWithToken } from "../utils/providerFactory.js";
5
+ import { logger, createSpinner } from "../utils/logger.js";
6
+ async function snapshotCreate(query, options) {
7
+ const server = await resolveServer(query, "Select a server to snapshot:");
8
+ if (!server)
9
+ return;
10
+ const apiToken = await promptApiToken(server.provider);
11
+ const provider = createProviderWithToken(server.provider, apiToken);
12
+ // Get cost estimate
13
+ const costSpinner = createSpinner("Estimating snapshot cost...");
14
+ costSpinner.start();
15
+ let costEstimate = "unknown";
16
+ try {
17
+ costEstimate = await provider.getSnapshotCostEstimate(server.id);
18
+ costSpinner.succeed(`Estimated cost: ${costEstimate}`);
19
+ }
20
+ catch {
21
+ costSpinner.warn("Could not estimate cost");
22
+ }
23
+ if (options?.dryRun) {
24
+ logger.title("Dry Run - Create Snapshot");
25
+ logger.info(`Server: ${server.name} (${server.ip})`);
26
+ logger.info(`Estimated cost: ${costEstimate}`);
27
+ logger.info(`Snapshot name: quicklify-${Date.now()}`);
28
+ console.log();
29
+ logger.warning("No changes applied. Remove --dry-run to execute.");
30
+ return;
31
+ }
32
+ if (!options?.force) {
33
+ const { confirm } = await inquirer.prompt([
34
+ {
35
+ type: "confirm",
36
+ name: "confirm",
37
+ message: `Create snapshot of ${server.name}? (Estimated cost: ${costEstimate})`,
38
+ default: true,
39
+ },
40
+ ]);
41
+ if (!confirm) {
42
+ logger.info("Snapshot cancelled.");
43
+ return;
44
+ }
45
+ }
46
+ const snapshotName = `quicklify-${Date.now()}`;
47
+ const spinner = createSpinner(`Creating snapshot "${snapshotName}"...`);
48
+ spinner.start();
49
+ try {
50
+ const snapshot = await provider.createSnapshot(server.id, snapshotName);
51
+ spinner.succeed(`Snapshot created: ${snapshot.name} (${snapshot.id})`);
52
+ logger.info(`Status: ${snapshot.status}`);
53
+ logger.info(`Cost: ${snapshot.costPerMonth}`);
54
+ }
55
+ catch (error) {
56
+ spinner.fail("Failed to create snapshot");
57
+ logger.error(error instanceof Error ? error.message : String(error));
58
+ }
59
+ }
60
+ async function snapshotList(query) {
61
+ const server = await resolveServer(query, "Select a server to list snapshots:");
62
+ if (!server)
63
+ return;
64
+ const apiToken = await promptApiToken(server.provider);
65
+ const provider = createProviderWithToken(server.provider, apiToken);
66
+ const spinner = createSpinner(`Fetching snapshots for ${server.name}...`);
67
+ spinner.start();
68
+ try {
69
+ const snapshots = await provider.listSnapshots(server.id);
70
+ if (snapshots.length === 0) {
71
+ spinner.succeed(`No snapshots found for ${server.name}`);
72
+ return;
73
+ }
74
+ spinner.succeed(`${snapshots.length} snapshot(s) found for ${server.name}`);
75
+ console.log();
76
+ for (const snap of snapshots) {
77
+ logger.step(`${snap.name} | ID: ${snap.id} | Size: ${snap.sizeGb.toFixed(1)} GB | Cost: ${snap.costPerMonth} | Created: ${snap.createdAt}`);
78
+ }
79
+ }
80
+ catch (error) {
81
+ spinner.fail("Failed to list snapshots");
82
+ logger.error(error instanceof Error ? error.message : String(error));
83
+ }
84
+ }
85
+ async function snapshotListAll() {
86
+ const servers = getServers();
87
+ if (servers.length === 0) {
88
+ logger.info("No servers found. Deploy one with: quicklify init");
89
+ return;
90
+ }
91
+ const tokenMap = await collectProviderTokens(servers);
92
+ for (const server of servers) {
93
+ const token = tokenMap.get(server.provider);
94
+ const provider = createProviderWithToken(server.provider, token);
95
+ const spinner = createSpinner(`Fetching snapshots for ${server.name}...`);
96
+ spinner.start();
97
+ try {
98
+ const snapshots = await provider.listSnapshots(server.id);
99
+ if (snapshots.length === 0) {
100
+ spinner.succeed(`${server.name}: No snapshots`);
101
+ }
102
+ else {
103
+ spinner.succeed(`${server.name}: ${snapshots.length} snapshot(s)`);
104
+ for (const snap of snapshots) {
105
+ logger.step(` ${snap.name} | ID: ${snap.id} | Size: ${snap.sizeGb.toFixed(1)} GB | Cost: ${snap.costPerMonth} | Created: ${snap.createdAt}`);
106
+ }
107
+ }
108
+ }
109
+ catch (error) {
110
+ spinner.fail(`${server.name}: Failed to list snapshots`);
111
+ logger.error(error instanceof Error ? error.message : String(error));
112
+ }
113
+ console.log();
114
+ }
115
+ }
116
+ async function snapshotDelete(query, options) {
117
+ const server = await resolveServer(query, "Select a server:");
118
+ if (!server)
119
+ return;
120
+ const apiToken = await promptApiToken(server.provider);
121
+ const provider = createProviderWithToken(server.provider, apiToken);
122
+ // List snapshots to select from
123
+ const listSpinner = createSpinner("Fetching snapshots...");
124
+ listSpinner.start();
125
+ let snapshots;
126
+ try {
127
+ snapshots = await provider.listSnapshots(server.id);
128
+ }
129
+ catch (error) {
130
+ listSpinner.fail("Failed to list snapshots");
131
+ logger.error(error instanceof Error ? error.message : String(error));
132
+ return;
133
+ }
134
+ if (snapshots.length === 0) {
135
+ listSpinner.succeed("No snapshots to delete");
136
+ return;
137
+ }
138
+ listSpinner.succeed(`${snapshots.length} snapshot(s) found`);
139
+ const { selectedId } = await inquirer.prompt([
140
+ {
141
+ type: "list",
142
+ name: "selectedId",
143
+ message: "Select a snapshot to delete:",
144
+ choices: snapshots.map((s) => ({
145
+ name: `${s.name} (${s.sizeGb.toFixed(1)} GB, ${s.costPerMonth}, ${s.createdAt})`,
146
+ value: s.id,
147
+ })),
148
+ },
149
+ ]);
150
+ if (!options?.force) {
151
+ const { confirm } = await inquirer.prompt([
152
+ {
153
+ type: "confirm",
154
+ name: "confirm",
155
+ message: `Delete snapshot ${selectedId}? This cannot be undone.`,
156
+ default: false,
157
+ },
158
+ ]);
159
+ if (!confirm) {
160
+ logger.info("Delete cancelled.");
161
+ return;
162
+ }
163
+ }
164
+ const deleteSpinner = createSpinner("Deleting snapshot...");
165
+ deleteSpinner.start();
166
+ try {
167
+ await provider.deleteSnapshot(selectedId);
168
+ deleteSpinner.succeed("Snapshot deleted");
169
+ }
170
+ catch (error) {
171
+ deleteSpinner.fail("Failed to delete snapshot");
172
+ logger.error(error instanceof Error ? error.message : String(error));
173
+ }
174
+ }
175
+ export async function snapshotCommand(subcommand, query, options) {
176
+ const sub = subcommand || "list";
177
+ const validSubcommands = ["create", "list", "delete"];
178
+ if (!validSubcommands.includes(sub)) {
179
+ logger.error(`Invalid subcommand: ${sub}. Choose from: ${validSubcommands.join(", ")}`);
180
+ return;
181
+ }
182
+ switch (sub) {
183
+ case "create":
184
+ await snapshotCreate(query, options);
185
+ break;
186
+ case "list":
187
+ if (options?.all) {
188
+ await snapshotListAll();
189
+ }
190
+ else {
191
+ await snapshotList(query);
192
+ }
193
+ break;
194
+ case "delete":
195
+ await snapshotDelete(query, options);
196
+ break;
197
+ }
198
+ }
199
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAQ3D,KAAK,UAAU,cAAc,CAC3B,KAAc,EACd,OAAyB;IAEzB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,8BAA8B,CAAC,CAAC;IAC1E,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEpE,oBAAoB;IACpB,MAAM,WAAW,GAAG,aAAa,CAAC,6BAA6B,CAAC,CAAC;IACjE,WAAW,CAAC,KAAK,EAAE,CAAC;IACpB,IAAI,YAAY,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC;QACH,YAAY,GAAG,MAAM,QAAQ,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACjE,WAAW,CAAC,OAAO,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,4BAA4B,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACpB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACxC;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,sBAAsB,MAAM,CAAC,IAAI,sBAAsB,YAAY,GAAG;gBAC/E,OAAO,EAAE,IAAI;aACd;SACF,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,sBAAsB,YAAY,MAAM,CAAC,CAAC;IACxE,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QACxE,OAAO,CAAC,OAAO,CAAC,qBAAqB,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,WAAW,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,KAAc;IACxC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,oCAAoC,CAAC,CAAC;IAChF,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEpE,MAAM,OAAO,GAAG,aAAa,CAAC,0BAA0B,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC;IAC1E,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,OAAO,CAAC,0BAA0B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,0BAA0B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CACT,GAAG,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,YAAY,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,YAAY,eAAe,IAAI,CAAC,SAAS,EAAE,CAC/H,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAEtD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEjE,MAAM,OAAO,GAAG,aAAa,CAAC,0BAA0B,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC;QAC1E,OAAO,CAAC,KAAK,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC1D,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,gBAAgB,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM,cAAc,CAAC,CAAC;gBACnE,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;oBAC7B,MAAM,CAAC,IAAI,CACT,KAAK,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,EAAE,YAAY,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,YAAY,eAAe,IAAI,CAAC,SAAS,EAAE,CACjI,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,4BAA4B,CAAC,CAAC;YACzD,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,KAAc,EACd,OAAyB;IAEzB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEpE,gCAAgC;IAChC,MAAM,WAAW,GAAG,aAAa,CAAC,uBAAuB,CAAC,CAAC;IAC3D,WAAW,CAAC,KAAK,EAAE,CAAC;IAEpB,IAAI,SAAS,CAAC;IACd,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,WAAW,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,WAAW,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,WAAW,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,oBAAoB,CAAC,CAAC;IAE7D,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QAC3C;YACE,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,8BAA8B;YACvC,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,SAAS,GAAG;gBAChF,KAAK,EAAE,CAAC,CAAC,EAAE;aACZ,CAAC,CAAC;SACJ;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QACpB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACxC;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,mBAAmB,UAAU,0BAA0B;gBAChE,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,aAAa,CAAC,sBAAsB,CAAC,CAAC;IAC5D,aAAa,CAAC,KAAK,EAAE,CAAC;IAEtB,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC1C,aAAa,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,aAAa,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAmB,EACnB,KAAc,EACd,OAAyB;IAEzB,MAAM,GAAG,GAAG,UAAU,IAAI,MAAM,CAAC;IACjC,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEtD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,CACV,uBAAuB,GAAG,kBAAkB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1E,CAAC;QACF,OAAO;IACT,CAAC;IAED,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,QAAQ;YACX,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACrC,MAAM;QACR,KAAK,MAAM;YACT,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;gBACjB,MAAM,eAAe,EAAE,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,MAAM,YAAY,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;YACD,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACrC,MAAM;IACV,CAAC;AACH,CAAC"}
@@ -1,2 +1,7 @@
1
- export declare function statusCommand(query?: string): Promise<void>;
1
+ interface StatusOptions {
2
+ all?: boolean;
3
+ autostart?: boolean;
4
+ }
5
+ export declare function statusCommand(query?: string, options?: StatusOptions): Promise<void>;
6
+ export {};
2
7
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDjE"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAWA,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAsHD,wBAAsB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D1F"}
@@ -1,19 +1,128 @@
1
1
  import axios from "axios";
2
- import { resolveServer, promptApiToken } from "../utils/serverSelect.js";
2
+ import { getServers } from "../utils/config.js";
3
+ import { resolveServer, promptApiToken, collectProviderTokens } from "../utils/serverSelect.js";
3
4
  import { createProviderWithToken } from "../utils/providerFactory.js";
5
+ import { checkSshAvailable, sshExec } from "../utils/ssh.js";
4
6
  import { logger, createSpinner } from "../utils/logger.js";
5
- export async function statusCommand(query) {
7
+ const COOLIFY_RESTART_CMD = "cd /data/coolify/source && docker compose -f docker-compose.yml -f docker-compose.prod.yml restart coolify";
8
+ async function checkSingleServer(server, apiToken) {
9
+ try {
10
+ let serverStatus;
11
+ if (server.id.startsWith("manual-")) {
12
+ serverStatus = "unknown (manual)";
13
+ }
14
+ else {
15
+ const provider = createProviderWithToken(server.provider, apiToken);
16
+ serverStatus = await provider.getServerStatus(server.id);
17
+ }
18
+ let coolifyStatus = "unknown";
19
+ try {
20
+ await axios.get(`http://${server.ip}:8000`, {
21
+ timeout: 5000,
22
+ validateStatus: () => true,
23
+ });
24
+ coolifyStatus = "running";
25
+ }
26
+ catch {
27
+ coolifyStatus = "not reachable";
28
+ }
29
+ return { server, serverStatus, coolifyStatus };
30
+ }
31
+ catch (error) {
32
+ return {
33
+ server,
34
+ serverStatus: "error",
35
+ coolifyStatus: "unknown",
36
+ error: error instanceof Error ? error.message : String(error),
37
+ };
38
+ }
39
+ }
40
+ async function statusAll() {
41
+ const servers = getServers();
42
+ if (servers.length === 0) {
43
+ logger.info("No servers found. Deploy one with: quicklify init");
44
+ return;
45
+ }
46
+ const tokenMap = await collectProviderTokens(servers);
47
+ const spinner = createSpinner(`Checking status of ${servers.length} server(s)...`);
48
+ spinner.start();
49
+ const results = await Promise.all(servers.map((s) => checkSingleServer(s, tokenMap.get(s.provider))));
50
+ spinner.succeed("Status check complete");
51
+ console.log();
52
+ // Table header
53
+ const header = `${"Name".padEnd(20)} ${"IP".padEnd(16)} ${"Provider".padEnd(14)} ${"Server".padEnd(12)} ${"Coolify".padEnd(14)}`;
54
+ console.log(header);
55
+ console.log("─".repeat(header.length));
56
+ for (const r of results) {
57
+ const serverStr = r.error ? "error" : r.serverStatus;
58
+ const coolifyStr = r.coolifyStatus;
59
+ console.log(`${r.server.name.padEnd(20)} ${r.server.ip.padEnd(16)} ${r.server.provider.padEnd(14)} ${serverStr.padEnd(12)} ${coolifyStr.padEnd(14)}`);
60
+ }
61
+ console.log();
62
+ const running = results.filter((r) => r.coolifyStatus === "running").length;
63
+ const errors = results.filter((r) => r.error).length;
64
+ if (errors > 0) {
65
+ logger.warning(`${running} running, ${errors} error(s)`);
66
+ }
67
+ else {
68
+ logger.success(`${running}/${results.length} server(s) with Coolify running`);
69
+ }
70
+ }
71
+ async function autostartCoolify(server) {
72
+ if (!checkSshAvailable()) {
73
+ logger.warning("SSH not available. Cannot autostart Coolify.");
74
+ return;
75
+ }
76
+ const spinner = createSpinner("Restarting Coolify via SSH...");
77
+ spinner.start();
78
+ try {
79
+ const result = await sshExec(server.ip, COOLIFY_RESTART_CMD);
80
+ if (result.code === 0) {
81
+ spinner.succeed("Coolify restart command sent");
82
+ // Wait and check again
83
+ await new Promise((resolve) => setTimeout(resolve, 5000));
84
+ try {
85
+ await axios.get(`http://${server.ip}:8000`, {
86
+ timeout: 5000,
87
+ validateStatus: () => true,
88
+ });
89
+ logger.success("Coolify is now running!");
90
+ }
91
+ catch {
92
+ logger.warning("Coolify may still be starting. Check again in a moment.");
93
+ }
94
+ }
95
+ else {
96
+ spinner.fail("Coolify restart failed");
97
+ if (result.stderr)
98
+ logger.error(result.stderr);
99
+ }
100
+ }
101
+ catch (error) {
102
+ spinner.fail("Failed to restart Coolify");
103
+ logger.error(error instanceof Error ? error.message : String(error));
104
+ }
105
+ }
106
+ export async function statusCommand(query, options) {
107
+ if (options?.all) {
108
+ return statusAll();
109
+ }
6
110
  const server = await resolveServer(query);
7
111
  if (!server)
8
112
  return;
9
- // Ask for API token
10
- const apiToken = await promptApiToken(server.provider);
113
+ // Ask for API token (skip for manually added servers)
114
+ const apiToken = server.id.startsWith("manual-") ? "" : await promptApiToken(server.provider);
11
115
  const spinner = createSpinner("Checking server status...");
12
116
  spinner.start();
13
117
  try {
14
- const provider = createProviderWithToken(server.provider, apiToken);
15
- // Check server status via provider API
16
- const serverStatus = await provider.getServerStatus(server.id);
118
+ let serverStatus;
119
+ if (server.id.startsWith("manual-")) {
120
+ serverStatus = "unknown (manual)";
121
+ }
122
+ else {
123
+ const provider = createProviderWithToken(server.provider, apiToken);
124
+ serverStatus = await provider.getServerStatus(server.id);
125
+ }
17
126
  // Check Coolify health
18
127
  let coolifyStatus = "unknown";
19
128
  try {
@@ -42,6 +151,10 @@ export async function statusCommand(query) {
42
151
  }
43
152
  else {
44
153
  logger.warning("Coolify is not reachable. It may still be installing.");
154
+ // Autostart: restart Coolify if server is running but Coolify is down
155
+ if (options?.autostart && serverStatus === "running") {
156
+ await autostartCoolify(server);
157
+ }
45
158
  }
46
159
  }
47
160
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAc;IAChD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,oBAAoB;IACpB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,aAAa,CAAC,2BAA2B,CAAC,CAAC;IAC3D,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEpE,uCAAuC;QACvC,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE/D,uBAAuB;QACvB,IAAI,aAAa,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE;gBAC1C,OAAO,EAAE,IAAI;gBACb,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI;aAC3B,CAAC,CAAC;YACH,aAAa,GAAG,SAAS,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,aAAa,GAAG,eAAe,CAAC;QAClC,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAEpC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,CAAC,OAAO,CAAC,0BAA0B,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAG3D,MAAM,mBAAmB,GACvB,4GAA4G,CAAC;AAc/G,KAAK,UAAU,iBAAiB,CAAC,MAAoB,EAAE,QAAgB;IACrE,IAAI,CAAC;QACH,IAAI,YAAoB,CAAC;QACzB,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACpC,YAAY,GAAG,kBAAkB,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACpE,YAAY,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,aAAa,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE;gBAC1C,OAAO,EAAE,IAAI;gBACb,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI;aAC3B,CAAC,CAAC;YACH,aAAa,GAAG,SAAS,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,aAAa,GAAG,eAAe,CAAC;QAClC,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;IACjD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO;YACL,MAAM;YACN,YAAY,EAAE,OAAO;YACrB,aAAa,EAAE,SAAS;YACxB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,aAAa,CAAC,sBAAsB,OAAO,CAAC,MAAM,eAAe,CAAC,CAAC;IACnF,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAE,CAAC,CAAC,CACpE,CAAC;IAEF,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,eAAe;IACf,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IACjI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QACrD,MAAM,UAAU,GAAG,CAAC,CAAC,aAAa,CAAC;QACnC,OAAO,CAAC,GAAG,CACT,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CACzI,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IACrD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,aAAa,MAAM,WAAW,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,IAAI,OAAO,CAAC,MAAM,iCAAiC,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAAoB;IAClD,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,CAAC,OAAO,CAAC,8CAA8C,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,+BAA+B,CAAC,CAAC;IAC/D,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,OAAO,CAAC,8BAA8B,CAAC,CAAC;YAEhD,uBAAuB;YACvB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE;oBAC1C,OAAO,EAAE,IAAI;oBACb,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI;iBAC3B,CAAC,CAAC;gBACH,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACvC,IAAI,MAAM,CAAC,MAAM;gBAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAc,EAAE,OAAuB;IACzE,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;QACjB,OAAO,SAAS,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,sDAAsD;IACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE9F,MAAM,OAAO,GAAG,aAAa,CAAC,2BAA2B,CAAC,CAAC;IAC3D,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,IAAI,YAAoB,CAAC;QACzB,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACpC,YAAY,GAAG,kBAAkB,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACpE,YAAY,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,uBAAuB;QACvB,IAAI,aAAa,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE;gBAC1C,OAAO,EAAE,IAAI;gBACb,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI;aAC3B,CAAC,CAAC;YACH,aAAa,GAAG,SAAS,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,aAAa,GAAG,eAAe,CAAC;QAClC,CAAC;QAED,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAEpC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,CAAC,OAAO,CAAC,0BAA0B,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;YAC3D,MAAM,CAAC,OAAO,CAAC,4DAA4D,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC;YAExE,sEAAsE;YACtE,IAAI,OAAO,EAAE,SAAS,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBACrD,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
@@ -1,2 +1,6 @@
1
- export declare function updateCommand(query?: string): Promise<void>;
1
+ interface UpdateOptions {
2
+ all?: boolean;
3
+ }
4
+ export declare function updateCommand(query?: string, options?: UpdateOptions): Promise<void>;
5
+ export {};
2
6
  //# sourceMappingURL=update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAQA,wBAAsB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DjE"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AASA,UAAU,aAAa;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AA4FD,wBAAsB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAoE1F"}
@@ -1,10 +1,92 @@
1
1
  import inquirer from "inquirer";
2
- import { resolveServer, promptApiToken } from "../utils/serverSelect.js";
2
+ import { getServers } from "../utils/config.js";
3
+ import { resolveServer, promptApiToken, collectProviderTokens } from "../utils/serverSelect.js";
3
4
  import { checkSshAvailable, sshExec } from "../utils/ssh.js";
4
5
  import { createProviderWithToken } from "../utils/providerFactory.js";
5
6
  import { logger, createSpinner } from "../utils/logger.js";
6
7
  const COOLIFY_UPDATE_CMD = "curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash";
7
- export async function updateCommand(query) {
8
+ async function updateSingleServer(serverName, serverIp, serverId, provider, apiToken) {
9
+ const spinner = createSpinner(`Validating ${serverName}...`);
10
+ spinner.start();
11
+ if (serverId.startsWith("manual-")) {
12
+ spinner.succeed(`${serverName}: Manually added server — skipping API check`);
13
+ }
14
+ else {
15
+ try {
16
+ const providerInstance = createProviderWithToken(provider, apiToken);
17
+ const status = await providerInstance.getServerStatus(serverId);
18
+ if (status !== "running") {
19
+ spinner.fail(`${serverName}: Server is not running (status: ${status})`);
20
+ return false;
21
+ }
22
+ spinner.succeed(`${serverName}: Server verified`);
23
+ }
24
+ catch (error) {
25
+ spinner.fail(`${serverName}: Failed to verify server`);
26
+ logger.error(error instanceof Error ? error.message : String(error));
27
+ return false;
28
+ }
29
+ }
30
+ logger.info(`Updating Coolify on ${serverName} (${serverIp})...`);
31
+ const result = await sshExec(serverIp, COOLIFY_UPDATE_CMD);
32
+ if (result.stdout)
33
+ console.log(result.stdout);
34
+ if (result.stderr)
35
+ console.error(result.stderr);
36
+ if (result.code === 0) {
37
+ logger.success(`${serverName}: Coolify update completed!`);
38
+ return true;
39
+ }
40
+ else {
41
+ logger.error(`${serverName}: Update failed with exit code ${result.code}`);
42
+ return false;
43
+ }
44
+ }
45
+ async function updateAll() {
46
+ if (!checkSshAvailable()) {
47
+ logger.error("SSH client not found. Required for Coolify update.");
48
+ return;
49
+ }
50
+ const servers = getServers();
51
+ if (servers.length === 0) {
52
+ logger.info("No servers found. Deploy one with: quicklify init");
53
+ return;
54
+ }
55
+ const { confirm } = await inquirer.prompt([
56
+ {
57
+ type: "confirm",
58
+ name: "confirm",
59
+ message: `Update Coolify on all ${servers.length} server(s)? This may cause brief downtime.`,
60
+ default: false,
61
+ },
62
+ ]);
63
+ if (!confirm) {
64
+ logger.info("Update cancelled.");
65
+ return;
66
+ }
67
+ const tokenMap = await collectProviderTokens(servers);
68
+ let succeeded = 0;
69
+ let failed = 0;
70
+ for (const server of servers) {
71
+ const token = tokenMap.get(server.provider);
72
+ const ok = await updateSingleServer(server.name, server.ip, server.id, server.provider, token);
73
+ if (ok)
74
+ succeeded++;
75
+ else
76
+ failed++;
77
+ console.log();
78
+ }
79
+ if (failed === 0) {
80
+ logger.success(`All ${succeeded} server(s) updated successfully!`);
81
+ }
82
+ else {
83
+ logger.warning(`${succeeded} succeeded, ${failed} failed`);
84
+ }
85
+ }
86
+ export async function updateCommand(query, options) {
87
+ if (options?.all) {
88
+ return updateAll();
89
+ }
8
90
  if (!checkSshAvailable()) {
9
91
  logger.error("SSH client not found. Required for Coolify update.");
10
92
  logger.info("Windows: Settings > Apps > Optional Features > OpenSSH Client");
@@ -26,22 +108,27 @@ export async function updateCommand(query) {
26
108
  logger.info("Update cancelled.");
27
109
  return;
28
110
  }
29
- const apiToken = await promptApiToken(server.provider);
111
+ const apiToken = server.id.startsWith("manual-") ? "" : await promptApiToken(server.provider);
30
112
  const spinner = createSpinner("Validating access...");
31
113
  spinner.start();
32
- try {
33
- const provider = createProviderWithToken(server.provider, apiToken);
34
- const status = await provider.getServerStatus(server.id);
35
- if (status !== "running") {
36
- spinner.fail(`Server is not running (status: ${status})`);
114
+ if (server.id.startsWith("manual-")) {
115
+ spinner.succeed("Manually added server — skipping API check");
116
+ }
117
+ else {
118
+ try {
119
+ const provider = createProviderWithToken(server.provider, apiToken);
120
+ const status = await provider.getServerStatus(server.id);
121
+ if (status !== "running") {
122
+ spinner.fail(`Server is not running (status: ${status})`);
123
+ return;
124
+ }
125
+ spinner.succeed("Server verified");
126
+ }
127
+ catch (error) {
128
+ spinner.fail("Failed to verify server");
129
+ logger.error(error instanceof Error ? error.message : String(error));
37
130
  return;
38
131
  }
39
- spinner.succeed("Server verified");
40
- }
41
- catch (error) {
42
- spinner.fail("Failed to verify server");
43
- logger.error(error instanceof Error ? error.message : String(error));
44
- return;
45
132
  }
46
133
  logger.info("Running Coolify update script...");
47
134
  logger.info("This may take several minutes. Please wait.");
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -21,6 +21,10 @@ import { secureCommand } from "./commands/secure.js";
21
21
  import { backupCommand } from "./commands/backup.js";
22
22
  import { restoreCommand } from "./commands/restore.js";
23
23
  import { exportCommand, importCommand } from "./commands/transfer.js";
24
+ import { addCommand } from "./commands/add.js";
25
+ import { removeCommand } from "./commands/remove.js";
26
+ import { maintainCommand } from "./commands/maintain.js";
27
+ import { snapshotCommand } from "./commands/snapshot.js";
24
28
  const __filename = fileURLToPath(import.meta.url);
25
29
  const __dirname = dirname(__filename);
26
30
  const pkg = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf-8"));
@@ -32,8 +36,8 @@ program
32
36
  program
33
37
  .command("init")
34
38
  .description("Deploy a new Coolify instance on a cloud provider")
35
- .option("--provider <provider>", "Cloud provider (hetzner, digitalocean)")
36
- .option("--token <token>", "API token (or set HETZNER_TOKEN / DIGITALOCEAN_TOKEN env var)")
39
+ .option("--provider <provider>", "Cloud provider (hetzner, digitalocean, vultr, linode)")
40
+ .option("--token <token>", "API token (or set HETZNER_TOKEN / DIGITALOCEAN_TOKEN / VULTR_TOKEN / LINODE_TOKEN env var)")
37
41
  .option("--region <region>", "Server region")
38
42
  .option("--size <size>", "Server size")
39
43
  .option("--name <name>", "Server name")
@@ -45,7 +49,9 @@ program.command("list").description("List all registered servers").action(listCo
45
49
  program
46
50
  .command("status [query]")
47
51
  .description("Check server and Coolify status")
48
- .action(statusCommand);
52
+ .option("--all", "Check status of all servers")
53
+ .option("--autostart", "Restart Coolify if server is running but Coolify is down")
54
+ .action((query, options) => statusCommand(query, options));
49
55
  program
50
56
  .command("destroy [query]")
51
57
  .description("Destroy a registered server")
@@ -62,7 +68,8 @@ program
62
68
  program
63
69
  .command("update [query]")
64
70
  .description("Update Coolify on a registered server")
65
- .action(updateCommand);
71
+ .option("--all", "Update Coolify on all servers")
72
+ .action((query, options) => updateCommand(query, options));
66
73
  program
67
74
  .command("restart [query]")
68
75
  .description("Restart a registered server")
@@ -112,6 +119,7 @@ program
112
119
  .command("backup [query]")
113
120
  .description("Backup Coolify database and config files")
114
121
  .option("--dry-run", "Show commands without executing")
122
+ .option("--all", "Backup all servers")
115
123
  .action((query, options) => backupCommand(query, options));
116
124
  program
117
125
  .command("restore [query]")
@@ -127,5 +135,31 @@ program
127
135
  .command("import <path>")
128
136
  .description("Import servers from a JSON file")
129
137
  .action((path) => importCommand(path));
138
+ program
139
+ .command("add")
140
+ .description("Add an existing Coolify server to Quicklify management")
141
+ .option("--provider <provider>", "Cloud provider (hetzner, digitalocean, vultr, linode)")
142
+ .option("--ip <ip>", "Server IP address")
143
+ .option("--name <name>", "Server name")
144
+ .option("--skip-verify", "Skip Coolify installation verification")
145
+ .action((options) => addCommand(options));
146
+ program
147
+ .command("remove [query]")
148
+ .description("Remove a server from local config (does not destroy the cloud server)")
149
+ .action(removeCommand);
150
+ program
151
+ .command("maintain [query]")
152
+ .description("Run full maintenance cycle (status, update, health, reboot)")
153
+ .option("--skip-reboot", "Skip the reboot step")
154
+ .option("--all", "Maintain all servers sequentially")
155
+ .option("--dry-run", "Show steps without executing")
156
+ .action((query, options) => maintainCommand(query, options));
157
+ program
158
+ .command("snapshot [subcommand] [query]")
159
+ .description("Manage server snapshots (create, list, delete)")
160
+ .option("--all", "List snapshots across all servers")
161
+ .option("--dry-run", "Show what would happen without executing")
162
+ .option("--force", "Skip confirmation prompts")
163
+ .action((subcommand, query, options) => snapshotCommand(subcommand, query, options));
130
164
  program.parse();
131
165
  //# sourceMappingURL=index.js.map