# 虚拟病人服务部署文档

## 需要部署的服务列表

1. 问诊系统
2. 后端管理系统
3. nginx前端服务
~~4. rasa对话服务~~
5. mysql数据库
6. paddlespeech语音文字转换服务
7. minio对象存储服务
8. redis服务

# 注意

如果镜像拉的时候,报错:

Error response from daemon: error parsing HTTP 408 response body:
invalid character '<' looking for beginning of value:
"<html><body><h1>408 Request Time-out</h1>\n
Your browser didn't send a complete request in time.\n</body></html>\n"

这个时候,需要修改网卡地址
先ifconfig,找到对应网卡的地址,然后指定命令

ifconfig {eth0} mtu 900

# 准备网络 如果是使用network模式则非必要

```shell

# 查看现有网络
docker network list

# 创建新网络
docker network create virtual-patient-network

```

## nacos服务部署

- 端口号:8848
- 生产环境端口:18498
- 首次部署使用dockerfile的形式,后期更新直接docker restart就可以了

### 首次部署

~~~shell
    # 拉取镜像
    docker pull nacos/nacos-server:v1.4.5
    # 运行容器
    docker run -d -p 8848:8848 -e MODE=standalone -e NACOS_AUTH_IDENTITY_KEY=nacos -e NACOS_AUTH_IDENTITY_VALUE=nacos -v /data/nacos/:/home/nacos/data --name nacos --restart=always nacos/nacos-server:v1.4.5
    # **启用网络环境服务,生产环境请使用**
    # 生产环境端口号为18498
    # 很奇怪,这里配置密码不生效,用nacos进去之后再手动改
    docker run -d -p 18498:8848 -e MODE=standalone -e NACOS_AUTH_IDENTITY_KEY=nacos -e NACOS_AUTH_IDENTITY_VALUE='#Yaxin0504' -v /data/nacos/:/home/nacos/data --name virtual-patient-nacos --network virtual-patient-network --restart=always nacos/nacos-server:v1.4.5
    # 验证容器运行
    docker ps | grep nacos
    # 查看日志是否正常
    docker logs -f nacos
~~~

## mysql数据库

- 启动mysql

~~~shell
    # 首先创建本地文件夹
    mkdir /var/lib/mysql
    # 拉取镜像
    docker pull mysql:5.7
    # 启动服务
    docker run -d -p 3306:3306 -v /var/lib/mysql:/var/lib/mysql --name virtual-patient-mysql -e MYSQL_ROOT_PASSWORD='#Yaxin0504' mysql:5.7
    
    # **启用网络环境服务,生产环境请使用**
    # 生产环境端口号为37088
    docker run -d -p 37088:3306 -v /var/lib/mysql:/var/lib/mysql --name virtual-patient-mysql -e MYSQL_ROOT_PASSWORD='#Yaxin0504' --network virtual-patient-network mysql:5.7

~~~

- 执行数据库初始化脚本**建议使用可视化工具初始化数据**

```shell

    docker cp mysql/virtual_patient_v2.0.0.sql virtual-patient-mysql:/home/virtual_patient_v2.0.0.sql
    docker exec -it vp-mysql /bin/bash
    mysql -uroot;
    create database virtual_patient;
    use virtual_patient;
    source /home/virtual_patient_v2.0.0.sql;
    
```

## paddlespeech语音文字转换服务

~~~shell
    # 进入paddlespeech文件夹,依次执行命令
    # 加载镜像
    docker load -i virtual-patient-paddlespeech.tar.gz
    # 验证镜像是否存在
    docker images | grep virtual-patient-paddlespeech
    # 运行容器
    docker run --name virtual-patient-paddlespeech -p 8090:8090 -d virtual-patient-paddlespeech:1.0.0
    # **启用网络环境服务,生产环境请使用**
    docker run --name virtual-patient-paddlespeech -p 8090:8090 -d --network virtual-patient-network virtual-patient-paddlespeech:1.0.0
    # 验证容器运行
    docker ps | grep virtual-patient-paddlespeech
    # 查看日志是否正常
    docker logs -f virtual-patient-paddlespeech
~~~

## MINIO对象存储服务

~~~shell
# 首先创建文件夹
mkdir /data/vp/minio/data

# 拉最新版本
# docker pull minio/minio
# 导入镜像
docker load -i  virtual-patient-minio.tar.gz
# 启动
docker run -it --name minio -p 9002:9000 -p 9001:9001 -d \
	-v /data/vp/minio/data:/data \
	-e 'MINIO_ROOT_USER=admin' \
	-e 'MINIO_ROOT_PASSWORD=12345678' \
	virtual-patient-minio:1.0.0 server /data --console-address ":9001" 
	
