做跨境客服,最怕的就是消息进来了没人接,接了以后换个机器,聊天记录全没了。这次我按官方文档把 Chatwoot v4.16.2 完整搭了一遍,从建收件箱到数据恢复都跑通,能落地的写在这里,没验证的也直说。
部署 Chatwoot 不是把容器拉起来就完事。真正能交付的状态是:客户能从已授权的渠道发起咨询,客服在统一工作台分配和回复,重启不丢会话和附件,数据库坏了或者要迁移还能恢复。邮件、Webhook、社交平台这些外部依赖,最好每一项都有独立的验收记录,不然上线那天才知道哪个环节是空的。
这次实测的内容是:创建 API 收件箱、接收入站消息、生成公开回复,把回复投递到本地 Webhook 接收器,再把 PostgreSQL 和应用 storage 恢复到全新数据卷。中间踩了一个坑:默认的 SSRF 防护会拒绝私网 Webhook。这个保护别为了省事在生产环境全局关掉,后面单独说。
先看结论:Chatwoot需要什么服务器配置
官方自托管文档写的最低要求是 2核 CPU、4GB 内存、20GB SSD,生产建议从 4核、8GB、50GB 起步。另一份官方需求说明里提到,Sidekiq 在活跃环境下可能单独吃掉 1GB 以上内存。所以 1核2G、2核2G 这种配置,当生产客服系统用就别指望了,至少别写进方案里。
这张表只用来询价和当压测起点,不是并发承诺:
| 场景 | 建议起点 | 需要重点观察 |
|---|---|---|
| 内部验证、少量虚构会话 | 2核4G、40GB SSD | Rails与Sidekiq能否同时运行;只用于验证 |
| 小团队正式使用 | 4核8G、80GB以上SSD | 峰值会话、附件、邮件任务、数据库增长 |
| 多渠道、多客服、自动化较多 | 4–8核、16GB以上、独立备份空间 | Sidekiq队列延迟、PostgreSQL I/O、对象存储与带宽 |
| 大量附件或跨地域客服 | 应用与数据库分离,附件使用对象存储 | 数据库连接、出口带宽、备份窗口、地域访问质量 |
我这次在本地容器里把 Rails 限制为 2核2G、Sidekiq 1核2G、PostgreSQL 1核1G、Redis 0.5核256MB。恢复环境空载时采过一次快照,Rails 约 395MiB、Sidekiq 约 385MiB、PostgreSQL 约 58MiB、Redis 约 4MiB。这个数字只说明测试那一刻的量级,推不到多人并发和生产峰值。
这次实测跑通了什么
测试编号 T052-CHATWOOT-LOCAL-001,跑通的闭环是:
- 固定Chatwoot v4.16.2、PostgreSQL 16和Redis
7.2镜像,执行数据库准备并启动Web与Sidekiq。 - 创建本地虚构管理员、账户和API收件箱。
- 创建虚构客户、会话和入站消息,再生成一条公开客服回复。
- 停止Rails和Sidekiq写入,逻辑备份PostgreSQL并归档应用storage。
- 创建全新的数据库、storage和Redis卷,在独立端口启动恢复环境。
- 使用原API令牌读取原会话,确认入站消息和客服回复仍在。
- 启动实际Webhook接收器,确认Sidekiq投递了包含回复标记的事件,最新回复状态为
sent。

