This commit is contained in:
2025-11-26 16:03:06 +08:00
parent ba53dc9c20
commit 04eb85e1dc
46 changed files with 186 additions and 23 deletions

View File

@@ -153,8 +153,8 @@ cd "%PROJECT_ROOT%"
REM 构建后端镜像 REM 构建后端镜像
echo %INFO% 构建后端镜像... echo %INFO% 构建后端镜像...
echo %INFO% 执行: docker build -t school-news-serv:%IMAGE_VERSION% -f docker\Dockerfile.serv . echo %INFO% 执行: docker build -t school-news-serv:%IMAGE_VERSION% -f docker\schoolNews\Dockerfile.serv .
docker build -t school-news-serv:%IMAGE_VERSION% -f docker\Dockerfile.serv . docker build -t school-news-serv:%IMAGE_VERSION% -f docker\schoolNews\Dockerfile.serv .
if errorlevel 1 ( if errorlevel 1 (
echo %ERROR% ❌ 后端镜像构建失败 echo %ERROR% ❌ 后端镜像构建失败
pause pause
@@ -170,8 +170,8 @@ echo.
REM 构建前端镜像 REM 构建前端镜像
echo %INFO% 构建前端镜像... echo %INFO% 构建前端镜像...
echo %INFO% 执行: docker build -t school-news-web:%IMAGE_VERSION% -f docker\Dockerfile.web . echo %INFO% 执行: docker build -t school-news-web:%IMAGE_VERSION% -f docker\schoolNews\Dockerfile.web .
docker build -t school-news-web:%IMAGE_VERSION% -f docker\Dockerfile.web . docker build -t school-news-web:%IMAGE_VERSION% -f docker\schoolNews\Dockerfile.web .
if errorlevel 1 ( if errorlevel 1 (
echo %ERROR% ❌ 前端镜像构建失败 echo %ERROR% ❌ 前端镜像构建失败
pause pause
@@ -264,7 +264,7 @@ echo 3. 验证镜像:
echo docker images ^| findstr school-news echo docker images ^| findstr school-news
echo. echo.
echo 4. 启动服务: echo 4. 启动服务:
echo cd docker echo cd docker\schoolNews
echo docker-compose up -d echo docker-compose up -d
echo. echo.
echo 5. 查看服务状态: echo 5. 查看服务状态:
@@ -310,7 +310,7 @@ echo %INFO% 下一步操作:
echo 1. 查看部署说明: %DEPLOY_INFO_FILE% echo 1. 查看部署说明: %DEPLOY_INFO_FILE%
echo 2. 传输镜像文件到目标服务器 echo 2. 传输镜像文件到目标服务器
echo 3. 在目标服务器加载镜像: docker load -i ^<镜像文件^> echo 3. 在目标服务器加载镜像: docker load -i ^<镜像文件^>
echo 4. 启动服务: cd docker ^&^& docker-compose up -d echo 4. 启动服务: cd docker\schoolNews ^&^& docker-compose up -d
echo ========================================== echo ==========================================
echo. echo.

View File

@@ -154,8 +154,8 @@ build_base_serv() {
log_step "构建后端基础镜像Base Serv" log_step "构建后端基础镜像Base Serv"
cd "${PROJECT_ROOT}" cd "${PROJECT_ROOT}"
log_info "执行: docker build -t school-news-base-serv:${IMAGE_VERSION} -f docker/Dockerfile.base-serv ." log_info "执行: docker build -t school-news-base-serv:${IMAGE_VERSION} -f docker/schoolNews/Dockerfile.base-serv ."
if docker build -t school-news-base-serv:${IMAGE_VERSION} -f docker/Dockerfile.base-serv .; then if docker build -t school-news-base-serv:${IMAGE_VERSION} -f docker/schoolNews/Dockerfile.base-serv .; then
docker tag school-news-base-serv:${IMAGE_VERSION} school-news-base-serv:latest docker tag school-news-base-serv:${IMAGE_VERSION} school-news-base-serv:latest
log_info "✅ 后端基础镜像构建成功" log_info "✅ 后端基础镜像构建成功"
log_info " 镜像标签: school-news-base-serv:${IMAGE_VERSION}" log_info " 镜像标签: school-news-base-serv:${IMAGE_VERSION}"
@@ -172,8 +172,8 @@ build_mysql() {
log_step "构建MySQL镜像" log_step "构建MySQL镜像"
cd "${PROJECT_ROOT}" cd "${PROJECT_ROOT}"
log_info "执行: docker build -t school-news-mysql:${IMAGE_VERSION} -f docker/Dockerfile.mysql ." log_info "执行: docker build -t school-news-mysql:${IMAGE_VERSION} -f docker/schoolNews/Dockerfile.mysql ."
if docker build -t school-news-mysql:${IMAGE_VERSION} -f docker/Dockerfile.mysql .; then if docker build -t school-news-mysql:${IMAGE_VERSION} -f docker/schoolNews/Dockerfile.mysql .; then
docker tag school-news-mysql:${IMAGE_VERSION} school-news-mysql:latest docker tag school-news-mysql:${IMAGE_VERSION} school-news-mysql:latest
log_info "✅ MySQL镜像构建成功" log_info "✅ MySQL镜像构建成功"
log_info " 镜像标签: school-news-mysql:${IMAGE_VERSION}" log_info " 镜像标签: school-news-mysql:${IMAGE_VERSION}"
@@ -204,8 +204,8 @@ build_serv() {
exit 1 exit 1
fi fi
log_info "执行: docker build -t school-news-serv:${IMAGE_VERSION} -f docker/Dockerfile.serv ." log_info "执行: docker build -t school-news-serv:${IMAGE_VERSION} -f docker/schoolNews/Dockerfile.serv ."
if docker build -t school-news-serv:${IMAGE_VERSION} -f docker/Dockerfile.serv .; then if docker build -t school-news-serv:${IMAGE_VERSION} -f docker/schoolNews/Dockerfile.serv .; then
docker tag school-news-serv:${IMAGE_VERSION} school-news-serv:latest docker tag school-news-serv:${IMAGE_VERSION} school-news-serv:latest
log_info "✅ 后端服务镜像构建成功" log_info "✅ 后端服务镜像构建成功"
log_info " 镜像标签: school-news-serv:${IMAGE_VERSION}" log_info " 镜像标签: school-news-serv:${IMAGE_VERSION}"
@@ -229,8 +229,8 @@ build_web() {
exit 1 exit 1
fi fi
log_info "执行: docker build -t school-news-web:${IMAGE_VERSION} -f docker/Dockerfile.web ." log_info "执行: docker build -t school-news-web:${IMAGE_VERSION} -f docker/schoolNews/Dockerfile.web ."
if docker build -t school-news-web:${IMAGE_VERSION} -f docker/Dockerfile.web .; then if docker build -t school-news-web:${IMAGE_VERSION} -f docker/schoolNews/Dockerfile.web .; then
docker tag school-news-web:${IMAGE_VERSION} school-news-web:latest docker tag school-news-web:${IMAGE_VERSION} school-news-web:latest
log_info "✅ 前端服务镜像构建成功" log_info "✅ 前端服务镜像构建成功"
log_info " 镜像标签: school-news-web:${IMAGE_VERSION}" log_info " 镜像标签: school-news-web:${IMAGE_VERSION}"

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
doc/部署.assets/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

163
doc/部署.md Normal file
View File

@@ -0,0 +1,163 @@
# 校园新闻系统部署
## 加载镜像
### 镜像目录结构
---docker 根目录
|---dify # dify的docker目录
|---dify 官方内容
|---schoolNews # schoolNews的docker目录
|---dify # dify工作流的2个yml
|---config # 前后端配置文件
|---init-db # 数据库标记
|---mysql # mysql配置
|---redis # redis配置
|---nginx # nginx配置
|---volumes # 数据卷
|---images # 镜像
|---docker-compose.yml # docker-compose配置
|---init-volumes.sh # 初始化数据卷
### 后端服务镜像
镜像来源由星洋智慧提供
#### 镜像加载
```bash
# 递归查找指定目录下的所有镜像文件并加载
find .docker/schoolNews/images -type f \( -name "*.tar" -o -name "*.tar.gz" -o -name "*.tgz" \) -exec docker load -i {} \;
```
#### 服务启动
```bash
cd docker/schoolNews
docker-compose up -d
```
#### 服务停止
```bash
cd docker/schoolNews
docker-compose down
```
#### 服务重启
```bash
cd docker/schoolNews
docker-compose restart
```
### dify镜像启动
> 会进行镜像拉取
```bash
cd docker/dify
docker-compose up -d
```
## 配置dify工作流
> dify登录url 本地ip:8000
### 1. 注册账号
![alt text](部署.assets/image.png)
### 2. 导入工作流
工作流的yaml文件在dify目录下
![alt text](部署.assets/image-1.png)
安装工作流所需插件。
插件说明:
1. 安思派:工作流联网搜索插件
2. 硅基流动: LLM插件。应该替换成本地部署的模型内容
![alt text](部署.assets/image-2.png)
APIKEY授权
![alt text](部署.assets/image-3.png)
### 3. 创建一个测试知识库开启apikey
> APIKEY作用
给后端服务提供访问dify知识库内容的key权限
![alt text](部署.assets/image-4.png)
![alt text](部署.assets/image-5.png)
![alt text](部署.assets/image-6.png)
保存好知识库的apikey通常以dataset开头。所有知识库共用。
### 4.修改动态知识库检索工作流
![alt text](部署.assets/image-7.png)
修改点有2个
1. 修改http节点post请求的url内容。替换成实际的 ip:8000
2. 修改Authorization的值替换为 Bearer + 空格 + 知识库的apikey
![alt text](部署.assets/image-8.png)
#### 测试
如图即正常
![alt text](部署.assets/image-9.png)
![alt text](部署.assets/image-10.png)
#### 发布
要同时发布为工具,供工作流使用
![alt text](部署.assets/image-11.png)
### 5. 修改思政小帮手工作流
#### 删除“动态知识库检索”节点,重新添加
![alt text](部署.assets/image-12.png)
![alt text](部署.assets/image-13.png)
#### 修改节点输入、输出相关节点的引用
修改的输入参数有2个第1个是对话变量的datasets。表示该词对话中使用了那些知识库。
第2个是对话变量的query。表示用户输入的对话内容。
![alt text](部署.assets/image-14.png)
![alt text](部署.assets/image-15.png)
![alt text](部署.assets/image-16.png)
#### 修改知识库处理节点的引用
直接引用“动态知识库检索”的输出内容text即可
![alt text](部署.assets/image-17.png)
#### 测试发布
正常对话即正确
![alt text](部署.assets/image-18.png)
#### 获取工作流apikey
> 该apikey用于前端进行对话指定使用该工作流
![alt text](部署.assets/image-19.png)
### 6. 配置后端dify配置
```sql
-- 更新dify.apiBaseUrl
UPDATE `school_news`.`tb_sys_config` SET `config_value` = '实际ip:8000' WHERE `config_key` = 'dify.apiBaseUrl';
-- 更新dify.apiKey
UPDATE `school_news`.`tb_sys_config` SET `config_value` = '工作流的apikey' WHERE `config_key` = 'dify.apiKey';
-- 更新dify.dify.knowledgeApiKey
UPDATE `school_news`.`tb_sys_config` SET `config_value` = '知识库的apikey' WHERE `config_key` = 'dify.dify.knowledgeApiKey';
-- 更新智能体配置的api_key。该api_key的编辑权限前端未开放
UPDATE `school_news`.`tb_ai_agent_config` SET `dify_api_key`='工作流的apikey' WHERE `id` = 'agent_default_001';
```
### 7. 重启后端服务
即可进行对话
![alt text](部署.assets/image-20.png)
## 系统配置
### 消息模块配置
#### 短信
申请阿里云的短信服务,配置到后端
![alt text](部署.assets/image-21.png)
#### 邮箱
开启邮箱服务
![alt text](部署.assets/image-22.png)

View File

@@ -56,7 +56,7 @@ spring:
# 短信服务配置 # 短信服务配置
sms: sms:
enabled: false enabled: true
provider: aliyun provider: aliyun
access-key-id: LTAI5t68do3qVXx5Rufugt3X access-key-id: LTAI5t68do3qVXx5Rufugt3X
access-key-secret: 2vD9ToIff49Vph4JQXsn0Cy8nXQfzA access-key-secret: 2vD9ToIff49Vph4JQXsn0Cy8nXQfzA

View File

@@ -31,13 +31,13 @@ mkdir -p "${VOLUMES_DIR}/nginx/logs"
# 复制配置文件模板 # 复制配置文件模板
echo "复制配置文件模板..." echo "复制配置文件模板..."
[ -f redis/redis.conf ] && cp redis/redis.conf "${VOLUMES_DIR}/redis/config/" || echo " ⚠️ redis.conf 不存在" [ -f "${SCRIPT_DIR}/redis/redis.conf" ] && cp "${SCRIPT_DIR}/redis/redis.conf" "${VOLUMES_DIR}/redis/config/" || echo " ⚠️ redis.conf 不存在"
[ -f mysql/my.cnf ] && cp mysql/my.cnf "${VOLUMES_DIR}/mysql/" || echo " ⚠️ my.cnf 不存在" [ -f "${SCRIPT_DIR}/mysql/my.cnf" ] && cp "${SCRIPT_DIR}/mysql/my.cnf" "${VOLUMES_DIR}/mysql/" || echo " ⚠️ my.cnf 不存在"
[ -f config/application.yml ] && cp config/application.yml "${VOLUMES_DIR}/serv/config/" || echo " ⚠️ application.yml 不存在" [ -f "${SCRIPT_DIR}/config/application.yml" ] && cp "${SCRIPT_DIR}/config/application.yml" "${VOLUMES_DIR}/serv/config/" || echo " ⚠️ application.yml 不存在"
[ -f config/log4j2-spring.xml ] && cp config/log4j2-spring.xml "${VOLUMES_DIR}/serv/config/" || echo " ⚠️ log4j2-spring.xml 不存在" [ -f "${SCRIPT_DIR}/config/log4j2-spring.xml" ] && cp "${SCRIPT_DIR}/config/log4j2-spring.xml" "${VOLUMES_DIR}/serv/config/" || echo " ⚠️ log4j2-spring.xml 不存在"
[ -f config/web-app-config.js ] && cp config/web-app-config.js "${VOLUMES_DIR}/web/config/app-config.js" || echo " ⚠️ web-app-config.js 不存在" [ -f "${SCRIPT_DIR}/config/web-app-config.js" ] && cp "${SCRIPT_DIR}/config/web-app-config.js" "${VOLUMES_DIR}/web/config/app-config.js" || echo " ⚠️ web-app-config.js 不存在"
[ -f nginx/nginx.conf ] && cp -r nginx/* "${VOLUMES_DIR}/nginx/config/" || echo " ⚠️ nginx配置 不存在" [ -f "${SCRIPT_DIR}/nginx/nginx.conf" ] && cp -r "${SCRIPT_DIR}/nginx"/* "${VOLUMES_DIR}/nginx/config/" || echo " ⚠️ nginx配置 不存在"
[ -d crawler/ ] && cp -r crawler/* "${VOLUMES_DIR}/serv/crawler/" || echo " ⚠️ 爬虫脚本 不存在" [ -d "${SCRIPT_DIR}/crawler/" ] && cp -r "${SCRIPT_DIR}/crawler"/* "${VOLUMES_DIR}/serv/crawler/" || echo " ⚠️ 爬虫脚本 不存在"
echo "" echo ""
echo "✅ 目录创建完成:" echo "✅ 目录创建完成:"

View File

@@ -69,7 +69,7 @@ spring:
sms: sms:
# 是否启用短信服务true: 真实发送, false: 模拟模式) # 是否启用短信服务true: 真实发送, false: 模拟模式)
# 开发环境建议设置为 false避免浪费短信费用 # 开发环境建议设置为 false避免浪费短信费用
enabled: false enabled: true
# 短信服务商aliyun: 阿里云, tencent: 腾讯云) # 短信服务商aliyun: 阿里云, tencent: 腾讯云)
provider: aliyun provider: aliyun
# AccessKey ID从服务商控制台获取 # AccessKey ID从服务商控制台获取