DOCKER SWARM STACK TEMPLATE (docker

:information_source: INFORMATION

I am trying very on deploying a docker swarm stack using traefik to start using rasa & rasa x. Unfortunately, this process is very complicated and I feel I am missing some points.

I am trying to replicate the following guide: Providing an HA AI Assistant with Traefik + Rasa + Docker - YouTube

:keyboard: Input

VERSIONS

RASA_X_VERSION=0.32.0
RASA_VERSION=1.10.10
RASA_X_DEMO_VERSION=0.31.5

The current docker.template.yml template file is the following:

version: "3.4"

networks:
  web:
    external: true

x-database-credentials: &database-credentials
  DB_HOST: "db"
  DB_PORT: "5432"
  DB_USER: ${DB_USER:-admin}
  DB_PASSWORD: ${DB_PASSWORD}
  DB_LOGIN_DB: ${DB_LOGIN_DB:-rasa}

x-rabbitmq-credentials: &rabbitmq-credentials
  RABBITMQ_HOST: "rabbit"
  RABBITMQ_USERNAME: "user"
  RABBITMQ_PASSWORD: ${RABBITMQ_PASSWORD}
  
x-redis-credentials: &redis-credentials
  REDIS_HOST: ${REDIS_HOST}
  REDIS_PORT: "6379"
  REDIS_PASSWORD: ${REDIS_PASSWORD}
  REDIS_DB: "1"
  ALLOW_EMPTY_PASSWORD: "yes"

x-duckling-credentials: &duckling-credentials
  RASA_DUCKLING_HTTP_URL: "http://duckling:8000"

x-rasax-credentials: &rasax-credentials
  LOCAL_MODE: "false"
  RASA_X_HOST: "http://rasa-x:5002"
  RASA_X_TOKEN: ${RASA_X_TOKEN}
  JWT_SECRET: ${JWT_SECRET}
  RASA_USER_APP: "http://app:5055"
  RASA_PRODUCTION_HOST: "http://rasa-production:5005"
  RASA_WORKER_HOST: "http://rasa-worker:5005"
  RASA_TOKEN: ${RASA_TOKEN}
  RASA_WORKER_TOKEN: ${RASA_TOKEN}
  RASA_X_PASSWORD: ${RASA_X_PASSWORD}

x-rasa-credentials: &rasa-credentials
  <<: *rabbitmq-credentials
  <<: *rasax-credentials
  <<: *database-credentials
  <<: *redis-credentials
  <<: *duckling-credentials
  RASA_TOKEN: ${RASA_TOKEN}
  RASA_MODEL_PULL_INTERVAL: 10
  RABBITMQ_QUEUE: "rasa_production_events"

x-rasa-services: &default-rasa-service
  deploy:
    restart_policy:
      condition: on-failure
  image: "rasa/rasa:${RASA_VERSION}-full"
  command: >
    x
    --no-prompt
    --debug
    --production
    --config-endpoint http://rasa-x:5002/api/config?token=${RASA_X_TOKEN}
    --port 5005
    --jwt-method HS256
    --jwt-secret ${JWT_SECRET}
    --auth-token ${RASA_TOKEN}
    --cors "*"

services:
  redis:
    image: "bitnami/redis:5.0.5"
    networks:
      - default
    environment: 
      REDIS_HOST: ${REDIS_HOST}
      REDIS_PORT: "6379"
      REDIS_PASSWORD: ${REDIS_PASSWORD}
      REDIS_DB: "1"
      ALLOW_EMPTY_PASSWORD: "yes"
    volumes:
      - ./settings/redis:/data
    deploy:
      mode: global
      restart_policy:
        condition: on-failure
  rasa-x:
    networks:
      - default
    deploy:
      restart_policy:
        condition: on-failure
    image: "rasa/rasa-x:${RASA_X_VERSION}"
    volumes:
      - ./settings/models:/app/models
      - ./settings/environments.yml:/app/environments.yml
      - ./settings/credentials.yml:/app/credentials.yml
      - ./settings/endpoints.yml:/app/endpoints.yml
      - ./settings/logs:/logs
      - ./settings/auth:/app/auth
    environment:
      <<: *database-credentials
      <<: *rasa-credentials
      SELF_PORT: "5002"
      DB_DATABASE: "${DB_DATABASE:-rasa}"
      RASA_MODEL_DIR: "/app/models"
      RABBITMQ_QUEUE: "rasa_production_events"
      PASSWORD_SALT: ${PASSWORD_SALT}
      RASA_X_USER_ANALYTICS: "0"
      SANIC_RESPONSE_TIMEOUT: "3600"
      METRICS_CONSENT: ${METRICS_CONSENT}
      UUID: ${UUID:-''}

  rasa-production:
    networks:
      - default
    <<: *default-rasa-service
    environment:
      <<: *rasa-credentials
      DB_DATABASE: "tracker"
      RABBITMQ_QUEUE: "rasa_production_events"
      RASA_MODEL_SERVER: "http://rasa-x:5002/api/projects/default/models/tags/production"
      REDIS_HOST: ${REDIS_HOST}

  rasa-worker:
    networks:
      - default
    <<: *default-rasa-service
    environment:
      <<: *rasa-credentials
      DB_DATABASE: "worker_tracker"
      RABBITMQ_QUEUE: "rasa_worker_events"
      RASA_MODEL_SERVER: "http://rasa-x:5002/api/projects/default/models/tags/production"
      REDIS_HOST: ${REDIS_HOST}

  app:
    networks:
      - default
    deploy:
      restart_policy:
        condition: on-failure
    image: "rasa/rasa-x-demo:${RASA_X_DEMO_VERSION}"

  db:
    networks:
      - default
    deploy:
      restart_policy:
        condition: on-failure
    image: "bitnami/postgresql:11.2.0"
    environment:
      POSTGRESQL_USERNAME: "${DB_USER:-admin}"
      POSTGRESQL_PASSWORD: "${DB_PASSWORD}"
      POSTGRESQL_DATABASE: "${DB_DATABASE:-rasa}"
    volumes:
      - ./settings/db:/bitnami/postgresql

  rabbit:
    networks:
      - default
    deploy:
      restart_policy:
        condition: on-failure
    image: "bitnami/rabbitmq:3.7.17"
    environment:
      RABBITMQ_HOST: "rabbit"
      RABBITMQ_USERNAME: "user"
      RABBITMQ_PASSWORD: ${RABBITMQ_PASSWORD}
      RABBITMQ_DISK_FREE_LIMIT: "{mem_relative, 0.1}"

  duckling:
    networks:
      - default
    deploy:
      restart_policy:
        condition: on-failure
    image: "rasa/duckling:latest"
    command: ["duckling-example-exe", "--no-access-log", "--no-error-log"]

  nginx:
    image: "rasa/nginx:${RASA_X_VERSION}"
    networks:
      - web
      - default
    volumes:
      - ./settings/certs:/opt/bitnami/certs
      - ./settings/terms:/opt/bitnami/nginx/conf/bitnami/terms
    deploy:
      replicas: 1
      update_config:
        parallelism: 1
        failure_action: rollback
        delay: 1m
        order: start-first
      restart_policy:
        condition: on-failure
      labels:
        - traefik.enable=true
        - traefik.port=8080
        - traefik.entrypoints=https
        - traefik.docker.network=web
        - traefik.frontend.passHostHeader=true
        - traefik.frontend.rule=Host:${RASA_DOMAIN}
        - traefik.backend.loadbalancer.swarm=true
        - traefik.backend.loadbalancer.stickiness=false

The entire project is open-sourced at https://github.com/whiteyhat/Rasa-Docker-Swarm-Stack.

:scroll: Output

I am getting the following errors, but everything seems normal.

rasa-production service

 2020-08-23 16:26:41 DEBUG    rasa.cli.x  - Failed to get a proper response from remote server. Status Code: 401. Response: '{"reasons":["Authorization header not present."],"exception":"Unauthorized"}'

@stephens any help on this? I saw your reply on a similar thread recommending me Kubernetes on-line script, what I would love to keep my cloud stack in docker swarm for stack convention

I made it work by creating a user and setting up a password. But next problems are related to entities @stephens

Hi Carlos,

Need to see the logs from the rasa-production system. You should also setup a local Rasa install on your laptop connected to the same git repo as Rasa X. You’ll want to do training, testing and action server development locally. Rasa X can train but it won’t show you the training errors and it can’t run the tests you’ll want to run.

Greg