- Renamed deploy.sh -> install-cnode.sh (clearer name) - Updated all references in README.md - Single consistent naming: install-cnode.sh everywhere
346 lines
8.1 KiB
Markdown
346 lines
8.1 KiB
Markdown
# Crawl4AI Node Manager (cnode) - Installation & Distribution
|
|
|
|
This directory contains the standalone `cnode` package and installation scripts for managing Crawl4AI Docker server instances.
|
|
|
|
## Overview
|
|
|
|
`cnode` is a fast, lightweight CLI tool for managing Crawl4AI Docker servers. It provides:
|
|
- One-command deployment with automatic scaling
|
|
- Single container for development (N=1)
|
|
- Docker Swarm for production with built-in load balancing (N>1)
|
|
- Docker Compose + Nginx as fallback (N>1)
|
|
|
|
## Directory Structure
|
|
|
|
```
|
|
deploy/installer/
|
|
├── README.md # This file
|
|
├── cnode_pkg/ # Standalone Python package
|
|
│ ├── __init__.py # Package marker
|
|
│ ├── cli.py # CLI interface (commands)
|
|
│ ├── server_manager.py # Docker orchestration logic
|
|
│ └── requirements.txt # Python dependencies
|
|
├── install-cnode.sh # Local installation script
|
|
├── install-cnode.sh # Remote installation script (for users)
|
|
└── releases/ # Release artifacts for distribution
|
|
```
|
|
|
|
## Installation
|
|
|
|
### For Users (Remote Installation)
|
|
|
|
Users can install `cnode` directly from the web:
|
|
|
|
```bash
|
|
# Install from GitHub/website
|
|
curl -sSL https://crawl4ai.com/install-cnode.sh | bash
|
|
|
|
# Or with wget
|
|
wget -qO- https://crawl4ai.com/install-cnode.sh | bash
|
|
```
|
|
|
|
### For Local Testing
|
|
|
|
Test the installation locally:
|
|
|
|
```bash
|
|
cd deploy/installer
|
|
./install-cnode.sh
|
|
```
|
|
|
|
## Package Contents
|
|
|
|
### `cnode_pkg/` - Python Package
|
|
|
|
This is a self-contained Python package with:
|
|
|
|
- **`cli.py`**: Click-based CLI with all commands (start, stop, status, scale, logs, cleanup, restart)
|
|
- **`server_manager.py`**: Core Docker orchestration logic
|
|
- **`requirements.txt`**: Dependencies (click, rich, anyio, pyyaml)
|
|
- **`__init__.py`**: Package initialization
|
|
|
|
### Installation Script
|
|
|
|
**`install-cnode.sh`** does the following:
|
|
1. Checks for Python 3.8+ and pip
|
|
2. Checks for Docker (warns if not found)
|
|
3. Installs Python dependencies
|
|
4. Copies `cnode_pkg/` to `/usr/local/lib/cnode/`
|
|
5. Creates wrapper script at `/usr/local/bin/cnode`
|
|
6. Verifies installation
|
|
|
|
### Wrapper Script
|
|
|
|
Created at `/usr/local/bin/cnode`:
|
|
|
|
```bash
|
|
#!/usr/bin/env bash
|
|
set -e
|
|
|
|
# Find Python
|
|
if command -v python3 &> /dev/null; then
|
|
PYTHON_CMD="python3"
|
|
elif command -v python &> /dev/null; then
|
|
PYTHON_CMD="python"
|
|
else
|
|
echo "Error: Python 3.8+ required" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Run cnode
|
|
export PYTHONPATH="/usr/local/lib/cnode:$PYTHONPATH"
|
|
exec $PYTHON_CMD -m cnode_pkg.cli "$@"
|
|
```
|
|
|
|
## Performance
|
|
|
|
**Blazing Fast Startup:**
|
|
- **~0.1 seconds** to launch
|
|
- 49x faster than compiled binary alternatives
|
|
- Minimal overhead, maximum responsiveness
|
|
|
|
## Requirements
|
|
|
|
### User Requirements
|
|
- Python 3.8 or higher
|
|
- pip (Python package manager)
|
|
- Docker (for running servers)
|
|
|
|
### Dependencies (Auto-installed)
|
|
- click >= 8.0.0 (CLI framework)
|
|
- rich >= 13.0.0 (Terminal formatting)
|
|
- anyio >= 3.0.0 (Async I/O)
|
|
- pyyaml >= 6.0.0 (YAML parsing)
|
|
|
|
## Usage
|
|
|
|
After installation:
|
|
|
|
```bash
|
|
# Quick start
|
|
cnode start # Single container on port 11235
|
|
cnode start --replicas 5 # 5-replica cluster
|
|
cnode status # Check server status
|
|
cnode logs -f # Follow logs
|
|
cnode scale 10 # Scale to 10 replicas
|
|
cnode stop # Stop server
|
|
|
|
# Get help
|
|
cnode --help
|
|
cnode start --help
|
|
```
|
|
|
|
## Development Workflow
|
|
|
|
### Making Changes
|
|
|
|
1. **Edit source code** in `deploy/docker/`:
|
|
```bash
|
|
vim deploy/docker/cnode_cli.py
|
|
vim deploy/docker/server_manager.py
|
|
```
|
|
|
|
2. **Update package** by copying to installer:
|
|
```bash
|
|
# Copy CLI
|
|
cp deploy/docker/cnode_cli.py deploy/installer/cnode_pkg/cli.py
|
|
|
|
# Fix imports (deploy.docker → cnode_pkg)
|
|
sed -i 's/from deploy\.docker\./from cnode_pkg./g' deploy/installer/cnode_pkg/cli.py
|
|
|
|
# Copy server manager
|
|
cp deploy/docker/server_manager.py deploy/installer/cnode_pkg/server_manager.py
|
|
```
|
|
|
|
3. **Test locally**:
|
|
```bash
|
|
cd deploy/installer
|
|
./install-cnode.sh
|
|
cnode --help
|
|
```
|
|
|
|
4. **Commit both**:
|
|
```bash
|
|
git add deploy/docker/cnode_cli.py
|
|
git add deploy/installer/cnode_pkg/cli.py
|
|
git commit -m "Update cnode: [description]"
|
|
```
|
|
|
|
### Creating a Release
|
|
|
|
1. **Tag the release**:
|
|
```bash
|
|
git tag -a v1.0.0 -m "Release v1.0.0"
|
|
git push origin v1.0.0
|
|
```
|
|
|
|
2. **Package for distribution**:
|
|
```bash
|
|
cd deploy/installer
|
|
tar -czf releases/cnode-v1.0.0.tar.gz cnode_pkg/ install-cnode.sh
|
|
```
|
|
|
|
3. **Create GitHub release**:
|
|
```bash
|
|
gh release create v1.0.0 \
|
|
releases/cnode-v1.0.0.tar.gz \
|
|
--title "cnode v1.0.0" \
|
|
--notes "Release notes here"
|
|
```
|
|
|
|
4. **Update deployment script** (if needed):
|
|
- Update `install-cnode.sh` with new version/URL
|
|
- Upload to hosting (e.g., `https://crawl4ai.com/install-cnode.sh`)
|
|
|
|
## Deployment
|
|
|
|
### Remote Installation Script
|
|
|
|
The `install-cnode.sh` script is meant to be hosted at a public URL for user installation:
|
|
|
|
```bash
|
|
# Upload to your server
|
|
scp install-cnode.sh user@crawl4ai.com:/var/www/html/install-cnode.sh
|
|
|
|
# Or use GitHub raw URL
|
|
https://raw.githubusercontent.com/unclecode/crawl4ai/main/deploy/installer/install-cnode.sh
|
|
```
|
|
|
|
Users can then install with:
|
|
```bash
|
|
curl -sSL https://crawl4ai.com/install-cnode.sh | bash
|
|
```
|
|
|
|
## Backward Compatibility
|
|
|
|
The main Crawl4AI CLI (`crwl`) includes a redirect for backward compatibility:
|
|
|
|
```bash
|
|
# These work identically:
|
|
crwl server start --replicas 3
|
|
cnode start --replicas 3
|
|
|
|
# All subcommands redirect:
|
|
crwl server status → cnode status
|
|
crwl server stop → cnode stop
|
|
crwl server scale 5 → cnode scale 5
|
|
crwl server logs -f → cnode logs -f
|
|
```
|
|
|
|
This ensures existing scripts continue working while users migrate to `cnode`.
|
|
|
|
## Uninstallation
|
|
|
|
To remove cnode:
|
|
|
|
```bash
|
|
# Remove command
|
|
sudo rm /usr/local/bin/cnode
|
|
|
|
# Remove package
|
|
sudo rm -rf /usr/local/lib/cnode
|
|
|
|
# (Optional) Uninstall dependencies
|
|
pip uninstall click rich anyio pyyaml
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Python Not Found
|
|
```bash
|
|
# Install Python 3.8+
|
|
# macOS: brew install python3
|
|
# Ubuntu: sudo apt install python3 python3-pip
|
|
# RHEL/CentOS: sudo yum install python3 python3-pip
|
|
```
|
|
|
|
### Permission Denied
|
|
```bash
|
|
# Run installer with sudo
|
|
sudo ./install-cnode.sh
|
|
|
|
# Or change install location
|
|
INSTALL_DIR=$HOME/.local/bin ./install-cnode.sh
|
|
```
|
|
|
|
### Command Not Found After Install
|
|
```bash
|
|
# Add to PATH in ~/.bashrc or ~/.zshrc
|
|
export PATH="/usr/local/bin:$PATH"
|
|
|
|
# Reload shell
|
|
source ~/.bashrc # or source ~/.zshrc
|
|
```
|
|
|
|
### Dependencies Install Failed
|
|
```bash
|
|
# Install manually
|
|
pip install --user click rich anyio pyyaml
|
|
|
|
# Or with break-system-packages (if needed)
|
|
pip install --user --break-system-packages click rich anyio pyyaml
|
|
```
|
|
|
|
### Docker Not Running
|
|
```bash
|
|
# macOS: Start Docker Desktop
|
|
# Linux: sudo systemctl start docker
|
|
|
|
# Check Docker
|
|
docker --version
|
|
docker ps
|
|
```
|
|
|
|
## Architecture
|
|
|
|
### Component Flow
|
|
|
|
```
|
|
User runs: cnode start
|
|
↓
|
|
/usr/local/bin/cnode (wrapper script)
|
|
↓
|
|
Finds python3 executable
|
|
↓
|
|
Sets PYTHONPATH=/usr/local/lib/cnode
|
|
↓
|
|
python3 -m cnode_pkg.cli start
|
|
↓
|
|
cli.py → start_cmd()
|
|
↓
|
|
server_manager.py → ServerManager.start()
|
|
↓
|
|
Docker orchestration (single/swarm/compose)
|
|
↓
|
|
Server running!
|
|
```
|
|
|
|
### Why Python Wrapper vs Binary?
|
|
|
|
We chose a Python wrapper over compiled binaries (PyInstaller) because:
|
|
|
|
| Metric | Python Wrapper | PyInstaller Binary |
|
|
|--------|---------------|-------------------|
|
|
| Startup time | **0.1s** | 4.7s |
|
|
| Size | ~50KB wrapper | 8.8MB |
|
|
| Updates | Easy (just copy files) | Rebuild required |
|
|
| Dependencies | Python 3.8+ | None |
|
|
| Platform | Any with Python | OS-specific builds |
|
|
|
|
Since users running Crawl4AI already have Python, the wrapper is the clear winner.
|
|
|
|
## Support
|
|
|
|
For issues or questions:
|
|
- GitHub Issues: https://github.com/unclecode/crawl4ai/issues
|
|
- Documentation: https://docs.crawl4ai.com
|
|
- Discord: https://discord.gg/crawl4ai
|
|
|
|
## Version History
|
|
|
|
- **v1.0.0**: Initial release with Python wrapper approach
|
|
- Fast startup (~0.1s)
|
|
- Supports single container, Docker Swarm, and Compose modes
|
|
- Auto-scaling and load balancing
|
|
- Real-time monitoring and logs
|