317 lines
8.0 KiB
Bash
317 lines
8.0 KiB
Bash
#!/bin/bash
|
||
|
||
# EZ-Assistant Integration for EZ-Homelab
|
||
# This file contains functions to be integrated into ez-homelab.sh
|
||
|
||
# EZ-Assistant Installation Functions
|
||
# Add these functions to your ez-homelab.sh script
|
||
|
||
check_ez_assistant_requirements() {
|
||
echo "🔍 Checking EZ-Assistant requirements..."
|
||
|
||
# Check Docker
|
||
if ! command -v docker &> /dev/null; then
|
||
echo "❌ Docker is not installed. Please install Docker first."
|
||
return 1
|
||
fi
|
||
|
||
# Check if Docker is running
|
||
if ! docker info &> /dev/null; then
|
||
echo "❌ Docker daemon is not running. Please start Docker."
|
||
return 1
|
||
fi
|
||
|
||
# Check Git
|
||
if ! command -v git &> /dev/null; then
|
||
echo "❌ Git is not installed. Please install Git."
|
||
return 1
|
||
fi
|
||
|
||
# Check available disk space (need at least 2GB)
|
||
local available_space=$(df /tmp | tail -1 | awk '{print $4}')
|
||
if [ "$available_space" -lt 2097152 ]; then # 2GB in KB
|
||
echo "❌ Insufficient disk space. Need at least 2GB free."
|
||
return 1
|
||
fi
|
||
|
||
# Check internet connectivity
|
||
if ! ping -c 1 github.com &> /dev/null; then
|
||
echo "❌ No internet connection. Required for downloading Moltbot."
|
||
return 1
|
||
fi
|
||
|
||
echo "✅ System requirements met"
|
||
return 0
|
||
}
|
||
|
||
build_ez_assistant_image() {
|
||
local build_dir="/tmp/moltbot-build-$$"
|
||
local image_name="moltbot:local"
|
||
|
||
echo "🔨 Building EZ-Assistant Docker image..."
|
||
echo " This may take 5-10 minutes depending on your internet connection"
|
||
echo ""
|
||
|
||
# Create temporary build directory
|
||
mkdir -p "$build_dir"
|
||
cd "$build_dir"
|
||
|
||
# Clone Moltbot repository
|
||
echo "📥 Cloning Moltbot repository..."
|
||
if ! git clone https://github.com/moltbot/moltbot.git .; then
|
||
echo "❌ Failed to clone Moltbot repository"
|
||
cd /
|
||
rm -rf "$build_dir"
|
||
return 1
|
||
fi
|
||
|
||
# Create Dockerfile for the build
|
||
cat > Dockerfile << 'EOF'
|
||
FROM node:22-slim
|
||
|
||
# Install system dependencies
|
||
RUN apt-get update && apt-get install -y \
|
||
python3 \
|
||
make \
|
||
g++ \
|
||
git \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
# Set working directory
|
||
WORKDIR /app
|
||
|
||
# Copy package files
|
||
COPY package*.json ./
|
||
COPY pnpm-lock.yaml ./
|
||
|
||
# Install pnpm
|
||
RUN npm install -g pnpm
|
||
|
||
# Install dependencies
|
||
RUN pnpm install --frozen-lockfile
|
||
|
||
# Copy source code
|
||
COPY . .
|
||
|
||
# Build the application
|
||
RUN pnpm run build
|
||
|
||
# Expose ports
|
||
EXPOSE 3000 3001
|
||
|
||
# Set environment variables
|
||
ENV NODE_ENV=production
|
||
|
||
# Create non-root user
|
||
RUN useradd -m -u 1001 moltbot
|
||
USER moltbot
|
||
|
||
# Start the application
|
||
CMD ["pnpm", "start"]
|
||
EOF
|
||
|
||
# Build the Docker image
|
||
echo "🏗️ Building Docker image..."
|
||
if ! docker build -t "$image_name" .; then
|
||
echo "❌ Failed to build Docker image"
|
||
cd /
|
||
rm -rf "$build_dir"
|
||
return 1
|
||
fi
|
||
|
||
# Clean up
|
||
cd /
|
||
rm -rf "$build_dir"
|
||
|
||
echo "✅ Docker image built successfully: $image_name"
|
||
return 0
|
||
}
|
||
|
||
setup_ez_assistant_config() {
|
||
local stack_dir="/opt/stacks/ez-assistant"
|
||
|
||
echo "⚙️ Setting up EZ-Assistant configuration..."
|
||
|
||
# Create stack directory
|
||
mkdir -p "$stack_dir"
|
||
|
||
# Create .env file if it doesn't exist
|
||
if [[ ! -f "$stack_dir/.env" ]]; then
|
||
cat > "$stack_dir/.env" << 'EOF'
|
||
# EZ-Assistant Environment Configuration
|
||
# Add your API keys and bot tokens below
|
||
|
||
# AI Service API Keys (required for AI functionality)
|
||
# Get from: https://console.anthropic.com/
|
||
CLAUDE_API_KEY=your_claude_api_key_here
|
||
|
||
# Bot Tokens (optional - for Telegram/Discord integration)
|
||
# Telegram: Talk to @BotFather on Telegram to create a bot
|
||
TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here
|
||
|
||
# Discord: Create at https://discord.com/developers/applications
|
||
DISCORD_BOT_TOKEN=your_discord_bot_token_here
|
||
|
||
# Gateway Configuration
|
||
CLAWDBOT_GATEWAY_TOKEN=your_secure_gateway_token_here
|
||
CLAWDBOT_CLI_TOKEN=your_secure_cli_token_here
|
||
|
||
# Web UI Configuration
|
||
CLAWDBOT_WEB_USERNAME=admin
|
||
CLAWDBOT_WEB_PASSWORD=change_this_password
|
||
EOF
|
||
echo "📝 Created $stack_dir/.env - Please edit with your API keys"
|
||
else
|
||
echo "ℹ️ .env file already exists"
|
||
fi
|
||
|
||
# Create moltbot config directory
|
||
mkdir -p "$stack_dir/moltbot/config"
|
||
|
||
# Create moltbot.json config
|
||
cat > "$stack_dir/moltbot/config/moltbot.json" << 'EOF'
|
||
{
|
||
"gateway": {
|
||
"port": 3001,
|
||
"token": "${CLAWDBOT_GATEWAY_TOKEN}",
|
||
"cors": {
|
||
"origin": "*"
|
||
}
|
||
},
|
||
"cli": {
|
||
"token": "${CLAWDBOT_CLI_TOKEN}",
|
||
"gatewayUrl": "http://moltbot-gateway:3001"
|
||
},
|
||
"web": {
|
||
"port": 3000,
|
||
"username": "${CLAWDBOT_WEB_USERNAME}",
|
||
"password": "${CLAWDBOT_WEB_PASSWORD}",
|
||
"gatewayUrl": "http://moltbot-gateway:3001"
|
||
},
|
||
"ai": {
|
||
"provider": "claude",
|
||
"apiKey": "${CLAUDE_API_KEY}"
|
||
},
|
||
"bots": {
|
||
"telegram": {
|
||
"enabled": true,
|
||
"token": "${TELEGRAM_BOT_TOKEN}"
|
||
},
|
||
"discord": {
|
||
"enabled": true,
|
||
"token": "${DISCORD_BOT_TOKEN}"
|
||
}
|
||
}
|
||
}
|
||
EOF
|
||
|
||
echo "✅ Configuration files created"
|
||
return 0
|
||
}
|
||
|
||
install_ez_assistant() {
|
||
local stack_dir="/opt/stacks/ez-assistant"
|
||
|
||
echo "🤖 Installing EZ-Assistant..."
|
||
echo " This will build Moltbot from source (5-10 minutes)"
|
||
echo ""
|
||
|
||
# Check requirements
|
||
if ! check_ez_assistant_requirements; then
|
||
echo "❌ Requirements not met. Skipping EZ-Assistant installation."
|
||
return 1
|
||
fi
|
||
|
||
# Build Docker image
|
||
if ! build_ez_assistant_image; then
|
||
echo "❌ Failed to build EZ-Assistant image."
|
||
return 1
|
||
fi
|
||
|
||
# Setup configuration
|
||
if ! setup_ez_assistant_config; then
|
||
echo "❌ Failed to setup EZ-Assistant configuration."
|
||
return 1
|
||
fi
|
||
|
||
# Create docker-compose.yml
|
||
cat > "$stack_dir/docker-compose.yml" << 'EOF'
|
||
version: '3.8'
|
||
|
||
services:
|
||
moltbot-gateway:
|
||
image: moltbot:local
|
||
container_name: moltbot-gateway
|
||
restart: unless-stopped
|
||
environment:
|
||
- CLAWDBOT_MODE=gateway
|
||
env_file:
|
||
- .env
|
||
volumes:
|
||
- ./moltbot/config:/app/config:ro
|
||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||
networks:
|
||
- ez-homelab
|
||
labels:
|
||
- "traefik.enable=true"
|
||
- "traefik.http.routers.assistant.rule=Host(`assistant.yourdomain.com`)"
|
||
- "traefik.http.routers.assistant.entrypoints=websecure"
|
||
- "traefik.http.routers.assistant.tls.certresolver=letsencrypt"
|
||
- "traefik.http.services.assistant.loadbalancer.server.port=3000"
|
||
- "traefik.http.middlewares.assistant-websocket.headers.customrequestheaders.X-Forwarded-Proto=https"
|
||
- "traefik.http.middlewares.assistant-websocket.headers.customrequestheaders.X-Real-IP=$remote"
|
||
- "traefik.http.middlewares.assistant-websocket.headers.customrequestheaders.X-Forwarded-Host=$host"
|
||
- "traefik.http.routers.assistant.middlewares=assistant-websocket"
|
||
|
||
moltbot-cli:
|
||
image: moltbot:local
|
||
container_name: moltbot-cli
|
||
restart: unless-stopped
|
||
environment:
|
||
- CLAWDBOT_MODE=cli
|
||
env_file:
|
||
- .env
|
||
volumes:
|
||
- ./moltbot/config:/app/config:ro
|
||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||
networks:
|
||
- ez-homelab
|
||
depends_on:
|
||
- moltbot-gateway
|
||
|
||
networks:
|
||
ez-homelab:
|
||
external: true
|
||
EOF
|
||
|
||
# Start the services
|
||
echo "🚀 Starting EZ-Assistant services..."
|
||
cd "$stack_dir"
|
||
if ! docker-compose up -d; then
|
||
echo "❌ Failed to start EZ-Assistant services."
|
||
return 1
|
||
fi
|
||
|
||
# Wait for services to be healthy
|
||
echo "⏳ Waiting for services to start..."
|
||
sleep 10
|
||
|
||
# Check if services are running
|
||
if docker-compose ps | grep -q "Up"; then
|
||
echo "✅ EZ-Assistant services started successfully!"
|
||
else
|
||
echo "⚠️ Services may still be starting. Check status with: docker-compose ps"
|
||
fi
|
||
|
||
echo ""
|
||
echo "🔑 Important: Configure your AI service keys and bot tokens in:"
|
||
echo " $stack_dir/.env"
|
||
echo ""
|
||
echo "🤖 Your EZ-Assistant will be available at:"
|
||
echo " https://assistant.yourdomain.com (after Traefik setup)"
|
||
echo ""
|
||
echo "📚 For setup instructions, visit:"
|
||
echo " https://docs.ez-homelab.com/assistant"
|
||
|
||
return 0
|
||
} |