@matrixhub/cli 0.1.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 +156 -0
- package/dist/commands/logs.d.ts +2 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +20 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/restart.d.ts +2 -0
- package/dist/commands/restart.d.ts.map +1 -0
- package/dist/commands/restart.js +24 -0
- package/dist/commands/restart.js.map +1 -0
- package/dist/commands/start.d.ts +2 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +79 -0
- package/dist/commands/start.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 +20 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +2 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +28 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +63 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/docker.d.ts +19 -0
- package/dist/utils/docker.d.ts.map +1 -0
- package/dist/utils/docker.js +97 -0
- package/dist/utils/docker.js.map +1 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# @matrixhub/cli
|
|
2
|
+
|
|
3
|
+
CLI tool for deploying and managing MatrixHub - your self-hosted AI model registry.
|
|
4
|
+
|
|
5
|
+
## 🚀 Quick Start
|
|
6
|
+
|
|
7
|
+
No installation needed! Use `npx` to run MatrixHub directly:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx @matrixhub/cli start
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Or install globally:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install -g @matrixhub/cli
|
|
17
|
+
matrixhub start
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## 📋 Prerequisites
|
|
21
|
+
|
|
22
|
+
- Docker installed and running
|
|
23
|
+
- Node.js 18+ (for npx/npm)
|
|
24
|
+
|
|
25
|
+
## 🎯 Commands
|
|
26
|
+
|
|
27
|
+
### `start`
|
|
28
|
+
|
|
29
|
+
Start a new MatrixHub container:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npx @matrixhub/cli start [options]
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Options:**
|
|
36
|
+
- `-p, --port <port>` - Port to expose (default: 9527)
|
|
37
|
+
- `-d, --data <path>` - Data directory path (default: ./data)
|
|
38
|
+
- `-n, --name <name>` - Container name (default: matrixhub)
|
|
39
|
+
- `--image <image>` - Docker image to use (default: ghcr.io/matrixhub-ai/matrixhub:main)
|
|
40
|
+
|
|
41
|
+
**Examples:**
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# Start with defaults (port 9527, ./data directory)
|
|
45
|
+
npx @matrixhub/cli start
|
|
46
|
+
|
|
47
|
+
# Start on custom port with custom data directory
|
|
48
|
+
npx @matrixhub/cli start -p 8080 -d ~/matrixhub-data
|
|
49
|
+
|
|
50
|
+
# Use a specific image version
|
|
51
|
+
npx @matrixhub/cli start --image ghcr.io/matrixhub-ai/matrixhub:v1.0.0
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### `stop`
|
|
55
|
+
|
|
56
|
+
Stop the running MatrixHub container:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx @matrixhub/cli stop
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### `restart`
|
|
63
|
+
|
|
64
|
+
Restart the MatrixHub container:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npx @matrixhub/cli restart
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### `status`
|
|
71
|
+
|
|
72
|
+
Check the status of the MatrixHub container:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
npx @matrixhub/cli status
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### `logs`
|
|
79
|
+
|
|
80
|
+
View container logs:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
npx @matrixhub/cli logs [options]
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Options:**
|
|
87
|
+
- `-f, --follow` - Follow log output (like `tail -f`)
|
|
88
|
+
- `--tail <lines>` - Number of lines to show from the end (default: 100)
|
|
89
|
+
|
|
90
|
+
**Examples:**
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# View last 100 lines of logs
|
|
94
|
+
npx @matrixhub/cli logs
|
|
95
|
+
|
|
96
|
+
# Follow logs in real-time
|
|
97
|
+
npx @matrixhub/cli logs -f
|
|
98
|
+
|
|
99
|
+
# View last 500 lines
|
|
100
|
+
npx @matrixhub/cli logs --tail 500
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### `update`
|
|
104
|
+
|
|
105
|
+
Update MatrixHub to the latest version:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
npx @matrixhub/cli update
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
This will:
|
|
112
|
+
1. Pull the latest Docker image
|
|
113
|
+
2. Stop the current container
|
|
114
|
+
3. Remove the old container
|
|
115
|
+
4. Prompt you to start the new version
|
|
116
|
+
|
|
117
|
+
## 🎨 Features
|
|
118
|
+
|
|
119
|
+
- **Zero Configuration**: Works out of the box with sensible defaults
|
|
120
|
+
- **Interactive**: Prompts for confirmation when needed
|
|
121
|
+
- **Colorful Output**: Clear, easy-to-read terminal output
|
|
122
|
+
- **Error Handling**: Helpful error messages and recovery suggestions
|
|
123
|
+
- **Docker Detection**: Checks if Docker is installed before running
|
|
124
|
+
|
|
125
|
+
## 🛠️ Development
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
# Clone the repository
|
|
129
|
+
git clone https://github.com/matrixhub-ai/matrixhub.git
|
|
130
|
+
cd matrixhub/packages/cli
|
|
131
|
+
|
|
132
|
+
# Install dependencies
|
|
133
|
+
npm install
|
|
134
|
+
|
|
135
|
+
# Build
|
|
136
|
+
npm run build
|
|
137
|
+
|
|
138
|
+
# Link locally for testing
|
|
139
|
+
npm link
|
|
140
|
+
|
|
141
|
+
# Now you can use the command
|
|
142
|
+
matrixhub start
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 📄 License
|
|
146
|
+
|
|
147
|
+
Apache-2.0 - see [LICENSE](../../LICENSE) for details.
|
|
148
|
+
|
|
149
|
+
## 🤝 Contributing
|
|
150
|
+
|
|
151
|
+
Contributions are welcome! Please see [CONTRIBUTING.md](../../CONTRIBUTING.md) for details.
|
|
152
|
+
|
|
153
|
+
## 📞 Support
|
|
154
|
+
|
|
155
|
+
- [GitHub Issues](https://github.com/matrixhub-ai/matrixhub/issues)
|
|
156
|
+
- [Slack Community](https://cloud-native.slack.com/archives/C0A8UKWR8HG)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAAC,OAAO,EAAE,GAAG,iBAiB7C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { doesContainerExist, getContainerLogs } from '../utils/docker.js';
|
|
3
|
+
export async function logsCommand(options) {
|
|
4
|
+
const exists = await doesContainerExist(options.name);
|
|
5
|
+
if (!exists) {
|
|
6
|
+
console.log(chalk.yellow(`\n⚠️ Container "${options.name}" not found\n`));
|
|
7
|
+
process.exit(0);
|
|
8
|
+
}
|
|
9
|
+
if (options.follow) {
|
|
10
|
+
console.log(chalk.gray(`Following logs for "${options.name}" (Ctrl+C to stop)...\n`));
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
await getContainerLogs(options.name, options.follow, options.tail);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
console.error(chalk.red('\nError:'), error.message);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAY;IAC5C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,OAAO,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,OAAO,CAAC,IAAI,yBAAyB,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../src/commands/restart.ts"],"names":[],"mappings":"AAOA,wBAAsB,cAAc,CAAC,OAAO,EAAE,GAAG,iBAoBhD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { doesContainerExist, restartContainer } from '../utils/docker.js';
|
|
4
|
+
export async function restartCommand(options) {
|
|
5
|
+
console.log(chalk.blue.bold('\n🔄 Restarting MatrixHub\n'));
|
|
6
|
+
const exists = await doesContainerExist(options.name);
|
|
7
|
+
if (!exists) {
|
|
8
|
+
console.log(chalk.yellow(`⚠️ Container "${options.name}" not found`));
|
|
9
|
+
console.log(chalk.gray('💡 Use "matrixhub start" to create a new container\n'));
|
|
10
|
+
process.exit(0);
|
|
11
|
+
}
|
|
12
|
+
const spinner = ora('Restarting container...').start();
|
|
13
|
+
try {
|
|
14
|
+
await restartContainer(options.name);
|
|
15
|
+
spinner.succeed('MatrixHub container restarted');
|
|
16
|
+
console.log(chalk.green.bold('\n✅ MatrixHub is now running!\n'));
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
spinner.fail('Failed to restart container');
|
|
20
|
+
console.error(chalk.red('\nError:'), error.message);
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=restart.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart.js","sourceRoot":"","sources":["../../src/commands/restart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAY;IAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,OAAO,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;IACvD,IAAI,CAAC;QACH,MAAM,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAaA,wBAAsB,YAAY,CAAC,OAAO,EAAE,GAAG,iBAmF9C"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import prompts from 'prompts';
|
|
4
|
+
import { checkDockerInstalled, isContainerRunning, doesContainerExist, runContainer, removeContainer, getAbsolutePath } from '../utils/docker.js';
|
|
5
|
+
export async function startCommand(options) {
|
|
6
|
+
console.log(chalk.blue.bold('\n🚀 MatrixHub Deployment\n'));
|
|
7
|
+
// Check if Docker is installed
|
|
8
|
+
const spinner = ora('Checking Docker installation...').start();
|
|
9
|
+
const dockerInstalled = await checkDockerInstalled();
|
|
10
|
+
if (!dockerInstalled) {
|
|
11
|
+
spinner.fail('Docker is not installed or not in PATH');
|
|
12
|
+
console.log(chalk.yellow('\nPlease install Docker first:'));
|
|
13
|
+
console.log(chalk.cyan(' https://docs.docker.com/get-docker/\n'));
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
spinner.succeed('Docker is installed');
|
|
17
|
+
// Check if container already exists
|
|
18
|
+
const containerExists = await doesContainerExist(options.name);
|
|
19
|
+
const containerRunning = await isContainerRunning(options.name);
|
|
20
|
+
if (containerRunning) {
|
|
21
|
+
console.log(chalk.yellow(`\n⚠️ Container "${options.name}" is already running`));
|
|
22
|
+
console.log(chalk.cyan(` Access MatrixHub at http://localhost:${options.port}\n`));
|
|
23
|
+
process.exit(0);
|
|
24
|
+
}
|
|
25
|
+
if (containerExists) {
|
|
26
|
+
const response = await prompts({
|
|
27
|
+
type: 'confirm',
|
|
28
|
+
name: 'remove',
|
|
29
|
+
message: `Container "${options.name}" already exists. Remove and recreate?`,
|
|
30
|
+
initial: true
|
|
31
|
+
});
|
|
32
|
+
if (!response.remove) {
|
|
33
|
+
console.log(chalk.yellow('\nOperation cancelled\n'));
|
|
34
|
+
process.exit(0);
|
|
35
|
+
}
|
|
36
|
+
const removeSpinner = ora('Removing existing container...').start();
|
|
37
|
+
await removeContainer(options.name);
|
|
38
|
+
removeSpinner.succeed('Container removed');
|
|
39
|
+
}
|
|
40
|
+
// Convert data path to absolute path
|
|
41
|
+
const absoluteDataPath = getAbsolutePath(options.data);
|
|
42
|
+
// Pull image
|
|
43
|
+
const pullSpinner = ora(`Pulling Docker image: ${options.image}...`).start();
|
|
44
|
+
try {
|
|
45
|
+
await import('../utils/docker.js').then(m => m.pullImage(options.image));
|
|
46
|
+
pullSpinner.succeed('Docker image pulled');
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
pullSpinner.warn('Failed to pull image, will use local image if available');
|
|
50
|
+
}
|
|
51
|
+
// Start container
|
|
52
|
+
const startSpinner = ora('Starting MatrixHub container...').start();
|
|
53
|
+
try {
|
|
54
|
+
const runOptions = {
|
|
55
|
+
name: options.name,
|
|
56
|
+
image: options.image,
|
|
57
|
+
port: options.port,
|
|
58
|
+
dataPath: absoluteDataPath,
|
|
59
|
+
detach: options.detach
|
|
60
|
+
};
|
|
61
|
+
await runContainer(runOptions);
|
|
62
|
+
startSpinner.succeed('MatrixHub container started');
|
|
63
|
+
console.log(chalk.green.bold('\n✅ MatrixHub is now running!\n'));
|
|
64
|
+
console.log(chalk.cyan('📍 Access MatrixHub at:'), chalk.bold(`http://localhost:${options.port}`));
|
|
65
|
+
console.log(chalk.cyan('📁 Data directory:'), chalk.bold(absoluteDataPath));
|
|
66
|
+
console.log(chalk.cyan('🐳 Container name:'), chalk.bold(options.name));
|
|
67
|
+
console.log(chalk.gray('\n💡 Useful commands:'));
|
|
68
|
+
console.log(chalk.gray(' matrixhub status - Check container status'));
|
|
69
|
+
console.log(chalk.gray(' matrixhub logs - View container logs'));
|
|
70
|
+
console.log(chalk.gray(' matrixhub stop - Stop the container'));
|
|
71
|
+
console.log(chalk.gray(' matrixhub restart - Restart the container\n'));
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
startSpinner.fail('Failed to start container');
|
|
75
|
+
console.error(chalk.red('\nError:'), error.message);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAOA,wBAAsB,aAAa,CAAC,OAAO,EAAE,GAAG,iBAoB/C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { doesContainerExist, isContainerRunning, getContainerStatus } from '../utils/docker.js';
|
|
3
|
+
export async function statusCommand(options) {
|
|
4
|
+
console.log(chalk.blue.bold('\n📊 MatrixHub Status\n'));
|
|
5
|
+
const exists = await doesContainerExist(options.name);
|
|
6
|
+
if (!exists) {
|
|
7
|
+
console.log(chalk.yellow(`⚠️ Container "${options.name}" not found\n`));
|
|
8
|
+
process.exit(0);
|
|
9
|
+
}
|
|
10
|
+
const running = await isContainerRunning(options.name);
|
|
11
|
+
const status = await getContainerStatus(options.name);
|
|
12
|
+
console.log(chalk.cyan('Container name:'), chalk.bold(options.name));
|
|
13
|
+
console.log(chalk.cyan('Status:'), running ? chalk.green.bold('Running ✅') : chalk.red.bold('Stopped ❌'));
|
|
14
|
+
console.log(chalk.cyan('Details:'), status);
|
|
15
|
+
if (running) {
|
|
16
|
+
console.log(chalk.cyan('\n📍 Access MatrixHub at:'), chalk.bold('http://localhost:9527'));
|
|
17
|
+
}
|
|
18
|
+
console.log();
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAY;IAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAExD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,OAAO,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC1G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAE5C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAQA,wBAAsB,WAAW,CAAC,OAAO,EAAE,GAAG,iBAyB7C"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { isContainerRunning, doesContainerExist, stopContainer } from '../utils/docker.js';
|
|
4
|
+
export async function stopCommand(options) {
|
|
5
|
+
console.log(chalk.blue.bold('\n🛑 Stopping MatrixHub\n'));
|
|
6
|
+
const exists = await doesContainerExist(options.name);
|
|
7
|
+
if (!exists) {
|
|
8
|
+
console.log(chalk.yellow(`⚠️ Container "${options.name}" not found\n`));
|
|
9
|
+
process.exit(0);
|
|
10
|
+
}
|
|
11
|
+
const running = await isContainerRunning(options.name);
|
|
12
|
+
if (!running) {
|
|
13
|
+
console.log(chalk.yellow(`⚠️ Container "${options.name}" is not running\n`));
|
|
14
|
+
process.exit(0);
|
|
15
|
+
}
|
|
16
|
+
const spinner = ora('Stopping container...').start();
|
|
17
|
+
try {
|
|
18
|
+
await stopContainer(options.name);
|
|
19
|
+
spinner.succeed('MatrixHub container stopped');
|
|
20
|
+
console.log(chalk.gray('\n💡 Use "matrixhub start" to start it again\n'));
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
spinner.fail('Failed to stop container');
|
|
24
|
+
console.error(chalk.red('\nError:'), error.message);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACd,MAAM,oBAAoB,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAY;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,OAAO,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,OAAO,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAaA,wBAAsB,aAAa,CAAC,OAAO,EAAE,GAAG,iBA8D/C"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import prompts from 'prompts';
|
|
4
|
+
import { doesContainerExist, isContainerRunning, stopContainer, removeContainer, pullImage } from '../utils/docker.js';
|
|
5
|
+
export async function updateCommand(options) {
|
|
6
|
+
console.log(chalk.blue.bold('\n🔄 Updating MatrixHub\n'));
|
|
7
|
+
const exists = await doesContainerExist(options.name);
|
|
8
|
+
if (!exists) {
|
|
9
|
+
console.log(chalk.yellow(`⚠️ Container "${options.name}" not found\n`));
|
|
10
|
+
process.exit(0);
|
|
11
|
+
}
|
|
12
|
+
const running = await isContainerRunning(options.name);
|
|
13
|
+
const response = await prompts({
|
|
14
|
+
type: 'confirm',
|
|
15
|
+
name: 'confirm',
|
|
16
|
+
message: running
|
|
17
|
+
? 'This will stop the current container and start a new one with the latest image. Continue?'
|
|
18
|
+
: 'This will remove the current container and start a new one with the latest image. Continue?',
|
|
19
|
+
initial: true
|
|
20
|
+
});
|
|
21
|
+
if (!response.confirm) {
|
|
22
|
+
console.log(chalk.yellow('\nUpdate cancelled\n'));
|
|
23
|
+
process.exit(0);
|
|
24
|
+
}
|
|
25
|
+
// Pull latest image
|
|
26
|
+
const pullSpinner = ora(`Pulling latest image: ${options.image}...`).start();
|
|
27
|
+
try {
|
|
28
|
+
await pullImage(options.image);
|
|
29
|
+
pullSpinner.succeed('Latest image pulled');
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
pullSpinner.fail('Failed to pull image');
|
|
33
|
+
console.error(chalk.red('\nError:'), error.message);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
// Stop container if running
|
|
37
|
+
if (running) {
|
|
38
|
+
const stopSpinner = ora('Stopping container...').start();
|
|
39
|
+
try {
|
|
40
|
+
await stopContainer(options.name);
|
|
41
|
+
stopSpinner.succeed('Container stopped');
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
stopSpinner.fail('Failed to stop container');
|
|
45
|
+
console.error(chalk.red('\nError:'), error.message);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Remove old container
|
|
50
|
+
const removeSpinner = ora('Removing old container...').start();
|
|
51
|
+
try {
|
|
52
|
+
await removeContainer(options.name);
|
|
53
|
+
removeSpinner.succeed('Old container removed');
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
removeSpinner.fail('Failed to remove container');
|
|
57
|
+
console.error(chalk.red('\nError:'), error.message);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
console.log(chalk.green.bold('\n✅ MatrixHub updated successfully!'));
|
|
61
|
+
console.log(chalk.gray('\n💡 Use "matrixhub start" to start the updated version\n'));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { startCommand } from './commands/start.js';
|
|
4
|
+
import { stopCommand } from './commands/stop.js';
|
|
5
|
+
import { restartCommand } from './commands/restart.js';
|
|
6
|
+
import { statusCommand } from './commands/status.js';
|
|
7
|
+
import { logsCommand } from './commands/logs.js';
|
|
8
|
+
import { updateCommand } from './commands/update.js';
|
|
9
|
+
const program = new Command();
|
|
10
|
+
program
|
|
11
|
+
.name('matrixhub')
|
|
12
|
+
.description('CLI tool for deploying and managing MatrixHub')
|
|
13
|
+
.version('0.1.0');
|
|
14
|
+
program
|
|
15
|
+
.command('start')
|
|
16
|
+
.description('Start MatrixHub container')
|
|
17
|
+
.option('-p, --port <port>', 'Port to expose (default: 9527)', '9527')
|
|
18
|
+
.option('-d, --data <path>', 'Data directory path (default: ./data)', './data')
|
|
19
|
+
.option('-n, --name <name>', 'Container name (default: matrixhub)', 'matrixhub')
|
|
20
|
+
.option('--image <image>', 'Docker image to use', 'ghcr.io/matrixhub-ai/matrixhub:main')
|
|
21
|
+
.option('--detach', 'Run container in detached mode', true)
|
|
22
|
+
.action(startCommand);
|
|
23
|
+
program
|
|
24
|
+
.command('stop')
|
|
25
|
+
.description('Stop MatrixHub container')
|
|
26
|
+
.option('-n, --name <name>', 'Container name (default: matrixhub)', 'matrixhub')
|
|
27
|
+
.action(stopCommand);
|
|
28
|
+
program
|
|
29
|
+
.command('restart')
|
|
30
|
+
.description('Restart MatrixHub container')
|
|
31
|
+
.option('-n, --name <name>', 'Container name (default: matrixhub)', 'matrixhub')
|
|
32
|
+
.action(restartCommand);
|
|
33
|
+
program
|
|
34
|
+
.command('status')
|
|
35
|
+
.description('Check MatrixHub container status')
|
|
36
|
+
.option('-n, --name <name>', 'Container name (default: matrixhub)', 'matrixhub')
|
|
37
|
+
.action(statusCommand);
|
|
38
|
+
program
|
|
39
|
+
.command('logs')
|
|
40
|
+
.description('View MatrixHub container logs')
|
|
41
|
+
.option('-n, --name <name>', 'Container name (default: matrixhub)', 'matrixhub')
|
|
42
|
+
.option('-f, --follow', 'Follow log output', false)
|
|
43
|
+
.option('--tail <lines>', 'Number of lines to show from the end of the logs', '100')
|
|
44
|
+
.action(logsCommand);
|
|
45
|
+
program
|
|
46
|
+
.command('update')
|
|
47
|
+
.description('Update MatrixHub to the latest version')
|
|
48
|
+
.option('-n, --name <name>', 'Container name (default: matrixhub)', 'matrixhub')
|
|
49
|
+
.option('--image <image>', 'Docker image to use', 'ghcr.io/matrixhub-ai/matrixhub:main')
|
|
50
|
+
.action(updateCommand);
|
|
51
|
+
program.parse();
|
|
52
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,EAAE,MAAM,CAAC;KACrE,MAAM,CAAC,mBAAmB,EAAE,uCAAuC,EAAE,QAAQ,CAAC;KAC9E,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,WAAW,CAAC;KAC/E,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,qCAAqC,CAAC;KACvF,MAAM,CAAC,UAAU,EAAE,gCAAgC,EAAE,IAAI,CAAC;KAC1D,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,WAAW,CAAC;KAC/E,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,WAAW,CAAC;KAC/E,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,WAAW,CAAC;KAC/E,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,WAAW,CAAC;KAC/E,MAAM,CAAC,cAAc,EAAE,mBAAmB,EAAE,KAAK,CAAC;KAClD,MAAM,CAAC,gBAAgB,EAAE,kDAAkD,EAAE,KAAK,CAAC;KACnF,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,WAAW,CAAC;KAC/E,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,qCAAqC,CAAC;KACvF,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface DockerRunOptions {
|
|
2
|
+
name: string;
|
|
3
|
+
image: string;
|
|
4
|
+
port: string;
|
|
5
|
+
dataPath: string;
|
|
6
|
+
detach: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function checkDockerInstalled(): Promise<boolean>;
|
|
9
|
+
export declare function isContainerRunning(name: string): Promise<boolean>;
|
|
10
|
+
export declare function doesContainerExist(name: string): Promise<boolean>;
|
|
11
|
+
export declare function runContainer(options: DockerRunOptions): Promise<void>;
|
|
12
|
+
export declare function stopContainer(name: string): Promise<void>;
|
|
13
|
+
export declare function removeContainer(name: string): Promise<void>;
|
|
14
|
+
export declare function restartContainer(name: string): Promise<void>;
|
|
15
|
+
export declare function getContainerStatus(name: string): Promise<string>;
|
|
16
|
+
export declare function getContainerLogs(name: string, follow?: boolean, tail?: string): Promise<void>;
|
|
17
|
+
export declare function pullImage(image: string): Promise<void>;
|
|
18
|
+
export declare function getAbsolutePath(path: string): string;
|
|
19
|
+
//# sourceMappingURL=docker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/utils/docker.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO7D;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASvE;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASvE;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAc3E;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/D;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElE;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAStE;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,OAAe,EACvB,IAAI,GAAE,MAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQpD"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
const execAsync = promisify(exec);
|
|
4
|
+
export async function checkDockerInstalled() {
|
|
5
|
+
try {
|
|
6
|
+
await execAsync('docker --version');
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function isContainerRunning(name) {
|
|
14
|
+
try {
|
|
15
|
+
const { stdout } = await execAsync(`docker ps --filter "name=${name}" --format "{{.Names}}"`);
|
|
16
|
+
return stdout.trim() === name;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function doesContainerExist(name) {
|
|
23
|
+
try {
|
|
24
|
+
const { stdout } = await execAsync(`docker ps -a --filter "name=${name}" --format "{{.Names}}"`);
|
|
25
|
+
return stdout.trim() === name;
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export async function runContainer(options) {
|
|
32
|
+
const { name, image, port, dataPath, detach } = options;
|
|
33
|
+
const cmd = [
|
|
34
|
+
'docker run',
|
|
35
|
+
detach ? '-d' : '',
|
|
36
|
+
`--name ${name}`,
|
|
37
|
+
`--restart unless-stopped`,
|
|
38
|
+
`-p ${port}:9527`,
|
|
39
|
+
`-v ${dataPath}:/data`,
|
|
40
|
+
image
|
|
41
|
+
].filter(Boolean).join(' ');
|
|
42
|
+
await execAsync(cmd);
|
|
43
|
+
}
|
|
44
|
+
export async function stopContainer(name) {
|
|
45
|
+
await execAsync(`docker stop ${name}`);
|
|
46
|
+
}
|
|
47
|
+
export async function removeContainer(name) {
|
|
48
|
+
await execAsync(`docker rm ${name}`);
|
|
49
|
+
}
|
|
50
|
+
export async function restartContainer(name) {
|
|
51
|
+
await execAsync(`docker restart ${name}`);
|
|
52
|
+
}
|
|
53
|
+
export async function getContainerStatus(name) {
|
|
54
|
+
try {
|
|
55
|
+
const { stdout } = await execAsync(`docker ps -a --filter "name=${name}" --format "{{.Status}}"`);
|
|
56
|
+
return stdout.trim();
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return 'Not found';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export async function getContainerLogs(name, follow = false, tail = '100') {
|
|
63
|
+
const cmd = [
|
|
64
|
+
'docker logs',
|
|
65
|
+
follow ? '-f' : '',
|
|
66
|
+
`--tail ${tail}`,
|
|
67
|
+
name
|
|
68
|
+
].filter(Boolean).join(' ');
|
|
69
|
+
if (follow) {
|
|
70
|
+
// For follow mode, we need to use spawn instead of exec
|
|
71
|
+
const { spawn } = await import('child_process');
|
|
72
|
+
const child = spawn('docker', ['logs', '-f', '--tail', tail, name], {
|
|
73
|
+
stdio: 'inherit'
|
|
74
|
+
});
|
|
75
|
+
process.on('SIGINT', () => {
|
|
76
|
+
child.kill('SIGTERM');
|
|
77
|
+
process.exit(0);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
const { stdout } = await execAsync(cmd);
|
|
82
|
+
console.log(stdout);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export async function pullImage(image) {
|
|
86
|
+
await execAsync(`docker pull ${image}`);
|
|
87
|
+
}
|
|
88
|
+
export function getAbsolutePath(path) {
|
|
89
|
+
if (path.startsWith('/')) {
|
|
90
|
+
return path;
|
|
91
|
+
}
|
|
92
|
+
if (path.startsWith('~/')) {
|
|
93
|
+
return path.replace('~', process.env.HOME || '~');
|
|
94
|
+
}
|
|
95
|
+
return `${process.cwd()}/${path}`;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=docker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/utils/docker.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@matrixhub/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI tool for deploying and managing MatrixHub",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"matrixhub": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"dev": "tsc --watch",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"matrixhub",
|
|
19
|
+
"ai",
|
|
20
|
+
"model-registry",
|
|
21
|
+
"huggingface",
|
|
22
|
+
"docker",
|
|
23
|
+
"cli"
|
|
24
|
+
],
|
|
25
|
+
"author": "MatrixHub Authors",
|
|
26
|
+
"license": "Apache-2.0",
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "https://github.com/matrixhub-ai/matrixhub.git",
|
|
30
|
+
"directory": "packages/cli"
|
|
31
|
+
},
|
|
32
|
+
"bugs": {
|
|
33
|
+
"url": "https://github.com/matrixhub-ai/matrixhub/issues"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://github.com/matrixhub-ai/matrixhub#readme",
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"commander": "^12.1.0",
|
|
38
|
+
"chalk": "^5.4.1",
|
|
39
|
+
"ora": "^8.1.1",
|
|
40
|
+
"prompts": "^2.4.2"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^22.10.6",
|
|
44
|
+
"@types/prompts": "^2.4.9",
|
|
45
|
+
"typescript": "^5.7.3"
|
|
46
|
+
},
|
|
47
|
+
"engines": {
|
|
48
|
+
"node": ">=18.0.0"
|
|
49
|
+
}
|
|
50
|
+
}
|