| services: |
| proxy: |
| image: traefik:v3.0 |
| env_file: |
| - .env |
| networks: |
| - ${TRAEFIK_PUBLIC_NETWORK?Variable not set} |
| - default |
| volumes: |
| - /var/run/docker.sock:/var/run/docker.sock |
| command: |
| |
| - --providers.docker |
| |
| |
| - --providers.docker.constraints=Label(`traefik.constraint-label-stack`, `${TRAEFIK_TAG?Variable not set}`) |
| |
| - --providers.docker.exposedbydefault=false |
| |
| - --accesslog |
| |
| - --log |
| |
| - --api |
| deploy: |
| placement: |
| constraints: |
| - node.role == manager |
| labels: |
| |
| - traefik.enable=true |
| |
| - traefik.docker.network=${TRAEFIK_PUBLIC_NETWORK?Variable not set} |
| |
| |
| - traefik.constraint-label=${TRAEFIK_PUBLIC_TAG?Variable not set} |
| |
| - traefik.http.middlewares.${STACK_NAME?Variable not set}-https-redirect.redirectscheme.scheme=https |
| - traefik.http.middlewares.${STACK_NAME?Variable not set}-https-redirect.redirectscheme.permanent=true |
| |
| |
| |
| |
| - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-http.rule=Host(`${DOMAIN?Variable not set}`) || Host(`www.${DOMAIN?Variable not set}`) |
| - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-http.entrypoints=http |
| |
| - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.rule=Host(`${DOMAIN?Variable not set}`) || Host(`www.${DOMAIN?Variable not set}`) |
| - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.entrypoints=https |
| - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.tls=true |
| |
| - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.tls.certresolver=le |
| |
| - traefik.http.services.${STACK_NAME?Variable not set}-proxy.loadbalancer.server.port=80 |
| |
| |
| - traefik.http.middlewares.${STACK_NAME?Variable not set}-www-redirect.redirectregex.regex=^https?://(www.)?(${DOMAIN?Variable not set})/(.*) |
| |
| |
| - traefik.http.middlewares.${STACK_NAME?Variable not set}-www-redirect.redirectregex.replacement=https://${DOMAIN?Variable not set}/$${3} |
| |
| |
| |
| |
| - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.middlewares=${STACK_NAME?Variable not set}-www-redirect |
| |
| |
| - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-http.middlewares=${STACK_NAME?Variable not set}-www-redirect,${STACK_NAME?Variable not set}-https-redirect |
|
|
| backend: &backend |
| image: "langflowai/langflow-backend:latest" |
| depends_on: |
| - db |
| - broker |
| - result_backend |
| env_file: |
| - .env |
| healthcheck: |
| test: "exit 0" |
| deploy: |
| labels: |
| - traefik.enable=true |
| - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set} |
| - traefik.http.routers.${STACK_NAME?Variable not set}-backend-http.rule=PathPrefix(`/api/v1`) || PathPrefix(`/docs`) || PathPrefix(`/health`) |
| - traefik.http.services.${STACK_NAME?Variable not set}-backend.loadbalancer.server.port=7860 |
|
|
| db: |
| image: postgres:15.4 |
| volumes: |
| - app-db-data:/var/lib/postgresql/data/pgdata |
| environment: |
| - PGDATA=/var/lib/postgresql/data/pgdata |
| deploy: |
| placement: |
| constraints: |
| - node.labels.app-db-data == true |
| healthcheck: |
| test: "exit 0" |
| env_file: |
| - .env |
|
|
| pgadmin: |
| image: dpage/pgadmin4 |
| networks: |
| - ${TRAEFIK_PUBLIC_NETWORK?Variable not set} |
| - default |
| volumes: |
| - pgadmin-data:/var/lib/pgadmin |
| env_file: |
| - .env |
| deploy: |
| labels: |
| - traefik.enable=true |
| - traefik.docker.network=${TRAEFIK_PUBLIC_NETWORK?Variable not set} |
| - traefik.constraint-label=${TRAEFIK_PUBLIC_TAG?Variable not set} |
| - traefik.http.routers.${STACK_NAME?Variable not set}-pgadmin-http.rule=Host(`pgadmin.${DOMAIN?Variable not set}`) |
| - traefik.http.routers.${STACK_NAME?Variable not set}-pgadmin-http.entrypoints=http |
| - traefik.http.routers.${STACK_NAME?Variable not set}-pgadmin-http.middlewares=${STACK_NAME?Variable not set}-https-redirect |
| - traefik.http.routers.${STACK_NAME?Variable not set}-pgadmin-https.rule=Host(`pgadmin.${DOMAIN?Variable not set}`) |
| - traefik.http.routers.${STACK_NAME?Variable not set}-pgadmin-https.entrypoints=https |
| - traefik.http.routers.${STACK_NAME?Variable not set}-pgadmin-https.tls=true |
| - traefik.http.routers.${STACK_NAME?Variable not set}-pgadmin-https.tls.certresolver=le |
| - traefik.http.services.${STACK_NAME?Variable not set}-pgadmin.loadbalancer.server.port=5050 |
|
|
| result_backend: |
| image: redis:6.2.5 |
| env_file: |
| - .env |
| ports: |
| - 6379:6379 |
| healthcheck: |
| test: "exit 0" |
|
|
| celeryworker: |
| <<: *backend |
| env_file: |
| - .env |
| command: /bin/sh -c "python -m celery -A langflow.worker.celery_app worker --loglevel=INFO --concurrency=1 -n lf-worker@%h -P eventlet" |
| healthcheck: |
| test: "exit 0" |
| deploy: |
| replicas: 1 |
|
|
| flower: |
| <<: *backend |
| env_file: |
| - .env |
| networks: |
| - default |
| environment: |
| - FLOWER_PORT=5555 |
|
|
| command: /bin/sh -c "python -m celery -A langflow.worker.celery_app --broker=${BROKER_URL?Variable not set} flower --port=5555" |
| deploy: |
| labels: |
| - traefik.enable=true |
| - traefik.docker.network=${TRAEFIK_PUBLIC_NETWORK?Variable not set} |
| - traefik.constraint-label=${TRAEFIK_PUBLIC_TAG?Variable not set} |
| - traefik.http.routers.${STACK_NAME?Variable not set}-flower-http.rule=Host(`flower.${DOMAIN?Variable not set}`) |
| - traefik.http.routers.${STACK_NAME?Variable not set}-flower-http.entrypoints=http |
| - traefik.http.routers.${STACK_NAME?Variable not set}-flower-http.middlewares=${STACK_NAME?Variable not set}-https-redirect |
| - traefik.http.routers.${STACK_NAME?Variable not set}-flower-https.rule=Host(`flower.${DOMAIN?Variable not set}`) |
| - traefik.http.routers.${STACK_NAME?Variable not set}-flower-https.entrypoints=https |
| - traefik.http.routers.${STACK_NAME?Variable not set}-flower-https.tls=true |
| - traefik.http.routers.${STACK_NAME?Variable not set}-flower-https.tls.certresolver=le |
| - traefik.http.services.${STACK_NAME?Variable not set}-flower.loadbalancer.server.port=5555 |
|
|
| frontend: |
| image: "langflowai/langflow-frontend:latest" |
| env_file: |
| - .env |
| restart: on-failure |
| deploy: |
| labels: |
| - traefik.enable=true |
| - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set} |
| - traefik.http.routers.${STACK_NAME?Variable not set}-frontend-http.rule=PathPrefix(`/`) |
| - traefik.http.services.${STACK_NAME?Variable not set}-frontend.loadbalancer.server.port=80 |
|
|
| broker: |
| |
| image: rabbitmq:3-management |
| environment: |
| - RABBITMQ_DEFAULT_USER=${RABBITMQ_DEFAULT_USER:-admin} |
| - RABBITMQ_DEFAULT_PASS=${RABBITMQ_DEFAULT_PASS:-admin} |
| volumes: |
| - rabbitmq_data:/etc/rabbitmq/ |
| - rabbitmq_data:/var/lib/rabbitmq/ |
| - rabbitmq_log:/var/log/rabbitmq/ |
| ports: |
| - 5672:5672 |
| - 15672:15672 |
|
|
| prometheus: |
| image: prom/prometheus:v2.37.9 |
| env_file: |
| - .env |
| volumes: |
| - ./prometheus.yml:/etc/prometheus/prometheus.yml |
| command: |
| - "--config.file=/etc/prometheus/prometheus.yml" |
| |
| |
| healthcheck: |
| test: "exit 0" |
| deploy: |
| labels: |
| - traefik.enable=true |
| - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set} |
| - traefik.http.routers.${STACK_NAME?Variable not set}-prometheus-http.rule=PathPrefix(`/metrics`) |
| - traefik.http.services.${STACK_NAME?Variable not set}-prometheus.loadbalancer.server.port=9090 |
|
|
| grafana: |
| image: grafana/grafana:8.2.6 |
| env_file: |
| - .env |
| |
| |
| volumes: |
| - grafana_data:/var/lib/grafana |
| deploy: |
| labels: |
| - traefik.enable=true |
| - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set} |
| - traefik.http.routers.${STACK_NAME?Variable not set}-grafana-http.rule=PathPrefix(`/grafana`) |
| - traefik.http.services.${STACK_NAME?Variable not set}-grafana.loadbalancer.server.port=3000 |
|
|
| volumes: |
| grafana_data: |
| app-db-data: |
| rabbitmq_data: |
| rabbitmq_log: |
| pgadmin-data: |
|
|
| networks: |
| traefik-public: |
| |
| external: false |
|
|