Production Deployment Guide
This guide covers deploying MiniClaw in production environments with emphasis on security, reliability, and scalability.
Prerequisites
- Linux server (Ubuntu 20.04+ recommended)
- Python 3.9+
- Docker (optional, for containerized deployment)
- Reverse proxy (nginx, Apache, or cloud load balancer)
- SSL certificate (Let's Encrypt recommended)
Deployment Options
1. Direct Installation
For simple deployments on a single server:
# Create dedicated user
sudo useradd -m -s /bin/bash miniclaw
sudo su - miniclaw
# Clone repository
git clone <repo-url>
cd miniclaw
# Install dependencies
pip install -e .
# Create production configuration
mkdir -p ~/.miniclaw
cp miniclaw_config.example.json ~/.miniclaw/miniclaw_config.json
2. Docker Deployment
Docker deployment is the recommended approach for production environments as it provides better isolation, easier management, and consistent behavior across different environments.
Prerequisites for Docker Deployment
- Docker 20.04+ installed on the host system
- Docker Compose (optional but recommended)
Optimized Dockerfile
Create a Dockerfile at the root of your repository:
FROM python:3.11-slim
# Set environment variables
ENV MINICLAW_HOST=0.0.0.0
ENV MINICLAW_PORT=8787
ENV MINICLAW_WORKSPACE=/home/miniclaw/.miniclaw
ENV PATH="/home/miniclaw/.local/bin:${PATH}"
# Install system dependencies
RUN apt-get update && apt-get install -y \
curl \
&& rm -rf /var/lib/apt/lists/*
# Create non-root user
RUN useradd -m -s /bin/bash miniclaw
USER miniclaw
WORKDIR /home/miniclaw
# Copy local code instead of cloning
COPY --chown=miniclaw:miniclaw . /home/miniclaw/miniclaw
WORKDIR /home/miniclaw/miniclaw
# Install MiniClaw in development mode
RUN python -m pip install --no-cache-dir --upgrade pip && \
pip install --no-cache-dir -e .
# Create workspace directory
RUN mkdir -p /home/miniclaw/.miniclaw
# Expose the default port
EXPOSE 8787
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f http://localhost:8787/api/health || exit 1
# Run MiniClaw server
CMD ["python", "-c", "from miniclaw import run; run()"]
Docker Ignore File
Create a .dockerignore file to exclude unnecessary files from the build context:
.git
.gitignore
.coverage
__pycache__
*.pyc
.venv/
venv/
.DS_Store
*.log
build/
dist/
*.egg-info/
htmlcov/
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
frontend/node_modules/
frontend/dist/
tmp/
tests/
*.md
!.github/
!.gitlab/
# Exclude local data that shouldn't be in the image
.miniclaw/
Building the Docker Image
# Build the Docker image
docker build -t miniclaw .
# Verify the image was built successfully
docker images | grep miniclaw
Running MiniClaw Container
Basic container run:
docker run -d \
--name miniclaw \
-p 8787:8787 \
-v miniclaw_data:/home/miniclaw/.miniclaw \
miniclaw
3. Docker Compose Deployment (Recommended)
Docker Compose provides the easiest way to manage MiniClaw with all its dependencies and configurations.
Create a docker-compose.yml file:
version: '3.8'
services:
miniclaw:
build: .
container_name: miniclaw
ports:
- "8787:8787"
environment:
- MINICLAW_HOST=0.0.0.0
- MINICLAW_PORT=8787
volumes:
- miniclaw_data:/home/miniclaw/.miniclaw
restart: unless-stopped
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8787/api/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
volumes:
miniclaw_data:
Advanced Docker Compose Configuration
For production environments with more complex requirements:
version: '3.8'
services:
miniclaw:
build: .
container_name: miniclaw
ports:
- "8787:8787"
environment:
- MINICLAW_HOST=0.0.0.0
- MINICLAW_PORT=8787
# Configure your model provider
- PROVIDER_BASE_URL=https://api.inference.wandb.ai/v1
- PROVIDER_MODEL=Qwen/Qwen3-235B-A22B-Thinking-2507
- PROVIDER_API_KEY=your-api-key-here
volumes:
- miniclaw_data:/home/miniclaw/.miniclaw
# Mount custom configuration if needed
# - ./custom_config.json:/home/miniclaw/.miniclaw/miniclaw_config.json
restart: unless-stopped
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8787/api/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
# Resource limits
deploy:
resources:
limits:
memory: 1G
cpus: '0.5'
reservations:
memory: 512M
cpus: '0.25'
volumes:
miniclaw_data:
Docker Compose Commands
# Start services
docker-compose up -d
# View logs
docker-compose logs -f
# Stop services
docker-compose down
# Update and restart
docker-compose up -d --build
# Check service status
docker-compose ps
4. Custom Configuration in Docker
Environment Variables
MiniClaw supports several environment variables for configuration:
docker run -d \
--name miniclaw \
-p 8787:8787 \
-e MINICLAW_HOST=0.0.0.0 \
-e MINICLAW_PORT=8787 \
-e MINICLAW_WORKSPACE=/home/miniclaw/.miniclaw \
-e PROVIDER_BASE_URL=https://api.inference.wandb.ai/v1 \
-e PROVIDER_MODEL=Qwen/Qwen3-235B-A22B-Thinking-2507 \
-v miniclaw_data:/home/miniclaw/.miniclaw \
miniclaw
Custom Configuration File
To use a custom configuration file:
# Create a custom config file
echo '{
"server": {
"host": "0.0.0.0",
"port": 8787
},
"providers": {
"default_provider_id": "wandb_inf",
"items": [
{
"api_key": "your-api-key",
"base_url": "https://api.inference.wandb.ai/v1",
"enabled": true,
"id": "wandb_inf",
"model": "Qwen/Qwen3-235B-A22B-Thinking-2507",
"name": "wandb",
"temperature": 0.2,
"timeout_seconds": 300,
"type": "openai_compatible",
"verify_tls": true
}
]
}
}' > custom_config.json
# Run with custom config
docker run -d \
--name miniclaw \
-p 8787:8787 \
-v $(pwd)/custom_config.json:/home/miniclaw/.miniclaw/miniclaw_config.json \
-v miniclaw_data:/home/miniclaw/.miniclaw \
miniclaw
5. Telegram Integration in Docker
To enable Telegram integration, you'll need to configure the bot token in your config file or environment variables:
# In docker-compose.yml
services:
miniclaw:
# ... other configuration
environment:
- MINICLAW_HOST=0.0.0.0
- MINICLAW_PORT=8787
- TELEGRAM_BOT_TOKEN=your-bot-token-here
volumes:
- miniclaw_data:/home/miniclaw/.miniclaw
Or update the config file directly:
{
"telegram": {
"enabled": true,
"bot_token": "your-bot-token-here",
"allowed_chat_ids": [],
"binding_mode": "single",
"poll_interval_seconds": 2,
"pairing_required": true,
"pairing_code_ttl_seconds": 600,
"progress_update_seconds": 12
}
}
Persistent Data
The Docker setup uses a named volume (miniclaw_data) to persist data across container restarts. This includes:
- Configuration files
- Skills
- Memory files
- Job definitions
- Plugin configurations
To backup persistent data:
# Create backup
docker run --rm -v miniclaw_data:/source -v $(pwd):/backup \
alpine tar czf /backup/miniclaw_backup.tar.gz -C /source .
# Restore from backup
docker run --rm -v miniclaw_data:/target -v $(pwd):/backup \
alpine tar xzf /backup/miniclaw_backup.tar.gz -C /target
Updating MiniClaw in Docker
To update MiniClaw:
# Pull latest changes
git pull origin dev
# Rebuild the image
docker build -t miniclaw .
# Stop and remove the current container
docker stop miniclaw
docker rm miniclaw
# Start a new container
docker run -d \
--name miniclaw \
-p 8787:8787 \
-v miniclaw_data:/home/miniclaw/.miniclaw \
miniclaw
Or with Docker Compose:
# Pull latest changes
git pull origin dev
# Rebuild and restart
docker-compose up -d --build
Monitoring Docker Deployments
Check Container Logs
# Docker
docker logs miniclaw
# Docker Compose
docker-compose logs miniclaw
# Follow logs
docker logs -f miniclaw
Access Container Shell
# Docker
docker exec -it miniclaw /bin/bash
# Docker Compose
docker-compose exec miniclaw /bin/bash
Health Checks
The Docker images include built-in health checks. You can also manually check:
# Check if service is responding
curl -f http://localhost:8787/api/health
# Check container health status
docker inspect --format='{{json .State.Health}}' miniclaw
Docker Security Best Practices
1. Run as Non-Root User
The provided Dockerfile already runs as a non-root user (miniclaw), which is a security best practice.
2. Read-Only Filesystem
The Docker Compose example includes read_only: true which prevents the container from writing to most of the filesystem.
3. Resource Limits
Set appropriate resource limits to prevent resource exhaustion:
deploy:
resources:
limits:
memory: 1G
cpus: '0.5'
4. Network Security
Only expose necessary ports and consider using Docker networks for internal communication:
services:
miniclaw:
# ... other config
networks:
- miniclaw-net
expose:
- "8787" # Only expose internally
networks:
miniclaw-net:
driver: bridge
Troubleshooting Docker Deployments
Common Issues
-
Port Already in Use: Change the host port mapping:
bash docker run -d --name miniclaw -p 8788:8787 miniclaw -
Permission Issues: Ensure the Docker user has proper permissions to access volumes.
-
Configuration Errors: Validate your config file JSON syntax before mounting it.
-
Health Check Failures: Check container logs for startup errors:
bash docker logs miniclaw
Volume Issues
If persistent data seems corrupted:
# Check volume contents
docker volume inspect miniclaw_data
# Create a new volume and migrate data if needed
docker volume create miniclaw_data_new
Docker Multi-Stage Builds (Advanced)
For production deployments that require minimal image size:
# Build stage
FROM python:3.11-slim as builder
WORKDIR /app
COPY . .
# Install build dependencies and compile
RUN apt-get update && apt-get install -y \
build-essential \
&& rm -rf /var/lib/apt/lists/* \
&& python -m pip install --upgrade pip \
&& pip install --no-cache-dir -e .
# Production stage
FROM python:3.11-slim
# Set environment variables
ENV MINICLAW_HOST=0.0.0.0
ENV MINICLAW_PORT=8787
ENV MINICLAW_WORKSPACE=/home/miniclaw/.miniclaw
ENV PATH="/home/miniclaw/.local/bin:${PATH}"
# Install runtime dependencies only
RUN apt-get update && apt-get install -y \
curl \
&& rm -rf /var/lib/apt/lists/*
# Create non-root user
RUN useradd -m -s /bin/bash miniclaw
USER miniclaw
WORKDIR /home/miniclaw
# Copy only the installed packages and source code
COPY --from=builder --chown=miniclaw:miniclaw /usr/local /usr/local
COPY --from=builder --chown=miniclaw:miniclaw /home/miniclaw/miniclaw /home/miniclaw/miniclaw
WORKDIR /home/miniclaw/miniclaw
# Create workspace directory
RUN mkdir -p /home/miniclaw/.miniclaw
# Expose the default port
EXPOSE 8787
# Health check
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f http://localhost:8787/api/health || exit 1
# Run MiniClaw server
CMD ["python", "-c", "from miniclaw import run; run()"]
This enhanced deployment guide provides comprehensive instructions for deploying MiniClaw in Docker containers, covering everything from basic setup to advanced production configurations.
Security Hardening
1. User Permissions
# Create dedicated service user
sudo useradd -r -s /bin/false miniclaw
# Set proper ownership
sudo chown -R miniclaw:miniclaw ~/.miniclaw
sudo chmod 700 ~/.miniclaw
2. Network Security
Configure firewall to restrict access:
# UFW example
sudo ufw allow from 10.0.0.0/8 to any port 8787
sudo ufw allow from 172.16.0.0/12 to any port 8787
sudo ufw allow from 192.168.0.0/16 to any port 8787
3. Reverse Proxy Configuration
Nginx configuration with SSL:
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# Security headers
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
location / {
proxy_pass http://127.0.0.1:8787;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Timeout settings
proxy_connect_timeout 30s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
}
server {
listen 80;
server_name your-domain.com;
return 301 https://$server_name$request_uri;
}
Production Configuration
Create a hardened configuration file:
{
"server": {
"host": "127.0.0.1",
"port": 8787
},
"providers": {
"default_provider_id": "your_provider",
"items": [
{
"id": "your_provider",
"name": "Production Provider",
"type": "ollama",
"enabled": true,
"base_url": "http://your-model-server:11434",
"api_key": "your-api-key",
"model": "your-model-name",
"temperature": 0.2,
"timeout_seconds": 300,
"verify_tls": true,
"system_prompt_override": ""
}
]
},
"telegram": {
"enabled": true,
"bot_token": "your-telegram-token",
"allowed_chat_ids": ["your-chat-id"],
"binding_mode": "single",
"poll_interval_seconds": 2,
"pairing_required": true,
"pairing_code_ttl_seconds": 300,
"progress_update_seconds": 12
},
"tools": {
"enabled": true,
"max_steps": 4,
"allow_shell": false,
"allow_filesystem": true,
"allow_network": true,
"allow_browser": true,
"allow_mcp": true,
"command_timeout_seconds": 25,
"output_char_limit": 12000,
"working_directory": "/home/miniclaw/.miniclaw/workspace"
},
"monitoring": {
"max_events": 10000
}
}
Process Management
Systemd Service
Create /etc/systemd/system/miniclaw.service:
[Unit]
Description=MiniClaw AI Agent
After=network.target
[Service]
Type=simple
User=miniclaw
Group=miniclaw
WorkingDirectory=/home/miniclaw/miniclaw
Environment=PATH=/home/miniclaw/.local/bin:/usr/local/bin:/usr/bin:/bin
ExecStart=/home/miniclaw/.local/bin/miniclaw gateway
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
# Security settings
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/home/miniclaw/.miniclaw
[Install]
WantedBy=multi-user.target
Enable and start the service:
sudo systemctl daemon-reload
sudo systemctl enable miniclaw
sudo systemctl start miniclaw
sudo systemctl status miniclaw
Monitoring and Logging
Log Rotation
Create /etc/logrotate.d/miniclaw:
/home/miniclaw/.miniclaw/logs/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 miniclaw miniclaw
sharedscripts
postrotate
systemctl reload miniclaw
endscript
}
Health Checks
Monitor the health endpoint:
#!/bin/bash
# health_check.sh
HEALTH_URL="http://localhost:8787/api/health"
TIMEOUT=10
if curl -sf --max-time $TIMEOUT $HEALTH_URL > /dev/null; then
echo "Healthy"
exit 0
else
echo "Unhealthy"
exit 1
fi
Backup and Recovery
Regular Backups
#!/bin/bash
# backup_miniclaw.sh
BACKUP_DIR="/backup/miniclaw"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR/$DATE
tar -czf $BACKUP_DIR/$DATE/miniclaw_backup.tar.gz \
-C /home/miniclaw/.miniclaw .
# Keep only last 30 days
find $BACKUP_DIR -type d -mtime +30 -exec rm -rf {} \;
Schedule with cron:
# Daily backup at 2 AM
0 2 * * * /home/miniclaw/scripts/backup_miniclaw.sh
Scaling Considerations
Horizontal Scaling
For high-traffic deployments, consider:
- Load Balancer: Distribute requests across multiple instances
- Shared Storage: Use NFS or cloud storage for shared workspace
- Database: Replace file-based storage with PostgreSQL for state
- Caching: Implement Redis for frequently accessed data
Resource Limits
Set appropriate resource limits in systemd:
[Service]
# Memory limit
MemoryLimit=1G
# CPU quota
CPUQuota=50%
# File descriptor limits
LimitNOFILE=65536
# Process limits
LimitNPROC=1024
Troubleshooting
Common Issues
-
Port conflicts:
bash sudo netstat -tlnp | grep :8787 -
Permission errors:
bash sudo chown -R miniclaw:miniclaw /home/miniclaw/.miniclaw -
Service won't start:
bash sudo journalctl -u miniclaw -f
Logs
Check systemd logs:
sudo journalctl -u miniclaw
sudo journalctl -u miniclaw --since "1 hour ago"
Check application logs:
tail -f /home/miniclaw/.miniclaw/logs/miniclaw.log
Updates and Maintenance
Updating MiniClaw
# Stop service
sudo systemctl stop miniclaw
# Backup current installation
sudo cp -r /home/miniclaw/miniclaw /home/miniclaw/miniclaw.backup
# Update code
cd /home/miniclaw/miniclaw
git pull
# Update dependencies
pip install -e .
# Start service
sudo systemctl start miniclaw
Security Updates
Regularly update system packages:
sudo apt update && sudo apt upgrade -y
Monitor security advisories for dependencies:
pip list --outdated
Disaster Recovery
Restore from Backup
# Stop service
sudo systemctl stop miniclaw
# Restore from backup
BACKUP_FILE="/backup/miniclaw/20231201_020000/miniclaw_backup.tar.gz"
tar -xzf $BACKUP_FILE -C /home/miniclaw/.miniclaw
# Fix permissions
sudo chown -R miniclaw:miniclaw /home/miniclaw/.miniclaw
# Start service
sudo systemctl start miniclaw
This deployment guide provides a solid foundation for running MiniClaw in production environments with appropriate security and reliability measures.