quicklify 1.1.0 → 1.2.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/LICENSE +1 -1
- package/README.md +48 -24
- package/README.tr.md +46 -22
- package/SECURITY.md +63 -34
- package/dist/commands/add.d.ts +1 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +48 -74
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/backup.d.ts +2 -11
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +111 -53
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/destroy.d.ts.map +1 -1
- package/dist/commands/destroy.js +58 -37
- package/dist/commands/destroy.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +16 -30
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/domain.d.ts +2 -9
- package/dist/commands/domain.d.ts.map +1 -1
- package/dist/commands/domain.js +47 -56
- package/dist/commands/domain.js.map +1 -1
- package/dist/commands/firewall.d.ts +3 -10
- package/dist/commands/firewall.d.ts.map +1 -1
- package/dist/commands/firewall.js +28 -51
- package/dist/commands/firewall.js.map +1 -1
- package/dist/commands/health.d.ts +2 -2
- package/dist/commands/health.d.ts.map +1 -1
- package/dist/commands/health.js +77 -19
- package/dist/commands/health.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +28 -306
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/interactive.d.ts +2 -0
- package/dist/commands/interactive.d.ts.map +1 -0
- package/dist/commands/interactive.js +357 -0
- package/dist/commands/interactive.js.map +1 -0
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +4 -2
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +9 -1
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/maintain.d.ts.map +1 -1
- package/dist/commands/maintain.js +28 -47
- package/dist/commands/maintain.js.map +1 -1
- package/dist/commands/monitor.js +1 -1
- package/dist/commands/monitor.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +25 -0
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/restart.d.ts.map +1 -1
- package/dist/commands/restart.js +39 -39
- package/dist/commands/restart.js.map +1 -1
- package/dist/commands/restore.d.ts +2 -13
- package/dist/commands/restore.d.ts.map +1 -1
- package/dist/commands/restore.js +42 -54
- package/dist/commands/restore.js.map +1 -1
- package/dist/commands/secure.d.ts +2 -9
- package/dist/commands/secure.d.ts.map +1 -1
- package/dist/commands/secure.js +2 -97
- package/dist/commands/secure.js.map +1 -1
- package/dist/commands/snapshot.d.ts.map +1 -1
- package/dist/commands/snapshot.js +55 -67
- package/dist/commands/snapshot.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +33 -16
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +23 -16
- package/dist/commands/update.js.map +1 -1
- package/dist/constants.d.ts +42 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +54 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/backup.d.ts +18 -2
- package/dist/core/backup.d.ts.map +1 -1
- package/dist/core/backup.js +184 -7
- package/dist/core/backup.js.map +1 -1
- package/dist/core/deploy.d.ts +4 -0
- package/dist/core/deploy.d.ts.map +1 -0
- package/dist/core/deploy.js +360 -0
- package/dist/core/deploy.js.map +1 -0
- package/dist/core/domain.d.ts.map +1 -1
- package/dist/core/domain.js +1 -5
- package/dist/core/domain.js.map +1 -1
- package/dist/core/firewall.d.ts +2 -0
- package/dist/core/firewall.d.ts.map +1 -1
- package/dist/core/firewall.js +12 -0
- package/dist/core/firewall.js.map +1 -1
- package/dist/core/logs.js +1 -1
- package/dist/core/logs.js.map +1 -1
- package/dist/core/maintain.d.ts.map +1 -1
- package/dist/core/maintain.js +1 -2
- package/dist/core/maintain.js.map +1 -1
- package/dist/core/manage.d.ts +10 -1
- package/dist/core/manage.d.ts.map +1 -1
- package/dist/core/manage.js +45 -7
- package/dist/core/manage.js.map +1 -1
- package/dist/core/provision.d.ts +2 -1
- package/dist/core/provision.d.ts.map +1 -1
- package/dist/core/provision.js +8 -13
- package/dist/core/provision.js.map +1 -1
- package/dist/core/secure.d.ts.map +1 -1
- package/dist/core/secure.js +8 -2
- package/dist/core/secure.js.map +1 -1
- package/dist/core/status.d.ts.map +1 -1
- package/dist/core/status.js +2 -1
- package/dist/core/status.js.map +1 -1
- package/dist/core/tokens.d.ts.map +1 -1
- package/dist/core/tokens.js +5 -8
- package/dist/core/tokens.js.map +1 -1
- package/dist/index.js +17 -4
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +13 -7
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/serverBackup.d.ts +2 -7
- package/dist/mcp/tools/serverBackup.d.ts.map +1 -1
- package/dist/mcp/tools/serverBackup.js +120 -234
- package/dist/mcp/tools/serverBackup.js.map +1 -1
- package/dist/mcp/tools/serverInfo.d.ts +19 -2
- package/dist/mcp/tools/serverInfo.d.ts.map +1 -1
- package/dist/mcp/tools/serverInfo.js +122 -57
- package/dist/mcp/tools/serverInfo.js.map +1 -1
- package/dist/mcp/tools/serverLogs.d.ts +2 -7
- package/dist/mcp/tools/serverLogs.d.ts.map +1 -1
- package/dist/mcp/tools/serverLogs.js +36 -57
- package/dist/mcp/tools/serverLogs.js.map +1 -1
- package/dist/mcp/tools/serverMaintain.d.ts +3 -8
- package/dist/mcp/tools/serverMaintain.d.ts.map +1 -1
- package/dist/mcp/tools/serverMaintain.js +48 -109
- package/dist/mcp/tools/serverMaintain.js.map +1 -1
- package/dist/mcp/tools/serverManage.d.ts +5 -0
- package/dist/mcp/tools/serverManage.d.ts.map +1 -1
- package/dist/mcp/tools/serverManage.js +94 -110
- package/dist/mcp/tools/serverManage.js.map +1 -1
- package/dist/mcp/tools/serverProvision.d.ts +7 -1
- package/dist/mcp/tools/serverProvision.d.ts.map +1 -1
- package/dist/mcp/tools/serverProvision.js +69 -77
- package/dist/mcp/tools/serverProvision.js.map +1 -1
- package/dist/mcp/tools/serverSecure.d.ts +2 -7
- package/dist/mcp/tools/serverSecure.d.ts.map +1 -1
- package/dist/mcp/tools/serverSecure.js +109 -170
- package/dist/mcp/tools/serverSecure.js.map +1 -1
- package/dist/mcp/utils.d.ts +42 -0
- package/dist/mcp/utils.d.ts.map +1 -0
- package/dist/mcp/utils.js +61 -0
- package/dist/mcp/utils.js.map +1 -0
- package/dist/providers/base.d.ts +9 -2
- package/dist/providers/base.d.ts.map +1 -1
- package/dist/providers/base.js +56 -1
- package/dist/providers/base.js.map +1 -1
- package/dist/providers/digitalocean.d.ts +3 -3
- package/dist/providers/digitalocean.d.ts.map +1 -1
- package/dist/providers/digitalocean.js +4 -12
- package/dist/providers/digitalocean.js.map +1 -1
- package/dist/providers/hetzner.d.ts +3 -3
- package/dist/providers/hetzner.d.ts.map +1 -1
- package/dist/providers/hetzner.js +8 -13
- package/dist/providers/hetzner.js.map +1 -1
- package/dist/providers/linode.d.ts +3 -3
- package/dist/providers/linode.d.ts.map +1 -1
- package/dist/providers/linode.js +3 -11
- package/dist/providers/linode.js.map +1 -1
- package/dist/providers/vultr.d.ts +3 -3
- package/dist/providers/vultr.d.ts.map +1 -1
- package/dist/providers/vultr.js +3 -11
- package/dist/providers/vultr.js.map +1 -1
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/cloudInit.d.ts +1 -0
- package/dist/utils/cloudInit.d.ts.map +1 -1
- package/dist/utils/cloudInit.js +62 -0
- package/dist/utils/cloudInit.js.map +1 -1
- package/dist/utils/config.js +1 -1
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/defaults.d.ts.map +1 -1
- package/dist/utils/defaults.js +3 -2
- package/dist/utils/defaults.js.map +1 -1
- package/dist/utils/errorMapper.d.ts.map +1 -1
- package/dist/utils/errorMapper.js +5 -1
- package/dist/utils/errorMapper.js.map +1 -1
- package/dist/utils/modeGuard.d.ts +5 -0
- package/dist/utils/modeGuard.d.ts.map +1 -0
- package/dist/utils/modeGuard.js +13 -0
- package/dist/utils/modeGuard.js.map +1 -0
- package/dist/utils/openBrowser.d.ts.map +1 -1
- package/dist/utils/openBrowser.js +3 -1
- package/dist/utils/openBrowser.js.map +1 -1
- package/dist/utils/prompts.d.ts +2 -2
- package/dist/utils/prompts.d.ts.map +1 -1
- package/dist/utils/prompts.js +8 -9
- package/dist/utils/prompts.js.map +1 -1
- package/dist/utils/serverSelect.d.ts.map +1 -1
- package/dist/utils/serverSelect.js +2 -7
- package/dist/utils/serverSelect.js.map +1 -1
- package/dist/utils/ssh.d.ts +9 -0
- package/dist/utils/ssh.d.ts.map +1 -1
- package/dist/utils/ssh.js +175 -15
- package/dist/utils/ssh.js.map +1 -1
- package/dist/utils/sshKey.d.ts.map +1 -1
- package/dist/utils/sshKey.js +3 -0
- package/dist/utils/sshKey.js.map +1 -1
- package/dist/utils/yamlConfig.d.ts.map +1 -1
- package/dist/utils/yamlConfig.js +4 -3
- package/dist/utils/yamlConfig.js.map +1 -1
- package/package.json +5 -5
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# quicklify
|
|
2
2
|
|
|
3
|
+
> Your self-hosted PaaS, fully managed. Deploy, secure, back up — one command at a time.
|
|
4
|
+
|
|
3
5
|
> English | [Türkçe](README.tr.md)
|
|
4
6
|
|
|
5
7
|

