Skip to main content
部署前准备:
  • 已完成开发环境搭建(参考快速开始文档)
  • 服务器满足最低硬件要求:8GB内存、50GB硬盘、4核CPU
  • 已安装JDK 17、MySQL 8.x、Redis 6.x
  • 已配置向量数据库和对象存储服务
  • 重要: 确保Nginx配置支持流式消息传输,这对AI对话体验至关重要

部署架构

LangChat Pro采用前后端分离部署架构,支持单机部署和集群部署。

后端部署

Step 1: 项目打包

1

编译打包

进入项目根目录,执行Maven打包命令:
# 清理并编译
mvn clean compile

# 打包生成部署文件
mvn clean package -Dmaven.test.skip=true
打包完成后,在 langchat-bootstrap/target/ 目录下会生成以下文件:
  • langchat-bootstrap-bin.tar.gz - 完整的部署包
  • langchat-bootstrap.jar - 可执行JAR文件
2

解压部署包

将生成的部署包上传到服务器并解压:
# 上传部署包到服务器
scp langchat-bootstrap-bin.tar.gz user@server:/opt/langchat/

# 在服务器上解压
cd /opt/langchat/
tar -xzf langchat-bootstrap-bin.tar.gz
解压后的目录结构:
.
├── bin/                    # 脚本目录
│   ├── start.sh           # 启动脚本
│   └── stop.sh            # 停止脚本
├── config/                 # 配置目录
│   ├── application-dev.yml # 开发环境配置
│   ├── application-local.yml # 本地环境配置
│   ├── application-prd.yml # 生产环境配置
│   ├── application.yml     # 主配置文件
│   └── banner.txt         # 启动横幅
└── lib/                    # 依赖库目录
    └── langchat-bootstrap.jar # 主程序JAR文件
3

配置环境

修改 config/application-prd.yml 生产环境配置文件:
server:
  port: 8100

spring:
  # 数据库配置
  datasource:
    username: langchat
    password: your_production_password
    url: jdbc:mysql://127.0.0.1:3306/langchat_pro?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    druid:
      keep-alive: true

  # Redis配置
  data:
    redis:
      port: 6379
      host: 127.0.0.1
      database: 1
      password: your_redis_password
      jedis:
        pool:
          max-wait: 2000
          time-between-eviction-runs: 1000

langchat:
  searxng:
    enabled: true
    duration: 10
    url: http://127.0.0.1:8081
    max-results: 10
    max-results-limit: 50
  excalidraw:
    url: http://127.0.0.1:3000
  oss:
    # 固定填写,本地:local-plus(nginx)、七牛:qiniu-kodo、阿里OSS:aliyun-oss、腾讯OSS:tencent-cos、minio: minio
    default-platform: minio
    local-plus:
      - platform: local-plus
        # 是否启用
        enable-storage: false
        # 访问域名
        domain: http://your-domain.com/
        # 文件夹名称
        base-path: langchat-oss/
        # 本地存储路径
        storage-path: /var/www/langchat-oss/
    qiniu-kodo:
      - platform: qiniu-kodo
        # 是否启用
        enable-storage: false
        access-key: your_access_key
        secret-key: your_secret_key
        # 桶名称
        bucket-name: your_bucket_name
        # 文件夹名称
        base-path: langchat-oss/
        # 访问域名
        domain: your_domain
    aliyun-oss:
      - platform: aliyun-oss
        # 是否启用
        enable-storage: false
        access-key: your_access_key
        secret-key: your_secret_key
        # 桶名称
        bucket-name: your_bucket_name
        # 访问域名
        end-point: oss-cn-hangzhou.aliyuncs.com
    tencent-cos:
      - platform: tencent-cos
        # 是否启用
        enable-storage: false
        secret-id: your_secret_id
        secret-key: your_secret_key
        # 区域
        region: ap-beijing
        # 桶名称
        bucket-name: your_bucket_name
        # 访问域名
        domain: your_domain
    minio:
      - platform: minio
        # 是否启用
        enable-storage: true
        secret-key: minioadmin
        access-key: minioadmin
        # 桶名称
        bucket-name: langchat-oss
        # 访问域名
        end-point: http://127.0.0.1:9000/
4

启动服务

使用提供的脚本启动服务:
# 启动服务
./bin/start.sh

# 查看启动状态
./bin/status.sh

# 查看日志(日志文件会在运行时自动创建)
tail -f logs/langchat-bootstrap.log
启动脚本会自动:
  • 检查Java环境
  • 设置JVM参数
  • 启动Spring Boot应用
  • 生成PID文件用于进程管理
