# 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:
# Choose container name
container_name: ui-server
# Choose image name
image: medbot/nabot_ui
# Don't start ui server before chatbot server
depends_on:
rasa:
condition: service_healthy
# Choose container name
restart: always
# Make the same network for chatbot server and ui server
networks:
- frontend-network
- nginx-network
# Mount .env file to the ui server to read chatbot URL
volumes:
- ./.env:/flask_server/.env
expose:
- 8501
# 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:
# Choose container name
container_name: monitoring-server
# Choose image name
image: medbot/nabot_monitoring
# Don't start ui server before postgres server
depends_on:
rasa:
condition: service_healthy
container_name: monitoring-server
restart: always
# Make the same network for chatbot server and ui server
networks:
- events-network
- nginx-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
expose:
- 8501
# Healthcheck condition
healthcheck:
test: ["CMD", "printf", ".", ">", "/dev/tcp/127.0.0.1/8501"]
interval: 30s
timeout: 10s
retries: 30
# Build chatbot server
rasa:
# Choose container name
container_name: chatbot-server
# Choose image name
image: medbot/nabot_chatbot
# Don't start chatbot server before action server
depends_on:
app:
condition: service_healthy
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
- nginx-network
# Build action server
app:
# Choose container name
container_name: action-server
# Choose image name
image: medbot/nabot_action
# Don't start action server before database
depends_on:
db_datasets:
condition: service_healthy
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 postgres 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 mysql 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 mysql db
healthcheck:
test: ["CMD", 'pg_isready', '-d', '$POSTGRES_EVENTS_DATABASE',
'-h', 'localhost']
interval: 3m30s
timeout: 45s
retries: 30
# Build nginx container
nginx:
# Use nginx image
image: nginx
container_name: nginx
# Map TCP port 80 and 443 of the container to port 80 and 443 of the Docker host, respectively.
ports:
- 80:80
- 443:443
volumes:
# Mount nginx default config file to the container
- ./nginx:/etc/nginx/conf.d
# Mount letsencrypt certifications to the container.
# If you're using different certificate authority, change the following line
- /etc/letsencrypt:/etc/letsencrypt:ro
# Nginx container depends on rasa, ui and monitoring containers
depends_on:
rasa:
condition: service_healthy
monitoring:
condition: service_healthy
ui:
condition: service_healthy
# Make the same network for rasa, ui and monitoring containers
networks:
- nginx-network
# pgAdmin4 container
pgadmin:
# Use pgAdmin4 image
image: dpage/pgadmin4
container_name: pgadmin4
restart: always
# pgAdmin4 container depends on db_events containers
depends_on:
db_events:
condition: service_healthy
# Read postgres password and database name from .env file
env_file:
- ./.env
environment:
- PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}
- PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}
- PGADMIN_CONFIG_ENHANCED_COOKIE_PROTECTION="True"
ports:
- 5050:80
# Make the same network for eventdb and pgadmin containers
networks:
- events-network
# 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
# A network for all endpoints (rasa - ui - monitoring)
nginx-network:
name: nabot-nginx-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