services: open-webui: image: ghcr.io/open-webui/open-webui:main entrypoint: - /bin/bash - /app/tools/startup.sh healthcheck: test: - CMD - curl - -f - http://localhost:8080/health interval: 30s timeout: 10s retries: 3 start_period: 60s environment: - OLLAMA_BASE_URL=http://ollama-intel-arc:11434 - WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY} - WEBUI_DB_HOST=postgresql - DATABASE_URL=${OPEN_WEBUI_DATABASE_URL} - ENABLE_TOOL_SERVER_CALLING=true - TOOL_SERVER_CALLING=true - WEBUI_URL=${WEBUI_URL} - ENABLE_OAUTH_SIGNUP=${ENABLE_OAUTH_SIGNUP} - OAUTH_MERGE_ACCOUNTS_BY_EMAIL=${OAUTH_MERGE_ACCOUNTS_BY_EMAIL} - OAUTH_PROVIDER_NAME=${OAUTH_PROVIDER_NAME} - OPENID_PROVIDER_URL=${OPENID_PROVIDER_URL} - OAUTH_CLIENT_ID=${OAUTH_CLIENT_ID} - OAUTH_CLIENT_SECRET=${OAUTH_CLIENT_SECRET} - OAUTH_SCOPES=${OAUTH_SCOPES} - OPENID_REDIRECT_URI=${OPENID_REDIRECT_URI} networks: - traefik_backend - postgresql_db-backend extra_hosts: - host.docker.internal:host-gateway volumes: - /volume1/docker/open-webui/data:/app/backend/data - /volume1/docker/open-webui/startup.sh:/app/tools/startup.sh stop_grace_period: 120s deploy: replicas: 2 placement: max_replicas_per_node: 1 labels: - traefik.enable=true - traefik.http.routers.open-webui.rule=Host(`ai.bryanmail.net`) - traefik.http.routers.open-webui.tls=true - traefik.http.routers.open-webui.tls.certresolver=letsencrypt - traefik.http.routers.open-webui.entrypoints=websecure - traefik.http.services.open-webui.loadbalancer.server.port=8080 - traefik.http.services.open-webui.loadbalancer.server.scheme=http - traefik.http.services.open-webui.loadbalancer.sticky.cookie=true - traefik.http.services.open-webui.loadbalancer.sticky.cookie.name=owui_sticky - traefik.http.services.open-webui.loadbalancer.sticky.cookie.secure=true - traefik.http.services.open-webui.loadbalancer.sticky.cookie.httponly=true - traefik.swarm.network=traefik_backend litellm: image: docker.litellm.ai/berriai/litellm-database:v1.90.3 #main-latest command: --config /app/config.yaml --port 4000 environment: - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} - AWS_REGION_NAME=${AWS_REGION_NAME} - LITELLM_MASTER_KEY=${LITELLM_MASTER_KEY} - LITELLM_SALT_KEY=${LITELLM_SALT_KEY} - DATABASE_URL=${DATABASE_URL} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - LITELLM_MODIFY_PARAMS=${LITELLM_MODIFY_PARAMS} networks: - traefik_backend - postgresql_db-backend # ports: # - target: 4000 # published: 4000 # protocol: tcp # mode: ingress volumes: - type: bind source: /volume1/docker/litellm/app/config.yaml target: /app/config.yaml read_only: true deploy: labels: - traefik.enable=true - traefik.http.routers.litellm.rule=Host(`llm.bryanmail.net`) - traefik.http.routers.litellm.tls=true - traefik.http.routers.litellm.tls.certresolver=letsencrypt - traefik.http.routers.litellm.entrypoints=websecure - traefik.http.services.litellm.loadbalancer.server.port=4000 - traefik.http.services.litellm.loadbalancer.server.scheme=http - traefik.swarm.network=traefik_backend - traefik.http.routers.litellm.middlewares=forwardAuth-authentik@file, crowdsec@file, litellm-headers - traefik.http.middlewares.litellm-headers.headers.customrequestheaders.X-Forwarded-For= - traefik.http.middlewares.litellm-headers.headers.customrequestheaders.X-Forwarded-Host= - traefik.http.middlewares.litellm-headers.headers.customrequestheaders.X-Forwarded-Proto= - traefik.http.middlewares.litellm-headers.headers.customrequestheaders.X-Forwarded-Port= - traefik.http.middlewares.litellm-headers.headers.customrequestheaders.X-Real-Ip= update_config: parallelism: 1 delay: 15s failure_action: rollback searxng: image: searxng/searxng:latest environment: - SEARXNG_BASE_URL=http://searxng:8080 volumes: - /volume1/docker/searxng/etc/searxng:/etc/searxng networks: - traefik_backend mcpo-critical: #do not modify or Proxmox access will be lost image: ghcr.io/open-webui/mcpo:main command: - --config - /app/config/config.json - --api-key - ${MCPO_API_KEY} - --hot-reload environment: - PROXMOX_ALLOW_UNSAFE_COMMANDS=false #true volumes: - /volume1/docker/mcpo/config-critical.json:/app/config/config.json:ro - /volume1/docker/mcpo/data:/mcpo_data - /volume1/docker/cronicle/ssh_keys:/app/ssh_keys:ro # - /volume1/docker/mcpo/teams-mcp-auth:/app/teams-mcp-auth - /volume1/docker/mcpo/uv-cache:/app/uv-cache networks: - traefik_backend deploy: labels: - traefik.enable=false # - traefik.http.routers.mcp.rule=Host(`mcpc.bryanmail.net`) # - traefik.http.routers.mcp.tls=true # - traefik.http.routers.mcp.tls.certresolver=letsencrypt # - traefik.http.routers.mcp.entrypoints=websecure # - traefik.http.services.mcp.loadbalancer.server.port=8000 # - traefik.http.services.mcp.loadbalancer.server.scheme=http # - traefik.http.routers.mcp.middlewares=forwardAuth-authentik@file, crowdsec@file # - traefik.swarm.network=traefik_backend mcpo: image: ghcr.io/open-webui/mcpo:main command: - --config - /app/config/config.json - --api-key - ${MCPO_API_KEY} - --hot-reload environment: - PROXMOX_ALLOW_UNSAFE_COMMANDS=true volumes: - /volume1/docker/mcpo/config.json:/app/config/config.json:ro - /volume1/docker/mcpo/data:/mcpo_data - /volume1/docker/cronicle/ssh_keys:/app/ssh_keys:ro # - /volume1/docker/mcpo/teams-mcp-auth:/app/teams-mcp-auth - /volume1/docker/mcpo/uv-cache:/app/uv-cache networks: - traefik_backend deploy: labels: - traefik.enable=false # - traefik.http.routers.mcp.rule=Host(`mcp.bryanmail.net`) # - traefik.http.routers.mcp.tls=true # - traefik.http.routers.mcp.tls.certresolver=letsencrypt # - traefik.http.routers.mcp.entrypoints=websecure # - traefik.http.services.mcp.loadbalancer.server.port=8000 # - traefik.http.services.mcp.loadbalancer.server.scheme=http # - traefik.http.routers.mcp.middlewares=forwardAuth-authentik@file, crowdsec@file # - traefik.swarm.network=traefik_backend n8n: image: docker.n8n.io/n8nio/n8n networks: - traefik_backend - postgresql_db-backend # ports: # - 5678:5678 volumes: - /volume1/docker/n8n/data:/home/node/.n8n - /volume1/docker/n8n/files:/files deploy: labels: - traefik.enable=true - traefik.http.routers.n8n.rule=Host(`agent.bryanmail.net`) - traefik.http.routers.n8n.tls=true - traefik.http.routers.n8n.tls.certresolver=letsencrypt - traefik.http.routers.n8n.entrypoints=websecure - traefik.http.services.n8n.loadbalancer.server.port=5678 - traefik.http.services.n8n.loadbalancer.server.scheme=http - traefik.http.middlewares.n8n.headers.SSLRedirect=true - traefik.http.middlewares.n8n.headers.STSSeconds=315360000 - traefik.http.middlewares.n8n.headers.browserXSSFilter=true - traefik.http.middlewares.n8n.headers.contentTypeNosniff=true - traefik.http.middlewares.n8n.headers.forceSTSHeader=true - traefik.http.middlewares.n8n.headers.SSLHost=${DOMAIN_NAME} - traefik.http.middlewares.n8n.headers.STSIncludeSubdomains=true - traefik.http.middlewares.n8n.headers.STSPreload=true - traefik.http.routers.n8n.middlewares=forwardAuth-authentik@file, crowdsec@file - traefik.swarm.network=traefik_backend networks: traefik_backend: external: true postgresql_db-backend: external: true