5

验证部署

检查服务是否正常启动:
# 检查健康状态
curl http://localhost:8100/api/health

# 检查API接口
curl http://localhost:8100/api/v1/chat/models

# 检查端口监听
netstat -tlnp | grep 8100

服务管理

./bin/start.sh
启动脚本会:
  • 检查Java环境
  • 设置JVM参数(内存、GC等)
  • 启动Spring Boot应用
  • 记录PID到 langchat-bootstrap.pid 文件
./bin/stop.sh
停止脚本会:
  • 读取PID文件
  • 优雅关闭应用
  • 清理PID文件
./bin/restart.sh
重启脚本会:
  • 先停止服务
  • 等待进程完全退出
  • 再启动服务
./bin/status.sh
状态脚本会:
  • 检查PID文件
  • 验证进程是否运行
  • 显示服务状态信息

前端部署

Step 1: 构建前端

1

安装依赖

cd langchat-ui
pnpm install
2

构建生产版本

# 构建生产版本
pnpm build

# 或者使用Turbo构建
pnpm turbo build --filter=langchat
构建完成后,在 apps/langchat/dist/ 目录下生成静态文件。
3

配置Nginx

创建Nginx配置文件 /etc/nginx/sites-available/langchat
worker_processes 1;
events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    server {
        listen 80;
        server_name your-domain.com;  # 替换为您的域名
        
        # 前端静态文件
        location / {
            root /var/www/langchat;
            index index.html;
            try_files $uri $uri/ /index.html;
            
            # 缓存静态资源
            location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
                expires 1y;
                add_header Cache-Control "public, immutable";
            }
        }
        
        # API代理 - 流式消息支持
        location ^~ /api/ {
            proxy_pass http://127.0.0.1:8100;
            rewrite ^/api/(.*)$ /$1 break;
            
            # 流式消息关键配置
            chunked_transfer_encoding on;    # 启用分块传输编码
            proxy_cache off;                 # 关闭代理缓存
            proxy_buffering off;             # 关闭代理缓冲
            tcp_nopush on;                   # 启用TCP_NOPUSH
            tcp_nodelay on;                  # 启用TCP_NODELAY
            
            # 超时设置(流式消息需要较长的超时时间)
            proxy_connect_timeout 15s;
            proxy_send_timeout 15s;
            proxy_read_timeout 15s;
            
            # 请求头设置
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
        
        # WebSocket支持(如果需要)
        location /ws/ {
            proxy_pass http://127.0.0.1:8100/ws/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
        }
    }
}
4

部署静态文件

# 创建部署目录
sudo mkdir -p /var/www/langchat

# 复制构建文件
sudo cp -r apps/langchat/dist/* /var/www/langchat/

# 设置权限
sudo chown -R www-data:www-data /var/www/langchat
sudo chmod -R 755 /var/www/langchat

# 启用站点
sudo ln -s /etc/nginx/sites-available/langchat /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

流式消息配置说明

流式消息核心配置:
  • chunked_transfer_encoding on - 启用分块传输编码,支持流式数据传输
  • proxy_cache off - 关闭代理缓存,避免缓存影响实时数据
  • proxy_buffering off - 关闭代理缓冲,确保数据立即转发
  • tcp_nopush on - 启用TCP_NOPUSH,优化网络传输
  • tcp_nodelay on - 启用TCP_NODELAY,减少延迟
流式消息超时配置:
  • proxy_connect_timeout 15s - 连接超时时间
  • proxy_send_timeout 15s - 发送超时时间
  • proxy_read_timeout 15s - 读取超时时间
对于长时间运行的AI对话,可能需要适当增加超时时间
流式消息性能优化:
  • 使用 location ^~ /api/ 确保API请求优先匹配
  • 使用 rewrite 规则简化URL路径
  • 设置合适的 worker_connections 支持并发连接

监控和日志

日志管理

# 查看应用日志
tail -f /opt/langchat/logs/langchat-bootstrap.log

# 查看错误日志
grep ERROR /opt/langchat/logs/langchat-bootstrap.log

# 日志轮转(使用logrotate)
sudo vim /etc/logrotate.d/langchat
# 监控进程状态
ps aux | grep langchat-bootstrap

# 监控内存使用
free -h

# 监控磁盘使用
df -h

# 监控网络连接
netstat -tlnp | grep 8100

性能优化

JVM优化

根据服务器配置调整JVM参数:
# 编辑启动脚本
vim /opt/langchat/bin/start.sh
推荐JVM参数:
# 8GB内存服务器
JAVA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+UseStringDeduplication"

# 16GB内存服务器
JAVA_OPTS="-Xms4g -Xmx8g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+UseStringDeduplication"

# 32GB内存服务器
JAVA_OPTS="-Xms8g -Xmx16g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+UseStringDeduplication"

数据库优化

-- 检查慢查询
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';

-- 优化配置
SET GLOBAL innodb_buffer_pool_size = 1073741824; -- 1GB
SET GLOBAL innodb_log_file_size = 268435456; -- 256MB
SET GLOBAL max_connections = 200;
# Redis配置优化
vim /etc/redis/redis.conf
关键配置:
maxmemory 2gb
maxmemory-policy allkeys-lru
save 900 1
save 300 10
save 60 10000

安全配置

网络安全

# 开放必要端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 22/tcp

# 限制数据库端口访问
sudo ufw allow from 127.0.0.1 to any port 3306
sudo ufw allow from 127.0.0.1 to any port 6379
# 安装Certbot
sudo apt install certbot python3-certbot-nginx

# 获取SSL证书
sudo certbot --nginx -d your-domain.com

# 自动续期
sudo crontab -e
# 添加:0 12 * * * /usr/bin/certbot renew --quiet

备份策略

数据备份

# 创建备份脚本
vim /opt/scripts/backup.sh
备份脚本内容:
#!/bin/bash
BACKUP_DIR="/opt/backups"
DATE=$(date +%Y%m%d_%H%M%S)

# MySQL备份
mysqldump -u root -p langchat_pro > $BACKUP_DIR/langchat_pro_$DATE.sql

# Redis备份
cp /var/lib/redis/dump.rdb $BACKUP_DIR/redis_$DATE.rdb

# 压缩备份
tar -czf $BACKUP_DIR/langchat_backup_$DATE.tar.gz $BACKUP_DIR/langchat_pro_$DATE.sql $BACKUP_DIR/redis_$DATE.rdb

# 清理旧备份(保留30天)
find $BACKUP_DIR -name "langchat_backup_*.tar.gz" -mtime +30 -delete
# 备份应用配置
tar -czf /opt/backups/config_backup_$(date +%Y%m%d).tar.gz /opt/langchat/config/

# 备份上传文件
tar -czf /opt/backups/uploads_backup_$(date +%Y%m%d).tar.gz /opt/langchat/uploads/

故障排查

常见问题

# 检查Java环境
java -version

# 检查端口占用
netstat -tlnp | grep 8100

# 查看详细错误日志
tail -f /opt/langchat/logs/langchat-bootstrap.log
# 检查MySQL服务状态
sudo systemctl status mysql

# 测试数据库连接
mysql -u langchat -p -h localhost langchat_pro

# 检查防火墙设置
sudo ufw status
# 检查内存使用
free -h

# 检查JVM内存使用
jstat -gc pid

# 调整JVM参数
vim /opt/langchat/bin/start.sh
# 检查Nginx配置
sudo nginx -t

# 检查流式消息配置
grep -n "chunked_transfer_encoding\|proxy_buffering" /etc/nginx/sites-available/langchat

# 检查连接超时
tail -f /var/log/nginx/error.log | grep timeout

# 测试流式消息
curl -N -H "Accept: text/event-stream" http://your-domain.com/api/v1/chat/stream
如果流式消息不工作,请检查Nginx配置中的 proxy_buffering offchunked_transfer_encoding on 设置

集群部署

负载均衡配置

对于高并发场景,可以使用Nginx负载均衡:
worker_processes 1;
events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    upstream langchat_backend {
        server 192.168.1.10:8100 weight=1;
        server 192.168.1.11:8100 weight=1;
        server 192.168.1.12:8100 weight=1;
    }

    server {
        listen 80;
        server_name your-domain.com;
        
        # 前端静态文件
        location / {
            root /var/www/langchat;
            index index.html;
            try_files $uri $uri/ /index.html;
        }
        
        # API代理 - 流式消息支持
        location ^~ /api/ {
            proxy_pass http://langchat_backend;
            rewrite ^/api/(.*)$ /$1 break;
            
            # 流式消息关键配置
            chunked_transfer_encoding on;
            proxy_cache off;
            proxy_buffering off;
            tcp_nopush on;
            tcp_nodelay on;
            
            # 超时设置
            proxy_connect_timeout 15s;
            proxy_send_timeout 15s;
            proxy_read_timeout 15s;
            
            # 请求头设置
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}