Upload files to "/"
This commit is contained in:
parent
5881d0f0df
commit
068e6e9f5e
5 changed files with 1747 additions and 2 deletions
504
DEPLOYMENT_GUIDE.md
Normal file
504
DEPLOYMENT_GUIDE.md
Normal file
|
|
@ -0,0 +1,504 @@
|
|||
# Claude Code + Agents UI Docker Stack Deployment Guide
|
||||
|
||||
## Overview
|
||||
|
||||
This guide covers deploying a complete Docker stack on your TrueNAS SCALE instance that combines:
|
||||
- **Claude Code Agents UI** (Nuxt 3 frontend for agent orchestration)
|
||||
- **Claude Code Runtime** (Backend for code execution)
|
||||
- **PostgreSQL** (Optional: for agent data persistence)
|
||||
- **Redis** (Optional: for caching)
|
||||
- **Nginx** (Optional: reverse proxy)
|
||||
|
||||
## Prerequisites
|
||||
|
||||
### System Requirements
|
||||
- TrueNAS SCALE with Docker/Portainer running
|
||||
- Minimum 4GB RAM allocated to Docker
|
||||
- At least 20GB free disk space
|
||||
- Anthropic API key (get from https://console.anthropic.com/)
|
||||
|
||||
### Network Requirements
|
||||
- Port 3000 (Agents UI)
|
||||
- Port 5000 (Claude Code API - optional)
|
||||
- Port 80/443 (Nginx - optional)
|
||||
- Port 5432 (PostgreSQL - optional)
|
||||
- Port 6379 (Redis - optional)
|
||||
|
||||
## Deployment Methods
|
||||
|
||||
### Method 1: SSH Deployment (Recommended for TrueNAS)
|
||||
|
||||
#### Step 1: SSH into your TrueNAS system
|
||||
|
||||
```bash
|
||||
ssh root@your-truenas-ip
|
||||
# or use your specific TrueNAS user
|
||||
```
|
||||
|
||||
#### Step 2: Create project directory
|
||||
|
||||
```bash
|
||||
mkdir -p /mnt/pool-name/docker/claude-code-stack
|
||||
cd /mnt/pool-name/docker/claude-code-stack
|
||||
```
|
||||
|
||||
#### Step 3: Clone/create Docker files
|
||||
|
||||
Option A: Clone the entire repo with compose file:
|
||||
```bash
|
||||
git clone https://github.com/Ngxba/claude-code-agents-ui.git
|
||||
cd claude-code-agents-ui
|
||||
```
|
||||
|
||||
Option B: Copy the provided docker-compose.yml (recommended for your setup):
|
||||
```bash
|
||||
# Copy the provided files to this directory
|
||||
# - docker-compose.yml
|
||||
# - claude-code-stack.env
|
||||
# - nginx.conf
|
||||
# - Dockerfile (if using combined image)
|
||||
```
|
||||
|
||||
#### Step 4: Configure environment variables
|
||||
|
||||
```bash
|
||||
cp claude-code-stack.env .env
|
||||
nano .env # or vim .env
|
||||
```
|
||||
|
||||
Update these critical variables:
|
||||
```env
|
||||
ANTHROPIC_API_KEY=sk-ant-your-actual-key-here
|
||||
POSTGRES_PASSWORD=your-secure-password
|
||||
SESSION_SECRET=your-random-session-secret
|
||||
```
|
||||
|
||||
#### Step 5: Deploy with Docker Compose
|
||||
|
||||
```bash
|
||||
# Pull latest images
|
||||
docker-compose pull
|
||||
|
||||
# Build custom image (if using combined Dockerfile)
|
||||
docker-compose build --no-cache
|
||||
|
||||
# Start all services
|
||||
docker-compose up -d
|
||||
|
||||
# Check status
|
||||
docker-compose ps
|
||||
```
|
||||
|
||||
#### Step 6: Verify deployment
|
||||
|
||||
```bash
|
||||
# Check logs
|
||||
docker-compose logs -f agents-ui
|
||||
docker-compose logs -f claude-code-backend
|
||||
|
||||
# Test Claude Code UI
|
||||
curl http://localhost:3000
|
||||
|
||||
# Test Claude Code API
|
||||
curl http://localhost:5000/health 2>/dev/null || echo "API not yet responsive"
|
||||
```
|
||||
|
||||
### Method 2: TrueNAS MCP Deployment
|
||||
|
||||
If you have the TrueNAS MCP server configured:
|
||||
|
||||
```javascript
|
||||
// Example: Using TrueNAS MCP to deploy
|
||||
|
||||
await mcp.call('truenas:create_dataset', {
|
||||
parent: 'pool-name',
|
||||
name: 'docker/claude-code-stack'
|
||||
});
|
||||
|
||||
await mcp.call('truenas:list_directory', {
|
||||
path: '/mnt/pool-name/docker/claude-code-stack'
|
||||
});
|
||||
|
||||
// Write Docker Compose file via MCP
|
||||
// (Use ssh_ssh_exec for Docker commands)
|
||||
```
|
||||
|
||||
### Method 3: Portainer UI Deployment
|
||||
|
||||
If using Portainer on TrueNAS:
|
||||
|
||||
1. **Open Portainer** at `https://your-truenas-ip:9000`
|
||||
2. **Go to: Stacks > Add Stack**
|
||||
3. **Upload or paste** the docker-compose.yml content
|
||||
4. **Set environment variables** via the Web Editor
|
||||
5. **Deploy**
|
||||
|
||||
## Stack Architecture
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Claude Code Stack │
|
||||
├─────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ┌──────────────────┐ ┌────────────────────┐ │
|
||||
│ │ Nginx (Port 80) │◄───────►│ Agents UI │ │
|
||||
│ │ (optional) │ │ (Port 3000) │ │
|
||||
│ └──────────────────┘ ├────────────────────┤ │
|
||||
│ │ - Agent Management │ │
|
||||
│ │ - Chat Interface │ │
|
||||
│ ┌──────────────────┐ │ - Workflow Builder │ │
|
||||
│ │ Claude Code │ └────────────────────┘ │
|
||||
│ │ Backend (5000) │ │
|
||||
│ │ │ ┌────────────────────┐ │
|
||||
│ │ - Code Execution │◄───────►│ PostgreSQL │ │
|
||||
│ │ - File Access │ │ (Port 5432) │ │
|
||||
│ │ - Shell Commands │ │ (optional) │ │
|
||||
│ └──────────────────┘ └────────────────────┘ │
|
||||
│ │ │ │
|
||||
│ └──────────────┬───────────────┘ │
|
||||
│ │ │
|
||||
│ ┌─────▼──────┐ │
|
||||
│ │ Redis │ │
|
||||
│ │ (6379) │ │
|
||||
│ │ (optional) │ │
|
||||
│ └────────────┘ │
|
||||
│ │
|
||||
│ ┌────────────────────────────────────────────────┐ │
|
||||
│ │ Shared Volumes │ │
|
||||
│ │ - /workspace (projects) │ │
|
||||
│ │ - /root/.claude (config) │ │
|
||||
│ └────────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Post-Deployment Setup
|
||||
|
||||
### 1. Initialize Claude Code Configuration
|
||||
|
||||
```bash
|
||||
docker-compose exec claude-code-backend bash
|
||||
|
||||
# Inside container:
|
||||
claude auth login
|
||||
# Follow the authentication flow
|
||||
|
||||
# Create initial .claude directory structure
|
||||
mkdir -p ~/.claude/agents ~/.claude/skills ~/.claude/commands
|
||||
cd ~/.claude
|
||||
```
|
||||
|
||||
### 2. Configure Agents UI
|
||||
|
||||
The Agents UI will automatically detect:
|
||||
- Your Claude configuration at `~/.claude`
|
||||
- Available agents and commands
|
||||
- Environment setup
|
||||
|
||||
Access it at: `http://your-truenas-ip:3000`
|
||||
|
||||
### 3. Set Up Project Workspace
|
||||
|
||||
```bash
|
||||
# Create workspace structure
|
||||
docker-compose exec agents-ui bash -c "mkdir -p /workspace/{projects,agents,tools}"
|
||||
|
||||
# Mount your projects (example)
|
||||
docker-compose exec agents-ui bash -c "ln -s /mnt/shared/projects /workspace/projects"
|
||||
```
|
||||
|
||||
### 4. Configure SSH Keys (Optional but Recommended)
|
||||
|
||||
For agents to perform git operations:
|
||||
|
||||
```bash
|
||||
docker-compose exec claude-code-backend bash
|
||||
|
||||
# Inside container:
|
||||
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
|
||||
|
||||
# Copy public key to your GitHub/GitLab:
|
||||
cat ~/.ssh/id_rsa.pub
|
||||
```
|
||||
|
||||
## Common Operations
|
||||
|
||||
### Start/Stop Stack
|
||||
|
||||
```bash
|
||||
# Start
|
||||
docker-compose up -d
|
||||
|
||||
# Stop
|
||||
docker-compose down
|
||||
|
||||
# Stop with volume preservation
|
||||
docker-compose down --remove-orphans
|
||||
|
||||
# Full reset (CAUTION: removes volumes)
|
||||
docker-compose down -v
|
||||
```
|
||||
|
||||
### View Logs
|
||||
|
||||
```bash
|
||||
# All services
|
||||
docker-compose logs -f
|
||||
|
||||
# Specific service
|
||||
docker-compose logs -f agents-ui
|
||||
docker-compose logs -f claude-code-backend
|
||||
|
||||
# Follow errors only
|
||||
docker-compose logs -f --tail=100 | grep -i error
|
||||
```
|
||||
|
||||
### Execute Commands in Container
|
||||
|
||||
```bash
|
||||
# Access Agents UI shell
|
||||
docker-compose exec agents-ui sh
|
||||
|
||||
# Access Claude Code shell
|
||||
docker-compose exec claude-code-backend bash
|
||||
|
||||
# Run Claude Code directly
|
||||
docker-compose exec claude-code-backend claude "your prompt here"
|
||||
```
|
||||
|
||||
### Backup and Restore
|
||||
|
||||
```bash
|
||||
# Backup volumes
|
||||
docker-compose exec claude-code-backend tar czf - -C /root .claude | gzip > claude-backup.tar.gz
|
||||
|
||||
# Backup workspace
|
||||
tar czf workspace-backup.tar.gz workspace/
|
||||
|
||||
# Restore
|
||||
tar xzf claude-backup.tar.gz -C workspace/
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Issue: Connection refused on port 3000
|
||||
|
||||
```bash
|
||||
# Check if service is running
|
||||
docker-compose ps
|
||||
|
||||
# Check service logs
|
||||
docker-compose logs agents-ui
|
||||
|
||||
# Restart service
|
||||
docker-compose restart agents-ui
|
||||
```
|
||||
|
||||
### Issue: ANTHROPIC_API_KEY not recognized
|
||||
|
||||
```bash
|
||||
# Verify .env file exists and has correct key
|
||||
cat .env | grep ANTHROPIC_API_KEY
|
||||
|
||||
# Pass key directly in docker-compose command
|
||||
ANTHROPIC_API_KEY=your-key docker-compose up -d
|
||||
```
|
||||
|
||||
### Issue: PostgreSQL connection fails
|
||||
|
||||
```bash
|
||||
# Check if postgres is ready
|
||||
docker-compose exec postgres pg_isready -U claude
|
||||
|
||||
# Check credentials in .env
|
||||
grep POSTGRES .env
|
||||
|
||||
# View postgres logs
|
||||
docker-compose logs postgres
|
||||
```
|
||||
|
||||
### Issue: Agents UI can't find Claude config
|
||||
|
||||
```bash
|
||||
# Verify mount
|
||||
docker-compose exec agents-ui ls -la /root/.claude/
|
||||
|
||||
# Check permissions
|
||||
docker-compose exec agents-ui stat /root/.claude
|
||||
|
||||
# Ensure volume is created
|
||||
docker volume ls | grep claude
|
||||
```
|
||||
|
||||
## Performance Tuning
|
||||
|
||||
### Increase Resource Limits
|
||||
|
||||
Edit docker-compose.yml:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
agents-ui:
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: '2'
|
||||
memory: 2G
|
||||
reservations:
|
||||
cpus: '1'
|
||||
memory: 1G
|
||||
```
|
||||
|
||||
### Enable Redis Caching
|
||||
|
||||
```bash
|
||||
# Uncomment Redis in docker-compose.yml
|
||||
# Set REDIS_HOST=redis in .env
|
||||
docker-compose up -d redis
|
||||
```
|
||||
|
||||
### Database Optimization
|
||||
|
||||
```bash
|
||||
# Increase PostgreSQL max connections
|
||||
docker-compose exec postgres psql -U claude -c "ALTER SYSTEM SET max_connections = 200;"
|
||||
docker-compose restart postgres
|
||||
```
|
||||
|
||||
## Security Hardening
|
||||
|
||||
### 1. Enable SSL/TLS
|
||||
|
||||
```bash
|
||||
# Generate self-signed certificate (for testing)
|
||||
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
|
||||
|
||||
# Or use Let's Encrypt with certbot
|
||||
mkdir -p certs
|
||||
# Place your cert.pem and key.pem in ./certs/
|
||||
```
|
||||
|
||||
Update docker-compose.yml to mount certs.
|
||||
|
||||
### 2. Restrict Network Access
|
||||
|
||||
```bash
|
||||
# Allow only specific IPs to Nginx
|
||||
# In nginx.conf, add to each location:
|
||||
allow 192.168.1.0/24;
|
||||
deny all;
|
||||
```
|
||||
|
||||
### 3. Regular Backups
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# backup.sh
|
||||
|
||||
BACKUP_DIR="/mnt/backup/claude-code-stack"
|
||||
mkdir -p $BACKUP_DIR
|
||||
|
||||
# Backup volumes
|
||||
docker run --rm \
|
||||
-v claude_config:/data \
|
||||
-v $BACKUP_DIR:/backup \
|
||||
alpine tar czf /backup/claude-config-$(date +%Y%m%d).tar.gz -C /data .
|
||||
|
||||
echo "Backup complete: $BACKUP_DIR"
|
||||
```
|
||||
|
||||
## Monitoring
|
||||
|
||||
### Health Checks
|
||||
|
||||
```bash
|
||||
# Manual health check
|
||||
curl http://localhost:3000/health
|
||||
|
||||
# Monitor with watch
|
||||
watch -n 5 'docker-compose ps && echo "---" && curl -s http://localhost:3000/health'
|
||||
```
|
||||
|
||||
### Logging and Metrics
|
||||
|
||||
```bash
|
||||
# View resource usage
|
||||
docker stats
|
||||
|
||||
# Monitor over time
|
||||
docker-compose up -d && \
|
||||
sleep 60 && \
|
||||
docker stats --no-stream
|
||||
```
|
||||
|
||||
## Updating and Maintenance
|
||||
|
||||
### Update Images
|
||||
|
||||
```bash
|
||||
# Pull latest images
|
||||
docker-compose pull
|
||||
|
||||
# Rebuild custom image
|
||||
docker-compose build --no-cache
|
||||
|
||||
# Restart services
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### Clear Disk Space
|
||||
|
||||
```bash
|
||||
# Remove unused images
|
||||
docker image prune -a
|
||||
|
||||
# Remove unused volumes
|
||||
docker volume prune
|
||||
|
||||
# Remove unused networks
|
||||
docker network prune
|
||||
```
|
||||
|
||||
## Support and Resources
|
||||
|
||||
- **Claude Code Agents UI**: https://github.com/Ngxba/claude-code-agents-ui
|
||||
- **Claude Code Docs**: https://docs.anthropic.com/en/docs/build-with-claude
|
||||
- **Docker Docs**: https://docs.docker.com/
|
||||
- **TrueNAS Documentation**: https://www.truenas.com/docs/
|
||||
|
||||
## Quick Reference Commands
|
||||
|
||||
```bash
|
||||
# Start stack
|
||||
docker-compose up -d
|
||||
|
||||
# Check status
|
||||
docker-compose ps
|
||||
|
||||
# View logs
|
||||
docker-compose logs -f
|
||||
|
||||
# Stop stack
|
||||
docker-compose down
|
||||
|
||||
# Execute command
|
||||
docker-compose exec agents-ui command
|
||||
|
||||
# Access shell
|
||||
docker-compose exec agents-ui sh
|
||||
|
||||
# Update
|
||||
docker-compose pull && docker-compose up -d
|
||||
|
||||
# Backup
|
||||
docker-compose exec claude-code-backend tar czf - -C /root .claude | gzip > backup.tar.gz
|
||||
|
||||
# Restore database
|
||||
psql -h localhost -U claude -d claude_agents < backup.sql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Last Updated**: 2026-04-04
|
||||
**Stack Version**: 1.0.0
|
||||
**Docker Compose Version**: 3.8+
|
||||
419
QUICKSTART.md
Normal file
419
QUICKSTART.md
Normal file
|
|
@ -0,0 +1,419 @@
|
|||
# Claude Code + Agents UI Stack - Quick Start Guide
|
||||
|
||||
## 📋 Prerequisites
|
||||
|
||||
- TrueNAS SCALE system running
|
||||
- Docker and Docker Compose installed on TrueNAS
|
||||
- Anthropic API Key (get from https://console.anthropic.com/)
|
||||
- SSH access to TrueNAS (for SSH deployment method)
|
||||
|
||||
## 🚀 Deployment Options
|
||||
|
||||
### Option 1: SSH Deployment (Easiest for TrueNAS)
|
||||
|
||||
This is the recommended method for deploying to TrueNAS.
|
||||
|
||||
#### Setup
|
||||
|
||||
```bash
|
||||
# 1. Make the deployment script executable
|
||||
chmod +x deploy-ssh.sh
|
||||
|
||||
# 2. Set your API key
|
||||
export ANTHROPIC_API_KEY="sk-ant-your-actual-key-here"
|
||||
|
||||
# 3. Deploy to your TrueNAS
|
||||
./deploy-ssh.sh 192.168.1.100 root tank
|
||||
|
||||
# Parameters:
|
||||
# 192.168.1.100 = Your TrueNAS IP address
|
||||
# root = SSH username (default: root)
|
||||
# tank = Pool name (default: tank)
|
||||
```
|
||||
|
||||
That's it! The script will:
|
||||
- ✓ Create the project directory
|
||||
- ✓ Upload Docker configuration
|
||||
- ✓ Configure environment variables
|
||||
- ✓ Start all services
|
||||
- ✓ Verify deployment
|
||||
|
||||
#### Access the UI
|
||||
|
||||
Once deployed, access the Agents UI at:
|
||||
```
|
||||
http://192.168.1.100:3000
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Option 2: MCP Deployment (For Advanced Users)
|
||||
|
||||
If you have the TrueNAS MCP server running at `mcp.wilddragon.net`:
|
||||
|
||||
#### Setup
|
||||
|
||||
```bash
|
||||
# 1. Install dependencies
|
||||
pip install httpx
|
||||
|
||||
# 2. Make the script executable
|
||||
chmod +x deploy-mcp.py
|
||||
|
||||
# 3. Deploy via MCP
|
||||
export ANTHROPIC_API_KEY="sk-ant-your-actual-key-here"
|
||||
python deploy-mcp.py --mcp-url https://mcp.wilddragon.net/mcp --pool tank
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Option 3: Manual Docker Compose Deployment
|
||||
|
||||
For complete control:
|
||||
|
||||
#### Step 1: SSH into TrueNAS
|
||||
|
||||
```bash
|
||||
ssh root@192.168.1.100
|
||||
```
|
||||
|
||||
#### Step 2: Create project directory
|
||||
|
||||
```bash
|
||||
mkdir -p /mnt/tank/docker/claude-code-stack
|
||||
cd /mnt/tank/docker/claude-code-stack
|
||||
```
|
||||
|
||||
#### Step 3: Copy docker-compose.yml
|
||||
|
||||
Create and edit the file:
|
||||
```bash
|
||||
cat > docker-compose.yml << 'EOF'
|
||||
# Paste the content from docker-compose.yml
|
||||
EOF
|
||||
```
|
||||
|
||||
#### Step 4: Configure environment
|
||||
|
||||
```bash
|
||||
cat > .env << 'EOF'
|
||||
ANTHROPIC_API_KEY=sk-ant-your-key-here
|
||||
POSTGRES_PASSWORD=secure-password
|
||||
NODE_ENV=production
|
||||
EOF
|
||||
```
|
||||
|
||||
#### Step 5: Start services
|
||||
|
||||
```bash
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
#### Step 6: Verify
|
||||
|
||||
```bash
|
||||
docker-compose ps
|
||||
curl http://localhost:3000
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Services Overview
|
||||
|
||||
### What Gets Deployed
|
||||
|
||||
| Service | Port | Purpose | Required |
|
||||
|---------|------|---------|----------|
|
||||
| **Agents UI** | 3000 | Web interface for agent management | ✓ Yes |
|
||||
| **Claude Code** | 5000 | Code execution backend | ✓ Yes |
|
||||
| **PostgreSQL** | 5432 | Data persistence | Optional |
|
||||
| **Redis** | 6379 | Caching & sessions | Optional |
|
||||
| **Nginx** | 80/443 | Reverse proxy | Optional |
|
||||
|
||||
---
|
||||
|
||||
## 🎮 Using the Stack
|
||||
|
||||
### Access the UI
|
||||
|
||||
```
|
||||
http://your-truenas-ip:3000
|
||||
```
|
||||
|
||||
### View Logs
|
||||
|
||||
```bash
|
||||
# SSH into TrueNAS
|
||||
ssh root@your-truenas-ip
|
||||
|
||||
# Navigate to project
|
||||
cd /mnt/tank/docker/claude-code-stack
|
||||
|
||||
# View logs
|
||||
docker-compose logs -f agents-ui
|
||||
docker-compose logs -f claude-code-backend
|
||||
```
|
||||
|
||||
### Run Claude Code Directly
|
||||
|
||||
```bash
|
||||
# Execute a prompt
|
||||
docker-compose exec claude-code-backend claude "What files are in the workspace?"
|
||||
|
||||
# Access the CLI
|
||||
docker-compose exec claude-code-backend bash
|
||||
```
|
||||
|
||||
### Stop Services
|
||||
|
||||
```bash
|
||||
docker-compose down
|
||||
```
|
||||
|
||||
### Restart Services
|
||||
|
||||
```bash
|
||||
docker-compose restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Configuration
|
||||
|
||||
### Environment Variables
|
||||
|
||||
Edit `.env` file to customize:
|
||||
|
||||
```bash
|
||||
# Your Anthropic API key (REQUIRED)
|
||||
ANTHROPIC_API_KEY=sk-ant-xxx
|
||||
|
||||
# Database password
|
||||
POSTGRES_PASSWORD=secure-password
|
||||
|
||||
# Node environment
|
||||
NODE_ENV=production
|
||||
|
||||
# Claude Code settings
|
||||
CLAUDE_MODEL=claude-opus-4-1
|
||||
RUN_CLAUDE_CODE=true
|
||||
```
|
||||
|
||||
### Port Changes
|
||||
|
||||
Want different ports? Edit `docker-compose.yml`:
|
||||
|
||||
```yaml
|
||||
ports:
|
||||
- "8000:3000" # Access UI at port 8000 instead
|
||||
```
|
||||
|
||||
Then restart:
|
||||
```bash
|
||||
docker-compose down && docker-compose up -d
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
### Issue: "Connection refused" on port 3000
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Check if service is running
|
||||
docker-compose ps
|
||||
|
||||
# View logs
|
||||
docker-compose logs agents-ui
|
||||
|
||||
# Restart
|
||||
docker-compose restart agents-ui
|
||||
|
||||
# Wait a few seconds for startup
|
||||
sleep 10
|
||||
curl http://localhost:3000
|
||||
```
|
||||
|
||||
### Issue: API key not recognized
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Verify .env file
|
||||
cat .env | grep ANTHROPIC_API_KEY
|
||||
|
||||
# Update if needed
|
||||
nano .env
|
||||
|
||||
# Restart services
|
||||
docker-compose restart
|
||||
```
|
||||
|
||||
### Issue: Database connection fails
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Check PostgreSQL
|
||||
docker-compose logs postgres
|
||||
|
||||
# Verify credentials in .env
|
||||
grep POSTGRES .env
|
||||
|
||||
# Restart database
|
||||
docker-compose restart postgres
|
||||
```
|
||||
|
||||
### Issue: Cannot SSH to TrueNAS
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
# Check IP address
|
||||
ping your-truenas-ip
|
||||
|
||||
# Test SSH connection
|
||||
ssh -v root@your-truenas-ip
|
||||
|
||||
# Check if SSH is enabled on TrueNAS
|
||||
# System Settings > Services > SSH > Start Automatically
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 Performance Tips
|
||||
|
||||
### Increase Memory Allocation
|
||||
|
||||
Edit `docker-compose.yml`:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
agents-ui:
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 2G
|
||||
reservations:
|
||||
memory: 1G
|
||||
```
|
||||
|
||||
### Enable Caching with Redis
|
||||
|
||||
Redis is included in the stack and automatically started.
|
||||
|
||||
### Database Optimization
|
||||
|
||||
```bash
|
||||
# Increase PostgreSQL connections
|
||||
docker-compose exec postgres psql -U claude -c "ALTER SYSTEM SET max_connections = 200;"
|
||||
docker-compose restart postgres
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Security Recommendations
|
||||
|
||||
### 1. Change Default Passwords
|
||||
|
||||
```bash
|
||||
# Edit .env
|
||||
nano .env
|
||||
|
||||
# Change:
|
||||
# POSTGRES_PASSWORD=changeMe123!
|
||||
# SESSION_SECRET=your-random-secret
|
||||
```
|
||||
|
||||
### 2. Enable SSL/TLS
|
||||
|
||||
Create self-signed certificate:
|
||||
```bash
|
||||
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
|
||||
```
|
||||
|
||||
Update `docker-compose.yml` to mount certs.
|
||||
|
||||
### 3. Restrict Network Access
|
||||
|
||||
In TrueNAS, configure firewall to allow only trusted IPs.
|
||||
|
||||
### 4. Regular Backups
|
||||
|
||||
```bash
|
||||
# Backup configuration
|
||||
docker-compose exec claude-code-backend tar czf - -C /root .claude | gzip > claude-backup.tar.gz
|
||||
|
||||
# Backup database
|
||||
docker-compose exec postgres pg_dump -U claude claude_agents > backup.sql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Next Steps
|
||||
|
||||
1. **Access the UI**: http://your-truenas-ip:3000
|
||||
2. **Configure API key**: Check that ANTHROPIC_API_KEY is set
|
||||
3. **Create your first agent**: Use the Agents UI to create and test agents
|
||||
4. **Set up workspace**: Mount your projects in `/workspace`
|
||||
5. **Configure SSH keys**: For git operations (optional)
|
||||
|
||||
---
|
||||
|
||||
## 📚 Resources
|
||||
|
||||
- **Claude Code Agents UI**: https://github.com/Ngxba/claude-code-agents-ui
|
||||
- **Claude Documentation**: https://docs.anthropic.com/
|
||||
- **Docker Compose Reference**: https://docs.docker.com/compose/compose-file/
|
||||
- **TrueNAS Documentation**: https://www.truenas.com/docs/
|
||||
|
||||
---
|
||||
|
||||
## 💡 Common Commands
|
||||
|
||||
```bash
|
||||
# View running services
|
||||
docker-compose ps
|
||||
|
||||
# Follow logs
|
||||
docker-compose logs -f
|
||||
|
||||
# Stop everything
|
||||
docker-compose down
|
||||
|
||||
# Restart everything
|
||||
docker-compose restart
|
||||
|
||||
# Execute command in container
|
||||
docker-compose exec agents-ui command
|
||||
|
||||
# Access shell in container
|
||||
docker-compose exec agents-ui sh
|
||||
|
||||
# Update and restart
|
||||
docker-compose pull && docker-compose up -d
|
||||
|
||||
# Clean up disk space
|
||||
docker system prune -a
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🆘 Getting Help
|
||||
|
||||
If you encounter issues:
|
||||
|
||||
1. **Check the logs**: `docker-compose logs -f`
|
||||
2. **Verify configuration**: `cat .env`
|
||||
3. **Check connectivity**: `docker-compose exec agents-ui ping -c 1 claude-code-backend`
|
||||
4. **Review the full guide**: See `DEPLOYMENT_GUIDE.md`
|
||||
|
||||
---
|
||||
|
||||
**Deployed successfully?** 🎉
|
||||
|
||||
Next, configure your agents:
|
||||
1. Open http://your-truenas-ip:3000
|
||||
2. Create a new agent
|
||||
3. Set up your workspace
|
||||
4. Start automating!
|
||||
|
||||
Happy coding! 🚀
|
||||
342
README.md
342
README.md
|
|
@ -1,3 +1,341 @@
|
|||
# claude-code-stack
|
||||
# Claude Code + Agents UI Stack - Complete Package
|
||||
|
||||
Docker stack combining Claude Code Agents UI with Claude Code runtime. Multi-service orchestration with PostgreSQL, Redis, and Nginx for TrueNAS SCALE deployment.
|
||||
## 📦 What's Included
|
||||
|
||||
This package contains everything needed to deploy a complete Claude Code + Agents UI Docker stack to your TrueNAS SCALE instance.
|
||||
|
||||
### Files Overview
|
||||
|
||||
```
|
||||
claude-code-stack/
|
||||
├── QUICKSTART.md # Start here!
|
||||
├── DEPLOYMENT_GUIDE.md # Comprehensive guide
|
||||
├── docker-compose.yml # Main Docker Compose configuration
|
||||
├── claude-agents-ui-Dockerfile # Custom Docker image combining UI + Claude Code
|
||||
├── nginx.conf # Reverse proxy configuration
|
||||
├── claude-code-stack.env # Environment variables template
|
||||
├── deploy-ssh.sh # Automated SSH deployment script (RECOMMENDED)
|
||||
├── deploy-mcp.py # MCP-based deployment script
|
||||
└── README.md # This file
|
||||
```
|
||||
|
||||
## 🚀 Quick Start (30 seconds)
|
||||
|
||||
```bash
|
||||
# 1. Set your API key
|
||||
export ANTHROPIC_API_KEY="sk-ant-your-actual-key-here"
|
||||
|
||||
# 2. Run the deployment script
|
||||
chmod +x deploy-ssh.sh
|
||||
./deploy-ssh.sh 192.168.1.100 root tank
|
||||
|
||||
# 3. Access the UI
|
||||
# Open: http://192.168.1.100:3000
|
||||
```
|
||||
|
||||
## 📋 What Each File Does
|
||||
|
||||
### QUICKSTART.md
|
||||
**Start here if you're in a hurry!**
|
||||
- 3 deployment methods
|
||||
- Quick setup instructions
|
||||
- Troubleshooting tips
|
||||
- Common commands
|
||||
|
||||
### DEPLOYMENT_GUIDE.md
|
||||
**Complete reference guide**
|
||||
- Detailed architecture
|
||||
- Step-by-step setup
|
||||
- Configuration options
|
||||
- Monitoring & maintenance
|
||||
- Security hardening
|
||||
- Performance tuning
|
||||
|
||||
### docker-compose.yml
|
||||
**Main orchestration file**
|
||||
Includes:
|
||||
- Claude Code Agents UI (Nuxt 3 frontend)
|
||||
- Claude Code Runtime (code execution)
|
||||
- PostgreSQL (data persistence)
|
||||
- Redis (caching)
|
||||
- Nginx (reverse proxy)
|
||||
|
||||
All services with:
|
||||
- Health checks
|
||||
- Volume management
|
||||
- Network configuration
|
||||
- Resource limits
|
||||
|
||||
### claude-agents-ui-Dockerfile
|
||||
**Optional: Combined image**
|
||||
Builds a single Docker image containing:
|
||||
- Agents UI (Nuxt 3)
|
||||
- Claude Code CLI
|
||||
- Required dependencies
|
||||
- Non-root user for security
|
||||
|
||||
Use this if you prefer building a custom image instead of using pre-built images.
|
||||
|
||||
### nginx.conf
|
||||
**Reverse proxy configuration**
|
||||
- Load balancing
|
||||
- SSL/TLS support
|
||||
- Rate limiting
|
||||
- Security headers
|
||||
- WebSocket support
|
||||
- Static file caching
|
||||
|
||||
### claude-code-stack.env
|
||||
**Environment variables template**
|
||||
Configure:
|
||||
- Anthropic API key (REQUIRED)
|
||||
- Database credentials
|
||||
- API ports and hosts
|
||||
- Security settings
|
||||
- Storage options
|
||||
- Agent configuration
|
||||
|
||||
### deploy-ssh.sh
|
||||
**Automated SSH deployment** ⭐ RECOMMENDED
|
||||
- One-command setup
|
||||
- Validates prerequisites
|
||||
- Tests SSH connection
|
||||
- Creates directories
|
||||
- Uploads files
|
||||
- Configures environment
|
||||
- Starts services
|
||||
- Verifies deployment
|
||||
- Sets up monitoring
|
||||
|
||||
### deploy-mcp.py
|
||||
**MCP-based deployment**
|
||||
For advanced users with MCP server running:
|
||||
- Deploys via MCP protocol
|
||||
- Async/await operation
|
||||
- Progress indicators
|
||||
- Error handling
|
||||
|
||||
## 🎯 Deployment Flowchart
|
||||
|
||||
```
|
||||
Start
|
||||
│
|
||||
├─→ Choose Method
|
||||
│ ├─→ SSH (recommended) → deploy-ssh.sh
|
||||
│ ├─→ MCP (advanced) → deploy-mcp.py
|
||||
│ └─→ Manual → Use docker-compose.yml directly
|
||||
│
|
||||
├─→ Prerequisites
|
||||
│ ├─→ API Key ✓
|
||||
│ ├─→ SSH access ✓
|
||||
│ └─→ Docker on TrueNAS ✓
|
||||
│
|
||||
├─→ Deploy Stack
|
||||
│ ├─→ Create directory
|
||||
│ ├─→ Upload files
|
||||
│ ├─→ Configure .env
|
||||
│ ├─→ Pull images
|
||||
│ └─→ Start services
|
||||
│
|
||||
├─→ Verify
|
||||
│ ├─→ Check service status
|
||||
│ ├─→ Test port 3000
|
||||
│ └─→ View logs
|
||||
│
|
||||
└─→ Access UI
|
||||
└─→ http://your-truenas-ip:3000
|
||||
```
|
||||
|
||||
## 🏗️ Architecture
|
||||
|
||||
```
|
||||
Your Computer
|
||||
│
|
||||
│ (SSH or MCP)
|
||||
▼
|
||||
TrueNAS SCALE
|
||||
│
|
||||
├─→ docker-compose
|
||||
│
|
||||
└─→ Services:
|
||||
├─→ Claude Code Agents UI (Port 3000)
|
||||
│ └─→ Web interface for agent management
|
||||
│
|
||||
├─→ Claude Code Backend (Port 5000)
|
||||
│ └─→ Code execution environment
|
||||
│
|
||||
├─→ PostgreSQL (Port 5432)
|
||||
│ └─→ Agent data persistence
|
||||
│
|
||||
├─→ Redis (Port 6379)
|
||||
│ └─→ Caching & sessions
|
||||
│
|
||||
└─→ Nginx (Port 80/443)
|
||||
└─→ Reverse proxy
|
||||
```
|
||||
|
||||
## 🔐 Security Features
|
||||
|
||||
- ✓ Non-root user execution
|
||||
- ✓ Health checks on all services
|
||||
- ✓ Security headers via Nginx
|
||||
- ✓ Rate limiting
|
||||
- ✓ SSL/TLS support (optional)
|
||||
- ✓ Environment variable isolation
|
||||
- ✓ Volume isolation
|
||||
- ✓ Network isolation
|
||||
|
||||
## 📊 Resource Requirements
|
||||
|
||||
### Minimum
|
||||
- RAM: 2GB allocated to Docker
|
||||
- CPU: 2 cores
|
||||
- Disk: 10GB free
|
||||
|
||||
### Recommended
|
||||
- RAM: 4GB allocated to Docker
|
||||
- CPU: 4 cores
|
||||
- Disk: 20GB free
|
||||
|
||||
### Optimal
|
||||
- RAM: 8GB+ allocated to Docker
|
||||
- CPU: 8+ cores
|
||||
- Disk: 50GB+ free
|
||||
|
||||
## 🚦 Deployment Status
|
||||
|
||||
After running `deploy-ssh.sh`, you'll see:
|
||||
|
||||
```
|
||||
[INFO] Checking prerequisites...
|
||||
[INFO] Testing SSH connection...
|
||||
[INFO] Creating project directory on TrueNAS...
|
||||
[INFO] Uploading Docker configuration files...
|
||||
[INFO] Configuring environment variables...
|
||||
[INFO] Deploying Docker stack...
|
||||
[INFO] Verifying deployment...
|
||||
========================================
|
||||
Claude Code Stack Deployed!
|
||||
========================================
|
||||
|
||||
Access the Agents UI at:
|
||||
http://192.168.1.100:3000
|
||||
```
|
||||
|
||||
## 📝 Next Steps
|
||||
|
||||
1. **Deploy**: Run `./deploy-ssh.sh your-truenas-ip`
|
||||
2. **Access**: Open http://your-truenas-ip:3000
|
||||
3. **Configure**: Set up API keys and workspace
|
||||
4. **Create**: Build your first agent
|
||||
5. **Test**: Execute and monitor agent tasks
|
||||
|
||||
## 🆘 Common Issues
|
||||
|
||||
### Q: SSH connection fails
|
||||
**A:** Check TrueNAS IP, SSH is enabled, and you have correct credentials.
|
||||
|
||||
### Q: Port 3000 not responding
|
||||
**A:** Wait 30 seconds for startup. Check logs: `docker-compose logs agents-ui`
|
||||
|
||||
### Q: API key not recognized
|
||||
**A:** Verify in .env file and restart: `docker-compose restart`
|
||||
|
||||
### Q: PostgreSQL connection fails
|
||||
**A:** Check credentials match in .env. Run: `docker-compose logs postgres`
|
||||
|
||||
See DEPLOYMENT_GUIDE.md for more troubleshooting.
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
- **QUICKSTART.md** - Start here for quick setup
|
||||
- **DEPLOYMENT_GUIDE.md** - Complete reference guide
|
||||
- **Claude Code Docs** - https://docs.anthropic.com/
|
||||
- **GitHub Repo** - https://github.com/Ngxba/claude-code-agents-ui
|
||||
|
||||
## 🎓 Learning Resources
|
||||
|
||||
### Getting Started with Claude Code
|
||||
```bash
|
||||
claude --help
|
||||
claude "What's in the current directory?"
|
||||
```
|
||||
|
||||
### Creating Agents
|
||||
Use the Agents UI at http://your-truenas-ip:3000 to:
|
||||
- Create agents
|
||||
- Configure models
|
||||
- Set instructions
|
||||
- Build workflows
|
||||
|
||||
### Using Agents
|
||||
```bash
|
||||
# View available agents
|
||||
claude list-agents
|
||||
|
||||
# Run an agent
|
||||
claude run agent-name "prompt"
|
||||
|
||||
# Interactive mode
|
||||
claude chat agent-name
|
||||
```
|
||||
|
||||
## 🔄 Update & Maintenance
|
||||
|
||||
### Pull Latest Images
|
||||
```bash
|
||||
docker-compose pull
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### View Logs
|
||||
```bash
|
||||
docker-compose logs -f [service]
|
||||
```
|
||||
|
||||
### Backup Data
|
||||
```bash
|
||||
docker-compose exec claude-code-backend tar czf - -C /root .claude | gzip > backup.tar.gz
|
||||
```
|
||||
|
||||
### Clean Up
|
||||
```bash
|
||||
docker system prune -a
|
||||
docker volume prune
|
||||
```
|
||||
|
||||
## 📞 Support
|
||||
|
||||
For issues or questions:
|
||||
|
||||
1. Check **DEPLOYMENT_GUIDE.md** troubleshooting section
|
||||
2. Review **QUICKSTART.md** for common solutions
|
||||
3. Check Docker logs: `docker-compose logs`
|
||||
4. Visit: https://github.com/Ngxba/claude-code-agents-ui/issues
|
||||
5. See: https://docs.anthropic.com/
|
||||
|
||||
## 📄 License
|
||||
|
||||
This deployment package is provided as-is.
|
||||
|
||||
- **Claude Code** - Use your Anthropic API key
|
||||
- **Agents UI** - MIT License (https://github.com/Ngxba/claude-code-agents-ui)
|
||||
- **Docker Components** - Various open-source licenses
|
||||
|
||||
## 🎉 Success!
|
||||
|
||||
Once deployed, you'll have:
|
||||
- ✓ Web interface for agent management
|
||||
- ✓ Claude Code execution environment
|
||||
- ✓ Persistent storage with PostgreSQL
|
||||
- ✓ Caching layer with Redis
|
||||
- ✓ Reverse proxy with Nginx
|
||||
- ✓ All integrated and running on TrueNAS
|
||||
|
||||
Happy coding! 🚀
|
||||
|
||||
---
|
||||
|
||||
**Version**: 1.0.0
|
||||
**Last Updated**: 2026-04-04
|
||||
**Compatibility**: TrueNAS SCALE, Docker Compose 3.8+
|
||||
|
|
|
|||
318
deploy-ssh.sh
Normal file
318
deploy-ssh.sh
Normal file
|
|
@ -0,0 +1,318 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Claude Code Stack Deployment Script for TrueNAS (SSH Method)
|
||||
# This script automates the deployment via SSH
|
||||
|
||||
set -e
|
||||
|
||||
# Color output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Configuration
|
||||
TRUENAS_IP="${1:-}"
|
||||
TRUENAS_USER="${2:-root}"
|
||||
POOL_NAME="${3:-tank}"
|
||||
PROJECT_DIR="/mnt/${POOL_NAME}/docker/claude-code-stack"
|
||||
DOCKER_COMPOSE_VERSION="3.8"
|
||||
|
||||
# Functions
|
||||
print_info() {
|
||||
echo -e "${GREEN}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
print_warn() {
|
||||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
check_prerequisites() {
|
||||
print_info "Checking prerequisites..."
|
||||
|
||||
# Check if ssh is available
|
||||
if ! command -v ssh &> /dev/null; then
|
||||
print_error "SSH client is not installed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if ANTHROPIC_API_KEY is set
|
||||
if [ -z "$ANTHROPIC_API_KEY" ]; then
|
||||
print_warn "ANTHROPIC_API_KEY environment variable not set"
|
||||
read -p "Enter your Anthropic API Key: " -r ANTHROPIC_API_KEY
|
||||
export ANTHROPIC_API_KEY
|
||||
fi
|
||||
|
||||
print_info "Prerequisites check passed"
|
||||
}
|
||||
|
||||
validate_input() {
|
||||
if [ -z "$TRUENAS_IP" ]; then
|
||||
print_error "Usage: $0 <TRUENAS_IP> [TRUENAS_USER] [POOL_NAME]"
|
||||
print_info "Example: $0 192.168.1.100 root tank"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
test_ssh_connection() {
|
||||
print_info "Testing SSH connection to $TRUENAS_USER@$TRUENAS_IP..."
|
||||
|
||||
if ssh -o ConnectTimeout=5 "$TRUENAS_USER@$TRUENAS_IP" "echo 'SSH connection successful'" > /dev/null 2>&1; then
|
||||
print_info "SSH connection successful"
|
||||
else
|
||||
print_error "Failed to connect to TrueNAS via SSH"
|
||||
print_info "Please verify:"
|
||||
print_info " - TRUENAS_IP is correct: $TRUENAS_IP"
|
||||
print_info " - SSH is enabled on TrueNAS"
|
||||
print_info " - You have the correct credentials"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
create_project_directory() {
|
||||
print_info "Creating project directory on TrueNAS..."
|
||||
|
||||
ssh "$TRUENAS_USER@$TRUENAS_IP" << 'EOF'
|
||||
POOL_NAME="$1"
|
||||
PROJECT_DIR="/mnt/${POOL_NAME}/docker/claude-code-stack"
|
||||
|
||||
# Create directory
|
||||
mkdir -p "$PROJECT_DIR"
|
||||
chmod 755 "$PROJECT_DIR"
|
||||
|
||||
# Verify
|
||||
if [ -d "$PROJECT_DIR" ]; then
|
||||
echo "Directory created: $PROJECT_DIR"
|
||||
else
|
||||
echo "Failed to create directory"
|
||||
exit 1
|
||||
fi
|
||||
EOF
|
||||
}
|
||||
|
||||
deploy_docker_files() {
|
||||
print_info "Uploading Docker configuration files..."
|
||||
|
||||
# Check if files exist locally
|
||||
local files=(
|
||||
"docker-compose.yml"
|
||||
"claude-code-stack.env"
|
||||
"nginx.conf"
|
||||
)
|
||||
|
||||
for file in "${files[@]}"; do
|
||||
if [ ! -f "./$file" ]; then
|
||||
print_warn "Local file not found: $file"
|
||||
print_info "Creating minimal $file on remote..."
|
||||
|
||||
case $file in
|
||||
"docker-compose.yml")
|
||||
# Create minimal compose file on remote
|
||||
ssh "$TRUENAS_USER@$TRUENAS_IP" "cat > ${PROJECT_DIR}/docker-compose.yml << 'COMPOSE_EOF'
|
||||
version: '3.8'
|
||||
services:
|
||||
agents-ui:
|
||||
image: node:20-alpine
|
||||
container_name: claude-agents-ui
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- \"3000:3000\"
|
||||
environment:
|
||||
ANTHROPIC_API_KEY: \${ANTHROPIC_API_KEY}
|
||||
volumes:
|
||||
- claude-config:/root/.claude
|
||||
- workspace:/workspace
|
||||
networks:
|
||||
- claude-stack
|
||||
|
||||
volumes:
|
||||
claude-config:
|
||||
driver: local
|
||||
workspace:
|
||||
driver: local
|
||||
|
||||
networks:
|
||||
claude-stack:
|
||||
driver: bridge
|
||||
COMPOSE_EOF"
|
||||
;;
|
||||
"claude-code-stack.env")
|
||||
ssh "$TRUENAS_USER@$TRUENAS_IP" "cat > ${PROJECT_DIR}/.env << 'ENV_EOF'
|
||||
ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
|
||||
POSTGRES_PASSWORD=changeMe123!
|
||||
SESSION_SECRET=$(openssl rand -base64 32)
|
||||
NODE_ENV=production
|
||||
ENV_EOF"
|
||||
;;
|
||||
"nginx.conf")
|
||||
ssh "$TRUENAS_USER@$TRUENAS_IP" "touch ${PROJECT_DIR}/nginx.conf"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
# Upload file
|
||||
scp "./$file" "$TRUENAS_USER@$TRUENAS_IP:$PROJECT_DIR/"
|
||||
print_info "Uploaded: $file"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
configure_environment() {
|
||||
print_info "Configuring environment variables..."
|
||||
|
||||
ssh "$TRUENAS_USER@$TRUENAS_IP" << EOF
|
||||
PROJECT_DIR="$PROJECT_DIR"
|
||||
|
||||
# Create .env file if it doesn't exist
|
||||
if [ ! -f "$PROJECT_DIR/.env" ]; then
|
||||
cat > "$PROJECT_DIR/.env" << 'ENV_EOF'
|
||||
ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY
|
||||
POSTGRES_PASSWORD=$(openssl rand -base64 16)
|
||||
SESSION_SECRET=$(openssl rand -base64 32)
|
||||
NODE_ENV=production
|
||||
CLAUDE_MODEL=claude-opus-4-1
|
||||
RUN_CLAUDE_CODE=true
|
||||
LOG_LEVEL=info
|
||||
ENV_EOF
|
||||
print_info "Created .env file"
|
||||
else
|
||||
# Update ANTHROPIC_API_KEY in existing .env
|
||||
sed -i.bak "s/ANTHROPIC_API_KEY=.*/ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY/" "$PROJECT_DIR/.env"
|
||||
print_info "Updated ANTHROPIC_API_KEY in .env"
|
||||
fi
|
||||
|
||||
chmod 600 "$PROJECT_DIR/.env"
|
||||
EOF
|
||||
}
|
||||
|
||||
deploy_stack() {
|
||||
print_info "Deploying Docker stack..."
|
||||
|
||||
ssh "$TRUENAS_USER@$TRUENAS_IP" << EOF
|
||||
cd $PROJECT_DIR
|
||||
|
||||
# Pull latest images
|
||||
echo "Pulling Docker images..."
|
||||
docker-compose pull
|
||||
|
||||
# Build (if Dockerfile present)
|
||||
if [ -f "Dockerfile" ]; then
|
||||
echo "Building custom image..."
|
||||
docker-compose build --no-cache
|
||||
fi
|
||||
|
||||
# Deploy
|
||||
echo "Starting services..."
|
||||
docker-compose up -d
|
||||
|
||||
# Wait for services to be ready
|
||||
echo "Waiting for services to be ready..."
|
||||
sleep 10
|
||||
|
||||
# Show status
|
||||
docker-compose ps
|
||||
EOF
|
||||
}
|
||||
|
||||
verify_deployment() {
|
||||
print_info "Verifying deployment..."
|
||||
|
||||
# Give services time to stabilize
|
||||
sleep 5
|
||||
|
||||
print_info "Checking service status..."
|
||||
ssh "$TRUENAS_USER@$TRUENAS_IP" "cd $PROJECT_DIR && docker-compose ps"
|
||||
|
||||
print_info "Testing Agents UI..."
|
||||
if curl -s -f "http://$TRUENAS_IP:3000" > /dev/null 2>&1; then
|
||||
print_info "✓ Agents UI is responsive"
|
||||
else
|
||||
print_warn "! Agents UI is not yet responding (may take a few moments)"
|
||||
fi
|
||||
}
|
||||
|
||||
setup_monitoring() {
|
||||
print_info "Setting up basic monitoring..."
|
||||
|
||||
ssh "$TRUENAS_USER@$TRUENAS_IP" << EOF
|
||||
PROJECT_DIR="$PROJECT_DIR"
|
||||
|
||||
# Create monitoring script
|
||||
cat > "$PROJECT_DIR/monitor.sh" << 'MONITOR_EOF'
|
||||
#!/bin/bash
|
||||
|
||||
while true; do
|
||||
clear
|
||||
echo "=== Claude Code Stack Status ==="
|
||||
echo "Time: \$(date)"
|
||||
echo ""
|
||||
docker-compose ps
|
||||
echo ""
|
||||
echo "Resource Usage:"
|
||||
docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
|
||||
echo ""
|
||||
echo "Press Ctrl+C to exit"
|
||||
sleep 10
|
||||
done
|
||||
MONITOR_EOF
|
||||
|
||||
chmod +x "$PROJECT_DIR/monitor.sh"
|
||||
print_info "Monitoring script created at: $PROJECT_DIR/monitor.sh"
|
||||
EOF
|
||||
}
|
||||
|
||||
print_summary() {
|
||||
echo ""
|
||||
echo -e "${GREEN}========================================${NC}"
|
||||
echo -e "${GREEN} Claude Code Stack Deployed!${NC}"
|
||||
echo -e "${GREEN}========================================${NC}"
|
||||
echo ""
|
||||
echo "Access the Agents UI at:"
|
||||
echo -e " ${YELLOW}http://$TRUENAS_IP:3000${NC}"
|
||||
echo ""
|
||||
echo "Project Directory on TrueNAS:"
|
||||
echo -e " ${YELLOW}$PROJECT_DIR${NC}"
|
||||
echo ""
|
||||
echo "Useful commands:"
|
||||
echo " SSH into TrueNAS:"
|
||||
echo -e " ${YELLOW}ssh $TRUENAS_USER@$TRUENAS_IP${NC}"
|
||||
echo ""
|
||||
echo " View logs:"
|
||||
echo -e " ${YELLOW}cd $PROJECT_DIR && docker-compose logs -f${NC}"
|
||||
echo ""
|
||||
echo " Stop services:"
|
||||
echo -e " ${YELLOW}cd $PROJECT_DIR && docker-compose down${NC}"
|
||||
echo ""
|
||||
echo " Monitor:"
|
||||
echo -e " ${YELLOW}cd $PROJECT_DIR && ./monitor.sh${NC}"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo " 1. Configure your API keys in the UI or .env"
|
||||
echo " 2. Set up agents via the web interface"
|
||||
echo " 3. Test with a simple agent execution"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# Main execution
|
||||
main() {
|
||||
echo -e "${GREEN}Claude Code Stack - TrueNAS Deployment${NC}"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
|
||||
validate_input
|
||||
check_prerequisites
|
||||
test_ssh_connection
|
||||
create_project_directory
|
||||
deploy_docker_files
|
||||
configure_environment
|
||||
deploy_stack
|
||||
verify_deployment
|
||||
setup_monitoring
|
||||
print_summary
|
||||
}
|
||||
|
||||
# Run main function
|
||||
main "$@"
|
||||
166
nginx.conf
Normal file
166
nginx.conf
Normal file
|
|
@ -0,0 +1,166 @@
|
|||
user nginx;
|
||||
worker_processes auto;
|
||||
error_log /var/log/nginx/error.log warn;
|
||||
pid /var/run/nginx.pid;
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
use epoll;
|
||||
}
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
access_log /var/log/nginx/access.log main;
|
||||
|
||||
sendfile on;
|
||||
tcp_nopush on;
|
||||
tcp_nodelay on;
|
||||
keepalive_timeout 65;
|
||||
types_hash_max_size 2048;
|
||||
client_max_body_size 100M;
|
||||
|
||||
# Gzip compression
|
||||
gzip on;
|
||||
gzip_vary on;
|
||||
gzip_min_length 1000;
|
||||
gzip_comp_level 6;
|
||||
gzip_types text/plain text/css text/xml text/javascript
|
||||
application/json application/javascript application/xml+rss;
|
||||
|
||||
# Upstream services
|
||||
upstream agents_ui {
|
||||
least_conn;
|
||||
server agents-ui:3000 max_fails=3 fail_timeout=30s;
|
||||
keepalive 32;
|
||||
}
|
||||
|
||||
upstream claude_api {
|
||||
least_conn;
|
||||
server claude-code-backend:5000 max_fails=3 fail_timeout=30s;
|
||||
keepalive 32;
|
||||
}
|
||||
|
||||
# Rate limiting zones
|
||||
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
|
||||
limit_req_zone $binary_remote_addr zone=api:10m rate=100r/s;
|
||||
limit_req_zone $binary_remote_addr zone=ws:10m rate=1000r/s;
|
||||
|
||||
# HTTP redirect to HTTPS (uncomment when SSL is configured)
|
||||
# server {
|
||||
# listen 80;
|
||||
# server_name _;
|
||||
# return 301 https://$host$request_uri;
|
||||
# }
|
||||
|
||||
# Main server block
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
|
||||
# SSL configuration (uncomment when certificates are available)
|
||||
# listen 443 ssl http2;
|
||||
# ssl_certificate /etc/nginx/certs/cert.pem;
|
||||
# ssl_key /etc/nginx/certs/key.pem;
|
||||
# ssl_protocols TLSv1.2 TLSv1.3;
|
||||
# ssl_ciphers HIGH:!aNULL:!MD5;
|
||||
# ssl_prefer_server_ciphers on;
|
||||
|
||||
# Security headers
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-XSS-Protection "1; mode=block" always;
|
||||
add_header Referrer-Policy "no-referrer-when-downgrade" always;
|
||||
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
|
||||
|
||||
# Root location
|
||||
location / {
|
||||
limit_req zone=general burst=20 nodelay;
|
||||
proxy_pass http://agents_ui;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
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;
|
||||
proxy_redirect off;
|
||||
|
||||
# Timeouts
|
||||
proxy_connect_timeout 60s;
|
||||
proxy_send_timeout 60s;
|
||||
proxy_read_timeout 60s;
|
||||
}
|
||||
|
||||
# WebSocket support for real-time agent updates
|
||||
location /ws {
|
||||
limit_req zone=ws burst=50 nodelay;
|
||||
proxy_pass http://agents_ui;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
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;
|
||||
|
||||
# WebSocket timeouts
|
||||
proxy_connect_timeout 7d;
|
||||
proxy_send_timeout 7d;
|
||||
proxy_read_timeout 7d;
|
||||
}
|
||||
|
||||
# Claude Code API backend
|
||||
location /api/claude {
|
||||
limit_req zone=api burst=50 nodelay;
|
||||
proxy_pass http://claude_api;
|
||||
proxy_http_version 1.1;
|
||||
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;
|
||||
proxy_redirect off;
|
||||
|
||||
# Allow larger payloads for code uploads
|
||||
client_max_body_size 500M;
|
||||
|
||||
# Timeouts for long-running operations
|
||||
proxy_connect_timeout 300s;
|
||||
proxy_send_timeout 300s;
|
||||
proxy_read_timeout 300s;
|
||||
}
|
||||
|
||||
# Health check endpoint
|
||||
location /health {
|
||||
access_log off;
|
||||
return 200 "healthy\n";
|
||||
add_header Content-Type text/plain;
|
||||
}
|
||||
|
||||
# Status endpoint (nginx metrics)
|
||||
location /nginx-status {
|
||||
stub_status on;
|
||||
access_log off;
|
||||
allow 127.0.0.1;
|
||||
deny all;
|
||||
}
|
||||
|
||||
# Static files caching
|
||||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
# Deny access to hidden files
|
||||
location ~ /\. {
|
||||
deny all;
|
||||
access_log off;
|
||||
log_not_found off;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue