
如果你正在寻找一款开源的、能真正落地到业务中的 AI 客户关系管理系统并且希望它能像现代 SaaS 应用一样通过 Docker 一键部署那么“悟空 AICRM”很可能就是你需要的那个答案。过去我们想为团队引入一个 CRM 系统往往面临几个痛点要么是 SaaS 产品价格昂贵、数据不在本地要么是开源项目部署复杂需要手动配置数据库、缓存、消息队列等一系列服务运维成本极高。而悟空 AICRM 的出现正是为了解决这些“最后一公里”的部署难题。它不仅仅是一个 CRM更是一个集成了 AI 能力如智能线索分配、客户画像分析的现代化应用而其最大的亮点之一就是提供了完整的 Docker Compose 部署方案。这意味着无论你是个人开发者、初创团队还是想在企业内部进行私有化部署的技术负责人都可以在10分钟内通过几条命令将一个功能完整、包含前后端、数据库、Redis 等所有依赖的 AICRM 系统跑起来。本文将为你提供一个从零开始的、完整的 Docker 部署指南不仅告诉你每一步怎么做更会解释背后的原理、可能遇到的“坑”以及生产环境的最佳实践。读完本文你将能独立完成悟空 AICRM 的部署、初始化和基本配置。1. 悟空 AICRM 是什么为什么选择 Docker 部署在深入部署细节之前我们有必要先厘清两个核心问题悟空 AICRM 究竟提供了什么价值以及为什么 Docker 部署是它的“正确打开方式”悟空 AICRM是一个基于现代 Web 技术栈开发的开源客户关系管理系统。它的核心目标是通过 AI 技术赋能传统的销售、客服流程。你可以把它理解为一个“开源版的 Salesforce 或 HubSpot 的轻量替代品”但更侧重于利用 AI 进行自动化处理例如智能线索评分与分配系统可以自动分析潜在客户Leads的行为数据为其打分并推荐或自动分配给最合适的销售。客户交互分析集成邮件、聊天记录AI 可以总结沟通要点、识别客户情绪和意向。自动化工作流基于规则或 AI 预测自动触发后续任务、邮件提醒等。那么为什么强烈推荐使用 Docker 部署环境一致性传统部署需要你在服务器上手动安装特定版本的 Node.js、Python、Java、MySQL、Redis、Nginx 等。任何版本不匹配都可能导致应用无法运行。Docker 将应用及其所有依赖打包成一个镜像确保了“开发、测试、生产”环境完全一致。简化依赖管理悟空 AICRM 作为一个全栈应用依赖服务多。Docker Compose 通过一个docker-compose.yml文件就能定义和启动所有服务Web前端、后端API、数据库、缓存等并处理好它们之间的网络连接极大地降低了部署复杂度。快速启动与隔离整个过程几乎就是“下载镜像 - 启动容器”。每个服务运行在独立的容器中相互隔离避免端口冲突和依赖污染。易于维护与扩展更新版本时通常只需要拉取新镜像并重启容器。对于生产环境可以方便地结合 CI/CD 进行自动化部署和水平扩展。简单说Docker 部署将原本可能需要半天甚至更久的系统搭建工作压缩到了喝杯咖啡的时间让你能快速体验和评估这套系统的核心能力。2. 部署前准备环境与工具检查在运行任何命令之前请确保你的服务器或本地开发机满足以下条件。这是后续所有步骤能够成功的基础。2.1 系统要求操作系统Linux (推荐 Ubuntu 20.04/22.04 LTS, CentOS 7/8), macOS, 或 Windows 10/11 (需使用 WSL2)。本文将以Ubuntu 22.04为例进行说明。内存建议至少4GB。如果同时运行多个服务如 MySQL、Redis、后端、前端内存不足会导致容器异常退出。磁盘空间至少 10GB 可用空间用于存放 Docker 镜像和应用数据。网络服务器需要能正常访问互联网以下载 Docker 镜像和可能的 NPM 包如果构建前端镜像。2.2 必需工具安装你需要安装两个核心工具Docker 和 Docker Compose。1. 安装 Docker Engine访问 Docker 官方文档总是最稳妥的选择。以下是 Ubuntu 22.04 的安装步骤摘要# 1. 卸载旧版本如有 sudo apt-get remove docker docker-engine docker.io containerd runc # 2. 更新 apt 包索引并安装依赖包 sudo apt-get update sudo apt-get install ca-certificates curl gnupg lsb-release # 3. 添加 Docker 的官方 GPG 密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 4. 设置稳定版仓库 echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 5. 安装 Docker Engine sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin # 6. 验证安装是否成功 sudo docker run hello-world如果看到 “Hello from Docker!” 的输出说明 Docker 安装成功。2. 安装 Docker Compose从 Docker Compose V2 开始它已作为 Docker Engine 的一个插件 (docker-compose-plugin) 提供。我们上面安装的docker-compose-plugin已经包含了它。你可以通过以下命令验证docker compose version输出应类似Docker Compose version v2.xx.x。3. (可选但推荐) 配置非 root 用户运行 Docker为了避免每次命令都加sudo可以将当前用户加入docker组。sudo usermod -aG docker $USER重要执行此命令后你需要完全退出当前终端会话并重新登录或者重启服务器才能使组权限生效。完成以上步骤后你的基础环境就已经准备好了。3. 获取悟空 AICRM 部署文件悟空 AICRM 的 Docker 部署文件通常托管在代码仓库如 GitHub、Gitee中。你需要获取这些配置文件。假设项目的 Docker 部署目录结构如下这是典型结构具体以官方仓库为准wukong-aicrm-docker/ ├── docker-compose.yml # 核心编排文件 ├── .env.example # 环境变量示例文件 ├── backend/ # 后端服务相关配置可能包含Dockerfile ├── frontend/ # 前端服务相关配置可能包含Dockerfile或nginx配置 ├── mysql/ # MySQL初始化脚本目录 │ └── init.sql └── redis/ # Redis配置文件目录 └── redis.conf获取方式从版本仓库克隆推荐# 替换为实际的仓库地址 git clone https://github.com/wukong-aicrm/wukong-aicrm-docker.git cd wukong-aicrm-docker或下载 ZIP 包如果项目提供 Releases可以直接下载最新版本的 ZIP 包并解压。进入项目根目录后第一件事就是配置环境变量。4. 核心配置详解环境变量与 Docker Compose 文件部署的成败八成取决于配置是否正确。我们来深入理解两个核心文件。4.1 配置环境变量 (.env 文件)项目通常会提供一个.env.example文件。你需要复制它并创建自己的.env文件然后根据你的环境进行修改。cp .env.example .env编辑.env文件以下是一些必须关注和修改的关键变量变量名仅为示例请以实际文件为准# 数据库配置 MYSQL_ROOT_PASSWORDYourStrongRootPassword123! # MySQL root 密码务必修改为强密码 MYSQL_DATABASEwukong_crm # 应用使用的数据库名 MYSQL_USERwukong_user # 应用数据库用户 MYSQL_PASSWORDYourStrongUserPassword456! # 应用数据库用户密码务必修改 # Redis 配置 REDIS_PASSWORDYourRedisPassword789! # Redis 访问密码务必修改 # 后端应用配置 BACKEND_SECRET_KEYYourVeryLongAndRandomSecretKeyForBackend! # 后端加密密钥务必修改且足够复杂 DATABASE_URLmysql://wukong_user:YourStrongUserPassword456!mysql:3306/wukong_crm # 数据库连接串根据上面配置自动生成检查即可 REDIS_URLredis://:YourRedisPassword789!redis:6379/0 # Redis连接串检查即可 # 前端应用配置如API地址 VITE_API_BASE_URLhttp://your-server-ip-or-domain:3000/api # 前端调用后端的地址。本地测试可先用 localhost生产环境必须改为公网IP或域名安全警告绝对不要使用示例中的默认密码。MYSQL_ROOT_PASSWORD,BACKEND_SECRET_KEY等是最高权限密钥一旦泄露可能导致严重安全风险。生产环境务必使用强密码大小写字母、数字、特殊字符组合长度大于12位。4.2 理解 Docker Compose 文件docker-compose.yml文件定义了所有服务。理解它有助于排错和自定义。一个简化的示例可能如下version: 3.8 services: mysql: image: mysql:8.0 container_name: wukong-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} volumes: - ./mysql/data:/var/lib/mysql # 数据持久化 - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql # 初始化脚本 networks: - wukong-network healthcheck: # 健康检查确保数据库就绪后再启动后端 test: [CMD, mysqladmin, ping, -h, localhost, -u, root, -p${MYSQL_ROOT_PASSWORD}] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine container_name: wukong-redis restart: unless-stopped command: redis-server --requirepass ${REDIS_PASSWORD} volumes: - ./redis/data:/data - ./redis/redis.conf:/usr/local/etc/redis/redis.conf networks: - wukong-network backend: build: ./backend # 或使用 image: wukong-aicrm-backend:latest container_name: wukong-backend restart: unless-stopped depends_on: mysql: condition: service_healthy # 依赖数据库健康状态 redis: condition: service_started environment: - DATABASE_URL${DATABASE_URL} - REDIS_URL${REDIS_URL} - SECRET_KEY${BACKEND_SECRET_KEY} volumes: - ./backend/logs:/app/logs networks: - wukong-network ports: - 3000:3000 # 将容器内端口映射到主机 frontend: build: ./frontend # 或使用 image: wukong-aicrm-frontend:latest container_name: wukong-frontend restart: unless-stopped depends_on: - backend environment: - VITE_API_BASE_URL${VITE_API_BASE_URL} networks: - wukong-network ports: - 80:80 # 前端通常映射到80或443端口 networks: wukong-network: driver: bridge关键点解读volumes: 将主机目录挂载到容器内实现数据持久化。如果删除容器./mysql/data目录下的数据依然存在。depends_on: 定义启动顺序。但condition: service_healthy更可靠它会等待 MySQL 健康检查通过后再启动后端。networks: 所有服务加入同一个自定义网络wukong-network这样它们可以通过服务名如mysql,redis,backend相互访问而不是 IP 地址。ports: 将容器端口映射到主机端口。backend:3000映射到主机3000端口frontend:80映射到主机80端口。5. 启动与初始化一键部署全流程配置完成后启动服务就非常简单了。5.1 启动所有服务在包含docker-compose.yml和.env文件的目录下执行docker compose up -d-d参数表示在“后台”detached模式运行。命令会依次执行拉取镜像如果本地没有、构建镜像如果配置了build、创建网络、启动容器。5.2 查看启动状态与日志启动后建议检查服务状态和日志确保一切正常。查看所有容器状态docker compose ps你应该看到所有服务mysql, redis, backend, frontend的状态都是Up。查看特定服务的日志例如查看后端启动日志docker compose logs -f backend-f参数可以实时跟随follow日志输出。初次启动时后端可能需要一些时间执行数据库迁移Migration和初始化。在日志中寻找Application startup complete、Database migration succeeded或类似的成功信息。如果看到数据库连接错误可能是 MySQL 尚未完全启动稍等片刻再查看。查看所有服务的聚合日志docker compose logs -f5.3 执行数据库迁移与初始化大多数现代应用包括悟空 AICRM使用 ORM 框架如 TypeORM, Sequelize, Prisma需要在首次启动时创建数据库表结构。这通常通过“迁移Migration”脚本完成。如何判断是否需要手动迁移自动迁移如果backend服务的 Dockerfile 或启动命令中包含了执行迁移的步骤例如npm run migration:run那么启动时就会自动完成。查看后端启动日志即可确认。手动迁移如果日志提示需要手动运行迁移或者官方文档有明确要求你需要进入后端容器执行命令# 进入后端容器 docker compose exec backend sh # 在容器内部执行迁移命令具体命令请参考项目文档以下是示例 # npm run typeorm:run-migrations # 或 # npx prisma migrate deploy执行成功后退出容器 (exit)。5.4 访问系统假设你的服务器 IP 是192.168.1.100并且前端映射到了主机的80端口。访问前端在浏览器中输入http://192.168.1.100。你应该能看到悟空 AICRM 的登录界面。验证后端 API访问http://192.168.1.100:3000/api/health或类似健康检查端点应该返回{status:ok}等信息。首次登录通常系统会有一个默认的管理员账号。请务必查阅项目的README.md或官方文档找到默认的账号密码例如admin/admin123并在登录后第一时间修改密码。6. 常见问题与详细排查指南即使按照教程操作你也可能会遇到一些问题。以下是部署过程中最常见的问题及其解决方案。问题现象可能原因排查方式解决方案docker compose up失败提示Cannot connect to the Docker daemonDocker 服务未启动或当前用户无权限。运行systemctl status docker或sudo docker ps。1. 启动 Docker:sudo systemctl start docker。2. 将用户加入 docker 组后重新登录终端。容器启动后立即退出 (Exited)状态码非01. 环境变量配置错误如密码含特殊字符未转义。2. 依赖服务未就绪后端连不上数据库。3. 应用本身启动错误。docker compose logs service-name查看该容器退出前的日志。1. 检查.env文件确保密码格式正确必要时用引号包裹。2. 检查depends_on和健康检查配置确保等待时间足够。3. 根据日志错误信息搜索解决方案。前端能打开但页面空白或提示“无法连接到API”1. 前端配置的VITE_API_BASE_URL不正确。2. 后端服务未成功启动。3. 网络策略/防火墙阻止了端口访问。1. 浏览器按 F12 打开开发者工具查看“网络(Network)”标签页API 请求是否失败。2.docker compose ps检查后端容器状态。3.curl http://localhost:3000/api/health在服务器内部测试后端。1. 修正.env中的VITE_API_BASE_URL确保指向正确的后端地址容器内通信通常用服务名如http://backend:3000但前端构建时需要主机能访问的地址。2. 重启后端服务docker compose restart backend。3. 检查服务器安全组/防火墙放行3000端口。数据库连接失败日志显示Access denied for user1. 数据库用户名或密码错误。2. 数据库用户权限不足。3. MySQL 容器未初始化完成。1. 核对.env中的MYSQL_USER和MYSQL_PASSWORD。2. 进入 MySQL 容器检查用户和权限docker compose exec mysql mysql -uroot -p然后执行SHOW GRANTS FOR wukong_user%;1. 确保密码一致且特殊字符已正确处理。2. 重新创建用户并授权GRANT ALL PRIVILEGES ON wukong_crm.* TO wukong_user%; FLUSH PRIVILEGES;3. 检查mysql/init.sql初始化脚本是否执行成功。端口冲突提示Bind for 0.0.0.0:80 failed: port is already allocated主机上的 80 端口已被其他程序如 Nginx, Apache占用。运行sudo netstat -tulpn | grep :80查看占用进程。1. 停止占用端口的服务如果不需用。2. 修改docker-compose.yml中前端服务的端口映射例如改为8080:80然后通过http://ip:8080访问。磁盘空间不足镜像拉取或容器启动失败服务器/var/lib/docker目录空间不足。运行df -h和docker system df查看磁盘和 Docker 资源使用情况。1. 清理无用的 Docker 资源docker system prune -a谨慎操作会删除所有未使用的镜像、容器、网络。2. 为 Docker 配置更大的数据目录或扩容磁盘。7. 生产环境部署最佳实践将悟空 AICRM 用于实际业务时仅完成基础部署是远远不够的。以下是为生产环境加固的建议。7.1 安全加固修改所有默认密码和密钥这包括.env文件中的数据库密码、Redis 密码、后端 Secret Key。使用密码管理器生成并保存强密码。使用非 root 用户运行容器在服务的 Dockerfile 或docker-compose.yml中应指定非 root 用户。# 在 docker-compose.yml 的服务配置中示例 backend: # ... 其他配置 user: node:node # 假设后端使用Node.js使用node用户限制容器资源防止某个容器异常占用所有资源。backend: # ... 其他配置 deploy: resources: limits: cpus: 1.0 memory: 1G reservations: memory: 512M配置 HTTPS使用 Nginx 或 Traefik 作为反向代理配置 SSL 证书如 Let‘s Encrypt 免费证书将 HTTP 流量重定向到 HTTPS。隔离网络为数据库等敏感服务配置更严格的内部网络仅允许后端应用访问。7.2 数据持久化与备份确保 Volume 映射正确确认docker-compose.yml中 MySQL 和 Redis 的数据目录如./mysql/data已正确挂载到主机。这是数据不丢失的生命线。定期备份数据库编写脚本定期执行mysqldump并将备份文件传输到远程存储或对象存储。# 示例备份脚本 backup.sh #!/bin/bash BACKUP_DIR/path/to/backups DATE$(date %Y%m%d_%H%M%S) docker compose exec -T mysql mysqldump -u root -p${MYSQL_ROOT_PASSWORD} wukong_crm ${BACKUP_DIR}/wukong_crm_${DATE}.sql # 然后可以使用 scp/rclone 等工具将备份文件传走考虑使用 Docker Volume对于生产环境使用命名的 Docker Volume (volumes:块定义) 可能比绑定挂载主机路径更易于管理和迁移。7.3 监控与日志集中日志管理将容器的日志导出到 ELKElasticsearch, Logstash, Kibana或 Loki Grafana 等日志平台便于查询和分析。应用监控为后端服务添加健康检查端点并使用 Prometheus 收集指标用 Grafana 展示。容器监控使用docker stats或cAdvisor监控容器的 CPU、内存使用情况。7.4 更新与维护更新策略关注项目 Releases。更新时建议流程为备份数据库 - 拉取新代码/镜像 - 停止旧容器 - 启动新容器。使用docker compose pull和docker compose up -d可以完成更新。版本控制将你的docker-compose.yml和.env.example注意不要提交真实的.env文件纳入 Git 版本控制。使用 .env 文件管理敏感信息永远不要将包含真实密码的.env文件提交到代码仓库。在生产服务器上单独管理此文件。8. 进阶自定义与扩展基础部署完成后你可能需要根据自身业务进行调整。8.1 修改前端配置前端配置如网站标题、Logo、主题色通常需要通过构建环境变量或修改配置文件来实现。你需要找到前端项目中的配置文件如src/config.js或环境变量文件。修改 Dockerfile 或docker-compose.yml在构建时传入新的环境变量。重新构建前端镜像docker compose build frontend然后重启服务docker compose up -d frontend。8.2 集成外部服务悟空 AICRM 可能需要连接外部邮件服务器SMTP、对象存储如 MinIO、阿里云 OSS或第三方 AI 服务 API。邮件服务在后端的.env或配置文件中添加SMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASS等变量。对象存储同样通过环境变量配置 Access Key, Secret Key, Endpoint, Bucket 等信息。重启后端服务以使新配置生效。8.3 性能调优数据库索引随着数据量增长需要根据慢查询日志为数据库表添加合适的索引。Redis 缓存确保高频访问但更新不频繁的数据如配置、用户会话已正确缓存。前端资源优化配置 Nginx 对静态资源JS, CSS, 图片进行 Gzip 压缩和浏览器缓存。通过以上步骤你不仅成功部署了悟空 AICRM更建立了一个可维护、可扩展、相对安全的 Docker 化应用运行环境。这套方法论同样适用于部署其他复杂的开源项目。记住遇到问题时docker compose logs是你的第一把钥匙而官方文档和 Issues 页面则是寻找答案的最佳场所。