Files
jarvis-home/compose.yaml
2026-08-29 17:02:35 +02:00

366 lines
12 KiB
YAML

x-skill-worker-env: &skill-worker-env
JARVIS_MASTER_URL: http://jarvis:8080
JARVIS_ENROLLMENT_TOKEN: ${JARVIS_MESH_ENROLLMENT_TOKEN:-change-this-enrollment-token}
JARVIS_WORKER_ADDR: :8090
JARVIS_SKILLS_DIR: /skills
JARVIS_WORKER_WORK_DIR: /work
JARVIS_WORKER_ALLOW_SYSTEM_EXEC: "true"
JARVIS_WORKER_MAX_OUTPUT_KB: 1024
TZ: Europe/Berlin
services:
jarvis:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
volumes:
- ./data:/app/data
- ./models:/models:ro
- ./local-tools:/tools:ro
- ./skills:/app/skills:ro
# Docker Engine control. This socket grants host-level Docker control;
# JARVIS only exposes start/stop/restart for explicitly labelled containers.
- /var/run/docker.sock:/var/run/docker.sock
environment:
JARVIS_ADDR: :8080
JARVIS_DATA: /app/data/store.json
JARVIS_RAG_DATA: /app/data/rag.json
JARVIS_WAKE_WORD: jarvis
JARVIS_TIMEZONE: Europe/Berlin
JARVIS_SKILLS_DIR: /app/skills
JARVIS_SKILLS_ENABLED: "true"
# External runtime code belongs in Skill Mesh workers by default.
JARVIS_SKILL_PROCESS_ENABLED: "false"
JARVIS_SKILL_ALLOW_SYSTEM_EXEC: "false"
JARVIS_SKILL_MAX_TIMEOUT_MS: 30000
JARVIS_SKILL_MAX_OUTPUT_KB: 1024
JARVIS_MESH_ENABLED: "true"
JARVIS_MESH_ENROLLMENT_TOKEN: ${JARVIS_MESH_ENROLLMENT_TOKEN:-change-this-enrollment-token}
JARVIS_MESH_LEASE_SECONDS: 30
JARVIS_MESH_INVOKE_TIMEOUT_MS: 30000
JARVIS_DOCKER_CONTROLLER_ENABLED: "true"
JARVIS_DOCKER_SOCKET: /var/run/docker.sock
JARVIS_DOCKER_SKILL_LABEL: com.jarvis.skill-service
JARVIS_DOCKER_SKILL_LABEL_VALUE: "true"
TZ: Europe/Berlin
OLLAMA_URL: http://ollama:11434
OLLAMA_MODEL: auto
OLLAMA_EMBED_MODEL: auto
TASK_SCOUT_INTERVAL: 2m
HOME_AUTOMATION_INTERVAL: 1m
KANBAN_AI_INTERVAL: 5m
JARVIS_DEBUG_TRACE: "true"
JARVIS_DEBUG_DIR: /app/data/debug
JARVIS_DEBUG_MAX_MB: 25
JARVIS_DEBUG_KEEP_FILES: 4
VOICE_FFMPEG_BIN: ffmpeg
VOICE_WHISPER_BIN: /usr/local/bin/whisper-cli
VOICE_WHISPER_MODEL: /models/ggml-small.bin
VOICE_LANGUAGE: de
VOICE_PIPER_BIN: /tools/piper
VOICE_PIPER_MODEL: /models/de_DE-thorsten-medium.onnx
LD_LIBRARY_PATH: /tools:/tools/lib
depends_on:
- ollama
ollama:
image: ollama/ollama:latest
ports:
- "11434:11434"
volumes:
- ollama-data:/root/.ollama
skill-python:
build:
context: .
dockerfile: workers/docker/Dockerfile.python
profiles: ["skill-workers"]
depends_on: [jarvis]
volumes: ["./skills/python:/skills:ro"]
environment:
<<: *skill-worker-env
JARVIS_WORKER_NAME: python-main
JARVIS_WORKER_RUNTIME: python
JARVIS_WORKER_RUNTIME_VERSION: "3.13"
JARVIS_WORKER_PUBLIC_URL: http://skill-python:8090
labels:
com.jarvis.skill-service: "true"
com.jarvis.skill-runtime: python
com.jarvis.worker-name: python-main
skill-node:
build:
context: .
dockerfile: workers/docker/Dockerfile.node
profiles: ["skill-workers"]
depends_on: [jarvis]
volumes: ["./skills/node:/skills:ro"]
environment:
<<: *skill-worker-env
JARVIS_WORKER_NAME: node-main
JARVIS_WORKER_RUNTIME: node
JARVIS_WORKER_RUNTIME_VERSION: "22"
JARVIS_WORKER_PUBLIC_URL: http://skill-node:8090
labels:
com.jarvis.skill-service: "true"
com.jarvis.skill-runtime: node
com.jarvis.worker-name: node-main
skill-go:
build:
context: .
dockerfile: workers/docker/Dockerfile.golang
profiles: ["skill-workers"]
depends_on: [jarvis]
volumes: ["./skills/go:/skills:ro"]
environment:
<<: *skill-worker-env
JARVIS_WORKER_NAME: go-main
JARVIS_WORKER_RUNTIME: go
JARVIS_WORKER_RUNTIME_VERSION: "1.23"
JARVIS_WORKER_PUBLIC_URL: http://skill-go:8090
labels:
com.jarvis.skill-service: "true"
com.jarvis.skill-runtime: go
com.jarvis.worker-name: go-main
skill-rust:
build:
context: .
dockerfile: workers/docker/Dockerfile.rust
profiles: ["skill-workers"]
depends_on: [jarvis]
volumes: ["./skills/rust:/skills:ro"]
environment:
<<: *skill-worker-env
JARVIS_WORKER_NAME: rust-main
JARVIS_WORKER_RUNTIME: rust
JARVIS_WORKER_RUNTIME_VERSION: stable
JARVIS_WORKER_PUBLIC_URL: http://skill-rust:8090
labels:
com.jarvis.skill-service: "true"
com.jarvis.skill-runtime: rust
com.jarvis.worker-name: rust-main
skill-c:
build:
context: .
dockerfile: workers/docker/Dockerfile.c
profiles: ["skill-workers"]
depends_on: [jarvis]
volumes: ["./skills/c:/skills:ro"]
environment:
<<: *skill-worker-env
JARVIS_WORKER_NAME: c-main
JARVIS_WORKER_RUNTIME: c
JARVIS_WORKER_RUNTIME_VERSION: gcc
JARVIS_WORKER_PUBLIC_URL: http://skill-c:8090
labels:
com.jarvis.skill-service: "true"
com.jarvis.skill-runtime: c
com.jarvis.worker-name: c-main
skill-cpp:
build:
context: .
dockerfile: workers/docker/Dockerfile.cpp
profiles: ["skill-workers"]
depends_on: [jarvis]
volumes: ["./skills/cpp:/skills:ro"]
environment:
<<: *skill-worker-env
JARVIS_WORKER_NAME: cpp-main
JARVIS_WORKER_RUNTIME: cpp
JARVIS_WORKER_RUNTIME_VERSION: g++
JARVIS_WORKER_PUBLIC_URL: http://skill-cpp:8090
labels:
com.jarvis.skill-service: "true"
com.jarvis.skill-runtime: cpp
com.jarvis.worker-name: cpp-main
skill-csharp:
build:
context: .
dockerfile: workers/docker/Dockerfile.csharp
profiles: ["skill-workers"]
depends_on: [jarvis]
volumes: ["./skills/csharp:/skills:ro"]
environment:
<<: *skill-worker-env
JARVIS_WORKER_NAME: csharp-main
JARVIS_WORKER_RUNTIME: csharp
JARVIS_WORKER_RUNTIME_VERSION: ".NET 8"
JARVIS_WORKER_PUBLIC_URL: http://skill-csharp:8090
labels:
com.jarvis.skill-service: "true"
com.jarvis.skill-runtime: csharp
com.jarvis.worker-name: csharp-main
# --- Home Control integration workers (1 container = 1 integration) ---
# Start all with: docker compose --profile home-skills up -d --build
skill-hue:
build:
context: .
dockerfile: workers/docker/Dockerfile.python
profiles: ["home-skills"]
depends_on: [jarvis]
volumes: ["./skills/python/philips-hue:/skills:ro"]
environment:
<<: *skill-worker-env
JARVIS_WORKER_NAME: hue
JARVIS_WORKER_RUNTIME: python
JARVIS_WORKER_RUNTIME_VERSION: "3.13"
JARVIS_WORKER_PUBLIC_URL: http://skill-hue:8090
HUE_BRIDGE_URL: ${HUE_BRIDGE_URL:-}
HUE_APP_KEY: ${HUE_APP_KEY:-}
HUE_VERIFY_TLS: ${HUE_VERIFY_TLS:-false}
labels:
com.jarvis.skill-service: "true"
com.jarvis.skill-runtime: python
com.jarvis.worker-name: hue
com.jarvis.integration: philips-hue
skill-unifi-network:
build:
context: .
dockerfile: workers/docker/Dockerfile.python
profiles: ["home-skills"]
depends_on: [jarvis]
volumes: ["./skills/python/unifi-network:/skills:ro"]
environment:
<<: *skill-worker-env
JARVIS_WORKER_NAME: unifi-network
JARVIS_WORKER_RUNTIME: python
JARVIS_WORKER_RUNTIME_VERSION: "3.13"
JARVIS_WORKER_PUBLIC_URL: http://skill-unifi-network:8090
UNIFI_NETWORK_URL: ${UNIFI_NETWORK_URL:-}
UNIFI_API_KEY: ${UNIFI_API_KEY:-}
UNIFI_VERIFY_TLS: ${UNIFI_VERIFY_TLS:-false}
labels:
com.jarvis.skill-service: "true"
com.jarvis.skill-runtime: python
com.jarvis.worker-name: unifi-network
com.jarvis.integration: unifi-network
skill-unifi-protect:
build:
context: .
dockerfile: workers/docker/Dockerfile.python
profiles: ["home-skills"]
depends_on: [jarvis]
volumes: ["./skills/python/unifi-protect:/skills:ro"]
environment:
<<: *skill-worker-env
JARVIS_WORKER_NAME: unifi-protect
JARVIS_WORKER_RUNTIME: python
JARVIS_WORKER_RUNTIME_VERSION: "3.13"
JARVIS_WORKER_PUBLIC_URL: http://skill-unifi-protect:8090
UNIFI_PROTECT_URL: ${UNIFI_PROTECT_URL:-}
UNIFI_API_KEY: ${UNIFI_API_KEY:-}
UNIFI_VERIFY_TLS: ${UNIFI_VERIFY_TLS:-false}
labels:
com.jarvis.skill-service: "true"
com.jarvis.skill-runtime: python
com.jarvis.worker-name: unifi-protect
com.jarvis.integration: unifi-protect
skill-proxmox:
build:
context: .
dockerfile: workers/docker/Dockerfile.python
profiles: ["home-skills"]
depends_on: [jarvis]
volumes: ["./skills/python/proxmox-ve:/skills:ro"]
environment:
<<: *skill-worker-env
JARVIS_WORKER_NAME: proxmox
JARVIS_WORKER_RUNTIME: python
JARVIS_WORKER_RUNTIME_VERSION: "3.13"
JARVIS_WORKER_PUBLIC_URL: http://skill-proxmox:8090
PROXMOX_BASE_URL: ${PROXMOX_BASE_URL:-}
PROXMOX_TOKEN_ID: ${PROXMOX_TOKEN_ID:-}
PROXMOX_TOKEN_SECRET: ${PROXMOX_TOKEN_SECRET:-}
PROXMOX_VERIFY_TLS: ${PROXMOX_VERIFY_TLS:-false}
labels:
com.jarvis.skill-service: "true"
com.jarvis.skill-runtime: python
com.jarvis.worker-name: proxmox
com.jarvis.integration: proxmox
skill-network-tools:
build:
context: .
dockerfile: workers/docker/Dockerfile.python
profiles: ["home-skills"]
depends_on: [jarvis]
volumes: ["./skills/python/network-tools:/skills:ro"]
environment:
<<: *skill-worker-env
JARVIS_WORKER_NAME: network-tools
JARVIS_WORKER_RUNTIME: python
JARVIS_WORKER_RUNTIME_VERSION: "3.13"
JARVIS_WORKER_PUBLIC_URL: http://skill-network-tools:8090
WOL_BROADCAST: ${WOL_BROADCAST:-255.255.255.255}
WOL_PORT: ${WOL_PORT:-9}
labels:
com.jarvis.skill-service: "true"
com.jarvis.skill-runtime: python
com.jarvis.worker-name: network-tools
com.jarvis.integration: network-tools
skill-ntfy:
build:
context: .
dockerfile: workers/docker/Dockerfile.python
profiles: ["home-skills"]
depends_on: [jarvis]
volumes: ["./skills/python/ntfy:/skills:ro"]
environment:
<<: *skill-worker-env
JARVIS_WORKER_NAME: ntfy
JARVIS_WORKER_RUNTIME: python
JARVIS_WORKER_RUNTIME_VERSION: "3.13"
JARVIS_WORKER_PUBLIC_URL: http://skill-ntfy:8090
NTFY_BASE_URL: ${NTFY_BASE_URL:-https://ntfy.sh}
NTFY_TOKEN: ${NTFY_TOKEN:-}
NTFY_DEFAULT_TOPIC: ${NTFY_DEFAULT_TOPIC:-}
NTFY_VERIFY_TLS: ${NTFY_VERIFY_TLS:-true}
labels:
com.jarvis.skill-service: "true"
com.jarvis.skill-runtime: python
com.jarvis.worker-name: ntfy
com.jarvis.integration: ntfy
# Dockge upstream does not currently expose a stable authenticated management
# API. This dedicated worker therefore operates on the same Compose stack
# directory and Docker Engine. It is intentionally isolated from the master.
skill-dockge:
build:
context: .
dockerfile: workers/docker/Dockerfile.dockge
profiles: ["home-skills"]
depends_on: [jarvis]
volumes:
- ./skills/python/dockge-compose:/skills:ro
- /var/run/docker.sock:/var/run/docker.sock
- ${DOCKGE_STACKS_DIR:-/opt/stacks}:${DOCKGE_STACKS_DIR:-/opt/stacks}:ro
environment:
<<: *skill-worker-env
JARVIS_WORKER_NAME: dockge
JARVIS_WORKER_RUNTIME: python-docker
JARVIS_WORKER_RUNTIME_VERSION: "3.13"
JARVIS_WORKER_PUBLIC_URL: http://skill-dockge:8090
DOCKGE_STACKS_DIR: ${DOCKGE_STACKS_DIR:-/opt/stacks}
DOCKGE_ALLOWED_STACKS: ${DOCKGE_ALLOWED_STACKS:-}
labels:
com.jarvis.skill-service: "true"
com.jarvis.skill-runtime: python-docker
com.jarvis.worker-name: dockge
com.jarvis.integration: dockge
volumes:
ollama-data: