chatwoot 开源客服系统搭建
1. 准备开源客服系统(我是用的Chatwoot )
可以选择以下开源客服系统作为基础:
如果没有现成的应用,也可以用框架(如 Node.js、PHP 或 Python Django/Flask)开发一个。
2. 创建 Docker 配置文件
- 创建chatwoot目录
mkdir chatwoot
chmod 777 chatwoot
- 在chatwoot目录下创建一个
docker-compose.yml
文件来定义服务:
version: '3'
services:
base: &base
image: chatwoot/chatwoot:latest
#container_name: chatwoot-base
env_file: env.txt ## Change this file for customized env variables
volumes:
- ./storage:/app/storage
rails:
<<: *base
depends_on:
- postgres
- redis
ports:
- 3000:3000
environment:
- NODE_ENV=production
- RAILS_ENV=production
- INSTALLATION_ENV=docker
entrypoint: docker/entrypoints/rails.sh
command: ['bundle', 'exec', 'rails', 's', '-p', '3000', '-b', '0.0.0.0']
sidekiq:
<<: *base
depends_on:
- postgres
- redis
environment:
- NODE_ENV=production
- RAILS_ENV=production
- INSTALLATION_ENV=docker
command: ['bundle', 'exec', 'sidekiq', '-C', 'config/sidekiq.yml']
postgres:
image: postgres:14
container_name: chatwoot-postgres
restart: always
#ports:
# - 5432:5432
volumes:
- ./postgres:/var/lib/postgresql/data
environment:
- POSTGRES_DB=chatwoot
- POSTGRES_USER=postgres
# Please provide your own password.
- POSTGRES_PASSWORD=wqlMeLMBBJ3
redis:
image: redis:6.2-alpine
container_name: chatwoot-redis
restart: always
command: ["sh", "-c", "redis-server --requirepass \"$REDIS_PASSWORD\""]
env_file: env.txt
volumes:
- ./redis:/data
#ports:
# - 6379:6379
# middleware:
# build: ./middleware
# restart: always
# ports:
# - "4000:4000"
# environment:
# - CHATWOOT_BOT_TOKEN=你的CHATWOOT机器人token
# - CHATWOOT_URL=http://CHATWOOT的ip:3000
# - RASA_URL=http://RASA的ip:5005
- 在chatwoot目录下创建一个
env.txt
文件来定义服务配置:
# Learn about the various environment variables at
# https://www.chatwoot.com/docs/self-hosted/configuration/environment-variables/#rails-production-variables
# Used to verify the integrity of signed cookies. so ensure a secure value is set
# SECRET_KEY_BASE should be alphanumeric. Avoid special characters or symbols.
# Use `rake secret` to generate this variable
SECRET_KEY_BASE=6eONF6WVhCjbsPMOawORdTF0MccxXgheFvklSzH5ud0=
# Replace with the URL you are planning to use for your app
FRONTEND_URL=https://你的ip:3000
# To use a dedicated URL for help center pages
# HELPCENTER_URL=http://0.0.0.0:3000
# If the variable is set, all non-authenticated pages would fallback to the default locale.
# Whenever a new account is created, the default language will be DEFAULT_LOCALE instead of en
# DEFAULT_LOCALE=en
# If you plan to use CDN for your assets, set Asset CDN Host
ASSET_CDN_HOST=
# Force all access to the app over SSL, default is set to false
FORCE_SSL=false
# This lets you control new sign ups on your chatwoot installation
# true : default option, allows sign ups
# false : disables all the end points related to sign ups
# api_only: disables the UI for signup, but you can create sign ups via the account apis
ENABLE_ACCOUNT_SIGNUP=false
# Redis config
# specify the configs via single URL or individual variables
# ref: https://www.iana.org/assignments/uri-schemes/prov/redis
# You can also use the following format for the URL: redis://:password@host:port/db_number
REDIS_URL=redis://redis:6379
# If you are using docker-compose, set this variable's value to be any string,
# which will be the password for the redis service running inside the docker-compose
# to make it secure
REDIS_PASSWORD=
# Redis Sentinel can be used by passing list of sentinel host and ports e,g. sentinel_host1:port1,sentinel_host2:port2
REDIS_SENTINELS=
# Redis sentinel master name is required when using sentinel, default value is "mymaster".
# You can find list of master using "SENTINEL masters" command
REDIS_SENTINEL_MASTER_NAME=
# By default Chatwoot will pass REDIS_PASSWORD as the password value for sentinels
# Use the following environment variable to customize passwords for sentinels.
# Use empty string if sentinels are configured with out passwords
# REDIS_SENTINEL_PASSWORD=
# Redis premium breakage in heroku fix
# enable the following configuration
# ref: https://github.com/chatwoot/chatwoot/issues/2420
# REDIS_OPENSSL_VERIFY_MODE=none
# Postgres Database config variables
# You can leave POSTGRES_DATABASE blank. The default name of
# the database in the production environment is chatwoot_production
# POSTGRES_DATABASE=
POSTGRES_HOST=postgres
POSTGRES_USERNAME=postgres
POSTGRES_PASSWORD=postgres
RAILS_ENV=development
# Changes the Postgres query timeout limit. The default is 14 seconds. Modify only when required.
# POSTGRES_STATEMENT_TIMEOUT=14s
RAILS_MAX_THREADS=5
# The email from which all outgoing emails are sent
# could user either `email@yourdomain.com` or `BrandName <email@yourdomain.com>`
MAILER_SENDER_EMAIL=Chatwoot <chatwoot@qq.com>
SMTP_DOMAIN=qq.com
# Set the value to "mailhog" if using docker-compose for development environments,
# Set the value as "localhost" or your SMTP address in other environments
# If SMTP_ADDRESS is empty, Chatwoot would try to use sendmail(postfix)
SMTP_ADDRESS=
SMTP_PORT=
SMTP_USERNAME=
SMTP_PASSWORD=
# plain,login,cram_md5
SMTP_AUTHENTICATION=login
SMTP_ENABLE_STARTTLS_AUTO=true
SMTP_DEBUG_OUTPUT=true
# Can be: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert', see http://api.rubyonrails.org/classes/ActionMailer/Base.html
SMTP_OPENSSL_VERIFY_MODE=none
RAILS_MAILER_TIMEOUT=60
# Comment out the following environment variables if required by your SMTP server
#SMTP_TLS=false
#SMTP_SSL=false
# SMTP_OPEN_TIMEOUT
# SMTP_READ_TIMEOUT
# Mail Incoming
# This is the domain set for the reply emails when conversation continuity is enabled
MAILER_INBOUND_EMAIL_DOMAIN=
# Set this to the appropriate ingress channel with regards to incoming emails
# Possible values are :
# relay for Exim, Postfix, Qmail
# mailgun for Mailgun
# mandrill for Mandrill
# postmark for Postmark
# sendgrid for Sendgrid
RAILS_INBOUND_EMAIL_SERVICE=
# Use one of the following based on the email ingress service
# Ref: https://edgeguides.rubyonrails.org/action_mailbox_basics.html
# Set this to a password of your choice and use it in the Inbound webhook
RAILS_INBOUND_EMAIL_PASSWORD=
MAILGUN_INGRESS_SIGNING_KEY=
MANDRILL_INGRESS_API_KEY=
# Creating Your Inbound Webhook Instructions for Postmark and Sendgrid:
# Inbound webhook URL format:
# https://actionmailbox:[YOUR_RAILS_INBOUND_EMAIL_PASSWORD]@[YOUR_CHATWOOT_DOMAIN.COM]/rails/action_mailbox/[RAILS_INBOUND_EMAIL_SERVICE]/inbound_emails
# Note: Replace the values inside the brackets; do not include the brackets themselves.
# Example: https://actionmailbox:mYRandomPassword3@chatwoot.example.com/rails/action_mailbox/postmark/inbound_emails
# For Postmark
# Ensure the 'Include raw email content in JSON payload' checkbox is selected in the inbound webhook section.
# Storage
ACTIVE_STORAGE_SERVICE=local
# Amazon S3
# documentation: https://www.chatwoot.com/docs/configuring-s3-bucket-as-cloud-storage
S3_BUCKET_NAME=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_REGION=
# Log settings
# Disable if you want to write logs to a file
RAILS_LOG_TO_STDOUT=true
LOG_LEVEL=info
LOG_SIZE=500
# Configure this environment variable if you want to use lograge instead of rails logger
#LOGRAGE_ENABLED=true
### This environment variables are only required if you are setting up social media channels
# Facebook
# documentation: https://www.chatwoot.com/docs/facebook-setup
FB_VERIFY_TOKEN=
FB_APP_SECRET=
FB_APP_ID=
# https://developers.facebook.com/docs/messenger-platform/instagram/get-started#app-dashboard
IG_VERIFY_TOKEN=
# Twitter
# documentation: https://www.chatwoot.com/docs/twitter-app-setup
TWITTER_APP_ID=
TWITTER_CONSUMER_KEY=
TWITTER_CONSUMER_SECRET=
TWITTER_ENVIRONMENT=
#slack integration
SLACK_CLIENT_ID=
SLACK_CLIENT_SECRET=
# Google OAuth
GOOGLE_OAUTH_CLIENT_ID=
GOOGLE_OAUTH_CLIENT_SECRET=
GOOGLE_OAUTH_CALLBACK_URL=
### Change this env variable only if you are using a custom build mobile app
## Mobile app env variables
IOS_APP_ID=L7YLMN4634.com.chatwoot.app
ANDROID_BUNDLE_ID=com.chatwoot.app
# https://developers.google.com/android/guides/client-auth (use keytool to print the fingerprint in the first section)
ANDROID_SHA256_CERT_FINGERPRINT=AC:73:8E:DE:EB:56:EA:CC:10:87:02:A7:65:37:7B:38:D4:5D:D4:53:F8:3B:FB:D3:C6:28:64:1D:AA:08:1E:D8
### Smart App Banner
# https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/PromotingAppswithAppBanners/PromotingAppswithAppBanners.html
# You can find your app-id in https://itunesconnect.apple.com
#IOS_APP_IDENTIFIER=1495796682
## Push Notification
## generate a new key value here : https://d3v.one/vapid-key-generator/
# VAPID_PUBLIC_KEY=
# VAPID_PRIVATE_KEY=
#
# for mobile apps
# FCM_SERVER_KEY=
### APM and Error Monitoring configurations
## Elastic APM
## https://www.elastic.co/guide/en/apm/agent/ruby/current/getting-started-rails.html
# ELASTIC_APM_SERVER_URL=
# ELASTIC_APM_SECRET_TOKEN=
## Sentry
# SENTRY_DSN=
## Scout
## https://scoutapm.com/docs/ruby/configuration
# SCOUT_KEY=YOURKEY
# SCOUT_NAME=YOURAPPNAME (Production)
# SCOUT_MONITOR=true
## NewRelic
# https://docs.newrelic.com/docs/agents/ruby-agent/configuration/ruby-agent-configuration/
# NEW_RELIC_LICENSE_KEY=
# Set this to true to allow newrelic apm to send logs.
# This is turned off by default.
# NEW_RELIC_APPLICATION_LOGGING_ENABLED=
## Datadog
## https://github.com/DataDog/dd-trace-rb/blob/master/docs/GettingStarted.md#environment-variables
# DD_TRACE_AGENT_URL=
# MaxMindDB API key to download GeoLite2 City database
# IP_LOOKUP_API_KEY=
## Rack Attack configuration
## To prevent and throttle abusive requests
# ENABLE_RACK_ATTACK=true
# RACK_ATTACK_LIMIT=300
# ENABLE_RACK_ATTACK_WIDGET_API=true
## Running chatwoot as an API only server
## setting this value to true will disable the frontend dashboard endpoints
# CW_API_ONLY_SERVER=false
## Development Only Config
# if you want to use letter_opener for local emails
# LETTER_OPENER=true
# meant to be used in github codespaces
# WEBPACKER_DEV_SERVER_PUBLIC=
# If you want to use official mobile app,
# the notifications would be relayed via a Chatwoot server
ENABLE_PUSH_RELAY_SERVER=true
# Stripe API key
STRIPE_SECRET_KEY=
STRIPE_WEBHOOK_SECRET=
# Set to true if you want to upload files to cloud storage using the signed url
# Make sure to follow https://edgeguides.rubyonrails.org/active_storage_overview.html#cross-origin-resource-sharing-cors-configuration on the cloud storage after setting this to true.
DIRECT_UPLOADS_ENABLED=
#MS OAUTH creds
AZURE_APP_ID=
AZURE_APP_SECRET=
## Advanced configurations
## Change these values to fine tune performance
# control the concurrency setting of sidekiq
# SIDEKIQ_CONCURRENCY=10
# AI powered features
## OpenAI key
# OPENAI_API_KEY=
# Housekeeping/Performance related configurations
# Set to true if you want to remove stale contact inboxes
# contact_inboxes with no conversation older than 90 days will be removed
# REMOVE_STALE_CONTACT_INBOX_JOB_STATUS=false
- 在
env.txt
文件中配置好以下参数:
FRONTEND_URL=https://你的ip:3000 REDIS_URL=redis://password@redis:6379/1 (redis://:password@host:port/db_number) REDIS_PASSWORD=redis密码 POSTGRES_HOST=postgres POSTGRES_USERNAME=postgres POSTGRES_PASSWORD=(数据库密码)
3. 启动服务
docker-compose up -d
使用浏览器管理后台访问:http://你的ip:3000/
注意事项
- 第一次进来先要初始化账号信息,设置好系统语言
超级管理员后台:http://你的ip:3000/super_admin
4. 扩展功能
- 对接邮箱功能(在
env.txt
文件中配置好以下参数:)
# 发送者,格式:“好日子 <123456789@qq.com>” 或 123456789@qq.com MAILER_SENDER_EMAIL=好日子 <123456789@qq.com> # SMTP 邮件服务器域名(例:qq.com,gmail.com) SMTP_DOMAIN=cannmax.vip # SMTP 邮件服务器地址(例:qq邮箱:smtp.qq.com,谷歌:smtp.gmail.com) SMTP_ADDRESS= # 587(TLS)或 465(SSL) SMTP_PORT= # 邮箱账号 SMTP_USERNAME= # 邮箱密码或授权码(根据邮箱服务器规则去填,例:qq邮箱为邮箱授权码,) SMTP_PASSWORD= # 邮箱服务器SMTP 认证方式,通常为 plain,参数有plain,login,cram_md5 SMTP_AUTHENTICATION=login # 是否使用TLS协议发送邮件 SMTP_ENABLE_STARTTLS_AUTO=true # 开启debug调式(有些邮箱必须在debug情况下才能使用) SMTP_DEBUG_OUTPUT=true # 是否有ssl校验 Can be: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert', see SMTP_OPENSSL_VERIFY_MODE=none #发送等待时长 RAILS_MAILER_TIMEOUT=60 # 如果SMTP服务器需要,则注释掉以下环境变量 #SMTP_TLS=false #SMTP_SSL=false注意:
- 如果使用 Gmail 或 QQ 邮箱,需要启用“允许低安全性应用访问”或使用授权码而非直接密码。
- 配置中邮箱和密码需与 SMTP 服务一致。
- 自定义机器人
1.生成chatwoot机器人token
通过 Rails控制台创建代理机器人
- 进入rails容器
docker exec -it chatwoot-rails-1 sh
- 启动 rails 控制台
bundle exec rails c
- 在 Rails 控制台中,输入以下命令来创建代理机器人并获取其访问令牌。保存检索到的令牌(token),因为在调用 chatwoot API 时需要使用它。
# 在驻留bot逻辑时指定url # 如果传参了account_id属性来创建帐户bot,而不是全局bot bot = AgentBot.create!(name: "机器人名", outgoing_url: "http://localhost:8000") bot.access_token.token
- 为您的机器人添加头像(可选)
avatar_file = Down.download("image url 你的头像图片链接") bot.avatar.attach(io: avatar_file, filename: avatar_file.original_filename, content_type: avatar_file.content_type)
- 通过运行以下命令将 Agent Bot 连接到您的收件箱
# 取代的收件箱。首先使用Inbox.find(inbox_id)查找特定的收件箱 AgentBotInbox.create!(inbox: Inbox.first, agent_bot: bot)
2.创建智能机器人对话服务系统(我用的是rasa)
部署文件我已经全部压缩,直接运行即可,下面是部署文件下载地址:https://download.csdn.net/download/ko_10086/90192098
注意:
想更多了解rasa,请百度,我这里就不细讲了。
我的对话模型仅为测试模型,如需替换成其它模型,将模型下载地址替换,重新运行即可
4.测试 rasa服务API
使用postman或者Apifox测试
curl -X POST http://你的rasa的Ip:5005/webhooks/rest/webhook \ -H "Content-Type: application/json" \ -d '{"sender": "test_user", "message": "hello"}'
预期响应:
[ { "recipient_id": "test_user", "text": "Hey! How are you?" } ]
3.rasa与 chatwoot整合对接
- 在chatwoot目录下创建middleware
- 在middleware目录下创建一个app.py,来执行rasa与 chatwoot的交互
# middleware/app.py from flask import Flask, request,jsonify import requests import os app = Flask(__name__) CHATWOOT_BOT_TOKEN = os.getenv("CHATWOOT_BOT_TOKEN") CHATWOOT_URL = os.getenv("CHATWOOT_URL") RASA_URL = os.getenv("RASA_URL") @app.route('/rasa', methods=['POST']) def rasa(): data = request.get_json() event = data.get('event') if 'message_created' == event: message_type = data['message_type'] message = data['content'] conversation = data['conversation']['id'] contact = data['sender']['id'] account = data['account']['id'] if (message_type == "incoming"): bot_response = send_to_bot(contact, message) create_message = send_to_chatwoot(account, conversation, bot_response) print(create_message) if 'automation_event.message_created' == event: message = data['messages'][0]['content'] conversation = data['messages'][0]['conversation_id'] contact = data['messages'][0]['sender']['id'] account = data['messages'][0]['account_id'] message_type = data['messages'][0]['message_type'] if (message_type == 0): bot_response = send_to_bot(contact, message) create_message = send_to_chatwoot(account, conversation, bot_response) print(create_message) return jsonify({"status": "success"}), 200 def send_to_bot(sender, message): data = { 'sender': sender, 'message': message } headers = {"Content-Type": "application/json", "Accept": "application/json"} r = requests.post(f'{RASA_URL}/webhooks/rest/webhook', json=data, headers=headers) return r.json()[0]['text'] def send_to_chatwoot(account, conversation, message): data = { 'content': message } url = f"{CHATWOOT_URL}/api/v1/accounts/{account}/conversations/{conversation}/messages" headers = {"Content-Type": "application/json", "Accept": "application/json", "api_access_token": f"{CHATWOOT_BOT_TOKEN}"} r = requests.post(url, json=data, headers=headers) return r.json() if __name__ == '__main__': app.run(host='0.0.0.0', port=4000)
- 在middleware目录下创建一个
requirements.txt
文件来导入app.py相关工具Flask requests
- 在middleware目录下创建一个Dockerfile 文件来构建服务
# middleware/Dockerfile FROM python:3.8-slim WORKDIR /app COPY requirements.txt requirements.txt RUN pip install --no-cache-dir -r requirements.txt RUN pip install --upgrade Jinja2 Flask COPY app.py . CMD ["python", "app.py"]
- 在chatwoot目录下的
docker-compose.yml
文件里加上middleware服务(上面已经加上了,取消注释即可),然后运行,如果运行不了,就单写一个docker-compose.yml
文件来运行
middleware服务- 运行命令:docker-compose down && docker-compose up -d --build
4.测试智能机器人
- chatwoot的收件箱绑定好上面配置好的机器人
- 在集成方式里面配置rasa与chatwoot交互的api,并选中对应交互事件
- 然后去客户端发送消息测试即可,如以下这样
- 还有一种配置rasa与chatwoot交互的api的方式,即在Automation配置规则
两种方式都是一样的
- 队列分析和监控
原文地址:https://blog.csdn.net/ko_10086/article/details/144770009
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!