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,291 @@
1
+ import crypto from "crypto";
2
+ import axios from "axios";
3
+ export class LinodeProvider {
4
+ name = "linode";
5
+ displayName = "Linode (Akamai)";
6
+ apiToken;
7
+ baseUrl = "https://api.linode.com/v4";
8
+ constructor(apiToken) {
9
+ this.apiToken = apiToken;
10
+ }
11
+ async validateToken(token) {
12
+ try {
13
+ await axios.get(`${this.baseUrl}/profile`, {
14
+ headers: { Authorization: `Bearer ${token}` },
15
+ });
16
+ return true;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ async uploadSshKey(name, publicKey) {
23
+ try {
24
+ const response = await axios.post(`${this.baseUrl}/profile/sshkeys`, { label: name, ssh_key: publicKey }, {
25
+ headers: {
26
+ Authorization: `Bearer ${this.apiToken}`,
27
+ "Content-Type": "application/json",
28
+ },
29
+ });
30
+ return response.data.id.toString();
31
+ }
32
+ catch (error) {
33
+ // Key already exists → find by matching public key
34
+ if (axios.isAxiosError(error) && error.response?.status === 400) {
35
+ const listResponse = await axios.get(`${this.baseUrl}/profile/sshkeys`, {
36
+ headers: { Authorization: `Bearer ${this.apiToken}` },
37
+ });
38
+ const existing = listResponse.data.data.find((k) => k.ssh_key.trim() === publicKey.trim());
39
+ if (existing)
40
+ return existing.id.toString();
41
+ }
42
+ throw new Error(`Failed to upload SSH key: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
43
+ }
44
+ }
45
+ async createServer(config) {
46
+ try {
47
+ // Ensure all character classes for Linode password strength: upper + lower + digit + special
48
+ const rootPass = `Ql1!${crypto.randomBytes(21).toString("base64").slice(0, 28)}`;
49
+ const body = {
50
+ label: config.name,
51
+ type: config.size,
52
+ region: config.region,
53
+ image: "linode/ubuntu22.04",
54
+ root_pass: rootPass,
55
+ metadata: { user_data: Buffer.from(config.cloudInit).toString("base64") },
56
+ };
57
+ if (config.sshKeyIds?.length) {
58
+ // Linode uses authorized_users (profile usernames) to inject SSH keys.
59
+ // Fetch profile username; if it fails, cloud-init handles SSH key injection as fallback.
60
+ try {
61
+ const profileRes = await axios.get(`${this.baseUrl}/profile`, {
62
+ headers: { Authorization: `Bearer ${this.apiToken}` },
63
+ });
64
+ const username = profileRes.data?.username;
65
+ if (typeof username === "string" && username.length > 0) {
66
+ body.authorized_users = [username];
67
+ }
68
+ }
69
+ catch {
70
+ // Profile fetch failed; cloud-init will handle SSH key setup
71
+ }
72
+ }
73
+ const response = await axios.post(`${this.baseUrl}/linode/instances`, body, {
74
+ headers: {
75
+ Authorization: `Bearer ${this.apiToken}`,
76
+ "Content-Type": "application/json",
77
+ },
78
+ });
79
+ const instance = response.data;
80
+ return {
81
+ id: instance.id.toString(),
82
+ ip: instance.ipv4?.[0] || "pending",
83
+ status: instance.status === "provisioning" ? "initializing" : instance.status,
84
+ };
85
+ }
86
+ catch (error) {
87
+ if (axios.isAxiosError(error)) {
88
+ const reasons = error.response?.data?.errors?.map((e) => e.reason).join(", ");
89
+ throw new Error(`Failed to create server: ${reasons || error.message}`, { cause: error });
90
+ }
91
+ throw new Error(`Failed to create server: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
92
+ }
93
+ }
94
+ async getServerDetails(serverId) {
95
+ const response = await axios.get(`${this.baseUrl}/linode/instances/${serverId}`, {
96
+ headers: { Authorization: `Bearer ${this.apiToken}` },
97
+ });
98
+ const instance = response.data;
99
+ return {
100
+ id: instance.id.toString(),
101
+ ip: instance.ipv4?.[0] || "pending",
102
+ status: instance.status === "running" ? "running" : instance.status,
103
+ };
104
+ }
105
+ async getServerStatus(serverId) {
106
+ try {
107
+ const response = await axios.get(`${this.baseUrl}/linode/instances/${serverId}`, {
108
+ headers: { Authorization: `Bearer ${this.apiToken}` },
109
+ });
110
+ return response.data.status;
111
+ }
112
+ catch (error) {
113
+ throw new Error(`Failed to get server status: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
114
+ }
115
+ }
116
+ async destroyServer(serverId) {
117
+ try {
118
+ await axios.delete(`${this.baseUrl}/linode/instances/${serverId}`, {
119
+ headers: { Authorization: `Bearer ${this.apiToken}` },
120
+ });
121
+ }
122
+ catch (error) {
123
+ if (axios.isAxiosError(error)) {
124
+ const reasons = error.response?.data?.errors?.map((e) => e.reason).join(", ");
125
+ throw new Error(`Failed to destroy server: ${reasons || error.message}`, { cause: error });
126
+ }
127
+ throw new Error(`Failed to destroy server: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
128
+ }
129
+ }
130
+ async rebootServer(serverId) {
131
+ try {
132
+ await axios.post(`${this.baseUrl}/linode/instances/${serverId}/reboot`, {}, {
133
+ headers: {
134
+ Authorization: `Bearer ${this.apiToken}`,
135
+ "Content-Type": "application/json",
136
+ },
137
+ });
138
+ }
139
+ catch (error) {
140
+ if (axios.isAxiosError(error)) {
141
+ const reasons = error.response?.data?.errors?.map((e) => e.reason).join(", ");
142
+ throw new Error(`Failed to reboot server: ${reasons || error.message}`, { cause: error });
143
+ }
144
+ throw new Error(`Failed to reboot server: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
145
+ }
146
+ }
147
+ getRegions() {
148
+ return [
149
+ { id: "us-east", name: "Newark, NJ", location: "USA" },
150
+ { id: "eu-west", name: "London", location: "UK" },
151
+ { id: "eu-central", name: "Frankfurt", location: "Germany" },
152
+ { id: "ap-south", name: "Singapore", location: "Singapore" },
153
+ ];
154
+ }
155
+ getServerSizes() {
156
+ return [
157
+ { id: "g6-standard-2", name: "Linode 4GB", vcpu: 2, ram: 4, disk: 80, price: "$12/mo" },
158
+ { id: "g6-standard-4", name: "Linode 8GB", vcpu: 4, ram: 8, disk: 160, price: "$24/mo" },
159
+ { id: "g6-standard-6", name: "Linode 16GB", vcpu: 6, ram: 16, disk: 320, price: "$48/mo" },
160
+ ];
161
+ }
162
+ async getAvailableLocations() {
163
+ try {
164
+ const response = await axios.get(`${this.baseUrl}/regions`, {
165
+ headers: { Authorization: `Bearer ${this.apiToken}` },
166
+ });
167
+ return response.data.data
168
+ .filter((r) => r.status === "ok" && r.capabilities.includes("Linodes"))
169
+ .map((r) => ({
170
+ id: r.id,
171
+ name: r.label,
172
+ location: r.country,
173
+ }));
174
+ }
175
+ catch {
176
+ return this.getRegions();
177
+ }
178
+ }
179
+ async getAvailableServerTypes(_location) {
180
+ try {
181
+ const response = await axios.get(`${this.baseUrl}/linode/types`, {
182
+ headers: { Authorization: `Bearer ${this.apiToken}` },
183
+ });
184
+ const MIN_RAM_MB = 4096; // Coolify requires at least 2GB, recommend 4GB
185
+ const types = response.data.data.filter((t) => t.memory >= MIN_RAM_MB && t.id.startsWith("g6-standard"));
186
+ if (types.length === 0) {
187
+ return this.getServerSizes();
188
+ }
189
+ return types.map((t) => ({
190
+ id: t.id,
191
+ name: t.label,
192
+ vcpu: t.vcpus,
193
+ ram: Math.round(t.memory / 1024),
194
+ disk: Math.round(t.disk / 1024),
195
+ price: `$${t.price.monthly.toFixed(2)}/mo`,
196
+ }));
197
+ }
198
+ catch {
199
+ return this.getServerSizes();
200
+ }
201
+ }
202
+ async createSnapshot(serverId, name) {
203
+ try {
204
+ // Get the first disk to create image from
205
+ const disksResponse = await axios.get(`${this.baseUrl}/linode/instances/${serverId}/disks`, { headers: { Authorization: `Bearer ${this.apiToken}` } });
206
+ const disks = disksResponse.data.data;
207
+ if (!disks || disks.length === 0) {
208
+ throw new Error("No disks found on this instance");
209
+ }
210
+ // Use the largest disk
211
+ const disk = disks.sort((a, b) => b.size - a.size)[0];
212
+ const response = await axios.post(`${this.baseUrl}/images`, { disk_id: disk.id, label: name }, {
213
+ headers: {
214
+ Authorization: `Bearer ${this.apiToken}`,
215
+ "Content-Type": "application/json",
216
+ },
217
+ });
218
+ const image = response.data;
219
+ return {
220
+ id: image.id,
221
+ serverId,
222
+ name: image.label || name,
223
+ status: image.status,
224
+ sizeGb: image.size ? image.size / 1024 : 0,
225
+ createdAt: image.created,
226
+ costPerMonth: `$${(image.size ? (image.size / 1024) * 0.004 : 0).toFixed(2)}/mo`,
227
+ };
228
+ }
229
+ catch (error) {
230
+ if (axios.isAxiosError(error)) {
231
+ const reasons = error.response?.data?.errors?.map((e) => e.reason).join(", ");
232
+ throw new Error(`Failed to create snapshot: ${reasons || error.message}`, { cause: error });
233
+ }
234
+ throw new Error(`Failed to create snapshot: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
235
+ }
236
+ }
237
+ async listSnapshots(serverId) {
238
+ try {
239
+ const response = await axios.get(`${this.baseUrl}/images?page=1&page_size=100`, { headers: { Authorization: `Bearer ${this.apiToken}` } });
240
+ const images = response.data.data.filter((img) => img.type === "manual" && img.label && img.label.startsWith("quicklify-"));
241
+ return images.map((img) => ({
242
+ id: img.id,
243
+ serverId,
244
+ name: img.label || "",
245
+ status: img.status,
246
+ sizeGb: img.size ? img.size / 1024 : 0,
247
+ createdAt: img.created,
248
+ costPerMonth: `$${(img.size ? (img.size / 1024) * 0.004 : 0).toFixed(2)}/mo`,
249
+ }));
250
+ }
251
+ catch (error) {
252
+ if (axios.isAxiosError(error)) {
253
+ const reasons = error.response?.data?.errors?.map((e) => e.reason).join(", ");
254
+ throw new Error(`Failed to list snapshots: ${reasons || error.message}`, { cause: error });
255
+ }
256
+ throw new Error(`Failed to list snapshots: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
257
+ }
258
+ }
259
+ async deleteSnapshot(snapshotId) {
260
+ try {
261
+ await axios.delete(`${this.baseUrl}/images/${snapshotId}`, {
262
+ headers: { Authorization: `Bearer ${this.apiToken}` },
263
+ });
264
+ }
265
+ catch (error) {
266
+ if (axios.isAxiosError(error)) {
267
+ const reasons = error.response?.data?.errors?.map((e) => e.reason).join(", ");
268
+ throw new Error(`Failed to delete snapshot: ${reasons || error.message}`, { cause: error });
269
+ }
270
+ throw new Error(`Failed to delete snapshot: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
271
+ }
272
+ }
273
+ async getSnapshotCostEstimate(serverId) {
274
+ try {
275
+ const response = await axios.get(`${this.baseUrl}/linode/instances/${serverId}`, {
276
+ headers: { Authorization: `Bearer ${this.apiToken}` },
277
+ });
278
+ const diskMb = response.data.specs?.disk || response.data.disk || 0;
279
+ const diskGb = diskMb / 1024;
280
+ return `$${(diskGb * 0.004).toFixed(2)}/mo`;
281
+ }
282
+ catch (error) {
283
+ if (axios.isAxiosError(error)) {
284
+ const reasons = error.response?.data?.errors?.map((e) => e.reason).join(", ");
285
+ throw new Error(`Failed to get snapshot cost: ${reasons || error.message}`, { cause: error });
286
+ }
287
+ throw new Error(`Failed to get snapshot cost: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
288
+ }
289
+ }
290
+ }
291
+ //# sourceMappingURL=linode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linode.js","sourceRoot":"","sources":["../../src/providers/linode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { CloudProvider } from "./base.js";
2
+ import type { Region, ServerSize, ServerConfig, ServerResult, SnapshotInfo } from "../types/index.js";
3
+ export declare class VultrProvider implements CloudProvider {
4
+ name: string;
5
+ displayName: string;
6
+ private apiToken;
7
+ private baseUrl;
8
+ constructor(apiToken: string);
9
+ validateToken(token: string): Promise<boolean>;
10
+ uploadSshKey(name: string, publicKey: string): Promise<string>;
11
+ createServer(config: ServerConfig): Promise<ServerResult>;
12
+ getServerDetails(serverId: string): Promise<ServerResult>;
13
+ getServerStatus(serverId: string): Promise<string>;
14
+ destroyServer(serverId: string): Promise<void>;
15
+ rebootServer(serverId: string): Promise<void>;
16
+ getRegions(): Region[];
17
+ getServerSizes(): ServerSize[];
18
+ getAvailableLocations(): Promise<Region[]>;
19
+ getAvailableServerTypes(location: string): Promise<ServerSize[]>;
20
+ createSnapshot(serverId: string, name: string): Promise<SnapshotInfo>;
21
+ listSnapshots(serverId: string): Promise<SnapshotInfo[]>;
22
+ deleteSnapshot(snapshotId: string): Promise<void>;
23
+ getSnapshotCostEstimate(serverId: string): Promise<string>;
24
+ }
25
+ //# sourceMappingURL=vultr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vultr.d.ts","sourceRoot":"","sources":["../../src/providers/vultr.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,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuBtG,qBAAa,aAAc,YAAW,aAAa;IACjD,IAAI,SAAW;IACf,WAAW,SAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAA8B;gBAEjC,QAAQ,EAAE,MAAM;IAItB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW9C,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+B9D,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAuCzD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAYzD,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAclD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9C,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BnD,UAAU,IAAI,MAAM,EAAE;IAStB,cAAc,IAAI,UAAU,EAAE;IAQxB,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAiB1C,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA4BhE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAoCrE,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAiCxD,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBjD,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAoBjE"}
@@ -0,0 +1,262 @@
1
+ import axios from "axios";
2
+ export class VultrProvider {
3
+ name = "vultr";
4
+ displayName = "Vultr";
5
+ apiToken;
6
+ baseUrl = "https://api.vultr.com/v2";
7
+ constructor(apiToken) {
8
+ this.apiToken = apiToken;
9
+ }
10
+ async validateToken(token) {
11
+ try {
12
+ await axios.get(`${this.baseUrl}/account`, {
13
+ headers: { Authorization: `Bearer ${token}` },
14
+ });
15
+ return true;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ async uploadSshKey(name, publicKey) {
22
+ try {
23
+ const response = await axios.post(`${this.baseUrl}/ssh-keys`, { name, ssh_key: publicKey }, {
24
+ headers: {
25
+ Authorization: `Bearer ${this.apiToken}`,
26
+ "Content-Type": "application/json",
27
+ },
28
+ });
29
+ return response.data.ssh_key.id;
30
+ }
31
+ catch (error) {
32
+ // Key already exists -> find by matching public key
33
+ if (axios.isAxiosError(error) && error.response?.status === 409) {
34
+ const listResponse = await axios.get(`${this.baseUrl}/ssh-keys`, {
35
+ headers: { Authorization: `Bearer ${this.apiToken}` },
36
+ });
37
+ const existing = listResponse.data.ssh_keys.find((k) => k.ssh_key.trim() === publicKey.trim());
38
+ if (existing)
39
+ return existing.id;
40
+ }
41
+ throw new Error(`Failed to upload SSH key: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
42
+ }
43
+ }
44
+ async createServer(config) {
45
+ try {
46
+ const body = {
47
+ label: config.name,
48
+ plan: config.size,
49
+ region: config.region,
50
+ os_id: 2284, // Ubuntu 24.04
51
+ user_data: Buffer.from(config.cloudInit).toString("base64"),
52
+ };
53
+ if (config.sshKeyIds?.length) {
54
+ body.sshkey_id = config.sshKeyIds;
55
+ }
56
+ const response = await axios.post(`${this.baseUrl}/instances`, body, {
57
+ headers: {
58
+ Authorization: `Bearer ${this.apiToken}`,
59
+ "Content-Type": "application/json",
60
+ },
61
+ });
62
+ const instance = response.data.instance;
63
+ return {
64
+ id: instance.id,
65
+ ip: instance.main_ip || "pending",
66
+ status: instance.power_status,
67
+ };
68
+ }
69
+ catch (error) {
70
+ if (axios.isAxiosError(error)) {
71
+ throw new Error(`Failed to create server: ${error.response?.data?.error || error.message}`, { cause: error });
72
+ }
73
+ throw new Error(`Failed to create server: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
74
+ }
75
+ }
76
+ async getServerDetails(serverId) {
77
+ const response = await axios.get(`${this.baseUrl}/instances/${serverId}`, {
78
+ headers: { Authorization: `Bearer ${this.apiToken}` },
79
+ });
80
+ const instance = response.data.instance;
81
+ return {
82
+ id: instance.id,
83
+ ip: instance.main_ip,
84
+ status: instance.power_status === "running" ? "running" : instance.power_status,
85
+ };
86
+ }
87
+ async getServerStatus(serverId) {
88
+ try {
89
+ const response = await axios.get(`${this.baseUrl}/instances/${serverId}`, {
90
+ headers: { Authorization: `Bearer ${this.apiToken}` },
91
+ });
92
+ return response.data.instance.power_status;
93
+ }
94
+ catch (error) {
95
+ throw new Error(`Failed to get server status: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
96
+ }
97
+ }
98
+ async destroyServer(serverId) {
99
+ try {
100
+ await axios.delete(`${this.baseUrl}/instances/${serverId}`, {
101
+ headers: { Authorization: `Bearer ${this.apiToken}` },
102
+ });
103
+ }
104
+ catch (error) {
105
+ if (axios.isAxiosError(error)) {
106
+ throw new Error(`Failed to destroy server: ${error.response?.data?.error || error.message}`, { cause: error });
107
+ }
108
+ throw new Error(`Failed to destroy server: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
109
+ }
110
+ }
111
+ async rebootServer(serverId) {
112
+ try {
113
+ await axios.post(`${this.baseUrl}/instances/${serverId}/reboot`, {}, {
114
+ headers: {
115
+ Authorization: `Bearer ${this.apiToken}`,
116
+ "Content-Type": "application/json",
117
+ },
118
+ });
119
+ }
120
+ catch (error) {
121
+ if (axios.isAxiosError(error)) {
122
+ throw new Error(`Failed to reboot server: ${error.response?.data?.error || error.message}`, { cause: error });
123
+ }
124
+ throw new Error(`Failed to reboot server: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
125
+ }
126
+ }
127
+ getRegions() {
128
+ return [
129
+ { id: "ewr", name: "New Jersey", location: "USA" },
130
+ { id: "ord", name: "Chicago", location: "USA" },
131
+ { id: "ams", name: "Amsterdam", location: "Netherlands" },
132
+ { id: "fra", name: "Frankfurt", location: "Germany" },
133
+ ];
134
+ }
135
+ getServerSizes() {
136
+ return [
137
+ { id: "vc2-1c-2gb", name: "VC2-1C-2GB", vcpu: 1, ram: 2, disk: 55, price: "$10/mo" },
138
+ { id: "vc2-2c-4gb", name: "VC2-2C-4GB", vcpu: 2, ram: 4, disk: 80, price: "$20/mo" },
139
+ { id: "vc2-4c-8gb", name: "VC2-4C-8GB", vcpu: 4, ram: 8, disk: 160, price: "$40/mo" },
140
+ ];
141
+ }
142
+ async getAvailableLocations() {
143
+ try {
144
+ const response = await axios.get(`${this.baseUrl}/regions`, {
145
+ headers: { Authorization: `Bearer ${this.apiToken}` },
146
+ });
147
+ return response.data.regions
148
+ .filter((r) => r.options && r.options.length > 0)
149
+ .map((r) => ({
150
+ id: r.id,
151
+ name: r.city,
152
+ location: r.country,
153
+ }));
154
+ }
155
+ catch {
156
+ return this.getRegions();
157
+ }
158
+ }
159
+ async getAvailableServerTypes(location) {
160
+ try {
161
+ const response = await axios.get(`${this.baseUrl}/plans`, {
162
+ headers: { Authorization: `Bearer ${this.apiToken}` },
163
+ });
164
+ const MIN_RAM_MB = 2048; // Coolify requires at least 2GB RAM
165
+ const plans = response.data.plans.filter((p) => p.type === "vc2" && p.ram >= MIN_RAM_MB && p.locations.includes(location));
166
+ if (plans.length === 0) {
167
+ return this.getServerSizes();
168
+ }
169
+ return plans.map((p) => ({
170
+ id: p.id,
171
+ name: p.id.toUpperCase(),
172
+ vcpu: p.vcpu_count,
173
+ ram: p.ram / 1024,
174
+ disk: p.disk,
175
+ price: `$${p.monthly_cost.toFixed(2)}/mo`,
176
+ }));
177
+ }
178
+ catch {
179
+ return this.getServerSizes();
180
+ }
181
+ }
182
+ async createSnapshot(serverId, name) {
183
+ try {
184
+ const response = await axios.post(`${this.baseUrl}/snapshots`, { instance_id: serverId, description: name }, {
185
+ headers: {
186
+ Authorization: `Bearer ${this.apiToken}`,
187
+ "Content-Type": "application/json",
188
+ },
189
+ });
190
+ const snap = response.data.snapshot;
191
+ return {
192
+ id: snap.id,
193
+ serverId,
194
+ name: snap.description || name,
195
+ status: snap.status,
196
+ sizeGb: snap.size ? snap.size / (1024 * 1024 * 1024) : 0,
197
+ createdAt: snap.date_created,
198
+ costPerMonth: `$${(snap.size ? (snap.size / (1024 * 1024 * 1024)) * 0.05 : 0).toFixed(2)}/mo`,
199
+ };
200
+ }
201
+ catch (error) {
202
+ if (axios.isAxiosError(error)) {
203
+ throw new Error(`Failed to create snapshot: ${error.response?.data?.error || error.message}`, { cause: error });
204
+ }
205
+ throw new Error(`Failed to create snapshot: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
206
+ }
207
+ }
208
+ async listSnapshots(serverId) {
209
+ try {
210
+ // Vultr API does not return instance_id in snapshot list,
211
+ // so we return all account snapshots (they are account-wide, not per-instance).
212
+ const response = await axios.get(`${this.baseUrl}/snapshots`, {
213
+ headers: { Authorization: `Bearer ${this.apiToken}` },
214
+ });
215
+ const snapshots = response.data.snapshots || [];
216
+ return snapshots.map((s) => ({
217
+ id: s.id,
218
+ serverId,
219
+ name: s.description || "",
220
+ status: s.status,
221
+ sizeGb: s.size ? s.size / (1024 * 1024 * 1024) : 0,
222
+ createdAt: s.date_created,
223
+ costPerMonth: `$${(s.size ? (s.size / (1024 * 1024 * 1024)) * 0.05 : 0).toFixed(2)}/mo`,
224
+ }));
225
+ }
226
+ catch (error) {
227
+ if (axios.isAxiosError(error)) {
228
+ throw new Error(`Failed to list snapshots: ${error.response?.data?.error || error.message}`, { cause: error });
229
+ }
230
+ throw new Error(`Failed to list snapshots: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
231
+ }
232
+ }
233
+ async deleteSnapshot(snapshotId) {
234
+ try {
235
+ await axios.delete(`${this.baseUrl}/snapshots/${snapshotId}`, {
236
+ headers: { Authorization: `Bearer ${this.apiToken}` },
237
+ });
238
+ }
239
+ catch (error) {
240
+ if (axios.isAxiosError(error)) {
241
+ throw new Error(`Failed to delete snapshot: ${error.response?.data?.error || error.message}`, { cause: error });
242
+ }
243
+ throw new Error(`Failed to delete snapshot: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
244
+ }
245
+ }
246
+ async getSnapshotCostEstimate(serverId) {
247
+ try {
248
+ const response = await axios.get(`${this.baseUrl}/instances/${serverId}`, {
249
+ headers: { Authorization: `Bearer ${this.apiToken}` },
250
+ });
251
+ const diskGb = response.data.instance?.disk || 0;
252
+ return `$${(diskGb * 0.05).toFixed(2)}/mo`;
253
+ }
254
+ catch (error) {
255
+ if (axios.isAxiosError(error)) {
256
+ throw new Error(`Failed to get snapshot cost: ${error.response?.data?.error || error.message}`, { cause: error });
257
+ }
258
+ throw new Error(`Failed to get snapshot cost: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
259
+ }
260
+ }
261
+ }
262
+ //# sourceMappingURL=vultr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vultr.js","sourceRoot":"","sources":["../../src/providers/vultr.ts"],"names":[],"mappings":"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"}
@@ -100,6 +100,15 @@ export interface SecureAuditResult {
100
100
  };
101
101
  sshPort: number;
102
102
  }
103
+ export interface SnapshotInfo {
104
+ id: string;
105
+ serverId: string;
106
+ name: string;
107
+ status: string;
108
+ sizeGb: number;
109
+ createdAt: string;
110
+ costPerMonth: string;
111
+ }
103
112
  export interface BackupManifest {
104
113
  serverName: string;
105
114
  serverIp: string;