|
|
@@ -9,14 +11,11 @@
|
|
|
9
11
|

|
|
10
12
|

|
|
11
13
|
[](https://socket.dev/npm/package/quicklify)
|
|
12
|
-
|
|
13
|
-
**Self-hosting made simple.**
|
|
14
|
-
|
|
15
|
-
Deploy, secure, back up, snapshot, and maintain your servers with confidence.
|
|
14
|
+
[](https://quicklify.omrfc.dev)
|
|
16
15
|
|
|
17
16
|
## Why Quicklify Exists
|
|
18
17
|
|
|
19
|
-
Most self-hosted
|
|
18
|
+
Most self-hosted servers break because:
|
|
20
19
|
|
|
21
20
|
- No backup discipline
|
|
22
21
|
- No update strategy
|
|
@@ -24,19 +23,42 @@ Most self-hosted Coolify servers break because:
|
|
|
24
23
|
- No monitoring
|
|
25
24
|
- No snapshot routine
|
|
26
25
|
|
|
27
|
-
Stop babysitting your
|
|
26
|
+
Stop babysitting your servers. Quicklify was built to fix that.
|
|
28
27
|
|
|
29
28
|
## Quick Start
|
|
30
29
|
|
|
31
30
|
```bash
|
|
32
|
-
#
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
# Interactive mode — no commands to memorize
|
|
32
|
+
npx quicklify
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Running `quicklify` without any arguments launches an **interactive menu** where you can browse all available actions by category, pick what you need with arrow keys, and configure options step by step — no need to remember any command names or flags.
|
|
35
36
|
|
|
36
|
-
|
|
37
|
+
```
|
|
38
|
+
? What would you like to do?
|
|
39
|
+
Server Management
|
|
40
|
+
❯ Deploy a new server
|
|
41
|
+
Add an existing server
|
|
42
|
+
List all servers
|
|
43
|
+
Check server status
|
|
44
|
+
...
|
|
45
|
+
Security
|
|
46
|
+
Harden SSH & fail2ban
|
|
47
|
+
Manage firewall (UFW)
|
|
48
|
+
...
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Each action includes sub-options (server mode, template, log source, port number, etc.) and a **← Back** option to return to the main menu at any point.
|
|
52
|
+
|
|
53
|
+
If you already know the commands, you can still use them directly:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
quicklify init # Deploy a new server
|
|
57
|
+
quicklify status my-server # Check server status
|
|
58
|
+
quicklify backup --all # Backup all servers
|
|
37
59
|
```
|
|
38
60
|
|
|
39
|
-
|
|
61
|
+
Quicklify handles server provisioning, SSH key setup, firewall configuration, and platform installation automatically.
|
|
40
62
|
|
|
41
63
|
## What Makes Quicklify Different?
|
|
42
64
|
|
|
@@ -47,27 +69,30 @@ That's it. Quicklify handles server provisioning, SSH key setup, firewall config
|
|
|
47
69
|
| Security is an afterthought? | Firewall, SSH hardening, SSL, and security audits built-in |
|
|
48
70
|
| Backups? Maybe someday... | One-command backup & restore with manifest tracking |
|
|
49
71
|
| Managing multiple servers? | `--all` flag across backup, maintain, status, and health |
|
|
50
|
-
| Existing server not tracked? | `quicklify add` brings any
|
|
72
|
+
| Existing server not tracked? | `quicklify add` brings any server under management |
|
|
73
|
+
| Don't want to memorize commands? | Just run `quicklify` — interactive menu guides you |
|
|
51
74
|
|
|
52
75
|
## What Can You Do?
|
|
53
76
|
|
|
54
77
|
### Deploy
|
|
55
78
|
```bash
|
|
56
|
-
quicklify
|
|
79
|
+
quicklify # Interactive menu (recommended)
|
|
80
|
+
quicklify init # Interactive setup (direct)
|
|
57
81
|
quicklify init --provider hetzner # Non-interactive
|
|
58
82
|
quicklify init --config quicklify.yml # From YAML config
|
|
59
83
|
quicklify init --template production # Use a template
|
|
84
|
+
quicklify init --mode bare # Generic VPS (no Coolify)
|
|
60
85
|
```
|
|
61
86
|
|
|
62
87
|
### Manage
|
|
63
88
|
```bash
|
|
64
89
|
quicklify list # List all servers
|
|
65
|
-
quicklify status my-server # Check server
|
|
90
|
+
quicklify status my-server # Check server status
|
|
66
91
|
quicklify status --all # Check all servers
|
|
67
92
|
quicklify ssh my-server # SSH into server
|
|
68
93
|
quicklify restart my-server # Restart server
|
|
69
94
|
quicklify destroy my-server # Destroy cloud server entirely
|
|
70
|
-
quicklify add # Add existing
|
|
95
|
+
quicklify add # Add existing server
|
|
71
96
|
quicklify remove my-server # Remove from local config
|
|
72
97
|
quicklify config set key value # Manage default configuration
|
|
73
98
|
quicklify export # Export server list to JSON
|
|
@@ -76,7 +101,7 @@ quicklify import servers.json # Import servers from JSON
|
|
|
76
101
|
|
|
77
102
|
### Update & Maintain
|
|
78
103
|
```bash
|
|
79
|
-
quicklify update my-server # Update Coolify
|
|
104
|
+
quicklify update my-server # Update Coolify (Coolify servers)
|
|
80
105
|
quicklify maintain my-server # Full maintenance (snapshot + update + health + reboot)
|
|
81
106
|
quicklify maintain --all # Maintain all servers
|
|
82
107
|
```
|
|
@@ -108,7 +133,7 @@ quicklify domain add my-server --domain example.com # Set domain + SSL
|
|
|
108
133
|
### Monitor & Debug
|
|
109
134
|
```bash
|
|
110
135
|
quicklify monitor my-server # CPU, RAM, disk usage
|
|
111
|
-
quicklify logs my-server # View
|
|
136
|
+
quicklify logs my-server # View server logs
|
|
112
137
|
quicklify logs my-server -f # Follow logs
|
|
113
138
|
quicklify health # Health check all servers
|
|
114
139
|
quicklify doctor # Check local environment
|
|
@@ -157,7 +182,7 @@ quicklify init --template production --provider hetzner
|
|
|
157
182
|
|
|
158
183
|
## Security
|
|
159
184
|
|
|
160
|
-
Quicklify is built with security as a priority — **
|
|
185
|
+
Quicklify is built with security as a priority — **2,099 tests** across 78 suites, including dedicated security test suites.
|
|
161
186
|
|
|
162
187
|
- API tokens are never stored on disk — prompted at runtime or via environment variables
|
|
163
188
|
- SSH keys are auto-generated if needed (Ed25519)
|
|
@@ -188,8 +213,8 @@ Requires Node.js 20 or later.
|
|
|
188
213
|
**Server creation fails?**
|
|
189
214
|
Run `quicklify doctor --check-tokens` to verify your API token and local environment.
|
|
190
215
|
|
|
191
|
-
**
|
|
192
|
-
Use `quicklify status my-server --autostart` to check
|
|
216
|
+
**Server not responding?**
|
|
217
|
+
Use `quicklify status my-server --autostart` for Coolify servers, or `quicklify health` to check all servers at once.
|
|
193
218
|
|
|
194
219
|
**Need to start fresh?**
|
|
195
220
|
`quicklify destroy my-server` removes the cloud server entirely.
|
|
@@ -229,21 +254,20 @@ Available tools:
|
|
|
229
254
|
| `server_maintain` | update, restart, maintain | Update Coolify, restart servers, run full maintenance |
|
|
230
255
|
| `server_secure` | secure, firewall, domain | SSH hardening, firewall rules, domain/SSL management (10 subcommands) |
|
|
231
256
|
| `server_backup` | backup, snapshot | Backup/restore databases and create/manage VPS snapshots |
|
|
232
|
-
| `server_provision` | create | Provision new
|
|
257
|
+
| `server_provision` | create | Provision new servers on cloud providers |
|
|
233
258
|
|
|
234
259
|
> All destructive operations (destroy, restore, snapshot-delete, provision, restart, maintain, snapshot-create) require `SAFE_MODE=false` to execute.
|
|
235
260
|
|
|
236
261
|
## What's Next
|
|
237
262
|
|
|
238
263
|
- Scheduled maintenance (cron-based automatic upkeep)
|
|
239
|
-
-
|
|
240
|
-
- Interactive TUI dashboard
|
|
264
|
+
- Dokploy platform support (`--platform dokploy`)
|
|
241
265
|
|
|
242
266
|
## Philosophy
|
|
243
267
|
|
|
244
268
|
> Infrastructure should be boring, predictable, and safe.
|
|
245
269
|
|
|
246
|
-
Quicklify is not a script. It's your DevOps safety layer for
|
|
270
|
+
Quicklify is not a script. It's your DevOps safety layer for self-hosted infrastructure.
|
|
247
271
|
|
|
248
272
|
## License
|
|
249
273
|
|
package/README.tr.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# quicklify
|
|
2
2
|
|
|
3
|
+
> Self-hosted PaaS'ınız, tamamen yönetilen. Deploy, güvenlik, yedekleme — tek komutla.
|
|
4
|
+
|
|
3
5
|
> [English](README.md) | Türkçe
|
|
4
6
|
|
|
5
7
|

|
|
@@ -9,14 +11,11 @@
|
|
|
9
11
|

|
|
10
12
|

|
|
11
13
|
[](https://socket.dev/npm/package/quicklify)
|
|
12
|
-
|
|
13
|
-
**Self-hosting basitleştirildi.**
|
|
14
|
-
|
|
15
|
-
Sunucularınızı deploy edin, güvence altına alın, yedekleyin, snapshot alın ve bakımını yapın — güvenle.
|
|
14
|
+
[](https://quicklify.omrfc.dev)
|
|
16
15
|
|
|
17
16
|
## Quicklify Neden Var?
|
|
18
17
|
|
|
19
|
-
Self-hosted
|
|
18
|
+
Self-hosted sunucuların çoğu şu nedenlerle çöker:
|
|
20
19
|
|
|
21
20
|
- Yedekleme disiplini yok
|
|
22
21
|
- Güncelleme stratejisi yok
|
|
@@ -24,19 +23,42 @@ Self-hosted Coolify sunucularının çoğu şu nedenlerle çöker:
|
|
|
24
23
|
- İzleme yok
|
|
25
24
|
- Snapshot rutini yok
|
|
26
25
|
|
|
27
|
-
|
|
26
|
+
Sunucularınıza çocuk bakıcılığı yapmayı bırakın. Quicklify bunu çözmek için yapıldı.
|
|
28
27
|
|
|
29
28
|
## Hızlı Başlangıç
|
|
30
29
|
|
|
31
30
|
```bash
|
|
32
|
-
#
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
# İnteraktif mod — komut ezberlemeye gerek yok
|
|
32
|
+
npx quicklify
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`quicklify` komutunu argümansız çalıştırdığınızda **interaktif bir menü** açılır. Tüm işlemleri kategorilere göre görebilir, ok tuşlarıyla seçim yapabilir ve alt seçenekleri adım adım yapılandırabilirsiniz — komut adı veya flag ezberlemek zorunda değilsiniz.
|
|
35
36
|
|
|
36
|
-
|
|
37
|
+
```
|
|
38
|
+
? What would you like to do?
|
|
39
|
+
Server Management
|
|
40
|
+
❯ Deploy a new server
|
|
41
|
+
Add an existing server
|
|
42
|
+
List all servers
|
|
43
|
+
Check server status
|
|
44
|
+
...
|
|
45
|
+
Security
|
|
46
|
+
Harden SSH & fail2ban
|
|
47
|
+
Manage firewall (UFW)
|
|
48
|
+
...
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Her işlem alt seçenekler (sunucu modu, şablon, log kaynağı, port numarası vb.) içerir ve istediğiniz noktada ana menüye dönmek için **← Back** seçeneği sunar.
|
|
52
|
+
|
|
53
|
+
Komutları zaten biliyorsanız, doğrudan da kullanabilirsiniz:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
quicklify init # Yeni sunucu kur
|
|
57
|
+
quicklify status sunucum # Sunucu durumunu kontrol et
|
|
58
|
+
quicklify backup --all # Tüm sunucuları yedekle
|
|
37
59
|
```
|
|
38
60
|
|
|
39
|
-
|
|
61
|
+
Quicklify sunucu oluşturma, SSH anahtar kurulumu, güvenlik duvarı yapılandırması ve platform kurulumunu otomatik yapar.
|
|
40
62
|
|
|
41
63
|
## Quicklify'ı Farklı Kılan Ne?
|
|
42
64
|
|
|
@@ -47,27 +69,30 @@ Hepsi bu kadar. Quicklify sunucu oluşturma, SSH anahtar kurulumu, güvenlik duv
|
|
|
47
69
|
| Güvenlik sonradan mı düşünülüyor? | Güvenlik duvarı, SSH sıkılaştırma, SSL ve güvenlik denetimi hazır |
|
|
48
70
|
| Yedekleme? Belki bir gün... | Tek komutla yedekleme ve geri yükleme, manifest takibiyle |
|
|
49
71
|
| Birden fazla sunucu mu yönetiyorsunuz? | Yedekleme, bakım, durum ve sağlıkta `--all` desteği |
|
|
50
|
-
| Mevcut sunucu takip dışı mı? | `quicklify add` ile her
|
|
72
|
+
| Mevcut sunucu takip dışı mı? | `quicklify add` ile her sunucuyu yönetime alın |
|
|
73
|
+
| Komutları ezberlemek mi? | `quicklify` yazın — interaktif menü sizi yönlendirir |
|
|
51
74
|
|
|
52
75
|
## Neler Yapabilirsiniz?
|
|
53
76
|
|
|
54
77
|
### Kurulum
|
|
55
78
|
```bash
|
|
56
|
-
quicklify
|
|
79
|
+
quicklify # İnteraktif menü (önerilen)
|
|
80
|
+
quicklify init # İnteraktif kurulum (doğrudan)
|
|
57
81
|
quicklify init --provider hetzner # Otomatik kurulum
|
|
58
82
|
quicklify init --config quicklify.yml # YAML ile kurulum
|
|
59
83
|
quicklify init --template production # Şablon kullanarak
|
|
84
|
+
quicklify init --mode bare # Genel VPS (Coolify olmadan)
|
|
60
85
|
```
|
|
61
86
|
|
|
62
87
|
### Yönetim
|
|
63
88
|
```bash
|
|
64
89
|
quicklify list # Sunucuları listele
|
|
65
|
-
quicklify status sunucum # Sunucu
|
|
90
|
+
quicklify status sunucum # Sunucu durumu
|
|
66
91
|
quicklify status --all # Tüm sunucuları kontrol et
|
|
67
92
|
quicklify ssh sunucum # Sunucuya SSH bağlantısı
|
|
68
93
|
quicklify restart sunucum # Sunucuyu yeniden başlat
|
|
69
94
|
quicklify destroy sunucum # Bulut sunucusunu tamamen sil
|
|
70
|
-
quicklify add # Mevcut
|
|
95
|
+
quicklify add # Mevcut sunucu ekle
|
|
71
96
|
quicklify remove sunucum # Yerel yapılandırmadan kaldır
|
|
72
97
|
quicklify config set key value # Varsayılan yapılandırma yönet
|
|
73
98
|
quicklify export # Sunucu listesini JSON'a aktar
|
|
@@ -76,7 +101,7 @@ quicklify import servers.json # JSON'dan sunucuları içe aktar
|
|
|
76
101
|
|
|
77
102
|
### Güncelleme ve Bakım
|
|
78
103
|
```bash
|
|
79
|
-
quicklify update sunucum # Coolify
|
|
104
|
+
quicklify update sunucum # Coolify güncelle (Coolify sunucuları)
|
|
80
105
|
quicklify maintain sunucum # Tam bakım (snapshot + güncelleme + sağlık + yeniden başlatma)
|
|
81
106
|
quicklify maintain --all # Tüm sunucuları bakıma al
|
|
82
107
|
```
|
|
@@ -108,7 +133,7 @@ quicklify domain add sunucum --domain ornek.com # Domain + SSL ayarla
|
|
|
108
133
|
### İzleme ve Hata Ayıklama
|
|
109
134
|
```bash
|
|
110
135
|
quicklify monitor sunucum # CPU, RAM, disk kullanımı
|
|
111
|
-
quicklify logs sunucum #
|
|
136
|
+
quicklify logs sunucum # Sunucu logları
|
|
112
137
|
quicklify logs sunucum -f # Logları canlı takip et
|
|
113
138
|
quicklify health # Tüm sunucuların sağlık kontrolü
|
|
114
139
|
quicklify doctor # Yerel ortam kontrolü
|
|
@@ -157,7 +182,7 @@ quicklify init --template production --provider hetzner
|
|
|
157
182
|
|
|
158
183
|
## Güvenlik
|
|
159
184
|
|
|
160
|
-
Quicklify güvenlik öncelikli olarak geliştirilmektedir —
|
|
185
|
+
Quicklify güvenlik öncelikli olarak geliştirilmektedir — 78 test suite'inde **2.099 test**, özel güvenlik test suite'leri dahil.
|
|
161
186
|
|
|
162
187
|
- API token'ları asla diske kaydedilmez — çalışma zamanında sorulur veya ortam değişkenlerinden alınır
|
|
163
188
|
- SSH anahtarları gerekirse otomatik oluşturulur (Ed25519)
|
|
@@ -229,21 +254,20 @@ Mevcut araçlar:
|
|
|
229
254
|
| `server_maintain` | update, restart, maintain | Coolify güncelle, sunucuları yeniden başlat, tam bakım yap |
|
|
230
255
|
| `server_secure` | secure, firewall, domain | SSH sıkılaştırma, güvenlik duvarı kuralları, domain/SSL yönetimi (10 alt komut) |
|
|
231
256
|
| `server_backup` | backup, snapshot | Veritabanı yedekle/geri yükle ve VPS snapshot oluştur/yönet |
|
|
232
|
-
| `server_provision` | create | Bulut sağlayıcılarda yeni
|
|
257
|
+
| `server_provision` | create | Bulut sağlayıcılarda yeni sunucu oluştur |
|
|
233
258
|
|
|
234
259
|
> Tüm yıkıcı işlemler (destroy, restore, snapshot-delete, provision, restart, maintain, snapshot-create) çalıştırılmak için `SAFE_MODE=false` gerektirir.
|
|
235
260
|
|
|
236
261
|
## Gelecek Planlar
|
|
237
262
|
|
|
238
263
|
- Zamanlanmış bakım (cron tabanlı otomatik bakım)
|
|
239
|
-
-
|
|
240
|
-
- İnteraktif TUI arayüzü
|
|
264
|
+
- Dokploy platform desteği (`--platform dokploy`)
|
|
241
265
|
|
|
242
266
|
## Felsefe
|
|
243
267
|
|
|
244
268
|
> Altyapı sıkıcı, öngörülebilir ve güvenli olmalıdır.
|
|
245
269
|
|
|
246
|
-
Quicklify bir script değildir.
|
|
270
|
+
Quicklify bir script değildir. Self-hosted altyapınız için DevOps güvenlik katmanınızdır.
|
|
247
271
|
|
|
248
272
|
## Lisans
|
|
249
273
|
|
package/SECURITY.md
CHANGED
|
@@ -21,55 +21,81 @@ If you discover a security vulnerability in Quicklify:
|
|
|
21
21
|
|
|
22
22
|
Response time: Within 48 hours
|
|
23
23
|
|
|
24
|
-
## Security
|
|
24
|
+
## Security Architecture
|
|
25
25
|
|
|
26
|
-
###
|
|
27
|
-
- API tokens are
|
|
26
|
+
### Token Handling (A2 — Sensitive Data Exposure)
|
|
27
|
+
- API tokens are **never stored on disk** — runtime prompt or environment variables only
|
|
28
28
|
- Supported env vars: `HETZNER_TOKEN`, `DIGITALOCEAN_TOKEN`, `VULTR_TOKEN`, `LINODE_TOKEN`
|
|
29
29
|
- API tokens collected via interactive secure prompts (masked input) when env vars are not set
|
|
30
|
-
-
|
|
30
|
+
- `sanitizedEnv()` strips all keys containing TOKEN, SECRET, PASSWORD, CREDENTIAL from child process environments before every `spawn`/`spawnSync`/`exec` call
|
|
31
|
+
- Provider errors sanitized via `stripSensitiveData()` — removes Authorization headers, request data, response headers, and non-whitelisted response body fields from axios errors before they propagate via error cause chains
|
|
31
32
|
|
|
32
|
-
### Input Validation
|
|
33
|
-
- All
|
|
34
|
-
- `assertValidIp()` — IPv4 format
|
|
33
|
+
### Input Validation (A1 — Injection)
|
|
34
|
+
- All shell execution uses `spawn`/`spawnSync` with array arguments (never string interpolation into shell commands)
|
|
35
|
+
- `assertValidIp()` — IPv4 format and octet range (0-255) validation applied before every SSH/SCP connection and before ssh-keygen calls (defense-in-depth)
|
|
36
|
+
- `assertSafePath()` — rejects remote SCP paths containing shell metacharacters (`;`, `|`, `&`, `$`, `` ` ``, `(`, `)`, `<`, `>`, newlines, spaces)
|
|
35
37
|
- Server name validation: 3-63 chars, lowercase alphanumeric + hyphens, must start with letter
|
|
36
|
-
-
|
|
38
|
+
- `buildHardeningCommand()` — SSH port option validated as integer in range 1-65535 before interpolation into sed command
|
|
37
39
|
- YAML config: 22+ security key patterns detected and warned
|
|
40
|
+
- MCP tools: Zod schema validation on all inputs (port ranges, provider enums, backup ID regex)
|
|
38
41
|
|
|
39
|
-
###
|
|
42
|
+
### SSH & Network Security
|
|
43
|
+
- `StrictHostKeyChecking=accept-new` for initial connections (first connect accepts key, subsequent connections verify)
|
|
44
|
+
- `BatchMode=yes` on non-interactive SSH (prevents stdin hijacking — critical for MCP mode)
|
|
45
|
+
- `ConnectTimeout=10` and 30s exec timeout prevent hanging connections
|
|
46
|
+
- Stale host key auto-removal with IP re-validation before `ssh-keygen -R` calls
|
|
47
|
+
- SSRF defense: `assertValidIp()` on all Coolify health check targets
|
|
48
|
+
|
|
49
|
+
### File System Security (A5 — Security Misconfiguration)
|
|
40
50
|
- Config directory (`~/.quicklify/`) created with `0o700` permissions (owner only)
|
|
41
51
|
- Server config file written with `0o600` permissions (owner read/write only)
|
|
52
|
+
- Backup directories created with `0o700` permissions
|
|
42
53
|
- Backup manifest files written with `0o600` permissions
|
|
43
54
|
- Export files written with `0o600` permissions
|
|
44
55
|
- Cloud-init install log restricted to `chmod 600` (root only)
|
|
45
56
|
|
|
46
|
-
###
|
|
47
|
-
-
|
|
48
|
-
-
|
|
49
|
-
- `
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
- `
|
|
57
|
-
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
### Import/Export
|
|
57
|
+
### Error Handling & Data Exposure
|
|
58
|
+
- `getErrorMessage()` returns only `error.message` — never exposes stack traces to users
|
|
59
|
+
- `sanitizeStderr()` redacts home directory paths, IP addresses, `password=`, `token=`, `secret=` patterns from SSH stderr output (200 char limit)
|
|
60
|
+
- MCP error responses use `getErrorMessage()` — no stack trace disclosure
|
|
61
|
+
|
|
62
|
+
### Path Traversal Protection (A5)
|
|
63
|
+
- Backup restore: `backupId` regex validation + `path.resolve()` guard ensures backup path stays within the server's backup directory
|
|
64
|
+
- Remote SCP paths validated by `assertSafePath()` before use
|
|
65
|
+
|
|
66
|
+
### Access Control (A3 — Broken Access Control)
|
|
67
|
+
- **SAFE_MODE** (`QUICKLIFY_SAFE_MODE=true`, default enabled for MCP) blocks destructive operations: `destroy`, `restore`, `snapshot-delete`, `provision`, `restart`, `maintain`, `snapshot-create`
|
|
68
|
+
- Mode guard (`requireCoolifyMode()`) prevents Coolify-specific operations on bare servers
|
|
69
|
+
|
|
70
|
+
### Import/Export Security
|
|
61
71
|
- Sensitive field stripping on import
|
|
62
72
|
- Strict file permissions on export
|
|
63
73
|
- Format validation with field-level checking
|
|
64
74
|
- Duplicate detection by server ID
|
|
65
75
|
|
|
66
|
-
##
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
76
|
+
## OWASP Top 10 Compliance Summary
|
|
77
|
+
|
|
78
|
+
| Category | Status | Implementation |
|
|
79
|
+
|----------|--------|----------------|
|
|
80
|
+
| A1 - Injection | Mitigated | `spawn` array args, `assertValidIp`, `assertSafePath`, port integer validation |
|
|
81
|
+
| A2 - Sensitive Data Exposure | Mitigated | `sanitizedEnv()` on all child processes, `stripSensitiveData()` on provider errors, tokens never on disk |
|
|
82
|
+
| A3 - Broken Access Control | Mitigated | SAFE_MODE blocks destructive ops, mode guard on Coolify-only ops |
|
|
83
|
+
| A4 - Insecure Design | N/A | CLI tool, minimal attack surface |
|
|
84
|
+
| A5 - Security Misconfiguration | Mitigated | Restrictive file permissions (0o600/0o700), timeout limits, buffer caps |
|
|
85
|
+
| A6 - Vulnerable Components | See below | Production: 0 vulnerabilities |
|
|
86
|
+
| A7 - XSS | N/A | CLI tool, no web UI |
|
|
87
|
+
| A8 - Insecure Deserialization | Mitigated | JSON.parse wrapped in try/catch with safe defaults |
|
|
88
|
+
| A9 - Logging & Monitoring | Partial | `sanitizeStderr()` prevents sensitive data in logs |
|
|
89
|
+
| A10 - SSRF | Mitigated | `assertValidIp()` on all outbound SSH/HTTP targets |
|
|
90
|
+
|
|
91
|
+
## Dependency Security
|
|
92
|
+
|
|
93
|
+
### Production Dependencies (0 known vulnerabilities)
|
|
94
|
+
```
|
|
95
|
+
npm audit --omit=dev → found 0 vulnerabilities
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
All production dependencies use audited, versioned packages:
|
|
73
99
|
- Hetzner Cloud API v1 (via Axios, HTTPS)
|
|
74
100
|
- DigitalOcean API v2 (via Axios, HTTPS)
|
|
75
101
|
- Vultr API v2 (via Axios, HTTPS)
|
|
@@ -77,9 +103,12 @@ Quicklify uses audited dependencies:
|
|
|
77
103
|
- Model Context Protocol SDK (`@modelcontextprotocol/sdk`) for MCP server
|
|
78
104
|
- Zod for runtime input validation
|
|
79
105
|
- Coolify installed via `curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash` (official method, HTTPS)
|
|
80
|
-
- All dependencies regularly updated
|
|
81
|
-
- Socket.dev security monitoring enabled
|
|
82
106
|
|
|
83
|
-
|
|
107
|
+
### Dev Dependencies
|
|
108
|
+
One moderate-severity ReDoS vulnerability remains in `test-exclude` → `glob` → `minimatch@10.0.0-10.2.2` (jest code coverage toolchain). This is a dev-only dependency not present in production builds. Remediation is blocked by the dependency chain — `npm audit fix --force` would cause lock file breakage per project policy. Risk accepted as dev-only, not exploitable in production.
|
|
84
109
|
|
|
85
110
|
Security scan: https://socket.dev/npm/package/quicklify
|
|
111
|
+
|
|
112
|
+
## HTTP Usage
|
|
113
|
+
|
|
114
|
+
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.
|
package/dist/commands/add.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AASA,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;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,UAAU,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA0HxE"}
|
package/dist/commands/add.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import inquirer from "inquirer";
|
|
2
2
|
import ora from "ora";
|
|
3
3
|
import chalk from "chalk";
|
|
4
|
-
import { getServers, saveServer } from "../utils/config.js";
|
|
5
4
|
import { promptApiToken } from "../utils/serverSelect.js";
|
|
6
|
-
import {
|
|
7
|
-
import { sshExec, checkSshAvailable } from "../utils/ssh.js";
|
|
5
|
+
import { addServerRecord } from "../core/manage.js";
|
|
8
6
|
import { logger } from "../utils/logger.js";
|
|
7
|
+
import { SUPPORTED_PROVIDERS, PROVIDER_DISPLAY_NAMES, invalidProviderError } from "../constants.js";
|
|
9
8
|
export async function addCommand(options = {}) {
|
|
10
9
|
// Step 1: Select provider
|
|
11
10
|
let providerName = options.provider;
|
|
@@ -15,35 +14,22 @@ export async function addCommand(options = {}) {
|
|
|
15
14
|
type: "list",
|
|
16
15
|
name: "provider",
|
|
17
16
|
message: "Select cloud provider:",
|
|
18
|
-
choices:
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
{ name: "Linode (Akamai)", value: "linode" },
|
|
23
|
-
],
|
|
17
|
+
choices: SUPPORTED_PROVIDERS.map((p) => ({
|
|
18
|
+
name: PROVIDER_DISPLAY_NAMES[p],
|
|
19
|
+
value: p,
|
|
20
|
+
})),
|
|
24
21
|
},
|
|
25
22
|
]);
|
|
26
23
|
providerName = provider;
|
|
27
24
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
logger.error(`Invalid provider: ${providerName}. Use: ${validProviders.join(", ")}`);
|
|
25
|
+
if (!SUPPORTED_PROVIDERS.includes(providerName)) {
|
|
26
|
+
logger.error(invalidProviderError(providerName));
|
|
31
27
|
process.exit(1);
|
|
32
28
|
return;
|
|
33
29
|
}
|
|
34
30
|
// Step 2: Get API token
|
|
35
|
-
const
|
|
36
|
-
|
|
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
|
|
31
|
+
const apiToken = await promptApiToken(providerName);
|
|
32
|
+
// Step 3: Get server IP
|
|
47
33
|
let serverIp = options.ip;
|
|
48
34
|
if (!serverIp) {
|
|
49
35
|
const { ip } = await inquirer.prompt([
|
|
@@ -68,23 +54,16 @@ export async function addCommand(options = {}) {
|
|
|
68
54
|
]);
|
|
69
55
|
serverIp = ip.trim();
|
|
70
56
|
}
|
|
71
|
-
// Step
|
|
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
|
|
57
|
+
// Step 4: Get server name
|
|
80
58
|
let serverName = options.name;
|
|
81
59
|
if (!serverName) {
|
|
60
|
+
const defaultName = options.mode === "bare" ? "bare-server" : "coolify-server";
|
|
82
61
|
const { name } = await inquirer.prompt([
|
|
83
62
|
{
|
|
84
63
|
type: "input",
|
|
85
64
|
name: "name",
|
|
86
65
|
message: "Server name:",
|
|
87
|
-
default:
|
|
66
|
+
default: defaultName,
|
|
88
67
|
validate: (input) => {
|
|
89
68
|
const trimmed = input.trim();
|
|
90
69
|
if (!trimmed)
|
|
@@ -101,50 +80,45 @@ export async function addCommand(options = {}) {
|
|
|
101
80
|
]);
|
|
102
81
|
serverName = name.trim();
|
|
103
82
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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,
|
|
83
|
+
const spinner = ora("Adding server...").start();
|
|
84
|
+
// Delegate all business logic to core
|
|
85
|
+
const result = await addServerRecord({
|
|
136
86
|
provider: providerName,
|
|
137
87
|
ip: serverIp,
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
88
|
+
name: serverName,
|
|
89
|
+
skipVerify: options.skipVerify,
|
|
90
|
+
apiToken,
|
|
91
|
+
...(options.mode ? { mode: options.mode } : {}),
|
|
92
|
+
});
|
|
93
|
+
if (!result.success) {
|
|
94
|
+
spinner.fail(result.error ?? "Failed to add server");
|
|
95
|
+
process.exit(1);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// Handle SSH unavailable (non-fatal)
|
|
99
|
+
if (result.coolifyStatus === "ssh_unavailable") {
|
|
100
|
+
spinner.warn("SSH not available. Use --skip-verify to skip Coolify verification.");
|
|
101
|
+
process.exit(1);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const server = result.server;
|
|
105
|
+
if (result.coolifyStatus === "running") {
|
|
106
|
+
spinner.succeed("Coolify is running");
|
|
107
|
+
}
|
|
108
|
+
else if (result.coolifyStatus === "containers_detected") {
|
|
109
|
+
spinner.succeed("Coolify containers detected");
|
|
110
|
+
}
|
|
111
|
+
else if (result.coolifyStatus === "skipped") {
|
|
112
|
+
spinner.succeed("Token validated");
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
spinner.warn("Could not verify Coolify. Server added anyway.");
|
|
116
|
+
}
|
|
143
117
|
console.log();
|
|
144
118
|
console.log(chalk.green("Server added successfully!"));
|
|
145
|
-
console.log(` Name: ${
|
|
146
|
-
console.log(` IP: ${
|
|
147
|
-
console.log(` Provider: ${provider
|
|
119
|
+
console.log(` Name: ${server.name}`);
|
|
120
|
+
console.log(` IP: ${server.ip}`);
|
|
121
|
+
console.log(` Provider: ${server.provider}`);
|
|
148
122
|
console.log();
|
|
149
123
|
console.log("All commands now work for this server (status, update, backup, etc.)");
|
|
150
124
|
}
|