diff --git a/Makefile b/Makefile index 1167bb80..c7b635a4 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,4 @@ -# Default path setup -COMPOSE_FILES := -f ./docker/docker-compose.yml -f ./docker/docker-compose.dev.yml +COMPOSE_FILES := -f ./docker/docker-compose.yml # Function to add service files define add_service @@ -8,7 +7,7 @@ define add_service ifneq ($(wildcard ./docker/docker-compose.$(1).prod.yml),) COMPOSE_FILES += -f ./docker/docker-compose.$(1).prod.yml endif - else + else ifeq ($(DEV_MODE), true) COMPOSE_FILES += -f ./docker/docker-compose.$(1).yml ifneq ($(wildcard ./docker/docker-compose.$(1).dev.yml),) COMPOSE_FILES += -f ./docker/docker-compose.$(1).dev.yml @@ -17,18 +16,20 @@ define add_service endef -# Check if services are specified and add corresponding compose files -ifneq ($(NGINX),) - $(eval $(call add_service,nginx)) -endif - -ifneq ($(NLU),) - $(eval $(call add_service,nlu)) -endif - -ifneq ($(SMTP4DEV),) - $(eval $(call add_service,smtp4dev)) -endif +# Function to set up COMPOSE_FILES +define compose_files + ifeq ($(1), true) + ifneq ($(wildcard ./docker/docker-compose.dev.yml),) + COMPOSE_FILES += -f ./docker/docker-compose.dev.yml + endif + endif + ifneq ($(NGINX),) + $(eval $(call add_service,nginx)) + endif + ifneq ($(NLU),) + $(eval $(call add_service,nlu)) + endif +endef # Ensure .env file exists and matches .env.example check-env: @@ -43,16 +44,21 @@ init: cp ./docker/.env.example ./docker/.env dev: check-env + $(eval $(call compose_files,true)) docker compose $(COMPOSE_FILES) up -d start: check-env - docker compose $(COMPOSE_FILES) up -d --build + $(eval $(call compose_files,false)) + docker compose $(COMPOSE_FILES) up -d stop: check-env + $(eval $(call compose_files,true)) docker compose $(COMPOSE_FILES) down destroy: check-env + $(eval $(call compose_files,true)) docker compose $(COMPOSE_FILES) down -v migrate-up: + $(eval $(call compose_files,false)) docker-compose $(COMPOSE_FILES) up --no-deps -d database-init diff --git a/README.md b/README.md index f44af489..48681c05 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # Hexabot + ![App Screenshot](https://www.hexabot.ai/assets/images/screencast.gif) ## Description @@ -20,6 +21,7 @@ - **Inbox & Handover:** Provides a real-time chat window where conversations can be monitored and handed over to human agents when necessary. ## Directory Structure + - **frontend:** The admin panel built with React/Next.js for managing chatbot configurations and flows. - **api:** The backend API built with NestJS and connected to MongoDB for data storage and management. - **widget:** A React-based live chat widget that can be embedded into any website to provide real-time interaction. @@ -27,6 +29,7 @@ - **docker:** A set of Docker Compose files for deploying the entire solution, making it easy to run Hexabot in any environment. ## Prerequisites + To ensure Hexabot runs smoothly, you'll need the following: - **Docker:** We recommend using Docker to start the app since multiple services are required (MongoDB, Redis, Prometheus, etc.). All the necessary Docker Compose files are located in the docker folder. @@ -35,28 +38,37 @@ To ensure Hexabot runs smoothly, you'll need the following: ## Installation 1. **Clone the Repository:** + ```bash $ git clone https://github.com/hexastack/hexabot.git ``` + 2. **Environment Setup:** To configure the environment variables, use the Makefile at the root folder for initialization: + ```bash $ make init ``` + This will copy the `.env.example` file to `.env` in the `./docker` directory if the file does not already exist. 3. **Running the Application:** Once your environment is set up, you can start the app. Use either of the following commands: + ```bash $ make start ``` + or for development mode: + ```bash $ make dev ``` + **Note:** The first time you run the app, Docker will take some time to download all the required images. ## Usage -UI Admin Panel is accessible via http://localhost:8080, the default credentials are : +UI Admin Panel is accessible via http://localhost:8080, the default credentials are : + - **Username:** admin@admin.admin - **Password:** adminadmin @@ -65,18 +77,20 @@ Live Chat Widget is accessible via http://localhost:5173 ## Commands - `make init` : Copies the .env.example file to .env in the ./docker directory if .env does not exist. This is usually used for initial setup. -- `make dev` : Starts all configured Docker services in development mode. It first checks the .env file for completeness against .env.example. -- `make start` : Similar to dev, but explicitly builds the Docker images before starting the services. This target also checks the .env file for required variables. +- `make dev` : Starts all configured Docker services in development mode. It first checks the .env file for completeness against .env.example and builds the docker images locally. +- `make start` : Starts all configured Docker services by loading all images from Docker Hub. This target also checks the .env file for required variables. - `make stop` : Stops all running Docker services defined in the compose files. - `make destroy` : Stops all services and removes all volumes associated with the Docker compose setup, ensuring a clean state. - `make check-env` : Checks if the ./docker/.env file exists and contains all the necessary environment variables as defined in ./docker/.env.example. If the file does not exist, it is created from the example. It also lists missing variables if any. -Example on how to start the stack by adding the Nginx service : +Example on how to start the stack by adding the Nginx service : + ```sh make start NGINX=1 ``` ## Documentation + For detailed information on how to get started, as well as in-depth user and developer guides, please refer to our full documentation available in the docs folder or visit the [Documentation](https://docs.hexabot.ai). You can also find specific documentation for different components of the project in the following locations: @@ -86,16 +100,17 @@ You can also find specific documentation for different components of the project - [Live Chat Widget Documentation](widget/README.md) - [NLU Engine Documentation](nlu/README.md) -## Contributing +## Contributing + We welcome contributions from the community! Whether you want to report a bug, suggest new features, or submit a pull request, your input is valuable to us. Please refer to our contribution policy first : [How to contribute to Hexabot](./CONTRIBUTING.md) [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](./CODE_OF_CONDUCT.md) - Feel free to join us on [Discord](https://discord.gg/rNb9t2MFkG) ## License + This software is licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms: 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission. diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml index b4171110..6b2a7e33 100644 --- a/docker/docker-compose.dev.yml +++ b/docker/docker-compose.dev.yml @@ -2,12 +2,16 @@ version: "3.8" services: database-init: + build: + context: ../api volumes: - ../api/src:/app/src - ../api/migrations:/app/migrations # - ../api/node_modules:/app/node_modules api: + build: + context: ../api ports: - ${API_PORT}:3000 - 9229:9229 # vscode debug port @@ -35,8 +39,15 @@ services: ME_CONFIG_MONGODB_ADMINPASSWORD: ${MONGO_PASSWORD} ME_CONFIG_MONGODB_URL: ${MONGO_URI} + hexabot-frontend: + container_name: frontend + build: + context: ../ + dockerfile: ./frontend/Dockerfile + widget: build: + context: ../widget target: development volumes: - ../widget/src:/app/src diff --git a/docker/docker-compose.nlu.dev.yml b/docker/docker-compose.nlu.dev.yml index 8ea3a79c..b828f4a6 100644 --- a/docker/docker-compose.nlu.dev.yml +++ b/docker/docker-compose.nlu.dev.yml @@ -2,5 +2,8 @@ version: "3.9" services: nlu-api: + build: + context: ../nlu + dockerfile: Dockerfile ports: - - ${NLP_PORT}:5000 \ No newline at end of file + - ${NLP_PORT}:5000 diff --git a/docker/docker-compose.nlu.yml b/docker/docker-compose.nlu.yml index 7bc96732..be46953d 100644 --- a/docker/docker-compose.nlu.yml +++ b/docker/docker-compose.nlu.yml @@ -10,9 +10,7 @@ services: nlu-api: container_name: nlu-api - build: - context: ../nlu - dockerfile: Dockerfile + image: hexabot-nlu:latest env_file: .env networks: - nlp-network diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 5549acf3..6fabf648 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -3,8 +3,7 @@ version: "3.9" services: database-init: container_name: database-init - build: - context: ../api + image: hexabot-api:latest command: sh -c "npm run cache:init && npm run migrate prune && npm run migrate up" env_file: .env networks: @@ -15,8 +14,7 @@ services: api: container_name: api - build: - context: ../api + image: hexabot-api:latest env_file: .env ports: - ${API_PORT}:3000 @@ -69,12 +67,7 @@ services: widget: container_name: widget - build: - context: ../widget - args: - REACT_APP_WIDGET_API_URL: ${REACT_APP_WIDGET_API_URL} - REACT_APP_WIDGET_CHANNEL: ${REACT_APP_WIDGET_CHANNEL} - REACT_APP_WIDGET_TOKEN: ${REACT_APP_WIDGET_TOKEN} + image: hexabot-widget:latest networks: - app-network depends_on: