Blame
|
1 | # AI Stack |
||||||
| 2 | ||||||||
| 3 | ← [[Home]] |
|||||||
| 4 | ||||||||
| 5 | Services running on PCT 109 (ai, 192.168.2.83). Privileged LXC, NVIDIA GPU passthrough. **Not a Docker Swarm node** — all services are standalone Docker Compose. |
|||||||
| 6 | ||||||||
| 7 | --- |
|||||||
| 8 | ||||||||
| 9 | ## Service URLs |
|||||||
| 10 | ||||||||
| 11 | | Service | URL | Port | |
|||||||
| 12 | |---------|-----|------| |
|||||||
| 13 | | LiteLLM | `litellm.carr-family.org` | 4000 (lan-only) | |
|||||||
| 14 | | n8n | `n8n.carr-family.org` | 5678 (lan-only) | |
|||||||
| 15 | | OpenClaw | `openclaw.carr-family.org` | 18789 (lan-only) | |
|||||||
| 16 | | Odysseus | `odysseus.carr-family.org` | 7000 (lan-only) | |
|||||||
| 17 | | Firecrawl API | — | `192.168.2.83:3002` | |
|||||||
| 18 | | Whisper | — | `192.168.2.83:8001` | |
|||||||
| 19 | | Proton Bridge SMTP | — | `192.168.2.83:1025` | |
|||||||
| 20 | | Proton Bridge IMAP | — | `192.168.2.83:1143` | |
|||||||
| 21 | ||||||||
| 22 | --- |
|||||||
| 23 | ||||||||
| 24 | ## Key Paths |
|||||||
| 25 | ||||||||
| 26 | | Path | Contents | |
|||||||
| 27 | |------|----------| |
|||||||
| 28 | | `/usr/local/bin/hermes` | Hermes agent binary | |
|||||||
| 29 | | `/root/.hermes/config.yaml` | Hermes config (model, MCP servers) | |
|||||||
| 30 | | `/opt/litellm/config.yaml` | LiteLLM model list + master key | |
|||||||
| 31 | | `/opt/litellm/docker-compose.yml` | LiteLLM + Postgres compose | |
|||||||
| 32 | | `/opt/ai-tools/docker-compose.yml` | n8n + Qdrant compose | |
|||||||
| 33 | | `/opt/n8n/data` | n8n workflows, credentials | |
|||||||
| 34 | | `/opt/qdrant/data` | Qdrant vector store | |
|||||||
| 35 | | `/opt/firecrawl/` | Firecrawl compose project | |
|||||||
| 36 | | `/root/.openclaw/openclaw.json` | OpenClaw config | |
|||||||
| 37 | | `/opt/odysseus/` | Odysseus compose project | |
|||||||
| 38 | | `/opt/whisper/` | Whisper compose project | |
|||||||
| 39 | | `/opt/proton-bridge/` | Proton Bridge compose project | |
|||||||
| 40 | | `/mnt/obsidian/` | Obsidian vault (read-write bind mount) | |
|||||||
| 41 | ||||||||
| 42 | --- |
|||||||
| 43 | ||||||||
| 44 | ## LiteLLM |
|||||||
| 45 | ||||||||
| 46 | OpenAI-compatible proxy at `litellm.carr-family.org/ui`. Compose: `/opt/litellm/`. |
|||||||
| 47 | ||||||||
| 48 | - **Master key:** `sk-homelab-litellm-admin` |
|||||||
| 49 | - **UI login:** admin / `sk-homelab-litellm-admin` |
|||||||
| 50 | - **DB:** postgres:16-alpine (host port 5433) |
|||||||
| 51 | - **Restart:** `pct exec 109 -- bash -c "cd /opt/litellm && docker compose up -d"` |
|||||||
| 52 | ||||||||
| 53 | **Models:** |
|||||||
| 54 | ||||||||
| 55 | | Model | Backend | |
|||||||
| 56 | |-------|---------| |
|||||||
| 57 | | `gpt-4o`, `gpt-4o-mini`, `gpt-4.1`, `gpt-4.1-mini` | OpenAI (direct) | |
|||||||
| 58 | | `llama3.1:8b`, `llama3.2:3b` | Ollama @ 192.168.2.40:11434 (CPU) | |
|||||||
| 59 | | `qwen3.6:27b`, `qwen3.5`, `ministral-3`, `llama3.2`, `llama3.1:8b-gpu` | Ollama @ 192.168.2.11:11434 (RTX 3060) | |
|||||||
| 60 | | `llava` | Ollama @ 192.168.2.11 — vision/OCR (paperless-gpt uses `llava:7b`) | |
|||||||
| 61 | | `nomic-embed-text` | Ollama @ 192.168.2.11 — embeddings for Qdrant | |
|||||||
| 62 | ||||||||
| 63 | --- |
|||||||
| 64 | ||||||||
| 65 | ## n8n |
|||||||
| 66 | ||||||||
| 67 | Workflow automation at `n8n.carr-family.org`. Compose: `/opt/ai-tools/` (n8n + Qdrant). |
|||||||
| 68 | ||||||||
| 69 | - **Data:** `/opt/n8n/data` |
|||||||
| 70 | - **Restart:** `pct exec 109 -- bash -c "cd /opt/ai-tools && docker compose up -d"` |
|||||||
| 71 | - **Vault mount:** `/mnt/obsidian:/mnt/obsidian:ro` inside container |
|||||||
| 72 | - **Code node:** `NODE_FUNCTION_ALLOW_BUILTIN=fs,path` — required to read vault files |
|||||||
| 73 | ||||||||
| 74 | **Credentials in n8n:** |
|||||||
| 75 | ||||||||
| 76 | | Name | Type | Value | |
|||||||
| 77 | |------|------|-------| |
|||||||
| 78 | | Qdrant Local | Qdrant API | `http://qdrant:6333` (no API key) | |
|||||||
| 79 | | Ollama .11 | Ollama | `http://192.168.2.11:11434` | |
|||||||
| 80 | | LiteLLM OpenAI | OpenAI | Key: `sk-homelab-litellm-admin`, Base: `http://192.168.2.83:4000` | |
|||||||
| 81 | ||||||||
| 82 | **Claude Code MCP:** `n8n-mcp` server in `~/.claude/mcp.json` on Proxmox host. URL: `https://n8n.carr-family.org/mcp-server/http`. Reload by restarting Claude Code. |
|||||||
| 83 | ||||||||
| 84 | **Key Workflows:** |
|||||||
| 85 | - *Obsidian Vault — Ingest to Qdrant* — reads all `.md` from vault, chunks + embeds into Qdrant. Run manually to re-index. |
|||||||
| 86 | - *Obsidian Vault — Chat* — chat UI backed by Qdrant RAG + gpt-4o via LiteLLM. |
|||||||
| 87 | ||||||||
| 88 | --- |
|||||||
| 89 | ||||||||
| 90 | ## Qdrant |
|||||||
| 91 | ||||||||
| 92 | Vector store. Part of `/opt/ai-tools/docker-compose.yml`. |
|||||||
| 93 | ||||||||
| 94 | - **Ports:** 6333 (HTTP/REST), 6334 (gRPC) |
|||||||
| 95 | - **Data:** `/opt/qdrant/data` |
|||||||
| 96 | - **Collection:** `obsidian_vault` (vector size: 192, distance: Cosine, model: `nomic-embed-text`) |
|||||||
| 97 | - **Check:** `curl http://192.168.2.83:6333/collections/obsidian_vault` |
|||||||
| 98 | ||||||||
| 99 | --- |
|||||||
| 100 | ||||||||
| 101 | ## Hermes Agent |
|||||||
| 102 | ||||||||
| 103 | AI agent with MCP access to the Obsidian vault. |
|||||||
| 104 | ||||||||
| 105 | - **Binary:** `/usr/local/bin/hermes` |
|||||||
| 106 | - **Default model:** `gpt-4o` via LiteLLM |
|||||||
| 107 | - **MCP server:** `obsidian-vault` — `mcp-server-filesystem /mnt/obsidian` (read/write/search) |
|||||||
| 108 | - **Manage MCP:** `hermes mcp ls/add/remove` |
|||||||
| 109 | - **Config:** `/root/.hermes/config.yaml`, `/root/.hermes/.env` |
|||||||
| 110 | ||||||||
| 111 | --- |
|||||||
| 112 | ||||||||
| 113 | ## OpenClaw |
|||||||
| 114 | ||||||||
| 115 | Claude AI desktop client. Version `2026.5.27`. |
|||||||
| 116 | ||||||||
| 117 | - **UI:** `openclaw.carr-family.org` (lan-only) |
|||||||
| 118 | - **Gateway port:** 18789, systemd service: `openclaw-gateway.service` |
|||||||
| 119 | - **Restart:** `openclaw daemon restart` |
|||||||
| 120 | - **Config:** `/root/.openclaw/openclaw.json` |
|||||||
| 121 | ||||||||
| 122 | **Model Providers:** |
|||||||
| 123 | ||||||||
| 124 | | Provider | Backend | Models | |
|||||||
| 125 | |----------|---------|--------| |
|||||||
| 126 | | `openai` | OpenAI API (direct) | gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini | |
|||||||
| 127 | | `ollama-11` | Ollama @ 192.168.2.11 (RTX 3060) | qwen3.6:27b, qwen3.5, ministral-3, llama3.2, llama3.1:8b, llava:7b | |
|||||||
| 128 | | `ollama-40` | Ollama @ 192.168.2.40 (CPU) | llama3.1:8b, llama3.2:3b | |
|||||||
| 129 | ||||||||
| 130 | **Cron Jobs:** |
|||||||
| 131 | ||||||||
| 132 | | Job | Schedule | Model | Discord Channel | |
|||||||
| 133 | |-----|----------|-------|-----------------| |
|||||||
| 134 | | `homelab-self-heal` | every 15 min | `openai/gpt-4o-mini` | `1509897448645201981` | |
|||||||
| 135 | | `archibus-daily-digest` | 08:00 Mon–Fri | `ollama-11/qwen3.6:27b` | `1491754165335101460` | |
|||||||
| 136 | ||||||||
| 137 | --- |
|||||||
| 138 | ||||||||
| 139 | ## Odysseus |
|||||||
| 140 | ||||||||
| 141 | Self-hosted AI workspace at `odysseus.carr-family.org`. Port 7000. |
|||||||
| 142 | ||||||||
| 143 | - **Compose:** `/opt/odysseus/docker-compose.yml` |
|||||||
| 144 | - **Data:** `/opt/odysseus/data/` (SQLite, uploads, ChromaDB) |
|||||||
| 145 | - **Bundled:** ChromaDB (127.0.0.1:8100), SearXNG (127.0.0.1:8080), ntfy (127.0.0.1:8091) |
|||||||
| 146 | - **LLM:** via LiteLLM proxy (`http://host.docker.internal:4000/v1`) |
|||||||
| 147 | - **Restart:** `pct exec 109 -- bash -c "cd /opt/odysseus && docker compose restart"` |
|||||||
| 148 | - **Update:** `pct exec 109 -- bash -c "cd /opt/odysseus && git pull && docker compose up -d --build"` |
|||||||
| 149 | ||||||||
| 150 | --- |
|||||||
| 151 | ||||||||
| 152 | ## Firecrawl |
|||||||
| 153 | ||||||||
| 154 | Web scraping / crawling API. |
|||||||
| 155 | ||||||||
| 156 | - **API:** `http://192.168.2.83:3002` |
|||||||
| 157 | - **API key:** `fc-1d4542a7babd39e33b04ce858af45295` |
|||||||
| 158 | - **Compose:** `/opt/firecrawl/` |
|||||||
| 159 | - **Restart:** `pct exec 109 -- bash -c "cd /opt/firecrawl && docker compose up -d"` |
|||||||
| 160 | ||||||||
| 161 | --- |
|||||||
| 162 | ||||||||
| 163 | ## Whisper Transcription |
|||||||
| 164 | ||||||||
| 165 | `faster-whisper-server` — OpenAI-compatible `/v1/audio/transcriptions`. Used by the Audio Recorder. |
|||||||
| 166 | ||||||||
| 167 | - **Port:** 8001 (host-mode) |
|||||||
| 168 | - **Model:** `base` (cached at `/tank/appdata/whisper/models/`) |
|||||||
| 169 | - **Compose:** `/opt/whisper/docker-compose.yml` |
|||||||
| 170 | - **Restart:** `pct exec 109 -- bash -c "cd /opt/whisper && docker compose restart"` |
|||||||
| 171 | ||||||||
| 172 | --- |
|||||||
| 173 | ||||||||
| 174 | ## Proton Bridge (SMTP/IMAP Relay) |
|||||||
| 175 | ||||||||
| 176 | Headless Proton Bridge for outbound email from gcjobs-filler, Calibre-Web, etc. |
|||||||
| 177 | ||||||||
| 178 | - **SMTP:** `192.168.2.83:1025` (STARTTLS) |
|||||||
| 179 | - **IMAP:** `192.168.2.83:1143` (STARTTLS) |
|||||||
| 180 | ||||||||
| 181 | - **Compose:** `/opt/proton-bridge/docker-compose.yml` |
|||||||
| 182 | - **Restart:** `pct exec 109 -- bash -c "rm -f /opt/proton-bridge/data/.cache/protonmail/bridge-v3/bridge-v3.lock && cd /opt/proton-bridge && docker compose restart"` |
|||||||
