--- a +++ b/production/docker-compose-build.yml @@ -0,0 +1,233 @@ +# In Compose Specification, version key is deprecated. +# Reference: https://github.com/compose-spec/compose-spec/blob/master/spec.md +#version: "3.9" +services: + # Build streamlit ui server + ui: + build: + context: ./ui-server + dockerfile: Dockerfile + # Choose image name + image: nabot-ui + # Don't start ui server before chatbot server + depends_on: + rasa: + condition: service_healthy + # Choose container name + container_name: ui-server + restart: always + # Make the same network for chatbot server and ui server + networks: + - frontend-network + # Mount .env file to the ui server to read chatbot URL + volumes: + - ./.env:/flask_server/.env + # Map TCP port 8501 in the container to port 80 on the Docker host. + # This is a chatbot rest api port + ports: + - 80:8501 + # Healthcheck condition + healthcheck: + test: ["CMD", "printf", ".", ">", "/dev/tcp/127.0.0.1/8501"] + interval: 30s + timeout: 10s + retries: 30 + # Build a monitoring server + monitoring: + build: + context: ./monitoring-server + dockerfile: Dockerfile + # Choose image name + image: monitoring-ui + # Don't start ui server before mysql server + depends_on: + rasa: + condition: service_healthy + # Choose container name + container_name: monitoring-server + restart: always + # Make the same network for chatbot server and ui server + networks: + - events-network + # Mount .env file to the ui server to read chatbot URL + volumes: + - ./.env:/monitoring_ui/.env + # Map TCP port 8501 in the container to port 80 on the Docker host. + # This is a chatbot rest api port + ports: + - 8501:8501 + # Healthcheck condition + healthcheck: + test: ["CMD", "printf", ".", ">", "/dev/tcp/127.0.0.1/8501"] + interval: 30s + timeout: 10s + retries: 30 + # Build chatbot server + rasa: + build: + context: ./rasa-server + dockerfile: Dockerfile + args: + # Pass model weights version as an argument + - VERSION=v0.1.0 + # Choose image name + image: rasa-server + # Don't start chatbot server before action server + depends_on: + app: + condition: service_healthy + # Choose container name + container_name: chatbot-server + restart: always + # Expose 5005 port to ui server can see the chatbot server + expose: + - 5005 + # Map TCP port 5005 in the container to port 5005 on the Docker host. + # This is a chatbot rest api port + ports: + - 5005:5005 + # Healthcheck condition + healthcheck: + test: ["CMD", "printf", ".", ">", "/dev/tcp/127.0.0.1/5005"] + interval: 45s + timeout: 10s + retries: 30 + # Store chatbot logs out side of the container + volumes: + - logs_data:/rasa-server/rasa/logs + - ./.env:/rasa-server/rasa/.env + # Make the same network for chatbot server and actions server + networks: + - rasa-network + - frontend-network + - events-network + # Build action server + app: + build: + context: ./action-server + dockerfile: Dockerfile + # Choose image name + image: action-server + # Don't start action server before database + depends_on: + db_datasets: + condition: service_healthy + # Choose container name + container_name: action-server + restart: always + # Store chatbot logs out side of the container + volumes: + - logs_data:/action-server/logs + - ./.env:/action-server/.env + # Make the same network for chatbot server and actions server + # And also action server and mysql server + networks: + - rasa-network + - datasets-network + # Expose 5055 port to chatbot server can see the action server + expose: + - 5055 + # Configuration of healthcheck for mysql action server + healthcheck: + test: ["CMD", "printf", ".", ">", "/dev/tcp/127.0.0.1/5055"] + interval: 45s + timeout: 10s + retries: 30 + # Build mysql server + db_datasets: + # Use mysql image + image: mysql:8 + container_name: datasets-server + # Use mysql_native_password instead of caching_sha2_password + command: '--default-authentication-plugin=mysql_native_password' + restart: always + volumes: + # Load mysql dumps (datasets) to the fresh mysql server during initialization + - ./datasets-server:/docker-entrypoint-initdb.d + # Store mysql records in the seperate volume. records won't be removed even with removing containers + - db-data:/var/lib/mysql + # Make the same network for mysql server and actions server + networks: + - datasets-network + # Read MYSQL password and database name from .env file + env_file: + - ./.env + environment: + - MYSQL_DATABASE=${MYSQL_DATASETS_DATABASE} + - MYSQL_ROOT_PASSWORD=${MYSQL_DATASETS_ROOT_PASSWORD} + # Expose 3306 port to action server can see the mysql server + expose: + - 3306 + # Add the capability CAP_SYS_NICE to MySQL server can handle mbind error itself silently. + cap_add: + - SYS_NICE + # Configuration of healthcheck for mysql db + healthcheck: + test: ["CMD", 'mysqladmin', 'ping', '-h', 'localhost', + '-u', 'root', '-p$MYSQL_DATASETS_ROOT_PASSWORD' ] + interval: 3m30s + timeout: 45s + retries: 30 + # Build mysql server + db_events: + # Use postgres image + image: postgres:12 + container_name: events-server + restart: always + volumes: + # Store postgres records in the seperate volume. records won't be removed even with removing containers + - db-event:/var/lib/postgresql/data/ + # Make the same network for postgres server and actions server + networks: + - events-network + # Read postgres password and database name from .env file + env_file: + - ./.env + environment: + - POSTGRES_DB=${POSTGRES_EVENTS_DATABASE} + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASSWORD=${POSTGRES_EVENTS_PASSWORD} + # Expose 5432 port to action server can see the postgres server + expose: + - 5432 + # Add the capability CAP_SYS_NICE to MySQL server can handle mbind error itself silently. + cap_add: + - SYS_NICE + # Configuration of healthcheck for postgres db + healthcheck: + test: ["CMD", 'pg_isready', '-d', '$POSTGRES_EVENTS_DATABASE', + '-h', 'localhost'] + interval: 3m30s + timeout: 45s + retries: 30 + +# List of docker networks +networks: + # network between chatbot and streamlit server + frontend-network: + name: nabot-frontend-network + driver: bridge + # network between chatbot and action server + rasa-network: + name: nabot-rasa-network + driver: bridge + # network between action server and mysql server + datasets-network: + name: nabot-datasets-network + driver: bridge + # network between ui/rasa server and postgres server + events-network: + name: nabot-events-network + driver: bridge + +# Seperate volumes +volumes: + # MYSQL datasets database volume + db-data: + name: data_db + # postgres events database volume + db-event: + name: event_db + # Storing logs volume + logs_data: + name: logs_db