From bdb482e8491f78d4a1736c2cf665fee2f79242c7 Mon Sep 17 00:00:00 2001 From: Ronald Loyko <108372764+ronaldloyko@users.noreply.github.com> Date: Wed, 12 Oct 2022 06:57:11 +0300 Subject: [PATCH] feat: add typebot (#760) --- public/v4/apps/typebot.yml | 249 ++++++++++++++++++++++++++++++++++++ public/v4/logos/typebot.png | Bin 0 -> 10194 bytes 2 files changed, 249 insertions(+) create mode 100644 public/v4/apps/typebot.yml create mode 100644 public/v4/logos/typebot.png diff --git a/public/v4/apps/typebot.yml b/public/v4/apps/typebot.yml new file mode 100644 index 0000000..757502e --- /dev/null +++ b/public/v4/apps/typebot.yml @@ -0,0 +1,249 @@ +captainVersion: 4 +services: + $$cap_appname-builder: + caproverExtra: + containerHttpPort: 3000 + image: baptistearno/typebot-builder:$$cap_TYPEBOT_VERSION + environment: + DATABASE_URL: postgresql://$$cap_POSTGRES_USER:$$cap_POSTGRES_PASSWORD@srv-captain--$$cap_appname-db/$$cap_POSTGRES_DB + NEXTAUTH_URL: http://$$cap_appname-builder.$$cap_root_domain + NEXT_PUBLIC_VIEWER_URL: http://$$cap_appname-viewer.$$cap_root_domain + ENCRYPTION_SECRET: $$cap_TYPEBOT_ENCRYPTION_SECRET + ADMIN_EMAIL: $$cap_TYPEBOT_ADMIN_EMAIL + DISABLE_SIGNUP: $$cap_TYPEBOT_DISABLE_SIGNUP + SMTP_USERNAME: $$cap_TYPEBOT_SMTP_USERNAME + SMTP_PASSWORD: $$cap_TYPEBOT_SMTP_PASSWORD + SMTP_HOST: $$cap_TYPEBOT_SMTP_HOST + SMTP_PORT: $$cap_TYPEBOT_SMTP_PORT + NEXT_PUBLIC_SMTP_FROM: $$cap_TYPEBOT_SMTP_FROM + SMTP_SECURE: $$cap_TYPEBOT_SMTP_SECURE + SMTP_AUTH_DISABLED: $$cap_TYPEBOT_SMTP_AUTH_DISABLED + GOOGLE_CLIENT_ID: $$cap_TYPEBOT_GOOGLE_CLIENT_ID + GOOGLE_CLIENT_SECRET: $$cap_TYPEBOT_GOOGLE_CLIENT_SECRET + NEXT_PUBLIC_GOOGLE_API_KEY: $$cap_TYPEBOT_GOOGLE_API_KEY + GITHUB_CLIENT_ID: $$cap_TYPEBOT_GITHUB_CLIENT_ID + GITHUB_CLIENT_SECRET: $$cap_TYPEBOT_GITHUB_CLIENT_SECRET + GITLAB_CLIENT_ID: $$cap_TYPEBOT_GITLAB_CLIENT_ID + GITLAB_CLIENT_SECRET: $$cap_TYPEBOT_GITLAB_CLIENT_SECRET + GITLAB_BASE_URL: $$cap_TYPEBOT_GITLAB_BASE_URL + GITLAB_REQUIRED_GROUPS: $$cap_TYPEBOT_GITLAB_REQUIRED_GROUPS + GITLAB_NAME: $$cap_TYPEBOT_GITLAB_NAME + FACEBOOK_CLIENT_ID: $$cap_TYPEBOT_FACEBOOK_CLIENT_ID + FACEBOOK_CLIENT_SECRET: $$cap_TYPEBOT_FACEBOOK_CLIENT_SECRET + AZURE_AD_CLIENT_ID: $$cap_TYPEBOT_AZURE_AD_CLIENT_ID + AZURE_AD_CLIENT_SECRET: $$cap_TYPEBOT_AZURE_AD_CLIENT_SECRET + AZURE_AD_TENANT_ID: $$cap_TYPEBOT_AZURE_AD_TENANT_ID + S3_ACCESS_KEY: $$cap_TYPEBOT_S3_ACCESS_KEY + S3_SECRET_KEY: $$cap_TYPEBOT_S3_SECRET_KEY + S3_BUCKET: $$cap_TYPEBOT_S3_BUCKET + S3_PORT: $$cap_TYPEBOT_S3_PORT + S3_ENDPOINT: $$cap_TYPEBOT_S3_ENDPOINT + S3_SSL: $$cap_TYPEBOT_S3_SSL + S3_REGION: $$cap_TYPEBOT_S3_REGION + NEXT_PUBLIC_GIPHY_API_KEY: $$cap_TYPEBOT_GIPHY_API_KEY + depends_on: + - $$cap_appname-db + $$cap_appname-viewer: + caproverExtra: + containerHttpPort: 3000 + image: baptistearno/typebot-viewer:$$cap_TYPEBOT_VERSION + environment: + DATABASE_URL: postgresql://$$cap_POSTGRES_USER:$$cap_POSTGRES_PASSWORD@srv-captain--$$cap_appname-db/$$cap_POSTGRES_DB + NEXT_PUBLIC_VIEWER_URL: http://$$cap_appname-viewer.$$cap_root_domain + ENCRYPTION_SECRET: $$cap_TYPEBOT_ENCRYPTION_SECRET + NEXTAUTH_URL: http://$$cap_appname-builder.$$cap_root_domain + SMTP_USERNAME: $$cap_TYPEBOT_SMTP_USERNAME + SMTP_PASSWORD: $$cap_TYPEBOT_SMTP_PASSWORD + SMTP_HOST: $$cap_TYPEBOT_SMTP_HOST + SMTP_PORT: $$cap_TYPEBOT_SMTP_PORT + SMTP_FROM: $$cap_TYPEBOT_SMTP_FROM + SMTP_SECURE: $$cap_TYPEBOT_SMTP_SECURE + GOOGLE_CLIENT_ID: $$cap_TYPEBOT_GOOGLE_CLIENT_ID + GOOGLE_CLIENT_SECRET: $$cap_TYPEBOT_GOOGLE_CLIENT_SECRET + S3_ACCESS_KEY: $$cap_TYPEBOT_S3_ACCESS_KEY + S3_SECRET_KEY: $$cap_TYPEBOT_S3_SECRET_KEY + S3_BUCKET: $$cap_TYPEBOT_S3_BUCKET + S3_PORT: $$cap_TYPEBOT_S3_PORT + S3_ENDPOINT: $$cap_TYPEBOT_S3_ENDPOINT + S3_SSL: $$cap_TYPEBOT_S3_SSL + S3_REGION: $$cap_TYPEBOT_S3_REGION + depends_on: + - $$cap_appname-db + + $$cap_appname-db: + caproverExtra: + notExposeAsWebApp: 'true' + image: postgres:$$cap_POSTGRES_VERSION + environment: + POSTGRES_DB: $$cap_POSTGRES_DB + POSTGRES_USER: $$cap_POSTGRES_USER + POSTGRES_PASSWORD: $$cap_POSTGRES_PASSWORD + volumes: + - $$cap_appname-db-data:/data/postgres + +caproverOneClickApp: + instructions: + start: |- + Typebot is an open-source alternative to Landbot. + It allows you to create conversational apps/forms (Lead qualification, Product launch, User onboarding, Customer support), embed them anywhere on your web/mobile apps, and collect results in real-time. + + **Important notes**: + + - Make sure to set up least one authentication provider (Mail, Google, GitHub, Facebook or Azure AD) below + - Add your mail address to `ADMIN_EMAIL` + end: |- + Typebot has been successfully deployed! It might take few moments before it's fully started. + You can access it at `http://$$cap_appname-builder.$$cap_root_domain`. + displayName: Typebot + isOfficial: true + description: Conversational Form Builder That You Can Self-Host. Open Source Alternative To Landbot. + documentation: https://docs.typebot.io + variables: + - id: $$cap_TYPEBOT_VERSION + label: Version | Typebot + description: Version of Typebot. Check out their valid tags at https://hub.docker.com/r/baptistearno/typebot-builder/tags + defaultValue: 2 + validRegex: /.{1,}/ + - id: $$cap_POSTGRES_VERSION + label: General | PostgreSQL Version + description: Check out their valid tags at https://hub.docker.com/_/postgres/tags + defaultValue: '14.0-alpine' + validRegex: /.{1,}/ + - id: $$cap_TYPEBOT_ADMIN_EMAIL + label: Administration | User Mail Address + description: The mail address that will get a "Pro" plan on user creation. + - id: $$cap_TYPEBOT_DISABLE_SIGNUP + label: Administration | Disable Sign-Ups + description: To disable new sign-ups but still be able to sign in with existing users or admin mail address. + defaultValue: 'false' + validRegex: /^(true|false)$/ + - id: $$cap_TYPEBOT_ENCRYPTION_SECRET + label: Security | Encryption Secret + description: >- + A 256-bit key used to encrypt sensitive data. + The secret should be the same between builder and viewer. + defaultValue: $$cap_gen_random_hex(128) + validRegex: /.{1,}/ + - id: $$cap_POSTGRES_DB + label: Database | Name + description: Name of the database. + defaultValue: typebot + validRegex: /.{1,}/ + - id: $$cap_POSTGRES_USER + label: Database | User Name + description: Name of the database user. + defaultValue: typebot + validRegex: /.{1,}/ + - id: $$cap_POSTGRES_PASSWORD + label: Database | User Password + description: Password of the database user. + defaultValue: $$cap_gen_random_hex(16) + validRegex: /.{1,}/ + - id: $$cap_TYPEBOT_SMTP_USERNAME + label: Mail | Name + description: Optional SMTP username. + - id: $$cap_TYPEBOT_SMTP_PASSWORD + label: Mail | Password + description: Optional SMTP password. + - id: $$cap_TYPEBOT_SMTP_HOST + label: Mail | Host + description: Optional SMTP host. + - id: $$cap_TYPEBOT_SMTP_PORT + label: Mail | Port + description: SMTP port. + defaultValue: 25 + validRegex: /.{1,}/ + - id: $$cap_TYPEBOT_SMTP_FROM + label: Mail | From Field + description: Optional "from" name and mail (e.g. `Notifications `). + - id: $$cap_TYPEBOT_SMTP_SECURE + label: Mail | Secure Connection + description: >- + If `true` the connection will use TLS when connecting to server. + If `false` (the default) then TLS is used if server supports the STARTTLS extension. + In most cases set this value to `true` if you are connecting to port `465`. + For port `587` or `25` keep it `false`. + defaultValue: 'false' + validRegex: /^(true|false)$/ + - id: $$cap_TYPEBOT_SMTP_AUTH_DISABLED + label: Mail | Authentication Disabled + description: To disable the authentication by mail but still use the provided config for notifications. + defaultValue: 'false' + validRegex: /^(true|false)$/ + - id: $$cap_TYPEBOT_GOOGLE_CLIENT_ID + label: Google | Client ID + description: Optional client ID from the Google API Console. + - id: $$cap_TYPEBOT_GOOGLE_CLIENT_SECRET + label: Google | Client Secret + description: Optional client secret from the Google API Console. + - id: $$cap_TYPEBOT_GOOGLE_API_KEY + label: Google | API Key + description: Optional API Key from the Google API Console. Used for Google Fonts. + - id: $$cap_TYPEBOT_GITHUB_CLIENT_ID + label: GitHub | Client ID + description: Optional application client ID from GitHub. Also used to check if it is enabled in the front-end. + - id: $$cap_TYPEBOT_GITHUB_CLIENT_SECRET + label: GitHub | Client Secret + description: Optional application secret from GitHub. + - id: $$cap_TYPEBOT_GITLAB_CLIENT_ID + label: GitLab | Client ID + description: Optional application client ID from GitLab. Also used to check if it is enabled in the front-end. + - id: $$cap_TYPEBOT_GITLAB_CLIENT_SECRET + label: GitLab | Client Secret + description: Optional application secret from GitLab. + - id: $$cap_TYPEBOT_GITLAB_BASE_URL + label: GitLab | Base URL + description: Optional GitLab instance base URL. + defaultValue: https://gitlab.com + validRegex: /.{1,}/ + - id: $$cap_TYPEBOT_GITLAB_REQUIRED_GROUPS + label: GitLab | Required Groups + description: Optional comma-separated list of groups the user has to be a direct member of (e.g. `foo,bar`). + - id: $$cap_TYPEBOT_GITLAB_NAME + label: GitLab | Base URL + description: Name of the GitLab instance, used for the SSO Login Button. + defaultValue: GitLab + validRegex: /.{1,}/ + - id: $$cap_TYPEBOT_FACEBOOK_CLIENT_ID + label: Facebook | Client ID + description: Optional application client ID from Facebook. Also used to check if it is enabled in the front-end. + - id: $$cap_TYPEBOT_FACEBOOK_CLIENT_SECRET + label: Facebook | Client Secret + description: Optional application secret from Facebook. + - id: $$cap_TYPEBOT_AZURE_AD_CLIENT_ID + label: Azure AD | Client ID + description: Optional application client ID from Azure AD. Also used to check if it is enabled in the front-end. + - id: $$cap_TYPEBOT_AZURE_AD_CLIENT_SECRET + label: Azure AD | Client Secret + description: Optional application client secret from Azure AD. Can be obtained from Azure Portal. + - id: $$cap_TYPEBOT_AZURE_AD_TENANT_ID + label: Azure AD | Tenant ID + description: Optional Azure AD tenant ID. + - id: $$cap_TYPEBOT_S3_ACCESS_KEY + label: S3 | Access Key + description: Optional S3 access key. Also used to check if upload feature is enabled. + - id: $$cap_TYPEBOT_S3_SECRET_KEY + label: S3 | Secret Key + description: Optional S3 secret key. + - id: $$cap_TYPEBOT_S3_BUCKET + label: S3 | Bucket + description: Name of the bucket where assets will be uploaded in. + defaultValue: typebot + validRegex: /.{1,}/ + - id: $$cap_TYPEBOT_S3_PORT + label: S3 | Port + description: Optional S3 host port number. + - id: $$cap_TYPEBOT_S3_ENDPOINT + label: S3 | Endpoint + description: Optional S3 endpoint. + - id: $$cap_TYPEBOT_S3_SSL + label: S3 | Secure Connection + description: Whether to use SSL when establishing the connection. + defaultValue: 'true' + validRegex: /^(true|false)$/ + - id: $$cap_TYPEBOT_S3_REGION + label: S3 | Region + description: Optional S3 region. + - id: $$cap_TYPEBOT_GIPHY_API_KEY + label: Giphy | API Key + description: Optional Giphy API key. diff --git a/public/v4/logos/typebot.png b/public/v4/logos/typebot.png new file mode 100644 index 0000000000000000000000000000000000000000..6441ce6bc2ca952a59cf8cd8f19b8b08a44e03c6 GIT binary patch literal 10194 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

I%qcvT+w}n$(nZ5hT|v!O~;8 zxd`S#l=X9OZrjhP^F#ML54n(ncHWQLH@)&p1}l+uQcue#@$f5?T zmAr^It|lBV)5TDkDZ=@QeXRE3d`M38=JnHEWWfVDqvf@p>ej^3*z{WeHNQL_uV<^- zB%1v^W*w{t%xyj9WB1WLZf_d51agTgqSwUHg~zlE%=Ek2fRSXzTfE~F;z=RKG8)WV z8+=w}cP_7KOvR5Nk4O73A51coVXEDSgIz{0@{*g7++XtcFeDH@i#rg}-;}!tXq)i`sTUt?aaU&r}84=3ytw6J1Fb5D>-h43XA*F1De&l}@;z zb6b`bFg}-MrsG+~ZSDlE76u~+a|PLYealEue&PM7r~-)-q?|ong?-yOYkV$pw>nAW za%y0DX7BfJ_}hg6S$Ui1F*7Equ;`T_zK5v(x!0%Q;fcYP{W%PSN{@=RuUJni*3&NT zeyx$asg?45-u`cJeliV19fD6N{jgGYg&5Yo+@svK&3x56?d7`9yW7lYw6sA5zQN#{ zG%H18xs40DFzvBQuqMX7&N*zvBiBH{#4bM7F?Z8a6EM4ldu>y>gSvvG&6Z*-3asVM z;;EQ{xAiLQ-Hh_S=(b3N?tY={_%3+5a07xl@m`DG5a7PmTT)V5Gzv^J!Bw}=M`$rw z4BuSyJg#bH1j2!brYvn+{oAhmbAO0uXO&P!QKGjPW}J)o%0zqsvHl)R+4~}c)3Wk} zoF@a4^#dw8mRqxx6}?(iGASTE|lCU`*v?wupR|1}D{RX}61kIw)v}!B5 zHR~?AS8HbM`@19dgs_NmW`8~}imV0^h;T_cC6c|8Sv9<}OH&!VZoUSud(9-Mu3Zm}e;WFExaz?mPsgh@(wV%5%-*VqRKp z9;92wz<4Q{V19w4_P!7ZL{x4-@M&`AVT29mbP|$FcohD*;gwQ(M5yxGd9xdu0 z56T65?<>83TFm$oT1)COF@pP(2SJ_9gM$z2Z0p7`u2u6|C0n(6YGONe`}n&skU74; zqg192j}bUlN&rh(GiFB+J^B`aGNPoD{jMnOePm@;NlAaF+_hd zKc(MYBUy0lcB(96?*}xu?$Zm9tG3^JcP1;k;|00vg^YdbP<*gWs7HyINDs6-$RwGL zm_Q>u-7X>ddx{|-IZh@mwn#mJewJ!b-d96XT^q@dKs96EWa_a9q9IBm!K zME*=cm<#j^AU`_B_z@$w?xI>1IxbzEyJMT?N*-2|0S3^e0X3)(qN$1G2|;_)y?()w zBQ5F_Hj(K#&agssWouHc8hDI3ol-1sXLLa)#QPJaeJ-d!$$ZSxyh}L z$>Waj&{>HLtruEa<5hjhV7NyaXbwLDJ?;^>A{7|zsX^h(wvM7Byn3VQclb(n2nhp@^GIQZdk#1!$P$?|%AiTBXv>0O0V>t) z5zGKEcfttwi=|2YU$^_l_XDa_nXjdEsqO8wROZB|WI5n^|1cbFwcK#E^ZTk)I$bMZ z>DxV2j9Q7QP`$=4KBVT~k*ZkOy_mXsp3x-K-k~ubkvW+yZa)}zO&>dXqhyPrPMip}0%CW| z;iV*BPJMCh>59~d+zx>)Ld0E7P~P#pNv=)-Z{qCDn<$mLXUHy2PxQwdC|=^xAu9>$ zGKTeF$ln;QyStFcpKXytvS z!uxH*yUyX9Er=Kmql#s1z?@W~YqQmn1LK*%?F?IsmL=rF@P1@X%A-`P0PIm<;FY}w zpEvY^&?7D5I>mVk8;*+O#(D+kJRRBi6TVlfPKE1NEW-iwISboGVSyQhyD{Fl@$p%a zOppzDKZ{_z-8rpawOo*3FMD%X_7nQ3L_Xn2VX0zaMJvI7BipH#rD83QJv054qx?+= zqwNRrwu!n{c4vQKo=#mI=llrd|7}bv=uR&QyP=PT`zErU8`@1hH91YY@D05xC!czR4cgtiP3Ng^E7)cC7WtZ%3tajE$$i|ZClDL8sdHk l%()k&I}z