quicklify 0.8.0 → 1.0.0
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 +220 -32
- package/README.tr.md +800 -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 +105 -6
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +1 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +5 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +93 -12
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/maintain.d.ts +8 -0
- package/dist/commands/maintain.d.ts.map +1 -0
- package/dist/commands/maintain.js +253 -0
- package/dist/commands/maintain.js.map +1 -0
- package/dist/commands/monitor.d.ts.map +1 -1
- package/dist/commands/monitor.js +2 -1
- package/dist/commands/monitor.js.map +1 -1
- 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 +1 -1
- package/dist/commands/restore.js.map +1 -1
- package/dist/commands/secure.d.ts.map +1 -1
- package/dist/commands/secure.js +1 -1
- package/dist/commands/secure.js.map +1 -1
- 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/transfer.d.ts.map +1 -1
- package/dist/commands/transfer.js +9 -1
- package/dist/commands/transfer.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 +36 -5
- package/dist/index.js.map +1 -1
- package/dist/providers/digitalocean.d.ts.map +1 -1
- package/dist/providers/digitalocean.js +4 -1
- package/dist/providers/digitalocean.js.map +1 -1
- package/dist/providers/hetzner.d.ts.map +1 -1
- package/dist/providers/hetzner.js +2 -2
- package/dist/providers/hetzner.js.map +1 -1
- package/dist/providers/linode.d.ts +21 -0
- package/dist/providers/linode.d.ts.map +1 -0
- package/dist/providers/linode.js +203 -0
- package/dist/providers/linode.js.map +1 -0
- package/dist/providers/vultr.d.ts +21 -0
- package/dist/providers/vultr.d.ts.map +1 -0
- package/dist/providers/vultr.js +183 -0
- package/dist/providers/vultr.js.map +1 -0
- package/dist/types/index.d.ts +22 -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/configMerge.d.ts +16 -0
- package/dist/utils/configMerge.d.ts.map +1 -0
- package/dist/utils/configMerge.js +34 -0
- package/dist/utils/configMerge.js.map +1 -0
- 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/ssh.d.ts.map +1 -1
- package/dist/utils/ssh.js +3 -1
- package/dist/utils/ssh.js.map +1 -1
- package/dist/utils/templates.d.ts +6 -0
- package/dist/utils/templates.d.ts.map +1 -0
- package/dist/utils/templates.js +49 -0
- package/dist/utils/templates.js.map +1 -0
- package/dist/utils/yamlConfig.d.ts +8 -0
- package/dist/utils/yamlConfig.d.ts.map +1 -0
- package/dist/utils/yamlConfig.js +136 -0
- package/dist/utils/yamlConfig.js.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAUA,UAAU,UAAU;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,UAAU,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyJxE"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import inquirer from "inquirer";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { getServers, saveServer } from "../utils/config.js";
|
|
5
|
+
import { promptApiToken } from "../utils/serverSelect.js";
|
|
6
|
+
import { createProviderWithToken } from "../utils/providerFactory.js";
|
|
7
|
+
import { sshExec, checkSshAvailable } from "../utils/ssh.js";
|
|
8
|
+
import { logger } from "../utils/logger.js";
|
|
9
|
+
export async function addCommand(options = {}) {
|
|
10
|
+
// Step 1: Select provider
|
|
11
|
+
let providerName = options.provider;
|
|
12
|
+
if (!providerName) {
|
|
13
|
+
const { provider } = await inquirer.prompt([
|
|
14
|
+
{
|
|
15
|
+
type: "list",
|
|
16
|
+
name: "provider",
|
|
17
|
+
message: "Select cloud provider:",
|
|
18
|
+
choices: [
|
|
19
|
+
{ name: "Hetzner Cloud", value: "hetzner" },
|
|
20
|
+
{ name: "DigitalOcean", value: "digitalocean" },
|
|
21
|
+
{ name: "Vultr", value: "vultr" },
|
|
22
|
+
{ name: "Linode (Akamai)", value: "linode" },
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
]);
|
|
26
|
+
providerName = provider;
|
|
27
|
+
}
|
|
28
|
+
const validProviders = ["hetzner", "digitalocean", "vultr", "linode"];
|
|
29
|
+
if (!validProviders.includes(providerName)) {
|
|
30
|
+
logger.error(`Invalid provider: ${providerName}. Use: ${validProviders.join(", ")}`);
|
|
31
|
+
process.exit(1);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// Step 2: Get API token
|
|
35
|
+
const token = await promptApiToken(providerName);
|
|
36
|
+
const provider = createProviderWithToken(providerName, token);
|
|
37
|
+
// Step 3: Validate token
|
|
38
|
+
const spinner = ora("Validating API token...").start();
|
|
39
|
+
const valid = await provider.validateToken(token);
|
|
40
|
+
if (!valid) {
|
|
41
|
+
spinner.fail("Invalid API token");
|
|
42
|
+
process.exit(1);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
spinner.succeed("Token validated");
|
|
46
|
+
// Step 4: Get server IP
|
|
47
|
+
let serverIp = options.ip;
|
|
48
|
+
if (!serverIp) {
|
|
49
|
+
const { ip } = await inquirer.prompt([
|
|
50
|
+
{
|
|
51
|
+
type: "input",
|
|
52
|
+
name: "ip",
|
|
53
|
+
message: "Enter server IP address:",
|
|
54
|
+
validate: (input) => {
|
|
55
|
+
const trimmed = input.trim();
|
|
56
|
+
if (!trimmed)
|
|
57
|
+
return "IP address is required";
|
|
58
|
+
if (!/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(trimmed)) {
|
|
59
|
+
return "Invalid IP address format";
|
|
60
|
+
}
|
|
61
|
+
const octets = trimmed.split(".").map(Number);
|
|
62
|
+
if (octets.some((o) => o < 0 || o > 255)) {
|
|
63
|
+
return "Invalid IP address (octets must be 0-255)";
|
|
64
|
+
}
|
|
65
|
+
return true;
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
]);
|
|
69
|
+
serverIp = ip.trim();
|
|
70
|
+
}
|
|
71
|
+
// Step 5: Check for duplicate
|
|
72
|
+
const existingServers = getServers();
|
|
73
|
+
const duplicate = existingServers.find((s) => s.ip === serverIp);
|
|
74
|
+
if (duplicate) {
|
|
75
|
+
logger.error(`Server with IP ${serverIp} already exists: ${duplicate.name}`);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Step 6: Get server name
|
|
80
|
+
let serverName = options.name;
|
|
81
|
+
if (!serverName) {
|
|
82
|
+
const { name } = await inquirer.prompt([
|
|
83
|
+
{
|
|
84
|
+
type: "input",
|
|
85
|
+
name: "name",
|
|
86
|
+
message: "Server name:",
|
|
87
|
+
default: "coolify-server",
|
|
88
|
+
validate: (input) => {
|
|
89
|
+
const trimmed = input.trim();
|
|
90
|
+
if (!trimmed)
|
|
91
|
+
return "Server name is required";
|
|
92
|
+
if (trimmed.length < 3 || trimmed.length > 63) {
|
|
93
|
+
return "Server name must be 3-63 characters";
|
|
94
|
+
}
|
|
95
|
+
if (!/^[a-z][a-z0-9-]*[a-z0-9]$/.test(trimmed)) {
|
|
96
|
+
return "Must start with a letter, end with letter/number, only lowercase letters, numbers, hyphens";
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
]);
|
|
102
|
+
serverName = name.trim();
|
|
103
|
+
}
|
|
104
|
+
// Step 7: Verify Coolify is installed (unless --skip-verify)
|
|
105
|
+
if (!options.skipVerify) {
|
|
106
|
+
if (!checkSshAvailable()) {
|
|
107
|
+
logger.warning("SSH not available. Use --skip-verify to skip Coolify verification.");
|
|
108
|
+
process.exit(1);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const verifySpinner = ora("Verifying Coolify installation...").start();
|
|
112
|
+
try {
|
|
113
|
+
const result = await sshExec(serverIp, "curl -s -o /dev/null -w '%{http_code}' http://localhost:8000/api/health");
|
|
114
|
+
if (result.code === 0 && result.stdout.trim().includes("200")) {
|
|
115
|
+
verifySpinner.succeed("Coolify is running");
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
// Fallback: check docker containers
|
|
119
|
+
const dockerResult = await sshExec(serverIp, "docker ps --format '{{.Names}}' 2>/dev/null | grep -q coolify && echo OK");
|
|
120
|
+
if (dockerResult.code === 0 && dockerResult.stdout.trim().includes("OK")) {
|
|
121
|
+
verifySpinner.succeed("Coolify containers detected");
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
verifySpinner.warn("Coolify not detected. Server added anyway.");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
verifySpinner.warn("Could not verify Coolify. Server added anyway.");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Step 8: Save to config
|
|
133
|
+
const record = {
|
|
134
|
+
id: `manual-${Date.now()}`,
|
|
135
|
+
name: serverName,
|
|
136
|
+
provider: providerName,
|
|
137
|
+
ip: serverIp,
|
|
138
|
+
region: "unknown",
|
|
139
|
+
size: "unknown",
|
|
140
|
+
createdAt: new Date().toISOString(),
|
|
141
|
+
};
|
|
142
|
+
saveServer(record);
|
|
143
|
+
console.log();
|
|
144
|
+
console.log(chalk.green("Server added successfully!"));
|
|
145
|
+
console.log(` Name: ${record.name}`);
|
|
146
|
+
console.log(` IP: ${record.ip}`);
|
|
147
|
+
console.log(` Provider: ${provider.displayName}`);
|
|
148
|
+
console.log();
|
|
149
|
+
console.log("All commands now work for this server (status, update, backup, etc.)");
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAU5C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAsB,EAAE;IACvD,0BAA0B;IAC1B,IAAI,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC;IACpC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACzC;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,wBAAwB;gBACjC,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE;oBAC3C,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE;oBAC/C,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;oBACjC,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,QAAQ,EAAE;iBAC7C;aACF;SACF,CAAC,CAAC;QACH,YAAY,GAAG,QAAQ,CAAC;IAC1B,CAAC;IAED,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,YAAa,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,qBAAqB,YAAY,UAAU,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,YAAa,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,uBAAuB,CAAC,YAAa,EAAE,KAAK,CAAC,CAAC;IAE/D,yBAAyB;IACzB,MAAM,OAAO,GAAG,GAAG,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;IACvD,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAEnC,wBAAwB;IACxB,IAAI,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC;IAC1B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACnC;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,0BAA0B;gBACnC,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;oBAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;oBAC7B,IAAI,CAAC,OAAO;wBAAE,OAAO,wBAAwB,CAAC;oBAC9C,IAAI,CAAC,sCAAsC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC1D,OAAO,2BAA2B,CAAC;oBACrC,CAAC;oBACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC9C,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;wBACzC,OAAO,2CAA2C,CAAC;oBACrD,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;aACF;SACF,CAAC,CAAC;QACH,QAAQ,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAED,8BAA8B;IAC9B,MAAM,eAAe,GAAG,UAAU,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IACjE,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,KAAK,CAAC,kBAAkB,QAAQ,oBAAoB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,0BAA0B;IAC1B,IAAI,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACrC;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,cAAc;gBACvB,OAAO,EAAE,gBAAgB;gBACzB,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;oBAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;oBAC7B,IAAI,CAAC,OAAO;wBAAE,OAAO,yBAAyB,CAAC;oBAC/C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;wBAC9C,OAAO,qCAAqC,CAAC;oBAC/C,CAAC;oBACD,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC/C,OAAO,4FAA4F,CAAC;oBACtG,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;aACF;SACF,CAAC,CAAC;QACH,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,6DAA6D;IAC7D,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YACzB,MAAM,CAAC,OAAO,CAAC,oEAAoE,CAAC,CAAC;YACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,aAAa,GAAG,GAAG,CAAC,mCAAmC,CAAC,CAAC,KAAK,EAAE,CAAC;QACvE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,QAAS,EACT,yEAAyE,CAC1E,CAAC;YACF,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9D,aAAa,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,oCAAoC;gBACpC,MAAM,YAAY,GAAG,MAAM,OAAO,CAChC,QAAS,EACT,0EAA0E,CAC3E,CAAC;gBACF,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACzE,aAAa,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;gBACvD,CAAC;qBAAM,CAAC;oBACN,aAAa,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,aAAa,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,MAAM,GAAiB;QAC3B,EAAE,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,EAAE;QAC1B,IAAI,EAAE,UAAW;QACjB,QAAQ,EAAE,YAAa;QACvB,EAAE,EAAE,QAAS;QACb,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,SAAS;QACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,UAAU,CAAC,MAAM,CAAC,CAAC;IAEnB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;AACtF,CAAC"}
|
|
@@ -11,5 +11,6 @@ export declare function scpDownload(ip: string, remotePath: string, localPath: s
|
|
|
11
11
|
export declare function listBackups(serverName: string): string[];
|
|
12
12
|
export declare function backupCommand(query?: string, options?: {
|
|
13
13
|
dryRun?: boolean;
|
|
14
|
+
all?: boolean;
|
|
14
15
|
}): Promise<void>;
|
|
15
16
|
//# sourceMappingURL=backup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAYA,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAElD;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAED,wBAAgB,WAAW,CACzB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAc3C;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAWxD;AAyHD,wBAAsB,aAAa,CACjC,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CA8Hf"}
|
package/dist/commands/backup.js
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import { mkdirSync, existsSync, writeFileSync, readdirSync } from "fs";
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import { spawn } from "child_process";
|
|
4
|
+
import { getServers } from "../utils/config.js";
|
|
4
5
|
import { resolveServer } from "../utils/serverSelect.js";
|
|
5
6
|
import { checkSshAvailable, sshExec } from "../utils/ssh.js";
|
|
6
7
|
import { BACKUPS_DIR } from "../utils/config.js";
|
|
7
8
|
import { logger, createSpinner } from "../utils/logger.js";
|
|
8
9
|
// Pure functions (testable)
|
|
9
10
|
export function formatTimestamp(date) {
|
|
10
|
-
return date
|
|
11
|
-
.toISOString()
|
|
12
|
-
.replace(/[:.]/g, "-")
|
|
13
|
-
.replace("T", "_")
|
|
14
|
-
.replace("Z", "");
|
|
11
|
+
return date.toISOString().replace(/[:.]/g, "-").replace("T", "_").replace("Z", "");
|
|
15
12
|
}
|
|
16
13
|
export function getBackupDir(serverName) {
|
|
17
14
|
return join(BACKUPS_DIR, serverName);
|
|
@@ -26,7 +23,7 @@ export function buildCleanupCommand() {
|
|
|
26
23
|
return "rm -f /tmp/coolify-backup.sql.gz /tmp/coolify-config.tar.gz";
|
|
27
24
|
}
|
|
28
25
|
export function buildCoolifyVersionCommand() {
|
|
29
|
-
return "docker
|
|
26
|
+
return "docker inspect coolify --format '{{.Config.Image}}' 2>/dev/null | sed 's/.*://' || echo unknown";
|
|
30
27
|
}
|
|
31
28
|
export function scpDownload(ip, remotePath, localPath) {
|
|
32
29
|
return new Promise((resolve) => {
|
|
@@ -53,8 +50,110 @@ export function listBackups(serverName) {
|
|
|
53
50
|
return [];
|
|
54
51
|
}
|
|
55
52
|
}
|
|
53
|
+
// Single server backup (extracted for reuse)
|
|
54
|
+
async function backupSingleServer(server, dryRun) {
|
|
55
|
+
const timestamp = formatTimestamp(new Date());
|
|
56
|
+
const backupPath = join(getBackupDir(server.name), timestamp);
|
|
57
|
+
if (dryRun) {
|
|
58
|
+
logger.info(`[${server.name}] Dry run - would backup to: ${backupPath}`);
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
const versionResult = await sshExec(server.ip, buildCoolifyVersionCommand());
|
|
62
|
+
const coolifyVersion = versionResult.code === 0 ? versionResult.stdout.trim() : "unknown";
|
|
63
|
+
const dbSpinner = createSpinner(`[${server.name}] Creating database backup...`);
|
|
64
|
+
dbSpinner.start();
|
|
65
|
+
try {
|
|
66
|
+
const dbResult = await sshExec(server.ip, buildPgDumpCommand());
|
|
67
|
+
if (dbResult.code !== 0) {
|
|
68
|
+
dbSpinner.fail(`[${server.name}] Database backup failed`);
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
dbSpinner.succeed(`[${server.name}] Database backup created`);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
dbSpinner.fail(`[${server.name}] Database backup failed`);
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
const configSpinner = createSpinner(`[${server.name}] Creating config backup...`);
|
|
78
|
+
configSpinner.start();
|
|
79
|
+
try {
|
|
80
|
+
const configResult = await sshExec(server.ip, buildConfigTarCommand());
|
|
81
|
+
if (configResult.code !== 0) {
|
|
82
|
+
configSpinner.fail(`[${server.name}] Config backup failed`);
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
configSpinner.succeed(`[${server.name}] Config backup created`);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
configSpinner.fail(`[${server.name}] Config backup failed`);
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
mkdirSync(backupPath, { recursive: true });
|
|
92
|
+
const dlSpinner = createSpinner(`[${server.name}] Downloading backup files...`);
|
|
93
|
+
dlSpinner.start();
|
|
94
|
+
try {
|
|
95
|
+
const dbDl = await scpDownload(server.ip, "/tmp/coolify-backup.sql.gz", join(backupPath, "coolify-backup.sql.gz"));
|
|
96
|
+
if (dbDl.code !== 0) {
|
|
97
|
+
dlSpinner.fail(`[${server.name}] Download failed`);
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
const configDl = await scpDownload(server.ip, "/tmp/coolify-config.tar.gz", join(backupPath, "coolify-config.tar.gz"));
|
|
101
|
+
if (configDl.code !== 0) {
|
|
102
|
+
dlSpinner.fail(`[${server.name}] Download failed`);
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
dlSpinner.succeed(`[${server.name}] Backup files downloaded`);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
dlSpinner.fail(`[${server.name}] Download failed`);
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
const manifest = {
|
|
112
|
+
serverName: server.name,
|
|
113
|
+
serverIp: server.ip,
|
|
114
|
+
provider: server.provider,
|
|
115
|
+
timestamp,
|
|
116
|
+
coolifyVersion,
|
|
117
|
+
files: ["coolify-backup.sql.gz", "coolify-config.tar.gz"],
|
|
118
|
+
};
|
|
119
|
+
writeFileSync(join(backupPath, "manifest.json"), JSON.stringify(manifest, null, 2));
|
|
120
|
+
await sshExec(server.ip, buildCleanupCommand()).catch(() => { });
|
|
121
|
+
logger.success(`[${server.name}] Backup saved to ${backupPath}`);
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
async function backupAll(dryRun) {
|
|
125
|
+
if (!checkSshAvailable()) {
|
|
126
|
+
logger.error("SSH client not found. Please install OpenSSH.");
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const servers = getServers();
|
|
130
|
+
if (servers.length === 0) {
|
|
131
|
+
logger.info("No servers found. Deploy one with: quicklify init");
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
logger.title(`Backing up ${servers.length} server(s)...`);
|
|
135
|
+
let succeeded = 0;
|
|
136
|
+
let failed = 0;
|
|
137
|
+
for (const server of servers) {
|
|
138
|
+
const ok = await backupSingleServer(server, dryRun);
|
|
139
|
+
if (ok)
|
|
140
|
+
succeeded++;
|
|
141
|
+
else
|
|
142
|
+
failed++;
|
|
143
|
+
console.log();
|
|
144
|
+
}
|
|
145
|
+
if (failed === 0) {
|
|
146
|
+
logger.success(`All ${succeeded} server(s) backed up successfully!`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
logger.warning(`${succeeded} succeeded, ${failed} failed`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
56
152
|
// Command
|
|
57
153
|
export async function backupCommand(query, options) {
|
|
154
|
+
if (options?.all) {
|
|
155
|
+
return backupAll(options?.dryRun || false);
|
|
156
|
+
}
|
|
58
157
|
if (!checkSshAvailable()) {
|
|
59
158
|
logger.error("SSH client not found. Please install OpenSSH.");
|
|
60
159
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AASA,wBAAsB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDvF"}
|
package/dist/commands/config.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getDefaults, setDefault, getDefault, resetDefaults, VALID_KEYS } from "../utils/defaults.js";
|
|
1
|
+
import { getDefaults, setDefault, getDefault, resetDefaults, VALID_KEYS, } from "../utils/defaults.js";
|
|
2
2
|
import { logger } from "../utils/logger.js";
|
|
3
3
|
export async function configCommand(subcommand, args) {
|
|
4
4
|
switch (subcommand) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB;AA0DD,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,CAS/D;AAED,wBAAsB,aAAa,CACjC,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,EACnC,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -25,7 +25,11 @@ function checkSsh() {
|
|
|
25
25
|
if (checkSshAvailable()) {
|
|
26
26
|
return { name: "SSH Client", status: "pass", detail: "available" };
|
|
27
27
|
}
|
|
28
|
-
return {
|
|
28
|
+
return {
|
|
29
|
+
name: "SSH Client",
|
|
30
|
+
status: "warn",
|
|
31
|
+
detail: "not found (needed for ssh/logs/monitor/update)",
|
|
32
|
+
};
|
|
29
33
|
}
|
|
30
34
|
function checkQuicklifyVersion(version) {
|
|
31
35
|
if (version) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQhD,SAAS,gBAAgB;IACvB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,mBAAmB,EAAE,CAAC;AACpF,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAC/E,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,SAAS,QAAQ;IACf,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACxB,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACrE,CAAC;IACD,OAAO,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAsBrD,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqN1E"}
|
package/dist/commands/init.js
CHANGED
|
@@ -8,7 +8,53 @@ import { logger, createSpinner } from "../utils/logger.js";
|
|
|
8
8
|
import { findLocalSshKey, generateSshKey, getSshKeyName } from "../utils/sshKey.js";
|
|
9
9
|
import { firewallSetup } from "./firewall.js";
|
|
10
10
|
import { secureSetup } from "./secure.js";
|
|
11
|
+
import { loadYamlConfig } from "../utils/yamlConfig.js";
|
|
12
|
+
import { mergeConfig } from "../utils/configMerge.js";
|
|
13
|
+
import { getTemplate, getTemplateDefaults, VALID_TEMPLATE_NAMES } from "../utils/templates.js";
|
|
11
14
|
export async function initCommand(options = {}) {
|
|
15
|
+
// Load YAML config if --config flag provided
|
|
16
|
+
if (options.config) {
|
|
17
|
+
const { config: yamlConfig, warnings } = loadYamlConfig(options.config);
|
|
18
|
+
for (const w of warnings) {
|
|
19
|
+
logger.warning(w);
|
|
20
|
+
}
|
|
21
|
+
const merged = mergeConfig(options, yamlConfig);
|
|
22
|
+
// Apply merged values back to options
|
|
23
|
+
if (merged.provider && !options.provider)
|
|
24
|
+
options.provider = merged.provider;
|
|
25
|
+
if (merged.region && !options.region)
|
|
26
|
+
options.region = merged.region;
|
|
27
|
+
if (merged.size && !options.size)
|
|
28
|
+
options.size = merged.size;
|
|
29
|
+
if (merged.name && !options.name)
|
|
30
|
+
options.name = merged.name;
|
|
31
|
+
if (merged.fullSetup !== undefined && options.fullSetup === undefined)
|
|
32
|
+
options.fullSetup = merged.fullSetup;
|
|
33
|
+
}
|
|
34
|
+
else if (options.template) {
|
|
35
|
+
// Template-only mode (no YAML file)
|
|
36
|
+
const merged = mergeConfig(options);
|
|
37
|
+
if (merged.provider && !options.provider)
|
|
38
|
+
options.provider = merged.provider;
|
|
39
|
+
if (merged.region && !options.region)
|
|
40
|
+
options.region = merged.region;
|
|
41
|
+
if (merged.size && !options.size)
|
|
42
|
+
options.size = merged.size;
|
|
43
|
+
if (merged.name && !options.name)
|
|
44
|
+
options.name = merged.name;
|
|
45
|
+
if (merged.fullSetup !== undefined && options.fullSetup === undefined)
|
|
46
|
+
options.fullSetup = merged.fullSetup;
|
|
47
|
+
}
|
|
48
|
+
// Validate --template flag
|
|
49
|
+
if (options.template) {
|
|
50
|
+
const tmpl = getTemplate(options.template);
|
|
51
|
+
if (!tmpl) {
|
|
52
|
+
logger.error(`Invalid template: "${options.template}". Valid templates: ${VALID_TEMPLATE_NAMES.join(", ")}`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
logger.info(`Using template: ${tmpl.name} - ${tmpl.description}`);
|
|
57
|
+
}
|
|
12
58
|
const isNonInteractive = options.provider !== undefined;
|
|
13
59
|
logger.title("Quicklify - Deploy Coolify in minutes");
|
|
14
60
|
let providerChoice;
|
|
@@ -18,8 +64,8 @@ export async function initCommand(options = {}) {
|
|
|
18
64
|
let serverName;
|
|
19
65
|
// Step 1: Select cloud provider
|
|
20
66
|
if (options.provider) {
|
|
21
|
-
if (!["hetzner", "digitalocean"].includes(options.provider)) {
|
|
22
|
-
logger.error(`Invalid provider: ${options.provider}. Use "hetzner" or "
|
|
67
|
+
if (!["hetzner", "digitalocean", "vultr", "linode"].includes(options.provider)) {
|
|
68
|
+
logger.error(`Invalid provider: ${options.provider}. Use "hetzner", "digitalocean", "vultr", or "linode".`);
|
|
23
69
|
process.exit(1);
|
|
24
70
|
return;
|
|
25
71
|
}
|
|
@@ -31,9 +77,20 @@ export async function initCommand(options = {}) {
|
|
|
31
77
|
}
|
|
32
78
|
const provider = createProvider(providerChoice);
|
|
33
79
|
logger.info(`Using ${provider.displayName}`);
|
|
34
|
-
//
|
|
80
|
+
// Apply template defaults now that provider is known (handles interactive provider selection)
|
|
81
|
+
if (options.template) {
|
|
82
|
+
const tmplDefaults = getTemplateDefaults(options.template, providerChoice);
|
|
83
|
+
if (tmplDefaults) {
|
|
84
|
+
if (!options.region)
|
|
85
|
+
options.region = tmplDefaults.region;
|
|
86
|
+
if (!options.size)
|
|
87
|
+
options.size = tmplDefaults.size;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Step 2: Get API token (env var > interactive prompt)
|
|
35
91
|
if (options.token) {
|
|
36
92
|
apiToken = options.token;
|
|
93
|
+
logger.warning("Token passed via --token flag is visible in shell history. Use environment variables instead: export HETZNER_TOKEN=...");
|
|
37
94
|
}
|
|
38
95
|
else if (providerChoice === "hetzner" && process.env.HETZNER_TOKEN) {
|
|
39
96
|
apiToken = process.env.HETZNER_TOKEN;
|
|
@@ -41,10 +98,11 @@ export async function initCommand(options = {}) {
|
|
|
41
98
|
else if (providerChoice === "digitalocean" && process.env.DIGITALOCEAN_TOKEN) {
|
|
42
99
|
apiToken = process.env.DIGITALOCEAN_TOKEN;
|
|
43
100
|
}
|
|
44
|
-
else if (
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
101
|
+
else if (providerChoice === "vultr" && process.env.VULTR_TOKEN) {
|
|
102
|
+
apiToken = process.env.VULTR_TOKEN;
|
|
103
|
+
}
|
|
104
|
+
else if (providerChoice === "linode" && process.env.LINODE_TOKEN) {
|
|
105
|
+
apiToken = process.env.LINODE_TOKEN;
|
|
48
106
|
}
|
|
49
107
|
else {
|
|
50
108
|
const config = await getDeploymentConfig(provider);
|
|
@@ -281,10 +339,18 @@ async function deployServer(providerChoice, providerWithToken, region, serverSiz
|
|
|
281
339
|
return;
|
|
282
340
|
}
|
|
283
341
|
statusSpinner.succeed("Server is running");
|
|
284
|
-
// Refresh server details to get final IP (DO
|
|
285
|
-
if (server.ip === "pending") {
|
|
286
|
-
|
|
287
|
-
|
|
342
|
+
// Refresh server details to get final IP (DO/Vultr assign IP after boot)
|
|
343
|
+
if (server.ip === "pending" || server.ip === "0.0.0.0") {
|
|
344
|
+
let refreshAttempts = 0;
|
|
345
|
+
while (refreshAttempts < 10) {
|
|
346
|
+
const details = await providerWithToken.getServerDetails(server.id);
|
|
347
|
+
if (details.ip && details.ip !== "0.0.0.0" && details.ip !== "pending") {
|
|
348
|
+
server.ip = details.ip;
|
|
349
|
+
break;
|
|
350
|
+
}
|
|
351
|
+
refreshAttempts++;
|
|
352
|
+
await new Promise((resolve) => setTimeout(resolve, 3000));
|
|
353
|
+
}
|
|
288
354
|
}
|
|
289
355
|
// Health check polling instead of blind wait
|
|
290
356
|
const isDigitalOcean = providerChoice === "digitalocean";
|
|
@@ -340,11 +406,26 @@ async function deployServer(providerChoice, providerWithToken, region, serverSiz
|
|
|
340
406
|
logger.warning("Coolify did not respond yet. Please check in a few minutes.");
|
|
341
407
|
logger.info(`You can check status later with: quicklify status ${server.ip}`);
|
|
342
408
|
}
|
|
409
|
+
// Onboarding: next steps
|
|
343
410
|
if (!fullSetup) {
|
|
344
|
-
|
|
411
|
+
console.log();
|
|
412
|
+
logger.title("Recommended Next Steps:");
|
|
413
|
+
logger.info(` 1. Set up firewall: quicklify firewall setup ${serverName}`);
|
|
414
|
+
logger.info(` 2. Add a domain: quicklify domain add ${serverName} --domain example.com`);
|
|
415
|
+
logger.info(` 3. Harden SSH: quicklify secure setup ${serverName}`);
|
|
416
|
+
logger.info(` 4. Create a backup: quicklify backup ${serverName}`);
|
|
417
|
+
logger.info(" Or do it all at once: quicklify init --full-setup");
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
console.log();
|
|
421
|
+
logger.title("Next Steps:");
|
|
422
|
+
logger.info(` 1. Add a domain: quicklify domain add ${serverName} --domain example.com`);
|
|
423
|
+
logger.info(` 2. Create a backup: quicklify backup ${serverName}`);
|
|
345
424
|
}
|
|
346
425
|
logger.info("Server saved to local config. Use 'quicklify list' to see all servers.");
|
|
347
426
|
console.log();
|
|
427
|
+
console.log(" \u2b50 Love Quicklify? Give us a star: https://github.com/omrfc/quicklify \u2b50");
|
|
428
|
+
console.log();
|
|
348
429
|
}
|
|
349
430
|
catch (error) {
|
|
350
431
|
logger.error(`Deployment failed: ${error instanceof Error ? error.message : String(error)}`);
|