1. MaxKB4j 项目概述与核心价值

MaxKB4j 是一款基于知识库构建的开源问答系统,能够帮助企业快速搭建智能客服、内部知识库等应用场景。它采用前后端分离架构,后端基于 Java 开发,前端使用 Vue.js 框架,通过 RESTful API 进行数据交互。使用 Docker Compose 部署 MaxKB4j 是目前最推荐的方案,能够实现一键式环境搭建和依赖管理。

在实际生产环境中,我们经常遇到以下痛点:

  • 传统部署方式需要手动安装 JDK、MySQL、Redis 等多个组件
  • 各组件版本兼容性问题难以排查
  • 系统迁移或升级过程复杂
  • 开发、测试、生产环境难以保持一致

Docker Compose 方案完美解决了这些问题。通过容器化技术,我们可以:

  1. 实现秒级环境搭建
  2. 确保各服务版本完美兼容
  3. 轻松实现环境迁移和版本升级
  4. 保持多环境一致性

2. 环境准备与前置条件

2.1 硬件与操作系统要求

建议部署环境满足以下最低配置:

  • CPU:2核及以上(x86_64架构)
  • 内存:4GB及以上
  • 磁盘空间:20GB可用空间
  • 操作系统:Ubuntu 18.04+/CentOS 7+/Debian 10+

注意:生产环境建议使用 SSD 存储,能显著提升数据库性能。如果使用云服务器,建议选择计算优化型实例。

2.2 基础软件安装

首先需要安装 Docker 和 Docker Compose:

# 安装 Docker
curl -fsSL https://get.docker.com | sh
sudo systemctl enable --now docker

# 安装 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

验证安装是否成功:

docker --version
docker-compose --version

2.3 网络与防火墙配置

确保服务器开放以下端口:

  • 80/443:Web 访问
  • 3306:MySQL(建议仅内网开放)
  • 6379:Redis(建议仅内网开放)

如果使用云服务器,还需要在安全组中放行这些端口。

3. Docker Compose 文件解析与定制

3.1 基础 compose 文件结构

创建一个 docker-compose.yml 文件,包含以下核心服务:

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: maxkb-mysql
    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
    ports:
      - "3306:3306"
    networks:
      - maxkb-network

  redis:
    image: redis:6.2
    container_name: maxkb-redis
    volumes:
      - redis_data:/data
    ports:
      - "6379:6379"
    networks:
      - maxkb-network

  backend:
    image: maxkb4j/backend:latest
    container_name: maxkb-backend
    depends_on:
      - mysql
      - redis
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/${MYSQL_DATABASE}?useSSL=false&characterEncoding=utf8
      SPRING_DATASOURCE_USERNAME: ${MYSQL_USER}
      SPRING_DATASOURCE_PASSWORD: ${MYSQL_PASSWORD}
      SPRING_REDIS_HOST: redis
    ports:
      - "8080:8080"
    networks:
      - maxkb-network

  frontend:
    image: maxkb4j/frontend:latest
    container_name: maxkb-frontend
    depends_on:
      - backend
    ports:
      - "80:80"
    networks:
      - maxkb-network

volumes:
  mysql_data:
  redis_data:

networks:
  maxkb-network:
    driver: bridge

3.2 环境变量配置

创建 .env 文件配置敏感信息:

MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_DATABASE=maxkb
MYSQL_USER=maxkb
MYSQL_PASSWORD=your_db_password

重要安全提示:永远不要将 .env 文件提交到版本控制系统!建议将其添加到 .gitignore 中。

3.3 高级定制选项

3.3.1 资源限制

为防止单个容器占用过多资源,可以添加资源限制:

services:
  mysql:
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 2G
        reservations:
          memory: 1G
3.3.2 健康检查

添加健康检查确保服务可用性:

backend:
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
    interval: 30s
    timeout: 10s
    retries: 3
3.3.3 日志配置

配置日志轮转防止日志文件过大:

services:
  backend:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

4. 部署与初始化流程

4.1 启动服务

执行以下命令启动所有服务:

docker-compose up -d

启动后可以使用以下命令查看服务状态:

docker-compose ps

4.2 初始化数据库

首次启动需要初始化数据库表结构:

docker exec -it maxkb-backend sh -c "java -jar app.jar --spring.profiles.active=prod --maxkb.init-db=true"

4.3 访问系统

服务启动完成后,可以通过以下方式访问:

  • 前端:http://your-server-ip
  • 后端API:http://your-server-ip:8080

默认管理员账号:

  • 用户名:admin
  • 密码:maxkb@123

安全提示:首次登录后请立即修改默认密码!

5. 运维与常见问题排查

5.1 日常运维命令

常用 Docker Compose 命令速查表:

命令 说明
docker-compose up -d 启动所有服务(后台运行)
docker-compose down 停止并移除所有容器
docker-compose logs -f [service] 查看服务日志
docker-compose ps 查看服务状态
docker-compose restart [service] 重启指定服务
docker-compose pull 拉取最新镜像

5.2 常见问题解决方案

5.2.1 MySQL 连接失败

错误现象:

backend_1  | Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

