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/README.md
CHANGED
|
@@ -45,6 +45,9 @@ npx quicklify init
|
|
|
45
45
|
- ✨ **Dynamic Server Types** - Only shows compatible types for selected location
|
|
46
46
|
- 🔥 **Auto Firewall** - Ports 8000, 22, 80, 443 configured automatically
|
|
47
47
|
- 🚀 **Zero SSH Required** - Opens directly in browser after deployment
|
|
48
|
+
- 📋 **Server Management** - List, status check, and destroy commands
|
|
49
|
+
- 🏥 **Health Check Polling** - Detects when Coolify is ready (no more blind waiting)
|
|
50
|
+
- 🤖 **Non-Interactive Mode** - CI/CD friendly with `--provider --token --region --size --name` flags
|
|
48
51
|
|
|
49
52
|
## 📦 Installation
|
|
50
53
|
|
|
@@ -156,53 +159,26 @@ For production use, we recommend setting up a domain instead of using the IP add
|
|
|
156
159
|
|
|
157
160
|
## 📋 Recent Updates
|
|
158
161
|
|
|
162
|
+
### v0.4.0 (2026-02-20)
|
|
163
|
+
- **New commands:** `quicklify list`, `quicklify status [query]`, `quicklify destroy [query]`
|
|
164
|
+
- **Non-interactive mode:** `quicklify init --provider --token --region --size --name` for CI/CD
|
|
165
|
+
- **Health check polling:** Detects when Coolify is ready instead of blind waiting
|
|
166
|
+
- **Server persistence:** Deploys saved to `~/.quicklify/servers.json` for list/status/destroy
|
|
167
|
+
- **`destroyServer()`** added to provider interface (Hetzner + DigitalOcean)
|
|
168
|
+
- 233 tests with 97%+ statement coverage
|
|
169
|
+
|
|
159
170
|
### v0.3.1 (2026-02-19)
|
|
160
171
|
- Hetzner pricing now shows net prices (excl. VAT), matching website display
|
|
161
172
|
- Hetzner server types use `/datacenters` API for real availability per location
|
|
162
173
|
- Replaced deprecated Hetzner server types (cpx→cx23/cx33)
|
|
163
174
|
- "Server name already used" error now prompts for a new name
|
|
164
175
|
- Location disabled retry now re-prompts for server type
|
|
165
|
-
- Back navigation works correctly in error retry flows
|
|
166
176
|
|
|
167
177
|
### v0.3.0 (2026-02-19)
|
|
168
178
|
- DigitalOcean provider support (full API integration)
|
|
169
179
|
- Interactive provider selection (Hetzner / DigitalOcean)
|
|
170
180
|
- Step-based back navigation in all prompts
|
|
171
181
|
- Network wait loop + install logging for DigitalOcean cloud-init reliability
|
|
172
|
-
- 143 tests with 97%+ statement coverage
|
|
173
|
-
|
|
174
|
-
### v0.2.8 (2026-02-16)
|
|
175
|
-
- Replaced all `any` types with proper TypeScript interfaces
|
|
176
|
-
- Added ESLint 9 + Prettier for code quality enforcement
|
|
177
|
-
- Added CHANGELOG.md and CONTRIBUTING.md
|
|
178
|
-
|
|
179
|
-
### v0.2.7 (2026-02-16)
|
|
180
|
-
- Fixed inaccurate README/SECURITY claims
|
|
181
|
-
- Added npm keywords for better discoverability
|
|
182
|
-
|
|
183
|
-
### v0.2.6 (2026-02-16)
|
|
184
|
-
- CI: Upgraded Codecov action to v5
|
|
185
|
-
|
|
186
|
-
### v0.2.5 (2026-02-16)
|
|
187
|
-
- CI: Added Codecov integration for automatic coverage badge
|
|
188
|
-
|
|
189
|
-
### v0.2.4 (2026-02-15)
|
|
190
|
-
- Refactor: Removed recommended label, excluded failed server types from retry list
|
|
191
|
-
|
|
192
|
-
### v0.2.3 (2026-02-15)
|
|
193
|
-
- Fix: Unsupported error retry, dynamic deployment summary, dynamic recommended selection
|
|
194
|
-
|
|
195
|
-
### v0.2.2 (2026-02-15)
|
|
196
|
-
- Feat: Filter deprecated server types and add retry on unavailable
|
|
197
|
-
|
|
198
|
-
### v0.2.1 (2026-02-14)
|
|
199
|
-
- Fixed URL protocol (http for initial Coolify setup)
|
|
200
|
-
|
|
201
|
-
### v0.2.0 (2026-02-14)
|
|
202
|
-
- Added dynamic server type filtering based on selected location
|
|
203
|
-
- Auto firewall configuration (ports 8000, 22, 80, 443)
|
|
204
|
-
- Improved price formatting
|
|
205
|
-
- Removed debug logs
|
|
206
182
|
|
|
207
183
|
## 🗺️ Roadmap
|
|
208
184
|
|
|
@@ -236,14 +212,21 @@ For production use, we recommend setting up a domain instead of using the IP add
|
|
|
236
212
|
- [x] Step-based back navigation
|
|
237
213
|
- [x] Cloud-init reliability improvements (network wait, logging)
|
|
238
214
|
|
|
215
|
+
### v0.4.0 (Completed)
|
|
216
|
+
|
|
217
|
+
- [x] Server management commands (list, status, destroy)
|
|
218
|
+
- [x] Non-interactive mode for CI/CD
|
|
219
|
+
- [x] Coolify health check polling (replaces blind wait)
|
|
220
|
+
- [x] Server record persistence (`~/.quicklify/servers.json`)
|
|
221
|
+
- [x] `destroyServer()` on provider interface
|
|
222
|
+
- [x] Double confirmation safety for destroy
|
|
223
|
+
|
|
239
224
|
### Future
|
|
240
225
|
- [ ] Vultr support
|
|
241
226
|
- [ ] Linode support
|
|
242
227
|
- [ ] Domain configuration helper
|
|
243
228
|
- [ ] SSL certificate automation
|
|
244
|
-
- [ ] Health checks & monitoring
|
|
245
229
|
- [ ] Backup configuration
|
|
246
|
-
- [ ] Multi-server management
|
|
247
230
|
- [ ] Web dashboard
|
|
248
231
|
- [ ] GitHub Actions integration
|
|
249
232
|
|
|
@@ -264,9 +247,23 @@ For production use, we recommend setting up a domain instead of using the IP add
|
|
|
264
247
|
### Commands
|
|
265
248
|
|
|
266
249
|
```bash
|
|
267
|
-
# Deploy new Coolify instance
|
|
250
|
+
# Deploy new Coolify instance (interactive)
|
|
268
251
|
quicklify init
|
|
269
252
|
|
|
253
|
+
# Deploy non-interactively (CI/CD friendly)
|
|
254
|
+
quicklify init --provider hetzner --token YOUR_TOKEN --region nbg1 --size cax11 --name my-server
|
|
255
|
+
|
|
256
|
+
# List all registered servers
|
|
257
|
+
quicklify list
|
|
258
|
+
|
|
259
|
+
# Check server and Coolify status
|
|
260
|
+
quicklify status 123.45.67.89
|
|
261
|
+
quicklify status my-server
|
|
262
|
+
|
|
263
|
+
# Destroy a server (with double confirmation)
|
|
264
|
+
quicklify destroy 123.45.67.89
|
|
265
|
+
quicklify destroy my-server
|
|
266
|
+
|
|
270
267
|
# Show version
|
|
271
268
|
quicklify --version
|
|
272
269
|
|
|
@@ -274,6 +271,35 @@ quicklify --version
|
|
|
274
271
|
quicklify --help
|
|
275
272
|
```
|
|
276
273
|
|
|
274
|
+
### Non-Interactive Mode
|
|
275
|
+
|
|
276
|
+
Pass all options as flags to skip interactive prompts (useful for CI/CD pipelines):
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
quicklify init \
|
|
280
|
+
--provider hetzner \
|
|
281
|
+
--token $HETZNER_TOKEN \
|
|
282
|
+
--region nbg1 \
|
|
283
|
+
--size cax11 \
|
|
284
|
+
--name production-coolify
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
**Using environment variables (recommended for CI/CD):**
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
# Set token as environment variable (avoids shell history exposure)
|
|
291
|
+
export HETZNER_TOKEN="your-api-token"
|
|
292
|
+
# or
|
|
293
|
+
export DIGITALOCEAN_TOKEN="your-api-token"
|
|
294
|
+
|
|
295
|
+
# Token is read automatically from env var
|
|
296
|
+
quicklify init --provider hetzner --region nbg1 --size cax11 --name my-server
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
Token resolution order: `--token` flag > environment variable > interactive prompt.
|
|
300
|
+
|
|
301
|
+
If some flags are missing, only the missing values will be prompted interactively.
|
|
302
|
+
|
|
277
303
|
### Interactive Prompts
|
|
278
304
|
|
|
279
305
|
1. **Provider Selection** - Choose Hetzner Cloud or DigitalOcean
|
|
@@ -310,17 +336,28 @@ npm run format
|
|
|
310
336
|
|
|
311
337
|
```
|
|
312
338
|
tests/
|
|
313
|
-
├── __mocks__/
|
|
314
|
-
├── unit/
|
|
339
|
+
├── __mocks__/ # Mock modules (axios, inquirer, ora, chalk)
|
|
340
|
+
├── unit/ # Unit tests
|
|
315
341
|
│ ├── cloudInit.test.ts
|
|
342
|
+
│ ├── config.test.ts # Config CRUD operations
|
|
343
|
+
│ ├── config-edge.test.ts # Config edge cases (corruption, empty files)
|
|
344
|
+
│ ├── destroy.test.ts # Destroy command unit tests
|
|
345
|
+
│ ├── healthCheck.test.ts # Health check polling tests
|
|
346
|
+
│ ├── healthCheck-edge.test.ts # Health check edge cases (302, 401, 500)
|
|
347
|
+
│ ├── list.test.ts # List command unit tests
|
|
316
348
|
│ ├── logger.test.ts
|
|
317
349
|
│ ├── prompts.test.ts
|
|
350
|
+
│ ├── providerFactory.test.ts # Provider factory tests
|
|
351
|
+
│ ├── status.test.ts # Status command unit tests
|
|
318
352
|
│ └── validators.test.ts
|
|
319
|
-
├── integration/
|
|
320
|
-
│ ├── hetzner.test.ts
|
|
321
|
-
│ └── digitalocean.test.ts
|
|
322
|
-
└── e2e/
|
|
323
|
-
|
|
353
|
+
├── integration/ # Integration tests (provider API calls)
|
|
354
|
+
│ ├── hetzner.test.ts # Including destroyServer tests
|
|
355
|
+
│ └── digitalocean.test.ts # Including destroyServer tests
|
|
356
|
+
└── e2e/ # End-to-end tests (full command flows)
|
|
357
|
+
├── init.test.ts
|
|
358
|
+
├── init-noninteractive.test.ts # Non-interactive mode E2E
|
|
359
|
+
├── status.test.ts # Status command E2E
|
|
360
|
+
└── destroy.test.ts # Destroy command E2E
|
|
324
361
|
```
|
|
325
362
|
|
|
326
363
|
### CI/CD
|
|
@@ -332,7 +369,7 @@ Tests run automatically on every push/PR via GitHub Actions across:
|
|
|
332
369
|
|
|
333
370
|
### Coverage
|
|
334
371
|
|
|
335
|
-
Current coverage: **97%+ statements/lines**, **
|
|
372
|
+
Current coverage: **97%+ statements/lines**, **89%+ branches**, **96%+ functions**. 233 tests across 18 test suites.
|
|
336
373
|
|
|
337
374
|
## 🔧 Troubleshooting
|
|
338
375
|
|
package/SECURITY.md
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
| Version | Supported |
|
|
6
6
|
| ------- | ------------------ |
|
|
7
|
-
| 0.
|
|
7
|
+
| 0.4.x | :white_check_mark: |
|
|
8
|
+
| < 0.4 | :x: |
|
|
8
9
|
|
|
9
10
|
## Reporting a Vulnerability
|
|
10
11
|
|
|
@@ -24,15 +25,28 @@ Response time: Within 48 hours
|
|
|
24
25
|
|
|
25
26
|
- All dependencies scanned with Socket.dev
|
|
26
27
|
- No credentials stored in code
|
|
27
|
-
- API tokens
|
|
28
|
+
- API tokens can be provided via environment variables (`HETZNER_TOKEN`, `DIGITALOCEAN_TOKEN`) to avoid shell history exposure
|
|
29
|
+
- API tokens collected via interactive secure prompts (masked input) when env vars are not set
|
|
30
|
+
- Config directory created with restrictive permissions (`0o700`)
|
|
31
|
+
- Server config file written with `0o600` permissions (owner read/write only)
|
|
32
|
+
- Cloud-init install log restricted to `chmod 600` (root only)
|
|
33
|
+
- Server name validation: 3-63 chars, lowercase alphanumeric + hyphens, must start with letter
|
|
28
34
|
- Input validation on all user inputs
|
|
29
35
|
- Automated security checks via GitHub Actions
|
|
30
36
|
|
|
37
|
+
## HTTP Usage
|
|
38
|
+
|
|
39
|
+
Quicklify accesses Coolify at `http://IP:8000` during initial setup. This is expected because SSL/TLS is not configured on a fresh Coolify installation. Users are warned to set up a domain and enable SSL for production use.
|
|
40
|
+
|
|
31
41
|
## Third-party Dependencies
|
|
32
42
|
|
|
33
43
|
Quicklify uses audited dependencies:
|
|
34
|
-
- Hetzner Cloud API v1 (via Axios)
|
|
44
|
+
- Hetzner Cloud API v1 (via Axios, HTTPS)
|
|
45
|
+
- DigitalOcean API v2 (via Axios, HTTPS)
|
|
46
|
+
- Coolify installed via `curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash` (official method, HTTPS)
|
|
35
47
|
- All dependencies regularly updated
|
|
36
48
|
- Socket.dev security monitoring enabled
|
|
37
49
|
|
|
50
|
+
**Note:** The `curl | bash` installation method is the official Coolify installation procedure. The script is fetched over HTTPS from Coolify's CDN.
|
|
51
|
+
|
|
38
52
|
Security scan: https://socket.dev/npm/package/quicklify
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"AA6BA,wBAAsB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4ElE"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import inquirer from "inquirer";
|
|
2
|
+
import { getServers, findServer, removeServer } from "../utils/config.js";
|
|
3
|
+
import { createProviderWithToken } from "../utils/providerFactory.js";
|
|
4
|
+
import { logger, createSpinner } from "../utils/logger.js";
|
|
5
|
+
async function selectServer() {
|
|
6
|
+
const servers = getServers();
|
|
7
|
+
if (servers.length === 0) {
|
|
8
|
+
logger.info("No servers found.");
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
const { serverId } = await inquirer.prompt([
|
|
12
|
+
{
|
|
13
|
+
type: "list",
|
|
14
|
+
name: "serverId",
|
|
15
|
+
message: "Select a server to destroy:",
|
|
16
|
+
choices: servers.map((s) => ({
|
|
17
|
+
name: `${s.name} (${s.ip}) - ${s.provider}`,
|
|
18
|
+
value: s.id,
|
|
19
|
+
})),
|
|
20
|
+
},
|
|
21
|
+
]);
|
|
22
|
+
return servers.find((s) => s.id === serverId);
|
|
23
|
+
}
|
|
24
|
+
export async function destroyCommand(query) {
|
|
25
|
+
let server;
|
|
26
|
+
if (query) {
|
|
27
|
+
server = findServer(query);
|
|
28
|
+
if (!server) {
|
|
29
|
+
logger.error(`Server not found: ${query}`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
server = await selectServer();
|
|
35
|
+
if (!server)
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// First confirmation
|
|
39
|
+
const { confirm } = await inquirer.prompt([
|
|
40
|
+
{
|
|
41
|
+
type: "confirm",
|
|
42
|
+
name: "confirm",
|
|
43
|
+
message: `Are you sure you want to destroy "${server.name}" (${server.ip})?`,
|
|
44
|
+
default: false,
|
|
45
|
+
},
|
|
46
|
+
]);
|
|
47
|
+
if (!confirm) {
|
|
48
|
+
logger.info("Destroy cancelled.");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
// Second confirmation: type server name
|
|
52
|
+
const { confirmName } = await inquirer.prompt([
|
|
53
|
+
{
|
|
54
|
+
type: "input",
|
|
55
|
+
name: "confirmName",
|
|
56
|
+
message: `Type the server name "${server.name}" to confirm:`,
|
|
57
|
+
},
|
|
58
|
+
]);
|
|
59
|
+
if (confirmName.trim() !== server.name) {
|
|
60
|
+
logger.error("Server name does not match. Destroy cancelled.");
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Ask for API token
|
|
64
|
+
const { apiToken } = await inquirer.prompt([
|
|
65
|
+
{
|
|
66
|
+
type: "password",
|
|
67
|
+
name: "apiToken",
|
|
68
|
+
message: `Enter your ${server.provider} API token:`,
|
|
69
|
+
validate: (input) => (input.trim().length > 0 ? true : "API token is required"),
|
|
70
|
+
},
|
|
71
|
+
]);
|
|
72
|
+
const spinner = createSpinner("Destroying server...");
|
|
73
|
+
spinner.start();
|
|
74
|
+
try {
|
|
75
|
+
const provider = createProviderWithToken(server.provider, apiToken.trim());
|
|
76
|
+
await provider.destroyServer(server.id);
|
|
77
|
+
removeServer(server.id);
|
|
78
|
+
spinner.succeed(`Server "${server.name}" destroyed`);
|
|
79
|
+
logger.success("Server has been removed from your cloud provider and local config.");
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
83
|
+
const isNotFound = message.toLowerCase().includes("not found") || message.toLowerCase().includes("not_found");
|
|
84
|
+
if (isNotFound) {
|
|
85
|
+
removeServer(server.id);
|
|
86
|
+
spinner.warn(`Server not found on ${server.provider} (may have been deleted manually)`);
|
|
87
|
+
logger.info("Removed from local config.");
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
spinner.fail("Failed to destroy server");
|
|
91
|
+
logger.error(message);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=destroy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAgBrD,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiK1E"}
|