<commit_before>version: "3.8"
services:
  proxy:
    restart: always
    image: traefik:v2.4
    networks:
      - "${TRAEFIK_PUBLIC_NETWORK?Variable not set}"
      - default
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command:
      # Entrypoint web is for HTTP
      - --entryPoints.web.address=:80
      # Enable Docker in Traefik, so that it reads labels from Docker services
      - --providers.docker
      # Add a constraint to only use services with the label for this stack
      # from the env var TRAEFIK_TAG
      - --providers.docker.constraints=Label(`traefik.constraint-label-stack`, `${TRAEFIK_TAG?Variable not set}`)
      # Do not expose all Docker services, only the ones explicitly exposed
      - --providers.docker.exposedbydefault=false
      # Enable Docker Swarm mode
      - --providers.docker.swarmmode
      # Enable the access log, with HTTP requests
      - --accesslog
      # Enable the Traefik log, for configurations and errors
      - --log
      # Enable the Dashboard and API
      - --api
    deploy:
      placement:
        constraints:
          - node.role == manager
      labels:
        # Enable Traefik for this service, to make it available in the public network
        - traefik.enable=true
        # Use the traefik-public network (declared below)
        - traefik.docker.network=${TRAEFIK_PUBLIC_NETWORK?Variable not set}
        # Use the custom label "traefik.constraint-label=traefik-public"
        # This public Traefik will only use services with this label
        - traefik.constraint-label=${TRAEFIK_PUBLIC_TAG?Variable not set}
        # Define the port inside of the Docker service to use
        - traefik.http.services.${STACK_NAME?Variable not set}-proxy.loadbalancer.server.port=80
        # Redirect all www to non-www on web (HTTP)
        - "traefik.http.routers.www-catchall.entrypoints=web"
        - "traefik.http.routers.www-catchall.rule=HostRegexp(`{host:(www\\.).+}`)"
        - "traefik.http.routers.www-catchall.tls=true"
        - "traefik.http.routers.www-catchall.middlewares=wwwtohttp"
        - "traefik.http.middlewares.wwwtohttp.redirectregex.regex=^http?://(?:www\\.)?(.+)"
        - "traefik.http.middlewares.wwwtohttp.redirectregex.replacement=http://$${1}"
        - "traefik.http.middlewares.wwwtohttp.redirectregex.permanent=false"

  db:
    restart: always
    image: postgres:12
    volumes:
      - app-db-data:/var/lib/postgresql/data
    env_file:
      - .env
    deploy:
      placement:
        constraints:
          - node.labels.${STACK_NAME?Variable not set}.app-db-data == true

  queue:
    restart: always
    image: rabbitmq:3
    # Using the below image instead is required to enable the "Broker" tab in the flower UI:
    # image: rabbitmq:3-management
    #

  backend:
    restart: always
    image: "${DOCKER_IMAGE_BACKEND?Variable not set}:${VERSION-latest}"
    depends_on:
      - db
    env_file:
      - .env
    environment:
      - VERSION=${VERSION}
      - VERSION_HASH=${VERSION_HASH}
      - SERVER_NAME=${DOMAIN?Variable not set}
      - SERVER_HOST=https://${DOMAIN?Variable not set}
      # Allow explicit env var override for tests
      - SMTP_HOST=${SMTP_HOST}
    build:
      context: ../
      dockerfile: ./grid/backend/backend.dockerfile
      target: "backend"
    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`) || PathPrefix(`/docs`) || PathPrefix(`/redoc`) # WARNING: this wont match /api/v1/syft/stream because of length
        - traefik.http.routers.${STACK_NAME?Variable not set}-backend-http.entrypoints=web
        - traefik.http.services.${STACK_NAME?Variable not set}-backend.loadbalancer.server.port=80

  backend_stream:
    restart: always
    image: "${DOCKER_IMAGE_BACKEND?Variable not set}:${VERSION-latest}"
    depends_on:
      - db
      - backend
    env_file:
      - .env
    environment:
      - VERSION=${VERSION}
      - VERSION_HASH=${VERSION_HASH}
      - SERVER_NAME=${DOMAIN?Variable not set}
      - SERVER_HOST=https://${DOMAIN?Variable not set}
      # Allow explicit env var override for tests
      - SMTP_HOST=${SMTP_HOST}
    command: "waitforit -address=http://backend:80/api/v1/syft/metadata -status=200 -timeout=600 -- /start.sh"
    build:
      context: ../
      dockerfile: ./grid/backend/backend.dockerfile
      target: "backend"
    deploy:
      labels:
        - traefik.enable=true
        - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set}
        - traefik.http.routers.${STACK_NAME?Variable not set}-backend-stream-http.rule=PathPrefix(`/api`) && PathPrefix(`/api/v1/syft/stream`) || PathPrefix(`/docs`) || PathPrefix(`/redoc`) # WARNING: this only matches /api/v1/syft/stream because of length
        - traefik.http.routers.${STACK_NAME?Variable not set}-backend-stream-http.entrypoints=web
        - traefik.http.services.${STACK_NAME?Variable not set}-backend-stream.loadbalancer.server.port=80

  celeryworker:
    restart: always
    image: "${DOCKER_IMAGE_BACKEND?Variable not set}:${VERSION-latest}"
    depends_on:
      - db
      - queue
    env_file:
      - .env
    environment:
      - VERSION=${VERSION}
      - VERSION_HASH=${VERSION_HASH}
      - SERVER_NAME=${DOMAIN?Variable not set}
      - SERVER_HOST=https://${DOMAIN?Variable not set}
      # Allow explicit env var override for tests
      - SMTP_HOST=${SMTP_HOST?Variable not set}
      - CELERY_WORKER=true
    build:
      context: ../
      dockerfile: ./grid/backend/backend.dockerfile
      target: "backend"

  frontend:
    restart: always
    image: "${DOCKER_IMAGE_FRONTEND?Variable not set}:${VERSION-latest}"
    build:
      context: ./frontend
      dockerfile: frontend.dockerfile
      target: "grid-ui-${FRONTEND_ENV-development}"
    environment:
      - VERSION=${VERSION}
      - VERSION_HASH=${VERSION_HASH}
    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.routers.${STACK_NAME?Variable not set}-frontend-http.entrypoints=web
        - traefik.http.services.${STACK_NAME?Variable not set}-frontend.loadbalancer.server.port=80

volumes:
  app-db-data:

networks:
  traefik-public:
    # Allow setting it to false for testing
    external: ${TRAEFIK_PUBLIC_NETWORK_IS_EXTERNAL-true}<commit_msg>revert: main compose changes not needed<commit_after>version: "3.8"
services:
  proxy:
    restart: always
    image: traefik:v2.4
    networks:
      - "${TRAEFIK_PUBLIC_NETWORK?Variable not set}"
      - default
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command:
      # Enable Docker in Traefik, so that it reads labels from Docker services
      - --providers.docker
      # Add a constraint to only use services with the label for this stack
      # from the env var TRAEFIK_TAG
      - --providers.docker.constraints=Label(`traefik.constraint-label-stack`, `${TRAEFIK_TAG?Variable not set}`)
      # Do not expose all Docker services, only the ones explicitly exposed
      - --providers.docker.exposedbydefault=false
      # Enable Docker Swarm mode
      - --providers.docker.swarmmode
      # Enable the access log, with HTTP requests
      - --accesslog
      # Enable the Traefik log, for configurations and errors
      - --log
      # Enable the Dashboard and API
      - --api
    deploy:
      placement:
        constraints:
          - node.role == manager
      labels:
        # Enable Traefik for this service, to make it available in the public network
        - traefik.enable=true
        # Use the traefik-public network (declared below)
        - traefik.docker.network=${TRAEFIK_PUBLIC_NETWORK?Variable not set}
        # Use the custom label "traefik.constraint-label=traefik-public"
        # This public Traefik will only use services with this label
        - traefik.constraint-label=${TRAEFIK_PUBLIC_TAG?Variable not set}
        # traefik-http set up only to use the middleware to redirect to https
        - 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
        # Handle host with and without "www" to redirect to only one of them
        # Uses environment variable DOMAIN
        # To disable www redirection remove the Host() you want to discard, here and
        # below for HTTPS
        - 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-https the actual router using HTTPS
        - 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
        # Use the "le" (Let's Encrypt) resolver created below
        - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.tls.certresolver=le
        # Define the port inside of the Docker service to use
        - traefik.http.services.${STACK_NAME?Variable not set}-proxy.loadbalancer.server.port=80
        # Handle domain with and without "www" to redirect to only one
        # To disable www redirection remove the next line
        - traefik.http.middlewares.${STACK_NAME?Variable not set}-www-redirect.redirectregex.regex=^https?://(www.)?(${DOMAIN?Variable not set})/(.*)
        # Redirect a domain with www to non-www
        # To disable it remove the next line
        - traefik.http.middlewares.${STACK_NAME?Variable not set}-www-redirect.redirectregex.replacement=https://${DOMAIN?Variable not set}/$${3}
        # Redirect a domain without www to www
        # To enable it remove the previous line and uncomment the next
        # - traefik.http.middlewares.${STACK_NAME}-www-redirect.redirectregex.replacement=https://www.${DOMAIN}/$${3}
        # Middleware to redirect www, to disable it remove the next line
        - traefik.http.routers.${STACK_NAME?Variable not set}-proxy-https.middlewares=${STACK_NAME?Variable not set}-www-redirect
        # Middleware to redirect www, and redirect HTTP to HTTPS
        # to disable www redirection remove the section: ${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

  db:
    restart: always
    image: postgres:12
    volumes:
      - app-db-data:/var/lib/postgresql/data
    env_file:
      - .env
    deploy:
      placement:
        constraints:
          - node.labels.${STACK_NAME?Variable not set}.app-db-data == true

  queue:
    restart: always
    image: rabbitmq:3
    # Using the below image instead is required to enable the "Broker" tab in the flower UI:
    # image: rabbitmq:3-management
    #

  backend:
    restart: always
    image: "${DOCKER_IMAGE_BACKEND?Variable not set}:${VERSION-latest}"
    depends_on:
      - db
    env_file:
      - .env
    environment:
      - VERSION=${VERSION}
      - VERSION_HASH=${VERSION_HASH}
      - SERVER_NAME=${DOMAIN?Variable not set}
      - SERVER_HOST=https://${DOMAIN?Variable not set}
      # Allow explicit env var override for tests
      - SMTP_HOST=${SMTP_HOST}
    build:
      context: ../
      dockerfile: ./grid/backend/backend.dockerfile
      target: "backend"
    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`) || PathPrefix(`/docs`) || PathPrefix(`/redoc`) # WARNING: this wont match /api/v1/syft/stream because of length
        - traefik.http.services.${STACK_NAME?Variable not set}-backend.loadbalancer.server.port=80

  backend_stream:
    restart: always
    image: "${DOCKER_IMAGE_BACKEND?Variable not set}:${VERSION-latest}"
    depends_on:
      - db
      - backend
    env_file:
      - .env
    environment:
      - VERSION=${VERSION}
      - VERSION_HASH=${VERSION_HASH}
      - SERVER_NAME=${DOMAIN?Variable not set}
      - SERVER_HOST=https://${DOMAIN?Variable not set}
      # Allow explicit env var override for tests
      - SMTP_HOST=${SMTP_HOST}
    command: "waitforit -address=http://backend:80/api/v1/syft/metadata -status=200 -timeout=600 -- /start.sh"
    build:
      context: ../
      dockerfile: ./grid/backend/backend.dockerfile
      target: "backend"
    deploy:
      labels:
        - traefik.enable=true
        - traefik.constraint-label-stack=${TRAEFIK_TAG?Variable not set}
        - traefik.http.routers.${STACK_NAME?Variable not set}-backend-stream-http.rule=PathPrefix(`/api`) && PathPrefix(`/api/v1/syft/stream`) || PathPrefix(`/docs`) || PathPrefix(`/redoc`) # WARNING: this only matches /api/v1/syft/stream because of length
        - traefik.http.services.${STACK_NAME?Variable not set}-backend-stream.loadbalancer.server.port=80

  celeryworker:
    restart: always
    image: "${DOCKER_IMAGE_BACKEND?Variable not set}:${VERSION-latest}"
    depends_on:
      - db
      - queue
    env_file:
      - .env
    environment:
      - VERSION=${VERSION}
      - VERSION_HASH=${VERSION_HASH}
      - SERVER_NAME=${DOMAIN?Variable not set}
      - SERVER_HOST=https://${DOMAIN?Variable not set}
      # Allow explicit env var override for tests
      - SMTP_HOST=${SMTP_HOST?Variable not set}
      - CELERY_WORKER=true
    build:
      context: ../
      dockerfile: ./grid/backend/backend.dockerfile
      target: "backend"

  frontend:
    restart: always
    image: "${DOCKER_IMAGE_FRONTEND?Variable not set}:${VERSION-latest}"
    build:
      context: ./frontend
      dockerfile: frontend.dockerfile
      target: "grid-ui-${FRONTEND_ENV-development}"
    environment:
      - VERSION=${VERSION}
      - VERSION_HASH=${VERSION_HASH}
    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

volumes:
  app-db-data:

networks:
  traefik-public:
    # Allow setting it to false for testing
    external: ${TRAEFIK_PUBLIC_NETWORK_IS_EXTERNAL-true}
{'fraction_non_alphanumeric': 0.11740618916560382, 'fraction_numerical': 0.004094784184735182, 'mean_word_length': 2.829820051413882, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 8, 'lorem ipsum': 0, 'www.': 31, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3845961', 'n_tokens_mistral': 4738, 'n_tokens_neox': 4677, 'n_words': 1011}