真实 SMTP 送达、WhatsApp 或社交平台授权、附件恢复、多客服并发、对象存储、公网反向代理,这次都没实测。下面的部署和验收方法照常给,但不会把这些写成“已经通过”。
Chatwoot适合什么业务,不适合什么业务
Chatwoot 适合要统一处理网站咨询、邮件、API 集成和平台授权消息的团队。它干的事不是多一个聊天窗口那么简单:联系人、会话、分配、标签、内部备注、自动化、历史记录,都在同一个工作台里。
常见业务包括:
- 跨境电商售前咨询、订单问题和售后跟进;
- SaaS产品的网站在线客服与技术支持;
- 游戏、社区或内容平台的用户申诉和工单前置沟通;
- 海外营销落地页的线索接待与客服分配;
- 自有App通过API接入人工客服。
它不等于呼叫中心,也不会自动解决平台合规、邮件送达率、客户数据治理这些问题。要是业务需要复杂录音、强审计合规、原生工单审批或者特定 CRM 双向同步,先做功能差距表,别等装完再让软件“顺便支持”。
先画清业务流,再选渠道
部署前至少回答五个问题:
- 客户从哪里发起咨询:网站、App、邮件、WhatsApp、Facebook、Instagram、TikTok还是电话?
- 哪些渠道已经有企业主体、官方应用和必要授权?
- 客服按品牌、国家、语言、班次还是产品线分组?
- 会话和附件要保留多久,谁能导出或删除?
- 故障时允许丢失多少数据,多久必须恢复?
渠道决定外部依赖,班次和分配决定 Sidekiq 的任务量,保留周期决定数据库和对象存储的大小,恢复目标决定备份频率。服务器只是把这些约束装下,替代不了业务设计。

