You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

6.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

全模块源码部署自动升级方法

本教程是方便全模块源码部署的爱好者,如何通过自动命令,自动拉取源码,自动编译,自动启动端口运行。实现最高效率的升级系统。

本项目的测试平台https://2662r3426b.vicp.fun,从开放以来就使用了该方法,效果良好。

教程可参考B站博主毕乐labs发布的视频教程:《开源小智服务器xiaozhi-server自动更新以及最新版本MCP接入点配置保姆教程》

开始条件

  • 你的电脑/服务器是linux操作系统
  • 你已经跑通了整个流程
  • 你喜欢跟进最新功能,但是觉得每次手动部署有点麻烦,期待有一个自动更新的方法

第二个条件必须满足因为本教程所涉及的某些文件JDK、Node.js环境、Conda环境等是需要你跑通整个流程才有的如果你没有跑通当我讲到某个文件的时候你可能就不知道什么意思。

教程效果

  • 解决国内不能拉取最新项目源码问题
  • 自动拉取代码编译前端文件
  • 自动拉取代码编译java文件自动杀掉8002端口自动启动8002端口
  • 自动拉取python代码自动杀掉8000端口自动启动8000端口

第一步 选好你的项目目录

例如,我规划了我的项目目录是,这是一个新建的空白的目录,如果你不想出错,可以和我一样

/home/system/xiaozhi

第二步 克隆本项目

此刻,先要执行第一句话,拉取源码,这句命令适用于国内网络的服务器和电脑,无需翻墙

cd /home/system/xiaozhi
git clone https://ghproxy.net/https://github.com/xinnan-tech/xiaozhi-esp32-server.git

执行完后,你的项目目录会多了一个文件夹xiaozhi-esp32-server,这个就是项目的源码

第三步 复制基础的文件

如果你之前已经跑通了整个流程对funasr的模型文件xiaozhi-server/models/SenseVoiceSmall/model.pt和你的私有配置文件xiaozhi-server/data/.config.yaml这两个文件不会陌生。

此刻你需要把model.pt文件复制到新的目录去,你可以这样

# 创建需要的目录
mkdir -p /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/data/

cp 你原来的.config.yaml完整路径 /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/data/.config.yaml
cp 你原来的model.pt完整路径 /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/models/SenseVoiceSmall/model.pt

第四步 建立三个自动编译文件

4.1 自动编译mananger-web模块

/home/system/xiaozhi/目录下,创建名字为update_8001.sh的文件,内容如下

cd /home/system/xiaozhi/xiaozhi-esp32-server
git fetch --all
git reset --hard
git pull origin main


cd /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-web
npm install
npm run build
rm -rf /home/system/xiaozhi/manager-web
mv /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-web/dist /home/system/xiaozhi/manager-web

保存好后执行赋权命令

chmod 777 update_8001.sh

执行完后,继续往下

4.2 自动编译运行manager-api模块

/home/system/xiaozhi/目录下,创建名字为update_8002.sh的文件,内容如下

cd /home/system/xiaozhi/xiaozhi-esp32-server
git pull origin main


cd /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-api
rm -rf target
mvn clean package -Dmaven.test.skip=true
cd /home/system/xiaozhi/

# 查找占用8002端口的进程号
PID=$(sudo netstat -tulnp | grep 8002 | awk '{print $7}' | cut -d'/' -f1)

rm -rf /home/system/xiaozhi/xiaozhi-esp32-api.jar
mv /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-api/target/xiaozhi-esp32-api.jar /home/system/xiaozhi/xiaozhi-esp32-api.jar

# 检查是否找到进程号
if [ -z "$PID" ]; then
  echo "没有找到占用8002端口的进程"
else
  echo "找到占用8002端口的进程进程号为: $PID"
  # 杀掉进程
  kill -9 $PID
  kill -9 $PID
  echo "已杀掉进程 $PID"
fi

nohup java -jar xiaozhi-esp32-api.jar --spring.profiles.active=dev &

保存好后执行赋权命令

chmod 777 update_8002.sh

执行完后,继续往下

4.3 自动编译运行Python项目

/home/system/xiaozhi/目录下,创建名字为update_8000.sh的文件,内容如下

cd /home/system/xiaozhi/xiaozhi-esp32-server
git pull origin main

# 查找占用8000端口的进程号
PID=$(sudo netstat -tulnp | grep 8000 | awk '{print $7}' | cut -d'/' -f1)

# 检查是否找到进程号
if [ -z "$PID" ]; then
  echo "没有找到占用8000端口的进程"
else
  echo "找到占用8000端口的进程进程号为: $PID"
  # 杀掉进程
  kill -9 $PID
  kill -9 $PID
  echo "已杀掉进程 $PID"
fi
cd main/xiaozhi-server
pip install -r requirements.txt
nohup python app.py >/dev/null &

保存好后执行赋权命令

chmod 777 update_8000.sh

执行完后,继续往下

日常更新

以上的脚本都建立好后,日常更新,我们只要依次执行以下命令就可以做到自动更新和启动

# 进入pyhton环境
conda activate xiaozhi-esp32-server
cd /home/system/xiaozhi
# 更新并启动Java程序
./update_8001.sh
# 更新web程序
./update_8002.sh
# 更新并启动python程序
./update_8000.sh
# 查看Java日志
tail -f nohup.out
# 查看Python日志
tail -f /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/tmp/server.log

注意事项

测试平台https://2662r3426b.vicp.fun是使用nginx做了反向代理。nginx.conf详细配置可以参考这里

常见问题

1、为什么没有见到8001端口

回答8001是开发环境使用的用于运行前端的端口。如果你是服务器部署不建议使用npm run serve启动8001端口运行前端而是像本教程一样编译成html文件然后使用nginx来管理访问。

2、每次更新需要更新手动SQL语句吗

回答:不需要,因为项目使用Liquibase管理数据库版本会自动执行新的sql脚本。