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.
- package/README.md +103 -598
- package/README.tr.md +178 -0
- package/dist/commands/add.d.ts +9 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +151 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/backup.d.ts +1 -0
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +104 -1
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/domain.d.ts +1 -0
- package/dist/commands/domain.d.ts.map +1 -1
- package/dist/commands/domain.js +4 -1
- package/dist/commands/domain.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +20 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/maintain.d.ts +9 -0
- package/dist/commands/maintain.d.ts.map +1 -0
- package/dist/commands/maintain.js +288 -0
- package/dist/commands/maintain.js.map +1 -0
- package/dist/commands/remove.d.ts +2 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +25 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/restart.d.ts.map +1 -1
- package/dist/commands/restart.js +4 -0
- package/dist/commands/restart.js.map +1 -1
- package/dist/commands/restore.js +3 -3
- package/dist/commands/restore.js.map +1 -1
- package/dist/commands/snapshot.d.ts +8 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +199 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/commands/status.d.ts +6 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +120 -7
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts +5 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +101 -14
- package/dist/commands/update.js.map +1 -1
- package/dist/index.js +38 -4
- package/dist/index.js.map +1 -1
- package/dist/providers/base.d.ts +5 -1
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/digitalocean.d.ts +5 -1
- package/dist/providers/digitalocean.d.ts.map +1 -1
- package/dist/providers/digitalocean.js +74 -0
- package/dist/providers/digitalocean.js.map +1 -1
- package/dist/providers/hetzner.d.ts +5 -1
- package/dist/providers/hetzner.d.ts.map +1 -1
- package/dist/providers/hetzner.js +77 -2
- package/dist/providers/hetzner.js.map +1 -1
- package/dist/providers/linode.d.ts +25 -0
- package/dist/providers/linode.d.ts.map +1 -0
- package/dist/providers/linode.js +291 -0
- package/dist/providers/linode.js.map +1 -0
- package/dist/providers/vultr.d.ts +25 -0
- package/dist/providers/vultr.d.ts.map +1 -0
- package/dist/providers/vultr.js +262 -0
- package/dist/providers/vultr.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/config.d.ts +1 -0
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +7 -0
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/prompts.js +2 -0
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/providerFactory.d.ts.map +1 -1
- package/dist/utils/providerFactory.js +10 -0
- package/dist/utils/providerFactory.js.map +1 -1
- package/dist/utils/serverSelect.d.ts +1 -0
- package/dist/utils/serverSelect.d.ts.map +1 -1
- package/dist/utils/serverSelect.js +37 -6
- package/dist/utils/serverSelect.js.map +1 -1
- package/dist/utils/templates.d.ts.map +1 -1
- package/dist/utils/templates.js +6 -0
- package/dist/utils/templates.js.map +1 -1
- package/dist/utils/yamlConfig.d.ts.map +1 -1
- package/dist/utils/yamlConfig.js +9 -4
- package/dist/utils/yamlConfig.js.map +1 -1
- 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":"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"}
|
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
|
|
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":"
|
|
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"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,19 +1,128 @@
|
|
|
1
1
|
import axios from "axios";
|
|
2
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/commands/update.js
CHANGED
|
@@ -1,10 +1,92 @@
|
|
|
1
1
|
import inquirer from "inquirer";
|
|
2
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.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,iBAAiB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,kBAAkB,GAAG,8DAA8D,CAAC;AAM1F,KAAK,UAAU,kBAAkB,CAC/B,UAAkB,EAClB,QAAgB,EAChB,QAAgB,EAChB,QAAgB,EAChB,QAAgB;IAEhB,MAAM,OAAO,GAAG,aAAa,CAAC,cAAc,UAAU,KAAK,CAAC,CAAC;IAC7D,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,OAAO,CAAC,GAAG,UAAU,8CAA8C,CAAC,CAAC;IAC/E,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAChE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,oCAAoC,MAAM,GAAG,CAAC,CAAC;gBACzE,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,GAAG,UAAU,mBAAmB,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,2BAA2B,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,uBAAuB,UAAU,KAAK,QAAQ,MAAM,CAAC,CAAC;IAElE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IAE3D,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEhD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,CAAC,GAAG,UAAU,6BAA6B,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,kCAAkC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IAED,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,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACxC;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,yBAAyB,OAAO,CAAC,MAAM,4CAA4C;YAC5F,OAAO,EAAE,KAAK;SACf;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAEtD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAE,CAAC;QAC7C,MAAM,EAAE,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC/F,IAAI,EAAE;YAAE,SAAS,EAAE,CAAC;;YACf,MAAM,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,MAAM,CAAC,OAAO,CAAC,OAAO,SAAS,kCAAkC,CAAC,CAAC;IACrE,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS,eAAe,MAAM,SAAS,CAAC,CAAC;IAC7D,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,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC;IACxE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACxC;YACE,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,sBAAsB,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,EAAE,mCAAmC;YAC5F,OAAO,EAAE,KAAK;SACf;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IAED,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,sBAAsB,CAAC,CAAC;IACtD,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,kCAAkC,MAAM,GAAG,CAAC,CAAC;gBAC1D,OAAO;YACT,CAAC;YACD,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAE5D,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEhD,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CAAC,gCAAgC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
|
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
|
-
.
|
|
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
|
-
.
|
|
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
|