Files
crawl4ai/deploy/installer/README.md
unclecode d88ff3fbad refactor(installer): rename deploy.sh to install-cnode.sh for consistency
- Renamed deploy.sh -> install-cnode.sh (clearer name)
- Updated all references in README.md
- Single consistent naming: install-cnode.sh everywhere
2025-10-21 10:57:16 +08:00

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