From 159a8915af83565a7d016f73e4414df7334f8d90 Mon Sep 17 00:00:00 2001 From: Ronald Loyko <108372764+ronaldloyko@users.noreply.github.com> Date: Thu, 13 Oct 2022 06:45:06 +0300 Subject: [PATCH] feat: add botpress (#759) * feat: add botpress * fix(botpress): improve wording * fix(botpress): language file permissions * feat(botpress): add instructions --- public/v4/apps/botpress.yml | 147 +++++++++++++++++++++++++++++++++++ public/v4/logos/botpress.png | Bin 0 -> 19168 bytes 2 files changed, 147 insertions(+) create mode 100644 public/v4/apps/botpress.yml create mode 100644 public/v4/logos/botpress.png diff --git a/public/v4/apps/botpress.yml b/public/v4/apps/botpress.yml new file mode 100644 index 0000000..eafd043 --- /dev/null +++ b/public/v4/apps/botpress.yml @@ -0,0 +1,147 @@ +captainVersion: 4 +services: + $$cap_appname: + caproverExtra: + containerHttpPort: 3000 + dockerfileLines: + - FROM botpress/server:$$cap_BOTPRESS_VERSION + - CMD /botpress/bp + environment: + DATABASE_URL: postgres://$$cap_POSTGRES_USER:$$cap_POSTGRES_PASSWORD@srv-captain--$$cap_appname-db/$$cap_POSTGRES_DB + REDIS_URL: redis://srv-captain--$$cap_appname-cache?password=$$cap_REDIS_PASSWORD + EXTERNAL_URL: http://$$cap_appname.$$cap_root_domain + BP_MODULE_NLU_DUCKLINGURL: http://srv-captain--$$cap_appname-lang:8000 + BP_MODULE_NLU_LANGUAGESOURCES: '[{"endpoint": "http://srv-captain--$$cap_appname-lang:3100"}]' + BP_PRODUCTION: $$cap_BOTPRESS_PRODUCTION + BPFS_STORAGE: $$cap_BOTPRESS_STORAGE + VERBOSITY_LEVEL: $$cap_BOTPRESS_VERBOSITY_LEVEL + BP_DECISION_MIN_CONFIDENCE: $$cap_BOTPRESS_DECISION_MIN_CONFIDENCE + FAST_TEXT_VERBOSITY: $$cap_BOTPRESS_FAST_TEXT_VERBOSITY + FAST_TEXT_CLEANUP_MS: $$cap_BOTPRESS_FAST_TEXT_CLEANUP_MS + depends_on: + - $$cap_appname-lang + - $$cap_appname-db + - $$cap_appname-cache + volumes: + - $$cap_appname:/botpress/data + + $$cap_appname-lang: + caproverExtra: + notExposeAsWebApp: 'true' + dockerfileLines: + - FROM botpress/server:$$cap_BOTPRESS_VERSION + - USER root + - RUN mkdir /botpress/lang && chown -R botpress:botpress /botpress/lang + - USER botpress + - CMD bash -c "./duckling -p 8000 & ./bp lang --langDir /botpress/lang --port 3100" + volumes: + - $$cap_appname-lang:/botpress/lang + + $$cap_appname-db: + caproverExtra: + notExposeAsWebApp: 'true' + image: postgres:$$cap_POSTGRES_VERSION + environment: + POSTGRES_DB: $$cap_POSTGRES_DB + POSTGRES_PASSWORD: $$cap_POSTGRES_PASSWORD + POSTGRES_USER: $$cap_POSTGRES_USER + volumes: + - $$cap_appname-db:/var/lib/postgresql/data + + $$cap_appname-cache: + caproverExtra: + notExposeAsWebApp: 'true' + dockerfileLines: + - FROM redis:$$cap_REDIS_VERSION + - CMD redis-server --requirepass $$cap_REDIS_PASSWORD + volumes: + - $$cap_appname-cache:/data + +caproverOneClickApp: + displayName: Botpress + isOfficial: true + description: Open Source Platform For Developers To Build High-Quality Digital Assistants + documentation: https://botpress.com/docs + instructions: + start: |- + Botpress is a tool to simplify building chat bots for developers. + The platform puts together the boilerplate code and infrastructure you need to get a chatbot up and running and gives a complete dev-friendly platform that ships with all the tools you need to build, deploy, and manage production-grade chat bots in record time. + end: |- + Botpress has been successfully deployed! It might take few moments before it's fully started. + + Please perform the following steps: + + 1. Go to the **HTTP Settings** of `$$cap_appname` and **Enable WebSocket Support** + 2. Visit your Botpress instance at `http://$$cap_appname.$$cap_root_domain` and create your account + 3. Go to **Code Editor** and select **Configurations** > **Module Configurations** > `nlu.json` in the side bar + 4. Replace value for `ducklingURL` with `http://srv-captain--$$cap_appname-lang:8000` + 5. Replace value for `languageSources` > `endpoint` with `http://srv-captain--$$cap_appname-lang:3100` + 6. Restart `$$cap_appname` in CapRover by clicking on **Save & Update** + + Have fun with Botpress! + variables: + - id: $$cap_BOTPRESS_VERSION + label: Version | Botpress + description: Version of Botpress. Check out their Docker page for the valid tags https://hub.docker.com/r/botpress/server/tags + defaultValue: v12_30_2 + validRegex: /.{1,}/ + - id: $$cap_POSTGRES_VERSION + label: Version | PostgreSQL + description: Version of PostgreSQL. Check out their Docker page for the valid tags https://hub.docker.com/_/postgres/tags + defaultValue: 11.2-alpine + validRegex: /.{1,}/ + - id: $$cap_REDIS_VERSION + label: Version | Redis + description: Version of Redis. Check out their Docker page for the valid tags https://hub.docker.com/_/redis/tags + defaultValue: 5.0.5-alpine + validRegex: /.{1,}/ + - id: $$cap_BOTPRESS_PRODUCTION + label: General | Production Mode + description: Whether to enable production mode. + defaultValue: 'true' + validRegex: /^(true|false)$/ + - id: $$cap_BOTPRESS_STORAGE + label: General | Storage + description: Storage destination used by BPFS to read and write files (global and bots). Either `disk` or `database`. + defaultValue: database + validRegex: /.{1,}/ + - id: $$cap_BOTPRESS_VERBOSITY_LEVEL + label: General | Verbosity Level + description: When set higher than `0`, Botpress will be more chatty when processing requests. + defaultValue: '0' + validRegex: /.{1,}/ + - id: $$cap_BOTPRESS_DECISION_MIN_CONFIDENCE + label: General | Decision Minimum Confidence + description: Minimum threshold required for the Decision Engine to elect a suggestion. + defaultValue: '0.5' + validRegex: /.{1,}/ + - id: $$cap_BOTPRESS_FAST_TEXT_VERBOSITY + label: General | Fast Text Verbosity + description: Level of verbosity that FastText will use when training models. + defaultValue: '0' + validRegex: /.{1,}/ + - id: $$cap_BOTPRESS_FAST_TEXT_CLEANUP_MS + label: General | Fast Text Clean-Up + description: Model will be kept in memory until it receives no messages to process for that duration. Defined in milliseconds. + defaultValue: 60000 + validRegex: /.{1,}/ + - id: $$cap_POSTGRES_DB + label: PostgreSQL | Name + description: Name of the database. + defaultValue: botpress + validRegex: /.{1,}/ + - id: $$cap_POSTGRES_USER + label: PostgreSQL | User + description: Name of the database user. + defaultValue: botpress + validRegex: /.{1,}/ + - id: $$cap_POSTGRES_PASSWORD + label: PostgreSQL | Password + description: Password of the database user. + defaultValue: $$cap_gen_random_hex(16) + validRegex: /.{1,}/ + - id: $$cap_REDIS_PASSWORD + label: Redis | Password + description: Password for Redis. + defaultValue: $$cap_gen_random_hex(16) + validRegex: /.{1,}/ diff --git a/public/v4/logos/botpress.png b/public/v4/logos/botpress.png new file mode 100644 index 0000000000000000000000000000000000000000..a24a1a2745480931bf43a84b695bfb6065234c22 GIT binary patch literal 19168 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