Chatwoot部署的生产架构包含哪些组件
官方生产架构不是单个容器,拆开是五类组件:
- Rails Web:提供管理界面、API和实时连接;
- Sidekiq:处理回复投递、邮件、Webhook和大量后台任务;
- PostgreSQL:保存账户、联系人、会话、消息和配置;
- Redis:承担队列与缓存;
- storage或对象存储:保存上传文件等持久资产。
反向代理、TLS 证书、SMTP、监控也都要配。前期可以把 Web 和 Sidekiq 放同一台机器,但数据库、Redis、存储必须落在持久卷上;流量或任务涨起来,再按瓶颈拆。只备份 docker-compose.yml 救不回来客服数据。
用Docker部署Chatwoot v4.16.2
下面是结构示例。变量放进仅管理员可读的 .env,真实密码别写进文章、仓库或命令历史:
services:
postgres:
image: pgvector/pgvector:pg16
environment:
POSTGRES_DB: chatwoot
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7.2-alpine
command: ["sh", "-c", "redis-server --requirepass \"$${REDIS_PASSWORD}\""]
environment:
REDIS_PASSWORD: ${REDIS_PASSWORD}
volumes:
- redis_data:/data
rails:
image: chatwoot/chatwoot:v4.16.2
entrypoint: docker/entrypoints/rails.sh
command: ["bundle", "exec", "rails", "s", "-p", "3000", "-b", "0.0.0.0"]
environment: &chatwoot_env
RAILS_ENV: production
FRONTEND_URL: https://support.example.com
SECRET_KEY_BASE: ${SECRET_KEY_BASE}
POSTGRES_HOST: postgres
POSTGRES_DATABASE: chatwoot
POSTGRES_USERNAME: postgres
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
REDIS_URL: redis://redis:6379
REDIS_PASSWORD: ${REDIS_PASSWORD}
ACTIVE_STORAGE_SERVICE: local
volumes:
- chatwoot_storage:/app/storage
sidekiq:
image: chatwoot/chatwoot:v4.16.2
command: ["bundle", "exec", "sidekiq", "-C", "config/sidekiq.yml"]
environment: *chatwoot_env
volumes:
- chatwoot_storage:/app/storage
volumes:
postgres_data:
redis_data:
chatwoot_storage:
首次启动要先等PostgreSQL和Redis就绪,再执行:
docker compose run --rm rails bundle exec rails db:chatwoot_prepare
docker compose up -d rails sidekiq
示例里没写健康检查、日志轮转、反向代理和备份任务,这些生产都要补。版本固定下来,别追 latest;升级前先读发布说明、备份,在副本上验证迁移。
域名、HTTPS和反向代理怎么配置
FRONTEND_URL 要和用户实际访问的地址一致,比如 https://support.example.com。反向代理要转发客户端 IP、协议和 Host,并支持 WebSocket。公网只开 80/443,PostgreSQL、Redis 和容器内部端口别直接暴露到互联网。
上线检查包括:
- HTTP是否强制跳转HTTPS;
- 证书是否自动续期;
- WebSocket连接是否正常;
- 上传大小和代理超时是否匹配附件需求;
- 安全组是否只开放必要端口;
- 管理后台是否启用强密码和MFA;
- 日志中是否泄漏消息正文、令牌或客户邮箱。
换域名不是改个 DNS 就完事。先更新 FRONTEND_URL 和反向代理,再重新验证登录回调、资源地址、Webhook URL 和邮件里的链接。
网站聊天、API收件箱和邮件不是一回事
这次我踩了一个坑:Web Widget 用的是 Channel::WebWidget,而 Public Contact/Conversation/Message API 查的是 API 收件箱的 identifier。把 Web Widget 的 website_token 填进 API 收件箱路径,直接返回 404。
选择方法如下:
- 网站页面需要原生聊天气泡:创建Website收件箱,按官方脚本嵌入并验证域名、跨域、HMAC和实时消息;
- 自有App或业务系统需要把事件送入Chatwoot:创建API收件箱,保存identifier与secret,实现Webhook接收;
- 客户通过邮箱沟通:创建Email收件箱,单独配置入站和出站邮件;
- 社交与消息平台:按对应平台的企业主体、应用、回调、模板和权限流程接入。
不要因为管理后台都显示为“收件箱”,就把不同渠道的令牌和接口混用。
API Webhook为什么会投递失败
API 收件箱的公开回复会通过 Webhook 发回业务系统。这次我先用了一个无效地址,Chatwoot 把回复保存了,界面显示 Failed to send。三个状态要分开盯:
- 客服点击回复;
- Chatwoot数据库生成outgoing消息;
- Webhook或外部渠道实际接受消息。
测本地 Webhook 时,v4.16.2 默认的 SSRF 防护还会拒绝解析到私网 IP 的目标,日志里写着“目标主机没有公网IP”。我这次只在临时隔离的 Sidekiq 上开了 SAFE_FETCH_ALLOW_PRIVATE_NETWORK=true,验收完立刻恢复默认。
生产环境别全局关这个保护。更稳的做法是走 TLS 的公网回调入口,校验签名和重放,再通过受控网络转发到内部服务;真要访问私网目标,先评估云元数据地址、DNS 重绑定、出站白名单和网络隔离。
邮件渠道怎么验收
SMTP 能连上不代表邮件客服能用,至少分别验证这几项:
- 外部邮箱发信后,Chatwoot是否生成新会话或追加到正确线程;
- 客服回复是否到达Gmail、Outlook及主要客户域名;
- SPF、DKIM、DMARC是否正确,邮件是否进入垃圾箱;
- Reply-To、Message-ID和线程引用是否正确;
- 退信、限速和临时失败是否进入可观察队列;
- 附件大小、文件类型和中文文件名是否正常。
SMTP 密码用专用凭据,别复用管理员邮箱密码。邮件量大就选有退信和投诉反馈的邮件服务,别把所有出站邮件压在一台 VPS 的 25 端口上。
WhatsApp和社交平台渠道怎么处理
WhatsApp、Facebook、Instagram、TikTok、Twilio 这些渠道,通常都要平台账号、企业认证、应用权限、回调地址或消息模板。装完 Chatwoot 不会自动拿到授权。
部署计划应把“服务器可用”和“平台渠道可用”拆成两个里程碑:
- 服务器里程碑:Web、Sidekiq、PostgreSQL、Redis、域名、TLS、备份通过;
- 渠道里程碑:平台审核、测试号码或账号、入站、回复、模板、附件、限速分别通过。
没有真实平台凭据时,可以完成服务器端配置清单,但必须把渠道状态写成“待授权验收”。
客服分配、权限和班次怎么设计
不要给所有客服管理员权限。建议按最小权限建立角色:
- 管理员:渠道、成员、自动化和系统配置;
- 主管:查看团队会话、调整分配、处理升级问题;
- 坐席:只访问被授权收件箱和客户会话;
- 审计或分析人员:只读取报表和必要记录。
按品牌、语言或时区建团队,先用简单的人工或自动分配规则。自动化别一口气加太多,每加一条规则,都要能说清楚触发条件、动作、负责人和怎么回滚。夜里没人值班,就把离线提示和预计回复时间写好,别让客户以为对面坐着人。
附件和对象存储怎么选
默认本地存储把文件放在应用 storage 卷里。小规模可以先从本地持久卷起步,但附件涨起来会同时拖累磁盘、备份窗口和迁移时间。要跨实例扩容或者附件很多,就评估 S3 兼容对象存储。
切换对象存储前要验证:
- 上传、下载和预览;
- 私有对象的签名URL与有效期;
- CORS和Content-Type;
- 生命周期、版本控制和跨区域复制;
- 删除客户数据时是否同步删除对象;
- 备份恢复后数据库中的对象键是否仍可访问。
这次 storage 归档只有 87 字节,因为没传附件,所以不能算“附件恢复已通过”。
Chatwoot应该备份哪些内容
官方备份范围包括 PostgreSQL、storage 或对象存储、配置变量、自定义代码。Redis 主要扛队列和缓存,核心客服记录能不能恢复,重点看 PostgreSQL 和持久文件,但故障切换时未处理的任务也得考虑。
建议至少保留:
- PostgreSQL逻辑备份,并定期做恢复演练;
- 本地storage卷或对象存储的独立备份;
.env、反向代理配置和版本清单的加密副本;- 域名、证书、SMTP和平台回调的重建文档;
- 备份时间、校验和、保留策略与责任人。
别只靠同一块系统盘上的快照。误删、勒索、整机故障,应用和“备份”会一起没。
从全新数据卷恢复并验收