# **启用网络环境服务,生产环境请使用**
# 生产环境密码#Yaxin0504
# 生产环境端口修改 11900为s3 11901为web
docker run -it --name virtual-patient-minio -p 11900:9000 -p 11901:9001 -d \
	-v /data/minio:/data \
	-e 'MINIO_ROOT_USER=admin' \
	-e 'MINIO_ROOT_PASSWORD=#Yaxin0504' \
	--network virtual-patient-network \
	virtual-patient-minio:1.0.0 server /data --console-address ":9001" 
	
# 将文件mv到对应的文件夹
mv virtual-patient-bucket-prod /data/vp/minio/data
~~~

## redis服务

~~~shell
    # 进入redis文件目录下
    # 构建redis镜像
    docker build -t virtual-patient-redis:1.0.0 .
    
    # 查看镜像是否正确构建
    docker images | grep virtual-patient-redis
    
    # 启动redis容器
    docker run --name virtual-patient-redis -p 6379:6379 -v /data/vp/redis/data:/data -d virtual-patient-redis:1.0.0
    
    # **启用网络环境服务,生产环境请使用**
    # 生产环境的Redis端口修改为11379
    # 密码:#Yaxin0504
    docker run --name virtual-patient-redis -p 11379:6379 -v /data/vp/redis/data:/data -v /data/redis:/usr/local/redis  --network virtual-patient-network -d virtual-patient-redis:1.0.0
    
    # 查看容器运行
    docker ps | grep virtual-patient-redis
~~~

## ~~RASA对话服务~~

### 首次部署

- 首次部署使用dockerfile的形式,后期更新直接docker restart就可以了
- 将代码包dockerfile中的virtual-patient-rasa-1.0-SNAPSHOT.jar拷贝到路径/data/vp下

~~~shell
    # 加载镜像
    docker load -i virtual-patient-rasa-manager.tar.gz
    # 验证镜像是否存在
    docker images | grep virtual-patient-rasa-manager
    # 运行容器
    docker run --name virtual-patient-rasa-manager -p 8990:8890 -v /data/vp:/data/vp -d virtual-patient-rasa-manager:1.0.0
    # **启用网络环境服务,生产环境请使用**
    docker run --name virtual-patient-rasa-manager -p 8990:8890  -v /data/vp:/data/vp --network virtual-patient-network -d virtual-patient-rasa-manager:1.0.0 --spring.profiles.active=prod
    # 验证容器运行
    docker ps | grep virtual-patient-rasa-manager
    # 查看日志是否正常
    docker logs -f virtual-patient-rasa-manager
~~~

### 服务更新

- 将代码包virtual-patient-rasa-manage-1.0-SNAPSHOT.jar拷贝到路径/data/vp下
- 重启容器

~~~shell
    docker restart virtual-patient-rasa-manage
~~~

## qa 语义识别服务

### 首次部署

- 将代码包中的virtual_patient_qa拷贝到路径/data/vp下
- 修改配置文件/data/vp/virtual_patient_qa/config/config.yaml
- 查看/data/vp/virtual_patient_qa/目录下是否存在log目录,如果不存在创建log目录

~~~shell
    # 加载镜像
    docker load -i virtual-patient-qa.tar.gz
    # 验证镜像是否存在
    docker images | grep virtual-patient-qa
    # 运行容器
    docker run -it -d --name=virtual-patient-qa -v /data/vp/virtual_patient_qa:/data/vp/virtual_patient_qa -p 8711:8000 virtual-patient-qa:1.0.0
    # **启用网络环境服务,生产环境请使用**
    docker run --name virtual-patient-qa -p 8711:8000  -v /data/vp/virtual_patient_qa:/data/vp/virtual_patient_qa --network virtual-patient-network -d virtual-patient-qa:1.0.0
    # 验证容器运行
    docker ps | grep virtual-patient-qa
    # 查看日志是否正常
    docker logs -f virtual-patient-qa
~~~

### 服务更新

- 将代码包中的virtual_patient_qa拷贝到路径/data/vp下
- 重启容器

~~~shell
    docker restart virtual-patient-qa
~~~

## 问诊服务部署

### 首次部署

- 端口号:8899
- 首次部署使用dockerfile的形式,后期更新直接docker restart就可以了
- 将代码包dockerfile中的virtual-patient-web-1.0-SNAPSHOT.jar拷贝到路径/data/vp下

~~~shell
    # 进入virtual-patient-web文件夹,依次执行命令
    # 构建镜像
    docker build -t virtual-patient-web:1.0.0 .
    # 验证镜像是否存在
    docker images | grep virtual-patient-web
    # 运行容器
    docker run --name virtual-patient-web -p 8899:8899 -v /data/vp:/data/vp -d virtual-patient-web
    # **启用网络环境服务,生产环境请使用**
    docker run --name virtual-patient-web -p 8899:8899  -v /data/vp:/data/vp --network virtual-patient-network -d virtual-patient-web:1.0.0 --spring.profiles.active=prod
    # 验证容器运行
    docker ps | grep virtual-patient-web
    # 查看日志是否正常
    docker logs -f virtual-patient-web
~~~

### 服务更新

