一、导读
环境:Ubuntu 24.04、open Euler 23.03、Windows 11、WSL 2、Python 3.10 、bisheng 1.1.1
背景:需要bisheng二开商用,故而此处进行本地部署,便于后期调试开发
时间:20250519
说明:bisheng前后端的代码不使用docker部署,基于代码部署
注意:本节基于上一章节的内容,如有疑问,请阅读:bisheng系列(一)
二、停止前后端的docker
bisheng共计9个容器,需要独立代码启动前后端,则需要将前后端的容器停止
1、停止并删除所有容器
命令:
docker-compose down
效果
jack@Laptop-L14-gen4:~/bisheng-blog/bisheng/docker/bisheng-main/docker$ docker-compose down
Stopping bisheng-frontend ... done
Stopping bisheng-backend ... done
Stopping milvus-standalone ... done
Stopping bisheng-es ... done
Stopping bisheng-office ... done
Stopping milvus-etcd ... done
Stopping bisheng-mysql ... done
Stopping bisheng-redis ... done
Stopping milvus-minio ... done
Removing bisheng-frontend ... done
Removing bisheng-backend ... done
Removing milvus-standalone ... done
Removing bisheng-es ... done
Removing bisheng-office ... done
Removing milvus-etcd ... done
Removing bisheng-mysql ... done
Removing bisheng-redis ... done
Removing milvus-minio ... done
Removing network docker_default
jack@Laptop-L14-gen4:~/bisheng-blog/bisheng/docker/bisheng-main/docker$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5257cf9b2426 qdrant/qdrant "./entrypoint.sh" 3 weeks ago Exited (255) 2 weeks ago 0.0.0.0:6333-6334->6333-6334/tcp, :::6333-6334->6333-6334/tcp distracted_lamport
b28179c3b79b qdrant/qdrant "./entrypoint.sh" 3 weeks ago Exited (255) 3 weeks ago 0.0.0.0:6333-6334->6333-6334/tcp, :::6333-6334->6333-6334/tcp bold_beaver
b00d21f614f7 hello-world "/hello" 3 weeks ago Exited (0) 3 weeks ago objective_khayyam
114b2a816fae ubuntu1:8080 "/bin/sh -c 'npm i &…" 7 weeks ago Exited (255) 7 weeks ago 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp light_house
通过上述命令说明,bisheng的9个容器停止并删除成功
2、配置docker-compse
通过编辑docker-compose.yml文件,删除前后端的启动项,修改后内容如下:
services:
mysql:
container_name: bisheng-mysql
image: mysql:8.0
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: "1234" # 数据库密码,如果修改需要同步修改bisheng/congfig/config.yaml配置database_url的mysql连接密码
MYSQL_DATABASE: bisheng
TZ: Asia/Shanghai
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/mysql/conf/my.cnf:/etc/mysql/my.cnf
- ${DOCKER_VOLUME_DIRECTORY:-.}/mysql/data:/var/lib/mysql
healthcheck:
test: ["CMD-SHELL", "exit | mysql -u root -p$$MYSQL_ROOT_PASSWORD"]
start_period: 30s
interval: 20s
timeout: 10s
retries: 4
restart: on-failure
redis:
container_name: bisheng-redis
image: redis:7.0.4
ports:
- "6379:6379"
environment:
TZ: Asia/Shanghai
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/data/redis:/data
- ${DOCKER_VOLUME_DIRECTORY:-.}/redis/redis.conf:/etc/redis.conf
command: redis-server /etc/redis.conf
healthcheck:
test: ["CMD-SHELL", 'redis-cli ping|grep -e "PONG\|NOAUTH"']
interval: 10s
timeout: 5s
retries: 3
restart: on-failure
office:
container_name: bisheng-office
image: onlyoffice/documentserver:7.1.1
ports:
- "8701:80"
environment:
TZ: Asia/Shanghai
JWT_ENABLED: "false"
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/office/bisheng:/var/www/onlyoffice/documentserver/sdkjs-plugins/bisheng
command: bash -c "supervisorctl restart all"
restart: on-failure
elasticsearch:
container_name: bisheng-es
image: docker.io/bitnami/elasticsearch:8.12.0
user: root
ports:
- "9200:9200"
- "9300:9300"
environment:
TZ: Asia/Shanghai
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/data/es:/bitnami/elasticsearch/data
restart: on-failure
etcd:
container_name: milvus-etcd
image: quay.io/coreos/etcd:v3.5.5
environment:
ETCD_AUTO_COMPACTION_MODE: revision
ETCD_AUTO_COMPACTION_RETENTION: "1000"
ETCD_QUOTA_BACKEND_BYTES: "4294967296"
ETCD_SNAPSHOT_COUNT: "50000"
TZ: Asia/Shanghai
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/data/milvus-etcd:/etcd
command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
restart: on-failure
healthcheck:
test: ["CMD", "etcdctl", "endpoint", "health"]
interval: 30s
timeout: 20s
retries: 3
minio:
container_name: milvus-minio
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
environment:
MINIO_ACCESS_KEY: minioadmin
MINIO_SECRET_KEY: minioadmin
ports:
- "9100:9000"
- "9101:9001"
volumes:
- /etc/localtime:/etc/localtime:ro
- ${DOCKER_VOLUME_DIRECTORY:-.}/data/milvus-minio:/minio_data
command: minio server /minio_data --console-address ":9001"
restart: on-failure
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
milvus:
container_name: milvus-standalone
image: milvusdb/milvus:v2.3.3
command: ["milvus", "run", "standalone"]
security_opt:
- seccomp:unconfined
environment:
ETCD_ENDPOINTS: etcd:2379
MINIO_ADDRESS: minio:9000
volumes:
- /etc/localtime:/etc/localtime:ro
- ${DOCKER_VOLUME_DIRECTORY:-.}/data/milvus:/var/lib/milvus
restart: on-failure
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
start_period: 90s
interval: 30s
timeout: 20s
retries: 3
ports:
- "19530:19530"
- "9091:9091"
depends_on:
- etcd
- minio
3、启动其余容器
jack@Laptop-L14-gen4:~/bisheng-blog/bisheng/docker/bisheng-main/docker$ docker-compose up -d
Creating network "docker_default" with the default driver
Creating milvus-etcd ... done
Creating bisheng-redis ... done
Creating bisheng-mysql ... done
Creating bisheng-office ... done
Creating milvus-minio ... done
Creating bisheng-es ... done
Creating milvus-standalone ... done
4、前后端代码
前后端的代码分别时:
后端:bisheng/src/backend
前端:bisheng/src/frontend
三、后端启动
通过修改部分文件,使后端可以连接到相关的容器服务
后端在open Euler 23.03启动,我使用vscode来修改相关文件
1、克隆源码
git clone https://github.com/dataelement/bisheng.git
2、安装相关环境
sudo yum -y install python3-pip python3-devel gcc g++
3、安装poetry
pip install poetry==1.8.2
4、项目环境
# 在当前项目根目录下生成环境
poetry config virtualenvs.create false
# 安装环境所需的模块
poetry install
在该环境中,安装
pip install opencv-python-headless
安装后,看下安装过程是否存在异常,如下为正常
......
- Installing types-pillow (9.5.0.6)
- Installing types-pyyaml (6.0.12.20250516)
- Installing types-requests (2.32.0.20250515)
......
Writing lock file
Installing the current project: bisheng (1.1.1)
5、配置文件
此处配置文件特指其余七个容器的连接配置
将/bisheng/docker/bisheng/config/config.yaml 复制到指定目录下
cp bisheng/docker/bisheng/config/config.yaml bisheng/src/backend/bisheng/
编辑该文件
# 原内容
"mysql+pymysql://root:gAAAAABlp4b4c59FeVGF_OQRVf6NOUIGdxq8246EBD-b0hdK_jVKRs1x4PoAn0A6C5S6IiFKmWn0Nm5eBUWu-7jxcqw6TiVjQA==@mysql:3306/bisheng?charset=utf8mb4"
redis_url: "redis://redis:6379/1"
celery_redis_url: "redis://redis:6379/2"
- sink: "/app/data/bisheng.log"
- sink: "/app/data/statistic.log"
# 修改后
"mysql+pymysql://root:gAAAAABlp4b4c59FeVGF_OQRVf6NOUIGdxq8246EBD-b0hdK_jVKRs1x4PoAn0A6C5S6IiFKmWn0Nm5eBUWu-7jxcqw6TiVjQA==@0.0.0.0:3306/bisheng?charset=utf8mb4"
redis_url: "redis://0.0.0.0:6379/1"
celery_redis_url: "redis://0.0.0.0:6379/2"
- sink: "/home/jack/bisheng/src/backend/data/bisheng.log"
- sink: "/home/jack/bisheng/src/backend/data/statistic.log"
修改目的是将链接修改为0.0.0.0:端口,由于之前使用docker配置可以连接,但是当前由于使用代码直接启动,无法识别http://mysql:3306这种链接,故而需要修改
日志路径修改是为了保证权限的问题
新建.env文件,内容如下:
# bisheng/src/backend/bisheng/.env
BS_MILVUS_CONNECTION_ARGS='{"host":"milvus","port":"19530","user":"","password":"","secure":false}'
BS_MILVUS_IS_PARTITION='true'
BS_MILVUS_PARTITION_SUFFIX='1'
BS_ELASTICSEARCH_URL='http://elasticsearch:9200'
BS_ELASTICSEARCH_SSL_VERIFY='{}'
BS_MINIO_SCHEMA='false'
BS_MINIO_CERT_CHECK='false'
BS_MINIO_ENDPOINT='minio:9000'
BS_MINIO_SHAREPOIN='minio:9000'
BS_MINIO_ACCESS_KEY='minioadmin'
BS_MINIO_SECRET_KEY='minioadmin'
上述内容复制自docker-compose.yml
编辑settings文件,修改该函数内容如下
# bisheng/src/backend/bisheng/settings.py
def env_var_constructor(loader, node):
from dotenv import load_dotenv, find_dotenv
load_dotenv("/home/jack/bisheng/src/backend/bisheng/.env", find_dotenv())
value = loader.construct_scalar(node) # PyYAML loader的固定方法,用于根据当前节点构造一个变量值
var_name = value.strip('${} ') # 去除变量值(例如${PATH})前后的特殊字符及空格
env_val = os.getenv(var_name) # 尝试在环境变量中获取变量名(如USER)对应的值,获取不到则为空
if env_val is None:
raise ValueError(f'Environment variable {var_name} not found')
return env_val
编辑bisheng/src/backend/bisheng/api/services/assistant_agent.py,修改文件路径
# 原内容
async def record_chat_history(self, message: List[Any]):
# 记录助手的聊天历史
if not os.getenv('BISHENG_RECORD_HISTORY'):
return
try:
os.makedirs('/app/data/history', exist_ok=True)
with open(f'/app/data/history/{self.assistant.id}_{time.time()}.json',
# 修改后
async def record_chat_history(self, message: List[Any]):
# 记录助手的聊天历史
if not os.getenv('BISHENG_RECORD_HISTORY'):
return
try:
os.makedirs('/home/jack/bisheng/src/backend/data/history', exist_ok=True)
with open(f'/home/jack/bisheng/src/backend/data/history/{self.assistant.id}_{time.time()}.json',
5、启动项目
uvicorn bisheng.main:app --host 0.0.0.0 --port 7860
成功如下:
.
.
.
INFO: Started server process [64315]
INFO: Waiting for application startup.
[2025-05-19 11:25:20.152105] [2025-05-19 11:25:20.151985] [DEBUG process-64315-139958058770496 bisheng.interface.utils:91] - trace=1 Setting up LLM caching with InMemoryCache
[2025-05-19 11:25:20.153851] [2025-05-19 11:25:20.153779] [INFO process-64315-139958058770496 bisheng.interface.utils:93] - trace=1 LLM caching setup with InMemoryCache
[2025-05-19 11:25:20.189322] [2025-05-19 11:25:20.189129] [DEBUG process-64315-139958058770496 bisheng.database.service:59] - trace=1 Creating database and tables
[2025-05-19 11:25:20.564080] [2025-05-19 11:25:20.563913] [DEBUG process-64315-139958058770496 bisheng.database.service:79] - trace=1 Database and tables created successfully
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:7860 (Press CTRL+C to quit)
四、前端启动
1、nginx部署
1)安装node,要求node >= 18
下载链接:v18.19.0 - 阿里云
# 切换目录
cd /usr/local
# 下载nodejs文件
wget https://mirrors.aliyun.com/nodejs-release/v18.19.0/node-v18.19.0-linux-x64.tar.gz?spm=a2c6h.25603864.0.0.1bb22f6dOhRq63
# 解压到当前目录
tar xzf node-v18.19.0-linux-x64.tar.gz
# 创建软连接
ln -s /usr/local/node-v18.19.0-linux-x64/bin/node /usr/bin/node
ln -s /usr/local/node-v18.19.0-linux-x64/bin/npm /usr/bin/npm
ln -s /usr/local/node-v18.19.0-linux-x64/bin/npx /usr/bin/npx
2)安装nginx
sudo yum -y install nginx
3)编译文件
# 编译client
cd bisheng/src/frontend/client && npm install --force --registry=https://registry.npmmirror.com && npm run build
# 编译platform
cd bisheng/src/frontend/platform && npm install --force --registry=https://registry.npmmirror.com && npm run build
将编译后的build目录复制到/usr/share/nginx/html/,如下
cp -r client/build /usr/share/nginx/html/client
cp -r platform/build /usr/share/nginx/html/platform
4)替换nginx配置文件
# 备份nginx原配置文件
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
# 复制源码中的nginx配置文件
cp bisheng/docker/nginx/nginx.conf /etc/nginx/
cp bisheng/docker/nginx/conf.d/* /etc/nginx/conf.d/
编辑conf.d下的配置文件,将两个配置文件的内容进行替换
# 原内容
proxy_pass http://backend:7860;
proxy_pass http://minio:9000;
# 替换后
proxy_pass http://0.0.0.0:7860;
proxy_pass http://0.0.0.0:9000;
5)启动nginx
sudo nginx
6)访问测试
7)后端日志
后续继续优化