我这次用的恢复顺序是:
- 停止Rails和Sidekiq,避免备份期间继续写入;
- 用
pg_dump -Fc导出PostgreSQL; - 归档应用storage;
- 创建全新的数据库、storage和Redis卷;
- 导入数据库并挂载恢复后的storage;
- 使用相同版本和
SECRET_KEY_BASE
启动Rails与Sidekiq; - 通过API和浏览器读取原会话标记;
- 再检查登录、收件箱、附件、Webhook和队列。
恢复时别临时生成新的 SECRET_KEY_BASE,密钥一变,加密数据可能就读不出来。判断恢复成不成功,也不是看容器状态是不是 Up,而是业务数据能读、渠道能继续收发、队列没有一直失败。
如何安全更新Chatwoot
更新前按以下顺序执行:
- 查看官方Release和安全说明,确认目标版本;
- 备份PostgreSQL、storage和配置,并记录校验和;
- 在恢复副本上运行目标版本和数据库迁移;
- 验证登录、收件、回复、附件、Webhook和邮件;
- 选择低峰期更新生产环境,保留回滚镜像和恢复步骤;
- 更新后观察Rails错误率、Sidekiq失败队列、数据库连接和磁盘增长。
别跨多个大版本直接换镜像,也别因为容器能启动就删旧备份。数据库迁移要是不可逆,回滚通常就是恢复数据库,光把镜像标签改回去没用。
常见故障怎么排查
页面能开,但客服登录后反复跳转
检查
FRONTEND_URL、反向代理的协议与Host头、Cookie安全属性和系统时间。域名和HTTPS不一致是常见原因。
客户消息进来了,客服回复却失败
先看消息状态,再看Sidekiq日志。API收件箱重点检查Webhook
URL、DNS、TLS、SSRF防护和接收端返回码;邮件检查SMTP认证、发件域名和退信;平台渠道检查授权、模板与限速。
收件延迟越来越大
观察Sidekiq各队列长度、最老任务等待时间、失败重试、Redis内存和PostgreSQL慢查询。不要只看服务器总CPU。
上传附件后磁盘突然增长
确认Active
Storage使用本地卷还是对象存储,检查附件保留周期、孤立对象清理和日志。扩容前先确认增长来自客户附件还是数据库、镜像或备份副本。
恢复后能登录,但旧附件打不开
通常是只恢复了数据库,没有恢复storage或对象存储;也可能是对象存储凭据、Bucket、区域或签名域名改变。用一组已知附件做逐项验收。
上线前检查表
如何选择萤光云服务器
选地域先看客服和客户在哪。管理后台好不好用,看客服到服务器的链路;网站聊天和 API 回调,还要看客户和业务系统在哪。跨境业务别只看地名,最好从候选地域各测一轮延迟、丢包、晚高峰和实际页面加载。
找萤光云售前之前,把这几样准备好:客服人数、预计同时在线会话、渠道类型、每日邮件量、附件大小和保留期、要不要对象存储、主要访问国家、恢复时间目标、备份保留天数。生产起点按官方 4核8G 评估,再用真实业务压测调整,别拿这次空载快照去压配置。
应用和数据库要分开的话,内网通信、数据库备份、出站访问、故障切换一起规划,不是多买两台机器就行。
FAQ
Chatwoot
2核4G可以生产使用吗?
2核4G 是官方最低量级,适合低负载验证或者非常小的规模起步。生产建议从 4核8G、50GB SSD 往上走,再根据 Sidekiq 队列、附件、数据库和峰值会话调整。
Chatwoot只能用PostgreSQL吗?
官方自托管架构就是 PostgreSQL,这次也是按 PostgreSQL 16 实测的。别擅自换成 MySQL 或 MariaDB。
Redis数据也必须备份吗?
核心联系人、会话和消息在PostgreSQL,Redis用于队列和缓存。本次恢复使用全新Redis仍能读取历史消息,但切换时可能存在未处理任务,因此要在停写、队列排空和恢复步骤中处理任务一致性。
为什么API收件箱回复显示Failed
to send?
最常见是 Webhook 不可达、TLS 或 DNS 失败、接收端返回非 2xx,或者 SSRF 防护拒绝私网地址。数据库里出现 outgoing 消息,不等于业务系统真收到了回调。
可以关闭SSRF防护连接内网Webhook吗?
技术上存在 SAFE_FETCH_ALLOW_PRIVATE_NETWORK
开关,但生产环境全局放开会扩大访问云元数据和内部服务的风险。优先使用受控公网入口、签名校验和网络白名单;必须放开时要单独评审。
只备份PostgreSQL够吗?
不够。还要备份本地storage或对象存储、配置密钥、反向代理和版本信息。只恢复数据库可能看到消息文字,但附件和加密配置仍不可用。
WhatsApp安装后就能直接使用吗?
不能。还需要对应平台的账号、企业或应用授权、回调和可能的消息模板审核。没有真实凭据时只能完成服务器准备,不能宣称渠道接通。
Chatwoot可以替代工单系统吗?
它擅长多渠道会话和客服协作,但复杂审批、研发缺陷流转和严格工单SLA可能仍需专门工单系统或集成。先按业务流程做差距评估。
资料来源
- Chatwoot v4.16.2 Release:https://github.com/chatwoot/chatwoot/releases/tag/v4.16.2
- Self-hosted总览:https://developers.chatwoot.com/self-hosted
- 系统要求:https://developers.chatwoot.com/self-hosted/deployment/requirements
- 生产架构:https://developers.chatwoot.com/self-hosted/deployment/architecture
- 环境变量:https://developers.chatwoot.com/self-hosted/configuration/environment-variables
- 备份:https://developers.chatwoot.com/self-hosted/deployment/backup
- API文档:https://developers.chatwoot.com/api-reference/introduction
本文版本与调研日期为2026-08-02。正式部署前请再次核对当前安全版本、官方文档、平台渠道政策和萤光云实时可售地域。







