- Add SearXNG service on port 6060 (replaces old port 11112) - Add Valkey for rate limiting (5/min, 60/hour, 500/day) - Add Nginx reverse proxy with X-Real-IP and X-Forwarded-For headers - Configure JSON format and French locale - Add rate limiting configuration in limiter.toml - Add Valkey configuration in valkey.conf
293 lines
12 KiB
YAML
293 lines
12 KiB
YAML
# ═══════════════════════════════════════════════════════════
|
|
# EFFI SERVER - Stack IA Locale
|
|
# Machine : effi-server (192.168.1.27)
|
|
# ═══════════════════════════════════════════════════════════
|
|
|
|
services:
|
|
|
|
# ─────────────────────────────────────────────────────────
|
|
# 0. VALKEY - Backend de rate limiting pour SearXNG
|
|
# → Port interne uniquement (non exposé)
|
|
# ─────────────────────────────────────────────────────────
|
|
valkey:
|
|
image: valkey/valkey:7-alpine
|
|
container_name: effi-valkey
|
|
restart: unless-stopped
|
|
command: valkey-server /usr/local/etc/valkey/valkey.conf
|
|
volumes:
|
|
- ./searxng-config/valkey.conf:/usr/local/etc/valkey/valkey.conf:ro
|
|
- valkey-data:/data/valkey-data
|
|
networks:
|
|
- effi-net
|
|
|
|
# ─────────────────────────────────────────────────────────
|
|
# 1. SEARXNG - Meta-search Engine (API JSON)
|
|
# → http://192.168.1.27:6060
|
|
# ─────────────────────────────────────────────────────────
|
|
searxng:
|
|
image: searxng/searxng:latest
|
|
container_name: effi-searxng
|
|
restart: unless-stopped
|
|
ports:
|
|
- "6060:8080"
|
|
volumes:
|
|
- ./searxng-config/settings.yml:/etc/searxng/settings.yml:ro
|
|
environment:
|
|
- SEARXNG_BASE_URL=http://192.168.1.27:6060/
|
|
- SEARXNG_SECRET=${SEARXNG_SECRET_KEY}
|
|
- SEARXNG_SETTINGS_PATH=/etc/searxng/settings.yml
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:8080/healthz"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 30s
|
|
depends_on:
|
|
- valkey
|
|
networks:
|
|
- effi-net
|
|
|
|
# ─────────────────────────────────────────────────────────
|
|
# 1. OPEN WEBUI - Interface Chat Effi
|
|
# → http://192.168.1.27:3000
|
|
# ─────────────────────────────────────────────────────────
|
|
open-webui:
|
|
image: ghcr.io/open-webui/open-webui:main
|
|
container_name: open-webui
|
|
restart: unless-stopped
|
|
extra_hosts:
|
|
- "host.docker.internal:host-gateway"
|
|
ports:
|
|
- "3000:8080"
|
|
environment:
|
|
- OLLAMA_BASE_URL=http://host.docker.internal:3011
|
|
- WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY}
|
|
- VECTOR_DB=qdrant
|
|
- QDRANT_URI=http://qdrant:6333
|
|
- DEFAULT_LOCALE=fr-FR
|
|
- ENABLE_MEMORIES=true
|
|
- AUDIO_STT_ENGINE=openai
|
|
- AUDIO_STT_OPENAI_API_BASE_URL=http://192.168.1.11:8200/v1
|
|
- AUDIO_STT_OPENAI_API_KEY=anything
|
|
- AUDIO_STT_MODEL=Systran/faster-whisper-large-v3
|
|
volumes:
|
|
- open-webui-data:/app/backend/data
|
|
depends_on:
|
|
- qdrant
|
|
- wol-proxy
|
|
networks:
|
|
- effi-net
|
|
|
|
# ─────────────────────────────────────────────────────────
|
|
# 2. WOL PROXY - Réveil PC Gaming avant appel Ollama
|
|
# → Proxy :3011 → PC Gaming :11434
|
|
# ─────────────────────────────────────────────────────────
|
|
wol-proxy:
|
|
build: ./wol-proxy
|
|
container_name: wol-proxy
|
|
restart: unless-stopped
|
|
network_mode: host
|
|
environment:
|
|
- TARGET_HOST=${OLLAMA_HOST}
|
|
- TARGET_PORT=11434
|
|
- TARGET_MAC=${PC_GAMING_MAC}
|
|
- LISTEN_PORT=3011
|
|
- WAKE_TIMEOUT=${WAKE_TIMEOUT:-180}
|
|
- CHECK_INTERVAL=5
|
|
- BROADCAST_IP=${BROADCAST_IP}
|
|
|
|
# ─────────────────────────────────────────────────────────
|
|
# 3. MCPO - Proxy outils MCP (Obsidian, etc.)
|
|
# → http://192.168.1.27:8000
|
|
# ─────────────────────────────────────────────────────────
|
|
mcpo:
|
|
image: ghcr.io/open-webui/mcpo:main
|
|
container_name: mcpo
|
|
restart: unless-stopped
|
|
ports:
|
|
- "8000:8000"
|
|
volumes:
|
|
- ./mcpo-config:/app/config:ro
|
|
- ./mcpo-patch.sh:/mcpo-patch.sh:ro
|
|
entrypoint: ["sh", "/mcpo-patch.sh"]
|
|
networks:
|
|
- effi-net
|
|
|
|
# ─────────────────────────────────────────────────────────
|
|
# 3b. LEANTIME MCP - Serveur MCP pour gestion de projet
|
|
# → http://192.168.1.27:8079/mcp
|
|
# ─────────────────────────────────────────────────────────
|
|
leantime-mcp:
|
|
build:
|
|
context: ./leantime-mcp
|
|
dockerfile: Dockerfile
|
|
image: effi-leantime-mcp:latest
|
|
container_name: effi-leantime-mcp
|
|
restart: unless-stopped
|
|
environment:
|
|
- LEANTIME_URL=http://192.168.1.25:8380
|
|
- LEANTIME_API_KEY=${LEANTIME_API_KEY}
|
|
- LEANTIME_USER_EMAIL=${LEANTIME_USER_EMAIL}
|
|
ports:
|
|
- "8079:8079"
|
|
networks:
|
|
- effi-net
|
|
|
|
# ─────────────────────────────────────────────────────────
|
|
# 4. QDRANT - Vector Store (RAG sémantique)
|
|
# → http://192.168.1.27:6333
|
|
# ─────────────────────────────────────────────────────────
|
|
qdrant:
|
|
image: qdrant/qdrant:latest
|
|
container_name: qdrant
|
|
restart: unless-stopped
|
|
ports:
|
|
- "6333:6333"
|
|
- "6334:6334"
|
|
volumes:
|
|
- ./qdrant-storage:/qdrant/storage:z
|
|
networks:
|
|
- effi-net
|
|
|
|
# ─────────────────────────────────────────────────────────
|
|
# 5. COUCHDB - Backend Obsidian LiveSync
|
|
# → http://192.168.1.27:5984
|
|
# ─────────────────────────────────────────────────────────
|
|
couchdb:
|
|
image: couchdb:3.3
|
|
container_name: couchdb
|
|
restart: unless-stopped
|
|
ports:
|
|
- "5984:5984"
|
|
environment:
|
|
- COUCHDB_USER=${COUCHDB_USER}
|
|
- COUCHDB_PASSWORD=${COUCHDB_PASSWORD}
|
|
volumes:
|
|
- ./couchdb-data:/opt/couchdb/data
|
|
networks:
|
|
- effi-net
|
|
|
|
# ─────────────────────────────────────────────────────────
|
|
# 6. N8N - Automatisation autonome Effi
|
|
# → http://192.168.1.27:5678
|
|
# ─────────────────────────────────────────────────────────
|
|
n8n:
|
|
image: docker.n8n.io/n8nio/n8n:latest
|
|
container_name: n8n
|
|
restart: unless-stopped
|
|
ports:
|
|
- "5678:5678"
|
|
environment:
|
|
- N8N_HOST=0.0.0.0
|
|
- N8N_PORT=5678
|
|
- N8N_PROTOCOL=http
|
|
- WEBHOOK_URL=http://192.168.1.27:5678
|
|
- N8N_BASIC_AUTH_ACTIVE=true
|
|
- N8N_BASIC_AUTH_USER=${N8N_USER}
|
|
- N8N_BASIC_AUTH_PASSWORD=${N8N_PASSWORD}
|
|
- GENERIC_TIMEZONE=Europe/Paris
|
|
- TZ=Europe/Paris
|
|
volumes:
|
|
- ./n8n-data:/home/node/.n8n
|
|
networks:
|
|
- effi-net
|
|
|
|
# ─────────────────────────────────────────────────────────
|
|
# 7. PIPELINES - Middleware Open WebUI (mem0 memory)
|
|
# → http://192.168.1.27:9099
|
|
# ─────────────────────────────────────────────────────────
|
|
pipelines:
|
|
image: ghcr.io/open-webui/pipelines:main
|
|
container_name: pipelines
|
|
restart: unless-stopped
|
|
ports:
|
|
- "9099:9099"
|
|
volumes:
|
|
- pipelines-data:/app/pipelines
|
|
networks:
|
|
- effi-net
|
|
|
|
# ─────────────────────────────────────────────────────────
|
|
# 8. WHISPER - Speech To Text (STT)
|
|
# → http://192.168.1.27:8200
|
|
# ─────────────────────────────────────────────────────────
|
|
whisper:
|
|
image: fedirz/faster-whisper-server:latest-cpu
|
|
container_name: whisper
|
|
restart: unless-stopped
|
|
ports:
|
|
- "8200:8000"
|
|
volumes:
|
|
- whisper-cache:/root/.cache/huggingface
|
|
environment:
|
|
- WHISPER__MODEL=guillaumekln/faster-whisper-tiny
|
|
- WHISPER__LANGUAGE=fr
|
|
- HF_HUB_OFFLINE=0
|
|
|
|
# ─────────────────────────────────────────────────────────
|
|
# 9. OPENEDAI-SPEECH - Text To Speech (TTS)
|
|
# → http://192.168.1.27:8100
|
|
# ─────────────────────────────────────────────────────────
|
|
openedai-speech:
|
|
image: ghcr.io/matatonic/openedai-speech
|
|
container_name: openedai-speech
|
|
restart: unless-stopped
|
|
ports:
|
|
- "8100:8000"
|
|
volumes:
|
|
- ./tts-voices:/app/voices
|
|
- ./tts-config:/app/config
|
|
|
|
# ─────────────────────────────────────────────────────────
|
|
# 10. WATCHTOWER - Mise à jour automatique des containers
|
|
# → Vérifie les mises à jour chaque nuit à 4h00
|
|
# ─────────────────────────────────────────────────────────
|
|
watchtower:
|
|
image: nickfedor/watchtower:latest
|
|
container_name: watchtower
|
|
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock
|
|
environment:
|
|
- WATCHTOWER_CLEANUP=true
|
|
- WATCHTOWER_SCHEDULE=0 0 4 * * *
|
|
- WATCHTOWER_NOTIFICATIONS_LEVEL=warn
|
|
- WATCHTOWER_INCLUDE_STOPPED=true
|
|
- WATCHTOWER_REVIVE_STOPPED=false
|
|
- TZ=Europe/Paris
|
|
restart: unless-stopped
|
|
networks:
|
|
- effi-net
|
|
|
|
# ─────────────────────────────────────────────────────────
|
|
# 11. OBSIDIAN - Version Serveur 24/7 (Web UI & MCP)
|
|
# → Interface Web : https://192.168.1.27:3100
|
|
# ─────────────────────────────────────────────────────────
|
|
obsidian:
|
|
image: lscr.io/linuxserver/obsidian:latest
|
|
container_name: obsidian
|
|
restart: unless-stopped
|
|
security_opt:
|
|
- seccomp:unconfined # Nécessaire pour le rendu Chromium/Electron dans Docker
|
|
environment:
|
|
- PUID=1000 # À vérifier avec la commande 'id' sur ton serveur Ubuntu
|
|
- PGID=1000
|
|
- TZ=Europe/Paris
|
|
ports:
|
|
- "3100:3001" # Accès HTTPS à l'interface virtuelle
|
|
volumes:
|
|
- ./obsidian-vault:/config # Contient l'OS virtuel ET ton Vault Obsidian
|
|
shm_size: "1gb" # Requis pour la stabilité de l'interface graphique
|
|
networks:
|
|
- effi-net
|
|
|
|
networks:
|
|
effi-net:
|
|
driver: bridge
|
|
|
|
volumes:
|
|
open-webui-data:
|
|
pipelines-data:
|
|
whisper-cache:
|
|
redis-data:
|