241 lines
6.3 KiB
Markdown
241 lines
6.3 KiB
Markdown
# mulTmux
|
|
|
|
A collaborative terminal tool that lets multiple users interact with the same tmux session in real-time.
|
|
|
|
## Features
|
|
|
|
- **Real-time Collaboration**: Multiple users can connect to the same terminal session
|
|
- **tmux Backend**: Leverages tmux for robust terminal multiplexing
|
|
- **Token-based Auth**: Secure invite links with expiration
|
|
- **Presence Indicators**: See who's connected to your session
|
|
- **Low Resource Usage**: ~200-300MB RAM for typical usage
|
|
- **Easy Deployment**: Works alongside existing services on your server
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌─────────────┐ ┌──────────────────┐
|
|
│ Client │ ──── WebSocket ────────> │ Server │
|
|
│ (CLI) │ (token auth) │ │
|
|
└─────────────┘ │ ┌────────────┐ │
|
|
│ │ Node.js │ │
|
|
┌─────────────┐ │ │ Backend │ │
|
|
│ Client 2 │ ──── Invite Link ──────> │ └─────┬──────┘ │
|
|
│ (CLI) │ │ │ │
|
|
└─────────────┘ │ ┌─────▼──────┐ │
|
|
│ │ tmux │ │
|
|
│ │ Sessions │ │
|
|
│ └────────────┘ │
|
|
└──────────────────┘
|
|
```
|
|
|
|
## Installation
|
|
|
|
### Server Setup
|
|
|
|
1. **Deploy to your AI server:**
|
|
```bash
|
|
cd multmux
|
|
chmod +x infrastructure/deploy.sh
|
|
./infrastructure/deploy.sh
|
|
```
|
|
|
|
This will:
|
|
- Install tmux if needed
|
|
- Build the server
|
|
- Set up PM2 for process management
|
|
- Start the server
|
|
|
|
2. **(Optional) Set up nginx reverse proxy:**
|
|
```bash
|
|
sudo cp infrastructure/nginx.conf /etc/nginx/sites-available/multmux
|
|
sudo ln -s /etc/nginx/sites-available/multmux /etc/nginx/sites-enabled/
|
|
# Edit the file to set your domain
|
|
sudo nano /etc/nginx/sites-available/multmux
|
|
sudo nginx -t
|
|
sudo systemctl reload nginx
|
|
```
|
|
|
|
### CLI Installation
|
|
|
|
**On your local machine:**
|
|
```bash
|
|
cd multmux/packages/cli
|
|
npm install
|
|
npm run build
|
|
npm link # Installs 'multmux' command globally
|
|
```
|
|
|
|
## Usage
|
|
|
|
### Create a Session
|
|
|
|
```bash
|
|
multmux create my-project --repo /path/to/repo
|
|
```
|
|
|
|
This outputs an invite link like:
|
|
```
|
|
multmux join a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
|
|
```
|
|
|
|
### Join a Session
|
|
|
|
```bash
|
|
multmux join a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
|
|
```
|
|
|
|
### List Active Sessions
|
|
|
|
```bash
|
|
multmux list
|
|
```
|
|
|
|
### Using a Remote Server
|
|
|
|
If your server is on a different machine:
|
|
|
|
```bash
|
|
# Create session
|
|
multmux create my-project --server http://your-server:3000
|
|
|
|
# Join session
|
|
multmux join <token> --server ws://your-server:3001
|
|
```
|
|
|
|
## CLI Commands
|
|
|
|
| Command | Description |
|
|
|---------|-------------|
|
|
| `multmux create <name>` | Create a new collaborative session |
|
|
| `multmux join <token>` | Join an existing session |
|
|
| `multmux list` | List all active sessions |
|
|
|
|
### Options
|
|
|
|
**create:**
|
|
- `-s, --server <url>` - Server URL (default: http://localhost:3000)
|
|
- `-r, --repo <path>` - Repository path to cd into
|
|
|
|
**join:**
|
|
- `-s, --server <url>` - WebSocket server URL (default: ws://localhost:3001)
|
|
|
|
**list:**
|
|
- `-s, --server <url>` - Server URL (default: http://localhost:3000)
|
|
|
|
## Server Management
|
|
|
|
### PM2 Commands
|
|
|
|
```bash
|
|
pm2 status # Check server status
|
|
pm2 logs multmux-server # View server logs
|
|
pm2 restart multmux-server # Restart server
|
|
pm2 stop multmux-server # Stop server
|
|
```
|
|
|
|
### Resource Usage
|
|
|
|
- **Idle**: ~100-150MB RAM
|
|
- **Per session**: ~5-10MB RAM
|
|
- **Per user**: ~1-2MB RAM
|
|
- **Typical usage**: 200-300MB RAM total
|
|
|
|
## API Reference
|
|
|
|
### HTTP API (default: port 3000)
|
|
|
|
| Endpoint | Method | Description |
|
|
|----------|--------|-------------|
|
|
| `/api/sessions` | POST | Create a new session |
|
|
| `/api/sessions` | GET | List active sessions |
|
|
| `/api/sessions/:id` | GET | Get session info |
|
|
| `/api/sessions/:id/tokens` | POST | Generate new invite token |
|
|
| `/api/health` | GET | Health check |
|
|
|
|
### WebSocket (default: port 3001)
|
|
|
|
Connect with: `ws://localhost:3001?token=<your-token>`
|
|
|
|
**Message Types:**
|
|
- `output` - Terminal output from server
|
|
- `input` - User input to terminal
|
|
- `resize` - Terminal resize event
|
|
- `presence` - User join/leave notifications
|
|
- `joined` - Connection confirmation
|
|
|
|
## Security
|
|
|
|
- **Token Expiration**: Invite tokens expire after 60 minutes (configurable)
|
|
- **Session Isolation**: Each session runs in its own tmux instance
|
|
- **Input Validation**: All terminal input is validated
|
|
- **No Persistence**: Sessions are destroyed when all users leave
|
|
|
|
## Troubleshooting
|
|
|
|
### Server won't start
|
|
|
|
Check if ports are available:
|
|
```bash
|
|
netstat -tlnp | grep -E '3000|3001'
|
|
```
|
|
|
|
### Can't connect to server
|
|
|
|
1. Check server is running: `pm2 status`
|
|
2. Check logs: `pm2 logs multmux-server`
|
|
3. Verify firewall allows ports 3000 and 3001
|
|
|
|
### Terminal not responding
|
|
|
|
1. Check WebSocket connection in browser console
|
|
2. Verify token hasn't expired
|
|
3. Restart session: `pm2 restart multmux-server`
|
|
|
|
## Development
|
|
|
|
### Project Structure
|
|
|
|
```
|
|
multmux/
|
|
├── packages/
|
|
│ ├── server/ # Backend server
|
|
│ │ ├── src/
|
|
│ │ │ ├── managers/ # Session & token management
|
|
│ │ │ ├── websocket/ # WebSocket handler
|
|
│ │ │ └── api/ # HTTP routes
|
|
│ └── cli/ # CLI client
|
|
│ ├── src/
|
|
│ │ ├── commands/ # CLI commands
|
|
│ │ ├── connection/ # WebSocket client
|
|
│ │ └── ui/ # Terminal UI
|
|
└── infrastructure/ # Deployment scripts
|
|
```
|
|
|
|
### Running in Development
|
|
|
|
**Terminal 1 - Server:**
|
|
```bash
|
|
npm run dev:server
|
|
```
|
|
|
|
**Terminal 2 - CLI:**
|
|
```bash
|
|
cd packages/cli
|
|
npm run dev -- create test-session
|
|
```
|
|
|
|
### Building
|
|
|
|
```bash
|
|
npm run build # Builds both packages
|
|
```
|
|
|
|
## License
|
|
|
|
MIT
|
|
|
|
## Contributing
|
|
|
|
Contributions welcome! Please open an issue or PR.
|