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.
- package/README.md +83 -46
- package/SECURITY.md +17 -3
- package/dist/commands/destroy.d.ts +2 -0
- package/dist/commands/destroy.d.ts.map +1 -0
- package/dist/commands/destroy.js +95 -0
- package/dist/commands/destroy.js.map +1 -0
- package/dist/commands/init.d.ts +2 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +164 -96
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +22 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +89 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/base.d.ts +1 -0
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/digitalocean.d.ts +1 -0
- package/dist/providers/digitalocean.d.ts.map +1 -1
- package/dist/providers/digitalocean.js +13 -0
- package/dist/providers/digitalocean.js.map +1 -1
- package/dist/providers/hetzner.d.ts +1 -0
- package/dist/providers/hetzner.d.ts.map +1 -1
- package/dist/providers/hetzner.js +13 -0
- package/dist/providers/hetzner.js.map +1 -1
- package/dist/types/index.d.ts +16 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/cloudInit.d.ts.map +1 -1
- package/dist/utils/cloudInit.js +2 -0
- package/dist/utils/cloudInit.js.map +1 -1
- package/dist/utils/config.d.ts +9 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +50 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/healthCheck.d.ts +2 -0
- package/dist/utils/healthCheck.d.ts.map +1 -0
- package/dist/utils/healthCheck.js +29 -0
- package/dist/utils/healthCheck.js.map +1 -0
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/prompts.js +5 -2
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/providerFactory.d.ts +4 -0
- package/dist/utils/providerFactory.d.ts.map +1 -0
- package/dist/utils/providerFactory.js +24 -0
- package/dist/utils/providerFactory.js.map +1 -0
- package/package.json +1 -1
package/dist/commands/init.js
CHANGED
|
@@ -1,100 +1,157 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
17
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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(
|
|
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
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
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:
|
|
109
|
-
region
|
|
110
|
-
size:
|
|
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 "${
|
|
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
|
-
|
|
182
|
+
serverName = newName;
|
|
126
183
|
retries++;
|
|
127
184
|
}
|
|
128
185
|
else if (errorMsg.includes("location disabled")) {
|
|
129
|
-
failedLocations.push(
|
|
130
|
-
logger.warning(`Location "${
|
|
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
|
-
|
|
139
|
-
const newSize = await getServerTypeConfig(providerWithToken,
|
|
195
|
+
region = newRegion;
|
|
196
|
+
const newSize = await getServerTypeConfig(providerWithToken, region);
|
|
140
197
|
if (newSize === BACK_SIGNAL)
|
|
141
|
-
continue;
|
|
142
|
-
|
|
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(
|
|
153
|
-
logger.warning(`Server type "${
|
|
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,
|
|
214
|
+
newSize = await getServerTypeConfig(providerWithToken, region, failedTypes);
|
|
158
215
|
}
|
|
159
|
-
|
|
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
|
-
//
|
|
255
|
+
// Health check polling instead of blind wait
|
|
199
256
|
const isDigitalOcean = providerChoice === "digitalocean";
|
|
200
|
-
const
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
215
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAuB,EAAE;IACzD,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC;IAExD,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAEtD,IAAI,cAAsB,CAAC;IAC3B,IAAI,QAAgB,CAAC;IACrB,IAAI,MAAc,CAAC;IACnB,IAAI,UAAkB,CAAC;IACvB,IAAI,UAAkB,CAAC;IAEvB,gCAAgC;IAChC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,qBAAqB,OAAO,CAAC,QAAQ,oCAAoC,CAAC,CAAC;YACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QACD,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;QACzC,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC;IACnC,CAAC;IACD,MAAM,QAAQ,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAE7C,8DAA8D;IAC9D,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC;IAC3B,CAAC;SAAM,IAAI,cAAc,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACrE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACvC,CAAC;SAAM,IAAI,cAAc,KAAK,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QAC/E,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC5C,CAAC;SAAM,IAAI,gBAAgB,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,CACV,iFAAiF,CAClF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACnD,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7B,CAAC;IAED,6BAA6B;IAC7B,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAC5E,MAAM,YAAY,GAAG,aAAa,CAAC,yBAAyB,CAAC,CAAC;IAC9D,YAAY,CAAC,KAAK,EAAE,CAAC;IAErB,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC1D,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QACD,OAAO;IACT,CAAC;IACD,YAAY,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAE5C,iBAAiB;IACjB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,oDAAoD;QACpD,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,MAAM,GAAG,EAAE,CAAC;QACZ,UAAU,GAAG,EAAE,CAAC;QAChB,UAAU,GAAG,EAAE,CAAC;QAEhB,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC;YAC9B,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,CAAC,CAAC,CAAC,CAAC;oBACP,MAAM,CAAC,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;oBACrD,IAAI,CAAC,KAAK,WAAW;wBAAE,MAAM;oBAC7B,MAAM,GAAG,CAAC,CAAC;oBACX,IAAI,GAAG,CAAC,CAAC;oBACT,MAAM;gBACR,CAAC;gBACD,KAAK,CAAC,CAAC,CAAC,CAAC;oBACP,MAAM,CAAC,GAAG,MAAM,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;oBAC/D,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC;wBACtB,IAAI,GAAG,CAAC,CAAC;wBACT,MAAM;oBACR,CAAC;oBACD,UAAU,GAAG,CAAC,CAAC;oBACf,IAAI,GAAG,CAAC,CAAC;oBACT,MAAM;gBACR,CAAC;gBACD,KAAK,CAAC,CAAC,CAAC,CAAC;oBACP,MAAM,CAAC,GAAG,MAAM,mBAAmB,EAAE,CAAC;oBACtC,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC;wBACtB,IAAI,GAAG,CAAC,CAAC;wBACT,MAAM;oBACR,CAAC;oBACD,UAAU,GAAG,CAAC,CAAC;oBACf,IAAI,GAAG,CAAC,CAAC;oBACT,MAAM;gBACR,CAAC;gBACD,KAAK,CAAC,CAAC,CAAC,CAAC;oBACP,MAAM,MAAM,GAAG;wBACb,QAAQ,EAAE,cAAc;wBACxB,QAAQ;wBACR,MAAM;wBACN,UAAU;wBACV,UAAU;qBACX,CAAC;oBACF,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;oBACrE,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;wBAC9B,IAAI,GAAG,CAAC,CAAC;wBACT,MAAM;oBACR,CAAC;oBACD,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;wBACvC,OAAO;oBACT,CAAC;oBACD,IAAI,GAAG,CAAC,CAAC;oBACT,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QAED,SAAS;QACT,OAAO,YAAY,CACjB,cAAc,EACd,iBAAiB,EACjB,MAAM,EACN,UAAU,EACV,UAAU,CACX,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,GAAG,WAAW,CAAC;QACpB,OAAO,CAAC,KAAK,WAAW,EAAE,CAAC;YACzB,CAAC,GAAG,MAAM,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QACD,UAAU,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,GAAG,WAAW,CAAC;QACpB,OAAO,CAAC,KAAK,WAAW,EAAE,CAAC;YACzB,CAAC,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAClC,CAAC;QACD,UAAU,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,YAAY,CACjB,cAAc,EACd,iBAAiB,EACjB,MAAM,EACN,UAAU,EACV,UAAU,CACX,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,cAAsB,EACtB,iBAAgC,EAChC,MAAc,EACd,UAAkB,EAClB,UAAkB;IAElB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAElD,IAAI,MAA8D,CAAC;QACnE,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,UAAU,GAAG,CAAC,CAAC;QACrB,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,OAAO,CAAC,MAAM,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;YACxC,MAAM,aAAa,GAAG,aAAa,CAAC,wBAAwB,CAAC,CAAC;YAC9D,aAAa,CAAC,KAAK,EAAE,CAAC;YAEtB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,iBAAiB,CAAC,YAAY,CAAC;oBAC5C,IAAI,EAAE,UAAU;oBAChB,MAAM;oBACN,IAAI,EAAE,UAAU;oBAChB,SAAS;iBACV,CAAC,CAAC;gBACH,aAAa,CAAC,OAAO,CAAC,uBAAuB,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,WAAoB,EAAE,CAAC;gBAC9B,aAAa,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;gBAC7C,MAAM,QAAQ,GAAG,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEzE,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC9D,MAAM,CAAC,OAAO,CAAC,gBAAgB,UAAU,qBAAqB,CAAC,CAAC;oBAChE,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;oBAC/C,IAAI,OAAO,GAAG,WAAW,CAAC;oBAC1B,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;wBAC/B,OAAO,GAAG,MAAM,mBAAmB,EAAE,CAAC;oBACxC,CAAC;oBACD,UAAU,GAAG,OAAO,CAAC;oBACrB,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBAClD,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC7B,MAAM,CAAC,OAAO,CAAC,aAAa,MAAM,yCAAyC,CAAC,CAAC;oBAC7E,MAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;oBACjE,IAAI,UAAU,GAAG,KAAK,CAAC;oBACvB,OAAO,CAAC,UAAU,EAAE,CAAC;wBACnB,IAAI,SAAS,GAAG,WAAW,CAAC;wBAC5B,OAAO,SAAS,KAAK,WAAW,EAAE,CAAC;4BACjC,SAAS,GAAG,MAAM,iBAAiB,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;wBAC1E,CAAC;wBACD,MAAM,GAAG,SAAS,CAAC;wBACnB,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;wBACrE,IAAI,OAAO,KAAK,WAAW;4BAAE,SAAS;wBACtC,UAAU,GAAG,OAAO,CAAC;wBACrB,UAAU,GAAG,IAAI,CAAC;oBACpB,CAAC;oBACD,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,IACL,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;oBAChC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC;oBAClC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;oBAC7B,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAChC,CAAC;oBACD,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;wBACzB,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;wBAC7B,MAAM,CAAC,OAAO,CAAC,gBAAgB,UAAU,qCAAqC,CAAC,CAAC;wBAChF,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;wBACtD,IAAI,OAAO,GAAG,WAAW,CAAC;wBAC1B,OAAO,OAAO,KAAK,WAAW,EAAE,CAAC;4BAC/B,OAAO,GAAG,MAAM,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;wBAC9E,CAAC;wBACD,UAAU,GAAG,OAAO,CAAC;wBACrB,OAAO,EAAE,CAAC;oBACZ,CAAC;yBAAM,CAAC;wBACN,MAAM,WAAW,CAAC;oBACpB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,WAAW,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,gCAAgC;QAChC,MAAM,aAAa,GAAG,aAAa,CAAC,+BAA+B,CAAC,CAAC;QACrE,aAAa,CAAC,KAAK,EAAE,CAAC;QAEtB,IAAI,MAAM,GAAG,MAAM,iBAAiB,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChE,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,WAAW,GAAG,EAAE,CAAC;QAEvB,OAAO,MAAM,KAAK,SAAS,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;YACtD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1D,MAAM,GAAG,MAAM,iBAAiB,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC5D,QAAQ,EAAE,CAAC;QACb,CAAC;QAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,aAAa,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAE3C,oEAAoE;QACpE,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpE,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QACzB,CAAC;QAED,6CAA6C;QAC7C,MAAM,cAAc,GAAG,cAAc,KAAK,cAAc,CAAC;QACzD,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QAChD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAEvD,+BAA+B;QAC/B,UAAU,CAAC;YACT,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE,cAAc;YACxB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,MAAM;YACN,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QAEH,kBAAkB;QAClB,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,OAAO,CAAC,cAAc,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,0BAA0B,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC;YAC9E,MAAM,CAAC,IAAI,CAAC,qDAAqD,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,+DAA+D,CAAC,CAAC;QAChF,MAAM,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,CAAC,KAAK,CAAC,sBAAsB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -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 @@
|
|
|
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;
|
|
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"}
|
package/dist/providers/base.d.ts
CHANGED
|
@@ -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;
|
|
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;
|
|
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" },
|