name: ultima networks: default: name: ultima_default services: audiomuse-ai-flask: container_name: audiomuse-ai-flask depends_on: audiomuse-ai-valkey: required: true condition: service_healthy audiomuse-ai-pg: required: true condition: service_healthy environment: AI_MODEL_PROVIDER: OLLAMA OLLAMA_SERVER_URL: http://ollama:11434/api/generate SERVICE_TYPE: "flask" MEDIASERVER_TYPE: "navidrome" AUDIOMUSE_AI_PG_PASSWORD: "pgEwBcxOlRJPlcuER98G1R1FWlDqdkUc" NAVIDROME_PASSWORD: "3MFiLK#JryTgXSxF5&W4&Y8H8zTancpZ" NAVIDROME_USERNAME: "admin" NAVIDROME_URL: http://192.168.1.254:4533/ POSTGRES_USER: audiomuse POSTGRES_PASSWORD: ${AUDIOMUSE_AI_PG_PASSWORD} POSTGRES_DB: audiomusedb POSTGRES_HOST: audiomuse-ai-pg POSTGRES_PORT: 5432 REDIS_URL: redis://audiomuse-ai-valkey:6379/0 TEMP_DIR: /app/temp_audio image: ghcr.io/neptunehub/audiomuse-ai:0.7.12-beta@sha256:a0ed658b75d66044e3884cbf94acf5e016d4898bac4d5f0f25929b066c3e5f9c ports: - 8000:8000 restart: unless-stopped volumes: - audiomuse-temp-audio-flask:/app/temp_audio audiomuse-ai-pg: container_name: audiomuse-ai-pg environment: POSTGRES_USER: audiomuse POSTGRES_PASSWORD: ${AUDIOMUSE_AI_PG_PASSWORD} POSTGRES_DB: audiomusedb expose: - 5432 healthcheck: test: ["CMD-SHELL", "pg_isready -U audiomuse -d audiomusedb"] interval: 10s retries: 5 start_period: 30s timeout: 10s image: postgres:15-alpine@sha256:09e4f20b14ddb3dfe3a0c825b206032aaf8f28300ba2070c0b60fc1c10c6abc7 restart: unless-stopped volumes: - audiomuse-ai-pg-data:/var/lib/postgresql/data audiomuse-ai-valkey: container_name: audiomuse-ai-valkey healthcheck: test: redis-cli ping || exit 1 image: docker.io/valkey/valkey:9-alpine@sha256:a35428eba9043cc0b79dbe54100f0c92784f2de00ad09b01182bfb1c5c83d1bd environment: ALLOW_EMPTY_PASSWORD: yes VALKEY_DATA_DIR: /data/valkey VALKEY_DATABASE: 0 expose: - 6379 restart: unless-stopped volumes: - audiomuse-ai-valkey-data:/data/valkey audiomuse-ai-worker: container_name: audiomuse-ai-worker depends_on: audiomuse-ai-valkey: required: true condition: service_healthy audiomuse-ai-pg: required: true condition: service_healthy environment: AI_MODEL_PROVIDER: OLLAMA OLLAMA_SERVER_URL: http://ollama:11434/api/generate SERVICE_TYPE: "worker" MEDIASERVER_TYPE: "navidrome" NAVIDROME_URL: http://192.168.1.254:4533/ NAVIDROME_USER: ${NAVIDROME_USERNAME} NAVIDROME_PASSWORD: ${NAVIDROME_PASSWORD} POSTGRES_USER: audiomuse POSTGRES_PASSWORD: ${AUDIOMUSE_AI_PG_PASSWORD} POSTGRES_DB: audiomusedb POSTGRES_HOST: audiomuse-ai-pg POSTGRES_PORT: 5432 REDIS_URL: "redis://audiomuse-ai-valkey:6379/0" TEMP_DIR: "/app/temp_audio" image: ghcr.io/neptunehub/audiomuse-ai:0.7.12-beta@sha256:a0ed658b75d66044e3884cbf94acf5e016d4898bac4d5f0f25929b066c3e5f9c restart: unless-stopped volumes: - audiomuse-temp-audio-worker:/app/temp_audio beszel-agent: container_name: beszel-agent environment: PORT: 45876 # Do not remove quotes around the key KEY: "${BESZEL_ULTIMA_AGENT_KEY}" TOKEN: ${BESZEL_ULTIMA_TOKEN} HUB_URL: http://192.168.1.254:22220 expose: - 45876 image: henrygd/beszel-agent:0.18.7@sha256:8874e2c53f9de5e063a6a80d6b617e20fa593ac5dc4eb4c6ce1f912f510f38f8 network_mode: host restart: unless-stopped volumes: - ${ULTIMA_DOCKER_DIR}/beszel-agent:/var/lib/beszel-agent - /var/run/docker.sock:/var/run/docker.sock:ro context7-mcp: container_name: context7-mcp expose: - 8080 image: mcp/context7:latest@sha256:1174e6a29634a83b2be93ac1fefabf63265f498c02c72201fe3464e687dd8836 restart: unless-stopped docker-socket-proxy: container_name: dockerproxy environment: AUTH: 1 BUILD: 1 COMMIT: 1 CONFIGS: 1 CONTAINERS: 1 DISTRIBUTION: 1 EVENTS: 1 EXEC: 1 GPRC: 1 IMAGES: 1 INFO: 1 NETWORKS: 1 NODES: 1 POST: 1 PLUGINS: 1 SERVICES: 1 SESSION: 1 SYSTEM: 1 TASKS: 1 VOLUMES: 1 LOG_LEVEL: debug image: ghcr.io/tecnativa/docker-socket-proxy:latest@sha256:1f3a6f303320723d199d2316a3e82b2e2685d86c275d5e3deeaf182573b47476 ports: - 2375:2375 privileged: true restart: unless-stopped volumes: - /var/run/docker.sock:/var/run/docker.sock faster-whisper: container_name: faster-whisper environment: PUID: ${PUID} PGID: ${PGID} TZ: ${TZ} WHISPER_MODEL: large LOCAL_ONLY: #optional WHISPER_BEAM: 1 #optional WHISPER_LANG: en #optional image: lscr.io/linuxserver/faster-whisper:latest@sha256:4c8de34e0876bbc59fc30cb8b29dbe4597b4f46c3effd3ee58aca8e56f39e924 ports: - "10300:10300" restart: unless-stopped volumes: - ${ULTIMA_DOCKER_DIR}/faster-whisper/:/config gitea-mcp: command: ["/app/gitea-mcp", "-t", "http", "--port", "8080", "-d"] container_name: gitea-mcp environment: GITEA_INSTANCE_URL: http://192.168.1.254:3013 GITEA_ACCESS_TOKEN: ${GITEA_ROOT_TOKEN} expose: - 8080 image: gitea/gitea-mcp-server:0.9.0@sha256:4add361130b2101d3027f2dd5ad2a08258dc3c45f9631030f5c3ca0a773df285 restart: unless-stopped meilisearch: container_name: meilisearch environment: MEILI_HOST: http://meilisearch:7700 MEILI_NO_ANALYTICS: true MEILI_MASTER_KEY: ${MEILISEARCH_MASTER_KEY} image: getmeili/meilisearch:v1.36@sha256:203a0854738be101bfdada825ac3cbf95e5681bc849757b6bc199e4cfae98faa ports: - 7700:7700 restart: always user: ${PUID}:${PGID} volumes: - ${ULTIMA_DOCKER_DIR}/meilisearch:/meili_data navidrome-mcp: container_name: navidrome-mcp image: git.trez.wtf/trez/navidrome-mcp:latest@sha256:4c98af82902471ae411126b0333370614c5d71ec8a2819a90fd2bdff2170ef05 expose: - 5000 environment: NAVIDROME_URL: "https://navi.trez.wtf" NAVIDROME_USERNAME: admin NAVIDROME_PASSWORD: ${NAVIDROME_PASSWORD} LASTFM_API_KEY: ${LASTFM_API_KEY} RADIO_BROWSER_USER_AGENT: "Navidrome-MCP/1.0" LYRICS_PROVIDER: "lrclib" LRCLIB_USER_AGENT: "Navidrome-MCP/1.0" # NAVIDROME_DEFAULT_LIBRARIES: "" restart: unless-stopped ollama: container_name: ollama # environment: image: ollama/ollama@sha256:05b6fe5143ed006d6d4abd39bdd575f962a5822bdf81e6fbb5e6894eb984ab9c ports: - 11434:11434 privileged: true restart: unless-stopped volumes: - ollama:/root/.ollama piper: container_name: piper environment: PUID: ${PUID} PGID: ${PGID} TZ: ${TZ} PIPER_VOICE: en_GB-jenny_dioco-medium LOCAL_ONLY: #optional PIPER_LENGTH: 1.0 #optional PIPER_NOISE: 0.667 #optional PIPER_NOISEW: 0.333 #optional PIPER_SPEAKER: 0 #optional NO_STREAMING: #optional image: lscr.io/linuxserver/piper:latest@sha256:98416835a07afc152b05f54faa4da4fc299cbed0cd940b0df603ba2e10125447 ports: - 10200:10200 restart: unless-stopped volumes: - ${ULTIMA_DOCKER_DIR}/piper/:/config portainer-agent: container_name: portainer_agent image: portainer/agent:latest@sha256:236246fc09b3e7e9269aad53e57ec71f27b7e114a2b6b70d4fd98c117ccc36d8 volumes: - /:/host - /var/lib/docker/volumes:/var/lib/docker/volumes - /var/run/docker.sock:/var/run/docker.sock restart: always ports: - 9001:9001 scanopy-daemon: container_name: scanopy-daemon environment: SCANOPY_LOG_LEVEL: debug SCANOPY_SERVER_URL: http://192.168.1.248:60072 SCANOPY_NETWORK_ID: ${SCANOPY_NETWORK_ID} SCANOPY_DAEMON_API_KEY: ${SCANOPY_DAEMON_API_KEY} SCANOPY_USER_ID: ${SCANOPY_USER_ID} SCANOPY_NAME: scanopy-daemon-tar-valon SCANOPY_MODE: daemon_poll healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:60073/api/health || exit 1"] interval: 5s timeout: 3s retries: 15 image: ghcr.io/scanopy/scanopy/daemon:latest@sha256:98cdba02b2b127462cba87c10dacdc5671354e2dd43a124b72f8cfd2dfb4b911 network_mode: host privileged: true restart: unless-stopped volumes: - scanopy-daemon-config:/root/.config/daemon - /var/run/docker.sock:/var/run/docker.sock:ro scanopy-pg: container_name: scanopy-pg environment: POSTGRES_DB: scanopy POSTGRES_USER: scanopy POSTGRES_PASSWORD: ${SCANOPY_PG_PASSWORD} expose: - 5432 healthcheck: test: ["CMD-SHELL", "pg_isready -U scanopy"] interval: 10s timeout: 5s retries: 5 image: postgres:17-alpine@sha256:979c4379dd698aba0b890599a6104e082035f98ef31d9b9291ec22f2b13059ca restart: unless-stopped volumes: - scanopy-pg-data:/var/lib/postgresql/data scanopy-server: container_name: scanopy-server image: ghcr.io/scanopy/scanopy/server:latest@sha256:e3c55cd639b9643c01e21c1fcc5470c6524ea5c3ac316768bf028737c656bbe6 depends_on: scanopy-pg: condition: service_healthy scanopy-daemon: condition: service_started environment: SCANOPY_LOG_LEVEL: debug SCANOPY_DATABASE_URL: postgresql://scanopy:${SCANOPY_PG_PASSWORD}@scanopy-pg:5432/scanopy SCANOPY_WEB_EXTERNAL_PATH: /app/static SCANOPY_PUBLIC_URL: http://192.168.1.248:60072 SCANOPY_INTEGRATED_DAEMON_URL: http://host.docker.internal:60073 SCANOPY_SMTP_RELAY: 192.168.1.254:25 SCANOPY_SMTP_USERNAME: ${POSTAL_SMTP_AUTH_USER} SCANOPY_SMTP_PASSWORD: ${POSTAL_SMTP_AUTH_PASSWORD} SCANOPY_SMTP_EMAIL: noreply@trez.wtf extra_hosts: - "host.docker.internal:host-gateway" ports: - 60072:60072 restart: unless-stopped volumes: - ${ULTIMA_DOCKER_DIR}/scanopy:/data scriberr: container_name: scriberr hostname: scriberr image: ghcr.io/rishikanthc/scriberr:v1.2.0@sha256:9e36448fb5a6003b28cd3d9ac783e8cbef5ed916936c20ec353a55fa380484f4 environment: PUID: ${PUID} PGID: ${PGID} APP_ENV: production # DO NOT CHANGE THIS ports: - 8080:8080 restart: unless-stopped volumes: - scriberr_data:/app/data # volume for data - scriberr_env_data:/app/whisperx-env # volume for models and python envs searxng-mcp: container_name: searxng-mcp environment: SEARXNG_URL: http://192.168.1.254:8095 MCP_HTTP_PORT: 3000 expose: - 3000 image: isokoliuk/mcp-searxng:latest@sha256:b467c34f4f0189629cde40abb7d56af0e75c32826777a1baaca27d3c9a2ba289 restart: unless-stopped stdin_open: true signoz-logspout: command: signoz://192.168.1.254:8082 container_name: signoz-logspout environment: ENV: prod SIGNOZ_LOG_ENDPOINT: http://192.168.1.254:8082 image: pavanputhra/logspout-signoz:2025.07.19-887dfeb@sha256:6da8ce12279a5262de8b2d5c083ce82d4c878c4eab702b4d328afe147ed7553b restart: unless-stopped volumes: - /var/run/docker.sock:/var/run/docker.sock signoz-mcp: container_name: signoz-mcp-server image: signoz/signoz-mcp-server:v0.0.5@sha256:e0b8fe3eee634e1c7a45470c734e50b19c74e065add73834519e37d89d7ce092 environment: SIGNOZ_URL: http://192.168.1.254:36113 SIGNOZ_API_KEY: ${SIGNOZ_API_KEY} TRANSPORT_MODE: http MCP_SERVER_PORT: 8000 LOG_LEVEL: info expose: - 8000 restart: unless-stopped stable-diffusion-webui: container_name: stable-diffusion-webui image: ghcr.io/neggles/sd-webui-docker:latest@sha256:1795fe796e1dad0d8d3baa9ef7c38a255b69c0878b76869feecc617bfd015e53 environment: CLI_ARGS: "--api --use-cpu all --precision full --no-half --skip-torch-cuda-test --ckpt /empty.pt --do-not-download-clip --disable-nan-check --disable-opt-split-attention" # will have to be changed for new hardware PYTHONUNBUFFERED: "1" TERM: "vt100" SD_WEBUI_VARIANT: "default" ports: - 7860:7860 restart: unless-stopped volumes: - ${ULTIMA_DOCKER_DIR}/stable-diffusion-webui/data:/data - ${ULTIMA_DOCKER_DIR}/stable-diffusion-webui/output:/output webui-mcpo: container_name: webui-mcpo image: masterno12/webui-mcpo:latest@sha256:018df5374c627ebeb82ea395a9c26f7439cf8a66c003608f390d09eecfc8db7d ports: - 18003:8000 restart: unless-stopped volumes: - ${ULTIMA_DOCKER_DIR}/mcpo:/opt/mcpo wikipedia-mcp: command: ["--transport", "sse", "--country", "US", "--enable-cache"] container_name: wikipedia-mcp expose: - 8000 image: mcp/wikipedia-mcp:latest@sha256:32ce608113696e8d6efc8bbfcc1ef4d52552a3543a3cd733427c6169767849d2 restart: unless-stopped volumes: audiomuse-ai-pg-data: name: audiomuse-ai-pg-data audiomuse-temp-audio-flask: name: audiomuse-temp-audio-flask audiomuse-ai-valkey-data: name: audiomuse-ai-valkey-data audiomuse-temp-audio-worker: name: audiomuse-temp-audio-worker ollama: name: ollama scanopy-daemon-config: name: scanopy-daemon-config scanopy-pg-data: name: scanopy-pg-data scriberr_data: name: scriberr_data scriberr_env_data: name: scriberr_env_data