infra: deploy Open WebUI on hf-pdocker-01 with Ollama + Claude backends
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,8 @@ This repository manages a **homelab infrastructure** with self-hosted services r
|
||||
hf-pdocker-01 (Manager, 23GB RAM, i7-7700T, NVMe, HD 630 GPU) -- RESTORED (2026-03-08, hardware repaired)
|
||||
├── [COMPOSE] Frigate NVR (:5000) -- OpenVINO GPU detector, 13 cameras active
|
||||
├── [COMPOSE] Frigate-Notify v2 (:5199) -- MQTT->AI->Matrix notifications
|
||||
├── [COMPOSE] clip-service (:5200) -- CLIP embeddings (ViT-L-14, CPU)
|
||||
├── [COMPOSE] Open WebUI (:3010) -- AI chat UI (Ollama + Anthropic backends)
|
||||
├── [COMPOSE] Home Assistant (:8123)
|
||||
├── [COMPOSE] ESPHome (:6052)
|
||||
├── [COMPOSE] Mosquitto (:1883, :8883)
|
||||
@@ -35,12 +37,13 @@ hf-pdocker-01 (Manager, 23GB RAM, i7-7700T, NVMe, HD 630 GPU) -- RESTORED (2026-
|
||||
├── [COMPOSE] Farm Manager API (:8888) -- dashboard + API server
|
||||
├── [COMPOSE] Farm Agent (:8889)
|
||||
├── [SWARM] Telegraf (global), Node-exporter (global)
|
||||
├── [CRON] sync-frigate-to-nas (daily 2am), cleanup-frigate-media (weekly Sun 3am)
|
||||
├── [CRON] sync-frigate-to-nas (daily 2am), cleanup-frigate-media (weekly Sun 3am), restart-frigate (daily 4am)
|
||||
├── 5TB USB disk at /mnt/frigate-recordings (Frigate recordings storage)
|
||||
|
||||
bart (Worker, 15GB RAM, i5-4570T, HDD)
|
||||
├── [COMPOSE] Media Stack (Jellyfin, Sonarr, Radarr, SABnzbd, NZBHydra2, Jellyseerr)
|
||||
├── [COMPOSE] OpenVAS (vulnerability scanner)
|
||||
├── [COMPOSE] Onyx (:3005) -- AI document search/RAG (Ollama backend: llava:13b on 192.168.86.196)
|
||||
├── [COMPOSE] Farm Agent (:8889)
|
||||
├── [COMPOSE] Watchtower
|
||||
├── [SWARM] Telegraf (global), Node-exporter (global)
|
||||
@@ -51,6 +54,9 @@ hf-pdocker-02 (Worker, 7.6GB RAM, i7-6700T, HDD)
|
||||
├── [COMPOSE] Semaphore + semaphore-db (MySQL)
|
||||
├── [COMPOSE] Wiki.js + wikijs-db (PostgreSQL)
|
||||
├── [COMPOSE] Vaultwarden, Actual Budget, MCPO, Trivy
|
||||
├── [COMPOSE] SearXNG (:8888) -- self-hosted meta-search engine (Onyx web search backend)
|
||||
├── [COMPOSE] Unstructured API (:8000) -- document parsing for Onyx file ingestion
|
||||
├── [COMPOSE] n8n + n8n-db (PostgreSQL) -- Clippy workflow automation
|
||||
├── [COMPOSE] NetClaw/Aaron (:1179) -- AI network agent
|
||||
├── [COMPOSE] Farm Agent (:8889)
|
||||
├── [COMPOSE] Watchtower
|
||||
@@ -77,7 +83,7 @@ All service data lives on the **Synology NAS** via NFS, mounted at `/mnt/docker-
|
||||
├── media/ # Frigate recordings
|
||||
├── traefik/ # Let's Encrypt certs
|
||||
└── compose/ # Standalone compose files per node
|
||||
├── hf-pdocker-01/{frigate,frigate-notify,matrix,smarthome,guacamole,ai-agents,traefik,adguard}/
|
||||
├── hf-pdocker-01/{frigate,frigate-notify,clip-service,matrix,smarthome,guacamole,ai-agents,traefik,adguard}/
|
||||
├── hf-pdocker-02/{unifi,gitea,semaphore,wikijs,vaultwarden,actual-budget,mcpo,trivy,netclaw,watchtower}/
|
||||
└── bart/{media,openvas,watchtower}/
|
||||
```
|
||||
@@ -140,12 +146,16 @@ compose/ # Standalone Compose definitions (deployed per-node)
|
||||
- Home Assistant: `yoda.hobbs.farm`
|
||||
- Vaultwarden: `vault.hobbs.farm`
|
||||
- Gitea: `git.hobbs.farm`
|
||||
- Onyx: `onyx.hobbs.farm`
|
||||
- Open WebUI: `open.hobbs.farm`
|
||||
|
||||
### Internal Services by Node
|
||||
|
||||
**hf-pdocker-01 (192.168.86.192):**
|
||||
- Frigate: :5000
|
||||
- Frigate Alerts (v2): :5199 (web UI + REST API)
|
||||
- clip-service: :5200 (CLIP embeddings, ViT-L-14, CPU)
|
||||
- Open WebUI: :3010 (AI chat UI, public at open.hobbs.farm)
|
||||
- Home Assistant: :8123
|
||||
- ESPHome: :6052
|
||||
- Mosquitto: :1883
|
||||
@@ -174,6 +184,8 @@ compose/ # Standalone Compose definitions (deployed per-node)
|
||||
- Actual Budget: :5006
|
||||
- MCPO: :8001
|
||||
- Trivy: :4954
|
||||
- SearXNG: :8888 (meta-search, Onyx web search backend)
|
||||
- Unstructured API: :8000 (document parsing for Onyx file ingestion)
|
||||
- NetClaw/Aaron: :1179 (internal only)
|
||||
|
||||
**bart (192.168.86.167):**
|
||||
@@ -185,15 +197,15 @@ compose/ # Standalone Compose definitions (deployed per-node)
|
||||
- NZBHydra2: :5076
|
||||
- Jellyseerr: :5055
|
||||
- OpenVAS: :9392
|
||||
- Onyx: :3005 (AI document search/RAG)
|
||||
|
||||
**GPU Machine (192.168.86.196, RTX 3090):**
|
||||
- Ollama: :11434 (vision LLM, llava:13b)
|
||||
- clip-service: :5200 (CLIP embeddings, to be deployed)
|
||||
|
||||
### Port Conflict Notes
|
||||
|
||||
Port conflicts already resolved:
|
||||
- Port 8000: Portainer (MCPO moved to 8001)
|
||||
- Port 8000: Now used by Unstructured API on hf-pdocker-02 (MCPO moved to 8001, Portainer moved elsewhere)
|
||||
- Port 3000: AdGuard Home (Gitea moved to 3003)
|
||||
- Port 3001: Grafana (Semaphore moved to 3004)
|
||||
- Port 5000: Frigate uses host networking (registry container stopped)
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
services:
|
||||
open-webui:
|
||||
image: ghcr.io/open-webui/open-webui:main
|
||||
container_name: open-webui
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "3010:8080"
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
- TZ=America/Chicago
|
||||
- OLLAMA_BASE_URL=http://192.168.86.196:11434
|
||||
volumes:
|
||||
- /mnt/docker-data/configs/openwebui:/app/backend/data
|
||||
mem_limit: 1G
|
||||
memswap_limit: 1G
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl -sf http://localhost:8080/health || exit 1"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "50m"
|
||||
max-file: "3"
|
||||
@@ -0,0 +1,244 @@
|
||||
# Open WebUI Deployment Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED: Use superpowers:subagent-driven-development (if subagents available) or superpowers:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** Deploy Open WebUI on hf-pdocker-01 with Ollama + Anthropic Claude backends, publicly accessible at `open.hobbs.farm`.
|
||||
|
||||
**Architecture:** Single-container Compose service on hf-pdocker-01. Traefik file-based dynamic config for HTTPS routing. NAS-backed persistent storage. Prometheus blackbox probes for monitoring.
|
||||
|
||||
**Tech Stack:** Open WebUI (ghcr.io/open-webui/open-webui:main), Traefik v3.6 (file provider), Prometheus blackbox exporter.
|
||||
|
||||
**Spec:** `docs/superpowers/specs/2026-03-11-openwebui-design.md`
|
||||
|
||||
---
|
||||
|
||||
## Chunk 1: Create Files and Deploy
|
||||
|
||||
### Task 1: Create Compose File
|
||||
|
||||
**Files:**
|
||||
- Create: `compose/hf-pdocker-01/openwebui/docker-compose.yml`
|
||||
|
||||
- [ ] **Step 1: Create the compose file**
|
||||
|
||||
```yaml
|
||||
services:
|
||||
open-webui:
|
||||
image: ghcr.io/open-webui/open-webui:main
|
||||
container_name: open-webui
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "3010:8080"
|
||||
env_file:
|
||||
- .env
|
||||
environment:
|
||||
- TZ=America/Chicago
|
||||
- OLLAMA_BASE_URL=http://192.168.86.196:11434
|
||||
volumes:
|
||||
- /mnt/docker-data/configs/openwebui:/app/backend/data
|
||||
mem_limit: 1G
|
||||
memswap_limit: 1G
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl -sf http://localhost:8080/health || exit 1"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "50m"
|
||||
max-file: "3"
|
||||
```
|
||||
|
||||
### Task 2: Create Traefik Dynamic Config
|
||||
|
||||
**Files:**
|
||||
- Create: `stacks/traefik/dynamic/openwebui.yml`
|
||||
|
||||
- [ ] **Step 1: Create the Traefik dynamic route file**
|
||||
|
||||
```yaml
|
||||
http:
|
||||
routers:
|
||||
openwebui:
|
||||
rule: "Host(`open.hobbs.farm`)"
|
||||
entryPoints:
|
||||
- websecure
|
||||
service: openwebui
|
||||
tls:
|
||||
certResolver: letsencrypt
|
||||
openwebui-http:
|
||||
rule: "Host(`open.hobbs.farm`)"
|
||||
entryPoints:
|
||||
- web
|
||||
middlewares:
|
||||
- openwebui-https-redirect
|
||||
service: openwebui
|
||||
middlewares:
|
||||
openwebui-https-redirect:
|
||||
redirectScheme:
|
||||
scheme: https
|
||||
permanent: true
|
||||
services:
|
||||
openwebui:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://192.168.86.192:3010"
|
||||
```
|
||||
|
||||
### Task 3: Deploy to hf-pdocker-01
|
||||
|
||||
Uses `docker-swarm-ops` agent. All steps run on hf-pdocker-01 via SSH.
|
||||
|
||||
- [ ] **Step 1: Create data directory on NAS**
|
||||
|
||||
```bash
|
||||
ssh glyptic@192.168.86.192 "sudo mkdir -p /mnt/docker-data/configs/openwebui"
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Create compose directory on NAS**
|
||||
|
||||
```bash
|
||||
ssh glyptic@192.168.86.192 "sudo mkdir -p /mnt/docker-data/compose/hf-pdocker-01/openwebui"
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Generate WEBUI_SECRET_KEY and create .env file**
|
||||
|
||||
```bash
|
||||
SECRET=$(openssl rand -hex 32)
|
||||
# Get ANTHROPIC_API_KEY from existing ai-agents .env on NAS
|
||||
API_KEY=$(ssh glyptic@192.168.86.192 "grep ANTHROPIC_API_KEY /mnt/docker-data/compose/hf-pdocker-01/ai-agents/.env | cut -d= -f2")
|
||||
ssh glyptic@192.168.86.192 "cat > /mnt/docker-data/compose/hf-pdocker-01/openwebui/.env << EOF
|
||||
ANTHROPIC_API_KEY=$API_KEY
|
||||
WEBUI_SECRET_KEY=$SECRET
|
||||
EOF"
|
||||
```
|
||||
|
||||
- [ ] **Step 4: SCP compose file to NAS**
|
||||
|
||||
```bash
|
||||
scp compose/hf-pdocker-01/openwebui/docker-compose.yml glyptic@192.168.86.192:/mnt/docker-data/compose/hf-pdocker-01/openwebui/docker-compose.yml
|
||||
```
|
||||
|
||||
- [ ] **Step 5: SCP Traefik dynamic config to NAS**
|
||||
|
||||
```bash
|
||||
scp stacks/traefik/dynamic/openwebui.yml glyptic@192.168.86.192:/mnt/docker-data/traefik/dynamic/openwebui.yml
|
||||
```
|
||||
|
||||
- [ ] **Step 6: Pull image and start container**
|
||||
|
||||
```bash
|
||||
ssh glyptic@192.168.86.192 "cd /mnt/docker-data/compose/hf-pdocker-01/openwebui && docker compose pull && docker compose up -d"
|
||||
```
|
||||
|
||||
- [ ] **Step 7: Verify container health**
|
||||
|
||||
```bash
|
||||
ssh glyptic@192.168.86.192 "docker ps --filter name=open-webui --format 'table {{.Names}}\t{{.Status}}'"
|
||||
```
|
||||
|
||||
Expected: `open-webui Up ... (healthy)` (may take up to 60s for healthcheck)
|
||||
|
||||
- [ ] **Step 8: Verify internal access**
|
||||
|
||||
```bash
|
||||
ssh glyptic@192.168.86.192 "curl -sf -o /dev/null -w '%{http_code}' http://localhost:3010"
|
||||
```
|
||||
|
||||
Expected: `200`
|
||||
|
||||
- [ ] **Step 9: Verify Traefik picked up the route**
|
||||
|
||||
```bash
|
||||
curl -sf -o /dev/null -w '%{http_code}' https://open.hobbs.farm
|
||||
```
|
||||
|
||||
Expected: `200` (Traefik auto-reloads file-based config)
|
||||
|
||||
- [ ] **Step 10: Verify Ollama connectivity from container**
|
||||
|
||||
```bash
|
||||
ssh glyptic@192.168.86.192 "docker exec open-webui curl -sf http://192.168.86.196:11434/api/tags | head -c 200"
|
||||
```
|
||||
|
||||
Expected: JSON response listing available Ollama models (llava:13b)
|
||||
|
||||
## Chunk 2: Monitoring and Documentation
|
||||
|
||||
### Task 4: Add Prometheus Blackbox Probes
|
||||
|
||||
**Files:**
|
||||
- Modify: `stacks/monitoring/prometheus.yml`
|
||||
|
||||
- [ ] **Step 1: Add internal probe to http-pdocker01 job**
|
||||
|
||||
Add `- http://192.168.86.192:3010 # Open WebUI` to the `http-pdocker01` targets list (after the Alertmanager line, line 70).
|
||||
|
||||
- [ ] **Step 2: Add external probe to http-external job**
|
||||
|
||||
Add `- https://open.hobbs.farm # Open WebUI` to the `http-external` targets list (after the Gitea line, line 158).
|
||||
|
||||
- [ ] **Step 3: SCP updated prometheus.yml to NAS**
|
||||
|
||||
```bash
|
||||
scp stacks/monitoring/prometheus.yml glyptic@192.168.86.192:/mnt/docker-data/configs/prometheus/prometheus.yml
|
||||
```
|
||||
|
||||
- [ ] **Step 4: Hot-reload Prometheus**
|
||||
|
||||
```bash
|
||||
ssh glyptic@192.168.86.192 "curl -X POST http://localhost:9095/-/reload"
|
||||
```
|
||||
|
||||
- [ ] **Step 5: Verify probes are up**
|
||||
|
||||
```bash
|
||||
ssh glyptic@192.168.86.192 "curl -s 'http://localhost:9095/api/v1/targets?state=active' | python3 -c \"import sys,json; targets=json.load(sys.stdin)['data']['activeTargets']; [print(t['labels'].get('instance','')) for t in targets if 'open' in t['labels'].get('instance','').lower()]\""
|
||||
```
|
||||
|
||||
Expected: Two lines showing `http://192.168.86.192:3010` and `https://open.hobbs.farm`
|
||||
|
||||
### Task 5: Update CLAUDE.md
|
||||
|
||||
**Files:**
|
||||
- Modify: `CLAUDE.md`
|
||||
|
||||
- [ ] **Step 1: Add Open WebUI to hf-pdocker-01 service list**
|
||||
|
||||
Add `├── [COMPOSE] Open WebUI (:3010) -- LLM chat UI (Ollama + Claude)` to the hf-pdocker-01 section.
|
||||
|
||||
- [ ] **Step 2: Add to internal services list**
|
||||
|
||||
Add `- Open WebUI: :3010` under hf-pdocker-01 internal services.
|
||||
|
||||
- [ ] **Step 3: Add to public services list**
|
||||
|
||||
Add `- Open WebUI: \`open.hobbs.farm\`` under Public Services.
|
||||
|
||||
### Task 6: Update MEMORY.md
|
||||
|
||||
**Files:**
|
||||
- Modify: `/home/glyptic/.claude/projects/-mnt-c-Users-Jeremy-projects-docker/memory/MEMORY.md`
|
||||
|
||||
- [ ] **Step 1: Add Open WebUI memory entry**
|
||||
|
||||
Add section with deployment details: node, port, compose path, LLM backends, Traefik route, data path.
|
||||
|
||||
### Task 7: Update Wiki
|
||||
|
||||
- [ ] **Step 1: Launch documentation-keeper agent (background)**
|
||||
|
||||
Update wiki with new Open WebUI service documentation.
|
||||
|
||||
### Task 8: Commit
|
||||
|
||||
- [ ] **Step 1: Commit all new/modified files**
|
||||
|
||||
```bash
|
||||
git add compose/hf-pdocker-01/openwebui/docker-compose.yml stacks/traefik/dynamic/openwebui.yml stacks/monitoring/prometheus.yml CLAUDE.md
|
||||
git commit -m "infra: deploy Open WebUI on hf-pdocker-01 with Ollama + Claude backends"
|
||||
```
|
||||
@@ -0,0 +1,148 @@
|
||||
# Open WebUI Deployment Design
|
||||
|
||||
**Date:** 2026-03-11
|
||||
**Node:** hf-pdocker-01 (192.168.86.192)
|
||||
**Public URL:** https://open.hobbs.farm
|
||||
**Internal URL:** http://192.168.86.192:3010
|
||||
|
||||
## Overview
|
||||
|
||||
Deploy Open WebUI as a standalone Compose service on hf-pdocker-01, connected to Ollama (local GPU machine) and Anthropic Claude API. Publicly accessible via Traefik at `open.hobbs.farm`.
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
Internet -> Traefik (hf-pdocker-01:443) -> http://192.168.86.192:3010 -> open-webui:8080
|
||||
|
|
||||
+-> Ollama (192.168.86.196:11434) [llava:13b + future models]
|
||||
+-> Anthropic API (cloud) [Claude models]
|
||||
```
|
||||
|
||||
## Service Definition
|
||||
|
||||
- **Image:** `ghcr.io/open-webui/open-webui:main`
|
||||
- **Container name:** `open-webui`
|
||||
- **Internal port:** 8080 (container default)
|
||||
- **Host port:** 3010
|
||||
- **Memory:** `mem_limit: 1G`, `memswap_limit: 1G`
|
||||
- **Restart:** `unless-stopped`
|
||||
- **Watchtower:** `com.centurylinklabs.watchtower.enable=false` (manual upgrades)
|
||||
- **Timezone:** `TZ=America/Chicago`
|
||||
|
||||
### Compose Location
|
||||
|
||||
- Repo: `compose/hf-pdocker-01/openwebui/docker-compose.yml`
|
||||
- Deploy target: `/mnt/docker-data/compose/hf-pdocker-01/openwebui/`
|
||||
- `.env` file alongside compose for secrets (ANTHROPIC_API_KEY, WEBUI_SECRET_KEY)
|
||||
|
||||
### Persistent Storage
|
||||
|
||||
- Data volume: `/mnt/docker-data/configs/openwebui/` -> `/app/backend/data` in container
|
||||
- Stores: user accounts, chat history, settings, uploaded files
|
||||
- Open WebUI uses SQLite internally. Single-writer scenario on NFS is acceptable. If locking issues arise, fall back to local storage (like Guacamole's MySQL pattern at `/var/lib/`).
|
||||
- Container runs as root by default; NFS write permissions should work without `user: "1024:100"` but will be verified during deploy.
|
||||
|
||||
### Environment Variables
|
||||
|
||||
- `OLLAMA_BASE_URL=http://192.168.86.196:11434` — native Ollama connection
|
||||
- `ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}` — from .env, enables native Anthropic provider (Open WebUI v0.5+ has built-in Anthropic support)
|
||||
- `WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY}` — from .env, generated via `openssl rand -hex 32`
|
||||
- `TZ=America/Chicago`
|
||||
|
||||
### Healthcheck
|
||||
|
||||
```yaml
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl -sf http://localhost:8080/health || exit 1"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
```
|
||||
|
||||
### Logging
|
||||
|
||||
```yaml
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "50m"
|
||||
max-file: "3"
|
||||
```
|
||||
|
||||
### Traefik Configuration
|
||||
|
||||
Traefik on hf-pdocker-01 uses **file-based dynamic config** (no Docker provider/labels). A new dynamic config file is needed:
|
||||
|
||||
- **Repo path:** `stacks/traefik/dynamic/openwebui.yml`
|
||||
- **Deploy target:** `/mnt/docker-data/traefik/dynamic/openwebui.yml` (auto-picked up by Traefik's file watcher)
|
||||
|
||||
```yaml
|
||||
http:
|
||||
routers:
|
||||
openwebui:
|
||||
rule: "Host(`open.hobbs.farm`)"
|
||||
entryPoints:
|
||||
- websecure
|
||||
service: openwebui
|
||||
tls:
|
||||
certResolver: letsencrypt
|
||||
openwebui-http:
|
||||
rule: "Host(`open.hobbs.farm`)"
|
||||
entryPoints:
|
||||
- web
|
||||
middlewares:
|
||||
- openwebui-https-redirect
|
||||
service: openwebui
|
||||
middlewares:
|
||||
openwebui-https-redirect:
|
||||
redirectScheme:
|
||||
scheme: https
|
||||
permanent: true
|
||||
services:
|
||||
openwebui:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://192.168.86.192:3010"
|
||||
```
|
||||
|
||||
### Network
|
||||
|
||||
- Default bridge network (single-container service, no custom network needed)
|
||||
- Traefik routes to `http://192.168.86.192:3010` via file-based config (no overlay network required)
|
||||
|
||||
### Authentication
|
||||
|
||||
- Built-in Open WebUI auth (email/password)
|
||||
- First user to register becomes admin
|
||||
- Admin disables open registration after initial setup
|
||||
|
||||
### Monitoring
|
||||
|
||||
- **Internal probe:** `http://192.168.86.192:3010` added to Prometheus `http-pdocker01` blackbox job
|
||||
- **External probe:** `https://open.hobbs.farm` added to Prometheus `http-external` blackbox job
|
||||
|
||||
## LLM Backend Details
|
||||
|
||||
### Ollama (Native)
|
||||
|
||||
Open WebUI has first-class Ollama support. Setting `OLLAMA_BASE_URL` makes all Ollama models available in the model selector. Currently `llava:13b` is loaded; any future models pulled to Ollama will auto-appear.
|
||||
|
||||
### Anthropic Claude (Native)
|
||||
|
||||
Open WebUI v0.5+ has built-in Anthropic provider support. Setting the `ANTHROPIC_API_KEY` environment variable enables Claude models in the model selector. No proxy or OpenAI-compatibility layer needed. The existing API key (same one used by frigate-notify and AI agents) goes in the `.env` file.
|
||||
|
||||
## Post-Deploy Checklist
|
||||
|
||||
1. Verify container health and web UI loads at `http://192.168.86.192:3010`
|
||||
2. Verify Traefik routes `https://open.hobbs.farm` correctly
|
||||
3. Register first admin user
|
||||
4. Disable open registration in admin settings
|
||||
5. Verify Ollama models appear in model selector
|
||||
6. Verify Claude models appear in model selector
|
||||
7. Add Prometheus blackbox probes (internal + external)
|
||||
8. Hot-reload Prometheus: `curl -X POST http://192.168.86.192:9095/-/reload`
|
||||
9. Update CLAUDE.md service lists
|
||||
10. Update MEMORY.md
|
||||
11. Update wiki via documentation-keeper agent
|
||||
12. Store WEBUI_SECRET_KEY in Vaultwarden
|
||||
@@ -39,15 +39,15 @@ scrape_configs:
|
||||
static_configs:
|
||||
- targets: ['blackbox-exporter:9115']
|
||||
|
||||
# Matrix Alertmanager Receiver metrics (running on hf-pdocker-02 during failover)
|
||||
# Matrix Alertmanager Receiver metrics (now on hf-pdocker-01)
|
||||
- job_name: 'matrix-alertmanager-receiver'
|
||||
scrape_interval: 1m
|
||||
static_configs:
|
||||
- targets: ['192.168.86.100:9094']
|
||||
- targets: ['192.168.86.192:9094']
|
||||
labels:
|
||||
hostname: 'hf-pdocker-02'
|
||||
hostname: 'hf-pdocker-01'
|
||||
|
||||
# HTTP Health Checks - hf-pdocker-01 services (native services only; failover services tracked in other jobs)
|
||||
# HTTP Health Checks - hf-pdocker-01 services
|
||||
- job_name: 'http-pdocker01'
|
||||
metrics_path: /probe
|
||||
params:
|
||||
@@ -56,8 +56,19 @@ scrape_configs:
|
||||
- targets:
|
||||
- http://192.168.86.192:5000 # Frigate NVR (standalone, host network)
|
||||
- http://192.168.86.192:5199/health # Frigate Notify
|
||||
- http://192.168.86.192:5200/health # clip-service (CLIP embeddings)
|
||||
- http://192.168.86.192:3010 # Open WebUI
|
||||
- http://192.168.86.192:8888/health # Farm Manager API
|
||||
- http://192.168.86.192:8889/health # Farm Agent
|
||||
- http://192.168.86.192:8123 # Home Assistant
|
||||
- http://192.168.86.192:6052 # ESPHome
|
||||
- http://192.168.86.192:8199/guacamole/ # Guacamole
|
||||
- http://192.168.86.192:8008 # Matrix Synapse
|
||||
- http://192.168.86.192:3000 # AdGuard Home
|
||||
- http://192.168.86.192:8090/dashboard/ # Traefik Dashboard
|
||||
- http://192.168.86.192:3001 # Grafana
|
||||
- http://192.168.86.192:9095 # Prometheus
|
||||
- http://192.168.86.192:9093 # Alertmanager
|
||||
relabel_configs:
|
||||
- source_labels: [__address__]
|
||||
target_label: __param_target
|
||||
@@ -66,7 +77,7 @@ scrape_configs:
|
||||
- target_label: __address__
|
||||
replacement: blackbox-exporter:9115
|
||||
|
||||
# HTTP Health Checks - hf-pdocker-02 services (native + failover from hf-pdocker-01)
|
||||
# HTTP Health Checks - hf-pdocker-02 services
|
||||
- job_name: 'http-pdocker02'
|
||||
metrics_path: /probe
|
||||
params:
|
||||
@@ -80,10 +91,8 @@ scrape_configs:
|
||||
- http://192.168.86.100:5006 # Actual Budget
|
||||
- http://192.168.86.100:8001/openapi.json # MCPO
|
||||
- http://192.168.86.100:8889/health # Farm Agent
|
||||
- http://192.168.86.100:3001 # Grafana (FAILOVER from hf-pdocker-01)
|
||||
- http://192.168.86.100:9095 # Prometheus (FAILOVER from hf-pdocker-01)
|
||||
- http://192.168.86.100:9093 # Alertmanager (FAILOVER from hf-pdocker-01)
|
||||
- http://192.168.86.100:3000 # AdGuard Home (FAILOVER from hf-pdocker-01)
|
||||
- http://192.168.86.100:8888 # SearXNG
|
||||
- http://192.168.86.100:8000/healthcheck # Unstructured API
|
||||
- http://192.168.86.100:9000 # Portainer
|
||||
relabel_configs:
|
||||
- source_labels: [__address__]
|
||||
@@ -109,7 +118,7 @@ scrape_configs:
|
||||
- target_label: __address__
|
||||
replacement: blackbox-exporter:9115
|
||||
|
||||
# HTTP Health Checks - bart services (native + failover from hf-pdocker-01)
|
||||
# HTTP Health Checks - bart services
|
||||
- job_name: 'http-bart'
|
||||
metrics_path: /probe
|
||||
params:
|
||||
@@ -124,10 +133,10 @@ scrape_configs:
|
||||
- http://192.168.86.167:5055 # Jellyseerr
|
||||
- http://192.168.86.167:9392 # OpenVAS
|
||||
- http://192.168.86.167:8889/health # Farm Agent
|
||||
- http://192.168.86.167:8123 # Home Assistant (FAILOVER from hf-pdocker-01)
|
||||
- http://192.168.86.167:6052 # ESPHome (FAILOVER from hf-pdocker-01)
|
||||
- http://192.168.86.167:8199/guacamole/ # Guacamole (FAILOVER from hf-pdocker-01)
|
||||
- http://192.168.86.167:8008 # Matrix Synapse (FAILOVER from hf-pdocker-01)
|
||||
- targets:
|
||||
- http://192.168.86.167:3005 # Onyx
|
||||
labels:
|
||||
name: onyx
|
||||
relabel_configs:
|
||||
- source_labels: [__address__]
|
||||
target_label: __param_target
|
||||
@@ -148,6 +157,7 @@ scrape_configs:
|
||||
- https://yoda.hobbs.farm # Home Assistant
|
||||
- https://vault.hobbs.farm # Vaultwarden
|
||||
- https://git.hobbs.farm # Gitea
|
||||
- https://open.hobbs.farm # Open WebUI
|
||||
relabel_configs:
|
||||
- source_labels: [__address__]
|
||||
target_label: __param_target
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
http:
|
||||
routers:
|
||||
openwebui:
|
||||
rule: "Host(`open.hobbs.farm`)"
|
||||
entryPoints:
|
||||
- websecure
|
||||
service: openwebui
|
||||
tls:
|
||||
certResolver: letsencrypt
|
||||
openwebui-http:
|
||||
rule: "Host(`open.hobbs.farm`)"
|
||||
entryPoints:
|
||||
- web
|
||||
middlewares:
|
||||
- openwebui-https-redirect
|
||||
service: openwebui
|
||||
middlewares:
|
||||
openwebui-https-redirect:
|
||||
redirectScheme:
|
||||
scheme: https
|
||||
permanent: true
|
||||
services:
|
||||
openwebui:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://192.168.86.192:3010"
|
||||
Reference in New Issue
Block a user