@minecraft-docker/mcctl 1.6.0 → 1.6.2
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/dist/application/index.d.ts +2 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +5 -0
- package/dist/application/index.js.map +1 -0
- package/dist/commands/backup.d.ts +16 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +182 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/ban.d.ts +14 -0
- package/dist/commands/ban.d.ts.map +1 -0
- package/dist/commands/ban.js +418 -0
- package/dist/commands/ban.js.map +1 -0
- package/dist/commands/config.d.ts +18 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +106 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/console/api.d.ts +19 -0
- package/dist/commands/console/api.d.ts.map +1 -0
- package/dist/commands/console/api.js +399 -0
- package/dist/commands/console/api.js.map +1 -0
- package/dist/commands/console/index.d.ts +10 -0
- package/dist/commands/console/index.d.ts.map +1 -0
- package/dist/commands/console/index.js +12 -0
- package/dist/commands/console/index.js.map +1 -0
- package/dist/commands/console/init.d.ts +47 -0
- package/dist/commands/console/init.d.ts.map +1 -0
- package/dist/commands/console/init.js +491 -0
- package/dist/commands/console/init.js.map +1 -0
- package/dist/commands/console/remove.d.ts +25 -0
- package/dist/commands/console/remove.d.ts.map +1 -0
- package/dist/commands/console/remove.js +189 -0
- package/dist/commands/console/remove.js.map +1 -0
- package/dist/commands/console/service.d.ts +40 -0
- package/dist/commands/console/service.d.ts.map +1 -0
- package/dist/commands/console/service.js +321 -0
- package/dist/commands/console/service.js.map +1 -0
- package/dist/commands/console/user.d.ts +17 -0
- package/dist/commands/console/user.d.ts.map +1 -0
- package/dist/commands/console/user.js +431 -0
- package/dist/commands/console/user.js.map +1 -0
- package/dist/commands/create.d.ts +22 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +86 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +17 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +74 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/exec.d.ts +10 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +29 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/index.d.ts +21 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +23 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +218 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/kick.d.ts +12 -0
- package/dist/commands/kick.d.ts.map +1 -0
- package/dist/commands/kick.js +71 -0
- package/dist/commands/kick.js.map +1 -0
- package/dist/commands/migrate.d.ts +18 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +470 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/mod.d.ts +19 -0
- package/dist/commands/mod.d.ts.map +1 -0
- package/dist/commands/mod.js +441 -0
- package/dist/commands/mod.js.map +1 -0
- package/dist/commands/msg.d.ts +12 -0
- package/dist/commands/msg.d.ts.map +1 -0
- package/dist/commands/msg.js +273 -0
- package/dist/commands/msg.js.map +1 -0
- package/dist/commands/op.d.ts +12 -0
- package/dist/commands/op.d.ts.map +1 -0
- package/dist/commands/op.js +220 -0
- package/dist/commands/op.js.map +1 -0
- package/dist/commands/player-online.d.ts +11 -0
- package/dist/commands/player-online.d.ts.map +1 -0
- package/dist/commands/player-online.js +153 -0
- package/dist/commands/player-online.js.map +1 -0
- package/dist/commands/player.d.ts +18 -0
- package/dist/commands/player.d.ts.map +1 -0
- package/dist/commands/player.js +352 -0
- package/dist/commands/player.js.map +1 -0
- package/dist/commands/server-backup.d.ts +36 -0
- package/dist/commands/server-backup.d.ts.map +1 -0
- package/dist/commands/server-backup.js +320 -0
- package/dist/commands/server-backup.js.map +1 -0
- package/dist/commands/server-restore.d.ts +13 -0
- package/dist/commands/server-restore.d.ts.map +1 -0
- package/dist/commands/server-restore.js +294 -0
- package/dist/commands/server-restore.js.map +1 -0
- package/dist/commands/status.d.ts +13 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +325 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/whitelist.d.ts +12 -0
- package/dist/commands/whitelist.d.ts.map +1 -0
- package/dist/commands/whitelist.js +316 -0
- package/dist/commands/whitelist.js.map +1 -0
- package/dist/commands/world.d.ts +18 -0
- package/dist/commands/world.d.ts.map +1 -0
- package/dist/commands/world.js +238 -0
- package/dist/commands/world.js.map +1 -0
- package/dist/domain/index.d.ts +2 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +7 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +766 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts +30 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.js +430 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts +78 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js +391 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/index.d.ts +4 -0
- package/dist/infrastructure/adapters/index.d.ts.map +1 -0
- package/dist/infrastructure/adapters/index.js +6 -0
- package/dist/infrastructure/adapters/index.js.map +1 -0
- package/dist/infrastructure/di/container.d.ts +47 -0
- package/dist/infrastructure/di/container.d.ts.map +1 -0
- package/dist/infrastructure/di/container.js +140 -0
- package/dist/infrastructure/di/container.js.map +1 -0
- package/dist/infrastructure/di/index.d.ts +2 -0
- package/dist/infrastructure/di/index.d.ts.map +1 -0
- package/dist/infrastructure/di/index.js +2 -0
- package/dist/infrastructure/di/index.js.map +1 -0
- package/dist/infrastructure/index.d.ts +5 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +8 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/lib/admin-config.d.ts +66 -0
- package/dist/lib/admin-config.d.ts.map +1 -0
- package/dist/lib/admin-config.js +130 -0
- package/dist/lib/admin-config.js.map +1 -0
- package/dist/lib/mojang-api.d.ts +51 -0
- package/dist/lib/mojang-api.d.ts.map +1 -0
- package/dist/lib/mojang-api.js +136 -0
- package/dist/lib/mojang-api.js.map +1 -0
- package/dist/lib/player-cache.d.ts +79 -0
- package/dist/lib/player-cache.d.ts.map +1 -0
- package/dist/lib/player-cache.js +302 -0
- package/dist/lib/player-cache.js.map +1 -0
- package/dist/lib/player-json.d.ts +69 -0
- package/dist/lib/player-json.d.ts.map +1 -0
- package/dist/lib/player-json.js +96 -0
- package/dist/lib/player-json.js.map +1 -0
- package/dist/lib/pm2-utils.d.ts +71 -0
- package/dist/lib/pm2-utils.d.ts.map +1 -0
- package/dist/lib/pm2-utils.js +155 -0
- package/dist/lib/pm2-utils.js.map +1 -0
- package/dist/lib/prompts/action-select.d.ts +23 -0
- package/dist/lib/prompts/action-select.d.ts.map +1 -0
- package/dist/lib/prompts/action-select.js +124 -0
- package/dist/lib/prompts/action-select.js.map +1 -0
- package/dist/lib/prompts/index.d.ts +7 -0
- package/dist/lib/prompts/index.d.ts.map +1 -0
- package/dist/lib/prompts/index.js +7 -0
- package/dist/lib/prompts/index.js.map +1 -0
- package/dist/lib/prompts/ip-select.d.ts +25 -0
- package/dist/lib/prompts/ip-select.d.ts.map +1 -0
- package/dist/lib/prompts/ip-select.js +255 -0
- package/dist/lib/prompts/ip-select.js.map +1 -0
- package/dist/lib/prompts/player-select.d.ts +25 -0
- package/dist/lib/prompts/player-select.d.ts.map +1 -0
- package/dist/lib/prompts/player-select.js +122 -0
- package/dist/lib/prompts/player-select.js.map +1 -0
- package/dist/lib/prompts/server-select.d.ts +26 -0
- package/dist/lib/prompts/server-select.d.ts.map +1 -0
- package/dist/lib/prompts/server-select.js +99 -0
- package/dist/lib/prompts/server-select.js.map +1 -0
- package/dist/lib/rcon.d.ts +53 -0
- package/dist/lib/rcon.d.ts.map +1 -0
- package/dist/lib/rcon.js +131 -0
- package/dist/lib/rcon.js.map +1 -0
- package/dist/lib/shell.d.ts +111 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +321 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/sudo-utils.d.ts +14 -0
- package/dist/lib/sudo-utils.d.ts.map +1 -0
- package/dist/lib/sudo-utils.js +53 -0
- package/dist/lib/sudo-utils.js.map +1 -0
- package/package.json +8 -2
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console init command options
|
|
3
|
+
*/
|
|
4
|
+
export interface ConsoleInitOptions {
|
|
5
|
+
root?: string;
|
|
6
|
+
force?: boolean;
|
|
7
|
+
apiPort?: number;
|
|
8
|
+
consolePort?: number;
|
|
9
|
+
}
|
|
10
|
+
export type AdminInitOptions = ConsoleInitOptions;
|
|
11
|
+
/**
|
|
12
|
+
* Check Node.js version meets requirements
|
|
13
|
+
* @returns Object with version check result
|
|
14
|
+
*/
|
|
15
|
+
export declare function checkNodeVersion(): {
|
|
16
|
+
valid: boolean;
|
|
17
|
+
version: string;
|
|
18
|
+
required: number;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Delete admin images (legacy - now a no-op for backward compatibility)
|
|
22
|
+
* @deprecated Use PM2 process management instead
|
|
23
|
+
*/
|
|
24
|
+
export declare function deleteAdminImages(): {
|
|
25
|
+
success: boolean;
|
|
26
|
+
deleted: string[];
|
|
27
|
+
errors: string[];
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Execute console init command
|
|
31
|
+
*
|
|
32
|
+
* Interactive flow:
|
|
33
|
+
* 1. Check Node.js version (>= 18)
|
|
34
|
+
* 2. Check PM2 installation
|
|
35
|
+
* 3. Check if already initialized
|
|
36
|
+
* 4. If exists: prompt for reinitialize confirmation (unless --force)
|
|
37
|
+
* 5. Cleanup existing config if reinitializing
|
|
38
|
+
* 6. Prompt for admin username
|
|
39
|
+
* 7. Prompt for admin password (with confirmation)
|
|
40
|
+
* 8. Prompt for API access mode
|
|
41
|
+
* 9. Generate API key if needed
|
|
42
|
+
* 10. Generate ecosystem.config.cjs
|
|
43
|
+
* 11. Save configuration and user
|
|
44
|
+
*/
|
|
45
|
+
export declare function consoleInitCommand(options: ConsoleInitOptions): Promise<number>;
|
|
46
|
+
export declare const adminInitCommand: typeof consoleInitCommand;
|
|
47
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/console/init.ts"],"names":[],"mappings":"AAsBA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AAOlD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI;IAClC,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CASA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAQA;AAkID;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAqXjB;AAGD,eAAO,MAAM,gBAAgB,2BAAqB,CAAC"}
|
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { existsSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { Paths, log, colors, User, Username, YamlUserRepository, } from '@minecraft-docker/shared';
|
|
4
|
+
import { getContainer } from '../../infrastructure/index.js';
|
|
5
|
+
import { AdminConfigManager, } from '../../lib/admin-config.js';
|
|
6
|
+
import { Pm2ServiceManagerAdapter } from '../../infrastructure/adapters/Pm2ServiceManagerAdapter.js';
|
|
7
|
+
import { checkPm2Installation, ECOSYSTEM_CONFIG_FILE, PM2_SERVICE_NAMES, } from '../../lib/pm2-utils.js';
|
|
8
|
+
/**
|
|
9
|
+
* Minimum required Node.js version
|
|
10
|
+
*/
|
|
11
|
+
const MIN_NODE_VERSION = 18;
|
|
12
|
+
/**
|
|
13
|
+
* Check Node.js version meets requirements
|
|
14
|
+
* @returns Object with version check result
|
|
15
|
+
*/
|
|
16
|
+
export function checkNodeVersion() {
|
|
17
|
+
const version = process.version.replace('v', '');
|
|
18
|
+
const majorVersion = parseInt(version.split('.')[0] ?? '0', 10);
|
|
19
|
+
return {
|
|
20
|
+
valid: majorVersion >= MIN_NODE_VERSION,
|
|
21
|
+
version,
|
|
22
|
+
required: MIN_NODE_VERSION,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Delete admin images (legacy - now a no-op for backward compatibility)
|
|
27
|
+
* @deprecated Use PM2 process management instead
|
|
28
|
+
*/
|
|
29
|
+
export function deleteAdminImages() {
|
|
30
|
+
// In PM2 mode, we don't use Docker images
|
|
31
|
+
// This function is kept for backward compatibility
|
|
32
|
+
return {
|
|
33
|
+
success: true,
|
|
34
|
+
deleted: [],
|
|
35
|
+
errors: [],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Stop admin services using PM2
|
|
40
|
+
*/
|
|
41
|
+
async function stopAdminServices(paths) {
|
|
42
|
+
const pm2Adapter = new Pm2ServiceManagerAdapter(paths);
|
|
43
|
+
try {
|
|
44
|
+
// Check if services exist and stop them
|
|
45
|
+
for (const serviceName of [PM2_SERVICE_NAMES.API, PM2_SERVICE_NAMES.CONSOLE]) {
|
|
46
|
+
const exists = await pm2Adapter.exists(serviceName);
|
|
47
|
+
if (exists) {
|
|
48
|
+
await pm2Adapter.delete(serviceName);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
pm2Adapter.disconnect();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Generate ecosystem.config.cjs content
|
|
62
|
+
*/
|
|
63
|
+
function generateEcosystemConfig(apiPort, consolePort) {
|
|
64
|
+
return `// ecosystem.config.cjs
|
|
65
|
+
// =============================================================================
|
|
66
|
+
// PM2 Ecosystem Configuration for Minecraft Admin Service
|
|
67
|
+
// =============================================================================
|
|
68
|
+
// This file is auto-generated by 'mcctl console init' command.
|
|
69
|
+
// It configures PM2 to run mcctl-api and mcctl-console services.
|
|
70
|
+
//
|
|
71
|
+
// Usage:
|
|
72
|
+
// pm2 start ecosystem.config.cjs # Start all services
|
|
73
|
+
// pm2 stop all # Stop all services
|
|
74
|
+
// pm2 restart all # Restart all services
|
|
75
|
+
// pm2 logs # View logs
|
|
76
|
+
// pm2 status # Check status
|
|
77
|
+
//
|
|
78
|
+
// Installation:
|
|
79
|
+
// npm install -g pm2
|
|
80
|
+
// pm2 startup # Configure auto-start on boot
|
|
81
|
+
// pm2 save # Save current process list
|
|
82
|
+
// =============================================================================
|
|
83
|
+
|
|
84
|
+
module.exports = {
|
|
85
|
+
apps: [
|
|
86
|
+
{
|
|
87
|
+
name: 'mcctl-api',
|
|
88
|
+
script: 'node_modules/@minecraft-docker/mcctl-api/dist/index.js',
|
|
89
|
+
cwd: process.env.MCCTL_ROOT || '.',
|
|
90
|
+
env: {
|
|
91
|
+
NODE_ENV: 'production',
|
|
92
|
+
PORT: ${apiPort},
|
|
93
|
+
HOST: '0.0.0.0',
|
|
94
|
+
MCCTL_ROOT: process.env.MCCTL_ROOT || '.',
|
|
95
|
+
},
|
|
96
|
+
instances: 1,
|
|
97
|
+
exec_mode: 'fork',
|
|
98
|
+
watch: false,
|
|
99
|
+
autorestart: true,
|
|
100
|
+
max_memory_restart: '500M',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'mcctl-console',
|
|
104
|
+
script: 'node_modules/@minecraft-docker/mcctl-console/.next/standalone/platform/services/mcctl-console/server.js',
|
|
105
|
+
cwd: process.env.MCCTL_ROOT || '.',
|
|
106
|
+
env: {
|
|
107
|
+
NODE_ENV: 'production',
|
|
108
|
+
PORT: ${consolePort},
|
|
109
|
+
HOSTNAME: '0.0.0.0',
|
|
110
|
+
MCCTL_API_URL: 'http://localhost:${apiPort}',
|
|
111
|
+
MCCTL_ROOT: process.env.MCCTL_ROOT || '.',
|
|
112
|
+
},
|
|
113
|
+
instances: 1,
|
|
114
|
+
exec_mode: 'fork',
|
|
115
|
+
watch: false,
|
|
116
|
+
autorestart: true,
|
|
117
|
+
max_memory_restart: '500M',
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
};
|
|
121
|
+
`;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Cleanup existing configuration and services
|
|
125
|
+
* Called when --force flag is used or user confirms reinitialize
|
|
126
|
+
*/
|
|
127
|
+
async function cleanupExistingConfig(paths, configManager, prompt) {
|
|
128
|
+
const spinner = prompt.spinner();
|
|
129
|
+
// Step 1: Stop PM2 services
|
|
130
|
+
spinner.start('Stopping console services...');
|
|
131
|
+
const stopResult = await stopAdminServices(paths);
|
|
132
|
+
if (!stopResult) {
|
|
133
|
+
spinner.stop('Warning: Failed to stop some services');
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
spinner.stop('Console services stopped');
|
|
137
|
+
}
|
|
138
|
+
// Step 2: Delete config files
|
|
139
|
+
spinner.start('Cleaning up configuration files...');
|
|
140
|
+
const filesToDelete = [
|
|
141
|
+
configManager.path, // .mcctl-admin.yml
|
|
142
|
+
join(paths.root, 'users.yaml'),
|
|
143
|
+
join(paths.platform, ECOSYSTEM_CONFIG_FILE), // ecosystem.config.cjs
|
|
144
|
+
];
|
|
145
|
+
for (const file of filesToDelete) {
|
|
146
|
+
if (existsSync(file)) {
|
|
147
|
+
try {
|
|
148
|
+
unlinkSync(file);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Ignore errors
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
spinner.stop('Configuration files cleaned up');
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Execute console init command
|
|
160
|
+
*
|
|
161
|
+
* Interactive flow:
|
|
162
|
+
* 1. Check Node.js version (>= 18)
|
|
163
|
+
* 2. Check PM2 installation
|
|
164
|
+
* 3. Check if already initialized
|
|
165
|
+
* 4. If exists: prompt for reinitialize confirmation (unless --force)
|
|
166
|
+
* 5. Cleanup existing config if reinitializing
|
|
167
|
+
* 6. Prompt for admin username
|
|
168
|
+
* 7. Prompt for admin password (with confirmation)
|
|
169
|
+
* 8. Prompt for API access mode
|
|
170
|
+
* 9. Generate API key if needed
|
|
171
|
+
* 10. Generate ecosystem.config.cjs
|
|
172
|
+
* 11. Save configuration and user
|
|
173
|
+
*/
|
|
174
|
+
export async function consoleInitCommand(options) {
|
|
175
|
+
// Check Node.js version first
|
|
176
|
+
const nodeCheck = checkNodeVersion();
|
|
177
|
+
if (!nodeCheck.valid) {
|
|
178
|
+
log.error(`Node.js version ${nodeCheck.version} is not supported. Minimum required: v${nodeCheck.required}`);
|
|
179
|
+
log.info('Please upgrade Node.js: https://nodejs.org/');
|
|
180
|
+
return 1;
|
|
181
|
+
}
|
|
182
|
+
// Check PM2 installation
|
|
183
|
+
const pm2Check = checkPm2Installation();
|
|
184
|
+
if (!pm2Check.installed) {
|
|
185
|
+
log.error('PM2 is not installed.');
|
|
186
|
+
log.info('Install PM2 globally with: npm install -g pm2');
|
|
187
|
+
return 1;
|
|
188
|
+
}
|
|
189
|
+
const paths = new Paths(options.root);
|
|
190
|
+
// Check if platform is initialized
|
|
191
|
+
if (!paths.isInitialized()) {
|
|
192
|
+
log.error('Platform not initialized. Run: mcctl init');
|
|
193
|
+
return 1;
|
|
194
|
+
}
|
|
195
|
+
const container = getContainer({ rootDir: options.root });
|
|
196
|
+
const prompt = container.promptPort;
|
|
197
|
+
const configManager = new AdminConfigManager(options.root);
|
|
198
|
+
// Check if already initialized
|
|
199
|
+
if (configManager.isInitialized()) {
|
|
200
|
+
const existingConfig = await configManager.load();
|
|
201
|
+
if (existingConfig && !options.force) {
|
|
202
|
+
// Show existing config info
|
|
203
|
+
log.warn('Console Service is already initialized');
|
|
204
|
+
console.log(` Config: ${colors.cyan(configManager.path)}`);
|
|
205
|
+
console.log(` Initialized: ${colors.dim(existingConfig.initialized_at)}`);
|
|
206
|
+
console.log('');
|
|
207
|
+
// Prompt for reinitialize
|
|
208
|
+
try {
|
|
209
|
+
const shouldReinitialize = await prompt.confirm({
|
|
210
|
+
message: 'Existing configuration found. Reinitialize? (This will delete all settings and stop services)',
|
|
211
|
+
initialValue: false,
|
|
212
|
+
});
|
|
213
|
+
if (prompt.isCancel(shouldReinitialize) || !shouldReinitialize) {
|
|
214
|
+
console.log('');
|
|
215
|
+
console.log(' To reinitialize with --force, use:');
|
|
216
|
+
console.log(` ${colors.dim('mcctl console init --force')}`);
|
|
217
|
+
console.log('');
|
|
218
|
+
return 0;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
if (prompt.isCancel(error)) {
|
|
223
|
+
return 0;
|
|
224
|
+
}
|
|
225
|
+
throw error;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Cleanup existing config (either --force or user confirmed)
|
|
229
|
+
await cleanupExistingConfig(paths, configManager, prompt);
|
|
230
|
+
console.log('');
|
|
231
|
+
}
|
|
232
|
+
try {
|
|
233
|
+
prompt.intro('Initialize Console Service');
|
|
234
|
+
// Show environment info
|
|
235
|
+
console.log(colors.dim(` Node.js: v${nodeCheck.version}`));
|
|
236
|
+
console.log(colors.dim(` PM2: ${pm2Check.version ?? 'installed'}`));
|
|
237
|
+
console.log('');
|
|
238
|
+
// Step 1: Admin username
|
|
239
|
+
const username = await prompt.text({
|
|
240
|
+
message: 'Admin username?',
|
|
241
|
+
placeholder: 'admin',
|
|
242
|
+
initialValue: 'admin',
|
|
243
|
+
validate: (value) => {
|
|
244
|
+
try {
|
|
245
|
+
Username.create(value);
|
|
246
|
+
return undefined;
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
return error instanceof Error
|
|
250
|
+
? error.message
|
|
251
|
+
: 'Invalid username format';
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
// Step 2: Admin password
|
|
256
|
+
const password = await prompt.password({
|
|
257
|
+
message: 'Admin password?',
|
|
258
|
+
validate: (value) => {
|
|
259
|
+
if (!value || value.length < 8) {
|
|
260
|
+
return 'Password must be at least 8 characters';
|
|
261
|
+
}
|
|
262
|
+
// Check for basic password strength
|
|
263
|
+
if (!/[A-Z]/.test(value)) {
|
|
264
|
+
return 'Password must contain at least one uppercase letter';
|
|
265
|
+
}
|
|
266
|
+
if (!/[a-z]/.test(value)) {
|
|
267
|
+
return 'Password must contain at least one lowercase letter';
|
|
268
|
+
}
|
|
269
|
+
if (!/[0-9]/.test(value)) {
|
|
270
|
+
return 'Password must contain at least one number';
|
|
271
|
+
}
|
|
272
|
+
return undefined;
|
|
273
|
+
},
|
|
274
|
+
});
|
|
275
|
+
// Step 3: Confirm password
|
|
276
|
+
await prompt.password({
|
|
277
|
+
message: 'Confirm password?',
|
|
278
|
+
validate: (value) => {
|
|
279
|
+
if (value !== password) {
|
|
280
|
+
return 'Passwords do not match';
|
|
281
|
+
}
|
|
282
|
+
return undefined;
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
// Step 4: API access mode
|
|
286
|
+
const accessMode = await prompt.select({
|
|
287
|
+
message: 'API access mode?',
|
|
288
|
+
options: [
|
|
289
|
+
{
|
|
290
|
+
value: 'internal',
|
|
291
|
+
label: 'internal',
|
|
292
|
+
hint: 'Local network only (default, most secure)',
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
value: 'api-key',
|
|
296
|
+
label: 'api-key',
|
|
297
|
+
hint: 'External access with API key',
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
value: 'ip-whitelist',
|
|
301
|
+
label: 'ip-whitelist',
|
|
302
|
+
hint: 'IP-based access control',
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
value: 'api-key-ip',
|
|
306
|
+
label: 'api-key-ip',
|
|
307
|
+
hint: 'Both API key and IP required',
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
value: 'open',
|
|
311
|
+
label: 'open',
|
|
312
|
+
hint: 'No authentication (development only)',
|
|
313
|
+
},
|
|
314
|
+
],
|
|
315
|
+
initialValue: 'internal',
|
|
316
|
+
});
|
|
317
|
+
// Step 5: Port configuration
|
|
318
|
+
const DEFAULT_API_PORT = 3001;
|
|
319
|
+
const DEFAULT_CONSOLE_PORT = 3000;
|
|
320
|
+
let apiPort = options.apiPort ?? DEFAULT_API_PORT;
|
|
321
|
+
let consolePort = options.consolePort ?? DEFAULT_CONSOLE_PORT;
|
|
322
|
+
// Only ask for ports if not provided via CLI options
|
|
323
|
+
if (!options.apiPort || !options.consolePort) {
|
|
324
|
+
const customPorts = await prompt.confirm({
|
|
325
|
+
message: 'Configure custom ports?',
|
|
326
|
+
initialValue: false,
|
|
327
|
+
});
|
|
328
|
+
if (customPorts) {
|
|
329
|
+
if (!options.apiPort) {
|
|
330
|
+
const apiPortInput = await prompt.text({
|
|
331
|
+
message: 'API server port?',
|
|
332
|
+
placeholder: String(DEFAULT_API_PORT),
|
|
333
|
+
initialValue: String(DEFAULT_API_PORT),
|
|
334
|
+
validate: (value) => {
|
|
335
|
+
const port = parseInt(value, 10);
|
|
336
|
+
if (isNaN(port) || port < 1 || port > 65535) {
|
|
337
|
+
return 'Port must be a number between 1 and 65535';
|
|
338
|
+
}
|
|
339
|
+
return undefined;
|
|
340
|
+
},
|
|
341
|
+
});
|
|
342
|
+
apiPort = parseInt(apiPortInput, 10);
|
|
343
|
+
}
|
|
344
|
+
if (!options.consolePort) {
|
|
345
|
+
const consolePortInput = await prompt.text({
|
|
346
|
+
message: 'Console server port?',
|
|
347
|
+
placeholder: String(DEFAULT_CONSOLE_PORT),
|
|
348
|
+
initialValue: String(DEFAULT_CONSOLE_PORT),
|
|
349
|
+
validate: (value) => {
|
|
350
|
+
const port = parseInt(value, 10);
|
|
351
|
+
if (isNaN(port) || port < 1 || port > 65535) {
|
|
352
|
+
return 'Port must be a number between 1 and 65535';
|
|
353
|
+
}
|
|
354
|
+
if (port === apiPort) {
|
|
355
|
+
return 'Console port must be different from API port';
|
|
356
|
+
}
|
|
357
|
+
return undefined;
|
|
358
|
+
},
|
|
359
|
+
});
|
|
360
|
+
consolePort = parseInt(consolePortInput, 10);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
// Step 6: Generate API key if needed
|
|
365
|
+
let apiKey = null;
|
|
366
|
+
if (accessMode === 'api-key' || accessMode === 'api-key-ip') {
|
|
367
|
+
const spinner = prompt.spinner();
|
|
368
|
+
spinner.start('Generating API key...');
|
|
369
|
+
apiKey = AdminConfigManager.generateApiKey();
|
|
370
|
+
spinner.stop('API key generated');
|
|
371
|
+
}
|
|
372
|
+
// Step 7: Prompt for allowed IPs if needed
|
|
373
|
+
let allowedIps = [];
|
|
374
|
+
if (accessMode === 'ip-whitelist' || accessMode === 'api-key-ip') {
|
|
375
|
+
const ipsInput = await prompt.text({
|
|
376
|
+
message: 'Allowed IPs (comma-separated)?',
|
|
377
|
+
placeholder: '127.0.0.1, 192.168.1.0/24',
|
|
378
|
+
validate: (value) => {
|
|
379
|
+
if (!value.trim()) {
|
|
380
|
+
return 'At least one IP or CIDR range is required';
|
|
381
|
+
}
|
|
382
|
+
// Basic IP/CIDR validation
|
|
383
|
+
const ips = value.split(',').map((ip) => ip.trim());
|
|
384
|
+
for (const ip of ips) {
|
|
385
|
+
// Simple validation - allows IP or CIDR notation
|
|
386
|
+
if (!/^(\d{1,3}\.){3}\d{1,3}(\/\d{1,2})?$/.test(ip) &&
|
|
387
|
+
ip !== 'localhost') {
|
|
388
|
+
return `Invalid IP format: ${ip}`;
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
return undefined;
|
|
392
|
+
},
|
|
393
|
+
});
|
|
394
|
+
allowedIps = ipsInput.split(',').map((ip) => ip.trim());
|
|
395
|
+
}
|
|
396
|
+
// Step 8: Show warning for open mode
|
|
397
|
+
if (accessMode === 'open') {
|
|
398
|
+
prompt.warn('WARNING: Open mode has no authentication. Use only for local development!');
|
|
399
|
+
const proceed = await prompt.confirm({
|
|
400
|
+
message: 'Are you sure you want to use open mode?',
|
|
401
|
+
initialValue: false,
|
|
402
|
+
});
|
|
403
|
+
if (!proceed) {
|
|
404
|
+
prompt.info('Cancelled. Please run again to choose a different mode.');
|
|
405
|
+
return 0;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
// Step 9: Save user to YAML
|
|
409
|
+
const spinner = prompt.spinner();
|
|
410
|
+
spinner.start('Creating admin user...');
|
|
411
|
+
const usersPath = join(paths.root, 'users.yaml');
|
|
412
|
+
const userRepo = new YamlUserRepository(usersPath);
|
|
413
|
+
// Check if user already exists
|
|
414
|
+
const usernameVO = Username.create(username);
|
|
415
|
+
const existingUser = await userRepo.findByUsername(usernameVO);
|
|
416
|
+
if (existingUser && !options.force) {
|
|
417
|
+
spinner.stop('');
|
|
418
|
+
log.error(`User '${username}' already exists`);
|
|
419
|
+
console.log(' To overwrite, use: mcctl console init --force');
|
|
420
|
+
return 1;
|
|
421
|
+
}
|
|
422
|
+
// Hash password and create user
|
|
423
|
+
const passwordHash = await userRepo.hashPassword(password);
|
|
424
|
+
const adminUser = User.createAdmin(usernameVO, passwordHash);
|
|
425
|
+
// If user exists and force is true, delete the old one first
|
|
426
|
+
if (existingUser && options.force) {
|
|
427
|
+
await userRepo.delete(existingUser.id);
|
|
428
|
+
}
|
|
429
|
+
await userRepo.save(adminUser);
|
|
430
|
+
spinner.stop('Admin user created');
|
|
431
|
+
// Step 10: Generate ecosystem.config.cjs
|
|
432
|
+
spinner.start('Generating PM2 ecosystem config...');
|
|
433
|
+
const ecosystemPath = join(paths.platform, ECOSYSTEM_CONFIG_FILE);
|
|
434
|
+
const ecosystemContent = generateEcosystemConfig(apiPort, consolePort);
|
|
435
|
+
writeFileSync(ecosystemPath, ecosystemContent, 'utf-8');
|
|
436
|
+
spinner.stop('PM2 ecosystem config generated');
|
|
437
|
+
// Step 11: Save configuration
|
|
438
|
+
spinner.start('Saving configuration...');
|
|
439
|
+
const config = await configManager.create({
|
|
440
|
+
accessMode,
|
|
441
|
+
apiKey,
|
|
442
|
+
allowedIps,
|
|
443
|
+
apiPort,
|
|
444
|
+
consolePort,
|
|
445
|
+
});
|
|
446
|
+
spinner.stop('Configuration saved');
|
|
447
|
+
// Step 12: Display summary
|
|
448
|
+
console.log('');
|
|
449
|
+
prompt.success('Console Service initialized!');
|
|
450
|
+
console.log('');
|
|
451
|
+
console.log(colors.cyan(' Configuration:'));
|
|
452
|
+
console.log(` Config file: ${colors.dim(configManager.path)}`);
|
|
453
|
+
console.log(` Users file: ${colors.dim(usersPath)}`);
|
|
454
|
+
console.log(` PM2 config: ${colors.dim(ecosystemPath)}`);
|
|
455
|
+
console.log(` Access mode: ${colors.bold(accessMode)}`);
|
|
456
|
+
if (apiKey) {
|
|
457
|
+
console.log('');
|
|
458
|
+
console.log(colors.yellow(' API Key (save this, shown only once):'));
|
|
459
|
+
console.log(` ${colors.bold(apiKey)}`);
|
|
460
|
+
}
|
|
461
|
+
if (allowedIps.length > 0) {
|
|
462
|
+
console.log('');
|
|
463
|
+
console.log(colors.cyan(' Allowed IPs:'));
|
|
464
|
+
for (const ip of allowedIps) {
|
|
465
|
+
console.log(` - ${ip}`);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
console.log('');
|
|
469
|
+
console.log(colors.cyan(' Endpoints:'));
|
|
470
|
+
console.log(` Console: ${colors.bold(`http://localhost:${config.console.port}`)}`);
|
|
471
|
+
console.log(` API: ${colors.bold(`http://localhost:${config.api.port}`)}`);
|
|
472
|
+
console.log('');
|
|
473
|
+
console.log(colors.dim(' Next steps:'));
|
|
474
|
+
console.log(colors.dim(' 1. Start the console service: mcctl console service start'));
|
|
475
|
+
console.log(colors.dim(' 2. Access the console in your browser'));
|
|
476
|
+
console.log('');
|
|
477
|
+
return 0;
|
|
478
|
+
}
|
|
479
|
+
catch (error) {
|
|
480
|
+
// Check if user cancelled
|
|
481
|
+
if (prompt.isCancel(error)) {
|
|
482
|
+
return 0;
|
|
483
|
+
}
|
|
484
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
485
|
+
log.error(message);
|
|
486
|
+
return 1;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
// Backward compatibility alias
|
|
490
|
+
export const adminInitCommand = consoleInitCommand;
|
|
491
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/console/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console Remove Command
|
|
3
|
+
*
|
|
4
|
+
* Completely removes Console Service:
|
|
5
|
+
* - Stop and remove PM2 processes
|
|
6
|
+
* - Delete configuration files (optional)
|
|
7
|
+
* - Delete ecosystem.config.cjs
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Console remove command options
|
|
11
|
+
*/
|
|
12
|
+
export interface ConsoleRemoveOptions {
|
|
13
|
+
root?: string;
|
|
14
|
+
force?: boolean;
|
|
15
|
+
keepConfig?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Execute console remove command
|
|
19
|
+
*
|
|
20
|
+
* Removes all Console Service components:
|
|
21
|
+
* 1. Stop and remove PM2 processes
|
|
22
|
+
* 2. Delete configuration files (unless --keep-config)
|
|
23
|
+
*/
|
|
24
|
+
export declare function consoleRemoveCommand(options: ConsoleRemoveOptions): Promise<number>;
|
|
25
|
+
//# sourceMappingURL=remove.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../../src/commands/console/remove.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAyFD;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAwGjB"}
|