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: