swarmy 0.1.2 → 0.2.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 +34 -5
- package/bin/swarmy.js +171 -15
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -39,7 +39,35 @@ Provision ephemeral Docker containers across multiple nodes and interact with th
|
|
|
39
39
|
- Docker
|
|
40
40
|
- npm
|
|
41
41
|
|
|
42
|
-
###
|
|
42
|
+
### Using npx (recommended)
|
|
43
|
+
|
|
44
|
+
**Manager:**
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npx --yes swarmy@latest manager start
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
This prints the token and connection instructions for workers.
|
|
51
|
+
|
|
52
|
+
**Worker** (on each node):
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npx --yes swarmy@latest worker start --url http://<manager-ip>:5174 --token <token>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Other commands:**
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npx swarmy manager status # Show PID + token
|
|
62
|
+
npx swarmy manager stop # Stop manager
|
|
63
|
+
npx swarmy manager restart # Restart manager
|
|
64
|
+
npx swarmy worker status # Show worker PID
|
|
65
|
+
npx swarmy worker stop # Stop worker
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### From source (development)
|
|
69
|
+
|
|
70
|
+
**Manager:**
|
|
43
71
|
|
|
44
72
|
```bash
|
|
45
73
|
cd manager
|
|
@@ -49,9 +77,7 @@ npm run dev
|
|
|
49
77
|
|
|
50
78
|
The manager starts on port 5174. An auth token is auto-generated at `manager/data/token` on first run.
|
|
51
79
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
On each node that will run containers:
|
|
80
|
+
**Worker** (on each node):
|
|
55
81
|
|
|
56
82
|
```bash
|
|
57
83
|
cd worker
|
|
@@ -90,7 +116,7 @@ Installs to `/opt/swarm`. Services auto-restart on failure.
|
|
|
90
116
|
|
|
91
117
|
| Variable | Component | Description |
|
|
92
118
|
| --------------- | --------- | -------------------------------------- |
|
|
93
|
-
| `PORT` | Manager | HTTP port (default:
|
|
119
|
+
| `PORT` | Manager | HTTP port (default: 5174) |
|
|
94
120
|
| `SWARM_URL` | Worker | Manager URL to connect to |
|
|
95
121
|
| `SWARM_TOKEN` | Worker | Auth token for registration |
|
|
96
122
|
| `SWARM_NODE_ID` | Worker | Node identifier (default: hostname) |
|
|
@@ -110,6 +136,9 @@ All REST endpoints require `Authorization: Bearer <token>` header.
|
|
|
110
136
|
| `POST` | `/api/sessions` | Spawn terminal session in container |
|
|
111
137
|
| `DELETE` | `/api/sessions/:id` | Kill session |
|
|
112
138
|
| `POST` | `/api/sessions/:id/input` | Send input to session |
|
|
139
|
+
| `PATCH` | `/api/sessions/:id` | Toggle interactive mode |
|
|
140
|
+
| `POST` | `/api/containers/:id/thumbnail` | Upload VNC thumbnail (base64 JPEG) |
|
|
141
|
+
| `GET` | `/api/containers/:id/thumbnail` | Get VNC thumbnail (supports `?token=`) |
|
|
113
142
|
| `GET` | `/api/status` | Server status |
|
|
114
143
|
|
|
115
144
|
## Tech Stack
|
package/bin/swarmy.js
CHANGED
|
@@ -139,31 +139,177 @@ const cliArgs = process.argv.slice(2);
|
|
|
139
139
|
const role = cliArgs[0];
|
|
140
140
|
const action = cliArgs[1];
|
|
141
141
|
|
|
142
|
-
|
|
142
|
+
const hasFlag = (flag) => cliArgs.includes(flag);
|
|
143
|
+
|
|
144
|
+
function parseFlag(flag) {
|
|
145
|
+
const idx = cliArgs.indexOf(flag);
|
|
146
|
+
if (idx === -1 || idx + 1 >= cliArgs.length) return undefined;
|
|
147
|
+
return cliArgs[idx + 1];
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function usageMain() {
|
|
143
151
|
console.log(`
|
|
144
152
|
swarmy - Distributed container management
|
|
145
153
|
|
|
146
154
|
Usage:
|
|
147
|
-
swarmy manager
|
|
155
|
+
swarmy manager <command> Manage the central server
|
|
156
|
+
swarmy worker <command> Manage a worker node
|
|
157
|
+
swarmy --help Show this help
|
|
158
|
+
|
|
159
|
+
Run 'swarmy manager --help' or 'swarmy worker --help' for command details.
|
|
160
|
+
`);
|
|
161
|
+
process.exit(0);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function usageManager() {
|
|
165
|
+
console.log(`
|
|
166
|
+
swarmy manager - Manage the central server
|
|
167
|
+
|
|
168
|
+
Commands:
|
|
169
|
+
start [--port PORT] Start the manager (default port: 5174)
|
|
170
|
+
stop Stop the manager
|
|
171
|
+
restart [--port PORT] Restart the manager
|
|
172
|
+
status Show manager status and token
|
|
173
|
+
|
|
174
|
+
Examples:
|
|
175
|
+
swarmy manager start
|
|
176
|
+
swarmy manager start --port 3000
|
|
177
|
+
swarmy manager status
|
|
178
|
+
swarmy manager stop
|
|
179
|
+
`);
|
|
180
|
+
process.exit(0);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function usageWorker() {
|
|
184
|
+
console.log(`
|
|
185
|
+
swarmy worker - Manage a worker node
|
|
186
|
+
|
|
187
|
+
Commands:
|
|
188
|
+
start --url URL --token TOKEN [--hostname NAME]
|
|
189
|
+
Connect worker to a manager
|
|
190
|
+
stop Stop the worker
|
|
191
|
+
restart --url URL --token TOKEN [--hostname NAME]
|
|
192
|
+
Restart the worker
|
|
193
|
+
status Show worker status
|
|
194
|
+
|
|
195
|
+
Examples:
|
|
196
|
+
swarmy worker start --url http://192.168.1.10:5174 --token abc123
|
|
197
|
+
swarmy worker start --url http://manager:5174 --token abc123 --hostname gpu-node-01
|
|
198
|
+
swarmy worker status
|
|
199
|
+
swarmy worker stop
|
|
200
|
+
`);
|
|
201
|
+
process.exit(0);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Only handle --help at top level (swarmy --help) or role level (swarmy manager --help)
|
|
205
|
+
// Action-level help (swarmy manager start --help) is handled in the switch cases
|
|
206
|
+
if (role === "--help" || role === "-h") usageMain();
|
|
207
|
+
|
|
208
|
+
if (!role) usageMain();
|
|
209
|
+
if (!action) {
|
|
210
|
+
if (role === "manager") usageManager();
|
|
211
|
+
else if (role === "worker") usageWorker();
|
|
212
|
+
else usageMain();
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function usageManagerStart() {
|
|
216
|
+
console.log(`
|
|
217
|
+
swarmy manager start - Start the central server
|
|
218
|
+
|
|
219
|
+
Options:
|
|
220
|
+
--port PORT HTTP port (default: 5174)
|
|
221
|
+
|
|
222
|
+
Examples:
|
|
223
|
+
swarmy manager start
|
|
224
|
+
swarmy manager start --port 3000
|
|
225
|
+
`);
|
|
226
|
+
process.exit(0);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function usageManagerStop() {
|
|
230
|
+
console.log(`
|
|
231
|
+
swarmy manager stop - Stop the central server
|
|
232
|
+
|
|
233
|
+
Usage:
|
|
148
234
|
swarmy manager stop
|
|
149
|
-
|
|
235
|
+
`);
|
|
236
|
+
process.exit(0);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
function usageManagerRestart() {
|
|
240
|
+
console.log(`
|
|
241
|
+
swarmy manager restart - Restart the central server
|
|
242
|
+
|
|
243
|
+
Options:
|
|
244
|
+
--port PORT HTTP port (default: 5174)
|
|
245
|
+
|
|
246
|
+
Examples:
|
|
247
|
+
swarmy manager restart
|
|
248
|
+
swarmy manager restart --port 3000
|
|
249
|
+
`);
|
|
250
|
+
process.exit(0);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function usageManagerStatus() {
|
|
254
|
+
console.log(`
|
|
255
|
+
swarmy manager status - Show manager status and token
|
|
256
|
+
|
|
257
|
+
Usage:
|
|
150
258
|
swarmy manager status
|
|
259
|
+
`);
|
|
260
|
+
process.exit(0);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function usageWorkerStart() {
|
|
264
|
+
console.log(`
|
|
265
|
+
swarmy worker start - Connect worker to a manager
|
|
266
|
+
|
|
267
|
+
Options:
|
|
268
|
+
--url URL Manager URL (required)
|
|
269
|
+
--token TOKEN Auth token (required)
|
|
270
|
+
--hostname NAME Custom hostname identifier
|
|
271
|
+
|
|
272
|
+
Examples:
|
|
273
|
+
swarmy worker start --url http://192.168.1.10:5174 --token abc123
|
|
274
|
+
swarmy worker start --url http://manager:5174 --token abc123 --hostname gpu-node-01
|
|
275
|
+
`);
|
|
276
|
+
process.exit(0);
|
|
277
|
+
}
|
|
151
278
|
|
|
152
|
-
|
|
279
|
+
function usageWorkerStop() {
|
|
280
|
+
console.log(`
|
|
281
|
+
swarmy worker stop - Stop the worker
|
|
282
|
+
|
|
283
|
+
Usage:
|
|
153
284
|
swarmy worker stop
|
|
154
|
-
swarmy worker restart --url URL --token TOKEN [--hostname NAME]
|
|
155
|
-
swarmy worker status
|
|
156
285
|
`);
|
|
157
|
-
process.exit(
|
|
286
|
+
process.exit(0);
|
|
158
287
|
}
|
|
159
288
|
|
|
160
|
-
function
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
289
|
+
function usageWorkerRestart() {
|
|
290
|
+
console.log(`
|
|
291
|
+
swarmy worker restart - Restart the worker
|
|
292
|
+
|
|
293
|
+
Options:
|
|
294
|
+
--url URL Manager URL (required)
|
|
295
|
+
--token TOKEN Auth token (required)
|
|
296
|
+
--hostname NAME Custom hostname identifier
|
|
297
|
+
|
|
298
|
+
Examples:
|
|
299
|
+
swarmy worker restart --url http://192.168.1.10:5174 --token abc123
|
|
300
|
+
`);
|
|
301
|
+
process.exit(0);
|
|
164
302
|
}
|
|
165
303
|
|
|
166
|
-
|
|
304
|
+
function usageWorkerStatus() {
|
|
305
|
+
console.log(`
|
|
306
|
+
swarmy worker status - Show worker status
|
|
307
|
+
|
|
308
|
+
Usage:
|
|
309
|
+
swarmy worker status
|
|
310
|
+
`);
|
|
311
|
+
process.exit(0);
|
|
312
|
+
}
|
|
167
313
|
|
|
168
314
|
function startManager() {
|
|
169
315
|
const port = parseFlag("--port") ?? "5174";
|
|
@@ -189,44 +335,54 @@ function startWorker() {
|
|
|
189
335
|
}
|
|
190
336
|
|
|
191
337
|
if (role === "manager") {
|
|
338
|
+
if (action === "--help" || action === "-h") usageManager();
|
|
192
339
|
switch (action) {
|
|
193
340
|
case "start":
|
|
341
|
+
if (hasFlag("--help") || hasFlag("-h")) usageManagerStart();
|
|
194
342
|
startManager();
|
|
195
343
|
break;
|
|
196
344
|
case "stop":
|
|
345
|
+
if (hasFlag("--help") || hasFlag("-h")) usageManagerStop();
|
|
197
346
|
stopProcess("manager");
|
|
198
347
|
break;
|
|
199
348
|
case "restart":
|
|
349
|
+
if (hasFlag("--help") || hasFlag("-h")) usageManagerRestart();
|
|
200
350
|
stopProcess("manager");
|
|
201
351
|
setTimeout(startManager, 1000);
|
|
202
352
|
break;
|
|
203
353
|
case "status":
|
|
354
|
+
if (hasFlag("--help") || hasFlag("-h")) usageManagerStatus();
|
|
204
355
|
showStatus("manager");
|
|
205
356
|
if (getStatus("manager").running) {
|
|
206
357
|
console.log(`Token: ${ensureToken()}`);
|
|
207
358
|
}
|
|
208
359
|
break;
|
|
209
360
|
default:
|
|
210
|
-
|
|
361
|
+
usageManager();
|
|
211
362
|
}
|
|
212
363
|
} else if (role === "worker") {
|
|
364
|
+
if (action === "--help" || action === "-h") usageWorker();
|
|
213
365
|
switch (action) {
|
|
214
366
|
case "start":
|
|
367
|
+
if (hasFlag("--help") || hasFlag("-h")) usageWorkerStart();
|
|
215
368
|
startWorker();
|
|
216
369
|
break;
|
|
217
370
|
case "stop":
|
|
371
|
+
if (hasFlag("--help") || hasFlag("-h")) usageWorkerStop();
|
|
218
372
|
stopProcess("worker");
|
|
219
373
|
break;
|
|
220
374
|
case "restart":
|
|
375
|
+
if (hasFlag("--help") || hasFlag("-h")) usageWorkerRestart();
|
|
221
376
|
stopProcess("worker");
|
|
222
377
|
setTimeout(startWorker, 1000);
|
|
223
378
|
break;
|
|
224
379
|
case "status":
|
|
380
|
+
if (hasFlag("--help") || hasFlag("-h")) usageWorkerStatus();
|
|
225
381
|
showStatus("worker");
|
|
226
382
|
break;
|
|
227
383
|
default:
|
|
228
|
-
|
|
384
|
+
usageWorker();
|
|
229
385
|
}
|
|
230
386
|
} else {
|
|
231
|
-
|
|
387
|
+
usageMain();
|
|
232
388
|
}
|