503 lines
13 KiB
Markdown
503 lines
13 KiB
Markdown
---
|
|
title: Ollama with agent
|
|
description: The smart home reference
|
|
published: true
|
|
date: 2026-02-18T22:14:41.533Z
|
|
tags:
|
|
editor: markdown
|
|
dateCreated: 2026-02-18T22:14:41.533Z
|
|
---
|
|
|
|
# AI Automation Stack - Ollama + n8n + Open WebUI
|
|
|
|
## Overview
|
|
|
|
This stack provides a complete self-hosted AI automation solution for homelab infrastructure management, documentation generation, and intelligent monitoring. The system consists of four core components that work together to provide AI-powered workflows and knowledge management.
|
|
|
|
## Architecture
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────┐
|
|
│ AI Automation Stack │
|
|
│ │
|
|
│ Open WebUI ────────┐ │
|
|
│ (Chat Interface) │ │
|
|
│ │ │ │
|
|
│ ▼ ▼ │
|
|
│ Ollama ◄──── Qdrant │
|
|
│ (LLM Runtime) (Vector DB) │
|
|
│ ▲ │
|
|
│ │ │
|
|
│ n8n │
|
|
│ (Workflow Engine) │
|
|
│ │ │
|
|
│ ▼ │
|
|
│ Forgejo │ Wiki.js │ Monitoring │
|
|
└─────────────────────────────────────────────────┘
|
|
```
|
|
|
|
## Components
|
|
|
|
### Ollama
|
|
- **Purpose**: Local LLM runtime engine
|
|
- **Port**: 11434
|
|
- **Resource Usage**: 4-6GB RAM (depending on model)
|
|
- **Recommended Models**:
|
|
- `qwen2.5-coder:7b` - Code analysis and documentation
|
|
- `llama3.2:3b` - General queries and chat
|
|
- `phi3:mini` - Lightweight alternative
|
|
|
|
### Open WebUI
|
|
- **Purpose**: User-friendly chat interface with built-in RAG (Retrieval Augmented Generation)
|
|
- **Port**: 3000
|
|
- **Features**:
|
|
- Document ingestion from Wiki.js
|
|
- Conversational interface for querying documentation
|
|
- RAG pipeline for context-aware responses
|
|
- Multi-model support
|
|
- **Access**: `http://your-server-ip:3000`
|
|
|
|
### Qdrant
|
|
- **Purpose**: Vector database for semantic search and RAG
|
|
- **Ports**: 6333 (HTTP), 6334 (gRPC)
|
|
- **Resource Usage**: ~1GB RAM
|
|
- **Function**: Stores embeddings of your documentation, code, and markdown files
|
|
|
|
### n8n
|
|
- **Purpose**: Workflow automation and orchestration
|
|
- **Port**: 5678
|
|
- **Default Credentials**:
|
|
- Username: `admin`
|
|
- Password: `change-this-password` (⚠️ **Change this immediately**)
|
|
- **Access**: `http://your-server-ip:5678`
|
|
|
|
## Installation
|
|
|
|
### Prerequisites
|
|
- Docker and Docker Compose installed
|
|
- 16GB RAM minimum (8GB available for the stack)
|
|
- 50GB disk space for models and data
|
|
|
|
### Deployment Steps
|
|
|
|
1. **Create directory structure**:
|
|
```bash
|
|
mkdir -p ~/ai-stack/{n8n/workflows}
|
|
cd ~/ai-stack
|
|
```
|
|
|
|
2. **Download the compose file**:
|
|
```bash
|
|
# Place the ai-stack-compose.yml in this directory
|
|
wget [your-internal-url]/ai-stack-compose.yml
|
|
```
|
|
|
|
3. **Configure environment variables**:
|
|
```bash
|
|
# Edit the compose file and change:
|
|
# - WEBUI_SECRET_KEY
|
|
# - N8N_BASIC_AUTH_PASSWORD
|
|
# - WEBHOOK_URL (use your server's IP)
|
|
# - GENERIC_TIMEZONE
|
|
nano ai-stack-compose.yml
|
|
```
|
|
|
|
4. **Start the stack**:
|
|
```bash
|
|
docker-compose -f ai-stack-compose.yml up -d
|
|
```
|
|
|
|
5. **Pull Ollama models**:
|
|
```bash
|
|
docker exec -it ollama ollama pull qwen2.5-coder:7b
|
|
docker exec -it ollama ollama pull llama3.2:3b
|
|
```
|
|
|
|
6. **Verify services**:
|
|
```bash
|
|
docker-compose -f ai-stack-compose.yml ps
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### Open WebUI Setup
|
|
|
|
1. Navigate to `http://your-server-ip:3000`
|
|
2. Create your admin account (first user becomes admin)
|
|
3. Go to **Settings → Connections** and verify Ollama connection
|
|
4. Configure Qdrant:
|
|
- Host: `qdrant`
|
|
- Port: `6333`
|
|
|
|
### Setting Up RAG for Wiki.js
|
|
|
|
1. In Open WebUI, go to **Workspace → Knowledge**
|
|
2. Create a new collection: "Homelab Documentation"
|
|
3. Add sources:
|
|
- **URL Crawl**: Enter your Wiki.js base URL
|
|
- **File Upload**: Upload markdown files from repositories
|
|
4. Process and index the documents
|
|
|
|
### n8n Initial Configuration
|
|
|
|
1. Navigate to `http://your-server-ip:5678`
|
|
2. Log in with credentials from docker-compose file
|
|
3. Import starter workflows from `/n8n/workflows/` directory
|
|
|
|
## Use Cases
|
|
|
|
### 1. Automated Documentation Generation
|
|
|
|
**Workflow**: Forgejo webhook → n8n → Ollama → Wiki.js
|
|
|
|
When code is pushed to Forgejo:
|
|
1. n8n receives webhook from Forgejo
|
|
2. Extracts changed files and repo context
|
|
3. Sends to Ollama with prompt: "Generate documentation for this code"
|
|
4. Posts generated docs to Wiki.js via API
|
|
|
|
**Example n8n Workflow**:
|
|
```
|
|
Webhook Trigger
|
|
→ HTTP Request (Forgejo API - get file contents)
|
|
→ Ollama LLM Node (generate docs)
|
|
→ HTTP Request (Wiki.js API - create/update page)
|
|
→ Send notification (completion)
|
|
```
|
|
|
|
### 2. Docker-Compose Standardization
|
|
|
|
**Workflow**: Repository scan → compliance check → issue creation
|
|
|
|
1. n8n runs on schedule (daily/weekly)
|
|
2. Queries Forgejo API for all repositories
|
|
3. Scans for `docker-compose.yml` files
|
|
4. Compares against template standards stored in Qdrant
|
|
5. Generates compliance report with Ollama
|
|
6. Creates Forgejo issues for non-compliant repos
|
|
|
|
### 3. Intelligent Alert Processing
|
|
|
|
**Workflow**: Monitoring alert → AI analysis → smart routing
|
|
|
|
1. Beszel/Uptime Kuma sends webhook to n8n
|
|
2. n8n queries historical data and context
|
|
3. Ollama analyzes:
|
|
- Is this expected? (scheduled backup, known maintenance)
|
|
- Severity level
|
|
- Recommended action
|
|
4. Routes appropriately:
|
|
- Critical: Immediate notification (Telegram/email)
|
|
- Warning: Log and monitor
|
|
- Info: Suppress (expected behavior)
|
|
|
|
### 4. Email Monitoring & Triage
|
|
|
|
**Workflow**: IMAP polling → AI classification → action routing
|
|
|
|
1. n8n polls email inbox every 5 minutes
|
|
2. Filters for keywords: "alert", "critical", "down", "failed"
|
|
3. Ollama classifies urgency and determines if actionable
|
|
4. Routes based on classification:
|
|
- Urgent: Forward to you immediately
|
|
- Informational: Daily digest
|
|
- Spam: Archive
|
|
|
|
## Common Workflows
|
|
|
|
### Example: Repository Documentation Generator
|
|
|
|
```javascript
|
|
// n8n workflow nodes:
|
|
|
|
1. Schedule Trigger (daily at 2 AM)
|
|
↓
|
|
2. HTTP Request - Forgejo API
|
|
URL: http://forgejo:3000/api/v1/repos/search
|
|
Method: GET
|
|
↓
|
|
3. Loop Over Items (each repo)
|
|
↓
|
|
4. HTTP Request - Get repo files
|
|
URL: {{$node["Forgejo API"].json["clone_url"]}}/contents
|
|
↓
|
|
5. Filter - Find docker-compose.yml and README.md
|
|
↓
|
|
6. Ollama Node
|
|
Model: qwen2.5-coder:7b
|
|
Prompt: "Analyze this docker-compose file and generate comprehensive
|
|
documentation including: purpose, services, ports, volumes,
|
|
environment variables, and setup instructions."
|
|
↓
|
|
7. HTTP Request - Wiki.js API
|
|
URL: http://wikijs:3000/graphql
|
|
Method: POST
|
|
Body: {mutation: createPage(...)}
|
|
↓
|
|
8. Send Notification
|
|
Service: Telegram/Email
|
|
Message: "Documentation updated for {{repo_name}}"
|
|
```
|
|
|
|
### Example: Alert Intelligence Workflow
|
|
|
|
```javascript
|
|
// n8n workflow nodes:
|
|
|
|
1. Webhook Trigger
|
|
Path: /webhook/monitoring-alert
|
|
↓
|
|
2. Function Node - Parse Alert Data
|
|
JavaScript: Extract service, metric, value, timestamp
|
|
↓
|
|
3. HTTP Request - Query Historical Data
|
|
URL: http://beszel:8090/api/metrics/history
|
|
↓
|
|
4. Ollama Node
|
|
Model: llama3.2:3b
|
|
Context: Your knowledge base in Qdrant
|
|
Prompt: "Alert: {{alert_message}}
|
|
Historical context: {{historical_data}}
|
|
Is this expected behavior?
|
|
What's the severity?
|
|
What action should be taken?"
|
|
↓
|
|
5. Switch Node - Route by Severity
|
|
Conditions:
|
|
- Critical: Route to immediate notification
|
|
- Warning: Route to monitoring channel
|
|
- Info: Route to log only
|
|
↓
|
|
6a. Send Telegram (Critical path)
|
|
6b. Post to Slack (Warning path)
|
|
6c. Write to Log (Info path)
|
|
```
|
|
|
|
## Maintenance
|
|
|
|
### Model Management
|
|
|
|
```bash
|
|
# List installed models
|
|
docker exec -it ollama ollama list
|
|
|
|
# Update a model
|
|
docker exec -it ollama ollama pull qwen2.5-coder:7b
|
|
|
|
# Remove unused models
|
|
docker exec -it ollama ollama rm old-model:tag
|
|
```
|
|
|
|
### Backup Important Data
|
|
|
|
```bash
|
|
# Backup Qdrant vector database
|
|
docker-compose -f ai-stack-compose.yml stop qdrant
|
|
tar -czf qdrant-backup-$(date +%Y%m%d).tar.gz ./qdrant_data/
|
|
docker-compose -f ai-stack-compose.yml start qdrant
|
|
|
|
# Backup n8n workflows (automatic to ./n8n/workflows)
|
|
tar -czf n8n-backup-$(date +%Y%m%d).tar.gz ./n8n_data/
|
|
|
|
# Backup Open WebUI data
|
|
tar -czf openwebui-backup-$(date +%Y%m%d).tar.gz ./open_webui_data/
|
|
```
|
|
|
|
### Log Monitoring
|
|
|
|
```bash
|
|
# View all stack logs
|
|
docker-compose -f ai-stack-compose.yml logs -f
|
|
|
|
# View specific service
|
|
docker logs -f ollama
|
|
docker logs -f n8n
|
|
docker logs -f open-webui
|
|
```
|
|
|
|
### Resource Monitoring
|
|
|
|
```bash
|
|
# Check resource usage
|
|
docker stats
|
|
|
|
# Expected usage:
|
|
# - ollama: 4-6GB RAM (with model loaded)
|
|
# - open-webui: ~500MB RAM
|
|
# - qdrant: ~1GB RAM
|
|
# - n8n: ~200MB RAM
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Ollama Not Responding
|
|
|
|
```bash
|
|
# Check if Ollama is running
|
|
docker logs ollama
|
|
|
|
# Restart Ollama
|
|
docker restart ollama
|
|
|
|
# Test Ollama API
|
|
curl http://localhost:11434/api/tags
|
|
```
|
|
|
|
### Open WebUI Can't Connect to Ollama
|
|
|
|
1. Check network connectivity:
|
|
```bash
|
|
docker exec -it open-webui ping ollama
|
|
```
|
|
|
|
2. Verify Ollama URL in Open WebUI settings
|
|
3. Restart both containers:
|
|
```bash
|
|
docker restart ollama open-webui
|
|
```
|
|
|
|
### n8n Workflows Failing
|
|
|
|
1. Check n8n logs:
|
|
```bash
|
|
docker logs n8n
|
|
```
|
|
|
|
2. Verify webhook URLs are accessible
|
|
3. Test Ollama connection from n8n:
|
|
- Create test workflow
|
|
- Add Ollama node
|
|
- Run execution
|
|
|
|
### Qdrant Connection Issues
|
|
|
|
```bash
|
|
# Check Qdrant health
|
|
curl http://localhost:6333/health
|
|
|
|
# View Qdrant logs
|
|
docker logs qdrant
|
|
|
|
# Restart if needed
|
|
docker restart qdrant
|
|
```
|
|
|
|
## Performance Optimization
|
|
|
|
### Model Selection by Use Case
|
|
|
|
- **Quick queries, chat**: `llama3.2:3b` or `phi3:mini` (fastest)
|
|
- **Code analysis**: `qwen2.5-coder:7b` or `deepseek-coder:6.7b`
|
|
- **Complex reasoning**: `mistral:7b` or `llama3.1:8b`
|
|
|
|
### n8n Workflow Optimization
|
|
|
|
- Use **Wait** nodes to batch operations
|
|
- Enable **Execute Once** for loops to reduce memory
|
|
- Store large data in temporary files instead of node output
|
|
- Use **Split In Batches** for processing large datasets
|
|
|
|
### Qdrant Performance
|
|
|
|
- Default settings are optimized for homelab use
|
|
- Increase `collection_shards` if indexing >100,000 documents
|
|
- Enable quantization for large collections
|
|
|
|
## Security Considerations
|
|
|
|
### Change Default Credentials
|
|
|
|
```bash
|
|
# Generate secure password
|
|
openssl rand -base64 32
|
|
|
|
# Update in docker-compose.yml:
|
|
# - WEBUI_SECRET_KEY
|
|
# - N8N_BASIC_AUTH_PASSWORD
|
|
```
|
|
|
|
### Network Isolation
|
|
|
|
Consider using a reverse proxy (Traefik, Nginx Proxy Manager) with authentication:
|
|
- Limit external access to Open WebUI only
|
|
- Keep n8n, Ollama, Qdrant on internal network
|
|
- Use VPN for remote access
|
|
|
|
### API Security
|
|
|
|
- Use strong API tokens for Wiki.js and Forgejo integrations
|
|
- Rotate credentials periodically
|
|
- Audit n8n workflow permissions
|
|
|
|
## Integration Points
|
|
|
|
### Connecting to Existing Services
|
|
|
|
**Uptime Kuma**:
|
|
- Configure webhook alerts → n8n webhook URL
|
|
- Path: `http://your-server-ip:5678/webhook/uptime-kuma`
|
|
|
|
**Beszel**:
|
|
- Use Shoutrrr webhook format
|
|
- URL: `http://your-server-ip:5678/webhook/beszel`
|
|
|
|
**Forgejo**:
|
|
- Repository webhooks for push events
|
|
- URL: `http://your-server-ip:5678/webhook/forgejo-push`
|
|
- Enable in repo settings → Webhooks
|
|
|
|
**Wiki.js**:
|
|
- GraphQL API endpoint: `http://wikijs:3000/graphql`
|
|
- Create API key in Wiki.js admin panel
|
|
- Store in n8n credentials
|
|
|
|
## Advanced Features
|
|
|
|
### Creating Custom n8n Nodes
|
|
|
|
For frequently used Ollama prompts, create custom nodes:
|
|
|
|
1. Go to n8n → Settings → Community Nodes
|
|
2. Install `n8n-nodes-ollama-advanced` if available
|
|
3. Or create Function nodes with reusable code
|
|
|
|
### Training Custom Models
|
|
|
|
While Ollama doesn't support fine-tuning directly, you can:
|
|
1. Use RAG with your specific documentation
|
|
2. Create detailed system prompts in n8n
|
|
3. Store organization-specific context in Qdrant
|
|
|
|
### Multi-Agent Workflows
|
|
|
|
Chain multiple Ollama calls for complex tasks:
|
|
```
|
|
Planning Agent → Execution Agent → Review Agent → Output
|
|
```
|
|
|
|
Example: Code refactoring
|
|
1. Planning: Analyze code and create refactoring plan
|
|
2. Execution: Generate refactored code
|
|
3. Review: Check for errors and improvements
|
|
4. Output: Create pull request with changes
|
|
|
|
## Resources
|
|
|
|
- **Ollama Documentation**: https://ollama.ai/docs
|
|
- **Open WebUI Docs**: https://docs.openwebui.com
|
|
- **n8n Documentation**: https://docs.n8n.io
|
|
- **Qdrant Docs**: https://qdrant.tech/documentation
|
|
|
|
## Support
|
|
|
|
For issues or questions:
|
|
1. Check container logs first
|
|
2. Review this documentation
|
|
3. Search n8n community forums
|
|
4. Check Ollama Discord/GitHub issues
|
|
|
|
---
|
|
|
|
**Last Updated**: {{current_date}}
|
|
**Maintained By**: Homelab Admin
|
|
**Status**: Production
|