288 lines
10 KiB
YAML
288 lines
10 KiB
YAML
# =============================================================================
|
|
|
|
# Torrent Stack (web) - dashboard, edge & AI services
|
|
#
|
|
# Split from compose.yml on 2026-09-11 - verbatim service blocks.
|
|
# Shared top-level networks:/volumes: are repeated in each subfile so it also
|
|
# works standalone (docker compose -f web.yml up -d). Identical copies merge
|
|
# cleanly under compose.yml's `include:` with no change to the live config.
|
|
# Keep ./ paths, container names and /mnt data as-is.
|
|
# =============================================================================
|
|
|
|
networks:
|
|
#caddy_net:
|
|
# external: true
|
|
tdarr-net:
|
|
driver: bridge
|
|
default:
|
|
name: portainer_network
|
|
|
|
volumes:
|
|
#caddy_config:
|
|
#caddy_data:
|
|
# external: true
|
|
#myspeed:
|
|
# external: true
|
|
portainer_data:
|
|
name: portainer_data
|
|
|
|
services:
|
|
# ---------------------------------------------------------------------------
|
|
|
|
# Dashboard
|
|
# ---------------------------------------------------------------------------
|
|
|
|
homepage:
|
|
image: ${HOMEPAGE_IMAGE}
|
|
container_name: homepage
|
|
env_file:
|
|
- .env
|
|
- ./env/.homepage.env
|
|
#networks:
|
|
# - caddy_net
|
|
ports:
|
|
- ${HOMEPAGE_PORT}:${HOMEPAGE_PORT}
|
|
volumes:
|
|
- ./homepage:/app/config
|
|
- ./homepage/images:/app/public/images
|
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
#- /etc/localtime:/etc/localtime:ro
|
|
#- /etc/timezone:/etc/timezone:ro
|
|
environment:
|
|
- "HOMEPAGE_ALLOWED_HOSTS=gethomepage.dev,${LOCAL_IPV4}:${HOMEPAGE_PORT},${SERVER_NAME}:${HOMEPAGE_PORT},${SERVER_NAME}.${TAILNET_NAME}:${HOMEPAGE_PORT},host.docker.internal:{HOMEPAGE_PORT}"
|
|
- "HOMEPAGE_VAR_DISK1=${DISK1}"
|
|
- "HOMEPAGE_VAR_DISK2=${DISK2}"
|
|
- "HOMEPAGE_VAR_DISK3=${DISK3}"
|
|
- "HOMEPAGE_VAR_WEB_PROTOCOL=${WEB_PROTOCOL}"
|
|
- "HOMEPAGE_VAR_LOCAL_IPV4=${LOCAL_IPV4}"
|
|
- "HOMEPAGE_VAR_SERVER_NAME=${SERVER_NAME}"
|
|
- "HOMEPAGE_VAR_PLEX_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${PLEX_PORT}"
|
|
- "HOMEPAGE_VAR_QBITTORRENT_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${QBITTORRENT_PORT}"
|
|
- "HOMEPAGE_VAR_PROWLARR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${PROWLARR_PORT}"
|
|
- "HOMEPAGE_VAR_SONARR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${SONARR_PORT}"
|
|
- "HOMEPAGE_VAR_RADARR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${RADARR_PORT}"
|
|
- "HOMEPAGE_VAR_LIDARR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${LIDARR_PORT}"
|
|
- "HOMEPAGE_VAR_BAZARR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${BAZARR_PORT}"
|
|
- "HOMEPAGE_VAR_TAUTULLI_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${TAUTULLI_PORT}"
|
|
- "HOMEPAGE_VAR_TDARR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${TDARR_PORT}"
|
|
- "HOMEPAGE_VAR_HOMEPAGE_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${HOMEPAGE_PORT}"
|
|
- "HOMEPAGE_VAR_GLANCES_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${GLANCES_PORT}"
|
|
- "HOMEPAGE_VAR_SEERR_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${SEERR_PORT}"
|
|
- "HOMEPAGE_VAR_OPENWEBUI_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${OPENWEBUI_PORT}"
|
|
- "HOMEPAGE_VAR_PIHOLE_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${PIHOLE_PORT}"
|
|
- "HOMEPAGE_VAR_PORTAINER_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${PORTAINER_PORT}"
|
|
- "HOMEPAGE_VAR_SCRUTINY_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${SCRUTINY_PORT}"
|
|
- "HOMEPAGE_VAR_KARAKEEP_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${KARAKEEP_PORT}"
|
|
- "HOMEPAGE_VAR_VLLM_ADDRESS=${WEB_PROTOCOL}://${LOCAL_IPV4}:${VLLM_PORT}"
|
|
- "HOMEPAGE_VAR_PLEX_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${PLEX_PORT}"
|
|
- "HOMEPAGE_VAR_QBITTORRENT_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${QBITTORRENT_PORT}"
|
|
- "HOMEPAGE_VAR_PROWLARR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${PROWLARR_PORT}"
|
|
- "HOMEPAGE_VAR_SONARR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${SONARR_PORT}"
|
|
- "HOMEPAGE_VAR_RADARR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${RADARR_PORT}"
|
|
- "HOMEPAGE_VAR_LIDARR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${LIDARR_PORT}"
|
|
- "HOMEPAGE_VAR_BAZARR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${BAZARR_PORT}"
|
|
- "HOMEPAGE_VAR_TAUTULLI_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${TAUTULLI_PORT}"
|
|
- "HOMEPAGE_VAR_TDARR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${TDARR_PORT}"
|
|
- "HOMEPAGE_VAR_HOMEPAGE_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${HOMEPAGE_PORT}"
|
|
- "HOMEPAGE_VAR_GLANCES_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${GLANCES_PORT}"
|
|
- "HOMEPAGE_VAR_SEERR_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${SEERR_PORT}"
|
|
- "HOMEPAGE_VAR_OPENWEBUI_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${OPENWEBUI_PORT}"
|
|
- "HOMEPAGE_VAR_PIHOLE_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${PIHOLE_PORT}"
|
|
- "HOMEPAGE_VAR_PORTAINER_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${PORTAINER_PORT}"
|
|
- "HOMEPAGE_VAR_SCRUTINY_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${SCRUTINY_PORT}"
|
|
- "HOMEPAGE_VAR_KARAKEEP_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${KARAKEEP_PORT}"
|
|
- "HOMEPAGE_VAR_VLLM_HOST=${WEB_PROTOCOL}://${SERVER_NAME}:${VLLM_PORT}"
|
|
- TZ=${TIMEZONE}
|
|
security_opt:
|
|
- no-new-privileges:true
|
|
mem_limit: 256m
|
|
cpus: 1
|
|
# extra_hosts:
|
|
# - "host.docker.internal:${LOCAL_IPV4}"
|
|
restart: unless-stopped
|
|
# ---------------------------------------------------------------------------
|
|
|
|
# Edge
|
|
# ---------------------------------------------------------------------------
|
|
|
|
cloudflared:
|
|
image: cloudflare/cloudflared:latest
|
|
container_name: cloudflared
|
|
env_file:
|
|
- ./env/.cloudflared.env
|
|
command: tunnel --no-autoupdate run # --token ${CLOUDFLARED_KEY}
|
|
security_opt:
|
|
- no-new-privileges:true
|
|
read_only: true
|
|
mem_limit: 128m
|
|
cpus: 0.5
|
|
restart: always
|
|
|
|
caddy:
|
|
image: ${CADDY_IMAGE}
|
|
container_name: caddy
|
|
#networks:
|
|
# - caddy_net
|
|
ports:
|
|
- 82:80
|
|
- 444:443
|
|
volumes:
|
|
- ./caddy/Caddyfile:/etc/caddy/Caddyfile
|
|
- ./caddy/site:/srv
|
|
- ./caddy/caddy_data:/data
|
|
- ./caddy/caddy_config:/config
|
|
#- /etc/localtime:/etc/localtime:ro
|
|
#- /etc/timezone:/etc/timezone:ro
|
|
environment:
|
|
- TZ=${TIMEZONE}
|
|
security_opt:
|
|
- no-new-privileges:true
|
|
mem_limit: 128m
|
|
cpus: 0.5
|
|
restart: unless-stopped
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
# Web & AI
|
|
# ---------------------------------------------------------------------------
|
|
|
|
openwebui:
|
|
image: ghcr.io/open-webui/open-webui:main-slim
|
|
container_name: openwebui
|
|
ports:
|
|
- "7001:8080"
|
|
volumes:
|
|
- ./openwebui:/app/backend/data
|
|
mem_limit: 1g
|
|
cpus: 1.0
|
|
|
|
searxng:
|
|
image: ${SEARXNG_IMAGE}
|
|
container_name: searxng
|
|
ports:
|
|
- "5080:8080"
|
|
volumes:
|
|
- ./searxng:/etc/searxng
|
|
environment:
|
|
- SEARXNG_SECRET=abcd
|
|
restart: unless-stopped
|
|
|
|
vllm:
|
|
image: vllm/vllm-openai-xpu@sha256:f01e24f6c7ff01f1e0662234255a1372297d1dbd89d003cf13c8fad3eab1ba4f
|
|
container_name: vllm
|
|
network_mode: host
|
|
ipc: host
|
|
privileged: true
|
|
devices:
|
|
- "/dev/dri:/dev/dri"
|
|
volumes:
|
|
- ~/llm/huggingface:/root/.cache/huggingface
|
|
- ~/llm/:/llm/
|
|
- ./vllm/xpu-patches:/patches/:ro
|
|
environment:
|
|
- "HUGGING_FACE_HUB_TOKEN=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"
|
|
- "SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1"
|
|
- "ZES_ENABLE_SYSMAN=1"
|
|
- "ONEAPI_DEVICE_SELECTOR=level_zero:0"
|
|
- "UR_L0_ENABLE_RELAXED_ALLOCATION_LIMITS=1"
|
|
- "VLLM_XPU_ENABLE_XPU_GRAPH=1"
|
|
- "VLLM_ALLOW_LONG_MAX_MODEL_LEN=1"
|
|
- "VLLM_WORKER-MULTIPROC_METHOD=spawn"
|
|
- "VLLM_TARGET_DEVICE=xpu"
|
|
- "ZE_FLAT_DEVICE_HIERARCHY=COMPOSITE"
|
|
- "ZE_AFFINITY_MASK=0"
|
|
- "B70_MTP_BF16_DRAFT=1"
|
|
- "B70_DRAFT_LMHEAD_INT4=1"
|
|
- "B70_DRAFT_MTP_INT4=1"
|
|
- "PYTORCH_ALLOC_CONF=expandable_segments:True"
|
|
entrypoint: ["/bin/bash", "-lc"]
|
|
command:
|
|
- |
|
|
set -e
|
|
python /patches/patch_mtp_nightly.py
|
|
python /patches/patch_mtp_boundary.py
|
|
python /patches/patch_gdn_mixed_split_v5.py
|
|
python /patches/patch_draft_lmhead_int4.py
|
|
python /patches/patch_draft_mtp_int4.py
|
|
exec vllm serve /llm/Qwen3.8-27B-GPTQINT4-G128-MTP-BF16 \
|
|
--quantization gptq \
|
|
--dtype float16 \
|
|
--max-model-len 131072 \
|
|
--gpu-memory-utilization 0.88 \
|
|
--kv-cache-dtype fp8 \
|
|
--port 5081 \
|
|
--max-num-seqs 64 \
|
|
--block-size 64 \
|
|
--max-num-batched-tokens 8192 \
|
|
--served-model-name 'Qwen3.8' \
|
|
--language-model-only \
|
|
--speculative-config '{"method":"mtp","num_speculative_tokens":4}' \
|
|
--reasoning-parser qwen3 \
|
|
--tool-call-parser qwen3_coder \
|
|
--default-chat-template-kwargs '{"enable_thinking": false, "reasoning_effort": "medium", "reasoning_preserve": "true"}' \
|
|
--enable-auto-tool-choice \
|
|
--disable-sliding-window \
|
|
--enable-prefix-caching \
|
|
--enable-chunked-prefill
|
|
restart: on-failure:5
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Karakeep
|
|
# ---------------------------------------------------------------------------
|
|
|
|
karakeep:
|
|
image: ghcr.io/karakeep-app/karakeep:${KARAKEEP_VERSION:-release}
|
|
container_name: karakeep
|
|
env_file:
|
|
- ./env/.karakeep.env
|
|
ports:
|
|
- ${KARAKEEP_PORT}:3000 # must be 3000 as per the dev
|
|
volumes:
|
|
- ./karakeep-data:/data
|
|
#- /etc/localtime:/etc/localtime:ro
|
|
#- /etc/timezone:/etc/timezone:ro
|
|
environment:
|
|
- MEILI_ADDR=http://meilisearch:${MEILI_PORT}
|
|
- BROWSER_WEB_URL=http://chrome:${KARAKEEP_CHROME_PORT}
|
|
- DATA_DIR=/data
|
|
security_opt:
|
|
- no-new-privileges:true
|
|
mem_limit: 512m
|
|
cpus: 1.0
|
|
restart: unless-stopped
|
|
|
|
chrome:
|
|
image: zenika/alpine-chrome:124
|
|
container_name: karakeep-chromebrowser
|
|
command:
|
|
- --no-sandbox
|
|
- --disable-gpu
|
|
- --disable-dev-shm-usage
|
|
- --remote-debugging-address=0.0.0.0
|
|
- --remote-debugging-port=${KARAKEEP_CHROME_PORT}
|
|
- --hide-scrollbars
|
|
- --disable-blink-features=AutomationControlled
|
|
- --window-size=1440,900
|
|
security_opt:
|
|
- no-new-privileges:true
|
|
mem_limit: 1g
|
|
cpus: 1.0
|
|
restart: unless-stopped
|
|
|
|
meilisearch:
|
|
image: getmeili/meilisearch:v1.41.0
|
|
container_name: karakeep-meilisearch
|
|
env_file:
|
|
- .env
|
|
volumes:
|
|
- ./meilisearch:/meili_data
|
|
#- /etc/localtime:/etc/localtime:ro
|
|
#- /etc/timezone:/etc/timezone:ro
|
|
environment:
|
|
- MEILI_NO_ANALYTICS=true
|
|
security_opt:
|
|
- no-new-privileges:true
|
|
mem_limit: 512m
|
|
cpus: 1.0
|
|
restart: no
|