- 将代码包virtual-patient-manage-1.0-SNAPSHOT.jar拷贝到路径/data/vp下
- 重启容器

~~~shell
    docker restart virtual-patient-web
~~~

## 后端管理系统部署

- 端口号:8891
- 首次部署使用dockerfile的形式,后期更新直接docker restart就可以了
- 将代码包virtual-patient-manage-1.0-SNAPSHOT.jar拷贝到路径/data/vp下

### 首次部署

~~~shell
    # 进入virtual-patient-manage文件夹,依次执行命令
    # 构建镜像
    docker build -t virtual-patient-manage:1.0.0 .
    # 验证镜像是否存在
    docker images | grep virtual-patient-manage
    # 运行容器
    docker run --name virtual-patient-manage -p 8891:8891 -v /data/vp:/data/vp -d virtual-patient-manage:1.0.0
    # **启用网络环境服务,生产环境请使用**
    docker run --name virtual-patient-manage -p 8891:8891 -v /data/vp:/data/vp --network virtual-patient-network -d virtual-patient-manage:1.0.0 --spring.profiles.active=prod
    # 验证容器运行
    docker ps | grep virtual-patient-manage
    # 查看日志是否正常
    docker logs -f virtual-patient-manage
~~~

### 服务更新

- 将代码包virtual-patient-manage-1.0-SNAPSHOT.jar拷贝到路径/data/vp下
- 重启容器

~~~shell
    docker restart virtual-patient-manage
~~~

## Graph知识图谱系统部署

- 端口号:8892
- 首次部署使用dockerfile的形式,后期更新直接docker restart就可以了
- 将代码包virtual-patient-graph-1.0-SNAPSHOT.jar拷贝到路径/data/vp下

### 首次部署

~~~shell
    # 进入virtual-patient-graph文件夹,依次执行命令
    # 构建镜像
    docker build -t virtual-patient-graph:1.0.0 .
    # 验证镜像是否存在
    docker images | grep virtual-patient-graph
    # 运行容器
    docker run --name virtual-patient-graph -p 8892:8892 -v /data/vp:/data/vp -d virtual-patient-graph:1.0.0
    # **启用网络环境服务,生产环境请使用**
    docker run --name virtual-patient-graph -p 8892:8892 -v /data/vp:/data/vp --network virtual-patient-network -d virtual-patient-graph:1.0.0 --spring.profiles.active=prod
    # 验证容器运行
    docker ps | grep virtual-patient-graph
    # 查看日志是否正常
    docker logs -f virtual-patient-graph
~~~

### 服务更新

- 将代码包virtual-patient-graph-1.0-SNAPSHOT.jar拷贝到路径/data/vp下
- 重启容器

~~~shell
    docker restart virtual-patient-graph
~~~

## Nginx前端服务

~~~shell
    # 进入nginx文件夹,依次执行命令
    # 修改 conf.d文件目录下servers.conf.template文件中的$UPSTREAM_WEB_SERVERS,$UPSTREAM_MANAGE_SERVERS
    # 构建镜像 1.1.0
    docker build -t virtual-patient-nginx:1.1.0 .
    # 验证镜像是否存在
    docker images | grep virtual-patient-nginx
    # 运行容器 **如果某一个服务没有部署可以不填该服务的地址**
    docker run --name virtual-patient-nginx -p 443:443 -v /data/vp/dist:/usr/share/nginx/html/dist -d -e UPSTREAM_WEB_SERVERS={ip}:{port} -e UPSTREAM_MANAGE_SERVERS={ip}:{port} -e UPSTREAM_RASA_SERVERS={ip}:{port}  -e UPSTREAM_GRAPH_SERVERS={ip}:{port} virtual-patient-nginx:1.1.0
    # UPSTREAM_WEB_SERVERS:虚拟病人问诊系统服务的ip:port
    # UPSTREAM_MANAGE_SERVERS:虚拟病人后端管理系统服务的ip:port
    
    # **启用网络环境服务,生产环境请使用 不放80,只放https的443** **如果某一个服务没有部署可以不填该服务的地址**
    docker run --name virtual-patient-nginx  -p 443:443 --network virtual-patient-network -v /data/vp/dist:/usr/share/nginx/html/dist -d -e UPSTREAM_WEB_SERVERS=virtual-patient-web:8899 -e UPSTREAM_MANAGE_SERVERS=virtual-patient-manage:8891 -e UPSTREAM_RASA_SERVERS=virtual-patient-rasa-manage:8990  -e UPSTREAM_GRAPH_SERVERS=virtual-patient-graph:8892 virtual-patient-nginx:1.1.0
    # 验证容器运行
    docker ps
    # 查看日志是否正常
    docker logs -f virtual-patient-nginx
~~~

### 服务更新
- 重新构建nginx镜像
    - docker build -t virtual-patient-nginx:1.1.0 .
- 将前端代码包dist文件夹拷贝到路径/data/vp/下
- 重启容器

~~~shell
    docker restart virtual-patient-nginx
~~~