解决方案:

  1. 检查 MySQL 容器是否正常运行: docker-compose ps
  2. 验证网络连接: docker exec -it maxkb-backend ping mysql
  3. 检查 MySQL 日志: docker-compose logs mysql
5.2.2 前端无法访问后端API

错误现象:前端页面显示 API 请求失败。

解决方案:

  1. 检查前端配置中的 API 地址是否正确
  2. 验证后端服务是否正常: curl http://localhost:8080/actuator/health
  3. 检查网络配置,确保前端容器能访问后端容器
5.2.3 容器启动顺序问题

错误现象:后端启动时 MySQL 还未准备好。

解决方案:

  1. 在 compose 文件中添加 depends_on 和健康检查
  2. 后端应用添加连接重试逻辑:
environment:
  SPRING_DATASOURCE_HIKARI_CONNECTION-TIMEOUT: 30000
  SPRING_DATASOURCE_HIKARI_INITIALIZATION-FAIL-TIMEOUT: 60000

5.3 备份与恢复

5.3.1 数据库备份
docker exec maxkb-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > backup.sql
5.3.2 恢复数据库
cat backup.sql | docker exec -i maxkb-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"'
5.3.3 完整系统备份

建议备份以下内容:

  1. MySQL 数据卷
  2. Redis 数据卷
  3. 应用配置文件
  4. Docker Compose 文件

6. 性能优化与扩展

6.1 数据库优化

生产环境建议调整以下 MySQL 参数:

mysql:
  command: [
    '--innodb_buffer_pool_size=1G',
    '--innodb_log_file_size=256M',
    '--max_connections=200'
  ]

6.2 Redis 优化

redis:
  command: [
    '--maxmemory 1gb',
    '--maxmemory-policy allkeys-lru'
  ]

6.3 水平扩展方案

对于高并发场景,可以考虑:

  1. 后端服务多实例:
backend:
  deploy:
    replicas: 3
  1. 前端负载均衡:
frontend:
  image: nginx:latest
  ports:
    - "80:80"
  volumes:
    - ./nginx.conf:/etc/nginx/nginx.conf

6.4 监控方案

推荐使用以下工具监控系统运行状态:

  1. cAdvisor:容器资源监控
  2. Prometheus + Grafana:系统指标监控
  3. ELK:日志收集与分析

7. 安全加固建议

7.1 网络隔离

建议将内部服务(MySQL、Redis)放在独立网络:

networks:
  maxkb-internal:
    internal: true
  maxkb-external:
    driver: bridge

7.2 最小权限原则

为 MySQL 创建专用用户而非使用 root:

CREATE USER 'maxkb'@'%' IDENTIFIED BY 'complex_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON maxkb.* TO 'maxkb'@'%';
FLUSH PRIVILEGES;

7.3 定期更新

建议定期更新镜像版本:

docker-compose pull
docker-compose up -d --force-recreate

7.4 HTTPS 配置

生产环境必须启用 HTTPS:

frontend:
  ports:
    - "443:443"
  volumes:
    - ./ssl:/etc/nginx/ssl

8. 版本升级与迁移

8.1 版本升级流程

  1. 备份数据和配置文件
  2. 停止当前服务: docker-compose down
  3. 更新 compose 文件和镜像版本
  4. 启动新版本: docker-compose up -d
  5. 执行数据迁移脚本(如有)

8.2 环境迁移步骤

  1. 在原环境备份数据
  2. 将备份文件、compose 文件和 .env 复制到新环境
  3. 在新环境恢复数据
  4. 启动服务

8.3 回滚方案

如果升级出现问题,可以快速回滚:

docker-compose down
docker-compose up -d --force-recreate backend=maxkb4j/backend:previous-version

9. 实际部署经验分享

在多个生产环境部署 MaxKB4j 后,我总结了以下实战经验:

  1. 资源分配 :MySQL 和 Redis 对内存敏感,建议单独分配足够资源。曾经遇到过一个案例,Redis 内存不足导致频繁淘汰缓存,系统响应时间从 200ms 飙升到 2s+。

  2. 连接池配置 :后端应用的数据库连接池大小需要根据实际负载调整。一般建议:

    • 初始连接数 = CPU核心数 × 2
    • 最大连接数不超过数据库的 max_connections 的 80%
  3. 日志收集 :一定要配置日志轮转和集中收集。有次线上问题排查时,发现某个容器的日志已经占满了磁盘空间。

  4. 健康检查 :完善的健康检查能帮助快速发现问题。我们曾经因为缺少 Redis 健康检查,导致系统在 Redis 宕机后仍接收请求,造成大量失败。

  5. 监控告警 :基础监控是必须的,建议至少监控:

    • 容器内存/CPU 使用率
    • 数据库连接数
    • API 响应时间
    • 错误日志关键字
  6. 测试环境 :一定要保持测试环境与生产环境配置一致。曾经因为测试环境使用了不同的 MySQL 参数,导致一个性能问题直到上线才被发现。

  7. 文档记录 :详细记录部署架构图和运维手册。当新人接手或紧急情况发生时,完善的文档能节省大量时间。

更多推荐