diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..eeff46e4 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,46 @@ +# Docker 构建时排除的目录和文件 + +# 排除数据卷目录(PostgreSQL 等容器创建的数据) +**/volumes/ +**/data/ +docker/**/volumes/ + +# 排除日志 +**/logs/ +*.log + +# 排除临时文件 +*.tmp +*.swp +.tmp/ + +# 排除 git +.git/ +**/.git/ + +# 排除 IDE 配置 +.idea/ +.vscode/ +**/.vscode/ + +# 排除环境文件 +.env +.env.local +**/.env.local + +# 排除 node_modules(前端构建时会重新安装) +**/node_modules/ + +# 排除构建产物(保留 JAR 文件) +**/build/ +# 排除 target 下的非 JAR 文件 +**/target/classes/ +**/target/generated-sources/ +**/target/generated-test-sources/ +**/target/maven-archiver/ +**/target/maven-status/ +**/target/test-classes/ +**/target/*.original + +# 排除导出的镜像 +docker/urbanLifeline/images/ diff --git a/build.sh b/build.sh new file mode 100644 index 00000000..e69de29b diff --git a/docker/.env.example b/docker/.env.example new file mode 100644 index 00000000..b1023c3b --- /dev/null +++ b/docker/.env.example @@ -0,0 +1,42 @@ +# ================================================ +# Urban Lifeline - Docker 环境变量配置 +# 复制此文件为 .env 并修改配置 +# ================================================ + +# 镜像版本 +IMAGE_VERSION=latest + +# 数据存储根目录 +DATA_ROOT=./volumes +LOG_ROOT=./volumes/logs + +# ====================== MySQL 配置 ====================== +MYSQL_HOST=host.docker.internal +MYSQL_PORT=3306 +MYSQL_USER=root +MYSQL_PASSWORD=123456 + +# ====================== Nacos 配置 ====================== +NACOS_SERVER_ADDR=nacos:8848 +NACOS_NAMESPACE= +NACOS_AUTH_TOKEN=ZlRkR2ZxR3BvZ1F0a3JxY2V6RUx2cUh1Rkx6V1ZQbE9kUVd1R1VOcWFFS2t3dG5hS0E9PQ== + +# ====================== MinIO 配置 ====================== +MINIO_ROOT_USER=minioadmin +MINIO_ROOT_PASSWORD=minioadmin123 +MINIO_ENDPOINT=http://minio:9000 + +# ====================== Jitsi 配置 ====================== +JITSI_PUBLIC_URL=https://org.xyzh.yslg.jitsi +JVB_HOST_ADDRESS=192.168.0.253 +JWT_APP_ID=urbanLifeline +JWT_APP_SECRET=urbanLifeline-jitsi-secret-key-2025-production-safe-hs256 + +# ====================== Dify 配置 ====================== +DIFY_API_URL=http://dify-api:5001 + +# ====================== Spring 配置 ====================== +SPRING_PROFILES_ACTIVE=prod + +# ====================== API 配置 ====================== +API_BASE_URL=http://gateway:8080 diff --git a/docker/Makefile b/docker/Makefile new file mode 100644 index 00000000..9946cdf6 --- /dev/null +++ b/docker/Makefile @@ -0,0 +1,318 @@ +# ================================================ +# Urban Lifeline - Docker 构建管理 Makefile +# ================================================ +# 使用方法: +# make help - 显示帮助信息 +# make build-all - 构建所有镜像 +# make build-serv - 构建所有后端服务镜像 +# make build-gateway - 构建单个服务镜像 +# make save-all - 导出所有镜像 +# make up - 启动所有服务 +# make down - 停止所有服务 +# ================================================ + +# 项目根目录(docker 目录的上级) +PROJECT_ROOT := $(shell cd .. && pwd) +DOCKER_DIR := $(shell pwd) + +# 镜像版本 +IMAGE_VERSION ?= $(shell date +%Y%m%d_%H%M%S) +IMAGE_REGISTRY ?= + +# 服务列表 +SERV_SERVICES := gateway system auth file ai workcase +WEB_SERVICES := platform workcase-web + +# 服务端口映射 +PORT_gateway := 8080 +PORT_system := 8082 +PORT_auth := 8081 +PORT_file := 8084 +PORT_ai := 8090 +PORT_workcase := 8088 + +# 输出目录 +BUILD_OUTPUT := $(DOCKER_DIR)/output + +# 颜色定义 +COLOR_RESET := \033[0m +COLOR_GREEN := \033[0;32m +COLOR_YELLOW := \033[0;33m +COLOR_BLUE := \033[0;34m +COLOR_RED := \033[0;31m + +# ================================================ +# 帮助信息 +# ================================================ +.PHONY: help +help: + @echo "$(COLOR_BLUE)=============================================$(COLOR_RESET)" + @echo "$(COLOR_BLUE) Urban Lifeline Docker 构建管理$(COLOR_RESET)" + @echo "$(COLOR_BLUE)=============================================$(COLOR_RESET)" + @echo "" + @echo "$(COLOR_GREEN)构建命令:$(COLOR_RESET)" + @echo " make build-base - 构建基础镜像" + @echo " make build-all - 构建所有镜像" + @echo " make build-serv - 构建所有后端服务镜像" + @echo " make build-web - 构建前端镜像" + @echo " make build- - 构建单个服务 (gateway/system/auth/file/ai/workcase)" + @echo "" + @echo "$(COLOR_GREEN)编译命令:$(COLOR_RESET)" + @echo " make compile-serv - 编译所有后端服务" + @echo " make compile- - 编译单个后端服务" + @echo " make compile-web - 编译所有前端项目" + @echo "" + @echo "$(COLOR_GREEN)导出命令:$(COLOR_RESET)" + @echo " make save-all - 导出所有镜像到 tar 文件" + @echo " make save-serv - 导出所有后端镜像" + @echo " make save- - 导出单个服务镜像" + @echo "" + @echo "$(COLOR_GREEN)运行命令:$(COLOR_RESET)" + @echo " make up - 启动所有服务" + @echo " make up-infra - 启动基础设施 (nacos/minio/jitsi)" + @echo " make up-serv - 启动后端服务" + @echo " make up-web - 启动前端服务" + @echo " make down - 停止所有服务" + @echo " make logs - 查看所有日志" + @echo " make status - 查看服务状态" + @echo "" + @echo "$(COLOR_GREEN)清理命令:$(COLOR_RESET)" + @echo " make clean - 清理构建产物" + @echo " make clean-images - 清理 Docker 镜像" + @echo "" + @echo "$(COLOR_YELLOW)当前版本: $(IMAGE_VERSION)$(COLOR_RESET)" + @echo "" + +# ================================================ +# 初始化 +# ================================================ +.PHONY: init +init: + @mkdir -p $(BUILD_OUTPUT) + @mkdir -p $(DOCKER_DIR)/volumes/logs + +# ================================================ +# 编译后端服务 +# ================================================ +.PHONY: compile-serv +compile-serv: + @echo "$(COLOR_YELLOW)编译所有后端服务...$(COLOR_RESET)" + @cd $(PROJECT_ROOT)/urbanLifelineServ && mvn clean package -DskipTests + @echo "$(COLOR_GREEN)✓ 后端服务编译完成$(COLOR_RESET)" + +.PHONY: $(addprefix compile-,$(SERV_SERVICES)) +$(addprefix compile-,$(SERV_SERVICES)): compile-%: + @echo "$(COLOR_YELLOW)编译 $* 服务...$(COLOR_RESET)" + @cd $(PROJECT_ROOT)/urbanLifelineServ && mvn clean package -DskipTests -pl $* -am + @echo "$(COLOR_GREEN)✓ $* 服务编译完成$(COLOR_RESET)" + +# ================================================ +# 编译前端项目 +# ================================================ +.PHONY: compile-web +compile-web: + @echo "$(COLOR_YELLOW)编译前端项目...$(COLOR_RESET)" + @cd $(PROJECT_ROOT)/urbanLifelineWeb && pnpm install && pnpm run build:all + @echo "$(COLOR_GREEN)✓ 前端项目编译完成$(COLOR_RESET)" + +.PHONY: compile-platform +compile-platform: + @echo "$(COLOR_YELLOW)编译 platform 项目...$(COLOR_RESET)" + @cd $(PROJECT_ROOT)/urbanLifelineWeb/packages/platform && pnpm run build + @echo "$(COLOR_GREEN)✓ platform 编译完成$(COLOR_RESET)" + +.PHONY: compile-workcase +compile-workcase-web: + @echo "$(COLOR_YELLOW)编译 workcase 项目...$(COLOR_RESET)" + @cd $(PROJECT_ROOT)/urbanLifelineWeb/packages/workcase && pnpm run build + @echo "$(COLOR_GREEN)✓ workcase 编译完成$(COLOR_RESET)" + +# ================================================ +# 构建 Docker 镜像 +# ================================================ +.PHONY: build-base +build-base: + @echo "$(COLOR_YELLOW)构建基础镜像...$(COLOR_RESET)" + @cd $(PROJECT_ROOT) && docker build \ + -t urban-lifeline-base-serv:$(IMAGE_VERSION) \ + -t urban-lifeline-base-serv:latest \ + -f docker/urbanLifeline/serv/Dockerfile.base . + @echo "$(COLOR_GREEN)✓ 基础镜像构建完成$(COLOR_RESET)" + +.PHONY: build-all +build-all: build-base build-serv build-web + @echo "$(COLOR_GREEN)✓ 所有镜像构建完成$(COLOR_RESET)" + +.PHONY: build-serv +build-serv: $(addprefix build-,$(SERV_SERVICES)) + @echo "$(COLOR_GREEN)✓ 所有后端服务镜像构建完成$(COLOR_RESET)" + +# 构建单个后端服务镜像 +.PHONY: $(addprefix build-,$(SERV_SERVICES)) +$(addprefix build-,$(SERV_SERVICES)): build-%: + @echo "$(COLOR_YELLOW)构建 $* 服务镜像...$(COLOR_RESET)" + @if [ ! -f "$(PROJECT_ROOT)/urbanLifelineServ/$*/target/$*-*.jar" ] && \ + [ ! -f "$(PROJECT_ROOT)/urbanLifelineServ/$*/target/*.jar" ]; then \ + echo "$(COLOR_RED)✗ JAR 包不存在,请先执行 make compile-$*$(COLOR_RESET)"; \ + exit 1; \ + fi + @cd $(PROJECT_ROOT) && docker build \ + --build-arg SERVICE_NAME=$* \ + --build-arg SERVICE_PORT=$(PORT_$*) \ + -t urban-lifeline-$*:$(IMAGE_VERSION) \ + -t urban-lifeline-$*:latest \ + -f docker/urbanLifeline/serv/Dockerfile.template . + @echo "$(COLOR_GREEN)✓ $* 镜像构建完成: urban-lifeline-$*:$(IMAGE_VERSION)$(COLOR_RESET)" + +.PHONY: build-web +build-web: build-platform build-workcase-web + @echo "$(COLOR_GREEN)✓ 所有前端镜像构建完成$(COLOR_RESET)" + +.PHONY: build-platform +build-platform: + @echo "$(COLOR_YELLOW)构建 platform 镜像...$(COLOR_RESET)" + @if [ ! -d "$(PROJECT_ROOT)/urbanLifelineWeb/packages/platform/dist" ]; then \ + echo "$(COLOR_RED)✗ platform dist 不存在,请先执行 make compile-web$(COLOR_RESET)"; \ + exit 1; \ + fi + @cd $(PROJECT_ROOT) && docker build \ + --build-arg WEB_NAME=platform \ + -t urban-lifeline-platform:$(IMAGE_VERSION) \ + -t urban-lifeline-platform:latest \ + -f docker/urbanLifeline/web/Dockerfile . + @echo "$(COLOR_GREEN)✓ platform 镜像构建完成$(COLOR_RESET)" + +.PHONY: build-workcase-web +build-workcase-web: + @echo "$(COLOR_YELLOW)构建 workcase-web 镜像...$(COLOR_RESET)" + @if [ ! -d "$(PROJECT_ROOT)/urbanLifelineWeb/packages/workcase/dist" ]; then \ + echo "$(COLOR_RED)✗ workcase dist 不存在,请先执行 make compile-web$(COLOR_RESET)"; \ + exit 1; \ + fi + @cd $(PROJECT_ROOT) && docker build \ + --build-arg WEB_NAME=workcase \ + -t urban-lifeline-workcase-web:$(IMAGE_VERSION) \ + -t urban-lifeline-workcase-web:latest \ + -f docker/urbanLifeline/web/Dockerfile . + @echo "$(COLOR_GREEN)✓ workcase-web 镜像构建完成$(COLOR_RESET)" + +# ================================================ +# 导出镜像 +# ================================================ +.PHONY: save-all +save-all: init save-serv save-web + @echo "$(COLOR_GREEN)✓ 所有镜像导出完成$(COLOR_RESET)" + @echo "输出目录: $(BUILD_OUTPUT)" + @ls -lh $(BUILD_OUTPUT)/*.tar 2>/dev/null || true + +.PHONY: save-serv +save-serv: $(addprefix save-,$(SERV_SERVICES)) + @echo "$(COLOR_GREEN)✓ 所有后端镜像导出完成$(COLOR_RESET)" + +.PHONY: $(addprefix save-,$(SERV_SERVICES)) +$(addprefix save-,$(SERV_SERVICES)): save-%: init + @echo "$(COLOR_YELLOW)导出 $* 镜像...$(COLOR_RESET)" + @docker save -o $(BUILD_OUTPUT)/urban-lifeline-$*_$(IMAGE_VERSION).tar \ + urban-lifeline-$*:$(IMAGE_VERSION) + @echo "$(COLOR_GREEN)✓ $* 镜像已导出: $(BUILD_OUTPUT)/urban-lifeline-$*_$(IMAGE_VERSION).tar$(COLOR_RESET)" + +.PHONY: save-web +save-web: save-platform save-workcase-web + @echo "$(COLOR_GREEN)✓ 所有前端镜像导出完成$(COLOR_RESET)" + +.PHONY: save-platform +save-platform: init + @echo "$(COLOR_YELLOW)导出 platform 镜像...$(COLOR_RESET)" + @docker save -o $(BUILD_OUTPUT)/urban-lifeline-platform_$(IMAGE_VERSION).tar \ + urban-lifeline-platform:$(IMAGE_VERSION) + @echo "$(COLOR_GREEN)✓ platform 镜像已导出$(COLOR_RESET)" + +.PHONY: save-workcase-web +save-workcase-web: init + @echo "$(COLOR_YELLOW)导出 workcase-web 镜像...$(COLOR_RESET)" + @docker save -o $(BUILD_OUTPUT)/urban-lifeline-workcase-web_$(IMAGE_VERSION).tar \ + urban-lifeline-workcase-web:$(IMAGE_VERSION) + @echo "$(COLOR_GREEN)✓ workcase-web 镜像已导出$(COLOR_RESET)" + +.PHONY: save-base +save-base: init + @echo "$(COLOR_YELLOW)导出基础镜像...$(COLOR_RESET)" + @docker save -o $(BUILD_OUTPUT)/urban-lifeline-base-serv_$(IMAGE_VERSION).tar \ + urban-lifeline-base-serv:$(IMAGE_VERSION) + @echo "$(COLOR_GREEN)✓ 基础镜像已导出$(COLOR_RESET)" + +# ================================================ +# Docker Compose 操作 +# ================================================ +.PHONY: up +up: + @echo "$(COLOR_YELLOW)启动所有服务...$(COLOR_RESET)" + @docker compose --profile all up -d + @echo "$(COLOR_GREEN)✓ 所有服务已启动$(COLOR_RESET)" + +.PHONY: up-infra +up-infra: + @echo "$(COLOR_YELLOW)启动基础设施...$(COLOR_RESET)" + @docker compose --profile infra up -d + @echo "$(COLOR_GREEN)✓ 基础设施已启动$(COLOR_RESET)" + +.PHONY: up-serv +up-serv: + @echo "$(COLOR_YELLOW)启动后端服务...$(COLOR_RESET)" + @docker compose --profile serv up -d + @echo "$(COLOR_GREEN)✓ 后端服务已启动$(COLOR_RESET)" + +.PHONY: up-web +up-web: + @echo "$(COLOR_YELLOW)前端已集成到 Nginx (infra),请使用 make up-infra$(COLOR_RESET)" + +.PHONY: down +down: + @echo "$(COLOR_YELLOW)停止所有服务...$(COLOR_RESET)" + @docker compose --profile all down + @echo "$(COLOR_GREEN)✓ 所有服务已停止$(COLOR_RESET)" + +.PHONY: restart +restart: down up + @echo "$(COLOR_GREEN)✓ 所有服务已重启$(COLOR_RESET)" + +.PHONY: logs +logs: + @docker compose logs -f + +.PHONY: status +status: + @echo "$(COLOR_BLUE)=============================================$(COLOR_RESET)" + @echo "$(COLOR_BLUE) 服务运行状态$(COLOR_RESET)" + @echo "$(COLOR_BLUE)=============================================$(COLOR_RESET)" + @docker compose ps + +# ================================================ +# 清理 +# ================================================ +.PHONY: clean +clean: + @echo "$(COLOR_YELLOW)清理构建产物...$(COLOR_RESET)" + @rm -rf $(BUILD_OUTPUT) + @echo "$(COLOR_GREEN)✓ 清理完成$(COLOR_RESET)" + +.PHONY: clean-images +clean-images: + @echo "$(COLOR_YELLOW)清理 Docker 镜像...$(COLOR_RESET)" + @docker images | grep "urban-lifeline" | awk '{print $$3}' | xargs -r docker rmi -f + @echo "$(COLOR_GREEN)✓ 镜像清理完成$(COLOR_RESET)" + +# ================================================ +# 快捷命令 +# ================================================ +.PHONY: full-build +full-build: compile-serv compile-web build-all + @echo "$(COLOR_GREEN)✓ 完整构建完成$(COLOR_RESET)" + +.PHONY: full-deploy +full-deploy: full-build save-all + @echo "$(COLOR_GREEN)✓ 完整部署包准备完成$(COLOR_RESET)" + @echo "输出目录: $(BUILD_OUTPUT)" + +# 默认目标 +.DEFAULT_GOAL := help diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 00000000..28dcd31f --- /dev/null +++ b/docker/README.md @@ -0,0 +1,188 @@ +# Urban Lifeline Docker 部署指南 + +## 目录结构 + +``` +docker/ +├── docker-compose.yml # 总控 compose 文件 +├── Makefile # 构建管理脚本 +├── .env.example # 环境变量模板 +├── README.md # 本文档 +│ +├── infra/ # Level 1: 基础设施 +│ └── docker-compose.yml # Nacos, MinIO, Jitsi Meet +│ +├── urbanLifeline/ +│ ├── serv/ # Level 2: 后端服务 +│ │ ├── docker-compose.yml +│ │ ├── Dockerfile.base # 基础镜像 +│ │ ├── Dockerfile.template # 服务镜像模板 +│ │ └── start.sh # 启动脚本 +│ │ +│ └── web/ # Level 3: 前端服务 +│ ├── docker-compose.yml +│ ├── Dockerfile +│ └── nginx/ # Nginx 配置 +│ ├── nginx.conf +│ └── conf.d/ +│ +├── dify/ # Dify AI 平台(独立管理) +│ └── docker-compose.yaml +│ +├── volumes/ # 数据卷目录 +│ ├── nacos/ +│ ├── minio/ +│ ├── jitsi/ +│ └── logs/ +│ +└── output/ # 镜像导出目录 +``` + +## 快速开始 + +### 1. 准备环境 + +```bash +# 复制环境变量配置 +cp .env.example .env + +# 编辑配置(根据实际环境修改) +vim .env +``` + +### 2. 编译项目 + +```bash +# 编译所有后端服务 +make compile-serv + +# 编译所有前端项目 +make compile-web + +# 或者一次性编译所有 +make full-build +``` + +### 3. 构建镜像 + +```bash +# 构建基础镜像(首次需要) +make build-base + +# 构建所有镜像 +make build-all + +# 或者单独构建 +make build-gateway +make build-system +make build-web +``` + +### 4. 启动服务 + +```bash +# 启动所有服务 +make up + +# 或者分层启动 +make up-infra # 先启动基础设施 +make up-serv # 再启动后端服务 +make up-web # 最后启动前端 +``` + +### 5. 查看状态 + +```bash +# 查看服务状态 +make status + +# 查看日志 +make logs + +# 查看特定服务日志 +docker compose logs -f gateway +``` + +## 服务层级 + +### Level 1: 基础设施 (infra) +- **Nginx**: 反向代理 + 前端静态资源 (80/443) +- **Nacos**: 服务注册与配置中心 (8848) +- **MinIO**: 对象存储服务 (9000/9001) +- **Jitsi Meet**: 视频会议服务 (8280) + +### Level 2: 后端服务 (serv) +启动顺序: gateway → system → file → auth → ai → workcase + +| 服务 | 端口 | 说明 | +|------|------|------| +| gateway | 8080 | API 网关 | +| system | 8082 | 系统服务 | +| file | 8084 | 文件服务 | +| auth | 8081 | 认证服务 | +| ai | 8090 | AI 服务 | +| workcase | 8088 | 工单服务 | + +### Level 3: 前端应用 (web) +前端静态资源已打包到 Nginx 镜像中,由 infra 层的 Nginx 服务提供: +- /platform - 管理平台 +- /workcase - 工单系统 + +## 常用命令 + +```bash +# 构建 +make build-all # 构建所有镜像 +make build-gateway # 构建单个服务 + +# 运行 +make up # 启动所有 +make up-infra # 只启动基础设施 +make down # 停止所有 + +# 导出 +make save-all # 导出所有镜像 +make save-gateway # 导出单个镜像 + +# 清理 +make clean # 清理构建产物 +make clean-images # 清理 Docker 镜像 +``` + +## 单独管理子服务 + +每个子目录都有独立的 docker-compose.yml,可以单独管理: + +```bash +# 只管理基础设施 +cd infra +docker compose up -d nacos +docker compose logs -f nacos + +# 只管理后端服务 +cd urbanLifeline/serv +docker compose up -d gateway +docker compose restart system +``` + +## 镜像导出与部署 + +```bash +# 导出所有镜像 +make save-all + +# 镜像文件在 output/ 目录 +ls -la output/ + +# 在目标服务器加载镜像 +docker load -i urban-lifeline-gateway_20251228_120000.tar +docker load -i urban-lifeline-web_20251228_120000.tar +``` + +## 注意事项 + +1. **首次部署**需要先构建基础镜像: `make build-base` +2. **MySQL** 需要在宿主机或单独容器中运行,配置 `MYSQL_HOST` +3. **Dify** 有独立的 docker-compose,在 `dify/` 目录单独管理 +4. 修改 `.env` 后需要重启服务才能生效 +5. 生产环境建议配置 SSL 证书 diff --git a/docker/build.sh b/docker/build.sh new file mode 100644 index 00000000..d9aa8c9f --- /dev/null +++ b/docker/build.sh @@ -0,0 +1,381 @@ +#!/bin/bash + +############################################## +# Urban Lifeline - 构建和打包脚本 +# +# 功能: +# 1. 编译后端/前端项目 +# 2. 构建 Docker 镜像 +# 3. 导出镜像到 tar 文件 +# +# 使用方法: +# ./build.sh [target] [options] +# +# 目标(target): +# base - 构建基础镜像 +# serv - 构建所有后端服务镜像 +# web - 构建前端镜像 +# all - 构建所有镜像(默认) +# gateway - 构建单个后端服务 +# system/auth/file/ai/workcase - 同上 +# +# 选项(options): +# compile - 先编译代码再构建镜像 +# save - 构建后导出镜像到 tar 文件 +# save=VERSION - 导出指定版本的镜像 +# +# 示例: +# ./build.sh all compile save # 编译+构建+导出所有 +# ./build.sh gateway compile # 编译+构建 gateway +# ./build.sh serv save # 构建+导出所有后端 +# ./build.sh web compile save # 编译+构建+导出前端 +############################################## + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } +log_step() { echo -e "${BLUE}[STEP]${NC} $1"; } + +# 项目路径 +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +PROJECT_ROOT=$(cd "${SCRIPT_DIR}/.." && pwd) +DOCKER_DIR="${SCRIPT_DIR}" +BUILD_OUTPUT="${DOCKER_DIR}/output" +IMAGE_VERSION=$(date +%Y%m%d_%H%M%S) + +# 服务列表 +SERV_SERVICES="gateway system auth file ai workcase" + +# 服务端口映射 +declare -A SERVICE_PORTS=( + ["gateway"]=8080 + ["system"]=8082 + ["auth"]=8081 + ["file"]=8084 + ["ai"]=8090 + ["workcase"]=8088 +) + +# 解析参数 +BUILD_TARGET="${1:-all}" +shift || true + +DO_COMPILE=false +DO_SAVE=false +SAVE_VERSION="" + +for arg in "$@"; do + case $arg in + compile) + DO_COMPILE=true + ;; + save) + DO_SAVE=true + ;; + save=*) + DO_SAVE=true + SAVE_VERSION="${arg#save=}" + ;; + esac +done + +# 确定保存版本 +if [ "${DO_SAVE}" = true ] && [ -z "${SAVE_VERSION}" ]; then + SAVE_VERSION="${IMAGE_VERSION}" +fi + +echo "==========================================" +echo "Urban Lifeline - 构建脚本" +echo "==========================================" +log_info "构建目标: ${BUILD_TARGET}" +log_info "构建版本: ${IMAGE_VERSION}" +log_info "编译代码: ${DO_COMPILE}" +log_info "保存镜像: ${DO_SAVE}" +[ "${DO_SAVE}" = true ] && log_info "保存版本: ${SAVE_VERSION}" +echo "==========================================" +echo "" + +mkdir -p "${BUILD_OUTPUT}" + +# ================================================ +# 编译函数 +# ================================================ + +compile_serv_all() { + log_step "编译所有后端服务" + cd "${PROJECT_ROOT}/urbanLifelineServ" + mvn clean package -DskipTests + log_info "✅ 后端服务编译完成" +} + +compile_serv_single() { + local service=$1 + log_step "编译 ${service} 服务" + cd "${PROJECT_ROOT}/urbanLifelineServ" + mvn clean package -DskipTests -pl ${service} -am + log_info "✅ ${service} 服务编译完成" +} + +compile_web() { + log_step "编译前端项目" + cd "${PROJECT_ROOT}/urbanLifelineWeb" + + # 检查 pnpm + if command -v pnpm &> /dev/null; then + pnpm install + pnpm run build:all 2>/dev/null || { + # 如果没有 build:all 脚本,分别构建 + log_info "分别构建各前端项目..." + cd packages/shared && pnpm run build && cd ../.. + cd packages/platform && pnpm run build && cd ../.. + cd packages/workcase && pnpm run build && cd ../.. + } + else + npm install + npm run build:all 2>/dev/null || { + cd packages/shared && npm run build && cd ../.. + cd packages/platform && npm run build && cd ../.. + cd packages/workcase && npm run build && cd ../.. + } + fi + log_info "✅ 前端项目编译完成" +} + +# ================================================ +# 构建函数 +# ================================================ + +build_base() { + log_step "构建基础镜像" + cd "${PROJECT_ROOT}" + docker build \ + -t urban-lifeline-base-serv:${IMAGE_VERSION} \ + -t urban-lifeline-base-serv:latest \ + -f docker/urbanLifeline/serv/Dockerfile.base . + log_info "✅ 基础镜像构建完成: urban-lifeline-base-serv:${IMAGE_VERSION}" +} + +build_serv_single() { + local service=$1 + local port=${SERVICE_PORTS[$service]} + + log_step "构建 ${service} 服务镜像" + + # 检查 JAR 包 + local jar_file=$(find "${PROJECT_ROOT}/urbanLifelineServ/${service}/target" -name "*.jar" -type f 2>/dev/null | head -1) + if [ -z "$jar_file" ]; then + log_error "JAR 包不存在,请先编译: ./build.sh ${service} compile" + exit 1 + fi + + cd "${PROJECT_ROOT}" + docker build \ + --build-arg SERVICE_NAME=${service} \ + --build-arg SERVICE_PORT=${port} \ + -t urban-lifeline-${service}:${IMAGE_VERSION} \ + -t urban-lifeline-${service}:latest \ + -f docker/urbanLifeline/serv/Dockerfile.template . + + log_info "✅ ${service} 镜像构建完成: urban-lifeline-${service}:${IMAGE_VERSION}" +} + +build_serv_all() { + for service in ${SERV_SERVICES}; do + build_serv_single ${service} + done + log_info "✅ 所有后端服务镜像构建完成" +} + +build_web() { + build_platform + build_workcase_web + log_info "✅ 所有前端镜像构建完成" +} + +build_platform() { + log_step "构建 platform 镜像" + + if [ ! -d "${PROJECT_ROOT}/urbanLifelineWeb/packages/platform/dist" ]; then + log_error "platform dist 不存在,请先编译: ./build.sh platform compile" + exit 1 + fi + + cd "${PROJECT_ROOT}" + docker build \ + --build-arg WEB_NAME=platform \ + -t urban-lifeline-platform:${IMAGE_VERSION} \ + -t urban-lifeline-platform:latest \ + -f docker/urbanLifeline/web/Dockerfile . + + log_info "✅ platform 镜像构建完成: urban-lifeline-platform:${IMAGE_VERSION}" +} + +build_workcase_web() { + log_step "构建 workcase-web 镜像" + + if [ ! -d "${PROJECT_ROOT}/urbanLifelineWeb/packages/workcase/dist" ]; then + log_error "workcase dist 不存在,请先编译: ./build.sh workcase-web compile" + exit 1 + fi + + cd "${PROJECT_ROOT}" + docker build \ + --build-arg WEB_NAME=workcase \ + -t urban-lifeline-workcase-web:${IMAGE_VERSION} \ + -t urban-lifeline-workcase-web:latest \ + -f docker/urbanLifeline/web/Dockerfile . + + log_info "✅ workcase-web 镜像构建完成: urban-lifeline-workcase-web:${IMAGE_VERSION}" +} + +# ================================================ +# 导出函数 +# ================================================ + +save_image() { + local image_name=$1 + local version=${SAVE_VERSION} + local output_file="${BUILD_OUTPUT}/${image_name}_${version}.tar" + + log_info "导出镜像: ${image_name}:${version}" + + if ! docker images | grep -q "${image_name}.*${version}"; then + log_error "镜像不存在: ${image_name}:${version}" + return 1 + fi + + docker save -o "${output_file}" ${image_name}:${version} + local size=$(du -h "${output_file}" | cut -f1) + log_info "✅ 镜像已导出: ${output_file} (${size})" +} + +save_serv_all() { + for service in ${SERV_SERVICES}; do + save_image "urban-lifeline-${service}" + done +} + +# ================================================ +# 主流程 +# ================================================ + +main() { + # 编译 + if [ "${DO_COMPILE}" = true ]; then + case ${BUILD_TARGET} in + base) + # 基础镜像不需要编译 + ;; + serv) + compile_serv_all + ;; + web) + compile_web + ;; + all) + compile_serv_all + compile_web + ;; + gateway|system|auth|file|ai|workcase) + compile_serv_single ${BUILD_TARGET} + ;; + *) + log_error "未知目标: ${BUILD_TARGET}" + exit 1 + ;; + esac + fi + + # 构建镜像 + case ${BUILD_TARGET} in + base) + build_base + ;; + serv) + build_serv_all + ;; + web) + build_web + ;; + platform) + build_platform + ;; + workcase-web) + build_workcase_web + ;; + all) + # 检查基础镜像 + if ! docker images | grep -q "urban-lifeline-base-serv.*latest"; then + log_warn "基础镜像不存在,先构建基础镜像" + build_base + fi + build_serv_all + build_web + ;; + gateway|system|auth|file|ai|workcase) + build_serv_single ${BUILD_TARGET} + ;; + *) + log_error "未知目标: ${BUILD_TARGET}" + echo "" + echo "可用目标: base, serv, web, all, gateway, system, auth, file, ai, workcase, platform, workcase-web" + exit 1 + ;; + esac + + # 导出镜像 + if [ "${DO_SAVE}" = true ]; then + case ${BUILD_TARGET} in + base) + save_image "urban-lifeline-base-serv" + ;; + serv) + save_serv_all + ;; + web) + save_image "urban-lifeline-platform" + save_image "urban-lifeline-workcase-web" + ;; + platform) + save_image "urban-lifeline-platform" + ;; + workcase-web) + save_image "urban-lifeline-workcase-web" + ;; + all) + save_image "urban-lifeline-base-serv" + save_serv_all + save_image "urban-lifeline-platform" + save_image "urban-lifeline-workcase-web" + ;; + gateway|system|auth|file|ai|workcase) + save_image "urban-lifeline-${BUILD_TARGET}" + ;; + esac + + echo "" + log_info "导出文件列表:" + ls -lh "${BUILD_OUTPUT}"/*.tar 2>/dev/null || true + fi + + # 显示镜像列表 + echo "" + log_info "Docker 镜像列表:" + docker images | grep "urban-lifeline" | head -20 + + echo "" + echo "==========================================" + log_info "✅ 构建完成!" + echo "==========================================" +} + +main diff --git a/docker/dify/.env.example b/docker/dify/.env.example new file mode 100644 index 00000000..0323f36e --- /dev/null +++ b/docker/dify/.env.example @@ -0,0 +1,1437 @@ +# ------------------------------ +# Environment Variables for API service & worker +# ------------------------------ + +# ------------------------------ +# Common Variables +# ------------------------------ + +# The backend URL of the console API, +# used to concatenate the authorization callback. +# If empty, it is the same domain. +# Example: https://api.console.dify.ai +CONSOLE_API_URL= + +# The front-end URL of the console web, +# used to concatenate some front-end addresses and for CORS configuration use. +# If empty, it is the same domain. +# Example: https://console.dify.ai +CONSOLE_WEB_URL= + +# Service API Url, +# used to display Service API Base Url to the front-end. +# If empty, it is the same domain. +# Example: https://api.dify.ai +SERVICE_API_URL= + +# Trigger external URL +# used to display trigger endpoint API Base URL to the front-end. +# Example: https://api.dify.ai +TRIGGER_URL=http://localhost + +# WebApp API backend Url, +# used to declare the back-end URL for the front-end API. +# If empty, it is the same domain. +# Example: https://api.app.dify.ai +APP_API_URL= + +# WebApp Url, +# used to display WebAPP API Base Url to the front-end. +# If empty, it is the same domain. +# Example: https://app.dify.ai +APP_WEB_URL= + +# File preview or download Url prefix. +# used to display File preview or download Url to the front-end or as Multi-model inputs; +# Url is signed and has expiration time. +# Setting FILES_URL is required for file processing plugins. +# - For https://example.com, use FILES_URL=https://example.com +# - For http://example.com, use FILES_URL=http://example.com +# Recommendation: use a dedicated domain (e.g., https://upload.example.com). +# Alternatively, use http://:5001 or http://api:5001, +# ensuring port 5001 is externally accessible (see docker-compose.yaml). +FILES_URL= + +# INTERNAL_FILES_URL is used for plugin daemon communication within Docker network. +# Set this to the internal Docker service URL for proper plugin file access. +# Example: INTERNAL_FILES_URL=http://api:5001 +INTERNAL_FILES_URL= + +# Ensure UTF-8 encoding +LANG=en_US.UTF-8 +LC_ALL=en_US.UTF-8 +PYTHONIOENCODING=utf-8 + +# ------------------------------ +# Server Configuration +# ------------------------------ + +# The log level for the application. +# Supported values are `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL` +LOG_LEVEL=INFO +# Log file path +LOG_FILE=/app/logs/server.log +# Log file max size, the unit is MB +LOG_FILE_MAX_SIZE=20 +# Log file max backup count +LOG_FILE_BACKUP_COUNT=5 +# Log dateformat +LOG_DATEFORMAT=%Y-%m-%d %H:%M:%S +# Log Timezone +LOG_TZ=UTC + +# Debug mode, default is false. +# It is recommended to turn on this configuration for local development +# to prevent some problems caused by monkey patch. +DEBUG=false + +# Flask debug mode, it can output trace information at the interface when turned on, +# which is convenient for debugging. +FLASK_DEBUG=false + +# Enable request logging, which will log the request and response information. +# And the log level is DEBUG +ENABLE_REQUEST_LOGGING=False + +# A secret key that is used for securely signing the session cookie +# and encrypting sensitive information on the database. +# You can generate a strong key using `openssl rand -base64 42`. +SECRET_KEY=sk-9f73s3ljTXVcMT3Blb3ljTqtsKiGHXVcMT3BlbkFJLK7U + +# Password for admin user initialization. +# If left unset, admin user will not be prompted for a password +# when creating the initial admin account. +# The length of the password cannot exceed 30 characters. +INIT_PASSWORD= + +# Deployment environment. +# Supported values are `PRODUCTION`, `TESTING`. Default is `PRODUCTION`. +# Testing environment. There will be a distinct color label on the front-end page, +# indicating that this environment is a testing environment. +DEPLOY_ENV=PRODUCTION + +# Whether to enable the version check policy. +# If set to empty, https://updates.dify.ai will be called for version check. +CHECK_UPDATE_URL=https://updates.dify.ai + +# Used to change the OpenAI base address, default is https://api.openai.com/v1. +# When OpenAI cannot be accessed in China, replace it with a domestic mirror address, +# or when a local model provides OpenAI compatible API, it can be replaced. +OPENAI_API_BASE=https://api.openai.com/v1 + +# When enabled, migrations will be executed prior to application startup +# and the application will start after the migrations have completed. +MIGRATION_ENABLED=true + +# File Access Time specifies a time interval in seconds for the file to be accessed. +# The default value is 300 seconds. +FILES_ACCESS_TIMEOUT=300 + +# Access token expiration time in minutes +ACCESS_TOKEN_EXPIRE_MINUTES=60 + +# Refresh token expiration time in days +REFRESH_TOKEN_EXPIRE_DAYS=30 + +# The default number of active requests for the application, where 0 means unlimited, should be a non-negative integer. +APP_DEFAULT_ACTIVE_REQUESTS=0 +# The maximum number of active requests for the application, where 0 means unlimited, should be a non-negative integer. +APP_MAX_ACTIVE_REQUESTS=0 +APP_MAX_EXECUTION_TIME=1200 + +# ------------------------------ +# Container Startup Related Configuration +# Only effective when starting with docker image or docker-compose. +# ------------------------------ + +# API service binding address, default: 0.0.0.0, i.e., all addresses can be accessed. +DIFY_BIND_ADDRESS=0.0.0.0 + +# API service binding port number, default 5001. +DIFY_PORT=5001 + +# The number of API server workers, i.e., the number of workers. +# Formula: number of cpu cores x 2 + 1 for sync, 1 for Gevent +# Reference: https://docs.gunicorn.org/en/stable/design.html#how-many-workers +SERVER_WORKER_AMOUNT=1 + +# Defaults to gevent. If using windows, it can be switched to sync or solo. +# +# Warning: Changing this parameter requires disabling patching for +# psycopg2 and gRPC (see `gunicorn.conf.py` and `celery_entrypoint.py`). +# Modifying it may also decrease throughput. +# +# It is strongly discouraged to change this parameter. +SERVER_WORKER_CLASS=gevent + +# Default number of worker connections, the default is 10. +SERVER_WORKER_CONNECTIONS=10 + +# Similar to SERVER_WORKER_CLASS. +# If using windows, it can be switched to sync or solo. +# +# Warning: Changing this parameter requires disabling patching for +# psycopg2 and gRPC (see `gunicorn_conf.py` and `celery_entrypoint.py`). +# Modifying it may also decrease throughput. +# +# It is strongly discouraged to change this parameter. +CELERY_WORKER_CLASS= + +# Request handling timeout. The default is 200, +# it is recommended to set it to 360 to support a longer sse connection time. +GUNICORN_TIMEOUT=360 + +# The number of Celery workers. The default is 1, and can be set as needed. +CELERY_WORKER_AMOUNT= + +# Flag indicating whether to enable autoscaling of Celery workers. +# +# Autoscaling is useful when tasks are CPU intensive and can be dynamically +# allocated and deallocated based on the workload. +# +# When autoscaling is enabled, the maximum and minimum number of workers can +# be specified. The autoscaling algorithm will dynamically adjust the number +# of workers within the specified range. +# +# Default is false (i.e., autoscaling is disabled). +# +# Example: +# CELERY_AUTO_SCALE=true +CELERY_AUTO_SCALE=false + +# The maximum number of Celery workers that can be autoscaled. +# This is optional and only used when autoscaling is enabled. +# Default is not set. +CELERY_MAX_WORKERS= + +# The minimum number of Celery workers that can be autoscaled. +# This is optional and only used when autoscaling is enabled. +# Default is not set. +CELERY_MIN_WORKERS= + +# API Tool configuration +API_TOOL_DEFAULT_CONNECT_TIMEOUT=10 +API_TOOL_DEFAULT_READ_TIMEOUT=60 + +# ------------------------------- +# Datasource Configuration +# -------------------------------- +ENABLE_WEBSITE_JINAREADER=true +ENABLE_WEBSITE_FIRECRAWL=true +ENABLE_WEBSITE_WATERCRAWL=true + +# Enable inline LaTeX rendering with single dollar signs ($...$) in the web frontend +# Default is false for security reasons to prevent conflicts with regular text +NEXT_PUBLIC_ENABLE_SINGLE_DOLLAR_LATEX=false + +# ------------------------------ +# Database Configuration +# The database uses PostgreSQL or MySQL. OceanBase and seekdb are also supported. Please use the public schema. +# It is consistent with the configuration in the database service below. +# You can adjust the database configuration according to your needs. +# ------------------------------ + +# Database type, supported values are `postgresql` and `mysql` +DB_TYPE=postgresql +# For MySQL, only `root` user is supported for now +DB_USERNAME=postgres +DB_PASSWORD=difyai123456 +DB_HOST=db_postgres +DB_PORT=5432 +DB_DATABASE=dify + +# The size of the database connection pool. +# The default is 30 connections, which can be appropriately increased. +SQLALCHEMY_POOL_SIZE=30 +# The default is 10 connections, which allows temporary overflow beyond the pool size. +SQLALCHEMY_MAX_OVERFLOW=10 +# Database connection pool recycling time, the default is 3600 seconds. +SQLALCHEMY_POOL_RECYCLE=3600 +# Whether to print SQL, default is false. +SQLALCHEMY_ECHO=false +# If True, will test connections for liveness upon each checkout +SQLALCHEMY_POOL_PRE_PING=false +# Whether to enable the Last in first out option or use default FIFO queue if is false +SQLALCHEMY_POOL_USE_LIFO=false +# Number of seconds to wait for a connection from the pool before raising a timeout error. +# Default is 30 +SQLALCHEMY_POOL_TIMEOUT=30 + +# Maximum number of connections to the database +# Default is 100 +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-connection.html#GUC-MAX-CONNECTIONS +POSTGRES_MAX_CONNECTIONS=100 + +# Sets the amount of shared memory used for postgres's shared buffers. +# Default is 128MB +# Recommended value: 25% of available memory +# Reference: https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-SHARED-BUFFERS +POSTGRES_SHARED_BUFFERS=128MB + +# Sets the amount of memory used by each database worker for working space. +# Default is 4MB +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-WORK-MEM +POSTGRES_WORK_MEM=4MB + +# Sets the amount of memory reserved for maintenance activities. +# Default is 64MB +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-MAINTENANCE-WORK-MEM +POSTGRES_MAINTENANCE_WORK_MEM=64MB + +# Sets the planner's assumption about the effective cache size. +# Default is 4096MB +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-query.html#GUC-EFFECTIVE-CACHE-SIZE +POSTGRES_EFFECTIVE_CACHE_SIZE=4096MB + +# Sets the maximum allowed duration of any statement before termination. +# Default is 0 (no timeout). +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-STATEMENT-TIMEOUT +# A value of 0 prevents the server from timing out statements. +POSTGRES_STATEMENT_TIMEOUT=0 + +# Sets the maximum allowed duration of any idle in-transaction session before termination. +# Default is 0 (no timeout). +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-IDLE-IN-TRANSACTION-SESSION-TIMEOUT +# A value of 0 prevents the server from terminating idle sessions. +POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT=0 + +# MySQL Performance Configuration +# Maximum number of connections to MySQL +# +# Default is 1000 +MYSQL_MAX_CONNECTIONS=1000 + +# InnoDB buffer pool size +# Default is 512M +# Recommended value: 70-80% of available memory for dedicated MySQL server +# Reference: https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_buffer_pool_size +MYSQL_INNODB_BUFFER_POOL_SIZE=512M + +# InnoDB log file size +# Default is 128M +# Reference: https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_log_file_size +MYSQL_INNODB_LOG_FILE_SIZE=128M + +# InnoDB flush log at transaction commit +# Default is 2 (flush to OS cache, sync every second) +# Options: 0 (no flush), 1 (flush and sync), 2 (flush to OS cache) +# Reference: https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit +MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT=2 + +# ------------------------------ +# Redis Configuration +# This Redis configuration is used for caching and for pub/sub during conversation. +# ------------------------------ + +REDIS_HOST=redis +REDIS_PORT=6379 +REDIS_USERNAME= +REDIS_PASSWORD=difyai123456 +REDIS_USE_SSL=false +# SSL configuration for Redis (when REDIS_USE_SSL=true) +REDIS_SSL_CERT_REQS=CERT_NONE +# Options: CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED +REDIS_SSL_CA_CERTS= +# Path to CA certificate file for SSL verification +REDIS_SSL_CERTFILE= +# Path to client certificate file for SSL authentication +REDIS_SSL_KEYFILE= +# Path to client private key file for SSL authentication +REDIS_DB=0 + +# Whether to use Redis Sentinel mode. +# If set to true, the application will automatically discover and connect to the master node through Sentinel. +REDIS_USE_SENTINEL=false + +# List of Redis Sentinel nodes. If Sentinel mode is enabled, provide at least one Sentinel IP and port. +# Format: `:,:,:` +REDIS_SENTINELS= +REDIS_SENTINEL_SERVICE_NAME= +REDIS_SENTINEL_USERNAME= +REDIS_SENTINEL_PASSWORD= +REDIS_SENTINEL_SOCKET_TIMEOUT=0.1 + +# List of Redis Cluster nodes. If Cluster mode is enabled, provide at least one Cluster IP and port. +# Format: `:,:,:` +REDIS_USE_CLUSTERS=false +REDIS_CLUSTERS= +REDIS_CLUSTERS_PASSWORD= + +# ------------------------------ +# Celery Configuration +# ------------------------------ + +# Use standalone redis as the broker, and redis db 1 for celery broker. (redis_username is usually set by default as empty) +# Format as follows: `redis://:@:/`. +# Example: redis://:difyai123456@redis:6379/1 +# If use Redis Sentinel, format as follows: `sentinel://:@:/` +# For high availability, you can configure multiple Sentinel nodes (if provided) separated by semicolons like below example: +# Example: sentinel://:difyai123456@localhost:26379/1;sentinel://:difyai12345@localhost:26379/1;sentinel://:difyai12345@localhost:26379/1 +CELERY_BROKER_URL=redis://:difyai123456@redis:6379/1 +CELERY_BACKEND=redis +BROKER_USE_SSL=false + +# If you are using Redis Sentinel for high availability, configure the following settings. +CELERY_USE_SENTINEL=false +CELERY_SENTINEL_MASTER_NAME= +CELERY_SENTINEL_PASSWORD= +CELERY_SENTINEL_SOCKET_TIMEOUT=0.1 + +# ------------------------------ +# CORS Configuration +# Used to set the front-end cross-domain access policy. +# ------------------------------ + +# Specifies the allowed origins for cross-origin requests to the Web API, +# e.g. https://dify.app or * for all origins. +WEB_API_CORS_ALLOW_ORIGINS=* + +# Specifies the allowed origins for cross-origin requests to the console API, +# e.g. https://cloud.dify.ai or * for all origins. +CONSOLE_CORS_ALLOW_ORIGINS=* +# When the frontend and backend run on different subdomains, set COOKIE_DOMAIN to the site’s top-level domain (e.g., `example.com`). Leading dots are optional. +COOKIE_DOMAIN= +# When the frontend and backend run on different subdomains, set NEXT_PUBLIC_COOKIE_DOMAIN=1. +NEXT_PUBLIC_COOKIE_DOMAIN= + +# ------------------------------ +# File Storage Configuration +# ------------------------------ + +# The type of storage to use for storing user files. +STORAGE_TYPE=opendal + +# Apache OpenDAL Configuration +# The configuration for OpenDAL consists of the following format: OPENDAL__. +# You can find all the service configurations (CONFIG_NAME) in the repository at: https://github.com/apache/opendal/tree/main/core/src/services. +# Dify will scan configurations starting with OPENDAL_ and automatically apply them. +# The scheme name for the OpenDAL storage. +OPENDAL_SCHEME=fs +# Configurations for OpenDAL Local File System. +OPENDAL_FS_ROOT=storage + +# ClickZetta Volume Configuration (for storage backend) +# To use ClickZetta Volume as storage backend, set STORAGE_TYPE=clickzetta-volume +# Note: ClickZetta Volume will reuse the existing CLICKZETTA_* connection parameters + +# Volume type selection (three types available): +# - user: Personal/small team use, simple config, user-level permissions +# - table: Enterprise multi-tenant, smart routing, table-level + user-level permissions +# - external: Data lake integration, external storage connection, volume-level + storage-level permissions +CLICKZETTA_VOLUME_TYPE=user + +# External Volume name (required only when TYPE=external) +CLICKZETTA_VOLUME_NAME= + +# Table Volume table prefix (used only when TYPE=table) +CLICKZETTA_VOLUME_TABLE_PREFIX=dataset_ + +# Dify file directory prefix (isolates from other apps, recommended to keep default) +CLICKZETTA_VOLUME_DIFY_PREFIX=dify_km + +# S3 Configuration +# +S3_ENDPOINT= +S3_REGION=us-east-1 +S3_BUCKET_NAME=difyai +S3_ACCESS_KEY= +S3_SECRET_KEY= +# Whether to use AWS managed IAM roles for authenticating with the S3 service. +# If set to false, the access key and secret key must be provided. +S3_USE_AWS_MANAGED_IAM=false + +# Azure Blob Configuration +# +AZURE_BLOB_ACCOUNT_NAME=difyai +AZURE_BLOB_ACCOUNT_KEY=difyai +AZURE_BLOB_CONTAINER_NAME=difyai-container +AZURE_BLOB_ACCOUNT_URL=https://.blob.core.windows.net + +# Google Storage Configuration +# +GOOGLE_STORAGE_BUCKET_NAME=your-bucket-name +GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64= + +# The Alibaba Cloud OSS configurations, +# +ALIYUN_OSS_BUCKET_NAME=your-bucket-name +ALIYUN_OSS_ACCESS_KEY=your-access-key +ALIYUN_OSS_SECRET_KEY=your-secret-key +ALIYUN_OSS_ENDPOINT=https://oss-ap-southeast-1-internal.aliyuncs.com +ALIYUN_OSS_REGION=ap-southeast-1 +ALIYUN_OSS_AUTH_VERSION=v4 +# Don't start with '/'. OSS doesn't support leading slash in object names. +ALIYUN_OSS_PATH=your-path + +# Tencent COS Configuration +# +TENCENT_COS_BUCKET_NAME=your-bucket-name +TENCENT_COS_SECRET_KEY=your-secret-key +TENCENT_COS_SECRET_ID=your-secret-id +TENCENT_COS_REGION=your-region +TENCENT_COS_SCHEME=your-scheme + +# Oracle Storage Configuration +# +OCI_ENDPOINT=https://your-object-storage-namespace.compat.objectstorage.us-ashburn-1.oraclecloud.com +OCI_BUCKET_NAME=your-bucket-name +OCI_ACCESS_KEY=your-access-key +OCI_SECRET_KEY=your-secret-key +OCI_REGION=us-ashburn-1 + +# Huawei OBS Configuration +# +HUAWEI_OBS_BUCKET_NAME=your-bucket-name +HUAWEI_OBS_SECRET_KEY=your-secret-key +HUAWEI_OBS_ACCESS_KEY=your-access-key +HUAWEI_OBS_SERVER=your-server-url + +# Volcengine TOS Configuration +# +VOLCENGINE_TOS_BUCKET_NAME=your-bucket-name +VOLCENGINE_TOS_SECRET_KEY=your-secret-key +VOLCENGINE_TOS_ACCESS_KEY=your-access-key +VOLCENGINE_TOS_ENDPOINT=your-server-url +VOLCENGINE_TOS_REGION=your-region + +# Baidu OBS Storage Configuration +# +BAIDU_OBS_BUCKET_NAME=your-bucket-name +BAIDU_OBS_SECRET_KEY=your-secret-key +BAIDU_OBS_ACCESS_KEY=your-access-key +BAIDU_OBS_ENDPOINT=your-server-url + +# Supabase Storage Configuration +# +SUPABASE_BUCKET_NAME=your-bucket-name +SUPABASE_API_KEY=your-access-key +SUPABASE_URL=your-server-url + +# ------------------------------ +# Vector Database Configuration +# ------------------------------ + +# The type of vector store to use. +# Supported values are `weaviate`, `oceanbase`, `qdrant`, `milvus`, `myscale`, `relyt`, `pgvector`, `pgvecto-rs`, `chroma`, `opensearch`, `oracle`, `tencent`, `elasticsearch`, `elasticsearch-ja`, `analyticdb`, `couchbase`, `vikingdb`, `opengauss`, `tablestore`,`vastbase`,`tidb`,`tidb_on_qdrant`,`baidu`,`lindorm`,`huawei_cloud`,`upstash`, `matrixone`, `clickzetta`, `alibabacloud_mysql`. +VECTOR_STORE=weaviate +# Prefix used to create collection name in vector database +VECTOR_INDEX_NAME_PREFIX=Vector_index + +# The Weaviate endpoint URL. Only available when VECTOR_STORE is `weaviate`. +WEAVIATE_ENDPOINT=http://weaviate:8080 +WEAVIATE_API_KEY=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih +WEAVIATE_GRPC_ENDPOINT=grpc://weaviate:50051 +WEAVIATE_TOKENIZATION=word + +# For OceanBase metadata database configuration, available when `DB_TYPE` is `mysql` and `COMPOSE_PROFILES` includes `oceanbase`. +# For OceanBase vector database configuration, available when `VECTOR_STORE` is `oceanbase` +# If you want to use OceanBase as both vector database and metadata database, you need to set `DB_TYPE` to `mysql`, `COMPOSE_PROFILES` is `oceanbase`, and set Database Configuration is the same as the vector database. +# seekdb is the lite version of OceanBase and shares the connection configuration with OceanBase. +OCEANBASE_VECTOR_HOST=oceanbase +OCEANBASE_VECTOR_PORT=2881 +OCEANBASE_VECTOR_USER=root@test +OCEANBASE_VECTOR_PASSWORD=difyai123456 +OCEANBASE_VECTOR_DATABASE=test +OCEANBASE_CLUSTER_NAME=difyai +OCEANBASE_MEMORY_LIMIT=6G +OCEANBASE_ENABLE_HYBRID_SEARCH=false +# For OceanBase vector database, built-in fulltext parsers are `ngram`, `beng`, `space`, `ngram2`, `ik` +# For OceanBase vector database, external fulltext parsers (require plugin installation) are `japanese_ftparser`, `thai_ftparser` +OCEANBASE_FULLTEXT_PARSER=ik +SEEKDB_MEMORY_LIMIT=2G + +# The Qdrant endpoint URL. Only available when VECTOR_STORE is `qdrant`. +QDRANT_URL=http://qdrant:6333 +QDRANT_API_KEY=difyai123456 +QDRANT_CLIENT_TIMEOUT=20 +QDRANT_GRPC_ENABLED=false +QDRANT_GRPC_PORT=6334 +QDRANT_REPLICATION_FACTOR=1 + +# Milvus configuration. Only available when VECTOR_STORE is `milvus`. +# The milvus uri. +MILVUS_URI=http://host.docker.internal:19530 +MILVUS_DATABASE= +MILVUS_TOKEN= +MILVUS_USER= +MILVUS_PASSWORD= +MILVUS_ENABLE_HYBRID_SEARCH=False +MILVUS_ANALYZER_PARAMS= + +# MyScale configuration, only available when VECTOR_STORE is `myscale` +# For multi-language support, please set MYSCALE_FTS_PARAMS with referring to: +# https://myscale.com/docs/en/text-search/#understanding-fts-index-parameters +MYSCALE_HOST=myscale +MYSCALE_PORT=8123 +MYSCALE_USER=default +MYSCALE_PASSWORD= +MYSCALE_DATABASE=dify +MYSCALE_FTS_PARAMS= + +# Couchbase configurations, only available when VECTOR_STORE is `couchbase` +# The connection string must include hostname defined in the docker-compose file (couchbase-server in this case) +COUCHBASE_CONNECTION_STRING=couchbase://couchbase-server +COUCHBASE_USER=Administrator +COUCHBASE_PASSWORD=password +COUCHBASE_BUCKET_NAME=Embeddings +COUCHBASE_SCOPE_NAME=_default + +# pgvector configurations, only available when VECTOR_STORE is `pgvector` +PGVECTOR_HOST=pgvector +PGVECTOR_PORT=5432 +PGVECTOR_USER=postgres +PGVECTOR_PASSWORD=difyai123456 +PGVECTOR_DATABASE=dify +PGVECTOR_MIN_CONNECTION=1 +PGVECTOR_MAX_CONNECTION=5 +PGVECTOR_PG_BIGM=false +PGVECTOR_PG_BIGM_VERSION=1.2-20240606 + +# vastbase configurations, only available when VECTOR_STORE is `vastbase` +VASTBASE_HOST=vastbase +VASTBASE_PORT=5432 +VASTBASE_USER=dify +VASTBASE_PASSWORD=Difyai123456 +VASTBASE_DATABASE=dify +VASTBASE_MIN_CONNECTION=1 +VASTBASE_MAX_CONNECTION=5 + +# pgvecto-rs configurations, only available when VECTOR_STORE is `pgvecto-rs` +PGVECTO_RS_HOST=pgvecto-rs +PGVECTO_RS_PORT=5432 +PGVECTO_RS_USER=postgres +PGVECTO_RS_PASSWORD=difyai123456 +PGVECTO_RS_DATABASE=dify + +# analyticdb configurations, only available when VECTOR_STORE is `analyticdb` +ANALYTICDB_KEY_ID=your-ak +ANALYTICDB_KEY_SECRET=your-sk +ANALYTICDB_REGION_ID=cn-hangzhou +ANALYTICDB_INSTANCE_ID=gp-ab123456 +ANALYTICDB_ACCOUNT=testaccount +ANALYTICDB_PASSWORD=testpassword +ANALYTICDB_NAMESPACE=dify +ANALYTICDB_NAMESPACE_PASSWORD=difypassword +ANALYTICDB_HOST=gp-test.aliyuncs.com +ANALYTICDB_PORT=5432 +ANALYTICDB_MIN_CONNECTION=1 +ANALYTICDB_MAX_CONNECTION=5 + +# TiDB vector configurations, only available when VECTOR_STORE is `tidb_vector` +TIDB_VECTOR_HOST=tidb +TIDB_VECTOR_PORT=4000 +TIDB_VECTOR_USER= +TIDB_VECTOR_PASSWORD= +TIDB_VECTOR_DATABASE=dify + +# Matrixone vector configurations. +MATRIXONE_HOST=matrixone +MATRIXONE_PORT=6001 +MATRIXONE_USER=dump +MATRIXONE_PASSWORD=111 +MATRIXONE_DATABASE=dify + +# Tidb on qdrant configuration, only available when VECTOR_STORE is `tidb_on_qdrant` +TIDB_ON_QDRANT_URL=http://127.0.0.1 +TIDB_ON_QDRANT_API_KEY=dify +TIDB_ON_QDRANT_CLIENT_TIMEOUT=20 +TIDB_ON_QDRANT_GRPC_ENABLED=false +TIDB_ON_QDRANT_GRPC_PORT=6334 +TIDB_PUBLIC_KEY=dify +TIDB_PRIVATE_KEY=dify +TIDB_API_URL=http://127.0.0.1 +TIDB_IAM_API_URL=http://127.0.0.1 +TIDB_REGION=regions/aws-us-east-1 +TIDB_PROJECT_ID=dify +TIDB_SPEND_LIMIT=100 + +# Chroma configuration, only available when VECTOR_STORE is `chroma` +CHROMA_HOST=127.0.0.1 +CHROMA_PORT=8000 +CHROMA_TENANT=default_tenant +CHROMA_DATABASE=default_database +CHROMA_AUTH_PROVIDER=chromadb.auth.token_authn.TokenAuthClientProvider +CHROMA_AUTH_CREDENTIALS= + +# Oracle configuration, only available when VECTOR_STORE is `oracle` +ORACLE_USER=dify +ORACLE_PASSWORD=dify +ORACLE_DSN=oracle:1521/FREEPDB1 +ORACLE_CONFIG_DIR=/app/api/storage/wallet +ORACLE_WALLET_LOCATION=/app/api/storage/wallet +ORACLE_WALLET_PASSWORD=dify +ORACLE_IS_AUTONOMOUS=false + +# AlibabaCloud MySQL configuration, only available when VECTOR_STORE is `alibabcloud_mysql` +ALIBABACLOUD_MYSQL_HOST=127.0.0.1 +ALIBABACLOUD_MYSQL_PORT=3306 +ALIBABACLOUD_MYSQL_USER=root +ALIBABACLOUD_MYSQL_PASSWORD=difyai123456 +ALIBABACLOUD_MYSQL_DATABASE=dify +ALIBABACLOUD_MYSQL_MAX_CONNECTION=5 +ALIBABACLOUD_MYSQL_HNSW_M=6 + +# relyt configurations, only available when VECTOR_STORE is `relyt` +RELYT_HOST=db +RELYT_PORT=5432 +RELYT_USER=postgres +RELYT_PASSWORD=difyai123456 +RELYT_DATABASE=postgres + +# open search configuration, only available when VECTOR_STORE is `opensearch` +OPENSEARCH_HOST=opensearch +OPENSEARCH_PORT=9200 +OPENSEARCH_SECURE=true +OPENSEARCH_VERIFY_CERTS=true +OPENSEARCH_AUTH_METHOD=basic +OPENSEARCH_USER=admin +OPENSEARCH_PASSWORD=admin +# If using AWS managed IAM, e.g. Managed Cluster or OpenSearch Serverless +OPENSEARCH_AWS_REGION=ap-southeast-1 +OPENSEARCH_AWS_SERVICE=aoss + +# tencent vector configurations, only available when VECTOR_STORE is `tencent` +TENCENT_VECTOR_DB_URL=http://127.0.0.1 +TENCENT_VECTOR_DB_API_KEY=dify +TENCENT_VECTOR_DB_TIMEOUT=30 +TENCENT_VECTOR_DB_USERNAME=dify +TENCENT_VECTOR_DB_DATABASE=dify +TENCENT_VECTOR_DB_SHARD=1 +TENCENT_VECTOR_DB_REPLICAS=2 +TENCENT_VECTOR_DB_ENABLE_HYBRID_SEARCH=false + +# ElasticSearch configuration, only available when VECTOR_STORE is `elasticsearch` +ELASTICSEARCH_HOST=0.0.0.0 +ELASTICSEARCH_PORT=9200 +ELASTICSEARCH_USERNAME=elastic +ELASTICSEARCH_PASSWORD=elastic +KIBANA_PORT=5601 + +# Using ElasticSearch Cloud Serverless, or not. +ELASTICSEARCH_USE_CLOUD=false +ELASTICSEARCH_CLOUD_URL=YOUR-ELASTICSEARCH_CLOUD_URL +ELASTICSEARCH_API_KEY=YOUR-ELASTICSEARCH_API_KEY + +ELASTICSEARCH_VERIFY_CERTS=False +ELASTICSEARCH_CA_CERTS= +ELASTICSEARCH_REQUEST_TIMEOUT=100000 +ELASTICSEARCH_RETRY_ON_TIMEOUT=True +ELASTICSEARCH_MAX_RETRIES=10 + +# baidu vector configurations, only available when VECTOR_STORE is `baidu` +BAIDU_VECTOR_DB_ENDPOINT=http://127.0.0.1:5287 +BAIDU_VECTOR_DB_CONNECTION_TIMEOUT_MS=30000 +BAIDU_VECTOR_DB_ACCOUNT=root +BAIDU_VECTOR_DB_API_KEY=dify +BAIDU_VECTOR_DB_DATABASE=dify +BAIDU_VECTOR_DB_SHARD=1 +BAIDU_VECTOR_DB_REPLICAS=3 +BAIDU_VECTOR_DB_INVERTED_INDEX_ANALYZER=DEFAULT_ANALYZER +BAIDU_VECTOR_DB_INVERTED_INDEX_PARSER_MODE=COARSE_MODE + +# VikingDB configurations, only available when VECTOR_STORE is `vikingdb` +VIKINGDB_ACCESS_KEY=your-ak +VIKINGDB_SECRET_KEY=your-sk +VIKINGDB_REGION=cn-shanghai +VIKINGDB_HOST=api-vikingdb.xxx.volces.com +VIKINGDB_SCHEMA=http +VIKINGDB_CONNECTION_TIMEOUT=30 +VIKINGDB_SOCKET_TIMEOUT=30 + +# Lindorm configuration, only available when VECTOR_STORE is `lindorm` +LINDORM_URL=http://localhost:30070 +LINDORM_USERNAME=admin +LINDORM_PASSWORD=admin +LINDORM_USING_UGC=True +LINDORM_QUERY_TIMEOUT=1 + +# opengauss configurations, only available when VECTOR_STORE is `opengauss` +OPENGAUSS_HOST=opengauss +OPENGAUSS_PORT=6600 +OPENGAUSS_USER=postgres +OPENGAUSS_PASSWORD=Dify@123 +OPENGAUSS_DATABASE=dify +OPENGAUSS_MIN_CONNECTION=1 +OPENGAUSS_MAX_CONNECTION=5 +OPENGAUSS_ENABLE_PQ=false + +# huawei cloud search service vector configurations, only available when VECTOR_STORE is `huawei_cloud` +HUAWEI_CLOUD_HOSTS=https://127.0.0.1:9200 +HUAWEI_CLOUD_USER=admin +HUAWEI_CLOUD_PASSWORD=admin + +# Upstash Vector configuration, only available when VECTOR_STORE is `upstash` +UPSTASH_VECTOR_URL=https://xxx-vector.upstash.io +UPSTASH_VECTOR_TOKEN=dify + +# TableStore Vector configuration +# (only used when VECTOR_STORE is tablestore) +TABLESTORE_ENDPOINT=https://instance-name.cn-hangzhou.ots.aliyuncs.com +TABLESTORE_INSTANCE_NAME=instance-name +TABLESTORE_ACCESS_KEY_ID=xxx +TABLESTORE_ACCESS_KEY_SECRET=xxx +TABLESTORE_NORMALIZE_FULLTEXT_BM25_SCORE=false + +# Clickzetta configuration, only available when VECTOR_STORE is `clickzetta` +CLICKZETTA_USERNAME= +CLICKZETTA_PASSWORD= +CLICKZETTA_INSTANCE= +CLICKZETTA_SERVICE=api.clickzetta.com +CLICKZETTA_WORKSPACE=quick_start +CLICKZETTA_VCLUSTER=default_ap +CLICKZETTA_SCHEMA=dify +CLICKZETTA_BATCH_SIZE=100 +CLICKZETTA_ENABLE_INVERTED_INDEX=true +CLICKZETTA_ANALYZER_TYPE=chinese +CLICKZETTA_ANALYZER_MODE=smart +CLICKZETTA_VECTOR_DISTANCE_FUNCTION=cosine_distance + +# ------------------------------ +# Knowledge Configuration +# ------------------------------ + +# Upload file size limit, default 15M. +UPLOAD_FILE_SIZE_LIMIT=100 + +# The maximum number of files that can be uploaded at a time, default 5. +UPLOAD_FILE_BATCH_LIMIT=5 + +# Comma-separated list of file extensions blocked from upload for security reasons. +# Extensions should be lowercase without dots (e.g., exe,bat,sh,dll). +# Empty by default to allow all file types. +# Recommended: exe,bat,cmd,com,scr,vbs,ps1,msi,dll +UPLOAD_FILE_EXTENSION_BLACKLIST= + +# Maximum number of files allowed in a single chunk attachment, default 10. +SINGLE_CHUNK_ATTACHMENT_LIMIT=10 + +# Maximum number of files allowed in a image batch upload operation +IMAGE_FILE_BATCH_LIMIT=10 + +# Maximum allowed image file size for attachments in megabytes, default 2. +ATTACHMENT_IMAGE_FILE_SIZE_LIMIT=2 + +# Timeout for downloading image attachments in seconds, default 60. +ATTACHMENT_IMAGE_DOWNLOAD_TIMEOUT=60 + + +# ETL type, support: `dify`, `Unstructured` +# `dify` Dify's proprietary file extraction scheme +# `Unstructured` Unstructured.io file extraction scheme +ETL_TYPE=dify + +# Unstructured API path and API key, needs to be configured when ETL_TYPE is Unstructured +# Or using Unstructured for document extractor node for pptx. +# For example: http://unstructured:8000/general/v0/general +UNSTRUCTURED_API_URL= +UNSTRUCTURED_API_KEY= +SCARF_NO_ANALYTICS=true + +# ------------------------------ +# Model Configuration +# ------------------------------ + +# The maximum number of tokens allowed for prompt generation. +# This setting controls the upper limit of tokens that can be used by the LLM +# when generating a prompt in the prompt generation tool. +# Default: 512 tokens. +PROMPT_GENERATION_MAX_TOKENS=512 + +# The maximum number of tokens allowed for code generation. +# This setting controls the upper limit of tokens that can be used by the LLM +# when generating code in the code generation tool. +# Default: 1024 tokens. +CODE_GENERATION_MAX_TOKENS=1024 + +# Enable or disable plugin based token counting. If disabled, token counting will return 0. +# This can improve performance by skipping token counting operations. +# Default: false (disabled). +PLUGIN_BASED_TOKEN_COUNTING_ENABLED=false + +# ------------------------------ +# Multi-modal Configuration +# ------------------------------ + +# The format of the image/video/audio/document sent when the multi-modal model is input, +# the default is base64, optional url. +# The delay of the call in url mode will be lower than that in base64 mode. +# It is generally recommended to use the more compatible base64 mode. +# If configured as url, you need to configure FILES_URL as an externally accessible address so that the multi-modal model can access the image/video/audio/document. +MULTIMODAL_SEND_FORMAT=base64 +# Upload image file size limit, default 10M. +UPLOAD_IMAGE_FILE_SIZE_LIMIT=10 +# Upload video file size limit, default 100M. +UPLOAD_VIDEO_FILE_SIZE_LIMIT=100 +# Upload audio file size limit, default 50M. +UPLOAD_AUDIO_FILE_SIZE_LIMIT=50 + +# ------------------------------ +# Sentry Configuration +# Used for application monitoring and error log tracking. +# ------------------------------ +SENTRY_DSN= + +# API Service Sentry DSN address, default is empty, when empty, +# all monitoring information is not reported to Sentry. +# If not set, Sentry error reporting will be disabled. +API_SENTRY_DSN= +# API Service The reporting ratio of Sentry events, if it is 0.01, it is 1%. +API_SENTRY_TRACES_SAMPLE_RATE=1.0 +# API Service The reporting ratio of Sentry profiles, if it is 0.01, it is 1%. +API_SENTRY_PROFILES_SAMPLE_RATE=1.0 + +# Web Service Sentry DSN address, default is empty, when empty, +# all monitoring information is not reported to Sentry. +# If not set, Sentry error reporting will be disabled. +WEB_SENTRY_DSN= + +# Plugin_daemon Service Sentry DSN address, default is empty, when empty, +# all monitoring information is not reported to Sentry. +# If not set, Sentry error reporting will be disabled. +PLUGIN_SENTRY_ENABLED=false +PLUGIN_SENTRY_DSN= + +# ------------------------------ +# Notion Integration Configuration +# Variables can be obtained by applying for Notion integration: https://www.notion.so/my-integrations +# ------------------------------ + +# Configure as "public" or "internal". +# Since Notion's OAuth redirect URL only supports HTTPS, +# if deploying locally, please use Notion's internal integration. +NOTION_INTEGRATION_TYPE=public +# Notion OAuth client secret (used for public integration type) +NOTION_CLIENT_SECRET= +# Notion OAuth client id (used for public integration type) +NOTION_CLIENT_ID= +# Notion internal integration secret. +# If the value of NOTION_INTEGRATION_TYPE is "internal", +# you need to configure this variable. +NOTION_INTERNAL_SECRET= + +# ------------------------------ +# Mail related configuration +# ------------------------------ + +# Mail type, support: resend, smtp, sendgrid +MAIL_TYPE=resend + +# Default send from email address, if not specified +# If using SendGrid, use the 'from' field for authentication if necessary. +MAIL_DEFAULT_SEND_FROM= + +# API-Key for the Resend email provider, used when MAIL_TYPE is `resend`. +RESEND_API_URL=https://api.resend.com +RESEND_API_KEY=your-resend-api-key + + +# SMTP server configuration, used when MAIL_TYPE is `smtp` +SMTP_SERVER= +SMTP_PORT=465 +SMTP_USERNAME= +SMTP_PASSWORD= +SMTP_USE_TLS=true +SMTP_OPPORTUNISTIC_TLS=false + +# Sendgid configuration +SENDGRID_API_KEY= + +# ------------------------------ +# Others Configuration +# ------------------------------ + +# Maximum length of segmentation tokens for indexing +INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=4000 + +# Member invitation link valid time (hours), +# Default: 72. +INVITE_EXPIRY_HOURS=72 + +# Reset password token valid time (minutes), +RESET_PASSWORD_TOKEN_EXPIRY_MINUTES=5 +EMAIL_REGISTER_TOKEN_EXPIRY_MINUTES=5 +CHANGE_EMAIL_TOKEN_EXPIRY_MINUTES=5 +OWNER_TRANSFER_TOKEN_EXPIRY_MINUTES=5 + +# The sandbox service endpoint. +CODE_EXECUTION_ENDPOINT=http://sandbox:8194 +CODE_EXECUTION_API_KEY=dify-sandbox +CODE_EXECUTION_SSL_VERIFY=True +CODE_EXECUTION_POOL_MAX_CONNECTIONS=100 +CODE_EXECUTION_POOL_MAX_KEEPALIVE_CONNECTIONS=20 +CODE_EXECUTION_POOL_KEEPALIVE_EXPIRY=5.0 +CODE_MAX_NUMBER=9223372036854775807 +CODE_MIN_NUMBER=-9223372036854775808 +CODE_MAX_DEPTH=5 +CODE_MAX_PRECISION=20 +CODE_MAX_STRING_LENGTH=400000 +CODE_MAX_STRING_ARRAY_LENGTH=30 +CODE_MAX_OBJECT_ARRAY_LENGTH=30 +CODE_MAX_NUMBER_ARRAY_LENGTH=1000 +CODE_EXECUTION_CONNECT_TIMEOUT=10 +CODE_EXECUTION_READ_TIMEOUT=60 +CODE_EXECUTION_WRITE_TIMEOUT=10 +TEMPLATE_TRANSFORM_MAX_LENGTH=400000 + +# Workflow runtime configuration +WORKFLOW_MAX_EXECUTION_STEPS=500 +WORKFLOW_MAX_EXECUTION_TIME=1200 +WORKFLOW_CALL_MAX_DEPTH=5 +MAX_VARIABLE_SIZE=204800 +WORKFLOW_FILE_UPLOAD_LIMIT=10 + +# GraphEngine Worker Pool Configuration +# Minimum number of workers per GraphEngine instance (default: 1) +GRAPH_ENGINE_MIN_WORKERS=1 +# Maximum number of workers per GraphEngine instance (default: 10) +GRAPH_ENGINE_MAX_WORKERS=10 +# Queue depth threshold that triggers worker scale up (default: 3) +GRAPH_ENGINE_SCALE_UP_THRESHOLD=3 +# Seconds of idle time before scaling down workers (default: 5.0) +GRAPH_ENGINE_SCALE_DOWN_IDLE_TIME=5.0 + +# Workflow storage configuration +# Options: rdbms, hybrid +# rdbms: Use only the relational database (default) +# hybrid: Save new data to object storage, read from both object storage and RDBMS +WORKFLOW_NODE_EXECUTION_STORAGE=rdbms + +# Repository configuration +# Core workflow execution repository implementation +# Options: +# - core.repositories.sqlalchemy_workflow_execution_repository.SQLAlchemyWorkflowExecutionRepository (default) +# - core.repositories.celery_workflow_execution_repository.CeleryWorkflowExecutionRepository +CORE_WORKFLOW_EXECUTION_REPOSITORY=core.repositories.sqlalchemy_workflow_execution_repository.SQLAlchemyWorkflowExecutionRepository + +# Core workflow node execution repository implementation +# Options: +# - core.repositories.sqlalchemy_workflow_node_execution_repository.SQLAlchemyWorkflowNodeExecutionRepository (default) +# - core.repositories.celery_workflow_node_execution_repository.CeleryWorkflowNodeExecutionRepository +CORE_WORKFLOW_NODE_EXECUTION_REPOSITORY=core.repositories.sqlalchemy_workflow_node_execution_repository.SQLAlchemyWorkflowNodeExecutionRepository + +# API workflow run repository implementation +API_WORKFLOW_RUN_REPOSITORY=repositories.sqlalchemy_api_workflow_run_repository.DifyAPISQLAlchemyWorkflowRunRepository + +# API workflow node execution repository implementation +API_WORKFLOW_NODE_EXECUTION_REPOSITORY=repositories.sqlalchemy_api_workflow_node_execution_repository.DifyAPISQLAlchemyWorkflowNodeExecutionRepository + +# Workflow log cleanup configuration +# Enable automatic cleanup of workflow run logs to manage database size +WORKFLOW_LOG_CLEANUP_ENABLED=false +# Number of days to retain workflow run logs (default: 30 days) +WORKFLOW_LOG_RETENTION_DAYS=30 +# Batch size for workflow log cleanup operations (default: 100) +WORKFLOW_LOG_CLEANUP_BATCH_SIZE=100 + +# HTTP request node in workflow configuration +HTTP_REQUEST_NODE_MAX_BINARY_SIZE=10485760 +HTTP_REQUEST_NODE_MAX_TEXT_SIZE=1048576 +HTTP_REQUEST_NODE_SSL_VERIFY=True + +# HTTP request node timeout configuration +# Maximum timeout values (in seconds) that users can set in HTTP request nodes +# - Connect timeout: Time to wait for establishing connection (default: 10s) +# - Read timeout: Time to wait for receiving response data (default: 600s, 10 minutes) +# - Write timeout: Time to wait for sending request data (default: 600s, 10 minutes) +HTTP_REQUEST_MAX_CONNECT_TIMEOUT=10 +HTTP_REQUEST_MAX_READ_TIMEOUT=600 +HTTP_REQUEST_MAX_WRITE_TIMEOUT=600 + +# Base64 encoded CA certificate data for custom certificate verification (PEM format, optional) +# HTTP_REQUEST_NODE_SSL_CERT_DATA=LS0tLS1CRUdJTi... +# Base64 encoded client certificate data for mutual TLS authentication (PEM format, optional) +# HTTP_REQUEST_NODE_SSL_CLIENT_CERT_DATA=LS0tLS1CRUdJTi... +# Base64 encoded client private key data for mutual TLS authentication (PEM format, optional) +# HTTP_REQUEST_NODE_SSL_CLIENT_KEY_DATA=LS0tLS1CRUdJTi... + +# Webhook request configuration +WEBHOOK_REQUEST_BODY_MAX_SIZE=10485760 + +# Respect X-* headers to redirect clients +RESPECT_XFORWARD_HEADERS_ENABLED=false + +# SSRF Proxy server HTTP URL +SSRF_PROXY_HTTP_URL=http://ssrf_proxy:3128 +# SSRF Proxy server HTTPS URL +SSRF_PROXY_HTTPS_URL=http://ssrf_proxy:3128 + +# Maximum loop count in the workflow +LOOP_NODE_MAX_COUNT=100 + +# The maximum number of tools that can be used in the agent. +MAX_TOOLS_NUM=10 + +# Maximum number of Parallelism branches in the workflow +MAX_PARALLEL_LIMIT=10 + +# The maximum number of iterations for agent setting +MAX_ITERATIONS_NUM=99 + +# ------------------------------ +# Environment Variables for web Service +# ------------------------------ + +# The timeout for the text generation in millisecond +TEXT_GENERATION_TIMEOUT_MS=60000 + +# Allow rendering unsafe URLs which have "data:" scheme. +ALLOW_UNSAFE_DATA_SCHEME=false + +# Maximum number of tree depth in the workflow +MAX_TREE_DEPTH=50 + +# ------------------------------ +# Environment Variables for database Service +# ------------------------------ +# Postgres data directory +PGDATA=/var/lib/postgresql/data/pgdata + +# MySQL Default Configuration +MYSQL_HOST_VOLUME=./volumes/mysql/data + +# ------------------------------ +# Environment Variables for sandbox Service +# ------------------------------ + +# The API key for the sandbox service +SANDBOX_API_KEY=dify-sandbox +# The mode in which the Gin framework runs +SANDBOX_GIN_MODE=release +# The timeout for the worker in seconds +SANDBOX_WORKER_TIMEOUT=15 +# Enable network for the sandbox service +SANDBOX_ENABLE_NETWORK=true +# HTTP proxy URL for SSRF protection +SANDBOX_HTTP_PROXY=http://ssrf_proxy:3128 +# HTTPS proxy URL for SSRF protection +SANDBOX_HTTPS_PROXY=http://ssrf_proxy:3128 +# The port on which the sandbox service runs +SANDBOX_PORT=8194 + +# ------------------------------ +# Environment Variables for weaviate Service +# (only used when VECTOR_STORE is weaviate) +# ------------------------------ +WEAVIATE_PERSISTENCE_DATA_PATH=/var/lib/weaviate +WEAVIATE_QUERY_DEFAULTS_LIMIT=25 +WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true +WEAVIATE_DEFAULT_VECTORIZER_MODULE=none +WEAVIATE_CLUSTER_HOSTNAME=node1 +WEAVIATE_AUTHENTICATION_APIKEY_ENABLED=true +WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih +WEAVIATE_AUTHENTICATION_APIKEY_USERS=hello@dify.ai +WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED=true +WEAVIATE_AUTHORIZATION_ADMINLIST_USERS=hello@dify.ai +WEAVIATE_DISABLE_TELEMETRY=false +WEAVIATE_ENABLE_TOKENIZER_GSE=false +WEAVIATE_ENABLE_TOKENIZER_KAGOME_JA=false +WEAVIATE_ENABLE_TOKENIZER_KAGOME_KR=false + +# ------------------------------ +# Environment Variables for Chroma +# (only used when VECTOR_STORE is chroma) +# ------------------------------ + +# Authentication credentials for Chroma server +CHROMA_SERVER_AUTHN_CREDENTIALS=difyai123456 +# Authentication provider for Chroma server +CHROMA_SERVER_AUTHN_PROVIDER=chromadb.auth.token_authn.TokenAuthenticationServerProvider +# Persistence setting for Chroma server +CHROMA_IS_PERSISTENT=TRUE + +# ------------------------------ +# Environment Variables for Oracle Service +# (only used when VECTOR_STORE is oracle) +# ------------------------------ +ORACLE_PWD=Dify123456 +ORACLE_CHARACTERSET=AL32UTF8 + +# ------------------------------ +# Environment Variables for milvus Service +# (only used when VECTOR_STORE is milvus) +# ------------------------------ +# ETCD configuration for auto compaction mode +ETCD_AUTO_COMPACTION_MODE=revision +# ETCD configuration for auto compaction retention in terms of number of revisions +ETCD_AUTO_COMPACTION_RETENTION=1000 +# ETCD configuration for backend quota in bytes +ETCD_QUOTA_BACKEND_BYTES=4294967296 +# ETCD configuration for the number of changes before triggering a snapshot +ETCD_SNAPSHOT_COUNT=50000 +# MinIO access key for authentication +MINIO_ACCESS_KEY=minioadmin +# MinIO secret key for authentication +MINIO_SECRET_KEY=minioadmin +# ETCD service endpoints +ETCD_ENDPOINTS=etcd:2379 +# MinIO service address +MINIO_ADDRESS=minio:9000 +# Enable or disable security authorization +MILVUS_AUTHORIZATION_ENABLED=true + +# ------------------------------ +# Environment Variables for pgvector / pgvector-rs Service +# (only used when VECTOR_STORE is pgvector / pgvector-rs) +# ------------------------------ +PGVECTOR_PGUSER=postgres +# The password for the default postgres user. +PGVECTOR_POSTGRES_PASSWORD=difyai123456 +# The name of the default postgres database. +PGVECTOR_POSTGRES_DB=dify +# postgres data directory +PGVECTOR_PGDATA=/var/lib/postgresql/data/pgdata + +# ------------------------------ +# Environment Variables for opensearch +# (only used when VECTOR_STORE is opensearch) +# ------------------------------ +OPENSEARCH_DISCOVERY_TYPE=single-node +OPENSEARCH_BOOTSTRAP_MEMORY_LOCK=true +OPENSEARCH_JAVA_OPTS_MIN=512m +OPENSEARCH_JAVA_OPTS_MAX=1024m +OPENSEARCH_INITIAL_ADMIN_PASSWORD=Qazwsxedc!@#123 +OPENSEARCH_MEMLOCK_SOFT=-1 +OPENSEARCH_MEMLOCK_HARD=-1 +OPENSEARCH_NOFILE_SOFT=65536 +OPENSEARCH_NOFILE_HARD=65536 + +# ------------------------------ +# Environment Variables for Nginx reverse proxy +# ------------------------------ +NGINX_SERVER_NAME=_ +NGINX_HTTPS_ENABLED=false +# HTTP port +NGINX_PORT=80 +# SSL settings are only applied when HTTPS_ENABLED is true +NGINX_SSL_PORT=443 +# if HTTPS_ENABLED is true, you're required to add your own SSL certificates/keys to the `./nginx/ssl` directory +# and modify the env vars below accordingly. +NGINX_SSL_CERT_FILENAME=dify.crt +NGINX_SSL_CERT_KEY_FILENAME=dify.key +NGINX_SSL_PROTOCOLS=TLSv1.1 TLSv1.2 TLSv1.3 + +# Nginx performance tuning +NGINX_WORKER_PROCESSES=auto +NGINX_CLIENT_MAX_BODY_SIZE=100M +NGINX_KEEPALIVE_TIMEOUT=65 + +# Proxy settings +NGINX_PROXY_READ_TIMEOUT=3600s +NGINX_PROXY_SEND_TIMEOUT=3600s + +# Set true to accept requests for /.well-known/acme-challenge/ +NGINX_ENABLE_CERTBOT_CHALLENGE=false + +# ------------------------------ +# Certbot Configuration +# ------------------------------ + +# Email address (required to get certificates from Let's Encrypt) +CERTBOT_EMAIL=your_email@example.com + +# Domain name +CERTBOT_DOMAIN=your_domain.com + +# certbot command options +# i.e: --force-renewal --dry-run --test-cert --debug +CERTBOT_OPTIONS= + +# ------------------------------ +# Environment Variables for SSRF Proxy +# ------------------------------ +SSRF_HTTP_PORT=3128 +SSRF_COREDUMP_DIR=/var/spool/squid +SSRF_REVERSE_PROXY_PORT=8194 +SSRF_SANDBOX_HOST=sandbox +SSRF_DEFAULT_TIME_OUT=5 +SSRF_DEFAULT_CONNECT_TIME_OUT=5 +SSRF_DEFAULT_READ_TIME_OUT=5 +SSRF_DEFAULT_WRITE_TIME_OUT=5 +SSRF_POOL_MAX_CONNECTIONS=100 +SSRF_POOL_MAX_KEEPALIVE_CONNECTIONS=20 +SSRF_POOL_KEEPALIVE_EXPIRY=5.0 + +# ------------------------------ +# docker env var for specifying vector db and metadata db type at startup +# (based on the vector db and metadata db type, the corresponding docker +# compose profile will be used) +# if you want to use unstructured, add ',unstructured' to the end +# ------------------------------ +COMPOSE_PROFILES=${VECTOR_STORE:-weaviate},${DB_TYPE:-postgresql} + +# ------------------------------ +# Docker Compose Service Expose Host Port Configurations +# ------------------------------ +EXPOSE_NGINX_PORT=80 +EXPOSE_NGINX_SSL_PORT=443 + +# ---------------------------------------------------------------------------- +# ModelProvider & Tool Position Configuration +# Used to specify the model providers and tools that can be used in the app. +# ---------------------------------------------------------------------------- + +# Pin, include, and exclude tools +# Use comma-separated values with no spaces between items. +# Example: POSITION_TOOL_PINS=bing,google +POSITION_TOOL_PINS= +POSITION_TOOL_INCLUDES= +POSITION_TOOL_EXCLUDES= + +# Pin, include, and exclude model providers +# Use comma-separated values with no spaces between items. +# Example: POSITION_PROVIDER_PINS=openai,openllm +POSITION_PROVIDER_PINS= +POSITION_PROVIDER_INCLUDES= +POSITION_PROVIDER_EXCLUDES= + +# CSP https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP +CSP_WHITELIST= + +# Enable or disable create tidb service job +CREATE_TIDB_SERVICE_JOB_ENABLED=false + +# Maximum number of submitted thread count in a ThreadPool for parallel node execution +MAX_SUBMIT_COUNT=100 + +# The maximum number of top-k value for RAG. +TOP_K_MAX_VALUE=10 + +# ------------------------------ +# Plugin Daemon Configuration +# ------------------------------ + +DB_PLUGIN_DATABASE=dify_plugin +EXPOSE_PLUGIN_DAEMON_PORT=5002 +PLUGIN_DAEMON_PORT=5002 +PLUGIN_DAEMON_KEY=lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi +PLUGIN_DAEMON_URL=http://plugin_daemon:5002 +PLUGIN_MAX_PACKAGE_SIZE=52428800 +PLUGIN_PPROF_ENABLED=false + +PLUGIN_DEBUGGING_HOST=0.0.0.0 +PLUGIN_DEBUGGING_PORT=5003 +EXPOSE_PLUGIN_DEBUGGING_HOST=localhost +EXPOSE_PLUGIN_DEBUGGING_PORT=5003 + +# If this key is changed, DIFY_INNER_API_KEY in plugin_daemon service must also be updated or agent node will fail. +PLUGIN_DIFY_INNER_API_KEY=QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1 +PLUGIN_DIFY_INNER_API_URL=http://api:5001 + +ENDPOINT_URL_TEMPLATE=http://localhost/e/{hook_id} + +MARKETPLACE_ENABLED=true +MARKETPLACE_API_URL=https://marketplace.dify.ai + +FORCE_VERIFYING_SIGNATURE=true +ENFORCE_LANGGENIUS_PLUGIN_SIGNATURES=true + +PLUGIN_STDIO_BUFFER_SIZE=1024 +PLUGIN_STDIO_MAX_BUFFER_SIZE=5242880 + +PLUGIN_PYTHON_ENV_INIT_TIMEOUT=120 +PLUGIN_MAX_EXECUTION_TIMEOUT=600 +# PIP_MIRROR_URL=https://pypi.tuna.tsinghua.edu.cn/simple +PIP_MIRROR_URL= + +# https://github.com/langgenius/dify-plugin-daemon/blob/main/.env.example +# Plugin storage type, local aws_s3 tencent_cos azure_blob aliyun_oss volcengine_tos +PLUGIN_STORAGE_TYPE=local +PLUGIN_STORAGE_LOCAL_ROOT=/app/storage +PLUGIN_WORKING_PATH=/app/storage/cwd +PLUGIN_INSTALLED_PATH=plugin +PLUGIN_PACKAGE_CACHE_PATH=plugin_packages +PLUGIN_MEDIA_CACHE_PATH=assets +# Plugin oss bucket +PLUGIN_STORAGE_OSS_BUCKET= +# Plugin oss s3 credentials +PLUGIN_S3_USE_AWS=false +PLUGIN_S3_USE_AWS_MANAGED_IAM=false +PLUGIN_S3_ENDPOINT= +PLUGIN_S3_USE_PATH_STYLE=false +PLUGIN_AWS_ACCESS_KEY= +PLUGIN_AWS_SECRET_KEY= +PLUGIN_AWS_REGION= +# Plugin oss azure blob +PLUGIN_AZURE_BLOB_STORAGE_CONTAINER_NAME= +PLUGIN_AZURE_BLOB_STORAGE_CONNECTION_STRING= +# Plugin oss tencent cos +PLUGIN_TENCENT_COS_SECRET_KEY= +PLUGIN_TENCENT_COS_SECRET_ID= +PLUGIN_TENCENT_COS_REGION= +# Plugin oss aliyun oss +PLUGIN_ALIYUN_OSS_REGION= +PLUGIN_ALIYUN_OSS_ENDPOINT= +PLUGIN_ALIYUN_OSS_ACCESS_KEY_ID= +PLUGIN_ALIYUN_OSS_ACCESS_KEY_SECRET= +PLUGIN_ALIYUN_OSS_AUTH_VERSION=v4 +PLUGIN_ALIYUN_OSS_PATH= +# Plugin oss volcengine tos +PLUGIN_VOLCENGINE_TOS_ENDPOINT= +PLUGIN_VOLCENGINE_TOS_ACCESS_KEY= +PLUGIN_VOLCENGINE_TOS_SECRET_KEY= +PLUGIN_VOLCENGINE_TOS_REGION= + +# ------------------------------ +# OTLP Collector Configuration +# ------------------------------ +ENABLE_OTEL=false +OTLP_TRACE_ENDPOINT= +OTLP_METRIC_ENDPOINT= +OTLP_BASE_ENDPOINT=http://localhost:4318 +OTLP_API_KEY= +OTEL_EXPORTER_OTLP_PROTOCOL= +OTEL_EXPORTER_TYPE=otlp +OTEL_SAMPLING_RATE=0.1 +OTEL_BATCH_EXPORT_SCHEDULE_DELAY=5000 +OTEL_MAX_QUEUE_SIZE=2048 +OTEL_MAX_EXPORT_BATCH_SIZE=512 +OTEL_METRIC_EXPORT_INTERVAL=60000 +OTEL_BATCH_EXPORT_TIMEOUT=10000 +OTEL_METRIC_EXPORT_TIMEOUT=30000 + +# Prevent Clickjacking +ALLOW_EMBED=false + +# Dataset queue monitor configuration +QUEUE_MONITOR_THRESHOLD=200 +# You can configure multiple ones, separated by commas. eg: test1@dify.ai,test2@dify.ai +QUEUE_MONITOR_ALERT_EMAILS= +# Monitor interval in minutes, default is 30 minutes +QUEUE_MONITOR_INTERVAL=30 + +# Swagger UI configuration +SWAGGER_UI_ENABLED=true +SWAGGER_UI_PATH=/swagger-ui.html + +# Whether to encrypt dataset IDs when exporting DSL files (default: true) +# Set to false to export dataset IDs as plain text for easier cross-environment import +DSL_EXPORT_ENCRYPT_DATASET_ID=true + +# Maximum number of segments for dataset segments API (0 for unlimited) +DATASET_MAX_SEGMENTS_PER_REQUEST=0 + +# Celery schedule tasks configuration +ENABLE_CLEAN_EMBEDDING_CACHE_TASK=false +ENABLE_CLEAN_UNUSED_DATASETS_TASK=false +ENABLE_CREATE_TIDB_SERVERLESS_TASK=false +ENABLE_UPDATE_TIDB_SERVERLESS_STATUS_TASK=false +ENABLE_CLEAN_MESSAGES=false +ENABLE_MAIL_CLEAN_DOCUMENT_NOTIFY_TASK=false +ENABLE_DATASETS_QUEUE_MONITOR=false +ENABLE_CHECK_UPGRADABLE_PLUGIN_TASK=true +ENABLE_WORKFLOW_SCHEDULE_POLLER_TASK=true +WORKFLOW_SCHEDULE_POLLER_INTERVAL=1 +WORKFLOW_SCHEDULE_POLLER_BATCH_SIZE=100 +WORKFLOW_SCHEDULE_MAX_DISPATCH_PER_TICK=0 + +# Tenant isolated task queue configuration +TENANT_ISOLATED_TASK_CONCURRENCY=1 + +# The API key of amplitude +AMPLITUDE_API_KEY= diff --git a/docker/dify/README.md b/docker/dify/README.md new file mode 100644 index 00000000..375570f1 --- /dev/null +++ b/docker/dify/README.md @@ -0,0 +1,119 @@ +## README for docker Deployment + +Welcome to the new `docker` directory for deploying Dify using Docker Compose. This README outlines the updates, deployment instructions, and migration details for existing users. + +### What's Updated + +- **Certbot Container**: `docker-compose.yaml` now contains `certbot` for managing SSL certificates. This container automatically renews certificates and ensures secure HTTPS connections.\ + For more information, refer `docker/certbot/README.md`. + +- **Persistent Environment Variables**: Environment variables are now managed through a `.env` file, ensuring that your configurations persist across deployments. + + > What is `.env`?

+ > The `.env` file is a crucial component in Docker and Docker Compose environments, serving as a centralized configuration file where you can define environment variables that are accessible to the containers at runtime. This file simplifies the management of environment settings across different stages of development, testing, and production, providing consistency and ease of configuration to deployments. + +- **Unified Vector Database Services**: All vector database services are now managed from a single Docker Compose file `docker-compose.yaml`. You can switch between different vector databases by setting the `VECTOR_STORE` environment variable in your `.env` file. + +- **Mandatory .env File**: A `.env` file is now required to run `docker compose up`. This file is crucial for configuring your deployment and for any custom settings to persist through upgrades. + +### How to Deploy Dify with `docker-compose.yaml` + +1. **Prerequisites**: Ensure Docker and Docker Compose are installed on your system. +1. **Environment Setup**: + - Navigate to the `docker` directory. + - Copy the `.env.example` file to a new file named `.env` by running `cp .env.example .env`. + - Customize the `.env` file as needed. Refer to the `.env.example` file for detailed configuration options. +1. **Running the Services**: + - Execute `docker compose up` from the `docker` directory to start the services. + - To specify a vector database, set the `VECTOR_STORE` variable in your `.env` file to your desired vector database service, such as `milvus`, `weaviate`, or `opensearch`. +1. **SSL Certificate Setup**: + - Refer `docker/certbot/README.md` to set up SSL certificates using Certbot. +1. **OpenTelemetry Collector Setup**: + - Change `ENABLE_OTEL` to `true` in `.env`. + - Configure `OTLP_BASE_ENDPOINT` properly. + +### How to Deploy Middleware for Developing Dify + +1. **Middleware Setup**: + - Use the `docker-compose.middleware.yaml` for setting up essential middleware services like databases and caches. + - Navigate to the `docker` directory. + - Ensure the `middleware.env` file is created by running `cp middleware.env.example middleware.env` (refer to the `middleware.env.example` file). +1. **Running Middleware Services**: + - Navigate to the `docker` directory. + - Execute `docker compose --env-file middleware.env -f docker-compose.middleware.yaml -p dify up -d` to start PostgreSQL/MySQL (per `DB_TYPE`) plus the bundled Weaviate instance. + +> Compose automatically loads `COMPOSE_PROFILES=${DB_TYPE:-postgresql},weaviate` from `middleware.env`, so no extra `--profile` flags are needed. Adjust variables in `middleware.env` if you want a different combination of services. + +### Migration for Existing Users + +For users migrating from the `docker-legacy` setup: + +1. **Review Changes**: Familiarize yourself with the new `.env` configuration and Docker Compose setup. +1. **Transfer Customizations**: + - If you have customized configurations such as `docker-compose.yaml`, `ssrf_proxy/squid.conf`, or `nginx/conf.d/default.conf`, you will need to reflect these changes in the `.env` file you create. +1. **Data Migration**: + - Ensure that data from services like databases and caches is backed up and migrated appropriately to the new structure if necessary. + +### Overview of `.env` + +#### Key Modules and Customization + +- **Vector Database Services**: Depending on the type of vector database used (`VECTOR_STORE`), users can set specific endpoints, ports, and authentication details. +- **Storage Services**: Depending on the storage type (`STORAGE_TYPE`), users can configure specific settings for S3, Azure Blob, Google Storage, etc. +- **API and Web Services**: Users can define URLs and other settings that affect how the API and web frontend operate. + +#### Other notable variables + +The `.env.example` file provided in the Docker setup is extensive and covers a wide range of configuration options. It is structured into several sections, each pertaining to different aspects of the application and its services. Here are some of the key sections and variables: + +1. **Common Variables**: + + - `CONSOLE_API_URL`, `SERVICE_API_URL`: URLs for different API services. + - `APP_WEB_URL`: Frontend application URL. + - `FILES_URL`: Base URL for file downloads and previews. + +1. **Server Configuration**: + + - `LOG_LEVEL`, `DEBUG`, `FLASK_DEBUG`: Logging and debug settings. + - `SECRET_KEY`: A key for encrypting session cookies and other sensitive data. + +1. **Database Configuration**: + + - `DB_USERNAME`, `DB_PASSWORD`, `DB_HOST`, `DB_PORT`, `DB_DATABASE`: PostgreSQL database credentials and connection details. + +1. **Redis Configuration**: + + - `REDIS_HOST`, `REDIS_PORT`, `REDIS_PASSWORD`: Redis server connection settings. + +1. **Celery Configuration**: + + - `CELERY_BROKER_URL`: Configuration for Celery message broker. + +1. **Storage Configuration**: + + - `STORAGE_TYPE`, `S3_BUCKET_NAME`, `AZURE_BLOB_ACCOUNT_NAME`: Settings for file storage options like local, S3, Azure Blob, etc. + +1. **Vector Database Configuration**: + + - `VECTOR_STORE`: Type of vector database (e.g., `weaviate`, `milvus`). + - Specific settings for each vector store like `WEAVIATE_ENDPOINT`, `MILVUS_URI`. + +1. **CORS Configuration**: + + - `WEB_API_CORS_ALLOW_ORIGINS`, `CONSOLE_CORS_ALLOW_ORIGINS`: Settings for cross-origin resource sharing. + +1. **OpenTelemetry Configuration**: + + - `ENABLE_OTEL`: Enable OpenTelemetry collector in api. + - `OTLP_BASE_ENDPOINT`: Endpoint for your OTLP exporter. + +1. **Other Service-Specific Environment Variables**: + + - Each service like `nginx`, `redis`, `db`, and vector databases have specific environment variables that are directly referenced in the `docker-compose.yaml`. + +### Additional Information + +- **Continuous Improvement Phase**: We are actively seeking feedback from the community to refine and enhance the deployment process. As more users adopt this new method, we will continue to make improvements based on your experiences and suggestions. +- **Support**: For detailed configuration options and environment variable settings, refer to the `.env.example` file and the Docker Compose configuration files in the `docker` directory. + +This README aims to guide you through the deployment process using the new Docker Compose setup. For any issues or further assistance, please refer to the official documentation or contact support. diff --git a/docker/dify/certbot/README.md b/docker/dify/certbot/README.md new file mode 100644 index 00000000..62b1eee3 --- /dev/null +++ b/docker/dify/certbot/README.md @@ -0,0 +1,76 @@ +# Launching new servers with SSL certificates + +## Short description + +docker compose certbot configurations with Backward compatibility (without certbot container).\ +Use `docker compose --profile certbot up` to use this features. + +## The simplest way for launching new servers with SSL certificates + +1. Get letsencrypt certs\ + set `.env` values + ```properties + NGINX_SSL_CERT_FILENAME=fullchain.pem + NGINX_SSL_CERT_KEY_FILENAME=privkey.pem + NGINX_ENABLE_CERTBOT_CHALLENGE=true + CERTBOT_DOMAIN=your_domain.com + CERTBOT_EMAIL=example@your_domain.com + ``` + execute command: + ```shell + docker network prune + docker compose --profile certbot up --force-recreate -d + ``` + then after the containers launched: + ```shell + docker compose exec -it certbot /bin/sh /update-cert.sh + ``` +1. Edit `.env` file and `docker compose --profile certbot up` again.\ + set `.env` value additionally + ```properties + NGINX_HTTPS_ENABLED=true + ``` + execute command: + ```shell + docker compose --profile certbot up -d --no-deps --force-recreate nginx + ``` + Then you can access your serve with HTTPS.\ + [https://your_domain.com](https://your_domain.com) + +## SSL certificates renewal + +For SSL certificates renewal, execute commands below: + +```shell +docker compose exec -it certbot /bin/sh /update-cert.sh +docker compose exec nginx nginx -s reload +``` + +## Options for certbot + +`CERTBOT_OPTIONS` key might be helpful for testing. i.e., + +```properties +CERTBOT_OPTIONS=--dry-run +``` + +To apply changes to `CERTBOT_OPTIONS`, regenerate the certbot container before updating the certificates. + +```shell +docker compose --profile certbot up -d --no-deps --force-recreate certbot +docker compose exec -it certbot /bin/sh /update-cert.sh +``` + +Then, reload the nginx container if necessary. + +```shell +docker compose exec nginx nginx -s reload +``` + +## For legacy servers + +To use cert files dir `nginx/ssl` as before, simply launch containers WITHOUT `--profile certbot` option. + +```shell +docker compose up -d +``` diff --git a/docker/dify/certbot/docker-entrypoint.sh b/docker/dify/certbot/docker-entrypoint.sh new file mode 100644 index 00000000..a70ecd82 --- /dev/null +++ b/docker/dify/certbot/docker-entrypoint.sh @@ -0,0 +1,30 @@ +#!/bin/sh +set -e + +printf '%s\n' "Docker entrypoint script is running" + +printf '%s\n' "\nChecking specific environment variables:" +printf '%s\n' "CERTBOT_EMAIL: ${CERTBOT_EMAIL:-Not set}" +printf '%s\n' "CERTBOT_DOMAIN: ${CERTBOT_DOMAIN:-Not set}" +printf '%s\n' "CERTBOT_OPTIONS: ${CERTBOT_OPTIONS:-Not set}" + +printf '%s\n' "\nChecking mounted directories:" +for dir in "/etc/letsencrypt" "/var/www/html" "/var/log/letsencrypt"; do + if [ -d "$dir" ]; then + printf '%s\n' "$dir exists. Contents:" + ls -la "$dir" + else + printf '%s\n' "$dir does not exist." + fi +done + +printf '%s\n' "\nGenerating update-cert.sh from template" +sed -e "s|\${CERTBOT_EMAIL}|$CERTBOT_EMAIL|g" \ + -e "s|\${CERTBOT_DOMAIN}|$CERTBOT_DOMAIN|g" \ + -e "s|\${CERTBOT_OPTIONS}|$CERTBOT_OPTIONS|g" \ + /update-cert.template.txt > /update-cert.sh + +chmod +x /update-cert.sh + +printf '%s\n' "\nExecuting command:" "$@" +exec "$@" diff --git a/docker/dify/certbot/update-cert.template.txt b/docker/dify/certbot/update-cert.template.txt new file mode 100644 index 00000000..16786a19 --- /dev/null +++ b/docker/dify/certbot/update-cert.template.txt @@ -0,0 +1,19 @@ +#!/bin/bash +set -e + +DOMAIN="${CERTBOT_DOMAIN}" +EMAIL="${CERTBOT_EMAIL}" +OPTIONS="${CERTBOT_OPTIONS}" +CERT_NAME="${DOMAIN}" # 証明書名をドメイン名と同じにする + +# Check if the certificate already exists +if [ -f "/etc/letsencrypt/renewal/${CERT_NAME}.conf" ]; then + echo "Certificate exists. Attempting to renew..." + certbot renew --noninteractive --cert-name ${CERT_NAME} --webroot --webroot-path=/var/www/html --email ${EMAIL} --agree-tos --no-eff-email ${OPTIONS} +else + echo "Certificate does not exist. Obtaining a new certificate..." + certbot certonly --noninteractive --webroot --webroot-path=/var/www/html --email ${EMAIL} --agree-tos --no-eff-email -d ${DOMAIN} ${OPTIONS} +fi +echo "Certificate operation successful" +# Note: Nginx reload should be handled outside this container +echo "Please ensure to reload Nginx to apply any certificate changes." diff --git a/docker/dify/couchbase-server/Dockerfile b/docker/dify/couchbase-server/Dockerfile new file mode 100644 index 00000000..23e487e4 --- /dev/null +++ b/docker/dify/couchbase-server/Dockerfile @@ -0,0 +1,4 @@ +FROM couchbase/server:latest AS stage_base +# FROM couchbase:latest AS stage_base +COPY init-cbserver.sh /opt/couchbase/init/ +RUN chmod +x /opt/couchbase/init/init-cbserver.sh diff --git a/docker/dify/couchbase-server/init-cbserver.sh b/docker/dify/couchbase-server/init-cbserver.sh new file mode 100644 index 00000000..e19a650f --- /dev/null +++ b/docker/dify/couchbase-server/init-cbserver.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# used to start couchbase server - can't get around this as docker compose only allows you to start one command - so we have to start couchbase like the standard couchbase Dockerfile would +# https://github.com/couchbase/docker/blob/master/enterprise/couchbase-server/7.2.0/Dockerfile#L88 + +/entrypoint.sh couchbase-server & + +# track if setup is complete so we don't try to setup again +FILE=/opt/couchbase/init/setupComplete.txt + +if ! [ -f "$FILE" ]; then + # used to automatically create the cluster based on environment variables + # https://docs.couchbase.com/server/current/cli/cbcli/couchbase-cli-cluster-init.html + + echo $COUCHBASE_ADMINISTRATOR_USERNAME ":" $COUCHBASE_ADMINISTRATOR_PASSWORD + + sleep 20s + /opt/couchbase/bin/couchbase-cli cluster-init -c 127.0.0.1 \ + --cluster-username $COUCHBASE_ADMINISTRATOR_USERNAME \ + --cluster-password $COUCHBASE_ADMINISTRATOR_PASSWORD \ + --services data,index,query,fts \ + --cluster-ramsize $COUCHBASE_RAM_SIZE \ + --cluster-index-ramsize $COUCHBASE_INDEX_RAM_SIZE \ + --cluster-eventing-ramsize $COUCHBASE_EVENTING_RAM_SIZE \ + --cluster-fts-ramsize $COUCHBASE_FTS_RAM_SIZE \ + --index-storage-setting default + + sleep 2s + + # used to auto create the bucket based on environment variables + # https://docs.couchbase.com/server/current/cli/cbcli/couchbase-cli-bucket-create.html + + /opt/couchbase/bin/couchbase-cli bucket-create -c localhost:8091 \ + --username $COUCHBASE_ADMINISTRATOR_USERNAME \ + --password $COUCHBASE_ADMINISTRATOR_PASSWORD \ + --bucket $COUCHBASE_BUCKET \ + --bucket-ramsize $COUCHBASE_BUCKET_RAMSIZE \ + --bucket-type couchbase + + # create file so we know that the cluster is setup and don't run the setup again + touch $FILE +fi + # docker compose will stop the container from running unless we do this + # known issue and workaround + tail -f /dev/null diff --git a/docker/dify/docker-compose-template.yaml b/docker/dify/docker-compose-template.yaml new file mode 100644 index 00000000..b12d06ca --- /dev/null +++ b/docker/dify/docker-compose-template.yaml @@ -0,0 +1,907 @@ +x-shared-env: &shared-api-worker-env +services: + # Init container to fix permissions + init_permissions: + image: busybox:latest + command: + - sh + - -c + - | + FLAG_FILE="/app/api/storage/.init_permissions" + if [ -f "$${FLAG_FILE}" ]; then + echo "Permissions already initialized. Exiting." + exit 0 + fi + echo "Initializing permissions for /app/api/storage" + chown -R 1001:1001 /app/api/storage && touch "$${FLAG_FILE}" + echo "Permissions initialized. Exiting." + volumes: + - ./volumes/app/storage:/app/api/storage + restart: "no" + + # API service + api: + image: langgenius/dify-api:1.11.1 + restart: always + environment: + # Use the shared environment variables. + <<: *shared-api-worker-env + # Startup mode, 'api' starts the API server. + MODE: api + SENTRY_DSN: ${API_SENTRY_DSN:-} + SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0} + SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0} + PLUGIN_REMOTE_INSTALL_HOST: ${EXPOSE_PLUGIN_DEBUGGING_HOST:-localhost} + PLUGIN_REMOTE_INSTALL_PORT: ${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003} + PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} + INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1} + depends_on: + init_permissions: + condition: service_completed_successfully + db_postgres: + condition: service_healthy + required: false + db_mysql: + condition: service_healthy + required: false + oceanbase: + condition: service_healthy + required: false + seekdb: + condition: service_healthy + required: false + redis: + condition: service_started + volumes: + # Mount the storage directory to the container, for storing user files. + - ./volumes/app/storage:/app/api/storage + networks: + - ssrf_proxy_network + - default + + # worker service + # The Celery worker for processing all queues (dataset, workflow, mail, etc.) + worker: + image: langgenius/dify-api:1.11.1 + restart: always + environment: + # Use the shared environment variables. + <<: *shared-api-worker-env + # Startup mode, 'worker' starts the Celery worker for processing all queues. + MODE: worker + SENTRY_DSN: ${API_SENTRY_DSN:-} + SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0} + SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0} + PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} + INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1} + depends_on: + init_permissions: + condition: service_completed_successfully + db_postgres: + condition: service_healthy + required: false + db_mysql: + condition: service_healthy + required: false + oceanbase: + condition: service_healthy + required: false + seekdb: + condition: service_healthy + required: false + redis: + condition: service_started + volumes: + # Mount the storage directory to the container, for storing user files. + - ./volumes/app/storage:/app/api/storage + networks: + - ssrf_proxy_network + - default + + # worker_beat service + # Celery beat for scheduling periodic tasks. + worker_beat: + image: langgenius/dify-api:1.11.1 + restart: always + environment: + # Use the shared environment variables. + <<: *shared-api-worker-env + # Startup mode, 'worker_beat' starts the Celery beat for scheduling periodic tasks. + MODE: beat + depends_on: + init_permissions: + condition: service_completed_successfully + db_postgres: + condition: service_healthy + required: false + db_mysql: + condition: service_healthy + required: false + oceanbase: + condition: service_healthy + required: false + seekdb: + condition: service_healthy + required: false + redis: + condition: service_started + networks: + - ssrf_proxy_network + - default + + # Frontend web application. + web: + image: langgenius/dify-web:1.11.1 + restart: always + environment: + CONSOLE_API_URL: ${CONSOLE_API_URL:-} + APP_API_URL: ${APP_API_URL:-} + AMPLITUDE_API_KEY: ${AMPLITUDE_API_KEY:-} + NEXT_PUBLIC_COOKIE_DOMAIN: ${NEXT_PUBLIC_COOKIE_DOMAIN:-} + SENTRY_DSN: ${WEB_SENTRY_DSN:-} + NEXT_TELEMETRY_DISABLED: ${NEXT_TELEMETRY_DISABLED:-0} + TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000} + CSP_WHITELIST: ${CSP_WHITELIST:-} + ALLOW_EMBED: ${ALLOW_EMBED:-false} + ALLOW_UNSAFE_DATA_SCHEME: ${ALLOW_UNSAFE_DATA_SCHEME:-false} + MARKETPLACE_API_URL: ${MARKETPLACE_API_URL:-https://marketplace.dify.ai} + MARKETPLACE_URL: ${MARKETPLACE_URL:-https://marketplace.dify.ai} + TOP_K_MAX_VALUE: ${TOP_K_MAX_VALUE:-} + INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH: ${INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH:-} + PM2_INSTANCES: ${PM2_INSTANCES:-2} + LOOP_NODE_MAX_COUNT: ${LOOP_NODE_MAX_COUNT:-100} + MAX_TOOLS_NUM: ${MAX_TOOLS_NUM:-10} + MAX_PARALLEL_LIMIT: ${MAX_PARALLEL_LIMIT:-10} + MAX_ITERATIONS_NUM: ${MAX_ITERATIONS_NUM:-99} + MAX_TREE_DEPTH: ${MAX_TREE_DEPTH:-50} + ENABLE_WEBSITE_JINAREADER: ${ENABLE_WEBSITE_JINAREADER:-true} + ENABLE_WEBSITE_FIRECRAWL: ${ENABLE_WEBSITE_FIRECRAWL:-true} + ENABLE_WEBSITE_WATERCRAWL: ${ENABLE_WEBSITE_WATERCRAWL:-true} + + # The PostgreSQL database. + db_postgres: + image: postgres:15-alpine + profiles: + - postgresql + restart: always + environment: + POSTGRES_USER: ${DB_USERNAME:-postgres} + POSTGRES_PASSWORD: ${DB_PASSWORD:-difyai123456} + POSTGRES_DB: ${DB_DATABASE:-dify} + PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata} + command: > + postgres -c 'max_connections=${POSTGRES_MAX_CONNECTIONS:-100}' + -c 'shared_buffers=${POSTGRES_SHARED_BUFFERS:-128MB}' + -c 'work_mem=${POSTGRES_WORK_MEM:-4MB}' + -c 'maintenance_work_mem=${POSTGRES_MAINTENANCE_WORK_MEM:-64MB}' + -c 'effective_cache_size=${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB}' + -c 'statement_timeout=${POSTGRES_STATEMENT_TIMEOUT:-0}' + -c 'idle_in_transaction_session_timeout=${POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT:-0}' + volumes: + - ./volumes/db/data:/var/lib/postgresql/data + healthcheck: + test: + [ + "CMD", + "pg_isready", + "-h", + "db_postgres", + "-U", + "${DB_USERNAME:-postgres}", + "-d", + "${DB_DATABASE:-dify}", + ] + interval: 1s + timeout: 3s + retries: 60 + + # The mysql database. + db_mysql: + image: mysql:8.0 + profiles: + - mysql + restart: always + environment: + MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-difyai123456} + MYSQL_DATABASE: ${DB_DATABASE:-dify} + command: > + --max_connections=1000 + --innodb_buffer_pool_size=${MYSQL_INNODB_BUFFER_POOL_SIZE:-512M} + --innodb_log_file_size=${MYSQL_INNODB_LOG_FILE_SIZE:-128M} + --innodb_flush_log_at_trx_commit=${MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT:-2} + volumes: + - ${MYSQL_HOST_VOLUME:-./volumes/mysql/data}:/var/lib/mysql + healthcheck: + test: + [ + "CMD", + "mysqladmin", + "ping", + "-u", + "root", + "-p${DB_PASSWORD:-difyai123456}", + ] + interval: 1s + timeout: 3s + retries: 30 + + # The redis cache. + redis: + image: redis:6-alpine + restart: always + environment: + REDISCLI_AUTH: ${REDIS_PASSWORD:-difyai123456} + volumes: + # Mount the redis data directory to the container. + - ./volumes/redis/data:/data + # Set the redis password when startup redis server. + command: redis-server --requirepass ${REDIS_PASSWORD:-difyai123456} + healthcheck: + test: + [ + "CMD-SHELL", + "redis-cli -a ${REDIS_PASSWORD:-difyai123456} ping | grep -q PONG", + ] + + # The DifySandbox + sandbox: + image: langgenius/dify-sandbox:0.2.12 + restart: always + environment: + # The DifySandbox configurations + # Make sure you are changing this key for your deployment with a strong key. + # You can generate a strong key using `openssl rand -base64 42`. + API_KEY: ${SANDBOX_API_KEY:-dify-sandbox} + GIN_MODE: ${SANDBOX_GIN_MODE:-release} + WORKER_TIMEOUT: ${SANDBOX_WORKER_TIMEOUT:-15} + ENABLE_NETWORK: ${SANDBOX_ENABLE_NETWORK:-true} + HTTP_PROXY: ${SANDBOX_HTTP_PROXY:-http://ssrf_proxy:3128} + HTTPS_PROXY: ${SANDBOX_HTTPS_PROXY:-http://ssrf_proxy:3128} + SANDBOX_PORT: ${SANDBOX_PORT:-8194} + PIP_MIRROR_URL: ${PIP_MIRROR_URL:-} + volumes: + - ./volumes/sandbox/dependencies:/dependencies + - ./volumes/sandbox/conf:/conf + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8194/health"] + networks: + - ssrf_proxy_network + + # plugin daemon + plugin_daemon: + image: langgenius/dify-plugin-daemon:0.5.1-local + restart: always + environment: + # Use the shared environment variables. + <<: *shared-api-worker-env + DB_DATABASE: ${DB_PLUGIN_DATABASE:-dify_plugin} + SERVER_PORT: ${PLUGIN_DAEMON_PORT:-5002} + SERVER_KEY: ${PLUGIN_DAEMON_KEY:-lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi} + MAX_PLUGIN_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} + PPROF_ENABLED: ${PLUGIN_PPROF_ENABLED:-false} + DIFY_INNER_API_URL: ${PLUGIN_DIFY_INNER_API_URL:-http://api:5001} + DIFY_INNER_API_KEY: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1} + PLUGIN_REMOTE_INSTALLING_HOST: ${PLUGIN_DEBUGGING_HOST:-0.0.0.0} + PLUGIN_REMOTE_INSTALLING_PORT: ${PLUGIN_DEBUGGING_PORT:-5003} + PLUGIN_WORKING_PATH: ${PLUGIN_WORKING_PATH:-/app/storage/cwd} + FORCE_VERIFYING_SIGNATURE: ${FORCE_VERIFYING_SIGNATURE:-true} + PYTHON_ENV_INIT_TIMEOUT: ${PLUGIN_PYTHON_ENV_INIT_TIMEOUT:-120} + PLUGIN_MAX_EXECUTION_TIMEOUT: ${PLUGIN_MAX_EXECUTION_TIMEOUT:-600} + PLUGIN_STDIO_BUFFER_SIZE: ${PLUGIN_STDIO_BUFFER_SIZE:-1024} + PLUGIN_STDIO_MAX_BUFFER_SIZE: ${PLUGIN_STDIO_MAX_BUFFER_SIZE:-5242880} + PIP_MIRROR_URL: ${PIP_MIRROR_URL:-} + PLUGIN_STORAGE_TYPE: ${PLUGIN_STORAGE_TYPE:-local} + PLUGIN_STORAGE_LOCAL_ROOT: ${PLUGIN_STORAGE_LOCAL_ROOT:-/app/storage} + PLUGIN_INSTALLED_PATH: ${PLUGIN_INSTALLED_PATH:-plugin} + PLUGIN_PACKAGE_CACHE_PATH: ${PLUGIN_PACKAGE_CACHE_PATH:-plugin_packages} + PLUGIN_MEDIA_CACHE_PATH: ${PLUGIN_MEDIA_CACHE_PATH:-assets} + PLUGIN_STORAGE_OSS_BUCKET: ${PLUGIN_STORAGE_OSS_BUCKET:-} + S3_USE_AWS_MANAGED_IAM: ${PLUGIN_S3_USE_AWS_MANAGED_IAM:-false} + S3_USE_AWS: ${PLUGIN_S3_USE_AWS:-false} + S3_ENDPOINT: ${PLUGIN_S3_ENDPOINT:-} + S3_USE_PATH_STYLE: ${PLUGIN_S3_USE_PATH_STYLE:-false} + AWS_ACCESS_KEY: ${PLUGIN_AWS_ACCESS_KEY:-} + AWS_SECRET_KEY: ${PLUGIN_AWS_SECRET_KEY:-} + AWS_REGION: ${PLUGIN_AWS_REGION:-} + AZURE_BLOB_STORAGE_CONNECTION_STRING: ${PLUGIN_AZURE_BLOB_STORAGE_CONNECTION_STRING:-} + AZURE_BLOB_STORAGE_CONTAINER_NAME: ${PLUGIN_AZURE_BLOB_STORAGE_CONTAINER_NAME:-} + TENCENT_COS_SECRET_KEY: ${PLUGIN_TENCENT_COS_SECRET_KEY:-} + TENCENT_COS_SECRET_ID: ${PLUGIN_TENCENT_COS_SECRET_ID:-} + TENCENT_COS_REGION: ${PLUGIN_TENCENT_COS_REGION:-} + ALIYUN_OSS_REGION: ${PLUGIN_ALIYUN_OSS_REGION:-} + ALIYUN_OSS_ENDPOINT: ${PLUGIN_ALIYUN_OSS_ENDPOINT:-} + ALIYUN_OSS_ACCESS_KEY_ID: ${PLUGIN_ALIYUN_OSS_ACCESS_KEY_ID:-} + ALIYUN_OSS_ACCESS_KEY_SECRET: ${PLUGIN_ALIYUN_OSS_ACCESS_KEY_SECRET:-} + ALIYUN_OSS_AUTH_VERSION: ${PLUGIN_ALIYUN_OSS_AUTH_VERSION:-v4} + ALIYUN_OSS_PATH: ${PLUGIN_ALIYUN_OSS_PATH:-} + VOLCENGINE_TOS_ENDPOINT: ${PLUGIN_VOLCENGINE_TOS_ENDPOINT:-} + VOLCENGINE_TOS_ACCESS_KEY: ${PLUGIN_VOLCENGINE_TOS_ACCESS_KEY:-} + VOLCENGINE_TOS_SECRET_KEY: ${PLUGIN_VOLCENGINE_TOS_SECRET_KEY:-} + VOLCENGINE_TOS_REGION: ${PLUGIN_VOLCENGINE_TOS_REGION:-} + SENTRY_ENABLED: ${PLUGIN_SENTRY_ENABLED:-false} + SENTRY_DSN: ${PLUGIN_SENTRY_DSN:-} + ports: + - "${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003}:${PLUGIN_DEBUGGING_PORT:-5003}" + volumes: + - ./volumes/plugin_daemon:/app/storage + depends_on: + db_postgres: + condition: service_healthy + required: false + db_mysql: + condition: service_healthy + required: false + oceanbase: + condition: service_healthy + required: false + seekdb: + condition: service_healthy + required: false + + # ssrf_proxy server + # for more information, please refer to + # https://docs.dify.ai/learn-more/faq/install-faq#18-why-is-ssrf-proxy-needed%3F + ssrf_proxy: + image: ubuntu/squid:latest + restart: always + volumes: + - ./ssrf_proxy/squid.conf.template:/etc/squid/squid.conf.template + - ./ssrf_proxy/docker-entrypoint.sh:/docker-entrypoint-mount.sh + entrypoint: + [ + "sh", + "-c", + "cp /docker-entrypoint-mount.sh /docker-entrypoint.sh && sed -i 's/\r$$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh", + ] + environment: + # pls clearly modify the squid env vars to fit your network environment. + HTTP_PORT: ${SSRF_HTTP_PORT:-3128} + COREDUMP_DIR: ${SSRF_COREDUMP_DIR:-/var/spool/squid} + REVERSE_PROXY_PORT: ${SSRF_REVERSE_PROXY_PORT:-8194} + SANDBOX_HOST: ${SSRF_SANDBOX_HOST:-sandbox} + SANDBOX_PORT: ${SANDBOX_PORT:-8194} + networks: + - ssrf_proxy_network + - default + + # Certbot service + # use `docker-compose --profile certbot up` to start the certbot service. + certbot: + image: certbot/certbot + profiles: + - certbot + volumes: + - ./volumes/certbot/conf:/etc/letsencrypt + - ./volumes/certbot/www:/var/www/html + - ./volumes/certbot/logs:/var/log/letsencrypt + - ./volumes/certbot/conf/live:/etc/letsencrypt/live + - ./certbot/update-cert.template.txt:/update-cert.template.txt + - ./certbot/docker-entrypoint.sh:/docker-entrypoint.sh + environment: + - CERTBOT_EMAIL=${CERTBOT_EMAIL} + - CERTBOT_DOMAIN=${CERTBOT_DOMAIN} + - CERTBOT_OPTIONS=${CERTBOT_OPTIONS:-} + entrypoint: ["/docker-entrypoint.sh"] + command: ["tail", "-f", "/dev/null"] + + # The nginx reverse proxy. + # used for reverse proxying the API service and Web service. + nginx: + image: nginx:latest + restart: always + volumes: + - ./nginx/nginx.conf.template:/etc/nginx/nginx.conf.template + - ./nginx/proxy.conf.template:/etc/nginx/proxy.conf.template + - ./nginx/https.conf.template:/etc/nginx/https.conf.template + - ./nginx/conf.d:/etc/nginx/conf.d + - ./nginx/docker-entrypoint.sh:/docker-entrypoint-mount.sh + - ./nginx/ssl:/etc/ssl # cert dir (legacy) + - ./volumes/certbot/conf/live:/etc/letsencrypt/live # cert dir (with certbot container) + - ./volumes/certbot/conf:/etc/letsencrypt + - ./volumes/certbot/www:/var/www/html + entrypoint: + [ + "sh", + "-c", + "cp /docker-entrypoint-mount.sh /docker-entrypoint.sh && sed -i 's/\r$$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh", + ] + environment: + NGINX_SERVER_NAME: ${NGINX_SERVER_NAME:-_} + NGINX_HTTPS_ENABLED: ${NGINX_HTTPS_ENABLED:-false} + NGINX_SSL_PORT: ${NGINX_SSL_PORT:-443} + NGINX_PORT: ${NGINX_PORT:-80} + # You're required to add your own SSL certificates/keys to the `./nginx/ssl` directory + # and modify the env vars below in .env if HTTPS_ENABLED is true. + NGINX_SSL_CERT_FILENAME: ${NGINX_SSL_CERT_FILENAME:-dify.crt} + NGINX_SSL_CERT_KEY_FILENAME: ${NGINX_SSL_CERT_KEY_FILENAME:-dify.key} + NGINX_SSL_PROTOCOLS: ${NGINX_SSL_PROTOCOLS:-TLSv1.1 TLSv1.2 TLSv1.3} + NGINX_WORKER_PROCESSES: ${NGINX_WORKER_PROCESSES:-auto} + NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-100M} + NGINX_KEEPALIVE_TIMEOUT: ${NGINX_KEEPALIVE_TIMEOUT:-65} + NGINX_PROXY_READ_TIMEOUT: ${NGINX_PROXY_READ_TIMEOUT:-3600s} + NGINX_PROXY_SEND_TIMEOUT: ${NGINX_PROXY_SEND_TIMEOUT:-3600s} + NGINX_ENABLE_CERTBOT_CHALLENGE: ${NGINX_ENABLE_CERTBOT_CHALLENGE:-false} + CERTBOT_DOMAIN: ${CERTBOT_DOMAIN:-} + depends_on: + - api + - web + ports: + - "${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}" + - "${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}" + + # The Weaviate vector store. + weaviate: + image: semitechnologies/weaviate:1.27.0 + profiles: + - weaviate + restart: always + volumes: + # Mount the Weaviate data directory to the con tainer. + - ./volumes/weaviate:/var/lib/weaviate + environment: + # The Weaviate configurations + # You can refer to the [Weaviate](https://weaviate.io/developers/weaviate/config-refs/env-vars) documentation for more information. + PERSISTENCE_DATA_PATH: ${WEAVIATE_PERSISTENCE_DATA_PATH:-/var/lib/weaviate} + QUERY_DEFAULTS_LIMIT: ${WEAVIATE_QUERY_DEFAULTS_LIMIT:-25} + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: ${WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED:-false} + DEFAULT_VECTORIZER_MODULE: ${WEAVIATE_DEFAULT_VECTORIZER_MODULE:-none} + CLUSTER_HOSTNAME: ${WEAVIATE_CLUSTER_HOSTNAME:-node1} + AUTHENTICATION_APIKEY_ENABLED: ${WEAVIATE_AUTHENTICATION_APIKEY_ENABLED:-true} + AUTHENTICATION_APIKEY_ALLOWED_KEYS: ${WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS:-WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih} + AUTHENTICATION_APIKEY_USERS: ${WEAVIATE_AUTHENTICATION_APIKEY_USERS:-hello@dify.ai} + AUTHORIZATION_ADMINLIST_ENABLED: ${WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED:-true} + AUTHORIZATION_ADMINLIST_USERS: ${WEAVIATE_AUTHORIZATION_ADMINLIST_USERS:-hello@dify.ai} + DISABLE_TELEMETRY: ${WEAVIATE_DISABLE_TELEMETRY:-false} + ENABLE_TOKENIZER_GSE: ${WEAVIATE_ENABLE_TOKENIZER_GSE:-false} + ENABLE_TOKENIZER_KAGOME_JA: ${WEAVIATE_ENABLE_TOKENIZER_KAGOME_JA:-false} + ENABLE_TOKENIZER_KAGOME_KR: ${WEAVIATE_ENABLE_TOKENIZER_KAGOME_KR:-false} + + # OceanBase vector database + oceanbase: + image: oceanbase/oceanbase-ce:4.3.5-lts + container_name: oceanbase + profiles: + - oceanbase + restart: always + volumes: + - ./volumes/oceanbase/data:/root/ob + - ./volumes/oceanbase/conf:/root/.obd/cluster + - ./volumes/oceanbase/init.d:/root/boot/init.d + environment: + OB_MEMORY_LIMIT: ${OCEANBASE_MEMORY_LIMIT:-6G} + OB_SYS_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} + OB_TENANT_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} + OB_CLUSTER_NAME: ${OCEANBASE_CLUSTER_NAME:-difyai} + OB_SERVER_IP: 127.0.0.1 + MODE: mini + LANG: en_US.UTF-8 + ports: + - "${OCEANBASE_VECTOR_PORT:-2881}:2881" + healthcheck: + test: + [ + "CMD-SHELL", + 'obclient -h127.0.0.1 -P2881 -uroot@test -p${OCEANBASE_VECTOR_PASSWORD:-difyai123456} -e "SELECT 1;"', + ] + interval: 10s + retries: 30 + start_period: 30s + timeout: 10s + + # seekdb vector database + seekdb: + image: oceanbase/seekdb:latest + container_name: seekdb + profiles: + - seekdb + restart: always + volumes: + - ./volumes/seekdb:/var/lib/oceanbase + environment: + ROOT_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} + MEMORY_LIMIT: ${SEEKDB_MEMORY_LIMIT:-2G} + REPORTER: dify-ai-seekdb + ports: + - "${OCEANBASE_VECTOR_PORT:-2881}:2881" + healthcheck: + test: + [ + "CMD-SHELL", + 'mysql -h127.0.0.1 -P2881 -uroot -p${OCEANBASE_VECTOR_PASSWORD:-difyai123456} -e "SELECT 1;"', + ] + interval: 5s + retries: 60 + timeout: 5s + + # Qdrant vector store. + # (if used, you need to set VECTOR_STORE to qdrant in the api & worker service.) + qdrant: + image: langgenius/qdrant:v1.8.3 + profiles: + - qdrant + restart: always + volumes: + - ./volumes/qdrant:/qdrant/storage + environment: + QDRANT_API_KEY: ${QDRANT_API_KEY:-difyai123456} + + # The Couchbase vector store. + couchbase-server: + build: ./couchbase-server + profiles: + - couchbase + restart: always + environment: + - CLUSTER_NAME=dify_search + - COUCHBASE_ADMINISTRATOR_USERNAME=${COUCHBASE_USER:-Administrator} + - COUCHBASE_ADMINISTRATOR_PASSWORD=${COUCHBASE_PASSWORD:-password} + - COUCHBASE_BUCKET=${COUCHBASE_BUCKET_NAME:-Embeddings} + - COUCHBASE_BUCKET_RAMSIZE=512 + - COUCHBASE_RAM_SIZE=2048 + - COUCHBASE_EVENTING_RAM_SIZE=512 + - COUCHBASE_INDEX_RAM_SIZE=512 + - COUCHBASE_FTS_RAM_SIZE=1024 + hostname: couchbase-server + container_name: couchbase-server + working_dir: /opt/couchbase + stdin_open: true + tty: true + entrypoint: [""] + command: sh -c "/opt/couchbase/init/init-cbserver.sh" + volumes: + - ./volumes/couchbase/data:/opt/couchbase/var/lib/couchbase/data + healthcheck: + # ensure bucket was created before proceeding + test: + [ + "CMD-SHELL", + "curl -s -f -u Administrator:password http://localhost:8091/pools/default/buckets | grep -q '\\[{' || exit 1", + ] + interval: 10s + retries: 10 + start_period: 30s + timeout: 10s + + # The pgvector vector database. + pgvector: + image: pgvector/pgvector:pg16 + profiles: + - pgvector + restart: always + environment: + PGUSER: ${PGVECTOR_PGUSER:-postgres} + # The password for the default postgres user. + POSTGRES_PASSWORD: ${PGVECTOR_POSTGRES_PASSWORD:-difyai123456} + # The name of the default postgres database. + POSTGRES_DB: ${PGVECTOR_POSTGRES_DB:-dify} + # postgres data directory + PGDATA: ${PGVECTOR_PGDATA:-/var/lib/postgresql/data/pgdata} + # pg_bigm module for full text search + PG_BIGM: ${PGVECTOR_PG_BIGM:-false} + PG_BIGM_VERSION: ${PGVECTOR_PG_BIGM_VERSION:-1.2-20240606} + volumes: + - ./volumes/pgvector/data:/var/lib/postgresql/data + - ./pgvector/docker-entrypoint.sh:/docker-entrypoint.sh + entrypoint: ["/docker-entrypoint.sh"] + healthcheck: + test: ["CMD", "pg_isready"] + interval: 1s + timeout: 3s + retries: 30 + + # get image from https://www.vastdata.com.cn/ + vastbase: + image: vastdata/vastbase-vector + profiles: + - vastbase + restart: always + environment: + - VB_DBCOMPATIBILITY=PG + - VB_DB=dify + - VB_USERNAME=dify + - VB_PASSWORD=Difyai123456 + ports: + - "5434:5432" + volumes: + - ./vastbase/lic:/home/vastbase/vastbase/lic + - ./vastbase/data:/home/vastbase/data + - ./vastbase/backup:/home/vastbase/backup + - ./vastbase/backup_log:/home/vastbase/backup_log + healthcheck: + test: ["CMD", "pg_isready"] + interval: 1s + timeout: 3s + retries: 30 + + # pgvecto-rs vector store + pgvecto-rs: + image: tensorchord/pgvecto-rs:pg16-v0.3.0 + profiles: + - pgvecto-rs + restart: always + environment: + PGUSER: ${PGVECTOR_PGUSER:-postgres} + # The password for the default postgres user. + POSTGRES_PASSWORD: ${PGVECTOR_POSTGRES_PASSWORD:-difyai123456} + # The name of the default postgres database. + POSTGRES_DB: ${PGVECTOR_POSTGRES_DB:-dify} + # postgres data directory + PGDATA: ${PGVECTOR_PGDATA:-/var/lib/postgresql/data/pgdata} + volumes: + - ./volumes/pgvecto_rs/data:/var/lib/postgresql/data + healthcheck: + test: ["CMD", "pg_isready"] + interval: 1s + timeout: 3s + retries: 30 + + # Chroma vector database + chroma: + image: ghcr.io/chroma-core/chroma:0.5.20 + profiles: + - chroma + restart: always + volumes: + - ./volumes/chroma:/chroma/chroma + environment: + CHROMA_SERVER_AUTHN_CREDENTIALS: ${CHROMA_SERVER_AUTHN_CREDENTIALS:-difyai123456} + CHROMA_SERVER_AUTHN_PROVIDER: ${CHROMA_SERVER_AUTHN_PROVIDER:-chromadb.auth.token_authn.TokenAuthenticationServerProvider} + IS_PERSISTENT: ${CHROMA_IS_PERSISTENT:-TRUE} + + # Oracle vector database + oracle: + image: container-registry.oracle.com/database/free:latest + profiles: + - oracle + restart: always + volumes: + - source: oradata + type: volume + target: /opt/oracle/oradata + - ./startupscripts:/opt/oracle/scripts/startup + environment: + ORACLE_PWD: ${ORACLE_PWD:-Dify123456} + ORACLE_CHARACTERSET: ${ORACLE_CHARACTERSET:-AL32UTF8} + + # Milvus vector database services + etcd: + container_name: milvus-etcd + image: quay.io/coreos/etcd:v3.5.5 + profiles: + - milvus + environment: + ETCD_AUTO_COMPACTION_MODE: ${ETCD_AUTO_COMPACTION_MODE:-revision} + ETCD_AUTO_COMPACTION_RETENTION: ${ETCD_AUTO_COMPACTION_RETENTION:-1000} + ETCD_QUOTA_BACKEND_BYTES: ${ETCD_QUOTA_BACKEND_BYTES:-4294967296} + ETCD_SNAPSHOT_COUNT: ${ETCD_SNAPSHOT_COUNT:-50000} + volumes: + - ./volumes/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 + healthcheck: + test: ["CMD", "etcdctl", "endpoint", "health"] + interval: 30s + timeout: 20s + retries: 3 + networks: + - milvus + + minio: + container_name: milvus-minio + image: minio/minio:RELEASE.2023-03-20T20-16-18Z + profiles: + - milvus + environment: + MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minioadmin} + MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-minioadmin} + volumes: + - ./volumes/milvus/minio:/minio_data + command: minio server /minio_data --console-address ":9001" + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] + interval: 30s + timeout: 20s + retries: 3 + networks: + - milvus + + milvus-standalone: + container_name: milvus-standalone + image: milvusdb/milvus:v2.6.3 + profiles: + - milvus + command: ["milvus", "run", "standalone"] + environment: + ETCD_ENDPOINTS: ${ETCD_ENDPOINTS:-etcd:2379} + MINIO_ADDRESS: ${MINIO_ADDRESS:-minio:9000} + common.security.authorizationEnabled: ${MILVUS_AUTHORIZATION_ENABLED:-true} + volumes: + - ./volumes/milvus/milvus:/var/lib/milvus + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"] + interval: 30s + start_period: 90s + timeout: 20s + retries: 3 + depends_on: + - etcd + - minio + ports: + - 19530:19530 + - 9091:9091 + networks: + - milvus + + # Opensearch vector database + opensearch: + container_name: opensearch + image: opensearchproject/opensearch:latest + profiles: + - opensearch + environment: + discovery.type: ${OPENSEARCH_DISCOVERY_TYPE:-single-node} + bootstrap.memory_lock: ${OPENSEARCH_BOOTSTRAP_MEMORY_LOCK:-true} + OPENSEARCH_JAVA_OPTS: -Xms${OPENSEARCH_JAVA_OPTS_MIN:-512m} -Xmx${OPENSEARCH_JAVA_OPTS_MAX:-1024m} + OPENSEARCH_INITIAL_ADMIN_PASSWORD: ${OPENSEARCH_INITIAL_ADMIN_PASSWORD:-Qazwsxedc!@#123} + ulimits: + memlock: + soft: ${OPENSEARCH_MEMLOCK_SOFT:--1} + hard: ${OPENSEARCH_MEMLOCK_HARD:--1} + nofile: + soft: ${OPENSEARCH_NOFILE_SOFT:-65536} + hard: ${OPENSEARCH_NOFILE_HARD:-65536} + volumes: + - ./volumes/opensearch/data:/usr/share/opensearch/data + networks: + - opensearch-net + + opensearch-dashboards: + container_name: opensearch-dashboards + image: opensearchproject/opensearch-dashboards:latest + profiles: + - opensearch + environment: + OPENSEARCH_HOSTS: '["https://opensearch:9200"]' + volumes: + - ./volumes/opensearch/opensearch_dashboards.yml:/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml + networks: + - opensearch-net + depends_on: + - opensearch + + # opengauss vector database. + opengauss: + image: opengauss/opengauss:7.0.0-RC1 + profiles: + - opengauss + privileged: true + restart: always + environment: + GS_USERNAME: ${OPENGAUSS_USER:-postgres} + GS_PASSWORD: ${OPENGAUSS_PASSWORD:-Dify@123} + GS_PORT: ${OPENGAUSS_PORT:-6600} + GS_DB: ${OPENGAUSS_DATABASE:-dify} + volumes: + - ./volumes/opengauss/data:/var/lib/opengauss/data + healthcheck: + test: ["CMD-SHELL", "netstat -lntp | grep tcp6 > /dev/null 2>&1"] + interval: 10s + timeout: 10s + retries: 10 + ports: + - ${OPENGAUSS_PORT:-6600}:${OPENGAUSS_PORT:-6600} + + # MyScale vector database + myscale: + container_name: myscale + image: myscale/myscaledb:1.6.4 + profiles: + - myscale + restart: always + tty: true + volumes: + - ./volumes/myscale/data:/var/lib/clickhouse + - ./volumes/myscale/log:/var/log/clickhouse-server + - ./volumes/myscale/config/users.d/custom_users_config.xml:/etc/clickhouse-server/users.d/custom_users_config.xml + ports: + - ${MYSCALE_PORT:-8123}:${MYSCALE_PORT:-8123} + + # Matrixone vector store. + matrixone: + hostname: matrixone + image: matrixorigin/matrixone:2.1.1 + profiles: + - matrixone + restart: always + volumes: + - ./volumes/matrixone/data:/mo-data + ports: + - ${MATRIXONE_PORT:-6001}:${MATRIXONE_PORT:-6001} + + # https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html + # https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker-prod-prerequisites + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:8.14.3 + container_name: elasticsearch + profiles: + - elasticsearch + - elasticsearch-ja + restart: always + volumes: + - ./elasticsearch/docker-entrypoint.sh:/docker-entrypoint-mount.sh + - dify_es01_data:/usr/share/elasticsearch/data + environment: + ELASTIC_PASSWORD: ${ELASTICSEARCH_PASSWORD:-elastic} + VECTOR_STORE: ${VECTOR_STORE:-} + cluster.name: dify-es-cluster + node.name: dify-es0 + discovery.type: single-node + xpack.license.self_generated.type: basic + xpack.security.enabled: "true" + xpack.security.enrollment.enabled: "false" + xpack.security.http.ssl.enabled: "false" + ports: + - ${ELASTICSEARCH_PORT:-9200}:9200 + deploy: + resources: + limits: + memory: 2g + entrypoint: ["sh", "-c", "sh /docker-entrypoint-mount.sh"] + healthcheck: + test: + ["CMD", "curl", "-s", "http://localhost:9200/_cluster/health?pretty"] + interval: 30s + timeout: 10s + retries: 50 + + # https://www.elastic.co/guide/en/kibana/current/docker.html + # https://www.elastic.co/guide/en/kibana/current/settings.html + kibana: + image: docker.elastic.co/kibana/kibana:8.14.3 + container_name: kibana + profiles: + - elasticsearch + depends_on: + - elasticsearch + restart: always + environment: + XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY: d1a66dfd-c4d3-4a0a-8290-2abcb83ab3aa + NO_PROXY: localhost,127.0.0.1,elasticsearch,kibana + XPACK_SECURITY_ENABLED: "true" + XPACK_SECURITY_ENROLLMENT_ENABLED: "false" + XPACK_SECURITY_HTTP_SSL_ENABLED: "false" + XPACK_FLEET_ISAIRGAPPED: "true" + I18N_LOCALE: zh-CN + SERVER_PORT: "5601" + ELASTICSEARCH_HOSTS: http://elasticsearch:9200 + ports: + - ${KIBANA_PORT:-5601}:5601 + healthcheck: + test: ["CMD-SHELL", "curl -s http://localhost:5601 >/dev/null || exit 1"] + interval: 30s + timeout: 10s + retries: 3 + + # unstructured . + # (if used, you need to set ETL_TYPE to Unstructured in the api & worker service.) + unstructured: + image: downloads.unstructured.io/unstructured-io/unstructured-api:latest + profiles: + - unstructured + restart: always + volumes: + - ./volumes/unstructured:/app/data + +networks: + # create a network between sandbox, api and ssrf_proxy, and can not access outside. + ssrf_proxy_network: + driver: bridge + internal: true + milvus: + driver: bridge + opensearch-net: + driver: bridge + internal: true + +volumes: + oradata: + dify_es01_data: diff --git a/docker/dify/docker-compose.middleware.yaml b/docker/dify/docker-compose.middleware.yaml new file mode 100644 index 00000000..68ef217b --- /dev/null +++ b/docker/dify/docker-compose.middleware.yaml @@ -0,0 +1,250 @@ +services: + # The postgres database. + db_postgres: + image: postgres:15-alpine + profiles: + - "" + - postgresql + restart: always + env_file: + - ./middleware.env + environment: + POSTGRES_PASSWORD: ${DB_PASSWORD:-difyai123456} + POSTGRES_DB: ${DB_DATABASE:-dify} + PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata} + command: > + postgres -c 'max_connections=${POSTGRES_MAX_CONNECTIONS:-100}' + -c 'shared_buffers=${POSTGRES_SHARED_BUFFERS:-128MB}' + -c 'work_mem=${POSTGRES_WORK_MEM:-4MB}' + -c 'maintenance_work_mem=${POSTGRES_MAINTENANCE_WORK_MEM:-64MB}' + -c 'effective_cache_size=${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB}' + -c 'statement_timeout=${POSTGRES_STATEMENT_TIMEOUT:-0}' + -c 'idle_in_transaction_session_timeout=${POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT:-0}' + volumes: + - ${PGDATA_HOST_VOLUME:-./volumes/db/data}:/var/lib/postgresql/data + ports: + - "${EXPOSE_POSTGRES_PORT:-5432}:5432" + healthcheck: + test: + [ + "CMD", + "pg_isready", + "-h", + "db_postgres", + "-U", + "${DB_USERNAME:-postgres}", + "-d", + "${DB_DATABASE:-dify}", + ] + interval: 1s + timeout: 3s + retries: 30 + + db_mysql: + image: mysql:8.0 + profiles: + - mysql + restart: always + env_file: + - ./middleware.env + environment: + MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-difyai123456} + MYSQL_DATABASE: ${DB_DATABASE:-dify} + command: > + --max_connections=1000 + --innodb_buffer_pool_size=${MYSQL_INNODB_BUFFER_POOL_SIZE:-512M} + --innodb_log_file_size=${MYSQL_INNODB_LOG_FILE_SIZE:-128M} + --innodb_flush_log_at_trx_commit=${MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT:-2} + volumes: + - ${MYSQL_HOST_VOLUME:-./volumes/mysql/data}:/var/lib/mysql + ports: + - "${EXPOSE_MYSQL_PORT:-3306}:3306" + healthcheck: + test: + [ + "CMD", + "mysqladmin", + "ping", + "-u", + "root", + "-p${DB_PASSWORD:-difyai123456}", + ] + interval: 1s + timeout: 3s + retries: 30 + + # The redis cache. + redis: + image: redis:6-alpine + restart: always + env_file: + - ./middleware.env + environment: + REDISCLI_AUTH: ${REDIS_PASSWORD:-difyai123456} + volumes: + # Mount the redis data directory to the container. + - ${REDIS_HOST_VOLUME:-./volumes/redis/data}:/data + # Set the redis password when startup redis server. + command: redis-server --requirepass ${REDIS_PASSWORD:-difyai123456} + ports: + - "${EXPOSE_REDIS_PORT:-6379}:6379" + healthcheck: + test: + [ + "CMD-SHELL", + "redis-cli -a ${REDIS_PASSWORD:-difyai123456} ping | grep -q PONG", + ] + + # The DifySandbox + sandbox: + image: langgenius/dify-sandbox:0.2.12 + restart: always + env_file: + - ./middleware.env + environment: + # The DifySandbox configurations + # Make sure you are changing this key for your deployment with a strong key. + # You can generate a strong key using `openssl rand -base64 42`. + API_KEY: ${SANDBOX_API_KEY:-dify-sandbox} + GIN_MODE: ${SANDBOX_GIN_MODE:-release} + WORKER_TIMEOUT: ${SANDBOX_WORKER_TIMEOUT:-15} + ENABLE_NETWORK: ${SANDBOX_ENABLE_NETWORK:-true} + HTTP_PROXY: ${SANDBOX_HTTP_PROXY:-http://ssrf_proxy:3128} + HTTPS_PROXY: ${SANDBOX_HTTPS_PROXY:-http://ssrf_proxy:3128} + SANDBOX_PORT: ${SANDBOX_PORT:-8194} + PIP_MIRROR_URL: ${PIP_MIRROR_URL:-} + volumes: + - ./volumes/sandbox/dependencies:/dependencies + - ./volumes/sandbox/conf:/conf + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8194/health"] + networks: + - ssrf_proxy_network + + # plugin daemon + plugin_daemon: + image: langgenius/dify-plugin-daemon:0.5.1-local + restart: always + env_file: + - ./middleware.env + environment: + # Use the shared environment variables. + DB_DATABASE: ${DB_PLUGIN_DATABASE:-dify_plugin} + REDIS_HOST: ${REDIS_HOST:-redis} + REDIS_PORT: ${REDIS_PORT:-6379} + REDIS_PASSWORD: ${REDIS_PASSWORD:-difyai123456} + SERVER_PORT: ${PLUGIN_DAEMON_PORT:-5002} + SERVER_KEY: ${PLUGIN_DAEMON_KEY:-lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi} + MAX_PLUGIN_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} + PPROF_ENABLED: ${PLUGIN_PPROF_ENABLED:-false} + DIFY_INNER_API_URL: ${PLUGIN_DIFY_INNER_API_URL:-http://host.docker.internal:5001} + DIFY_INNER_API_KEY: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1} + PLUGIN_REMOTE_INSTALLING_HOST: ${PLUGIN_DEBUGGING_HOST:-0.0.0.0} + PLUGIN_REMOTE_INSTALLING_PORT: ${PLUGIN_DEBUGGING_PORT:-5003} + PLUGIN_WORKING_PATH: ${PLUGIN_WORKING_PATH:-/app/storage/cwd} + PYTHON_ENV_INIT_TIMEOUT: ${PLUGIN_PYTHON_ENV_INIT_TIMEOUT:-120} + PLUGIN_MAX_EXECUTION_TIMEOUT: ${PLUGIN_MAX_EXECUTION_TIMEOUT:-600} + PIP_MIRROR_URL: ${PIP_MIRROR_URL:-} + PLUGIN_STORAGE_TYPE: ${PLUGIN_STORAGE_TYPE:-local} + PLUGIN_STORAGE_LOCAL_ROOT: ${PLUGIN_STORAGE_LOCAL_ROOT:-/app/storage} + PLUGIN_INSTALLED_PATH: ${PLUGIN_INSTALLED_PATH:-plugin} + PLUGIN_PACKAGE_CACHE_PATH: ${PLUGIN_PACKAGE_CACHE_PATH:-plugin_packages} + PLUGIN_MEDIA_CACHE_PATH: ${PLUGIN_MEDIA_CACHE_PATH:-assets} + PLUGIN_STORAGE_OSS_BUCKET: ${PLUGIN_STORAGE_OSS_BUCKET:-} + S3_USE_AWS: ${PLUGIN_S3_USE_AWS:-false} + S3_USE_AWS_MANAGED_IAM: ${PLUGIN_S3_USE_AWS_MANAGED_IAM:-false} + S3_ENDPOINT: ${PLUGIN_S3_ENDPOINT:-} + S3_USE_PATH_STYLE: ${PLUGIN_S3_USE_PATH_STYLE:-false} + AWS_ACCESS_KEY: ${PLUGIN_AWS_ACCESS_KEY:-} + AWS_SECRET_KEY: ${PLUGIN_AWS_SECRET_KEY:-} + AWS_REGION: ${PLUGIN_AWS_REGION:-} + AZURE_BLOB_STORAGE_CONNECTION_STRING: ${PLUGIN_AZURE_BLOB_STORAGE_CONNECTION_STRING:-} + AZURE_BLOB_STORAGE_CONTAINER_NAME: ${PLUGIN_AZURE_BLOB_STORAGE_CONTAINER_NAME:-} + TENCENT_COS_SECRET_KEY: ${PLUGIN_TENCENT_COS_SECRET_KEY:-} + TENCENT_COS_SECRET_ID: ${PLUGIN_TENCENT_COS_SECRET_ID:-} + TENCENT_COS_REGION: ${PLUGIN_TENCENT_COS_REGION:-} + ALIYUN_OSS_REGION: ${PLUGIN_ALIYUN_OSS_REGION:-} + ALIYUN_OSS_ENDPOINT: ${PLUGIN_ALIYUN_OSS_ENDPOINT:-} + ALIYUN_OSS_ACCESS_KEY_ID: ${PLUGIN_ALIYUN_OSS_ACCESS_KEY_ID:-} + ALIYUN_OSS_ACCESS_KEY_SECRET: ${PLUGIN_ALIYUN_OSS_ACCESS_KEY_SECRET:-} + ALIYUN_OSS_AUTH_VERSION: ${PLUGIN_ALIYUN_OSS_AUTH_VERSION:-v4} + ALIYUN_OSS_PATH: ${PLUGIN_ALIYUN_OSS_PATH:-} + VOLCENGINE_TOS_ENDPOINT: ${PLUGIN_VOLCENGINE_TOS_ENDPOINT:-} + VOLCENGINE_TOS_ACCESS_KEY: ${PLUGIN_VOLCENGINE_TOS_ACCESS_KEY:-} + VOLCENGINE_TOS_SECRET_KEY: ${PLUGIN_VOLCENGINE_TOS_SECRET_KEY:-} + VOLCENGINE_TOS_REGION: ${PLUGIN_VOLCENGINE_TOS_REGION:-} + THIRD_PARTY_SIGNATURE_VERIFICATION_ENABLED: true + THIRD_PARTY_SIGNATURE_VERIFICATION_PUBLIC_KEYS: /app/keys/publickey.pem + FORCE_VERIFYING_SIGNATURE: false + ports: + - "${EXPOSE_PLUGIN_DAEMON_PORT:-5002}:${PLUGIN_DAEMON_PORT:-5002}" + - "${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003}:${PLUGIN_DEBUGGING_PORT:-5003}" + volumes: + - ./volumes/plugin_daemon:/app/storage + + # ssrf_proxy server + # for more information, please refer to + # https://docs.dify.ai/learn-more/faq/install-faq#18-why-is-ssrf-proxy-needed%3F + ssrf_proxy: + image: ubuntu/squid:latest + restart: always + volumes: + - ./ssrf_proxy/squid.conf.template:/etc/squid/squid.conf.template + - ./ssrf_proxy/docker-entrypoint.sh:/docker-entrypoint-mount.sh + entrypoint: + [ + "sh", + "-c", + "cp /docker-entrypoint-mount.sh /docker-entrypoint.sh && sed -i 's/\r$$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh", + ] + env_file: + - ./middleware.env + environment: + # pls clearly modify the squid env vars to fit your network environment. + HTTP_PORT: ${SSRF_HTTP_PORT:-3128} + COREDUMP_DIR: ${SSRF_COREDUMP_DIR:-/var/spool/squid} + REVERSE_PROXY_PORT: ${SSRF_REVERSE_PROXY_PORT:-8194} + SANDBOX_HOST: ${SSRF_SANDBOX_HOST:-sandbox} + SANDBOX_PORT: ${SANDBOX_PORT:-8194} + ports: + - "${EXPOSE_SSRF_PROXY_PORT:-3128}:${SSRF_HTTP_PORT:-3128}" + - "${EXPOSE_SANDBOX_PORT:-8194}:${SANDBOX_PORT:-8194}" + networks: + - ssrf_proxy_network + - default + + # The Weaviate vector store. + weaviate: + image: semitechnologies/weaviate:1.27.0 + profiles: + - "" + - weaviate + restart: always + volumes: + # Mount the Weaviate data directory to the container. + - ${WEAVIATE_HOST_VOLUME:-./volumes/weaviate}:/var/lib/weaviate + env_file: + - ./middleware.env + environment: + # The Weaviate configurations + # You can refer to the [Weaviate](https://weaviate.io/developers/weaviate/config-refs/env-vars) documentation for more information. + PERSISTENCE_DATA_PATH: ${WEAVIATE_PERSISTENCE_DATA_PATH:-/var/lib/weaviate} + QUERY_DEFAULTS_LIMIT: ${WEAVIATE_QUERY_DEFAULTS_LIMIT:-25} + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: ${WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED:-false} + DEFAULT_VECTORIZER_MODULE: ${WEAVIATE_DEFAULT_VECTORIZER_MODULE:-none} + CLUSTER_HOSTNAME: ${WEAVIATE_CLUSTER_HOSTNAME:-node1} + AUTHENTICATION_APIKEY_ENABLED: ${WEAVIATE_AUTHENTICATION_APIKEY_ENABLED:-true} + AUTHENTICATION_APIKEY_ALLOWED_KEYS: ${WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS:-WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih} + AUTHENTICATION_APIKEY_USERS: ${WEAVIATE_AUTHENTICATION_APIKEY_USERS:-hello@dify.ai} + AUTHORIZATION_ADMINLIST_ENABLED: ${WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED:-true} + AUTHORIZATION_ADMINLIST_USERS: ${WEAVIATE_AUTHORIZATION_ADMINLIST_USERS:-hello@dify.ai} + DISABLE_TELEMETRY: ${WEAVIATE_DISABLE_TELEMETRY:-false} + ports: + - "${EXPOSE_WEAVIATE_PORT:-8080}:8080" + - "${EXPOSE_WEAVIATE_GRPC_PORT:-50051}:50051" + +networks: + # create a network between sandbox, api and ssrf_proxy, and can not access outside. + ssrf_proxy_network: + driver: bridge + internal: true diff --git a/docker/dify/docker-compose.png b/docker/dify/docker-compose.png new file mode 100644 index 00000000..015d4502 Binary files /dev/null and b/docker/dify/docker-compose.png differ diff --git a/docker/dify/docker-compose.yaml b/docker/dify/docker-compose.yaml new file mode 100644 index 00000000..45941461 --- /dev/null +++ b/docker/dify/docker-compose.yaml @@ -0,0 +1,1551 @@ +# ================================================================== +# WARNING: This file is auto-generated by generate_docker_compose +# Do not modify this file directly. Instead, update the .env.example +# or docker-compose-template.yaml and regenerate this file. +# ================================================================== + +x-shared-env: &shared-api-worker-env + CONSOLE_API_URL: ${CONSOLE_API_URL:-} + CONSOLE_WEB_URL: ${CONSOLE_WEB_URL:-} + SERVICE_API_URL: ${SERVICE_API_URL:-} + TRIGGER_URL: ${TRIGGER_URL:-http://localhost} + APP_API_URL: ${APP_API_URL:-} + APP_WEB_URL: ${APP_WEB_URL:-} + FILES_URL: ${FILES_URL:-} + INTERNAL_FILES_URL: ${INTERNAL_FILES_URL:-} + LANG: ${LANG:-en_US.UTF-8} + LC_ALL: ${LC_ALL:-en_US.UTF-8} + PYTHONIOENCODING: ${PYTHONIOENCODING:-utf-8} + LOG_LEVEL: ${LOG_LEVEL:-INFO} + LOG_FILE: ${LOG_FILE:-/app/logs/server.log} + LOG_FILE_MAX_SIZE: ${LOG_FILE_MAX_SIZE:-20} + LOG_FILE_BACKUP_COUNT: ${LOG_FILE_BACKUP_COUNT:-5} + LOG_DATEFORMAT: ${LOG_DATEFORMAT:-%Y-%m-%d %H:%M:%S} + LOG_TZ: ${LOG_TZ:-UTC} + DEBUG: ${DEBUG:-false} + FLASK_DEBUG: ${FLASK_DEBUG:-false} + ENABLE_REQUEST_LOGGING: ${ENABLE_REQUEST_LOGGING:-False} + SECRET_KEY: ${SECRET_KEY:-sk-9f73s3ljTXVcMT3Blb3ljTqtsKiGHXVcMT3BlbkFJLK7U} + INIT_PASSWORD: ${INIT_PASSWORD:-} + DEPLOY_ENV: ${DEPLOY_ENV:-PRODUCTION} + CHECK_UPDATE_URL: ${CHECK_UPDATE_URL:-https://updates.dify.ai} + OPENAI_API_BASE: ${OPENAI_API_BASE:-https://api.openai.com/v1} + MIGRATION_ENABLED: ${MIGRATION_ENABLED:-true} + FILES_ACCESS_TIMEOUT: ${FILES_ACCESS_TIMEOUT:-300} + ACCESS_TOKEN_EXPIRE_MINUTES: ${ACCESS_TOKEN_EXPIRE_MINUTES:-60} + REFRESH_TOKEN_EXPIRE_DAYS: ${REFRESH_TOKEN_EXPIRE_DAYS:-30} + APP_DEFAULT_ACTIVE_REQUESTS: ${APP_DEFAULT_ACTIVE_REQUESTS:-0} + APP_MAX_ACTIVE_REQUESTS: ${APP_MAX_ACTIVE_REQUESTS:-0} + APP_MAX_EXECUTION_TIME: ${APP_MAX_EXECUTION_TIME:-1200} + DIFY_BIND_ADDRESS: ${DIFY_BIND_ADDRESS:-0.0.0.0} + DIFY_PORT: ${DIFY_PORT:-5001} + SERVER_WORKER_AMOUNT: ${SERVER_WORKER_AMOUNT:-1} + SERVER_WORKER_CLASS: ${SERVER_WORKER_CLASS:-gevent} + SERVER_WORKER_CONNECTIONS: ${SERVER_WORKER_CONNECTIONS:-10} + CELERY_WORKER_CLASS: ${CELERY_WORKER_CLASS:-} + GUNICORN_TIMEOUT: ${GUNICORN_TIMEOUT:-360} + CELERY_WORKER_AMOUNT: ${CELERY_WORKER_AMOUNT:-} + CELERY_AUTO_SCALE: ${CELERY_AUTO_SCALE:-false} + CELERY_MAX_WORKERS: ${CELERY_MAX_WORKERS:-} + CELERY_MIN_WORKERS: ${CELERY_MIN_WORKERS:-} + API_TOOL_DEFAULT_CONNECT_TIMEOUT: ${API_TOOL_DEFAULT_CONNECT_TIMEOUT:-10} + API_TOOL_DEFAULT_READ_TIMEOUT: ${API_TOOL_DEFAULT_READ_TIMEOUT:-60} + ENABLE_WEBSITE_JINAREADER: ${ENABLE_WEBSITE_JINAREADER:-true} + ENABLE_WEBSITE_FIRECRAWL: ${ENABLE_WEBSITE_FIRECRAWL:-true} + ENABLE_WEBSITE_WATERCRAWL: ${ENABLE_WEBSITE_WATERCRAWL:-true} + NEXT_PUBLIC_ENABLE_SINGLE_DOLLAR_LATEX: ${NEXT_PUBLIC_ENABLE_SINGLE_DOLLAR_LATEX:-false} + DB_TYPE: ${DB_TYPE:-postgresql} + DB_USERNAME: ${DB_USERNAME:-postgres} + DB_PASSWORD: ${DB_PASSWORD:-difyai123456} + DB_HOST: ${DB_HOST:-db_postgres} + DB_PORT: ${DB_PORT:-5432} + DB_DATABASE: ${DB_DATABASE:-dify} + SQLALCHEMY_POOL_SIZE: ${SQLALCHEMY_POOL_SIZE:-30} + SQLALCHEMY_MAX_OVERFLOW: ${SQLALCHEMY_MAX_OVERFLOW:-10} + SQLALCHEMY_POOL_RECYCLE: ${SQLALCHEMY_POOL_RECYCLE:-3600} + SQLALCHEMY_ECHO: ${SQLALCHEMY_ECHO:-false} + SQLALCHEMY_POOL_PRE_PING: ${SQLALCHEMY_POOL_PRE_PING:-false} + SQLALCHEMY_POOL_USE_LIFO: ${SQLALCHEMY_POOL_USE_LIFO:-false} + SQLALCHEMY_POOL_TIMEOUT: ${SQLALCHEMY_POOL_TIMEOUT:-30} + POSTGRES_MAX_CONNECTIONS: ${POSTGRES_MAX_CONNECTIONS:-100} + POSTGRES_SHARED_BUFFERS: ${POSTGRES_SHARED_BUFFERS:-128MB} + POSTGRES_WORK_MEM: ${POSTGRES_WORK_MEM:-4MB} + POSTGRES_MAINTENANCE_WORK_MEM: ${POSTGRES_MAINTENANCE_WORK_MEM:-64MB} + POSTGRES_EFFECTIVE_CACHE_SIZE: ${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB} + POSTGRES_STATEMENT_TIMEOUT: ${POSTGRES_STATEMENT_TIMEOUT:-0} + POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT: ${POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT:-0} + MYSQL_MAX_CONNECTIONS: ${MYSQL_MAX_CONNECTIONS:-1000} + MYSQL_INNODB_BUFFER_POOL_SIZE: ${MYSQL_INNODB_BUFFER_POOL_SIZE:-512M} + MYSQL_INNODB_LOG_FILE_SIZE: ${MYSQL_INNODB_LOG_FILE_SIZE:-128M} + MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT: ${MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT:-2} + REDIS_HOST: ${REDIS_HOST:-redis} + REDIS_PORT: ${REDIS_PORT:-6379} + REDIS_USERNAME: ${REDIS_USERNAME:-} + REDIS_PASSWORD: ${REDIS_PASSWORD:-difyai123456} + REDIS_USE_SSL: ${REDIS_USE_SSL:-false} + REDIS_SSL_CERT_REQS: ${REDIS_SSL_CERT_REQS:-CERT_NONE} + REDIS_SSL_CA_CERTS: ${REDIS_SSL_CA_CERTS:-} + REDIS_SSL_CERTFILE: ${REDIS_SSL_CERTFILE:-} + REDIS_SSL_KEYFILE: ${REDIS_SSL_KEYFILE:-} + REDIS_DB: ${REDIS_DB:-0} + REDIS_USE_SENTINEL: ${REDIS_USE_SENTINEL:-false} + REDIS_SENTINELS: ${REDIS_SENTINELS:-} + REDIS_SENTINEL_SERVICE_NAME: ${REDIS_SENTINEL_SERVICE_NAME:-} + REDIS_SENTINEL_USERNAME: ${REDIS_SENTINEL_USERNAME:-} + REDIS_SENTINEL_PASSWORD: ${REDIS_SENTINEL_PASSWORD:-} + REDIS_SENTINEL_SOCKET_TIMEOUT: ${REDIS_SENTINEL_SOCKET_TIMEOUT:-0.1} + REDIS_USE_CLUSTERS: ${REDIS_USE_CLUSTERS:-false} + REDIS_CLUSTERS: ${REDIS_CLUSTERS:-} + REDIS_CLUSTERS_PASSWORD: ${REDIS_CLUSTERS_PASSWORD:-} + CELERY_BROKER_URL: ${CELERY_BROKER_URL:-redis://:difyai123456@redis:6379/1} + CELERY_BACKEND: ${CELERY_BACKEND:-redis} + BROKER_USE_SSL: ${BROKER_USE_SSL:-false} + CELERY_USE_SENTINEL: ${CELERY_USE_SENTINEL:-false} + CELERY_SENTINEL_MASTER_NAME: ${CELERY_SENTINEL_MASTER_NAME:-} + CELERY_SENTINEL_PASSWORD: ${CELERY_SENTINEL_PASSWORD:-} + CELERY_SENTINEL_SOCKET_TIMEOUT: ${CELERY_SENTINEL_SOCKET_TIMEOUT:-0.1} + WEB_API_CORS_ALLOW_ORIGINS: ${WEB_API_CORS_ALLOW_ORIGINS:-*} + CONSOLE_CORS_ALLOW_ORIGINS: ${CONSOLE_CORS_ALLOW_ORIGINS:-*} + COOKIE_DOMAIN: ${COOKIE_DOMAIN:-} + NEXT_PUBLIC_COOKIE_DOMAIN: ${NEXT_PUBLIC_COOKIE_DOMAIN:-} + STORAGE_TYPE: ${STORAGE_TYPE:-opendal} + OPENDAL_SCHEME: ${OPENDAL_SCHEME:-fs} + OPENDAL_FS_ROOT: ${OPENDAL_FS_ROOT:-storage} + CLICKZETTA_VOLUME_TYPE: ${CLICKZETTA_VOLUME_TYPE:-user} + CLICKZETTA_VOLUME_NAME: ${CLICKZETTA_VOLUME_NAME:-} + CLICKZETTA_VOLUME_TABLE_PREFIX: ${CLICKZETTA_VOLUME_TABLE_PREFIX:-dataset_} + CLICKZETTA_VOLUME_DIFY_PREFIX: ${CLICKZETTA_VOLUME_DIFY_PREFIX:-dify_km} + S3_ENDPOINT: ${S3_ENDPOINT:-} + S3_REGION: ${S3_REGION:-us-east-1} + S3_BUCKET_NAME: ${S3_BUCKET_NAME:-difyai} + S3_ACCESS_KEY: ${S3_ACCESS_KEY:-} + S3_SECRET_KEY: ${S3_SECRET_KEY:-} + S3_USE_AWS_MANAGED_IAM: ${S3_USE_AWS_MANAGED_IAM:-false} + AZURE_BLOB_ACCOUNT_NAME: ${AZURE_BLOB_ACCOUNT_NAME:-difyai} + AZURE_BLOB_ACCOUNT_KEY: ${AZURE_BLOB_ACCOUNT_KEY:-difyai} + AZURE_BLOB_CONTAINER_NAME: ${AZURE_BLOB_CONTAINER_NAME:-difyai-container} + AZURE_BLOB_ACCOUNT_URL: ${AZURE_BLOB_ACCOUNT_URL:-https://.blob.core.windows.net} + GOOGLE_STORAGE_BUCKET_NAME: ${GOOGLE_STORAGE_BUCKET_NAME:-your-bucket-name} + GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64: ${GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64:-} + ALIYUN_OSS_BUCKET_NAME: ${ALIYUN_OSS_BUCKET_NAME:-your-bucket-name} + ALIYUN_OSS_ACCESS_KEY: ${ALIYUN_OSS_ACCESS_KEY:-your-access-key} + ALIYUN_OSS_SECRET_KEY: ${ALIYUN_OSS_SECRET_KEY:-your-secret-key} + ALIYUN_OSS_ENDPOINT: ${ALIYUN_OSS_ENDPOINT:-https://oss-ap-southeast-1-internal.aliyuncs.com} + ALIYUN_OSS_REGION: ${ALIYUN_OSS_REGION:-ap-southeast-1} + ALIYUN_OSS_AUTH_VERSION: ${ALIYUN_OSS_AUTH_VERSION:-v4} + ALIYUN_OSS_PATH: ${ALIYUN_OSS_PATH:-your-path} + TENCENT_COS_BUCKET_NAME: ${TENCENT_COS_BUCKET_NAME:-your-bucket-name} + TENCENT_COS_SECRET_KEY: ${TENCENT_COS_SECRET_KEY:-your-secret-key} + TENCENT_COS_SECRET_ID: ${TENCENT_COS_SECRET_ID:-your-secret-id} + TENCENT_COS_REGION: ${TENCENT_COS_REGION:-your-region} + TENCENT_COS_SCHEME: ${TENCENT_COS_SCHEME:-your-scheme} + OCI_ENDPOINT: ${OCI_ENDPOINT:-https://your-object-storage-namespace.compat.objectstorage.us-ashburn-1.oraclecloud.com} + OCI_BUCKET_NAME: ${OCI_BUCKET_NAME:-your-bucket-name} + OCI_ACCESS_KEY: ${OCI_ACCESS_KEY:-your-access-key} + OCI_SECRET_KEY: ${OCI_SECRET_KEY:-your-secret-key} + OCI_REGION: ${OCI_REGION:-us-ashburn-1} + HUAWEI_OBS_BUCKET_NAME: ${HUAWEI_OBS_BUCKET_NAME:-your-bucket-name} + HUAWEI_OBS_SECRET_KEY: ${HUAWEI_OBS_SECRET_KEY:-your-secret-key} + HUAWEI_OBS_ACCESS_KEY: ${HUAWEI_OBS_ACCESS_KEY:-your-access-key} + HUAWEI_OBS_SERVER: ${HUAWEI_OBS_SERVER:-your-server-url} + VOLCENGINE_TOS_BUCKET_NAME: ${VOLCENGINE_TOS_BUCKET_NAME:-your-bucket-name} + VOLCENGINE_TOS_SECRET_KEY: ${VOLCENGINE_TOS_SECRET_KEY:-your-secret-key} + VOLCENGINE_TOS_ACCESS_KEY: ${VOLCENGINE_TOS_ACCESS_KEY:-your-access-key} + VOLCENGINE_TOS_ENDPOINT: ${VOLCENGINE_TOS_ENDPOINT:-your-server-url} + VOLCENGINE_TOS_REGION: ${VOLCENGINE_TOS_REGION:-your-region} + BAIDU_OBS_BUCKET_NAME: ${BAIDU_OBS_BUCKET_NAME:-your-bucket-name} + BAIDU_OBS_SECRET_KEY: ${BAIDU_OBS_SECRET_KEY:-your-secret-key} + BAIDU_OBS_ACCESS_KEY: ${BAIDU_OBS_ACCESS_KEY:-your-access-key} + BAIDU_OBS_ENDPOINT: ${BAIDU_OBS_ENDPOINT:-your-server-url} + SUPABASE_BUCKET_NAME: ${SUPABASE_BUCKET_NAME:-your-bucket-name} + SUPABASE_API_KEY: ${SUPABASE_API_KEY:-your-access-key} + SUPABASE_URL: ${SUPABASE_URL:-your-server-url} + VECTOR_STORE: ${VECTOR_STORE:-weaviate} + VECTOR_INDEX_NAME_PREFIX: ${VECTOR_INDEX_NAME_PREFIX:-Vector_index} + WEAVIATE_ENDPOINT: ${WEAVIATE_ENDPOINT:-http://weaviate:8080} + WEAVIATE_API_KEY: ${WEAVIATE_API_KEY:-WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih} + WEAVIATE_GRPC_ENDPOINT: ${WEAVIATE_GRPC_ENDPOINT:-grpc://weaviate:50051} + WEAVIATE_TOKENIZATION: ${WEAVIATE_TOKENIZATION:-word} + OCEANBASE_VECTOR_HOST: ${OCEANBASE_VECTOR_HOST:-oceanbase} + OCEANBASE_VECTOR_PORT: ${OCEANBASE_VECTOR_PORT:-2881} + OCEANBASE_VECTOR_USER: ${OCEANBASE_VECTOR_USER:-root@test} + OCEANBASE_VECTOR_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} + OCEANBASE_VECTOR_DATABASE: ${OCEANBASE_VECTOR_DATABASE:-test} + OCEANBASE_CLUSTER_NAME: ${OCEANBASE_CLUSTER_NAME:-difyai} + OCEANBASE_MEMORY_LIMIT: ${OCEANBASE_MEMORY_LIMIT:-6G} + OCEANBASE_ENABLE_HYBRID_SEARCH: ${OCEANBASE_ENABLE_HYBRID_SEARCH:-false} + OCEANBASE_FULLTEXT_PARSER: ${OCEANBASE_FULLTEXT_PARSER:-ik} + SEEKDB_MEMORY_LIMIT: ${SEEKDB_MEMORY_LIMIT:-2G} + QDRANT_URL: ${QDRANT_URL:-http://qdrant:6333} + QDRANT_API_KEY: ${QDRANT_API_KEY:-difyai123456} + QDRANT_CLIENT_TIMEOUT: ${QDRANT_CLIENT_TIMEOUT:-20} + QDRANT_GRPC_ENABLED: ${QDRANT_GRPC_ENABLED:-false} + QDRANT_GRPC_PORT: ${QDRANT_GRPC_PORT:-6334} + QDRANT_REPLICATION_FACTOR: ${QDRANT_REPLICATION_FACTOR:-1} + MILVUS_URI: ${MILVUS_URI:-http://host.docker.internal:19530} + MILVUS_DATABASE: ${MILVUS_DATABASE:-} + MILVUS_TOKEN: ${MILVUS_TOKEN:-} + MILVUS_USER: ${MILVUS_USER:-} + MILVUS_PASSWORD: ${MILVUS_PASSWORD:-} + MILVUS_ENABLE_HYBRID_SEARCH: ${MILVUS_ENABLE_HYBRID_SEARCH:-False} + MILVUS_ANALYZER_PARAMS: ${MILVUS_ANALYZER_PARAMS:-} + MYSCALE_HOST: ${MYSCALE_HOST:-myscale} + MYSCALE_PORT: ${MYSCALE_PORT:-8123} + MYSCALE_USER: ${MYSCALE_USER:-default} + MYSCALE_PASSWORD: ${MYSCALE_PASSWORD:-} + MYSCALE_DATABASE: ${MYSCALE_DATABASE:-dify} + MYSCALE_FTS_PARAMS: ${MYSCALE_FTS_PARAMS:-} + COUCHBASE_CONNECTION_STRING: ${COUCHBASE_CONNECTION_STRING:-couchbase://couchbase-server} + COUCHBASE_USER: ${COUCHBASE_USER:-Administrator} + COUCHBASE_PASSWORD: ${COUCHBASE_PASSWORD:-password} + COUCHBASE_BUCKET_NAME: ${COUCHBASE_BUCKET_NAME:-Embeddings} + COUCHBASE_SCOPE_NAME: ${COUCHBASE_SCOPE_NAME:-_default} + PGVECTOR_HOST: ${PGVECTOR_HOST:-pgvector} + PGVECTOR_PORT: ${PGVECTOR_PORT:-5432} + PGVECTOR_USER: ${PGVECTOR_USER:-postgres} + PGVECTOR_PASSWORD: ${PGVECTOR_PASSWORD:-difyai123456} + PGVECTOR_DATABASE: ${PGVECTOR_DATABASE:-dify} + PGVECTOR_MIN_CONNECTION: ${PGVECTOR_MIN_CONNECTION:-1} + PGVECTOR_MAX_CONNECTION: ${PGVECTOR_MAX_CONNECTION:-5} + PGVECTOR_PG_BIGM: ${PGVECTOR_PG_BIGM:-false} + PGVECTOR_PG_BIGM_VERSION: ${PGVECTOR_PG_BIGM_VERSION:-1.2-20240606} + VASTBASE_HOST: ${VASTBASE_HOST:-vastbase} + VASTBASE_PORT: ${VASTBASE_PORT:-5432} + VASTBASE_USER: ${VASTBASE_USER:-dify} + VASTBASE_PASSWORD: ${VASTBASE_PASSWORD:-Difyai123456} + VASTBASE_DATABASE: ${VASTBASE_DATABASE:-dify} + VASTBASE_MIN_CONNECTION: ${VASTBASE_MIN_CONNECTION:-1} + VASTBASE_MAX_CONNECTION: ${VASTBASE_MAX_CONNECTION:-5} + PGVECTO_RS_HOST: ${PGVECTO_RS_HOST:-pgvecto-rs} + PGVECTO_RS_PORT: ${PGVECTO_RS_PORT:-5432} + PGVECTO_RS_USER: ${PGVECTO_RS_USER:-postgres} + PGVECTO_RS_PASSWORD: ${PGVECTO_RS_PASSWORD:-difyai123456} + PGVECTO_RS_DATABASE: ${PGVECTO_RS_DATABASE:-dify} + ANALYTICDB_KEY_ID: ${ANALYTICDB_KEY_ID:-your-ak} + ANALYTICDB_KEY_SECRET: ${ANALYTICDB_KEY_SECRET:-your-sk} + ANALYTICDB_REGION_ID: ${ANALYTICDB_REGION_ID:-cn-hangzhou} + ANALYTICDB_INSTANCE_ID: ${ANALYTICDB_INSTANCE_ID:-gp-ab123456} + ANALYTICDB_ACCOUNT: ${ANALYTICDB_ACCOUNT:-testaccount} + ANALYTICDB_PASSWORD: ${ANALYTICDB_PASSWORD:-testpassword} + ANALYTICDB_NAMESPACE: ${ANALYTICDB_NAMESPACE:-dify} + ANALYTICDB_NAMESPACE_PASSWORD: ${ANALYTICDB_NAMESPACE_PASSWORD:-difypassword} + ANALYTICDB_HOST: ${ANALYTICDB_HOST:-gp-test.aliyuncs.com} + ANALYTICDB_PORT: ${ANALYTICDB_PORT:-5432} + ANALYTICDB_MIN_CONNECTION: ${ANALYTICDB_MIN_CONNECTION:-1} + ANALYTICDB_MAX_CONNECTION: ${ANALYTICDB_MAX_CONNECTION:-5} + TIDB_VECTOR_HOST: ${TIDB_VECTOR_HOST:-tidb} + TIDB_VECTOR_PORT: ${TIDB_VECTOR_PORT:-4000} + TIDB_VECTOR_USER: ${TIDB_VECTOR_USER:-} + TIDB_VECTOR_PASSWORD: ${TIDB_VECTOR_PASSWORD:-} + TIDB_VECTOR_DATABASE: ${TIDB_VECTOR_DATABASE:-dify} + MATRIXONE_HOST: ${MATRIXONE_HOST:-matrixone} + MATRIXONE_PORT: ${MATRIXONE_PORT:-6001} + MATRIXONE_USER: ${MATRIXONE_USER:-dump} + MATRIXONE_PASSWORD: ${MATRIXONE_PASSWORD:-111} + MATRIXONE_DATABASE: ${MATRIXONE_DATABASE:-dify} + TIDB_ON_QDRANT_URL: ${TIDB_ON_QDRANT_URL:-http://127.0.0.1} + TIDB_ON_QDRANT_API_KEY: ${TIDB_ON_QDRANT_API_KEY:-dify} + TIDB_ON_QDRANT_CLIENT_TIMEOUT: ${TIDB_ON_QDRANT_CLIENT_TIMEOUT:-20} + TIDB_ON_QDRANT_GRPC_ENABLED: ${TIDB_ON_QDRANT_GRPC_ENABLED:-false} + TIDB_ON_QDRANT_GRPC_PORT: ${TIDB_ON_QDRANT_GRPC_PORT:-6334} + TIDB_PUBLIC_KEY: ${TIDB_PUBLIC_KEY:-dify} + TIDB_PRIVATE_KEY: ${TIDB_PRIVATE_KEY:-dify} + TIDB_API_URL: ${TIDB_API_URL:-http://127.0.0.1} + TIDB_IAM_API_URL: ${TIDB_IAM_API_URL:-http://127.0.0.1} + TIDB_REGION: ${TIDB_REGION:-regions/aws-us-east-1} + TIDB_PROJECT_ID: ${TIDB_PROJECT_ID:-dify} + TIDB_SPEND_LIMIT: ${TIDB_SPEND_LIMIT:-100} + CHROMA_HOST: ${CHROMA_HOST:-127.0.0.1} + CHROMA_PORT: ${CHROMA_PORT:-8000} + CHROMA_TENANT: ${CHROMA_TENANT:-default_tenant} + CHROMA_DATABASE: ${CHROMA_DATABASE:-default_database} + CHROMA_AUTH_PROVIDER: ${CHROMA_AUTH_PROVIDER:-chromadb.auth.token_authn.TokenAuthClientProvider} + CHROMA_AUTH_CREDENTIALS: ${CHROMA_AUTH_CREDENTIALS:-} + ORACLE_USER: ${ORACLE_USER:-dify} + ORACLE_PASSWORD: ${ORACLE_PASSWORD:-dify} + ORACLE_DSN: ${ORACLE_DSN:-oracle:1521/FREEPDB1} + ORACLE_CONFIG_DIR: ${ORACLE_CONFIG_DIR:-/app/api/storage/wallet} + ORACLE_WALLET_LOCATION: ${ORACLE_WALLET_LOCATION:-/app/api/storage/wallet} + ORACLE_WALLET_PASSWORD: ${ORACLE_WALLET_PASSWORD:-dify} + ORACLE_IS_AUTONOMOUS: ${ORACLE_IS_AUTONOMOUS:-false} + ALIBABACLOUD_MYSQL_HOST: ${ALIBABACLOUD_MYSQL_HOST:-127.0.0.1} + ALIBABACLOUD_MYSQL_PORT: ${ALIBABACLOUD_MYSQL_PORT:-3306} + ALIBABACLOUD_MYSQL_USER: ${ALIBABACLOUD_MYSQL_USER:-root} + ALIBABACLOUD_MYSQL_PASSWORD: ${ALIBABACLOUD_MYSQL_PASSWORD:-difyai123456} + ALIBABACLOUD_MYSQL_DATABASE: ${ALIBABACLOUD_MYSQL_DATABASE:-dify} + ALIBABACLOUD_MYSQL_MAX_CONNECTION: ${ALIBABACLOUD_MYSQL_MAX_CONNECTION:-5} + ALIBABACLOUD_MYSQL_HNSW_M: ${ALIBABACLOUD_MYSQL_HNSW_M:-6} + RELYT_HOST: ${RELYT_HOST:-db} + RELYT_PORT: ${RELYT_PORT:-5432} + RELYT_USER: ${RELYT_USER:-postgres} + RELYT_PASSWORD: ${RELYT_PASSWORD:-difyai123456} + RELYT_DATABASE: ${RELYT_DATABASE:-postgres} + OPENSEARCH_HOST: ${OPENSEARCH_HOST:-opensearch} + OPENSEARCH_PORT: ${OPENSEARCH_PORT:-9200} + OPENSEARCH_SECURE: ${OPENSEARCH_SECURE:-true} + OPENSEARCH_VERIFY_CERTS: ${OPENSEARCH_VERIFY_CERTS:-true} + OPENSEARCH_AUTH_METHOD: ${OPENSEARCH_AUTH_METHOD:-basic} + OPENSEARCH_USER: ${OPENSEARCH_USER:-admin} + OPENSEARCH_PASSWORD: ${OPENSEARCH_PASSWORD:-admin} + OPENSEARCH_AWS_REGION: ${OPENSEARCH_AWS_REGION:-ap-southeast-1} + OPENSEARCH_AWS_SERVICE: ${OPENSEARCH_AWS_SERVICE:-aoss} + TENCENT_VECTOR_DB_URL: ${TENCENT_VECTOR_DB_URL:-http://127.0.0.1} + TENCENT_VECTOR_DB_API_KEY: ${TENCENT_VECTOR_DB_API_KEY:-dify} + TENCENT_VECTOR_DB_TIMEOUT: ${TENCENT_VECTOR_DB_TIMEOUT:-30} + TENCENT_VECTOR_DB_USERNAME: ${TENCENT_VECTOR_DB_USERNAME:-dify} + TENCENT_VECTOR_DB_DATABASE: ${TENCENT_VECTOR_DB_DATABASE:-dify} + TENCENT_VECTOR_DB_SHARD: ${TENCENT_VECTOR_DB_SHARD:-1} + TENCENT_VECTOR_DB_REPLICAS: ${TENCENT_VECTOR_DB_REPLICAS:-2} + TENCENT_VECTOR_DB_ENABLE_HYBRID_SEARCH: ${TENCENT_VECTOR_DB_ENABLE_HYBRID_SEARCH:-false} + ELASTICSEARCH_HOST: ${ELASTICSEARCH_HOST:-0.0.0.0} + ELASTICSEARCH_PORT: ${ELASTICSEARCH_PORT:-9200} + ELASTICSEARCH_USERNAME: ${ELASTICSEARCH_USERNAME:-elastic} + ELASTICSEARCH_PASSWORD: ${ELASTICSEARCH_PASSWORD:-elastic} + KIBANA_PORT: ${KIBANA_PORT:-5601} + ELASTICSEARCH_USE_CLOUD: ${ELASTICSEARCH_USE_CLOUD:-false} + ELASTICSEARCH_CLOUD_URL: ${ELASTICSEARCH_CLOUD_URL:-YOUR-ELASTICSEARCH_CLOUD_URL} + ELASTICSEARCH_API_KEY: ${ELASTICSEARCH_API_KEY:-YOUR-ELASTICSEARCH_API_KEY} + ELASTICSEARCH_VERIFY_CERTS: ${ELASTICSEARCH_VERIFY_CERTS:-False} + ELASTICSEARCH_CA_CERTS: ${ELASTICSEARCH_CA_CERTS:-} + ELASTICSEARCH_REQUEST_TIMEOUT: ${ELASTICSEARCH_REQUEST_TIMEOUT:-100000} + ELASTICSEARCH_RETRY_ON_TIMEOUT: ${ELASTICSEARCH_RETRY_ON_TIMEOUT:-True} + ELASTICSEARCH_MAX_RETRIES: ${ELASTICSEARCH_MAX_RETRIES:-10} + BAIDU_VECTOR_DB_ENDPOINT: ${BAIDU_VECTOR_DB_ENDPOINT:-http://127.0.0.1:5287} + BAIDU_VECTOR_DB_CONNECTION_TIMEOUT_MS: ${BAIDU_VECTOR_DB_CONNECTION_TIMEOUT_MS:-30000} + BAIDU_VECTOR_DB_ACCOUNT: ${BAIDU_VECTOR_DB_ACCOUNT:-root} + BAIDU_VECTOR_DB_API_KEY: ${BAIDU_VECTOR_DB_API_KEY:-dify} + BAIDU_VECTOR_DB_DATABASE: ${BAIDU_VECTOR_DB_DATABASE:-dify} + BAIDU_VECTOR_DB_SHARD: ${BAIDU_VECTOR_DB_SHARD:-1} + BAIDU_VECTOR_DB_REPLICAS: ${BAIDU_VECTOR_DB_REPLICAS:-3} + BAIDU_VECTOR_DB_INVERTED_INDEX_ANALYZER: ${BAIDU_VECTOR_DB_INVERTED_INDEX_ANALYZER:-DEFAULT_ANALYZER} + BAIDU_VECTOR_DB_INVERTED_INDEX_PARSER_MODE: ${BAIDU_VECTOR_DB_INVERTED_INDEX_PARSER_MODE:-COARSE_MODE} + VIKINGDB_ACCESS_KEY: ${VIKINGDB_ACCESS_KEY:-your-ak} + VIKINGDB_SECRET_KEY: ${VIKINGDB_SECRET_KEY:-your-sk} + VIKINGDB_REGION: ${VIKINGDB_REGION:-cn-shanghai} + VIKINGDB_HOST: ${VIKINGDB_HOST:-api-vikingdb.xxx.volces.com} + VIKINGDB_SCHEMA: ${VIKINGDB_SCHEMA:-http} + VIKINGDB_CONNECTION_TIMEOUT: ${VIKINGDB_CONNECTION_TIMEOUT:-30} + VIKINGDB_SOCKET_TIMEOUT: ${VIKINGDB_SOCKET_TIMEOUT:-30} + LINDORM_URL: ${LINDORM_URL:-http://localhost:30070} + LINDORM_USERNAME: ${LINDORM_USERNAME:-admin} + LINDORM_PASSWORD: ${LINDORM_PASSWORD:-admin} + LINDORM_USING_UGC: ${LINDORM_USING_UGC:-True} + LINDORM_QUERY_TIMEOUT: ${LINDORM_QUERY_TIMEOUT:-1} + OPENGAUSS_HOST: ${OPENGAUSS_HOST:-opengauss} + OPENGAUSS_PORT: ${OPENGAUSS_PORT:-6600} + OPENGAUSS_USER: ${OPENGAUSS_USER:-postgres} + OPENGAUSS_PASSWORD: ${OPENGAUSS_PASSWORD:-Dify@123} + OPENGAUSS_DATABASE: ${OPENGAUSS_DATABASE:-dify} + OPENGAUSS_MIN_CONNECTION: ${OPENGAUSS_MIN_CONNECTION:-1} + OPENGAUSS_MAX_CONNECTION: ${OPENGAUSS_MAX_CONNECTION:-5} + OPENGAUSS_ENABLE_PQ: ${OPENGAUSS_ENABLE_PQ:-false} + HUAWEI_CLOUD_HOSTS: ${HUAWEI_CLOUD_HOSTS:-https://127.0.0.1:9200} + HUAWEI_CLOUD_USER: ${HUAWEI_CLOUD_USER:-admin} + HUAWEI_CLOUD_PASSWORD: ${HUAWEI_CLOUD_PASSWORD:-admin} + UPSTASH_VECTOR_URL: ${UPSTASH_VECTOR_URL:-https://xxx-vector.upstash.io} + UPSTASH_VECTOR_TOKEN: ${UPSTASH_VECTOR_TOKEN:-dify} + TABLESTORE_ENDPOINT: ${TABLESTORE_ENDPOINT:-https://instance-name.cn-hangzhou.ots.aliyuncs.com} + TABLESTORE_INSTANCE_NAME: ${TABLESTORE_INSTANCE_NAME:-instance-name} + TABLESTORE_ACCESS_KEY_ID: ${TABLESTORE_ACCESS_KEY_ID:-xxx} + TABLESTORE_ACCESS_KEY_SECRET: ${TABLESTORE_ACCESS_KEY_SECRET:-xxx} + TABLESTORE_NORMALIZE_FULLTEXT_BM25_SCORE: ${TABLESTORE_NORMALIZE_FULLTEXT_BM25_SCORE:-false} + CLICKZETTA_USERNAME: ${CLICKZETTA_USERNAME:-} + CLICKZETTA_PASSWORD: ${CLICKZETTA_PASSWORD:-} + CLICKZETTA_INSTANCE: ${CLICKZETTA_INSTANCE:-} + CLICKZETTA_SERVICE: ${CLICKZETTA_SERVICE:-api.clickzetta.com} + CLICKZETTA_WORKSPACE: ${CLICKZETTA_WORKSPACE:-quick_start} + CLICKZETTA_VCLUSTER: ${CLICKZETTA_VCLUSTER:-default_ap} + CLICKZETTA_SCHEMA: ${CLICKZETTA_SCHEMA:-dify} + CLICKZETTA_BATCH_SIZE: ${CLICKZETTA_BATCH_SIZE:-100} + CLICKZETTA_ENABLE_INVERTED_INDEX: ${CLICKZETTA_ENABLE_INVERTED_INDEX:-true} + CLICKZETTA_ANALYZER_TYPE: ${CLICKZETTA_ANALYZER_TYPE:-chinese} + CLICKZETTA_ANALYZER_MODE: ${CLICKZETTA_ANALYZER_MODE:-smart} + CLICKZETTA_VECTOR_DISTANCE_FUNCTION: ${CLICKZETTA_VECTOR_DISTANCE_FUNCTION:-cosine_distance} + UPLOAD_FILE_SIZE_LIMIT: ${UPLOAD_FILE_SIZE_LIMIT:-15} + UPLOAD_FILE_BATCH_LIMIT: ${UPLOAD_FILE_BATCH_LIMIT:-5} + UPLOAD_FILE_EXTENSION_BLACKLIST: ${UPLOAD_FILE_EXTENSION_BLACKLIST:-} + SINGLE_CHUNK_ATTACHMENT_LIMIT: ${SINGLE_CHUNK_ATTACHMENT_LIMIT:-10} + IMAGE_FILE_BATCH_LIMIT: ${IMAGE_FILE_BATCH_LIMIT:-10} + ATTACHMENT_IMAGE_FILE_SIZE_LIMIT: ${ATTACHMENT_IMAGE_FILE_SIZE_LIMIT:-2} + ATTACHMENT_IMAGE_DOWNLOAD_TIMEOUT: ${ATTACHMENT_IMAGE_DOWNLOAD_TIMEOUT:-60} + ETL_TYPE: ${ETL_TYPE:-dify} + UNSTRUCTURED_API_URL: ${UNSTRUCTURED_API_URL:-} + UNSTRUCTURED_API_KEY: ${UNSTRUCTURED_API_KEY:-} + SCARF_NO_ANALYTICS: ${SCARF_NO_ANALYTICS:-true} + PROMPT_GENERATION_MAX_TOKENS: ${PROMPT_GENERATION_MAX_TOKENS:-512} + CODE_GENERATION_MAX_TOKENS: ${CODE_GENERATION_MAX_TOKENS:-1024} + PLUGIN_BASED_TOKEN_COUNTING_ENABLED: ${PLUGIN_BASED_TOKEN_COUNTING_ENABLED:-false} + MULTIMODAL_SEND_FORMAT: ${MULTIMODAL_SEND_FORMAT:-base64} + UPLOAD_IMAGE_FILE_SIZE_LIMIT: ${UPLOAD_IMAGE_FILE_SIZE_LIMIT:-10} + UPLOAD_VIDEO_FILE_SIZE_LIMIT: ${UPLOAD_VIDEO_FILE_SIZE_LIMIT:-100} + UPLOAD_AUDIO_FILE_SIZE_LIMIT: ${UPLOAD_AUDIO_FILE_SIZE_LIMIT:-50} + SENTRY_DSN: ${SENTRY_DSN:-} + API_SENTRY_DSN: ${API_SENTRY_DSN:-} + API_SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0} + API_SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0} + WEB_SENTRY_DSN: ${WEB_SENTRY_DSN:-} + PLUGIN_SENTRY_ENABLED: ${PLUGIN_SENTRY_ENABLED:-false} + PLUGIN_SENTRY_DSN: ${PLUGIN_SENTRY_DSN:-} + NOTION_INTEGRATION_TYPE: ${NOTION_INTEGRATION_TYPE:-public} + NOTION_CLIENT_SECRET: ${NOTION_CLIENT_SECRET:-} + NOTION_CLIENT_ID: ${NOTION_CLIENT_ID:-} + NOTION_INTERNAL_SECRET: ${NOTION_INTERNAL_SECRET:-} + MAIL_TYPE: ${MAIL_TYPE:-resend} + MAIL_DEFAULT_SEND_FROM: ${MAIL_DEFAULT_SEND_FROM:-} + RESEND_API_URL: ${RESEND_API_URL:-https://api.resend.com} + RESEND_API_KEY: ${RESEND_API_KEY:-your-resend-api-key} + SMTP_SERVER: ${SMTP_SERVER:-} + SMTP_PORT: ${SMTP_PORT:-465} + SMTP_USERNAME: ${SMTP_USERNAME:-} + SMTP_PASSWORD: ${SMTP_PASSWORD:-} + SMTP_USE_TLS: ${SMTP_USE_TLS:-true} + SMTP_OPPORTUNISTIC_TLS: ${SMTP_OPPORTUNISTIC_TLS:-false} + SENDGRID_API_KEY: ${SENDGRID_API_KEY:-} + INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH: ${INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH:-4000} + INVITE_EXPIRY_HOURS: ${INVITE_EXPIRY_HOURS:-72} + RESET_PASSWORD_TOKEN_EXPIRY_MINUTES: ${RESET_PASSWORD_TOKEN_EXPIRY_MINUTES:-5} + EMAIL_REGISTER_TOKEN_EXPIRY_MINUTES: ${EMAIL_REGISTER_TOKEN_EXPIRY_MINUTES:-5} + CHANGE_EMAIL_TOKEN_EXPIRY_MINUTES: ${CHANGE_EMAIL_TOKEN_EXPIRY_MINUTES:-5} + OWNER_TRANSFER_TOKEN_EXPIRY_MINUTES: ${OWNER_TRANSFER_TOKEN_EXPIRY_MINUTES:-5} + CODE_EXECUTION_ENDPOINT: ${CODE_EXECUTION_ENDPOINT:-http://sandbox:8194} + CODE_EXECUTION_API_KEY: ${CODE_EXECUTION_API_KEY:-dify-sandbox} + CODE_EXECUTION_SSL_VERIFY: ${CODE_EXECUTION_SSL_VERIFY:-True} + CODE_EXECUTION_POOL_MAX_CONNECTIONS: ${CODE_EXECUTION_POOL_MAX_CONNECTIONS:-100} + CODE_EXECUTION_POOL_MAX_KEEPALIVE_CONNECTIONS: ${CODE_EXECUTION_POOL_MAX_KEEPALIVE_CONNECTIONS:-20} + CODE_EXECUTION_POOL_KEEPALIVE_EXPIRY: ${CODE_EXECUTION_POOL_KEEPALIVE_EXPIRY:-5.0} + CODE_MAX_NUMBER: ${CODE_MAX_NUMBER:-9223372036854775807} + CODE_MIN_NUMBER: ${CODE_MIN_NUMBER:--9223372036854775808} + CODE_MAX_DEPTH: ${CODE_MAX_DEPTH:-5} + CODE_MAX_PRECISION: ${CODE_MAX_PRECISION:-20} + CODE_MAX_STRING_LENGTH: ${CODE_MAX_STRING_LENGTH:-400000} + CODE_MAX_STRING_ARRAY_LENGTH: ${CODE_MAX_STRING_ARRAY_LENGTH:-30} + CODE_MAX_OBJECT_ARRAY_LENGTH: ${CODE_MAX_OBJECT_ARRAY_LENGTH:-30} + CODE_MAX_NUMBER_ARRAY_LENGTH: ${CODE_MAX_NUMBER_ARRAY_LENGTH:-1000} + CODE_EXECUTION_CONNECT_TIMEOUT: ${CODE_EXECUTION_CONNECT_TIMEOUT:-10} + CODE_EXECUTION_READ_TIMEOUT: ${CODE_EXECUTION_READ_TIMEOUT:-60} + CODE_EXECUTION_WRITE_TIMEOUT: ${CODE_EXECUTION_WRITE_TIMEOUT:-10} + TEMPLATE_TRANSFORM_MAX_LENGTH: ${TEMPLATE_TRANSFORM_MAX_LENGTH:-400000} + WORKFLOW_MAX_EXECUTION_STEPS: ${WORKFLOW_MAX_EXECUTION_STEPS:-500} + WORKFLOW_MAX_EXECUTION_TIME: ${WORKFLOW_MAX_EXECUTION_TIME:-1200} + WORKFLOW_CALL_MAX_DEPTH: ${WORKFLOW_CALL_MAX_DEPTH:-5} + MAX_VARIABLE_SIZE: ${MAX_VARIABLE_SIZE:-204800} + WORKFLOW_FILE_UPLOAD_LIMIT: ${WORKFLOW_FILE_UPLOAD_LIMIT:-10} + GRAPH_ENGINE_MIN_WORKERS: ${GRAPH_ENGINE_MIN_WORKERS:-1} + GRAPH_ENGINE_MAX_WORKERS: ${GRAPH_ENGINE_MAX_WORKERS:-10} + GRAPH_ENGINE_SCALE_UP_THRESHOLD: ${GRAPH_ENGINE_SCALE_UP_THRESHOLD:-3} + GRAPH_ENGINE_SCALE_DOWN_IDLE_TIME: ${GRAPH_ENGINE_SCALE_DOWN_IDLE_TIME:-5.0} + WORKFLOW_NODE_EXECUTION_STORAGE: ${WORKFLOW_NODE_EXECUTION_STORAGE:-rdbms} + CORE_WORKFLOW_EXECUTION_REPOSITORY: ${CORE_WORKFLOW_EXECUTION_REPOSITORY:-core.repositories.sqlalchemy_workflow_execution_repository.SQLAlchemyWorkflowExecutionRepository} + CORE_WORKFLOW_NODE_EXECUTION_REPOSITORY: ${CORE_WORKFLOW_NODE_EXECUTION_REPOSITORY:-core.repositories.sqlalchemy_workflow_node_execution_repository.SQLAlchemyWorkflowNodeExecutionRepository} + API_WORKFLOW_RUN_REPOSITORY: ${API_WORKFLOW_RUN_REPOSITORY:-repositories.sqlalchemy_api_workflow_run_repository.DifyAPISQLAlchemyWorkflowRunRepository} + API_WORKFLOW_NODE_EXECUTION_REPOSITORY: ${API_WORKFLOW_NODE_EXECUTION_REPOSITORY:-repositories.sqlalchemy_api_workflow_node_execution_repository.DifyAPISQLAlchemyWorkflowNodeExecutionRepository} + WORKFLOW_LOG_CLEANUP_ENABLED: ${WORKFLOW_LOG_CLEANUP_ENABLED:-false} + WORKFLOW_LOG_RETENTION_DAYS: ${WORKFLOW_LOG_RETENTION_DAYS:-30} + WORKFLOW_LOG_CLEANUP_BATCH_SIZE: ${WORKFLOW_LOG_CLEANUP_BATCH_SIZE:-100} + HTTP_REQUEST_NODE_MAX_BINARY_SIZE: ${HTTP_REQUEST_NODE_MAX_BINARY_SIZE:-10485760} + HTTP_REQUEST_NODE_MAX_TEXT_SIZE: ${HTTP_REQUEST_NODE_MAX_TEXT_SIZE:-1048576} + HTTP_REQUEST_NODE_SSL_VERIFY: ${HTTP_REQUEST_NODE_SSL_VERIFY:-True} + HTTP_REQUEST_MAX_CONNECT_TIMEOUT: ${HTTP_REQUEST_MAX_CONNECT_TIMEOUT:-10} + HTTP_REQUEST_MAX_READ_TIMEOUT: ${HTTP_REQUEST_MAX_READ_TIMEOUT:-600} + HTTP_REQUEST_MAX_WRITE_TIMEOUT: ${HTTP_REQUEST_MAX_WRITE_TIMEOUT:-600} + WEBHOOK_REQUEST_BODY_MAX_SIZE: ${WEBHOOK_REQUEST_BODY_MAX_SIZE:-10485760} + RESPECT_XFORWARD_HEADERS_ENABLED: ${RESPECT_XFORWARD_HEADERS_ENABLED:-false} + SSRF_PROXY_HTTP_URL: ${SSRF_PROXY_HTTP_URL:-http://ssrf_proxy:3128} + SSRF_PROXY_HTTPS_URL: ${SSRF_PROXY_HTTPS_URL:-http://ssrf_proxy:3128} + LOOP_NODE_MAX_COUNT: ${LOOP_NODE_MAX_COUNT:-100} + MAX_TOOLS_NUM: ${MAX_TOOLS_NUM:-10} + MAX_PARALLEL_LIMIT: ${MAX_PARALLEL_LIMIT:-10} + MAX_ITERATIONS_NUM: ${MAX_ITERATIONS_NUM:-99} + TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000} + ALLOW_UNSAFE_DATA_SCHEME: ${ALLOW_UNSAFE_DATA_SCHEME:-false} + MAX_TREE_DEPTH: ${MAX_TREE_DEPTH:-50} + PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata} + MYSQL_HOST_VOLUME: ${MYSQL_HOST_VOLUME:-./volumes/mysql/data} + SANDBOX_API_KEY: ${SANDBOX_API_KEY:-dify-sandbox} + SANDBOX_GIN_MODE: ${SANDBOX_GIN_MODE:-release} + SANDBOX_WORKER_TIMEOUT: ${SANDBOX_WORKER_TIMEOUT:-15} + SANDBOX_ENABLE_NETWORK: ${SANDBOX_ENABLE_NETWORK:-true} + SANDBOX_HTTP_PROXY: ${SANDBOX_HTTP_PROXY:-http://ssrf_proxy:3128} + SANDBOX_HTTPS_PROXY: ${SANDBOX_HTTPS_PROXY:-http://ssrf_proxy:3128} + SANDBOX_PORT: ${SANDBOX_PORT:-8194} + WEAVIATE_PERSISTENCE_DATA_PATH: ${WEAVIATE_PERSISTENCE_DATA_PATH:-/var/lib/weaviate} + WEAVIATE_QUERY_DEFAULTS_LIMIT: ${WEAVIATE_QUERY_DEFAULTS_LIMIT:-25} + WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: ${WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED:-true} + WEAVIATE_DEFAULT_VECTORIZER_MODULE: ${WEAVIATE_DEFAULT_VECTORIZER_MODULE:-none} + WEAVIATE_CLUSTER_HOSTNAME: ${WEAVIATE_CLUSTER_HOSTNAME:-node1} + WEAVIATE_AUTHENTICATION_APIKEY_ENABLED: ${WEAVIATE_AUTHENTICATION_APIKEY_ENABLED:-true} + WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS: ${WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS:-WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih} + WEAVIATE_AUTHENTICATION_APIKEY_USERS: ${WEAVIATE_AUTHENTICATION_APIKEY_USERS:-hello@dify.ai} + WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED: ${WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED:-true} + WEAVIATE_AUTHORIZATION_ADMINLIST_USERS: ${WEAVIATE_AUTHORIZATION_ADMINLIST_USERS:-hello@dify.ai} + WEAVIATE_DISABLE_TELEMETRY: ${WEAVIATE_DISABLE_TELEMETRY:-false} + WEAVIATE_ENABLE_TOKENIZER_GSE: ${WEAVIATE_ENABLE_TOKENIZER_GSE:-false} + WEAVIATE_ENABLE_TOKENIZER_KAGOME_JA: ${WEAVIATE_ENABLE_TOKENIZER_KAGOME_JA:-false} + WEAVIATE_ENABLE_TOKENIZER_KAGOME_KR: ${WEAVIATE_ENABLE_TOKENIZER_KAGOME_KR:-false} + CHROMA_SERVER_AUTHN_CREDENTIALS: ${CHROMA_SERVER_AUTHN_CREDENTIALS:-difyai123456} + CHROMA_SERVER_AUTHN_PROVIDER: ${CHROMA_SERVER_AUTHN_PROVIDER:-chromadb.auth.token_authn.TokenAuthenticationServerProvider} + CHROMA_IS_PERSISTENT: ${CHROMA_IS_PERSISTENT:-TRUE} + ORACLE_PWD: ${ORACLE_PWD:-Dify123456} + ORACLE_CHARACTERSET: ${ORACLE_CHARACTERSET:-AL32UTF8} + ETCD_AUTO_COMPACTION_MODE: ${ETCD_AUTO_COMPACTION_MODE:-revision} + ETCD_AUTO_COMPACTION_RETENTION: ${ETCD_AUTO_COMPACTION_RETENTION:-1000} + ETCD_QUOTA_BACKEND_BYTES: ${ETCD_QUOTA_BACKEND_BYTES:-4294967296} + ETCD_SNAPSHOT_COUNT: ${ETCD_SNAPSHOT_COUNT:-50000} + MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minioadmin} + MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-minioadmin} + ETCD_ENDPOINTS: ${ETCD_ENDPOINTS:-etcd:2379} + MINIO_ADDRESS: ${MINIO_ADDRESS:-minio:9000} + MILVUS_AUTHORIZATION_ENABLED: ${MILVUS_AUTHORIZATION_ENABLED:-true} + PGVECTOR_PGUSER: ${PGVECTOR_PGUSER:-postgres} + PGVECTOR_POSTGRES_PASSWORD: ${PGVECTOR_POSTGRES_PASSWORD:-difyai123456} + PGVECTOR_POSTGRES_DB: ${PGVECTOR_POSTGRES_DB:-dify} + PGVECTOR_PGDATA: ${PGVECTOR_PGDATA:-/var/lib/postgresql/data/pgdata} + OPENSEARCH_DISCOVERY_TYPE: ${OPENSEARCH_DISCOVERY_TYPE:-single-node} + OPENSEARCH_BOOTSTRAP_MEMORY_LOCK: ${OPENSEARCH_BOOTSTRAP_MEMORY_LOCK:-true} + OPENSEARCH_JAVA_OPTS_MIN: ${OPENSEARCH_JAVA_OPTS_MIN:-512m} + OPENSEARCH_JAVA_OPTS_MAX: ${OPENSEARCH_JAVA_OPTS_MAX:-1024m} + OPENSEARCH_INITIAL_ADMIN_PASSWORD: ${OPENSEARCH_INITIAL_ADMIN_PASSWORD:-Qazwsxedc!@#123} + OPENSEARCH_MEMLOCK_SOFT: ${OPENSEARCH_MEMLOCK_SOFT:--1} + OPENSEARCH_MEMLOCK_HARD: ${OPENSEARCH_MEMLOCK_HARD:--1} + OPENSEARCH_NOFILE_SOFT: ${OPENSEARCH_NOFILE_SOFT:-65536} + OPENSEARCH_NOFILE_HARD: ${OPENSEARCH_NOFILE_HARD:-65536} + NGINX_SERVER_NAME: ${NGINX_SERVER_NAME:-_} + NGINX_HTTPS_ENABLED: ${NGINX_HTTPS_ENABLED:-false} + NGINX_PORT: ${NGINX_PORT:-80} + NGINX_SSL_PORT: ${NGINX_SSL_PORT:-443} + NGINX_SSL_CERT_FILENAME: ${NGINX_SSL_CERT_FILENAME:-dify.crt} + NGINX_SSL_CERT_KEY_FILENAME: ${NGINX_SSL_CERT_KEY_FILENAME:-dify.key} + NGINX_SSL_PROTOCOLS: ${NGINX_SSL_PROTOCOLS:-TLSv1.1 TLSv1.2 TLSv1.3} + NGINX_WORKER_PROCESSES: ${NGINX_WORKER_PROCESSES:-auto} + NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-100M} + NGINX_KEEPALIVE_TIMEOUT: ${NGINX_KEEPALIVE_TIMEOUT:-65} + NGINX_PROXY_READ_TIMEOUT: ${NGINX_PROXY_READ_TIMEOUT:-3600s} + NGINX_PROXY_SEND_TIMEOUT: ${NGINX_PROXY_SEND_TIMEOUT:-3600s} + NGINX_ENABLE_CERTBOT_CHALLENGE: ${NGINX_ENABLE_CERTBOT_CHALLENGE:-false} + CERTBOT_EMAIL: ${CERTBOT_EMAIL:-your_email@example.com} + CERTBOT_DOMAIN: ${CERTBOT_DOMAIN:-your_domain.com} + CERTBOT_OPTIONS: ${CERTBOT_OPTIONS:-} + SSRF_HTTP_PORT: ${SSRF_HTTP_PORT:-3128} + SSRF_COREDUMP_DIR: ${SSRF_COREDUMP_DIR:-/var/spool/squid} + SSRF_REVERSE_PROXY_PORT: ${SSRF_REVERSE_PROXY_PORT:-8194} + SSRF_SANDBOX_HOST: ${SSRF_SANDBOX_HOST:-sandbox} + SSRF_DEFAULT_TIME_OUT: ${SSRF_DEFAULT_TIME_OUT:-5} + SSRF_DEFAULT_CONNECT_TIME_OUT: ${SSRF_DEFAULT_CONNECT_TIME_OUT:-5} + SSRF_DEFAULT_READ_TIME_OUT: ${SSRF_DEFAULT_READ_TIME_OUT:-5} + SSRF_DEFAULT_WRITE_TIME_OUT: ${SSRF_DEFAULT_WRITE_TIME_OUT:-5} + SSRF_POOL_MAX_CONNECTIONS: ${SSRF_POOL_MAX_CONNECTIONS:-100} + SSRF_POOL_MAX_KEEPALIVE_CONNECTIONS: ${SSRF_POOL_MAX_KEEPALIVE_CONNECTIONS:-20} + SSRF_POOL_KEEPALIVE_EXPIRY: ${SSRF_POOL_KEEPALIVE_EXPIRY:-5.0} + EXPOSE_NGINX_PORT: ${EXPOSE_NGINX_PORT:-80} + EXPOSE_NGINX_SSL_PORT: ${EXPOSE_NGINX_SSL_PORT:-443} + POSITION_TOOL_PINS: ${POSITION_TOOL_PINS:-} + POSITION_TOOL_INCLUDES: ${POSITION_TOOL_INCLUDES:-} + POSITION_TOOL_EXCLUDES: ${POSITION_TOOL_EXCLUDES:-} + POSITION_PROVIDER_PINS: ${POSITION_PROVIDER_PINS:-} + POSITION_PROVIDER_INCLUDES: ${POSITION_PROVIDER_INCLUDES:-} + POSITION_PROVIDER_EXCLUDES: ${POSITION_PROVIDER_EXCLUDES:-} + CSP_WHITELIST: ${CSP_WHITELIST:-} + CREATE_TIDB_SERVICE_JOB_ENABLED: ${CREATE_TIDB_SERVICE_JOB_ENABLED:-false} + MAX_SUBMIT_COUNT: ${MAX_SUBMIT_COUNT:-100} + TOP_K_MAX_VALUE: ${TOP_K_MAX_VALUE:-10} + DB_PLUGIN_DATABASE: ${DB_PLUGIN_DATABASE:-dify_plugin} + EXPOSE_PLUGIN_DAEMON_PORT: ${EXPOSE_PLUGIN_DAEMON_PORT:-5002} + PLUGIN_DAEMON_PORT: ${PLUGIN_DAEMON_PORT:-5002} + PLUGIN_DAEMON_KEY: ${PLUGIN_DAEMON_KEY:-lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi} + PLUGIN_DAEMON_URL: ${PLUGIN_DAEMON_URL:-http://plugin_daemon:5002} + PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} + PLUGIN_PPROF_ENABLED: ${PLUGIN_PPROF_ENABLED:-false} + PLUGIN_DEBUGGING_HOST: ${PLUGIN_DEBUGGING_HOST:-0.0.0.0} + PLUGIN_DEBUGGING_PORT: ${PLUGIN_DEBUGGING_PORT:-5003} + EXPOSE_PLUGIN_DEBUGGING_HOST: ${EXPOSE_PLUGIN_DEBUGGING_HOST:-localhost} + EXPOSE_PLUGIN_DEBUGGING_PORT: ${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003} + PLUGIN_DIFY_INNER_API_KEY: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1} + PLUGIN_DIFY_INNER_API_URL: ${PLUGIN_DIFY_INNER_API_URL:-http://api:5001} + ENDPOINT_URL_TEMPLATE: ${ENDPOINT_URL_TEMPLATE:-http://localhost/e/{hook_id}} + MARKETPLACE_ENABLED: ${MARKETPLACE_ENABLED:-true} + MARKETPLACE_API_URL: ${MARKETPLACE_API_URL:-https://marketplace.dify.ai} + FORCE_VERIFYING_SIGNATURE: ${FORCE_VERIFYING_SIGNATURE:-true} + ENFORCE_LANGGENIUS_PLUGIN_SIGNATURES: ${ENFORCE_LANGGENIUS_PLUGIN_SIGNATURES:-true} + PLUGIN_STDIO_BUFFER_SIZE: ${PLUGIN_STDIO_BUFFER_SIZE:-1024} + PLUGIN_STDIO_MAX_BUFFER_SIZE: ${PLUGIN_STDIO_MAX_BUFFER_SIZE:-5242880} + PLUGIN_PYTHON_ENV_INIT_TIMEOUT: ${PLUGIN_PYTHON_ENV_INIT_TIMEOUT:-120} + PLUGIN_MAX_EXECUTION_TIMEOUT: ${PLUGIN_MAX_EXECUTION_TIMEOUT:-600} + PIP_MIRROR_URL: ${PIP_MIRROR_URL:-} + PLUGIN_STORAGE_TYPE: ${PLUGIN_STORAGE_TYPE:-local} + PLUGIN_STORAGE_LOCAL_ROOT: ${PLUGIN_STORAGE_LOCAL_ROOT:-/app/storage} + PLUGIN_WORKING_PATH: ${PLUGIN_WORKING_PATH:-/app/storage/cwd} + PLUGIN_INSTALLED_PATH: ${PLUGIN_INSTALLED_PATH:-plugin} + PLUGIN_PACKAGE_CACHE_PATH: ${PLUGIN_PACKAGE_CACHE_PATH:-plugin_packages} + PLUGIN_MEDIA_CACHE_PATH: ${PLUGIN_MEDIA_CACHE_PATH:-assets} + PLUGIN_STORAGE_OSS_BUCKET: ${PLUGIN_STORAGE_OSS_BUCKET:-} + PLUGIN_S3_USE_AWS: ${PLUGIN_S3_USE_AWS:-false} + PLUGIN_S3_USE_AWS_MANAGED_IAM: ${PLUGIN_S3_USE_AWS_MANAGED_IAM:-false} + PLUGIN_S3_ENDPOINT: ${PLUGIN_S3_ENDPOINT:-} + PLUGIN_S3_USE_PATH_STYLE: ${PLUGIN_S3_USE_PATH_STYLE:-false} + PLUGIN_AWS_ACCESS_KEY: ${PLUGIN_AWS_ACCESS_KEY:-} + PLUGIN_AWS_SECRET_KEY: ${PLUGIN_AWS_SECRET_KEY:-} + PLUGIN_AWS_REGION: ${PLUGIN_AWS_REGION:-} + PLUGIN_AZURE_BLOB_STORAGE_CONTAINER_NAME: ${PLUGIN_AZURE_BLOB_STORAGE_CONTAINER_NAME:-} + PLUGIN_AZURE_BLOB_STORAGE_CONNECTION_STRING: ${PLUGIN_AZURE_BLOB_STORAGE_CONNECTION_STRING:-} + PLUGIN_TENCENT_COS_SECRET_KEY: ${PLUGIN_TENCENT_COS_SECRET_KEY:-} + PLUGIN_TENCENT_COS_SECRET_ID: ${PLUGIN_TENCENT_COS_SECRET_ID:-} + PLUGIN_TENCENT_COS_REGION: ${PLUGIN_TENCENT_COS_REGION:-} + PLUGIN_ALIYUN_OSS_REGION: ${PLUGIN_ALIYUN_OSS_REGION:-} + PLUGIN_ALIYUN_OSS_ENDPOINT: ${PLUGIN_ALIYUN_OSS_ENDPOINT:-} + PLUGIN_ALIYUN_OSS_ACCESS_KEY_ID: ${PLUGIN_ALIYUN_OSS_ACCESS_KEY_ID:-} + PLUGIN_ALIYUN_OSS_ACCESS_KEY_SECRET: ${PLUGIN_ALIYUN_OSS_ACCESS_KEY_SECRET:-} + PLUGIN_ALIYUN_OSS_AUTH_VERSION: ${PLUGIN_ALIYUN_OSS_AUTH_VERSION:-v4} + PLUGIN_ALIYUN_OSS_PATH: ${PLUGIN_ALIYUN_OSS_PATH:-} + PLUGIN_VOLCENGINE_TOS_ENDPOINT: ${PLUGIN_VOLCENGINE_TOS_ENDPOINT:-} + PLUGIN_VOLCENGINE_TOS_ACCESS_KEY: ${PLUGIN_VOLCENGINE_TOS_ACCESS_KEY:-} + PLUGIN_VOLCENGINE_TOS_SECRET_KEY: ${PLUGIN_VOLCENGINE_TOS_SECRET_KEY:-} + PLUGIN_VOLCENGINE_TOS_REGION: ${PLUGIN_VOLCENGINE_TOS_REGION:-} + ENABLE_OTEL: ${ENABLE_OTEL:-false} + OTLP_TRACE_ENDPOINT: ${OTLP_TRACE_ENDPOINT:-} + OTLP_METRIC_ENDPOINT: ${OTLP_METRIC_ENDPOINT:-} + OTLP_BASE_ENDPOINT: ${OTLP_BASE_ENDPOINT:-http://localhost:4318} + OTLP_API_KEY: ${OTLP_API_KEY:-} + OTEL_EXPORTER_OTLP_PROTOCOL: ${OTEL_EXPORTER_OTLP_PROTOCOL:-} + OTEL_EXPORTER_TYPE: ${OTEL_EXPORTER_TYPE:-otlp} + OTEL_SAMPLING_RATE: ${OTEL_SAMPLING_RATE:-0.1} + OTEL_BATCH_EXPORT_SCHEDULE_DELAY: ${OTEL_BATCH_EXPORT_SCHEDULE_DELAY:-5000} + OTEL_MAX_QUEUE_SIZE: ${OTEL_MAX_QUEUE_SIZE:-2048} + OTEL_MAX_EXPORT_BATCH_SIZE: ${OTEL_MAX_EXPORT_BATCH_SIZE:-512} + OTEL_METRIC_EXPORT_INTERVAL: ${OTEL_METRIC_EXPORT_INTERVAL:-60000} + OTEL_BATCH_EXPORT_TIMEOUT: ${OTEL_BATCH_EXPORT_TIMEOUT:-10000} + OTEL_METRIC_EXPORT_TIMEOUT: ${OTEL_METRIC_EXPORT_TIMEOUT:-30000} + ALLOW_EMBED: ${ALLOW_EMBED:-false} + QUEUE_MONITOR_THRESHOLD: ${QUEUE_MONITOR_THRESHOLD:-200} + QUEUE_MONITOR_ALERT_EMAILS: ${QUEUE_MONITOR_ALERT_EMAILS:-} + QUEUE_MONITOR_INTERVAL: ${QUEUE_MONITOR_INTERVAL:-30} + SWAGGER_UI_ENABLED: ${SWAGGER_UI_ENABLED:-true} + SWAGGER_UI_PATH: ${SWAGGER_UI_PATH:-/swagger-ui.html} + DSL_EXPORT_ENCRYPT_DATASET_ID: ${DSL_EXPORT_ENCRYPT_DATASET_ID:-true} + DATASET_MAX_SEGMENTS_PER_REQUEST: ${DATASET_MAX_SEGMENTS_PER_REQUEST:-0} + ENABLE_CLEAN_EMBEDDING_CACHE_TASK: ${ENABLE_CLEAN_EMBEDDING_CACHE_TASK:-false} + ENABLE_CLEAN_UNUSED_DATASETS_TASK: ${ENABLE_CLEAN_UNUSED_DATASETS_TASK:-false} + ENABLE_CREATE_TIDB_SERVERLESS_TASK: ${ENABLE_CREATE_TIDB_SERVERLESS_TASK:-false} + ENABLE_UPDATE_TIDB_SERVERLESS_STATUS_TASK: ${ENABLE_UPDATE_TIDB_SERVERLESS_STATUS_TASK:-false} + ENABLE_CLEAN_MESSAGES: ${ENABLE_CLEAN_MESSAGES:-false} + ENABLE_MAIL_CLEAN_DOCUMENT_NOTIFY_TASK: ${ENABLE_MAIL_CLEAN_DOCUMENT_NOTIFY_TASK:-false} + ENABLE_DATASETS_QUEUE_MONITOR: ${ENABLE_DATASETS_QUEUE_MONITOR:-false} + ENABLE_CHECK_UPGRADABLE_PLUGIN_TASK: ${ENABLE_CHECK_UPGRADABLE_PLUGIN_TASK:-true} + ENABLE_WORKFLOW_SCHEDULE_POLLER_TASK: ${ENABLE_WORKFLOW_SCHEDULE_POLLER_TASK:-true} + WORKFLOW_SCHEDULE_POLLER_INTERVAL: ${WORKFLOW_SCHEDULE_POLLER_INTERVAL:-1} + WORKFLOW_SCHEDULE_POLLER_BATCH_SIZE: ${WORKFLOW_SCHEDULE_POLLER_BATCH_SIZE:-100} + WORKFLOW_SCHEDULE_MAX_DISPATCH_PER_TICK: ${WORKFLOW_SCHEDULE_MAX_DISPATCH_PER_TICK:-0} + TENANT_ISOLATED_TASK_CONCURRENCY: ${TENANT_ISOLATED_TASK_CONCURRENCY:-1} + AMPLITUDE_API_KEY: ${AMPLITUDE_API_KEY:-} + +services: + # Init container to fix permissions + init_permissions: + image: busybox:latest + command: + - sh + - -c + - | + FLAG_FILE="/app/api/storage/.init_permissions" + if [ -f "$${FLAG_FILE}" ]; then + echo "Permissions already initialized. Exiting." + exit 0 + fi + echo "Initializing permissions for /app/api/storage" + chown -R 1001:1001 /app/api/storage && touch "$${FLAG_FILE}" + echo "Permissions initialized. Exiting." + volumes: + - ./volumes/app/storage:/app/api/storage + restart: "no" + + # API service + api: + image: langgenius/dify-api:1.11.1 + restart: always + environment: + # Use the shared environment variables. + <<: *shared-api-worker-env + # Startup mode, 'api' starts the API server. + MODE: api + SENTRY_DSN: ${API_SENTRY_DSN:-} + SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0} + SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0} + PLUGIN_REMOTE_INSTALL_HOST: ${EXPOSE_PLUGIN_DEBUGGING_HOST:-localhost} + PLUGIN_REMOTE_INSTALL_PORT: ${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003} + PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} + INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1} + depends_on: + init_permissions: + condition: service_completed_successfully + db_postgres: + condition: service_healthy + required: false + db_mysql: + condition: service_healthy + required: false + oceanbase: + condition: service_healthy + required: false + seekdb: + condition: service_healthy + required: false + redis: + condition: service_started + volumes: + # Mount the storage directory to the container, for storing user files. + - ./volumes/app/storage:/app/api/storage + networks: + - ssrf_proxy_network + - default + + # worker service + # The Celery worker for processing all queues (dataset, workflow, mail, etc.) + worker: + image: langgenius/dify-api:1.11.1 + restart: always + environment: + # Use the shared environment variables. + <<: *shared-api-worker-env + # Startup mode, 'worker' starts the Celery worker for processing all queues. + MODE: worker + SENTRY_DSN: ${API_SENTRY_DSN:-} + SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0} + SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0} + PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} + INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1} + depends_on: + init_permissions: + condition: service_completed_successfully + db_postgres: + condition: service_healthy + required: false + db_mysql: + condition: service_healthy + required: false + oceanbase: + condition: service_healthy + required: false + seekdb: + condition: service_healthy + required: false + redis: + condition: service_started + volumes: + # Mount the storage directory to the container, for storing user files. + - ./volumes/app/storage:/app/api/storage + networks: + - ssrf_proxy_network + - default + + # worker_beat service + # Celery beat for scheduling periodic tasks. + worker_beat: + image: langgenius/dify-api:1.11.1 + restart: always + environment: + # Use the shared environment variables. + <<: *shared-api-worker-env + # Startup mode, 'worker_beat' starts the Celery beat for scheduling periodic tasks. + MODE: beat + depends_on: + init_permissions: + condition: service_completed_successfully + db_postgres: + condition: service_healthy + required: false + db_mysql: + condition: service_healthy + required: false + oceanbase: + condition: service_healthy + required: false + seekdb: + condition: service_healthy + required: false + redis: + condition: service_started + networks: + - ssrf_proxy_network + - default + + # Frontend web application. + web: + image: langgenius/dify-web:1.11.1 + restart: always + environment: + CONSOLE_API_URL: ${CONSOLE_API_URL:-} + APP_API_URL: ${APP_API_URL:-} + AMPLITUDE_API_KEY: ${AMPLITUDE_API_KEY:-} + NEXT_PUBLIC_COOKIE_DOMAIN: ${NEXT_PUBLIC_COOKIE_DOMAIN:-} + SENTRY_DSN: ${WEB_SENTRY_DSN:-} + NEXT_TELEMETRY_DISABLED: ${NEXT_TELEMETRY_DISABLED:-0} + TEXT_GENERATION_TIMEOUT_MS: ${TEXT_GENERATION_TIMEOUT_MS:-60000} + CSP_WHITELIST: ${CSP_WHITELIST:-} + ALLOW_EMBED: ${ALLOW_EMBED:-false} + ALLOW_UNSAFE_DATA_SCHEME: ${ALLOW_UNSAFE_DATA_SCHEME:-false} + MARKETPLACE_API_URL: ${MARKETPLACE_API_URL:-https://marketplace.dify.ai} + MARKETPLACE_URL: ${MARKETPLACE_URL:-https://marketplace.dify.ai} + TOP_K_MAX_VALUE: ${TOP_K_MAX_VALUE:-} + INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH: ${INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH:-} + PM2_INSTANCES: ${PM2_INSTANCES:-2} + LOOP_NODE_MAX_COUNT: ${LOOP_NODE_MAX_COUNT:-100} + MAX_TOOLS_NUM: ${MAX_TOOLS_NUM:-10} + MAX_PARALLEL_LIMIT: ${MAX_PARALLEL_LIMIT:-10} + MAX_ITERATIONS_NUM: ${MAX_ITERATIONS_NUM:-99} + MAX_TREE_DEPTH: ${MAX_TREE_DEPTH:-50} + ENABLE_WEBSITE_JINAREADER: ${ENABLE_WEBSITE_JINAREADER:-true} + ENABLE_WEBSITE_FIRECRAWL: ${ENABLE_WEBSITE_FIRECRAWL:-true} + ENABLE_WEBSITE_WATERCRAWL: ${ENABLE_WEBSITE_WATERCRAWL:-true} + + # The PostgreSQL database. + db_postgres: + image: postgres:15-alpine + # profiles: + # - postgresql + restart: always + environment: + POSTGRES_USER: ${DB_USERNAME:-postgres} + POSTGRES_PASSWORD: ${DB_PASSWORD:-difyai123456} + POSTGRES_DB: ${DB_DATABASE:-dify} + PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata} + command: > + postgres -c 'max_connections=${POSTGRES_MAX_CONNECTIONS:-100}' + -c 'shared_buffers=${POSTGRES_SHARED_BUFFERS:-128MB}' + -c 'work_mem=${POSTGRES_WORK_MEM:-4MB}' + -c 'maintenance_work_mem=${POSTGRES_MAINTENANCE_WORK_MEM:-64MB}' + -c 'effective_cache_size=${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB}' + -c 'statement_timeout=${POSTGRES_STATEMENT_TIMEOUT:-0}' + -c 'idle_in_transaction_session_timeout=${POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT:-0}' + volumes: + - ./volumes/db/data:/var/lib/postgresql/data + healthcheck: + test: + [ + "CMD", + "pg_isready", + "-h", + "db_postgres", + "-U", + "${DB_USERNAME:-postgres}", + "-d", + "${DB_DATABASE:-dify}", + ] + interval: 1s + timeout: 3s + retries: 60 + + # The mysql database. + db_mysql: + image: mysql:8.0 + profiles: + - mysql + restart: always + environment: + MYSQL_ROOT_PASSWORD: ${DB_PASSWORD:-difyai123456} + MYSQL_DATABASE: ${DB_DATABASE:-dify} + command: > + --max_connections=1000 + --innodb_buffer_pool_size=${MYSQL_INNODB_BUFFER_POOL_SIZE:-512M} + --innodb_log_file_size=${MYSQL_INNODB_LOG_FILE_SIZE:-128M} + --innodb_flush_log_at_trx_commit=${MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT:-2} + volumes: + - ${MYSQL_HOST_VOLUME:-./volumes/mysql/data}:/var/lib/mysql + healthcheck: + test: + [ + "CMD", + "mysqladmin", + "ping", + "-u", + "root", + "-p${DB_PASSWORD:-difyai123456}", + ] + interval: 1s + timeout: 3s + retries: 30 + + # The redis cache. + redis: + image: redis:6-alpine + restart: always + environment: + REDISCLI_AUTH: ${REDIS_PASSWORD:-difyai123456} + volumes: + # Mount the redis data directory to the container. + - ./volumes/redis/data:/data + # Set the redis password when startup redis server. + command: redis-server --requirepass ${REDIS_PASSWORD:-difyai123456} + healthcheck: + test: + [ + "CMD-SHELL", + "redis-cli -a ${REDIS_PASSWORD:-difyai123456} ping | grep -q PONG", + ] + + # The DifySandbox + sandbox: + image: langgenius/dify-sandbox:0.2.12 + restart: always + environment: + # The DifySandbox configurations + # Make sure you are changing this key for your deployment with a strong key. + # You can generate a strong key using `openssl rand -base64 42`. + API_KEY: ${SANDBOX_API_KEY:-dify-sandbox} + GIN_MODE: ${SANDBOX_GIN_MODE:-release} + WORKER_TIMEOUT: ${SANDBOX_WORKER_TIMEOUT:-15} + ENABLE_NETWORK: ${SANDBOX_ENABLE_NETWORK:-true} + HTTP_PROXY: ${SANDBOX_HTTP_PROXY:-http://ssrf_proxy:3128} + HTTPS_PROXY: ${SANDBOX_HTTPS_PROXY:-http://ssrf_proxy:3128} + SANDBOX_PORT: ${SANDBOX_PORT:-8194} + PIP_MIRROR_URL: ${PIP_MIRROR_URL:-} + volumes: + - ./volumes/sandbox/dependencies:/dependencies + - ./volumes/sandbox/conf:/conf + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8194/health"] + networks: + - ssrf_proxy_network + + # plugin daemon + plugin_daemon: + image: langgenius/dify-plugin-daemon:0.5.1-local + restart: always + environment: + # Use the shared environment variables. + <<: *shared-api-worker-env + DB_DATABASE: ${DB_PLUGIN_DATABASE:-dify_plugin} + SERVER_PORT: ${PLUGIN_DAEMON_PORT:-5002} + SERVER_KEY: ${PLUGIN_DAEMON_KEY:-lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi} + MAX_PLUGIN_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800} + PPROF_ENABLED: ${PLUGIN_PPROF_ENABLED:-false} + DIFY_INNER_API_URL: ${PLUGIN_DIFY_INNER_API_URL:-http://api:5001} + DIFY_INNER_API_KEY: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1} + PLUGIN_REMOTE_INSTALLING_HOST: ${PLUGIN_DEBUGGING_HOST:-0.0.0.0} + PLUGIN_REMOTE_INSTALLING_PORT: ${PLUGIN_DEBUGGING_PORT:-5003} + PLUGIN_WORKING_PATH: ${PLUGIN_WORKING_PATH:-/app/storage/cwd} + FORCE_VERIFYING_SIGNATURE: ${FORCE_VERIFYING_SIGNATURE:-true} + PYTHON_ENV_INIT_TIMEOUT: ${PLUGIN_PYTHON_ENV_INIT_TIMEOUT:-120} + PLUGIN_MAX_EXECUTION_TIMEOUT: ${PLUGIN_MAX_EXECUTION_TIMEOUT:-600} + PLUGIN_STDIO_BUFFER_SIZE: ${PLUGIN_STDIO_BUFFER_SIZE:-1024} + PLUGIN_STDIO_MAX_BUFFER_SIZE: ${PLUGIN_STDIO_MAX_BUFFER_SIZE:-5242880} + PIP_MIRROR_URL: ${PIP_MIRROR_URL:-} + PLUGIN_STORAGE_TYPE: ${PLUGIN_STORAGE_TYPE:-local} + PLUGIN_STORAGE_LOCAL_ROOT: ${PLUGIN_STORAGE_LOCAL_ROOT:-/app/storage} + PLUGIN_INSTALLED_PATH: ${PLUGIN_INSTALLED_PATH:-plugin} + PLUGIN_PACKAGE_CACHE_PATH: ${PLUGIN_PACKAGE_CACHE_PATH:-plugin_packages} + PLUGIN_MEDIA_CACHE_PATH: ${PLUGIN_MEDIA_CACHE_PATH:-assets} + PLUGIN_STORAGE_OSS_BUCKET: ${PLUGIN_STORAGE_OSS_BUCKET:-} + S3_USE_AWS_MANAGED_IAM: ${PLUGIN_S3_USE_AWS_MANAGED_IAM:-false} + S3_USE_AWS: ${PLUGIN_S3_USE_AWS:-false} + S3_ENDPOINT: ${PLUGIN_S3_ENDPOINT:-} + S3_USE_PATH_STYLE: ${PLUGIN_S3_USE_PATH_STYLE:-false} + AWS_ACCESS_KEY: ${PLUGIN_AWS_ACCESS_KEY:-} + AWS_SECRET_KEY: ${PLUGIN_AWS_SECRET_KEY:-} + AWS_REGION: ${PLUGIN_AWS_REGION:-} + AZURE_BLOB_STORAGE_CONNECTION_STRING: ${PLUGIN_AZURE_BLOB_STORAGE_CONNECTION_STRING:-} + AZURE_BLOB_STORAGE_CONTAINER_NAME: ${PLUGIN_AZURE_BLOB_STORAGE_CONTAINER_NAME:-} + TENCENT_COS_SECRET_KEY: ${PLUGIN_TENCENT_COS_SECRET_KEY:-} + TENCENT_COS_SECRET_ID: ${PLUGIN_TENCENT_COS_SECRET_ID:-} + TENCENT_COS_REGION: ${PLUGIN_TENCENT_COS_REGION:-} + ALIYUN_OSS_REGION: ${PLUGIN_ALIYUN_OSS_REGION:-} + ALIYUN_OSS_ENDPOINT: ${PLUGIN_ALIYUN_OSS_ENDPOINT:-} + ALIYUN_OSS_ACCESS_KEY_ID: ${PLUGIN_ALIYUN_OSS_ACCESS_KEY_ID:-} + ALIYUN_OSS_ACCESS_KEY_SECRET: ${PLUGIN_ALIYUN_OSS_ACCESS_KEY_SECRET:-} + ALIYUN_OSS_AUTH_VERSION: ${PLUGIN_ALIYUN_OSS_AUTH_VERSION:-v4} + ALIYUN_OSS_PATH: ${PLUGIN_ALIYUN_OSS_PATH:-} + VOLCENGINE_TOS_ENDPOINT: ${PLUGIN_VOLCENGINE_TOS_ENDPOINT:-} + VOLCENGINE_TOS_ACCESS_KEY: ${PLUGIN_VOLCENGINE_TOS_ACCESS_KEY:-} + VOLCENGINE_TOS_SECRET_KEY: ${PLUGIN_VOLCENGINE_TOS_SECRET_KEY:-} + VOLCENGINE_TOS_REGION: ${PLUGIN_VOLCENGINE_TOS_REGION:-} + SENTRY_ENABLED: ${PLUGIN_SENTRY_ENABLED:-false} + SENTRY_DSN: ${PLUGIN_SENTRY_DSN:-} + ports: + - "${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003}:${PLUGIN_DEBUGGING_PORT:-5003}" + volumes: + - ./volumes/plugin_daemon:/app/storage + depends_on: + db_postgres: + condition: service_healthy + required: false + db_mysql: + condition: service_healthy + required: false + oceanbase: + condition: service_healthy + required: false + seekdb: + condition: service_healthy + required: false + + # ssrf_proxy server + # for more information, please refer to + # https://docs.dify.ai/learn-more/faq/install-faq#18-why-is-ssrf-proxy-needed%3F + ssrf_proxy: + image: ubuntu/squid:latest + restart: always + volumes: + - ./ssrf_proxy/squid.conf.template:/etc/squid/squid.conf.template + - ./ssrf_proxy/docker-entrypoint.sh:/docker-entrypoint-mount.sh + entrypoint: + [ + "sh", + "-c", + "cp /docker-entrypoint-mount.sh /docker-entrypoint.sh && sed -i 's/\r$$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh", + ] + environment: + # pls clearly modify the squid env vars to fit your network environment. + HTTP_PORT: ${SSRF_HTTP_PORT:-3128} + COREDUMP_DIR: ${SSRF_COREDUMP_DIR:-/var/spool/squid} + REVERSE_PROXY_PORT: ${SSRF_REVERSE_PROXY_PORT:-8194} + SANDBOX_HOST: ${SSRF_SANDBOX_HOST:-sandbox} + SANDBOX_PORT: ${SANDBOX_PORT:-8194} + networks: + - ssrf_proxy_network + - default + + # Certbot service + # use `docker-compose --profile certbot up` to start the certbot service. + certbot: + image: certbot/certbot + profiles: + - certbot + volumes: + - ./volumes/certbot/conf:/etc/letsencrypt + - ./volumes/certbot/www:/var/www/html + - ./volumes/certbot/logs:/var/log/letsencrypt + - ./volumes/certbot/conf/live:/etc/letsencrypt/live + - ./certbot/update-cert.template.txt:/update-cert.template.txt + - ./certbot/docker-entrypoint.sh:/docker-entrypoint.sh + environment: + - CERTBOT_EMAIL=${CERTBOT_EMAIL} + - CERTBOT_DOMAIN=${CERTBOT_DOMAIN} + - CERTBOT_OPTIONS=${CERTBOT_OPTIONS:-} + entrypoint: ["/docker-entrypoint.sh"] + command: ["tail", "-f", "/dev/null"] + + # The nginx reverse proxy. + # used for reverse proxying the API service and Web service. + nginx: + image: nginx:latest + restart: always + volumes: + - ./nginx/nginx.conf.template:/etc/nginx/nginx.conf.template + - ./nginx/proxy.conf.template:/etc/nginx/proxy.conf.template + - ./nginx/https.conf.template:/etc/nginx/https.conf.template + - ./nginx/conf.d:/etc/nginx/conf.d + - ./nginx/docker-entrypoint.sh:/docker-entrypoint-mount.sh + - ./nginx/ssl:/etc/ssl # cert dir (legacy) + - ./volumes/certbot/conf/live:/etc/letsencrypt/live # cert dir (with certbot container) + - ./volumes/certbot/conf:/etc/letsencrypt + - ./volumes/certbot/www:/var/www/html + entrypoint: + [ + "sh", + "-c", + "cp /docker-entrypoint-mount.sh /docker-entrypoint.sh && sed -i 's/\r$$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh", + ] + environment: + NGINX_SERVER_NAME: ${NGINX_SERVER_NAME:-_} + NGINX_HTTPS_ENABLED: ${NGINX_HTTPS_ENABLED:-false} + NGINX_SSL_PORT: ${NGINX_SSL_PORT:-443} + NGINX_PORT: ${NGINX_PORT:-80} + # You're required to add your own SSL certificates/keys to the `./nginx/ssl` directory + # and modify the env vars below in .env if HTTPS_ENABLED is true. + NGINX_SSL_CERT_FILENAME: ${NGINX_SSL_CERT_FILENAME:-dify.crt} + NGINX_SSL_CERT_KEY_FILENAME: ${NGINX_SSL_CERT_KEY_FILENAME:-dify.key} + NGINX_SSL_PROTOCOLS: ${NGINX_SSL_PROTOCOLS:-TLSv1.1 TLSv1.2 TLSv1.3} + NGINX_WORKER_PROCESSES: ${NGINX_WORKER_PROCESSES:-auto} + NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-100M} + NGINX_KEEPALIVE_TIMEOUT: ${NGINX_KEEPALIVE_TIMEOUT:-65} + NGINX_PROXY_READ_TIMEOUT: ${NGINX_PROXY_READ_TIMEOUT:-3600s} + NGINX_PROXY_SEND_TIMEOUT: ${NGINX_PROXY_SEND_TIMEOUT:-3600s} + NGINX_ENABLE_CERTBOT_CHALLENGE: ${NGINX_ENABLE_CERTBOT_CHALLENGE:-false} + CERTBOT_DOMAIN: ${CERTBOT_DOMAIN:-} + depends_on: + - api + - web + ports: + - "${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}" + - "${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}" + networks: + - ssrf_proxy_network + - default + - urban-lifeline + + # The Weaviate vector store. + weaviate: + image: semitechnologies/weaviate:1.27.0 + # profiles: + # - weaviate + restart: always + volumes: + # Mount the Weaviate data directory to the con tainer. + - ./volumes/weaviate:/var/lib/weaviate + environment: + # The Weaviate configurations + # You can refer to the [Weaviate](https://weaviate.io/developers/weaviate/config-refs/env-vars) documentation for more information. + PERSISTENCE_DATA_PATH: ${WEAVIATE_PERSISTENCE_DATA_PATH:-/var/lib/weaviate} + QUERY_DEFAULTS_LIMIT: ${WEAVIATE_QUERY_DEFAULTS_LIMIT:-25} + AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: ${WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED:-false} + DEFAULT_VECTORIZER_MODULE: ${WEAVIATE_DEFAULT_VECTORIZER_MODULE:-none} + CLUSTER_HOSTNAME: ${WEAVIATE_CLUSTER_HOSTNAME:-node1} + AUTHENTICATION_APIKEY_ENABLED: ${WEAVIATE_AUTHENTICATION_APIKEY_ENABLED:-true} + AUTHENTICATION_APIKEY_ALLOWED_KEYS: ${WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS:-WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih} + AUTHENTICATION_APIKEY_USERS: ${WEAVIATE_AUTHENTICATION_APIKEY_USERS:-hello@dify.ai} + AUTHORIZATION_ADMINLIST_ENABLED: ${WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED:-true} + AUTHORIZATION_ADMINLIST_USERS: ${WEAVIATE_AUTHORIZATION_ADMINLIST_USERS:-hello@dify.ai} + DISABLE_TELEMETRY: ${WEAVIATE_DISABLE_TELEMETRY:-false} + ENABLE_TOKENIZER_GSE: ${WEAVIATE_ENABLE_TOKENIZER_GSE:-false} + ENABLE_TOKENIZER_KAGOME_JA: ${WEAVIATE_ENABLE_TOKENIZER_KAGOME_JA:-false} + ENABLE_TOKENIZER_KAGOME_KR: ${WEAVIATE_ENABLE_TOKENIZER_KAGOME_KR:-false} + + # OceanBase vector database + oceanbase: + image: oceanbase/oceanbase-ce:4.3.5-lts + container_name: oceanbase + profiles: + - oceanbase + restart: always + volumes: + - ./volumes/oceanbase/data:/root/ob + - ./volumes/oceanbase/conf:/root/.obd/cluster + - ./volumes/oceanbase/init.d:/root/boot/init.d + environment: + OB_MEMORY_LIMIT: ${OCEANBASE_MEMORY_LIMIT:-6G} + OB_SYS_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} + OB_TENANT_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} + OB_CLUSTER_NAME: ${OCEANBASE_CLUSTER_NAME:-difyai} + OB_SERVER_IP: 127.0.0.1 + MODE: mini + LANG: en_US.UTF-8 + ports: + - "${OCEANBASE_VECTOR_PORT:-2881}:2881" + healthcheck: + test: + [ + "CMD-SHELL", + 'obclient -h127.0.0.1 -P2881 -uroot@test -p${OCEANBASE_VECTOR_PASSWORD:-difyai123456} -e "SELECT 1;"', + ] + interval: 10s + retries: 30 + start_period: 30s + timeout: 10s + + # seekdb vector database + seekdb: + image: oceanbase/seekdb:latest + container_name: seekdb + profiles: + - seekdb + restart: always + volumes: + - ./volumes/seekdb:/var/lib/oceanbase + environment: + ROOT_PASSWORD: ${OCEANBASE_VECTOR_PASSWORD:-difyai123456} + MEMORY_LIMIT: ${SEEKDB_MEMORY_LIMIT:-2G} + REPORTER: dify-ai-seekdb + ports: + - "${OCEANBASE_VECTOR_PORT:-2881}:2881" + healthcheck: + test: + [ + "CMD-SHELL", + 'mysql -h127.0.0.1 -P2881 -uroot -p${OCEANBASE_VECTOR_PASSWORD:-difyai123456} -e "SELECT 1;"', + ] + interval: 5s + retries: 60 + timeout: 5s + + # Qdrant vector store. + # (if used, you need to set VECTOR_STORE to qdrant in the api & worker service.) + qdrant: + image: langgenius/qdrant:v1.8.3 + profiles: + - qdrant + restart: always + volumes: + - ./volumes/qdrant:/qdrant/storage + environment: + QDRANT_API_KEY: ${QDRANT_API_KEY:-difyai123456} + + # The Couchbase vector store. + couchbase-server: + build: ./couchbase-server + profiles: + - couchbase + restart: always + environment: + - CLUSTER_NAME=dify_search + - COUCHBASE_ADMINISTRATOR_USERNAME=${COUCHBASE_USER:-Administrator} + - COUCHBASE_ADMINISTRATOR_PASSWORD=${COUCHBASE_PASSWORD:-password} + - COUCHBASE_BUCKET=${COUCHBASE_BUCKET_NAME:-Embeddings} + - COUCHBASE_BUCKET_RAMSIZE=512 + - COUCHBASE_RAM_SIZE=2048 + - COUCHBASE_EVENTING_RAM_SIZE=512 + - COUCHBASE_INDEX_RAM_SIZE=512 + - COUCHBASE_FTS_RAM_SIZE=1024 + hostname: couchbase-server + container_name: couchbase-server + working_dir: /opt/couchbase + stdin_open: true + tty: true + entrypoint: [""] + command: sh -c "/opt/couchbase/init/init-cbserver.sh" + volumes: + - ./volumes/couchbase/data:/opt/couchbase/var/lib/couchbase/data + healthcheck: + # ensure bucket was created before proceeding + test: + [ + "CMD-SHELL", + "curl -s -f -u Administrator:password http://localhost:8091/pools/default/buckets | grep -q '\\[{' || exit 1", + ] + interval: 10s + retries: 10 + start_period: 30s + timeout: 10s + + # The pgvector vector database. + pgvector: + image: pgvector/pgvector:pg16 + profiles: + - pgvector + restart: always + environment: + PGUSER: ${PGVECTOR_PGUSER:-postgres} + # The password for the default postgres user. + POSTGRES_PASSWORD: ${PGVECTOR_POSTGRES_PASSWORD:-difyai123456} + # The name of the default postgres database. + POSTGRES_DB: ${PGVECTOR_POSTGRES_DB:-dify} + # postgres data directory + PGDATA: ${PGVECTOR_PGDATA:-/var/lib/postgresql/data/pgdata} + # pg_bigm module for full text search + PG_BIGM: ${PGVECTOR_PG_BIGM:-false} + PG_BIGM_VERSION: ${PGVECTOR_PG_BIGM_VERSION:-1.2-20240606} + volumes: + - ./volumes/pgvector/data:/var/lib/postgresql/data + - ./pgvector/docker-entrypoint.sh:/docker-entrypoint.sh + entrypoint: ["/docker-entrypoint.sh"] + healthcheck: + test: ["CMD", "pg_isready"] + interval: 1s + timeout: 3s + retries: 30 + + # get image from https://www.vastdata.com.cn/ + vastbase: + image: vastdata/vastbase-vector + profiles: + - vastbase + restart: always + environment: + - VB_DBCOMPATIBILITY=PG + - VB_DB=dify + - VB_USERNAME=dify + - VB_PASSWORD=Difyai123456 + ports: + - "5434:5432" + volumes: + - ./vastbase/lic:/home/vastbase/vastbase/lic + - ./vastbase/data:/home/vastbase/data + - ./vastbase/backup:/home/vastbase/backup + - ./vastbase/backup_log:/home/vastbase/backup_log + healthcheck: + test: ["CMD", "pg_isready"] + interval: 1s + timeout: 3s + retries: 30 + + # pgvecto-rs vector store + pgvecto-rs: + image: tensorchord/pgvecto-rs:pg16-v0.3.0 + profiles: + - pgvecto-rs + restart: always + environment: + PGUSER: ${PGVECTOR_PGUSER:-postgres} + # The password for the default postgres user. + POSTGRES_PASSWORD: ${PGVECTOR_POSTGRES_PASSWORD:-difyai123456} + # The name of the default postgres database. + POSTGRES_DB: ${PGVECTOR_POSTGRES_DB:-dify} + # postgres data directory + PGDATA: ${PGVECTOR_PGDATA:-/var/lib/postgresql/data/pgdata} + volumes: + - ./volumes/pgvecto_rs/data:/var/lib/postgresql/data + healthcheck: + test: ["CMD", "pg_isready"] + interval: 1s + timeout: 3s + retries: 30 + + # Chroma vector database + chroma: + image: ghcr.io/chroma-core/chroma:0.5.20 + profiles: + - chroma + restart: always + volumes: + - ./volumes/chroma:/chroma/chroma + environment: + CHROMA_SERVER_AUTHN_CREDENTIALS: ${CHROMA_SERVER_AUTHN_CREDENTIALS:-difyai123456} + CHROMA_SERVER_AUTHN_PROVIDER: ${CHROMA_SERVER_AUTHN_PROVIDER:-chromadb.auth.token_authn.TokenAuthenticationServerProvider} + IS_PERSISTENT: ${CHROMA_IS_PERSISTENT:-TRUE} + + # Oracle vector database + oracle: + image: container-registry.oracle.com/database/free:latest + profiles: + - oracle + restart: always + volumes: + - source: oradata + type: volume + target: /opt/oracle/oradata + - ./startupscripts:/opt/oracle/scripts/startup + environment: + ORACLE_PWD: ${ORACLE_PWD:-Dify123456} + ORACLE_CHARACTERSET: ${ORACLE_CHARACTERSET:-AL32UTF8} + + # Milvus vector database services + etcd: + container_name: milvus-etcd + image: quay.io/coreos/etcd:v3.5.5 + profiles: + - milvus + environment: + ETCD_AUTO_COMPACTION_MODE: ${ETCD_AUTO_COMPACTION_MODE:-revision} + ETCD_AUTO_COMPACTION_RETENTION: ${ETCD_AUTO_COMPACTION_RETENTION:-1000} + ETCD_QUOTA_BACKEND_BYTES: ${ETCD_QUOTA_BACKEND_BYTES:-4294967296} + ETCD_SNAPSHOT_COUNT: ${ETCD_SNAPSHOT_COUNT:-50000} + volumes: + - ./volumes/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 + healthcheck: + test: ["CMD", "etcdctl", "endpoint", "health"] + interval: 30s + timeout: 20s + retries: 3 + networks: + - milvus + + minio: + container_name: milvus-minio + image: minio/minio:RELEASE.2023-03-20T20-16-18Z + profiles: + - milvus + environment: + MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:-minioadmin} + MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-minioadmin} + volumes: + - ./volumes/milvus/minio:/minio_data + command: minio server /minio_data --console-address ":9001" + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] + interval: 30s + timeout: 20s + retries: 3 + networks: + - milvus + + milvus-standalone: + container_name: milvus-standalone + image: milvusdb/milvus:v2.6.3 + profiles: + - milvus + command: ["milvus", "run", "standalone"] + environment: + ETCD_ENDPOINTS: ${ETCD_ENDPOINTS:-etcd:2379} + MINIO_ADDRESS: ${MINIO_ADDRESS:-minio:9000} + common.security.authorizationEnabled: ${MILVUS_AUTHORIZATION_ENABLED:-true} + volumes: + - ./volumes/milvus/milvus:/var/lib/milvus + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"] + interval: 30s + start_period: 90s + timeout: 20s + retries: 3 + depends_on: + - etcd + - minio + ports: + - 19530:19530 + - 9091:9091 + networks: + - milvus + + # Opensearch vector database + opensearch: + container_name: opensearch + image: opensearchproject/opensearch:latest + profiles: + - opensearch + environment: + discovery.type: ${OPENSEARCH_DISCOVERY_TYPE:-single-node} + bootstrap.memory_lock: ${OPENSEARCH_BOOTSTRAP_MEMORY_LOCK:-true} + OPENSEARCH_JAVA_OPTS: -Xms${OPENSEARCH_JAVA_OPTS_MIN:-512m} -Xmx${OPENSEARCH_JAVA_OPTS_MAX:-1024m} + OPENSEARCH_INITIAL_ADMIN_PASSWORD: ${OPENSEARCH_INITIAL_ADMIN_PASSWORD:-Qazwsxedc!@#123} + ulimits: + memlock: + soft: ${OPENSEARCH_MEMLOCK_SOFT:--1} + hard: ${OPENSEARCH_MEMLOCK_HARD:--1} + nofile: + soft: ${OPENSEARCH_NOFILE_SOFT:-65536} + hard: ${OPENSEARCH_NOFILE_HARD:-65536} + volumes: + - ./volumes/opensearch/data:/usr/share/opensearch/data + networks: + - opensearch-net + + opensearch-dashboards: + container_name: opensearch-dashboards + image: opensearchproject/opensearch-dashboards:latest + profiles: + - opensearch + environment: + OPENSEARCH_HOSTS: '["https://opensearch:9200"]' + volumes: + - ./volumes/opensearch/opensearch_dashboards.yml:/usr/share/opensearch-dashboards/config/opensearch_dashboards.yml + networks: + - opensearch-net + depends_on: + - opensearch + + # opengauss vector database. + opengauss: + image: opengauss/opengauss:7.0.0-RC1 + profiles: + - opengauss + privileged: true + restart: always + environment: + GS_USERNAME: ${OPENGAUSS_USER:-postgres} + GS_PASSWORD: ${OPENGAUSS_PASSWORD:-Dify@123} + GS_PORT: ${OPENGAUSS_PORT:-6600} + GS_DB: ${OPENGAUSS_DATABASE:-dify} + volumes: + - ./volumes/opengauss/data:/var/lib/opengauss/data + healthcheck: + test: ["CMD-SHELL", "netstat -lntp | grep tcp6 > /dev/null 2>&1"] + interval: 10s + timeout: 10s + retries: 10 + ports: + - ${OPENGAUSS_PORT:-6600}:${OPENGAUSS_PORT:-6600} + + # MyScale vector database + myscale: + container_name: myscale + image: myscale/myscaledb:1.6.4 + profiles: + - myscale + restart: always + tty: true + volumes: + - ./volumes/myscale/data:/var/lib/clickhouse + - ./volumes/myscale/log:/var/log/clickhouse-server + - ./volumes/myscale/config/users.d/custom_users_config.xml:/etc/clickhouse-server/users.d/custom_users_config.xml + ports: + - ${MYSCALE_PORT:-8123}:${MYSCALE_PORT:-8123} + + # Matrixone vector store. + matrixone: + hostname: matrixone + image: matrixorigin/matrixone:2.1.1 + profiles: + - matrixone + restart: always + volumes: + - ./volumes/matrixone/data:/mo-data + ports: + - ${MATRIXONE_PORT:-6001}:${MATRIXONE_PORT:-6001} + + # https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html + # https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker-prod-prerequisites + elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:8.14.3 + container_name: elasticsearch + profiles: + - elasticsearch + - elasticsearch-ja + restart: always + volumes: + - ./elasticsearch/docker-entrypoint.sh:/docker-entrypoint-mount.sh + - dify_es01_data:/usr/share/elasticsearch/data + environment: + ELASTIC_PASSWORD: ${ELASTICSEARCH_PASSWORD:-elastic} + VECTOR_STORE: ${VECTOR_STORE:-} + cluster.name: dify-es-cluster + node.name: dify-es0 + discovery.type: single-node + xpack.license.self_generated.type: basic + xpack.security.enabled: "true" + xpack.security.enrollment.enabled: "false" + xpack.security.http.ssl.enabled: "false" + ports: + - ${ELASTICSEARCH_PORT:-9200}:9200 + deploy: + resources: + limits: + memory: 2g + entrypoint: ["sh", "-c", "sh /docker-entrypoint-mount.sh"] + healthcheck: + test: + ["CMD", "curl", "-s", "http://localhost:9200/_cluster/health?pretty"] + interval: 30s + timeout: 10s + retries: 50 + + # https://www.elastic.co/guide/en/kibana/current/docker.html + # https://www.elastic.co/guide/en/kibana/current/settings.html + kibana: + image: docker.elastic.co/kibana/kibana:8.14.3 + container_name: kibana + profiles: + - elasticsearch + depends_on: + - elasticsearch + restart: always + environment: + XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY: d1a66dfd-c4d3-4a0a-8290-2abcb83ab3aa + NO_PROXY: localhost,127.0.0.1,elasticsearch,kibana + XPACK_SECURITY_ENABLED: "true" + XPACK_SECURITY_ENROLLMENT_ENABLED: "false" + XPACK_SECURITY_HTTP_SSL_ENABLED: "false" + XPACK_FLEET_ISAIRGAPPED: "true" + I18N_LOCALE: zh-CN + SERVER_PORT: "5601" + ELASTICSEARCH_HOSTS: http://elasticsearch:9200 + ports: + - ${KIBANA_PORT:-5601}:5601 + healthcheck: + test: ["CMD-SHELL", "curl -s http://localhost:5601 >/dev/null || exit 1"] + interval: 30s + timeout: 10s + retries: 3 + + # unstructured . + # (if used, you need to set ETL_TYPE to Unstructured in the api & worker service.) + unstructured: + image: downloads.unstructured.io/unstructured-io/unstructured-api:latest + profiles: + - unstructured + restart: always + volumes: + - ./volumes/unstructured:/app/data + +networks: + # create a network between sandbox, api and ssrf_proxy, and can not access outside. + ssrf_proxy_network: + driver: bridge + internal: true + milvus: + driver: bridge + opensearch-net: + driver: bridge + internal: true + urban-lifeline: # 添加外部网络引用 + external: true + name: urban-lifeline +volumes: + oradata: + dify_es01_data: diff --git a/docker/dify/elasticsearch/docker-entrypoint.sh b/docker/dify/elasticsearch/docker-entrypoint.sh new file mode 100644 index 00000000..6669aec5 --- /dev/null +++ b/docker/dify/elasticsearch/docker-entrypoint.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +set -e + +if [ "${VECTOR_STORE}" = "elasticsearch-ja" ]; then + # Check if the ICU tokenizer plugin is installed + if ! /usr/share/elasticsearch/bin/elasticsearch-plugin list | grep -q analysis-icu; then + printf '%s\n' "Installing the ICU tokenizer plugin" + if ! /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu; then + printf '%s\n' "Failed to install the ICU tokenizer plugin" + exit 1 + fi + fi + # Check if the Japanese language analyzer plugin is installed + if ! /usr/share/elasticsearch/bin/elasticsearch-plugin list | grep -q analysis-kuromoji; then + printf '%s\n' "Installing the Japanese language analyzer plugin" + if ! /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji; then + printf '%s\n' "Failed to install the Japanese language analyzer plugin" + exit 1 + fi + fi +fi + +# Run the original entrypoint script +exec /bin/tini -- /usr/local/bin/docker-entrypoint.sh diff --git a/docker/dify/generate_docker_compose b/docker/dify/generate_docker_compose new file mode 100644 index 00000000..b5c0acef --- /dev/null +++ b/docker/dify/generate_docker_compose @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +import os +import re +import sys + + +def parse_env_example(file_path): + """ + Parses the .env.example file and returns a dictionary with variable names as keys and default values as values. + """ + env_vars = {} + with open(file_path, "r") as f: + for line_number, line in enumerate(f, 1): + line = line.strip() + # Ignore empty lines and comments + if not line or line.startswith("#"): + continue + # Use regex to parse KEY=VALUE + match = re.match(r"^([^=]+)=(.*)$", line) + if match: + key = match.group(1).strip() + value = match.group(2).strip() + # Remove possible quotes around the value + if (value.startswith('"') and value.endswith('"')) or ( + value.startswith("'") and value.endswith("'") + ): + value = value[1:-1] + env_vars[key] = value + else: + print(f"Warning: Unable to parse line {line_number}: {line}") + return env_vars + + +def generate_shared_env_block(env_vars, anchor_name="shared-api-worker-env"): + """ + Generates a shared environment variables block as a YAML string. + """ + lines = [f"x-shared-env: &{anchor_name}"] + for key, default in env_vars.items(): + if key == "COMPOSE_PROFILES": + continue + # If default value is empty, use ${KEY:-} + if default == "": + lines.append(f" {key}: ${{{key}:-}}") + else: + # If default value contains special characters, wrap it in quotes + if re.search(r"[:\s]", default): + default = f"{default}" + lines.append(f" {key}: ${{{key}:-{default}}}") + return "\n".join(lines) + + +def insert_shared_env(template_path, output_path, shared_env_block, header_comments): + """ + Inserts the shared environment variables block and header comments into the template file, + removing any existing x-shared-env anchors, and generates the final docker-compose.yaml file. + """ + with open(template_path, "r") as f: + template_content = f.read() + + # Remove existing x-shared-env: &shared-api-worker-env lines + template_content = re.sub( + r"^x-shared-env: &shared-api-worker-env\s*\n?", + "", + template_content, + flags=re.MULTILINE, + ) + + # Prepare the final content with header comments and shared env block + final_content = f"{header_comments}\n{shared_env_block}\n\n{template_content}" + + with open(output_path, "w") as f: + f.write(final_content) + print(f"Generated {output_path}") + + +def main(): + env_example_path = ".env.example" + template_path = "docker-compose-template.yaml" + output_path = "docker-compose.yaml" + anchor_name = "shared-api-worker-env" # Can be modified as needed + + # Define header comments to be added at the top of docker-compose.yaml + header_comments = ( + "# ==================================================================\n" + "# WARNING: This file is auto-generated by generate_docker_compose\n" + "# Do not modify this file directly. Instead, update the .env.example\n" + "# or docker-compose-template.yaml and regenerate this file.\n" + "# ==================================================================\n" + ) + + # Check if required files exist + for path in [env_example_path, template_path]: + if not os.path.isfile(path): + print(f"Error: File {path} does not exist.") + sys.exit(1) + + # Parse .env.example file + env_vars = parse_env_example(env_example_path) + + if not env_vars: + print("Warning: No environment variables found in .env.example.") + + # Generate shared environment variables block + shared_env_block = generate_shared_env_block(env_vars, anchor_name) + + # Insert shared environment variables block and header comments into the template + insert_shared_env(template_path, output_path, shared_env_block, header_comments) + + +if __name__ == "__main__": + main() diff --git a/docker/dify/middleware.env.example b/docker/dify/middleware.env.example new file mode 100644 index 00000000..d4cbcd17 --- /dev/null +++ b/docker/dify/middleware.env.example @@ -0,0 +1,215 @@ +# ------------------------------ +# Environment Variables for db Service +# ------------------------------ +# Database Configuration +# Database type, supported values are `postgresql` and `mysql` +DB_TYPE=postgresql +# For MySQL, only `root` user is supported for now +DB_USERNAME=postgres +DB_PASSWORD=difyai123456 +DB_HOST=db_postgres +DB_PORT=5432 +DB_DATABASE=dify + +# PostgreSQL Configuration +# postgres data directory +PGDATA=/var/lib/postgresql/data/pgdata +PGDATA_HOST_VOLUME=./volumes/db/data + +# Maximum number of connections to the database +# Default is 100 +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-connection.html#GUC-MAX-CONNECTIONS +POSTGRES_MAX_CONNECTIONS=100 + +# Sets the amount of shared memory used for postgres's shared buffers. +# Default is 128MB +# Recommended value: 25% of available memory +# Reference: https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-SHARED-BUFFERS +POSTGRES_SHARED_BUFFERS=128MB + +# Sets the amount of memory used by each database worker for working space. +# Default is 4MB +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-WORK-MEM +POSTGRES_WORK_MEM=4MB + +# Sets the amount of memory reserved for maintenance activities. +# Default is 64MB +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-MAINTENANCE-WORK-MEM +POSTGRES_MAINTENANCE_WORK_MEM=64MB + +# Sets the planner's assumption about the effective cache size. +# Default is 4096MB +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-query.html#GUC-EFFECTIVE-CACHE-SIZE +POSTGRES_EFFECTIVE_CACHE_SIZE=4096MB + +# Sets the maximum allowed duration of any statement before termination. +# Default is 0 (no timeout). +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-STATEMENT-TIMEOUT +# A value of 0 prevents the server from timing out statements. +POSTGRES_STATEMENT_TIMEOUT=0 + +# Sets the maximum allowed duration of any idle in-transaction session before termination. +# Default is 0 (no timeout). +# +# Reference: https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-IDLE-IN-TRANSACTION-SESSION-TIMEOUT +# A value of 0 prevents the server from terminating idle sessions. +POSTGRES_IDLE_IN_TRANSACTION_SESSION_TIMEOUT=0 + +# MySQL Configuration +# MySQL data directory host volume +MYSQL_HOST_VOLUME=./volumes/mysql/data + +# MySQL Performance Configuration +# Maximum number of connections to MySQL +# Default is 1000 +MYSQL_MAX_CONNECTIONS=1000 + +# InnoDB buffer pool size +# Default is 512M +# Recommended value: 70-80% of available memory for dedicated MySQL server +# Reference: https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_buffer_pool_size +MYSQL_INNODB_BUFFER_POOL_SIZE=512M + +# InnoDB log file size +# Default is 128M +# Reference: https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_log_file_size +MYSQL_INNODB_LOG_FILE_SIZE=128M + +# InnoDB flush log at transaction commit +# Default is 2 (flush to OS cache, sync every second) +# Options: 0 (no flush), 1 (flush and sync), 2 (flush to OS cache) +# Reference: https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit +MYSQL_INNODB_FLUSH_LOG_AT_TRX_COMMIT=2 + +# ----------------------------- +# Environment Variables for redis Service +# ----------------------------- +REDIS_HOST_VOLUME=./volumes/redis/data +REDIS_PASSWORD=difyai123456 + +# ------------------------------ +# Environment Variables for sandbox Service +# ------------------------------ +SANDBOX_API_KEY=dify-sandbox +SANDBOX_GIN_MODE=release +SANDBOX_WORKER_TIMEOUT=15 +SANDBOX_ENABLE_NETWORK=true +SANDBOX_HTTP_PROXY=http://ssrf_proxy:3128 +SANDBOX_HTTPS_PROXY=http://ssrf_proxy:3128 +SANDBOX_PORT=8194 + +# ------------------------------ +# Environment Variables for ssrf_proxy Service +# ------------------------------ +SSRF_HTTP_PORT=3128 +SSRF_COREDUMP_DIR=/var/spool/squid +SSRF_REVERSE_PROXY_PORT=8194 +SSRF_SANDBOX_HOST=sandbox + +# ------------------------------ +# Environment Variables for weaviate Service +# ------------------------------ +WEAVIATE_QUERY_DEFAULTS_LIMIT=25 +WEAVIATE_AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true +WEAVIATE_DEFAULT_VECTORIZER_MODULE=none +WEAVIATE_CLUSTER_HOSTNAME=node1 +WEAVIATE_AUTHENTICATION_APIKEY_ENABLED=true +WEAVIATE_AUTHENTICATION_APIKEY_ALLOWED_KEYS=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih +WEAVIATE_AUTHENTICATION_APIKEY_USERS=hello@dify.ai +WEAVIATE_AUTHORIZATION_ADMINLIST_ENABLED=true +WEAVIATE_AUTHORIZATION_ADMINLIST_USERS=hello@dify.ai +WEAVIATE_DISABLE_TELEMETRY=false +WEAVIATE_HOST_VOLUME=./volumes/weaviate + +# ------------------------------ +# Docker Compose profile configuration +# ------------------------------ +# Loaded automatically when running `docker compose --env-file middleware.env ...`. +# Controls which DB/vector services start, so no extra `--profile` flag is needed. +COMPOSE_PROFILES=${DB_TYPE:-postgresql},weaviate + +# ------------------------------ +# Docker Compose Service Expose Host Port Configurations +# ------------------------------ +EXPOSE_POSTGRES_PORT=5432 +EXPOSE_MYSQL_PORT=3306 +EXPOSE_REDIS_PORT=6379 +EXPOSE_SANDBOX_PORT=8194 +EXPOSE_SSRF_PROXY_PORT=3128 +EXPOSE_WEAVIATE_PORT=8080 + +# ------------------------------ +# Plugin Daemon Configuration +# ------------------------------ + +DB_PLUGIN_DATABASE=dify_plugin +EXPOSE_PLUGIN_DAEMON_PORT=5002 +PLUGIN_DAEMON_PORT=5002 +PLUGIN_DAEMON_KEY=lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi +PLUGIN_DAEMON_URL=http://host.docker.internal:5002 +PLUGIN_MAX_PACKAGE_SIZE=52428800 +PLUGIN_PPROF_ENABLED=false +PLUGIN_WORKING_PATH=/app/storage/cwd + +ENDPOINT_URL_TEMPLATE=http://localhost:5002/e/{hook_id} + +PLUGIN_DEBUGGING_PORT=5003 +PLUGIN_DEBUGGING_HOST=0.0.0.0 +EXPOSE_PLUGIN_DEBUGGING_HOST=localhost +EXPOSE_PLUGIN_DEBUGGING_PORT=5003 + +PLUGIN_DIFY_INNER_API_KEY=QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1 +PLUGIN_DIFY_INNER_API_URL=http://host.docker.internal:5001 + +MARKETPLACE_ENABLED=true +MARKETPLACE_API_URL=https://marketplace.dify.ai + +FORCE_VERIFYING_SIGNATURE=true + +PLUGIN_PYTHON_ENV_INIT_TIMEOUT=120 +PLUGIN_MAX_EXECUTION_TIMEOUT=600 +# PIP_MIRROR_URL=https://pypi.tuna.tsinghua.edu.cn/simple +PIP_MIRROR_URL= + +# https://github.com/langgenius/dify-plugin-daemon/blob/main/.env.example +# Plugin storage type, local aws_s3 tencent_cos azure_blob +PLUGIN_STORAGE_TYPE=local +PLUGIN_STORAGE_LOCAL_ROOT=/app/storage +PLUGIN_WORKING_PATH=/app/storage/cwd +PLUGIN_INSTALLED_PATH=plugin +PLUGIN_PACKAGE_CACHE_PATH=plugin_packages +PLUGIN_MEDIA_CACHE_PATH=assets +# Plugin oss bucket +PLUGIN_STORAGE_OSS_BUCKET= +# Plugin oss s3 credentials +PLUGIN_S3_USE_AWS_MANAGED_IAM=false +PLUGIN_S3_USE_AWS=false +PLUGIN_S3_ENDPOINT= +PLUGIN_S3_USE_PATH_STYLE=false +PLUGIN_AWS_ACCESS_KEY= +PLUGIN_AWS_SECRET_KEY= +PLUGIN_AWS_REGION= +# Plugin oss azure blob +PLUGIN_AZURE_BLOB_STORAGE_CONTAINER_NAME= +PLUGIN_AZURE_BLOB_STORAGE_CONNECTION_STRING= +# Plugin oss tencent cos +PLUGIN_TENCENT_COS_SECRET_KEY= +PLUGIN_TENCENT_COS_SECRET_ID= +PLUGIN_TENCENT_COS_REGION= +# Plugin oss aliyun oss +PLUGIN_ALIYUN_OSS_REGION= +PLUGIN_ALIYUN_OSS_ENDPOINT= +PLUGIN_ALIYUN_OSS_ACCESS_KEY_ID= +PLUGIN_ALIYUN_OSS_ACCESS_KEY_SECRET= +PLUGIN_ALIYUN_OSS_AUTH_VERSION=v4 +PLUGIN_ALIYUN_OSS_PATH= +# Plugin oss volcengine tos +PLUGIN_VOLCENGINE_TOS_ENDPOINT= +PLUGIN_VOLCENGINE_TOS_ACCESS_KEY= +PLUGIN_VOLCENGINE_TOS_SECRET_KEY= +PLUGIN_VOLCENGINE_TOS_REGION= diff --git a/docker/dify/nginx/conf.d/default.conf b/docker/dify/nginx/conf.d/default.conf new file mode 100644 index 00000000..047e9ce5 --- /dev/null +++ b/docker/dify/nginx/conf.d/default.conf @@ -0,0 +1,58 @@ +# Please do not directly edit this file. Instead, modify the .env variables related to NGINX configuration. + +server { + listen 80; + server_name _; + + location /console/api { + proxy_pass http://api:5001; + include proxy.conf; + } + + location /api { + proxy_pass http://api:5001; + include proxy.conf; + } + + location /v1 { + proxy_pass http://api:5001; + include proxy.conf; + } + + location /files { + proxy_pass http://api:5001; + include proxy.conf; + } + + location /explore { + proxy_pass http://web:3000; + include proxy.conf; + } + + location /e/ { + proxy_pass http://plugin_daemon:5002; + proxy_set_header Dify-Hook-Url $scheme://$host$request_uri; + include proxy.conf; + } + + location / { + proxy_pass http://web:3000; + include proxy.conf; + } + + location /mcp { + proxy_pass http://api:5001; + include proxy.conf; + } + + location /triggers { + proxy_pass http://api:5001; + include proxy.conf; + } + + # placeholder for acme challenge location + + + # placeholder for https config defined in https.conf.template + +} diff --git a/docker/dify/nginx/conf.d/default.conf.template b/docker/dify/nginx/conf.d/default.conf.template new file mode 100644 index 00000000..1d63c1b9 --- /dev/null +++ b/docker/dify/nginx/conf.d/default.conf.template @@ -0,0 +1,58 @@ +# Please do not directly edit this file. Instead, modify the .env variables related to NGINX configuration. + +server { + listen ${NGINX_PORT}; + server_name ${NGINX_SERVER_NAME}; + + location /console/api { + proxy_pass http://api:5001; + include proxy.conf; + } + + location /api { + proxy_pass http://api:5001; + include proxy.conf; + } + + location /v1 { + proxy_pass http://api:5001; + include proxy.conf; + } + + location /files { + proxy_pass http://api:5001; + include proxy.conf; + } + + location /explore { + proxy_pass http://web:3000; + include proxy.conf; + } + + location /e/ { + proxy_pass http://plugin_daemon:5002; + proxy_set_header Dify-Hook-Url $scheme://$host$request_uri; + include proxy.conf; + } + + location / { + proxy_pass http://web:3000; + include proxy.conf; + } + + location /mcp { + proxy_pass http://api:5001; + include proxy.conf; + } + + location /triggers { + proxy_pass http://api:5001; + include proxy.conf; + } + + # placeholder for acme challenge location + ${ACME_CHALLENGE_LOCATION} + + # placeholder for https config defined in https.conf.template + ${HTTPS_CONFIG} +} diff --git a/docker/dify/nginx/docker-entrypoint.sh b/docker/dify/nginx/docker-entrypoint.sh new file mode 100644 index 00000000..763254e3 --- /dev/null +++ b/docker/dify/nginx/docker-entrypoint.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +HTTPS_CONFIG='' + +if [ "${NGINX_HTTPS_ENABLED}" = "true" ]; then + # Check if the certificate and key files for the specified domain exist + if [ -n "${CERTBOT_DOMAIN}" ] && \ + [ -f "/etc/letsencrypt/live/${CERTBOT_DOMAIN}/${NGINX_SSL_CERT_FILENAME}" ] && \ + [ -f "/etc/letsencrypt/live/${CERTBOT_DOMAIN}/${NGINX_SSL_CERT_KEY_FILENAME}" ]; then + SSL_CERTIFICATE_PATH="/etc/letsencrypt/live/${CERTBOT_DOMAIN}/${NGINX_SSL_CERT_FILENAME}" + SSL_CERTIFICATE_KEY_PATH="/etc/letsencrypt/live/${CERTBOT_DOMAIN}/${NGINX_SSL_CERT_KEY_FILENAME}" + else + SSL_CERTIFICATE_PATH="/etc/ssl/${NGINX_SSL_CERT_FILENAME}" + SSL_CERTIFICATE_KEY_PATH="/etc/ssl/${NGINX_SSL_CERT_KEY_FILENAME}" + fi + export SSL_CERTIFICATE_PATH + export SSL_CERTIFICATE_KEY_PATH + + # set the HTTPS_CONFIG environment variable to the content of the https.conf.template + HTTPS_CONFIG=$(envsubst < /etc/nginx/https.conf.template) + export HTTPS_CONFIG + # Substitute the HTTPS_CONFIG in the default.conf.template with content from https.conf.template + envsubst '${HTTPS_CONFIG}' < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf +fi +export HTTPS_CONFIG + +if [ "${NGINX_ENABLE_CERTBOT_CHALLENGE}" = "true" ]; then + ACME_CHALLENGE_LOCATION='location /.well-known/acme-challenge/ { root /var/www/html; }' +else + ACME_CHALLENGE_LOCATION='' +fi +export ACME_CHALLENGE_LOCATION + +env_vars=$(printenv | cut -d= -f1 | sed 's/^/$/g' | paste -sd, -) + +envsubst "$env_vars" < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf +envsubst "$env_vars" < /etc/nginx/proxy.conf.template > /etc/nginx/proxy.conf + +envsubst "$env_vars" < /etc/nginx/conf.d/default.conf.template > /etc/nginx/conf.d/default.conf + +# Start Nginx using the default entrypoint +exec nginx -g 'daemon off;' diff --git a/docker/dify/nginx/https.conf.template b/docker/dify/nginx/https.conf.template new file mode 100644 index 00000000..296908d8 --- /dev/null +++ b/docker/dify/nginx/https.conf.template @@ -0,0 +1,9 @@ +# Please do not directly edit this file. Instead, modify the .env variables related to NGINX configuration. + +listen ${NGINX_SSL_PORT} ssl; +ssl_certificate ${SSL_CERTIFICATE_PATH}; +ssl_certificate_key ${SSL_CERTIFICATE_KEY_PATH}; +ssl_protocols ${NGINX_SSL_PROTOCOLS}; +ssl_prefer_server_ciphers on; +ssl_session_cache shared:SSL:10m; +ssl_session_timeout 10m; diff --git a/docker/dify/nginx/nginx.conf.template b/docker/dify/nginx/nginx.conf.template new file mode 100644 index 00000000..20446fae --- /dev/null +++ b/docker/dify/nginx/nginx.conf.template @@ -0,0 +1,34 @@ +# Please do not directly edit this file. Instead, modify the .env variables related to NGINX configuration. + +user nginx; +worker_processes ${NGINX_WORKER_PROCESSES}; + +error_log /var/log/nginx/error.log notice; +pid /var/run/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + #tcp_nopush on; + + keepalive_timeout ${NGINX_KEEPALIVE_TIMEOUT}; + + #gzip on; + client_max_body_size ${NGINX_CLIENT_MAX_BODY_SIZE}; + + include /etc/nginx/conf.d/*.conf; +} diff --git a/docker/dify/nginx/proxy.conf.template b/docker/dify/nginx/proxy.conf.template new file mode 100644 index 00000000..117f8061 --- /dev/null +++ b/docker/dify/nginx/proxy.conf.template @@ -0,0 +1,11 @@ +# Please do not directly edit this file. Instead, modify the .env variables related to NGINX configuration. + +proxy_set_header Host $host; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +proxy_set_header X-Forwarded-Proto $scheme; +proxy_set_header X-Forwarded-Port $server_port; +proxy_http_version 1.1; +proxy_set_header Connection ""; +proxy_buffering off; +proxy_read_timeout ${NGINX_PROXY_READ_TIMEOUT}; +proxy_send_timeout ${NGINX_PROXY_SEND_TIMEOUT}; diff --git a/docker/dify/nginx/ssl/.gitkeep b/docker/dify/nginx/ssl/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/pgvector/docker-entrypoint.sh b/docker/dify/pgvector/docker-entrypoint.sh new file mode 100644 index 00000000..262eacfb --- /dev/null +++ b/docker/dify/pgvector/docker-entrypoint.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +PG_MAJOR=16 + +if [ "${PG_BIGM}" = "true" ]; then + # install pg_bigm + apt-get update + apt-get install -y curl make gcc postgresql-server-dev-${PG_MAJOR} + + curl -LO https://github.com/pgbigm/pg_bigm/archive/refs/tags/v${PG_BIGM_VERSION}.tar.gz + tar xf v${PG_BIGM_VERSION}.tar.gz + cd pg_bigm-${PG_BIGM_VERSION} || exit 1 + make USE_PGXS=1 PG_CONFIG=/usr/bin/pg_config + make USE_PGXS=1 PG_CONFIG=/usr/bin/pg_config install + + cd - || exit 1 + rm -rf v${PG_BIGM_VERSION}.tar.gz pg_bigm-${PG_BIGM_VERSION} + + # enable pg_bigm + sed -i -e 's/^#\s*shared_preload_libraries.*/shared_preload_libraries = '\''pg_bigm'\''/' /var/lib/postgresql/data/pgdata/postgresql.conf +fi + +# Run the original entrypoint script +exec /usr/local/bin/docker-entrypoint.sh postgres diff --git a/docker/dify/ssrf_proxy/docker-entrypoint.sh b/docker/dify/ssrf_proxy/docker-entrypoint.sh new file mode 100644 index 00000000..613897bb --- /dev/null +++ b/docker/dify/ssrf_proxy/docker-entrypoint.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# Modified based on Squid OCI image entrypoint + +# This entrypoint aims to forward the squid logs to stdout to assist users of +# common container related tooling (e.g., kubernetes, docker-compose, etc) to +# access the service logs. + +# Moreover, it invokes the squid binary, leaving all the desired parameters to +# be provided by the "command" passed to the spawned container. If no command +# is provided by the user, the default behavior (as per the CMD statement in +# the Dockerfile) will be to use Ubuntu's default configuration [1] and run +# squid with the "-NYC" options to mimic the behavior of the Ubuntu provided +# systemd unit. + +# [1] The default configuration is changed in the Dockerfile to allow local +# network connections. See the Dockerfile for further information. + +echo "[ENTRYPOINT] re-create snakeoil self-signed certificate removed in the build process" +if [ ! -f /etc/ssl/private/ssl-cert-snakeoil.key ]; then + /usr/sbin/make-ssl-cert generate-default-snakeoil --force-overwrite > /dev/null 2>&1 +fi + +tail -F /var/log/squid/access.log 2>/dev/null & +tail -F /var/log/squid/error.log 2>/dev/null & +tail -F /var/log/squid/store.log 2>/dev/null & +tail -F /var/log/squid/cache.log 2>/dev/null & + +# Replace environment variables in the template and output to the squid.conf +echo "[ENTRYPOINT] replacing environment variables in the template" +awk '{ + while(match($0, /\${[A-Za-z_][A-Za-z_0-9]*}/)) { + var = substr($0, RSTART+2, RLENGTH-3) + val = ENVIRON[var] + $0 = substr($0, 1, RSTART-1) val substr($0, RSTART+RLENGTH) + } + print +}' /etc/squid/squid.conf.template > /etc/squid/squid.conf + +/usr/sbin/squid -Nz +echo "[ENTRYPOINT] starting squid" +/usr/sbin/squid -f /etc/squid/squid.conf -NYC 1 diff --git a/docker/dify/ssrf_proxy/squid.conf.template b/docker/dify/ssrf_proxy/squid.conf.template new file mode 100644 index 00000000..1775a1ff --- /dev/null +++ b/docker/dify/ssrf_proxy/squid.conf.template @@ -0,0 +1,56 @@ +acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN) +acl localnet src 10.0.0.0/8 # RFC 1918 local private network (LAN) +acl localnet src 100.64.0.0/10 # RFC 6598 shared address space (CGN) +acl localnet src 169.254.0.0/16 # RFC 3927 link-local (directly plugged) machines +acl localnet src 172.16.0.0/12 # RFC 1918 local private network (LAN) +acl localnet src 192.168.0.0/16 # RFC 1918 local private network (LAN) +acl localnet src fc00::/7 # RFC 4193 local private network range +acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines +acl SSL_ports port 443 +# acl SSL_ports port 1025-65535 # Enable the configuration to resolve this issue: https://github.com/langgenius/dify/issues/12792 +acl Safe_ports port 80 # http +acl Safe_ports port 21 # ftp +acl Safe_ports port 443 # https +acl Safe_ports port 70 # gopher +acl Safe_ports port 210 # wais +acl Safe_ports port 1025-65535 # unregistered ports +acl Safe_ports port 280 # http-mgmt +acl Safe_ports port 488 # gss-http +acl Safe_ports port 591 # filemaker +acl Safe_ports port 777 # multiling http +acl CONNECT method CONNECT +acl allowed_domains dstdomain .marketplace.dify.ai +http_access allow allowed_domains +http_access deny !Safe_ports +http_access deny CONNECT !SSL_ports +http_access allow localhost manager +http_access deny manager +http_access allow localhost +include /etc/squid/conf.d/*.conf +http_access deny all + +################################## Proxy Server ################################ +http_port ${HTTP_PORT} +coredump_dir ${COREDUMP_DIR} +refresh_pattern ^ftp: 1440 20% 10080 +refresh_pattern ^gopher: 1440 0% 1440 +refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 +refresh_pattern \/(Packages|Sources)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims +refresh_pattern \/Release(|\.gpg)$ 0 0% 0 refresh-ims +refresh_pattern \/InRelease$ 0 0% 0 refresh-ims +refresh_pattern \/(Translation-.*)(|\.bz2|\.gz|\.xz)$ 0 0% 0 refresh-ims +refresh_pattern . 0 20% 4320 + + +# cache_dir ufs /var/spool/squid 100 16 256 +# upstream proxy, set to your own upstream proxy IP to avoid SSRF attacks +# cache_peer 172.1.1.1 parent 3128 0 no-query no-digest no-netdb-exchange default + +################################## Reverse Proxy To Sandbox ################################ +http_port ${REVERSE_PROXY_PORT} accel vhost +cache_peer ${SANDBOX_HOST} parent ${SANDBOX_PORT} 0 no-query originserver +acl src_all src all +http_access allow src_all + +# Unless the option's size is increased, an error will occur when uploading more than two files. +client_request_buffer_max_size 100 MB diff --git a/docker/dify/startupscripts/init.sh b/docker/dify/startupscripts/init.sh new file mode 100644 index 00000000..dcee1e19 --- /dev/null +++ b/docker/dify/startupscripts/init.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +DB_INITIALIZED="/opt/oracle/oradata/dbinit" +#[ -f ${DB_INITIALIZED} ] && exit +#touch ${DB_INITIALIZED} +if [ -f ${DB_INITIALIZED} ]; then + echo 'File exists. Standards for have been Init' + exit +else + echo 'File does not exist. Standards for first time Start up this DB' + "$ORACLE_HOME"/bin/sqlplus -s "/ as sysdba" @"/opt/oracle/scripts/startup/init_user.script"; + touch ${DB_INITIALIZED} +fi diff --git a/docker/dify/startupscripts/init_user.script b/docker/dify/startupscripts/init_user.script new file mode 100644 index 00000000..e710d827 --- /dev/null +++ b/docker/dify/startupscripts/init_user.script @@ -0,0 +1,10 @@ +show pdbs; +ALTER SYSTEM SET PROCESSES=500 SCOPE=SPFILE; +alter session set container= freepdb1; +create user dify identified by dify DEFAULT TABLESPACE users quota unlimited on users; +grant DB_DEVELOPER_ROLE to dify; + +BEGIN +CTX_DDL.CREATE_PREFERENCE('dify.world_lexer','WORLD_LEXER'); +END; +/ diff --git a/docker/dify/tidb/config/pd.toml b/docker/dify/tidb/config/pd.toml new file mode 100644 index 00000000..01e352a8 --- /dev/null +++ b/docker/dify/tidb/config/pd.toml @@ -0,0 +1,4 @@ +# PD Configuration File reference: +# https://docs.pingcap.com/tidb/stable/pd-configuration-file#pd-configuration-file +[replication] +max-replicas = 1 diff --git a/docker/dify/tidb/config/tiflash-learner.toml b/docker/dify/tidb/config/tiflash-learner.toml new file mode 100644 index 00000000..5098829a --- /dev/null +++ b/docker/dify/tidb/config/tiflash-learner.toml @@ -0,0 +1,13 @@ +# TiFlash tiflash-learner.toml Configuration File reference: +# https://docs.pingcap.com/tidb/stable/tiflash-configuration#configure-the-tiflash-learnertoml-file + +log-file = "/logs/tiflash_tikv.log" + +[server] +engine-addr = "tiflash:4030" +addr = "0.0.0.0:20280" +advertise-addr = "tiflash:20280" +status-addr = "tiflash:20292" + +[storage] +data-dir = "/data/flash" diff --git a/docker/dify/tidb/config/tiflash.toml b/docker/dify/tidb/config/tiflash.toml new file mode 100644 index 00000000..30ac13ef --- /dev/null +++ b/docker/dify/tidb/config/tiflash.toml @@ -0,0 +1,19 @@ +# TiFlash tiflash.toml Configuration File reference: +# https://docs.pingcap.com/tidb/stable/tiflash-configuration#configure-the-tiflashtoml-file + +listen_host = "0.0.0.0" +path = "/data" + +[flash] +tidb_status_addr = "tidb:10080" +service_addr = "tiflash:4030" + +[flash.proxy] +config = "/tiflash-learner.toml" + +[logger] +errorlog = "/logs/tiflash_error.log" +log = "/logs/tiflash.log" + +[raft] +pd_addr = "pd0:2379" diff --git a/docker/dify/tidb/docker-compose.yaml b/docker/dify/tidb/docker-compose.yaml new file mode 100644 index 00000000..9db69221 --- /dev/null +++ b/docker/dify/tidb/docker-compose.yaml @@ -0,0 +1,63 @@ +services: + pd0: + image: pingcap/pd:v8.5.1 + # ports: + # - "2379" + volumes: + - ./config/pd.toml:/pd.toml:ro + - ./volumes/data:/data + - ./volumes/logs:/logs + command: + - --name=pd0 + - --client-urls=http://0.0.0.0:2379 + - --peer-urls=http://0.0.0.0:2380 + - --advertise-client-urls=http://pd0:2379 + - --advertise-peer-urls=http://pd0:2380 + - --initial-cluster=pd0=http://pd0:2380 + - --data-dir=/data/pd + - --config=/pd.toml + - --log-file=/logs/pd.log + restart: on-failure + tikv: + image: pingcap/tikv:v8.5.1 + volumes: + - ./volumes/data:/data + - ./volumes/logs:/logs + command: + - --addr=0.0.0.0:20160 + - --advertise-addr=tikv:20160 + - --status-addr=tikv:20180 + - --data-dir=/data/tikv + - --pd=pd0:2379 + - --log-file=/logs/tikv.log + depends_on: + - "pd0" + restart: on-failure + tidb: + image: pingcap/tidb:v8.5.1 + # ports: + # - "4000:4000" + volumes: + - ./volumes/logs:/logs + command: + - --advertise-address=tidb + - --store=tikv + - --path=pd0:2379 + - --log-file=/logs/tidb.log + depends_on: + - "tikv" + restart: on-failure + tiflash: + image: pingcap/tiflash:v8.5.1 + volumes: + - ./config/tiflash.toml:/tiflash.toml:ro + - ./config/tiflash-learner.toml:/tiflash-learner.toml:ro + - ./volumes/data:/data + - ./volumes/logs:/logs + command: + - server + - --config-file=/tiflash.toml + depends_on: + - "tikv" + - "tidb" + restart: on-failure diff --git a/docker/dify/volumes/app/storage/.init_permissions b/docker/dify/volumes/app/storage/.init_permissions new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/app/storage/privkeys/fe3bcf55-9a04-4850-8473-7f97e1c09b97/private.pem b/docker/dify/volumes/app/storage/privkeys/fe3bcf55-9a04-4850-8473-7f97e1c09b97/private.pem new file mode 100644 index 00000000..0b44027f --- /dev/null +++ b/docker/dify/volumes/app/storage/privkeys/fe3bcf55-9a04-4850-8473-7f97e1c09b97/private.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAzviset7ubYZgOjpGZTLgI01lkJ1b54EZCctU+KKd3VJ9B/su +cCTZ1ql7Fs5B4shZUu2MQOlO2twDC3gxW8ENj+yyU+r8toukxar2Iie3Qsp5tcJH +mWsq7Imo5RmUGLLwDV8AU0xRc4bRD5YGwiwZcRPODpgQBpnsKKoPNyvCeudEPr2S +gs63aQCDyv1Ny9jLTjvvHr2k531M5wChzT5miu0r0R+Hjrah0XnbRlQUubqHJOLH +FFp+XJowd0KAN26fjpEbFY2FwRa5POlbc1e2PEu+s3WJa0Iz5GQbhcOJ7ppA9Rft +k2CEAoNHfkbZcAxsySa++8+1Nq4hLFJubDYnWwIDAQABAoIBABEJJ5acKj86SUoM +U+ZZMAPCh3Kbe94WootLgOdPk0jiqkdG5dqgiIxXujmf/oz+dVkTE8agAuKW1hVS +mQAhaCQJlTVnvnypX9r5UyBv6Rtb88qsfseM/6UlQOaimq2xxM/aRaTq6jq6b74l +ria7Xy4PNZhpQcsZTkvxO3wMuQmelkkuhqbQF2fpNTTIZfbEehJatOTWIcWWkqRo +mZkKd4pHluaXDvczFFo31jSJ4jzrJS11Tx1s21rM4Iq2W+3B6nEVfvHaFqWMHve7 ++22ZWUUiMJbIpr7hy0bSBjY78HdR/EcQqPqT7uEawFaft8ybMP5AkuLEG9I6VtWq +gfPX/ckCgYEA3XbHuDP6Yzlc9tXapQEulM82B3mDtKAX72AqYGEpvZInrge6Fjwq +SdMGQHP/VsLq7t78g9negYQjT6J0qJ2V6s/1iVyr6uU3IQ06Q7+8xp6AQPSFShJk +o2nnODuvVMwwwH94ga1ntfPdzhYKfJ2E9Cbbn+NUZB/uxnsAxTTGGNcCgYEA7z9S +/M8eUfCOEBEC9EGuto8/hZ7Zmm0fuAdKx0zZzSVsKxeHUQoQJ1YQfnjKdlxNv1FI +K9g7wcMEvkUv/CMx7pQ/R4eyvbGlxGRAy1jUhgx1hxifBeYKd5j5BMAQ8n3/uRLR +3czW7i8Xzy0Z97kfy9ZHllbnbZQvYceDQY2ngR0CgYEA272Wz4PrhnaNcnGg/6Yb +lRXA80uzzg4nkaGminj+FJYnfvs1vgg2oYecJWmzSmAfAaMJhL4xk+sLqmF0RTYP +Yay0YXYtMuX6fHYGgOCHq7/rXAgDFQsJBkf3X4mBH693FBmm9WycgiKVy319LEaT +fDnuI0hKHQq+PfwgOIxznoMCgYBGj9WpDGkz34/2ux207p5Z55vji/s/6YleXIA4 +kbj3IV9qwjC9vQsQnviUZInKKOUhVRbFH6xYNG10tLE3WyYB6KVVMneMLRXn+22E +y/k6Y/hR1Pgp5DQYG/zt4rvc2T6P1jYhhaWqcCdEilfLUUVIeDV66Lyu+/KRkydq +MR5DHQKBgHn3HNAiHfLVef7+unoYu8ak6uqj5V74IJZdvcNZ4jUz7onk2o3h7pj0 +9xzWoakzv1ypK6rVBYr+2U4Mn728kz90rR9VV05YwbMQBcBH0gmBfGdbUjI9PH/+ +iUoxHK0G55ArzmZFtRGUpmEFak4xTpM48Wn5VApe9kMt3yX+FBbD +-----END RSA PRIVATE KEY----- \ No newline at end of file diff --git a/docker/dify/volumes/app/storage/upload_files/fe3bcf55-9a04-4850-8473-7f97e1c09b97/a2c5e6ca-4896-439b-8175-e38d9fb820f8.txt b/docker/dify/volumes/app/storage/upload_files/fe3bcf55-9a04-4850-8473-7f97e1c09b97/a2c5e6ca-4896-439b-8175-e38d9fb820f8.txt new file mode 100644 index 00000000..74e18b78 --- /dev/null +++ b/docker/dify/volumes/app/storage/upload_files/fe3bcf55-9a04-4850-8473-7f97e1c09b97/a2c5e6ca-4896-439b-8175-e38d9fb820f8.txt @@ -0,0 +1,2 @@ + +开发人员:AAAA \ No newline at end of file diff --git a/docker/dify/volumes/app/storage/upload_files/fe3bcf55-9a04-4850-8473-7f97e1c09b97/adec7f6b-6c2b-4ba0-b100-32ba090fafb5.txt b/docker/dify/volumes/app/storage/upload_files/fe3bcf55-9a04-4850-8473-7f97e1c09b97/adec7f6b-6c2b-4ba0-b100-32ba090fafb5.txt new file mode 100644 index 00000000..0d625b4a --- /dev/null +++ b/docker/dify/volumes/app/storage/upload_files/fe3bcf55-9a04-4850-8473-7f97e1c09b97/adec7f6b-6c2b-4ba0-b100-32ba090fafb5.txt @@ -0,0 +1,4 @@ + +http://localhost/platform/admin/platform + +http://localhost:5173/datacenter \ No newline at end of file diff --git a/docker/dify/volumes/db/data/pgdata/PG_VERSION b/docker/dify/volumes/db/data/pgdata/PG_VERSION new file mode 100644 index 00000000..60d3b2f4 --- /dev/null +++ b/docker/dify/volumes/db/data/pgdata/PG_VERSION @@ -0,0 +1 @@ +15 diff --git a/docker/dify/volumes/db/data/pgdata/base/1/112 b/docker/dify/volumes/db/data/pgdata/base/1/112 new file mode 100644 index 00000000..784a4c13 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/112 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/113 b/docker/dify/volumes/db/data/pgdata/base/1/113 new file mode 100644 index 00000000..cc2c412b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/113 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/1247 b/docker/dify/volumes/db/data/pgdata/base/1/1247 new file mode 100644 index 00000000..a628646c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/1247 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/1247_fsm b/docker/dify/volumes/db/data/pgdata/base/1/1247_fsm new file mode 100644 index 00000000..d9ff302c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/1247_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/1247_vm b/docker/dify/volumes/db/data/pgdata/base/1/1247_vm new file mode 100644 index 00000000..cb141f85 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/1247_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/1249 b/docker/dify/volumes/db/data/pgdata/base/1/1249 new file mode 100644 index 00000000..40021b04 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/1249 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/1249_fsm b/docker/dify/volumes/db/data/pgdata/base/1/1249_fsm new file mode 100644 index 00000000..87def576 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/1249_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/1249_vm b/docker/dify/volumes/db/data/pgdata/base/1/1249_vm new file mode 100644 index 00000000..e7c32f42 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/1249_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/1255 b/docker/dify/volumes/db/data/pgdata/base/1/1255 new file mode 100644 index 00000000..549acf0e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/1255 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/1255_fsm b/docker/dify/volumes/db/data/pgdata/base/1/1255_fsm new file mode 100644 index 00000000..5abeaaf2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/1255_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/1255_vm b/docker/dify/volumes/db/data/pgdata/base/1/1255_vm new file mode 100644 index 00000000..7229f841 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/1255_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/1259 b/docker/dify/volumes/db/data/pgdata/base/1/1259 new file mode 100644 index 00000000..e1e60120 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/1259 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/1259_fsm b/docker/dify/volumes/db/data/pgdata/base/1/1259_fsm new file mode 100644 index 00000000..bb60b307 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/1259_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/1259_vm b/docker/dify/volumes/db/data/pgdata/base/1/1259_vm new file mode 100644 index 00000000..a3f14f7f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/1259_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13454 b/docker/dify/volumes/db/data/pgdata/base/1/13454 new file mode 100644 index 00000000..d655791d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13454 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13454_fsm b/docker/dify/volumes/db/data/pgdata/base/1/13454_fsm new file mode 100644 index 00000000..dff96115 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13454_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13454_vm b/docker/dify/volumes/db/data/pgdata/base/1/13454_vm new file mode 100644 index 00000000..4a8125b5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13454_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13457 b/docker/dify/volumes/db/data/pgdata/base/1/13457 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13458 b/docker/dify/volumes/db/data/pgdata/base/1/13458 new file mode 100644 index 00000000..3a40f331 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13458 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13459 b/docker/dify/volumes/db/data/pgdata/base/1/13459 new file mode 100644 index 00000000..8199ae15 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13459 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13459_fsm b/docker/dify/volumes/db/data/pgdata/base/1/13459_fsm new file mode 100644 index 00000000..70d16ce4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13459_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13459_vm b/docker/dify/volumes/db/data/pgdata/base/1/13459_vm new file mode 100644 index 00000000..b0ecc4c0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13459_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13462 b/docker/dify/volumes/db/data/pgdata/base/1/13462 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13463 b/docker/dify/volumes/db/data/pgdata/base/1/13463 new file mode 100644 index 00000000..fd105eb4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13463 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13464 b/docker/dify/volumes/db/data/pgdata/base/1/13464 new file mode 100644 index 00000000..8c69968b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13464 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13464_fsm b/docker/dify/volumes/db/data/pgdata/base/1/13464_fsm new file mode 100644 index 00000000..d388044f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13464_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13464_vm b/docker/dify/volumes/db/data/pgdata/base/1/13464_vm new file mode 100644 index 00000000..ea66334c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13464_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13467 b/docker/dify/volumes/db/data/pgdata/base/1/13467 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13468 b/docker/dify/volumes/db/data/pgdata/base/1/13468 new file mode 100644 index 00000000..3207e9e0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13468 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13469 b/docker/dify/volumes/db/data/pgdata/base/1/13469 new file mode 100644 index 00000000..baf18ff8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13469 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13469_fsm b/docker/dify/volumes/db/data/pgdata/base/1/13469_fsm new file mode 100644 index 00000000..a836ddf7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13469_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13469_vm b/docker/dify/volumes/db/data/pgdata/base/1/13469_vm new file mode 100644 index 00000000..c5da2a3c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13469_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13472 b/docker/dify/volumes/db/data/pgdata/base/1/13472 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/13473 b/docker/dify/volumes/db/data/pgdata/base/1/13473 new file mode 100644 index 00000000..32f23576 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/13473 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/1417 b/docker/dify/volumes/db/data/pgdata/base/1/1417 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/1418 b/docker/dify/volumes/db/data/pgdata/base/1/1418 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/174 b/docker/dify/volumes/db/data/pgdata/base/1/174 new file mode 100644 index 00000000..2e4cc9f3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/174 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/175 b/docker/dify/volumes/db/data/pgdata/base/1/175 new file mode 100644 index 00000000..15d51ddc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/175 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2187 b/docker/dify/volumes/db/data/pgdata/base/1/2187 new file mode 100644 index 00000000..cf6377d2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2187 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2224 b/docker/dify/volumes/db/data/pgdata/base/1/2224 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2228 b/docker/dify/volumes/db/data/pgdata/base/1/2228 new file mode 100644 index 00000000..738f259a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2228 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2328 b/docker/dify/volumes/db/data/pgdata/base/1/2328 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2336 b/docker/dify/volumes/db/data/pgdata/base/1/2336 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2337 b/docker/dify/volumes/db/data/pgdata/base/1/2337 new file mode 100644 index 00000000..105af49c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2337 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2579 b/docker/dify/volumes/db/data/pgdata/base/1/2579 new file mode 100644 index 00000000..ae0d53ad Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2579 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2600 b/docker/dify/volumes/db/data/pgdata/base/1/2600 new file mode 100644 index 00000000..a1305d7a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2600 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2600_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2600_fsm new file mode 100644 index 00000000..b8490844 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2600_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2600_vm b/docker/dify/volumes/db/data/pgdata/base/1/2600_vm new file mode 100644 index 00000000..7fac2cbe Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2600_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2601 b/docker/dify/volumes/db/data/pgdata/base/1/2601 new file mode 100644 index 00000000..d8001c8c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2601 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2601_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2601_fsm new file mode 100644 index 00000000..d388044f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2601_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2601_vm b/docker/dify/volumes/db/data/pgdata/base/1/2601_vm new file mode 100644 index 00000000..eb2d0155 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2601_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2602 b/docker/dify/volumes/db/data/pgdata/base/1/2602 new file mode 100644 index 00000000..4a27b0a3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2602 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2602_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2602_fsm new file mode 100644 index 00000000..23170d85 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2602_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2602_vm b/docker/dify/volumes/db/data/pgdata/base/1/2602_vm new file mode 100644 index 00000000..b7e83c3c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2602_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2603 b/docker/dify/volumes/db/data/pgdata/base/1/2603 new file mode 100644 index 00000000..d511af56 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2603 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2603_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2603_fsm new file mode 100644 index 00000000..949bd18f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2603_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2603_vm b/docker/dify/volumes/db/data/pgdata/base/1/2603_vm new file mode 100644 index 00000000..f073a603 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2603_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2604 b/docker/dify/volumes/db/data/pgdata/base/1/2604 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2605 b/docker/dify/volumes/db/data/pgdata/base/1/2605 new file mode 100644 index 00000000..eeaa7eaa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2605 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2605_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2605_fsm new file mode 100644 index 00000000..f3b92bf7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2605_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2605_vm b/docker/dify/volumes/db/data/pgdata/base/1/2605_vm new file mode 100644 index 00000000..85d1e841 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2605_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2606 b/docker/dify/volumes/db/data/pgdata/base/1/2606 new file mode 100644 index 00000000..4737fa77 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2606 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2606_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2606_fsm new file mode 100644 index 00000000..286dd813 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2606_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2606_vm b/docker/dify/volumes/db/data/pgdata/base/1/2606_vm new file mode 100644 index 00000000..86bc6bf5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2606_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2607 b/docker/dify/volumes/db/data/pgdata/base/1/2607 new file mode 100644 index 00000000..bfad49ae Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2607 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2607_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2607_fsm new file mode 100644 index 00000000..80ac8b14 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2607_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2607_vm b/docker/dify/volumes/db/data/pgdata/base/1/2607_vm new file mode 100644 index 00000000..c0a22c62 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2607_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2608 b/docker/dify/volumes/db/data/pgdata/base/1/2608 new file mode 100644 index 00000000..e75c37b5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2608 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2608_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2608_fsm new file mode 100644 index 00000000..6ba89a46 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2608_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2608_vm b/docker/dify/volumes/db/data/pgdata/base/1/2608_vm new file mode 100644 index 00000000..9a21eb75 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2608_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2609 b/docker/dify/volumes/db/data/pgdata/base/1/2609 new file mode 100644 index 00000000..2983f4db Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2609 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2609_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2609_fsm new file mode 100644 index 00000000..11f989b1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2609_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2609_vm b/docker/dify/volumes/db/data/pgdata/base/1/2609_vm new file mode 100644 index 00000000..61b91943 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2609_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2610 b/docker/dify/volumes/db/data/pgdata/base/1/2610 new file mode 100644 index 00000000..8251aeb8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2610 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2610_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2610_fsm new file mode 100644 index 00000000..dbd22e1f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2610_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2610_vm b/docker/dify/volumes/db/data/pgdata/base/1/2610_vm new file mode 100644 index 00000000..25f58e1c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2610_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2611 b/docker/dify/volumes/db/data/pgdata/base/1/2611 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2612 b/docker/dify/volumes/db/data/pgdata/base/1/2612 new file mode 100644 index 00000000..c39ab4d5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2612 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2612_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2612_fsm new file mode 100644 index 00000000..877976ac Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2612_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2612_vm b/docker/dify/volumes/db/data/pgdata/base/1/2612_vm new file mode 100644 index 00000000..ef0dbfff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2612_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2613 b/docker/dify/volumes/db/data/pgdata/base/1/2613 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2615 b/docker/dify/volumes/db/data/pgdata/base/1/2615 new file mode 100644 index 00000000..db72cea7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2615 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2615_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2615_fsm new file mode 100644 index 00000000..d041693e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2615_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2615_vm b/docker/dify/volumes/db/data/pgdata/base/1/2615_vm new file mode 100644 index 00000000..233f9690 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2615_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2616 b/docker/dify/volumes/db/data/pgdata/base/1/2616 new file mode 100644 index 00000000..0d60d797 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2616 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2616_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2616_fsm new file mode 100644 index 00000000..cb924c95 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2616_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2616_vm b/docker/dify/volumes/db/data/pgdata/base/1/2616_vm new file mode 100644 index 00000000..e704cec7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2616_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2617 b/docker/dify/volumes/db/data/pgdata/base/1/2617 new file mode 100644 index 00000000..bcdfc183 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2617 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2617_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2617_fsm new file mode 100644 index 00000000..29d60666 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2617_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2617_vm b/docker/dify/volumes/db/data/pgdata/base/1/2617_vm new file mode 100644 index 00000000..6db4a14c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2617_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2618 b/docker/dify/volumes/db/data/pgdata/base/1/2618 new file mode 100644 index 00000000..230b6370 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2618 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2618_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2618_fsm new file mode 100644 index 00000000..e162e372 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2618_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2618_vm b/docker/dify/volumes/db/data/pgdata/base/1/2618_vm new file mode 100644 index 00000000..7ad7e690 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2618_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2619 b/docker/dify/volumes/db/data/pgdata/base/1/2619 new file mode 100644 index 00000000..cc799065 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2619 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2619_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2619_fsm new file mode 100644 index 00000000..9924a538 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2619_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2619_vm b/docker/dify/volumes/db/data/pgdata/base/1/2619_vm new file mode 100644 index 00000000..f4a2283c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2619_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2620 b/docker/dify/volumes/db/data/pgdata/base/1/2620 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2650 b/docker/dify/volumes/db/data/pgdata/base/1/2650 new file mode 100644 index 00000000..32ff8a16 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2650 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2651 b/docker/dify/volumes/db/data/pgdata/base/1/2651 new file mode 100644 index 00000000..cff86c74 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2651 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2652 b/docker/dify/volumes/db/data/pgdata/base/1/2652 new file mode 100644 index 00000000..ab53706f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2652 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2653 b/docker/dify/volumes/db/data/pgdata/base/1/2653 new file mode 100644 index 00000000..86b08571 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2653 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2654 b/docker/dify/volumes/db/data/pgdata/base/1/2654 new file mode 100644 index 00000000..095a4fd5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2654 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2655 b/docker/dify/volumes/db/data/pgdata/base/1/2655 new file mode 100644 index 00000000..4b4b3cc6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2655 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2656 b/docker/dify/volumes/db/data/pgdata/base/1/2656 new file mode 100644 index 00000000..2fd9a71f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2656 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2657 b/docker/dify/volumes/db/data/pgdata/base/1/2657 new file mode 100644 index 00000000..d0384dc6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2657 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2658 b/docker/dify/volumes/db/data/pgdata/base/1/2658 new file mode 100644 index 00000000..2777e797 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2658 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2659 b/docker/dify/volumes/db/data/pgdata/base/1/2659 new file mode 100644 index 00000000..dd90e168 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2659 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2660 b/docker/dify/volumes/db/data/pgdata/base/1/2660 new file mode 100644 index 00000000..fd66d228 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2660 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2661 b/docker/dify/volumes/db/data/pgdata/base/1/2661 new file mode 100644 index 00000000..3c62a6fd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2661 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2662 b/docker/dify/volumes/db/data/pgdata/base/1/2662 new file mode 100644 index 00000000..b09801b1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2662 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2663 b/docker/dify/volumes/db/data/pgdata/base/1/2663 new file mode 100644 index 00000000..1fe3a98d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2663 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2664 b/docker/dify/volumes/db/data/pgdata/base/1/2664 new file mode 100644 index 00000000..a7761ead Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2664 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2665 b/docker/dify/volumes/db/data/pgdata/base/1/2665 new file mode 100644 index 00000000..024d2917 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2665 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2666 b/docker/dify/volumes/db/data/pgdata/base/1/2666 new file mode 100644 index 00000000..55842a3c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2666 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2667 b/docker/dify/volumes/db/data/pgdata/base/1/2667 new file mode 100644 index 00000000..40aa4997 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2667 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2668 b/docker/dify/volumes/db/data/pgdata/base/1/2668 new file mode 100644 index 00000000..8ca1619c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2668 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2669 b/docker/dify/volumes/db/data/pgdata/base/1/2669 new file mode 100644 index 00000000..b13c3353 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2669 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2670 b/docker/dify/volumes/db/data/pgdata/base/1/2670 new file mode 100644 index 00000000..936feee6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2670 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2673 b/docker/dify/volumes/db/data/pgdata/base/1/2673 new file mode 100644 index 00000000..e431d106 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2673 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2674 b/docker/dify/volumes/db/data/pgdata/base/1/2674 new file mode 100644 index 00000000..24e0beb2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2674 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2675 b/docker/dify/volumes/db/data/pgdata/base/1/2675 new file mode 100644 index 00000000..91709217 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2675 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2678 b/docker/dify/volumes/db/data/pgdata/base/1/2678 new file mode 100644 index 00000000..c718c7a0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2678 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2679 b/docker/dify/volumes/db/data/pgdata/base/1/2679 new file mode 100644 index 00000000..b296d1cb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2679 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2680 b/docker/dify/volumes/db/data/pgdata/base/1/2680 new file mode 100644 index 00000000..0d352e91 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2680 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2681 b/docker/dify/volumes/db/data/pgdata/base/1/2681 new file mode 100644 index 00000000..b13b323c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2681 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2682 b/docker/dify/volumes/db/data/pgdata/base/1/2682 new file mode 100644 index 00000000..3141bcdc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2682 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2683 b/docker/dify/volumes/db/data/pgdata/base/1/2683 new file mode 100644 index 00000000..117ee7ae Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2683 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2684 b/docker/dify/volumes/db/data/pgdata/base/1/2684 new file mode 100644 index 00000000..05092ecb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2684 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2685 b/docker/dify/volumes/db/data/pgdata/base/1/2685 new file mode 100644 index 00000000..5bf0c30f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2685 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2686 b/docker/dify/volumes/db/data/pgdata/base/1/2686 new file mode 100644 index 00000000..3054a565 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2686 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2687 b/docker/dify/volumes/db/data/pgdata/base/1/2687 new file mode 100644 index 00000000..349490ed Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2687 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2688 b/docker/dify/volumes/db/data/pgdata/base/1/2688 new file mode 100644 index 00000000..f00cec25 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2688 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2689 b/docker/dify/volumes/db/data/pgdata/base/1/2689 new file mode 100644 index 00000000..8329829d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2689 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2690 b/docker/dify/volumes/db/data/pgdata/base/1/2690 new file mode 100644 index 00000000..09176d40 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2690 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2691 b/docker/dify/volumes/db/data/pgdata/base/1/2691 new file mode 100644 index 00000000..6e60d7f1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2691 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2692 b/docker/dify/volumes/db/data/pgdata/base/1/2692 new file mode 100644 index 00000000..c7e275c1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2692 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2693 b/docker/dify/volumes/db/data/pgdata/base/1/2693 new file mode 100644 index 00000000..f6aef2f5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2693 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2696 b/docker/dify/volumes/db/data/pgdata/base/1/2696 new file mode 100644 index 00000000..f90fb0ea Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2696 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2699 b/docker/dify/volumes/db/data/pgdata/base/1/2699 new file mode 100644 index 00000000..4a755207 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2699 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2701 b/docker/dify/volumes/db/data/pgdata/base/1/2701 new file mode 100644 index 00000000..82f5cd0e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2701 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2702 b/docker/dify/volumes/db/data/pgdata/base/1/2702 new file mode 100644 index 00000000..2d6a98c2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2702 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2703 b/docker/dify/volumes/db/data/pgdata/base/1/2703 new file mode 100644 index 00000000..01c87ae8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2703 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2704 b/docker/dify/volumes/db/data/pgdata/base/1/2704 new file mode 100644 index 00000000..c3f65000 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2704 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2753 b/docker/dify/volumes/db/data/pgdata/base/1/2753 new file mode 100644 index 00000000..3c16dff6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2753 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2753_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2753_fsm new file mode 100644 index 00000000..642bce3b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2753_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2753_vm b/docker/dify/volumes/db/data/pgdata/base/1/2753_vm new file mode 100644 index 00000000..72c3e6de Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2753_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2754 b/docker/dify/volumes/db/data/pgdata/base/1/2754 new file mode 100644 index 00000000..bdd4d527 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2754 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2755 b/docker/dify/volumes/db/data/pgdata/base/1/2755 new file mode 100644 index 00000000..fd5d56a2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2755 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2756 b/docker/dify/volumes/db/data/pgdata/base/1/2756 new file mode 100644 index 00000000..6a044745 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2756 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2757 b/docker/dify/volumes/db/data/pgdata/base/1/2757 new file mode 100644 index 00000000..8f9ccdf0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2757 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2830 b/docker/dify/volumes/db/data/pgdata/base/1/2830 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2831 b/docker/dify/volumes/db/data/pgdata/base/1/2831 new file mode 100644 index 00000000..c0a407a0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2831 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2832 b/docker/dify/volumes/db/data/pgdata/base/1/2832 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2833 b/docker/dify/volumes/db/data/pgdata/base/1/2833 new file mode 100644 index 00000000..eea5df63 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2833 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2834 b/docker/dify/volumes/db/data/pgdata/base/1/2834 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2835 b/docker/dify/volumes/db/data/pgdata/base/1/2835 new file mode 100644 index 00000000..8aad1359 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2835 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2836 b/docker/dify/volumes/db/data/pgdata/base/1/2836 new file mode 100644 index 00000000..5c9f07f8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2836 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2836_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2836_fsm new file mode 100644 index 00000000..6e81497f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2836_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2836_vm b/docker/dify/volumes/db/data/pgdata/base/1/2836_vm new file mode 100644 index 00000000..5e43ad13 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2836_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2837 b/docker/dify/volumes/db/data/pgdata/base/1/2837 new file mode 100644 index 00000000..888d3af3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2837 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2838 b/docker/dify/volumes/db/data/pgdata/base/1/2838 new file mode 100644 index 00000000..e59ce108 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2838 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2838_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2838_fsm new file mode 100644 index 00000000..a9b1e030 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2838_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2838_vm b/docker/dify/volumes/db/data/pgdata/base/1/2838_vm new file mode 100644 index 00000000..cf7d8c70 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2838_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2839 b/docker/dify/volumes/db/data/pgdata/base/1/2839 new file mode 100644 index 00000000..1e07360f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2839 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2840 b/docker/dify/volumes/db/data/pgdata/base/1/2840 new file mode 100644 index 00000000..2c8f3044 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2840 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2840_fsm b/docker/dify/volumes/db/data/pgdata/base/1/2840_fsm new file mode 100644 index 00000000..911c9440 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2840_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2840_vm b/docker/dify/volumes/db/data/pgdata/base/1/2840_vm new file mode 100644 index 00000000..9520d1a2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2840_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2841 b/docker/dify/volumes/db/data/pgdata/base/1/2841 new file mode 100644 index 00000000..d31f7c67 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2841 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2995 b/docker/dify/volumes/db/data/pgdata/base/1/2995 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/2996 b/docker/dify/volumes/db/data/pgdata/base/1/2996 new file mode 100644 index 00000000..170333a4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/2996 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3079 b/docker/dify/volumes/db/data/pgdata/base/1/3079 new file mode 100644 index 00000000..06243ba7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3079 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3079_fsm b/docker/dify/volumes/db/data/pgdata/base/1/3079_fsm new file mode 100644 index 00000000..7732d22b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3079_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3079_vm b/docker/dify/volumes/db/data/pgdata/base/1/3079_vm new file mode 100644 index 00000000..f6c15836 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3079_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3080 b/docker/dify/volumes/db/data/pgdata/base/1/3080 new file mode 100644 index 00000000..e6b1f43e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3080 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3081 b/docker/dify/volumes/db/data/pgdata/base/1/3081 new file mode 100644 index 00000000..b9fb15c0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3081 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3085 b/docker/dify/volumes/db/data/pgdata/base/1/3085 new file mode 100644 index 00000000..e640c6e8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3085 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3118 b/docker/dify/volumes/db/data/pgdata/base/1/3118 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3119 b/docker/dify/volumes/db/data/pgdata/base/1/3119 new file mode 100644 index 00000000..db2bde09 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3119 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3164 b/docker/dify/volumes/db/data/pgdata/base/1/3164 new file mode 100644 index 00000000..f493af70 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3164 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3256 b/docker/dify/volumes/db/data/pgdata/base/1/3256 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3257 b/docker/dify/volumes/db/data/pgdata/base/1/3257 new file mode 100644 index 00000000..64787da2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3257 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3258 b/docker/dify/volumes/db/data/pgdata/base/1/3258 new file mode 100644 index 00000000..09abe9b9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3258 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3350 b/docker/dify/volumes/db/data/pgdata/base/1/3350 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3351 b/docker/dify/volumes/db/data/pgdata/base/1/3351 new file mode 100644 index 00000000..2bfef7fb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3351 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3379 b/docker/dify/volumes/db/data/pgdata/base/1/3379 new file mode 100644 index 00000000..caced87c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3379 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3380 b/docker/dify/volumes/db/data/pgdata/base/1/3380 new file mode 100644 index 00000000..55d6862d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3380 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3381 b/docker/dify/volumes/db/data/pgdata/base/1/3381 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3394 b/docker/dify/volumes/db/data/pgdata/base/1/3394 new file mode 100644 index 00000000..71374fc7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3394 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3394_fsm b/docker/dify/volumes/db/data/pgdata/base/1/3394_fsm new file mode 100644 index 00000000..9622a2f0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3394_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3394_vm b/docker/dify/volumes/db/data/pgdata/base/1/3394_vm new file mode 100644 index 00000000..d6dbec86 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3394_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3395 b/docker/dify/volumes/db/data/pgdata/base/1/3395 new file mode 100644 index 00000000..c31f4b0b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3395 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3429 b/docker/dify/volumes/db/data/pgdata/base/1/3429 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3430 b/docker/dify/volumes/db/data/pgdata/base/1/3430 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3431 b/docker/dify/volumes/db/data/pgdata/base/1/3431 new file mode 100644 index 00000000..ce872ee1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3431 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3433 b/docker/dify/volumes/db/data/pgdata/base/1/3433 new file mode 100644 index 00000000..68ea223e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3433 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3439 b/docker/dify/volumes/db/data/pgdata/base/1/3439 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3440 b/docker/dify/volumes/db/data/pgdata/base/1/3440 new file mode 100644 index 00000000..0545e4bb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3440 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3455 b/docker/dify/volumes/db/data/pgdata/base/1/3455 new file mode 100644 index 00000000..0767e59f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3455 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3456 b/docker/dify/volumes/db/data/pgdata/base/1/3456 new file mode 100644 index 00000000..1f4db93b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3456 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3456_fsm b/docker/dify/volumes/db/data/pgdata/base/1/3456_fsm new file mode 100644 index 00000000..8f765c68 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3456_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3456_vm b/docker/dify/volumes/db/data/pgdata/base/1/3456_vm new file mode 100644 index 00000000..c0a04f4d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3456_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3466 b/docker/dify/volumes/db/data/pgdata/base/1/3466 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3467 b/docker/dify/volumes/db/data/pgdata/base/1/3467 new file mode 100644 index 00000000..c7016e10 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3467 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3468 b/docker/dify/volumes/db/data/pgdata/base/1/3468 new file mode 100644 index 00000000..fab333bd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3468 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3501 b/docker/dify/volumes/db/data/pgdata/base/1/3501 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3502 b/docker/dify/volumes/db/data/pgdata/base/1/3502 new file mode 100644 index 00000000..ece495c9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3502 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3503 b/docker/dify/volumes/db/data/pgdata/base/1/3503 new file mode 100644 index 00000000..53f9b69e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3503 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3534 b/docker/dify/volumes/db/data/pgdata/base/1/3534 new file mode 100644 index 00000000..11fad3bb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3534 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3541 b/docker/dify/volumes/db/data/pgdata/base/1/3541 new file mode 100644 index 00000000..40869ad3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3541 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3541_fsm b/docker/dify/volumes/db/data/pgdata/base/1/3541_fsm new file mode 100644 index 00000000..a3a2de4d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3541_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3541_vm b/docker/dify/volumes/db/data/pgdata/base/1/3541_vm new file mode 100644 index 00000000..51f0e82e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3541_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3542 b/docker/dify/volumes/db/data/pgdata/base/1/3542 new file mode 100644 index 00000000..ced00669 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3542 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3574 b/docker/dify/volumes/db/data/pgdata/base/1/3574 new file mode 100644 index 00000000..b026df10 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3574 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3575 b/docker/dify/volumes/db/data/pgdata/base/1/3575 new file mode 100644 index 00000000..bdec5326 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3575 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3576 b/docker/dify/volumes/db/data/pgdata/base/1/3576 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3596 b/docker/dify/volumes/db/data/pgdata/base/1/3596 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3597 b/docker/dify/volumes/db/data/pgdata/base/1/3597 new file mode 100644 index 00000000..08855a4d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3597 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3598 b/docker/dify/volumes/db/data/pgdata/base/1/3598 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3599 b/docker/dify/volumes/db/data/pgdata/base/1/3599 new file mode 100644 index 00000000..aaf38926 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3599 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3600 b/docker/dify/volumes/db/data/pgdata/base/1/3600 new file mode 100644 index 00000000..a125931a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3600 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3600_fsm b/docker/dify/volumes/db/data/pgdata/base/1/3600_fsm new file mode 100644 index 00000000..cebec199 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3600_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3600_vm b/docker/dify/volumes/db/data/pgdata/base/1/3600_vm new file mode 100644 index 00000000..b9fcd6a9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3600_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3601 b/docker/dify/volumes/db/data/pgdata/base/1/3601 new file mode 100644 index 00000000..04c846ec Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3601 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3601_fsm b/docker/dify/volumes/db/data/pgdata/base/1/3601_fsm new file mode 100644 index 00000000..7732d22b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3601_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3601_vm b/docker/dify/volumes/db/data/pgdata/base/1/3601_vm new file mode 100644 index 00000000..3db367e2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3601_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3602 b/docker/dify/volumes/db/data/pgdata/base/1/3602 new file mode 100644 index 00000000..265567f1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3602 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3602_fsm b/docker/dify/volumes/db/data/pgdata/base/1/3602_fsm new file mode 100644 index 00000000..d7897de2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3602_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3602_vm b/docker/dify/volumes/db/data/pgdata/base/1/3602_vm new file mode 100644 index 00000000..9b4d7923 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3602_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3603 b/docker/dify/volumes/db/data/pgdata/base/1/3603 new file mode 100644 index 00000000..1b0d6cf3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3603 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3603_fsm b/docker/dify/volumes/db/data/pgdata/base/1/3603_fsm new file mode 100644 index 00000000..c28dd4fa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3603_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3603_vm b/docker/dify/volumes/db/data/pgdata/base/1/3603_vm new file mode 100644 index 00000000..102cff1b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3603_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3604 b/docker/dify/volumes/db/data/pgdata/base/1/3604 new file mode 100644 index 00000000..5aad5993 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3604 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3605 b/docker/dify/volumes/db/data/pgdata/base/1/3605 new file mode 100644 index 00000000..9f8d1fe7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3605 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3606 b/docker/dify/volumes/db/data/pgdata/base/1/3606 new file mode 100644 index 00000000..abe7a1cf Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3606 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3607 b/docker/dify/volumes/db/data/pgdata/base/1/3607 new file mode 100644 index 00000000..e3a3bbc6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3607 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3608 b/docker/dify/volumes/db/data/pgdata/base/1/3608 new file mode 100644 index 00000000..88266dac Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3608 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3609 b/docker/dify/volumes/db/data/pgdata/base/1/3609 new file mode 100644 index 00000000..5ff24567 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3609 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3712 b/docker/dify/volumes/db/data/pgdata/base/1/3712 new file mode 100644 index 00000000..aa23ee97 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3712 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3764 b/docker/dify/volumes/db/data/pgdata/base/1/3764 new file mode 100644 index 00000000..1c794036 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3764 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3764_fsm b/docker/dify/volumes/db/data/pgdata/base/1/3764_fsm new file mode 100644 index 00000000..f64db4df Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3764_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3764_vm b/docker/dify/volumes/db/data/pgdata/base/1/3764_vm new file mode 100644 index 00000000..d7118cad Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3764_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3766 b/docker/dify/volumes/db/data/pgdata/base/1/3766 new file mode 100644 index 00000000..c4134620 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3766 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3767 b/docker/dify/volumes/db/data/pgdata/base/1/3767 new file mode 100644 index 00000000..6cbae02d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3767 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/3997 b/docker/dify/volumes/db/data/pgdata/base/1/3997 new file mode 100644 index 00000000..8969d818 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/3997 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4143 b/docker/dify/volumes/db/data/pgdata/base/1/4143 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4144 b/docker/dify/volumes/db/data/pgdata/base/1/4144 new file mode 100644 index 00000000..5188a14b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4144 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4145 b/docker/dify/volumes/db/data/pgdata/base/1/4145 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4146 b/docker/dify/volumes/db/data/pgdata/base/1/4146 new file mode 100644 index 00000000..957732fc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4146 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4147 b/docker/dify/volumes/db/data/pgdata/base/1/4147 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4148 b/docker/dify/volumes/db/data/pgdata/base/1/4148 new file mode 100644 index 00000000..9c7057c3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4148 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4149 b/docker/dify/volumes/db/data/pgdata/base/1/4149 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4150 b/docker/dify/volumes/db/data/pgdata/base/1/4150 new file mode 100644 index 00000000..390d428a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4150 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4151 b/docker/dify/volumes/db/data/pgdata/base/1/4151 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4152 b/docker/dify/volumes/db/data/pgdata/base/1/4152 new file mode 100644 index 00000000..1a289fd8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4152 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4153 b/docker/dify/volumes/db/data/pgdata/base/1/4153 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4154 b/docker/dify/volumes/db/data/pgdata/base/1/4154 new file mode 100644 index 00000000..d0d1ca59 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4154 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4155 b/docker/dify/volumes/db/data/pgdata/base/1/4155 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4156 b/docker/dify/volumes/db/data/pgdata/base/1/4156 new file mode 100644 index 00000000..5b4bf370 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4156 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4157 b/docker/dify/volumes/db/data/pgdata/base/1/4157 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4158 b/docker/dify/volumes/db/data/pgdata/base/1/4158 new file mode 100644 index 00000000..937d3d28 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4158 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4159 b/docker/dify/volumes/db/data/pgdata/base/1/4159 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4160 b/docker/dify/volumes/db/data/pgdata/base/1/4160 new file mode 100644 index 00000000..d10cfd60 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4160 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4163 b/docker/dify/volumes/db/data/pgdata/base/1/4163 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4164 b/docker/dify/volumes/db/data/pgdata/base/1/4164 new file mode 100644 index 00000000..a94c963f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4164 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4165 b/docker/dify/volumes/db/data/pgdata/base/1/4165 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4166 b/docker/dify/volumes/db/data/pgdata/base/1/4166 new file mode 100644 index 00000000..2229586f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4166 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4167 b/docker/dify/volumes/db/data/pgdata/base/1/4167 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4168 b/docker/dify/volumes/db/data/pgdata/base/1/4168 new file mode 100644 index 00000000..472740b9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4168 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4169 b/docker/dify/volumes/db/data/pgdata/base/1/4169 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4170 b/docker/dify/volumes/db/data/pgdata/base/1/4170 new file mode 100644 index 00000000..88d09b3d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4170 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4171 b/docker/dify/volumes/db/data/pgdata/base/1/4171 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4172 b/docker/dify/volumes/db/data/pgdata/base/1/4172 new file mode 100644 index 00000000..3eed1ee2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4172 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4173 b/docker/dify/volumes/db/data/pgdata/base/1/4173 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/4174 b/docker/dify/volumes/db/data/pgdata/base/1/4174 new file mode 100644 index 00000000..a0819a24 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/4174 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/5002 b/docker/dify/volumes/db/data/pgdata/base/1/5002 new file mode 100644 index 00000000..aefa40dd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/5002 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/548 b/docker/dify/volumes/db/data/pgdata/base/1/548 new file mode 100644 index 00000000..7c6567d5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/548 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/549 b/docker/dify/volumes/db/data/pgdata/base/1/549 new file mode 100644 index 00000000..26a3887d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/549 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6102 b/docker/dify/volumes/db/data/pgdata/base/1/6102 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6104 b/docker/dify/volumes/db/data/pgdata/base/1/6104 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6106 b/docker/dify/volumes/db/data/pgdata/base/1/6106 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6110 b/docker/dify/volumes/db/data/pgdata/base/1/6110 new file mode 100644 index 00000000..42e19200 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/6110 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6111 b/docker/dify/volumes/db/data/pgdata/base/1/6111 new file mode 100644 index 00000000..d012727d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/6111 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6112 b/docker/dify/volumes/db/data/pgdata/base/1/6112 new file mode 100644 index 00000000..293367c2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/6112 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6113 b/docker/dify/volumes/db/data/pgdata/base/1/6113 new file mode 100644 index 00000000..542f8faa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/6113 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6116 b/docker/dify/volumes/db/data/pgdata/base/1/6116 new file mode 100644 index 00000000..787d5d18 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/6116 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6117 b/docker/dify/volumes/db/data/pgdata/base/1/6117 new file mode 100644 index 00000000..2b5656b2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/6117 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6175 b/docker/dify/volumes/db/data/pgdata/base/1/6175 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6176 b/docker/dify/volumes/db/data/pgdata/base/1/6176 new file mode 100644 index 00000000..bfd14df5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/6176 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6228 b/docker/dify/volumes/db/data/pgdata/base/1/6228 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6229 b/docker/dify/volumes/db/data/pgdata/base/1/6229 new file mode 100644 index 00000000..5d03213f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/6229 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6237 b/docker/dify/volumes/db/data/pgdata/base/1/6237 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6238 b/docker/dify/volumes/db/data/pgdata/base/1/6238 new file mode 100644 index 00000000..e7c0e8c3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/6238 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/6239 b/docker/dify/volumes/db/data/pgdata/base/1/6239 new file mode 100644 index 00000000..6c60b507 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/6239 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/826 b/docker/dify/volumes/db/data/pgdata/base/1/826 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/1/827 b/docker/dify/volumes/db/data/pgdata/base/1/827 new file mode 100644 index 00000000..94a900ec Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/827 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/828 b/docker/dify/volumes/db/data/pgdata/base/1/828 new file mode 100644 index 00000000..ca304614 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/828 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/1/PG_VERSION b/docker/dify/volumes/db/data/pgdata/base/1/PG_VERSION new file mode 100644 index 00000000..60d3b2f4 --- /dev/null +++ b/docker/dify/volumes/db/data/pgdata/base/1/PG_VERSION @@ -0,0 +1 @@ +15 diff --git a/docker/dify/volumes/db/data/pgdata/base/1/pg_filenode.map b/docker/dify/volumes/db/data/pgdata/base/1/pg_filenode.map new file mode 100644 index 00000000..193d78f3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/1/pg_filenode.map differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/112 b/docker/dify/volumes/db/data/pgdata/base/16384/112 new file mode 100644 index 00000000..25abbe18 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/112 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/113 b/docker/dify/volumes/db/data/pgdata/base/16384/113 new file mode 100644 index 00000000..a80f205b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/113 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/1247 b/docker/dify/volumes/db/data/pgdata/base/16384/1247 new file mode 100644 index 00000000..b3ebfdfd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/1247 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/1247_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/1247_fsm new file mode 100644 index 00000000..ded7942c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/1247_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/1247_vm b/docker/dify/volumes/db/data/pgdata/base/16384/1247_vm new file mode 100644 index 00000000..fe75f988 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/1247_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/1249 b/docker/dify/volumes/db/data/pgdata/base/16384/1249 new file mode 100644 index 00000000..7fbfd7cb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/1249 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/1249_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/1249_fsm new file mode 100644 index 00000000..cad5d3ea Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/1249_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/1249_vm b/docker/dify/volumes/db/data/pgdata/base/16384/1249_vm new file mode 100644 index 00000000..dc05e060 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/1249_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/1255 b/docker/dify/volumes/db/data/pgdata/base/16384/1255 new file mode 100644 index 00000000..44839fc3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/1255 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/1255_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/1255_fsm new file mode 100644 index 00000000..1da47ca5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/1255_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/1255_vm b/docker/dify/volumes/db/data/pgdata/base/16384/1255_vm new file mode 100644 index 00000000..84965158 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/1255_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/1259 b/docker/dify/volumes/db/data/pgdata/base/16384/1259 new file mode 100644 index 00000000..4984f36f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/1259 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/1259_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/1259_fsm new file mode 100644 index 00000000..ade259ec Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/1259_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/1259_vm b/docker/dify/volumes/db/data/pgdata/base/16384/1259_vm new file mode 100644 index 00000000..0947432d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/1259_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13454 b/docker/dify/volumes/db/data/pgdata/base/16384/13454 new file mode 100644 index 00000000..7875149a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13454 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13454_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/13454_fsm new file mode 100644 index 00000000..75dbb92a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13454_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13454_vm b/docker/dify/volumes/db/data/pgdata/base/16384/13454_vm new file mode 100644 index 00000000..2d1ddd05 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13454_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13457 b/docker/dify/volumes/db/data/pgdata/base/16384/13457 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13458 b/docker/dify/volumes/db/data/pgdata/base/16384/13458 new file mode 100644 index 00000000..4af3f5ff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13458 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13459 b/docker/dify/volumes/db/data/pgdata/base/16384/13459 new file mode 100644 index 00000000..2c9e6aed Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13459 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13459_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/13459_fsm new file mode 100644 index 00000000..294cb014 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13459_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13459_vm b/docker/dify/volumes/db/data/pgdata/base/16384/13459_vm new file mode 100644 index 00000000..5765fcf6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13459_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13462 b/docker/dify/volumes/db/data/pgdata/base/16384/13462 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13463 b/docker/dify/volumes/db/data/pgdata/base/16384/13463 new file mode 100644 index 00000000..2caed3a9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13463 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13464 b/docker/dify/volumes/db/data/pgdata/base/16384/13464 new file mode 100644 index 00000000..15bfeab8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13464 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13464_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/13464_fsm new file mode 100644 index 00000000..648ca85d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13464_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13464_vm b/docker/dify/volumes/db/data/pgdata/base/16384/13464_vm new file mode 100644 index 00000000..158a38d6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13464_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13467 b/docker/dify/volumes/db/data/pgdata/base/16384/13467 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13468 b/docker/dify/volumes/db/data/pgdata/base/16384/13468 new file mode 100644 index 00000000..ec59efe4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13468 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13469 b/docker/dify/volumes/db/data/pgdata/base/16384/13469 new file mode 100644 index 00000000..3bda3969 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13469 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13469_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/13469_fsm new file mode 100644 index 00000000..fe1059df Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13469_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13469_vm b/docker/dify/volumes/db/data/pgdata/base/16384/13469_vm new file mode 100644 index 00000000..89259d61 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13469_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13472 b/docker/dify/volumes/db/data/pgdata/base/16384/13472 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/13473 b/docker/dify/volumes/db/data/pgdata/base/16384/13473 new file mode 100644 index 00000000..7bd890cf Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/13473 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/1417 b/docker/dify/volumes/db/data/pgdata/base/16384/1417 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/1418 b/docker/dify/volumes/db/data/pgdata/base/16384/1418 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16385 b/docker/dify/volumes/db/data/pgdata/base/16384/16385 new file mode 100644 index 00000000..811b2d63 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16385 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16385_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/16385_fsm new file mode 100644 index 00000000..0908076c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16385_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16385_vm b/docker/dify/volumes/db/data/pgdata/base/16384/16385_vm new file mode 100644 index 00000000..fcfce801 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16385_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16388 b/docker/dify/volumes/db/data/pgdata/base/16384/16388 new file mode 100644 index 00000000..9460e7fc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16388 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16401 b/docker/dify/volumes/db/data/pgdata/base/16384/16401 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16407 b/docker/dify/volumes/db/data/pgdata/base/16384/16407 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16408 b/docker/dify/volumes/db/data/pgdata/base/16384/16408 new file mode 100644 index 00000000..53a27bc8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16408 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16409 b/docker/dify/volumes/db/data/pgdata/base/16384/16409 new file mode 100644 index 00000000..9fe6b53d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16409 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16411 b/docker/dify/volumes/db/data/pgdata/base/16384/16411 new file mode 100644 index 00000000..57f59779 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16411 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16413 b/docker/dify/volumes/db/data/pgdata/base/16384/16413 new file mode 100644 index 00000000..b7697dc2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16413 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16415 b/docker/dify/volumes/db/data/pgdata/base/16384/16415 new file mode 100644 index 00000000..1b7210aa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16415 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16422 b/docker/dify/volumes/db/data/pgdata/base/16384/16422 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16423 b/docker/dify/volumes/db/data/pgdata/base/16384/16423 new file mode 100644 index 00000000..0e25c391 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16423 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16424 b/docker/dify/volumes/db/data/pgdata/base/16384/16424 new file mode 100644 index 00000000..8aa1241b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16424 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16426 b/docker/dify/volumes/db/data/pgdata/base/16384/16426 new file mode 100644 index 00000000..6a22756a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16426 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16427 b/docker/dify/volumes/db/data/pgdata/base/16384/16427 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16432 b/docker/dify/volumes/db/data/pgdata/base/16384/16432 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16433 b/docker/dify/volumes/db/data/pgdata/base/16384/16433 new file mode 100644 index 00000000..c42697ad Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16433 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16434 b/docker/dify/volumes/db/data/pgdata/base/16384/16434 new file mode 100644 index 00000000..84f8839f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16434 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16436 b/docker/dify/volumes/db/data/pgdata/base/16384/16436 new file mode 100644 index 00000000..5608bcff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16436 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16437 b/docker/dify/volumes/db/data/pgdata/base/16384/16437 new file mode 100644 index 00000000..a2f25187 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16437 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16442 b/docker/dify/volumes/db/data/pgdata/base/16384/16442 new file mode 100644 index 00000000..d5ed286c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16442 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16444 b/docker/dify/volumes/db/data/pgdata/base/16384/16444 new file mode 100644 index 00000000..73f84581 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16444 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16445 b/docker/dify/volumes/db/data/pgdata/base/16384/16445 new file mode 100644 index 00000000..00bb9a62 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16445 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16446 b/docker/dify/volumes/db/data/pgdata/base/16384/16446 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16451 b/docker/dify/volumes/db/data/pgdata/base/16384/16451 new file mode 100644 index 00000000..8a8b57da Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16451 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16453 b/docker/dify/volumes/db/data/pgdata/base/16384/16453 new file mode 100644 index 00000000..e6424dfb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16453 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16454 b/docker/dify/volumes/db/data/pgdata/base/16384/16454 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16460 b/docker/dify/volumes/db/data/pgdata/base/16384/16460 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16461 b/docker/dify/volumes/db/data/pgdata/base/16384/16461 new file mode 100644 index 00000000..78b8d11c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16461 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16462 b/docker/dify/volumes/db/data/pgdata/base/16384/16462 new file mode 100644 index 00000000..4ac82413 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16462 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16464 b/docker/dify/volumes/db/data/pgdata/base/16384/16464 new file mode 100644 index 00000000..88291e25 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16464 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16465 b/docker/dify/volumes/db/data/pgdata/base/16384/16465 new file mode 100644 index 00000000..abbdc6ff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16465 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16474 b/docker/dify/volumes/db/data/pgdata/base/16384/16474 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16475 b/docker/dify/volumes/db/data/pgdata/base/16384/16475 new file mode 100644 index 00000000..9e573e16 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16475 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16476 b/docker/dify/volumes/db/data/pgdata/base/16384/16476 new file mode 100644 index 00000000..a8ad0699 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16476 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16478 b/docker/dify/volumes/db/data/pgdata/base/16384/16478 new file mode 100644 index 00000000..1b9b2650 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16478 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16479 b/docker/dify/volumes/db/data/pgdata/base/16384/16479 new file mode 100644 index 00000000..ecaf87fa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16479 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16480 b/docker/dify/volumes/db/data/pgdata/base/16384/16480 new file mode 100644 index 00000000..77254d8f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16480 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16481 b/docker/dify/volumes/db/data/pgdata/base/16384/16481 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16485 b/docker/dify/volumes/db/data/pgdata/base/16384/16485 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16486 b/docker/dify/volumes/db/data/pgdata/base/16384/16486 new file mode 100644 index 00000000..469b9ff9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16486 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16487 b/docker/dify/volumes/db/data/pgdata/base/16384/16487 new file mode 100644 index 00000000..a7be9f21 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16487 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16489 b/docker/dify/volumes/db/data/pgdata/base/16384/16489 new file mode 100644 index 00000000..7d66eb7a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16489 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16491 b/docker/dify/volumes/db/data/pgdata/base/16384/16491 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16495 b/docker/dify/volumes/db/data/pgdata/base/16384/16495 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16496 b/docker/dify/volumes/db/data/pgdata/base/16384/16496 new file mode 100644 index 00000000..6021cae1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16496 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16497 b/docker/dify/volumes/db/data/pgdata/base/16384/16497 new file mode 100644 index 00000000..988eb0f8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16497 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16499 b/docker/dify/volumes/db/data/pgdata/base/16384/16499 new file mode 100644 index 00000000..862ca6e8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16499 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16501 b/docker/dify/volumes/db/data/pgdata/base/16384/16501 new file mode 100644 index 00000000..4dde6917 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16501 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16501_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/16501_fsm new file mode 100644 index 00000000..ec5ff948 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16501_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16508 b/docker/dify/volumes/db/data/pgdata/base/16384/16508 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16509 b/docker/dify/volumes/db/data/pgdata/base/16384/16509 new file mode 100644 index 00000000..0d8fbb9c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16509 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16510 b/docker/dify/volumes/db/data/pgdata/base/16384/16510 new file mode 100644 index 00000000..4959ef37 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16510 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16512 b/docker/dify/volumes/db/data/pgdata/base/16384/16512 new file mode 100644 index 00000000..16487dfd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16512 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16513 b/docker/dify/volumes/db/data/pgdata/base/16384/16513 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16517 b/docker/dify/volumes/db/data/pgdata/base/16384/16517 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16518 b/docker/dify/volumes/db/data/pgdata/base/16384/16518 new file mode 100644 index 00000000..a2ab58c7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16518 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16519 b/docker/dify/volumes/db/data/pgdata/base/16384/16519 new file mode 100644 index 00000000..4e842655 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16519 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16521 b/docker/dify/volumes/db/data/pgdata/base/16384/16521 new file mode 100644 index 00000000..dfdae640 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16521 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16523 b/docker/dify/volumes/db/data/pgdata/base/16384/16523 new file mode 100644 index 00000000..cf403b2b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16523 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16524 b/docker/dify/volumes/db/data/pgdata/base/16384/16524 new file mode 100644 index 00000000..7fd9e2e3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16524 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16530 b/docker/dify/volumes/db/data/pgdata/base/16384/16530 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16531 b/docker/dify/volumes/db/data/pgdata/base/16384/16531 new file mode 100644 index 00000000..b819ee4f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16531 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16532 b/docker/dify/volumes/db/data/pgdata/base/16384/16532 new file mode 100644 index 00000000..c8a4126d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16532 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16534 b/docker/dify/volumes/db/data/pgdata/base/16384/16534 new file mode 100644 index 00000000..415e21f1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16534 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16535 b/docker/dify/volumes/db/data/pgdata/base/16384/16535 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16540 b/docker/dify/volumes/db/data/pgdata/base/16384/16540 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16541 b/docker/dify/volumes/db/data/pgdata/base/16384/16541 new file mode 100644 index 00000000..109e2fe7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16541 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16542 b/docker/dify/volumes/db/data/pgdata/base/16384/16542 new file mode 100644 index 00000000..27ab8a52 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16542 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16544 b/docker/dify/volumes/db/data/pgdata/base/16384/16544 new file mode 100644 index 00000000..0f08d47f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16544 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16545 b/docker/dify/volumes/db/data/pgdata/base/16384/16545 new file mode 100644 index 00000000..c38b6b0e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16545 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16553 b/docker/dify/volumes/db/data/pgdata/base/16384/16553 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16554 b/docker/dify/volumes/db/data/pgdata/base/16384/16554 new file mode 100644 index 00000000..bd13a1ec Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16554 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16555 b/docker/dify/volumes/db/data/pgdata/base/16384/16555 new file mode 100644 index 00000000..c245cfe7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16555 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16557 b/docker/dify/volumes/db/data/pgdata/base/16384/16557 new file mode 100644 index 00000000..7b0bdb76 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16557 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16558 b/docker/dify/volumes/db/data/pgdata/base/16384/16558 new file mode 100644 index 00000000..3a86c508 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16558 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16562 b/docker/dify/volumes/db/data/pgdata/base/16384/16562 new file mode 100644 index 00000000..fa8ab846 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16562 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16564 b/docker/dify/volumes/db/data/pgdata/base/16384/16564 new file mode 100644 index 00000000..48e6d4f8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16564 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16564_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/16564_fsm new file mode 100644 index 00000000..c9ab17b2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16564_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16571 b/docker/dify/volumes/db/data/pgdata/base/16384/16571 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16572 b/docker/dify/volumes/db/data/pgdata/base/16384/16572 new file mode 100644 index 00000000..4a326067 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16572 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16573 b/docker/dify/volumes/db/data/pgdata/base/16384/16573 new file mode 100644 index 00000000..c18eafe5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16573 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16575 b/docker/dify/volumes/db/data/pgdata/base/16384/16575 new file mode 100644 index 00000000..c47ec098 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16575 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16577 b/docker/dify/volumes/db/data/pgdata/base/16384/16577 new file mode 100644 index 00000000..1c5b0b09 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16577 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16578 b/docker/dify/volumes/db/data/pgdata/base/16384/16578 new file mode 100644 index 00000000..f2b3bdc3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16578 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16579 b/docker/dify/volumes/db/data/pgdata/base/16384/16579 new file mode 100644 index 00000000..ab4c8a65 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16579 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16596 b/docker/dify/volumes/db/data/pgdata/base/16384/16596 new file mode 100644 index 00000000..380b157c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16596 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16601 b/docker/dify/volumes/db/data/pgdata/base/16384/16601 new file mode 100644 index 00000000..3ac89039 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16601 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16601_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/16601_fsm new file mode 100644 index 00000000..c2b733de Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16601_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16602 b/docker/dify/volumes/db/data/pgdata/base/16384/16602 new file mode 100644 index 00000000..828df7b2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16602 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16603 b/docker/dify/volumes/db/data/pgdata/base/16384/16603 new file mode 100644 index 00000000..0a5a0c66 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16603 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16607 b/docker/dify/volumes/db/data/pgdata/base/16384/16607 new file mode 100644 index 00000000..96b294ef Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16607 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16614 b/docker/dify/volumes/db/data/pgdata/base/16384/16614 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16615 b/docker/dify/volumes/db/data/pgdata/base/16384/16615 new file mode 100644 index 00000000..7ac12444 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16615 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16616 b/docker/dify/volumes/db/data/pgdata/base/16384/16616 new file mode 100644 index 00000000..548155ea Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16616 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16618 b/docker/dify/volumes/db/data/pgdata/base/16384/16618 new file mode 100644 index 00000000..97218675 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16618 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16619 b/docker/dify/volumes/db/data/pgdata/base/16384/16619 new file mode 100644 index 00000000..bc33d636 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16619 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16620 b/docker/dify/volumes/db/data/pgdata/base/16384/16620 new file mode 100644 index 00000000..a8163559 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16620 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16626 b/docker/dify/volumes/db/data/pgdata/base/16384/16626 new file mode 100644 index 00000000..be4adb3b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16626 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16628 b/docker/dify/volumes/db/data/pgdata/base/16384/16628 new file mode 100644 index 00000000..160bb625 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16628 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16630 b/docker/dify/volumes/db/data/pgdata/base/16384/16630 new file mode 100644 index 00000000..0b29c386 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16630 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16631 b/docker/dify/volumes/db/data/pgdata/base/16384/16631 new file mode 100644 index 00000000..351667d2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16631 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16632 b/docker/dify/volumes/db/data/pgdata/base/16384/16632 new file mode 100644 index 00000000..ca08570b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16632 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16633 b/docker/dify/volumes/db/data/pgdata/base/16384/16633 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16639 b/docker/dify/volumes/db/data/pgdata/base/16384/16639 new file mode 100644 index 00000000..1650f061 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16639 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16641 b/docker/dify/volumes/db/data/pgdata/base/16384/16641 new file mode 100644 index 00000000..2f754580 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16641 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16642 b/docker/dify/volumes/db/data/pgdata/base/16384/16642 new file mode 100644 index 00000000..cee40dbb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16642 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16643 b/docker/dify/volumes/db/data/pgdata/base/16384/16643 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16648 b/docker/dify/volumes/db/data/pgdata/base/16384/16648 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16649 b/docker/dify/volumes/db/data/pgdata/base/16384/16649 new file mode 100644 index 00000000..4cf1f9ce Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16649 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16650 b/docker/dify/volumes/db/data/pgdata/base/16384/16650 new file mode 100644 index 00000000..9b610c54 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16650 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16652 b/docker/dify/volumes/db/data/pgdata/base/16384/16652 new file mode 100644 index 00000000..61767934 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16652 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16653 b/docker/dify/volumes/db/data/pgdata/base/16384/16653 new file mode 100644 index 00000000..2a7a137c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16653 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16654 b/docker/dify/volumes/db/data/pgdata/base/16384/16654 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16659 b/docker/dify/volumes/db/data/pgdata/base/16384/16659 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16660 b/docker/dify/volumes/db/data/pgdata/base/16384/16660 new file mode 100644 index 00000000..e40ba187 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16660 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16661 b/docker/dify/volumes/db/data/pgdata/base/16384/16661 new file mode 100644 index 00000000..5330def5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16661 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16663 b/docker/dify/volumes/db/data/pgdata/base/16384/16663 new file mode 100644 index 00000000..dbc7c1bb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16663 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16664 b/docker/dify/volumes/db/data/pgdata/base/16384/16664 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16670 b/docker/dify/volumes/db/data/pgdata/base/16384/16670 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16671 b/docker/dify/volumes/db/data/pgdata/base/16384/16671 new file mode 100644 index 00000000..5f93eb0a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16671 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16672 b/docker/dify/volumes/db/data/pgdata/base/16384/16672 new file mode 100644 index 00000000..464b4f46 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16672 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16674 b/docker/dify/volumes/db/data/pgdata/base/16384/16674 new file mode 100644 index 00000000..1cc838fc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16674 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16675 b/docker/dify/volumes/db/data/pgdata/base/16384/16675 new file mode 100644 index 00000000..75fb9651 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16675 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16676 b/docker/dify/volumes/db/data/pgdata/base/16384/16676 new file mode 100644 index 00000000..79c7b47b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16676 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16677 b/docker/dify/volumes/db/data/pgdata/base/16384/16677 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16683 b/docker/dify/volumes/db/data/pgdata/base/16384/16683 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16684 b/docker/dify/volumes/db/data/pgdata/base/16384/16684 new file mode 100644 index 00000000..a823cba3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16684 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16685 b/docker/dify/volumes/db/data/pgdata/base/16384/16685 new file mode 100644 index 00000000..91abaabc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16685 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16687 b/docker/dify/volumes/db/data/pgdata/base/16384/16687 new file mode 100644 index 00000000..49bf04ae Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16687 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16688 b/docker/dify/volumes/db/data/pgdata/base/16384/16688 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16693 b/docker/dify/volumes/db/data/pgdata/base/16384/16693 new file mode 100644 index 00000000..b28eaada Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16693 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16712 b/docker/dify/volumes/db/data/pgdata/base/16384/16712 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16718 b/docker/dify/volumes/db/data/pgdata/base/16384/16718 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16719 b/docker/dify/volumes/db/data/pgdata/base/16384/16719 new file mode 100644 index 00000000..fd3ef405 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16719 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16720 b/docker/dify/volumes/db/data/pgdata/base/16384/16720 new file mode 100644 index 00000000..ff450697 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16720 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16722 b/docker/dify/volumes/db/data/pgdata/base/16384/16722 new file mode 100644 index 00000000..6505172b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16722 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16724 b/docker/dify/volumes/db/data/pgdata/base/16384/16724 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16729 b/docker/dify/volumes/db/data/pgdata/base/16384/16729 new file mode 100644 index 00000000..7019e262 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16729 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16743 b/docker/dify/volumes/db/data/pgdata/base/16384/16743 new file mode 100644 index 00000000..d3ec863b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16743 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16751 b/docker/dify/volumes/db/data/pgdata/base/16384/16751 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16752 b/docker/dify/volumes/db/data/pgdata/base/16384/16752 new file mode 100644 index 00000000..1183d39d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16752 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16753 b/docker/dify/volumes/db/data/pgdata/base/16384/16753 new file mode 100644 index 00000000..998d5caa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16753 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16755 b/docker/dify/volumes/db/data/pgdata/base/16384/16755 new file mode 100644 index 00000000..c4646636 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16755 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16756 b/docker/dify/volumes/db/data/pgdata/base/16384/16756 new file mode 100644 index 00000000..ee452375 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16756 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16757 b/docker/dify/volumes/db/data/pgdata/base/16384/16757 new file mode 100644 index 00000000..0c58d5f1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16757 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16764 b/docker/dify/volumes/db/data/pgdata/base/16384/16764 new file mode 100644 index 00000000..429023f9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16764 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16766 b/docker/dify/volumes/db/data/pgdata/base/16384/16766 new file mode 100644 index 00000000..7c60d565 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16766 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16768 b/docker/dify/volumes/db/data/pgdata/base/16384/16768 new file mode 100644 index 00000000..408e4a4c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16768 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16769 b/docker/dify/volumes/db/data/pgdata/base/16384/16769 new file mode 100644 index 00000000..479dee62 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16769 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16770 b/docker/dify/volumes/db/data/pgdata/base/16384/16770 new file mode 100644 index 00000000..5282ddea Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16770 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16778 b/docker/dify/volumes/db/data/pgdata/base/16384/16778 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16779 b/docker/dify/volumes/db/data/pgdata/base/16384/16779 new file mode 100644 index 00000000..ecd39902 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16779 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16780 b/docker/dify/volumes/db/data/pgdata/base/16384/16780 new file mode 100644 index 00000000..b4fe9519 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16780 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16782 b/docker/dify/volumes/db/data/pgdata/base/16384/16782 new file mode 100644 index 00000000..c586285f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16782 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16788 b/docker/dify/volumes/db/data/pgdata/base/16384/16788 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16789 b/docker/dify/volumes/db/data/pgdata/base/16384/16789 new file mode 100644 index 00000000..b1e88d1d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16789 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16790 b/docker/dify/volumes/db/data/pgdata/base/16384/16790 new file mode 100644 index 00000000..7fac5e2d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16790 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16792 b/docker/dify/volumes/db/data/pgdata/base/16384/16792 new file mode 100644 index 00000000..f854d760 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16792 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16793 b/docker/dify/volumes/db/data/pgdata/base/16384/16793 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16799 b/docker/dify/volumes/db/data/pgdata/base/16384/16799 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16800 b/docker/dify/volumes/db/data/pgdata/base/16384/16800 new file mode 100644 index 00000000..78a6cd08 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16800 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16801 b/docker/dify/volumes/db/data/pgdata/base/16384/16801 new file mode 100644 index 00000000..9518f157 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16801 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16803 b/docker/dify/volumes/db/data/pgdata/base/16384/16803 new file mode 100644 index 00000000..ea4b0703 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16803 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16804 b/docker/dify/volumes/db/data/pgdata/base/16384/16804 new file mode 100644 index 00000000..e0177f46 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16804 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16805 b/docker/dify/volumes/db/data/pgdata/base/16384/16805 new file mode 100644 index 00000000..5ac3cfad Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16805 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16806 b/docker/dify/volumes/db/data/pgdata/base/16384/16806 new file mode 100644 index 00000000..99a0ad9b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16806 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16806_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/16806_fsm new file mode 100644 index 00000000..655a3294 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16806_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16816 b/docker/dify/volumes/db/data/pgdata/base/16384/16816 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16817 b/docker/dify/volumes/db/data/pgdata/base/16384/16817 new file mode 100644 index 00000000..fd350c1e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16817 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16818 b/docker/dify/volumes/db/data/pgdata/base/16384/16818 new file mode 100644 index 00000000..40550c92 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16818 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16820 b/docker/dify/volumes/db/data/pgdata/base/16384/16820 new file mode 100644 index 00000000..c66e669b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16820 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16821 b/docker/dify/volumes/db/data/pgdata/base/16384/16821 new file mode 100644 index 00000000..604ae6a4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16821 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16822 b/docker/dify/volumes/db/data/pgdata/base/16384/16822 new file mode 100644 index 00000000..407f171a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16822 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16823 b/docker/dify/volumes/db/data/pgdata/base/16384/16823 new file mode 100644 index 00000000..f7dc0837 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16823 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16825 b/docker/dify/volumes/db/data/pgdata/base/16384/16825 new file mode 100644 index 00000000..6702851b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16825 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16827 b/docker/dify/volumes/db/data/pgdata/base/16384/16827 new file mode 100644 index 00000000..7646da06 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16827 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16829 b/docker/dify/volumes/db/data/pgdata/base/16384/16829 new file mode 100644 index 00000000..e7f43f80 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16829 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16831 b/docker/dify/volumes/db/data/pgdata/base/16384/16831 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16838 b/docker/dify/volumes/db/data/pgdata/base/16384/16838 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16839 b/docker/dify/volumes/db/data/pgdata/base/16384/16839 new file mode 100644 index 00000000..be622d5d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16839 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16840 b/docker/dify/volumes/db/data/pgdata/base/16384/16840 new file mode 100644 index 00000000..b9ee0cb2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16840 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16861 b/docker/dify/volumes/db/data/pgdata/base/16384/16861 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16868 b/docker/dify/volumes/db/data/pgdata/base/16384/16868 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16869 b/docker/dify/volumes/db/data/pgdata/base/16384/16869 new file mode 100644 index 00000000..22217843 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16869 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16870 b/docker/dify/volumes/db/data/pgdata/base/16384/16870 new file mode 100644 index 00000000..3b522a01 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16870 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16872 b/docker/dify/volumes/db/data/pgdata/base/16384/16872 new file mode 100644 index 00000000..ceb79c02 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16872 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16874 b/docker/dify/volumes/db/data/pgdata/base/16384/16874 new file mode 100644 index 00000000..2d0044b2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16874 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16875 b/docker/dify/volumes/db/data/pgdata/base/16384/16875 new file mode 100644 index 00000000..38a2d960 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16875 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16881 b/docker/dify/volumes/db/data/pgdata/base/16384/16881 new file mode 100644 index 00000000..3c2b09d2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16881 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16883 b/docker/dify/volumes/db/data/pgdata/base/16384/16883 new file mode 100644 index 00000000..15059f4c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16883 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16884 b/docker/dify/volumes/db/data/pgdata/base/16384/16884 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16890 b/docker/dify/volumes/db/data/pgdata/base/16384/16890 new file mode 100644 index 00000000..233edf38 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16890 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16892 b/docker/dify/volumes/db/data/pgdata/base/16384/16892 new file mode 100644 index 00000000..c386121f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16892 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16901 b/docker/dify/volumes/db/data/pgdata/base/16384/16901 new file mode 100644 index 00000000..0bd063d4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16901 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16904 b/docker/dify/volumes/db/data/pgdata/base/16384/16904 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16905 b/docker/dify/volumes/db/data/pgdata/base/16384/16905 new file mode 100644 index 00000000..0f426f87 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16905 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16906 b/docker/dify/volumes/db/data/pgdata/base/16384/16906 new file mode 100644 index 00000000..fbfbb693 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16906 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16907 b/docker/dify/volumes/db/data/pgdata/base/16384/16907 new file mode 100644 index 00000000..8a26c969 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16907 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16908 b/docker/dify/volumes/db/data/pgdata/base/16384/16908 new file mode 100644 index 00000000..540ff214 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16908 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16909 b/docker/dify/volumes/db/data/pgdata/base/16384/16909 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16917 b/docker/dify/volumes/db/data/pgdata/base/16384/16917 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16918 b/docker/dify/volumes/db/data/pgdata/base/16384/16918 new file mode 100644 index 00000000..271ca094 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16918 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16919 b/docker/dify/volumes/db/data/pgdata/base/16384/16919 new file mode 100644 index 00000000..fed59e8e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16919 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16921 b/docker/dify/volumes/db/data/pgdata/base/16384/16921 new file mode 100644 index 00000000..cc0d2974 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16921 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16931 b/docker/dify/volumes/db/data/pgdata/base/16384/16931 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16936 b/docker/dify/volumes/db/data/pgdata/base/16384/16936 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16937 b/docker/dify/volumes/db/data/pgdata/base/16384/16937 new file mode 100644 index 00000000..624676ce Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16937 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16938 b/docker/dify/volumes/db/data/pgdata/base/16384/16938 new file mode 100644 index 00000000..6e15ce43 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16938 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16940 b/docker/dify/volumes/db/data/pgdata/base/16384/16940 new file mode 100644 index 00000000..b9daabf5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16940 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16941 b/docker/dify/volumes/db/data/pgdata/base/16384/16941 new file mode 100644 index 00000000..8aabfe2d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16941 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16946 b/docker/dify/volumes/db/data/pgdata/base/16384/16946 new file mode 100644 index 00000000..05c973b5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16946 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16948 b/docker/dify/volumes/db/data/pgdata/base/16384/16948 new file mode 100644 index 00000000..60b24792 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16948 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16949 b/docker/dify/volumes/db/data/pgdata/base/16384/16949 new file mode 100644 index 00000000..c020270f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16949 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16951 b/docker/dify/volumes/db/data/pgdata/base/16384/16951 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16956 b/docker/dify/volumes/db/data/pgdata/base/16384/16956 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16957 b/docker/dify/volumes/db/data/pgdata/base/16384/16957 new file mode 100644 index 00000000..e5bc7fac Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16957 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16958 b/docker/dify/volumes/db/data/pgdata/base/16384/16958 new file mode 100644 index 00000000..8f3ba1e2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16958 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16960 b/docker/dify/volumes/db/data/pgdata/base/16384/16960 new file mode 100644 index 00000000..d2cf48ce Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16960 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16961 b/docker/dify/volumes/db/data/pgdata/base/16384/16961 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16966 b/docker/dify/volumes/db/data/pgdata/base/16384/16966 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16967 b/docker/dify/volumes/db/data/pgdata/base/16384/16967 new file mode 100644 index 00000000..cd595708 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16967 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16968 b/docker/dify/volumes/db/data/pgdata/base/16384/16968 new file mode 100644 index 00000000..65101082 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16968 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16970 b/docker/dify/volumes/db/data/pgdata/base/16384/16970 new file mode 100644 index 00000000..bea3db69 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16970 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16971 b/docker/dify/volumes/db/data/pgdata/base/16384/16971 new file mode 100644 index 00000000..f1eed85c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16971 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16973 b/docker/dify/volumes/db/data/pgdata/base/16384/16973 new file mode 100644 index 00000000..78e63da3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16973 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16974 b/docker/dify/volumes/db/data/pgdata/base/16384/16974 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16979 b/docker/dify/volumes/db/data/pgdata/base/16384/16979 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16980 b/docker/dify/volumes/db/data/pgdata/base/16384/16980 new file mode 100644 index 00000000..781fd02d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16980 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16981 b/docker/dify/volumes/db/data/pgdata/base/16384/16981 new file mode 100644 index 00000000..e0ff5746 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16981 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16983 b/docker/dify/volumes/db/data/pgdata/base/16384/16983 new file mode 100644 index 00000000..fd8f76ff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16983 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16984 b/docker/dify/volumes/db/data/pgdata/base/16384/16984 new file mode 100644 index 00000000..78afc307 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16984 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16985 b/docker/dify/volumes/db/data/pgdata/base/16384/16985 new file mode 100644 index 00000000..14491067 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16985 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16989 b/docker/dify/volumes/db/data/pgdata/base/16384/16989 new file mode 100644 index 00000000..26e52a8a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16989 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16990 b/docker/dify/volumes/db/data/pgdata/base/16384/16990 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16997 b/docker/dify/volumes/db/data/pgdata/base/16384/16997 new file mode 100644 index 00000000..6ebef16e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16997 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/16999 b/docker/dify/volumes/db/data/pgdata/base/16384/16999 new file mode 100644 index 00000000..ec71df9a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/16999 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17010 b/docker/dify/volumes/db/data/pgdata/base/16384/17010 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17016 b/docker/dify/volumes/db/data/pgdata/base/16384/17016 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17017 b/docker/dify/volumes/db/data/pgdata/base/16384/17017 new file mode 100644 index 00000000..e6544aca Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17017 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17018 b/docker/dify/volumes/db/data/pgdata/base/16384/17018 new file mode 100644 index 00000000..6e6a1867 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17018 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17022 b/docker/dify/volumes/db/data/pgdata/base/16384/17022 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17028 b/docker/dify/volumes/db/data/pgdata/base/16384/17028 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17029 b/docker/dify/volumes/db/data/pgdata/base/16384/17029 new file mode 100644 index 00000000..c086d4be Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17029 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17030 b/docker/dify/volumes/db/data/pgdata/base/16384/17030 new file mode 100644 index 00000000..1b47b05e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17030 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17032 b/docker/dify/volumes/db/data/pgdata/base/16384/17032 new file mode 100644 index 00000000..01361260 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17032 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17041 b/docker/dify/volumes/db/data/pgdata/base/16384/17041 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17051 b/docker/dify/volumes/db/data/pgdata/base/16384/17051 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17052 b/docker/dify/volumes/db/data/pgdata/base/16384/17052 new file mode 100644 index 00000000..a10a6b19 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17052 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17053 b/docker/dify/volumes/db/data/pgdata/base/16384/17053 new file mode 100644 index 00000000..94ced266 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17053 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17055 b/docker/dify/volumes/db/data/pgdata/base/16384/17055 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17061 b/docker/dify/volumes/db/data/pgdata/base/16384/17061 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17062 b/docker/dify/volumes/db/data/pgdata/base/16384/17062 new file mode 100644 index 00000000..7fd5fa26 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17062 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17063 b/docker/dify/volumes/db/data/pgdata/base/16384/17063 new file mode 100644 index 00000000..a2cbca60 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17063 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17065 b/docker/dify/volumes/db/data/pgdata/base/16384/17065 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17068 b/docker/dify/volumes/db/data/pgdata/base/16384/17068 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17069 b/docker/dify/volumes/db/data/pgdata/base/16384/17069 new file mode 100644 index 00000000..9d8bdd84 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17069 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17070 b/docker/dify/volumes/db/data/pgdata/base/16384/17070 new file mode 100644 index 00000000..986ebc53 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17070 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17071 b/docker/dify/volumes/db/data/pgdata/base/16384/17071 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17075 b/docker/dify/volumes/db/data/pgdata/base/16384/17075 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17076 b/docker/dify/volumes/db/data/pgdata/base/16384/17076 new file mode 100644 index 00000000..db68b7e7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17076 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17077 b/docker/dify/volumes/db/data/pgdata/base/16384/17077 new file mode 100644 index 00000000..034fc7cd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17077 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17079 b/docker/dify/volumes/db/data/pgdata/base/16384/17079 new file mode 100644 index 00000000..0019f1e2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17079 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17080 b/docker/dify/volumes/db/data/pgdata/base/16384/17080 new file mode 100644 index 00000000..acf00e79 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17080 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17081 b/docker/dify/volumes/db/data/pgdata/base/16384/17081 new file mode 100644 index 00000000..09f26553 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17081 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17083 b/docker/dify/volumes/db/data/pgdata/base/16384/17083 new file mode 100644 index 00000000..4c79d83f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17083 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17086 b/docker/dify/volumes/db/data/pgdata/base/16384/17086 new file mode 100644 index 00000000..4ca6aae5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17086 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17090 b/docker/dify/volumes/db/data/pgdata/base/16384/17090 new file mode 100644 index 00000000..fa019609 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17090 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17092 b/docker/dify/volumes/db/data/pgdata/base/16384/17092 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17097 b/docker/dify/volumes/db/data/pgdata/base/16384/17097 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17098 b/docker/dify/volumes/db/data/pgdata/base/16384/17098 new file mode 100644 index 00000000..d866eb8b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17098 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17099 b/docker/dify/volumes/db/data/pgdata/base/16384/17099 new file mode 100644 index 00000000..7a3daccc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17099 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17101 b/docker/dify/volumes/db/data/pgdata/base/16384/17101 new file mode 100644 index 00000000..27dbb4f7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17101 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17102 b/docker/dify/volumes/db/data/pgdata/base/16384/17102 new file mode 100644 index 00000000..f71328b3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17102 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17102_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/17102_fsm new file mode 100644 index 00000000..55c10c5c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17102_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17108 b/docker/dify/volumes/db/data/pgdata/base/16384/17108 new file mode 100644 index 00000000..3665a687 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17108 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17109 b/docker/dify/volumes/db/data/pgdata/base/16384/17109 new file mode 100644 index 00000000..200df4d6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17109 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17110 b/docker/dify/volumes/db/data/pgdata/base/16384/17110 new file mode 100644 index 00000000..35df7967 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17110 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17112 b/docker/dify/volumes/db/data/pgdata/base/16384/17112 new file mode 100644 index 00000000..26253c67 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17112 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17113 b/docker/dify/volumes/db/data/pgdata/base/16384/17113 new file mode 100644 index 00000000..0c4245af Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17113 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17127 b/docker/dify/volumes/db/data/pgdata/base/16384/17127 new file mode 100644 index 00000000..422109a3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17127 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17127_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/17127_fsm new file mode 100644 index 00000000..0deb9155 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17127_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17132 b/docker/dify/volumes/db/data/pgdata/base/16384/17132 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17133 b/docker/dify/volumes/db/data/pgdata/base/16384/17133 new file mode 100644 index 00000000..0f2eaed4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17133 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17134 b/docker/dify/volumes/db/data/pgdata/base/16384/17134 new file mode 100644 index 00000000..a7ead0e9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17134 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17136 b/docker/dify/volumes/db/data/pgdata/base/16384/17136 new file mode 100644 index 00000000..3b680da3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17136 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17142 b/docker/dify/volumes/db/data/pgdata/base/16384/17142 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17147 b/docker/dify/volumes/db/data/pgdata/base/16384/17147 new file mode 100644 index 00000000..9c38b0a4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17147 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17149 b/docker/dify/volumes/db/data/pgdata/base/16384/17149 new file mode 100644 index 00000000..08f8ea5c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17149 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17150 b/docker/dify/volumes/db/data/pgdata/base/16384/17150 new file mode 100644 index 00000000..65ef314f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17150 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17151 b/docker/dify/volumes/db/data/pgdata/base/16384/17151 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17156 b/docker/dify/volumes/db/data/pgdata/base/16384/17156 new file mode 100644 index 00000000..8565cf33 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17156 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17158 b/docker/dify/volumes/db/data/pgdata/base/16384/17158 new file mode 100644 index 00000000..020656b0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17158 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17159 b/docker/dify/volumes/db/data/pgdata/base/16384/17159 new file mode 100644 index 00000000..52465cd0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17159 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17160 b/docker/dify/volumes/db/data/pgdata/base/16384/17160 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17167 b/docker/dify/volumes/db/data/pgdata/base/16384/17167 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17168 b/docker/dify/volumes/db/data/pgdata/base/16384/17168 new file mode 100644 index 00000000..e7824c7b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17168 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17169 b/docker/dify/volumes/db/data/pgdata/base/16384/17169 new file mode 100644 index 00000000..78d093f2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17169 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17171 b/docker/dify/volumes/db/data/pgdata/base/16384/17171 new file mode 100644 index 00000000..bbd177bd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17171 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17173 b/docker/dify/volumes/db/data/pgdata/base/16384/17173 new file mode 100644 index 00000000..30217487 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17173 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17175 b/docker/dify/volumes/db/data/pgdata/base/16384/17175 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17179 b/docker/dify/volumes/db/data/pgdata/base/16384/17179 new file mode 100644 index 00000000..dbaf7df2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17179 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17183 b/docker/dify/volumes/db/data/pgdata/base/16384/17183 new file mode 100644 index 00000000..1b0ad075 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17183 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17187 b/docker/dify/volumes/db/data/pgdata/base/16384/17187 new file mode 100644 index 00000000..6926a0ff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17187 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17194 b/docker/dify/volumes/db/data/pgdata/base/16384/17194 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17195 b/docker/dify/volumes/db/data/pgdata/base/16384/17195 new file mode 100644 index 00000000..f2aebe2c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17195 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17196 b/docker/dify/volumes/db/data/pgdata/base/16384/17196 new file mode 100644 index 00000000..09e41fd1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17196 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17198 b/docker/dify/volumes/db/data/pgdata/base/16384/17198 new file mode 100644 index 00000000..32ae8e07 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17198 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17199 b/docker/dify/volumes/db/data/pgdata/base/16384/17199 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17207 b/docker/dify/volumes/db/data/pgdata/base/16384/17207 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17208 b/docker/dify/volumes/db/data/pgdata/base/16384/17208 new file mode 100644 index 00000000..fd3768cb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17208 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17209 b/docker/dify/volumes/db/data/pgdata/base/16384/17209 new file mode 100644 index 00000000..963276bf Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17209 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17211 b/docker/dify/volumes/db/data/pgdata/base/16384/17211 new file mode 100644 index 00000000..5a290315 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17211 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17220 b/docker/dify/volumes/db/data/pgdata/base/16384/17220 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17221 b/docker/dify/volumes/db/data/pgdata/base/16384/17221 new file mode 100644 index 00000000..04f273ef Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17221 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17223 b/docker/dify/volumes/db/data/pgdata/base/16384/17223 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17230 b/docker/dify/volumes/db/data/pgdata/base/16384/17230 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17231 b/docker/dify/volumes/db/data/pgdata/base/16384/17231 new file mode 100644 index 00000000..d7d707a0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17231 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17232 b/docker/dify/volumes/db/data/pgdata/base/16384/17232 new file mode 100644 index 00000000..979b05cf Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17232 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17234 b/docker/dify/volumes/db/data/pgdata/base/16384/17234 new file mode 100644 index 00000000..b400b4be Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17234 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17235 b/docker/dify/volumes/db/data/pgdata/base/16384/17235 new file mode 100644 index 00000000..dc9a1f21 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17235 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17236 b/docker/dify/volumes/db/data/pgdata/base/16384/17236 new file mode 100644 index 00000000..ae45a4a7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17236 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17237 b/docker/dify/volumes/db/data/pgdata/base/16384/17237 new file mode 100644 index 00000000..180c4f0f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17237 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17250 b/docker/dify/volumes/db/data/pgdata/base/16384/17250 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17257 b/docker/dify/volumes/db/data/pgdata/base/16384/17257 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17258 b/docker/dify/volumes/db/data/pgdata/base/16384/17258 new file mode 100644 index 00000000..2973b8b5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17258 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17259 b/docker/dify/volumes/db/data/pgdata/base/16384/17259 new file mode 100644 index 00000000..2dd29482 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17259 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17261 b/docker/dify/volumes/db/data/pgdata/base/16384/17261 new file mode 100644 index 00000000..ce2d009c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17261 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17262 b/docker/dify/volumes/db/data/pgdata/base/16384/17262 new file mode 100644 index 00000000..dd5937d0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17262 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17263 b/docker/dify/volumes/db/data/pgdata/base/16384/17263 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17269 b/docker/dify/volumes/db/data/pgdata/base/16384/17269 new file mode 100644 index 00000000..453649f4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17269 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17271 b/docker/dify/volumes/db/data/pgdata/base/16384/17271 new file mode 100644 index 00000000..69af6694 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17271 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17272 b/docker/dify/volumes/db/data/pgdata/base/16384/17272 new file mode 100644 index 00000000..37e0ff7f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17272 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17273 b/docker/dify/volumes/db/data/pgdata/base/16384/17273 new file mode 100644 index 00000000..75f132ee Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17273 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17274 b/docker/dify/volumes/db/data/pgdata/base/16384/17274 new file mode 100644 index 00000000..882744e5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17274 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17283 b/docker/dify/volumes/db/data/pgdata/base/16384/17283 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17288 b/docker/dify/volumes/db/data/pgdata/base/16384/17288 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17289 b/docker/dify/volumes/db/data/pgdata/base/16384/17289 new file mode 100644 index 00000000..cc00beb6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17289 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17290 b/docker/dify/volumes/db/data/pgdata/base/16384/17290 new file mode 100644 index 00000000..69728bf9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17290 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17292 b/docker/dify/volumes/db/data/pgdata/base/16384/17292 new file mode 100644 index 00000000..b5a69ce3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17292 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17293 b/docker/dify/volumes/db/data/pgdata/base/16384/17293 new file mode 100644 index 00000000..af971a21 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17293 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17298 b/docker/dify/volumes/db/data/pgdata/base/16384/17298 new file mode 100644 index 00000000..5b79f88c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17298 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17299 b/docker/dify/volumes/db/data/pgdata/base/16384/17299 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17305 b/docker/dify/volumes/db/data/pgdata/base/16384/17305 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17306 b/docker/dify/volumes/db/data/pgdata/base/16384/17306 new file mode 100644 index 00000000..fe4fbc85 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17306 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17307 b/docker/dify/volumes/db/data/pgdata/base/16384/17307 new file mode 100644 index 00000000..11b333c0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17307 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17309 b/docker/dify/volumes/db/data/pgdata/base/16384/17309 new file mode 100644 index 00000000..c68d0570 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17309 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17310 b/docker/dify/volumes/db/data/pgdata/base/16384/17310 new file mode 100644 index 00000000..c4e2504b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17310 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17325 b/docker/dify/volumes/db/data/pgdata/base/16384/17325 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17332 b/docker/dify/volumes/db/data/pgdata/base/16384/17332 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17333 b/docker/dify/volumes/db/data/pgdata/base/16384/17333 new file mode 100644 index 00000000..9f5223c4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17333 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17334 b/docker/dify/volumes/db/data/pgdata/base/16384/17334 new file mode 100644 index 00000000..a8ee47f0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17334 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17336 b/docker/dify/volumes/db/data/pgdata/base/16384/17336 new file mode 100644 index 00000000..20a863ce Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17336 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17337 b/docker/dify/volumes/db/data/pgdata/base/16384/17337 new file mode 100644 index 00000000..ca8650c8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17337 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17338 b/docker/dify/volumes/db/data/pgdata/base/16384/17338 new file mode 100644 index 00000000..a8669b38 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17338 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17339 b/docker/dify/volumes/db/data/pgdata/base/16384/17339 new file mode 100644 index 00000000..d8b85285 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17339 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17340 b/docker/dify/volumes/db/data/pgdata/base/16384/17340 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17345 b/docker/dify/volumes/db/data/pgdata/base/16384/17345 new file mode 100644 index 00000000..157ef19e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17345 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17347 b/docker/dify/volumes/db/data/pgdata/base/16384/17347 new file mode 100644 index 00000000..95ea01b6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17347 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17350 b/docker/dify/volumes/db/data/pgdata/base/16384/17350 new file mode 100644 index 00000000..3d6e0685 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17350 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17352 b/docker/dify/volumes/db/data/pgdata/base/16384/17352 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17359 b/docker/dify/volumes/db/data/pgdata/base/16384/17359 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17360 b/docker/dify/volumes/db/data/pgdata/base/16384/17360 new file mode 100644 index 00000000..f08c9622 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17360 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17361 b/docker/dify/volumes/db/data/pgdata/base/16384/17361 new file mode 100644 index 00000000..a5efaade Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17361 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17363 b/docker/dify/volumes/db/data/pgdata/base/16384/17363 new file mode 100644 index 00000000..0a831447 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17363 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17364 b/docker/dify/volumes/db/data/pgdata/base/16384/17364 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17370 b/docker/dify/volumes/db/data/pgdata/base/16384/17370 new file mode 100644 index 00000000..c2975569 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17370 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17372 b/docker/dify/volumes/db/data/pgdata/base/16384/17372 new file mode 100644 index 00000000..60168c8e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17372 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17373 b/docker/dify/volumes/db/data/pgdata/base/16384/17373 new file mode 100644 index 00000000..ebc40b03 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17373 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17374 b/docker/dify/volumes/db/data/pgdata/base/16384/17374 new file mode 100644 index 00000000..c8ecb770 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17374 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17376 b/docker/dify/volumes/db/data/pgdata/base/16384/17376 new file mode 100644 index 00000000..d6eb65a2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17376 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17376_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/17376_fsm new file mode 100644 index 00000000..22b4365d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17376_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17379 b/docker/dify/volumes/db/data/pgdata/base/16384/17379 new file mode 100644 index 00000000..afd151ad Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17379 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17380 b/docker/dify/volumes/db/data/pgdata/base/16384/17380 new file mode 100644 index 00000000..e8d338ed Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17380 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17381 b/docker/dify/volumes/db/data/pgdata/base/16384/17381 new file mode 100644 index 00000000..2fbdaa02 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17381 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17382 b/docker/dify/volumes/db/data/pgdata/base/16384/17382 new file mode 100644 index 00000000..991dc45a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17382 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17386 b/docker/dify/volumes/db/data/pgdata/base/16384/17386 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17392 b/docker/dify/volumes/db/data/pgdata/base/16384/17392 new file mode 100644 index 00000000..21c6e8d1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17392 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17394 b/docker/dify/volumes/db/data/pgdata/base/16384/17394 new file mode 100644 index 00000000..81780d4b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17394 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17397 b/docker/dify/volumes/db/data/pgdata/base/16384/17397 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17398 b/docker/dify/volumes/db/data/pgdata/base/16384/17398 new file mode 100644 index 00000000..e788f3ee Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17398 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/174 b/docker/dify/volumes/db/data/pgdata/base/16384/174 new file mode 100644 index 00000000..20ed18ab Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/174 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17405 b/docker/dify/volumes/db/data/pgdata/base/16384/17405 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17410 b/docker/dify/volumes/db/data/pgdata/base/16384/17410 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17411 b/docker/dify/volumes/db/data/pgdata/base/16384/17411 new file mode 100644 index 00000000..3beba7df Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17411 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17412 b/docker/dify/volumes/db/data/pgdata/base/16384/17412 new file mode 100644 index 00000000..09351412 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17412 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17414 b/docker/dify/volumes/db/data/pgdata/base/16384/17414 new file mode 100644 index 00000000..fff3d040 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17414 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17415 b/docker/dify/volumes/db/data/pgdata/base/16384/17415 new file mode 100644 index 00000000..db8c47ef Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17415 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17416 b/docker/dify/volumes/db/data/pgdata/base/16384/17416 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17421 b/docker/dify/volumes/db/data/pgdata/base/16384/17421 new file mode 100644 index 00000000..26886029 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17421 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17423 b/docker/dify/volumes/db/data/pgdata/base/16384/17423 new file mode 100644 index 00000000..16764379 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17423 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17424 b/docker/dify/volumes/db/data/pgdata/base/16384/17424 new file mode 100644 index 00000000..f8f96b57 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17424 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17425 b/docker/dify/volumes/db/data/pgdata/base/16384/17425 new file mode 100644 index 00000000..62055ec4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17425 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17426 b/docker/dify/volumes/db/data/pgdata/base/16384/17426 new file mode 100644 index 00000000..8f4fd862 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17426 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17427 b/docker/dify/volumes/db/data/pgdata/base/16384/17427 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17433 b/docker/dify/volumes/db/data/pgdata/base/16384/17433 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17434 b/docker/dify/volumes/db/data/pgdata/base/16384/17434 new file mode 100644 index 00000000..ef2735b3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17434 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17435 b/docker/dify/volumes/db/data/pgdata/base/16384/17435 new file mode 100644 index 00000000..c1b585e3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17435 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17437 b/docker/dify/volumes/db/data/pgdata/base/16384/17437 new file mode 100644 index 00000000..ef0e84a4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17437 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17438 b/docker/dify/volumes/db/data/pgdata/base/16384/17438 new file mode 100644 index 00000000..27b658da Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17438 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17440 b/docker/dify/volumes/db/data/pgdata/base/16384/17440 new file mode 100644 index 00000000..115d5e62 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17440 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17443 b/docker/dify/volumes/db/data/pgdata/base/16384/17443 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17444 b/docker/dify/volumes/db/data/pgdata/base/16384/17444 new file mode 100644 index 00000000..373a5f12 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17444 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17445 b/docker/dify/volumes/db/data/pgdata/base/16384/17445 new file mode 100644 index 00000000..990a71dc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17445 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17446 b/docker/dify/volumes/db/data/pgdata/base/16384/17446 new file mode 100644 index 00000000..0cd98522 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17446 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17447 b/docker/dify/volumes/db/data/pgdata/base/16384/17447 new file mode 100644 index 00000000..e2365c26 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17447 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17448 b/docker/dify/volumes/db/data/pgdata/base/16384/17448 new file mode 100644 index 00000000..03a2c5d6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17448 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17449 b/docker/dify/volumes/db/data/pgdata/base/16384/17449 new file mode 100644 index 00000000..eae7dccd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17449 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17449_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/17449_fsm new file mode 100644 index 00000000..7c0083e4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17449_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17450 b/docker/dify/volumes/db/data/pgdata/base/16384/17450 new file mode 100644 index 00000000..03b2d6e7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17450 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17451 b/docker/dify/volumes/db/data/pgdata/base/16384/17451 new file mode 100644 index 00000000..dcd3559f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17451 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17452 b/docker/dify/volumes/db/data/pgdata/base/16384/17452 new file mode 100644 index 00000000..3d9c71a3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17452 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17453 b/docker/dify/volumes/db/data/pgdata/base/16384/17453 new file mode 100644 index 00000000..abf0ad44 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17453 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17454 b/docker/dify/volumes/db/data/pgdata/base/16384/17454 new file mode 100644 index 00000000..facdda52 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17454 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17460 b/docker/dify/volumes/db/data/pgdata/base/16384/17460 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17461 b/docker/dify/volumes/db/data/pgdata/base/16384/17461 new file mode 100644 index 00000000..4b0d61e7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17461 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17462 b/docker/dify/volumes/db/data/pgdata/base/16384/17462 new file mode 100644 index 00000000..61aceb12 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17462 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17464 b/docker/dify/volumes/db/data/pgdata/base/16384/17464 new file mode 100644 index 00000000..44fbc199 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17464 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17466 b/docker/dify/volumes/db/data/pgdata/base/16384/17466 new file mode 100644 index 00000000..b2cfbd0a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17466 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17467 b/docker/dify/volumes/db/data/pgdata/base/16384/17467 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17474 b/docker/dify/volumes/db/data/pgdata/base/16384/17474 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17475 b/docker/dify/volumes/db/data/pgdata/base/16384/17475 new file mode 100644 index 00000000..66d37165 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17475 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17476 b/docker/dify/volumes/db/data/pgdata/base/16384/17476 new file mode 100644 index 00000000..679d0f40 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17476 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17478 b/docker/dify/volumes/db/data/pgdata/base/16384/17478 new file mode 100644 index 00000000..91704a52 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17478 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17480 b/docker/dify/volumes/db/data/pgdata/base/16384/17480 new file mode 100644 index 00000000..dcd36307 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17480 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17482 b/docker/dify/volumes/db/data/pgdata/base/16384/17482 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17488 b/docker/dify/volumes/db/data/pgdata/base/16384/17488 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17489 b/docker/dify/volumes/db/data/pgdata/base/16384/17489 new file mode 100644 index 00000000..dd80e5d4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17489 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17490 b/docker/dify/volumes/db/data/pgdata/base/16384/17490 new file mode 100644 index 00000000..a257e1ab Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17490 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17492 b/docker/dify/volumes/db/data/pgdata/base/16384/17492 new file mode 100644 index 00000000..d3fb8e31 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17492 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17494 b/docker/dify/volumes/db/data/pgdata/base/16384/17494 new file mode 100644 index 00000000..430d0ab6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17494 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17496 b/docker/dify/volumes/db/data/pgdata/base/16384/17496 new file mode 100644 index 00000000..a3659599 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17496 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/175 b/docker/dify/volumes/db/data/pgdata/base/16384/175 new file mode 100644 index 00000000..b67971d4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/175 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17500 b/docker/dify/volumes/db/data/pgdata/base/16384/17500 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17504 b/docker/dify/volumes/db/data/pgdata/base/16384/17504 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17505 b/docker/dify/volumes/db/data/pgdata/base/16384/17505 new file mode 100644 index 00000000..5c58a945 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17505 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17506 b/docker/dify/volumes/db/data/pgdata/base/16384/17506 new file mode 100644 index 00000000..111b338e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17506 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17508 b/docker/dify/volumes/db/data/pgdata/base/16384/17508 new file mode 100644 index 00000000..1a335531 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17508 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17524 b/docker/dify/volumes/db/data/pgdata/base/16384/17524 new file mode 100644 index 00000000..4dc4f03e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17524 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17546 b/docker/dify/volumes/db/data/pgdata/base/16384/17546 new file mode 100644 index 00000000..0a3928bd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17546 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17552 b/docker/dify/volumes/db/data/pgdata/base/16384/17552 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17553 b/docker/dify/volumes/db/data/pgdata/base/16384/17553 new file mode 100644 index 00000000..7c5ceb0e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17553 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17554 b/docker/dify/volumes/db/data/pgdata/base/16384/17554 new file mode 100644 index 00000000..444b7ddd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17554 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17556 b/docker/dify/volumes/db/data/pgdata/base/16384/17556 new file mode 100644 index 00000000..3c7e446f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17556 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17557 b/docker/dify/volumes/db/data/pgdata/base/16384/17557 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17563 b/docker/dify/volumes/db/data/pgdata/base/16384/17563 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17564 b/docker/dify/volumes/db/data/pgdata/base/16384/17564 new file mode 100644 index 00000000..ac6d94c8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17564 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17565 b/docker/dify/volumes/db/data/pgdata/base/16384/17565 new file mode 100644 index 00000000..073df4ba Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17565 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17567 b/docker/dify/volumes/db/data/pgdata/base/16384/17567 new file mode 100644 index 00000000..b51e6e17 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17567 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17568 b/docker/dify/volumes/db/data/pgdata/base/16384/17568 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17576 b/docker/dify/volumes/db/data/pgdata/base/16384/17576 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17577 b/docker/dify/volumes/db/data/pgdata/base/16384/17577 new file mode 100644 index 00000000..c2b1a07a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17577 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17578 b/docker/dify/volumes/db/data/pgdata/base/16384/17578 new file mode 100644 index 00000000..6995d2eb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17578 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17580 b/docker/dify/volumes/db/data/pgdata/base/16384/17580 new file mode 100644 index 00000000..f030d92b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17580 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17581 b/docker/dify/volumes/db/data/pgdata/base/16384/17581 new file mode 100644 index 00000000..cf0441f2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17581 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17583 b/docker/dify/volumes/db/data/pgdata/base/16384/17583 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17587 b/docker/dify/volumes/db/data/pgdata/base/16384/17587 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17588 b/docker/dify/volumes/db/data/pgdata/base/16384/17588 new file mode 100644 index 00000000..499a3865 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17588 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17589 b/docker/dify/volumes/db/data/pgdata/base/16384/17589 new file mode 100644 index 00000000..508089b4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17589 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17591 b/docker/dify/volumes/db/data/pgdata/base/16384/17591 new file mode 100644 index 00000000..46f33484 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17591 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17593 b/docker/dify/volumes/db/data/pgdata/base/16384/17593 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17599 b/docker/dify/volumes/db/data/pgdata/base/16384/17599 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17600 b/docker/dify/volumes/db/data/pgdata/base/16384/17600 new file mode 100644 index 00000000..100b48c9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17600 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17601 b/docker/dify/volumes/db/data/pgdata/base/16384/17601 new file mode 100644 index 00000000..e2b26a6c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17601 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17603 b/docker/dify/volumes/db/data/pgdata/base/16384/17603 new file mode 100644 index 00000000..7692246b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17603 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17620 b/docker/dify/volumes/db/data/pgdata/base/16384/17620 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17625 b/docker/dify/volumes/db/data/pgdata/base/16384/17625 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17626 b/docker/dify/volumes/db/data/pgdata/base/16384/17626 new file mode 100644 index 00000000..94eba751 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17626 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17627 b/docker/dify/volumes/db/data/pgdata/base/16384/17627 new file mode 100644 index 00000000..08b8228a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17627 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17629 b/docker/dify/volumes/db/data/pgdata/base/16384/17629 new file mode 100644 index 00000000..a8fefea8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17629 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17630 b/docker/dify/volumes/db/data/pgdata/base/16384/17630 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17636 b/docker/dify/volumes/db/data/pgdata/base/16384/17636 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17637 b/docker/dify/volumes/db/data/pgdata/base/16384/17637 new file mode 100644 index 00000000..5d544291 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17637 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17638 b/docker/dify/volumes/db/data/pgdata/base/16384/17638 new file mode 100644 index 00000000..801d215d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17638 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17640 b/docker/dify/volumes/db/data/pgdata/base/16384/17640 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17646 b/docker/dify/volumes/db/data/pgdata/base/16384/17646 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17647 b/docker/dify/volumes/db/data/pgdata/base/16384/17647 new file mode 100644 index 00000000..83d01b18 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17647 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17648 b/docker/dify/volumes/db/data/pgdata/base/16384/17648 new file mode 100644 index 00000000..05bc2806 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17648 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17650 b/docker/dify/volumes/db/data/pgdata/base/16384/17650 new file mode 100644 index 00000000..047ae133 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17650 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17651 b/docker/dify/volumes/db/data/pgdata/base/16384/17651 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17657 b/docker/dify/volumes/db/data/pgdata/base/16384/17657 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17658 b/docker/dify/volumes/db/data/pgdata/base/16384/17658 new file mode 100644 index 00000000..6666b392 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17658 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17659 b/docker/dify/volumes/db/data/pgdata/base/16384/17659 new file mode 100644 index 00000000..15f9884d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17659 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17661 b/docker/dify/volumes/db/data/pgdata/base/16384/17661 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17670 b/docker/dify/volumes/db/data/pgdata/base/16384/17670 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17671 b/docker/dify/volumes/db/data/pgdata/base/16384/17671 new file mode 100644 index 00000000..46893b89 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17671 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17672 b/docker/dify/volumes/db/data/pgdata/base/16384/17672 new file mode 100644 index 00000000..c1369921 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17672 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17674 b/docker/dify/volumes/db/data/pgdata/base/16384/17674 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17679 b/docker/dify/volumes/db/data/pgdata/base/16384/17679 new file mode 100644 index 00000000..e3ff517b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17679 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17681 b/docker/dify/volumes/db/data/pgdata/base/16384/17681 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17686 b/docker/dify/volumes/db/data/pgdata/base/16384/17686 new file mode 100644 index 00000000..1d696607 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17686 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17688 b/docker/dify/volumes/db/data/pgdata/base/16384/17688 new file mode 100644 index 00000000..ebccdd63 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17688 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17694 b/docker/dify/volumes/db/data/pgdata/base/16384/17694 new file mode 100644 index 00000000..d8ebb8a3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17694 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17696 b/docker/dify/volumes/db/data/pgdata/base/16384/17696 new file mode 100644 index 00000000..74fa3ea9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17696 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17697 b/docker/dify/volumes/db/data/pgdata/base/16384/17697 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17703 b/docker/dify/volumes/db/data/pgdata/base/16384/17703 new file mode 100644 index 00000000..103c509f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17703 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17705 b/docker/dify/volumes/db/data/pgdata/base/16384/17705 new file mode 100644 index 00000000..b76f129d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17705 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17707 b/docker/dify/volumes/db/data/pgdata/base/16384/17707 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17713 b/docker/dify/volumes/db/data/pgdata/base/16384/17713 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17714 b/docker/dify/volumes/db/data/pgdata/base/16384/17714 new file mode 100644 index 00000000..ebbea4d2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17714 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17715 b/docker/dify/volumes/db/data/pgdata/base/16384/17715 new file mode 100644 index 00000000..abb54c79 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17715 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17717 b/docker/dify/volumes/db/data/pgdata/base/16384/17717 new file mode 100644 index 00000000..bc043dc2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17717 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17730 b/docker/dify/volumes/db/data/pgdata/base/16384/17730 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17737 b/docker/dify/volumes/db/data/pgdata/base/16384/17737 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17738 b/docker/dify/volumes/db/data/pgdata/base/16384/17738 new file mode 100644 index 00000000..8158b80c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17738 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17739 b/docker/dify/volumes/db/data/pgdata/base/16384/17739 new file mode 100644 index 00000000..129e0cf4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17739 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17741 b/docker/dify/volumes/db/data/pgdata/base/16384/17741 new file mode 100644 index 00000000..4df3150d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17741 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17743 b/docker/dify/volumes/db/data/pgdata/base/16384/17743 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17749 b/docker/dify/volumes/db/data/pgdata/base/16384/17749 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17750 b/docker/dify/volumes/db/data/pgdata/base/16384/17750 new file mode 100644 index 00000000..e30725f5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17750 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17751 b/docker/dify/volumes/db/data/pgdata/base/16384/17751 new file mode 100644 index 00000000..ff121cd7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17751 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17753 b/docker/dify/volumes/db/data/pgdata/base/16384/17753 new file mode 100644 index 00000000..fda07c24 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17753 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17755 b/docker/dify/volumes/db/data/pgdata/base/16384/17755 new file mode 100644 index 00000000..e23ab67b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17755 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17756 b/docker/dify/volumes/db/data/pgdata/base/16384/17756 new file mode 100644 index 00000000..95330b0c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17756 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17757 b/docker/dify/volumes/db/data/pgdata/base/16384/17757 new file mode 100644 index 00000000..1e6494f0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17757 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17758 b/docker/dify/volumes/db/data/pgdata/base/16384/17758 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17764 b/docker/dify/volumes/db/data/pgdata/base/16384/17764 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17765 b/docker/dify/volumes/db/data/pgdata/base/16384/17765 new file mode 100644 index 00000000..485b59b4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17765 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17766 b/docker/dify/volumes/db/data/pgdata/base/16384/17766 new file mode 100644 index 00000000..4542f9b7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17766 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17768 b/docker/dify/volumes/db/data/pgdata/base/16384/17768 new file mode 100644 index 00000000..85d51672 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17768 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17770 b/docker/dify/volumes/db/data/pgdata/base/16384/17770 new file mode 100644 index 00000000..83f464c0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17770 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17771 b/docker/dify/volumes/db/data/pgdata/base/16384/17771 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17777 b/docker/dify/volumes/db/data/pgdata/base/16384/17777 new file mode 100644 index 00000000..dc4f66d6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17777 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17779 b/docker/dify/volumes/db/data/pgdata/base/16384/17779 new file mode 100644 index 00000000..077880b2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17779 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17781 b/docker/dify/volumes/db/data/pgdata/base/16384/17781 new file mode 100644 index 00000000..2b842618 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17781 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17782 b/docker/dify/volumes/db/data/pgdata/base/16384/17782 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17787 b/docker/dify/volumes/db/data/pgdata/base/16384/17787 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17788 b/docker/dify/volumes/db/data/pgdata/base/16384/17788 new file mode 100644 index 00000000..eacb6877 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17788 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17789 b/docker/dify/volumes/db/data/pgdata/base/16384/17789 new file mode 100644 index 00000000..b93e7510 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17789 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17791 b/docker/dify/volumes/db/data/pgdata/base/16384/17791 new file mode 100644 index 00000000..6fade65d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17791 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17792 b/docker/dify/volumes/db/data/pgdata/base/16384/17792 new file mode 100644 index 00000000..8b570d6f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17792 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17793 b/docker/dify/volumes/db/data/pgdata/base/16384/17793 new file mode 100644 index 00000000..22c353aa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17793 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17794 b/docker/dify/volumes/db/data/pgdata/base/16384/17794 new file mode 100644 index 00000000..3456b47f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17794 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17795 b/docker/dify/volumes/db/data/pgdata/base/16384/17795 new file mode 100644 index 00000000..9f3225ec Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17795 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17796 b/docker/dify/volumes/db/data/pgdata/base/16384/17796 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17802 b/docker/dify/volumes/db/data/pgdata/base/16384/17802 new file mode 100644 index 00000000..afd72477 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17802 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17804 b/docker/dify/volumes/db/data/pgdata/base/16384/17804 new file mode 100644 index 00000000..73a6f790 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17804 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17806 b/docker/dify/volumes/db/data/pgdata/base/16384/17806 new file mode 100644 index 00000000..2242d280 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17806 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17808 b/docker/dify/volumes/db/data/pgdata/base/16384/17808 new file mode 100644 index 00000000..f13fc594 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17808 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17812 b/docker/dify/volumes/db/data/pgdata/base/16384/17812 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17815 b/docker/dify/volumes/db/data/pgdata/base/16384/17815 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17816 b/docker/dify/volumes/db/data/pgdata/base/16384/17816 new file mode 100644 index 00000000..5b0fd1a1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17816 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17817 b/docker/dify/volumes/db/data/pgdata/base/16384/17817 new file mode 100644 index 00000000..40bea091 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17817 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17818 b/docker/dify/volumes/db/data/pgdata/base/16384/17818 new file mode 100644 index 00000000..a3ba1067 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17818 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17819 b/docker/dify/volumes/db/data/pgdata/base/16384/17819 new file mode 100644 index 00000000..5f4f4e5a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17819 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17821 b/docker/dify/volumes/db/data/pgdata/base/16384/17821 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17824 b/docker/dify/volumes/db/data/pgdata/base/16384/17824 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17825 b/docker/dify/volumes/db/data/pgdata/base/16384/17825 new file mode 100644 index 00000000..baaa340b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17825 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17826 b/docker/dify/volumes/db/data/pgdata/base/16384/17826 new file mode 100644 index 00000000..d8552606 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17826 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17827 b/docker/dify/volumes/db/data/pgdata/base/16384/17827 new file mode 100644 index 00000000..dce9d9bb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17827 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17828 b/docker/dify/volumes/db/data/pgdata/base/16384/17828 new file mode 100644 index 00000000..cb599a10 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17828 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17829 b/docker/dify/volumes/db/data/pgdata/base/16384/17829 new file mode 100644 index 00000000..38c54a48 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17829 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17830 b/docker/dify/volumes/db/data/pgdata/base/16384/17830 new file mode 100644 index 00000000..86461dc2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17830 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17838 b/docker/dify/volumes/db/data/pgdata/base/16384/17838 new file mode 100644 index 00000000..532ce645 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17838 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17841 b/docker/dify/volumes/db/data/pgdata/base/16384/17841 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17842 b/docker/dify/volumes/db/data/pgdata/base/16384/17842 new file mode 100644 index 00000000..18f37b06 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17842 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17843 b/docker/dify/volumes/db/data/pgdata/base/16384/17843 new file mode 100644 index 00000000..318ba200 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17843 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17844 b/docker/dify/volumes/db/data/pgdata/base/16384/17844 new file mode 100644 index 00000000..0690a6ce Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17844 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17847 b/docker/dify/volumes/db/data/pgdata/base/16384/17847 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17850 b/docker/dify/volumes/db/data/pgdata/base/16384/17850 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17851 b/docker/dify/volumes/db/data/pgdata/base/16384/17851 new file mode 100644 index 00000000..aae0e496 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17851 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17852 b/docker/dify/volumes/db/data/pgdata/base/16384/17852 new file mode 100644 index 00000000..71b39e02 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17852 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17853 b/docker/dify/volumes/db/data/pgdata/base/16384/17853 new file mode 100644 index 00000000..966beb72 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17853 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17856 b/docker/dify/volumes/db/data/pgdata/base/16384/17856 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17859 b/docker/dify/volumes/db/data/pgdata/base/16384/17859 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17860 b/docker/dify/volumes/db/data/pgdata/base/16384/17860 new file mode 100644 index 00000000..658a52f9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17860 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17861 b/docker/dify/volumes/db/data/pgdata/base/16384/17861 new file mode 100644 index 00000000..c137fcb5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17861 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17862 b/docker/dify/volumes/db/data/pgdata/base/16384/17862 new file mode 100644 index 00000000..b1872a81 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17862 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17863 b/docker/dify/volumes/db/data/pgdata/base/16384/17863 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17868 b/docker/dify/volumes/db/data/pgdata/base/16384/17868 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17869 b/docker/dify/volumes/db/data/pgdata/base/16384/17869 new file mode 100644 index 00000000..5f78a638 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17869 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17870 b/docker/dify/volumes/db/data/pgdata/base/16384/17870 new file mode 100644 index 00000000..47cbeba6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17870 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17872 b/docker/dify/volumes/db/data/pgdata/base/16384/17872 new file mode 100644 index 00000000..d049363f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17872 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17873 b/docker/dify/volumes/db/data/pgdata/base/16384/17873 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17877 b/docker/dify/volumes/db/data/pgdata/base/16384/17877 new file mode 100644 index 00000000..7391cd49 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17877 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17879 b/docker/dify/volumes/db/data/pgdata/base/16384/17879 new file mode 100644 index 00000000..4942e517 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17879 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/17880 b/docker/dify/volumes/db/data/pgdata/base/16384/17880 new file mode 100644 index 00000000..8004909b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/17880 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2187 b/docker/dify/volumes/db/data/pgdata/base/16384/2187 new file mode 100644 index 00000000..05e30f4a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2187 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2224 b/docker/dify/volumes/db/data/pgdata/base/16384/2224 new file mode 100644 index 00000000..7e2df319 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2224 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2228 b/docker/dify/volumes/db/data/pgdata/base/16384/2228 new file mode 100644 index 00000000..768f1957 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2228 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2328 b/docker/dify/volumes/db/data/pgdata/base/16384/2328 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2336 b/docker/dify/volumes/db/data/pgdata/base/16384/2336 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2337 b/docker/dify/volumes/db/data/pgdata/base/16384/2337 new file mode 100644 index 00000000..b71be3ae Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2337 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2579 b/docker/dify/volumes/db/data/pgdata/base/16384/2579 new file mode 100644 index 00000000..ffd43013 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2579 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2600 b/docker/dify/volumes/db/data/pgdata/base/16384/2600 new file mode 100644 index 00000000..d237cc96 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2600 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2600_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2600_fsm new file mode 100644 index 00000000..ff0c2c28 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2600_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2600_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2600_vm new file mode 100644 index 00000000..bf001d05 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2600_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2601 b/docker/dify/volumes/db/data/pgdata/base/16384/2601 new file mode 100644 index 00000000..20065849 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2601 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2601_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2601_fsm new file mode 100644 index 00000000..4e44bdf0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2601_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2601_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2601_vm new file mode 100644 index 00000000..e64d857b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2601_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2602 b/docker/dify/volumes/db/data/pgdata/base/16384/2602 new file mode 100644 index 00000000..a75a131c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2602 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2602_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2602_fsm new file mode 100644 index 00000000..dbd864c8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2602_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2602_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2602_vm new file mode 100644 index 00000000..1a115235 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2602_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2603 b/docker/dify/volumes/db/data/pgdata/base/16384/2603 new file mode 100644 index 00000000..49896d2c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2603 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2603_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2603_fsm new file mode 100644 index 00000000..1279ef51 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2603_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2603_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2603_vm new file mode 100644 index 00000000..565929a1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2603_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2604 b/docker/dify/volumes/db/data/pgdata/base/16384/2604 new file mode 100644 index 00000000..1b1f0aa4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2604 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2604_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2604_fsm new file mode 100644 index 00000000..53cc81a0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2604_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2605 b/docker/dify/volumes/db/data/pgdata/base/16384/2605 new file mode 100644 index 00000000..92cf5b74 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2605 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2605_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2605_fsm new file mode 100644 index 00000000..de696013 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2605_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2605_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2605_vm new file mode 100644 index 00000000..688e596d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2605_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2606 b/docker/dify/volumes/db/data/pgdata/base/16384/2606 new file mode 100644 index 00000000..1386d68f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2606 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2606_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2606_fsm new file mode 100644 index 00000000..72ead5f7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2606_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2606_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2606_vm new file mode 100644 index 00000000..88666e7f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2606_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2607 b/docker/dify/volumes/db/data/pgdata/base/16384/2607 new file mode 100644 index 00000000..887a6384 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2607 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2607_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2607_fsm new file mode 100644 index 00000000..b1689f34 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2607_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2607_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2607_vm new file mode 100644 index 00000000..51ef2ba3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2607_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2608 b/docker/dify/volumes/db/data/pgdata/base/16384/2608 new file mode 100644 index 00000000..35a51e9b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2608 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2608_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2608_fsm new file mode 100644 index 00000000..3d9001e3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2608_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2608_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2608_vm new file mode 100644 index 00000000..005520b5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2608_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2609 b/docker/dify/volumes/db/data/pgdata/base/16384/2609 new file mode 100644 index 00000000..3c5632e0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2609 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2609_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2609_fsm new file mode 100644 index 00000000..87a235eb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2609_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2609_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2609_vm new file mode 100644 index 00000000..b2b9622c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2609_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2610 b/docker/dify/volumes/db/data/pgdata/base/16384/2610 new file mode 100644 index 00000000..e46444c1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2610 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2610_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2610_fsm new file mode 100644 index 00000000..dc31f68e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2610_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2610_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2610_vm new file mode 100644 index 00000000..4e3ca74d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2610_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2611 b/docker/dify/volumes/db/data/pgdata/base/16384/2611 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2612 b/docker/dify/volumes/db/data/pgdata/base/16384/2612 new file mode 100644 index 00000000..bda71d3a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2612 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2612_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2612_fsm new file mode 100644 index 00000000..714c209d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2612_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2612_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2612_vm new file mode 100644 index 00000000..7170ea81 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2612_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2613 b/docker/dify/volumes/db/data/pgdata/base/16384/2613 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2615 b/docker/dify/volumes/db/data/pgdata/base/16384/2615 new file mode 100644 index 00000000..1cc4d52b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2615 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2615_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2615_fsm new file mode 100644 index 00000000..4d5efdb5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2615_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2615_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2615_vm new file mode 100644 index 00000000..72209ea8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2615_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2616 b/docker/dify/volumes/db/data/pgdata/base/16384/2616 new file mode 100644 index 00000000..b878420c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2616 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2616_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2616_fsm new file mode 100644 index 00000000..64ac7f39 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2616_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2616_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2616_vm new file mode 100644 index 00000000..a222f5da Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2616_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2617 b/docker/dify/volumes/db/data/pgdata/base/16384/2617 new file mode 100644 index 00000000..e5f3ded5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2617 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2617_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2617_fsm new file mode 100644 index 00000000..eb1aff99 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2617_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2617_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2617_vm new file mode 100644 index 00000000..b062f6a7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2617_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2618 b/docker/dify/volumes/db/data/pgdata/base/16384/2618 new file mode 100644 index 00000000..d6640915 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2618 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2618_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2618_fsm new file mode 100644 index 00000000..e735f6d7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2618_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2618_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2618_vm new file mode 100644 index 00000000..bff0ac2a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2618_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2619 b/docker/dify/volumes/db/data/pgdata/base/16384/2619 new file mode 100644 index 00000000..1a473a46 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2619 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2619_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2619_fsm new file mode 100644 index 00000000..e7521595 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2619_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2619_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2619_vm new file mode 100644 index 00000000..1fbafe5f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2619_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2620 b/docker/dify/volumes/db/data/pgdata/base/16384/2620 new file mode 100644 index 00000000..bf9b01b1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2620 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2650 b/docker/dify/volumes/db/data/pgdata/base/16384/2650 new file mode 100644 index 00000000..7d632178 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2650 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2651 b/docker/dify/volumes/db/data/pgdata/base/16384/2651 new file mode 100644 index 00000000..e8c320c0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2651 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2652 b/docker/dify/volumes/db/data/pgdata/base/16384/2652 new file mode 100644 index 00000000..de2dc374 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2652 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2653 b/docker/dify/volumes/db/data/pgdata/base/16384/2653 new file mode 100644 index 00000000..e44a768a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2653 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2654 b/docker/dify/volumes/db/data/pgdata/base/16384/2654 new file mode 100644 index 00000000..358e3786 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2654 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2655 b/docker/dify/volumes/db/data/pgdata/base/16384/2655 new file mode 100644 index 00000000..5f2b51c8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2655 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2656 b/docker/dify/volumes/db/data/pgdata/base/16384/2656 new file mode 100644 index 00000000..74fb7c6d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2656 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2657 b/docker/dify/volumes/db/data/pgdata/base/16384/2657 new file mode 100644 index 00000000..4902fe5a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2657 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2658 b/docker/dify/volumes/db/data/pgdata/base/16384/2658 new file mode 100644 index 00000000..9ccd921c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2658 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2659 b/docker/dify/volumes/db/data/pgdata/base/16384/2659 new file mode 100644 index 00000000..4b7a1cd0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2659 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2660 b/docker/dify/volumes/db/data/pgdata/base/16384/2660 new file mode 100644 index 00000000..96b2866e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2660 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2661 b/docker/dify/volumes/db/data/pgdata/base/16384/2661 new file mode 100644 index 00000000..fbbf78d1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2661 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2662 b/docker/dify/volumes/db/data/pgdata/base/16384/2662 new file mode 100644 index 00000000..d0245bc2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2662 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2663 b/docker/dify/volumes/db/data/pgdata/base/16384/2663 new file mode 100644 index 00000000..44c3fb76 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2663 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2664 b/docker/dify/volumes/db/data/pgdata/base/16384/2664 new file mode 100644 index 00000000..680693f6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2664 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2665 b/docker/dify/volumes/db/data/pgdata/base/16384/2665 new file mode 100644 index 00000000..db28558f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2665 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2666 b/docker/dify/volumes/db/data/pgdata/base/16384/2666 new file mode 100644 index 00000000..a8ac582d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2666 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2667 b/docker/dify/volumes/db/data/pgdata/base/16384/2667 new file mode 100644 index 00000000..c6a49284 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2667 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2668 b/docker/dify/volumes/db/data/pgdata/base/16384/2668 new file mode 100644 index 00000000..5b86d79f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2668 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2669 b/docker/dify/volumes/db/data/pgdata/base/16384/2669 new file mode 100644 index 00000000..54a89dbd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2669 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2670 b/docker/dify/volumes/db/data/pgdata/base/16384/2670 new file mode 100644 index 00000000..f4d7b28e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2670 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2673 b/docker/dify/volumes/db/data/pgdata/base/16384/2673 new file mode 100644 index 00000000..b0dcf015 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2673 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2674 b/docker/dify/volumes/db/data/pgdata/base/16384/2674 new file mode 100644 index 00000000..c3a2fb5c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2674 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2675 b/docker/dify/volumes/db/data/pgdata/base/16384/2675 new file mode 100644 index 00000000..4ad4dc3f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2675 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2678 b/docker/dify/volumes/db/data/pgdata/base/16384/2678 new file mode 100644 index 00000000..650a989c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2678 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2679 b/docker/dify/volumes/db/data/pgdata/base/16384/2679 new file mode 100644 index 00000000..8151b074 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2679 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2680 b/docker/dify/volumes/db/data/pgdata/base/16384/2680 new file mode 100644 index 00000000..217f6467 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2680 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2681 b/docker/dify/volumes/db/data/pgdata/base/16384/2681 new file mode 100644 index 00000000..e6bb11a6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2681 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2682 b/docker/dify/volumes/db/data/pgdata/base/16384/2682 new file mode 100644 index 00000000..78c574c4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2682 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2683 b/docker/dify/volumes/db/data/pgdata/base/16384/2683 new file mode 100644 index 00000000..019c290e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2683 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2684 b/docker/dify/volumes/db/data/pgdata/base/16384/2684 new file mode 100644 index 00000000..f8db3ade Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2684 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2685 b/docker/dify/volumes/db/data/pgdata/base/16384/2685 new file mode 100644 index 00000000..aedfd253 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2685 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2686 b/docker/dify/volumes/db/data/pgdata/base/16384/2686 new file mode 100644 index 00000000..a9614f10 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2686 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2687 b/docker/dify/volumes/db/data/pgdata/base/16384/2687 new file mode 100644 index 00000000..bfcefe98 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2687 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2688 b/docker/dify/volumes/db/data/pgdata/base/16384/2688 new file mode 100644 index 00000000..147e2881 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2688 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2689 b/docker/dify/volumes/db/data/pgdata/base/16384/2689 new file mode 100644 index 00000000..20b3b0ba Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2689 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2690 b/docker/dify/volumes/db/data/pgdata/base/16384/2690 new file mode 100644 index 00000000..a9ddfeda Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2690 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2691 b/docker/dify/volumes/db/data/pgdata/base/16384/2691 new file mode 100644 index 00000000..bb81f3bf Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2691 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2692 b/docker/dify/volumes/db/data/pgdata/base/16384/2692 new file mode 100644 index 00000000..5cab507c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2692 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2693 b/docker/dify/volumes/db/data/pgdata/base/16384/2693 new file mode 100644 index 00000000..899c0f02 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2693 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2696 b/docker/dify/volumes/db/data/pgdata/base/16384/2696 new file mode 100644 index 00000000..bd9a3f78 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2696 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2699 b/docker/dify/volumes/db/data/pgdata/base/16384/2699 new file mode 100644 index 00000000..fd99f43a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2699 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2701 b/docker/dify/volumes/db/data/pgdata/base/16384/2701 new file mode 100644 index 00000000..b53fbf7b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2701 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2702 b/docker/dify/volumes/db/data/pgdata/base/16384/2702 new file mode 100644 index 00000000..3898f845 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2702 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2703 b/docker/dify/volumes/db/data/pgdata/base/16384/2703 new file mode 100644 index 00000000..dcf48d3f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2703 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2704 b/docker/dify/volumes/db/data/pgdata/base/16384/2704 new file mode 100644 index 00000000..fa5b535b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2704 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2753 b/docker/dify/volumes/db/data/pgdata/base/16384/2753 new file mode 100644 index 00000000..eed22fa5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2753 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2753_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2753_fsm new file mode 100644 index 00000000..38310e9f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2753_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2753_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2753_vm new file mode 100644 index 00000000..e99bd093 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2753_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2754 b/docker/dify/volumes/db/data/pgdata/base/16384/2754 new file mode 100644 index 00000000..536caca8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2754 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2755 b/docker/dify/volumes/db/data/pgdata/base/16384/2755 new file mode 100644 index 00000000..291a3928 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2755 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2756 b/docker/dify/volumes/db/data/pgdata/base/16384/2756 new file mode 100644 index 00000000..a0aafa58 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2756 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2757 b/docker/dify/volumes/db/data/pgdata/base/16384/2757 new file mode 100644 index 00000000..67b07963 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2757 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2830 b/docker/dify/volumes/db/data/pgdata/base/16384/2830 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2831 b/docker/dify/volumes/db/data/pgdata/base/16384/2831 new file mode 100644 index 00000000..4e4ec344 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2831 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2832 b/docker/dify/volumes/db/data/pgdata/base/16384/2832 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2833 b/docker/dify/volumes/db/data/pgdata/base/16384/2833 new file mode 100644 index 00000000..e4816312 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2833 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2834 b/docker/dify/volumes/db/data/pgdata/base/16384/2834 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2835 b/docker/dify/volumes/db/data/pgdata/base/16384/2835 new file mode 100644 index 00000000..ea9290eb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2835 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2836 b/docker/dify/volumes/db/data/pgdata/base/16384/2836 new file mode 100644 index 00000000..b0a99e19 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2836 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2836_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2836_fsm new file mode 100644 index 00000000..c8820328 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2836_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2836_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2836_vm new file mode 100644 index 00000000..bb163723 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2836_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2837 b/docker/dify/volumes/db/data/pgdata/base/16384/2837 new file mode 100644 index 00000000..d1ebb528 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2837 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2838 b/docker/dify/volumes/db/data/pgdata/base/16384/2838 new file mode 100644 index 00000000..bb985539 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2838 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2838_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2838_fsm new file mode 100644 index 00000000..3d74a178 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2838_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2838_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2838_vm new file mode 100644 index 00000000..57c0610c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2838_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2839 b/docker/dify/volumes/db/data/pgdata/base/16384/2839 new file mode 100644 index 00000000..b1d534b0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2839 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2840 b/docker/dify/volumes/db/data/pgdata/base/16384/2840 new file mode 100644 index 00000000..aeba1557 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2840 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2840_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/2840_fsm new file mode 100644 index 00000000..118c93d0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2840_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2840_vm b/docker/dify/volumes/db/data/pgdata/base/16384/2840_vm new file mode 100644 index 00000000..24d4d228 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2840_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2841 b/docker/dify/volumes/db/data/pgdata/base/16384/2841 new file mode 100644 index 00000000..dbde4a3a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2841 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2995 b/docker/dify/volumes/db/data/pgdata/base/16384/2995 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/2996 b/docker/dify/volumes/db/data/pgdata/base/16384/2996 new file mode 100644 index 00000000..2193b699 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/2996 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3079 b/docker/dify/volumes/db/data/pgdata/base/16384/3079 new file mode 100644 index 00000000..9ceefc27 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3079 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3079_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/3079_fsm new file mode 100644 index 00000000..c9e260c1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3079_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3079_vm b/docker/dify/volumes/db/data/pgdata/base/16384/3079_vm new file mode 100644 index 00000000..bf82d1d7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3079_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3080 b/docker/dify/volumes/db/data/pgdata/base/16384/3080 new file mode 100644 index 00000000..e63d17c9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3080 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3081 b/docker/dify/volumes/db/data/pgdata/base/16384/3081 new file mode 100644 index 00000000..5a1a6b3c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3081 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3085 b/docker/dify/volumes/db/data/pgdata/base/16384/3085 new file mode 100644 index 00000000..fc643f04 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3085 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3118 b/docker/dify/volumes/db/data/pgdata/base/16384/3118 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3119 b/docker/dify/volumes/db/data/pgdata/base/16384/3119 new file mode 100644 index 00000000..d222ce61 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3119 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3164 b/docker/dify/volumes/db/data/pgdata/base/16384/3164 new file mode 100644 index 00000000..27b56500 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3164 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3256 b/docker/dify/volumes/db/data/pgdata/base/16384/3256 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3257 b/docker/dify/volumes/db/data/pgdata/base/16384/3257 new file mode 100644 index 00000000..19cbc83a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3257 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3258 b/docker/dify/volumes/db/data/pgdata/base/16384/3258 new file mode 100644 index 00000000..8e94b77a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3258 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3350 b/docker/dify/volumes/db/data/pgdata/base/16384/3350 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3351 b/docker/dify/volumes/db/data/pgdata/base/16384/3351 new file mode 100644 index 00000000..3d6266c7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3351 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3379 b/docker/dify/volumes/db/data/pgdata/base/16384/3379 new file mode 100644 index 00000000..16eb1337 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3379 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3380 b/docker/dify/volumes/db/data/pgdata/base/16384/3380 new file mode 100644 index 00000000..ee20b71e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3380 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3381 b/docker/dify/volumes/db/data/pgdata/base/16384/3381 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3394 b/docker/dify/volumes/db/data/pgdata/base/16384/3394 new file mode 100644 index 00000000..256ff31d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3394 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3394_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/3394_fsm new file mode 100644 index 00000000..37a542ff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3394_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3394_vm b/docker/dify/volumes/db/data/pgdata/base/16384/3394_vm new file mode 100644 index 00000000..26fa89dd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3394_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3395 b/docker/dify/volumes/db/data/pgdata/base/16384/3395 new file mode 100644 index 00000000..8ed59d53 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3395 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3429 b/docker/dify/volumes/db/data/pgdata/base/16384/3429 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3430 b/docker/dify/volumes/db/data/pgdata/base/16384/3430 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3431 b/docker/dify/volumes/db/data/pgdata/base/16384/3431 new file mode 100644 index 00000000..545e3d18 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3431 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3433 b/docker/dify/volumes/db/data/pgdata/base/16384/3433 new file mode 100644 index 00000000..f444b936 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3433 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3439 b/docker/dify/volumes/db/data/pgdata/base/16384/3439 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3440 b/docker/dify/volumes/db/data/pgdata/base/16384/3440 new file mode 100644 index 00000000..230c84a1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3440 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3455 b/docker/dify/volumes/db/data/pgdata/base/16384/3455 new file mode 100644 index 00000000..0a8eff3e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3455 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3456 b/docker/dify/volumes/db/data/pgdata/base/16384/3456 new file mode 100644 index 00000000..a1bce693 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3456 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3456_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/3456_fsm new file mode 100644 index 00000000..c11022f1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3456_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3456_vm b/docker/dify/volumes/db/data/pgdata/base/16384/3456_vm new file mode 100644 index 00000000..76c2c01e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3456_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3466 b/docker/dify/volumes/db/data/pgdata/base/16384/3466 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3467 b/docker/dify/volumes/db/data/pgdata/base/16384/3467 new file mode 100644 index 00000000..9c0b15b5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3467 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3468 b/docker/dify/volumes/db/data/pgdata/base/16384/3468 new file mode 100644 index 00000000..67cb9321 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3468 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3501 b/docker/dify/volumes/db/data/pgdata/base/16384/3501 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3502 b/docker/dify/volumes/db/data/pgdata/base/16384/3502 new file mode 100644 index 00000000..5e75ac3d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3502 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3503 b/docker/dify/volumes/db/data/pgdata/base/16384/3503 new file mode 100644 index 00000000..756d641c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3503 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3534 b/docker/dify/volumes/db/data/pgdata/base/16384/3534 new file mode 100644 index 00000000..325be5a6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3534 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3541 b/docker/dify/volumes/db/data/pgdata/base/16384/3541 new file mode 100644 index 00000000..caa12951 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3541 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3541_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/3541_fsm new file mode 100644 index 00000000..941cacdd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3541_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3541_vm b/docker/dify/volumes/db/data/pgdata/base/16384/3541_vm new file mode 100644 index 00000000..1ed7a978 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3541_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3542 b/docker/dify/volumes/db/data/pgdata/base/16384/3542 new file mode 100644 index 00000000..6b801da0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3542 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3574 b/docker/dify/volumes/db/data/pgdata/base/16384/3574 new file mode 100644 index 00000000..032e87c4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3574 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3575 b/docker/dify/volumes/db/data/pgdata/base/16384/3575 new file mode 100644 index 00000000..4e4cbda5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3575 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3576 b/docker/dify/volumes/db/data/pgdata/base/16384/3576 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3596 b/docker/dify/volumes/db/data/pgdata/base/16384/3596 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3597 b/docker/dify/volumes/db/data/pgdata/base/16384/3597 new file mode 100644 index 00000000..aa6981eb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3597 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3598 b/docker/dify/volumes/db/data/pgdata/base/16384/3598 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3599 b/docker/dify/volumes/db/data/pgdata/base/16384/3599 new file mode 100644 index 00000000..44e977ff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3599 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3600 b/docker/dify/volumes/db/data/pgdata/base/16384/3600 new file mode 100644 index 00000000..f0cbdf48 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3600 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3600_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/3600_fsm new file mode 100644 index 00000000..d1328e3f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3600_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3600_vm b/docker/dify/volumes/db/data/pgdata/base/16384/3600_vm new file mode 100644 index 00000000..df898a0a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3600_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3601 b/docker/dify/volumes/db/data/pgdata/base/16384/3601 new file mode 100644 index 00000000..b5384986 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3601 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3601_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/3601_fsm new file mode 100644 index 00000000..59ded720 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3601_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3601_vm b/docker/dify/volumes/db/data/pgdata/base/16384/3601_vm new file mode 100644 index 00000000..06a00128 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3601_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3602 b/docker/dify/volumes/db/data/pgdata/base/16384/3602 new file mode 100644 index 00000000..d3dfdb2b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3602 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3602_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/3602_fsm new file mode 100644 index 00000000..fd059abb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3602_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3602_vm b/docker/dify/volumes/db/data/pgdata/base/16384/3602_vm new file mode 100644 index 00000000..223c1fb3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3602_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3603 b/docker/dify/volumes/db/data/pgdata/base/16384/3603 new file mode 100644 index 00000000..b0b2feac Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3603 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3603_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/3603_fsm new file mode 100644 index 00000000..e820d2fc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3603_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3603_vm b/docker/dify/volumes/db/data/pgdata/base/16384/3603_vm new file mode 100644 index 00000000..e13280cc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3603_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3604 b/docker/dify/volumes/db/data/pgdata/base/16384/3604 new file mode 100644 index 00000000..6f9c46bf Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3604 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3605 b/docker/dify/volumes/db/data/pgdata/base/16384/3605 new file mode 100644 index 00000000..f2a3b6ff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3605 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3606 b/docker/dify/volumes/db/data/pgdata/base/16384/3606 new file mode 100644 index 00000000..3e9ff85d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3606 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3607 b/docker/dify/volumes/db/data/pgdata/base/16384/3607 new file mode 100644 index 00000000..00bc412f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3607 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3608 b/docker/dify/volumes/db/data/pgdata/base/16384/3608 new file mode 100644 index 00000000..fb706be7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3608 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3609 b/docker/dify/volumes/db/data/pgdata/base/16384/3609 new file mode 100644 index 00000000..7aa6370e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3609 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3712 b/docker/dify/volumes/db/data/pgdata/base/16384/3712 new file mode 100644 index 00000000..e9cbf57d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3712 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3764 b/docker/dify/volumes/db/data/pgdata/base/16384/3764 new file mode 100644 index 00000000..c1667c54 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3764 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3764_fsm b/docker/dify/volumes/db/data/pgdata/base/16384/3764_fsm new file mode 100644 index 00000000..bce5e4cd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3764_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3764_vm b/docker/dify/volumes/db/data/pgdata/base/16384/3764_vm new file mode 100644 index 00000000..241fa775 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3764_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3766 b/docker/dify/volumes/db/data/pgdata/base/16384/3766 new file mode 100644 index 00000000..dbce457e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3766 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3767 b/docker/dify/volumes/db/data/pgdata/base/16384/3767 new file mode 100644 index 00000000..319a9d01 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3767 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/3997 b/docker/dify/volumes/db/data/pgdata/base/16384/3997 new file mode 100644 index 00000000..458be463 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/3997 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4143 b/docker/dify/volumes/db/data/pgdata/base/16384/4143 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4144 b/docker/dify/volumes/db/data/pgdata/base/16384/4144 new file mode 100644 index 00000000..bd85cca1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4144 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4145 b/docker/dify/volumes/db/data/pgdata/base/16384/4145 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4146 b/docker/dify/volumes/db/data/pgdata/base/16384/4146 new file mode 100644 index 00000000..44e57381 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4146 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4147 b/docker/dify/volumes/db/data/pgdata/base/16384/4147 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4148 b/docker/dify/volumes/db/data/pgdata/base/16384/4148 new file mode 100644 index 00000000..8e15add9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4148 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4149 b/docker/dify/volumes/db/data/pgdata/base/16384/4149 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4150 b/docker/dify/volumes/db/data/pgdata/base/16384/4150 new file mode 100644 index 00000000..c7589170 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4150 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4151 b/docker/dify/volumes/db/data/pgdata/base/16384/4151 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4152 b/docker/dify/volumes/db/data/pgdata/base/16384/4152 new file mode 100644 index 00000000..57e0595b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4152 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4153 b/docker/dify/volumes/db/data/pgdata/base/16384/4153 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4154 b/docker/dify/volumes/db/data/pgdata/base/16384/4154 new file mode 100644 index 00000000..60c0bcff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4154 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4155 b/docker/dify/volumes/db/data/pgdata/base/16384/4155 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4156 b/docker/dify/volumes/db/data/pgdata/base/16384/4156 new file mode 100644 index 00000000..16ac74b6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4156 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4157 b/docker/dify/volumes/db/data/pgdata/base/16384/4157 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4158 b/docker/dify/volumes/db/data/pgdata/base/16384/4158 new file mode 100644 index 00000000..70a4b4d1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4158 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4159 b/docker/dify/volumes/db/data/pgdata/base/16384/4159 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4160 b/docker/dify/volumes/db/data/pgdata/base/16384/4160 new file mode 100644 index 00000000..b51e8bcd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4160 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4163 b/docker/dify/volumes/db/data/pgdata/base/16384/4163 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4164 b/docker/dify/volumes/db/data/pgdata/base/16384/4164 new file mode 100644 index 00000000..05fa717a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4164 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4165 b/docker/dify/volumes/db/data/pgdata/base/16384/4165 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4166 b/docker/dify/volumes/db/data/pgdata/base/16384/4166 new file mode 100644 index 00000000..860cf21a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4166 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4167 b/docker/dify/volumes/db/data/pgdata/base/16384/4167 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4168 b/docker/dify/volumes/db/data/pgdata/base/16384/4168 new file mode 100644 index 00000000..6a8f3616 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4168 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4169 b/docker/dify/volumes/db/data/pgdata/base/16384/4169 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4170 b/docker/dify/volumes/db/data/pgdata/base/16384/4170 new file mode 100644 index 00000000..a40aaadd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4170 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4171 b/docker/dify/volumes/db/data/pgdata/base/16384/4171 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4172 b/docker/dify/volumes/db/data/pgdata/base/16384/4172 new file mode 100644 index 00000000..9d14d953 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4172 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4173 b/docker/dify/volumes/db/data/pgdata/base/16384/4173 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/4174 b/docker/dify/volumes/db/data/pgdata/base/16384/4174 new file mode 100644 index 00000000..6dee130b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/4174 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/5002 b/docker/dify/volumes/db/data/pgdata/base/16384/5002 new file mode 100644 index 00000000..788d8b9f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/5002 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/548 b/docker/dify/volumes/db/data/pgdata/base/16384/548 new file mode 100644 index 00000000..6c120eb3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/548 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/549 b/docker/dify/volumes/db/data/pgdata/base/16384/549 new file mode 100644 index 00000000..b6011ef4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/549 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6102 b/docker/dify/volumes/db/data/pgdata/base/16384/6102 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6104 b/docker/dify/volumes/db/data/pgdata/base/16384/6104 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6106 b/docker/dify/volumes/db/data/pgdata/base/16384/6106 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6110 b/docker/dify/volumes/db/data/pgdata/base/16384/6110 new file mode 100644 index 00000000..ce8dfca4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/6110 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6111 b/docker/dify/volumes/db/data/pgdata/base/16384/6111 new file mode 100644 index 00000000..8cd6f667 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/6111 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6112 b/docker/dify/volumes/db/data/pgdata/base/16384/6112 new file mode 100644 index 00000000..18b93e14 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/6112 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6113 b/docker/dify/volumes/db/data/pgdata/base/16384/6113 new file mode 100644 index 00000000..fef3c619 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/6113 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6116 b/docker/dify/volumes/db/data/pgdata/base/16384/6116 new file mode 100644 index 00000000..252b5530 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/6116 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6117 b/docker/dify/volumes/db/data/pgdata/base/16384/6117 new file mode 100644 index 00000000..f6ba84a6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/6117 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6175 b/docker/dify/volumes/db/data/pgdata/base/16384/6175 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6176 b/docker/dify/volumes/db/data/pgdata/base/16384/6176 new file mode 100644 index 00000000..36355e3c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/6176 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6228 b/docker/dify/volumes/db/data/pgdata/base/16384/6228 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6229 b/docker/dify/volumes/db/data/pgdata/base/16384/6229 new file mode 100644 index 00000000..392d4a77 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/6229 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6237 b/docker/dify/volumes/db/data/pgdata/base/16384/6237 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6238 b/docker/dify/volumes/db/data/pgdata/base/16384/6238 new file mode 100644 index 00000000..991d61d0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/6238 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/6239 b/docker/dify/volumes/db/data/pgdata/base/16384/6239 new file mode 100644 index 00000000..ae700d15 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/6239 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/826 b/docker/dify/volumes/db/data/pgdata/base/16384/826 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/827 b/docker/dify/volumes/db/data/pgdata/base/16384/827 new file mode 100644 index 00000000..26b2b802 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/827 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/828 b/docker/dify/volumes/db/data/pgdata/base/16384/828 new file mode 100644 index 00000000..84f39f8d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/828 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/PG_VERSION b/docker/dify/volumes/db/data/pgdata/base/16384/PG_VERSION new file mode 100644 index 00000000..60d3b2f4 --- /dev/null +++ b/docker/dify/volumes/db/data/pgdata/base/16384/PG_VERSION @@ -0,0 +1 @@ +15 diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/pg_filenode.map b/docker/dify/volumes/db/data/pgdata/base/16384/pg_filenode.map new file mode 100644 index 00000000..193d78f3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/pg_filenode.map differ diff --git a/docker/dify/volumes/db/data/pgdata/base/16384/pg_internal.init b/docker/dify/volumes/db/data/pgdata/base/16384/pg_internal.init new file mode 100644 index 00000000..15304a6c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/16384/pg_internal.init differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/112 b/docker/dify/volumes/db/data/pgdata/base/17887/112 new file mode 100644 index 00000000..522d8826 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/112 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/113 b/docker/dify/volumes/db/data/pgdata/base/17887/113 new file mode 100644 index 00000000..8dd6cee3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/113 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/1247 b/docker/dify/volumes/db/data/pgdata/base/17887/1247 new file mode 100644 index 00000000..efd7a320 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/1247 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/1247_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/1247_fsm new file mode 100644 index 00000000..91755ad3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/1247_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/1247_vm b/docker/dify/volumes/db/data/pgdata/base/17887/1247_vm new file mode 100644 index 00000000..0146ca78 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/1247_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/1249 b/docker/dify/volumes/db/data/pgdata/base/17887/1249 new file mode 100644 index 00000000..db0ed316 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/1249 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/1249_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/1249_fsm new file mode 100644 index 00000000..d2e12c97 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/1249_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/1249_vm b/docker/dify/volumes/db/data/pgdata/base/17887/1249_vm new file mode 100644 index 00000000..32cd3bcb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/1249_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/1255 b/docker/dify/volumes/db/data/pgdata/base/17887/1255 new file mode 100644 index 00000000..bc08233a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/1255 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/1255_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/1255_fsm new file mode 100644 index 00000000..879fc55e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/1255_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/1255_vm b/docker/dify/volumes/db/data/pgdata/base/17887/1255_vm new file mode 100644 index 00000000..41adb46b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/1255_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/1259 b/docker/dify/volumes/db/data/pgdata/base/17887/1259 new file mode 100644 index 00000000..ba11141e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/1259 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/1259_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/1259_fsm new file mode 100644 index 00000000..94bc691d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/1259_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/1259_vm b/docker/dify/volumes/db/data/pgdata/base/17887/1259_vm new file mode 100644 index 00000000..085b6632 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/1259_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13454 b/docker/dify/volumes/db/data/pgdata/base/17887/13454 new file mode 100644 index 00000000..8515f261 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13454 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13454_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/13454_fsm new file mode 100644 index 00000000..f96ccf26 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13454_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13454_vm b/docker/dify/volumes/db/data/pgdata/base/17887/13454_vm new file mode 100644 index 00000000..a63448d4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13454_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13457 b/docker/dify/volumes/db/data/pgdata/base/17887/13457 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13458 b/docker/dify/volumes/db/data/pgdata/base/17887/13458 new file mode 100644 index 00000000..a9ec671a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13458 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13459 b/docker/dify/volumes/db/data/pgdata/base/17887/13459 new file mode 100644 index 00000000..195da83b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13459 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13459_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/13459_fsm new file mode 100644 index 00000000..e4817059 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13459_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13459_vm b/docker/dify/volumes/db/data/pgdata/base/17887/13459_vm new file mode 100644 index 00000000..53b36c6a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13459_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13462 b/docker/dify/volumes/db/data/pgdata/base/17887/13462 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13463 b/docker/dify/volumes/db/data/pgdata/base/17887/13463 new file mode 100644 index 00000000..7930959e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13463 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13464 b/docker/dify/volumes/db/data/pgdata/base/17887/13464 new file mode 100644 index 00000000..454fcaca Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13464 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13464_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/13464_fsm new file mode 100644 index 00000000..86d8918c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13464_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13464_vm b/docker/dify/volumes/db/data/pgdata/base/17887/13464_vm new file mode 100644 index 00000000..61ef4a51 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13464_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13467 b/docker/dify/volumes/db/data/pgdata/base/17887/13467 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13468 b/docker/dify/volumes/db/data/pgdata/base/17887/13468 new file mode 100644 index 00000000..00037083 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13468 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13469 b/docker/dify/volumes/db/data/pgdata/base/17887/13469 new file mode 100644 index 00000000..eea05d40 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13469 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13469_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/13469_fsm new file mode 100644 index 00000000..9da055d5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13469_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13469_vm b/docker/dify/volumes/db/data/pgdata/base/17887/13469_vm new file mode 100644 index 00000000..4fac34d4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13469_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13472 b/docker/dify/volumes/db/data/pgdata/base/17887/13472 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/13473 b/docker/dify/volumes/db/data/pgdata/base/17887/13473 new file mode 100644 index 00000000..d1865910 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/13473 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/1417 b/docker/dify/volumes/db/data/pgdata/base/17887/1417 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/1418 b/docker/dify/volumes/db/data/pgdata/base/17887/1418 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/174 b/docker/dify/volumes/db/data/pgdata/base/17887/174 new file mode 100644 index 00000000..6dbb118d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/174 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/175 b/docker/dify/volumes/db/data/pgdata/base/17887/175 new file mode 100644 index 00000000..f9b9fce8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/175 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17899 b/docker/dify/volumes/db/data/pgdata/base/17887/17899 new file mode 100644 index 00000000..3bdb92aa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17899 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17905 b/docker/dify/volumes/db/data/pgdata/base/17887/17905 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17906 b/docker/dify/volumes/db/data/pgdata/base/17887/17906 new file mode 100644 index 00000000..36e8bb31 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17906 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17907 b/docker/dify/volumes/db/data/pgdata/base/17887/17907 new file mode 100644 index 00000000..62a0df26 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17907 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17909 b/docker/dify/volumes/db/data/pgdata/base/17887/17909 new file mode 100644 index 00000000..f9cb28db Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17909 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17910 b/docker/dify/volumes/db/data/pgdata/base/17887/17910 new file mode 100644 index 00000000..60685ba6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17910 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17911 b/docker/dify/volumes/db/data/pgdata/base/17887/17911 new file mode 100644 index 00000000..cb05f7c9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17911 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17912 b/docker/dify/volumes/db/data/pgdata/base/17887/17912 new file mode 100644 index 00000000..5452034a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17912 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17916 b/docker/dify/volumes/db/data/pgdata/base/17887/17916 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17917 b/docker/dify/volumes/db/data/pgdata/base/17887/17917 new file mode 100644 index 00000000..da253b01 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17917 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17918 b/docker/dify/volumes/db/data/pgdata/base/17887/17918 new file mode 100644 index 00000000..781cdd8c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17918 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17920 b/docker/dify/volumes/db/data/pgdata/base/17887/17920 new file mode 100644 index 00000000..df732207 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17920 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17921 b/docker/dify/volumes/db/data/pgdata/base/17887/17921 new file mode 100644 index 00000000..4ec4e698 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17921 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17922 b/docker/dify/volumes/db/data/pgdata/base/17887/17922 new file mode 100644 index 00000000..db01353d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17922 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17923 b/docker/dify/volumes/db/data/pgdata/base/17887/17923 new file mode 100644 index 00000000..1cf59054 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17923 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17924 b/docker/dify/volumes/db/data/pgdata/base/17887/17924 new file mode 100644 index 00000000..d1f915f7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17924 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17928 b/docker/dify/volumes/db/data/pgdata/base/17887/17928 new file mode 100644 index 00000000..8fa7e376 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17928 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17928_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/17928_fsm new file mode 100644 index 00000000..6b4fbb37 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17928_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17929 b/docker/dify/volumes/db/data/pgdata/base/17887/17929 new file mode 100644 index 00000000..53b70add Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17929 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17930 b/docker/dify/volumes/db/data/pgdata/base/17887/17930 new file mode 100644 index 00000000..a23823ca Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17930 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17932 b/docker/dify/volumes/db/data/pgdata/base/17887/17932 new file mode 100644 index 00000000..a786113a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17932 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17934 b/docker/dify/volumes/db/data/pgdata/base/17887/17934 new file mode 100644 index 00000000..faa52954 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17934 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17935 b/docker/dify/volumes/db/data/pgdata/base/17887/17935 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17940 b/docker/dify/volumes/db/data/pgdata/base/17887/17940 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17941 b/docker/dify/volumes/db/data/pgdata/base/17887/17941 new file mode 100644 index 00000000..76f551ef Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17941 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17942 b/docker/dify/volumes/db/data/pgdata/base/17887/17942 new file mode 100644 index 00000000..5b75455b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17942 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17944 b/docker/dify/volumes/db/data/pgdata/base/17887/17944 new file mode 100644 index 00000000..7b9c8edd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17944 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17946 b/docker/dify/volumes/db/data/pgdata/base/17887/17946 new file mode 100644 index 00000000..d245cb2b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17946 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17947 b/docker/dify/volumes/db/data/pgdata/base/17887/17947 new file mode 100644 index 00000000..7431cf46 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17947 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17948 b/docker/dify/volumes/db/data/pgdata/base/17887/17948 new file mode 100644 index 00000000..305c6168 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17948 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17949 b/docker/dify/volumes/db/data/pgdata/base/17887/17949 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17953 b/docker/dify/volumes/db/data/pgdata/base/17887/17953 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17954 b/docker/dify/volumes/db/data/pgdata/base/17887/17954 new file mode 100644 index 00000000..e39033a4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17954 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17955 b/docker/dify/volumes/db/data/pgdata/base/17887/17955 new file mode 100644 index 00000000..934d0d78 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17955 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17957 b/docker/dify/volumes/db/data/pgdata/base/17887/17957 new file mode 100644 index 00000000..7e43b7c6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17957 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17959 b/docker/dify/volumes/db/data/pgdata/base/17887/17959 new file mode 100644 index 00000000..1216cedf Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17959 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17960 b/docker/dify/volumes/db/data/pgdata/base/17887/17960 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17964 b/docker/dify/volumes/db/data/pgdata/base/17887/17964 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17965 b/docker/dify/volumes/db/data/pgdata/base/17887/17965 new file mode 100644 index 00000000..7e6b6b63 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17965 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17966 b/docker/dify/volumes/db/data/pgdata/base/17887/17966 new file mode 100644 index 00000000..88cf52ff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17966 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17968 b/docker/dify/volumes/db/data/pgdata/base/17887/17968 new file mode 100644 index 00000000..e7be75c9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17968 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17969 b/docker/dify/volumes/db/data/pgdata/base/17887/17969 new file mode 100644 index 00000000..7a8302c6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17969 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17970 b/docker/dify/volumes/db/data/pgdata/base/17887/17970 new file mode 100644 index 00000000..04e6be92 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17970 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17971 b/docker/dify/volumes/db/data/pgdata/base/17887/17971 new file mode 100644 index 00000000..acf8b8f6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17971 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17972 b/docker/dify/volumes/db/data/pgdata/base/17887/17972 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17976 b/docker/dify/volumes/db/data/pgdata/base/17887/17976 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17977 b/docker/dify/volumes/db/data/pgdata/base/17887/17977 new file mode 100644 index 00000000..80e2efed Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17977 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17978 b/docker/dify/volumes/db/data/pgdata/base/17887/17978 new file mode 100644 index 00000000..93bede11 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17978 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17980 b/docker/dify/volumes/db/data/pgdata/base/17887/17980 new file mode 100644 index 00000000..cb472ca5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17980 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17981 b/docker/dify/volumes/db/data/pgdata/base/17887/17981 new file mode 100644 index 00000000..608d7c35 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17981 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17982 b/docker/dify/volumes/db/data/pgdata/base/17887/17982 new file mode 100644 index 00000000..993f13ce Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17982 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17983 b/docker/dify/volumes/db/data/pgdata/base/17887/17983 new file mode 100644 index 00000000..09d65522 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17983 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17984 b/docker/dify/volumes/db/data/pgdata/base/17887/17984 new file mode 100644 index 00000000..b7720847 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17984 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17988 b/docker/dify/volumes/db/data/pgdata/base/17887/17988 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17989 b/docker/dify/volumes/db/data/pgdata/base/17887/17989 new file mode 100644 index 00000000..8130300e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17989 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17990 b/docker/dify/volumes/db/data/pgdata/base/17887/17990 new file mode 100644 index 00000000..69fdceed Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17990 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17992 b/docker/dify/volumes/db/data/pgdata/base/17887/17992 new file mode 100644 index 00000000..97f80ed7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17992 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17993 b/docker/dify/volumes/db/data/pgdata/base/17887/17993 new file mode 100644 index 00000000..ac30f058 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17993 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17994 b/docker/dify/volumes/db/data/pgdata/base/17887/17994 new file mode 100644 index 00000000..7ada40bb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17994 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17995 b/docker/dify/volumes/db/data/pgdata/base/17887/17995 new file mode 100644 index 00000000..e465c81a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17995 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/17996 b/docker/dify/volumes/db/data/pgdata/base/17887/17996 new file mode 100644 index 00000000..524a8183 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/17996 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18000 b/docker/dify/volumes/db/data/pgdata/base/17887/18000 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18001 b/docker/dify/volumes/db/data/pgdata/base/17887/18001 new file mode 100644 index 00000000..0979d063 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18001 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18002 b/docker/dify/volumes/db/data/pgdata/base/17887/18002 new file mode 100644 index 00000000..c72a0495 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18002 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18004 b/docker/dify/volumes/db/data/pgdata/base/17887/18004 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18008 b/docker/dify/volumes/db/data/pgdata/base/17887/18008 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18009 b/docker/dify/volumes/db/data/pgdata/base/17887/18009 new file mode 100644 index 00000000..b5e184d8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18009 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18010 b/docker/dify/volumes/db/data/pgdata/base/17887/18010 new file mode 100644 index 00000000..39833e25 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18010 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18012 b/docker/dify/volumes/db/data/pgdata/base/17887/18012 new file mode 100644 index 00000000..58db20af Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18012 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18013 b/docker/dify/volumes/db/data/pgdata/base/17887/18013 new file mode 100644 index 00000000..3b5480a7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18013 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18014 b/docker/dify/volumes/db/data/pgdata/base/17887/18014 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18018 b/docker/dify/volumes/db/data/pgdata/base/17887/18018 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18019 b/docker/dify/volumes/db/data/pgdata/base/17887/18019 new file mode 100644 index 00000000..1854a623 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18019 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18020 b/docker/dify/volumes/db/data/pgdata/base/17887/18020 new file mode 100644 index 00000000..b19c3a87 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18020 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18022 b/docker/dify/volumes/db/data/pgdata/base/17887/18022 new file mode 100644 index 00000000..0644842b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18022 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18023 b/docker/dify/volumes/db/data/pgdata/base/17887/18023 new file mode 100644 index 00000000..890309b6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18023 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18024 b/docker/dify/volumes/db/data/pgdata/base/17887/18024 new file mode 100644 index 00000000..c9b815fa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18024 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18025 b/docker/dify/volumes/db/data/pgdata/base/17887/18025 new file mode 100644 index 00000000..a71b3847 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18025 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18026 b/docker/dify/volumes/db/data/pgdata/base/17887/18026 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18030 b/docker/dify/volumes/db/data/pgdata/base/17887/18030 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18031 b/docker/dify/volumes/db/data/pgdata/base/17887/18031 new file mode 100644 index 00000000..81e9b92c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18031 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18032 b/docker/dify/volumes/db/data/pgdata/base/17887/18032 new file mode 100644 index 00000000..d8cdaca8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18032 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18034 b/docker/dify/volumes/db/data/pgdata/base/17887/18034 new file mode 100644 index 00000000..edb5b099 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18034 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18035 b/docker/dify/volumes/db/data/pgdata/base/17887/18035 new file mode 100644 index 00000000..9185586e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18035 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18036 b/docker/dify/volumes/db/data/pgdata/base/17887/18036 new file mode 100644 index 00000000..7b526739 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18036 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18037 b/docker/dify/volumes/db/data/pgdata/base/17887/18037 new file mode 100644 index 00000000..27929208 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18037 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18038 b/docker/dify/volumes/db/data/pgdata/base/17887/18038 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18042 b/docker/dify/volumes/db/data/pgdata/base/17887/18042 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18043 b/docker/dify/volumes/db/data/pgdata/base/17887/18043 new file mode 100644 index 00000000..919641d9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18043 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18044 b/docker/dify/volumes/db/data/pgdata/base/17887/18044 new file mode 100644 index 00000000..f8df30df Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18044 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18046 b/docker/dify/volumes/db/data/pgdata/base/17887/18046 new file mode 100644 index 00000000..38a75b45 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18046 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/18047 b/docker/dify/volumes/db/data/pgdata/base/17887/18047 new file mode 100644 index 00000000..39f5fe41 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/18047 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2187 b/docker/dify/volumes/db/data/pgdata/base/17887/2187 new file mode 100644 index 00000000..dfaedac4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2187 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2224 b/docker/dify/volumes/db/data/pgdata/base/17887/2224 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2228 b/docker/dify/volumes/db/data/pgdata/base/17887/2228 new file mode 100644 index 00000000..95a63c26 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2228 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2328 b/docker/dify/volumes/db/data/pgdata/base/17887/2328 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2336 b/docker/dify/volumes/db/data/pgdata/base/17887/2336 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2337 b/docker/dify/volumes/db/data/pgdata/base/17887/2337 new file mode 100644 index 00000000..a513dba1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2337 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2579 b/docker/dify/volumes/db/data/pgdata/base/17887/2579 new file mode 100644 index 00000000..42bd82ff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2579 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2600 b/docker/dify/volumes/db/data/pgdata/base/17887/2600 new file mode 100644 index 00000000..367e506c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2600 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2600_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2600_fsm new file mode 100644 index 00000000..a2a2cd99 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2600_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2600_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2600_vm new file mode 100644 index 00000000..a5993e9a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2600_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2601 b/docker/dify/volumes/db/data/pgdata/base/17887/2601 new file mode 100644 index 00000000..51a35a26 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2601 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2601_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2601_fsm new file mode 100644 index 00000000..6f44e411 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2601_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2601_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2601_vm new file mode 100644 index 00000000..9a5acdb8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2601_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2602 b/docker/dify/volumes/db/data/pgdata/base/17887/2602 new file mode 100644 index 00000000..205fb800 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2602 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2602_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2602_fsm new file mode 100644 index 00000000..ba4afb15 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2602_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2602_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2602_vm new file mode 100644 index 00000000..7027c415 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2602_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2603 b/docker/dify/volumes/db/data/pgdata/base/17887/2603 new file mode 100644 index 00000000..b2076d18 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2603 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2603_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2603_fsm new file mode 100644 index 00000000..beb1e471 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2603_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2603_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2603_vm new file mode 100644 index 00000000..fd1d2919 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2603_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2604 b/docker/dify/volumes/db/data/pgdata/base/17887/2604 new file mode 100644 index 00000000..8bf263a7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2604 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2605 b/docker/dify/volumes/db/data/pgdata/base/17887/2605 new file mode 100644 index 00000000..e2f7f6a5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2605 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2605_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2605_fsm new file mode 100644 index 00000000..66082851 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2605_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2605_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2605_vm new file mode 100644 index 00000000..8ede9b12 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2605_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2606 b/docker/dify/volumes/db/data/pgdata/base/17887/2606 new file mode 100644 index 00000000..81846ada Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2606 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2606_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2606_fsm new file mode 100644 index 00000000..721aaa32 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2606_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2606_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2606_vm new file mode 100644 index 00000000..73fccfe5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2606_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2607 b/docker/dify/volumes/db/data/pgdata/base/17887/2607 new file mode 100644 index 00000000..c1b1c203 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2607 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2607_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2607_fsm new file mode 100644 index 00000000..5c81d2ba Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2607_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2607_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2607_vm new file mode 100644 index 00000000..b0c5b4bc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2607_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2608 b/docker/dify/volumes/db/data/pgdata/base/17887/2608 new file mode 100644 index 00000000..e8474646 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2608 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2608_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2608_fsm new file mode 100644 index 00000000..8d8471c9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2608_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2608_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2608_vm new file mode 100644 index 00000000..3462b872 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2608_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2609 b/docker/dify/volumes/db/data/pgdata/base/17887/2609 new file mode 100644 index 00000000..5f0c878b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2609 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2609_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2609_fsm new file mode 100644 index 00000000..3df9ab0c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2609_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2609_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2609_vm new file mode 100644 index 00000000..5ad22f28 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2609_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2610 b/docker/dify/volumes/db/data/pgdata/base/17887/2610 new file mode 100644 index 00000000..acecb575 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2610 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2610_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2610_fsm new file mode 100644 index 00000000..ce667417 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2610_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2610_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2610_vm new file mode 100644 index 00000000..c37906b5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2610_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2611 b/docker/dify/volumes/db/data/pgdata/base/17887/2611 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2612 b/docker/dify/volumes/db/data/pgdata/base/17887/2612 new file mode 100644 index 00000000..3ab1cd14 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2612 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2612_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2612_fsm new file mode 100644 index 00000000..9111496e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2612_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2612_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2612_vm new file mode 100644 index 00000000..84b8f167 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2612_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2613 b/docker/dify/volumes/db/data/pgdata/base/17887/2613 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2615 b/docker/dify/volumes/db/data/pgdata/base/17887/2615 new file mode 100644 index 00000000..c5ffbeaf Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2615 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2615_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2615_fsm new file mode 100644 index 00000000..b70304f4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2615_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2615_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2615_vm new file mode 100644 index 00000000..cafb997b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2615_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2616 b/docker/dify/volumes/db/data/pgdata/base/17887/2616 new file mode 100644 index 00000000..215ba517 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2616 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2616_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2616_fsm new file mode 100644 index 00000000..2f0b7715 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2616_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2616_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2616_vm new file mode 100644 index 00000000..c918a577 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2616_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2617 b/docker/dify/volumes/db/data/pgdata/base/17887/2617 new file mode 100644 index 00000000..7d0b7a9b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2617 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2617_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2617_fsm new file mode 100644 index 00000000..f7546bbf Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2617_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2617_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2617_vm new file mode 100644 index 00000000..2232b930 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2617_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2618 b/docker/dify/volumes/db/data/pgdata/base/17887/2618 new file mode 100644 index 00000000..b24bb1b1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2618 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2618_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2618_fsm new file mode 100644 index 00000000..f4ca10a0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2618_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2618_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2618_vm new file mode 100644 index 00000000..cdae6a63 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2618_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2619 b/docker/dify/volumes/db/data/pgdata/base/17887/2619 new file mode 100644 index 00000000..14d313ff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2619 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2619_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2619_fsm new file mode 100644 index 00000000..b6683aa2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2619_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2619_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2619_vm new file mode 100644 index 00000000..00dacef6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2619_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2620 b/docker/dify/volumes/db/data/pgdata/base/17887/2620 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2650 b/docker/dify/volumes/db/data/pgdata/base/17887/2650 new file mode 100644 index 00000000..4adc5db5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2650 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2651 b/docker/dify/volumes/db/data/pgdata/base/17887/2651 new file mode 100644 index 00000000..e91d55db Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2651 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2652 b/docker/dify/volumes/db/data/pgdata/base/17887/2652 new file mode 100644 index 00000000..d4076e60 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2652 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2653 b/docker/dify/volumes/db/data/pgdata/base/17887/2653 new file mode 100644 index 00000000..0b2b54c4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2653 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2654 b/docker/dify/volumes/db/data/pgdata/base/17887/2654 new file mode 100644 index 00000000..05e7dc69 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2654 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2655 b/docker/dify/volumes/db/data/pgdata/base/17887/2655 new file mode 100644 index 00000000..a1152c3a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2655 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2656 b/docker/dify/volumes/db/data/pgdata/base/17887/2656 new file mode 100644 index 00000000..82cb4989 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2656 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2657 b/docker/dify/volumes/db/data/pgdata/base/17887/2657 new file mode 100644 index 00000000..ba87ef15 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2657 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2658 b/docker/dify/volumes/db/data/pgdata/base/17887/2658 new file mode 100644 index 00000000..f283ad37 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2658 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2659 b/docker/dify/volumes/db/data/pgdata/base/17887/2659 new file mode 100644 index 00000000..0d4ce348 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2659 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2660 b/docker/dify/volumes/db/data/pgdata/base/17887/2660 new file mode 100644 index 00000000..05fec3c8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2660 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2661 b/docker/dify/volumes/db/data/pgdata/base/17887/2661 new file mode 100644 index 00000000..b45fb8e9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2661 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2662 b/docker/dify/volumes/db/data/pgdata/base/17887/2662 new file mode 100644 index 00000000..f6108a04 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2662 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2663 b/docker/dify/volumes/db/data/pgdata/base/17887/2663 new file mode 100644 index 00000000..f59f1768 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2663 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2664 b/docker/dify/volumes/db/data/pgdata/base/17887/2664 new file mode 100644 index 00000000..0d1fc124 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2664 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2665 b/docker/dify/volumes/db/data/pgdata/base/17887/2665 new file mode 100644 index 00000000..fa689234 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2665 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2666 b/docker/dify/volumes/db/data/pgdata/base/17887/2666 new file mode 100644 index 00000000..e93cb4bc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2666 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2667 b/docker/dify/volumes/db/data/pgdata/base/17887/2667 new file mode 100644 index 00000000..37ab1255 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2667 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2668 b/docker/dify/volumes/db/data/pgdata/base/17887/2668 new file mode 100644 index 00000000..467eeee7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2668 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2669 b/docker/dify/volumes/db/data/pgdata/base/17887/2669 new file mode 100644 index 00000000..4aaaccf5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2669 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2670 b/docker/dify/volumes/db/data/pgdata/base/17887/2670 new file mode 100644 index 00000000..c1fb94d3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2670 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2673 b/docker/dify/volumes/db/data/pgdata/base/17887/2673 new file mode 100644 index 00000000..2715c188 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2673 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2674 b/docker/dify/volumes/db/data/pgdata/base/17887/2674 new file mode 100644 index 00000000..d9721a47 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2674 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2675 b/docker/dify/volumes/db/data/pgdata/base/17887/2675 new file mode 100644 index 00000000..afc49202 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2675 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2678 b/docker/dify/volumes/db/data/pgdata/base/17887/2678 new file mode 100644 index 00000000..fc7598ea Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2678 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2679 b/docker/dify/volumes/db/data/pgdata/base/17887/2679 new file mode 100644 index 00000000..6f3d1157 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2679 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2680 b/docker/dify/volumes/db/data/pgdata/base/17887/2680 new file mode 100644 index 00000000..645c507c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2680 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2681 b/docker/dify/volumes/db/data/pgdata/base/17887/2681 new file mode 100644 index 00000000..fa402717 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2681 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2682 b/docker/dify/volumes/db/data/pgdata/base/17887/2682 new file mode 100644 index 00000000..8e3bb103 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2682 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2683 b/docker/dify/volumes/db/data/pgdata/base/17887/2683 new file mode 100644 index 00000000..511f0447 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2683 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2684 b/docker/dify/volumes/db/data/pgdata/base/17887/2684 new file mode 100644 index 00000000..1d11f32a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2684 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2685 b/docker/dify/volumes/db/data/pgdata/base/17887/2685 new file mode 100644 index 00000000..6a646c56 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2685 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2686 b/docker/dify/volumes/db/data/pgdata/base/17887/2686 new file mode 100644 index 00000000..738eb1e3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2686 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2687 b/docker/dify/volumes/db/data/pgdata/base/17887/2687 new file mode 100644 index 00000000..14548be1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2687 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2688 b/docker/dify/volumes/db/data/pgdata/base/17887/2688 new file mode 100644 index 00000000..c79ba3c9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2688 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2689 b/docker/dify/volumes/db/data/pgdata/base/17887/2689 new file mode 100644 index 00000000..d2572726 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2689 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2690 b/docker/dify/volumes/db/data/pgdata/base/17887/2690 new file mode 100644 index 00000000..37759a11 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2690 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2691 b/docker/dify/volumes/db/data/pgdata/base/17887/2691 new file mode 100644 index 00000000..f4a79219 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2691 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2692 b/docker/dify/volumes/db/data/pgdata/base/17887/2692 new file mode 100644 index 00000000..bf487e6a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2692 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2693 b/docker/dify/volumes/db/data/pgdata/base/17887/2693 new file mode 100644 index 00000000..4fa597d6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2693 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2696 b/docker/dify/volumes/db/data/pgdata/base/17887/2696 new file mode 100644 index 00000000..d1f4851f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2696 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2699 b/docker/dify/volumes/db/data/pgdata/base/17887/2699 new file mode 100644 index 00000000..338a3bf6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2699 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2701 b/docker/dify/volumes/db/data/pgdata/base/17887/2701 new file mode 100644 index 00000000..c4f681a3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2701 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2702 b/docker/dify/volumes/db/data/pgdata/base/17887/2702 new file mode 100644 index 00000000..6b384bdf Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2702 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2703 b/docker/dify/volumes/db/data/pgdata/base/17887/2703 new file mode 100644 index 00000000..58c93067 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2703 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2704 b/docker/dify/volumes/db/data/pgdata/base/17887/2704 new file mode 100644 index 00000000..82919c80 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2704 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2753 b/docker/dify/volumes/db/data/pgdata/base/17887/2753 new file mode 100644 index 00000000..8dd78b19 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2753 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2753_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2753_fsm new file mode 100644 index 00000000..97721a73 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2753_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2753_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2753_vm new file mode 100644 index 00000000..3fb4596a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2753_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2754 b/docker/dify/volumes/db/data/pgdata/base/17887/2754 new file mode 100644 index 00000000..bcded6f6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2754 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2755 b/docker/dify/volumes/db/data/pgdata/base/17887/2755 new file mode 100644 index 00000000..023b78db Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2755 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2756 b/docker/dify/volumes/db/data/pgdata/base/17887/2756 new file mode 100644 index 00000000..8051799f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2756 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2757 b/docker/dify/volumes/db/data/pgdata/base/17887/2757 new file mode 100644 index 00000000..53d7d027 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2757 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2830 b/docker/dify/volumes/db/data/pgdata/base/17887/2830 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2831 b/docker/dify/volumes/db/data/pgdata/base/17887/2831 new file mode 100644 index 00000000..ff558b67 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2831 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2832 b/docker/dify/volumes/db/data/pgdata/base/17887/2832 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2833 b/docker/dify/volumes/db/data/pgdata/base/17887/2833 new file mode 100644 index 00000000..804b7958 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2833 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2834 b/docker/dify/volumes/db/data/pgdata/base/17887/2834 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2835 b/docker/dify/volumes/db/data/pgdata/base/17887/2835 new file mode 100644 index 00000000..4041d513 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2835 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2836 b/docker/dify/volumes/db/data/pgdata/base/17887/2836 new file mode 100644 index 00000000..d3e2adac Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2836 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2836_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2836_fsm new file mode 100644 index 00000000..74a867cd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2836_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2836_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2836_vm new file mode 100644 index 00000000..f033ccd6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2836_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2837 b/docker/dify/volumes/db/data/pgdata/base/17887/2837 new file mode 100644 index 00000000..a93803a6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2837 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2838 b/docker/dify/volumes/db/data/pgdata/base/17887/2838 new file mode 100644 index 00000000..65f644d1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2838 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2838_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2838_fsm new file mode 100644 index 00000000..5323b24f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2838_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2838_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2838_vm new file mode 100644 index 00000000..7b0fe35f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2838_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2839 b/docker/dify/volumes/db/data/pgdata/base/17887/2839 new file mode 100644 index 00000000..aa37f5c8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2839 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2840 b/docker/dify/volumes/db/data/pgdata/base/17887/2840 new file mode 100644 index 00000000..656b808d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2840 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2840_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/2840_fsm new file mode 100644 index 00000000..23af5dd3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2840_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2840_vm b/docker/dify/volumes/db/data/pgdata/base/17887/2840_vm new file mode 100644 index 00000000..5782eccf Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2840_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2841 b/docker/dify/volumes/db/data/pgdata/base/17887/2841 new file mode 100644 index 00000000..f470b975 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2841 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2995 b/docker/dify/volumes/db/data/pgdata/base/17887/2995 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/2996 b/docker/dify/volumes/db/data/pgdata/base/17887/2996 new file mode 100644 index 00000000..82a5075d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/2996 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3079 b/docker/dify/volumes/db/data/pgdata/base/17887/3079 new file mode 100644 index 00000000..1de19ccb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3079 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3079_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/3079_fsm new file mode 100644 index 00000000..97b7b65a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3079_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3079_vm b/docker/dify/volumes/db/data/pgdata/base/17887/3079_vm new file mode 100644 index 00000000..49683c19 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3079_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3080 b/docker/dify/volumes/db/data/pgdata/base/17887/3080 new file mode 100644 index 00000000..d9d904f9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3080 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3081 b/docker/dify/volumes/db/data/pgdata/base/17887/3081 new file mode 100644 index 00000000..5b4f81e0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3081 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3085 b/docker/dify/volumes/db/data/pgdata/base/17887/3085 new file mode 100644 index 00000000..33a1d984 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3085 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3118 b/docker/dify/volumes/db/data/pgdata/base/17887/3118 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3119 b/docker/dify/volumes/db/data/pgdata/base/17887/3119 new file mode 100644 index 00000000..ed829e0b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3119 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3164 b/docker/dify/volumes/db/data/pgdata/base/17887/3164 new file mode 100644 index 00000000..ea25dbd6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3164 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3256 b/docker/dify/volumes/db/data/pgdata/base/17887/3256 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3257 b/docker/dify/volumes/db/data/pgdata/base/17887/3257 new file mode 100644 index 00000000..49bdf4c5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3257 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3258 b/docker/dify/volumes/db/data/pgdata/base/17887/3258 new file mode 100644 index 00000000..7e889eba Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3258 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3350 b/docker/dify/volumes/db/data/pgdata/base/17887/3350 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3351 b/docker/dify/volumes/db/data/pgdata/base/17887/3351 new file mode 100644 index 00000000..a0125cbc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3351 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3379 b/docker/dify/volumes/db/data/pgdata/base/17887/3379 new file mode 100644 index 00000000..4e34d588 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3379 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3380 b/docker/dify/volumes/db/data/pgdata/base/17887/3380 new file mode 100644 index 00000000..4634a5fd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3380 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3381 b/docker/dify/volumes/db/data/pgdata/base/17887/3381 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3394 b/docker/dify/volumes/db/data/pgdata/base/17887/3394 new file mode 100644 index 00000000..924421ba Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3394 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3394_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/3394_fsm new file mode 100644 index 00000000..ed78bf20 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3394_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3394_vm b/docker/dify/volumes/db/data/pgdata/base/17887/3394_vm new file mode 100644 index 00000000..d10e17e2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3394_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3395 b/docker/dify/volumes/db/data/pgdata/base/17887/3395 new file mode 100644 index 00000000..90be1310 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3395 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3429 b/docker/dify/volumes/db/data/pgdata/base/17887/3429 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3430 b/docker/dify/volumes/db/data/pgdata/base/17887/3430 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3431 b/docker/dify/volumes/db/data/pgdata/base/17887/3431 new file mode 100644 index 00000000..e7ec30ef Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3431 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3433 b/docker/dify/volumes/db/data/pgdata/base/17887/3433 new file mode 100644 index 00000000..87e0b01c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3433 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3439 b/docker/dify/volumes/db/data/pgdata/base/17887/3439 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3440 b/docker/dify/volumes/db/data/pgdata/base/17887/3440 new file mode 100644 index 00000000..8522b59e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3440 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3455 b/docker/dify/volumes/db/data/pgdata/base/17887/3455 new file mode 100644 index 00000000..173b2f0d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3455 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3456 b/docker/dify/volumes/db/data/pgdata/base/17887/3456 new file mode 100644 index 00000000..2ec25ea7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3456 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3456_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/3456_fsm new file mode 100644 index 00000000..8a6aa483 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3456_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3456_vm b/docker/dify/volumes/db/data/pgdata/base/17887/3456_vm new file mode 100644 index 00000000..f4633a95 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3456_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3466 b/docker/dify/volumes/db/data/pgdata/base/17887/3466 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3467 b/docker/dify/volumes/db/data/pgdata/base/17887/3467 new file mode 100644 index 00000000..06aa619e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3467 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3468 b/docker/dify/volumes/db/data/pgdata/base/17887/3468 new file mode 100644 index 00000000..01747924 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3468 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3501 b/docker/dify/volumes/db/data/pgdata/base/17887/3501 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3502 b/docker/dify/volumes/db/data/pgdata/base/17887/3502 new file mode 100644 index 00000000..d9f247c5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3502 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3503 b/docker/dify/volumes/db/data/pgdata/base/17887/3503 new file mode 100644 index 00000000..008a6fa4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3503 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3534 b/docker/dify/volumes/db/data/pgdata/base/17887/3534 new file mode 100644 index 00000000..2435cf8b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3534 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3541 b/docker/dify/volumes/db/data/pgdata/base/17887/3541 new file mode 100644 index 00000000..a8b0dde7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3541 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3541_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/3541_fsm new file mode 100644 index 00000000..71024117 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3541_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3541_vm b/docker/dify/volumes/db/data/pgdata/base/17887/3541_vm new file mode 100644 index 00000000..63a9f943 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3541_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3542 b/docker/dify/volumes/db/data/pgdata/base/17887/3542 new file mode 100644 index 00000000..4687c38e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3542 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3574 b/docker/dify/volumes/db/data/pgdata/base/17887/3574 new file mode 100644 index 00000000..f06e4ed5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3574 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3575 b/docker/dify/volumes/db/data/pgdata/base/17887/3575 new file mode 100644 index 00000000..452d8669 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3575 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3576 b/docker/dify/volumes/db/data/pgdata/base/17887/3576 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3596 b/docker/dify/volumes/db/data/pgdata/base/17887/3596 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3597 b/docker/dify/volumes/db/data/pgdata/base/17887/3597 new file mode 100644 index 00000000..948af535 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3597 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3598 b/docker/dify/volumes/db/data/pgdata/base/17887/3598 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3599 b/docker/dify/volumes/db/data/pgdata/base/17887/3599 new file mode 100644 index 00000000..33ee6046 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3599 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3600 b/docker/dify/volumes/db/data/pgdata/base/17887/3600 new file mode 100644 index 00000000..8c3470eb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3600 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3600_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/3600_fsm new file mode 100644 index 00000000..7fa1f9ec Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3600_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3600_vm b/docker/dify/volumes/db/data/pgdata/base/17887/3600_vm new file mode 100644 index 00000000..403f2957 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3600_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3601 b/docker/dify/volumes/db/data/pgdata/base/17887/3601 new file mode 100644 index 00000000..1fc14f7c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3601 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3601_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/3601_fsm new file mode 100644 index 00000000..6d62a331 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3601_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3601_vm b/docker/dify/volumes/db/data/pgdata/base/17887/3601_vm new file mode 100644 index 00000000..98f366ba Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3601_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3602 b/docker/dify/volumes/db/data/pgdata/base/17887/3602 new file mode 100644 index 00000000..6baffc1d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3602 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3602_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/3602_fsm new file mode 100644 index 00000000..b23c299d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3602_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3602_vm b/docker/dify/volumes/db/data/pgdata/base/17887/3602_vm new file mode 100644 index 00000000..737cb371 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3602_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3603 b/docker/dify/volumes/db/data/pgdata/base/17887/3603 new file mode 100644 index 00000000..e5e2d4a0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3603 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3603_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/3603_fsm new file mode 100644 index 00000000..88029cd7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3603_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3603_vm b/docker/dify/volumes/db/data/pgdata/base/17887/3603_vm new file mode 100644 index 00000000..949a9859 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3603_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3604 b/docker/dify/volumes/db/data/pgdata/base/17887/3604 new file mode 100644 index 00000000..d96b4d2a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3604 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3605 b/docker/dify/volumes/db/data/pgdata/base/17887/3605 new file mode 100644 index 00000000..4d082a73 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3605 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3606 b/docker/dify/volumes/db/data/pgdata/base/17887/3606 new file mode 100644 index 00000000..d40f51b4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3606 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3607 b/docker/dify/volumes/db/data/pgdata/base/17887/3607 new file mode 100644 index 00000000..81003c59 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3607 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3608 b/docker/dify/volumes/db/data/pgdata/base/17887/3608 new file mode 100644 index 00000000..92ea1614 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3608 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3609 b/docker/dify/volumes/db/data/pgdata/base/17887/3609 new file mode 100644 index 00000000..44996a6f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3609 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3712 b/docker/dify/volumes/db/data/pgdata/base/17887/3712 new file mode 100644 index 00000000..2f2759a7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3712 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3764 b/docker/dify/volumes/db/data/pgdata/base/17887/3764 new file mode 100644 index 00000000..16ab9b03 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3764 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3764_fsm b/docker/dify/volumes/db/data/pgdata/base/17887/3764_fsm new file mode 100644 index 00000000..2e95fdd3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3764_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3764_vm b/docker/dify/volumes/db/data/pgdata/base/17887/3764_vm new file mode 100644 index 00000000..b067bb21 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3764_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3766 b/docker/dify/volumes/db/data/pgdata/base/17887/3766 new file mode 100644 index 00000000..2f0f9e5a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3766 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3767 b/docker/dify/volumes/db/data/pgdata/base/17887/3767 new file mode 100644 index 00000000..c20d0323 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3767 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/3997 b/docker/dify/volumes/db/data/pgdata/base/17887/3997 new file mode 100644 index 00000000..2d64d5ae Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/3997 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4143 b/docker/dify/volumes/db/data/pgdata/base/17887/4143 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4144 b/docker/dify/volumes/db/data/pgdata/base/17887/4144 new file mode 100644 index 00000000..78137fd7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4144 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4145 b/docker/dify/volumes/db/data/pgdata/base/17887/4145 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4146 b/docker/dify/volumes/db/data/pgdata/base/17887/4146 new file mode 100644 index 00000000..73e7e761 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4146 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4147 b/docker/dify/volumes/db/data/pgdata/base/17887/4147 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4148 b/docker/dify/volumes/db/data/pgdata/base/17887/4148 new file mode 100644 index 00000000..af717a99 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4148 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4149 b/docker/dify/volumes/db/data/pgdata/base/17887/4149 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4150 b/docker/dify/volumes/db/data/pgdata/base/17887/4150 new file mode 100644 index 00000000..7f8879dd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4150 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4151 b/docker/dify/volumes/db/data/pgdata/base/17887/4151 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4152 b/docker/dify/volumes/db/data/pgdata/base/17887/4152 new file mode 100644 index 00000000..819df746 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4152 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4153 b/docker/dify/volumes/db/data/pgdata/base/17887/4153 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4154 b/docker/dify/volumes/db/data/pgdata/base/17887/4154 new file mode 100644 index 00000000..ca6e060f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4154 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4155 b/docker/dify/volumes/db/data/pgdata/base/17887/4155 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4156 b/docker/dify/volumes/db/data/pgdata/base/17887/4156 new file mode 100644 index 00000000..b311c0fa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4156 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4157 b/docker/dify/volumes/db/data/pgdata/base/17887/4157 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4158 b/docker/dify/volumes/db/data/pgdata/base/17887/4158 new file mode 100644 index 00000000..a03d361c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4158 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4159 b/docker/dify/volumes/db/data/pgdata/base/17887/4159 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4160 b/docker/dify/volumes/db/data/pgdata/base/17887/4160 new file mode 100644 index 00000000..f6513559 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4160 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4163 b/docker/dify/volumes/db/data/pgdata/base/17887/4163 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4164 b/docker/dify/volumes/db/data/pgdata/base/17887/4164 new file mode 100644 index 00000000..e9da0b6a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4164 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4165 b/docker/dify/volumes/db/data/pgdata/base/17887/4165 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4166 b/docker/dify/volumes/db/data/pgdata/base/17887/4166 new file mode 100644 index 00000000..c68f5be0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4166 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4167 b/docker/dify/volumes/db/data/pgdata/base/17887/4167 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4168 b/docker/dify/volumes/db/data/pgdata/base/17887/4168 new file mode 100644 index 00000000..12acb4e2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4168 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4169 b/docker/dify/volumes/db/data/pgdata/base/17887/4169 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4170 b/docker/dify/volumes/db/data/pgdata/base/17887/4170 new file mode 100644 index 00000000..1784a5f4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4170 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4171 b/docker/dify/volumes/db/data/pgdata/base/17887/4171 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4172 b/docker/dify/volumes/db/data/pgdata/base/17887/4172 new file mode 100644 index 00000000..a3968f05 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4172 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4173 b/docker/dify/volumes/db/data/pgdata/base/17887/4173 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/4174 b/docker/dify/volumes/db/data/pgdata/base/17887/4174 new file mode 100644 index 00000000..e6d22493 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/4174 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/5002 b/docker/dify/volumes/db/data/pgdata/base/17887/5002 new file mode 100644 index 00000000..58ed3a09 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/5002 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/548 b/docker/dify/volumes/db/data/pgdata/base/17887/548 new file mode 100644 index 00000000..988b60cd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/548 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/549 b/docker/dify/volumes/db/data/pgdata/base/17887/549 new file mode 100644 index 00000000..cc9694b1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/549 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6102 b/docker/dify/volumes/db/data/pgdata/base/17887/6102 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6104 b/docker/dify/volumes/db/data/pgdata/base/17887/6104 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6106 b/docker/dify/volumes/db/data/pgdata/base/17887/6106 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6110 b/docker/dify/volumes/db/data/pgdata/base/17887/6110 new file mode 100644 index 00000000..03227f9d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/6110 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6111 b/docker/dify/volumes/db/data/pgdata/base/17887/6111 new file mode 100644 index 00000000..ae45212c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/6111 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6112 b/docker/dify/volumes/db/data/pgdata/base/17887/6112 new file mode 100644 index 00000000..41e276b0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/6112 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6113 b/docker/dify/volumes/db/data/pgdata/base/17887/6113 new file mode 100644 index 00000000..bda7ed86 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/6113 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6116 b/docker/dify/volumes/db/data/pgdata/base/17887/6116 new file mode 100644 index 00000000..06f4b579 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/6116 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6117 b/docker/dify/volumes/db/data/pgdata/base/17887/6117 new file mode 100644 index 00000000..093ff062 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/6117 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6175 b/docker/dify/volumes/db/data/pgdata/base/17887/6175 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6176 b/docker/dify/volumes/db/data/pgdata/base/17887/6176 new file mode 100644 index 00000000..c32f29b6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/6176 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6228 b/docker/dify/volumes/db/data/pgdata/base/17887/6228 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6229 b/docker/dify/volumes/db/data/pgdata/base/17887/6229 new file mode 100644 index 00000000..dd4d1aca Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/6229 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6237 b/docker/dify/volumes/db/data/pgdata/base/17887/6237 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6238 b/docker/dify/volumes/db/data/pgdata/base/17887/6238 new file mode 100644 index 00000000..3dd1ad94 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/6238 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/6239 b/docker/dify/volumes/db/data/pgdata/base/17887/6239 new file mode 100644 index 00000000..ae5d2509 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/6239 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/826 b/docker/dify/volumes/db/data/pgdata/base/17887/826 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/827 b/docker/dify/volumes/db/data/pgdata/base/17887/827 new file mode 100644 index 00000000..93fcf9e4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/827 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/828 b/docker/dify/volumes/db/data/pgdata/base/17887/828 new file mode 100644 index 00000000..b5795ef0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/828 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/PG_VERSION b/docker/dify/volumes/db/data/pgdata/base/17887/PG_VERSION new file mode 100644 index 00000000..60d3b2f4 --- /dev/null +++ b/docker/dify/volumes/db/data/pgdata/base/17887/PG_VERSION @@ -0,0 +1 @@ +15 diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/pg_filenode.map b/docker/dify/volumes/db/data/pgdata/base/17887/pg_filenode.map new file mode 100644 index 00000000..193d78f3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/pg_filenode.map differ diff --git a/docker/dify/volumes/db/data/pgdata/base/17887/pg_internal.init b/docker/dify/volumes/db/data/pgdata/base/17887/pg_internal.init new file mode 100644 index 00000000..b94e5c7e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/17887/pg_internal.init differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/112 b/docker/dify/volumes/db/data/pgdata/base/4/112 new file mode 100644 index 00000000..784a4c13 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/112 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/113 b/docker/dify/volumes/db/data/pgdata/base/4/113 new file mode 100644 index 00000000..cc2c412b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/113 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/1247 b/docker/dify/volumes/db/data/pgdata/base/4/1247 new file mode 100644 index 00000000..a628646c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/1247 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/1247_fsm b/docker/dify/volumes/db/data/pgdata/base/4/1247_fsm new file mode 100644 index 00000000..d9ff302c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/1247_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/1247_vm b/docker/dify/volumes/db/data/pgdata/base/4/1247_vm new file mode 100644 index 00000000..cb141f85 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/1247_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/1249 b/docker/dify/volumes/db/data/pgdata/base/4/1249 new file mode 100644 index 00000000..40021b04 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/1249 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/1249_fsm b/docker/dify/volumes/db/data/pgdata/base/4/1249_fsm new file mode 100644 index 00000000..87def576 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/1249_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/1249_vm b/docker/dify/volumes/db/data/pgdata/base/4/1249_vm new file mode 100644 index 00000000..e7c32f42 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/1249_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/1255 b/docker/dify/volumes/db/data/pgdata/base/4/1255 new file mode 100644 index 00000000..549acf0e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/1255 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/1255_fsm b/docker/dify/volumes/db/data/pgdata/base/4/1255_fsm new file mode 100644 index 00000000..5abeaaf2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/1255_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/1255_vm b/docker/dify/volumes/db/data/pgdata/base/4/1255_vm new file mode 100644 index 00000000..7229f841 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/1255_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/1259 b/docker/dify/volumes/db/data/pgdata/base/4/1259 new file mode 100644 index 00000000..ad9e2e84 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/1259 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/1259_fsm b/docker/dify/volumes/db/data/pgdata/base/4/1259_fsm new file mode 100644 index 00000000..bb60b307 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/1259_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/1259_vm b/docker/dify/volumes/db/data/pgdata/base/4/1259_vm new file mode 100644 index 00000000..a3f14f7f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/1259_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13454 b/docker/dify/volumes/db/data/pgdata/base/4/13454 new file mode 100644 index 00000000..d655791d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13454 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13454_fsm b/docker/dify/volumes/db/data/pgdata/base/4/13454_fsm new file mode 100644 index 00000000..dff96115 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13454_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13454_vm b/docker/dify/volumes/db/data/pgdata/base/4/13454_vm new file mode 100644 index 00000000..4a8125b5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13454_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13457 b/docker/dify/volumes/db/data/pgdata/base/4/13457 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13458 b/docker/dify/volumes/db/data/pgdata/base/4/13458 new file mode 100644 index 00000000..3a40f331 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13458 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13459 b/docker/dify/volumes/db/data/pgdata/base/4/13459 new file mode 100644 index 00000000..8199ae15 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13459 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13459_fsm b/docker/dify/volumes/db/data/pgdata/base/4/13459_fsm new file mode 100644 index 00000000..70d16ce4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13459_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13459_vm b/docker/dify/volumes/db/data/pgdata/base/4/13459_vm new file mode 100644 index 00000000..b0ecc4c0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13459_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13462 b/docker/dify/volumes/db/data/pgdata/base/4/13462 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13463 b/docker/dify/volumes/db/data/pgdata/base/4/13463 new file mode 100644 index 00000000..fd105eb4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13463 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13464 b/docker/dify/volumes/db/data/pgdata/base/4/13464 new file mode 100644 index 00000000..8c69968b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13464 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13464_fsm b/docker/dify/volumes/db/data/pgdata/base/4/13464_fsm new file mode 100644 index 00000000..d388044f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13464_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13464_vm b/docker/dify/volumes/db/data/pgdata/base/4/13464_vm new file mode 100644 index 00000000..ea66334c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13464_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13467 b/docker/dify/volumes/db/data/pgdata/base/4/13467 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13468 b/docker/dify/volumes/db/data/pgdata/base/4/13468 new file mode 100644 index 00000000..3207e9e0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13468 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13469 b/docker/dify/volumes/db/data/pgdata/base/4/13469 new file mode 100644 index 00000000..baf18ff8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13469 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13469_fsm b/docker/dify/volumes/db/data/pgdata/base/4/13469_fsm new file mode 100644 index 00000000..a836ddf7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13469_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13469_vm b/docker/dify/volumes/db/data/pgdata/base/4/13469_vm new file mode 100644 index 00000000..c5da2a3c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13469_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13472 b/docker/dify/volumes/db/data/pgdata/base/4/13472 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/13473 b/docker/dify/volumes/db/data/pgdata/base/4/13473 new file mode 100644 index 00000000..32f23576 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/13473 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/1417 b/docker/dify/volumes/db/data/pgdata/base/4/1417 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/1418 b/docker/dify/volumes/db/data/pgdata/base/4/1418 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/174 b/docker/dify/volumes/db/data/pgdata/base/4/174 new file mode 100644 index 00000000..2e4cc9f3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/174 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/175 b/docker/dify/volumes/db/data/pgdata/base/4/175 new file mode 100644 index 00000000..15d51ddc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/175 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2187 b/docker/dify/volumes/db/data/pgdata/base/4/2187 new file mode 100644 index 00000000..cf6377d2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2187 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2224 b/docker/dify/volumes/db/data/pgdata/base/4/2224 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2228 b/docker/dify/volumes/db/data/pgdata/base/4/2228 new file mode 100644 index 00000000..738f259a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2228 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2328 b/docker/dify/volumes/db/data/pgdata/base/4/2328 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2336 b/docker/dify/volumes/db/data/pgdata/base/4/2336 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2337 b/docker/dify/volumes/db/data/pgdata/base/4/2337 new file mode 100644 index 00000000..105af49c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2337 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2579 b/docker/dify/volumes/db/data/pgdata/base/4/2579 new file mode 100644 index 00000000..ae0d53ad Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2579 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2600 b/docker/dify/volumes/db/data/pgdata/base/4/2600 new file mode 100644 index 00000000..a1305d7a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2600 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2600_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2600_fsm new file mode 100644 index 00000000..b8490844 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2600_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2600_vm b/docker/dify/volumes/db/data/pgdata/base/4/2600_vm new file mode 100644 index 00000000..7fac2cbe Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2600_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2601 b/docker/dify/volumes/db/data/pgdata/base/4/2601 new file mode 100644 index 00000000..d8001c8c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2601 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2601_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2601_fsm new file mode 100644 index 00000000..d388044f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2601_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2601_vm b/docker/dify/volumes/db/data/pgdata/base/4/2601_vm new file mode 100644 index 00000000..eb2d0155 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2601_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2602 b/docker/dify/volumes/db/data/pgdata/base/4/2602 new file mode 100644 index 00000000..4a27b0a3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2602 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2602_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2602_fsm new file mode 100644 index 00000000..23170d85 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2602_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2602_vm b/docker/dify/volumes/db/data/pgdata/base/4/2602_vm new file mode 100644 index 00000000..b7e83c3c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2602_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2603 b/docker/dify/volumes/db/data/pgdata/base/4/2603 new file mode 100644 index 00000000..d511af56 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2603 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2603_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2603_fsm new file mode 100644 index 00000000..949bd18f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2603_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2603_vm b/docker/dify/volumes/db/data/pgdata/base/4/2603_vm new file mode 100644 index 00000000..f073a603 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2603_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2604 b/docker/dify/volumes/db/data/pgdata/base/4/2604 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2605 b/docker/dify/volumes/db/data/pgdata/base/4/2605 new file mode 100644 index 00000000..eeaa7eaa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2605 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2605_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2605_fsm new file mode 100644 index 00000000..f3b92bf7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2605_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2605_vm b/docker/dify/volumes/db/data/pgdata/base/4/2605_vm new file mode 100644 index 00000000..85d1e841 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2605_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2606 b/docker/dify/volumes/db/data/pgdata/base/4/2606 new file mode 100644 index 00000000..4737fa77 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2606 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2606_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2606_fsm new file mode 100644 index 00000000..286dd813 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2606_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2606_vm b/docker/dify/volumes/db/data/pgdata/base/4/2606_vm new file mode 100644 index 00000000..86bc6bf5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2606_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2607 b/docker/dify/volumes/db/data/pgdata/base/4/2607 new file mode 100644 index 00000000..bfad49ae Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2607 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2607_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2607_fsm new file mode 100644 index 00000000..80ac8b14 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2607_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2607_vm b/docker/dify/volumes/db/data/pgdata/base/4/2607_vm new file mode 100644 index 00000000..c0a22c62 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2607_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2608 b/docker/dify/volumes/db/data/pgdata/base/4/2608 new file mode 100644 index 00000000..e75c37b5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2608 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2608_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2608_fsm new file mode 100644 index 00000000..6ba89a46 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2608_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2608_vm b/docker/dify/volumes/db/data/pgdata/base/4/2608_vm new file mode 100644 index 00000000..9a21eb75 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2608_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2609 b/docker/dify/volumes/db/data/pgdata/base/4/2609 new file mode 100644 index 00000000..2983f4db Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2609 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2609_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2609_fsm new file mode 100644 index 00000000..11f989b1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2609_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2609_vm b/docker/dify/volumes/db/data/pgdata/base/4/2609_vm new file mode 100644 index 00000000..61b91943 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2609_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2610 b/docker/dify/volumes/db/data/pgdata/base/4/2610 new file mode 100644 index 00000000..8251aeb8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2610 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2610_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2610_fsm new file mode 100644 index 00000000..dbd22e1f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2610_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2610_vm b/docker/dify/volumes/db/data/pgdata/base/4/2610_vm new file mode 100644 index 00000000..25f58e1c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2610_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2611 b/docker/dify/volumes/db/data/pgdata/base/4/2611 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2612 b/docker/dify/volumes/db/data/pgdata/base/4/2612 new file mode 100644 index 00000000..c39ab4d5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2612 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2612_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2612_fsm new file mode 100644 index 00000000..877976ac Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2612_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2612_vm b/docker/dify/volumes/db/data/pgdata/base/4/2612_vm new file mode 100644 index 00000000..ef0dbfff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2612_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2613 b/docker/dify/volumes/db/data/pgdata/base/4/2613 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2615 b/docker/dify/volumes/db/data/pgdata/base/4/2615 new file mode 100644 index 00000000..db72cea7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2615 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2615_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2615_fsm new file mode 100644 index 00000000..d041693e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2615_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2615_vm b/docker/dify/volumes/db/data/pgdata/base/4/2615_vm new file mode 100644 index 00000000..233f9690 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2615_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2616 b/docker/dify/volumes/db/data/pgdata/base/4/2616 new file mode 100644 index 00000000..0d60d797 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2616 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2616_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2616_fsm new file mode 100644 index 00000000..cb924c95 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2616_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2616_vm b/docker/dify/volumes/db/data/pgdata/base/4/2616_vm new file mode 100644 index 00000000..e704cec7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2616_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2617 b/docker/dify/volumes/db/data/pgdata/base/4/2617 new file mode 100644 index 00000000..bcdfc183 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2617 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2617_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2617_fsm new file mode 100644 index 00000000..29d60666 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2617_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2617_vm b/docker/dify/volumes/db/data/pgdata/base/4/2617_vm new file mode 100644 index 00000000..6db4a14c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2617_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2618 b/docker/dify/volumes/db/data/pgdata/base/4/2618 new file mode 100644 index 00000000..230b6370 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2618 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2618_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2618_fsm new file mode 100644 index 00000000..e162e372 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2618_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2618_vm b/docker/dify/volumes/db/data/pgdata/base/4/2618_vm new file mode 100644 index 00000000..7ad7e690 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2618_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2619 b/docker/dify/volumes/db/data/pgdata/base/4/2619 new file mode 100644 index 00000000..9c1962ec Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2619 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2619_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2619_fsm new file mode 100644 index 00000000..e2307747 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2619_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2619_vm b/docker/dify/volumes/db/data/pgdata/base/4/2619_vm new file mode 100644 index 00000000..c3fffd9e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2619_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2620 b/docker/dify/volumes/db/data/pgdata/base/4/2620 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2650 b/docker/dify/volumes/db/data/pgdata/base/4/2650 new file mode 100644 index 00000000..32ff8a16 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2650 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2651 b/docker/dify/volumes/db/data/pgdata/base/4/2651 new file mode 100644 index 00000000..cff86c74 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2651 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2652 b/docker/dify/volumes/db/data/pgdata/base/4/2652 new file mode 100644 index 00000000..ab53706f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2652 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2653 b/docker/dify/volumes/db/data/pgdata/base/4/2653 new file mode 100644 index 00000000..86b08571 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2653 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2654 b/docker/dify/volumes/db/data/pgdata/base/4/2654 new file mode 100644 index 00000000..095a4fd5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2654 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2655 b/docker/dify/volumes/db/data/pgdata/base/4/2655 new file mode 100644 index 00000000..4b4b3cc6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2655 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2656 b/docker/dify/volumes/db/data/pgdata/base/4/2656 new file mode 100644 index 00000000..2fd9a71f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2656 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2657 b/docker/dify/volumes/db/data/pgdata/base/4/2657 new file mode 100644 index 00000000..d0384dc6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2657 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2658 b/docker/dify/volumes/db/data/pgdata/base/4/2658 new file mode 100644 index 00000000..2777e797 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2658 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2659 b/docker/dify/volumes/db/data/pgdata/base/4/2659 new file mode 100644 index 00000000..dd90e168 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2659 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2660 b/docker/dify/volumes/db/data/pgdata/base/4/2660 new file mode 100644 index 00000000..fd66d228 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2660 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2661 b/docker/dify/volumes/db/data/pgdata/base/4/2661 new file mode 100644 index 00000000..3c62a6fd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2661 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2662 b/docker/dify/volumes/db/data/pgdata/base/4/2662 new file mode 100644 index 00000000..b09801b1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2662 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2663 b/docker/dify/volumes/db/data/pgdata/base/4/2663 new file mode 100644 index 00000000..1fe3a98d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2663 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2664 b/docker/dify/volumes/db/data/pgdata/base/4/2664 new file mode 100644 index 00000000..a7761ead Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2664 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2665 b/docker/dify/volumes/db/data/pgdata/base/4/2665 new file mode 100644 index 00000000..024d2917 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2665 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2666 b/docker/dify/volumes/db/data/pgdata/base/4/2666 new file mode 100644 index 00000000..55842a3c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2666 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2667 b/docker/dify/volumes/db/data/pgdata/base/4/2667 new file mode 100644 index 00000000..40aa4997 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2667 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2668 b/docker/dify/volumes/db/data/pgdata/base/4/2668 new file mode 100644 index 00000000..8ca1619c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2668 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2669 b/docker/dify/volumes/db/data/pgdata/base/4/2669 new file mode 100644 index 00000000..b13c3353 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2669 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2670 b/docker/dify/volumes/db/data/pgdata/base/4/2670 new file mode 100644 index 00000000..936feee6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2670 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2673 b/docker/dify/volumes/db/data/pgdata/base/4/2673 new file mode 100644 index 00000000..e431d106 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2673 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2674 b/docker/dify/volumes/db/data/pgdata/base/4/2674 new file mode 100644 index 00000000..24e0beb2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2674 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2675 b/docker/dify/volumes/db/data/pgdata/base/4/2675 new file mode 100644 index 00000000..91709217 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2675 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2678 b/docker/dify/volumes/db/data/pgdata/base/4/2678 new file mode 100644 index 00000000..c718c7a0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2678 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2679 b/docker/dify/volumes/db/data/pgdata/base/4/2679 new file mode 100644 index 00000000..b296d1cb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2679 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2680 b/docker/dify/volumes/db/data/pgdata/base/4/2680 new file mode 100644 index 00000000..0d352e91 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2680 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2681 b/docker/dify/volumes/db/data/pgdata/base/4/2681 new file mode 100644 index 00000000..b13b323c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2681 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2682 b/docker/dify/volumes/db/data/pgdata/base/4/2682 new file mode 100644 index 00000000..3141bcdc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2682 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2683 b/docker/dify/volumes/db/data/pgdata/base/4/2683 new file mode 100644 index 00000000..117ee7ae Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2683 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2684 b/docker/dify/volumes/db/data/pgdata/base/4/2684 new file mode 100644 index 00000000..05092ecb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2684 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2685 b/docker/dify/volumes/db/data/pgdata/base/4/2685 new file mode 100644 index 00000000..5bf0c30f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2685 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2686 b/docker/dify/volumes/db/data/pgdata/base/4/2686 new file mode 100644 index 00000000..3054a565 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2686 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2687 b/docker/dify/volumes/db/data/pgdata/base/4/2687 new file mode 100644 index 00000000..349490ed Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2687 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2688 b/docker/dify/volumes/db/data/pgdata/base/4/2688 new file mode 100644 index 00000000..f00cec25 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2688 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2689 b/docker/dify/volumes/db/data/pgdata/base/4/2689 new file mode 100644 index 00000000..8329829d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2689 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2690 b/docker/dify/volumes/db/data/pgdata/base/4/2690 new file mode 100644 index 00000000..09176d40 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2690 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2691 b/docker/dify/volumes/db/data/pgdata/base/4/2691 new file mode 100644 index 00000000..6e60d7f1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2691 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2692 b/docker/dify/volumes/db/data/pgdata/base/4/2692 new file mode 100644 index 00000000..c7e275c1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2692 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2693 b/docker/dify/volumes/db/data/pgdata/base/4/2693 new file mode 100644 index 00000000..f6aef2f5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2693 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2696 b/docker/dify/volumes/db/data/pgdata/base/4/2696 new file mode 100644 index 00000000..08f217f3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2696 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2699 b/docker/dify/volumes/db/data/pgdata/base/4/2699 new file mode 100644 index 00000000..4a755207 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2699 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2701 b/docker/dify/volumes/db/data/pgdata/base/4/2701 new file mode 100644 index 00000000..82f5cd0e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2701 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2702 b/docker/dify/volumes/db/data/pgdata/base/4/2702 new file mode 100644 index 00000000..2d6a98c2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2702 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2703 b/docker/dify/volumes/db/data/pgdata/base/4/2703 new file mode 100644 index 00000000..01c87ae8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2703 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2704 b/docker/dify/volumes/db/data/pgdata/base/4/2704 new file mode 100644 index 00000000..c3f65000 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2704 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2753 b/docker/dify/volumes/db/data/pgdata/base/4/2753 new file mode 100644 index 00000000..3c16dff6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2753 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2753_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2753_fsm new file mode 100644 index 00000000..642bce3b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2753_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2753_vm b/docker/dify/volumes/db/data/pgdata/base/4/2753_vm new file mode 100644 index 00000000..72c3e6de Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2753_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2754 b/docker/dify/volumes/db/data/pgdata/base/4/2754 new file mode 100644 index 00000000..bdd4d527 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2754 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2755 b/docker/dify/volumes/db/data/pgdata/base/4/2755 new file mode 100644 index 00000000..fd5d56a2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2755 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2756 b/docker/dify/volumes/db/data/pgdata/base/4/2756 new file mode 100644 index 00000000..6a044745 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2756 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2757 b/docker/dify/volumes/db/data/pgdata/base/4/2757 new file mode 100644 index 00000000..8f9ccdf0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2757 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2830 b/docker/dify/volumes/db/data/pgdata/base/4/2830 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2831 b/docker/dify/volumes/db/data/pgdata/base/4/2831 new file mode 100644 index 00000000..c0a407a0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2831 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2832 b/docker/dify/volumes/db/data/pgdata/base/4/2832 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2833 b/docker/dify/volumes/db/data/pgdata/base/4/2833 new file mode 100644 index 00000000..eea5df63 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2833 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2834 b/docker/dify/volumes/db/data/pgdata/base/4/2834 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2835 b/docker/dify/volumes/db/data/pgdata/base/4/2835 new file mode 100644 index 00000000..8aad1359 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2835 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2836 b/docker/dify/volumes/db/data/pgdata/base/4/2836 new file mode 100644 index 00000000..5c9f07f8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2836 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2836_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2836_fsm new file mode 100644 index 00000000..6e81497f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2836_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2836_vm b/docker/dify/volumes/db/data/pgdata/base/4/2836_vm new file mode 100644 index 00000000..5e43ad13 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2836_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2837 b/docker/dify/volumes/db/data/pgdata/base/4/2837 new file mode 100644 index 00000000..888d3af3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2837 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2838 b/docker/dify/volumes/db/data/pgdata/base/4/2838 new file mode 100644 index 00000000..e59ce108 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2838 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2838_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2838_fsm new file mode 100644 index 00000000..a9b1e030 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2838_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2838_vm b/docker/dify/volumes/db/data/pgdata/base/4/2838_vm new file mode 100644 index 00000000..cf7d8c70 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2838_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2839 b/docker/dify/volumes/db/data/pgdata/base/4/2839 new file mode 100644 index 00000000..1e07360f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2839 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2840 b/docker/dify/volumes/db/data/pgdata/base/4/2840 new file mode 100644 index 00000000..9d275557 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2840 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2840_fsm b/docker/dify/volumes/db/data/pgdata/base/4/2840_fsm new file mode 100644 index 00000000..36ee51aa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2840_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2840_vm b/docker/dify/volumes/db/data/pgdata/base/4/2840_vm new file mode 100644 index 00000000..4857429b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2840_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2841 b/docker/dify/volumes/db/data/pgdata/base/4/2841 new file mode 100644 index 00000000..f524a491 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2841 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2995 b/docker/dify/volumes/db/data/pgdata/base/4/2995 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/2996 b/docker/dify/volumes/db/data/pgdata/base/4/2996 new file mode 100644 index 00000000..170333a4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/2996 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3079 b/docker/dify/volumes/db/data/pgdata/base/4/3079 new file mode 100644 index 00000000..06243ba7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3079 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3079_fsm b/docker/dify/volumes/db/data/pgdata/base/4/3079_fsm new file mode 100644 index 00000000..7732d22b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3079_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3079_vm b/docker/dify/volumes/db/data/pgdata/base/4/3079_vm new file mode 100644 index 00000000..f6c15836 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3079_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3080 b/docker/dify/volumes/db/data/pgdata/base/4/3080 new file mode 100644 index 00000000..e6b1f43e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3080 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3081 b/docker/dify/volumes/db/data/pgdata/base/4/3081 new file mode 100644 index 00000000..b9fb15c0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3081 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3085 b/docker/dify/volumes/db/data/pgdata/base/4/3085 new file mode 100644 index 00000000..e640c6e8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3085 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3118 b/docker/dify/volumes/db/data/pgdata/base/4/3118 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3119 b/docker/dify/volumes/db/data/pgdata/base/4/3119 new file mode 100644 index 00000000..db2bde09 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3119 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3164 b/docker/dify/volumes/db/data/pgdata/base/4/3164 new file mode 100644 index 00000000..f493af70 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3164 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3256 b/docker/dify/volumes/db/data/pgdata/base/4/3256 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3257 b/docker/dify/volumes/db/data/pgdata/base/4/3257 new file mode 100644 index 00000000..64787da2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3257 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3258 b/docker/dify/volumes/db/data/pgdata/base/4/3258 new file mode 100644 index 00000000..09abe9b9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3258 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3350 b/docker/dify/volumes/db/data/pgdata/base/4/3350 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3351 b/docker/dify/volumes/db/data/pgdata/base/4/3351 new file mode 100644 index 00000000..2bfef7fb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3351 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3379 b/docker/dify/volumes/db/data/pgdata/base/4/3379 new file mode 100644 index 00000000..caced87c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3379 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3380 b/docker/dify/volumes/db/data/pgdata/base/4/3380 new file mode 100644 index 00000000..55d6862d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3380 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3381 b/docker/dify/volumes/db/data/pgdata/base/4/3381 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3394 b/docker/dify/volumes/db/data/pgdata/base/4/3394 new file mode 100644 index 00000000..71374fc7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3394 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3394_fsm b/docker/dify/volumes/db/data/pgdata/base/4/3394_fsm new file mode 100644 index 00000000..9622a2f0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3394_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3394_vm b/docker/dify/volumes/db/data/pgdata/base/4/3394_vm new file mode 100644 index 00000000..d6dbec86 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3394_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3395 b/docker/dify/volumes/db/data/pgdata/base/4/3395 new file mode 100644 index 00000000..c31f4b0b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3395 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3429 b/docker/dify/volumes/db/data/pgdata/base/4/3429 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3430 b/docker/dify/volumes/db/data/pgdata/base/4/3430 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3431 b/docker/dify/volumes/db/data/pgdata/base/4/3431 new file mode 100644 index 00000000..ce872ee1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3431 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3433 b/docker/dify/volumes/db/data/pgdata/base/4/3433 new file mode 100644 index 00000000..68ea223e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3433 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3439 b/docker/dify/volumes/db/data/pgdata/base/4/3439 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3440 b/docker/dify/volumes/db/data/pgdata/base/4/3440 new file mode 100644 index 00000000..0545e4bb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3440 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3455 b/docker/dify/volumes/db/data/pgdata/base/4/3455 new file mode 100644 index 00000000..0767e59f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3455 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3456 b/docker/dify/volumes/db/data/pgdata/base/4/3456 new file mode 100644 index 00000000..1f4db93b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3456 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3456_fsm b/docker/dify/volumes/db/data/pgdata/base/4/3456_fsm new file mode 100644 index 00000000..8f765c68 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3456_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3456_vm b/docker/dify/volumes/db/data/pgdata/base/4/3456_vm new file mode 100644 index 00000000..c0a04f4d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3456_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3466 b/docker/dify/volumes/db/data/pgdata/base/4/3466 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3467 b/docker/dify/volumes/db/data/pgdata/base/4/3467 new file mode 100644 index 00000000..c7016e10 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3467 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3468 b/docker/dify/volumes/db/data/pgdata/base/4/3468 new file mode 100644 index 00000000..fab333bd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3468 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3501 b/docker/dify/volumes/db/data/pgdata/base/4/3501 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3502 b/docker/dify/volumes/db/data/pgdata/base/4/3502 new file mode 100644 index 00000000..ece495c9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3502 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3503 b/docker/dify/volumes/db/data/pgdata/base/4/3503 new file mode 100644 index 00000000..53f9b69e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3503 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3534 b/docker/dify/volumes/db/data/pgdata/base/4/3534 new file mode 100644 index 00000000..11fad3bb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3534 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3541 b/docker/dify/volumes/db/data/pgdata/base/4/3541 new file mode 100644 index 00000000..40869ad3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3541 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3541_fsm b/docker/dify/volumes/db/data/pgdata/base/4/3541_fsm new file mode 100644 index 00000000..a3a2de4d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3541_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3541_vm b/docker/dify/volumes/db/data/pgdata/base/4/3541_vm new file mode 100644 index 00000000..51f0e82e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3541_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3542 b/docker/dify/volumes/db/data/pgdata/base/4/3542 new file mode 100644 index 00000000..ced00669 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3542 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3574 b/docker/dify/volumes/db/data/pgdata/base/4/3574 new file mode 100644 index 00000000..b026df10 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3574 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3575 b/docker/dify/volumes/db/data/pgdata/base/4/3575 new file mode 100644 index 00000000..bdec5326 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3575 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3576 b/docker/dify/volumes/db/data/pgdata/base/4/3576 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3596 b/docker/dify/volumes/db/data/pgdata/base/4/3596 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3597 b/docker/dify/volumes/db/data/pgdata/base/4/3597 new file mode 100644 index 00000000..08855a4d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3597 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3598 b/docker/dify/volumes/db/data/pgdata/base/4/3598 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3599 b/docker/dify/volumes/db/data/pgdata/base/4/3599 new file mode 100644 index 00000000..aaf38926 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3599 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3600 b/docker/dify/volumes/db/data/pgdata/base/4/3600 new file mode 100644 index 00000000..a125931a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3600 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3600_fsm b/docker/dify/volumes/db/data/pgdata/base/4/3600_fsm new file mode 100644 index 00000000..cebec199 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3600_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3600_vm b/docker/dify/volumes/db/data/pgdata/base/4/3600_vm new file mode 100644 index 00000000..b9fcd6a9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3600_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3601 b/docker/dify/volumes/db/data/pgdata/base/4/3601 new file mode 100644 index 00000000..04c846ec Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3601 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3601_fsm b/docker/dify/volumes/db/data/pgdata/base/4/3601_fsm new file mode 100644 index 00000000..7732d22b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3601_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3601_vm b/docker/dify/volumes/db/data/pgdata/base/4/3601_vm new file mode 100644 index 00000000..3db367e2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3601_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3602 b/docker/dify/volumes/db/data/pgdata/base/4/3602 new file mode 100644 index 00000000..265567f1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3602 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3602_fsm b/docker/dify/volumes/db/data/pgdata/base/4/3602_fsm new file mode 100644 index 00000000..d7897de2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3602_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3602_vm b/docker/dify/volumes/db/data/pgdata/base/4/3602_vm new file mode 100644 index 00000000..9b4d7923 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3602_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3603 b/docker/dify/volumes/db/data/pgdata/base/4/3603 new file mode 100644 index 00000000..1b0d6cf3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3603 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3603_fsm b/docker/dify/volumes/db/data/pgdata/base/4/3603_fsm new file mode 100644 index 00000000..c28dd4fa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3603_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3603_vm b/docker/dify/volumes/db/data/pgdata/base/4/3603_vm new file mode 100644 index 00000000..102cff1b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3603_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3604 b/docker/dify/volumes/db/data/pgdata/base/4/3604 new file mode 100644 index 00000000..5aad5993 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3604 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3605 b/docker/dify/volumes/db/data/pgdata/base/4/3605 new file mode 100644 index 00000000..9f8d1fe7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3605 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3606 b/docker/dify/volumes/db/data/pgdata/base/4/3606 new file mode 100644 index 00000000..abe7a1cf Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3606 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3607 b/docker/dify/volumes/db/data/pgdata/base/4/3607 new file mode 100644 index 00000000..e3a3bbc6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3607 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3608 b/docker/dify/volumes/db/data/pgdata/base/4/3608 new file mode 100644 index 00000000..88266dac Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3608 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3609 b/docker/dify/volumes/db/data/pgdata/base/4/3609 new file mode 100644 index 00000000..5ff24567 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3609 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3712 b/docker/dify/volumes/db/data/pgdata/base/4/3712 new file mode 100644 index 00000000..aa23ee97 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3712 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3764 b/docker/dify/volumes/db/data/pgdata/base/4/3764 new file mode 100644 index 00000000..1c794036 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3764 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3764_fsm b/docker/dify/volumes/db/data/pgdata/base/4/3764_fsm new file mode 100644 index 00000000..f64db4df Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3764_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3764_vm b/docker/dify/volumes/db/data/pgdata/base/4/3764_vm new file mode 100644 index 00000000..d7118cad Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3764_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3766 b/docker/dify/volumes/db/data/pgdata/base/4/3766 new file mode 100644 index 00000000..c4134620 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3766 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3767 b/docker/dify/volumes/db/data/pgdata/base/4/3767 new file mode 100644 index 00000000..6cbae02d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3767 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/3997 b/docker/dify/volumes/db/data/pgdata/base/4/3997 new file mode 100644 index 00000000..8969d818 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/3997 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4143 b/docker/dify/volumes/db/data/pgdata/base/4/4143 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4144 b/docker/dify/volumes/db/data/pgdata/base/4/4144 new file mode 100644 index 00000000..5188a14b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4144 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4145 b/docker/dify/volumes/db/data/pgdata/base/4/4145 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4146 b/docker/dify/volumes/db/data/pgdata/base/4/4146 new file mode 100644 index 00000000..957732fc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4146 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4147 b/docker/dify/volumes/db/data/pgdata/base/4/4147 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4148 b/docker/dify/volumes/db/data/pgdata/base/4/4148 new file mode 100644 index 00000000..9c7057c3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4148 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4149 b/docker/dify/volumes/db/data/pgdata/base/4/4149 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4150 b/docker/dify/volumes/db/data/pgdata/base/4/4150 new file mode 100644 index 00000000..390d428a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4150 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4151 b/docker/dify/volumes/db/data/pgdata/base/4/4151 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4152 b/docker/dify/volumes/db/data/pgdata/base/4/4152 new file mode 100644 index 00000000..1a289fd8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4152 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4153 b/docker/dify/volumes/db/data/pgdata/base/4/4153 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4154 b/docker/dify/volumes/db/data/pgdata/base/4/4154 new file mode 100644 index 00000000..d0d1ca59 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4154 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4155 b/docker/dify/volumes/db/data/pgdata/base/4/4155 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4156 b/docker/dify/volumes/db/data/pgdata/base/4/4156 new file mode 100644 index 00000000..5b4bf370 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4156 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4157 b/docker/dify/volumes/db/data/pgdata/base/4/4157 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4158 b/docker/dify/volumes/db/data/pgdata/base/4/4158 new file mode 100644 index 00000000..937d3d28 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4158 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4159 b/docker/dify/volumes/db/data/pgdata/base/4/4159 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4160 b/docker/dify/volumes/db/data/pgdata/base/4/4160 new file mode 100644 index 00000000..d10cfd60 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4160 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4163 b/docker/dify/volumes/db/data/pgdata/base/4/4163 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4164 b/docker/dify/volumes/db/data/pgdata/base/4/4164 new file mode 100644 index 00000000..a94c963f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4164 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4165 b/docker/dify/volumes/db/data/pgdata/base/4/4165 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4166 b/docker/dify/volumes/db/data/pgdata/base/4/4166 new file mode 100644 index 00000000..2229586f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4166 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4167 b/docker/dify/volumes/db/data/pgdata/base/4/4167 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4168 b/docker/dify/volumes/db/data/pgdata/base/4/4168 new file mode 100644 index 00000000..472740b9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4168 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4169 b/docker/dify/volumes/db/data/pgdata/base/4/4169 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4170 b/docker/dify/volumes/db/data/pgdata/base/4/4170 new file mode 100644 index 00000000..88d09b3d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4170 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4171 b/docker/dify/volumes/db/data/pgdata/base/4/4171 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4172 b/docker/dify/volumes/db/data/pgdata/base/4/4172 new file mode 100644 index 00000000..3eed1ee2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4172 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4173 b/docker/dify/volumes/db/data/pgdata/base/4/4173 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/4174 b/docker/dify/volumes/db/data/pgdata/base/4/4174 new file mode 100644 index 00000000..a0819a24 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/4174 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/5002 b/docker/dify/volumes/db/data/pgdata/base/4/5002 new file mode 100644 index 00000000..aefa40dd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/5002 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/548 b/docker/dify/volumes/db/data/pgdata/base/4/548 new file mode 100644 index 00000000..7c6567d5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/548 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/549 b/docker/dify/volumes/db/data/pgdata/base/4/549 new file mode 100644 index 00000000..26a3887d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/549 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6102 b/docker/dify/volumes/db/data/pgdata/base/4/6102 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6104 b/docker/dify/volumes/db/data/pgdata/base/4/6104 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6106 b/docker/dify/volumes/db/data/pgdata/base/4/6106 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6110 b/docker/dify/volumes/db/data/pgdata/base/4/6110 new file mode 100644 index 00000000..42e19200 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/6110 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6111 b/docker/dify/volumes/db/data/pgdata/base/4/6111 new file mode 100644 index 00000000..d012727d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/6111 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6112 b/docker/dify/volumes/db/data/pgdata/base/4/6112 new file mode 100644 index 00000000..293367c2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/6112 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6113 b/docker/dify/volumes/db/data/pgdata/base/4/6113 new file mode 100644 index 00000000..542f8faa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/6113 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6116 b/docker/dify/volumes/db/data/pgdata/base/4/6116 new file mode 100644 index 00000000..787d5d18 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/6116 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6117 b/docker/dify/volumes/db/data/pgdata/base/4/6117 new file mode 100644 index 00000000..2b5656b2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/6117 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6175 b/docker/dify/volumes/db/data/pgdata/base/4/6175 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6176 b/docker/dify/volumes/db/data/pgdata/base/4/6176 new file mode 100644 index 00000000..bfd14df5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/6176 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6228 b/docker/dify/volumes/db/data/pgdata/base/4/6228 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6229 b/docker/dify/volumes/db/data/pgdata/base/4/6229 new file mode 100644 index 00000000..5d03213f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/6229 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6237 b/docker/dify/volumes/db/data/pgdata/base/4/6237 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6238 b/docker/dify/volumes/db/data/pgdata/base/4/6238 new file mode 100644 index 00000000..e7c0e8c3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/6238 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/6239 b/docker/dify/volumes/db/data/pgdata/base/4/6239 new file mode 100644 index 00000000..6c60b507 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/6239 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/826 b/docker/dify/volumes/db/data/pgdata/base/4/826 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/4/827 b/docker/dify/volumes/db/data/pgdata/base/4/827 new file mode 100644 index 00000000..94a900ec Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/827 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/828 b/docker/dify/volumes/db/data/pgdata/base/4/828 new file mode 100644 index 00000000..ca304614 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/828 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/4/PG_VERSION b/docker/dify/volumes/db/data/pgdata/base/4/PG_VERSION new file mode 100644 index 00000000..60d3b2f4 --- /dev/null +++ b/docker/dify/volumes/db/data/pgdata/base/4/PG_VERSION @@ -0,0 +1 @@ +15 diff --git a/docker/dify/volumes/db/data/pgdata/base/4/pg_filenode.map b/docker/dify/volumes/db/data/pgdata/base/4/pg_filenode.map new file mode 100644 index 00000000..193d78f3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/4/pg_filenode.map differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/112 b/docker/dify/volumes/db/data/pgdata/base/5/112 new file mode 100644 index 00000000..784a4c13 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/112 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/113 b/docker/dify/volumes/db/data/pgdata/base/5/113 new file mode 100644 index 00000000..cc2c412b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/113 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/1247 b/docker/dify/volumes/db/data/pgdata/base/5/1247 new file mode 100644 index 00000000..a628646c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/1247 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/1247_fsm b/docker/dify/volumes/db/data/pgdata/base/5/1247_fsm new file mode 100644 index 00000000..d9ff302c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/1247_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/1247_vm b/docker/dify/volumes/db/data/pgdata/base/5/1247_vm new file mode 100644 index 00000000..cb141f85 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/1247_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/1249 b/docker/dify/volumes/db/data/pgdata/base/5/1249 new file mode 100644 index 00000000..40021b04 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/1249 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/1249_fsm b/docker/dify/volumes/db/data/pgdata/base/5/1249_fsm new file mode 100644 index 00000000..87def576 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/1249_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/1249_vm b/docker/dify/volumes/db/data/pgdata/base/5/1249_vm new file mode 100644 index 00000000..e7c32f42 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/1249_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/1255 b/docker/dify/volumes/db/data/pgdata/base/5/1255 new file mode 100644 index 00000000..549acf0e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/1255 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/1255_fsm b/docker/dify/volumes/db/data/pgdata/base/5/1255_fsm new file mode 100644 index 00000000..5abeaaf2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/1255_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/1255_vm b/docker/dify/volumes/db/data/pgdata/base/5/1255_vm new file mode 100644 index 00000000..7229f841 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/1255_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/1259 b/docker/dify/volumes/db/data/pgdata/base/5/1259 new file mode 100644 index 00000000..e1e60120 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/1259 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/1259_fsm b/docker/dify/volumes/db/data/pgdata/base/5/1259_fsm new file mode 100644 index 00000000..bb60b307 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/1259_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/1259_vm b/docker/dify/volumes/db/data/pgdata/base/5/1259_vm new file mode 100644 index 00000000..a3f14f7f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/1259_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13454 b/docker/dify/volumes/db/data/pgdata/base/5/13454 new file mode 100644 index 00000000..d655791d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13454 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13454_fsm b/docker/dify/volumes/db/data/pgdata/base/5/13454_fsm new file mode 100644 index 00000000..dff96115 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13454_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13454_vm b/docker/dify/volumes/db/data/pgdata/base/5/13454_vm new file mode 100644 index 00000000..4a8125b5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13454_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13457 b/docker/dify/volumes/db/data/pgdata/base/5/13457 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13458 b/docker/dify/volumes/db/data/pgdata/base/5/13458 new file mode 100644 index 00000000..3a40f331 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13458 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13459 b/docker/dify/volumes/db/data/pgdata/base/5/13459 new file mode 100644 index 00000000..8199ae15 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13459 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13459_fsm b/docker/dify/volumes/db/data/pgdata/base/5/13459_fsm new file mode 100644 index 00000000..70d16ce4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13459_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13459_vm b/docker/dify/volumes/db/data/pgdata/base/5/13459_vm new file mode 100644 index 00000000..b0ecc4c0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13459_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13462 b/docker/dify/volumes/db/data/pgdata/base/5/13462 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13463 b/docker/dify/volumes/db/data/pgdata/base/5/13463 new file mode 100644 index 00000000..fd105eb4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13463 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13464 b/docker/dify/volumes/db/data/pgdata/base/5/13464 new file mode 100644 index 00000000..8c69968b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13464 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13464_fsm b/docker/dify/volumes/db/data/pgdata/base/5/13464_fsm new file mode 100644 index 00000000..d388044f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13464_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13464_vm b/docker/dify/volumes/db/data/pgdata/base/5/13464_vm new file mode 100644 index 00000000..ea66334c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13464_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13467 b/docker/dify/volumes/db/data/pgdata/base/5/13467 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13468 b/docker/dify/volumes/db/data/pgdata/base/5/13468 new file mode 100644 index 00000000..3207e9e0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13468 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13469 b/docker/dify/volumes/db/data/pgdata/base/5/13469 new file mode 100644 index 00000000..baf18ff8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13469 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13469_fsm b/docker/dify/volumes/db/data/pgdata/base/5/13469_fsm new file mode 100644 index 00000000..a836ddf7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13469_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13469_vm b/docker/dify/volumes/db/data/pgdata/base/5/13469_vm new file mode 100644 index 00000000..c5da2a3c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13469_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13472 b/docker/dify/volumes/db/data/pgdata/base/5/13472 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/13473 b/docker/dify/volumes/db/data/pgdata/base/5/13473 new file mode 100644 index 00000000..32f23576 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/13473 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/1417 b/docker/dify/volumes/db/data/pgdata/base/5/1417 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/1418 b/docker/dify/volumes/db/data/pgdata/base/5/1418 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/174 b/docker/dify/volumes/db/data/pgdata/base/5/174 new file mode 100644 index 00000000..2e4cc9f3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/174 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/175 b/docker/dify/volumes/db/data/pgdata/base/5/175 new file mode 100644 index 00000000..15d51ddc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/175 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2187 b/docker/dify/volumes/db/data/pgdata/base/5/2187 new file mode 100644 index 00000000..cf6377d2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2187 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2224 b/docker/dify/volumes/db/data/pgdata/base/5/2224 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2228 b/docker/dify/volumes/db/data/pgdata/base/5/2228 new file mode 100644 index 00000000..738f259a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2228 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2328 b/docker/dify/volumes/db/data/pgdata/base/5/2328 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2336 b/docker/dify/volumes/db/data/pgdata/base/5/2336 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2337 b/docker/dify/volumes/db/data/pgdata/base/5/2337 new file mode 100644 index 00000000..105af49c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2337 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2579 b/docker/dify/volumes/db/data/pgdata/base/5/2579 new file mode 100644 index 00000000..ae0d53ad Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2579 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2600 b/docker/dify/volumes/db/data/pgdata/base/5/2600 new file mode 100644 index 00000000..a1305d7a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2600 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2600_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2600_fsm new file mode 100644 index 00000000..b8490844 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2600_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2600_vm b/docker/dify/volumes/db/data/pgdata/base/5/2600_vm new file mode 100644 index 00000000..7fac2cbe Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2600_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2601 b/docker/dify/volumes/db/data/pgdata/base/5/2601 new file mode 100644 index 00000000..d8001c8c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2601 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2601_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2601_fsm new file mode 100644 index 00000000..d388044f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2601_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2601_vm b/docker/dify/volumes/db/data/pgdata/base/5/2601_vm new file mode 100644 index 00000000..eb2d0155 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2601_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2602 b/docker/dify/volumes/db/data/pgdata/base/5/2602 new file mode 100644 index 00000000..4a27b0a3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2602 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2602_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2602_fsm new file mode 100644 index 00000000..23170d85 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2602_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2602_vm b/docker/dify/volumes/db/data/pgdata/base/5/2602_vm new file mode 100644 index 00000000..b7e83c3c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2602_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2603 b/docker/dify/volumes/db/data/pgdata/base/5/2603 new file mode 100644 index 00000000..d511af56 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2603 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2603_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2603_fsm new file mode 100644 index 00000000..949bd18f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2603_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2603_vm b/docker/dify/volumes/db/data/pgdata/base/5/2603_vm new file mode 100644 index 00000000..f073a603 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2603_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2604 b/docker/dify/volumes/db/data/pgdata/base/5/2604 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2605 b/docker/dify/volumes/db/data/pgdata/base/5/2605 new file mode 100644 index 00000000..eeaa7eaa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2605 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2605_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2605_fsm new file mode 100644 index 00000000..f3b92bf7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2605_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2605_vm b/docker/dify/volumes/db/data/pgdata/base/5/2605_vm new file mode 100644 index 00000000..85d1e841 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2605_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2606 b/docker/dify/volumes/db/data/pgdata/base/5/2606 new file mode 100644 index 00000000..4737fa77 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2606 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2606_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2606_fsm new file mode 100644 index 00000000..286dd813 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2606_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2606_vm b/docker/dify/volumes/db/data/pgdata/base/5/2606_vm new file mode 100644 index 00000000..86bc6bf5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2606_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2607 b/docker/dify/volumes/db/data/pgdata/base/5/2607 new file mode 100644 index 00000000..bfad49ae Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2607 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2607_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2607_fsm new file mode 100644 index 00000000..80ac8b14 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2607_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2607_vm b/docker/dify/volumes/db/data/pgdata/base/5/2607_vm new file mode 100644 index 00000000..c0a22c62 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2607_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2608 b/docker/dify/volumes/db/data/pgdata/base/5/2608 new file mode 100644 index 00000000..e75c37b5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2608 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2608_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2608_fsm new file mode 100644 index 00000000..6ba89a46 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2608_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2608_vm b/docker/dify/volumes/db/data/pgdata/base/5/2608_vm new file mode 100644 index 00000000..9a21eb75 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2608_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2609 b/docker/dify/volumes/db/data/pgdata/base/5/2609 new file mode 100644 index 00000000..2983f4db Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2609 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2609_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2609_fsm new file mode 100644 index 00000000..11f989b1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2609_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2609_vm b/docker/dify/volumes/db/data/pgdata/base/5/2609_vm new file mode 100644 index 00000000..61b91943 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2609_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2610 b/docker/dify/volumes/db/data/pgdata/base/5/2610 new file mode 100644 index 00000000..8251aeb8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2610 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2610_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2610_fsm new file mode 100644 index 00000000..dbd22e1f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2610_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2610_vm b/docker/dify/volumes/db/data/pgdata/base/5/2610_vm new file mode 100644 index 00000000..25f58e1c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2610_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2611 b/docker/dify/volumes/db/data/pgdata/base/5/2611 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2612 b/docker/dify/volumes/db/data/pgdata/base/5/2612 new file mode 100644 index 00000000..c39ab4d5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2612 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2612_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2612_fsm new file mode 100644 index 00000000..877976ac Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2612_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2612_vm b/docker/dify/volumes/db/data/pgdata/base/5/2612_vm new file mode 100644 index 00000000..ef0dbfff Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2612_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2613 b/docker/dify/volumes/db/data/pgdata/base/5/2613 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2615 b/docker/dify/volumes/db/data/pgdata/base/5/2615 new file mode 100644 index 00000000..db72cea7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2615 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2615_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2615_fsm new file mode 100644 index 00000000..d041693e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2615_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2615_vm b/docker/dify/volumes/db/data/pgdata/base/5/2615_vm new file mode 100644 index 00000000..233f9690 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2615_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2616 b/docker/dify/volumes/db/data/pgdata/base/5/2616 new file mode 100644 index 00000000..0d60d797 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2616 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2616_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2616_fsm new file mode 100644 index 00000000..cb924c95 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2616_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2616_vm b/docker/dify/volumes/db/data/pgdata/base/5/2616_vm new file mode 100644 index 00000000..e704cec7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2616_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2617 b/docker/dify/volumes/db/data/pgdata/base/5/2617 new file mode 100644 index 00000000..bcdfc183 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2617 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2617_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2617_fsm new file mode 100644 index 00000000..29d60666 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2617_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2617_vm b/docker/dify/volumes/db/data/pgdata/base/5/2617_vm new file mode 100644 index 00000000..6db4a14c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2617_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2618 b/docker/dify/volumes/db/data/pgdata/base/5/2618 new file mode 100644 index 00000000..230b6370 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2618 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2618_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2618_fsm new file mode 100644 index 00000000..e162e372 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2618_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2618_vm b/docker/dify/volumes/db/data/pgdata/base/5/2618_vm new file mode 100644 index 00000000..7ad7e690 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2618_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2619 b/docker/dify/volumes/db/data/pgdata/base/5/2619 new file mode 100644 index 00000000..9c1962ec Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2619 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2619_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2619_fsm new file mode 100644 index 00000000..e2307747 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2619_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2619_vm b/docker/dify/volumes/db/data/pgdata/base/5/2619_vm new file mode 100644 index 00000000..c3fffd9e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2619_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2620 b/docker/dify/volumes/db/data/pgdata/base/5/2620 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2650 b/docker/dify/volumes/db/data/pgdata/base/5/2650 new file mode 100644 index 00000000..32ff8a16 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2650 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2651 b/docker/dify/volumes/db/data/pgdata/base/5/2651 new file mode 100644 index 00000000..cff86c74 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2651 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2652 b/docker/dify/volumes/db/data/pgdata/base/5/2652 new file mode 100644 index 00000000..ab53706f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2652 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2653 b/docker/dify/volumes/db/data/pgdata/base/5/2653 new file mode 100644 index 00000000..86b08571 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2653 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2654 b/docker/dify/volumes/db/data/pgdata/base/5/2654 new file mode 100644 index 00000000..095a4fd5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2654 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2655 b/docker/dify/volumes/db/data/pgdata/base/5/2655 new file mode 100644 index 00000000..4b4b3cc6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2655 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2656 b/docker/dify/volumes/db/data/pgdata/base/5/2656 new file mode 100644 index 00000000..2fd9a71f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2656 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2657 b/docker/dify/volumes/db/data/pgdata/base/5/2657 new file mode 100644 index 00000000..d0384dc6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2657 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2658 b/docker/dify/volumes/db/data/pgdata/base/5/2658 new file mode 100644 index 00000000..2777e797 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2658 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2659 b/docker/dify/volumes/db/data/pgdata/base/5/2659 new file mode 100644 index 00000000..dd90e168 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2659 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2660 b/docker/dify/volumes/db/data/pgdata/base/5/2660 new file mode 100644 index 00000000..fd66d228 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2660 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2661 b/docker/dify/volumes/db/data/pgdata/base/5/2661 new file mode 100644 index 00000000..3c62a6fd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2661 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2662 b/docker/dify/volumes/db/data/pgdata/base/5/2662 new file mode 100644 index 00000000..b09801b1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2662 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2663 b/docker/dify/volumes/db/data/pgdata/base/5/2663 new file mode 100644 index 00000000..1fe3a98d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2663 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2664 b/docker/dify/volumes/db/data/pgdata/base/5/2664 new file mode 100644 index 00000000..a7761ead Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2664 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2665 b/docker/dify/volumes/db/data/pgdata/base/5/2665 new file mode 100644 index 00000000..024d2917 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2665 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2666 b/docker/dify/volumes/db/data/pgdata/base/5/2666 new file mode 100644 index 00000000..55842a3c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2666 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2667 b/docker/dify/volumes/db/data/pgdata/base/5/2667 new file mode 100644 index 00000000..40aa4997 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2667 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2668 b/docker/dify/volumes/db/data/pgdata/base/5/2668 new file mode 100644 index 00000000..8ca1619c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2668 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2669 b/docker/dify/volumes/db/data/pgdata/base/5/2669 new file mode 100644 index 00000000..b13c3353 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2669 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2670 b/docker/dify/volumes/db/data/pgdata/base/5/2670 new file mode 100644 index 00000000..936feee6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2670 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2673 b/docker/dify/volumes/db/data/pgdata/base/5/2673 new file mode 100644 index 00000000..e431d106 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2673 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2674 b/docker/dify/volumes/db/data/pgdata/base/5/2674 new file mode 100644 index 00000000..24e0beb2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2674 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2675 b/docker/dify/volumes/db/data/pgdata/base/5/2675 new file mode 100644 index 00000000..91709217 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2675 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2678 b/docker/dify/volumes/db/data/pgdata/base/5/2678 new file mode 100644 index 00000000..c718c7a0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2678 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2679 b/docker/dify/volumes/db/data/pgdata/base/5/2679 new file mode 100644 index 00000000..b296d1cb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2679 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2680 b/docker/dify/volumes/db/data/pgdata/base/5/2680 new file mode 100644 index 00000000..0d352e91 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2680 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2681 b/docker/dify/volumes/db/data/pgdata/base/5/2681 new file mode 100644 index 00000000..b13b323c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2681 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2682 b/docker/dify/volumes/db/data/pgdata/base/5/2682 new file mode 100644 index 00000000..3141bcdc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2682 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2683 b/docker/dify/volumes/db/data/pgdata/base/5/2683 new file mode 100644 index 00000000..117ee7ae Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2683 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2684 b/docker/dify/volumes/db/data/pgdata/base/5/2684 new file mode 100644 index 00000000..05092ecb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2684 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2685 b/docker/dify/volumes/db/data/pgdata/base/5/2685 new file mode 100644 index 00000000..5bf0c30f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2685 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2686 b/docker/dify/volumes/db/data/pgdata/base/5/2686 new file mode 100644 index 00000000..3054a565 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2686 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2687 b/docker/dify/volumes/db/data/pgdata/base/5/2687 new file mode 100644 index 00000000..349490ed Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2687 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2688 b/docker/dify/volumes/db/data/pgdata/base/5/2688 new file mode 100644 index 00000000..f00cec25 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2688 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2689 b/docker/dify/volumes/db/data/pgdata/base/5/2689 new file mode 100644 index 00000000..8329829d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2689 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2690 b/docker/dify/volumes/db/data/pgdata/base/5/2690 new file mode 100644 index 00000000..09176d40 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2690 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2691 b/docker/dify/volumes/db/data/pgdata/base/5/2691 new file mode 100644 index 00000000..6e60d7f1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2691 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2692 b/docker/dify/volumes/db/data/pgdata/base/5/2692 new file mode 100644 index 00000000..c7e275c1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2692 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2693 b/docker/dify/volumes/db/data/pgdata/base/5/2693 new file mode 100644 index 00000000..f6aef2f5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2693 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2696 b/docker/dify/volumes/db/data/pgdata/base/5/2696 new file mode 100644 index 00000000..08f217f3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2696 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2699 b/docker/dify/volumes/db/data/pgdata/base/5/2699 new file mode 100644 index 00000000..4a755207 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2699 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2701 b/docker/dify/volumes/db/data/pgdata/base/5/2701 new file mode 100644 index 00000000..82f5cd0e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2701 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2702 b/docker/dify/volumes/db/data/pgdata/base/5/2702 new file mode 100644 index 00000000..2d6a98c2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2702 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2703 b/docker/dify/volumes/db/data/pgdata/base/5/2703 new file mode 100644 index 00000000..01c87ae8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2703 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2704 b/docker/dify/volumes/db/data/pgdata/base/5/2704 new file mode 100644 index 00000000..c3f65000 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2704 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2753 b/docker/dify/volumes/db/data/pgdata/base/5/2753 new file mode 100644 index 00000000..3c16dff6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2753 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2753_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2753_fsm new file mode 100644 index 00000000..642bce3b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2753_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2753_vm b/docker/dify/volumes/db/data/pgdata/base/5/2753_vm new file mode 100644 index 00000000..72c3e6de Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2753_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2754 b/docker/dify/volumes/db/data/pgdata/base/5/2754 new file mode 100644 index 00000000..bdd4d527 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2754 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2755 b/docker/dify/volumes/db/data/pgdata/base/5/2755 new file mode 100644 index 00000000..fd5d56a2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2755 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2756 b/docker/dify/volumes/db/data/pgdata/base/5/2756 new file mode 100644 index 00000000..6a044745 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2756 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2757 b/docker/dify/volumes/db/data/pgdata/base/5/2757 new file mode 100644 index 00000000..8f9ccdf0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2757 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2830 b/docker/dify/volumes/db/data/pgdata/base/5/2830 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2831 b/docker/dify/volumes/db/data/pgdata/base/5/2831 new file mode 100644 index 00000000..c0a407a0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2831 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2832 b/docker/dify/volumes/db/data/pgdata/base/5/2832 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2833 b/docker/dify/volumes/db/data/pgdata/base/5/2833 new file mode 100644 index 00000000..eea5df63 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2833 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2834 b/docker/dify/volumes/db/data/pgdata/base/5/2834 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2835 b/docker/dify/volumes/db/data/pgdata/base/5/2835 new file mode 100644 index 00000000..8aad1359 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2835 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2836 b/docker/dify/volumes/db/data/pgdata/base/5/2836 new file mode 100644 index 00000000..5c9f07f8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2836 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2836_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2836_fsm new file mode 100644 index 00000000..6e81497f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2836_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2836_vm b/docker/dify/volumes/db/data/pgdata/base/5/2836_vm new file mode 100644 index 00000000..5e43ad13 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2836_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2837 b/docker/dify/volumes/db/data/pgdata/base/5/2837 new file mode 100644 index 00000000..888d3af3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2837 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2838 b/docker/dify/volumes/db/data/pgdata/base/5/2838 new file mode 100644 index 00000000..e59ce108 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2838 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2838_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2838_fsm new file mode 100644 index 00000000..a9b1e030 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2838_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2838_vm b/docker/dify/volumes/db/data/pgdata/base/5/2838_vm new file mode 100644 index 00000000..cf7d8c70 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2838_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2839 b/docker/dify/volumes/db/data/pgdata/base/5/2839 new file mode 100644 index 00000000..1e07360f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2839 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2840 b/docker/dify/volumes/db/data/pgdata/base/5/2840 new file mode 100644 index 00000000..9d275557 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2840 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2840_fsm b/docker/dify/volumes/db/data/pgdata/base/5/2840_fsm new file mode 100644 index 00000000..36ee51aa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2840_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2840_vm b/docker/dify/volumes/db/data/pgdata/base/5/2840_vm new file mode 100644 index 00000000..4857429b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2840_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2841 b/docker/dify/volumes/db/data/pgdata/base/5/2841 new file mode 100644 index 00000000..f524a491 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2841 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2995 b/docker/dify/volumes/db/data/pgdata/base/5/2995 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/2996 b/docker/dify/volumes/db/data/pgdata/base/5/2996 new file mode 100644 index 00000000..170333a4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/2996 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3079 b/docker/dify/volumes/db/data/pgdata/base/5/3079 new file mode 100644 index 00000000..06243ba7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3079 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3079_fsm b/docker/dify/volumes/db/data/pgdata/base/5/3079_fsm new file mode 100644 index 00000000..7732d22b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3079_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3079_vm b/docker/dify/volumes/db/data/pgdata/base/5/3079_vm new file mode 100644 index 00000000..f6c15836 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3079_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3080 b/docker/dify/volumes/db/data/pgdata/base/5/3080 new file mode 100644 index 00000000..e6b1f43e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3080 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3081 b/docker/dify/volumes/db/data/pgdata/base/5/3081 new file mode 100644 index 00000000..b9fb15c0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3081 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3085 b/docker/dify/volumes/db/data/pgdata/base/5/3085 new file mode 100644 index 00000000..e640c6e8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3085 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3118 b/docker/dify/volumes/db/data/pgdata/base/5/3118 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3119 b/docker/dify/volumes/db/data/pgdata/base/5/3119 new file mode 100644 index 00000000..db2bde09 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3119 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3164 b/docker/dify/volumes/db/data/pgdata/base/5/3164 new file mode 100644 index 00000000..f493af70 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3164 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3256 b/docker/dify/volumes/db/data/pgdata/base/5/3256 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3257 b/docker/dify/volumes/db/data/pgdata/base/5/3257 new file mode 100644 index 00000000..64787da2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3257 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3258 b/docker/dify/volumes/db/data/pgdata/base/5/3258 new file mode 100644 index 00000000..09abe9b9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3258 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3350 b/docker/dify/volumes/db/data/pgdata/base/5/3350 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3351 b/docker/dify/volumes/db/data/pgdata/base/5/3351 new file mode 100644 index 00000000..2bfef7fb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3351 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3379 b/docker/dify/volumes/db/data/pgdata/base/5/3379 new file mode 100644 index 00000000..caced87c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3379 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3380 b/docker/dify/volumes/db/data/pgdata/base/5/3380 new file mode 100644 index 00000000..55d6862d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3380 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3381 b/docker/dify/volumes/db/data/pgdata/base/5/3381 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3394 b/docker/dify/volumes/db/data/pgdata/base/5/3394 new file mode 100644 index 00000000..71374fc7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3394 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3394_fsm b/docker/dify/volumes/db/data/pgdata/base/5/3394_fsm new file mode 100644 index 00000000..9622a2f0 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3394_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3394_vm b/docker/dify/volumes/db/data/pgdata/base/5/3394_vm new file mode 100644 index 00000000..d6dbec86 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3394_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3395 b/docker/dify/volumes/db/data/pgdata/base/5/3395 new file mode 100644 index 00000000..c31f4b0b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3395 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3429 b/docker/dify/volumes/db/data/pgdata/base/5/3429 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3430 b/docker/dify/volumes/db/data/pgdata/base/5/3430 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3431 b/docker/dify/volumes/db/data/pgdata/base/5/3431 new file mode 100644 index 00000000..ce872ee1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3431 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3433 b/docker/dify/volumes/db/data/pgdata/base/5/3433 new file mode 100644 index 00000000..68ea223e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3433 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3439 b/docker/dify/volumes/db/data/pgdata/base/5/3439 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3440 b/docker/dify/volumes/db/data/pgdata/base/5/3440 new file mode 100644 index 00000000..0545e4bb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3440 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3455 b/docker/dify/volumes/db/data/pgdata/base/5/3455 new file mode 100644 index 00000000..0767e59f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3455 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3456 b/docker/dify/volumes/db/data/pgdata/base/5/3456 new file mode 100644 index 00000000..1f4db93b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3456 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3456_fsm b/docker/dify/volumes/db/data/pgdata/base/5/3456_fsm new file mode 100644 index 00000000..8f765c68 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3456_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3456_vm b/docker/dify/volumes/db/data/pgdata/base/5/3456_vm new file mode 100644 index 00000000..c0a04f4d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3456_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3466 b/docker/dify/volumes/db/data/pgdata/base/5/3466 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3467 b/docker/dify/volumes/db/data/pgdata/base/5/3467 new file mode 100644 index 00000000..c7016e10 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3467 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3468 b/docker/dify/volumes/db/data/pgdata/base/5/3468 new file mode 100644 index 00000000..fab333bd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3468 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3501 b/docker/dify/volumes/db/data/pgdata/base/5/3501 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3502 b/docker/dify/volumes/db/data/pgdata/base/5/3502 new file mode 100644 index 00000000..ece495c9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3502 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3503 b/docker/dify/volumes/db/data/pgdata/base/5/3503 new file mode 100644 index 00000000..53f9b69e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3503 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3534 b/docker/dify/volumes/db/data/pgdata/base/5/3534 new file mode 100644 index 00000000..11fad3bb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3534 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3541 b/docker/dify/volumes/db/data/pgdata/base/5/3541 new file mode 100644 index 00000000..40869ad3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3541 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3541_fsm b/docker/dify/volumes/db/data/pgdata/base/5/3541_fsm new file mode 100644 index 00000000..a3a2de4d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3541_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3541_vm b/docker/dify/volumes/db/data/pgdata/base/5/3541_vm new file mode 100644 index 00000000..51f0e82e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3541_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3542 b/docker/dify/volumes/db/data/pgdata/base/5/3542 new file mode 100644 index 00000000..ced00669 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3542 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3574 b/docker/dify/volumes/db/data/pgdata/base/5/3574 new file mode 100644 index 00000000..b026df10 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3574 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3575 b/docker/dify/volumes/db/data/pgdata/base/5/3575 new file mode 100644 index 00000000..bdec5326 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3575 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3576 b/docker/dify/volumes/db/data/pgdata/base/5/3576 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3596 b/docker/dify/volumes/db/data/pgdata/base/5/3596 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3597 b/docker/dify/volumes/db/data/pgdata/base/5/3597 new file mode 100644 index 00000000..08855a4d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3597 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3598 b/docker/dify/volumes/db/data/pgdata/base/5/3598 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3599 b/docker/dify/volumes/db/data/pgdata/base/5/3599 new file mode 100644 index 00000000..aaf38926 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3599 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3600 b/docker/dify/volumes/db/data/pgdata/base/5/3600 new file mode 100644 index 00000000..a125931a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3600 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3600_fsm b/docker/dify/volumes/db/data/pgdata/base/5/3600_fsm new file mode 100644 index 00000000..cebec199 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3600_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3600_vm b/docker/dify/volumes/db/data/pgdata/base/5/3600_vm new file mode 100644 index 00000000..b9fcd6a9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3600_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3601 b/docker/dify/volumes/db/data/pgdata/base/5/3601 new file mode 100644 index 00000000..04c846ec Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3601 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3601_fsm b/docker/dify/volumes/db/data/pgdata/base/5/3601_fsm new file mode 100644 index 00000000..7732d22b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3601_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3601_vm b/docker/dify/volumes/db/data/pgdata/base/5/3601_vm new file mode 100644 index 00000000..3db367e2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3601_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3602 b/docker/dify/volumes/db/data/pgdata/base/5/3602 new file mode 100644 index 00000000..265567f1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3602 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3602_fsm b/docker/dify/volumes/db/data/pgdata/base/5/3602_fsm new file mode 100644 index 00000000..d7897de2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3602_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3602_vm b/docker/dify/volumes/db/data/pgdata/base/5/3602_vm new file mode 100644 index 00000000..9b4d7923 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3602_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3603 b/docker/dify/volumes/db/data/pgdata/base/5/3603 new file mode 100644 index 00000000..1b0d6cf3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3603 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3603_fsm b/docker/dify/volumes/db/data/pgdata/base/5/3603_fsm new file mode 100644 index 00000000..c28dd4fa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3603_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3603_vm b/docker/dify/volumes/db/data/pgdata/base/5/3603_vm new file mode 100644 index 00000000..102cff1b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3603_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3604 b/docker/dify/volumes/db/data/pgdata/base/5/3604 new file mode 100644 index 00000000..5aad5993 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3604 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3605 b/docker/dify/volumes/db/data/pgdata/base/5/3605 new file mode 100644 index 00000000..9f8d1fe7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3605 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3606 b/docker/dify/volumes/db/data/pgdata/base/5/3606 new file mode 100644 index 00000000..abe7a1cf Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3606 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3607 b/docker/dify/volumes/db/data/pgdata/base/5/3607 new file mode 100644 index 00000000..e3a3bbc6 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3607 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3608 b/docker/dify/volumes/db/data/pgdata/base/5/3608 new file mode 100644 index 00000000..88266dac Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3608 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3609 b/docker/dify/volumes/db/data/pgdata/base/5/3609 new file mode 100644 index 00000000..5ff24567 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3609 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3712 b/docker/dify/volumes/db/data/pgdata/base/5/3712 new file mode 100644 index 00000000..aa23ee97 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3712 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3764 b/docker/dify/volumes/db/data/pgdata/base/5/3764 new file mode 100644 index 00000000..1c794036 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3764 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3764_fsm b/docker/dify/volumes/db/data/pgdata/base/5/3764_fsm new file mode 100644 index 00000000..f64db4df Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3764_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3764_vm b/docker/dify/volumes/db/data/pgdata/base/5/3764_vm new file mode 100644 index 00000000..d7118cad Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3764_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3766 b/docker/dify/volumes/db/data/pgdata/base/5/3766 new file mode 100644 index 00000000..c4134620 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3766 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3767 b/docker/dify/volumes/db/data/pgdata/base/5/3767 new file mode 100644 index 00000000..6cbae02d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3767 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/3997 b/docker/dify/volumes/db/data/pgdata/base/5/3997 new file mode 100644 index 00000000..8969d818 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/3997 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4143 b/docker/dify/volumes/db/data/pgdata/base/5/4143 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4144 b/docker/dify/volumes/db/data/pgdata/base/5/4144 new file mode 100644 index 00000000..5188a14b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4144 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4145 b/docker/dify/volumes/db/data/pgdata/base/5/4145 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4146 b/docker/dify/volumes/db/data/pgdata/base/5/4146 new file mode 100644 index 00000000..957732fc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4146 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4147 b/docker/dify/volumes/db/data/pgdata/base/5/4147 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4148 b/docker/dify/volumes/db/data/pgdata/base/5/4148 new file mode 100644 index 00000000..9c7057c3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4148 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4149 b/docker/dify/volumes/db/data/pgdata/base/5/4149 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4150 b/docker/dify/volumes/db/data/pgdata/base/5/4150 new file mode 100644 index 00000000..390d428a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4150 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4151 b/docker/dify/volumes/db/data/pgdata/base/5/4151 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4152 b/docker/dify/volumes/db/data/pgdata/base/5/4152 new file mode 100644 index 00000000..1a289fd8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4152 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4153 b/docker/dify/volumes/db/data/pgdata/base/5/4153 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4154 b/docker/dify/volumes/db/data/pgdata/base/5/4154 new file mode 100644 index 00000000..d0d1ca59 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4154 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4155 b/docker/dify/volumes/db/data/pgdata/base/5/4155 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4156 b/docker/dify/volumes/db/data/pgdata/base/5/4156 new file mode 100644 index 00000000..5b4bf370 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4156 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4157 b/docker/dify/volumes/db/data/pgdata/base/5/4157 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4158 b/docker/dify/volumes/db/data/pgdata/base/5/4158 new file mode 100644 index 00000000..937d3d28 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4158 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4159 b/docker/dify/volumes/db/data/pgdata/base/5/4159 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4160 b/docker/dify/volumes/db/data/pgdata/base/5/4160 new file mode 100644 index 00000000..d10cfd60 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4160 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4163 b/docker/dify/volumes/db/data/pgdata/base/5/4163 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4164 b/docker/dify/volumes/db/data/pgdata/base/5/4164 new file mode 100644 index 00000000..a94c963f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4164 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4165 b/docker/dify/volumes/db/data/pgdata/base/5/4165 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4166 b/docker/dify/volumes/db/data/pgdata/base/5/4166 new file mode 100644 index 00000000..2229586f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4166 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4167 b/docker/dify/volumes/db/data/pgdata/base/5/4167 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4168 b/docker/dify/volumes/db/data/pgdata/base/5/4168 new file mode 100644 index 00000000..472740b9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4168 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4169 b/docker/dify/volumes/db/data/pgdata/base/5/4169 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4170 b/docker/dify/volumes/db/data/pgdata/base/5/4170 new file mode 100644 index 00000000..88d09b3d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4170 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4171 b/docker/dify/volumes/db/data/pgdata/base/5/4171 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4172 b/docker/dify/volumes/db/data/pgdata/base/5/4172 new file mode 100644 index 00000000..3eed1ee2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4172 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4173 b/docker/dify/volumes/db/data/pgdata/base/5/4173 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/4174 b/docker/dify/volumes/db/data/pgdata/base/5/4174 new file mode 100644 index 00000000..a0819a24 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/4174 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/5002 b/docker/dify/volumes/db/data/pgdata/base/5/5002 new file mode 100644 index 00000000..aefa40dd Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/5002 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/548 b/docker/dify/volumes/db/data/pgdata/base/5/548 new file mode 100644 index 00000000..7c6567d5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/548 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/549 b/docker/dify/volumes/db/data/pgdata/base/5/549 new file mode 100644 index 00000000..26a3887d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/549 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6102 b/docker/dify/volumes/db/data/pgdata/base/5/6102 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6104 b/docker/dify/volumes/db/data/pgdata/base/5/6104 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6106 b/docker/dify/volumes/db/data/pgdata/base/5/6106 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6110 b/docker/dify/volumes/db/data/pgdata/base/5/6110 new file mode 100644 index 00000000..42e19200 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/6110 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6111 b/docker/dify/volumes/db/data/pgdata/base/5/6111 new file mode 100644 index 00000000..d012727d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/6111 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6112 b/docker/dify/volumes/db/data/pgdata/base/5/6112 new file mode 100644 index 00000000..293367c2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/6112 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6113 b/docker/dify/volumes/db/data/pgdata/base/5/6113 new file mode 100644 index 00000000..542f8faa Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/6113 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6116 b/docker/dify/volumes/db/data/pgdata/base/5/6116 new file mode 100644 index 00000000..787d5d18 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/6116 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6117 b/docker/dify/volumes/db/data/pgdata/base/5/6117 new file mode 100644 index 00000000..2b5656b2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/6117 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6175 b/docker/dify/volumes/db/data/pgdata/base/5/6175 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6176 b/docker/dify/volumes/db/data/pgdata/base/5/6176 new file mode 100644 index 00000000..bfd14df5 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/6176 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6228 b/docker/dify/volumes/db/data/pgdata/base/5/6228 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6229 b/docker/dify/volumes/db/data/pgdata/base/5/6229 new file mode 100644 index 00000000..5d03213f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/6229 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6237 b/docker/dify/volumes/db/data/pgdata/base/5/6237 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6238 b/docker/dify/volumes/db/data/pgdata/base/5/6238 new file mode 100644 index 00000000..e7c0e8c3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/6238 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/6239 b/docker/dify/volumes/db/data/pgdata/base/5/6239 new file mode 100644 index 00000000..6c60b507 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/6239 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/826 b/docker/dify/volumes/db/data/pgdata/base/5/826 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/base/5/827 b/docker/dify/volumes/db/data/pgdata/base/5/827 new file mode 100644 index 00000000..94a900ec Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/827 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/828 b/docker/dify/volumes/db/data/pgdata/base/5/828 new file mode 100644 index 00000000..ca304614 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/828 differ diff --git a/docker/dify/volumes/db/data/pgdata/base/5/PG_VERSION b/docker/dify/volumes/db/data/pgdata/base/5/PG_VERSION new file mode 100644 index 00000000..60d3b2f4 --- /dev/null +++ b/docker/dify/volumes/db/data/pgdata/base/5/PG_VERSION @@ -0,0 +1 @@ +15 diff --git a/docker/dify/volumes/db/data/pgdata/base/5/pg_filenode.map b/docker/dify/volumes/db/data/pgdata/base/5/pg_filenode.map new file mode 100644 index 00000000..193d78f3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/base/5/pg_filenode.map differ diff --git a/docker/dify/volumes/db/data/pgdata/global/1213 b/docker/dify/volumes/db/data/pgdata/global/1213 new file mode 100644 index 00000000..eec8dc3a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/1213 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/1213_fsm b/docker/dify/volumes/db/data/pgdata/global/1213_fsm new file mode 100644 index 00000000..86074bee Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/1213_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/global/1213_vm b/docker/dify/volumes/db/data/pgdata/global/1213_vm new file mode 100644 index 00000000..0127b2c2 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/1213_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/global/1214 b/docker/dify/volumes/db/data/pgdata/global/1214 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/1232 b/docker/dify/volumes/db/data/pgdata/global/1232 new file mode 100644 index 00000000..3e5cf63e Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/1232 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/1233 b/docker/dify/volumes/db/data/pgdata/global/1233 new file mode 100644 index 00000000..91d2811a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/1233 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/1260 b/docker/dify/volumes/db/data/pgdata/global/1260 new file mode 100644 index 00000000..7f3852d7 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/1260 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/1260_fsm b/docker/dify/volumes/db/data/pgdata/global/1260_fsm new file mode 100644 index 00000000..2b8ab958 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/1260_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/global/1260_vm b/docker/dify/volumes/db/data/pgdata/global/1260_vm new file mode 100644 index 00000000..04b5c973 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/1260_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/global/1261 b/docker/dify/volumes/db/data/pgdata/global/1261 new file mode 100644 index 00000000..74e84dfb Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/1261 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/1261_fsm b/docker/dify/volumes/db/data/pgdata/global/1261_fsm new file mode 100644 index 00000000..7732d22b Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/1261_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/global/1261_vm b/docker/dify/volumes/db/data/pgdata/global/1261_vm new file mode 100644 index 00000000..2cde0c13 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/1261_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/global/1262 b/docker/dify/volumes/db/data/pgdata/global/1262 new file mode 100644 index 00000000..0674dd12 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/1262 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/1262_fsm b/docker/dify/volumes/db/data/pgdata/global/1262_fsm new file mode 100644 index 00000000..479fd945 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/1262_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/global/1262_vm b/docker/dify/volumes/db/data/pgdata/global/1262_vm new file mode 100644 index 00000000..b21c9c63 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/1262_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2396 b/docker/dify/volumes/db/data/pgdata/global/2396 new file mode 100644 index 00000000..124ab82f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2396 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2396_fsm b/docker/dify/volumes/db/data/pgdata/global/2396_fsm new file mode 100644 index 00000000..7a4f24f3 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2396_fsm differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2396_vm b/docker/dify/volumes/db/data/pgdata/global/2396_vm new file mode 100644 index 00000000..d2a61698 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2396_vm differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2397 b/docker/dify/volumes/db/data/pgdata/global/2397 new file mode 100644 index 00000000..c9899db9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2397 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2671 b/docker/dify/volumes/db/data/pgdata/global/2671 new file mode 100644 index 00000000..85412098 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2671 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2672 b/docker/dify/volumes/db/data/pgdata/global/2672 new file mode 100644 index 00000000..a2b19a7a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2672 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2676 b/docker/dify/volumes/db/data/pgdata/global/2676 new file mode 100644 index 00000000..175554fc Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2676 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2677 b/docker/dify/volumes/db/data/pgdata/global/2677 new file mode 100644 index 00000000..8f085eec Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2677 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2694 b/docker/dify/volumes/db/data/pgdata/global/2694 new file mode 100644 index 00000000..cae0c8ba Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2694 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2695 b/docker/dify/volumes/db/data/pgdata/global/2695 new file mode 100644 index 00000000..54705ac4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2695 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2697 b/docker/dify/volumes/db/data/pgdata/global/2697 new file mode 100644 index 00000000..1de07c0a Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2697 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2698 b/docker/dify/volumes/db/data/pgdata/global/2698 new file mode 100644 index 00000000..a2d3b04c Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2698 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2846 b/docker/dify/volumes/db/data/pgdata/global/2846 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/2847 b/docker/dify/volumes/db/data/pgdata/global/2847 new file mode 100644 index 00000000..a7e1c4c8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2847 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2964 b/docker/dify/volumes/db/data/pgdata/global/2964 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/2965 b/docker/dify/volumes/db/data/pgdata/global/2965 new file mode 100644 index 00000000..edfba802 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2965 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/2966 b/docker/dify/volumes/db/data/pgdata/global/2966 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/2967 b/docker/dify/volumes/db/data/pgdata/global/2967 new file mode 100644 index 00000000..9f233b57 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/2967 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/3592 b/docker/dify/volumes/db/data/pgdata/global/3592 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/3593 b/docker/dify/volumes/db/data/pgdata/global/3593 new file mode 100644 index 00000000..002e585d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/3593 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/4060 b/docker/dify/volumes/db/data/pgdata/global/4060 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/4061 b/docker/dify/volumes/db/data/pgdata/global/4061 new file mode 100644 index 00000000..f8d18447 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/4061 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/4175 b/docker/dify/volumes/db/data/pgdata/global/4175 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/4176 b/docker/dify/volumes/db/data/pgdata/global/4176 new file mode 100644 index 00000000..a6db5e64 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/4176 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/4177 b/docker/dify/volumes/db/data/pgdata/global/4177 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/4178 b/docker/dify/volumes/db/data/pgdata/global/4178 new file mode 100644 index 00000000..8ab3ab33 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/4178 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/4181 b/docker/dify/volumes/db/data/pgdata/global/4181 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/4182 b/docker/dify/volumes/db/data/pgdata/global/4182 new file mode 100644 index 00000000..b619552f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/4182 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/4183 b/docker/dify/volumes/db/data/pgdata/global/4183 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/4184 b/docker/dify/volumes/db/data/pgdata/global/4184 new file mode 100644 index 00000000..37e78b95 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/4184 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/4185 b/docker/dify/volumes/db/data/pgdata/global/4185 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/4186 b/docker/dify/volumes/db/data/pgdata/global/4186 new file mode 100644 index 00000000..f988a8f8 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/4186 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/6000 b/docker/dify/volumes/db/data/pgdata/global/6000 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/6001 b/docker/dify/volumes/db/data/pgdata/global/6001 new file mode 100644 index 00000000..06b46290 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/6001 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/6002 b/docker/dify/volumes/db/data/pgdata/global/6002 new file mode 100644 index 00000000..e7ddd6b1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/6002 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/6100 b/docker/dify/volumes/db/data/pgdata/global/6100 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/6114 b/docker/dify/volumes/db/data/pgdata/global/6114 new file mode 100644 index 00000000..bf887fa4 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/6114 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/6115 b/docker/dify/volumes/db/data/pgdata/global/6115 new file mode 100644 index 00000000..afafca81 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/6115 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/6243 b/docker/dify/volumes/db/data/pgdata/global/6243 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/6244 b/docker/dify/volumes/db/data/pgdata/global/6244 new file mode 100644 index 00000000..e69de29b diff --git a/docker/dify/volumes/db/data/pgdata/global/6245 b/docker/dify/volumes/db/data/pgdata/global/6245 new file mode 100644 index 00000000..f1dfb7e9 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/6245 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/6246 b/docker/dify/volumes/db/data/pgdata/global/6246 new file mode 100644 index 00000000..084bf179 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/6246 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/6247 b/docker/dify/volumes/db/data/pgdata/global/6247 new file mode 100644 index 00000000..514ffb04 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/6247 differ diff --git a/docker/dify/volumes/db/data/pgdata/global/pg_control b/docker/dify/volumes/db/data/pgdata/global/pg_control new file mode 100644 index 00000000..9cd61ce1 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/pg_control differ diff --git a/docker/dify/volumes/db/data/pgdata/global/pg_filenode.map b/docker/dify/volumes/db/data/pgdata/global/pg_filenode.map new file mode 100644 index 00000000..e1002d59 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/pg_filenode.map differ diff --git a/docker/dify/volumes/db/data/pgdata/global/pg_internal.init b/docker/dify/volumes/db/data/pgdata/global/pg_internal.init new file mode 100644 index 00000000..2f3a5553 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/global/pg_internal.init differ diff --git a/docker/dify/volumes/db/data/pgdata/pg_hba.conf b/docker/dify/volumes/db/data/pgdata/pg_hba.conf new file mode 100644 index 00000000..4e202d3c --- /dev/null +++ b/docker/dify/volumes/db/data/pgdata/pg_hba.conf @@ -0,0 +1,100 @@ +# PostgreSQL Client Authentication Configuration File +# =================================================== +# +# Refer to the "Client Authentication" section in the PostgreSQL +# documentation for a complete description of this file. A short +# synopsis follows. +# +# This file controls: which hosts are allowed to connect, how clients +# are authenticated, which PostgreSQL user names they can use, which +# databases they can access. Records take one of these forms: +# +# local DATABASE USER METHOD [OPTIONS] +# host DATABASE USER ADDRESS METHOD [OPTIONS] +# hostssl DATABASE USER ADDRESS METHOD [OPTIONS] +# hostnossl DATABASE USER ADDRESS METHOD [OPTIONS] +# hostgssenc DATABASE USER ADDRESS METHOD [OPTIONS] +# hostnogssenc DATABASE USER ADDRESS METHOD [OPTIONS] +# +# (The uppercase items must be replaced by actual values.) +# +# The first field is the connection type: +# - "local" is a Unix-domain socket +# - "host" is a TCP/IP socket (encrypted or not) +# - "hostssl" is a TCP/IP socket that is SSL-encrypted +# - "hostnossl" is a TCP/IP socket that is not SSL-encrypted +# - "hostgssenc" is a TCP/IP socket that is GSSAPI-encrypted +# - "hostnogssenc" is a TCP/IP socket that is not GSSAPI-encrypted +# +# DATABASE can be "all", "sameuser", "samerole", "replication", a +# database name, or a comma-separated list thereof. The "all" +# keyword does not match "replication". Access to replication +# must be enabled in a separate record (see example below). +# +# USER can be "all", a user name, a group name prefixed with "+", or a +# comma-separated list thereof. In both the DATABASE and USER fields +# you can also write a file name prefixed with "@" to include names +# from a separate file. +# +# ADDRESS specifies the set of hosts the record matches. It can be a +# host name, or it is made up of an IP address and a CIDR mask that is +# an integer (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that +# specifies the number of significant bits in the mask. A host name +# that starts with a dot (.) matches a suffix of the actual host name. +# Alternatively, you can write an IP address and netmask in separate +# columns to specify the set of hosts. Instead of a CIDR-address, you +# can write "samehost" to match any of the server's own IP addresses, +# or "samenet" to match any address in any subnet that the server is +# directly connected to. +# +# METHOD can be "trust", "reject", "md5", "password", "scram-sha-256", +# "gss", "sspi", "ident", "peer", "pam", "ldap", "radius" or "cert". +# Note that "password" sends passwords in clear text; "md5" or +# "scram-sha-256" are preferred since they send encrypted passwords. +# +# OPTIONS are a set of options for the authentication in the format +# NAME=VALUE. The available options depend on the different +# authentication methods -- refer to the "Client Authentication" +# section in the documentation for a list of which options are +# available for which authentication methods. +# +# Database and user names containing spaces, commas, quotes and other +# special characters must be quoted. Quoting one of the keywords +# "all", "sameuser", "samerole" or "replication" makes the name lose +# its special character, and just match a database or username with +# that name. +# +# This file is read on server startup and when the server receives a +# SIGHUP signal. If you edit the file on a running system, you have to +# SIGHUP the server for the changes to take effect, run "pg_ctl reload", +# or execute "SELECT pg_reload_conf()". +# +# Put your actual configuration here +# ---------------------------------- +# +# If you want to allow non-local connections, you need to add more +# "host" records. In that case you will also need to make PostgreSQL +# listen on a non-local interface via the listen_addresses +# configuration parameter, or via the -i or -h command line switches. + +# CAUTION: Configuring the system for local "trust" authentication +# allows any local user to connect as any PostgreSQL user, including +# the database superuser. If you do not trust all your local users, +# use another authentication method. + + +# TYPE DATABASE USER ADDRESS METHOD + +# "local" is for Unix domain socket connections only +local all all trust +# IPv4 local connections: +host all all 127.0.0.1/32 trust +# IPv6 local connections: +host all all ::1/128 trust +# Allow replication connections from localhost, by a user with the +# replication privilege. +local replication all trust +host replication all 127.0.0.1/32 trust +host replication all ::1/128 trust + +host all all all scram-sha-256 diff --git a/docker/dify/volumes/db/data/pgdata/pg_ident.conf b/docker/dify/volumes/db/data/pgdata/pg_ident.conf new file mode 100644 index 00000000..a5870e64 --- /dev/null +++ b/docker/dify/volumes/db/data/pgdata/pg_ident.conf @@ -0,0 +1,42 @@ +# PostgreSQL User Name Maps +# ========================= +# +# Refer to the PostgreSQL documentation, chapter "Client +# Authentication" for a complete description. A short synopsis +# follows. +# +# This file controls PostgreSQL user name mapping. It maps external +# user names to their corresponding PostgreSQL user names. Records +# are of the form: +# +# MAPNAME SYSTEM-USERNAME PG-USERNAME +# +# (The uppercase quantities must be replaced by actual values.) +# +# MAPNAME is the (otherwise freely chosen) map name that was used in +# pg_hba.conf. SYSTEM-USERNAME is the detected user name of the +# client. PG-USERNAME is the requested PostgreSQL user name. The +# existence of a record specifies that SYSTEM-USERNAME may connect as +# PG-USERNAME. +# +# If SYSTEM-USERNAME starts with a slash (/), it will be treated as a +# regular expression. Optionally this can contain a capture (a +# parenthesized subexpression). The substring matching the capture +# will be substituted for \1 (backslash-one) if present in +# PG-USERNAME. +# +# Multiple maps may be specified in this file and used by pg_hba.conf. +# +# No map names are defined in the default configuration. If all +# system user names and PostgreSQL user names are the same, you don't +# need anything in this file. +# +# This file is read on server startup and when the postmaster receives +# a SIGHUP signal. If you edit the file on a running system, you have +# to SIGHUP the postmaster for the changes to take effect. You can +# use "pg_ctl reload" to do that. + +# Put your actual configuration here +# ---------------------------------- + +# MAPNAME SYSTEM-USERNAME PG-USERNAME diff --git a/docker/dify/volumes/db/data/pgdata/pg_logical/replorigin_checkpoint b/docker/dify/volumes/db/data/pgdata/pg_logical/replorigin_checkpoint new file mode 100644 index 00000000..ec451b0f Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/pg_logical/replorigin_checkpoint differ diff --git a/docker/dify/volumes/db/data/pgdata/pg_multixact/members/0000 b/docker/dify/volumes/db/data/pgdata/pg_multixact/members/0000 new file mode 100644 index 00000000..6d17cf9d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/pg_multixact/members/0000 differ diff --git a/docker/dify/volumes/db/data/pgdata/pg_multixact/offsets/0000 b/docker/dify/volumes/db/data/pgdata/pg_multixact/offsets/0000 new file mode 100644 index 00000000..6d17cf9d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/pg_multixact/offsets/0000 differ diff --git a/docker/dify/volumes/db/data/pgdata/pg_subtrans/0000 b/docker/dify/volumes/db/data/pgdata/pg_subtrans/0000 new file mode 100644 index 00000000..6d17cf9d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/pg_subtrans/0000 differ diff --git a/docker/dify/volumes/db/data/pgdata/pg_wal/000000010000000000000002 b/docker/dify/volumes/db/data/pgdata/pg_wal/000000010000000000000002 new file mode 100644 index 00000000..1e9fca90 Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/pg_wal/000000010000000000000002 differ diff --git a/docker/dify/volumes/db/data/pgdata/pg_wal/000000010000000000000003 b/docker/dify/volumes/db/data/pgdata/pg_wal/000000010000000000000003 new file mode 100644 index 00000000..d6c56d8d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/pg_wal/000000010000000000000003 differ diff --git a/docker/dify/volumes/db/data/pgdata/pg_xact/0000 b/docker/dify/volumes/db/data/pgdata/pg_xact/0000 new file mode 100644 index 00000000..31e9f41d Binary files /dev/null and b/docker/dify/volumes/db/data/pgdata/pg_xact/0000 differ diff --git a/docker/dify/volumes/db/data/pgdata/postgresql.auto.conf b/docker/dify/volumes/db/data/pgdata/postgresql.auto.conf new file mode 100644 index 00000000..af7125e1 --- /dev/null +++ b/docker/dify/volumes/db/data/pgdata/postgresql.auto.conf @@ -0,0 +1,2 @@ +# Do not edit this file manually! +# It will be overwritten by the ALTER SYSTEM command. diff --git a/docker/dify/volumes/db/data/pgdata/postgresql.conf b/docker/dify/volumes/db/data/pgdata/postgresql.conf new file mode 100644 index 00000000..0e6341df --- /dev/null +++ b/docker/dify/volumes/db/data/pgdata/postgresql.conf @@ -0,0 +1,813 @@ +# ----------------------------- +# PostgreSQL configuration file +# ----------------------------- +# +# This file consists of lines of the form: +# +# name = value +# +# (The "=" is optional.) Whitespace may be used. Comments are introduced with +# "#" anywhere on a line. The complete list of parameter names and allowed +# values can be found in the PostgreSQL documentation. +# +# The commented-out settings shown in this file represent the default values. +# Re-commenting a setting is NOT sufficient to revert it to the default value; +# you need to reload the server. +# +# This file is read on server startup and when the server receives a SIGHUP +# signal. If you edit the file on a running system, you have to SIGHUP the +# server for the changes to take effect, run "pg_ctl reload", or execute +# "SELECT pg_reload_conf()". Some parameters, which are marked below, +# require a server shutdown and restart to take effect. +# +# Any parameter can also be given as a command-line option to the server, e.g., +# "postgres -c log_connections=on". Some parameters can be changed at run time +# with the "SET" SQL command. +# +# Memory units: B = bytes Time units: us = microseconds +# kB = kilobytes ms = milliseconds +# MB = megabytes s = seconds +# GB = gigabytes min = minutes +# TB = terabytes h = hours +# d = days + + +#------------------------------------------------------------------------------ +# FILE LOCATIONS +#------------------------------------------------------------------------------ + +# The default values of these variables are driven from the -D command-line +# option or PGDATA environment variable, represented here as ConfigDir. + +#data_directory = 'ConfigDir' # use data in another directory + # (change requires restart) +#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file + # (change requires restart) +#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file + # (change requires restart) + +# If external_pid_file is not explicitly set, no extra PID file is written. +#external_pid_file = '' # write an extra PID file + # (change requires restart) + + +#------------------------------------------------------------------------------ +# CONNECTIONS AND AUTHENTICATION +#------------------------------------------------------------------------------ + +# - Connection Settings - + +listen_addresses = '*' + # comma-separated list of addresses; + # defaults to 'localhost'; use '*' for all + # (change requires restart) +#port = 5432 # (change requires restart) +max_connections = 100 # (change requires restart) +#superuser_reserved_connections = 3 # (change requires restart) +#unix_socket_directories = '/var/run/postgresql' # comma-separated list of directories + # (change requires restart) +#unix_socket_group = '' # (change requires restart) +#unix_socket_permissions = 0777 # begin with 0 to use octal notation + # (change requires restart) +#bonjour = off # advertise server via Bonjour + # (change requires restart) +#bonjour_name = '' # defaults to the computer name + # (change requires restart) + +# - TCP settings - +# see "man tcp" for details + +#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; + # 0 selects the system default +#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; + # 0 selects the system default +#tcp_keepalives_count = 0 # TCP_KEEPCNT; + # 0 selects the system default +#tcp_user_timeout = 0 # TCP_USER_TIMEOUT, in milliseconds; + # 0 selects the system default + +#client_connection_check_interval = 0 # time between checks for client + # disconnection while running queries; + # 0 for never + +# - Authentication - + +#authentication_timeout = 1min # 1s-600s +#password_encryption = scram-sha-256 # scram-sha-256 or md5 +#db_user_namespace = off + +# GSSAPI using Kerberos +#krb_server_keyfile = 'FILE:${sysconfdir}/krb5.keytab' +#krb_caseins_users = off + +# - SSL - + +#ssl = off +#ssl_ca_file = '' +#ssl_cert_file = 'server.crt' +#ssl_crl_file = '' +#ssl_crl_dir = '' +#ssl_key_file = 'server.key' +#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers +#ssl_prefer_server_ciphers = on +#ssl_ecdh_curve = 'prime256v1' +#ssl_min_protocol_version = 'TLSv1.2' +#ssl_max_protocol_version = '' +#ssl_dh_params_file = '' +#ssl_passphrase_command = '' +#ssl_passphrase_command_supports_reload = off + + +#------------------------------------------------------------------------------ +# RESOURCE USAGE (except WAL) +#------------------------------------------------------------------------------ + +# - Memory - + +shared_buffers = 128MB # min 128kB + # (change requires restart) +#huge_pages = try # on, off, or try + # (change requires restart) +#huge_page_size = 0 # zero for system default + # (change requires restart) +#temp_buffers = 8MB # min 800kB +#max_prepared_transactions = 0 # zero disables the feature + # (change requires restart) +# Caution: it is not advisable to set max_prepared_transactions nonzero unless +# you actively intend to use prepared transactions. +#work_mem = 4MB # min 64kB +#hash_mem_multiplier = 2.0 # 1-1000.0 multiplier on hash table work_mem +#maintenance_work_mem = 64MB # min 1MB +#autovacuum_work_mem = -1 # min 1MB, or -1 to use maintenance_work_mem +#logical_decoding_work_mem = 64MB # min 64kB +#max_stack_depth = 2MB # min 100kB +#shared_memory_type = mmap # the default is the first option + # supported by the operating system: + # mmap + # sysv + # windows + # (change requires restart) +dynamic_shared_memory_type = posix # the default is usually the first option + # supported by the operating system: + # posix + # sysv + # windows + # mmap + # (change requires restart) +#min_dynamic_shared_memory = 0MB # (change requires restart) + +# - Disk - + +#temp_file_limit = -1 # limits per-process temp file space + # in kilobytes, or -1 for no limit + +# - Kernel Resources - + +#max_files_per_process = 1000 # min 64 + # (change requires restart) + +# - Cost-Based Vacuum Delay - + +#vacuum_cost_delay = 0 # 0-100 milliseconds (0 disables) +#vacuum_cost_page_hit = 1 # 0-10000 credits +#vacuum_cost_page_miss = 2 # 0-10000 credits +#vacuum_cost_page_dirty = 20 # 0-10000 credits +#vacuum_cost_limit = 200 # 1-10000 credits + +# - Background Writer - + +#bgwriter_delay = 200ms # 10-10000ms between rounds +#bgwriter_lru_maxpages = 100 # max buffers written/round, 0 disables +#bgwriter_lru_multiplier = 2.0 # 0-10.0 multiplier on buffers scanned/round +#bgwriter_flush_after = 512kB # measured in pages, 0 disables + +# - Asynchronous Behavior - + +#backend_flush_after = 0 # measured in pages, 0 disables +#effective_io_concurrency = 1 # 1-1000; 0 disables prefetching +#maintenance_io_concurrency = 10 # 1-1000; 0 disables prefetching +#max_worker_processes = 8 # (change requires restart) +#max_parallel_workers_per_gather = 2 # limited by max_parallel_workers +#max_parallel_maintenance_workers = 2 # limited by max_parallel_workers +#max_parallel_workers = 8 # number of max_worker_processes that + # can be used in parallel operations +#parallel_leader_participation = on +#old_snapshot_threshold = -1 # 1min-60d; -1 disables; 0 is immediate + # (change requires restart) + + +#------------------------------------------------------------------------------ +# WRITE-AHEAD LOG +#------------------------------------------------------------------------------ + +# - Settings - + +#wal_level = replica # minimal, replica, or logical + # (change requires restart) +#fsync = on # flush data to disk for crash safety + # (turning this off can cause + # unrecoverable data corruption) +#synchronous_commit = on # synchronization level; + # off, local, remote_write, remote_apply, or on +#wal_sync_method = fsync # the default is the first option + # supported by the operating system: + # open_datasync + # fdatasync (default on Linux and FreeBSD) + # fsync + # fsync_writethrough + # open_sync +#full_page_writes = on # recover from partial page writes +#wal_log_hints = off # also do full page writes of non-critical updates + # (change requires restart) +#wal_compression = off # enables compression of full-page writes; + # off, pglz, lz4, zstd, or on +#wal_init_zero = on # zero-fill new WAL files +#wal_recycle = on # recycle WAL files +#wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers + # (change requires restart) +#wal_writer_delay = 200ms # 1-10000 milliseconds +#wal_writer_flush_after = 1MB # measured in pages, 0 disables +#wal_skip_threshold = 2MB + +#commit_delay = 0 # range 0-100000, in microseconds +#commit_siblings = 5 # range 1-1000 + +# - Checkpoints - + +#checkpoint_timeout = 5min # range 30s-1d +#checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0 +#checkpoint_flush_after = 256kB # measured in pages, 0 disables +#checkpoint_warning = 30s # 0 disables +max_wal_size = 1GB +min_wal_size = 80MB + +# - Prefetching during recovery - + +#recovery_prefetch = try # prefetch pages referenced in the WAL? +#wal_decode_buffer_size = 512kB # lookahead window used for prefetching + # (change requires restart) + +# - Archiving - + +#archive_mode = off # enables archiving; off, on, or always + # (change requires restart) +#archive_library = '' # library to use to archive a logfile segment + # (empty string indicates archive_command should + # be used) +#archive_command = '' # command to use to archive a logfile segment + # placeholders: %p = path of file to archive + # %f = file name only + # e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f' +#archive_timeout = 0 # force a logfile segment switch after this + # number of seconds; 0 disables + +# - Archive Recovery - + +# These are only used in recovery mode. + +#restore_command = '' # command to use to restore an archived logfile segment + # placeholders: %p = path of file to restore + # %f = file name only + # e.g. 'cp /mnt/server/archivedir/%f %p' +#archive_cleanup_command = '' # command to execute at every restartpoint +#recovery_end_command = '' # command to execute at completion of recovery + +# - Recovery Target - + +# Set these only when performing a targeted recovery. + +#recovery_target = '' # 'immediate' to end recovery as soon as a + # consistent state is reached + # (change requires restart) +#recovery_target_name = '' # the named restore point to which recovery will proceed + # (change requires restart) +#recovery_target_time = '' # the time stamp up to which recovery will proceed + # (change requires restart) +#recovery_target_xid = '' # the transaction ID up to which recovery will proceed + # (change requires restart) +#recovery_target_lsn = '' # the WAL LSN up to which recovery will proceed + # (change requires restart) +#recovery_target_inclusive = on # Specifies whether to stop: + # just after the specified recovery target (on) + # just before the recovery target (off) + # (change requires restart) +#recovery_target_timeline = 'latest' # 'current', 'latest', or timeline ID + # (change requires restart) +#recovery_target_action = 'pause' # 'pause', 'promote', 'shutdown' + # (change requires restart) + + +#------------------------------------------------------------------------------ +# REPLICATION +#------------------------------------------------------------------------------ + +# - Sending Servers - + +# Set these on the primary and on any standby that will send replication data. + +#max_wal_senders = 10 # max number of walsender processes + # (change requires restart) +#max_replication_slots = 10 # max number of replication slots + # (change requires restart) +#wal_keep_size = 0 # in megabytes; 0 disables +#max_slot_wal_keep_size = -1 # in megabytes; -1 disables +#wal_sender_timeout = 60s # in milliseconds; 0 disables +#track_commit_timestamp = off # collect timestamp of transaction commit + # (change requires restart) + +# - Primary Server - + +# These settings are ignored on a standby server. + +#synchronous_standby_names = '' # standby servers that provide sync rep + # method to choose sync standbys, number of sync standbys, + # and comma-separated list of application_name + # from standby(s); '*' = all +#vacuum_defer_cleanup_age = 0 # number of xacts by which cleanup is delayed + +# - Standby Servers - + +# These settings are ignored on a primary server. + +#primary_conninfo = '' # connection string to sending server +#primary_slot_name = '' # replication slot on sending server +#promote_trigger_file = '' # file name whose presence ends recovery +#hot_standby = on # "off" disallows queries during recovery + # (change requires restart) +#max_standby_archive_delay = 30s # max delay before canceling queries + # when reading WAL from archive; + # -1 allows indefinite delay +#max_standby_streaming_delay = 30s # max delay before canceling queries + # when reading streaming WAL; + # -1 allows indefinite delay +#wal_receiver_create_temp_slot = off # create temp slot if primary_slot_name + # is not set +#wal_receiver_status_interval = 10s # send replies at least this often + # 0 disables +#hot_standby_feedback = off # send info from standby to prevent + # query conflicts +#wal_receiver_timeout = 60s # time that receiver waits for + # communication from primary + # in milliseconds; 0 disables +#wal_retrieve_retry_interval = 5s # time to wait before retrying to + # retrieve WAL after a failed attempt +#recovery_min_apply_delay = 0 # minimum delay for applying changes during recovery + +# - Subscribers - + +# These settings are ignored on a publisher. + +#max_logical_replication_workers = 4 # taken from max_worker_processes + # (change requires restart) +#max_sync_workers_per_subscription = 2 # taken from max_logical_replication_workers + + +#------------------------------------------------------------------------------ +# QUERY TUNING +#------------------------------------------------------------------------------ + +# - Planner Method Configuration - + +#enable_async_append = on +#enable_bitmapscan = on +#enable_gathermerge = on +#enable_hashagg = on +#enable_hashjoin = on +#enable_incremental_sort = on +#enable_indexscan = on +#enable_indexonlyscan = on +#enable_material = on +#enable_memoize = on +#enable_mergejoin = on +#enable_nestloop = on +#enable_parallel_append = on +#enable_parallel_hash = on +#enable_partition_pruning = on +#enable_partitionwise_join = off +#enable_partitionwise_aggregate = off +#enable_seqscan = on +#enable_sort = on +#enable_tidscan = on + +# - Planner Cost Constants - + +#seq_page_cost = 1.0 # measured on an arbitrary scale +#random_page_cost = 4.0 # same scale as above +#cpu_tuple_cost = 0.01 # same scale as above +#cpu_index_tuple_cost = 0.005 # same scale as above +#cpu_operator_cost = 0.0025 # same scale as above +#parallel_setup_cost = 1000.0 # same scale as above +#parallel_tuple_cost = 0.1 # same scale as above +#min_parallel_table_scan_size = 8MB +#min_parallel_index_scan_size = 512kB +#effective_cache_size = 4GB + +#jit_above_cost = 100000 # perform JIT compilation if available + # and query more expensive than this; + # -1 disables +#jit_inline_above_cost = 500000 # inline small functions if query is + # more expensive than this; -1 disables +#jit_optimize_above_cost = 500000 # use expensive JIT optimizations if + # query is more expensive than this; + # -1 disables + +# - Genetic Query Optimizer - + +#geqo = on +#geqo_threshold = 12 +#geqo_effort = 5 # range 1-10 +#geqo_pool_size = 0 # selects default based on effort +#geqo_generations = 0 # selects default based on effort +#geqo_selection_bias = 2.0 # range 1.5-2.0 +#geqo_seed = 0.0 # range 0.0-1.0 + +# - Other Planner Options - + +#default_statistics_target = 100 # range 1-10000 +#constraint_exclusion = partition # on, off, or partition +#cursor_tuple_fraction = 0.1 # range 0.0-1.0 +#from_collapse_limit = 8 +#jit = on # allow JIT compilation +#join_collapse_limit = 8 # 1 disables collapsing of explicit + # JOIN clauses +#plan_cache_mode = auto # auto, force_generic_plan or + # force_custom_plan +#recursive_worktable_factor = 10.0 # range 0.001-1000000 + + +#------------------------------------------------------------------------------ +# REPORTING AND LOGGING +#------------------------------------------------------------------------------ + +# - Where to Log - + +#log_destination = 'stderr' # Valid values are combinations of + # stderr, csvlog, jsonlog, syslog, and + # eventlog, depending on platform. + # csvlog and jsonlog require + # logging_collector to be on. + +# This is used when logging to stderr: +#logging_collector = off # Enable capturing of stderr, jsonlog, + # and csvlog into log files. Required + # to be on for csvlogs and jsonlogs. + # (change requires restart) + +# These are only used if logging_collector is on: +#log_directory = 'log' # directory where log files are written, + # can be absolute or relative to PGDATA +#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern, + # can include strftime() escapes +#log_file_mode = 0600 # creation mode for log files, + # begin with 0 to use octal notation +#log_rotation_age = 1d # Automatic rotation of logfiles will + # happen after that time. 0 disables. +#log_rotation_size = 10MB # Automatic rotation of logfiles will + # happen after that much log output. + # 0 disables. +#log_truncate_on_rotation = off # If on, an existing log file with the + # same name as the new log file will be + # truncated rather than appended to. + # But such truncation only occurs on + # time-driven rotation, not on restarts + # or size-driven rotation. Default is + # off, meaning append to existing files + # in all cases. + +# These are relevant when logging to syslog: +#syslog_facility = 'LOCAL0' +#syslog_ident = 'postgres' +#syslog_sequence_numbers = on +#syslog_split_messages = on + +# This is only relevant when logging to eventlog (Windows): +# (change requires restart) +#event_source = 'PostgreSQL' + +# - When to Log - + +#log_min_messages = warning # values in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # info + # notice + # warning + # error + # log + # fatal + # panic + +#log_min_error_statement = error # values in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # info + # notice + # warning + # error + # log + # fatal + # panic (effectively off) + +#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements + # and their durations, > 0 logs only + # statements running at least this number + # of milliseconds + +#log_min_duration_sample = -1 # -1 is disabled, 0 logs a sample of statements + # and their durations, > 0 logs only a sample of + # statements running at least this number + # of milliseconds; + # sample fraction is determined by log_statement_sample_rate + +#log_statement_sample_rate = 1.0 # fraction of logged statements exceeding + # log_min_duration_sample to be logged; + # 1.0 logs all such statements, 0.0 never logs + + +#log_transaction_sample_rate = 0.0 # fraction of transactions whose statements + # are logged regardless of their duration; 1.0 logs all + # statements from all transactions, 0.0 never logs + +#log_startup_progress_interval = 10s # Time between progress updates for + # long-running startup operations. + # 0 disables the feature, > 0 indicates + # the interval in milliseconds. + +# - What to Log - + +#debug_print_parse = off +#debug_print_rewritten = off +#debug_print_plan = off +#debug_pretty_print = on +#log_autovacuum_min_duration = 10min # log autovacuum activity; + # -1 disables, 0 logs all actions and + # their durations, > 0 logs only + # actions running at least this number + # of milliseconds. +#log_checkpoints = on +#log_connections = off +#log_disconnections = off +#log_duration = off +#log_error_verbosity = default # terse, default, or verbose messages +#log_hostname = off +#log_line_prefix = '%m [%p] ' # special values: + # %a = application name + # %u = user name + # %d = database name + # %r = remote host and port + # %h = remote host + # %b = backend type + # %p = process ID + # %P = process ID of parallel group leader + # %t = timestamp without milliseconds + # %m = timestamp with milliseconds + # %n = timestamp with milliseconds (as a Unix epoch) + # %Q = query ID (0 if none or not computed) + # %i = command tag + # %e = SQL state + # %c = session ID + # %l = session line number + # %s = session start timestamp + # %v = virtual transaction ID + # %x = transaction ID (0 if none) + # %q = stop here in non-session + # processes + # %% = '%' + # e.g. '<%u%%%d> ' +#log_lock_waits = off # log lock waits >= deadlock_timeout +#log_recovery_conflict_waits = off # log standby recovery conflict waits + # >= deadlock_timeout +#log_parameter_max_length = -1 # when logging statements, limit logged + # bind-parameter values to N bytes; + # -1 means print in full, 0 disables +#log_parameter_max_length_on_error = 0 # when logging an error, limit logged + # bind-parameter values to N bytes; + # -1 means print in full, 0 disables +#log_statement = 'none' # none, ddl, mod, all +#log_replication_commands = off +#log_temp_files = -1 # log temporary files equal or larger + # than the specified size in kilobytes; + # -1 disables, 0 logs all temp files +log_timezone = 'UTC' + + +#------------------------------------------------------------------------------ +# PROCESS TITLE +#------------------------------------------------------------------------------ + +#cluster_name = '' # added to process titles if nonempty + # (change requires restart) +#update_process_title = on + + +#------------------------------------------------------------------------------ +# STATISTICS +#------------------------------------------------------------------------------ + +# - Cumulative Query and Index Statistics - + +#track_activities = on +#track_activity_query_size = 1024 # (change requires restart) +#track_counts = on +#track_io_timing = off +#track_wal_io_timing = off +#track_functions = none # none, pl, all +#stats_fetch_consistency = cache + + +# - Monitoring - + +#compute_query_id = auto +#log_statement_stats = off +#log_parser_stats = off +#log_planner_stats = off +#log_executor_stats = off + + +#------------------------------------------------------------------------------ +# AUTOVACUUM +#------------------------------------------------------------------------------ + +#autovacuum = on # Enable autovacuum subprocess? 'on' + # requires track_counts to also be on. +#autovacuum_max_workers = 3 # max number of autovacuum subprocesses + # (change requires restart) +#autovacuum_naptime = 1min # time between autovacuum runs +#autovacuum_vacuum_threshold = 50 # min number of row updates before + # vacuum +#autovacuum_vacuum_insert_threshold = 1000 # min number of row inserts + # before vacuum; -1 disables insert + # vacuums +#autovacuum_analyze_threshold = 50 # min number of row updates before + # analyze +#autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum +#autovacuum_vacuum_insert_scale_factor = 0.2 # fraction of inserts over table + # size before insert vacuum +#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze +#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum + # (change requires restart) +#autovacuum_multixact_freeze_max_age = 400000000 # maximum multixact age + # before forced vacuum + # (change requires restart) +#autovacuum_vacuum_cost_delay = 2ms # default vacuum cost delay for + # autovacuum, in milliseconds; + # -1 means use vacuum_cost_delay +#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for + # autovacuum, -1 means use + # vacuum_cost_limit + + +#------------------------------------------------------------------------------ +# CLIENT CONNECTION DEFAULTS +#------------------------------------------------------------------------------ + +# - Statement Behavior - + +#client_min_messages = notice # values in order of decreasing detail: + # debug5 + # debug4 + # debug3 + # debug2 + # debug1 + # log + # notice + # warning + # error +#search_path = '"$user", public' # schema names +#row_security = on +#default_table_access_method = 'heap' +#default_tablespace = '' # a tablespace name, '' uses the default +#default_toast_compression = 'pglz' # 'pglz' or 'lz4' +#temp_tablespaces = '' # a list of tablespace names, '' uses + # only default tablespace +#check_function_bodies = on +#default_transaction_isolation = 'read committed' +#default_transaction_read_only = off +#default_transaction_deferrable = off +#session_replication_role = 'origin' +#statement_timeout = 0 # in milliseconds, 0 is disabled +#lock_timeout = 0 # in milliseconds, 0 is disabled +#idle_in_transaction_session_timeout = 0 # in milliseconds, 0 is disabled +#idle_session_timeout = 0 # in milliseconds, 0 is disabled +#vacuum_freeze_table_age = 150000000 +#vacuum_freeze_min_age = 50000000 +#vacuum_failsafe_age = 1600000000 +#vacuum_multixact_freeze_table_age = 150000000 +#vacuum_multixact_freeze_min_age = 5000000 +#vacuum_multixact_failsafe_age = 1600000000 +#bytea_output = 'hex' # hex, escape +#xmlbinary = 'base64' +#xmloption = 'content' +#gin_pending_list_limit = 4MB + +# - Locale and Formatting - + +datestyle = 'iso, mdy' +#intervalstyle = 'postgres' +timezone = 'UTC' +#timezone_abbreviations = 'Default' # Select the set of available time zone + # abbreviations. Currently, there are + # Default + # Australia (historical usage) + # India + # You can create your own file in + # share/timezonesets/. +#extra_float_digits = 1 # min -15, max 3; any value >0 actually + # selects precise output mode +#client_encoding = sql_ascii # actually, defaults to database + # encoding + +# These settings are initialized by initdb, but they can be changed. +lc_messages = 'en_US.utf8' # locale for system error message + # strings +lc_monetary = 'en_US.utf8' # locale for monetary formatting +lc_numeric = 'en_US.utf8' # locale for number formatting +lc_time = 'en_US.utf8' # locale for time formatting + +# default configuration for text search +default_text_search_config = 'pg_catalog.english' + +# - Shared Library Preloading - + +#local_preload_libraries = '' +#session_preload_libraries = '' +#shared_preload_libraries = '' # (change requires restart) +#jit_provider = 'llvmjit' # JIT library to use + +# - Other Defaults - + +#dynamic_library_path = '$libdir' +#gin_fuzzy_search_limit = 0 + + +#------------------------------------------------------------------------------ +# LOCK MANAGEMENT +#------------------------------------------------------------------------------ + +#deadlock_timeout = 1s +#max_locks_per_transaction = 64 # min 10 + # (change requires restart) +#max_pred_locks_per_transaction = 64 # min 10 + # (change requires restart) +#max_pred_locks_per_relation = -2 # negative values mean + # (max_pred_locks_per_transaction + # / -max_pred_locks_per_relation) - 1 +#max_pred_locks_per_page = 2 # min 0 + + +#------------------------------------------------------------------------------ +# VERSION AND PLATFORM COMPATIBILITY +#------------------------------------------------------------------------------ + +# - Previous PostgreSQL Versions - + +#array_nulls = on +#backslash_quote = safe_encoding # on, off, or safe_encoding +#escape_string_warning = on +#lo_compat_privileges = off +#quote_all_identifiers = off +#standard_conforming_strings = on +#synchronize_seqscans = on + +# - Other Platforms and Clients - + +#transform_null_equals = off + + +#------------------------------------------------------------------------------ +# ERROR HANDLING +#------------------------------------------------------------------------------ + +#exit_on_error = off # terminate session on any error? +#restart_after_crash = on # reinitialize after backend crash? +#data_sync_retry = off # retry or panic on failure to fsync + # data? + # (change requires restart) +#recovery_init_sync_method = fsync # fsync, syncfs (Linux 5.8+) + + +#------------------------------------------------------------------------------ +# CONFIG FILE INCLUDES +#------------------------------------------------------------------------------ + +# These options allow settings to be loaded from files other than the +# default postgresql.conf. Note that these are directives, not variable +# assignments, so they can usefully be given more than once. + +#include_dir = '...' # include files ending in '.conf' from + # a directory, e.g., 'conf.d' +#include_if_exists = '...' # include file only if it exists +#include = '...' # include file + + +#------------------------------------------------------------------------------ +# CUSTOMIZED OPTIONS +#------------------------------------------------------------------------------ + +# Add settings for extensions here diff --git a/docker/dify/volumes/db/data/pgdata/postmaster.opts b/docker/dify/volumes/db/data/pgdata/postmaster.opts new file mode 100644 index 00000000..42ef3abb --- /dev/null +++ b/docker/dify/volumes/db/data/pgdata/postmaster.opts @@ -0,0 +1 @@ +/usr/local/bin/postgres "-c" "max_connections=100" "-c" "shared_buffers=128MB" "-c" "work_mem=4MB" "-c" "maintenance_work_mem=64MB" "-c" "effective_cache_size=4096MB" "-c" "statement_timeout=0" "-c" "idle_in_transaction_session_timeout=0" diff --git a/docker/dify/volumes/db/data/pgdata/postmaster.pid b/docker/dify/volumes/db/data/pgdata/postmaster.pid new file mode 100644 index 00000000..9d17f2d9 --- /dev/null +++ b/docker/dify/volumes/db/data/pgdata/postmaster.pid @@ -0,0 +1,8 @@ +1 +/var/lib/postgresql/data/pgdata +1766893646 +5432 +/var/run/postgresql +* + 1014326 0 +ready diff --git a/docker/dify/volumes/myscale/config/users.d/custom_users_config.xml b/docker/dify/volumes/myscale/config/users.d/custom_users_config.xml new file mode 100644 index 00000000..b46e73a0 --- /dev/null +++ b/docker/dify/volumes/myscale/config/users.d/custom_users_config.xml @@ -0,0 +1,17 @@ + + + + + + ::1 + 127.0.0.1 + 10.0.0.0/8 + 172.16.0.0/12 + 192.168.0.0/16 + + default + default + 1 + + + diff --git a/docker/dify/volumes/oceanbase/init.d/vec_memory.sql b/docker/dify/volumes/oceanbase/init.d/vec_memory.sql new file mode 100644 index 00000000..0d859e5f --- /dev/null +++ b/docker/dify/volumes/oceanbase/init.d/vec_memory.sql @@ -0,0 +1 @@ +ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30; diff --git a/docker/dify/volumes/opensearch/opensearch_dashboards.yml b/docker/dify/volumes/opensearch/opensearch_dashboards.yml new file mode 100644 index 00000000..f50d63bb --- /dev/null +++ b/docker/dify/volumes/opensearch/opensearch_dashboards.yml @@ -0,0 +1,222 @@ +--- +# Copyright OpenSearch Contributors +# SPDX-License-Identifier: Apache-2.0 + +# Description: +# Default configuration for OpenSearch Dashboards + +# OpenSearch Dashboards is served by a back end server. This setting specifies the port to use. +# server.port: 5601 + +# Specifies the address to which the OpenSearch Dashboards server will bind. IP addresses and host names are both valid values. +# The default is 'localhost', which usually means remote machines will not be able to connect. +# To allow connections from remote users, set this parameter to a non-loopback address. +# server.host: "localhost" + +# Enables you to specify a path to mount OpenSearch Dashboards at if you are running behind a proxy. +# Use the `server.rewriteBasePath` setting to tell OpenSearch Dashboards if it should remove the basePath +# from requests it receives, and to prevent a deprecation warning at startup. +# This setting cannot end in a slash. +# server.basePath: "" + +# Specifies whether OpenSearch Dashboards should rewrite requests that are prefixed with +# `server.basePath` or require that they are rewritten by your reverse proxy. +# server.rewriteBasePath: false + +# The maximum payload size in bytes for incoming server requests. +# server.maxPayloadBytes: 1048576 + +# The OpenSearch Dashboards server's name. This is used for display purposes. +# server.name: "your-hostname" + +# The URLs of the OpenSearch instances to use for all your queries. +# opensearch.hosts: ["http://localhost:9200"] + +# OpenSearch Dashboards uses an index in OpenSearch to store saved searches, visualizations and +# dashboards. OpenSearch Dashboards creates a new index if the index doesn't already exist. +# opensearchDashboards.index: ".opensearch_dashboards" + +# The default application to load. +# opensearchDashboards.defaultAppId: "home" + +# Setting for an optimized healthcheck that only uses the local OpenSearch node to do Dashboards healthcheck. +# This settings should be used for large clusters or for clusters with ingest heavy nodes. +# It allows Dashboards to only healthcheck using the local OpenSearch node rather than fan out requests across all nodes. +# +# It requires the user to create an OpenSearch node attribute with the same name as the value used in the setting +# This node attribute should assign all nodes of the same cluster an integer value that increments with each new cluster that is spun up +# e.g. in opensearch.yml file you would set the value to a setting using node.attr.cluster_id: +# Should only be enabled if there is a corresponding node attribute created in your OpenSearch config that matches the value here +# opensearch.optimizedHealthcheckId: "cluster_id" + +# If your OpenSearch is protected with basic authentication, these settings provide +# the username and password that the OpenSearch Dashboards server uses to perform maintenance on the OpenSearch Dashboards +# index at startup. Your OpenSearch Dashboards users still need to authenticate with OpenSearch, which +# is proxied through the OpenSearch Dashboards server. +# opensearch.username: "opensearch_dashboards_system" +# opensearch.password: "pass" + +# Enables SSL and paths to the PEM-format SSL certificate and SSL key files, respectively. +# These settings enable SSL for outgoing requests from the OpenSearch Dashboards server to the browser. +# server.ssl.enabled: false +# server.ssl.certificate: /path/to/your/server.crt +# server.ssl.key: /path/to/your/server.key + +# Optional settings that provide the paths to the PEM-format SSL certificate and key files. +# These files are used to verify the identity of OpenSearch Dashboards to OpenSearch and are required when +# xpack.security.http.ssl.client_authentication in OpenSearch is set to required. +# opensearch.ssl.certificate: /path/to/your/client.crt +# opensearch.ssl.key: /path/to/your/client.key + +# Optional setting that enables you to specify a path to the PEM file for the certificate +# authority for your OpenSearch instance. +# opensearch.ssl.certificateAuthorities: [ "/path/to/your/CA.pem" ] + +# To disregard the validity of SSL certificates, change this setting's value to 'none'. +# opensearch.ssl.verificationMode: full + +# Time in milliseconds to wait for OpenSearch to respond to pings. Defaults to the value of +# the opensearch.requestTimeout setting. +# opensearch.pingTimeout: 1500 + +# Time in milliseconds to wait for responses from the back end or OpenSearch. This value +# must be a positive integer. +# opensearch.requestTimeout: 30000 + +# List of OpenSearch Dashboards client-side headers to send to OpenSearch. To send *no* client-side +# headers, set this value to [] (an empty list). +# opensearch.requestHeadersWhitelist: [ authorization ] + +# Header names and values that are sent to OpenSearch. Any custom headers cannot be overwritten +# by client-side headers, regardless of the opensearch.requestHeadersWhitelist configuration. +# opensearch.customHeaders: {} + +# Time in milliseconds for OpenSearch to wait for responses from shards. Set to 0 to disable. +# opensearch.shardTimeout: 30000 + +# Logs queries sent to OpenSearch. Requires logging.verbose set to true. +# opensearch.logQueries: false + +# Specifies the path where OpenSearch Dashboards creates the process ID file. +# pid.file: /var/run/opensearchDashboards.pid + +# Enables you to specify a file where OpenSearch Dashboards stores log output. +# logging.dest: stdout + +# Set the value of this setting to true to suppress all logging output. +# logging.silent: false + +# Set the value of this setting to true to suppress all logging output other than error messages. +# logging.quiet: false + +# Set the value of this setting to true to log all events, including system usage information +# and all requests. +# logging.verbose: false + +# Set the interval in milliseconds to sample system and process performance +# metrics. Minimum is 100ms. Defaults to 5000. +# ops.interval: 5000 + +# Specifies locale to be used for all localizable strings, dates and number formats. +# Supported languages are the following: English - en , by default , Chinese - zh-CN . +# i18n.locale: "en" + +# Set the allowlist to check input graphite Url. Allowlist is the default check list. +# vis_type_timeline.graphiteAllowedUrls: ['https://www.hostedgraphite.com/UID/ACCESS_KEY/graphite'] + +# Set the blocklist to check input graphite Url. Blocklist is an IP list. +# Below is an example for reference +# vis_type_timeline.graphiteBlockedIPs: [ +# //Loopback +# '127.0.0.0/8', +# '::1/128', +# //Link-local Address for IPv6 +# 'fe80::/10', +# //Private IP address for IPv4 +# '10.0.0.0/8', +# '172.16.0.0/12', +# '192.168.0.0/16', +# //Unique local address (ULA) +# 'fc00::/7', +# //Reserved IP address +# '0.0.0.0/8', +# '100.64.0.0/10', +# '192.0.0.0/24', +# '192.0.2.0/24', +# '198.18.0.0/15', +# '192.88.99.0/24', +# '198.51.100.0/24', +# '203.0.113.0/24', +# '224.0.0.0/4', +# '240.0.0.0/4', +# '255.255.255.255/32', +# '::/128', +# '2001:db8::/32', +# 'ff00::/8', +# ] +# vis_type_timeline.graphiteBlockedIPs: [] + +# opensearchDashboards.branding: +# logo: +# defaultUrl: "" +# darkModeUrl: "" +# mark: +# defaultUrl: "" +# darkModeUrl: "" +# loadingLogo: +# defaultUrl: "" +# darkModeUrl: "" +# faviconUrl: "" +# applicationTitle: "" + +# Set the value of this setting to true to capture region blocked warnings and errors +# for your map rendering services. +# map.showRegionBlockedWarning: false% + +# Set the value of this setting to false to suppress search usage telemetry +# for reducing the load of OpenSearch cluster. +# data.search.usageTelemetry.enabled: false + +# 2.4 renames 'wizard.enabled: false' to 'vis_builder.enabled: false' +# Set the value of this setting to false to disable VisBuilder +# functionality in Visualization. +# vis_builder.enabled: false + +# 2.4 New Experimental Feature +# Set the value of this setting to true to enable the experimental multiple data source +# support feature. Use with caution. +# data_source.enabled: false +# Set the value of these settings to customize crypto materials to encryption saved credentials +# in data sources. +# data_source.encryption.wrappingKeyName: 'changeme' +# data_source.encryption.wrappingKeyNamespace: 'changeme' +# data_source.encryption.wrappingKey: [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] + +# 2.6 New ML Commons Dashboards Feature +# Set the value of this setting to true to enable the ml commons dashboards +# ml_commons_dashboards.enabled: false + +# 2.12 New experimental Assistant Dashboards Feature +# Set the value of this setting to true to enable the assistant dashboards +# assistant.chat.enabled: false + +# 2.13 New Query Assistant Feature +# Set the value of this setting to false to disable the query assistant +# observability.query_assist.enabled: false + +# 2.14 Enable Ui Metric Collectors in Usage Collector +# Set the value of this setting to true to enable UI Metric collections +# usageCollection.uiMetric.enabled: false + +opensearch.hosts: [https://localhost:9200] +opensearch.ssl.verificationMode: none +opensearch.username: admin +opensearch.password: 'Qazwsxedc!@#123' +opensearch.requestHeadersWhitelist: [authorization, securitytenant] + +opensearch_security.multitenancy.enabled: true +opensearch_security.multitenancy.tenants.preferred: [Private, Global] +opensearch_security.readonly_mode.roles: [kibana_read_only] +# Use this setting if you are running opensearch-dashboards without https +opensearch_security.cookie.secure: false +server.host: '0.0.0.0' diff --git a/docker/dify/volumes/plugin_daemon/assets/0179a4422f60cc28de38c7b3395b8504c9a7516c050d355849784a46bcea3b91.svg b/docker/dify/volumes/plugin_daemon/assets/0179a4422f60cc28de38c7b3395b8504c9a7516c050d355849784a46bcea3b91.svg new file mode 100644 index 00000000..c6785062 --- /dev/null +++ b/docker/dify/volumes/plugin_daemon/assets/0179a4422f60cc28de38c7b3395b8504c9a7516c050d355849784a46bcea3b91.svg @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/docker/dify/volumes/plugin_daemon/assets/8460123b0019ed061306a8d48a5cad5e44f64af4c0d42691b0702433879a963a.svg b/docker/dify/volumes/plugin_daemon/assets/8460123b0019ed061306a8d48a5cad5e44f64af4c0d42691b0702433879a963a.svg new file mode 100644 index 00000000..dddabe5e --- /dev/null +++ b/docker/dify/volumes/plugin_daemon/assets/8460123b0019ed061306a8d48a5cad5e44f64af4c0d42691b0702433879a963a.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docker/dify/volumes/plugin_daemon/cwd/langgenius/siliconflow-0.0.38@4795747d4fca05fee9daf34b1bcc110ffbbfcd9112f5f9e914f90b8b5dd549e5/.env.example b/docker/dify/volumes/plugin_daemon/cwd/langgenius/siliconflow-0.0.38@4795747d4fca05fee9daf34b1bcc110ffbbfcd9112f5f9e914f90b8b5dd549e5/.env.example new file mode 100644 index 00000000..dbb75b85 --- /dev/null +++ b/docker/dify/volumes/plugin_daemon/cwd/langgenius/siliconflow-0.0.38@4795747d4fca05fee9daf34b1bcc110ffbbfcd9112f5f9e914f90b8b5dd549e5/.env.example @@ -0,0 +1,4 @@ +INSTALL_METHOD=remote +REMOTE_INSTALL_HOST=debug-plugin.dify.dev +REMOTE_INSTALL_PORT=5003 +REMOTE_INSTALL_KEY=********-****-****-****-************ diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 00000000..7a9e3e77 --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,59 @@ +# ================================================ +# Urban Lifeline - 总控 Docker Compose +# 用于统一管理所有服务的启动 +# ================================================ +# 使用方法: +# 启动所有服务: docker compose --profile all up -d +# 启动基础设施: docker compose --profile infra up -d +# 停止所有服务: docker compose down +# 查看日志: docker compose logs -f [service_name] +# +# All-in-One 模式: +# - urban-lifeline-serv: 所有后端服务 (单容器) +# - urban-lifeline-web: 所有前端应用 (单容器) +# - nginx: 反向代理 +# ================================================ + +name: urban-lifeline + +# 引入子目录的 compose 文件 +include: + # 基础设施 + 业务服务 (All-in-One) + - path: ./infra/docker-compose.yml + +# 共享网络定义 +networks: + urban-lifeline: + driver: bridge + name: urban-lifeline + +# 共享卷定义 +volumes: + # 基础设施 + nacos-data: + driver: local + nacos-logs: + driver: local + minio-data: + driver: local + minio-config: + driver: local + # Jitsi + jitsi-web: + driver: local + jitsi-prosody: + driver: local + jitsi-jicofo: + driver: local + jitsi-jvb: + driver: local + # 后端服务 + serv-logs: + driver: local + serv-config: + driver: local + # 前端服务 + web-logs: + driver: local + web-config: + driver: local diff --git a/docker/jitsi/.env.example b/docker/jitsi/.env.example new file mode 100644 index 00000000..71509a4e --- /dev/null +++ b/docker/jitsi/.env.example @@ -0,0 +1,62 @@ +# ================================================ +# Jitsi Meet - 环境变量配置 +# 复制此文件为 .env 并修改配置 +# ================================================ + +# 时区 +TZ=Asia/Shanghai + +# 数据目录 +DATA_ROOT=../volumes + +# ==================== 镜像版本 ==================== +JITSI_IMAGE_TAG=stable-9584 + +# ==================== 公网访问 ==================== +# Jitsi 公网访问地址 (必须配置) +JITSI_PUBLIC_URL=https://meet.example.com + +# JVB 公网 IP (必须配置,用于 WebRTC 媒体流) +JVB_HOST_ADDRESS=192.168.0.253 + +# ==================== 端口配置 ==================== +# Web 端口 +JITSI_WEB_HTTP_PORT=8280 +JITSI_WEB_HTTPS_PORT=8443 + +# JVB 端口 (UDP 用于媒体流,TCP 用于备用) +JVB_PORT=10000 +JVB_TCP_PORT=4443 + +# ==================== JWT 认证 ==================== +# JWT App ID (与后端服务保持一致) +JWT_APP_ID=urbanLifeline + +# JWT 密钥 (生产环境必须修改!) +JWT_APP_SECRET=your-jwt-secret-key-change-in-production + +# ==================== 功能开关 ==================== +# 是否启用认证 (1=启用, 0=禁用) +JITSI_ENABLE_AUTH=1 + +# 是否允许访客 (1=允许, 0=禁止) +JITSI_ENABLE_GUESTS=0 + +# 是否启用 HTTPS (容器内) +JITSI_ENABLE_HTTPS=0 +JITSI_DISABLE_HTTPS=1 + +# 是否启用录制 +JITSI_ENABLE_RECORDING=0 + +# 日志级别 +JITSI_LOG_LEVEL=info + +# ==================== 组件密码 ==================== +# 内部组件认证密码 (生产环境建议修改) +JICOFO_COMPONENT_SECRET=jicofo-secret +JICOFO_AUTH_PASSWORD=focus-password +JVB_AUTH_PASSWORD=jvb-password + +# ==================== STUN 服务器 ==================== +JVB_STUN_SERVERS=stun.l.google.com:19302,stun1.l.google.com:19302 diff --git a/docker/jitsi/docker-compose.yml b/docker/jitsi/docker-compose.yml new file mode 100644 index 00000000..2f403d5c --- /dev/null +++ b/docker/jitsi/docker-compose.yml @@ -0,0 +1,198 @@ +# ================================================ +# Jitsi Meet 视频会议服务 +# +# 使用方式: +# docker compose up -d +# +# 环境变量配置: +# 复制 .env.example 为 .env 并修改 +# ================================================ + +services: + # ====================== Jitsi Web ====================== + jitsi-web: + image: jitsi/web:${JITSI_IMAGE_TAG:-stable-9584} + container_name: urban-lifeline-jitsi-web + restart: unless-stopped + networks: + - urban-lifeline + ports: + - "${JITSI_WEB_HTTP_PORT:-8280}:80" + - "${JITSI_WEB_HTTPS_PORT:-8443}:443" + environment: + TZ: ${TZ:-Asia/Shanghai} + PUBLIC_URL: ${JITSI_PUBLIC_URL:-https://meet.example.com} + ENABLE_HTTPS: ${JITSI_ENABLE_HTTPS:-0} + ENABLE_HTTP_REDIRECT: 0 + DISABLE_HTTPS: ${JITSI_DISABLE_HTTPS:-1} + # XMPP 配置 + XMPP_DOMAIN: meet.jitsi + XMPP_AUTH_DOMAIN: auth.meet.jitsi + XMPP_BOSH_URL_BASE: http://jitsi-prosody:5280 + XMPP_MUC_DOMAIN: muc.meet.jitsi + XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi + XMPP_GUEST_DOMAIN: guest.meet.jitsi + # 组件认证 + JICOFO_COMPONENT_SECRET: ${JICOFO_COMPONENT_SECRET:-jicofo-secret} + JICOFO_AUTH_USER: focus + JVB_AUTH_USER: jvb + JVB_AUTH_PASSWORD: ${JVB_AUTH_PASSWORD:-jvb-password} + # JWT 认证 + ENABLE_AUTH: ${JITSI_ENABLE_AUTH:-1} + ENABLE_GUESTS: ${JITSI_ENABLE_GUESTS:-0} + AUTH_TYPE: jwt + JWT_APP_ID: ${JWT_APP_ID:-urbanLifeline} + JWT_APP_SECRET: ${JWT_APP_SECRET:-your-jwt-secret-key-change-in-production} + JWT_ACCEPTED_ISSUERS: ${JWT_APP_ID:-urbanLifeline} + JWT_ACCEPTED_AUDIENCES: jitsi + JWT_ALLOW_EMPTY: 0 + JWT_AUTH_TYPE: token + JWT_TOKEN_AUTH_MODULE: token_verification + # 功能开关 + ENABLE_RECORDING: ${JITSI_ENABLE_RECORDING:-0} + ENABLE_TRANSCRIPTIONS: 0 + ENABLE_SUBDOMAINS: 0 + ENABLE_XMPP_WEBSOCKET: 1 + ENABLE_SCTP: 1 + volumes: + - ${DATA_ROOT:-../volumes}/jitsi/web:/config + - ${DATA_ROOT:-../volumes}/jitsi/transcripts:/usr/share/jitsi-meet/transcripts + depends_on: + - jitsi-prosody + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:80/"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 60s + + # ====================== Jitsi Prosody (XMPP) ====================== + jitsi-prosody: + image: jitsi/prosody:${JITSI_IMAGE_TAG:-stable-9584} + container_name: urban-lifeline-jitsi-prosody + restart: unless-stopped + networks: + - urban-lifeline + expose: + - "5222" + - "5347" + - "5280" + environment: + TZ: ${TZ:-Asia/Shanghai} + PUBLIC_URL: ${JITSI_PUBLIC_URL:-https://meet.example.com} + # XMPP 配置 + XMPP_DOMAIN: meet.jitsi + XMPP_AUTH_DOMAIN: auth.meet.jitsi + XMPP_MUC_DOMAIN: muc.meet.jitsi + XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi + XMPP_GUEST_DOMAIN: guest.meet.jitsi + # 组件认证 + JICOFO_COMPONENT_SECRET: ${JICOFO_COMPONENT_SECRET:-jicofo-secret} + JICOFO_AUTH_USER: focus + JICOFO_AUTH_PASSWORD: ${JICOFO_AUTH_PASSWORD:-focus-password} + JVB_AUTH_USER: jvb + JVB_AUTH_PASSWORD: ${JVB_AUTH_PASSWORD:-jvb-password} + # JWT 认证 + ENABLE_AUTH: ${JITSI_ENABLE_AUTH:-1} + ENABLE_GUESTS: ${JITSI_ENABLE_GUESTS:-0} + AUTH_TYPE: jwt + JWT_APP_ID: ${JWT_APP_ID:-urbanLifeline} + JWT_APP_SECRET: ${JWT_APP_SECRET:-your-jwt-secret-key-change-in-production} + JWT_ACCEPTED_ISSUERS: ${JWT_APP_ID:-urbanLifeline} + JWT_ACCEPTED_AUDIENCES: jitsi + JWT_ALLOW_EMPTY: 0 + JWT_AUTH_TYPE: token + JWT_TOKEN_AUTH_MODULE: token_verification + JWT_DISABLE_AUTO_MODERATOR: true + LOG_LEVEL: ${JITSI_LOG_LEVEL:-info} + volumes: + - ${DATA_ROOT:-../volumes}/jitsi/prosody/config:/config + - ${DATA_ROOT:-../volumes}/jitsi/prosody/prosody-plugins-custom:/prosody-plugins-custom + healthcheck: + test: ["CMD", "prosodyctl", "status"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 90s + + # ====================== Jitsi Jicofo (会议焦点) ====================== + jitsi-jicofo: + image: jitsi/jicofo:${JITSI_IMAGE_TAG:-stable-9584} + container_name: urban-lifeline-jitsi-jicofo + restart: unless-stopped + networks: + - urban-lifeline + environment: + TZ: ${TZ:-Asia/Shanghai} + # XMPP 配置 + XMPP_DOMAIN: meet.jitsi + XMPP_AUTH_DOMAIN: auth.meet.jitsi + XMPP_MUC_DOMAIN: muc.meet.jitsi + XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi + XMPP_SERVER: jitsi-prosody + # 组件认证 + JICOFO_COMPONENT_SECRET: ${JICOFO_COMPONENT_SECRET:-jicofo-secret} + JICOFO_AUTH_USER: focus + JICOFO_AUTH_PASSWORD: ${JICOFO_AUTH_PASSWORD:-focus-password} + AUTH_TYPE: jwt + JVB_BREWERY_MUC: jvbbrewery + # 功能配置 + JICOFO_ENABLE_HEALTH_CHECKS: true + JICOFO_ENABLE_AUTO_OWNER: false + JICOFO_ENABLE_AUTO_LOGIN: false + JICOFO_CONFERENCE_INITIAL_OWNER: "" + volumes: + - ${DATA_ROOT:-../volumes}/jitsi/jicofo:/config + depends_on: + - jitsi-prosody + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8888/about/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 90s + + # ====================== Jitsi JVB (视频桥接) ====================== + jitsi-jvb: + image: jitsi/jvb:${JITSI_IMAGE_TAG:-stable-9584} + container_name: urban-lifeline-jitsi-jvb + restart: unless-stopped + networks: + - urban-lifeline + ports: + - "${JVB_PORT:-10000}:10000/udp" + - "${JVB_TCP_PORT:-4443}:4443/tcp" + environment: + TZ: ${TZ:-Asia/Shanghai} + # XMPP 配置 + XMPP_DOMAIN: meet.jitsi + XMPP_AUTH_DOMAIN: auth.meet.jitsi + XMPP_INTERNAL_MUC_DOMAIN: internal-muc.meet.jitsi + XMPP_SERVER: jitsi-prosody + # 组件认证 + JVB_AUTH_USER: jvb + JVB_AUTH_PASSWORD: ${JVB_AUTH_PASSWORD:-jvb-password} + JVB_BREWERY_MUC: jvbbrewery + # 网络配置 + JVB_PORT: ${JVB_PORT:-10000} + JVB_STUN_SERVERS: ${JVB_STUN_SERVERS:-stun.l.google.com:19302,stun1.l.google.com:19302} + DOCKER_HOST_ADDRESS: ${JVB_HOST_ADDRESS} + JVB_ADVERTISE_IPS: ${JVB_HOST_ADDRESS} + JVB_ENABLE_APIS: rest,colibri + JVB_TCP_HARVESTER_DISABLED: "false" + JVB_TCP_PORT: ${JVB_TCP_PORT:-4443} + JVB_TCP_MAPPED_PORT: ${JVB_TCP_PORT:-4443} + volumes: + - ${DATA_ROOT:-../volumes}/jitsi/jvb:/config + depends_on: + - jitsi-prosody + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/about/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 90s + +networks: + urban-lifeline: + name: urban-lifeline diff --git a/docker/minio/.env.example b/docker/minio/.env.example new file mode 100644 index 00000000..3066f4b9 --- /dev/null +++ b/docker/minio/.env.example @@ -0,0 +1,36 @@ +# ================================================ +# MinIO 配置 +# 复制此文件为 .env 并修改配置 +# ================================================ + +# ------------------------------ +# MinIO 版本 +# ------------------------------ +MINIO_VERSION=latest + +# ------------------------------ +# 端口配置 +# ------------------------------ +# API 端口 +MINIO_API_PORT=9000 +# 控制台端口 +MINIO_CONSOLE_PORT=9001 + +# ------------------------------ +# 认证配置 +# ------------------------------ +MINIO_ROOT_USER=minioadmin +MINIO_ROOT_PASSWORD=minioadmin123 + +# ------------------------------ +# 域名配置(可选,用于反向代理) +# ------------------------------ +# 控制台重定向 URL(通过反向代理访问时设置) +# MINIO_BROWSER_REDIRECT_URL=https://minio-console.example.com +# API 服务 URL(通过反向代理访问时设置) +# MINIO_SERVER_URL=https://minio.example.com + +# ------------------------------ +# 数据目录 +# ------------------------------ +DATA_ROOT=../volumes diff --git a/docker/minio/docker-compose.yml b/docker/minio/docker-compose.yml new file mode 100644 index 00000000..ec206c23 --- /dev/null +++ b/docker/minio/docker-compose.yml @@ -0,0 +1,35 @@ +services: + +# ====================== MinIO 对象存储 ====================== + minio: + image: minio/minio:${MINIO_VERSION:-latest} + container_name: urban-lifeline-minio + restart: unless-stopped + env_file: + - .env + networks: + - urban-lifeline + ports: + - "${MINIO_API_PORT:-9000}:9000" + - "${MINIO_CONSOLE_PORT:-9001}:9001" + environment: + MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} + MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-minioadmin123} + MINIO_CONSOLE_ADDRESS: ":9001" + MINIO_ADDRESS: ":9000" + MINIO_BROWSER_REDIRECT_URL: ${MINIO_BROWSER_REDIRECT_URL:-} + MINIO_SERVER_URL: ${MINIO_SERVER_URL:-} + TZ: Asia/Shanghai + volumes: + - ${DATA_ROOT:-../volumes}/minio/data:/data + - ${DATA_ROOT:-../volumes}/minio/config:/root/.minio + command: server /data --console-address ":9001" + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] + interval: 30s + timeout: 20s + retries: 3 + start_period: 30s +networks: + urban-lifeline: + name: urban-lifeline \ No newline at end of file diff --git a/docker/nacos/.env.example b/docker/nacos/.env.example new file mode 100644 index 00000000..9bc41369 --- /dev/null +++ b/docker/nacos/.env.example @@ -0,0 +1,50 @@ +# ================================================ +# Nacos 配置 +# 复制此文件为 .env 并修改配置 +# ================================================ + +# ------------------------------ +# MySQL 配置 +# ------------------------------ +MYSQL_VERSION=8.0 +MYSQL_ROOT_PASSWORD=root123456 +MYSQL_USER=nacos +MYSQL_PASSWORD=nacos123456 +# 暴露到主机的端口(避免与主机 MySQL 冲突) +MYSQL_EXPOSE_PORT=3307 + +# ------------------------------ +# Nacos 版本和模式 +# ------------------------------ +NACOS_VERSION=v3.1.0 +NACOS_MODE=standalone +NACOS_DB_NAME=nacos_config + +# ------------------------------ +# Nacos 端口配置 +# ------------------------------ +NACOS_CONSOLE_PORT=8081 +NACOS_PORT=8848 +NACOS_GRPC_PORT=9848 +NACOS_RAFT_PORT=9849 + +# ------------------------------ +# JVM 配置 +# ------------------------------ +NACOS_JVM_XMS=512m +NACOS_JVM_XMX=512m +NACOS_JVM_XMN=256m + +# ------------------------------ +# 认证配置 +# ------------------------------ +NACOS_AUTH_ENABLE=false +# 生产环境请修改以下密钥 +NACOS_AUTH_TOKEN=ZlRkR2ZxR3BvZ1F0a3JxY2V6RUx2cUh1Rkx6V1ZQbE9kUVd1R1VOcWFFS2t3dG5hS0E9PQ== +NACOS_AUTH_IDENTITY_KEY=serverIdentity +NACOS_AUTH_IDENTITY_VALUE=security + +# ------------------------------ +# 数据目录 +# ------------------------------ +DATA_ROOT=../volumes diff --git a/docker/nacos/docker-compose.yml b/docker/nacos/docker-compose.yml new file mode 100644 index 00000000..2ce94855 --- /dev/null +++ b/docker/nacos/docker-compose.yml @@ -0,0 +1,76 @@ +services: +# ====================== MySQL 数据库 ====================== + mysql: + image: mysql:${MYSQL_VERSION:-8.0} + container_name: urban-lifeline-nacos-mysql + restart: unless-stopped + networks: + - urban-lifeline + ports: + - "${MYSQL_EXPOSE_PORT:-3307}:3306" + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123456} + MYSQL_DATABASE: ${NACOS_DB_NAME:-nacos_config} + MYSQL_USER: ${MYSQL_USER:-nacos} + MYSQL_PASSWORD: ${MYSQL_PASSWORD:-nacos123456} + TZ: Asia/Shanghai + volumes: + - ${DATA_ROOT:-../volumes}/nacos/mysql:/var/lib/mysql + - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro + command: + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_unicode_ci + - --default-authentication-plugin=mysql_native_password + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-root123456}"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 30s + +# ====================== Nacos 注册中心 ====================== + nacos: + image: nacos/nacos-server:${NACOS_VERSION:-v3.1.0} + container_name: urban-lifeline-nacos + restart: unless-stopped + env_file: + - .env + networks: + - urban-lifeline + ports: + - "${NACOS_CONSOLE_PORT:-8081}:8081" + - "${NACOS_PORT:-8848}:8848" + - "${NACOS_GRPC_PORT:-9848}:9848" + - "${NACOS_RAFT_PORT:-9849}:9849" + environment: + MODE: ${NACOS_MODE:-standalone} + SPRING_DATASOURCE_PLATFORM: mysql + MYSQL_SERVICE_HOST: mysql + MYSQL_SERVICE_PORT: 3306 + MYSQL_SERVICE_DB_NAME: ${NACOS_DB_NAME:-nacos_config} + MYSQL_SERVICE_USER: ${MYSQL_USER:-nacos} + MYSQL_SERVICE_PASSWORD: ${MYSQL_PASSWORD:-nacos123456} + MYSQL_SERVICE_DB_PARAM: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true + JVM_XMS: ${NACOS_JVM_XMS:-512m} + JVM_XMX: ${NACOS_JVM_XMX:-512m} + JVM_XMN: ${NACOS_JVM_XMN:-256m} + NACOS_AUTH_ENABLE: ${NACOS_AUTH_ENABLE:-false} + NACOS_AUTH_TOKEN: ${NACOS_AUTH_TOKEN:-ZlRkR2ZxR3BvZ1F0a3JxY2V6RUx2cUh1Rkx6V1ZQbE9kUVd1R1VOcWFFS2t3dG5hS0E9PQ==} + NACOS_AUTH_IDENTITY_KEY: ${NACOS_AUTH_IDENTITY_KEY:-serverIdentity} + NACOS_AUTH_IDENTITY_VALUE: ${NACOS_AUTH_IDENTITY_VALUE:-security} + volumes: + - ${DATA_ROOT:-../volumes}/nacos/data:/home/nacos/data + - ${DATA_ROOT:-../volumes}/nacos/logs:/home/nacos/logs + depends_on: + mysql: + condition: service_healthy + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8848/nacos/"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 60s + +networks: + urban-lifeline: + name: urban-lifeline diff --git a/docker/nacos/init.sql b/docker/nacos/init.sql new file mode 100644 index 00000000..36098b16 --- /dev/null +++ b/docker/nacos/init.sql @@ -0,0 +1,182 @@ +/* + * Copyright 1999-2018 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +DROP DATABASE IF EXISTS `nacos_config`; +CREATE DATABASE IF NOT EXISTS `nacos_config` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; +USE `nacos_config`; + +/******************************************/ +/* 表名称 = config_info */ +/******************************************/ +CREATE TABLE `config_info` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` VARCHAR(255) NOT NULL COMMENT 'data_id', + `group_id` VARCHAR(128) DEFAULT NULL COMMENT 'group_id', + `content` longtext NOT NULL COMMENT 'content', + `md5` VARCHAR(32) DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + `src_user` text COMMENT 'source user', + `src_ip` VARCHAR(50) DEFAULT NULL COMMENT 'source ip', + `app_name` VARCHAR(128) DEFAULT NULL COMMENT 'app_name', + `tenant_id` VARCHAR(128) DEFAULT '' COMMENT '租户字段', + `c_desc` VARCHAR(256) DEFAULT NULL COMMENT 'configuration description', + `c_use` VARCHAR(64) DEFAULT NULL COMMENT 'configuration usage', + `effect` VARCHAR(64) DEFAULT NULL COMMENT '配置生效的描述', + `type` VARCHAR(64) DEFAULT NULL COMMENT '配置的类型', + `c_schema` text COMMENT '配置的模式', + `encrypted_data_key` VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '密钥', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info'; + +/******************************************/ +/* 表名称 = config_info since 2.5.0 */ +/******************************************/ +CREATE TABLE `config_info_gray` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `data_id` VARCHAR(255) NOT NULL COMMENT 'data_id', + `group_id` VARCHAR(128) NOT NULL COMMENT 'group_id', + `content` longtext NOT NULL COMMENT 'content', + `md5` VARCHAR(32) DEFAULT NULL COMMENT 'md5', + `src_user` text COMMENT 'src_user', + `src_ip` VARCHAR(100) DEFAULT NULL COMMENT 'src_ip', + `gmt_create` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_create', + `gmt_modified` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT 'gmt_modified', + `app_name` VARCHAR(128) DEFAULT NULL COMMENT 'app_name', + `tenant_id` VARCHAR(128) DEFAULT '' COMMENT 'tenant_id', + `gray_name` VARCHAR(128) NOT NULL COMMENT 'gray_name', + `gray_rule` text NOT NULL COMMENT 'gray_rule', + `encrypted_data_key` VARCHAR(256) NOT NULL DEFAULT '' COMMENT 'encrypted_data_key', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_configinfogray_datagrouptenantgray` (`data_id`,`group_id`,`tenant_id`,`gray_name`), + KEY `idx_dataid_gmt_modified` (`data_id`,`gmt_modified`), + KEY `idx_gmt_modified` (`gmt_modified`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='config_info_gray'; + +/******************************************/ +/* 表名称 = config_tags_relation */ +/******************************************/ +CREATE TABLE `config_tags_relation` ( + `id` bigint(20) NOT NULL COMMENT 'id', + `tag_name` VARCHAR(128) NOT NULL COMMENT 'tag_name', + `tag_type` VARCHAR(64) DEFAULT NULL COMMENT 'tag_type', + `data_id` VARCHAR(255) NOT NULL COMMENT 'data_id', + `group_id` VARCHAR(128) NOT NULL COMMENT 'group_id', + `tenant_id` VARCHAR(128) DEFAULT '' COMMENT 'tenant_id', + `nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增长标识', + PRIMARY KEY (`nid`), + UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_tag_relation'; + +/******************************************/ +/* 表名称 = group_capacity */ +/******************************************/ +CREATE TABLE `group_capacity` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `group_id` VARCHAR(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表示整个集群', + `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', + `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', + `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', + `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数,,0表示使用默认值', + `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', + `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_group_id` (`group_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量信息表'; + +/******************************************/ +/* 表名称 = his_config_info */ +/******************************************/ +CREATE TABLE `his_config_info` ( + `id` bigint(20) unsigned NOT NULL COMMENT 'id', + `nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, 自增标识', + `data_id` VARCHAR(255) NOT NULL COMMENT 'data_id', + `group_id` VARCHAR(128) NOT NULL COMMENT 'group_id', + `app_name` VARCHAR(128) DEFAULT NULL COMMENT 'app_name', + `content` longtext NOT NULL COMMENT 'content', + `md5` VARCHAR(32) DEFAULT NULL COMMENT 'md5', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + `src_user` text COMMENT 'source user', + `src_ip` VARCHAR(50) DEFAULT NULL COMMENT 'source ip', + `op_type` char(10) DEFAULT NULL COMMENT 'operation type', + `tenant_id` VARCHAR(128) DEFAULT '' COMMENT '租户字段', + `encrypted_data_key` VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '密钥', + `publish_type` VARCHAR(50) DEFAULT 'formal' COMMENT 'publish type gray or formal', + `gray_name` VARCHAR(50) DEFAULT NULL COMMENT 'gray name', + `ext_info` longtext DEFAULT NULL COMMENT 'ext info', + PRIMARY KEY (`nid`), + KEY `idx_gmt_create` (`gmt_create`), + KEY `idx_gmt_modified` (`gmt_modified`), + KEY `idx_did` (`data_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租户改造'; + + +/******************************************/ +/* 表名称 = tenant_capacity */ +/******************************************/ +CREATE TABLE `tenant_capacity` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `tenant_id` VARCHAR(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID', + `quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表示使用默认值', + `usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使用量', + `max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置大小上限,单位为字节,0表示使用默认值', + `max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合子配置最大个数', + `max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值', + `max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最大变更历史数量', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租户容量信息表'; + + +CREATE TABLE `tenant_info` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id', + `kp` VARCHAR(128) NOT NULL COMMENT 'kp', + `tenant_id` VARCHAR(128) default '' COMMENT 'tenant_id', + `tenant_name` VARCHAR(128) default '' COMMENT 'tenant_name', + `tenant_desc` VARCHAR(256) DEFAULT NULL COMMENT 'tenant_desc', + `create_source` VARCHAR(32) DEFAULT NULL COMMENT 'create_source', + `gmt_create` bigint(20) NOT NULL COMMENT '创建时间', + `gmt_modified` bigint(20) NOT NULL COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`), + KEY `idx_tenant_id` (`tenant_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info'; + +CREATE TABLE `users` ( + `username` VARCHAR(50) NOT NULL PRIMARY KEY COMMENT 'username', + `password` VARCHAR(500) NOT NULL COMMENT 'password', + `enabled` BOOLEAN NOT NULL COMMENT 'enabled' +); + +CREATE TABLE `roles` ( + `username` VARCHAR(50) NOT NULL COMMENT 'username', + `role` VARCHAR(50) NOT NULL COMMENT 'role', + UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE +); + +CREATE TABLE `permissions` ( + `role` VARCHAR(50) NOT NULL COMMENT 'role', + `resource` VARCHAR(128) NOT NULL COMMENT 'resource', + `action` VARCHAR(8) NOT NULL COMMENT 'action', + UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE +); + diff --git a/docker/nginx/conf.d/default.conf b/docker/nginx/conf.d/default.conf deleted file mode 100644 index 22343622..00000000 --- a/docker/nginx/conf.d/default.conf +++ /dev/null @@ -1,196 +0,0 @@ -# 开发环境统一入口配置 - -# 上游服务定义 -upstream gateway { - server gateway:8080; - keepalive 32; -} - -upstream portal { - server portal:3000; - keepalive 16; -} - -upstream app-bidding { - server app-bidding:3001; - keepalive 16; -} - -upstream app-customer-service { - server app-customer-service:3002; - keepalive 16; -} - -upstream shared { - server shared:5000; - keepalive 16; -} - -# WebSocket 升级配置 -map $http_upgrade $connection_upgrade { - default upgrade; - '' close; -} - -# 主服务器配置 -server { - listen 80; - server_name localhost; - - # 安全头 - add_header X-Frame-Options "SAMEORIGIN" always; - add_header X-Content-Type-Options "nosniff" always; - add_header X-XSS-Protection "1; mode=block" always; - - # 开发环境允许所有跨域 - add_header Access-Control-Allow-Origin "*" always; - add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS" always; - add_header Access-Control-Allow-Headers "DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization" always; - - # 健康检查 - location /health { - access_log off; - return 200 "healthy\n"; - add_header Content-Type text/plain; - } - - # ==================== 共享包服务(ES Module + Module Federation) ==================== - location /shared/ { - proxy_pass http://shared:5000/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - # CORS(ES Module / Module Federation 必需) - add_header Access-Control-Allow-Origin "*" always; - add_header Access-Control-Allow-Methods "GET, OPTIONS" always; - add_header Access-Control-Allow-Headers "Content-Type" always; - - # ES Module MIME 类型 - if ($request_filename ~* \.(js|mjs)$) { - add_header Content-Type "application/javascript; charset=utf-8"; - } - - # 开发环境不缓存 - add_header Cache-Control "no-cache, no-store, must-revalidate"; - - # HMR 支持 - proxy_read_timeout 86400; - proxy_send_timeout 86400; - } - - # ==================== API 网关代理 ==================== - location /api/ { - proxy_pass http://gateway/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - # 超时设置 - proxy_connect_timeout 60s; - proxy_send_timeout 60s; - proxy_read_timeout 60s; - } - - # WebSocket 代理 - location /ws/ { - proxy_pass http://gateway/ws/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - - # WebSocket 超时设置 - proxy_read_timeout 3600s; - proxy_send_timeout 3600s; - } - - # ==================== 主应用(Portal) ==================== - location / { - proxy_pass http://portal/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - - # Vite HMR 支持 - proxy_read_timeout 86400; - } - - # ==================== 招投标应用 ==================== - location /bidding { - rewrite ^/bidding/(.*)$ /$1 break; - proxy_pass http://app-bidding/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - - # Vite HMR 支持 - proxy_read_timeout 86400; - } - - # 招投标应用静态资源 - location /bidding/ { - proxy_pass http://app-bidding/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_set_header Host $host; - - proxy_read_timeout 86400; - } - - # ==================== 智能客服应用 ==================== - location /customer-service { - rewrite ^/customer-service/(.*)$ /$1 break; - proxy_pass http://app-customer-service/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_set_header Host $host; - - proxy_read_timeout 86400; - } - - location /customer-service/ { - proxy_pass http://app-customer-service/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_set_header Host $host; - - proxy_read_timeout 86400; - } - - # ==================== Nacos 管理界面(开发用) ==================== - location /nacos/ { - proxy_pass http://nacos:8848/nacos/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - } -} - -# 可选:HTTPS 配置(开发环境使用自签名证书) -# server { -# listen 443 ssl http2; -# server_name localhost; -# -# ssl_certificate /etc/nginx/ssl/cert.pem; -# ssl_certificate_key /etc/nginx/ssl/key.pem; -# ssl_protocols TLSv1.2 TLSv1.3; -# ssl_ciphers HIGH:!aNULL:!MD5; -# -# # 其他配置同上... -# } diff --git a/docker/nginx/conf.d/dify.conf b/docker/nginx/conf.d/dify.conf deleted file mode 100644 index bef3c96c..00000000 --- a/docker/nginx/conf.d/dify.conf +++ /dev/null @@ -1,51 +0,0 @@ -# Dify 服务代理配置 - -# Dify Web 前端 -location /dify/ { - proxy_pass http://dify-web:3000/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - # 支持 WebSocket - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - # 超时配置 - proxy_connect_timeout 60s; - proxy_send_timeout 60s; - proxy_read_timeout 60s; -} - -# Dify API -location /dify/api/ { - proxy_pass http://dify-api:5001/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - # 支持 WebSocket (SSE) - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - # 超时配置(AI 响应可能较慢) - proxy_connect_timeout 300s; - proxy_send_timeout 300s; - proxy_read_timeout 300s; - - # 禁用缓冲(支持流式响应) - proxy_buffering off; -} - -# Dify App (公开应用) -location /dify/app/ { - proxy_pass http://dify-web:3000/app/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; -} diff --git a/docker/start.sh b/docker/start.sh new file mode 100644 index 00000000..f0473580 --- /dev/null +++ b/docker/start.sh @@ -0,0 +1,79 @@ +#!/bin/bash +############################################## +# Urban Lifeline - 快速启动脚本 +############################################## + +set -e + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +cd "${SCRIPT_DIR}" + +# 颜色 +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +show_help() { + echo -e "${BLUE}Urban Lifeline - 快速启动脚本${NC}" + echo "" + echo "用法: ./start.sh [命令]" + echo "" + echo "命令:" + echo " up 启动所有服务" + echo " up-infra 只启动基础设施 (nacos/minio/jitsi)" + echo " up-serv 只启动后端服务" + echo " up-web 只启动前端服务" + echo " down 停止所有服务" + echo " restart 重启所有服务" + echo " status 查看服务状态" + echo " logs 查看所有日志" + echo " logs-f 实时查看日志" + echo "" +} + +case "${1:-help}" in + up) + echo -e "${YELLOW}启动所有服务...${NC}" + docker compose --profile all up -d + echo -e "${GREEN}✓ 所有服务已启动${NC}" + ;; + up-infra) + echo -e "${YELLOW}启动基础设施...${NC}" + docker compose --profile infra up -d + echo -e "${GREEN}✓ 基础设施已启动${NC}" + ;; + up-serv) + echo -e "${YELLOW}启动后端服务...${NC}" + docker compose --profile serv up -d + echo -e "${GREEN}✓ 后端服务已启动${NC}" + ;; + up-web) + echo -e "${YELLOW}启动前端服务...${NC}" + docker compose --profile web up -d + echo -e "${GREEN}✓ 前端服务已启动${NC}" + ;; + down) + echo -e "${YELLOW}停止所有服务...${NC}" + docker compose --profile all down + echo -e "${GREEN}✓ 所有服务已停止${NC}" + ;; + restart) + echo -e "${YELLOW}重启所有服务...${NC}" + docker compose --profile all down + docker compose --profile all up -d + echo -e "${GREEN}✓ 所有服务已重启${NC}" + ;; + status) + docker compose ps + ;; + logs) + docker compose logs + ;; + logs-f) + docker compose logs -f + ;; + help|*) + show_help + ;; +esac diff --git a/docker/stop.sh b/docker/stop.sh new file mode 100644 index 00000000..97d0cce1 --- /dev/null +++ b/docker/stop.sh @@ -0,0 +1,12 @@ +#!/bin/bash +############################################## +# Urban Lifeline - 停止脚本 +############################################## + +SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) +cd "${SCRIPT_DIR}" + +echo "停止所有服务..." +docker compose --profile all down + +echo "✓ 所有服务已停止" diff --git a/docker/urbanLifeline/.env.example b/docker/urbanLifeline/.env.example new file mode 100644 index 00000000..fdeb9f22 --- /dev/null +++ b/docker/urbanLifeline/.env.example @@ -0,0 +1,46 @@ +# ================================================ +# Urban Lifeline - Docker 环境变量配置 +# 复制此文件为 .env 并修改配置 +# ================================================ + +# 镜像版本 +IMAGE_VERSION=latest + +# 数据目录 (日志、配置等) +DATA_ROOT=../volumes + +# ==================== 后端配置 ==================== +# Spring 运行环境 +SPRING_PROFILES_ACTIVE=prod + +# Nacos 配置 +NACOS_SERVER_ADDR=nacos:8848 +NACOS_NAMESPACE= + +# ==================== 前端配置 ==================== +# 前端端口 (可自定义) +SHARED_PORT=8000 +PLATFORM_PORT=8001 +WORKCASE_PORT=8002 +BIDDING_PORT=8003 +WORKCASE_WECHAT_PORT=8004 + +# ==================== 基础设施 ==================== +# MySQL (Nacos 使用) +MYSQL_HOST=host.docker.internal +MYSQL_PORT=3306 +MYSQL_USER=root +MYSQL_PASSWORD=123456 + +# MinIO 配置 +MINIO_ROOT_USER=minioadmin +MINIO_ROOT_PASSWORD=minioadmin123 + +# Dify AI 配置 +DIFY_API_URL=http://dify-api:5001 + +# ==================== Jitsi 视频会议 ==================== +JWT_APP_ID=urbanLifeline +JWT_APP_SECRET=urbanLifeline-jitsi-secret-key-2025-production-safe-hs256 +JVB_HOST_ADDRESS=192.168.0.253 +JITSI_PUBLIC_URL=https://org.xyzh.yslg.jitsi diff --git a/docker/urbanLifeline/Makefile b/docker/urbanLifeline/Makefile new file mode 100644 index 00000000..760ebc5f --- /dev/null +++ b/docker/urbanLifeline/Makefile @@ -0,0 +1,202 @@ +# ================================================ +# Urban Lifeline - Docker 构建与部署 (All-in-One) +# ================================================ + +.PHONY: help build build-pg build-base build-serv build-web up down logs ps status restart +.PHONY: save save-pg save-base save-serv save-web + +# 项目根目录 (相对于此 Makefile) +ROOT_DIR := ../.. + +# 镜像导出目录 +EXPORT_DIR := ./images + +# 时间戳标签 +TIMESTAMP := $(shell date +%Y%m%d_%H%M%S) + +# 默认目标 +help: + @echo "Urban Lifeline Docker 命令 (All-in-One 模式)" + @echo "" + @echo "构建命令:" + @echo " make build - 构建所有镜像 (pg + base + serv + web)" + @echo " make build-pg - 构建 PostgreSQL 镜像" + @echo " make build-base - 构建后端基础镜像" + @echo " make build-serv - 构建后端服务镜像 (依赖 base)" + @echo " make build-web - 构建前端镜像" + @echo "" + @echo "构建并导出 (SAVE=1):" + @echo " make build-pg SAVE=1 - 构建并导出 PostgreSQL 镜像" + @echo " make build-serv SAVE=1 - 构建并导出后端镜像" + @echo " make build-web SAVE=1 - 构建并导出前端镜像" + @echo " make build SAVE=1 - 构建并导出所有镜像" + @echo "" + @echo "导出命令:" + @echo " make save - 导出所有镜像" + @echo " make save-pg - 导出 PostgreSQL 镜像" + @echo " make save-base - 导出后端基础镜像" + @echo " make save-serv - 导出后端服务镜像" + @echo " make save-web - 导出前端镜像" + @echo "" + @echo "启动/停止:" + @echo " make up - 启动所有服务" + @echo " make down - 停止所有服务" + @echo "" + @echo "管理命令:" + @echo " make ps - 查看容器状态" + @echo " make status - 查看服务状态" + @echo " make logs - 查看日志" + @echo " make restart-serv SERVICE=gateway - 重启后端服务" + @echo " make restart-web SITE=platform - 重启前端站点" + @echo "" + @echo "镜像导出目录: $(EXPORT_DIR)" + +# ============================================ +# 构建镜像 +# ============================================ + +# 构建所有镜像 +build: build-pg build-base build-serv build-web +ifdef SAVE + @$(MAKE) save +endif + +# 构建 PostgreSQL 镜像 +build-pg: + @echo "==========================================" + @echo " 构建 PostgreSQL 镜像" + @echo " 标签: $(TIMESTAMP) / latest" + @echo "==========================================" + docker build -t urban-lifeline-pg:$(TIMESTAMP) -f postgres/Dockerfile.pg postgres/ + docker tag urban-lifeline-pg:$(TIMESTAMP) urban-lifeline-pg:latest +ifdef SAVE + @$(MAKE) save-pg +endif + +# 构建后端基础镜像 +build-base: + @echo "==========================================" + @echo " 构建后端基础镜像" + @echo " 标签: $(TIMESTAMP) / latest" + @echo "==========================================" + cd $(ROOT_DIR) && docker build -t urban-lifeline-base-serv:$(TIMESTAMP) -f docker/urbanLifeline/serv/Dockerfile.base . + docker tag urban-lifeline-base-serv:$(TIMESTAMP) urban-lifeline-base-serv:latest +ifdef SAVE + @$(MAKE) save-base +endif + +# 构建后端服务镜像 (依赖 base 镜像) +build-serv: build-base + @echo "==========================================" + @echo " 构建后端服务镜像" + @echo " 标签: $(TIMESTAMP) / latest" + @echo "==========================================" + cd $(ROOT_DIR) && docker build -t urban-lifeline-serv:$(TIMESTAMP) -f docker/urbanLifeline/serv/Dockerfile.serv . + docker tag urban-lifeline-serv:$(TIMESTAMP) urban-lifeline-serv:latest +ifdef SAVE + @$(MAKE) save-serv +endif + +# 构建前端镜像 +build-web: + @echo "==========================================" + @echo " 构建前端镜像" + @echo " 标签: $(TIMESTAMP) / latest" + @echo "==========================================" + cd $(ROOT_DIR) && docker build -t urban-lifeline-web:$(TIMESTAMP) -f docker/urbanLifeline/web/Dockerfile.web . + docker tag urban-lifeline-web:$(TIMESTAMP) urban-lifeline-web:latest +ifdef SAVE + @$(MAKE) save-web +endif + +# ============================================ +# 导出镜像 +# ============================================ + +# 创建导出目录 +$(EXPORT_DIR): + mkdir -p $(EXPORT_DIR) + +# 导出所有镜像 +save: save-pg save-base save-serv save-web + +# 导出 PostgreSQL 镜像 +save-pg: $(EXPORT_DIR) + @echo "导出 PostgreSQL 镜像..." + docker save urban-lifeline-pg:latest | gzip > $(EXPORT_DIR)/urban-lifeline-pg.tar.gz + @echo "已导出: $(EXPORT_DIR)/urban-lifeline-pg.tar.gz" + +# 导出后端基础镜像 +save-base: $(EXPORT_DIR) + @echo "导出后端基础镜像..." + docker save urban-lifeline-base-serv:latest | gzip > $(EXPORT_DIR)/urban-lifeline-base-serv.tar.gz + @echo "已导出: $(EXPORT_DIR)/urban-lifeline-base-serv.tar.gz" + +# 导出后端服务镜像 +save-serv: $(EXPORT_DIR) + @echo "导出后端服务镜像..." + docker save urban-lifeline-serv:latest | gzip > $(EXPORT_DIR)/urban-lifeline-serv.tar.gz + @echo "已导出: $(EXPORT_DIR)/urban-lifeline-serv.tar.gz" + +# 导出前端镜像 +save-web: $(EXPORT_DIR) + @echo "导出前端镜像..." + docker save urban-lifeline-web:latest | gzip > $(EXPORT_DIR)/urban-lifeline-web.tar.gz + @echo "已导出: $(EXPORT_DIR)/urban-lifeline-web.tar.gz" + +# ============================================ +# 启动/停止 +# ============================================ + +up: + cd .. && docker compose --profile all up -d + +down: + cd .. && docker compose --profile all down + +# ============================================ +# 状态查看 +# ============================================ + +ps: + docker ps --filter "name=urban-lifeline" + +status: + @echo "=== 后端服务状态 ===" + @docker exec urban-lifeline-serv /app/service-manager.sh status 2>/dev/null || echo "后端容器未运行" + @echo "" + @echo "=== 前端服务状态 ===" + @docker exec urban-lifeline-web /app/web-manager.sh status 2>/dev/null || echo "前端容器未运行" + +# ============================================ +# 日志 +# ============================================ + +logs: + cd .. && docker compose logs -f --tail=100 + +logs-serv: + docker logs -f --tail=100 urban-lifeline-serv + +logs-web: + docker logs -f --tail=100 urban-lifeline-web + +# ============================================ +# 重启单个服务 +# ============================================ + +restart-serv: + @if [ -z "$(SERVICE)" ]; then \ + echo "用法: make restart-serv SERVICE=gateway"; \ + echo "可用服务: gateway system auth file log message crontab bidding workcase platform ai"; \ + else \ + docker exec urban-lifeline-serv /app/service-manager.sh restart $(SERVICE); \ + fi + +restart-web: + @if [ -z "$(SITE)" ]; then \ + echo "用法: make restart-web SITE=platform"; \ + echo "可用站点: shared platform workcase bidding workcase_wechat"; \ + else \ + docker exec urban-lifeline-web /app/web-manager.sh restart $(SITE); \ + fi diff --git a/docker/urbanLifeline/README.md b/docker/urbanLifeline/README.md new file mode 100644 index 00000000..27051785 --- /dev/null +++ b/docker/urbanLifeline/README.md @@ -0,0 +1,124 @@ +# Urban Lifeline Docker 部署 (All-in-One) + +## 目录结构 + +``` +docker/urbanLifeline/ +├── .env.example # 环境变量示例 +├── Makefile # 快捷命令 +├── README.md # 本文档 +├── serv/ # 后端服务 +│ ├── build.sh # 构建脚本 +│ ├── Dockerfile.base # 基础镜像 +│ ├── Dockerfile.serv # 服务镜像 +│ └── service-manager.sh # 服务管理脚本 +└── web/ # 前端应用 + ├── build.sh # 构建脚本 + ├── Dockerfile.web # 前端镜像 + └── web-manager.sh # 前端管理脚本 +``` + +## 服务端口 + +### 后端服务 (urban-lifeline-serv) +| 服务 | 端口 | 说明 | +|------|------|------| +| gateway | 8080 | API 网关 | +| auth | 8081 | 认证服务 | +| system | 8082 | 系统服务 | +| log | 8083 | 日志服务 | +| file | 8084 | 文件服务 | +| message | 8085 | 消息服务 | +| crontab | 8086 | 定时任务 | +| bidding | 8087 | 招标服务 | +| workcase | 8088 | 工单服务 | +| platform | 8089 | 平台服务 | +| ai | 8090 | AI 服务 | + +### 前端应用 (urban-lifeline-web) +| 应用 | 端口 | 说明 | +|------|------|------| +| shared | 8000 | 公共模块 (Module Federation) | +| platform | 8001 | 管理平台 | +| workcase | 8002 | 工单系统 PC | +| bidding | 8003 | 招标系统 | +| workcase_wechat | 8004 | 工单微信端 | + +## 快速开始 + +### 1. 准备环境变量 +```bash +cd docker/urbanLifeline +cp .env.example .env +# 编辑 .env 配置 +``` + +### 2. 构建镜像 +```bash +# 构建后端 (需先编译 Java) +cd urbanLifelineServ && mvn clean package -DskipTests +cd docker/urbanLifeline && make build-serv + +# 构建前端 (需先构建前端) +cd urbanLifelineWeb && pnpm build +cd docker/urbanLifeline && make build-web +``` + +### 3. 启动服务 +```bash +make up +``` + +### 4. 管理服务 +```bash +# 查看状态 +make status + +# 重启单个后端服务 +make restart-serv SERVICE=gateway + +# 重启单个前端站点 +make restart-web SITE=platform + +# 查看日志 +make logs +``` + +## 配置外挂 + +容器支持配置外挂,可在运行时覆盖默认配置: + +### 后端配置目录结构 +``` +volumes/config/serv/ +├── gateway.yml # gateway 服务配置 +├── system.yml # system 服务配置 +├── auth.yml # auth 服务配置 +├── file.yml # file 服务配置 +├── log.yml # log 服务配置 +├── message.yml # message 服务配置 +├── crontab.yml # crontab 服务配置 +├── ai.yml # ai 服务配置 +├── bidding.yml # bidding 服务配置 +├── platform.yml # platform 服务配置 +└── workcase.yml # workcase 服务配置 +``` + +每个服务的配置文件会通过 `spring.config.additional-location` 加载,覆盖 JAR 包内的默认配置。 + +### 前端配置 +``` +volumes/config/web/ +├── env.js # 运行时环境变量 +└── config.json # 应用配置 +``` + +## 依赖服务 + +确保以下基础设施服务已启动: +- Nacos (服务注册/配置中心) +- PostgreSQL (数据库) +- Redis (缓存) +- MinIO (对象存储) + +通过 `docker compose --profile infra up -d` 启动基础设施。 diff --git a/docker/urbanLifeline/nginx/.env.example b/docker/urbanLifeline/nginx/.env.example new file mode 100644 index 00000000..25d71062 --- /dev/null +++ b/docker/urbanLifeline/nginx/.env.example @@ -0,0 +1,14 @@ +# ------------------------------ +# 挂载目录配置 +# ------------------------------ +# 数据目录 +DATA_ROOT=./volumes + +# 配置文件目录 +CONFIG_ROOT=./volumes + +# 配置文件位置 +CONFIG_FILE_ROOT=./volumes + +# SSL证书目录 +SSL_ROOT= \ No newline at end of file diff --git a/docker/urbanLifeline/nginx/docker-compose.yml b/docker/urbanLifeline/nginx/docker-compose.yml new file mode 100644 index 00000000..b808748f --- /dev/null +++ b/docker/urbanLifeline/nginx/docker-compose.yml @@ -0,0 +1,34 @@ +# ================================================ +# Level 1: 基础设施服务 +# Nacos, MinIO, Nginx, Jitsi Meet +# ================================================ + +services: + # ====================== Nginx 反向代理 ====================== + nginx: + image: nginx:alpine + container_name: urban-lifeline-nginx + restart: unless-stopped + networks: + - urban-lifeline + ports: + - "80:80" + - "443:443" + environment: + TZ: Asia/Shanghai + volumes: + - ${LOG_ROOT:-./volumes/nginx/logs}:/var/log/nginx + - ${CONFIG_FILE_ROOT:-./volumes/nginx.conf}:/etc/nginx/nginx.conf:ro + - ${CONFIG_ROOT:-./volumes/conf.d}:/etc/nginx/conf.d:ro + # SSL 证书(可选) + - ${SSL_ROOT:-./volumes/cert}:/etc/nginx/ssl:ro + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s + +networks: + urban-lifeline: + name: urban-lifeline diff --git a/docker/urbanLifeline/nginx/nginx/cert/server.crt b/docker/urbanLifeline/nginx/nginx/cert/server.crt new file mode 100644 index 00000000..7dfe89eb --- /dev/null +++ b/docker/urbanLifeline/nginx/nginx/cert/server.crt @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIEQjCCAqqgAwIBAgIRAMY7fF5Y4UwBxlADzNMomtswDQYJKoZIhvcNAQELBQAw +gYUxHjAcBgNVBAoTFW1rY2VydCBkZXZlbG9wbWVudCBDQTEtMCsGA1UECwwkREVT +S1RPUC1QUElTVU1WXEZLMDVAREVTS1RPUC1QUElTVU1WMTQwMgYDVQQDDCtta2Nl +cnQgREVTS1RPUC1QUElTVU1WXEZLMDVAREVTS1RPUC1QUElTVU1WMB4XDTI2MDEw +NzA4MzM0MFoXDTI4MDQwNzA4MzM0MFowWDEnMCUGA1UEChMebWtjZXJ0IGRldmVs +b3BtZW50IGNlcnRpZmljYXRlMS0wKwYDVQQLDCRERVNLVE9QLVBQSVNVTVZcRksw +NUBERVNLVE9QLVBQSVNVTVYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDSqRj6idrpU7rm4fiJg8s1KTAl5ZxIu/p76XwDRayPV8XAis0cSgzv/4DoPw2h +e4oHTZXeyvIvE+NJFShzbzGkgMNB8QepoZ28ob+uY9YueC6hizHy41zIkiu5flXx +lCEgb3lsZGpZFzqp6Ase8AimOdWy2A6FNE7EBide08J6WxvdblfPfTDgutygT+dy +aT+pWqsutWUO8qmgHmb4zwaMksobxMyfi4W2ZPn2VmXml2xw2SW4ZiMCIABMQiZQ +wZjWfZLo0dMd59POpS3SM4L7FrxpKTEZxq0m/OPZUkuIJ4xGpu5qOq8DAsDgU4v+ +C1JvBr6H/GJ0f5cFShPCXFlrAgMBAAGjWTBXMA4GA1UdDwEB/wQEAwIFoDATBgNV +HSUEDDAKBggrBgEFBQcDATAfBgNVHSMEGDAWgBQTBX2ybplAWySTzNHzceSAS9MH +wDAPBgNVHREECDAGhwTAqIKDMA0GCSqGSIb3DQEBCwUAA4IBgQCMVPuwe9iOJW6A +Cvb2lLTVCkfqn0jXgSOzEfP7j0eV01ayXpsFiNX4z0b6ACX4HNkjUFT7r3h/zVbu +JyYIEbHHwiqZXCaAg5QENqvPqzx34eHNROFEixBH1Y1VgiEEiKP5QOiTxIQLvcls +TSsXMeg58bYNYB0zmQ0wRe+r88nIkNU8R+J4BFbkgSeZch3ScXi15hfyItw81546 +hYK1ncMH3r8ZLzKcOQEnSw4SAJTMUPmePwr7GlqIhpFRnidyvx1cK8jR3FnJnoQn +/871s0dYk8ZuBk+mgFMDXXg6wq5oS2xs79BG3/4RaJciL5jtRg6vB36YfclliPfw +mfr3ypJRKusAipPsfPvdcM37GmemzWLb2EYjN+w0oHo7v1uaV8iyNDVIxKxjvGub +9k8VDkT9Ub+cawrH/oECS+avFqViqKUQy0TyG/eHTRV5chQnlnellDy/HnladS+7 +0rvCWOGvnlpvGSQBiCr/iNPhiJhvs0J5m3jBAfml9C5YmY7/900= +-----END CERTIFICATE----- diff --git a/docker/urbanLifeline/nginx/nginx/cert/server.key b/docker/urbanLifeline/nginx/nginx/cert/server.key new file mode 100644 index 00000000..21dacc3e --- /dev/null +++ b/docker/urbanLifeline/nginx/nginx/cert/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDSqRj6idrpU7rm +4fiJg8s1KTAl5ZxIu/p76XwDRayPV8XAis0cSgzv/4DoPw2he4oHTZXeyvIvE+NJ +FShzbzGkgMNB8QepoZ28ob+uY9YueC6hizHy41zIkiu5flXxlCEgb3lsZGpZFzqp +6Ase8AimOdWy2A6FNE7EBide08J6WxvdblfPfTDgutygT+dyaT+pWqsutWUO8qmg +Hmb4zwaMksobxMyfi4W2ZPn2VmXml2xw2SW4ZiMCIABMQiZQwZjWfZLo0dMd59PO +pS3SM4L7FrxpKTEZxq0m/OPZUkuIJ4xGpu5qOq8DAsDgU4v+C1JvBr6H/GJ0f5cF +ShPCXFlrAgMBAAECggEAMlwQR5x7A7prfNRaaO1jv8Kn6vdYBB9EAylO5y1Z0i6m +bKAB5phhPWJ0O5EPPiJdXd+TS15yxQRZGlh/ghD76hqKExJ+xXOIVNbKDvN4+UTr +yNyQxULLJHulDkQAYa8KuElN2raqob+m24VIW04Ak1RSHN3/oqJdjgj2knnHDR6Z +b6OwZhF/Axpj45RA3nlD93G6Orb34QEnPxgRig0ma3/xLxU4rpbLd73tDDSk8uDH +z7OAgv/n//TnDTZ8OltRDGY7gUOI1eLqj6Pa/3grwJDPxgO2y4RXO/o6kEMFySPi +8RrvOGElINO60UhgODFe1oPJW05pZnorJz5jjHtAuQKBgQDam2LL18H47DIvARkj +bdOr7LgHvi1NNCLxOCnECTHs6Ns44Q+0xUDIf04iBr8AvcHyvspPg6mLRgTojT4t +HFujQ991RchHAbF2gMqGZQ9wn83bpaDWN9Ig2drYx2fkWwIerwuNuTV/es7gELhb +oWGhyh86syl9PO3Elab/h6jbPQKBgQD2sb5rw+9bw0tvi+XLFM7K+JeQsLZTblyd +4dCUdOvNd8GfImMBJKGq20SVM2yQtq/ATzphK5Al0GKtsnlSGOfGSgfJ4sd/xD3O +6Fe+Q7MgHoXnEuvNyEQ1wlEDGrae3FVih7XHJ60J+6XKaJQv6VdeQmVq2IlrOU8H +ofSiv+RxxwKBgQCxTUnqDopSfC+PlBJxe8gsLwhrr0FK1rhocKbfSp3lik8TaOa2 +NS3/79DNJC+SSFWfrkKkDyNZxGaCvtvo9pEUcB4zHW/8t1DZzkd0jU7ih5oNRd6X +IBsbbdZj8AdBXNbxUAPM5KSRSmezr5v3JYLsF+UQVPOXke0+fio+Iic/+QKBgFuG +yKp88IJwK72//srg9nRR1RHmrk64BH7DODrMQmxiASFEhcz3xU95uLFOefoa/Yvx +GSzSF9IfxWzCacau3NcxwkAB9piNu4zXoS5DOeMxz+ZSm9AmfEAhzyLCt3yrLLa4 +uRWhv86TYgh90nUQMs0S/0OsARgaFBs12GjFn0EjAoGAVz2vvNKi6F6kunm055T/ +vhgB28Qt2EojcOQeQ9ARTH/VuPDMjTmbU6iip0mFRImUmFnSKY4+4+K7HAB9oxHG +w1/sPsymosVrgPKloJ3vU7yJI2JYgbsjZRhscPYE7Ir7mVhlNyuO6wJOHGK7Lex2 +MR2JpfmcOIHRRqrwAa+Gmss= +-----END PRIVATE KEY----- diff --git a/docker/urbanLifeline/nginx/nginx/conf.d/default.conf b/docker/urbanLifeline/nginx/nginx/conf.d/default.conf new file mode 100644 index 00000000..6ea53116 --- /dev/null +++ b/docker/urbanLifeline/nginx/nginx/conf.d/default.conf @@ -0,0 +1,151 @@ +# ================================================ +# Urban Lifeline - 站点配置 (All-in-One 模式) +# ================================================ + +# 上游服务定义 - 后端 All-in-One 容器 +upstream gateway { + server urban-lifeline-serv:8080; + keepalive 32; +} + +# 上游服务定义 - 前端 All-in-One 容器 +upstream shared { + server urban-lifeline-web:8000; +} + +upstream platform { + server urban-lifeline-web:8001; +} + +upstream workcase-web { + server urban-lifeline-web:8002; +} + +upstream bidding-web { + server urban-lifeline-web:8003; +} + +upstream workcase-wechat { + server urban-lifeline-web:8004; +} + +# HTTP 重定向到 HTTPS +server { + listen 80; + server_name localhost; + return 301 https://$host$request_uri; +} + +# HTTPS 服务 +server { + listen 443 ssl; + server_name localhost; + + # SSL 证书配置 + ssl_certificate /etc/nginx/ssl/server.crt; + ssl_certificate_key /etc/nginx/ssl/server.key; + + # SSL 安全配置 + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305; + ssl_prefer_server_ciphers on; + ssl_session_cache shared:SSL:10m; + ssl_session_timeout 10m; + + # 健康检查端点 + location /health { + access_log off; + return 200 "healthy\n"; + add_header Content-Type text/plain; + } + + # ====================== 前端应用代理 ====================== + + # Shared 公共模块 (Module Federation 远程模块) + location /shared/ { + proxy_pass http://shared/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # 允许跨域 (Module Federation 需要) + add_header Access-Control-Allow-Origin *; + add_header Access-Control-Allow-Methods "GET, OPTIONS"; + add_header Access-Control-Allow-Headers "Origin, Content-Type, Accept"; + } + + # Platform 管理平台 + location /platform/ { + proxy_pass http://platform/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Workcase 工单系统 PC端 + location /workcase/ { + proxy_pass http://workcase-web/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Bidding 招标系统 + location /bidding/ { + proxy_pass http://bidding-web/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Workcase 工单系统微信端 + location /workcase-wechat/ { + proxy_pass http://workcase-wechat/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # 默认首页(重定向到 platform) + location = / { + return 302 /platform/; + } + + # ====================== API 代理 ====================== + + # 后端 API 代理 + location /urban-lifeline/ { + proxy_pass http://gateway; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # WebSocket 支持 + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + # 超时设置 + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + } + + # ====================== 错误页面 ====================== + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} + diff --git a/docker/nginx/nginx.dev.conf b/docker/urbanLifeline/nginx/nginx/nginx.conf similarity index 65% rename from docker/nginx/nginx.dev.conf rename to docker/urbanLifeline/nginx/nginx/nginx.conf index ce5a2fac..ed8a2477 100644 --- a/docker/nginx/nginx.dev.conf +++ b/docker/urbanLifeline/nginx/nginx/nginx.conf @@ -1,3 +1,7 @@ +# ================================================ +# Urban Lifeline - Nginx 主配置 +# ================================================ + user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; @@ -6,6 +10,7 @@ pid /var/run/nginx.pid; events { worker_connections 1024; use epoll; + multi_accept on; } http { @@ -29,14 +34,14 @@ http { # Gzip 压缩 gzip on; gzip_vary on; - gzip_min_length 1024; + gzip_proxied any; gzip_comp_level 6; - gzip_types text/plain text/css text/xml text/javascript - application/javascript application/json application/xml+rss; + gzip_types text/plain text/css text/xml application/json application/javascript + application/xml application/xml+rss text/javascript application/x-javascript; - # 上传大小限制 + # 上传文件大小限制 client_max_body_size 100M; - # 包含具体配置 + # 引入站点配置 include /etc/nginx/conf.d/*.conf; } diff --git a/docker/urbanLifeline/nginx/volumes/cert/server.crt b/docker/urbanLifeline/nginx/volumes/cert/server.crt new file mode 100644 index 00000000..7dfe89eb --- /dev/null +++ b/docker/urbanLifeline/nginx/volumes/cert/server.crt @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIEQjCCAqqgAwIBAgIRAMY7fF5Y4UwBxlADzNMomtswDQYJKoZIhvcNAQELBQAw +gYUxHjAcBgNVBAoTFW1rY2VydCBkZXZlbG9wbWVudCBDQTEtMCsGA1UECwwkREVT +S1RPUC1QUElTVU1WXEZLMDVAREVTS1RPUC1QUElTVU1WMTQwMgYDVQQDDCtta2Nl +cnQgREVTS1RPUC1QUElTVU1WXEZLMDVAREVTS1RPUC1QUElTVU1WMB4XDTI2MDEw +NzA4MzM0MFoXDTI4MDQwNzA4MzM0MFowWDEnMCUGA1UEChMebWtjZXJ0IGRldmVs +b3BtZW50IGNlcnRpZmljYXRlMS0wKwYDVQQLDCRERVNLVE9QLVBQSVNVTVZcRksw +NUBERVNLVE9QLVBQSVNVTVYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDSqRj6idrpU7rm4fiJg8s1KTAl5ZxIu/p76XwDRayPV8XAis0cSgzv/4DoPw2h +e4oHTZXeyvIvE+NJFShzbzGkgMNB8QepoZ28ob+uY9YueC6hizHy41zIkiu5flXx +lCEgb3lsZGpZFzqp6Ase8AimOdWy2A6FNE7EBide08J6WxvdblfPfTDgutygT+dy +aT+pWqsutWUO8qmgHmb4zwaMksobxMyfi4W2ZPn2VmXml2xw2SW4ZiMCIABMQiZQ +wZjWfZLo0dMd59POpS3SM4L7FrxpKTEZxq0m/OPZUkuIJ4xGpu5qOq8DAsDgU4v+ +C1JvBr6H/GJ0f5cFShPCXFlrAgMBAAGjWTBXMA4GA1UdDwEB/wQEAwIFoDATBgNV +HSUEDDAKBggrBgEFBQcDATAfBgNVHSMEGDAWgBQTBX2ybplAWySTzNHzceSAS9MH +wDAPBgNVHREECDAGhwTAqIKDMA0GCSqGSIb3DQEBCwUAA4IBgQCMVPuwe9iOJW6A +Cvb2lLTVCkfqn0jXgSOzEfP7j0eV01ayXpsFiNX4z0b6ACX4HNkjUFT7r3h/zVbu +JyYIEbHHwiqZXCaAg5QENqvPqzx34eHNROFEixBH1Y1VgiEEiKP5QOiTxIQLvcls +TSsXMeg58bYNYB0zmQ0wRe+r88nIkNU8R+J4BFbkgSeZch3ScXi15hfyItw81546 +hYK1ncMH3r8ZLzKcOQEnSw4SAJTMUPmePwr7GlqIhpFRnidyvx1cK8jR3FnJnoQn +/871s0dYk8ZuBk+mgFMDXXg6wq5oS2xs79BG3/4RaJciL5jtRg6vB36YfclliPfw +mfr3ypJRKusAipPsfPvdcM37GmemzWLb2EYjN+w0oHo7v1uaV8iyNDVIxKxjvGub +9k8VDkT9Ub+cawrH/oECS+avFqViqKUQy0TyG/eHTRV5chQnlnellDy/HnladS+7 +0rvCWOGvnlpvGSQBiCr/iNPhiJhvs0J5m3jBAfml9C5YmY7/900= +-----END CERTIFICATE----- diff --git a/docker/urbanLifeline/nginx/volumes/cert/server.key b/docker/urbanLifeline/nginx/volumes/cert/server.key new file mode 100644 index 00000000..21dacc3e --- /dev/null +++ b/docker/urbanLifeline/nginx/volumes/cert/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDSqRj6idrpU7rm +4fiJg8s1KTAl5ZxIu/p76XwDRayPV8XAis0cSgzv/4DoPw2he4oHTZXeyvIvE+NJ +FShzbzGkgMNB8QepoZ28ob+uY9YueC6hizHy41zIkiu5flXxlCEgb3lsZGpZFzqp +6Ase8AimOdWy2A6FNE7EBide08J6WxvdblfPfTDgutygT+dyaT+pWqsutWUO8qmg +Hmb4zwaMksobxMyfi4W2ZPn2VmXml2xw2SW4ZiMCIABMQiZQwZjWfZLo0dMd59PO +pS3SM4L7FrxpKTEZxq0m/OPZUkuIJ4xGpu5qOq8DAsDgU4v+C1JvBr6H/GJ0f5cF +ShPCXFlrAgMBAAECggEAMlwQR5x7A7prfNRaaO1jv8Kn6vdYBB9EAylO5y1Z0i6m +bKAB5phhPWJ0O5EPPiJdXd+TS15yxQRZGlh/ghD76hqKExJ+xXOIVNbKDvN4+UTr +yNyQxULLJHulDkQAYa8KuElN2raqob+m24VIW04Ak1RSHN3/oqJdjgj2knnHDR6Z +b6OwZhF/Axpj45RA3nlD93G6Orb34QEnPxgRig0ma3/xLxU4rpbLd73tDDSk8uDH +z7OAgv/n//TnDTZ8OltRDGY7gUOI1eLqj6Pa/3grwJDPxgO2y4RXO/o6kEMFySPi +8RrvOGElINO60UhgODFe1oPJW05pZnorJz5jjHtAuQKBgQDam2LL18H47DIvARkj +bdOr7LgHvi1NNCLxOCnECTHs6Ns44Q+0xUDIf04iBr8AvcHyvspPg6mLRgTojT4t +HFujQ991RchHAbF2gMqGZQ9wn83bpaDWN9Ig2drYx2fkWwIerwuNuTV/es7gELhb +oWGhyh86syl9PO3Elab/h6jbPQKBgQD2sb5rw+9bw0tvi+XLFM7K+JeQsLZTblyd +4dCUdOvNd8GfImMBJKGq20SVM2yQtq/ATzphK5Al0GKtsnlSGOfGSgfJ4sd/xD3O +6Fe+Q7MgHoXnEuvNyEQ1wlEDGrae3FVih7XHJ60J+6XKaJQv6VdeQmVq2IlrOU8H +ofSiv+RxxwKBgQCxTUnqDopSfC+PlBJxe8gsLwhrr0FK1rhocKbfSp3lik8TaOa2 +NS3/79DNJC+SSFWfrkKkDyNZxGaCvtvo9pEUcB4zHW/8t1DZzkd0jU7ih5oNRd6X +IBsbbdZj8AdBXNbxUAPM5KSRSmezr5v3JYLsF+UQVPOXke0+fio+Iic/+QKBgFuG +yKp88IJwK72//srg9nRR1RHmrk64BH7DODrMQmxiASFEhcz3xU95uLFOefoa/Yvx +GSzSF9IfxWzCacau3NcxwkAB9piNu4zXoS5DOeMxz+ZSm9AmfEAhzyLCt3yrLLa4 +uRWhv86TYgh90nUQMs0S/0OsARgaFBs12GjFn0EjAoGAVz2vvNKi6F6kunm055T/ +vhgB28Qt2EojcOQeQ9ARTH/VuPDMjTmbU6iip0mFRImUmFnSKY4+4+K7HAB9oxHG +w1/sPsymosVrgPKloJ3vU7yJI2JYgbsjZRhscPYE7Ir7mVhlNyuO6wJOHGK7Lex2 +MR2JpfmcOIHRRqrwAa+Gmss= +-----END PRIVATE KEY----- diff --git a/docker/urbanLifeline/nginx/volumes/conf.d/default.conf b/docker/urbanLifeline/nginx/volumes/conf.d/default.conf new file mode 100644 index 00000000..64994879 --- /dev/null +++ b/docker/urbanLifeline/nginx/volumes/conf.d/default.conf @@ -0,0 +1,181 @@ +# ================================================ +# Urban Lifeline - 站点配置 (All-in-One 模式) +# ================================================ + +# 上游服务定义 - 后端 All-in-One 容器 +upstream gateway { + server urban-lifeline-serv:8080; + keepalive 32; +} + +# 上游服务定义 - 前端 All-in-One 容器 +upstream shared { + server urban-lifeline-web:8000; +} + +upstream platform { + server urban-lifeline-web:8001; +} + +upstream workcase-web { + server urban-lifeline-web:8002; +} + +upstream bidding-web { + server urban-lifeline-web:8003; +} + +upstream workcase-wechat { + server urban-lifeline-web:8004; +} + +# HTTP 重定向到 HTTPS +server { + listen 80; + server_name localhost; + return 301 https://$host$request_uri; +} + +# HTTPS 服务 +server { + listen 443 ssl; + server_name localhost; + + # SSL 证书配置 + ssl_certificate /etc/nginx/ssl/server.crt; + ssl_certificate_key /etc/nginx/ssl/server.key; + + # SSL 安全配置 + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305; + ssl_prefer_server_ciphers on; + ssl_session_cache shared:SSL:10m; + ssl_session_timeout 10m; + + # 健康检查端点 + location /health { + access_log off; + return 200 "healthy\n"; + add_header Content-Type text/plain; + } + + # ====================== 前端应用代理 ====================== + + # Shared 公共模块 (Module Federation 远程模块) + location /shared/ { + proxy_pass http://shared/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # 允许跨域 (Module Federation 需要) + add_header Access-Control-Allow-Origin *; + add_header Access-Control-Allow-Methods "GET, OPTIONS"; + add_header Access-Control-Allow-Headers "Origin, Content-Type, Accept"; + } + + # Platform 管理平台 + location /platform/ { + # 优先尝试文件,如果不存在则返回 index.html(SPA history 模式) + proxy_pass http://platform/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # SPA fallback - 404时返回index.html让Vue Router处理 + proxy_intercept_errors on; + error_page 404 = @platform_fallback; + } + + location @platform_fallback { + # 重写为根路径的 index.html,保留原始 URI 让前端路由处理 + rewrite ^/platform/(.*)$ /platform/index.html break; + proxy_pass http://platform; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Workcase 工单系统 PC端 + location /workcase/ { + proxy_pass http://workcase-web/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # SPA fallback - 404时返回index.html让Vue Router处理 + proxy_intercept_errors on; + error_page 404 = @workcase_fallback; + } + + location @workcase_fallback { + # 重写为根路径的 index.html,保留原始 URI 让前端路由处理 + rewrite ^/workcase/(.*)$ /workcase/index.html break; + proxy_pass http://workcase-web; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Bidding 招标系统 + location /bidding/ { + proxy_pass http://bidding-web/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Workcase 工单系统微信端 + location /workcase-wechat/ { + proxy_pass http://workcase-wechat/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # 默认首页(重定向到 platform) + location = / { + return 302 /platform/; + } + + # ====================== API 代理 ====================== + + # 后端 API 代理 + location /urban-lifeline/ { + proxy_pass http://gateway/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + # WebSocket 支持 + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + # 超时设置 + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + } + + # ====================== 错误页面 ====================== + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} diff --git a/docker/urbanLifeline/nginx/volumes/nginx.conf b/docker/urbanLifeline/nginx/volumes/nginx.conf new file mode 100644 index 00000000..ed8a2477 --- /dev/null +++ b/docker/urbanLifeline/nginx/volumes/nginx.conf @@ -0,0 +1,47 @@ +# ================================================ +# Urban Lifeline - Nginx 主配置 +# ================================================ + +user nginx; +worker_processes auto; +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; + use epoll; + multi_accept on; +} + +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + + # 日志格式 + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + # 性能优化 + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + + # Gzip 压缩 + gzip on; + gzip_vary on; + gzip_proxied any; + gzip_comp_level 6; + gzip_types text/plain text/css text/xml application/json application/javascript + application/xml application/xml+rss text/javascript application/x-javascript; + + # 上传文件大小限制 + client_max_body_size 100M; + + # 引入站点配置 + include /etc/nginx/conf.d/*.conf; +} diff --git a/docker/urbanLifeline/postgres/.env.example b/docker/urbanLifeline/postgres/.env.example new file mode 100644 index 00000000..256f99f7 --- /dev/null +++ b/docker/urbanLifeline/postgres/.env.example @@ -0,0 +1,33 @@ +# ================================================ +# PostgreSQL 配置 +# 复制此文件为 .env 并修改配置 +# ================================================ + +# ------------------------------ +# PostgreSQL 版本 +# ------------------------------ +POSTGRES_VERSION=latest + +# ------------------------------ +# 端口配置 +# ------------------------------ +POSTGRES_PORT=5432 + +# ------------------------------ +# 数据库配置 +# ------------------------------ +POSTGRES_USER=postgres +POSTGRES_PASSWORD=postgres123456 +POSTGRES_DB=urban_lifeline + +# ------------------------------ +# 挂载目录配置 +# ------------------------------ +# 数据目录 +DATA_ROOT=./volumes + +# 日志目录 +LOG_ROOT=./volumes + +# 配置文件目录 +CONFIG_ROOT=./volumes diff --git a/docker/urbanLifeline/postgres/Dockerfile.pg b/docker/urbanLifeline/postgres/Dockerfile.pg new file mode 100644 index 00000000..9418c6ad --- /dev/null +++ b/docker/urbanLifeline/postgres/Dockerfile.pg @@ -0,0 +1,106 @@ +# ================================================ +# Urban Lifeline - PostgreSQL 数据库镜像 +# 支持初始化脚本和自定义配置 +# ================================================ + +FROM postgres:16-alpine + +# 设置环境变量 +ENV LANG=C.UTF-8 \ + TZ=Asia/Shanghai \ + PGCLIENTENCODING=UTF8 + +# 安装时区数据(contrib 扩展已包含在官方 postgres 镜像中) +RUN apk add --no-cache tzdata \ + && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && echo "Asia/Shanghai" > /etc/timezone + +# 创建初始化目录 +RUN mkdir -p /docker-entrypoint-initdb.d /opt/sql + +# 复制初始化脚本和 SQL 文件 +COPY init/sql/ /opt/sql/ +COPY init/bin.sh /opt/bin.sh + +# 创建 Docker 初始化入口脚本 +RUN cat > /docker-entrypoint-initdb.d/01-init-database.sh <<'EOF' +#!/bin/bash +set -e + +echo "==========================================" +echo "Urban Lifeline - PostgreSQL 数据库初始化" +echo "==========================================" + +# 设置环境变量 +export PGCLIENTENCODING=UTF8 + +# 检查数据库是否已初始化(通过检查初始化状态表) +check_initialized() { + # 先检查数据库是否存在 + if ! psql -U "$POSTGRES_USER" -d "postgres" -tAc "SELECT 1 FROM pg_database WHERE datname = '$POSTGRES_DB'" | grep -q 1; then + return 1 # 数据库不存在,需要初始化 + fi + + # 检查初始化状态表是否存在且标记为成功 + if psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -tAc "SELECT 1 FROM _db_init_status WHERE script_name = '01-init-database.sh' AND status = 'success'" 2>/dev/null | grep -q 1; then + return 0 # 已初始化 + fi + + return 1 # 未初始化 +} + +# 检查是否已经初始化 +if check_initialized; then + echo "==========================================" + echo "✅ 数据库已初始化,跳过初始化步骤" + echo "==========================================" + exit 0 +fi + +echo "首次启动,开始初始化数据库..." + +cd /opt/sql + +# 执行 initAll.sql(包含创建数据库、表结构和初始数据) +echo "执行数据库初始化脚本..." +psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "postgres" -f initAll.sql + +if [ $? -ne 0 ]; then + echo "==========================================" + echo "❌ 数据库初始化失败!" + echo "==========================================" + exit 1 +fi + +# 创建初始化状态表并标记完成 +echo "标记初始化状态..." +psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL + -- 创建初始化状态表 + CREATE TABLE IF NOT EXISTS _db_init_status ( + id SERIAL PRIMARY KEY, + script_name VARCHAR(255) NOT NULL UNIQUE, + executed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + status VARCHAR(50) DEFAULT 'init' + ); + + -- 标记初始化完成 + INSERT INTO _db_init_status (script_name, status) + VALUES ('01-init-database.sh', 'success') + ON CONFLICT (script_name) DO UPDATE SET status = 'success', executed_at = CURRENT_TIMESTAMP; +EOSQL + +echo "==========================================" +echo "✅ 数据库初始化完成!" +echo "==========================================" +EOF + +# 设置执行权限 +RUN chmod +x /docker-entrypoint-initdb.d/01-init-database.sh \ + && chmod +x /opt/bin.sh + +# 暴露端口 +EXPOSE 5432 + +# 健康检查 +HEALTHCHECK --interval=10s --timeout=5s --retries=5 --start-period=60s \ + CMD pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-urban_lifeline} || exit 1 diff --git a/docker/urbanLifeline/postgres/docker-compose.yml b/docker/urbanLifeline/postgres/docker-compose.yml new file mode 100644 index 00000000..2f500ebe --- /dev/null +++ b/docker/urbanLifeline/postgres/docker-compose.yml @@ -0,0 +1,65 @@ +# ================================================ +# Urban Lifeline - PostgreSQL 数据库 +# ================================================ + +services: + postgres: + image: urban-lifeline-pg:${POSTGRES_VERSION:-latest} + container_name: urban-lifeline-pg + restart: unless-stopped + env_file: + - .env + networks: + - urban-lifeline + ports: + - "${POSTGRES_PORT:-5432}:5432" + environment: + POSTGRES_USER: ${POSTGRES_USER:-postgres} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres123456} + POSTGRES_DB: ${POSTGRES_DB:-urban_lifeline} + TZ: Asia/Shanghai + PGTZ: Asia/Shanghai + PGCLIENTENCODING: UTF8 + volumes: + # 数据目录 + - ${DATA_ROOT:-./volumes}/data:/var/lib/postgresql/data + # 日志目录 + - ${LOG_ROOT:-./volumes}/logs:/var/log/postgresql + # 配置文件目录(可选,用于自定义 postgresql.conf) + - ${CONFIG_ROOT:-./volumes}/config:/etc/postgresql/conf.d:ro + command: + - "postgres" + - "-c" + - "max_connections=200" + - "-c" + - "shared_buffers=256MB" + - "-c" + - "effective_cache_size=768MB" + - "-c" + - "maintenance_work_mem=64MB" + - "-c" + - "checkpoint_completion_target=0.9" + - "-c" + - "wal_buffers=16MB" + - "-c" + - "default_statistics_target=100" + - "-c" + - "random_page_cost=1.1" + - "-c" + - "effective_io_concurrency=200" + - "-c" + - "log_timezone=Asia/Shanghai" + - "-c" + - "timezone=Asia/Shanghai" + - "-c" + - "client_encoding=UTF8" + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-urban_lifeline}"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 60s + +networks: + urban-lifeline: + name: urban-lifeline diff --git a/docker/urbanLifeline/postgres/init/bin.sh b/docker/urbanLifeline/postgres/init/bin.sh new file mode 100644 index 00000000..672ba116 --- /dev/null +++ b/docker/urbanLifeline/postgres/init/bin.sh @@ -0,0 +1,290 @@ + +#!/bin/bash + +# 定义颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# 设置脚本所在目录为工作目录 +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +SQL_DIR="${SCRIPT_DIR}/sql" + +# 打印带时间戳的日志 +log() { + local level=$1 + local message=$2 + local color=$NC + + case $level in + "INFO") color=$BLUE;; + "SUCCESS") color=$GREEN;; + "WARN") color=$YELLOW;; + "ERROR") color=$RED;; + esac + + echo -e "[$(date '+%Y-%m-%d %H:%M:%S')] ${color}${level}${NC}: ${message}" +} + +# 数据库连接信息(可通过环境变量覆盖) +DB_HOST=${POSTGRES_HOST:-"localhost"} +DB_PORT=${POSTGRES_PORT:-"5432"} +DB_NAME=${POSTGRES_DB:-"urban_lifeline"} +DB_USER=${POSTGRES_USER:-"postgres"} +DB_PASSWORD=${POSTGRES_PASSWORD:-"postgres"} + +# 设置 PSQL 环境变量以支持中文 +export PGCLIENTENCODING=UTF8 + +# 检查psql命令是否可用 +check_psql() { + if ! command -v psql &> /dev/null; then + echo -e "${RED}Error: psql command not found. Please install PostgreSQL client.${NC}" + exit 1 + fi +} + +# 检查并创建数据库用户 +check_and_create_user() { + local new_user=$1 + local new_password=$2 + + # 使用 postgres 用户执行 + if sudo -u postgres psql -c "SELECT 1 FROM pg_roles WHERE rolname = '$new_user'" | grep -q 1; then + echo -e "${GREEN}User $new_user already exists${NC}" + else + echo -e "${YELLOW}Creating user $new_user...${NC}" + sudo -u postgres psql -c "CREATE USER $new_user WITH PASSWORD '$new_password' CREATEDB;" + if [ $? -eq 0 ]; then + echo -e "${GREEN}User $new_user created successfully${NC}" + else + echo -e "${RED}Failed to create user $new_user${NC}" + exit 1 + fi + fi +} + +# 检查数据库连接 +check_db_connection() { + # 首先尝试以当前用户身份连接 + if ! psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "postgres" -c '\q' &> /dev/null; then + echo -e "${YELLOW}Could not connect with current settings, attempting to create user...${NC}" + # 创建用户并设置权限 + check_and_create_user "$DB_USER" "$DB_PASSWORD" + + # 再次检查连接 + if ! psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "postgres" -c '\q' &> /dev/null; then + echo -e "${RED}Error: Could not connect to PostgreSQL server.${NC}" + echo "Please check your connection settings:" + echo "Host: $DB_HOST" + echo "Port: $DB_PORT" + echo "User: $DB_USER" + exit 1 + fi + fi +} + +# 执行SQL文件 +execute_sql_file() { + local sql_file=$1 + if [ ! -f "$sql_file" ]; then + echo -e "${RED}Error: SQL file not found: $sql_file${NC}" + return 1 + fi + + echo -e "${YELLOW}Executing SQL file: $sql_file${NC}" + PGPASSWORD=$DB_PASSWORD psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -f "$sql_file" + local status=$? + if [ $status -eq 0 ]; then + echo -e "${GREEN}Successfully executed: $sql_file${NC}" + else + echo -e "${RED}Failed to execute: $sql_file${NC}" + return $status + fi +} + +# 初始化数据库 +init() { + echo -e "${YELLOW}Initializing database...${NC}" + + # 执行完整的初始化脚本 + log "INFO" "Executing initialization script..." + # Run from inside the SQL_DIR so relative \i includes in initAll.sql (like createDB.sql) + # resolve relative to the SQL directory. + ( + if [ ! -d "$SQL_DIR" ]; then + echo -e "${RED}Error: SQL directory not found: $SQL_DIR${NC}" + exit 1 + fi + cd "$SQL_DIR" || exit 1 + PGPASSWORD=$DB_PASSWORD psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "postgres" -v ON_ERROR_STOP=1 -f "initAll.sql" + ) + + if [ $? -eq 0 ]; then + log "SUCCESS" "Database initialization completed successfully" + else + log "ERROR" "Database initialization failed" + return 1 + fi + + if [ $? -ne 0 ]; then + echo -e "${RED}Failed to create database.${NC}" + return 1 + fi + + # 2. 创建扩展和设置搜索路径 + echo -e "${YELLOW}Creating extensions...${NC}" + check_extensions_availability() { + # 检查服务器上是否存在需创建的扩展 + local missing=() + local exts=("uuid-ossp" "pg_trgm" "btree_gist") + for ext in "${exts[@]}"; do + # 查询 pg_available_extensions 来判断扩展是否已安装到服务器目录 + if ! PGPASSWORD=$DB_PASSWORD psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -tAc "SELECT 1 FROM pg_available_extensions WHERE name = '$ext';" | grep -q 1; then + missing+=("$ext") + fi + done + + if [ ${#missing[@]} -ne 0 ]; then + echo -e "${RED}Error: The following server-side extensions are not available: ${missing[*]}${NC}" + echo "If you compiled PostgreSQL from source, you need to build and install the contrib modules into the server's installation prefix. Example steps:" + echo " # 在 PostgreSQL 源码目录下运行:" + echo " cd /path/to/postgresql-source/contrib" + echo " make" + echo " sudo make install" + echo "或者只安装缺失的模块(例如 uuid-ossp):" + echo " cd /path/to/postgresql-source/contrib/uuid-ossp" + echo " make" + echo " sudo make install" + echo "安装完成后,重启 PostgreSQL 服务并重新运行此脚本:" + echo " sudo systemctl restart postgresql" + echo "如果你使用的是容器或自定义路径,请确保将编译安装的扩展安装到 PostgreSQL 的 \$(pg_config --sharedir)/extension 目录下。" + return 1 + fi + return 0 + } + + # 检查扩展可用性,若缺失则给出建议并退出 + if ! check_extensions_availability; then + return 1 + fi + + PGPASSWORD=$DB_PASSWORD psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c " + CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\"; + CREATE EXTENSION IF NOT EXISTS \"pg_trgm\"; + CREATE EXTENSION IF NOT EXISTS \"btree_gist\";" + + if [ $? -ne 0 ]; then + echo -e "${RED}Failed to create extensions.${NC}" + return 1 + fi + + # 3. 逐个执行初始化SQL文件 + echo -e "${YELLOW}Initializing tables...${NC}" + while IFS= read -r line || [[ -n "$line" ]]; do + # 跳过注释和空行 + [[ $line =~ ^--.*$ ]] && continue + [[ -z "${line// }" ]] && continue + + # 从 \i 命令中提取文件名 + if [[ $line =~ \\i[[:space:]]+([^[:space:]]+) ]]; then + sql_file="${SQL_DIR}/${BASH_REMATCH[1]}" + if [[ $sql_file != *"createDB.sql"* ]]; then # 跳过createDB.sql + echo -e "${YELLOW}Executing: $sql_file${NC}" + PGPASSWORD=$DB_PASSWORD psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -f "$sql_file" + if [ $? -ne 0 ]; then + echo -e "${RED}Failed to execute: $sql_file${NC}" + return 1 + fi + fi + fi + done < "${SQL_DIR}/initAll.sql" + + # 4. 设置搜索路径 + echo -e "${YELLOW}Setting search path...${NC}" + PGPASSWORD=$DB_PASSWORD psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" -c " + ALTER DATABASE $DB_NAME SET search_path TO sys, public;" + + echo -e "${GREEN}Database initialization completed successfully.${NC}" + return 0 +} + +# 重新初始化数据库 +reinit() { + echo -e "${YELLOW}Reinitializing database...${NC}" + delete + init +} + +# 删除数据库 +delete() { + echo -e "${YELLOW}Deleting database...${NC}" + + # 多次尝试终止连接(因为某些连接可能会立即重连) + for i in {1..3}; do + log "INFO" "Terminating database connections (attempt $i/3)..." + PGPASSWORD=$DB_PASSWORD psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "postgres" -c " + SELECT pg_terminate_backend(pg_stat_activity.pid) + FROM pg_stat_activity + WHERE pg_stat_activity.datname = '$DB_NAME' + AND pid <> pg_backend_pid();" > /dev/null 2>&1 + + # 等待连接完全关闭 + sleep 1 + done + + # 尝试删除数据库,最多重试3次 + for i in {1..3}; do + log "INFO" "Attempting to drop database (attempt $i/3)..." + if PGPASSWORD=$DB_PASSWORD psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "postgres" -c "DROP DATABASE IF EXISTS $DB_NAME;" 2>&1; then + log "SUCCESS" "Database deleted successfully" + return 0 + else + log "WARN" "Failed to drop database, retrying after 2 seconds..." + sleep 2 + fi + done + + log "ERROR" "Failed to delete database after 3 attempts" + log "ERROR" "Please ensure all connections to the database are closed, including:" + log "ERROR" " - Running application servers" + log "ERROR" " - IDE database connections" + log "ERROR" " - pgAdmin or other database tools" + return 1 +} + +# 显示帮助信息 +show_help() { + echo "Usage: $0 {init|reinit|delete}" + echo "Commands:" + echo " init Initialize the database" + echo " reinit Reinitialize the database (delete and create)" + echo " delete Delete the database" +} + +# 主函数 +main() { + check_psql + check_db_connection + + case "$1" in + "init") + init + ;; + "reinit") + reinit + ;; + "delete") + delete + ;; + *) + show_help + exit 1 + ;; + esac +} + +# Call main with all passed arguments so the script runs when invoked +main "$@" \ No newline at end of file diff --git a/docker/urbanLifeline/postgres/init/sql/createDB.sql b/docker/urbanLifeline/postgres/init/sql/createDB.sql new file mode 100644 index 00000000..c5ce72b7 --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/createDB.sql @@ -0,0 +1,27 @@ + +-- 删除已存在的数据库(如果存在) +DROP DATABASE IF EXISTS urban_lifeline; + +-- 创建新数据库,使用 UTF8 编码,并设置适合中文的排序规则 +-- 使用 template0 确保干净的数据库模板 +-- zh_CN.UTF-8 支持中文字符排序和比较 +CREATE DATABASE urban_lifeline + ENCODING 'UTF8' + TEMPLATE template0 + LC_COLLATE 'zh_CN.UTF-8' + LC_CTYPE 'zh_CN.UTF-8'; + +-- 连接到新创建的数据库 +\c urban_lifeline; + +-- -- 创建扩展(如果需要) +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- UUID 支持 +CREATE EXTENSION IF NOT EXISTS "pg_trgm"; -- 文本搜索支持 +CREATE EXTENSION IF NOT EXISTS "btree_gist"; -- GiST 索引支持 + +-- 设置搜索路径(可选,但建议设置) +-- ALTER DATABASE urban-lifeline SET search_path TO sys, public; + +-- sudo ./configure --prefix=/opt/postgres/postgres-17.6 +-- --with-uuid=ossp --with-openssl --with-libxml --with-pam +-- && sudo make && sudo make install diff --git a/docker/urbanLifeline/postgres/init/sql/createTableAI.sql b/docker/urbanLifeline/postgres/init/sql/createTableAI.sql new file mode 100644 index 00000000..3752bd0b --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/createTableAI.sql @@ -0,0 +1,188 @@ +CREATE SCHEMA IF NOT EXISTS ai; + +-- AI智能体配置 +DROP TABLE IF EXISTS ai.tb_agent CASCADE; +CREATE TABLE ai.tb_agent( + optsn VARCHAR(50) NOT NULL, -- 流水号 + agent_id VARCHAR(50) NOT NULL, -- 智能体ID + name VARCHAR(50) NOT NULL, -- 智能体名称 + description VARCHAR(500) DEFAULT NULL, -- 智能体描述 + link VARCHAR(500) DEFAULT NULL, -- 智能体url + api_key VARCHAR(500) NOT NULL, -- dify智能体APIKEY + is_outer BOOLEAN DEFAULT false, -- 是否是对外智能体,未登录可用 + introduce VARCHAR(500) NOT NULL, -- 引导词 + prompt_cards JSONB DEFAULT '[]'::jsonb, -- 提示卡片数组 [{file_id:'', prompt:''}] + category VARCHAR(50) NOT NULL, -- 分类 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (agent_id), + UNIQUE (optsn), + UNIQUE (api_key) +); + +-- AI智能体对话 +DROP TABLE IF EXISTS ai.tb_chat CASCADE; +CREATE TABLE ai.tb_chat( + optsn VARCHAR(50) NOT NULL, -- 流水号 + chat_id VARCHAR(50) NOT NULL, -- 对话ID + agent_id VARCHAR(50) NOT NULL, -- 智能体ID + user_id VARCHAR(50) NOT NULL, -- 用户ID + user_type BOOLEAN NOT NULL DEFAULT true, -- 用户类型 true-系统内部人员 false-系统外部人员 + title VARCHAR(500) NOT NULL, -- 对话标题 + channel VARCHAR(50) DEFAULT 'agent', -- 对话渠道 agent、wechat + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (chat_id), + UNIQUE (optsn) +); + +-- AI智能体对话消息 +DROP TABLE IF EXISTS ai.tb_chat_message CASCADE; +CREATE TABLE ai.tb_chat_message( + optsn VARCHAR(50) NOT NULL, -- 流水号 + message_id VARCHAR(50) NOT NULL, -- 消息ID + dify_message_id VARCHAR(100) DEFAULT NULL, -- Dify消息ID + chat_id VARCHAR(50) NOT NULL, -- 对话ID + role VARCHAR(50) NOT NULL, -- 角色:user-用户/ai-智能体/recipient-来客 + content TEXT NOT NULL, -- 消息内容 + files VARCHAR(50)[] DEFAULT NULL, -- 文件id数组 + comment VARCHAR(50) DEFAULT NULL, -- 评价 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (message_id), + UNIQUE (optsn) +); + + +-- 知识库配置 bidding和workcase2个服务使用 +DROP TABLE IF EXISTS ai.tb_knowledge CASCADE; +CREATE TABLE ai.tb_knowledge( + -- 知识库dify相关配置 + optsn VARCHAR(50) NOT NULL, -- 流水号 + knowledge_id VARCHAR(50) NOT NULL, -- 知识库ID + title VARCHAR(255) NOT NULL, -- 知识库标题 + avatar VARCHAR(255) DEFAULT NULL, -- 知识库头像 + description VARCHAR(500) DEFAULT NULL, -- 知识库描述 + dify_dataset_id VARCHAR(100) DEFAULT NULL, -- Dify知识库ID(Dataset ID) + dify_indexing_technique VARCHAR(50) DEFAULT 'high_quality', -- Dify索引方式(high_quality/economy) + embedding_model VARCHAR(100) DEFAULT NULL, -- 向量模型名称 + embedding_model_provider VARCHAR(100) DEFAULT NULL, -- 向量模型提供商 + rerank_model VARCHAR(100) DEFAULT NULL, -- Rerank模型名称 + rerank_model_provider VARCHAR(100) DEFAULT NULL, -- Rerank模型提供商 + reranking_enable BOOLEAN DEFAULT false, -- 是否启用Rerank + retrieval_top_k INTEGER DEFAULT 2, -- 检索Top K(返回前K个结果) + retrieval_score_threshold DECIMAL(3,2) DEFAULT 0.00, -- 检索分数阈值(0.00-1.00) + document_count INTEGER DEFAULT 0, -- 文档数量 + total_chunks INTEGER DEFAULT 0, -- 总分段数 + -- 下面是服务使用 + service VARCHAR(50) DEFAULT NULL, -- 所属服务 workcase、bidding + project_id VARCHAR(50) DEFAULT NULL, -- bidding所属项目ID + category VARCHAR(50) DEFAULT NULL, -- 所属分类 workcase 内部知识库、外部知识库 + creator VARCHAR(50) NOT NULL, -- 创建者(用户ID) + dept_path VARCHAR(50) DEFAULT NULL, -- 创建者部门路径 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (optsn), + UNIQUE (knowledge_id), + UNIQUE (dify_dataset_id) +); + +-- 知识库配置表字段注释 +COMMENT ON TABLE ai.tb_knowledge IS '知识库配置表'; +COMMENT ON COLUMN ai.tb_knowledge.optsn IS '流水号'; +COMMENT ON COLUMN ai.tb_knowledge.knowledge_id IS '知识库ID'; +COMMENT ON COLUMN ai.tb_knowledge.title IS '知识库标题'; +COMMENT ON COLUMN ai.tb_knowledge.avatar IS '知识库头像'; +COMMENT ON COLUMN ai.tb_knowledge.description IS '知识库描述'; +COMMENT ON COLUMN ai.tb_knowledge.dify_dataset_id IS 'Dify知识库ID(Dataset ID)'; +COMMENT ON COLUMN ai.tb_knowledge.dify_indexing_technique IS 'Dify索引方式(high_quality/economy)'; +COMMENT ON COLUMN ai.tb_knowledge.embedding_model IS '向量模型名称'; +COMMENT ON COLUMN ai.tb_knowledge.embedding_model_provider IS '向量模型提供商'; +COMMENT ON COLUMN ai.tb_knowledge.rerank_model IS 'Rerank模型名称'; +COMMENT ON COLUMN ai.tb_knowledge.rerank_model_provider IS 'Rerank模型提供商'; +COMMENT ON COLUMN ai.tb_knowledge.reranking_enable IS '是否启用Rerank'; +COMMENT ON COLUMN ai.tb_knowledge.retrieval_top_k IS '检索Top K(返回前K个结果)'; +COMMENT ON COLUMN ai.tb_knowledge.retrieval_score_threshold IS '检索分数阈值(0.00-1.00)'; +COMMENT ON COLUMN ai.tb_knowledge.document_count IS '文档数量'; +COMMENT ON COLUMN ai.tb_knowledge.total_chunks IS '总分段数'; +COMMENT ON COLUMN ai.tb_knowledge.service IS '所属服务 workcase、bidding'; +COMMENT ON COLUMN ai.tb_knowledge.project_id IS 'bidding所属项目ID'; +COMMENT ON COLUMN ai.tb_knowledge.category IS '所属分类 workcase 内部知识库、外部知识库'; +COMMENT ON COLUMN ai.tb_knowledge.creator IS '创建者(用户ID)'; +COMMENT ON COLUMN ai.tb_knowledge.dept_path IS '创建者部门路径'; +COMMENT ON COLUMN ai.tb_knowledge.updater IS '更新者'; +COMMENT ON COLUMN ai.tb_knowledge.create_time IS '创建时间'; +COMMENT ON COLUMN ai.tb_knowledge.update_time IS '更新时间'; +COMMENT ON COLUMN ai.tb_knowledge.delete_time IS '删除时间'; +COMMENT ON COLUMN ai.tb_knowledge.deleted IS '是否删除'; +-- bidding知识库根据project等变化 +-- workcase知识库固定8个 +-- workcase外部知识库:4个知识库: +-- 1. 设备操作指南 +-- 2. 常见故障解决方案 +-- 3. 三包外服务政策 +-- 4. 配件咨询话术 +-- workcase内部知识库:4个知识库: +-- 1. 技术维修手册 +-- 2. 产品参数明细 +-- 3. 内部服务流程规范 +-- 4. 客户服务话术模板 + +-- 知识库文件 文件上传dify知识库,对dify内的文件修改不生成新版本, 只有重新上传才生成新版本 +DROP TABLE IF EXISTS ai.tb_knowledge_file CASCADE; +CREATE TABLE ai.tb_knowledge_file( + optsn VARCHAR(50) NOT NULL, -- 流水号 + knowledge_id VARCHAR(50) NOT NULL, -- 知识库ID + file_root_id VARCHAR(50) NOT NULL, -- 文件根ID + file_id VARCHAR(50) NOT NULL, -- 文件ID + dify_file_id VARCHAR(50) NOT NULL, -- dify文件ID + version INTEGER NOT NULL DEFAULT 1, -- 文件版本 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (optsn), + UNIQUE (knowledge_id, file_id) +); + +-- 知识库文件表字段注释 +COMMENT ON TABLE ai.tb_knowledge_file IS '知识库文件表'; +COMMENT ON COLUMN ai.tb_knowledge_file.optsn IS '流水号'; +COMMENT ON COLUMN ai.tb_knowledge_file.knowledge_id IS '知识库ID'; +COMMENT ON COLUMN ai.tb_knowledge_file.file_root_id IS '文件根ID'; +COMMENT ON COLUMN ai.tb_knowledge_file.file_id IS '文件ID'; +COMMENT ON COLUMN ai.tb_knowledge_file.dify_file_id IS 'dify文件ID'; +COMMENT ON COLUMN ai.tb_knowledge_file.version IS '文件版本'; +COMMENT ON COLUMN ai.tb_knowledge_file.create_time IS '创建时间'; +COMMENT ON COLUMN ai.tb_knowledge_file.update_time IS '更新时间'; +COMMENT ON COLUMN ai.tb_knowledge_file.delete_time IS '删除时间'; +COMMENT ON COLUMN ai.tb_knowledge_file.deleted IS '是否删除'; + +DROP TABLE IF EXISTS ai.tb_knowledge_file_log CASCADE; +CREATE TABLE ai.tb_knowledge_file_log( + optsn VARCHAR(50) NOT NULL, -- 流水号 + log_id VARCHAR(50) NOT NULL, -- 日志ID + knowledge_id VARCHAR(50) NOT NULL, -- 知识库ID + file_root_id VARCHAR(50) NOT NULL, -- 文件根ID + file_id VARCHAR(50) NOT NULL, -- 文件ID + file_name VARCHAR(100) NOT NULL, -- 文件名 + service VARCHAR(50) NOT NULL, -- 所属服务 workcase、bidding + version INTEGER NOT NULL DEFAULT 1, -- 文件版本 + action VARCHAR(50) NOT NULL, -- 操作类型 upload、update、delete + creator VARCHAR(50) NOT NULL, -- 创建者(用户ID) + creator_name VARCHAR(100) NOT NULL, -- 创建者姓名 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + PRIMARY KEY (optsn), + UNIQUE (knowledge_id, file_id) +); diff --git a/docker/urbanLifeline/postgres/init/sql/createTableBidding.sql b/docker/urbanLifeline/postgres/init/sql/createTableBidding.sql new file mode 100644 index 00000000..4818df60 --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/createTableBidding.sql @@ -0,0 +1,264 @@ +-- ============================= +-- 招投标智能体业务模块 +-- 支持:招标文件管理、投标文件生成、评分分析、流程跟踪 +-- ============================= +CREATE SCHEMA IF NOT EXISTS bidding; + +-- 招标项目表 +DROP TABLE IF EXISTS bidding.tb_bidding_project CASCADE; +CREATE TABLE bidding.tb_bidding_project ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + project_id VARCHAR(50) NOT NULL, -- 项目ID + project_no VARCHAR(100) NOT NULL, -- 项目编号 + project_name VARCHAR(500) NOT NULL, -- 项目名称 + project_type VARCHAR(50) NOT NULL, -- 项目类型:public-公开招标/invitation-邀请招标/competitive_negotiation-竞争性谈判 + industry VARCHAR(100), -- 所属行业 + source_platform VARCHAR(100), -- 来源平台(如:政府采购网、企业官网等) + source_url VARCHAR(500), -- 来源URL + publish_date TIMESTAMPTZ, -- 发布日期 + deadline TIMESTAMPTZ, -- 投标截止日期 + opening_date TIMESTAMPTZ, -- 开标日期 + budget_amount DECIMAL(18,2), -- 预算金额 + currency VARCHAR(10) DEFAULT 'CNY', -- 货币单位 + project_status VARCHAR(30) NOT NULL DEFAULT 'collecting', -- 项目状态:collecting-收集中/analyzing-分析中/preparing-准备投标/submitted-已提交/opened-已开标/won-中标/lost-未中标/abandoned-放弃 + winning_status VARCHAR(30), -- 中标状态:pending-待定/won-中标/lost-未中标 + winning_amount DECIMAL(18,2), -- 中标金额 + client_name VARCHAR(255), -- 客户名称 + client_contact VARCHAR(100), -- 客户联系方式 + contact_person VARCHAR(100), -- 联系人 + project_location VARCHAR(500), -- 项目地点 + description TEXT, -- 项目描述 + keywords TEXT[], -- 关键词数组 + metadata JSONB DEFAULT NULL, -- 项目元数据 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + responsible_user VARCHAR(50), -- 负责人 + team_members VARCHAR(50)[], -- 团队成员数组 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (project_id), + UNIQUE (optsn), + UNIQUE (project_no) +); + +CREATE INDEX idx_project_status ON bidding.tb_bidding_project(project_status) WHERE deleted = false; +CREATE INDEX idx_project_deadline ON bidding.tb_bidding_project(deadline) WHERE deleted = false; +CREATE INDEX idx_project_dept ON bidding.tb_bidding_project(dept_path) WHERE deleted = false; +CREATE INDEX idx_project_responsible ON bidding.tb_bidding_project(responsible_user) WHERE deleted = false; + +COMMENT ON TABLE bidding.tb_bidding_project IS '招标项目表'; +COMMENT ON COLUMN bidding.tb_bidding_project.project_status IS '项目状态:collecting/analyzing/preparing/submitted/opened/won/lost/abandoned'; + +-- 招标文件表 +DROP TABLE IF EXISTS bidding.tb_bidding_document CASCADE; +CREATE TABLE bidding.tb_bidding_document ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + doc_id VARCHAR(50) NOT NULL, -- 文档ID + project_id VARCHAR(50) NOT NULL, -- 所属项目ID + doc_type VARCHAR(50) NOT NULL, -- 文档类型:tender-招标文件/technical-技术标/commercial-商务标/clarification-澄清文件/other-其他 + doc_name VARCHAR(500) NOT NULL, -- 文档名称 + file_id VARCHAR(50), -- 关联文件表ID + file_path VARCHAR(500), -- 文件路径 + file_size BIGINT, -- 文件大小 + mime_type VARCHAR(100), -- MIME类型 + version INTEGER DEFAULT 1, -- 版本号 + language VARCHAR(20) DEFAULT 'zh-CN', -- 语言 + page_count INTEGER, -- 页数 + parse_status VARCHAR(30) DEFAULT 'pending', -- 解析状态:pending-待解析/parsing-解析中/completed-已完成/failed-失败 + parse_result JSONB, -- 解析结果(JSON格式:提取的要素、表格、图纸等) + extraction_data JSONB, -- 提取的结构化数据 + ai_analysis TEXT, -- AI分析结果 + upload_date TIMESTAMPTZ DEFAULT now(), -- 上传日期 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (doc_id), + UNIQUE (optsn), + FOREIGN KEY (project_id) REFERENCES bidding.tb_bidding_project(project_id) +); + +CREATE INDEX idx_doc_project ON bidding.tb_bidding_document(project_id) WHERE deleted = false; +CREATE INDEX idx_doc_type ON bidding.tb_bidding_document(doc_type) WHERE deleted = false; + +COMMENT ON TABLE bidding.tb_bidding_document IS '招标文件表'; +COMMENT ON COLUMN bidding.tb_bidding_document.parse_status IS '解析状态:pending/parsing/completed/failed'; + +-- 招标要素提取表 +DROP TABLE IF EXISTS bidding.tb_bidding_requirement CASCADE; +CREATE TABLE bidding.tb_bidding_requirement ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + req_id VARCHAR(50) NOT NULL, -- 要素ID + project_id VARCHAR(50) NOT NULL, -- 所属项目ID + doc_id VARCHAR(50), -- 来源文档ID + req_category VARCHAR(50) NOT NULL, -- 要素类别:commercial-商务要素/technical-技术参数/veto-否决项/qualification-资质要求/delivery-交付要求/payment-付款条件/scoring-评分标准 + req_name VARCHAR(255) NOT NULL, -- 要素名称 + req_content TEXT NOT NULL, -- 要素内容 + req_value VARCHAR(500), -- 要素值 + is_mandatory BOOLEAN DEFAULT false, -- 是否必填 + is_veto BOOLEAN DEFAULT false, -- 是否为否决项 + priority INTEGER DEFAULT 0, -- 优先级 + extraction_method VARCHAR(30) DEFAULT 'ai', -- 提取方式:ai-AI提取/manual-人工录入 + confidence_score DECIMAL(5,4), -- 置信度分数(0-1) + source_location JSONB, -- 来源位置(页码、段落等) + compliance_status VARCHAR(30), -- 合规状态:compliant-符合/non_compliant-不符合/pending-待确认 + response_content TEXT, -- 响应内容(我方的应答) + notes TEXT, -- 备注 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (req_id), + UNIQUE (optsn), + FOREIGN KEY (project_id) REFERENCES bidding.tb_bidding_project(project_id) +); + +CREATE INDEX idx_req_project ON bidding.tb_bidding_requirement(project_id) WHERE deleted = false; +CREATE INDEX idx_req_category ON bidding.tb_bidding_requirement(req_category) WHERE deleted = false; +CREATE INDEX idx_req_veto ON bidding.tb_bidding_requirement(is_veto) WHERE deleted = false AND is_veto = true; + +COMMENT ON TABLE bidding.tb_bidding_requirement IS '招标要素提取表'; +COMMENT ON COLUMN bidding.tb_bidding_requirement.req_category IS '要素类别:commercial/technical/veto/qualification/delivery/payment/scoring'; + +-- 投标文件生成表 +DROP TABLE IF EXISTS bidding.tb_bid_response CASCADE; +CREATE TABLE bidding.tb_bid_response ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + response_id VARCHAR(50) NOT NULL, -- 响应文件ID + project_id VARCHAR(50) NOT NULL, -- 所属项目ID + response_type VARCHAR(50) NOT NULL, -- 响应类型:technical-技术标/commercial-商务标/comprehensive-综合标 + doc_name VARCHAR(500) NOT NULL, -- 文档名称 + outline TEXT, -- 文档大纲(JSON格式) + content TEXT, -- 文档内容 + generation_method VARCHAR(30) DEFAULT 'ai', -- 生成方式:ai-AI生成/template-模板生成/manual-人工编写 + template_id VARCHAR(50), -- 使用的模板ID + ai_model VARCHAR(100), -- 使用的AI模型 + generation_status VARCHAR(30) DEFAULT 'draft', -- 生成状态:draft-草稿/reviewing-审核中/approved-已批准/rejected-已拒绝/submitted-已提交 + file_id VARCHAR(50), -- 生成的文件ID + file_path VARCHAR(500), -- 文件路径 + version INTEGER DEFAULT 1, -- 版本号 + parent_version_id VARCHAR(50), -- 父版本ID + review_comments TEXT, -- 审核意见 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (response_id), + UNIQUE (optsn), + FOREIGN KEY (project_id) REFERENCES bidding.tb_bidding_project(project_id) +); + +CREATE INDEX idx_response_project ON bidding.tb_bid_response(project_id) WHERE deleted = false; +CREATE INDEX idx_response_status ON bidding.tb_bid_response(generation_status) WHERE deleted = false; + +COMMENT ON TABLE bidding.tb_bid_response IS '投标文件生成表'; +COMMENT ON COLUMN bidding.tb_bid_response.generation_status IS '生成状态:draft/reviewing/approved/rejected/submitted'; + +-- 评分规则表 +DROP TABLE IF EXISTS bidding.tb_bidding_scoring_rule CASCADE; +CREATE TABLE bidding.tb_bidding_scoring_rule ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + rule_id VARCHAR(50) NOT NULL, -- 规则ID + project_id VARCHAR(50) NOT NULL, -- 所属项目ID + rule_category VARCHAR(50) NOT NULL, -- 规则类别:technical-技术分/commercial-商务分/price-价格分/credit-信誉分 + rule_name VARCHAR(255) NOT NULL, -- 规则名称 + rule_description TEXT, -- 规则描述 + max_score DECIMAL(10,2) NOT NULL, -- 最高分值 + weight DECIMAL(5,4), -- 权重(0-1) + scoring_method VARCHAR(50), -- 评分方法:fixed-固定分值/range-区间评分/formula-公式计算 + calculation_formula TEXT, -- 计算公式 + evaluation_criteria TEXT, -- 评分标准 + our_score DECIMAL(10,2), -- 我方得分(预估) + score_analysis TEXT, -- 得分分析 + optimization_advice TEXT, -- 优化建议 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (rule_id), + UNIQUE (optsn), + FOREIGN KEY (project_id) REFERENCES bidding.tb_bidding_project(project_id) +); + +CREATE INDEX idx_rule_project ON bidding.tb_bidding_scoring_rule(project_id) WHERE deleted = false; + +COMMENT ON TABLE bidding.tb_bidding_scoring_rule IS '评分规则表'; + +-- 项目流程节点表 +DROP TABLE IF EXISTS bidding.tb_bidding_process CASCADE; +CREATE TABLE bidding.tb_bidding_process ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + process_id VARCHAR(50) NOT NULL, -- 流程节点ID + project_id VARCHAR(50) NOT NULL, -- 所属项目ID + node_name VARCHAR(255) NOT NULL, -- 节点名称 + node_type VARCHAR(50) NOT NULL, -- 节点类型:collection-文件收集/analysis-需求分析/preparation-文件准备/review-内部审核/submission-投标提交/opening-开标/result-结果通知 + node_order INTEGER NOT NULL, -- 节点顺序 + node_status VARCHAR(30) DEFAULT 'pending', -- 节点状态:pending-待处理/in_progress-进行中/completed-已完成/skipped-已跳过 + planned_start_time TIMESTAMPTZ, -- 计划开始时间 + planned_end_time TIMESTAMPTZ, -- 计划结束时间 + actual_start_time TIMESTAMPTZ, -- 实际开始时间 + actual_end_time TIMESTAMPTZ, -- 实际结束时间 + responsible_user VARCHAR(50), -- 负责人 + participants VARCHAR(50)[], -- 参与人员数组 + notes TEXT, -- 节点备注 + attachments VARCHAR(50)[], -- 附件ID数组 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (process_id), + UNIQUE (optsn), + FOREIGN KEY (project_id) REFERENCES bidding.tb_bidding_project(project_id) +); + +CREATE INDEX idx_process_project ON bidding.tb_bidding_process(project_id, node_order) WHERE deleted = false; + +COMMENT ON TABLE bidding.tb_bidding_process IS '项目流程节点表'; +COMMENT ON COLUMN bidding.tb_bidding_process.node_type IS '节点类型:collection/analysis/preparation/review/submission/opening/result'; + +-- 投标模板表 +DROP TABLE IF EXISTS bidding.tb_bid_template CASCADE; +CREATE TABLE bidding.tb_bid_template ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + template_id VARCHAR(50) NOT NULL, -- 模板ID + template_name VARCHAR(255) NOT NULL, -- 模板名称 + template_type VARCHAR(50) NOT NULL, -- 模板类型:technical-技术标/commercial-商务标/comprehensive-综合标 + industry VARCHAR(100), -- 适用行业 + template_content TEXT, -- 模板内容 + outline_structure JSONB, -- 大纲结构(JSON格式) + file_id VARCHAR(50), -- 模板文件ID + usage_count INTEGER DEFAULT 0, -- 使用次数 + is_default BOOLEAN DEFAULT false, -- 是否默认模板 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + status VARCHAR(20) DEFAULT 'active', -- 状态:active-激活/inactive-停用 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (template_id), + UNIQUE (optsn) +); + +CREATE INDEX idx_template_type ON bidding.tb_bid_template(template_type) WHERE deleted = false; + +COMMENT ON TABLE bidding.tb_bid_template IS '投标模板表'; diff --git a/docker/urbanLifeline/postgres/init/sql/createTableConfig.sql b/docker/urbanLifeline/postgres/init/sql/createTableConfig.sql new file mode 100644 index 00000000..f3bd68d4 --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/createTableConfig.sql @@ -0,0 +1,51 @@ +CREATE SCHEMA IF NOT EXISTS config; +DROP TABLE IF EXISTS config.tb_sys_config CASCADE; +CREATE TABLE config.tb_sys_config ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + config_id VARCHAR(50) NOT NULL, -- 配置ID + key VARCHAR(255) NOT NULL, -- 配置键 + name VARCHAR(255) NOT NULL, -- 配置名称 + value VARCHAR(255) NOT NULL, -- 配置值 + config_type VARCHAR(50) NOT NULL, -- 数据类型(String, INTEGER, BOOLEAN, Float, Double) + render_type VARCHAR(50) NOT NULL, -- 配置渲染类型(select, input, textarea, checkbox, radio, switch) + description VARCHAR(255) NOT NULL, -- 配置描述 + re JSON DEFAULT NULL, -- 正则表达式校验规则 + options JSON DEFAULT NULL, -- 可选项,render_type为select、checkbox、radio时使用 + "group" VARCHAR(255) NOT NULL, -- 配置组 + module_id VARCHAR(255) NOT NULL, -- 模块id + order_num INT NOT NULL, -- 配置顺序 + status INT NOT NULL DEFAULT 0, -- 配置状态 0:启用 1:禁用 + remark VARCHAR(255) NOT NULL, -- 配置备注 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径,支持like递归(如/1/2/3/) + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 配置创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 配置更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 配置删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (config_id), + UNIQUE (optsn) +); +COMMENT ON TABLE config.tb_sys_config IS '系统配置表'; +COMMENT ON COLUMN config.tb_sys_config.optsn IS '流水号'; +COMMENT ON COLUMN config.tb_sys_config.config_id IS '配置ID'; +COMMENT ON COLUMN config.tb_sys_config.key IS '配置键'; +COMMENT ON COLUMN config.tb_sys_config.name IS '配置名称'; +COMMENT ON COLUMN config.tb_sys_config.value IS '配置值'; +COMMENT ON COLUMN config.tb_sys_config.config_type IS '数据类型'; +COMMENT ON COLUMN config.tb_sys_config.render_type IS '数据渲染类型'; +COMMENT ON COLUMN config.tb_sys_config.description IS '配置描述'; +COMMENT ON COLUMN config.tb_sys_config.re IS '正则表达式校验规则'; +COMMENT ON COLUMN config.tb_sys_config.options IS '可选项'; +COMMENT ON COLUMN config.tb_sys_config.group IS'配置组名称'; +COMMENT ON COLUMN config.tb_sys_config.module_id IS '模块id'; +COMMENT ON COLUMN config.tb_sys_config.order_num IS '配置顺序'; +COMMENT ON COLUMN config.tb_sys_config.status IS '配置状态'; +COMMENT ON COLUMN config.tb_sys_config.remark IS '配置备注'; +COMMENT ON COLUMN config.tb_sys_config.creator IS '创建者'; +COMMENT ON COLUMN config.tb_sys_config.dept_path IS '部门全路径'; +COMMENT ON COLUMN config.tb_sys_config.updater IS '更新者'; +COMMENT ON COLUMN config.tb_sys_config.create_time IS '配置创建时间'; +COMMENT ON COLUMN config.tb_sys_config.update_time IS '配置更新时间'; +COMMENT ON COLUMN config.tb_sys_config.delete_time IS '配置删除时间'; +COMMENT ON COLUMN config.tb_sys_config.deleted IS '是否删除'; \ No newline at end of file diff --git a/docker/urbanLifeline/postgres/init/sql/createTableCrontab.sql b/docker/urbanLifeline/postgres/init/sql/createTableCrontab.sql new file mode 100644 index 00000000..1dfc5e72 --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/createTableCrontab.sql @@ -0,0 +1,153 @@ +-- ==================================================== +-- 定时任务表 +-- ==================================================== +CREATE SCHEMA IF NOT EXISTS crontab; +DROP TABLE IF EXISTS crontab.tb_crontab_task CASCADE; +CREATE TABLE crontab.tb_crontab_task ( + id VARCHAR(64) NOT NULL, + task_id VARCHAR(64) NOT NULL, + task_name VARCHAR(100) NOT NULL, + task_group VARCHAR(50) NOT NULL DEFAULT 'DEFAULT', + meta_id VARCHAR(64) NOT NULL, + default_recipient SMALLINT NOT NULL DEFAULT 0, -- 是否使用默认接收人(0:否 1:是) + bean_name VARCHAR(100) NOT NULL, + method_name VARCHAR(100) NOT NULL, + method_params VARCHAR(500) DEFAULT NULL, + cron_expression VARCHAR(100) NOT NULL, + status SMALLINT NOT NULL DEFAULT 0, -- 任务状态(0:暂停 1:运行中) + description VARCHAR(500) DEFAULT NULL, + concurrent SMALLINT NOT NULL DEFAULT 0, -- 是否允许并发执行(0:否 1:是) + misfire_policy SMALLINT NOT NULL DEFAULT 1, -- 错过执行策略(1:立即执行 2:执行一次 3:放弃执行) + creator VARCHAR(64) DEFAULT NULL, + updater VARCHAR(64) DEFAULT NULL, + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), + update_time TIMESTAMPTZ DEFAULT NULL, + delete_time TIMESTAMPTZ DEFAULT NULL, + deleted SMALLINT NOT NULL DEFAULT 0, -- 是否删除(0:否 1:是) + PRIMARY KEY (id) +); + +CREATE INDEX IF NOT EXISTS idx_task_name ON crontab.tb_crontab_task(task_name); +CREATE INDEX IF NOT EXISTS idx_bean_name ON crontab.tb_crontab_task(bean_name); +CREATE INDEX IF NOT EXISTS idx_status ON crontab.tb_crontab_task(status); +CREATE INDEX IF NOT EXISTS idx_deleted ON crontab.tb_crontab_task(deleted); + +COMMENT ON TABLE crontab.tb_crontab_task IS '定时任务配置表'; +COMMENT ON COLUMN crontab.tb_crontab_task.id IS '主键ID'; +COMMENT ON COLUMN crontab.tb_crontab_task.task_id IS '任务ID'; +COMMENT ON COLUMN crontab.tb_crontab_task.task_name IS '任务名称'; +COMMENT ON COLUMN crontab.tb_crontab_task.task_group IS '任务分组'; +COMMENT ON COLUMN crontab.tb_crontab_task.meta_id IS '任务元数据ID'; +COMMENT ON COLUMN crontab.tb_crontab_task.default_recipient IS '是否使用默认接收人(0:否 1:是)'; +COMMENT ON COLUMN crontab.tb_crontab_task.bean_name IS 'Bean名称'; +COMMENT ON COLUMN crontab.tb_crontab_task.method_name IS '方法名称'; +COMMENT ON COLUMN crontab.tb_crontab_task.method_params IS '方法参数'; +COMMENT ON COLUMN crontab.tb_crontab_task.cron_expression IS 'Cron表达式'; +COMMENT ON COLUMN crontab.tb_crontab_task.status IS '任务状态(0:暂停 1:运行中)'; +COMMENT ON COLUMN crontab.tb_crontab_task.description IS '任务描述'; +COMMENT ON COLUMN crontab.tb_crontab_task.concurrent IS '是否允许并发执行(0:否 1:是)'; +COMMENT ON COLUMN crontab.tb_crontab_task.misfire_policy IS '错过执行策略(1:立即执行 2:执行一次 3:放弃执行)'; +COMMENT ON COLUMN crontab.tb_crontab_task.creator IS '创建者'; +COMMENT ON COLUMN crontab.tb_crontab_task.updater IS '更新者'; +COMMENT ON COLUMN crontab.tb_crontab_task.create_time IS '创建时间'; +COMMENT ON COLUMN crontab.tb_crontab_task.update_time IS '更新时间'; +COMMENT ON COLUMN crontab.tb_crontab_task.delete_time IS '删除时间'; +COMMENT ON COLUMN crontab.tb_crontab_task.deleted IS '是否删除(0:否 1:是)'; + +-- ==================================================== +-- 定时任务执行日志表 +-- ==================================================== +DROP TABLE IF EXISTS crontab.tb_crontab_log CASCADE; +CREATE TABLE crontab.tb_crontab_log ( + id VARCHAR(64) NOT NULL, + task_id VARCHAR(64) NOT NULL, + task_name VARCHAR(100) NOT NULL, + task_group VARCHAR(50) NOT NULL DEFAULT 'DEFAULT', + bean_name VARCHAR(100) NOT NULL, + method_name VARCHAR(100) NOT NULL, + method_params VARCHAR(500) DEFAULT NULL, + execute_status SMALLINT NOT NULL, -- 执行状态(0:失败 1:成功) + execute_message TEXT DEFAULT NULL, + exception_info TEXT DEFAULT NULL, + start_time TIMESTAMPTZ NOT NULL, + end_time TIMESTAMPTZ DEFAULT NULL, + execute_duration INT DEFAULT NULL, + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), + update_time TIMESTAMPTZ DEFAULT NULL, + delete_time TIMESTAMPTZ DEFAULT NULL, + deleted SMALLINT NOT NULL DEFAULT 0, -- 是否删除(0:否 1:是) + PRIMARY KEY (id) +); + +CREATE INDEX IF NOT EXISTS idx_task_id ON crontab.tb_crontab_log(task_id); +CREATE INDEX IF NOT EXISTS idx_log_task_name ON crontab.tb_crontab_log(task_name); +CREATE INDEX IF NOT EXISTS idx_execute_status ON crontab.tb_crontab_log(execute_status); +CREATE INDEX IF NOT EXISTS idx_start_time ON crontab.tb_crontab_log(start_time); +CREATE INDEX IF NOT EXISTS idx_log_deleted ON crontab.tb_crontab_log(deleted); + +COMMENT ON TABLE crontab.tb_crontab_log IS '定时任务执行日志表'; +COMMENT ON COLUMN crontab.tb_crontab_log.id IS '主键ID'; +COMMENT ON COLUMN crontab.tb_crontab_log.task_id IS '任务ID'; +COMMENT ON COLUMN crontab.tb_crontab_log.task_name IS '任务名称'; +COMMENT ON COLUMN crontab.tb_crontab_log.task_group IS '任务分组'; +COMMENT ON COLUMN crontab.tb_crontab_log.bean_name IS 'Bean名称'; +COMMENT ON COLUMN crontab.tb_crontab_log.method_name IS '方法名称'; +COMMENT ON COLUMN crontab.tb_crontab_log.method_params IS '方法参数'; +COMMENT ON COLUMN crontab.tb_crontab_log.execute_status IS '执行状态(0:失败 1:成功)'; +COMMENT ON COLUMN crontab.tb_crontab_log.execute_message IS '执行结果信息'; +COMMENT ON COLUMN crontab.tb_crontab_log.exception_info IS '异常信息'; +COMMENT ON COLUMN crontab.tb_crontab_log.start_time IS '开始时间'; +COMMENT ON COLUMN crontab.tb_crontab_log.end_time IS '结束时间'; +COMMENT ON COLUMN crontab.tb_crontab_log.execute_duration IS '执行时长(毫秒)'; +COMMENT ON COLUMN crontab.tb_crontab_log.create_time IS '创建时间'; +COMMENT ON COLUMN crontab.tb_crontab_log.update_time IS '更新时间'; +COMMENT ON COLUMN crontab.tb_crontab_log.delete_time IS '删除时间'; +COMMENT ON COLUMN crontab.tb_crontab_log.deleted IS '是否删除(0:否 1:是)'; + +-- ==================================================== +-- 定时任务元数据表(存储爬虫任务的元数据配置) +-- ==================================================== +DROP TABLE IF EXISTS crontab.tb_crontab_task_meta CASCADE; +CREATE TABLE crontab.tb_crontab_task_meta ( + id VARCHAR(64) NOT NULL, + meta_id VARCHAR(64) NOT NULL, + name VARCHAR(100) NOT NULL, + description VARCHAR(500) DEFAULT NULL, + category VARCHAR(50) NOT NULL, + bean_name VARCHAR(100) NOT NULL, + method_name VARCHAR(100) NOT NULL, + script_path VARCHAR(255) DEFAULT NULL, + param_schema TEXT DEFAULT NULL, + auto_publish SMALLINT NOT NULL DEFAULT 0, -- 是否自动发布 + sort_order INT DEFAULT 0, + creator VARCHAR(64) DEFAULT NULL, + updater VARCHAR(64) DEFAULT NULL, + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), + update_time TIMESTAMPTZ DEFAULT NULL, + delete_time TIMESTAMPTZ DEFAULT NULL, + deleted SMALLINT NOT NULL DEFAULT 0, -- 是否删除(0:否 1:是) + PRIMARY KEY (id), + UNIQUE (meta_id) +); + +CREATE INDEX IF NOT EXISTS idx_category ON crontab.tb_crontab_task_meta(category); +CREATE INDEX IF NOT EXISTS idx_meta_deleted ON crontab.tb_crontab_task_meta(deleted); + +COMMENT ON TABLE crontab.tb_crontab_task_meta IS '定时任务元数据表'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.id IS '主键ID'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.meta_id IS '元数据ID'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.name IS '任务名称'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.description IS '任务描述'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.category IS '任务分类(如:人民日报新闻爬取)'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.bean_name IS 'Bean名称(执行器类名)'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.method_name IS '执行方法名'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.script_path IS 'Python脚本路径(相对于basePath)'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.param_schema IS '参数模板(JSON格式,定义参数名、类型、描述、默认值等)'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.auto_publish IS '是否自动发布'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.sort_order IS '排序号'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.creator IS '创建者'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.updater IS '更新者'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.create_time IS '创建时间'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.update_time IS '更新时间'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.delete_time IS '删除时间'; +COMMENT ON COLUMN crontab.tb_crontab_task_meta.deleted IS '是否删除(0:否 1:是)'; \ No newline at end of file diff --git a/docker/urbanLifeline/postgres/init/sql/createTableFile.sql b/docker/urbanLifeline/postgres/init/sql/createTableFile.sql new file mode 100644 index 00000000..06b2f7ac --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/createTableFile.sql @@ -0,0 +1,79 @@ +CREATE SCHEMA IF NOT EXISTS file; + +DROP TABLE IF EXISTS file.tb_sys_file CASCADE; +CREATE TABLE file.tb_sys_file ( + -- BaseDTO 继承字段 + optsn VARCHAR(50) NOT NULL, -- 操作流水号 + creator VARCHAR(50) DEFAULT NULL, -- 创建人 + updater VARCHAR(50) DEFAULT NULL, -- 更新人 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门路径 + remark TEXT DEFAULT NULL, -- 备注 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否已删除(false-未删除,true-已删除) + + -- TbSysFileDTO 特有字段 + file_id VARCHAR(50) NOT NULL, -- 文件ID (主键) + file_root_id VARCHAR(50) DEFAULT NULL, -- 文件根ID + version INTEGER DEFAULT 1, -- 文件版本 + name VARCHAR(255) NOT NULL, -- 文件名 + path VARCHAR(500) NOT NULL, -- 文件路径 + size BIGINT NOT NULL, -- 文件大小(字节) + type VARCHAR(50) DEFAULT NULL, -- 文件类型 + storage_type VARCHAR(50) DEFAULT NULL, -- 存储类型 + mime_type VARCHAR(255) DEFAULT NULL, -- MIME 类型 + url VARCHAR(500) DEFAULT NULL, -- 后端下载接口路径(保留用于扩展,建议使用 /api/file/download/{fileId}) + status VARCHAR(50) DEFAULT NULL, -- 文件状态 + module VARCHAR(100) DEFAULT NULL, -- 所属模块 + business_id VARCHAR(50) DEFAULT NULL, -- 业务ID + uploader VARCHAR(50) DEFAULT NULL, -- 上传者用户ID + object_name VARCHAR(500) DEFAULT NULL, -- MinIO对象名称 + bucket_name VARCHAR(100) DEFAULT NULL, -- MinIO存储桶名称 + md5_hash VARCHAR(32) DEFAULT NULL, -- 文件MD5值 + extension VARCHAR(20) DEFAULT NULL, -- 文件扩展名 + + PRIMARY KEY (file_id), + UNIQUE (optsn) +); + +COMMENT ON TABLE file.tb_sys_file IS '系统文件表'; + +-- BaseDTO 继承字段注释 +COMMENT ON COLUMN file.tb_sys_file.optsn IS '操作流水号'; +COMMENT ON COLUMN file.tb_sys_file.creator IS '创建人'; +COMMENT ON COLUMN file.tb_sys_file.updater IS '更新人'; +COMMENT ON COLUMN file.tb_sys_file.dept_path IS '部门路径'; +COMMENT ON COLUMN file.tb_sys_file.remark IS '备注'; +COMMENT ON COLUMN file.tb_sys_file.create_time IS '创建时间'; +COMMENT ON COLUMN file.tb_sys_file.update_time IS '更新时间'; +COMMENT ON COLUMN file.tb_sys_file.delete_time IS '删除时间'; +COMMENT ON COLUMN file.tb_sys_file.deleted IS '是否已删除(false-未删除,true-已删除)'; + +-- TbSysFileDTO 特有字段注释 +COMMENT ON COLUMN file.tb_sys_file.file_id IS '文件ID (主键)'; +COMMENT ON COLUMN file.tb_sys_file.file_root_id IS '文件根ID'; +COMMENT ON COLUMN file.tb_sys_file.version IS '文件版本'; +COMMENT ON COLUMN file.tb_sys_file.name IS '文件名'; +COMMENT ON COLUMN file.tb_sys_file.path IS '文件路径'; +COMMENT ON COLUMN file.tb_sys_file.size IS '文件大小(字节)'; +COMMENT ON COLUMN file.tb_sys_file.type IS '文件类型'; +COMMENT ON COLUMN file.tb_sys_file.storage_type IS '存储类型'; +COMMENT ON COLUMN file.tb_sys_file.mime_type IS 'MIME 类型'; +COMMENT ON COLUMN file.tb_sys_file.url IS '后端下载接口路径(保留用于扩展,建议使用 /api/file/download/{fileId})'; +COMMENT ON COLUMN file.tb_sys_file.status IS '文件状态'; +COMMENT ON COLUMN file.tb_sys_file.module IS '所属模块'; +COMMENT ON COLUMN file.tb_sys_file.business_id IS '业务ID'; +COMMENT ON COLUMN file.tb_sys_file.uploader IS '上传者用户ID'; +COMMENT ON COLUMN file.tb_sys_file.object_name IS 'MinIO对象名称'; +COMMENT ON COLUMN file.tb_sys_file.bucket_name IS 'MinIO存储桶名称'; +COMMENT ON COLUMN file.tb_sys_file.md5_hash IS '文件MD5值'; +COMMENT ON COLUMN file.tb_sys_file.extension IS '文件扩展名'; + +-- 文件表索引 +-- CREATE INDEX idx_file_module_business ON file.tb_sys_file(module, business_id) WHERE deleted = false; +-- CREATE INDEX idx_file_uploader ON file.tb_sys_file(uploader) WHERE deleted = false; +-- CREATE INDEX idx_file_bucket ON file.tb_sys_file(bucket_name) WHERE deleted = false; +-- CREATE INDEX idx_file_status ON file.tb_sys_file(status) WHERE deleted = false; +-- CREATE INDEX idx_file_create_time ON file.tb_sys_file(create_time) WHERE deleted = false; +-- CREATE INDEX idx_file_md5 ON file.tb_sys_file(md5_hash) WHERE deleted = false; \ No newline at end of file diff --git a/docker/urbanLifeline/postgres/init/sql/createTableLog.sql b/docker/urbanLifeline/postgres/init/sql/createTableLog.sql new file mode 100644 index 00000000..34f64652 --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/createTableLog.sql @@ -0,0 +1,42 @@ +DROP TABLE IF EXISTS sys.tb_sys_log CASCADE; +CREATE TABLE sys.tb_sys_log ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + log_id VARCHAR(50) NOT NULL, -- 日志ID + type VARCHAR(50) NOT NULL, -- 日志类型 + level VARCHAR(50) NOT NULL, -- 日志级别 + module VARCHAR(50) NOT NULL, -- 日志模块 + ip_address VARCHAR(45), -- IP地址 + ip_source VARCHAR(100), -- IP来源 + browser VARCHAR(100), -- 浏览器 + os VARCHAR(100), -- 操作系统 + message VARCHAR(255) NOT NULL, -- 日志消息 + data JSONB DEFAULT NULL, -- 日志数据 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + creator_name VARCHAR(200) DEFAULT NULL, -- 创建者姓名 + service VARCHAR(50) NOT NULL, -- 服务类型 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 日志创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 日志更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 日志删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (log_id), + UNIQUE (optsn) +); +COMMENT ON TABLE sys.tb_sys_log IS '系统日志表'; +COMMENT ON COLUMN sys.tb_sys_log.optsn IS '流水号'; +COMMENT ON COLUMN sys.tb_sys_log.log_id IS '日志ID'; +COMMENT ON COLUMN sys.tb_sys_log.type IS '日志类型'; +COMMENT ON COLUMN sys.tb_sys_log.level IS '日志级别'; +COMMENT ON COLUMN sys.tb_sys_log.module IS '日志模块'; +COMMENT ON COLUMN sys.tb_sys_log.message IS '日志消息'; +COMMENT ON COLUMN sys.tb_sys_log.data IS '日志数据'; +COMMENT ON COLUMN sys.tb_sys_log.creator IS '创建者'; +COMMENT ON COLUMN sys.tb_sys_log.creator_name IS '创建者姓名'; +COMMENT ON COLUMN sys.tb_sys_log.service IS '服务类型'; +COMMENT ON COLUMN sys.tb_sys_log.dept_path IS '部门全路径'; +COMMENT ON COLUMN sys.tb_sys_log.updater IS '更新者'; +COMMENT ON COLUMN sys.tb_sys_log.create_time IS '日志创建时间'; +COMMENT ON COLUMN sys.tb_sys_log.update_time IS '日志更新时间'; +COMMENT ON COLUMN sys.tb_sys_log.delete_time IS '日志删除时间'; +COMMENT ON COLUMN sys.tb_sys_log.deleted IS '是否删除'; \ No newline at end of file diff --git a/docker/urbanLifeline/postgres/init/sql/createTableMessage.sql b/docker/urbanLifeline/postgres/init/sql/createTableMessage.sql new file mode 100644 index 00000000..43aad8ba --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/createTableMessage.sql @@ -0,0 +1,200 @@ +CREATE SCHEMA IF NOT EXISTS message; + +DROP TABLE IF EXISTS message.tb_message CASCADE; +CREATE TABLE message.tb_message ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + message_id VARCHAR(50) NOT NULL, -- 消息ID + title VARCHAR(255) NOT NULL, -- 消息标题 + content VARCHAR(255) NOT NULL, -- 消息内容 + type VARCHAR(50) NOT NULL, -- 消息类型 + status VARCHAR(50) NOT NULL, -- 消息状态 + service VARCHAR(50) NOT NULL, -- 服务类型 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径(隔离) + creator VARCHAR(50) NOT NULL DEFAULT 'system',-- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, + delete_time TIMESTAMPTZ DEFAULT NULL, + deleted BOOLEAN NOT NULL DEFAULT false, + PRIMARY KEY (message_id), + UNIQUE (optsn) +); + +COMMENT ON TABLE message.tb_message IS '消息表'; +COMMENT ON COLUMN message.tb_message.optsn IS '流水号'; +COMMENT ON COLUMN message.tb_message.message_id IS '消息ID'; +COMMENT ON COLUMN message.tb_message.title IS '消息标题'; +COMMENT ON COLUMN message.tb_message.content IS '消息内容'; +COMMENT ON COLUMN message.tb_message.type IS '消息类型'; +COMMENT ON COLUMN message.tb_message.status IS '消息状态'; +COMMENT ON COLUMN message.tb_message.service IS '服务类型'; +COMMENT ON COLUMN message.tb_message.dept_path IS '部门全路径'; +COMMENT ON COLUMN message.tb_message.creator IS '创建者'; +COMMENT ON COLUMN message.tb_message.updater IS '更新者'; +COMMENT ON COLUMN message.tb_message.create_time IS '创建时间'; +COMMENT ON COLUMN message.tb_message.update_time IS '更新时间'; +COMMENT ON COLUMN message.tb_message.delete_time IS '删除时间'; +COMMENT ON COLUMN message.tb_message.deleted IS '是否删除'; + + +-- 消息发送范围定义表(定义消息要发送给哪些对象,通过什么渠道) +DROP TABLE IF EXISTS message.tb_message_range CASCADE; +CREATE TABLE message.tb_message_range ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + message_id VARCHAR(50) NOT NULL, -- 消息ID + target_type VARCHAR(20) NOT NULL, -- 目标类型:user/dept/role/all + target_id VARCHAR(50) DEFAULT NULL, -- 目标ID(用户、部门、角色ID等,all类型时为空) + channel VARCHAR(20) NOT NULL DEFAULT 'app', -- 发送渠道:app/sms/email/wechat_official_account/wechat_applet等 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径,支持like递归(如/1/2/3/) + creator VARCHAR(50) NOT NULL DEFAULT 'system',-- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (optsn), + UNIQUE (message_id, target_type, target_id, channel) +); + +COMMENT ON TABLE message.tb_message_range IS '消息发送范围定义表'; +COMMENT ON COLUMN message.tb_message_range.optsn IS '流水号'; +COMMENT ON COLUMN message.tb_message_range.message_id IS '消息ID'; +COMMENT ON COLUMN message.tb_message_range.target_type IS '目标类型:user-指定用户/dept-部门/role-角色/all-全员'; +COMMENT ON COLUMN message.tb_message_range.target_id IS '目标ID(用户、部门、角色ID等,all类型时为空)'; +COMMENT ON COLUMN message.tb_message_range.channel IS '发送渠道:app/sms/email/wechat_official_account/wechat_applet等'; +COMMENT ON COLUMN message.tb_message_range.dept_path IS '部门全路径'; +COMMENT ON COLUMN message.tb_message_range.creator IS '创建者'; +COMMENT ON COLUMN message.tb_message_range.updater IS '更新者'; +COMMENT ON COLUMN message.tb_message_range.create_time IS '创建时间'; +COMMENT ON COLUMN message.tb_message_range.update_time IS '更新时间'; +COMMENT ON COLUMN message.tb_message_range.delete_time IS '删除时间'; +COMMENT ON COLUMN message.tb_message_range.deleted IS '是否删除'; + + +-- 用户消息接收记录表(记录每个用户实际收到的消息及处理状态) +DROP TABLE IF EXISTS message.tb_message_receiver CASCADE; +CREATE TABLE message.tb_message_receiver ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + message_id VARCHAR(50) NOT NULL, -- 消息ID + user_id VARCHAR(50) NOT NULL, -- 用户ID + channel VARCHAR(20) DEFAULT 'app', -- 接收渠道:app/sms/email/wechat等 + status VARCHAR(20) NOT NULL DEFAULT 'unread', -- 消息状态:unread-未读/read-已读/handled-已处理/deleted-已删除 + read_time TIMESTAMPTZ DEFAULT NULL, -- 阅读时间 + handle_time TIMESTAMPTZ DEFAULT NULL, -- 处理时间 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径(数据隔离) + creator VARCHAR(50) NOT NULL DEFAULT 'system',-- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间(接收时间) + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (optsn), + UNIQUE (message_id, user_id, channel) +); + +-- 创建索引以提高查询效率 +CREATE INDEX idx_message_user_user_status ON message.tb_message_receiver(user_id, status, create_time DESC) WHERE deleted = false; +CREATE INDEX idx_message_user_message ON message.tb_message_receiver(message_id) WHERE deleted = false; + +COMMENT ON TABLE message.tb_message_receiver IS '用户消息接收记录表'; +COMMENT ON COLUMN message.tb_message_receiver.optsn IS '流水号'; +COMMENT ON COLUMN message.tb_message_receiver.message_id IS '消息ID'; +COMMENT ON COLUMN message.tb_message_receiver.user_id IS '用户ID'; +COMMENT ON COLUMN message.tb_message_receiver.channel IS '接收渠道:app/sms/email/wechat等'; +COMMENT ON COLUMN message.tb_message_receiver.status IS '消息状态:unread-未读/read-已读/handled-已处理/deleted-已删除'; +COMMENT ON COLUMN message.tb_message_receiver.read_time IS '阅读时间'; +COMMENT ON COLUMN message.tb_message_receiver.handle_time IS '处理时间'; +COMMENT ON COLUMN message.tb_message_receiver.dept_path IS '部门全路径'; +COMMENT ON COLUMN message.tb_message_receiver.creator IS '创建者'; +COMMENT ON COLUMN message.tb_message_receiver.updater IS '更新者'; +COMMENT ON COLUMN message.tb_message_receiver.create_time IS '创建时间(接收时间)'; +COMMENT ON COLUMN message.tb_message_receiver.update_time IS '更新时间'; +COMMENT ON COLUMN message.tb_message_receiver.delete_time IS '删除时间'; +COMMENT ON COLUMN message.tb_message_receiver.deleted IS '是否删除'; + + +-- 消息渠道配置表(管理各种消息发送渠道的配置) +DROP TABLE IF EXISTS message.tb_message_channel CASCADE; +CREATE TABLE message.tb_message_channel ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + channel_id VARCHAR(50) NOT NULL, -- 渠道ID + channel_code VARCHAR(50) NOT NULL, -- 渠道编码:app/sms/email/wechat/dingtalk等 + channel_name VARCHAR(100) NOT NULL, -- 渠道名称 + channel_desc VARCHAR(255) DEFAULT NULL, -- 渠道描述 + config JSON DEFAULT NULL, -- 渠道配置(如API密钥、服务器地址等) + status VARCHAR(20) NOT NULL DEFAULT 'enabled', -- 渠道状态:enabled-启用/disabled-禁用/maintenance-维护中 + priority INTEGER DEFAULT 0, -- 优先级(数字越大优先级越高) + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径(数据隔离) + creator VARCHAR(50) NOT NULL DEFAULT 'system',-- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (channel_id), + UNIQUE (optsn), + UNIQUE (channel_code) +); + +COMMENT ON TABLE message.tb_message_channel IS '消息渠道配置表'; +COMMENT ON COLUMN message.tb_message_channel.optsn IS '流水号'; +COMMENT ON COLUMN message.tb_message_channel.channel_id IS '渠道ID'; +COMMENT ON COLUMN message.tb_message_channel.channel_code IS '渠道编码:app/sms/email/wechat/dingtalk等'; +COMMENT ON COLUMN message.tb_message_channel.channel_name IS '渠道名称'; +COMMENT ON COLUMN message.tb_message_channel.channel_desc IS '渠道描述'; +COMMENT ON COLUMN message.tb_message_channel.config IS '渠道配置(JSON格式)'; +COMMENT ON COLUMN message.tb_message_channel.status IS '渠道状态:enabled-启用/disabled-禁用/maintenance-维护中'; +COMMENT ON COLUMN message.tb_message_channel.priority IS '优先级(数字越大优先级越高)'; +COMMENT ON COLUMN message.tb_message_channel.dept_path IS '部门全路径'; +COMMENT ON COLUMN message.tb_message_channel.creator IS '创建者'; +COMMENT ON COLUMN message.tb_message_channel.updater IS '更新者'; +COMMENT ON COLUMN message.tb_message_channel.create_time IS '创建时间'; +COMMENT ON COLUMN message.tb_message_channel.update_time IS '更新时间'; +COMMENT ON COLUMN message.tb_message_channel.delete_time IS '删除时间'; +COMMENT ON COLUMN message.tb_message_channel.deleted IS '是否删除'; + +-- ============================= +-- 消息模板表 +-- ============================= +DROP TABLE IF EXISTS message.tb_message_template CASCADE; +CREATE TABLE message.tb_message_template ( + optsn VARCHAR(50) NOT NULL, + template_id VARCHAR(50) NOT NULL, + template_code VARCHAR(100) NOT NULL, -- 模板编码 + template_name VARCHAR(255) NOT NULL, -- 模板名称 + template_type VARCHAR(30) NOT NULL, -- 模板类型:system-系统/business-业务 + title_template TEXT, -- 标题模板(支持变量) + content_template TEXT NOT NULL, -- 内容模板(支持变量) + variables JSONB, -- 模板变量定义 + service VARCHAR(50) NOT NULL, -- 服务类型 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (template_id), + UNIQUE (optsn), + UNIQUE (template_code) +); + +COMMENT ON TABLE message.tb_message_template IS '消息模板表'; +COMMENT ON COLUMN message.tb_message_template.optsn IS '流水号'; +COMMENT ON COLUMN message.tb_message_template.template_id IS '模板ID'; +COMMENT ON COLUMN message.tb_message_template.template_code IS '模板编码'; +COMMENT ON COLUMN message.tb_message_template.template_name IS '模板名称'; +COMMENT ON COLUMN message.tb_message_template.template_type IS '模板类型:system-系统/business-业务'; +COMMENT ON COLUMN message.tb_message_template.title_template IS '标题模板(支持变量)'; +COMMENT ON COLUMN message.tb_message_template.content_template IS '内容模板(支持变量)'; +COMMENT ON COLUMN message.tb_message_template.variables IS '模板变量定义'; +COMMENT ON COLUMN message.tb_message_template.service IS '服务类型'; +COMMENT ON COLUMN message.tb_message_template.dept_path IS '部门全路径'; +COMMENT ON COLUMN message.tb_message_template.creator IS '创建者'; +COMMENT ON COLUMN message.tb_message_template.updater IS '更新者'; +COMMENT ON COLUMN message.tb_message_template.create_time IS '创建时间'; +COMMENT ON COLUMN message.tb_message_template.update_time IS '更新时间'; +COMMENT ON COLUMN message.tb_message_template.delete_time IS '删除时间'; +COMMENT ON COLUMN message.tb_message_template.deleted IS '是否删除'; + +CREATE INDEX idx_template_type ON message.tb_message_template(template_type) WHERE deleted = false; diff --git a/docker/urbanLifeline/postgres/init/sql/createTablePermission.sql b/docker/urbanLifeline/postgres/init/sql/createTablePermission.sql new file mode 100644 index 00000000..dcf5082a --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/createTablePermission.sql @@ -0,0 +1,473 @@ +CREATE SCHEMA IF NOT EXISTS sys; + +-- 通用更新时间触发函数(用于模拟 MySQL 的 ON UPDATE CURRENT_TIMESTAMP) +-- CREATE OR REPLACE FUNCTION sys.set_update_time() +-- RETURNS trigger AS $$ +-- BEGIN +-- NEW.update_time := CURRENT_TIMESTAMP; +-- RETURN NEW; +-- END; +-- $$ LANGUAGE plpgsql; + +-- 部门表 +DROP TABLE IF EXISTS sys.tb_sys_dept CASCADE; +CREATE TABLE sys.tb_sys_dept ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + dept_id VARCHAR(50) NOT NULL, -- 部门ID + name VARCHAR(100) NOT NULL, -- 部门名称 + parent_id VARCHAR(50) DEFAULT NULL, -- 父部门ID + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + description VARCHAR(255) DEFAULT NULL, -- 部门描述 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(由触发器维护) + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (dept_id), + UNIQUE (optsn) +); +-- 创建索引 +CREATE INDEX idx_sys_dept_parent ON sys.tb_sys_dept USING btree (parent_id); +COMMENT ON TABLE sys.tb_sys_dept IS '部门表'; +COMMENT ON COLUMN sys.tb_sys_dept.optsn IS '流水号'; +COMMENT ON COLUMN sys.tb_sys_dept.dept_id IS '部门ID'; +COMMENT ON COLUMN sys.tb_sys_dept.name IS '部门名称'; +COMMENT ON COLUMN sys.tb_sys_dept.parent_id IS '父部门ID'; +COMMENT ON COLUMN sys.tb_sys_dept.dept_path IS '部门全路径'; +COMMENT ON COLUMN sys.tb_sys_dept.description IS '部门描述'; +COMMENT ON COLUMN sys.tb_sys_dept.creator IS '创建者'; +COMMENT ON COLUMN sys.tb_sys_dept.updater IS '更新者'; +COMMENT ON COLUMN sys.tb_sys_dept.create_time IS '创建时间'; +COMMENT ON COLUMN sys.tb_sys_dept.update_time IS '更新时间'; +COMMENT ON COLUMN sys.tb_sys_dept.delete_time IS '删除时间'; +COMMENT ON COLUMN sys.tb_sys_dept.deleted IS '是否删除'; + +-- 角色表 +DROP TABLE IF EXISTS sys.tb_sys_role CASCADE; +CREATE TABLE sys.tb_sys_role ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + role_id VARCHAR(50) NOT NULL, -- 角色ID + name VARCHAR(100) NOT NULL, + description VARCHAR(200) DEFAULT NULL, -- 角色名称 + scope VARCHAR(20) NOT NULL DEFAULT 'dept', -- 角色作用域:global/dept + owner_dept_id VARCHAR(50) DEFAULT NULL, -- 当scope=dept时,所属部门ID + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + dept_path VARCHAR(255) DEFAULT NULL, + status BOOLEAN NOT NULL DEFAULT false, -- 部门全路径 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(由触发器维护) + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (role_id), + UNIQUE (optsn) +); +COMMENT ON TABLE sys.tb_sys_role IS '角色表'; +COMMENT ON COLUMN sys.tb_sys_role.optsn IS '流水号'; +COMMENT ON COLUMN sys.tb_sys_role.role_id IS '角色ID'; +COMMENT ON COLUMN sys.tb_sys_role.name IS '角色名称'; +COMMENT ON COLUMN sys.tb_sys_role.description IS '角色名称'; +COMMENT ON COLUMN sys.tb_sys_role.scope IS '角色作用域:global=通用,dept=部门私有'; +COMMENT ON COLUMN sys.tb_sys_role.owner_dept_id IS '部门私有角色的所属部门ID(scope=dept 时必填)'; +COMMENT ON COLUMN sys.tb_sys_role.status IS '角色状态'; +COMMENT ON COLUMN sys.tb_sys_role.creator IS '创建者'; +COMMENT ON COLUMN sys.tb_sys_role.dept_path IS '部门全路径'; +COMMENT ON COLUMN sys.tb_sys_role.updater IS '更新者'; +COMMENT ON COLUMN sys.tb_sys_role.create_time IS '创建时间'; +COMMENT ON COLUMN sys.tb_sys_role.update_time IS '更新时间'; +COMMENT ON COLUMN sys.tb_sys_role.delete_time IS '删除时间'; +COMMENT ON COLUMN sys.tb_sys_role.deleted IS '是否删除'; + +-- 唯一性: +-- 全局角色:name 在未删除且 scope=global 下唯一 +-- 部门私有角色:同一部门下 name 唯一(scope=dept) +CREATE UNIQUE INDEX IF NOT EXISTS uq_sys_role_global_name + ON sys.tb_sys_role USING btree (name) + WHERE deleted = false AND scope = 'global'; +CREATE UNIQUE INDEX IF NOT EXISTS uq_sys_role_dept_name + ON sys.tb_sys_role USING btree (owner_dept_id, name) + WHERE deleted = false AND scope = 'dept'; +CREATE INDEX IF NOT EXISTS idx_sys_role_owner_dept ON sys.tb_sys_role USING btree (owner_dept_id) WHERE deleted = false; + +-- 部门角色关联表 +DROP TABLE IF EXISTS sys.tb_sys_dept_role CASCADE; +CREATE TABLE sys.tb_sys_dept_role ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + dept_id VARCHAR(50) NOT NULL, -- 部门ID + role_id VARCHAR(50) NOT NULL, -- 角色ID + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(由触发器维护) + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (dept_id, role_id), + UNIQUE (optsn) +); +COMMENT ON TABLE sys.tb_sys_dept_role IS '部门角色关联表'; +COMMENT ON COLUMN sys.tb_sys_dept_role.optsn IS '流水号'; +COMMENT ON COLUMN sys.tb_sys_dept_role.dept_id IS '部门ID'; +COMMENT ON COLUMN sys.tb_sys_dept_role.role_id IS '角色ID'; +COMMENT ON COLUMN sys.tb_sys_dept_role.dept_path IS '部门全路径'; +COMMENT ON COLUMN sys.tb_sys_dept_role.creator IS '创建者'; +COMMENT ON COLUMN sys.tb_sys_dept_role.updater IS '更新者'; +COMMENT ON COLUMN sys.tb_sys_dept_role.create_time IS '创建时间'; +COMMENT ON COLUMN sys.tb_sys_dept_role.update_time IS '更新时间'; +COMMENT ON COLUMN sys.tb_sys_dept_role.delete_time IS '删除时间'; +COMMENT ON COLUMN sys.tb_sys_dept_role.deleted IS '是否删除'; + +-- 用户角色关联表 +DROP TABLE IF EXISTS sys.tb_sys_user_role CASCADE; +CREATE TABLE sys.tb_sys_user_role ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + user_id VARCHAR(50) NOT NULL, -- 用户ID + role_id VARCHAR(50) NOT NULL, -- 角色ID + dept_id VARCHAR(50) NOT NULL, -- 部门ID + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(由触发器维护) + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (user_id, role_id), + UNIQUE (optsn) +); +COMMENT ON TABLE sys.tb_sys_user_role IS '用户角色关联表'; +COMMENT ON COLUMN sys.tb_sys_user_role.optsn IS '流水号'; +COMMENT ON COLUMN sys.tb_sys_user_role.user_id IS '用户ID'; +COMMENT ON COLUMN sys.tb_sys_user_role.role_id IS '角色ID'; +COMMENT ON COLUMN sys.tb_sys_user_role.dept_id IS '部门ID'; +COMMENT ON COLUMN sys.tb_sys_user_role.dept_path IS '部门全路径'; +COMMENT ON COLUMN sys.tb_sys_user_role.creator IS '创建者'; +COMMENT ON COLUMN sys.tb_sys_user_role.updater IS '更新者'; +COMMENT ON COLUMN sys.tb_sys_user_role.create_time IS '创建时间'; +COMMENT ON COLUMN sys.tb_sys_user_role.update_time IS '更新时间'; +COMMENT ON COLUMN sys.tb_sys_user_role.delete_time IS '删除时间'; +COMMENT ON COLUMN sys.tb_sys_user_role.deleted IS '是否删除'; + +-- 视图表 +DROP TABLE IF EXISTS sys.tb_sys_view CASCADE; +CREATE TABLE sys.tb_sys_view ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + view_id VARCHAR(50) NOT NULL, -- 视图ID + name VARCHAR(100) NOT NULL, -- 视图名称 + parent_id VARCHAR(50) DEFAULT NULL, -- 父视图ID + url VARCHAR(255) DEFAULT NULL, -- 视图URL + component VARCHAR(255) DEFAULT NULL, -- 视图组件 + icon VARCHAR(100) DEFAULT NULL, -- 视图图标 + type INTEGER DEFAULT 0, -- 视图类型:0=导航栏 1=侧边栏 2=按钮,3空白页 + view_type VARCHAR(20) DEFAULT 'route', -- 页面类型:route=路由页面 iframe=嵌入页面 + iframe_url VARCHAR(500) DEFAULT NULL, -- iframe URL(仅当view_type=iframe时有效) + service VARCHAR(20) DEFAULT 'platform', -- 所属服务:platform=平台应用 bidding=招标应用 workcase=客服应用 + layout VARCHAR(100) DEFAULT NULL, -- 布局组件路径名称 + order_num INTEGER DEFAULT 0, -- 视图排序号 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + description VARCHAR(255) DEFAULT NULL, -- 视图描述 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(由触发器维护) + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (view_id), + UNIQUE (optsn) +); +-- 创建索引 +CREATE INDEX idx_sys_view_parent ON sys.tb_sys_view USING btree (parent_id) WHERE deleted = false; +CREATE INDEX idx_sys_view_service ON sys.tb_sys_view USING btree (service) WHERE deleted = false; +CREATE INDEX idx_sys_view_type ON sys.tb_sys_view USING btree (view_type) WHERE deleted = false; +COMMENT ON TABLE sys.tb_sys_view IS '视图表(菜单表)'; +COMMENT ON COLUMN sys.tb_sys_view.optsn IS '流水号'; +COMMENT ON COLUMN sys.tb_sys_view.view_id IS '视图ID'; +COMMENT ON COLUMN sys.tb_sys_view.name IS '视图名称'; +COMMENT ON COLUMN sys.tb_sys_view.parent_id IS '父视图ID'; +COMMENT ON COLUMN sys.tb_sys_view.url IS '视图URL'; +COMMENT ON COLUMN sys.tb_sys_view.component IS '视图组件'; +COMMENT ON COLUMN sys.tb_sys_view.icon IS '视图图标'; +COMMENT ON COLUMN sys.tb_sys_view.type IS '视图类型:0=目录 1=菜单页面 2=按钮'; +COMMENT ON COLUMN sys.tb_sys_view.view_type IS '页面类型:route=路由页面 iframe=嵌入页面'; +COMMENT ON COLUMN sys.tb_sys_view.iframe_url IS 'iframe URL(仅当view_type=iframe时有效)'; +COMMENT ON COLUMN sys.tb_sys_view.service IS '所属服务:platform=平台应用 bidding=招标应用 workcase=客服应用'; +COMMENT ON COLUMN sys.tb_sys_view.layout IS '布局组件路径名称'; +COMMENT ON COLUMN sys.tb_sys_view.order_num IS '视图排序号'; +COMMENT ON COLUMN sys.tb_sys_view.description IS '视图描述'; +COMMENT ON COLUMN sys.tb_sys_view.dept_path IS '部门全路径'; +COMMENT ON COLUMN sys.tb_sys_view.creator IS '创建者'; +COMMENT ON COLUMN sys.tb_sys_view.updater IS '更新者'; +COMMENT ON COLUMN sys.tb_sys_view.create_time IS '创建时间'; +COMMENT ON COLUMN sys.tb_sys_view.update_time IS '更新时间'; +COMMENT ON COLUMN sys.tb_sys_view.delete_time IS '删除时间'; +COMMENT ON COLUMN sys.tb_sys_view.deleted IS '是否删除'; + + +-- 模块表 +DROP TABLE IF EXISTS sys.tb_sys_module CASCADE; +CREATE TABLE sys.tb_sys_module ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + module_id VARCHAR(50) NOT NULL, -- 模块ID + name VARCHAR(100) NOT NULL, -- 模块名称 + description VARCHAR(255) DEFAULT NULL, -- 模块描述 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(由触发器维护) + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (module_id), + UNIQUE (optsn) +); +COMMENT ON TABLE sys.tb_sys_module IS '模块表'; +COMMENT ON COLUMN sys.tb_sys_module.optsn IS '流水号'; +COMMENT ON COLUMN sys.tb_sys_module.module_id IS '模块ID'; +COMMENT ON COLUMN sys.tb_sys_module.name IS '模块名称'; +COMMENT ON COLUMN sys.tb_sys_module.description IS '模块描述'; +COMMENT ON COLUMN sys.tb_sys_module.creator IS '创建者'; +COMMENT ON COLUMN sys.tb_sys_module.dept_path IS '部门全路径'; +COMMENT ON COLUMN sys.tb_sys_module.updater IS '更新者'; +COMMENT ON COLUMN sys.tb_sys_module.create_time IS '创建时间'; +COMMENT ON COLUMN sys.tb_sys_module.update_time IS '更新时间'; +COMMENT ON COLUMN sys.tb_sys_module.delete_time IS '删除时间'; +COMMENT ON COLUMN sys.tb_sys_module.deleted IS '是否删除'; + +-- 权限表 +DROP TABLE IF EXISTS sys.tb_sys_permission CASCADE; +CREATE TABLE sys.tb_sys_permission ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + permission_id VARCHAR(50) NOT NULL, -- 权限ID + name VARCHAR(100) NOT NULL, -- 权限名称 + code VARCHAR(100) NOT NULL, -- 权限代码 + description VARCHAR(255) DEFAULT NULL, -- 权限描述 + module_id VARCHAR(50) DEFAULT NULL, -- 所属模块ID + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + dept_path VARCHAR(255) DEFAULT NULL, + status BOOLEAN NOT NULL DEFAULT false, -- 部门全路径 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(由触发器维护) + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (permission_id), + UNIQUE (optsn) +); +COMMENT ON TABLE sys.tb_sys_permission IS '权限表'; +COMMENT ON COLUMN sys.tb_sys_permission.optsn IS '流水号'; +COMMENT ON COLUMN sys.tb_sys_permission.permission_id IS '权限ID'; +COMMENT ON COLUMN sys.tb_sys_permission.name IS '权限名称'; +COMMENT ON COLUMN sys.tb_sys_permission.code IS '权限代码'; +COMMENT ON COLUMN sys.tb_sys_permission.description IS '权限描述' ; +COMMENT ON COLUMN sys.tb_sys_permission.module_id IS '所属模块ID'; +COMMENT ON COLUMN sys.tb_sys_permission.creator IS '创建者'; +COMMENT ON COLUMN sys.tb_sys_permission.dept_path IS '部门全路径'; +COMMENT ON COLUMN sys.tb_sys_permission.status IS '角色状态'; +COMMENT ON COLUMN sys.tb_sys_permission.updater IS '更新者'; +COMMENT ON COLUMN sys.tb_sys_permission.create_time IS '创建时间'; +COMMENT ON COLUMN sys.tb_sys_permission.update_time IS '更新时间'; +COMMENT ON COLUMN sys.tb_sys_permission.delete_time IS '删除时间'; +COMMENT ON COLUMN sys.tb_sys_permission.deleted IS '是否删除'; + +-- 角色权限 +DROP TABLE IF EXISTS sys.tb_sys_role_permission CASCADE; +CREATE TABLE sys.tb_sys_role_permission ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + role_id VARCHAR(50) NOT NULL, -- 角色ID + permission_id VARCHAR(50) NOT NULL, -- 权限ID + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(由触发器维护) + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (role_id, permission_id), + UNIQUE (optsn) +); +COMMENT ON TABLE sys.tb_sys_role_permission IS '角色权限表'; +COMMENT ON COLUMN sys.tb_sys_role_permission.optsn IS '流水号'; +COMMENT ON COLUMN sys.tb_sys_role_permission.role_id IS '角色ID'; +COMMENT ON COLUMN sys.tb_sys_role_permission.permission_id IS '权限ID'; +COMMENT ON COLUMN sys.tb_sys_role_permission.creator IS '创建者'; +COMMENT ON COLUMN sys.tb_sys_role_permission.dept_path IS '部门全路径'; +COMMENT ON COLUMN sys.tb_sys_role_permission.updater IS '更新者'; +COMMENT ON COLUMN sys.tb_sys_role_permission.create_time IS '创建时间'; +COMMENT ON COLUMN sys.tb_sys_role_permission.update_time IS '更新时间'; +COMMENT ON COLUMN sys.tb_sys_role_permission.delete_time IS '删除时间'; +COMMENT ON COLUMN sys.tb_sys_role_permission.deleted IS '是否删除'; + +-- 视图权限 +DROP TABLE IF EXISTS sys.tb_sys_view_permission CASCADE; +CREATE TABLE sys.tb_sys_view_permission ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + view_id VARCHAR(50) NOT NULL, -- 视图ID + permission_id VARCHAR(50) NOT NULL, -- 权限ID + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(由触发器维护) + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (view_id, permission_id), + UNIQUE (optsn) +); +COMMENT ON TABLE sys.tb_sys_view_permission IS '视图权限表'; +COMMENT ON COLUMN sys.tb_sys_view_permission.optsn IS '流水号'; +COMMENT ON COLUMN sys.tb_sys_view_permission.view_id IS '视图ID'; +COMMENT ON COLUMN sys.tb_sys_view_permission.permission_id IS '权限ID'; +COMMENT ON COLUMN sys.tb_sys_view_permission.creator IS '创建者'; +COMMENT ON COLUMN sys.tb_sys_view_permission.dept_path IS '部门全路径'; +COMMENT ON COLUMN sys.tb_sys_view_permission.updater IS '更新者'; +COMMENT ON COLUMN sys.tb_sys_view_permission.create_time IS '创建时间'; +COMMENT ON COLUMN sys.tb_sys_view_permission.update_time IS '更新时间'; +COMMENT ON COLUMN sys.tb_sys_view_permission.delete_time IS '删除时间'; +COMMENT ON COLUMN sys.tb_sys_view_permission.deleted IS '是否删除'; + +-- 为所有表创建更新时间触发器 +-- DROP TRIGGER IF EXISTS trg_tb_sys_dept_update_time ON sys.tb_sys_dept; +-- CREATE TRIGGER trg_tb_sys_dept_update_time +-- BEFORE UPDATE ON sys.tb_sys_dept +-- FOR EACH ROW +-- EXECUTE FUNCTION sys.set_update_time(); + +-- DROP TRIGGER IF EXISTS trg_tb_sys_role_update_time ON sys.tb_sys_role; +-- CREATE TRIGGER trg_tb_sys_role_update_time +-- BEFORE UPDATE ON sys.tb_sys_role +-- FOR EACH ROW +-- EXECUTE FUNCTION sys.set_update_time(); + +-- DROP TRIGGER IF EXISTS trg_tb_sys_dept_role_update_time ON sys.tb_sys_dept_role; +-- CREATE TRIGGER trg_tb_sys_dept_role_update_time +-- BEFORE UPDATE ON sys.tb_sys_dept_role +-- FOR EACH ROW +-- EXECUTE FUNCTION sys.set_update_time(); + +-- DROP TRIGGER IF EXISTS trg_tb_sys_user_role_update_time ON sys.tb_sys_user_role; +-- CREATE TRIGGER trg_tb_sys_user_role_update_time +-- BEFORE UPDATE ON sys.tb_sys_user_role +-- FOR EACH ROW +-- EXECUTE FUNCTION sys.set_update_time(); + +-- DROP TRIGGER IF EXISTS trg_tb_sys_view_update_time ON sys.tb_sys_view; +-- CREATE TRIGGER trg_tb_sys_view_update_time +-- BEFORE UPDATE ON sys.tb_sys_view +-- FOR EACH ROW +-- EXECUTE FUNCTION sys.set_update_time(); + +-- DROP TRIGGER IF EXISTS trg_tb_sys_module_update_time ON sys.tb_sys_module; +-- CREATE TRIGGER trg_tb_sys_module_update_time +-- BEFORE UPDATE ON sys.tb_sys_module +-- FOR EACH ROW +-- EXECUTE FUNCTION sys.set_update_time(); + +-- DROP TRIGGER IF EXISTS trg_tb_sys_permission_update_time ON sys.tb_sys_permission; +-- CREATE TRIGGER trg_tb_sys_permission_update_time +-- BEFORE UPDATE ON sys.tb_sys_permission +-- FOR EACH ROW +-- EXECUTE FUNCTION sys.set_update_time(); + +-- DROP TRIGGER IF EXISTS trg_tb_sys_role_permission_update_time ON sys.tb_sys_role_permission; +-- CREATE TRIGGER trg_tb_sys_role_permission_update_time +-- BEFORE UPDATE ON sys.tb_sys_role_permission +-- FOR EACH ROW +-- EXECUTE FUNCTION sys.set_update_time(); + +-- DROP TRIGGER IF EXISTS trg_tb_sys_view_permission_update_time ON sys.tb_sys_view_permission; +-- CREATE TRIGGER trg_tb_sys_view_permission_update_time +-- BEFORE UPDATE ON sys.tb_sys_view_permission +-- FOR EACH ROW +-- EXECUTE FUNCTION sys.set_update_time(); + +-- ============================= +-- 通用对象级权限(ACL) +-- 支持对象类型:任意(如 article/file/course/...) +-- 支持主体:user/dept/role +-- 权限位:1=读(read),2=写(write),4=执行(exec),可相加 +-- include_descendants:当主体为 dept/role 时,是否包含其子级(便于“所有子级可查看”场景) +-- allow:true=允许;false=显式拒绝(拒绝优先生效) +-- dept_path:用于数据范围隔离(与现有规则一致) +-- ============================= + +DROP TABLE IF EXISTS sys.tb_sys_acl CASCADE; +CREATE TABLE sys.tb_sys_acl ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + acl_id VARCHAR(50) NOT NULL, -- ACL主键 + object_type VARCHAR(50) NOT NULL, -- 对象类型:article/file/course/... + object_id VARCHAR(50) NOT NULL, -- 对象ID + principal_type VARCHAR(20) NOT NULL, -- 主体类型:user/dept/role + principal_id VARCHAR(50) NOT NULL, -- 主体ID + principal_dept_id VARCHAR(50) DEFAULT NULL, -- 当主体为role且限定到某部门时的部门ID(支持“某部门的某角色”) + permission SMALLINT NOT NULL, -- 权限位:1读 2写 4执行 + allow BOOLEAN NOT NULL DEFAULT true, -- 允许或显式拒绝 + include_descendants BOOLEAN NOT NULL DEFAULT false, -- 是否包含子级(对dept/role生效) + dept_path VARCHAR(255) DEFAULT NULL, -- 部门全路径(数据隔离) + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + updater VARCHAR(50) DEFAULT NULL, -- 更新者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (acl_id), + UNIQUE (object_type, object_id, principal_type, principal_id, principal_dept_id, deleted), + UNIQUE (optsn) +); + +COMMENT ON TABLE sys.tb_sys_acl IS '通用对象级权限表(ACL)'; +COMMENT ON COLUMN sys.tb_sys_acl.object_type IS '对象类型:article/file/course/...'; +COMMENT ON COLUMN sys.tb_sys_acl.object_id IS '对象ID'; +COMMENT ON COLUMN sys.tb_sys_acl.principal_type IS '主体类型:user/dept/role'; +COMMENT ON COLUMN sys.tb_sys_acl.principal_id IS '主体ID'; +COMMENT ON COLUMN sys.tb_sys_acl.principal_dept_id IS '当主体为角色时,可选的限定部门ID(某部门的某角色)'; +COMMENT ON COLUMN sys.tb_sys_acl.permission IS '权限位:1读 2写 4执行,可相加'; +COMMENT ON COLUMN sys.tb_sys_acl.allow IS '是否允许(false=显式拒绝)'; +COMMENT ON COLUMN sys.tb_sys_acl.include_descendants IS '是否包含子级(dept/role时启用)'; +COMMENT ON COLUMN sys.tb_sys_acl.dept_path IS '部门全路径(用于数据范围隔离)'; + +CREATE INDEX idx_sys_acl_object ON sys.tb_sys_acl USING btree (object_type, object_id) WHERE deleted = false; +CREATE INDEX idx_sys_acl_principal ON sys.tb_sys_acl USING btree (principal_type, principal_id) WHERE deleted = false; +CREATE INDEX idx_sys_acl_dept_path ON sys.tb_sys_acl USING btree (dept_path) WHERE deleted = false; +-- 针对“某部门的某角色”的检索优化 +CREATE INDEX idx_sys_acl_role_scoped ON sys.tb_sys_acl USING btree (principal_id, principal_dept_id) + WHERE deleted = false AND principal_type = 'role'; + +-- ============================= +-- ACL 策略表:定义对象类型的层级可见/可编辑规则 +-- 例如: +-- - 同级与父级管理员可修改(edit_hierarchy_rule = 'parent_or_same_admin') +-- - 子级全部可查看(view_hierarchy_rule = 'children_all') +-- - 课程:下级只有指定部门/角色可查看(view_hierarchy_rule = 'children_specified') +-- 说明:业务侧需结合“管理员”的判定(通常由角色判定)在应用层实现;本表做规则声明 +-- ============================= + +DROP TABLE IF EXISTS sys.tb_sys_acl_policy CASCADE; +CREATE TABLE sys.tb_sys_acl_policy ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + policy_id VARCHAR(50) NOT NULL, -- 策略ID + name VARCHAR(255) NOT NULL, -- 策略名称 + object_type VARCHAR(50) NOT NULL, -- 目标对象类型 + edit_hierarchy_rule VARCHAR(50) DEFAULT NULL, -- 编辑层级规则:parent_only/parent_or_same_admin/owner_only/none + view_hierarchy_rule VARCHAR(50) DEFAULT NULL, -- 查看层级规则:children_all/children_specified/none + default_permission SMALLINT DEFAULT 0, -- 默认权限位(无显式ACL时应用) + default_allow BOOLEAN DEFAULT true, -- 默认是否允许 + apply_to_children BOOLEAN DEFAULT true, -- 是否默认应用到子级 + creator VARCHAR(50) DEFAULT NULL, + updater VARCHAR(50) DEFAULT NULL, + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), + update_time TIMESTAMPTZ DEFAULT NULL, + delete_time TIMESTAMPTZ DEFAULT NULL, + deleted BOOLEAN NOT NULL DEFAULT false, + PRIMARY KEY (policy_id), + UNIQUE (object_type, deleted), + UNIQUE (optsn) +); + +COMMENT ON TABLE sys.tb_sys_acl_policy IS 'ACL对象类型策略表(层级可见/可编辑规则)'; +COMMENT ON COLUMN sys.tb_sys_acl_policy.object_type IS '对象类型:article/file/course/...'; +COMMENT ON COLUMN sys.tb_sys_acl_policy.edit_hierarchy_rule IS '编辑层级规则:parent_only/parent_or_same_admin/owner_only/none'; +COMMENT ON COLUMN sys.tb_sys_acl_policy.view_hierarchy_rule IS '查看层级规则:children_all/children_specified/none'; +COMMENT ON COLUMN sys.tb_sys_acl_policy.default_permission IS '默认权限位(无显式ACL时兜底)'; +COMMENT ON COLUMN sys.tb_sys_acl_policy.apply_to_children IS '默认是否应用到子级'; + +CREATE INDEX idx_sys_acl_policy_object ON sys.tb_sys_acl_policy USING btree (object_type) WHERE deleted = false; \ No newline at end of file diff --git a/docker/urbanLifeline/postgres/init/sql/createTableUser.sql b/docker/urbanLifeline/postgres/init/sql/createTableUser.sql new file mode 100644 index 00000000..22e0f225 --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/createTableUser.sql @@ -0,0 +1,124 @@ + +-- 创建 sys schema(如果不存在) +CREATE SCHEMA IF NOT EXISTS sys; + +-- 用户表 +DROP TABLE IF EXISTS sys.tb_sys_user CASCADE; +CREATE TABLE sys.tb_sys_user ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + user_id VARCHAR(50) NOT NULL, -- 用户ID + usercode VARCHAR(100) DEFAULT NULL, -- 用户code。sso同步数据获取 + password VARCHAR(128) NOT NULL, -- 密码(建议存储 bcrypt/argon2 哈希) + email VARCHAR(100), -- 电子邮件 + phone VARCHAR(500), -- 电话号码 + phone_hash VARCHAR(200), -- 电话hash + wechat_id VARCHAR(50), -- 微信ID + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间(使用带时区时间) + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(由触发器维护) + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除(使用 BOOLEAN) + status INTEGER NOT NULL DEFAULT 1, -- 状态 + remark VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (user_id), + UNIQUE (optsn), + UNIQUE (email), + UNIQUE (phone), + UNIQUE (wechat_id), + UNIQUE (usercode) +); +CREATE INDEX idx_tb_sys_user_phone ON sys.tb_sys_user USING btree (phone); + +-- 按 email 域名建立表达式索引(对域名小写处理以实现不区分大小写的域名查询) +-- 使用 split_part(email, '@', 2) 提取 @ 之后的域名部分,再做 lower() 归一化 +-- WHERE email IS NOT NULL 可以避免索引包含大量 NULL +CREATE INDEX idx_tb_sys_user_email_domain ON sys.tb_sys_user USING btree (lower(split_part(email, '@', 2))) + WHERE email IS NOT NULL; +CREATE INDEX idx_tb_sys_user_wechat_id ON sys.tb_sys_user USING btree (wechat_id); + +-- 可选:保留列注释(如果你想把 MySQL 的 COMMENT 同步到 Postgres) +COMMENT ON TABLE sys.tb_sys_user IS '用户表'; +COMMENT ON COLUMN sys.tb_sys_user.optsn IS '流水号'; +COMMENT ON COLUMN sys.tb_sys_user.user_id IS '用户ID'; +COMMENT ON COLUMN sys.tb_sys_user.password IS '密码(建议存储 bcrypt/argon2 哈希)'; +COMMENT ON COLUMN sys.tb_sys_user.email IS '电子邮件'; +COMMENT ON COLUMN sys.tb_sys_user.phone IS '电话号码'; +COMMENT ON COLUMN sys.tb_sys_user.wechat_id IS '微信ID'; +COMMENT ON COLUMN sys.tb_sys_user.create_time IS '创建时间'; +COMMENT ON COLUMN sys.tb_sys_user.update_time IS '更新时间'; +COMMENT ON COLUMN sys.tb_sys_user.delete_time IS '删除时间'; +COMMENT ON COLUMN sys.tb_sys_user.deleted IS '是否删除'; +COMMENT ON COLUMN sys.tb_sys_user.status IS '状态'; + +-- 用户信息表 +DROP TABLE IF EXISTS sys.tb_sys_user_info CASCADE; +CREATE TABLE sys.tb_sys_user_info ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + user_id VARCHAR(50) NOT NULL, -- 用户ID + avatar VARCHAR(255), -- 头像 + gender INTEGER DEFAULT 0, -- 性别 + username VARCHAR(100) NOT NULL, -- 用户名 + level INTEGER DEFAULT 1, -- 等级 + id_card VARCHAR(50), -- 身份证号 + address VARCHAR(255), -- 地址 + creator VARCHAR(50) DEFAULT NULL, -- 创建者 + remark VARCHAR(500) DEFAULT NULL, -- 备注 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间(触发器维护) + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (user_id), + UNIQUE (optsn) +); +COMMENT ON TABLE sys.tb_sys_user_info IS '用户信息表'; +COMMENT ON COLUMN sys.tb_sys_user_info.optsn IS '流水号'; +COMMENT ON COLUMN sys.tb_sys_user_info.user_id IS '用户ID'; +COMMENT ON COLUMN sys.tb_sys_user_info.avatar IS '头像'; +COMMENT ON COLUMN sys.tb_sys_user_info.gender IS '性别'; +COMMENT ON COLUMN sys.tb_sys_user_info.username IS '用户名'; +COMMENT ON COLUMN sys.tb_sys_user_info.level IS '等级'; +COMMENT ON COLUMN sys.tb_sys_user_info.id_card IS '身份证号'; +COMMENT ON COLUMN sys.tb_sys_user_info.address IS '地址'; +COMMENT ON COLUMN sys.tb_sys_user_info.remark IS '备注'; +COMMENT ON COLUMN sys.tb_sys_user_info.create_time IS '创建时间'; +COMMENT ON COLUMN sys.tb_sys_user_info.update_time IS '更新时间'; +COMMENT ON COLUMN sys.tb_sys_user_info.delete_time IS '删除时间'; +COMMENT ON COLUMN sys.tb_sys_user_info.deleted IS '是否删除'; + +-- 登录日志表 +DROP TABLE IF EXISTS sys.tb_sys_login_log CASCADE; +CREATE TABLE sys.tb_sys_login_log ( + optsn VARCHAR(50) NOT NULL, -- 流水号(作为主键) + user_id VARCHAR(50) NOT NULL, -- 用户ID + username VARCHAR(50) NOT NULL, -- 用户名 + ip_address VARCHAR(45), -- IP地址 + ip_source VARCHAR(100), -- IP来源 + browser VARCHAR(100), -- 浏览器 + os VARCHAR(100), -- 操作系统 + password VARCHAR(128), -- 密码(建议存储 bcrypt/argon2 哈希) + login_time TIMESTAMPTZ DEFAULT now(), -- 登录时间 + status INTEGER DEFAULT 1, -- 登录状态(0失败 1成功) + error_count INTEGER DEFAULT 0, -- 错误次数 + message VARCHAR(255), -- 登录消息 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + PRIMARY KEY (optsn) +); +-- B-tree 索引(显式指定 USING btree,Postgres 默认即为 btree) +CREATE INDEX idx_tb_sys_login_log_user_id ON sys.tb_sys_login_log USING btree (user_id); +CREATE INDEX idx_tb_sys_login_log_login_time ON sys.tb_sys_login_log USING btree (login_time); + +-- 可选:保留列注释 +COMMENT ON TABLE sys.tb_sys_login_log IS '登录日志表'; +COMMENT ON COLUMN sys.tb_sys_login_log.optsn IS '流水号'; +COMMENT ON COLUMN sys.tb_sys_login_log.user_id IS '用户ID'; +COMMENT ON COLUMN sys.tb_sys_login_log.username IS '用户名'; +COMMENT ON COLUMN sys.tb_sys_login_log.ip_address IS 'IP地址'; +COMMENT ON COLUMN sys.tb_sys_login_log.ip_source IS 'IP来源'; +COMMENT ON COLUMN sys.tb_sys_login_log.browser IS '浏览器'; +COMMENT ON COLUMN sys.tb_sys_login_log.os IS '操作系统'; +COMMENT ON COLUMN sys.tb_sys_login_log.password IS '密码(建议存储 bcrypt/argon2 哈希)'; +COMMENT ON COLUMN sys.tb_sys_login_log.login_time IS '登录时间'; +COMMENT ON COLUMN sys.tb_sys_login_log.status IS '登录状态(0失败 1成功)'; +COMMENT ON COLUMN sys.tb_sys_login_log.error_count IS '错误次数'; +COMMENT ON COLUMN sys.tb_sys_login_log.message IS '登录消息'; +COMMENT ON COLUMN sys.tb_sys_login_log.create_time IS '创建时间'; diff --git a/docker/urbanLifeline/postgres/init/sql/createTableWorkcase.sql b/docker/urbanLifeline/postgres/init/sql/createTableWorkcase.sql new file mode 100644 index 00000000..cc2d3d57 --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/createTableWorkcase.sql @@ -0,0 +1,331 @@ +CREATE SCHEMA IF NOT EXISTS workcase; + +-- 系统外部人员(来客)管理 用于给系统外人员创建id +DROP TABLE IF EXISTS sys.tb_guest CASCADE; +CREATE TABLE sys.tb_guest( + optsn VARCHAR(50) NOT NULL, -- 流水号 + user_id VARCHAR(50) NOT NULL, -- 来客ID + name VARCHAR(50) NOT NULL, -- 姓名 + phone VARCHAR(50) DEFAULT NULL, -- 电话 + email VARCHAR(50) DEFAULT NULL, -- 邮箱 + wechat_id VARCHAR(50) DEFAULT NULL, -- 微信号 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 创建时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (user_id), + UNIQUE (wechat_id), + UNIQUE (phone), + UNIQUE (email) +); + + +-- ========================================== +-- IM聊天室 + Jitsi Meet 视频会议 表设计 +-- ========================================== + +-- 1. 聊天室表(核心表) +-- 一个工单对应一个聊天室,来客创建,客服人员可加入 +DROP TABLE IF EXISTS workcase.tb_chat_room CASCADE; +CREATE TABLE workcase.tb_chat_room( + optsn VARCHAR(50) NOT NULL, -- 流水号 + room_id VARCHAR(50) NOT NULL, -- 聊天室ID + workcase_id VARCHAR(50) DEFAULT NULL, -- 关联工单ID + room_name VARCHAR(200) NOT NULL, -- 聊天室名称(如:工单#12345的客服支持) + room_type VARCHAR(20) NOT NULL DEFAULT 'workcase', -- 聊天室类型:workcase-工单客服 + status VARCHAR(20) NOT NULL DEFAULT 'active', -- 状态:active-活跃 closed-已关闭 archived-已归档 + guest_id VARCHAR(50) NOT NULL, -- 来客ID(创建者) + guest_name VARCHAR(100) NOT NULL, -- 来客姓名 + ai_session_id VARCHAR(50) DEFAULT NULL, -- AI对话会话ID(从ai.tb_chat同步) + message_count INTEGER NOT NULL DEFAULT 0, -- 消息总数 + device_code VARCHAR(50) NOT NULL, -- 设备代码 + last_message_time TIMESTAMPTZ DEFAULT NULL, -- 最后消息时间 + last_message TEXT DEFAULT NULL, -- 最后一条消息内容(用于列表展示) + comment_level INTEGER DEFAULT 0, -- 服务评分(1-5) + closed_by VARCHAR(50) DEFAULT NULL, -- 关闭人 + closed_time TIMESTAMPTZ DEFAULT NULL, -- 关闭时间 + creator VARCHAR(50) NOT NULL, -- 创建人(系统自动创建) + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (room_id), + UNIQUE (workcase_id), + UNIQUE (optsn) +); +CREATE INDEX idx_chat_room_guest ON workcase.tb_chat_room(guest_id, status); +CREATE INDEX idx_chat_room_time ON workcase.tb_chat_room(last_message_time DESC); +COMMENT ON TABLE workcase.tb_chat_room IS 'IM聊天室表,一个工单对应一个聊天室'; + +-- 2. 聊天室成员表 +-- 记录聊天室内的所有成员(来客+客服人员) +DROP TABLE IF EXISTS workcase.tb_chat_room_member CASCADE; +CREATE TABLE workcase.tb_chat_room_member( + optsn VARCHAR(50) NOT NULL, -- 流水号 + member_id VARCHAR(50) NOT NULL, -- 成员记录ID + room_id VARCHAR(50) NOT NULL, -- 聊天室ID + user_id VARCHAR(50) NOT NULL, -- 用户ID(来客ID或员工ID) + user_type VARCHAR(20) NOT NULL, -- 用户类型:guest-来客 staff-客服 ai-AI助手 + user_name VARCHAR(100) NOT NULL, -- 用户名称 + status VARCHAR(20) NOT NULL DEFAULT 'active', -- 状态:active-活跃 left-已离开 removed-被移除 + unread_count INTEGER NOT NULL DEFAULT 0, -- 该成员的未读消息数 + last_read_time TIMESTAMPTZ DEFAULT NULL, -- 最后阅读时间 + last_read_msg_id VARCHAR(50) DEFAULT NULL, -- 最后阅读的消息ID + join_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 加入时间 + leave_time TIMESTAMPTZ DEFAULT NULL, -- 离开时间 + creator VARCHAR(50) NOT NULL, -- 创建人 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + PRIMARY KEY (member_id), + UNIQUE (room_id, user_id) +); +CREATE INDEX idx_chat_member_room ON workcase.tb_chat_room_member(room_id, status); +CREATE INDEX idx_chat_member_user ON workcase.tb_chat_room_member(user_id, user_type, status); +COMMENT ON TABLE workcase.tb_chat_room_member IS '聊天室成员表,记录来客和客服人员'; + +-- 3. 聊天室消息表 +-- 存储所有聊天消息(AI对话+人工客服对话) +DROP TABLE IF EXISTS workcase.tb_chat_room_message CASCADE; +CREATE TABLE workcase.tb_chat_room_message( + optsn VARCHAR(50) NOT NULL, -- 流水号 + message_id VARCHAR(50) NOT NULL, -- 消息ID + room_id VARCHAR(50) NOT NULL, -- 聊天室ID + sender_id VARCHAR(50) NOT NULL, -- 发送者ID + sender_type VARCHAR(20) NOT NULL, -- 发送者类型:guest-来客 agent-客服 ai-AI助手 system-系统消息 + sender_name VARCHAR(100) NOT NULL, -- 发送者名称 + message_type VARCHAR(20) NOT NULL DEFAULT 'text', -- 消息类型:text-文本 image-图片 file-文件 voice-语音 video-视频 system-系统消息 meeting-会议通知 + content TEXT NOT NULL, -- 消息内容 + files VARCHAR(50)[] DEFAULT '{}', -- 附件文件ID数组(图片、文件、语音、视频等) + content_extra JSONB DEFAULT NULL, -- 扩展内容(会议链接、引用信息等) + reply_to_msg_id VARCHAR(50) DEFAULT NULL, -- 回复的消息ID(引用回复) + is_ai_message BOOLEAN NOT NULL DEFAULT false, -- 是否AI消息(标记从ai.tb_chat同步的消息) + ai_message_id VARCHAR(50) DEFAULT NULL, -- AI原始消息ID(用于追溯) + status VARCHAR(20) NOT NULL DEFAULT 'sent', -- 状态:sending-发送中 sent-已发送 delivered-已送达 read-已读 failed-失败 recalled-已撤回 + read_count INTEGER NOT NULL DEFAULT 0, -- 已读人数 + send_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 发送时间 + creator VARCHAR(50) NOT NULL, -- 创建人 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + PRIMARY KEY (message_id) +); +CREATE INDEX idx_chat_msg_room ON workcase.tb_chat_room_message(room_id, send_time DESC); +CREATE INDEX idx_chat_msg_sender ON workcase.tb_chat_room_message(sender_id, sender_type); +CREATE INDEX idx_chat_msg_ai ON workcase.tb_chat_room_message(ai_message_id) WHERE ai_message_id IS NOT NULL; +COMMENT ON TABLE workcase.tb_chat_room_message IS 'IM聊天消息表,包含AI对话和人工客服消息'; + +DROP TABLE IF EXISTS workcase.tb_chat_room_summary CASCADE; +CREATE TABLE workcase.tb_chat_room_summary ( + optsn VARCHAR(50) NOT NULL, -- 流水号 + summary_id VARCHAR(50) NOT NULL, -- 总结ID + room_id VARCHAR(50) NOT NULL, -- 聊天室ID + question TEXT DEFAULT NULL, -- 核心问题 + needs VARCHAR(500)[] DEFAULT '{}', -- 核心诉求数组 + answer TEXT DEFAULT NULL, -- 解决方案 + workcloud VARCHAR(500)[] DEFAULT '{}', -- 词云关键词数组 + message_count INTEGER DEFAULT 0, -- 参与总结的消息数量 + summary_time TIMESTAMPTZ DEFAULT NULL, -- 总结生成时间 + creator VARCHAR(50) NOT NULL, -- 创建人 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (summary_id), + UNIQUE (optsn) +); +CREATE INDEX idx_chat_room_summary_room ON workcase.tb_chat_room_summary(room_id, summary_time DESC); +CREATE INDEX idx_chat_room_summary_time ON workcase.tb_chat_room_summary(summary_time DESC); +COMMENT ON TABLE workcase.tb_chat_room_summary IS '聊天室总结表,保存AI生成的聊天总结分析'; + + +-- 4. 视频会议表(Jitsi Meet) +-- 记录聊天室内创建的视频会议 +DROP TABLE IF EXISTS workcase.tb_video_meeting CASCADE; +CREATE TABLE workcase.tb_video_meeting( + optsn VARCHAR(50) NOT NULL, -- 流水号 + meeting_id VARCHAR(50) NOT NULL, -- 会议ID(也是Jitsi房间名) + room_id VARCHAR(50) NOT NULL, -- 关联聊天室ID + workcase_id VARCHAR(50) NOT NULL, -- 关联工单ID + meeting_name VARCHAR(200) NOT NULL, -- 会议名称 + meeting_password VARCHAR(50) DEFAULT NULL, -- 会议密码(可选) + description VARCHAR(500) DEFAULT NULL, -- 会议模式 + jwt_token TEXT DEFAULT NULL, -- JWT Token(用于身份验证) + jitsi_room_name VARCHAR(200) NOT NULL, -- Jitsi房间名(格式:workcase_{workcase_id}_{timestamp}) + jitsi_server_url VARCHAR(500) NOT NULL DEFAULT 'https://meet.jit.si', -- Jitsi服务器地址 + status VARCHAR(20) NOT NULL DEFAULT 'scheduled', -- 状态:scheduled-已安排 ongoing-进行中 ended-已结束 cancelled-已取消 + creator_type VARCHAR(20) NOT NULL, -- 创建者类型:guest-来客 agent-客服 + creator_name VARCHAR(100) NOT NULL, -- 创建者名称 + participant_count INTEGER NOT NULL DEFAULT 0, -- 参与人数 + max_participants INTEGER DEFAULT 10, -- 最大参与人数 + start_time TIMESTAMPTZ NOT NULL, -- 定义会议开始时间 + end_time TIMESTAMPTZ NOT NULL, -- 定义会议结束时间 + advance INTEGER DEFAULT 5, -- 提前入会时间(分钟) + actual_start_time TIMESTAMPTZ DEFAULT NULL, -- 真正会议开始时间 + actual_end_time TIMESTAMPTZ DEFAULT NULL, -- 真正会议结束时间 + duration_seconds INTEGER DEFAULT 0, -- 会议时长(秒) + iframe_url TEXT DEFAULT NULL, -- iframe嵌入URL(生成后存储) + config JSONB DEFAULT NULL, -- Jitsi配置项(自定义配置) + creator VARCHAR(50) NOT NULL, -- 创建人 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (meeting_id), + UNIQUE (jitsi_room_name) +); +CREATE INDEX idx_meeting_room ON workcase.tb_video_meeting(room_id, status); +CREATE INDEX idx_meeting_workcase ON workcase.tb_video_meeting(workcase_id, status); +CREATE INDEX idx_meeting_time ON workcase.tb_video_meeting(create_time DESC); +COMMENT ON TABLE workcase.tb_video_meeting IS 'Jitsi Meet视频会议表'; + +-- 5. 会议参与记录表(可选,用于审计和统计) +DROP TABLE IF EXISTS workcase.tb_meeting_participant CASCADE; +CREATE TABLE workcase.tb_meeting_participant( + optsn VARCHAR(50) NOT NULL, -- 流水号 + participant_id VARCHAR(50) NOT NULL, -- 参与记录ID + meeting_id VARCHAR(50) NOT NULL, -- 会议ID + user_id VARCHAR(50) NOT NULL, -- 用户ID + user_type VARCHAR(20) NOT NULL, -- 用户类型:guest-来客 agent-客服 + user_name VARCHAR(100) NOT NULL, -- 用户名称 + join_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 加入时间 + leave_time TIMESTAMPTZ DEFAULT NULL, -- 离开时间 + duration_seconds INTEGER DEFAULT 0, -- 参与时长(秒) + is_moderator BOOLEAN NOT NULL DEFAULT false, -- 是否主持人 + join_method VARCHAR(20) DEFAULT 'web', -- 加入方式:web-网页 mobile-移动端 desktop-桌面端 + device_info VARCHAR(200) DEFAULT NULL, -- 设备信息 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + PRIMARY KEY (participant_id) +); +CREATE INDEX idx_meeting_participant ON workcase.tb_meeting_participant(meeting_id, join_time); +CREATE INDEX idx_participant_user ON workcase.tb_meeting_participant(user_id, user_type); +COMMENT ON TABLE workcase.tb_meeting_participant IS '视频会议参与记录表'; + +-- 7. 会议转录记录表(音频转文字) +DROP TABLE IF EXISTS workcase.tb_meeting_transcription CASCADE; +CREATE TABLE workcase.tb_meeting_transcription( + optsn VARCHAR(50) NOT NULL, -- 流水号 + transcription_id VARCHAR(50) NOT NULL, -- 转录记录ID + meeting_id VARCHAR(50) NOT NULL, -- 会议ID + speaker_id VARCHAR(50) NOT NULL, -- 说话人ID + speaker_name VARCHAR(100) NOT NULL, -- 说话人名称 + speaker_type VARCHAR(20) NOT NULL, -- 说话人类型:guest-来客 agent-客服 + content TEXT NOT NULL, -- 转录文本内容 + content_raw TEXT DEFAULT NULL, -- 原始转录结果(含标点前) + language VARCHAR(10) DEFAULT 'zh-CN', -- 语言:zh-CN en-US等 + confidence NUMERIC(3,2) DEFAULT NULL, -- 识别置信度(0-1) + speech_start_time TIMESTAMPTZ NOT NULL, -- 语音开始时间 + speech_end_time TIMESTAMPTZ NOT NULL, -- 语音结束时间 + duration_ms INTEGER NOT NULL, -- 语音时长(毫秒) + audio_url VARCHAR(500) DEFAULT NULL, -- 音频片段URL(可选) + segment_index INTEGER NOT NULL DEFAULT 0, -- 片段序号(按时间排序) + is_final BOOLEAN NOT NULL DEFAULT true, -- 是否最终结果(实时转录会有中间结果) + service_provider VARCHAR(50) DEFAULT 'xunfei', -- 服务提供商:xunfei aliyun tencent google + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + PRIMARY KEY (transcription_id) +); +CREATE INDEX idx_transcription_meeting ON workcase.tb_meeting_transcription(meeting_id, segment_index); +COMMENT ON TABLE workcase.tb_meeting_transcription IS '会议转录记录表,用于保存视频会议的语音转文字内容'; + +-- 8. 员工配置表 +-- 用于控制哪些人员可以在聊天室里接待来客 +DROP TABLE IF EXISTS workcase.tb_customer_service CASCADE; +CREATE TABLE workcase.tb_customer_service( + optsn VARCHAR(50) NOT NULL, -- 流水号 + user_id VARCHAR(50) NOT NULL, -- 员工ID(关联sys用户ID) + username VARCHAR(100) NOT NULL, -- 员工姓名 + user_code VARCHAR(50) DEFAULT NULL, -- 员工工号 + status VARCHAR(20) NOT NULL DEFAULT 'offline', -- 状态:online-在线 busy-忙碌 offline-离线 + skill_tags VARCHAR(50)[] DEFAULT '{}', -- 技能标签(如:电力、燃气、水务) + max_concurrent INTEGER NOT NULL DEFAULT 5, -- 最大并发接待数 + current_workload INTEGER NOT NULL DEFAULT 0, -- 当前工作量 + total_served INTEGER NOT NULL DEFAULT 0, -- 累计服务次数 + avg_response_time INTEGER DEFAULT NULL, -- 平均响应时间(秒) + satisfaction_score NUMERIC(3,2) DEFAULT NULL, -- 满意度评分(0-5) + creator VARCHAR(50) NOT NULL, -- 创建人 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (user_id) +); +CREATE INDEX idx_customer_service_status ON workcase.tb_customer_service(status, current_workload); +COMMENT ON TABLE workcase.tb_customer_service IS '员工配置表,用于控制哪些人员可以在聊天室接待来客'; + +-- 工单表 +DROP TABLE IF EXISTS workcase.tb_workcase CASCADE; +CREATE TABLE workcase.tb_workcase( + optsn VARCHAR(50) NOT NULL, -- 流水号 + workcase_id VARCHAR(50) NOT NULL, -- 工单ID + room_id VARCHAR(50) NOT NULL, -- 聊天室ID + user_id VARCHAR(50) NOT NULL, -- 来客ID + username VARCHAR(200) NOT NULL, -- 来客姓名 + phone VARCHAR(20) NOT NULL, -- 来客电话 + type VARCHAR(50) NOT NULL, -- 故障类型 + device VARCHAR(50) DEFAULT NULL, -- 设备名称 + device_code VARCHAR(50) DEFAULT NULL, -- 设备代码 + device_name_plate VARCHAR(50) DEFAULT NULL, -- 设备名称牌 + device_name_plate_img VARCHAR(50) NOT NULL, -- 设备名称牌图片 + address VARCHAR(1000) DEFAULT NULL, -- 现场地址 + description VARCHAR(1000) DEFAULT NULL, -- 故障描述 + imgs VARCHAR(50)[] DEFAULT '{}', -- 工单图片id + emergency VARCHAR(50) NOT NULL DEFAULT 'normal', -- 紧急程度 normal-普通 emergency-紧急 + status VARCHAR(50) NOT NULL DEFAULT 'pending', -- 状态 pending-待处理 processing-处理中 done-已完成 + processor VARCHAR(50) DEFAULT NULL, -- 处理人 + creator VARCHAR(50) NOT NULL, -- 创建人 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + delete_time TIMESTAMPTZ DEFAULT NULL, -- 删除时间 + deleted BOOLEAN NOT NULL DEFAULT false, -- 是否删除 + PRIMARY KEY (workcase_id), + UNIQUE (room_id), + UNIQUE (optsn) +); + +-- 工单处理过程表(包含工单流转) +DROP TABLE IF EXISTS workcase.tb_workcase_process CASCADE; +CREATE TABLE workcase.tb_workcase_process( + optsn VARCHAR(50) NOT NULL, -- 流水号 + workcase_id VARCHAR(50) NOT NULL, -- 工单ID + process_id VARCHAR(50) NOT NULL, -- 过程id + action VARCHAR(50) NOT NULL, -- 动作 info:记录,assign:指派,redeploy:转派,repeal:撤销,finish:完成 + message VARCHAR(200) DEFAULT NULL, -- 消息 + files VARCHAR(50)[] DEFAULT '{}', -- 携带文件 + processor VARCHAR(50) DEFAULT NULL, -- 处理人(指派、转派专属) + remark VARCHAR(500) DEFAULT NULL, -- 备注 + creator VARCHAR(50) NOT NULL, -- 过程发起人 + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + PRIMARY KEY (process_id) +); + +-- 工单设备涉及的文件表 +DROP TABLE IF EXISTS workcase.tb_workcase_device CASCADE; +CREATE TABLE workcase.tb_workcase_device( + optsn VARCHAR(50) NOT NULL, -- 流水号 + workcase_id VARCHAR(50) NOT NULL, -- 工单ID + device VARCHAR(50) NOT NULL, -- 设备名称 + device_code VARCHAR(50) DEFAULT NULL, -- 设备代码 + file_id VARCHAR(50) NOT NULL, -- 文件id + file_name VARCHAR(50) NOT NULL, -- 文件名 + file_root_id VARCHAR(50) DEFAULT NULL, -- 文件根id + PRIMARY KEY(workcase_id, file_id) +); + +-- 来客对话、工单过程中生成的词云表 +DROP TABLE IF EXISTS workcase.tb_word_cloud CASCADE; +CREATE TABLE workcase.tb_word_cloud( + optsn VARCHAR(50) NOT NULL, -- 流水号 + word_id VARCHAR(50) NOT NULL, -- 词条ID + word VARCHAR(100) NOT NULL, -- 词语 + frequency INTEGER NOT NULL DEFAULT 1, -- 词频 + source_type VARCHAR(20) NOT NULL, -- 来源类型 chat-聊天 workcase-工单 global-全局 + source_id VARCHAR(50) DEFAULT NULL, -- 来源ID(room_id/workcase_id,NULL表示全局统计) + category VARCHAR(50) DEFAULT NULL, -- 分类(如:fault-故障类型 device-设备 emotion-情绪词等) + stat_date DATE NOT NULL, -- 统计日期(按天聚合) + create_time TIMESTAMPTZ NOT NULL DEFAULT now(), -- 创建时间 + update_time TIMESTAMPTZ DEFAULT NULL, -- 更新时间 + PRIMARY KEY (word_id), + UNIQUE (word, source_type, source_id, stat_date, category) -- 同一天同一来源同一分类的词唯一 +); +CREATE INDEX idx_word_cloud_source ON workcase.tb_word_cloud(source_type, source_id, stat_date); +CREATE INDEX idx_word_cloud_category ON workcase.tb_word_cloud(category, stat_date); +COMMENT ON TABLE workcase.tb_word_cloud IS '词云统计表,记录聊天和工单中的关键词'; \ No newline at end of file diff --git a/docker/urbanLifeline/postgres/init/sql/initAll.sql b/docker/urbanLifeline/postgres/init/sql/initAll.sql new file mode 100644 index 00000000..2e8b5549 --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/initAll.sql @@ -0,0 +1,52 @@ +-- ============================= +-- 城市生命线AI数智化平台 - 数据库初始化脚本 +-- 按顺序执行各模块建表SQL及数据初始化 +-- ============================= + +-- ============================= +-- 第一阶段:创建数据库和表结构 +-- ============================= +\i createDB.sql + +-- 1. 系统基础模块 +\i createTablePermission.sql +\i createTableUser.sql + +-- 2. 文件管理模块 +\i createTableFile.sql + +-- 3. 消息通知模块 +\i createTableMessage.sql + +-- 4. 日志模块 +\i createTableLog.sql + +-- 5. 配置管理模块 +\i createTableConfig.sql + +-- 6. AI模块 智能体+知识库 +\i createTableAI.sql + +-- 7. 招投标业务模块 +\i createTableBidding.sql + +-- 8. 智能客服业务模块 +\i createTableWorkcase.sql + +-- ============================= +-- 第二阶段:初始化基础数据 +-- ============================= + +-- 1. 初始化权限相关基础数据(部门、角色、权限、视图、模块) +\i initDataPermission.sql + +-- 2. 初始化用户数据(管理员账户) +\i initDataUser.sql + +-- 3. 初始化消息渠道配置 +\i initDataMessage.sql + +-- 4. 初始化系统配置 +\i initDataConfig.sql + +-- 注意:文件、日志、知识库、招投标、客服等业务表无需初始化数据 \ No newline at end of file diff --git a/docker/urbanLifeline/postgres/init/sql/initDataConfig.sql b/docker/urbanLifeline/postgres/init/sql/initDataConfig.sql new file mode 100644 index 00000000..b011712b --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/initDataConfig.sql @@ -0,0 +1,108 @@ +-- 初始化系统常用配置(与 config.tb_sys_config 对应) +-- 仅插入常用示例,可按需调整 value/remark + +INSERT INTO config.tb_sys_config ( + optsn, config_id, key, name, value, config_type, render_type, description, + re, options, "group", module_id, order_num, status, remark, + creator, dept_path, updater, create_time, update_time, delete_time, deleted +) VALUES + +-- 站点与品牌 +('CFG-0001', 'cfg_site_name', 'site.name', '站点名称', 'urban-lifeline 平台', 'String', 'input', '站点名称', NULL, NULL, 'site', 'mod_system', 10, 0, '展示在标题/登录/页脚', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0002', 'cfg_site_logo', 'site.logo', '站点Logo', '/static/logo.png', 'String', 'input', '站点Logo地址', NULL, NULL, 'site', 'mod_system', 20, 0, '相对或绝对URL', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0003', 'cfg_site_icp', 'site.icp', 'ICP备案号', '', 'String', 'input', 'ICP备案号', NULL, NULL, 'site', 'mod_system', 30, 0, '页脚展示', 'system', NULL, NULL, now(), NULL, NULL, false), + +-- 国际化与时区 +('CFG-0101', 'cfg_i18n_locale', 'i18n.defaultLocale', '默认语言', 'zh-CN', 'String', 'select', '默认语言', NULL, '["zh-CN", "en-US"]'::json, 'i18n', 'mod_system', 10, 0, '如 zh-CN/en-US', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0102', 'cfg_timezone', 'system.timezone', '系统时区', 'Asia/Shanghai', 'String', 'input', '系统默认时区', NULL, NULL, 'i18n', 'mod_system', 20, 0, 'IANA时区名', 'system', NULL, NULL, now(), NULL, NULL, false), + +-- 安全与认证 +('CFG-0201', 'cfg_pwd_policy', 'security.passwordPolicy','密码策略', '{"minLen":8,"upper":1,"lower":1,"digit":1,"special":0}', 'String', 'textarea', '密码策略', NULL, NULL, 'security', 'mod_system', 10, 0, 'JSON结构', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0202', 'cfg_jwt_exp', 'security.jwt.expireSeconds','JWT过期时间', '86400', 'INTEGER', 'input', 'JWT过期秒数', NULL, NULL, 'security', 'mod_system', 20, 0, '默认24小时', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0203', 'cfg_session_timeout', 'security.session.timeoutMinutes','会话超时', '30', 'INTEGER', 'input', '会话超时(分钟)', NULL, NULL, 'security', 'mod_system', 30, 0, '空闲登出', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0204', 'cfg_signup_enabled', 'security.signup.enabled','开放注册', 'false', 'BOOLEAN', 'switch', '是否开放注册', NULL, NULL, 'security', 'mod_system', 40, 0, '生产建议关闭', 'system', NULL, NULL, now(), NULL, NULL, false), + +-- 存储与上传 +('CFG-0301', 'cfg_upload_max', 'upload.maxSizeMB', '最大上传大小', '50', 'INTEGER', 'input', '单文件最大上传(MB)', NULL, NULL, 'storage', 'mod_file', 10, 0, '前后端需一致校验', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0302', 'cfg_storage_backend', 'storage.backend', '存储后端', 'minio', 'String', 'select', '存储后端类型', NULL, '["local", "minio", "s3"]'::json, 'storage', 'mod_file', 20, 0, '本地/MinIO/S3等,当前默认MinIO', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0303', 'cfg_storage_base', 'storage.basePath', '存储路径', '/data/urban-lifeline', 'String', 'input', '本地存储基路径', NULL, NULL, 'storage', 'mod_file', 30, 0, '当 backend=local', 'system', NULL, NULL, now(), NULL, NULL, false), + +-- MinIO 对象存储配置 +('CFG-0310', 'cfg_minio_endpoint', 'minio.endpoint', 'MinIO服务端点', 'http://localhost:9000', 'String', 'input', 'MinIO服务器地址', NULL, NULL, 'storage', 'mod_file', 40, 0, 'MinIO API服务地址,如 http://localhost:9000', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0311', 'cfg_minio_accesskey', 'minio.accessKey', 'MinIO访问密钥', 'minioadmin', 'String', 'input', 'MinIO AccessKey', NULL, NULL, 'storage', 'mod_file', 50, 0, 'MinIO认证的AccessKey', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0312', 'cfg_minio_secretkey', 'minio.secretKey', 'MinIO私钥', 'minioadmin123', 'String', 'password', 'MinIO SecretKey', NULL, NULL, 'storage', 'mod_file', 60, 0, 'MinIO认证的SecretKey', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0313', 'cfg_minio_bucket', 'minio.bucketName', 'MinIO存储桶', 'urban-lifeline', 'String', 'input', 'MinIO默认存储桶名称', NULL, NULL, 'storage', 'mod_file', 70, 0, '用于存储文件的默认bucket', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0314', 'cfg_minio_publicurl', 'minio.publicUrl', 'MinIO公网地址', 'http://localhost:9000', 'String', 'input', 'MinIO公网访问地址', NULL, NULL, 'storage', 'mod_file', 80, 0, '用于生成文件访问URL,可与endpoint不同', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0315', 'cfg_minio_ssl', 'minio.ssl.enabled', '启用SSL', 'false', 'BOOLEAN', 'switch', '是否启用SSL连接', NULL, NULL, 'storage', 'mod_file', 90, 0, 'HTTPS连接MinIO服务', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0316', 'cfg_minio_region', 'minio.region', 'MinIO区域', 'us-east-1', 'String', 'input', 'MinIO存储区域', NULL, NULL, 'storage', 'mod_file', 100, 0, 'AWS S3兼容的区域配置', 'system', NULL, NULL, now(), NULL, NULL, false), + +-- 文件管理配置 +('CFG-0320', 'cfg_file_allowed_exts','file.allowedExtensions', '允许的文件扩展名', 'jpg,jpeg,png,gif,pdf,doc,docx,xls,xlsx,ppt,pptx,txt,zip,rar', 'String', 'textarea', '允许上传的文件扩展名', NULL, NULL, 'storage', 'mod_file', 110, 0, '逗号分隔,如 jpg,png,pdf', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0321', 'cfg_file_forbidden_exts','file.forbiddenExtensions','禁止的文件扩展名', 'exe,bat,sh,php,jsp,asp', 'String', 'textarea', '禁止上传的文件扩展名', NULL, NULL, 'storage', 'mod_file', 120, 0, '逗号分隔,安全考虑', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0322', 'cfg_file_cleanup_days', 'file.tempCleanupDays', '临时文件清理天数', '7', 'INTEGER', 'input', '临时文件自动清理天数', NULL, NULL, 'storage', 'mod_file', 130, 0, '超过天数的临时文件将被清理', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0323', 'cfg_file_duplicate_check','file.duplicateCheck.enabled','启用文件去重', 'true', 'BOOLEAN', 'switch', '是否启用MD5去重检查', NULL, NULL, 'storage', 'mod_file', 140, 0, '基于MD5值检查重复文件', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0324', 'cfg_file_virus_scan', 'file.virusScan.enabled', '启用病毒扫描', 'false', 'BOOLEAN', 'switch', '是否启用文件病毒扫描', NULL, NULL, 'storage', 'mod_file', 150, 0, '需要集成防病毒引擎', 'system', NULL, NULL, now(), NULL, NULL, false), + +-- 通知(邮件/SMS) +-- 邮件配置 +('CFG-0401', 'cfg_mail_host', 'email.host', 'SMTP服务器地址', 'smtp.qq.com', 'String', 'input', 'SMTP服务器地址', NULL, NULL, 'notify', 'mod_message', 10, 1, '邮件发送服务器地址', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0402', 'cfg_mail_port', 'email.port', 'SMTP端口', '587', 'INTEGER', 'input', 'SMTP服务器端口', NULL, NULL, 'notify', 'mod_message', 20, 1, '常用:25/465/587', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0403', 'cfg_mail_username', 'email.username', '发件人邮箱', '3223905473@qq.com', 'String', 'input', '发件人邮箱地址', NULL, NULL, 'notify', 'mod_message', 30, 1, '用于发送邮件的邮箱账号', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0404', 'cfg_mail_password', 'email.password', '邮箱授权码', 'xmdmxvtjumxocicc', 'String', 'password', '邮箱授权码/密码', NULL, NULL, 'notify', 'mod_message', 40, 1, '邮箱的授权码或密码', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0405', 'cfg_mail_fromname', 'email.fromName', '发件人名称', 'urban-lifeline平台', 'String', 'input', '发件人显示名称', NULL, NULL, 'notify', 'mod_message', 50, 1, '邮件中显示的发件人名称', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0406', 'cfg_mail_ssl', 'email.ssl.enable', '启用SSL', 'true', 'BOOLEAN', 'switch', '是否启用SSL', NULL, NULL, 'notify', 'mod_message', 60, 1, 'SSL加密连接', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0407', 'cfg_mail_timeout', 'email.timeout', '连接超时时间', '30000', 'INTEGER', 'input', '连接超时时间(毫秒)', NULL, NULL, 'notify', 'mod_message', 70, 1, 'SMTP连接超时时间(5000-60000)', 'system', NULL, NULL, now(), NULL, NULL, false), + +-- 短信配置 +('CFG-0411', 'cfg_sms_provider', 'sms.provider', '短信服务商', 'aliyun', 'String', 'select', '短信服务提供商', NULL, '["aliyun", "tencent"]'::json, 'notify', 'mod_message', 80, 1, '短信服务提供商类型', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0412', 'cfg_sms_keyid', 'sms.accessKeyId', 'AccessKey ID', 'LTAI5t68do3qVXx5Rufugt3X', 'String', 'input', '短信服务AccessKey ID', NULL, NULL, 'notify', 'mod_message', 90, 1, '云服务商的AccessKey ID', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0413', 'cfg_sms_secret', 'sms.accessKeySecret', 'AccessKey Secret', '2vD9ToIff49Vph4JQXsn0Cy8nXQfzA', 'String', 'password', '短信服务AccessKey Secret', NULL, NULL, 'notify', 'mod_message', 100, 1, '云服务商的AccessKey Secret', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0414', 'cfg_sms_sign', 'sms.signName', '短信签名', 'urban-lifeline', 'String', 'input', '短信签名', NULL, NULL, 'notify', 'mod_message', 110, 1, '发送短信使用的签名', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0415', 'cfg_sms_tpl_login', 'sms.templateCode.login', '登录验证码模板', 'SMS_491985030', 'String', 'input', '登录验证码模板编码', NULL, NULL, 'notify', 'mod_message', 120, 1, '登录验证码短信模板', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0416', 'cfg_sms_tpl_register', 'sms.templateCode.register','注册验证码模板', 'SMS_491985030', 'String', 'input', '注册验证码模板编码', NULL, NULL, 'notify', 'mod_message', 130, 1, '注册验证码短信模板', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0417', 'cfg_sms_timeout', 'sms.timeout', '请求超时时间', '30000', 'INTEGER', 'input', '请求超时时间(毫秒)', NULL, NULL, 'notify', 'mod_message', 140, 1, 'API请求超时时间(5000-60000)', 'system', NULL, NULL, now(), NULL, NULL, false), + +-- Dify AI 配置 +-- Dify 基础配置 +('CFG-0450', 'cfg_dify_api_base', 'dify.apiBaseUrl', 'Dify API地址', 'http://localhost:8000/v1', 'String', 'input', 'Dify API基础地址', NULL, NULL, 'dify', 'mod_agent', 10, 1, 'Dify服务的API基础地址,如 http://localhost/dify/api', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0452', 'cfg_dify_knowledge_key','dify.knowledgeApiKey', '知识库API密钥', 'dataset-LepcmgOE95n2S7yweNhQzNoB', 'String', 'password', '知识库API密钥', NULL, NULL, 'dify', 'mod_agent', 30, 1, '用于访问Dify知识库的API密钥', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0453', 'cfg_dify_timeout', 'dify.timeout', '请求超时时间', '60', 'INTEGER', 'input', '请求超时时间(秒)', NULL, NULL, 'dify', 'mod_agent', 40, 1, 'API请求的超时时间(10-600秒)', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0454', 'cfg_dify_conn_timeout','dify.connectTimeout', '连接超时时间', '10', 'INTEGER', 'input', '连接超时时间(秒)', NULL, NULL, 'dify', 'mod_agent', 50, 1, 'API连接的超时时间(5-60秒)', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0455', 'cfg_dify_read_timeout','dify.readTimeout', '读取超时时间', '60', 'INTEGER', 'input', '读取超时时间(秒)', NULL, NULL, 'dify', 'mod_agent', 60, 1, 'API读取响应的超时时间(10-600秒)', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0456', 'cfg_dify_stream_timeout','dify.streamTimeout', '流式响应超时时间', '300', 'INTEGER', 'input', '流式响应超时时间(秒)', NULL, NULL, 'dify', 'mod_agent', 70, 1, '流式API响应的超时时间(30-1800秒)', 'system', NULL, NULL, now(), NULL, NULL, false), + +-- Dify 上传配置 +('CFG-0460', 'cfg_dify_upload_types','dify.upload.allowedTypes','允许的文件类型', 'pdf,txt,docx,doc,md,html,htm,xlsx,xls,csv', 'String', 'textarea', '上传文件允许的类型', NULL, NULL, 'dify', 'mod_agent', 80, 1, '支持上传的文件类型列表,逗号分隔', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0461', 'cfg_dify_upload_max', 'dify.upload.maxSize', '最大文件大小', '50', 'INTEGER', 'input', '最大文件大小(MB)', NULL, NULL, 'dify', 'mod_agent', 90, 1, '单个文件上传的最大大小限制(1-500MB)', 'system', NULL, NULL, now(), NULL, NULL, false), + +-- Dify 知识库配置 +('CFG-0470', 'cfg_dify_index_tech', 'dify.knowledge.indexing.tchnique','默认索引方式', 'high_quality', 'String', 'select', '默认索引方式', NULL, '["high_quality", "economy"]'::json, 'dify', 'mod_agent', 100, 1, '知识库文档的默认索引方式:high_quality(高质量)或 economy(经济)', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0471', 'cfg_dify_embed_model', 'dify.knowledge.embedding.model','默认Embedding模型', 'Qwen/Qwen3-Embedding-8B', 'String', 'input', '默认Embedding模型', NULL, NULL, 'dify', 'mod_agent', 110, 1, '知识库使用的默认Embedding模型名称', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0472', 'cfg_dify_embed_provider', 'dify.knowledge.embedding.model.provider','Embedding模型供应商', 'langgenius/siliconflow/siliconflow', 'String', 'input', 'Embedding模型供应商', NULL, NULL, 'dify', 'mod_agent', 120, 1, 'Embedding模型的供应商标识', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0473', 'cfg_dify_rerank_enable', 'dify.knowledge.reranking.enable','启用Rerank', 'true', 'BOOLEAN', 'switch', '是否启用Rerank重排序', NULL, NULL, 'dify', 'mod_agent', 130, 1, '启用后会对检索结果进行重排序提升相关性', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0474', 'cfg_dify_rerank_model', 'dify.knowledge.rerank.model','Rerank模型', 'Qwen/Qwen3-Reranker-8B', 'String', 'input', 'Rerank重排序模型', NULL, NULL, 'dify', 'mod_agent', 140, 1, '知识库使用的Rerank模型名称', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0475', 'cfg_dify_rerank_provider', 'dify.knowledge.rerank.model.provider','Rerank模型供应商', 'langgenius/siliconflow/siliconflow', 'String', 'input', 'Rerank模型供应商', NULL, NULL, 'dify', 'mod_agent', 150, 1, 'Rerank模型的供应商标识', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0476', 'cfg_dify_retrieval_topk', 'dify.knowledge.retrieval.top.k','检索TopK', '5', 'INTEGER', 'input', '检索返回的最大文档数', NULL, NULL, 'dify', 'mod_agent', 160, 1, '知识库检索时返回的最相关文档数量(1-20)', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0477', 'cfg_dify_retrieval_threshold', 'dify.knowledge.retrieval.score.threshold','相似度阈值', '0.5', 'DOUBLE', 'input', '检索相似度阈值', NULL, NULL, 'dify', 'mod_agent', 170, 1, '低于此阈值的文档将被过滤(0.0-1.0)', 'system', NULL, NULL, now(), NULL, NULL, false), +-- Dify workcase相关智能体配置 +('CFG-0478', 'cfg_dify_workcase_chat', 'dify.workcase.agent.chat','泰豪小电AgentApiKey', 'app-CDKy0wYkPnl6dA6G7eu113Vw', 'String', 'input', '泰豪小电AgentApiKey', NULL, NULL, 'dify', 'mod_agent', 160, 1, '泰豪小电AgentApiKey', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0479', 'cfg_dify_workcase_summary', 'dify.workcase.workflow.summary','工单总结AgentApikey', 'app-YMlj2B0m21KpYZPv3YdObi7r', 'String', 'input', '工单总结AgentApikey', NULL, NULL, 'dify', 'mod_agent', 170, 1, '工单总结AgentApikey', 'system', NULL, NULL, now(), NULL, NULL, false), + + +-- 日志与审计 +('CFG-0501', 'cfg_log_level', 'log.level', '日志级别', 'INFO', 'String', 'select', '系统日志级别', NULL, '["DEBUG", "INFO", "WARN", "ERROR"]'::json, 'log', 'mod_system', 10, 0, 'DEBUG/INFO/WARN/ERROR', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0502', 'cfg_audit_retention', 'audit.retentionDays', '审计日志保留', '90', 'INTEGER', 'input', '审计日志保留天数', NULL, NULL, 'log', 'mod_system', 20, 0, '合规按需调整', 'system', NULL, NULL, now(), NULL, NULL, false), + +-- 平台特性 +('CFG-0601', 'cfg_maintenance', 'platform.maintenance', '维护模式', 'false', 'BOOLEAN', 'switch', '维护模式开关', NULL, NULL, 'platform', 'mod_system', 10, 0, 'true时仅管理员可用', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0602', 'cfg_feature_acl_policy','feature.acl.policy', 'ACL策略', 'enabled', 'String', 'select', 'ACL策略开关', NULL, '["enabled", "disabled"]'::json, 'platform', 'mod_system', 20, 0, 'enabled/disabled', 'system', NULL, NULL, now(), NULL, NULL, false), + +-- 微信客服配置 +('CFG-0701', 'cfg_wechat_kefu_corpid', 'wechat.kefu.corpId', '企业ID', '', 'String', 'input', '企业微信的企业ID', NULL, NULL, 'wechat', 'mod_workcase', 10, 1, '企业微信管理后台获取', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0702', 'cfg_wechat_kefu_secret', 'wechat.kefu.secret', '客服应用Secret', '', 'String', 'password', '微信客服应用的Secret', NULL, NULL, 'wechat', 'mod_workcase', 20, 1, '微信客服应用的密钥', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0703', 'cfg_wechat_kefu_token', 'wechat.kefu.token', '回调Token', '', 'String', 'input', '消息回调的Token', NULL, NULL, 'wechat', 'mod_workcase', 30, 1, '用于验证消息回调的Token', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0704', 'cfg_wechat_kefu_aeskey', 'wechat.kefu.encodingAesKey','回调加密密钥', '', 'String', 'password', '消息回调的EncodingAESKey', NULL, NULL, 'wechat', 'mod_workcase', 40, 1, '用于解密消息回调的AES密钥', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0705', 'cfg_wechat_kefu_openkfid', 'wechat.kefu.openKfid', '客服账号ID', '', 'String', 'input', '微信客服账号的open_kfid', NULL, NULL, 'wechat', 'mod_workcase', 50, 1, '用于发送消息的客服账号ID', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0706', 'cfg_wechat_kefu_welcome', 'wechat.kefu.welcomeTemplate','欢迎语模板', '您好,您的工单已创建。\n工单编号:{workcaseId}\n问题类型:{type}\n设备:{device}\n我们将尽快为您处理。', 'String', 'textarea', '客服欢迎语消息模板', NULL, NULL, 'wechat', 'mod_workcase', 60, 1, '支持变量:{workcaseId},{type},{device},{username}', 'system', NULL, NULL, now(), NULL, NULL, false); + + diff --git a/docker/urbanLifeline/postgres/init/sql/initDataMessage.sql b/docker/urbanLifeline/postgres/init/sql/initDataMessage.sql new file mode 100644 index 00000000..cd86f138 --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/initDataMessage.sql @@ -0,0 +1,118 @@ +-- 初始化消息渠道配置(与 message schema 对应) +-- 配置常用消息发送渠道 + +-- ============================= +-- 1. 初始化消息渠道 +-- ============================= +INSERT INTO message.tb_message_channel ( + optsn, channel_id, channel_code, channel_name, channel_desc, + config, status, priority, creator, create_time, deleted +) VALUES +-- 应用内消息(默认渠道,优先级最高) +('CH-0001', 'channel_app', 'app', '应用内消息', '系统内部消息通知', + '{"enabled": true, "realtime": true}'::json, + 'enabled', 100, 'system', now(), false), + +-- 短信通知 +('CH-0002', 'channel_sms', 'sms', '短信通知', '短信发送服务', + '{ + "enabled": false, + "provider": "", + "apiKey": "", + "apiSecret": "", + "signName": "", + "templateCode": "" + }'::json, + 'disabled', 80, 'system', now(), false), + +-- 邮件通知 +('CH-0003', 'channel_email', 'email', '邮件通知', '电子邮件发送服务', + '{ + "enabled": false, + "smtpHost": "", + "smtpPort": 465, + "username": "", + "password": "", + "fromAddress": "", + "useSsl": true + }'::json, + 'disabled', 70, 'system', now(), false), + +-- 微信公众号 +('CH-0004', 'channel_wechat_mp', 'wechat_official_account', '微信公众号', '微信公众号模板消息', + '{ + "enabled": false, + "appId": "", + "appSecret": "", + "templateId": "" + }'::json, + 'disabled', 60, 'system', now(), false), + +-- 微信小程序 +('CH-0005', 'channel_wechat_mini', 'wechat_applet', '微信小程序', '微信小程序订阅消息', + '{ + "enabled": false, + "appId": "", + "appSecret": "", + "templateId": "" + }'::json, + 'disabled', 50, 'system', now(), false), + +-- 钉钉通知 +('CH-0006', 'channel_dingtalk', 'dingtalk', '钉钉通知', '钉钉工作通知', + '{ + "enabled": false, + "agentId": "", + "appKey": "", + "appSecret": "", + "robotToken": "" + }'::json, + 'disabled', 40, 'system', now(), false); + +-- ============================= +-- 2. 初始化消息模板(系统通用模板) +-- ============================= +INSERT INTO message.tb_message_template ( + optsn, template_id, template_code, template_name, template_type, + title_template, content_template, variables, service, + creator, create_time, deleted +) VALUES +-- 用户注册欢迎消息 +('TPL-0001', 'tpl_user_welcome', 'USER_WELCOME', '用户注册欢迎', 'system', + '欢迎加入 {{platformName}}', + '您好,{{username}}!\n\n欢迎加入 {{platformName}} 平台。您的账号已成功创建。\n\n账号信息:\n- 用户名:{{usercode}}\n- 邮箱:{{email}}\n- 注册时间:{{registerTime}}\n\n祝您使用愉快!', + '["platformName", "username", "usercode", "email", "registerTime"]'::jsonb, + 'system', + 'system', now(), false), + +-- 密码重置通知 +('TPL-0002', 'tpl_password_reset', 'PASSWORD_RESET', '密码重置通知', 'system', + '密码重置验证码', + '您好,{{username}}!\n\n您正在重置密码,验证码为:{{code}}\n\n验证码有效期为 {{expireMinutes}} 分钟,请尽快完成操作。\n\n如非本人操作,请忽略此消息。', + '["username", "code", "expireMinutes"]'::jsonb, + 'system', + 'system', now(), false), + +-- 系统维护通知 +('TPL-0003', 'tpl_system_maintenance', 'SYSTEM_MAINTENANCE', '系统维护通知', 'system', + '系统维护通知', + '尊敬的用户:\n\n系统将于 {{startTime}} 至 {{endTime}} 进行维护升级。\n\n维护内容:{{content}}\n\n维护期间系统将暂停服务,请您提前做好相关安排。\n\n给您带来不便,敬请谅解!', + '["startTime", "endTime", "content"]'::jsonb, + 'system', + 'system', now(), false), + +-- 工单创建通知 +('TPL-0101', 'tpl_ticket_created', 'TICKET_CREATED', '工单创建通知', 'business', + '新工单通知', + '您好,{{username}}!\n\n您有一条新的工单需要处理:\n\n工单编号:{{ticketNo}}\n工单标题:{{title}}\n优先级:{{priority}}\n创建时间:{{createTime}}\n\n请及时登录系统查看处理。', + '["username", "ticketNo", "title", "priority", "createTime"]'::jsonb, + 'customer_service', + 'system', now(), false), + +-- 招标公告发布通知 +('TPL-0201', 'tpl_bidding_published', 'BIDDING_PUBLISHED', '招标公告发布', 'business', + '招标公告发布通知', + '您好!\n\n新的招标项目已发布:\n\n项目名称:{{projectName}}\n项目编号:{{projectNo}}\n发布时间:{{publishTime}}\n截止时间:{{deadlineTime}}\n\n详情请登录系统查看。', + '["projectName", "projectNo", "publishTime", "deadlineTime"]'::jsonb, + 'bidding', + 'system', now(), false); diff --git a/docker/urbanLifeline/postgres/init/sql/initDataPermission.sql b/docker/urbanLifeline/postgres/init/sql/initDataPermission.sql new file mode 100644 index 00000000..ed27224e --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/initDataPermission.sql @@ -0,0 +1,471 @@ +-- 初始化权限相关基础数据(与 sys schema 对应) +-- 包含:部门、角色、模块、权限、视图及其关联关系 + +-- ============================= +-- 1. 初始化根部门 +-- ============================= +INSERT INTO sys.tb_sys_dept ( + optsn, dept_id, name, parent_id, dept_path, description, + creator, create_time, deleted +) VALUES +('DEPT-0001', 'dept_root', '根部门', NULL, '/dept_root/', '系统根部门', + 'system', now(), false); + +-- ============================= +-- 2. 初始化全局角色 +-- ============================= +INSERT INTO sys.tb_sys_role ( + optsn, role_id, name, description, scope, owner_dept_id, + status, creator, dept_path, create_time, deleted +) VALUES +-- 超级管理员(全局) +('ROLE-0001', 'role_super_admin', '超级管理员', '拥有系统所有权限的最高管理员', + 'global', NULL, true, 'system', NULL, now(), false), + +-- 系统管理员(全局) +('ROLE-0002', 'role_system_admin', '系统管理员', '负责系统配置和用户管理', + 'global', NULL, true, 'system', NULL, now(), false), + +-- 普通用户(全局) +('ROLE-0003', 'role_user', '普通用户', '系统普通用户角色', + 'global', NULL, true, 'system', NULL, now(), false), + +-- 访客(全局)- 注册用户默认角色,具备客服聊天和工单的所有接口权限 +('ROLE-0004', 'role_guest', '访客', '访客角色,具备客服聊天和工单的所有接口权限', + 'global', NULL, true, 'system', NULL, now(), false); + +-- ============================= +-- 3. 初始化系统模块 +-- ============================= +INSERT INTO sys.tb_sys_module ( + optsn, module_id, name, description, creator, dept_path, create_time, deleted +) VALUES +('MODULE-0001', 'module_system', '系统管理', '用户、角色、权限、部门管理', 'system', NULL, now(), false), +('MODULE-0002', 'module_file', '文件管理', '文件上传、下载、关联管理', 'system', NULL, now(), false), +('MODULE-0003', 'module_message', '消息通知', '消息发送、接收、模板管理', 'system', NULL, now(), false), +('MODULE-0004', 'module_config', '配置管理', '系统配置参数管理', 'system', NULL, now(), false), +('MODULE-0008', 'module_agent', '智能体', '智能体管理', 'system', NULL, now(), false), +('MODULE-0005', 'module_knowledge', '知识库', '知识文档管理', 'system', NULL, now(), false), +('MODULE-0006', 'module_bidding', '招投标', '招投标业务管理', 'system', NULL, now(), false), +('MODULE-0007', 'module_workcase', '智能客服', '客服工单管理', 'system', NULL, now(), false), +('MODULE-0009', 'module_meeting', '视频会议', 'Jitsi Meet视频会议管理', 'system', NULL, now(), false); + +-- ============================= +-- 4. 初始化系统权限 +-- ============================= +INSERT INTO sys.tb_sys_permission ( + optsn, permission_id, name, code, description, module_id, status, creator, dept_path, create_time, deleted +) VALUES +-- 系统管理模块权限 +('PERM-0001', 'perm_user_view', '用户查看', 'system:user:view', '查看用户列表和详情', 'module_system', true, 'system', NULL, now(), false), +('PERM-0002', 'perm_user_create', '用户创建', 'system:user:create', '创建新用户', 'module_system', true, 'system', NULL, now(), false), +('PERM-0003', 'perm_user_edit', '用户编辑', 'system:user:edit', '编辑用户信息', 'module_system', true, 'system', NULL, now(), false), +('PERM-0004', 'perm_user_delete', '用户删除', 'system:user:delete', '删除用户', 'module_system', true, 'system', NULL, now(), false), +('PERM-0011', 'perm_role_view', '角色查看', 'system:role:view', '查看角色列表和详情', 'module_system', true, 'system', NULL, now(), false), +('PERM-0012', 'perm_role_create', '角色创建', 'system:role:create', '创建新角色', 'module_system', true, 'system', NULL, now(), false), +('PERM-0013', 'perm_role_edit', '角色编辑', 'system:role:edit', '编辑角色信息', 'module_system', true, 'system', NULL, now(), false), +('PERM-0014', 'perm_role_delete', '角色删除', 'system:role:delete', '删除角色', 'module_system', true, 'system', NULL, now(), false), +('PERM-0021', 'perm_dept_view', '部门查看', 'system:dept:view', '查看部门列表和详情', 'module_system', true, 'system', NULL, now(), false), +('PERM-0022', 'perm_dept_create', '部门创建', 'system:dept:create', '创建新部门', 'module_system', true, 'system', NULL, now(), false), +('PERM-0023', 'perm_dept_edit', '部门编辑', 'system:dept:edit', '编辑部门信息', 'module_system', true, 'system', NULL, now(), false), +('PERM-0024', 'perm_dept_delete', '部门删除', 'system:dept:delete', '删除部门', 'module_system', true, 'system', NULL, now(), false), +('PERM-0031', 'perm_permission_view', '权限查看', 'system:permission:view', '查看权限列表', 'module_system', true, 'system', NULL, now(), false), +('PERM-0032', 'perm_permission_manage', '权限管理', 'system:permission:manage', '管理权限配置', 'module_system', true, 'system', NULL, now(), false), + +-- 系统管理模块导出权限 +('PERM-0041', 'perm_user_export', '用户导出', 'system:user:export', '导出用户数据', 'module_system', true, 'system', NULL, now(), false), +('PERM-0042', 'perm_role_export', '角色导出', 'system:role:export', '导出角色数据', 'module_system', true, 'system', NULL, now(), false), +('PERM-0043', 'perm_dept_export', '部门导出', 'system:dept:export', '导出部门数据', 'module_system', true, 'system', NULL, now(), false), + +-- 文件管理模块权限 +('PERM-0101', 'perm_file_view', '文件查看', 'file:file:view', '查看文件列表', 'module_file', true, 'system', NULL, now(), false), +('PERM-0102', 'perm_file_upload', '文件上传', 'file:file:upload', '上传文件', 'module_file', true, 'system', NULL, now(), false), +('PERM-0103', 'perm_file_download', '文件下载', 'file:file:download', '下载文件', 'module_file', true, 'system', NULL, now(), false), +('PERM-0104', 'perm_file_delete', '文件删除', 'file:file:delete', '删除文件', 'module_file', true, 'system', NULL, now(), false), +('PERM-0105', 'perm_file_export', '文件导出', 'file:file:export', '导出文件列表数据', 'module_file', true, 'system', NULL, now(), false), +-- 智能体权限 +('PERM-0120', 'perm_ai_create', '智能体创建', 'ai:agent:create', '创建智能体', 'module_agent', true, 'system', NULL, now(), false), +('PERM-0121', 'perm_ai_update', '智能体更新', 'ai:agent:update', '更新智能体', 'module_agent', true, 'system', NULL, now(), false), +('PERM-0122', 'perm_ai_delete', '智能体删除', 'ai:agent:delete', '删除智能体', 'module_agent', true, 'system', NULL, now(), false), +('PERM-0123', 'perm_ai_view', '智能体查询', 'ai:agent:view', '查询智能体', 'module_agent', true, 'system', NULL, now(), false), +-- 智能体对话权限 没有,因为所有人都可以 +-- Dify代理功能权限(知识库分段管理) +('PERM-0130', 'perm_dify_segment_view', '分段查看', 'ai:dify:segment:view', '查看文档分段列表', 'module_knowledge', true, 'system', NULL, now(), false), +('PERM-0131', 'perm_dify_segment_create', '分段创建', 'ai:dify:segment:create', '创建文档分段', 'module_knowledge', true, 'system', NULL, now(), false), +('PERM-0132', 'perm_dify_segment_update', '分段更新', 'ai:dify:segment:update', '更新文档分段', 'module_knowledge', true, 'system', NULL, now(), false), +('PERM-0133', 'perm_dify_segment_delete', '分段删除', 'ai:dify:segment:delete', '删除文档分段', 'module_knowledge', true, 'system', NULL, now(), false), +('PERM-0134', 'perm_dify_document_status', '文档状态管理', 'ai:dify:document:status', '更新文档状态(启用/禁用/归档)', 'module_knowledge', true, 'system', NULL, now(), false), +-- 知识库管理权限 +('PERM-0140', 'perm_knowledge_create', '知识库创建', 'ai:knowledge:create', '创建知识库', 'module_knowledge', true, 'system', NULL, now(), false), +('PERM-0141', 'perm_knowledge_update', '知识库更新', 'ai:knowledge:update', '更新知识库', 'module_knowledge', true, 'system', NULL, now(), false), +('PERM-0142', 'perm_knowledge_delete', '知识库删除', 'ai:knowledge:delete', '删除知识库', 'module_knowledge', true, 'system', NULL, now(), false), +('PERM-0143', 'perm_knowledge_view', '知识库查看', 'ai:knowledge:view', '查看知识库列表和详情', 'module_knowledge', true, 'system', NULL, now(), false), +-- 知识库文件管理权限 +('PERM-0150', 'perm_knowledge_file_upload', '知识库文件上传', 'ai:knowledge:file:upload', '上传文件到知识库', 'module_knowledge', true, 'system', NULL, now(), false), +('PERM-0151', 'perm_knowledge_file_update', '知识库文件更新', 'ai:knowledge:file:update', '更新知识库文件信息', 'module_knowledge', true, 'system', NULL, now(), false), +('PERM-0152', 'perm_knowledge_file_delete', '知识库文件删除', 'ai:knowledge:file:delete', '删除知识库文件', 'module_knowledge', true, 'system', NULL, now(), false), +('PERM-0153', 'perm_knowledge_file_view', '知识库文件查看', 'ai:knowledge:file:view', '查看知识库文件历史', 'module_knowledge', true, 'system', NULL, now(), false), + +-- 消息通知模块权限 +('PERM-0201', 'perm_message_view', '消息查看', 'message:message:view', '查看消息列表', 'module_message', true, 'system', NULL, now(), false), +('PERM-0202', 'perm_message_send', '消息发送', 'message:message:send', '发送消息通知', 'module_message', true, 'system', NULL, now(), false), +('PERM-0203', 'perm_message_manage', '消息管理', 'message:message:manage', '管理消息模板和配置', 'module_message', true, 'system', NULL, now(), false), +('PERM-0204', 'perm_message_export', '消息导出', 'message:message:export', '导出消息数据', 'module_message', true, 'system', NULL, now(), false), +-- 配置管理模块权限 +('PERM-0301', 'perm_config_view', '配置查看', 'config:config:view', '查看系统配置', 'module_config', true, 'system', NULL, now(), false), +('PERM-0302', 'perm_config_edit', '配置编辑', 'config:config:edit', '修改系统配置', 'module_config', true, 'system', NULL, now(), false), +('PERM-0303', 'perm_config_export', '配置导出', 'config:config:export', '导出系统配置数据', 'module_config', true, 'system', NULL, now(), false), +-- 日志模块权限 +('PERM-0401', 'perm_log_view', '日志查看', 'log:log:view', '查看系统日志', 'module_system', true, 'system', NULL, now(), false), +('PERM-0402', 'perm_log_export', '日志导出', 'log:log:export', '导出系统日志数据', 'module_system', true, 'system', NULL, now(), false), +-- 平台基础菜单访问权限(所有登录用户都有) +('PERM-0501', 'perm_platform_home', '工作台访问', 'platform:home:view', '访问平台工作台', 'module_system', true, 'system', NULL, now(), false), +('PERM-0502', 'perm_platform_chat', 'AI助手访问', 'platform:chat:view', '访问AI助手', 'module_system', true, 'system', NULL, now(), false), +('PERM-0503', 'perm_platform_bidding', '招标助手访问', 'platform:bidding:view', '访问招标助手(iframe)', 'module_bidding', true, 'system', NULL, now(), false), +('PERM-0504', 'perm_platform_workcase', '泰豪小电访问', 'platform:workcase:view', '访问泰豪小电客服(iframe)', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0505', 'perm_platform_workflow', '智能体编排访问', 'platform:workflow:view', '访问智能体编排(iframe)', 'module_system', true, 'system', NULL, now(), false), +-- Platform 管理后台功能权限 +('PERM-0601', 'perm_platform_admin', '平台管理后台', 'platform:admin:view', '访问平台管理后台', 'module_system', true, 'system', NULL, now(), false), +('PERM-0602', 'perm_platform_admin_overview', '平台数据概览', 'platform:admin:overview', '访问平台数据概览', 'module_system', true, 'system', NULL, now(), false), +('PERM-0603', 'perm_platform_admin_user', '平台用户管理', 'platform:admin:user', '访问平台用户管理', 'module_system', true, 'system', NULL, now(), false), +('PERM-0604', 'perm_platform_admin_knowledge', '平台知识库', 'platform:admin:knowledge', '访问平台知识库', 'module_knowledge', true, 'system', NULL, now(), false), +('PERM-0605', 'perm_platform_admin_config', '平台系统配置', 'platform:admin:config', '访问平台系统配置', 'module_config', true, 'system', NULL, now(), false), +-- Bidding 管理后台功能权限 +('PERM-0611', 'perm_bidding_admin', '招标管理后台', 'bidding:admin:view', '访问招标管理后台', 'module_bidding', true, 'system', NULL, now(), false), +-- Workcase 管理后台功能权限 +('PERM-0621', 'perm_workcase_admin', '客服管理后台', 'workcase:admin:view', '访问客服管理后台', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0622', 'perm_workcase_overview', '数据概览', 'workcase:overview:view', '访问泰豪小电数据概览', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0623', 'perm_workcase_knowledge', '知识库管理', 'workcase:knowledge:view', '访问知识库管理', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0624', 'perm_workcase_tickets', '工单管理', 'workcase:tickets:view', '访问工单管理', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0625', 'perm_workcase_conversation', '对话数据', 'workcase:conversation:view', '访问对话数据管理', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0626', 'perm_workcase_agent', '智能体管理', 'workcase:agent:view', '访问智能体管理', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0627', 'perm_workcase_log', '日志管理', 'workcase:log:view', '访问日志管理', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0628', 'perm_workcase_chatroom', '聊天室控制台', 'workcase:chatroom:view', '访问聊天室控制台', 'module_workcase', true, 'system', NULL, now(), false), + +-- Workcase 接口权限(访客用户可用) +-- AI对话接口权限 +('PERM-0701', 'perm_workcase_chat_create', 'AI对话创建', 'workcase:chat:create', '创建对话', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0702', 'perm_workcase_chat_update', 'AI对话更新', 'workcase:chat:update', '更新对话', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0703', 'perm_workcase_chat_list', 'AI对话查询', 'workcase:chat:list', '查询对话列表', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0704', 'perm_workcase_chat_message', 'AI对话消息', 'workcase:chat:message', '获取对话消息列表', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0705', 'perm_workcase_chat_stream', 'AI流式对话', 'workcase:chat:stream', '流式对话接口', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0706', 'perm_workcase_chat_analyze', 'AI对话分析', 'workcase:chat:analyze', '分析对话生成工单信息', 'module_workcase', true, 'system', NULL, now(), false), +-- 聊天室接口权限 +('PERM-0711', 'perm_workcase_room_create', '聊天室创建', 'workcase:room:create', '创建聊天室', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0712', 'perm_workcase_room_update', '聊天室更新', 'workcase:room:update', '更新聊天室', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0713', 'perm_workcase_room_close', '聊天室关闭', 'workcase:room:close', '关闭聊天室', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0714', 'perm_workcase_room_view', '聊天室查看', 'workcase:room:view', '查看聊天室', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0715', 'perm_workcase_room_member', '聊天室成员', 'workcase:room:member', '管理聊天室成员', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0716', 'perm_workcase_room_message', '聊天室消息', 'workcase:room:message', '发送和查看聊天室消息', 'module_workcase', true, 'system', NULL, now(), false), +-- 工单接口权限 +('PERM-0721', 'perm_workcase_ticket_create', '工单创建', 'workcase:ticket:create', '创建工单', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0722', 'perm_workcase_ticket_update', '工单更新', 'workcase:ticket:update', '更新工单', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0723', 'perm_workcase_ticket_view', '工单查看', 'workcase:ticket:view', '查看工单详情和列表', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0724', 'perm_workcase_ticket_process', '工单处理', 'workcase:ticket:process', '工单处理过程管理', 'module_workcase', true, 'system', NULL, now(), false), +('PERM-0725', 'perm_workcase_ticket_device', '工单设备', 'workcase:ticket:device', '工单设备管理', 'module_workcase', true, 'system', NULL, now(), false), + +-- 视频会议模块权限(Jitsi Meet) +('PERM-0730', 'perm_meeting_create', '创建会议', 'meeting:create:own', '创建视频会议', 'module_meeting', true, 'system', NULL, now(), false), +('PERM-0731', 'perm_meeting_join', '加入会议', 'meeting:join:any', '加入视频会议', 'module_meeting', true, 'system', NULL, now(), false), +('PERM-0732', 'perm_meeting_url', '获取会议链接', 'meeting:url:any', '获取会议加入链接', 'module_meeting', true, 'system', NULL, now(), false), +('PERM-0733', 'perm_meeting_token', '获取会议令牌', 'meeting:token:any', '获取会议参与令牌', 'module_meeting', true, 'system', NULL, now(), false); + +-- ============================= +-- 5. 初始化视图(菜单) +-- ============================= +INSERT INTO sys.tb_sys_view ( + optsn, view_id, name, parent_id, url, component, icon, type, + view_type, iframe_url, service, layout, order_num, description, + creator, create_time, deleted +) VALUES +-- ========================= +-- 平台应用菜单 (platform) +-- ========================= +-- 一级菜单 (图标使用 lucide-vue-next) +('VIEW-P002', 'view_platform_chat', '泰豪AI助手', NULL, '/aichat', 'public/Chat/AIChatView.vue', 'MessageCircle', 1, + 'route', NULL, 'platform', 'SidebarLayout', 10, '泰豪AI助手-直接智能体对话', 'system', now(), false), +('VIEW-P001', 'view_platform_home', '全部应用', NULL, '/agents', 'public/Agents/AgentPlatformView.vue', 'LayoutGrid', 1, + 'route', NULL, 'platform', 'SidebarLayout', 20, '全部智能体', 'system', now(), false), +-- iframe 嵌入菜单 +-- url: platform中的路由路径(用于sidebar定位和路由跳转) +-- iframe_url: iframe的src地址(实际内容的URL) +('VIEW-P005', 'view_platform_workflow', '智能体编排', NULL, '/app/workflow', NULL, 'Workflow', 1, + 'iframe', 'http://localhost:3000', 'platform', 'SidebarLayout', 30, 'Dify智能体编排(iframe)', 'system', now(), false), +('VIEW-P003', 'view_platform_bidding', '招标助手', NULL, '/app/bidding', NULL, 'FileText', 1, + 'iframe', '/bidding/', 'platform', 'SidebarLayout', 40, '招标应用(iframe)', 'system', now(), false), +('VIEW-P004', 'view_platform_workcase', '泰豪小电', NULL, '/app/workcase', NULL, 'Headphones', 1, + 'iframe', '/workcase/', 'platform', 'SidebarLayout', 50, '客服应用(iframe)', 'system', now(), false), + + +-- 平台管理后台内部视图(SubSidebarLayout布局,在platform服务内) +('VIEW-P201', 'view_platform_admin_overview', '数据概览', NULL, '/admin/overview', 'admin/overview/OverviewView.vue', 'BarChart3', 1, + 'route', NULL, 'platform', 'SubSidebarLayout', 210, '平台数据概览', 'system', now(), false), +('VIEW-P202', 'view_platform_admin_user', '用户管理', NULL, '/admin/userManagement', 'admin/userManagement/UserManagementView.vue', 'Users', 1, + 'route', NULL, 'platform', 'SubSidebarLayout', 220, '平台用户管理', 'system', now(), false), +('VIEW-P203', 'view_platform_admin_knowledge', '知识库', NULL, '/admin/knowledge', 'admin/knowledge/KnowledgeView.vue', 'FileText', 1, + 'route', NULL, 'platform', 'SubSidebarLayout', 230, '平台知识库管理', 'system', now(), false), +('VIEW-P204', 'view_platform_admin_config', '系统配置', NULL, '/admin/config', 'admin/config/ConfigView.vue', 'Settings', 1, + 'route', NULL, 'platform', 'SubSidebarLayout', 240, '平台系统配置', 'system', now(), false), + +-- -- 系统管理目录 +-- ('VIEW-P100', 'view_system', '系统管理', NULL, '/system', NULL, 'Settings', 0, +-- 'route', NULL, 'platform', 'SidebarLayout', 100, '系统管理目录', 'system', now(), false), +-- +-- -- 系统管理子菜单 +-- ('VIEW-P101', 'view_user', '用户管理', 'view_system', '/system/user', 'system/UserList', 'Users', 1, +-- 'route', NULL, 'platform', 'SidebarLayout', 10, '用户管理页面', 'system', now(), false), +-- +-- ('VIEW-P102', 'view_role', '角色管理', 'view_system', '/system/role', 'system/RoleList', 'Shield', 1, +-- 'route', NULL, 'platform', 'SidebarLayout', 20, '角色管理页面', 'system', now(), false), +-- +-- ('VIEW-P103', 'view_dept', '部门管理', 'view_system', '/system/dept', 'system/DeptList', 'Building', 1, +-- 'route', NULL, 'platform', 'SidebarLayout', 30, '部门管理页面', 'system', now(), false), +-- +-- ('VIEW-P104', 'view_permission', '权限管理', 'view_system', '/system/permission', 'system/PermissionList', 'Lock', 1, +-- 'route', NULL, 'platform', 'SidebarLayout', 40, '权限管理页面', 'system', now(), false), +-- +-- ('VIEW-P105', 'view_config', '配置管理', 'view_system', '/system/config', 'system/ConfigList', 'Settings', 1, +-- 'route', NULL, 'platform', 'SidebarLayout', 50, '配置管理页面', 'system', now(), false), +-- +-- ('VIEW-P106', 'view_file', '文件管理', 'view_system', '/system/file', 'system/FileList', 'FileText', 1, +-- 'route', NULL, 'platform', 'SidebarLayout', 60, '文件管理页面', 'system', now(), false), +-- +-- ('VIEW-P107', 'view_message', '消息管理', 'view_system', '/system/message', 'system/MessageList', 'Mail', 1, +-- 'route', NULL, 'platform', 'SidebarLayout', 70, '消息管理页面', 'system', now(), false), +-- +-- -- ========================= +-- -- 招标应用菜单 (bidding) +-- -- ========================= +-- ('VIEW-B001', 'view_bidding_home', '首页', NULL, '/home', 'Home', 'House', 1, +-- 'route', NULL, 'bidding', 'DefaultLayout', 10, '招标应用首页', 'system', now(), false), +-- +-- ('VIEW-B002', 'view_bidding_list', '招标列表', NULL, '/bidding/list', 'bidding/List', 'List', 1, +-- 'route', NULL, 'bidding', 'DefaultLayout', 20, '招标项目列表', 'system', now(), false), +-- +-- ('VIEW-B003', 'view_bidding_detail', '招标详情', NULL, '/bidding/detail', 'bidding/Detail', 'Document', 1, +-- 'route', NULL, 'bidding', 'DefaultLayout', 30, '招标项目详情', 'system', now(), false), +-- +-- ('VIEW-B004', 'view_bidding_offer', '投标管理', NULL, '/bidding/offer', 'bidding/Offer', 'Edit', 1, +-- 'route', NULL, 'bidding', 'DefaultLayout', 40, '投标管理页面', 'system', now(), false), + +-- ========================= +-- 客服应用菜单 (workcase) - 图标使用 lucide-vue-next +-- ========================= +-- 用户端视图 +('VIEW-W001', 'view_workcase_home', '智能客服', NULL, '/aichat', 'public/AIChat/AIChatView.vue', 'Home', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 10, '智能客服首页', 'system', now(), false), + +('VIEW-W002', 'view_workcase_chatroom', '聊天室控制台', NULL, '/chatroom', 'public/ChatRoom/ChatRoomView.vue', 'MessageSquare', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 20, '实时聊天室控制台', 'system', now(), false), + +-- 管理端视图(使用 SubSidebarLayout 布局) +('VIEW-W101', 'view_workcase_admin_overview', '数据概览', NULL, '/admin/overview', 'admin/overview/OverviewView.vue', 'BarChart3', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 110, '泰豪小电数据概览', 'system', now(), false), + +('VIEW-W102', 'view_workcase_admin_knowledge', '知识库管理', NULL, '/admin/knowledge', 'admin/knowledge/KnowLedgeView.vue', 'FileText', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 120, '知识库文档管理', 'system', now(), false), + +('VIEW-W103', 'view_workcase_admin_tickets', '工单管理', NULL, '/admin/workcase', 'admin/workcase/WorkcaseView.vue', 'Ticket', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 130, '客服工单管理', 'system', now(), false), + +('VIEW-W104', 'view_workcase_admin_conversation', '对话数据', NULL, '/admin/customerChat', 'admin/customerChat/CustomerChatView.vue', 'MessageCircle', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 140, '客户对话数据管理', 'system', now(), false), + +('VIEW-W105', 'view_workcase_admin_agent', '智能体管理', NULL, '/admin/agent', 'admin/agent/AgentView.vue', 'Bot', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 150, '智能体配置管理', 'system', now(), false), + +-- 日志管理(带子级的目录) +('VIEW-W106', 'view_workcase_admin_log', '日志管理', NULL, '/admin/log', NULL, 'ScrollText', 1, + 'route', NULL, 'workcase', 'SubSidebarLayout', 160, '日志管理目录', 'system', now(), false), + +('VIEW-W107', 'view_workcase_admin_log_knowledge', '知识库日志', 'view_workcase_admin_log', '/admin/log/knowledge', 'admin/log/knowledgeLog/KnowledgeLogView.vue', 'FileText', 1, + 'route', NULL, 'workcase', NULL, 161, '知识库操作日志', 'system', now(), false), + +('VIEW-W108', 'view_workcase_admin_log_workcase', '工单日志', 'view_workcase_admin_log', '/admin/log/workcase', 'admin/log/workcaseLog/WorkcaseLogView.vue', 'Ticket', 1, + 'route', NULL, 'workcase', NULL, 162, '工单操作日志', 'system', now(), false), + +('VIEW-W109', 'view_workcase_admin_log_system', '系统日志', 'view_workcase_admin_log', '/admin/log/system', 'admin/log/systemLog/SystemLogView.vue', 'Settings', 1, + 'route', NULL, 'workcase', NULL, 163, '系统运行日志', 'system', now(), false); +-- ============================= +-- 6. 角色权限关联(超级管理员拥有所有权限) +-- ============================= +INSERT INTO sys.tb_sys_role_permission ( + optsn, role_id, permission_id, creator, dept_path, create_time, deleted +) +SELECT + 'RP-' || LPAD(ROW_NUMBER() OVER (ORDER BY permission_id)::TEXT, 4, '0'), + 'role_super_admin', + permission_id, + 'system', + NULL, + now(), + false +FROM sys.tb_sys_permission +WHERE deleted = false; + +-- 系统管理员权限(除了用户删除外的系统管理权限 + 所有平台基础菜单) +INSERT INTO sys.tb_sys_role_permission ( + optsn, role_id, permission_id, creator, dept_path, create_time, deleted +) +SELECT + 'RP-SA-' || LPAD(ROW_NUMBER() OVER (ORDER BY permission_id)::TEXT, 4, '0'), + 'role_system_admin', + permission_id, + 'system', + NULL, + now(), + false +FROM sys.tb_sys_permission +WHERE deleted = false + AND code NOT IN ('system:user:delete', 'system:role:delete', 'system:dept:delete') + AND ( + module_id IN ('module_system', 'module_file', 'module_message', 'module_config', 'module_bidding', 'module_workcase') + OR code LIKE 'platform:%:view' -- 包含所有平台基础菜单权限 + ); + +-- 普通用户权限(基础查看和文件操作 + 平台基础菜单访问) +INSERT INTO sys.tb_sys_role_permission ( + optsn, role_id, permission_id, creator, dept_path, create_time, deleted +) VALUES +-- 平台基础菜单访问权限 +('RP-U-0001', 'role_user', 'perm_platform_home', 'system', NULL, now(), false), +('RP-U-0002', 'role_user', 'perm_platform_chat', 'system', NULL, now(), false), +('RP-U-0003', 'role_user', 'perm_platform_bidding', 'system', NULL, now(), false), +('RP-U-0004', 'role_user', 'perm_platform_workcase', 'system', NULL, now(), false), +('RP-U-0005', 'role_user', 'perm_platform_workflow', 'system', NULL, now(), false), +-- 系统功能权限 +('RP-U-0011', 'role_user', 'perm_user_view', 'system', NULL, now(), false), +('RP-U-0012', 'role_user', 'perm_file_view', 'system', NULL, now(), false), +('RP-U-0013', 'role_user', 'perm_file_upload', 'system', NULL, now(), false), +('RP-U-0014', 'role_user', 'perm_file_download', 'system', NULL, now(), false), +('RP-U-0015', 'role_user', 'perm_message_view', 'system', NULL, now(), false), +('RP-U-0016', 'role_user', 'perm_config_view', 'system', NULL, now(), false), +--- 视频会议权限 +('RP-U-0050', 'role_user', 'perm_meeting_create', 'system', NULL, now(), false), +('RP-U-0051', 'role_user', 'perm_meeting_join', 'system', NULL, now(), false), +('RP-U-0052', 'role_user', 'perm_meeting_url', 'system', NULL, now(), false), +('RP-U-0053', 'role_user', 'perm_meeting_token', 'system', NULL, now(), false); + +-- 访客权限(基础菜单 + workcase聊天和工单全部接口权限) +INSERT INTO sys.tb_sys_role_permission ( + optsn, role_id, permission_id, creator, dept_path, create_time, deleted +) VALUES +-- 平台基础菜单访问权限 +('RP-G-0001', 'role_guest', 'perm_platform_home', 'system', NULL, now(), false), +('RP-G-0002', 'role_guest', 'perm_platform_chat', 'system', NULL, now(), false), +('RP-G-0003', 'role_guest', 'perm_platform_workcase', 'system', NULL, now(), false), +-- 系统功能权限(仅查看) +('RP-G-0011', 'role_guest', 'perm_user_view', 'system', NULL, now(), false), +('RP-G-0012', 'role_guest', 'perm_file_view', 'system', NULL, now(), false), +('RP-G-0013', 'role_guest', 'perm_message_view', 'system', NULL, now(), false), +-- Workcase AI对话接口权限 +('RP-G-0021', 'role_guest', 'perm_workcase_chat_create', 'system', NULL, now(), false), +('RP-G-0022', 'role_guest', 'perm_workcase_chat_update', 'system', NULL, now(), false), +('RP-G-0023', 'role_guest', 'perm_workcase_chat_list', 'system', NULL, now(), false), +('RP-G-0024', 'role_guest', 'perm_workcase_chat_message', 'system', NULL, now(), false), +('RP-G-0025', 'role_guest', 'perm_workcase_chat_stream', 'system', NULL, now(), false), +('RP-G-0026', 'role_guest', 'perm_workcase_chat_analyze', 'system', NULL, now(), false), +-- Workcase 聊天室接口权限 +('RP-G-0031', 'role_guest', 'perm_workcase_room_create', 'system', NULL, now(), false), +('RP-G-0032', 'role_guest', 'perm_workcase_room_update', 'system', NULL, now(), false), +('RP-G-0033', 'role_guest', 'perm_workcase_room_close', 'system', NULL, now(), false), +('RP-G-0034', 'role_guest', 'perm_workcase_room_view', 'system', NULL, now(), false), +('RP-G-0035', 'role_guest', 'perm_workcase_room_member', 'system', NULL, now(), false), +('RP-G-0036', 'role_guest', 'perm_workcase_room_message', 'system', NULL, now(), false), +('RP-G-0037', 'role_guest', 'perm_workcase_chatroom', 'system', NULL, now(), false), +-- Workcase 工单接口权限 +('RP-G-0041', 'role_guest', 'perm_workcase_ticket_create', 'system', NULL, now(), false), +('RP-G-0042', 'role_guest', 'perm_workcase_ticket_update', 'system', NULL, now(), false), +('RP-G-0043', 'role_guest', 'perm_workcase_ticket_view', 'system', NULL, now(), false), +('RP-G-0044', 'role_guest', 'perm_workcase_ticket_process', 'system', NULL, now(), false), +('RP-G-0045', 'role_guest', 'perm_workcase_ticket_device', 'system', NULL, now(), false), +--- 视频会议权限 +('RP-G-0050', 'role_guest', 'perm_meeting_create', 'system', NULL, now(), false), +('RP-G-0051', 'role_guest', 'perm_meeting_join', 'system', NULL, now(), false), +('RP-G-0052', 'role_guest', 'perm_meeting_url', 'system', NULL, now(), false), +('RP-G-0053', 'role_guest', 'perm_meeting_token', 'system', NULL, now(), false); + +-- ============================= +-- 7. 视图权限关联 +-- ============================= +-- 将视图与对应模块的权限关联(使用真正的 view_id,不是 optsn) +INSERT INTO sys.tb_sys_view_permission ( + optsn, view_id, permission_id, creator, dept_path, create_time, deleted +) VALUES +-- 平台基础菜单权限关联(所有登录用户都可访问) +('VP-P001', 'view_platform_home', 'perm_platform_home', 'system', NULL, now(), false), +('VP-P002', 'view_platform_chat', 'perm_platform_chat', 'system', NULL, now(), false), +('VP-P003', 'view_platform_bidding', 'perm_platform_bidding', 'system', NULL, now(), false), +('VP-P004', 'view_platform_workcase', 'perm_platform_workcase', 'system', NULL, now(), false), +('VP-P005', 'view_platform_workflow', 'perm_platform_workflow', 'system', NULL, now(), false), + +-- 管理后台入口权限关联(iframe入口) +('VP-P101', 'view_platform_admin_entry', 'perm_platform_admin', 'system', NULL, now(), false), +('VP-P102', 'view_bidding_admin_entry', 'perm_bidding_admin', 'system', NULL, now(), false), +('VP-P103', 'view_workcase_admin_entry', 'perm_workcase_admin', 'system', NULL, now(), false), + +-- 平台管理后台内部视图权限关联(SubSidebarLayout) +('VP-P201', 'view_platform_admin_overview', 'perm_platform_admin_overview', 'system', NULL, now(), false), +('VP-P202', 'view_platform_admin_user', 'perm_platform_admin_user', 'system', NULL, now(), false), +('VP-P203', 'view_platform_admin_knowledge', 'perm_platform_admin_knowledge', 'system', NULL, now(), false), +('VP-P204', 'view_platform_admin_config', 'perm_platform_admin_config', 'system', NULL, now(), false), + +-- Workcase服务用户端视图关联 +('VP-W001', 'view_workcase_home', 'perm_platform_workcase', 'system', NULL, now(), false), +('VP-W002', 'view_workcase_chatroom', 'perm_workcase_chatroom', 'system', NULL, now(), false), + +-- Workcase服务管理端视图关联 +('VP-W101', 'view_workcase_admin_overview', 'perm_workcase_overview', 'system', NULL, now(), false), +('VP-W102', 'view_workcase_admin_knowledge', 'perm_workcase_knowledge', 'system', NULL, now(), false), +('VP-W103', 'view_workcase_admin_tickets', 'perm_workcase_tickets', 'system', NULL, now(), false), +('VP-W104', 'view_workcase_admin_conversation', 'perm_workcase_conversation', 'system', NULL, now(), false), +('VP-W105', 'view_workcase_admin_agent', 'perm_workcase_agent', 'system', NULL, now(), false), + +-- 日志管理视图关联(包括父级和子级) +('VP-W106', 'view_workcase_admin_log', 'perm_workcase_log', 'system', NULL, now(), false), +('VP-W107', 'view_workcase_admin_log_knowledge', 'perm_workcase_log', 'system', NULL, now(), false), +('VP-W108', 'view_workcase_admin_log_workcase', 'perm_workcase_log', 'system', NULL, now(), false), +('VP-W109', 'view_workcase_admin_log_system', 'perm_workcase_log', 'system', NULL, now(), false); + +-- -- 用户管理视图关联用户权限(已注释,因为view_user被注释掉了) +-- -- ('VP-0001', 'view_user', 'perm_user_view', 'system', NULL, now(), false), +-- -- ('VP-0002', 'view_user', 'perm_user_create', 'system', NULL, now(), false), +-- -- ('VP-0003', 'view_user', 'perm_user_edit', 'system', NULL, now(), false), +-- -- ('VP-0004', 'view_user', 'perm_user_delete', 'system', NULL, now(), false), +-- -- ('VP-0005', 'view_user', 'perm_user_export', 'system', NULL, now(), false), +-- -- +-- -- -- 角色管理视图关联角色权限 +-- -- ('VP-0011', 'view_role', 'perm_role_view', 'system', NULL, now(), false), +-- -- ('VP-0012', 'view_role', 'perm_role_create', 'system', NULL, now(), false), +-- -- ('VP-0013', 'view_role', 'perm_role_edit', 'system', NULL, now(), false), +-- -- ('VP-0014', 'view_role', 'perm_role_delete', 'system', NULL, now(), false), +-- -- ('VP-0015', 'view_role', 'perm_role_export', 'system', NULL, now(), false), +-- -- +-- -- -- 部门管理视图关联部门权限 +-- -- ('VP-0021', 'view_dept', 'perm_dept_view', 'system', NULL, now(), false), +-- -- ('VP-0022', 'view_dept', 'perm_dept_create', 'system', NULL, now(), false), +-- -- ('VP-0023', 'view_dept', 'perm_dept_edit', 'system', NULL, now(), false), +-- -- ('VP-0024', 'view_dept', 'perm_dept_delete', 'system', NULL, now(), false), +-- -- ('VP-0025', 'view_dept', 'perm_dept_export', 'system', NULL, now(), false), +-- -- +-- -- -- 权限管理视图关联权限管理权限 +-- -- ('VP-0031', 'view_permission', 'perm_permission_view', 'system', NULL, now(), false), +-- -- ('VP-0032', 'view_permission', 'perm_permission_manage', 'system', NULL, now(), false), +-- -- +-- -- -- 配置管理视图关联配置权限 +-- -- ('VP-0041', 'view_config', 'perm_config_view', 'system', NULL, now(), false), +-- -- ('VP-0042', 'view_config', 'perm_config_edit', 'system', NULL, now(), false), +-- -- ('VP-0043', 'view_config', 'perm_config_export', 'system', NULL, now(), false), +-- -- +-- -- -- 文件管理视图关联文件权限 +-- -- ('VP-0051', 'view_file', 'perm_file_view', 'system', NULL, now(), false), +-- -- ('VP-0052', 'view_file', 'perm_file_upload', 'system', NULL, now(), false), +-- -- ('VP-0053', 'view_file', 'perm_file_download', 'system', NULL, now(), false), +-- -- ('VP-0054', 'view_file', 'perm_file_delete', 'system', NULL, now(), false), +-- -- ('VP-0055', 'view_file', 'perm_file_export', 'system', NULL, now(), false), +-- -- +-- -- -- 消息管理视图关联消息权限 +-- -- ('VP-0061', 'view_message', 'perm_message_view', 'system', NULL, now(), false), +-- -- ('VP-0062', 'view_message', 'perm_message_send', 'system', NULL, now(), false), +-- -- ('VP-0063', 'view_message', 'perm_message_manage', 'system', NULL, now(), false), +-- -- ('VP-0064', 'view_message', 'perm_message_export', 'system', NULL, now(), false); diff --git a/docker/urbanLifeline/postgres/init/sql/initDataUser.sql b/docker/urbanLifeline/postgres/init/sql/initDataUser.sql new file mode 100644 index 00000000..507b2ec7 --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/initDataUser.sql @@ -0,0 +1,64 @@ +-- 初始化用户数据(与 sys schema 对应) +-- 创建系统管理员账户和示例用户 + +-- ============================= +-- 1. 创建超级管理员用户 +-- ============================= +-- 注意:密码需要使用 bcrypt 加密,这里使用的是 'admin123' 的 bcrypt hash +-- 实际部署时应该修改为安全的密码 +INSERT INTO sys.tb_sys_user ( + optsn, user_id, usercode, password, email, phone, phone_hash, + create_time, status, deleted +) VALUES +('USER-0001', 'user_admin', 'admin', + '$2a$10$XAe0TE2p0ym94bKJ8LJ52el3M4oYyiExVH/kNCh.pWLLGDZWNM9Yu', -- admin123 + 'admin@urbanlifeline.com', 'DAWTIvnCQI/KmtwkBYI5WP2NpnSKTq4kStJpOJKahOeJLNhAQ0s1', '7503bbfc6171077b737cdc4f76e781893a9a474c9ead05b6b946ac936e5a0288', + now(), 0, false); + +-- 超级管理员用户信息 +INSERT INTO sys.tb_sys_user_info ( + optsn, user_id, username, avatar, gender, level, remark, + create_time, deleted +) VALUES +('UINFO-0001', 'user_admin', '系统管理员', + '/static/avatar/admin.png', 1, 10, '系统超级管理员账户', + now(), false); + +-- ============================= +-- 2. 关联超级管理员角色 +-- ============================= +INSERT INTO sys.tb_sys_user_role ( + optsn, user_id, role_id, dept_id, dept_path, + creator, create_time, deleted +) VALUES +('UR-0001', 'user_admin', 'role_super_admin', 'dept_root', '/dept_root/', + 'system', now(), false); + +-- ============================= +-- 3. 创建示例普通用户(可选) +-- ============================= +INSERT INTO sys.tb_sys_user ( + optsn, user_id, usercode, password, email, phone, phone_hash, + create_time, status, deleted +) VALUES +('USER-0002', 'user_demo', 'demo', + '$2a$10$XAe0TE2p0ym94bKJ8LJ52el3M4oYyiExVH/kNCh.pWLLGDZWNM9Yu', -- admin123 + 'demo@urbanlifeline.com', 'Y9tsAZOppzsxmKvI7iqqRBMDHzvWym2DE5FX1KgEGVBC5Ii1UG68', '4e98ffd0e02a7f746291bff77c6c497225e8884758d503bde2efad64e45ad44b', + now(), 0, false); + +-- 示例用户信息 +INSERT INTO sys.tb_sys_user_info ( + optsn, user_id, username, avatar, gender, level, remark, + create_time, deleted +) VALUES +('UINFO-0002', 'user_demo', '演示用户', + '/static/avatar/demo.png', 0, 1, '系统演示账户', + now(), false); + +-- 关联普通用户角色 +INSERT INTO sys.tb_sys_user_role ( + optsn, user_id, role_id, dept_id, dept_path, + creator, create_time, deleted +) VALUES +('UR-0002', 'user_demo', 'role_user', 'dept_root', '/dept_root/', + 'system', now(), false); diff --git a/docker/urbanLifeline/postgres/init/sql/initDataWorkcase.sql b/docker/urbanLifeline/postgres/init/sql/initDataWorkcase.sql new file mode 100644 index 00000000..cf786a91 --- /dev/null +++ b/docker/urbanLifeline/postgres/init/sql/initDataWorkcase.sql @@ -0,0 +1,6 @@ +-- 初始化聊天室人员 +-- user_admin +INSERT INTO workcase.tb_chat_room_member( + optsn, member_id, room_id, user_id, user_type, user_name, status, unread_count, last_read_time, last_read_msg_id, join_time, leave_time, creator, create_time, update_time +) VALUES +('MEM-0001', 'member_admin', 'room_0001', 'user_admin', 'staff', '系统管理员', 'active', 0, null, null, now(), null, 'system', now(), null); \ No newline at end of file diff --git a/docker/urbanLifeline/serv/.env.example b/docker/urbanLifeline/serv/.env.example new file mode 100644 index 00000000..13bb9c1c --- /dev/null +++ b/docker/urbanLifeline/serv/.env.example @@ -0,0 +1,39 @@ +# ================================================ +# Urban Lifeline 后端服务配置 +# 复制此文件为 .env 并修改配置 +# ================================================ + +# ------------------------------ +# 镜像版本 +# ------------------------------ +IMAGE_VERSION=latest + +# ------------------------------ +# 端口配置 +# ------------------------------ +GATEWAY_PORT=8080 + +# ------------------------------ +# Spring 配置 +# ------------------------------ +SPRING_PROFILES_ACTIVE=prod +NACOS_SERVER_ADDR=nacos:8848 +NACOS_NAMESPACE= + +# ------------------------------ +# 挂载目录配置 +# ------------------------------ +# 配置文件目录 (存放各服务的 yml 配置) +CONFIG_ROOT=./volumes/config + +# 日志目录 +LOG_ROOT=./volumes/logs + +# 数据目录 (上传文件、临时文件等) +DATA_ROOT=./volumes/data + +# ------------------------------ +# 资源限制 +# ------------------------------ +MEMORY_LIMIT=4G +MEMORY_RESERVATION=2G diff --git a/docker/urbanLifeline/serv/Dockerfile.base b/docker/urbanLifeline/serv/Dockerfile.base new file mode 100644 index 00000000..00dba3f6 --- /dev/null +++ b/docker/urbanLifeline/serv/Dockerfile.base @@ -0,0 +1,35 @@ +# ================================================ +# Urban Lifeline - 后端基础镜像 +# 包含 JRE 21 + 常用工具 +# 构建命令: docker build -t urban-lifeline-base-serv:latest -f Dockerfile.base . +# ================================================ +FROM eclipse-temurin:21-jre-alpine + +# 设置环境变量 +ENV LANG=C.UTF-8 \ + LC_ALL=C.UTF-8 \ + TZ=Asia/Shanghai + +# 使用阿里云镜像源(解决网络问题) +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories + +# 安装基础工具 +RUN apk add --no-cache \ + curl \ + wget \ + bash \ + tzdata \ + && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && echo "Asia/Shanghai" > /etc/timezone + +# 创建应用目录 +WORKDIR /app +RUN mkdir -p /app/config /app/logs + +# 镜像元数据 +LABEL maintainer="Urban Lifeline Team" \ + description="Base image for Urban Lifeline backend services" \ + version="1.0" + +# 默认命令 +CMD ["echo", "This is base image, please use specific service image"] diff --git a/docker/urbanLifeline/serv/Dockerfile.serv b/docker/urbanLifeline/serv/Dockerfile.serv new file mode 100644 index 00000000..3b0910e2 --- /dev/null +++ b/docker/urbanLifeline/serv/Dockerfile.serv @@ -0,0 +1,39 @@ +# ================================================ +# Urban Lifeline - All-in-One 后端服务镜像 +# 单容器运行所有微服务,通过脚本管理 +# +# 构建: docker build -t urban-lifeline-serv:latest -f Dockerfile.serv . +# ================================================ +FROM urban-lifeline-base-serv:latest + +WORKDIR /app +RUN mkdir -p /app/jars /app/logs /app/pids /app/config + +# 复制管理脚本 +COPY docker/urbanLifeline/serv/service-manager.sh /app/service-manager.sh +RUN chmod +x /app/service-manager.sh + +# 复制所有服务 JAR 包 +COPY urbanLifelineServ/gateway/target/*.jar /app/jars/gateway.jar +COPY urbanLifelineServ/system/target/*.jar /app/jars/system.jar +COPY urbanLifelineServ/auth/target/*.jar /app/jars/auth.jar +COPY urbanLifelineServ/file/target/*.jar /app/jars/file.jar +COPY urbanLifelineServ/ai/target/*.jar /app/jars/ai.jar +COPY urbanLifelineServ/workcase/target/*.jar /app/jars/workcase.jar + +# # COPY urbanLifelineServ/log/target/*.jar /app/jars/log.jar +# COPY urbanLifelineServ/message/target/*.jar /app/jars/message.jar +# COPY urbanLifelineServ/crontab/target/*.jar /app/jars/crontab.jar +# COPY urbanLifelineServ/bidding/target/*.jar /app/jars/bidding.jar +# COPY urbanLifelineServ/platform/target/*.jar /app/jars/platform.jar + +# 配置目录 (可外挂) +VOLUME ["/app/config", "/app/logs"] + +EXPOSE 8080 8081 8082 8083 8084 8085 8086 8087 8088 8089 8090 + +HEALTHCHECK --interval=30s --timeout=10s --start-period=180s --retries=3 \ + CMD curl -f http://localhost:8080/actuator/health || exit 1 + +ENTRYPOINT ["/app/service-manager.sh"] +CMD ["start-all"] diff --git a/docker/urbanLifeline/serv/build.sh b/docker/urbanLifeline/serv/build.sh new file mode 100644 index 00000000..d705c4b6 --- /dev/null +++ b/docker/urbanLifeline/serv/build.sh @@ -0,0 +1,84 @@ +#!/bin/bash +# ================================================ +# Urban Lifeline - 后端服务镜像构建脚本 +# +# 使用方式: +# ./build.sh # 构建 All-in-One 镜像 (推荐) +# ./build.sh base # 仅构建基础镜像 +# ================================================ + +set -e + +# 项目根目录 (相对于此脚本) +PROJECT_ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" +cd "$PROJECT_ROOT" + +# 镜像版本 +VERSION=${IMAGE_VERSION:-latest} + +# 服务列表 +SERVICES=(gateway system auth file log message crontab bidding workcase platform ai) + +# 构建基础镜像 +build_base() { + echo "==========================================" + echo "构建基础镜像: urban-lifeline-base-serv:${VERSION}" + echo "==========================================" + docker build -t urban-lifeline-base-serv:${VERSION} \ + -f docker/urbanLifeline/serv/Dockerfile.base . + + if [ "$VERSION" != "latest" ]; then + docker tag urban-lifeline-base-serv:${VERSION} urban-lifeline-base-serv:latest + fi +} + +# 构建 All-in-One 镜像 +build() { + echo "==========================================" + echo "构建 All-in-One 镜像: urban-lifeline-serv:${VERSION}" + echo "==========================================" + + # 先构建基础镜像 + build_base + + # 检查所有 JAR 文件 + local missing=0 + for service in "${SERVICES[@]}"; do + if ! ls urbanLifelineServ/${service}/target/*.jar 1> /dev/null 2>&1; then + echo "缺少: urbanLifelineServ/${service}/target/*.jar" + missing=1 + fi + done + + if [ $missing -eq 1 ]; then + echo "" + echo "请先执行 Maven 构建:" + echo " cd urbanLifelineServ && mvn clean package -DskipTests" + exit 1 + fi + + docker build -t urban-lifeline-serv:${VERSION} \ + -f docker/urbanLifeline/serv/Dockerfile.serv . + + if [ "$VERSION" != "latest" ]; then + docker tag urban-lifeline-serv:${VERSION} urban-lifeline-serv:latest + fi + + echo "==========================================" + echo "镜像构建完成!" + echo "" + echo "管理服务:" + echo " docker exec urban-lifeline-serv /app/service-manager.sh status" + echo " docker exec urban-lifeline-serv /app/service-manager.sh restart gateway" + echo "==========================================" +} + +# 主逻辑 +case "${1:-build}" in + base) + build_base + ;; + *) + build + ;; +esac diff --git a/docker/urbanLifeline/serv/config/application-ai.yml b/docker/urbanLifeline/serv/config/application-ai.yml new file mode 100644 index 00000000..b5dd320d --- /dev/null +++ b/docker/urbanLifeline/serv/config/application-ai.yml @@ -0,0 +1,41 @@ +# ================== AI 服务配置 (Docker) ================== +server: + port: 8090 + +spring: + application: + name: ai-service + servlet: + multipart: + enabled: true + max-file-size: 500MB + max-request-size: 500MB + +auth: + enabled: true + gateway-mode: true + whitelist: + - /swagger-ui/** + - /swagger-ui.html + - /v3/api-docs/** + - /webjars/** + - /favicon.ico + - /error + - /actuator/health + - /actuator/info + - /ai/chat/** + +springdoc: + group-configs: + - group: 'default' + display-name: 'AI代理服务 API' + paths-to-match: '/**' + +dubbo: + application: + name: urban-lifeline-agent + qos-enable: false + protocol: + payload: 110100480 + scan: + base-packages: org.xyzh.ai.service.impl diff --git a/docker/urbanLifeline/serv/config/application-auth.yml b/docker/urbanLifeline/serv/config/application-auth.yml new file mode 100644 index 00000000..1eff6324 --- /dev/null +++ b/docker/urbanLifeline/serv/config/application-auth.yml @@ -0,0 +1,31 @@ +# ================== Auth 认证服务配置 (Docker) ================== +server: + port: 8081 + +spring: + application: + name: auth-service + +auth: + enabled: false + gateway-mode: false + whitelist: + - /** + +springdoc: + group-configs: + - group: 'default' + display-name: '认证服务 API' + paths-to-match: '/**' + +dubbo: + application: + name: urban-lifeline-auth + qos-enable: false + scan: + base-packages: org.xyzh.auth.service.impl + +jwt: + secret: ${JWT_SECRET:urban-lifeline-secret-key-2025-xyzh} + expiration: 86400 + refresh-expiration: 604800 diff --git a/docker/urbanLifeline/serv/config/application-bidding.yml b/docker/urbanLifeline/serv/config/application-bidding.yml new file mode 100644 index 00000000..fa95ad67 --- /dev/null +++ b/docker/urbanLifeline/serv/config/application-bidding.yml @@ -0,0 +1,33 @@ +# ================== Bidding 招投标服务配置 (Docker) ================== +server: + port: 8087 + +spring: + application: + name: bidding-service + +auth: + enabled: true + gateway-mode: true + whitelist: + - /swagger-ui/** + - /swagger-ui.html + - /v3/api-docs/** + - /webjars/** + - /favicon.ico + - /error + - /actuator/health + - /actuator/info + +springdoc: + group-configs: + - group: 'default' + display-name: '招投标服务 API' + paths-to-match: '/**' + +dubbo: + application: + name: urban-lifeline-bidding + qos-enable: false + scan: + base-packages: org.xyzh.bidding.service.impl diff --git a/docker/urbanLifeline/serv/config/application-crontab.yml b/docker/urbanLifeline/serv/config/application-crontab.yml new file mode 100644 index 00000000..47671dc6 --- /dev/null +++ b/docker/urbanLifeline/serv/config/application-crontab.yml @@ -0,0 +1,32 @@ +# ================== Crontab 定时任务服务配置 (Docker) ================== +server: + port: 8086 + +spring: + application: + name: crontab-service + +auth: + enabled: false + whitelist: + - /swagger-ui/** + - /swagger-ui.html + - /v3/api-docs/** + - /webjars/** + - /favicon.ico + - /error + - /actuator/health + - /actuator/info + +springdoc: + group-configs: + - group: 'default' + display-name: '定时任务服务 API' + paths-to-match: '/**' + +dubbo: + application: + name: urban-lifeline-crontab + qos-enable: false + scan: + base-packages: org.xyzh.crontab.service.impl diff --git a/docker/urbanLifeline/serv/config/application-file.yml b/docker/urbanLifeline/serv/config/application-file.yml new file mode 100644 index 00000000..180e9e39 --- /dev/null +++ b/docker/urbanLifeline/serv/config/application-file.yml @@ -0,0 +1,41 @@ +# ================== File 文件服务配置 (Docker) ================== +server: + port: 8084 + +spring: + application: + name: file-service + servlet: + multipart: + enabled: true + max-file-size: 500MB + max-request-size: 500MB + +auth: + enabled: true + gateway-mode: true + whitelist: + - /swagger-ui/** + - /swagger-ui.html + - /v3/api-docs/** + - /webjars/** + - /favicon.ico + - /error + - /actuator/health + - /actuator/info + - /file/download/** + +springdoc: + group-configs: + - group: 'default' + display-name: '文件服务 API' + paths-to-match: '/**' + +dubbo: + application: + name: urban-lifeline-file + qos-enable: false + protocol: + payload: 110100480 + scan: + base-packages: org.xyzh.file.service.impl diff --git a/docker/urbanLifeline/serv/config/application-gateway.yml b/docker/urbanLifeline/serv/config/application-gateway.yml new file mode 100644 index 00000000..7cba3b97 --- /dev/null +++ b/docker/urbanLifeline/serv/config/application-gateway.yml @@ -0,0 +1,154 @@ +# ================== Gateway 服务配置 (Docker) ================== +server: + port: 8080 + +spring: + application: + name: gateway-service + + main: + web-application-type: reactive + + cloud: + nacos: + config: + enabled: false + + gateway: + discovery: + locator: + enabled: false + + routes: + - id: auth-service + uri: lb://auth-service + predicates: + - Path=/urban-lifeline/auth/** + filters: + - StripPrefix=1 + - name: RequestRateLimiter + args: + redis-rate-limiter.replenishRate: 100 + redis-rate-limiter.burstCapacity: 200 + + - id: system-service + uri: lb://system-service + predicates: + - Path=/urban-lifeline/system/** + filters: + - StripPrefix=1 + + - id: log-service + uri: lb://log-service + predicates: + - Path=/urban-lifeline/log/** + filters: + - StripPrefix=1 + + - id: file-service + uri: lb://file-service + predicates: + - Path=/urban-lifeline/file/** + filters: + - StripPrefix=1 + + - id: message-service + uri: lb://message-service + predicates: + - Path=/urban-lifeline/message/** + filters: + - StripPrefix=1 + + - id: bidding-service + uri: lb://bidding-service + predicates: + - Path=/urban-lifeline/bidding/** + filters: + - StripPrefix=1 + + - id: platform-service + uri: lb://platform-service + predicates: + - Path=/urban-lifeline/platform/** + filters: + - StripPrefix=1 + + - id: workcase-websocket + uri: lb:ws://workcase-service + predicates: + - Path=/urban-lifeline/workcase/ws/** + filters: + - StripPrefix=1 + + - id: workcase-service + uri: lb://workcase-service + predicates: + - Path=/urban-lifeline/workcase/** + filters: + - StripPrefix=1 + + - id: crontab-service + uri: lb://crontab-service + predicates: + - Path=/urban-lifeline/crontab/** + filters: + - StripPrefix=1 + + - id: ai-service + uri: lb://ai-service + predicates: + - Path=/urban-lifeline/ai/** + filters: + - StripPrefix=1 + + globalcors: + cors-configurations: + '[/**]': + allowedOriginPatterns: "*" + allowedMethods: [GET, POST, PUT, DELETE, OPTIONS] + allowedHeaders: "*" + allowCredentials: true + maxAge: 3600 + + data: + redis: + timeout: 5000ms + lettuce: + pool: + max-active: 20 + max-wait: -1ms + max-idle: 10 + min-idle: 5 + +auth: + enabled: true + token-header: Authorization + token-prefix: "Bearer " + login-path: /urban-lifeline/auth/login + logout-path: /urban-lifeline/auth/logout + captcha-path: /urban-lifeline/auth/captcha + refresh-path: /urban-lifeline/auth/refresh + whitelist: + - /actuator/** + - /v3/api-docs/** + - /swagger-ui/** + - /swagger-resources/** + - /webjars/** + - /doc.html + - /favicon.ico + - /error + - /urban-lifeline/*/v3/api-docs/** + - /urban-lifeline/*/swagger-ui/** + - /urban-lifeline/file/download/** + - /urban-lifeline/ai/chat/** + - /urban-lifeline/system/guest/identify + - /urban-lifeline/workcase/meeting/*/entry + +management: + endpoints: + web: + exposure: + include: health,info,gateway + endpoint: + health: + show-details: always diff --git a/docker/urbanLifeline/serv/config/application-message.yml b/docker/urbanLifeline/serv/config/application-message.yml new file mode 100644 index 00000000..74e92d56 --- /dev/null +++ b/docker/urbanLifeline/serv/config/application-message.yml @@ -0,0 +1,33 @@ +# ================== Message 消息服务配置 (Docker) ================== +server: + port: 8085 + +spring: + application: + name: message-service + +auth: + enabled: true + gateway-mode: true + whitelist: + - /swagger-ui/** + - /swagger-ui.html + - /v3/api-docs/** + - /webjars/** + - /favicon.ico + - /error + - /actuator/health + - /actuator/info + +springdoc: + group-configs: + - group: 'default' + display-name: '消息服务 API' + paths-to-match: '/**' + +dubbo: + application: + name: urban-lifeline-message + qos-enable: false + scan: + base-packages: org.xyzh.message.service.impl diff --git a/docker/urbanLifeline/serv/config/application-platform.yml b/docker/urbanLifeline/serv/config/application-platform.yml new file mode 100644 index 00000000..ed026a11 --- /dev/null +++ b/docker/urbanLifeline/serv/config/application-platform.yml @@ -0,0 +1,33 @@ +# ================== Platform 平台服务配置 (Docker) ================== +server: + port: 8089 + +spring: + application: + name: platform-service + +auth: + enabled: true + gateway-mode: true + whitelist: + - /swagger-ui/** + - /swagger-ui.html + - /v3/api-docs/** + - /webjars/** + - /favicon.ico + - /error + - /actuator/health + - /actuator/info + +springdoc: + group-configs: + - group: 'default' + display-name: '平台服务 API' + paths-to-match: '/**' + +dubbo: + application: + name: urban-lifeline-platform + qos-enable: false + scan: + base-packages: org.xyzh.platform.service.impl diff --git a/docker/urbanLifeline/serv/config/application-system.yml b/docker/urbanLifeline/serv/config/application-system.yml new file mode 100644 index 00000000..7def7a40 --- /dev/null +++ b/docker/urbanLifeline/serv/config/application-system.yml @@ -0,0 +1,41 @@ +# ================== System 系统服务配置 (Docker) ================== +server: + port: 8082 + +spring: + application: + name: system-service + +auth: + enabled: true + gateway-mode: true + whitelist: + - /swagger-ui/** + - /swagger-ui.html + - /v3/api-docs/** + - /webjars/** + - /favicon.ico + - /error + - /actuator/health + - /actuator/info + - /system/guest/identify + +springdoc: + swagger-ui: + try-it-out-enabled: true + show-common-extensions: true + show-extensions: true + filter: true + tags-sorter: alpha + operations-sorter: alpha + group-configs: + - group: 'default' + display-name: '系统服务 API' + paths-to-match: '/**' + +dubbo: + application: + name: urban-lifeline-system + qos-enable: false + scan: + base-packages: org.xyzh.system.service.impl diff --git a/docker/urbanLifeline/serv/config/application-workcase.yml b/docker/urbanLifeline/serv/config/application-workcase.yml new file mode 100644 index 00000000..20bb78b0 --- /dev/null +++ b/docker/urbanLifeline/serv/config/application-workcase.yml @@ -0,0 +1,51 @@ +# ================== Workcase 工单服务配置 (Docker) ================== +server: + port: 8088 + +spring: + application: + name: workcase-service + servlet: + multipart: + enabled: true + max-file-size: 500MB + max-request-size: 500MB + +auth: + enabled: true + gateway-mode: true + whitelist: + - /swagger-ui/** + - /swagger-ui.html + - /v3/api-docs/** + - /webjars/** + - /favicon.ico + - /error + - /actuator/health + - /actuator/info + - /workcase/chat/kefu/callback + - /workcase/receive/crm + +springdoc: + group-configs: + - group: 'default' + display-name: '工单服务 API' + paths-to-match: '/**' + +dubbo: + application: + name: urban-lifeline-workcase + qos-enable: false + protocol: + payload: 110100480 + scan: + base-packages: org.xyzh.workcase.service.impl + +jitsi: + app: + id: ${JITSI_APP_ID:urbanLifeline} + secret: ${JITSI_APP_SECRET:urbanLifeline-jitsi-secret-key-2025-production-safe-hs256} + server: + url: ${JITSI_SERVER_URL:https://meet.example.com} + token: + expiration: 7200000 diff --git a/docker/urbanLifeline/serv/config/bootstrap.yml b/docker/urbanLifeline/serv/config/bootstrap.yml new file mode 100644 index 00000000..80262f6a --- /dev/null +++ b/docker/urbanLifeline/serv/config/bootstrap.yml @@ -0,0 +1,70 @@ +# ================================================ +# Urban Lifeline - 通用 Bootstrap 配置 (Docker) +# 所有微服务共享的基础配置 +# ================================================ + +# ================== Spring Cloud Nacos ================== +spring: + cloud: + nacos: + discovery: + server-addr: ${NACOS_SERVER_ADDR:urban-lifeline-nacos:8848} + namespace: ${NACOS_NAMESPACE:} + group: ${NACOS_GROUP:DEFAULT_GROUP} + + # ================== DataSource ================== + datasource: + url: ${DB_URL:jdbc:postgresql://urban-lifeline-pg:5432/urban_lifeline} + username: ${DB_USERNAME:postgres} + password: ${DB_PASSWORD:postgres123456} + driver-class-name: org.postgresql.Driver + + # ================== Redis ================== + data: + redis: + host: ${REDIS_HOST:urban-lifeline-redis} + port: ${REDIS_PORT:6379} + database: ${REDIS_DATABASE:0} + password: ${REDIS_PASSWORD:} + +management: + endpoints: + web: + exposure: + include: health,info + endpoint: + health: + show-details: always +# ================== Security AES ================== +security: + aes: + secret-key: ${AES_SECRET_KEY:MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=} + +# ================== Dubbo ================== +dubbo: + protocol: + name: dubbo + port: -1 + registry: + address: nacos://${NACOS_SERVER_ADDR:urban-lifeline-nacos:8848} + +# ================== MyBatis-Plus ================== +mybatis-plus: + mapper-locations: classpath:mapper/**/*.xml + type-aliases-package: org.xyzh.common.dto, org.xyzh.api + +# ================== SpringDoc 基础配置 ================== +springdoc: + api-docs: + enabled: true + path: /v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html + +# ================== Logging ================== +logging: + config: classpath:log4j2.xml + charset: + console: UTF-8 + file: UTF-8 diff --git a/docker/urbanLifeline/serv/docker-compose.yml b/docker/urbanLifeline/serv/docker-compose.yml new file mode 100644 index 00000000..9405a8a2 --- /dev/null +++ b/docker/urbanLifeline/serv/docker-compose.yml @@ -0,0 +1,76 @@ +# ================================================ +# Urban Lifeline - All-in-One 后端部署 +# 单容器运行所有后端服务 +# ================================================ + +services: + # ====================== Redis 缓存 ====================== + redis: + image: redis:7-alpine + container_name: urban-lifeline-redis + restart: unless-stopped + networks: + - urban-lifeline + expose: + - "6379" + environment: + TZ: Asia/Shanghai + command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:-redis123} + volumes: + - ${REDIS_DATA:-./volumes/redis}:/data + deploy: + resources: + limits: + memory: ${REDIS_MEMORY_LIMIT:-512M} + healthcheck: + test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD:-redis123}", "ping"] + interval: 10s + timeout: 5s + retries: 3 + + # ====================== 后端服务 ====================== + urban-lifeline-serv: + image: urban-lifeline-serv:${IMAGE_VERSION:-latest} + container_name: urban-lifeline-serv + restart: unless-stopped + env_file: + - .env + networks: + - urban-lifeline + # 不对外暴露端口,仅通过 nginx 反向代理访问 + expose: + - "8080" + environment: + TZ: Asia/Shanghai + SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE:-prod} + NACOS_SERVER_ADDR: ${NACOS_SERVER_ADDR:-nacos:8848} + NACOS_NAMESPACE: ${NACOS_NAMESPACE:-} + REDIS_HOST: urban-lifeline-redis + REDIS_PORT: 6379 + REDIS_PASSWORD: ${REDIS_PASSWORD:-redis123} + depends_on: + redis: + condition: service_healthy + volumes: + # 配置文件目录 + - ${CONFIG_ROOT:-./volumes/config}:/app/config:ro + # 日志目录 + - ${LOG_ROOT:-./volumes/logs}:/app/logs + # 数据目录 (上传文件等) + - ${DATA_ROOT:-./volumes/data}:/app/data + deploy: + resources: + limits: + memory: ${MEMORY_LIMIT:-4G} + reservations: + memory: ${MEMORY_RESERVATION:-2G} + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 180s + +networks: + urban-lifeline: + name: urban-lifeline diff --git a/docker/urbanLifeline/serv/service-manager.sh b/docker/urbanLifeline/serv/service-manager.sh new file mode 100644 index 00000000..ca11c6bc --- /dev/null +++ b/docker/urbanLifeline/serv/service-manager.sh @@ -0,0 +1,371 @@ +#!/bin/bash +# ================================================ +# Urban Lifeline - 服务管理脚本 +# +# 用法: +# ./service-manager.sh start-all # 启动所有服务 +# ./service-manager.sh start gateway # 启动单个服务 +# ./service-manager.sh stop gateway # 停止单个服务 +# ./service-manager.sh restart gateway # 重启单个服务 +# ./service-manager.sh status # 查看所有服务状态 +# ./service-manager.sh logs gateway # 查看服务日志 +# ================================================ + +set -e + +# 目录配置 +JAR_DIR="/app/jars" +LOG_DIR="/app/logs" +PID_DIR="/app/pids" +CONFIG_DIR="/app/config" + +# 服务配置: 服务名=端口:内存 +declare -A SERVICES=( + ["gateway"]="8080:384m" + ["system"]="8082:384m" + ["auth"]="8081:256m" + ["file"]="8084:256m" + # ["log"]="8083:192m" + # ["message"]="8085:256m" + # ["crontab"]="8086:192m" + ["ai"]="8090:384m" + # ["bidding"]="8087:256m" + # ["platform"]="8089:256m" + ["workcase"]="8088:384m" +) + +# 启动顺序 (有依赖关系) +# BOOT_ORDER=(gateway system auth file log message crontab ai bidding platform workcase) +BOOT_ORDER=(gateway system auth file ai workcase) + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +# 获取服务端口 +get_port() { + local service=$1 + echo "${SERVICES[$service]}" | cut -d: -f1 +} + +# 获取服务内存配置 +get_memory() { + local service=$1 + echo "${SERVICES[$service]}" | cut -d: -f2 +} + +# 检查服务是否运行 +is_running() { + local service=$1 + local pid_file="${PID_DIR}/${service}.pid" + + if [ -f "$pid_file" ]; then + local pid=$(cat "$pid_file") + if kill -0 "$pid" 2>/dev/null; then + return 0 + fi + fi + return 1 +} + +# 等待服务就绪 +wait_for_service() { + local service=$1 + local port=$(get_port "$service") + local max_wait=60 + local count=0 + + while [ $count -lt $max_wait ]; do + if curl -sf "http://localhost:${port}/actuator/health" > /dev/null 2>&1; then + return 0 + fi + sleep 2 + count=$((count + 2)) + done + return 1 +} + +# 启动单个服务 +start_service() { + local service=$1 + local port=$(get_port "$service") + local memory=$(get_memory "$service") + local jar_file="${JAR_DIR}/${service}.jar" + local log_file="${LOG_DIR}/${service}.log" + local pid_file="${PID_DIR}/${service}.pid" + local bootstrap_file="${CONFIG_DIR}/bootstrap.yml" + local app_config_file="${CONFIG_DIR}/application-${service}.yml" + + if [ ! -f "$jar_file" ]; then + log_error "JAR 文件不存在: $jar_file" + return 1 + fi + + if is_running "$service"; then + log_warn "$service 已在运行 (PID: $(cat $pid_file))" + return 0 + fi + + log_info "启动 $service (端口: $port, 内存: $memory)..." + + # JVM 参数 + local java_opts="-Xms128m -Xmx${memory} -XX:+UseG1GC -XX:MaxGCPauseMillis=100" + java_opts="$java_opts -Djava.security.egd=file:/dev/./urandom" + java_opts="$java_opts -Dspring.profiles.active=${SPRING_PROFILES_ACTIVE:-prod}" + + # Nacos 配置 + if [ -n "$NACOS_SERVER_ADDR" ]; then + java_opts="$java_opts -Dspring.cloud.nacos.discovery.server-addr=$NACOS_SERVER_ADDR" + java_opts="$java_opts -Dspring.cloud.nacos.config.server-addr=$NACOS_SERVER_ADDR" + fi + + if [ -n "$NACOS_NAMESPACE" ]; then + java_opts="$java_opts -Dspring.cloud.nacos.discovery.namespace=$NACOS_NAMESPACE" + java_opts="$java_opts -Dspring.cloud.nacos.config.namespace=$NACOS_NAMESPACE" + fi + + # 外挂配置文件: bootstrap.yml + application-{service}.yml + local config_locations="" + if [ -f "$bootstrap_file" ]; then + config_locations="file:${bootstrap_file}" + log_info " 加载通用配置: ${bootstrap_file}" + fi + if [ -f "$app_config_file" ]; then + if [ -n "$config_locations" ]; then + config_locations="${config_locations},file:${app_config_file}" + else + config_locations="file:${app_config_file}" + fi + log_info " 加载服务配置: ${app_config_file}" + fi + if [ -n "$config_locations" ]; then + java_opts="$java_opts -Dspring.config.additional-location=${config_locations}" + fi + + # 启动服务 + nohup java $java_opts -jar "$jar_file" > "$log_file" 2>&1 & + local pid=$! + echo $pid > "$pid_file" + + log_info "$service 已启动 (PID: $pid)" +} + +# 停止单个服务 +stop_service() { + local service=$1 + local pid_file="${PID_DIR}/${service}.pid" + + if ! is_running "$service"; then + log_warn "$service 未在运行" + return 0 + fi + + local pid=$(cat "$pid_file") + log_info "停止 $service (PID: $pid)..." + + # 优雅关闭 + kill -15 "$pid" 2>/dev/null || true + + # 等待进程退出 + local count=0 + while [ $count -lt 30 ] && kill -0 "$pid" 2>/dev/null; do + sleep 1 + count=$((count + 1)) + done + + # 强制关闭 + if kill -0 "$pid" 2>/dev/null; then + log_warn "强制终止 $service..." + kill -9 "$pid" 2>/dev/null || true + fi + + rm -f "$pid_file" + log_info "$service 已停止" +} + +# 重启单个服务 +restart_service() { + local service=$1 + stop_service "$service" + sleep 2 + start_service "$service" +} + +# 启动所有服务 +start_all() { + log_info "==========================================" + log_info " Urban Lifeline - 启动所有服务" + log_info "==========================================" + + # 等待 Nacos + if [ -n "$NACOS_SERVER_ADDR" ]; then + log_info "等待 Nacos 就绪..." + local nacos_host=$(echo $NACOS_SERVER_ADDR | cut -d: -f1) + local nacos_port=$(echo $NACOS_SERVER_ADDR | cut -d: -f2) + + for i in $(seq 1 30); do + if curl -sf "http://${nacos_host}:${nacos_port}/nacos/" > /dev/null 2>&1; then + log_info "Nacos 已就绪" + break + fi + sleep 2 + done + fi + + # 按顺序启动服务,等待健康检查通过后再启动下一个 + for service in "${BOOT_ORDER[@]}"; do + start_service "$service" + + log_info "等待 $service 健康检查..." + if wait_for_service "$service"; then + log_info "$service 已就绪 ✓" + else + log_warn "$service 健康检查超时,继续启动下一个服务" + fi + done + + log_info "==========================================" + log_info " 所有服务启动完成" + log_info "==========================================" + + show_status + + # 保持容器运行并监控 + monitor_services +} + +# 停止所有服务 +stop_all() { + log_info "停止所有服务..." + + # 逆序停止 + for ((i=${#BOOT_ORDER[@]}-1; i>=0; i--)); do + stop_service "${BOOT_ORDER[$i]}" + done + + log_info "所有服务已停止" +} + +# 查看服务状态 +show_status() { + echo "" + echo "==========================================" + echo " Urban Lifeline 服务状态" + echo "==========================================" + printf "%-12s %-8s %-8s %-10s\n" "服务" "端口" "PID" "状态" + echo "------------------------------------------" + + for service in "${BOOT_ORDER[@]}"; do + local port=$(get_port "$service") + local pid_file="${PID_DIR}/${service}.pid" + local pid="-" + local status="${RED}停止${NC}" + + if [ -f "$pid_file" ]; then + pid=$(cat "$pid_file") + if kill -0 "$pid" 2>/dev/null; then + status="${GREEN}运行中${NC}" + fi + fi + + printf "%-12s %-8s %-8s " "$service" "$port" "$pid" + echo -e "$status" + done + echo "==========================================" +} + +# 查看服务日志 +show_logs() { + local service=$1 + local log_file="${LOG_DIR}/${service}.log" + + if [ ! -f "$log_file" ]; then + log_error "日志文件不存在: $log_file" + return 1 + fi + + tail -f "$log_file" +} + +# 监控服务 (保持容器运行) +monitor_services() { + log_info "进入监控模式..." + + # 捕获退出信号 + trap 'stop_all; exit 0' SIGTERM SIGINT + + while true; do + sleep 30 + + # 检查服务状态,自动重启挂掉的服务 + for service in "${BOOT_ORDER[@]}"; do + if ! is_running "$service"; then + log_warn "$service 已停止,尝试重启..." + start_service "$service" + fi + done + done +} + +# 主入口 +case "${1:-help}" in + start-all) + start_all + ;; + stop-all) + stop_all + ;; + start) + if [ -z "$2" ]; then + log_error "请指定服务名" + exit 1 + fi + start_service "$2" + ;; + stop) + if [ -z "$2" ]; then + log_error "请指定服务名" + exit 1 + fi + stop_service "$2" + ;; + restart) + if [ -z "$2" ]; then + log_error "请指定服务名" + exit 1 + fi + restart_service "$2" + ;; + status) + show_status + ;; + logs) + if [ -z "$2" ]; then + log_error "请指定服务名" + exit 1 + fi + show_logs "$2" + ;; + *) + echo "Urban Lifeline 服务管理" + echo "" + echo "用法: $0 <命令> [服务名]" + echo "" + echo "命令:" + echo " start-all 启动所有服务" + echo " stop-all 停止所有服务" + echo " start <服务> 启动指定服务" + echo " stop <服务> 停止指定服务" + echo " restart <服务> 重启指定服务" + echo " status 查看服务状态" + echo " logs <服务> 查看服务日志" + echo "" + echo "可用服务: ${!SERVICES[*]}" + ;; +esac diff --git a/docker/urbanLifeline/web/.env.example b/docker/urbanLifeline/web/.env.example new file mode 100644 index 00000000..29ff3ee3 --- /dev/null +++ b/docker/urbanLifeline/web/.env.example @@ -0,0 +1,41 @@ +# ================================================ +# Urban Lifeline - 前端环境变量配置 +# +# 使用方法: +# 1. 复制此文件为 .env +# 2. 修改配置值 +# 3. docker-compose 会自动加载 +# +# 应用配置: +# 修改 config/app-config-*.js 文件,重启容器生效 +# - config/app-config-platform.js +# - config/app-config-workcase.js +# - config/app-config-bidding.js +# ================================================ + +# ============================================ +# 目录配置 +# ============================================ +CONFIG_ROOT=./config +LOG_ROOT=./volumes/logs +DATA_ROOT=./volumes/data + +# ============================================ +# 镜像版本 +# ============================================ +IMAGE_VERSION=latest + +# ============================================ +# 端口配置 +# ============================================ +SHARED_PORT=8000 +PLATFORM_PORT=8001 +WORKCASE_PORT=8002 +BIDDING_PORT=8003 +WORKCASE_WECHAT_PORT=8004 + +# ============================================ +# 资源限制 +# ============================================ +MEMORY_LIMIT=512M +MEMORY_RESERVATION=128M diff --git a/docker/urbanLifeline/web/Dockerfile.web b/docker/urbanLifeline/web/Dockerfile.web new file mode 100644 index 00000000..fb1f0243 --- /dev/null +++ b/docker/urbanLifeline/web/Dockerfile.web @@ -0,0 +1,66 @@ +# ================================================ +# Urban Lifeline - All-in-One 前端镜像 +# 使用 Node.js 静态服务器,端口可配置 +# +# 构建: docker build -t urban-lifeline-web:latest -f Dockerfile.web . +# ================================================ +FROM node:20-alpine + +ENV TZ=Asia/Shanghai + +RUN apk add --no-cache tzdata curl bash sed gettext \ + && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ + && echo "Asia/Shanghai" > /etc/timezone + +# 安装静态文件服务器 +RUN npm install -g serve + +WORKDIR /app + +# 复制管理脚本 +COPY docker/urbanLifeline/web/web-manager.sh /app/web-manager.sh +RUN chmod +x /app/web-manager.sh + +# 复制 shared 公共模块 (Module Federation 远程模块,必须最先启动) +COPY urbanLifelineWeb/packages/shared/dist/ /app/sites/shared/ + +# 复制所有前端构建产物 +COPY urbanLifelineWeb/packages/platform/dist/ /app/sites/platform/ +COPY urbanLifelineWeb/packages/workcase/dist/ /app/sites/workcase/ +COPY urbanLifelineWeb/packages/bidding/dist/ /app/sites/bidding/ +# COPY urbanLifelineWeb/packages/workcase_wechat/dist/ /app/sites/workcase_wechat/ + +# ============================================ +# 端口配置 (可通过环境变量覆盖) +# ============================================ +ENV SHARED_PORT=8000 \ + PLATFORM_PORT=8001 \ + WORKCASE_PORT=8002 \ + BIDDING_PORT=8003 + # WORKCASE_WECHAT_PORT=8004 + +# ============================================ +# 应用配置环境变量(可通过 docker-compose 覆盖) +# ============================================ +ENV APP_ENV=production \ + API_BASE_URL=/api \ + PUBLIC_PATH=/ \ + SSO_PLATFORM_URL=/ \ + SSO_WORKCASE_URL=/workcase \ + SSO_BIDDING_URL=/bidding \ + AES_SECRET_KEY=MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI= \ + JITSI_SERVER_URL=https://meet.example.com \ + AI_DEFAULT_AGENT_ID=17664699513920001 \ + FILE_MAX_SIZE=100 \ + ENABLE_DEBUG=false + +# 配置和日志目录 (可外挂) +VOLUME ["/app/config", "/app/logs"] + +EXPOSE 8000 8001 8002 8003 8004 + +HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \ + CMD curl -f http://localhost:${SHARED_PORT}/ || exit 1 + +ENTRYPOINT ["/app/web-manager.sh"] +CMD ["start-all"] diff --git a/docker/urbanLifeline/web/build.sh b/docker/urbanLifeline/web/build.sh new file mode 100644 index 00000000..b004792f --- /dev/null +++ b/docker/urbanLifeline/web/build.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# ================================================ +# Urban Lifeline - 前端镜像构建脚本 +# +# 使用方式: +# ./build.sh # 构建 All-in-One 镜像 +# ================================================ + +set -e + +# 项目根目录 (相对于此脚本) +PROJECT_ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" +cd "$PROJECT_ROOT" + +# 镜像版本 +VERSION=${IMAGE_VERSION:-latest} + +# 前端站点列表 +SITES=(shared platform workcase bidding workcase_wechat) + +# 构建 All-in-One 镜像 +build() { + echo "==========================================" + echo "构建 All-in-One 前端镜像: urban-lifeline-web:${VERSION}" + echo "==========================================" + + # 检查所有 dist 目录 + local missing=0 + for site in "${SITES[@]}"; do + if [ ! -d "urbanLifelineWeb/packages/${site}/dist" ]; then + echo "缺少: urbanLifelineWeb/packages/${site}/dist" + missing=1 + fi + done + + if [ $missing -eq 1 ]; then + echo "" + echo "请先执行前端构建:" + echo " cd urbanLifelineWeb && pnpm build" + exit 1 + fi + + docker build -t urban-lifeline-web:${VERSION} \ + -f docker/urbanLifeline/web/Dockerfile.web . + + if [ "$VERSION" != "latest" ]; then + docker tag urban-lifeline-web:${VERSION} urban-lifeline-web:latest + fi + + echo "==========================================" + echo "镜像构建完成!" + echo "" + echo "管理服务:" + echo " docker exec urban-lifeline-web /app/web-manager.sh status" + echo " docker exec urban-lifeline-web /app/web-manager.sh restart platform" + echo "==========================================" +} + +build diff --git a/docker/urbanLifeline/web/config/app-config-bidding.js b/docker/urbanLifeline/web/config/app-config-bidding.js new file mode 100644 index 00000000..38611a42 --- /dev/null +++ b/docker/urbanLifeline/web/config/app-config-bidding.js @@ -0,0 +1,62 @@ +/** + * @description Bidding 运行时配置 (Docker 部署用) + * + * 域名: https://192.168.130.131 + * 修改此文件后重启容器生效 + */ + +window.APP_RUNTIME_CONFIG = { + // 环境标识 + env: 'production', + + // API 配置 + api: { + baseUrl: '/urban-lifeline', + timeout: 30000 + }, + + // 应用基础路径 + baseUrl: '/bidding/', + + // 文件配置 + file: { + downloadUrl: '/urban-lifeline/file/download/', + uploadUrl: '/urban-lifeline/file/upload', + maxSize: { + image: 5, + video: 100, + document: 10 + }, + acceptTypes: { + image: 'image/*', + video: 'video/*', + document: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx' + } + }, + + // Token 配置 + token: { + key: 'token', + refreshThreshold: 300000 + }, + + // 公共资源路径 + publicImgPath: '/bidding/img', + publicWebPath: '/bidding', + + // 单点登录配置 + sso: { + platformUrl: 'https://192.168.130.131/platform/', + workcaseUrl: 'https://192.168.130.131/workcase/', + biddingUrl: 'https://192.168.130.131/bidding/' + }, + + // AES 加密密钥 + aesSecretKey: 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=', + + // 功能开关 + features: { + enableDebug: false, + enableMockData: false + } +}; diff --git a/docker/urbanLifeline/web/config/app-config-platform.js b/docker/urbanLifeline/web/config/app-config-platform.js new file mode 100644 index 00000000..2769933a --- /dev/null +++ b/docker/urbanLifeline/web/config/app-config-platform.js @@ -0,0 +1,62 @@ +/** + * @description Platform 运行时配置 (Docker 部署用) + * + * 域名: https://192.168.130.131 + * 修改此文件后重启容器生效 + */ + +window.APP_RUNTIME_CONFIG = { + // 环境标识 + env: 'production', + + // API 配置 + api: { + baseUrl: '/urban-lifeline', + timeout: 30000 + }, + + // 应用基础路径 + baseUrl: '/platform/', + + // 文件配置 + file: { + downloadUrl: '/urban-lifeline/file/download/', + uploadUrl: '/urban-lifeline/file/upload', + maxSize: { + image: 5, + video: 100, + document: 10 + }, + acceptTypes: { + image: 'image/*', + video: 'video/*', + document: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx' + } + }, + + // Token 配置 + token: { + key: 'token', + refreshThreshold: 300000 + }, + + // 公共资源路径 + publicImgPath: '/platform/img', + publicWebPath: '/platform', + + // 单点登录配置 + sso: { + platformUrl: 'https://192.168.130.131/platform/', + workcaseUrl: 'https://192.168.130.131/workcase/', + biddingUrl: 'https://192.168.130.131/bidding/' + }, + + // AES 加密密钥 + aesSecretKey: 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=', + + // 功能开关 + features: { + enableDebug: false, + enableMockData: false + } +}; diff --git a/docker/urbanLifeline/web/config/app-config-shared.js b/docker/urbanLifeline/web/config/app-config-shared.js new file mode 100644 index 00000000..6cd2d15b --- /dev/null +++ b/docker/urbanLifeline/web/config/app-config-shared.js @@ -0,0 +1,56 @@ +/** + * Shared 运行时配置 (Docker 部署) + * 此文件会被挂载到容器中,覆盖构建时的默认配置 + */ +window.APP_RUNTIME_CONFIG = { + // 环境标识 + env: 'production', + + // API 配置 + api: { + baseUrl: '/urban-lifeline', + timeout: 30000 + }, + + // 应用基础路径 + baseUrl: '/shared/', + + // 文件配置 + file: { + downloadUrl: '/urban-lifeline/file/download/', + uploadUrl: '/urban-lifeline/file/upload', + maxSize: { + image: 5, + video: 100, + document: 10 + }, + acceptTypes: { + image: 'image/*', + video: 'video/*', + document: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx' + } + }, + + // Token 配置 + token: { + key: 'token', + refreshThreshold: 300000 + }, + + // 公共资源路径 + publicImgPath: '/shared/img', + publicWebPath: '/shared', + + // 单点登录配置 + sso: { + platformUrl: 'https://192.168.130.131/platform/', + workcaseUrl: 'https://192.168.130.131/workcase/', + biddingUrl: 'https://192.168.130.131/bidding/' + }, + + // 功能开关 + features: { + enableDebug: false, + enableMockData: false + } +}; diff --git a/docker/urbanLifeline/web/config/app-config-workcase.js b/docker/urbanLifeline/web/config/app-config-workcase.js new file mode 100644 index 00000000..e8181e9f --- /dev/null +++ b/docker/urbanLifeline/web/config/app-config-workcase.js @@ -0,0 +1,72 @@ +/** + * @description Workcase 运行时配置 (Docker 部署用) + * + * 域名: https://192.168.130.131 + * 修改此文件后重启容器生效 + */ + +window.APP_RUNTIME_CONFIG = { + // 环境标识 + env: 'production', + + // API 配置 + api: { + baseUrl: '/urban-lifeline', + timeout: 30000 + }, + + // 应用基础路径 + baseUrl: '/workcase/', + + // 文件配置 + file: { + downloadUrl: '/urban-lifeline/file/download/', + uploadUrl: '/urban-lifeline/file/upload', + maxSize: { + image: 5, + video: 100, + document: 10, + default: 100 * 1024 * 1024 + }, + acceptTypes: { + image: 'image/*', + video: 'video/*', + document: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx' + } + }, + + // Token 配置 + token: { + key: 'token', + refreshThreshold: 300000 + }, + + // 公共资源路径 + publicImgPath: '/workcase/img', + publicWebPath: '/workcase', + + // 单点登录配置 + sso: { + platformUrl: 'https://192.168.130.131/platform/', + workcaseUrl: 'https://192.168.130.131/workcase/', + biddingUrl: 'https://192.168.130.131/bidding/' + }, + + // AES 加密密钥 + aesSecretKey: 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=', + + // Jitsi 视频会议配置 + jitsi: { + serverUrl: 'https://demo-jitsi.tensorgrove.com' + }, + // AI 配置 + ai: { + defaultAgentId: '17678420499370001' // 默认 AI Agent ID + }, + + // 功能开关 + features: { + enableDebug: false, + enableMockData: false + } +}; diff --git a/docker/urbanLifeline/web/docker-compose.yml b/docker/urbanLifeline/web/docker-compose.yml new file mode 100644 index 00000000..e74efb04 --- /dev/null +++ b/docker/urbanLifeline/web/docker-compose.yml @@ -0,0 +1,51 @@ +# ================================================ +# Urban Lifeline - All-in-One 前端部署 +# 单容器运行所有前端应用 +# ================================================ + +services: + urban-lifeline-web: + image: urban-lifeline-web:${IMAGE_VERSION:-latest} + container_name: urban-lifeline-web + restart: unless-stopped + env_file: + - .env + networks: + - urban-lifeline + # 不对外暴露端口,仅通过 nginx 反向代理访问 + expose: + - "8000" + - "8001" + - "8002" + - "8003" + - "8004" + environment: + TZ: Asia/Shanghai + SHARED_PORT: ${SHARED_PORT:-8000} + PLATFORM_PORT: ${PLATFORM_PORT:-8001} + WORKCASE_PORT: ${WORKCASE_PORT:-8002} + BIDDING_PORT: ${BIDDING_PORT:-8003} + WORKCASE_WECHAT_PORT: ${WORKCASE_WECHAT_PORT:-8004} + volumes: + # 配置文件目录 (app-config-*.js) + - ${CONFIG_ROOT:-./config}:/app/config:ro + # 日志目录 + - ${LOG_ROOT:-./volumes/logs}:/app/logs + # 数据目录 (静态资源等) + - ${DATA_ROOT:-./volumes/data}:/app/data + deploy: + resources: + limits: + memory: ${MEMORY_LIMIT:-512M} + reservations: + memory: ${MEMORY_RESERVATION:-128M} + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000/"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s + +networks: + urban-lifeline: + name: urban-lifeline diff --git a/docker/urbanLifeline/web/web-manager.sh b/docker/urbanLifeline/web/web-manager.sh new file mode 100644 index 00000000..e2cea06c --- /dev/null +++ b/docker/urbanLifeline/web/web-manager.sh @@ -0,0 +1,314 @@ +#!/bin/bash +# ================================================ +# Urban Lifeline - 前端服务管理脚本 +# +# 用法: +# ./web-manager.sh start-all # 启动所有前端 +# ./web-manager.sh start platform # 启动单个前端 +# ./web-manager.sh stop platform # 停止单个前端 +# ./web-manager.sh restart platform # 重启单个前端 +# ./web-manager.sh status # 查看状态 +# ================================================ + +set -e + +SITES_DIR="/app/sites" +PID_DIR="/app/pids" +LOG_DIR="/app/logs" +CONFIG_DIR="/app/config" + +mkdir -p "$PID_DIR" "$LOG_DIR" + +# ============================================ +# 配置处理函数 +# ============================================ + +# 同步挂载的配置文件到站点目录 +sync_mounted_config() { + local web=$1 + local mounted_config="${CONFIG_DIR}/app-config-${web}.js" + local site_config="${SITES_DIR}/${web}/app-config.js" + + if [ -f "$mounted_config" ]; then + log_info "同步挂载配置: $mounted_config -> $site_config" + cp "$mounted_config" "$site_config" + return 0 + else + log_warn "$web 没有挂载配置文件,使用构建默认配置" + return 1 + fi +} + +# 处理所有前端配置 +sync_all_configs() { + log_info "==========================================" + log_info " 同步前端配置文件" + log_info "==========================================" + + for web in "${BOOT_ORDER[@]}"; do + sync_mounted_config "$web" + done + + log_info "配置同步完成" +} + +# 前端配置: 名称=端口环境变量名:默认端口 +declare -A WEBS=( + ["shared"]="SHARED_PORT:8000" + ["platform"]="PLATFORM_PORT:8001" + ["workcase"]="WORKCASE_PORT:8002" + # ["bidding"]="BIDDING_PORT:8003" + # ["workcase_wechat"]="WORKCASE_WECHAT_PORT:8004" +) + +# shared 必须最先启动 (其他模块依赖它) +# BOOT_ORDER=(shared platform workcase bidding workcase_wechat) +BOOT_ORDER=(shared platform workcase) + +# 颜色 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERROR]${NC} $1"; } + +# 获取端口 +get_port() { + local web=$1 + local config=${WEBS[$web]} + local env_name=$(echo "$config" | cut -d: -f1) + local default_port=$(echo "$config" | cut -d: -f2) + echo "${!env_name:-$default_port}" +} + +# 检查是否运行 +is_running() { + local web=$1 + local pid_file="${PID_DIR}/${web}.pid" + + if [ -f "$pid_file" ]; then + local pid=$(cat "$pid_file") + if kill -0 "$pid" 2>/dev/null; then + return 0 + fi + fi + return 1 +} + +# 等待服务就绪 +wait_for_web() { + local web=$1 + local port=$(get_port "$web") + local max_wait=30 + local count=0 + + while [ $count -lt $max_wait ]; do + if curl -sf "http://localhost:${port}/" > /dev/null 2>&1; then + return 0 + fi + sleep 1 + count=$((count + 1)) + done + return 1 +} + +# 启动单个前端 +start_web() { + local web=$1 + local skip_config=$2 + local port=$(get_port "$web") + local site_dir="${SITES_DIR}/${web}" + local pid_file="${PID_DIR}/${web}.pid" + local log_file="${LOG_DIR}/${web}.log" + + if [ ! -d "$site_dir" ]; then + log_error "站点目录不存在: $site_dir" + return 1 + fi + + if is_running "$web"; then + log_warn "$web 已在运行 (PID: $(cat $pid_file))" + return 0 + fi + + # 同步配置 (除非已经批量同步过) + if [ "$skip_config" != "skip_config" ]; then + sync_mounted_config "$web" + fi + + log_info "启动 $web (端口: $port)..." + + # 使用 serve 启动静态服务,--single 确保SPA路由正确处理 + nohup serve -s "$site_dir" -l "$port" --single > "$log_file" 2>&1 & + local pid=$! + echo $pid > "$pid_file" + + log_info "$web 已启动 (PID: $pid)" +} + +# 停止单个前端 +stop_web() { + local web=$1 + local pid_file="${PID_DIR}/${web}.pid" + + if ! is_running "$web"; then + log_warn "$web 未在运行" + return 0 + fi + + local pid=$(cat "$pid_file") + log_info "停止 $web (PID: $pid)..." + + kill -15 "$pid" 2>/dev/null || true + + local count=0 + while [ $count -lt 10 ] && kill -0 "$pid" 2>/dev/null; do + sleep 1 + count=$((count + 1)) + done + + if kill -0 "$pid" 2>/dev/null; then + kill -9 "$pid" 2>/dev/null || true + fi + + rm -f "$pid_file" + log_info "$web 已停止" +} + +# 重启 +restart_web() { + local web=$1 + stop_web "$web" + sleep 1 + start_web "$web" +} + +# 启动所有 +start_all() { + log_info "==========================================" + log_info " Urban Lifeline - 启动所有前端" + log_info "==========================================" + + # 同步所有挂载的配置文件 + sync_all_configs + + for web in "${BOOT_ORDER[@]}"; do + start_web "$web" "skip_config" + + log_info "等待 $web 就绪..." + if wait_for_web "$web"; then + log_info "$web 已就绪 ✓" + else + log_warn "$web 健康检查超时" + fi + done + + log_info "==========================================" + log_info " 所有前端启动完成" + log_info "==========================================" + + show_status + monitor_webs +} + +# 停止所有 +stop_all() { + log_info "停止所有前端..." + for web in "${BOOT_ORDER[@]}"; do + stop_web "$web" + done +} + +# 状态 +show_status() { + echo "" + echo "==========================================" + echo " Urban Lifeline 前端状态" + echo "==========================================" + printf "%-18s %-8s %-8s %-10s\n" "站点" "端口" "PID" "状态" + echo "------------------------------------------" + + for web in "${BOOT_ORDER[@]}"; do + local port=$(get_port "$web") + local pid_file="${PID_DIR}/${web}.pid" + local pid="-" + local status="${RED}停止${NC}" + + if [ -f "$pid_file" ]; then + pid=$(cat "$pid_file") + if kill -0 "$pid" 2>/dev/null; then + status="${GREEN}运行中${NC}" + fi + fi + + printf "%-18s %-8s %-8s " "$web" "$port" "$pid" + echo -e "$status" + done + echo "==========================================" +} + +# 监控 +monitor_webs() { + log_info "进入监控模式..." + trap 'stop_all; exit 0' SIGTERM SIGINT + + while true; do + sleep 30 + for web in "${BOOT_ORDER[@]}"; do + if ! is_running "$web"; then + log_warn "$web 已停止,尝试重启..." + start_web "$web" + fi + done + done +} + +# 主入口 +case "${1:-help}" in + start-all) + start_all + ;; + stop-all) + stop_all + ;; + start) + [ -z "$2" ] && { log_error "请指定站点名"; exit 1; } + start_web "$2" + ;; + stop) + [ -z "$2" ] && { log_error "请指定站点名"; exit 1; } + stop_web "$2" + ;; + restart) + [ -z "$2" ] && { log_error "请指定站点名"; exit 1; } + restart_web "$2" + ;; + status) + show_status + ;; + *) + echo "Urban Lifeline 前端管理" + echo "" + echo "用法: $0 <命令> [站点名]" + echo "" + echo "命令:" + echo " start-all 启动所有前端" + echo " stop-all 停止所有前端" + echo " start <站点> 启动指定站点" + echo " stop <站点> 停止指定站点" + echo " restart <站点> 重启指定站点" + echo " status 查看状态" + echo "" + echo "可用站点: ${!WEBS[*]}" + echo "" + echo "端口配置 (环境变量):" + echo " SHARED_PORT 默认 8000 (公共模块,必须最先启动)" + echo " PLATFORM_PORT 默认 8001" + echo " WORKCASE_PORT 默认 8002" + echo " BIDDING_PORT 默认 8003" + echo " WORKCASE_WECHAT_PORT 默认 8004" + ;; +esac diff --git a/docker/域名.md b/docker/域名.md new file mode 100644 index 00000000..4391da1f --- /dev/null +++ b/docker/域名.md @@ -0,0 +1,9 @@ +- dify: https://demo-dify.tensorgrove.com + +- minio: https://demo-minio.tensorgrove.com + +- jitsi: https://demo-jitsi.tensorgrove.com + +- nacos: https://demo-nacos.tensorgrove.com + +- urbanLifeline: https://demo-urbanlifeline.tensorgrove.com \ No newline at end of file diff --git a/urbanLifelineServ/.bin/database/postgres/sql/admin_routes_architecture.md b/urbanLifelineServ/.bin/database/postgres/sql/admin_routes_architecture.md deleted file mode 100644 index f4f8823a..00000000 --- a/urbanLifelineServ/.bin/database/postgres/sql/admin_routes_architecture.md +++ /dev/null @@ -1,229 +0,0 @@ -# 管理后台路由架构说明 - -## 三层架构设计 - -### 第一层:外层主 Sidebar (platform 服务) -显示在平台主界面的侧边栏,包含用户应用和管理后台入口。 - -**布局**: `SidebarLayout` -**服务**: `platform` - -#### 用户应用入口 -- 泰豪AI助手 (`/aichat`) -- 全部应用 (`/agents`) -- 智能体编排 (`/app/workflow`) - iframe -- 招标助手 (`/app/bidding`) - iframe -- 泰豪小电 (`/app/workcase`) - iframe - -#### 管理后台入口(iframe类型) -1. **平台管理后台** (`/admin/platform`) - - iframe_url: `/platform/admin` - - 权限: `perm_platform_admin` - -2. **智能标书管理后台** (`/admin/bidding`) - - iframe_url: `/bidding/admin` - - 权限: `perm_bidding_admin` - -3. **泰豪小电管理后台** (`/admin/workcase`) - - iframe_url: `/workcase/admin` - - 权限: `perm_workcase_admin` - ---- - -### 第二层:SubSidebarLayout (各服务内部) -每个管理后台的内部二级菜单,使用 `SubSidebarLayout` 布局。 - -**布局**: `SubSidebarLayout` -**类型**: `route`(非 iframe) - ---- - -## Platform 管理后台(第二层) - -**服务**: `platform` -**布局**: `SubSidebarLayout` - -### 视图列表 - -| 序号 | 视图名称 | URL | 组件路径 | 权限 | -|------|---------|-----|----------|------| -| 1 | 数据概览 | `/admin/overview` | `admin/overview/OverviewView.vue` | `perm_platform_admin_overview` | -| 2 | 用户管理 | `/admin/user` | `admin/user/UserView.vue` | `perm_platform_admin_user` | -| 3 | 知识库 | `/admin/knowledge` | `admin/knowledge/KnowledgeView.vue` | `perm_platform_admin_knowledge` | -| 4 | 系统配置 | `/admin/config` | `admin/config/ConfigView.vue` | `perm_platform_admin_config` | - -### 权限配置 -```sql --- 管理后台入口权限 -PERM-0601: perm_platform_admin (platform:admin:view) - --- 内部功能权限 -PERM-0602: perm_platform_admin_overview (platform:admin:overview) -PERM-0603: perm_platform_admin_user (platform:admin:user) -PERM-0604: perm_platform_admin_knowledge (platform:admin:knowledge) -PERM-0605: perm_platform_admin_config (platform:admin:config) -``` - ---- - -## Bidding 管理后台(第二层) - -**服务**: `bidding` -**布局**: `SubSidebarLayout` - -### 权限配置 -```sql --- 管理后台入口权限 -PERM-0611: perm_bidding_admin (bidding:admin:view) -``` - -*注: bidding 管理后台的具体视图需要后续配置* - ---- - -## Workcase 管理后台(第二层) - -**服务**: `workcase` -**布局**: `SubSidebarLayout` - -### 视图列表 - -| 序号 | 视图名称 | URL | 组件路径 | 权限 | -|------|---------|-----|----------|------| -| 1 | 数据概览 | `/admin/overview` | `admin/overview/OverviewView.vue` | `perm_workcase_overview` | -| 2 | 知识库管理 | `/admin/knowledge` | `admin/knowledge/KnowLedgeView.vue` | `perm_workcase_knowledge` | -| 3 | 工单管理 | `/admin/workcase` | `admin/workcase/WorkcaseView.vue` | `perm_workcase_tickets` | -| 4 | 对话数据 | `/admin/customerChat` | `admin/customerChat/CustomerChatView.vue` | `perm_workcase_conversation` | -| 5 | 智能体管理 | `/admin/agent` | `admin/agent/AgentView.vue` | `perm_workcase_agent` | -| 6 | 日志管理 | `/admin/log` | *(目录)* | `perm_workcase_log` | -| 6.1 | └ 知识库日志 | `/admin/log/knowledge` | `admin/log/knowledgeLog/KnowledgeLogView.vue` | `perm_workcase_log` | -| 6.2 | └ 工单日志 | `/admin/log/workcase` | `admin/log/workcaseLog/WorkcaseLogView.vue` | `perm_workcase_log` | -| 6.3 | └ 系统日志 | `/admin/log/system` | `admin/log/systemLog/SystemLogView.vue` | `perm_workcase_log` | - -### 权限配置 -```sql --- 管理后台入口权限 -PERM-0621: perm_workcase_admin (workcase:admin:view) - --- 内部功能权限 -PERM-0622: perm_workcase_overview (workcase:overview:view) -PERM-0623: perm_workcase_knowledge (workcase:knowledge:view) -PERM-0624: perm_workcase_tickets (workcase:tickets:view) -PERM-0625: perm_workcase_conversation (workcase:conversation:view) -PERM-0626: perm_workcase_agent (workcase:agent:view) -PERM-0627: perm_workcase_log (workcase:log:view) -``` - ---- - -## 路由过滤规则 - -### 外层主 Sidebar (platform/SidebarLayout) -显示所有 `service='platform'` 且 `layout='SidebarLayout'` 的视图: -- 用户应用入口(普通路由和iframe) -- 管理后台入口(iframe类型) - -### 内层 SubSidebarLayout -各服务内部,显示 `layout='SubSidebarLayout'` 且 `url.startsWith('/admin')` 的视图: - -#### Platform AdminSidebar -```typescript -service === 'platform' && -layout === 'SubSidebarLayout' && -url.startsWith('/admin') -``` - -#### Bidding AdminSidebar -```typescript -service === 'bidding' && -layout === 'SubSidebarLayout' && -url.startsWith('/admin') -``` - -#### Workcase AdminSidebar -```typescript -service === 'workcase' && -layout === 'SubSidebarLayout' && -url.startsWith('/admin') -``` - ---- - -## 数据库表关系 - -### 视图类型说明 -| type | view_type | 说明 | 示例 | -|------|-----------|------|------| -| 1 | route | 普通路由视图 | 数据概览、用户管理 | -| 1 | iframe | iframe嵌入视图 | 管理后台入口、Dify编排 | -| 0 | route | 目录(不可点击) | 日志管理 | -| 3 | route | 默认首页(隐藏) | 智能客服首页 | - -### 视图权限关联 -每个视图通过 `tb_sys_view_permission` 表关联到对应权限: -- 一个视图可以关联多个权限(AND 逻辑) -- 用户需要拥有所有关联权限才能访问该视图 - -### 角色权限继承 -- **超级管理员**: 自动拥有所有权限 -- **系统管理员**: 拥有所有 module 的管理权限(除删除外) -- **普通用户**: 基础查看权限 + 平台基础菜单访问 -- **访客**: 仅查看权限 + 部分平台菜单访问 - ---- - -## 前端实现注意事项 - -### 1. Layout 组件 -- **SidebarLayout**: 外层主侧边栏(platform 主界面) -- **SubSidebarLayout**: 内层管理侧边栏(各管理后台内部) -- **BlankLayout**: 空白布局(如智能客服首页) - -### 2. iframe 嵌套 -- 外层 platform 的 iframe 菜单 → 加载各服务的管理后台 -- 各服务内部使用 SubSidebarLayout 渲染二级菜单 -- iframe_url 必须正确指向实际服务地址 - -### 3. 路由配置 -所有 `/admin/*` 路径统一用于管理后台: -- platform: `/admin/overview`, `/admin/user` 等 -- bidding: `/admin/*` (待定义) -- workcase: `/admin/overview`, `/admin/knowledge` 等 - -### 4. 权限验证 -前端需要根据 `loginDomain.userViews` 动态渲染菜单: -- 检查 `layout` 字段匹配当前布局 -- 检查 `service` 字段匹配当前服务 -- 检查用户是否拥有关联的权限 - ---- - -## 迁移说明 - -如果从旧的单层架构迁移到三层架构: - -1. **视图迁移** - - 将原 platform 的管理视图改为 `layout='SubSidebarLayout'` - - URL 统一改为 `/admin/*` 格式 - - 在 platform 主侧边栏添加 iframe 入口 - -2. **权限迁移** - - 保留原有权限定义 - - 新增管理后台入口权限(如 `perm_platform_admin`) - - 更新视图权限关联 - -3. **前端组件** - - 创建 SubSidebarLayout 组件(参考 workcase 实现) - - 更新 platform 路由配置支持 `/admin/*` 路径 - - 配置 iframe 路由指向各服务管理后台 - ---- - -## 总结 - -这个三层架构设计实现了: -- ✅ **统一入口**: 所有管理后台统一在 platform 主侧边栏 -- ✅ **独立管理**: 各服务管理后台相互独立,便于维护 -- ✅ **权限细分**: 入口权限 + 功能权限双重控制 -- ✅ **灵活扩展**: 新增服务只需添加 iframe 入口和内部视图 -- ✅ **用户体验**: 统一的导航风格,清晰的层级结构 diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createDB.sql b/urbanLifelineServ/.bin/database/postgres/sql/createDB.sql index 5ff18039..c5ce72b7 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/createDB.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/createDB.sql @@ -18,7 +18,6 @@ CREATE DATABASE urban_lifeline CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- UUID 支持 CREATE EXTENSION IF NOT EXISTS "pg_trgm"; -- 文本搜索支持 CREATE EXTENSION IF NOT EXISTS "btree_gist"; -- GiST 索引支持 -CREATE EXTENSION IF NOT EXISTS "vector"; -- 向量 -- 设置搜索路径(可选,但建议设置) -- ALTER DATABASE urban-lifeline SET search_path TO sys, public; diff --git a/urbanLifelineServ/.bin/database/postgres/sql/createTableWorkcase.sql b/urbanLifelineServ/.bin/database/postgres/sql/createTableWorkcase.sql index cc2d3d57..0fdb9ad1 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/createTableWorkcase.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/createTableWorkcase.sql @@ -263,8 +263,8 @@ CREATE TABLE workcase.tb_workcase( type VARCHAR(50) NOT NULL, -- 故障类型 device VARCHAR(50) DEFAULT NULL, -- 设备名称 device_code VARCHAR(50) DEFAULT NULL, -- 设备代码 - device_name_plate VARCHAR(50) DEFAULT NULL, -- 设备名称牌 - device_name_plate_img VARCHAR(50) NOT NULL, -- 设备名称牌图片 + device_name_plate VARCHAR(50) NOT NULL, -- 设备名称牌 + device_name_plate_img VARCHAR(50) DEFAULT NULL, -- 设备名称牌图片 address VARCHAR(1000) DEFAULT NULL, -- 现场地址 description VARCHAR(1000) DEFAULT NULL, -- 故障描述 imgs VARCHAR(50)[] DEFAULT '{}', -- 工单图片id diff --git a/urbanLifelineServ/.bin/database/postgres/sql/initDataConfig.sql b/urbanLifelineServ/.bin/database/postgres/sql/initDataConfig.sql index b011712b..739a7127 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/initDataConfig.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/initDataConfig.sql @@ -103,6 +103,10 @@ INSERT INTO config.tb_sys_config ( ('CFG-0703', 'cfg_wechat_kefu_token', 'wechat.kefu.token', '回调Token', '', 'String', 'input', '消息回调的Token', NULL, NULL, 'wechat', 'mod_workcase', 30, 1, '用于验证消息回调的Token', 'system', NULL, NULL, now(), NULL, NULL, false), ('CFG-0704', 'cfg_wechat_kefu_aeskey', 'wechat.kefu.encodingAesKey','回调加密密钥', '', 'String', 'password', '消息回调的EncodingAESKey', NULL, NULL, 'wechat', 'mod_workcase', 40, 1, '用于解密消息回调的AES密钥', 'system', NULL, NULL, now(), NULL, NULL, false), ('CFG-0705', 'cfg_wechat_kefu_openkfid', 'wechat.kefu.openKfid', '客服账号ID', '', 'String', 'input', '微信客服账号的open_kfid', NULL, NULL, 'wechat', 'mod_workcase', 50, 1, '用于发送消息的客服账号ID', 'system', NULL, NULL, now(), NULL, NULL, false), -('CFG-0706', 'cfg_wechat_kefu_welcome', 'wechat.kefu.welcomeTemplate','欢迎语模板', '您好,您的工单已创建。\n工单编号:{workcaseId}\n问题类型:{type}\n设备:{device}\n我们将尽快为您处理。', 'String', 'textarea', '客服欢迎语消息模板', NULL, NULL, 'wechat', 'mod_workcase', 60, 1, '支持变量:{workcaseId},{type},{device},{username}', 'system', NULL, NULL, now(), NULL, NULL, false); +('CFG-0706', 'cfg_wechat_kefu_welcome', 'wechat.kefu.welcomeTemplate','欢迎语模板', '您好,您的工单已创建。\n工单编号:{workcaseId}\n问题类型:{type}\n设备:{device}\n我们将尽快为您处理。', 'String', 'textarea', '客服欢迎语消息模板', NULL, NULL, 'wechat', 'mod_workcase', 60, 1, '支持变量:{workcaseId},{type},{device},{username}', 'system', NULL, NULL, now(), NULL, NULL, false), + +-- 微信小程序配置 +('CFG-0710', 'cfg_wechat_mp_appid', 'wechat.miniprogram.appid', '小程序AppID', 'wx15e67484db6d431f', 'String', 'input', '微信小程序的AppID', NULL, NULL, 'wechat', 'mod_workcase', 70, 1, '在微信公众平台获取', 'system', NULL, NULL, now(), NULL, NULL, false), +('CFG-0711', 'cfg_wechat_mp_appsecret', 'wechat.miniprogram.appsecret', '小程序AppSecret', '127dcc9c90dd1b66a700b52094922253', 'String', 'password', '微信小程序的AppSecret', NULL, NULL, 'wechat', 'mod_workcase', 80, 1, '在微信公众平台获取,用于获取openid和解密手机号', 'system', NULL, NULL, now(), NULL, NULL, false); diff --git a/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql b/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql index 2afabc29..ed27224e 100644 --- a/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql +++ b/urbanLifelineServ/.bin/database/postgres/sql/initDataPermission.sql @@ -425,7 +425,7 @@ INSERT INTO sys.tb_sys_view_permission ( ('VP-W106', 'view_workcase_admin_log', 'perm_workcase_log', 'system', NULL, now(), false), ('VP-W107', 'view_workcase_admin_log_knowledge', 'perm_workcase_log', 'system', NULL, now(), false), ('VP-W108', 'view_workcase_admin_log_workcase', 'perm_workcase_log', 'system', NULL, now(), false), -('VP-W109', 'view_workcase_admin_log_system', 'perm_workcase_log', 'system', NULL, now(), false), +('VP-W109', 'view_workcase_admin_log_system', 'perm_workcase_log', 'system', NULL, now(), false); -- -- 用户管理视图关联用户权限(已注释,因为view_user被注释掉了) -- -- ('VP-0001', 'view_user', 'perm_user_view', 'system', NULL, now(), false), diff --git a/urbanLifelineServ/.bin/database/postgres/sql/workcase_admin_routes_summary.md b/urbanLifelineServ/.bin/database/postgres/sql/workcase_admin_routes_summary.md deleted file mode 100644 index efebe5f2..00000000 --- a/urbanLifelineServ/.bin/database/postgres/sql/workcase_admin_routes_summary.md +++ /dev/null @@ -1,130 +0,0 @@ -# Workcase 管理端路由配置总结 - -## 已配置的管理端视图 - -### 1. 数据概览 (Overview) -- **view_id**: `view_workcase_admin_overview` -- **URL**: `/admin/overview` -- **组件**: `admin/overview/OverviewView.vue` -- **图标**: DataLine -- **权限**: `perm_workcase_overview` (workcase:overview:view) -- **描述**: 泰豪小电数据概览 - -### 2. 知识库管理 (Knowledge) -- **view_id**: `view_workcase_admin_knowledge` -- **URL**: `/admin/knowledge` -- **组件**: `admin/knowledge/KnowLedgeView.vue` -- **图标**: Document -- **权限**: `perm_workcase_knowledge` (workcase:knowledge:view) -- **描述**: 知识库文档管理 - -### 3. 工单管理 (Tickets) -- **view_id**: `view_workcase_admin_tickets` -- **URL**: `/admin/workcase` -- **组件**: `admin/workcase/WorkcaseView.vue` -- **图标**: Tickets -- **权限**: `perm_workcase_tickets` (workcase:tickets:view) -- **描述**: 客服工单管理 - -### 4. 对话数据 (Conversation) -- **view_id**: `view_workcase_admin_conversation` -- **URL**: `/admin/customerChat` -- **组件**: `admin/customerChat/CustomerChatView.vue` -- **图标**: ChatDotRound -- **权限**: `perm_workcase_conversation` (workcase:conversation:view) -- **描述**: 客户对话数据管理 - -### 5. 智能体管理 (Agent) -- **view_id**: `view_workcase_admin_agent` -- **URL**: `/admin/agent` -- **组件**: `admin/agent/AgentView.vue` -- **图标**: Service -- **权限**: `perm_workcase_agent` (workcase:agent:view) -- **描述**: 智能体配置管理 - -### 6. 日志管理 (Logs) -#### 6.1 日志管理目录 -- **view_id**: `view_workcase_admin_log` -- **URL**: `/admin/log` -- **组件**: NULL (目录类型) -- **图标**: List -- **type**: 0 (目录) -- **权限**: `perm_workcase_log` (workcase:log:view) -- **描述**: 日志管理目录 - -#### 6.2 知识库日志 -- **view_id**: `view_workcase_admin_log_knowledge` -- **parent_id**: `view_workcase_admin_log` -- **URL**: `/admin/log/knowledge` -- **组件**: `admin/log/knowledgeLog/KnowledgeLogView.vue` -- **图标**: Document -- **权限**: `perm_workcase_log` (workcase:log:view) -- **描述**: 知识库操作日志 - -#### 6.3 工单日志 -- **view_id**: `view_workcase_admin_log_workcase` -- **parent_id**: `view_workcase_admin_log` -- **URL**: `/admin/log/workcase` -- **组件**: `admin/log/workcaseLog/WorkcaseLogView.vue` -- **图标**: Tickets -- **权限**: `perm_workcase_log` (workcase:log:view) -- **描述**: 工单操作日志 - -#### 6.4 系统日志 -- **view_id**: `view_workcase_admin_log_system` -- **parent_id**: `view_workcase_admin_log` -- **URL**: `/admin/log/system` -- **组件**: `admin/log/systemLog/SystemLogView.vue` -- **图标**: Setting -- **权限**: `perm_workcase_log` (workcase:log:view) -- **描述**: 系统运行日志 - -## 权限配置 - -### 新增权限 -1. **PERM-0601**: `perm_workcase_overview` - 数据概览 -2. **PERM-0602**: `perm_workcase_knowledge` - 知识库管理 -3. **PERM-0603**: `perm_workcase_tickets` - 工单管理 -4. **PERM-0604**: `perm_workcase_conversation` - 对话数据 -5. **PERM-0605**: `perm_workcase_agent` - 智能体管理 -6. **PERM-0606**: `perm_workcase_log` - 日志管理 - -### 视图权限关联 -- VP-W101 ~ VP-W105: 管理端主功能视图 -- VP-W106 ~ VP-W109: 日志管理视图(含父级和3个子级) - -## 布局配置 -- **Layout**: `SubSidebarLayout` -- **Service**: `workcase` -- **Type**: 1 (菜单项) / 0 (目录) -- **View Type**: `route` - -## Order Number 排序 -- 110: 数据概览 -- 120: 知识库管理 -- 130: 工单管理 -- 140: 对话数据 -- 150: 智能体管理 -- 160: 日志管理(父级) - - 161: 知识库日志 - - 162: 工单日志 - - 163: 系统日志 - -## 路由过滤规则 -在 `SubSidebarLayout.vue` 的 `loadMenuFromStorage()` 中: -```typescript -const sidebarViews = userViews.filter((view: any) => - view.layout === 'SidebarLayout' && // 使用 SidebarLayout 布局 - !view.parentId && // 顶级菜单 - view.type === 1 && // 菜单类型 - view.service === 'workcase' && // workcase 服务 - view.url?.startsWith('/admin') // admin 路由 -) -``` - -## 注意事项 -1. 所有管理端路由都以 `/admin/` 开头 -2. 日志管理使用父子级结构(type=0 的目录 + type=1 的子菜单) -3. 所有视图都使用 `SubSidebarLayout` 布局 -4. 权限都归属于 `module_workcase` 模块 -5. 超级管理员和系统管理员默认拥有所有 workcase 管理端权限 diff --git a/urbanLifelineServ/ai/pom.xml b/urbanLifelineServ/ai/pom.xml index 9cf8920b..56b025e4 100644 --- a/urbanLifelineServ/ai/pom.xml +++ b/urbanLifelineServ/ai/pom.xml @@ -111,4 +111,14 @@ + + ai + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/client/DifyApiClient.java b/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/client/DifyApiClient.java index 8c7c5780..2bb53866 100644 --- a/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/client/DifyApiClient.java +++ b/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/client/DifyApiClient.java @@ -267,10 +267,16 @@ public class DifyApiClient { try { // 构建 data JSON 字符串(包含所有元数据) Map dataMap = new HashMap<>(); - if (uploadRequest.getName() != null) { + + // name 字段:如果提供则使用,否则使用文件名 + if (uploadRequest.getName() != null && !uploadRequest.getName().trim().isEmpty()) { dataMap.put("name", uploadRequest.getName()); + } else { + dataMap.put("name", originalFilename); } - if (uploadRequest.getIndexingTechnique() != null) { + + // indexing_technique 字段:只有在明确提供且非空时才添加 + if (uploadRequest.getIndexingTechnique() != null && !uploadRequest.getIndexingTechnique().trim().isEmpty()) { dataMap.put("indexing_technique", uploadRequest.getIndexingTechnique()); } @@ -284,9 +290,6 @@ public class DifyApiClient { dataMap.put("process_rule", defaultProcessRule); } - // 只保留官方支持的参数 - // doc_form 和 doc_language 不是请求参数,移除 - String dataJson = JSON.toJSONString(dataMap); logger.info("上传文档到知识库: datasetId={}, file={}, data={}", datasetId, originalFilename, dataJson); diff --git a/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/service/impl/KnowledgeFileLogServiceImpl.java b/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/service/impl/KnowledgeFileLogServiceImpl.java index bd765cba..66dbb6c1 100644 --- a/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/service/impl/KnowledgeFileLogServiceImpl.java +++ b/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/service/impl/KnowledgeFileLogServiceImpl.java @@ -39,7 +39,7 @@ public class KnowledgeFileLogServiceImpl implements KnowledgeFileLogService{ knowledgeFileLog.setOptsn(IdUtil.getOptsn()); knowledgeFileLog.setLogId(IdUtil.generateID()); ValidationResult rt = ValidationUtils.validate(knowledgeFileLog, Arrays.asList( - + ValidationUtils.requiredString("fileId", "文件id") )); if(!rt.isValid()){ return ResultDomain.failure("日志参数校验失败"); diff --git a/urbanLifelineServ/ai/src/main/resources/application-dev.yml b/urbanLifelineServ/ai/src/main/resources/application-dev.yml deleted file mode 100644 index 310d49ba..00000000 --- a/urbanLifelineServ/ai/src/main/resources/application-dev.yml +++ /dev/null @@ -1,98 +0,0 @@ -# ================== Server ================== -server: - port: 8090 - # servlet: - # context-path: /urban-lifeline/agent - -# ================== Auth ==================== -auth: - enabled: true - gateway-mode: true - whitelist: - - /swagger-ui/** - - /swagger-ui.html - - /v3/api-docs/** - - /webjars/** - - /favicon.ico - - /error - - /actuator/health - - /actuator/info - - /ai/chat/** # AI对话,有非系统用户对话的接口,无登录状态 - -security: - aes: - # AES-256 密钥(Base64编码,必须与所有服务保持一致) - # 警告:这是开发环境密钥,生产环境请使用密钥管理系统 - secret-key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI= - -# ================== Spring ================== -spring: - application: - name: ai-service - # 文件上传配置 - servlet: - multipart: - enabled: true - max-file-size: 500MB - max-request-size: 500MB - # ================== Spring Cloud Nacos ================== - cloud: - nacos: - discovery: - server-addr: 127.0.0.1:8848 - namespace: dev - group: DEFAULT_GROUP - - # ================== DataSource ================== - datasource: - url: jdbc:postgresql://127.0.0.1:5432/urban_lifeline - username: postgres - password: postgres - driver-class-name: org.postgresql.Driver - - # ================== Redis ================== - data: - redis: - host: 127.0.0.1 - port: 6379 - database: 0 - # password: "" - -# ================== SpringDoc ================== -springdoc: - api-docs: - enabled: true - path: /v3/api-docs - swagger-ui: - enabled: true - path: /swagger-ui.html - group-configs: - - group: 'default' - display-name: 'AI代理服务 API' - paths-to-match: '/**' - -# ================== Dubbo + Nacos ================== -dubbo: - application: - name: urban-lifeline-agent - qos-enable: false - protocol: - payload: 110100480 - name: dubbo - port: -1 - registry: - address: nacos://127.0.0.1:8848 - scan: - base-packages: org.xyzh.ai.service.impl - -# ================== MyBatis ================== -mybatis-plus: - mapper-locations: classpath:mapper/**/*.xml - type-aliases-package: org.xyzh.common.dto, org.xyzh.api -logging: - config: classpath:log4j2.xml - charset: - console: UTF-8 - file: UTF-8 - level: - org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE \ No newline at end of file diff --git a/urbanLifelineServ/ai/src/main/resources/application.yml b/urbanLifelineServ/ai/src/main/resources/application.yml index 35253da8..8c201a0e 100644 --- a/urbanLifelineServ/ai/src/main/resources/application.yml +++ b/urbanLifelineServ/ai/src/main/resources/application.yml @@ -1,10 +1,17 @@ -# ================== Server ================== +# ================== AI 服务配置 ================== server: - port: 8190 - # servlet: - # context-path: /urban-lifeline/agent # 微服务架构下,context-path由Gateway管理 + port: 8090 -# ================== Auth ==================== +spring: + application: + name: ai-service + servlet: + multipart: + enabled: true + max-file-size: 500MB + max-request-size: 500MB + +# ================== Auth ================== auth: enabled: true gateway-mode: true @@ -17,79 +24,21 @@ auth: - /error - /actuator/health - /actuator/info - - /ai/chat/** # AI对话,有非系统用户对话的接口,无登录状态 - -security: - aes: - # AES-256 密钥(Base64编码,必须与所有服务保持一致) - # 警告:这是开发环境密钥,生产环境请使用密钥管理系统 - secret-key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI= - -# ================== Spring ================== -spring: - application: - name: ai-service - - # ================== Spring Cloud Nacos ================== - cloud: - nacos: - discovery: - server-addr: 127.0.0.1:8848 - namespace: dev - group: DEFAULT_GROUP - - # ================== DataSource ================== - datasource: - url: jdbc:postgresql://127.0.0.1:5432/urban_lifeline - username: postgres - password: postgres - driver-class-name: org.postgresql.Driver - - # ================== Redis ================== - data: - redis: - host: 127.0.0.1 # 如果是 docker 跑的 redis,按实际 host / 端口改 - port: 6379 - database: 0 - password: 123456 # 如果有密码就填上,没密码可以去掉这一行 + - /ai/chat/** # ================== SpringDoc ================== springdoc: - api-docs: - enabled: true - path: /v3/api-docs - swagger-ui: - enabled: true - path: /swagger-ui.html group-configs: - group: 'default' display-name: 'AI代理服务 API' paths-to-match: '/**' -# ================== Dubbo + Nacos ================== +# ================== Dubbo ================== dubbo: application: name: urban-lifeline-agent qos-enable: false protocol: - payload: 110100480 - name: dubbo - port: -1 - registry: - address: nacos://127.0.0.1:8848 + payload: 110100480 scan: base-packages: org.xyzh.ai.service.impl - -# ================== MyBatis ================== -mybatis-plus: - mapper-locations: classpath:mapper/**/*.xml - type-aliases-package: org.xyzh.common.dto, org.xyzh.api - -# ================== Logging ================== -logging: - config: classpath:log4j2.xml - charset: - console: UTF-8 - file: UTF-8 - level: - org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE diff --git a/urbanLifelineServ/ai/src/main/resources/mapper/TbKnowledgeFileLogMapper.xml b/urbanLifelineServ/ai/src/main/resources/mapper/TbKnowledgeFileLogMapper.xml index d63322d6..69b270d8 100644 --- a/urbanLifelineServ/ai/src/main/resources/mapper/TbKnowledgeFileLogMapper.xml +++ b/urbanLifelineServ/ai/src/main/resources/mapper/TbKnowledgeFileLogMapper.xml @@ -26,8 +26,18 @@ optsn, log_id, knowledge_id, file_root_id, file_id, file_name, version, action, service, creator, creator_name, create_time ) VALUES ( - #{optsn}, #{logId}, #{knowledgeId}, #{fileRootId}, #{fileId}, #{fileName}, #{version}, - #{action}, #{service}, #{creator}, #{creatorName}, NOW() + #{optsn}, #{logId}, #{knowledgeId}, #{fileRootId}, #{fileId}, + + + + (SELECT COALESCE(file_name, '') FROM ai.tb_knowledge_file_log WHERE file_id = #{fileId} LIMIT 1) + + + + #{fileName} + + , + #{version}, #{action}, #{service}, #{creator}, #{creatorName}, NOW() ) diff --git a/urbanLifelineServ/auth/pom.xml b/urbanLifelineServ/auth/pom.xml index e6cbbb59..cf3cc5c9 100644 --- a/urbanLifelineServ/auth/pom.xml +++ b/urbanLifelineServ/auth/pom.xml @@ -79,4 +79,14 @@ + + auth + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/urbanLifelineServ/auth/src/main/resources/application.yml b/urbanLifelineServ/auth/src/main/resources/application.yml index 1f51ec21..e6ad1909 100644 --- a/urbanLifelineServ/auth/src/main/resources/application.yml +++ b/urbanLifelineServ/auth/src/main/resources/application.yml @@ -1,97 +1,35 @@ -# ================== Server ================== +# ================== Auth 认证服务配置 ================== server: - port: 8181 - # servlet: - # context-path: /urban-lifeline/auth # 微服务架构下,context-path由Gateway管理,服务本身不需要设置 + port: 8081 -# ================== Auth ==================== -auth: - enabled: false # 认证服务自己不需要认证 - gateway-mode: false # 不使用gateway模式(auth服务作为独立服务) - whitelist: - - /** # 认证服务的所有接口都放行 -security: - aes: - # AES-256 密钥(Base64编码,必须与所有服务保持一致) - # 警告:这是开发环境密钥,生产环境请使用密钥管理系统 - secret-key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI= -# ================== Spring ================== spring: application: name: auth-service - - # ================== Spring Cloud Nacos ================== - cloud: - nacos: - discovery: - server-addr: 127.0.0.1:8848 - namespace: dev - group: DEFAULT_GROUP - - # ================== DataSource ================== - datasource: - url: jdbc:postgresql://127.0.0.1:5432/urban_lifeline - username: postgres - password: postgres - driver-class-name: org.postgresql.Driver - # ================== Redis ================== - data: - redis: - host: 127.0.0.1 # 如果是 docker 跑的 redis,按实际 host / 端口改 - port: 6379 - database: 0 - password: 123456 # 如果有密码就填上,没密码可以去掉这一行 +# ================== Auth ================== +auth: + enabled: false # 认证服务自己不需要认证 + gateway-mode: false + whitelist: + - /** # ================== SpringDoc ================== springdoc: - api-docs: - enabled: true - path: /v3/api-docs - swagger-ui: - enabled: true - path: /swagger-ui.html - try-it-out-enabled: true - show-common-extensions: true - show-extensions: true - show-request-duration: true - filter: true - tags-sorter: alpha - operations-sorter: alpha group-configs: - group: 'default' display-name: '认证服务 API' paths-to-match: '/**' -# ================== Dubbo + Nacos ================== +# ================== Dubbo ================== dubbo: application: name: urban-lifeline-auth qos-enable: false - protocol: - name: dubbo - port: -1 - registry: - address: nacos://127.0.0.1:8848 scan: base-packages: org.xyzh.auth.service.impl -# ================== MyBatis ================== -mybatis-plus: - mapper-locations: classpath:mapper/**/*.xml - type-aliases-package: org.xyzh.common.dto, org.xyzh.api - -# ================== JWT Configuration ================== +# ================== JWT ================== jwt: - secret: urban-lifeline-secret-key-2025-xyzh + secret: ${JWT_SECRET:urban-lifeline-secret-key-2025-xyzh} expiration: 86400 # 24小时(秒) refresh-expiration: 604800 # 7天(秒) - -# ================== Logging ================== -logging: - config: classpath:log4j2.xml - charset: - console: UTF-8 - file: UTF-8 - level: - org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE diff --git a/urbanLifelineServ/bidding/pom.xml b/urbanLifelineServ/bidding/pom.xml index 7ea4bdbb..9af9d6a1 100644 --- a/urbanLifelineServ/bidding/pom.xml +++ b/urbanLifelineServ/bidding/pom.xml @@ -18,4 +18,14 @@ 21 + + bidding + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/urbanLifelineServ/bidding/src/main/resources/application.yml b/urbanLifelineServ/bidding/src/main/resources/application.yml index f7b78cb8..27fa9285 100644 --- a/urbanLifelineServ/bidding/src/main/resources/application.yml +++ b/urbanLifelineServ/bidding/src/main/resources/application.yml @@ -1,89 +1,36 @@ -# ================== Server ================== +# ================== Bidding 招投标服务配置 ================== server: - port: 8186 - # servlet: - # context-path: /urban-lifeline/bidding # 微服务架构下,context-path由Gateway管理 + port: 8087 -# ================== Auth ==================== -urban-lifeline: - auth: - enabled: true - whitelist: - - /swagger-ui/** - - /swagger-ui.html - - /v3/api-docs/** - - /webjars/** - - /favicon.ico - - /error - - /actuator/health - - /actuator/info - -security: - aes: - secret-key: 1234567890qwer - -# ================== Spring ================== spring: application: name: bidding-service - - # ================== Spring Cloud Nacos ================== - cloud: - nacos: - discovery: - server-addr: 127.0.0.1:8848 - namespace: dev - group: DEFAULT_GROUP - - # ================== DataSource ================== - datasource: - url: jdbc:postgresql://127.0.0.1:5432/urban_lifeline - username: postgres - password: postgres - driver-class-name: org.postgresql.Driver - # ================== Redis ================== - data: - redis: - host: 127.0.0.1 # 如果是 docker 跑的 redis,按实际 host / 端口改 - port: 6379 - database: 0 - password: 123456 # 如果有密码就填上,没密码可以去掉这一行 +# ================== Auth ================== +auth: + enabled: true + gateway-mode: true + whitelist: + - /swagger-ui/** + - /swagger-ui.html + - /v3/api-docs/** + - /webjars/** + - /favicon.ico + - /error + - /actuator/health + - /actuator/info # ================== SpringDoc ================== springdoc: - api-docs: - enabled: true - path: /v3/api-docs - swagger-ui: - enabled: true - path: /swagger-ui.html group-configs: - group: 'default' display-name: '招投标服务 API' paths-to-match: '/**' -# ================== Dubbo + Nacos ================== +# ================== Dubbo ================== dubbo: application: name: urban-lifeline-bidding qos-enable: false - protocol: - name: dubbo - port: -1 - registry: - address: nacos://127.0.0.1:8848 scan: base-packages: org.xyzh.bidding.service.impl - -# ================== MyBatis ================== -mybatis-plus: - mapper-locations: classpath:mapper/**/*.xml - type-aliases-package: org.xyzh.common.dto, org.xyzh.api - -# ================== Logging ================== -logging: - config: classpath:log4j2.xml - charset: - console: UTF-8 - file: UTF-8 diff --git a/urbanLifelineServ/common/common-core/src/main/java/org/xyzh/common/core/domain/LoginParam.java b/urbanLifelineServ/common/common-core/src/main/java/org/xyzh/common/core/domain/LoginParam.java index 154f0a73..f1c74630 100644 --- a/urbanLifelineServ/common/common-core/src/main/java/org/xyzh/common/core/domain/LoginParam.java +++ b/urbanLifelineServ/common/common-core/src/main/java/org/xyzh/common/core/domain/LoginParam.java @@ -94,4 +94,32 @@ public class LoginParam implements Serializable { */ private String token; + // ========== 微信小程序登录相关字段 ========== + + /** + * 微信登录code(wx.login返回,用于换取openid和session_key) + * @since 2026-01-09 + */ + private String code; + + /** + * 手机号授权code(getPhoneNumber返回,新版API推荐使用) + * @since 2026-01-09 + */ + private String phoneCode; + + /** + * 加密数据(getPhoneNumber返回,旧版API用于解密手机号) + * @since 2026-01-09 + */ + private String encryptedData; + + /** + * 解密向量(getPhoneNumber返回,旧版API用于解密手机号) + * @since 2026-01-09 + */ + private String iv; + + private Boolean mockMode; + } diff --git a/urbanLifelineServ/common/common-core/src/main/resources/bootstrap.yml b/urbanLifelineServ/common/common-core/src/main/resources/bootstrap.yml new file mode 100644 index 00000000..bc9b9303 --- /dev/null +++ b/urbanLifelineServ/common/common-core/src/main/resources/bootstrap.yml @@ -0,0 +1,64 @@ +# ================================================ +# Urban Lifeline - 通用 Bootstrap 配置 +# 所有微服务共享的基础配置 +# ================================================ + +# ================== Spring Cloud Nacos ================== +spring: + cloud: + nacos: + discovery: + server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848} + namespace: ${NACOS_NAMESPACE:dev} + group: ${NACOS_GROUP:DEFAULT_GROUP} + + # ================== DataSource ================== + datasource: + url: ${DB_URL:jdbc:postgresql://127.0.0.1:5432/urban_lifeline} + username: ${DB_USERNAME:postgres} + password: ${DB_PASSWORD:postgres} + driver-class-name: org.postgresql.Driver + + # ================== Redis ================== + data: + redis: + host: ${REDIS_HOST:127.0.0.1} + port: ${REDIS_PORT:6379} + database: ${REDIS_DATABASE:0} + password: ${REDIS_PASSWORD:} + +# ================== Security AES ================== +security: + aes: + # AES-256 密钥(Base64编码,必须与所有服务保持一致) + # 警告:这是开发环境密钥,生产环境请使用密钥管理系统 + secret-key: ${AES_SECRET_KEY:MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=} + +# ================== Dubbo ================== +dubbo: + protocol: + name: dubbo + port: -1 + registry: + address: nacos://${NACOS_SERVER_ADDR:127.0.0.1:8848} + +# ================== MyBatis-Plus ================== +mybatis-plus: + mapper-locations: classpath:mapper/**/*.xml + type-aliases-package: org.xyzh.common.dto, org.xyzh.api + +# ================== SpringDoc 基础配置 ================== +springdoc: + api-docs: + enabled: true + path: /v3/api-docs + swagger-ui: + enabled: true + path: /swagger-ui.html + +# ================== Logging ================== +logging: + config: classpath:log4j2.xml + charset: + console: UTF-8 + file: UTF-8 diff --git a/urbanLifelineServ/common/common-utils/src/main/java/org/xyzh/common/utils/crypto/AesEncryptUtil.java b/urbanLifelineServ/common/common-utils/src/main/java/org/xyzh/common/utils/crypto/AesEncryptUtil.java index eccf20ef..c841903a 100644 --- a/urbanLifelineServ/common/common-utils/src/main/java/org/xyzh/common/utils/crypto/AesEncryptUtil.java +++ b/urbanLifelineServ/common/common-utils/src/main/java/org/xyzh/common/utils/crypto/AesEncryptUtil.java @@ -224,7 +224,7 @@ public class AesEncryptUtil { public static void main(String[] args) { AesEncryptUtil aesEncryptUtil = new AesEncryptUtil("MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI="); - String phone = "17857100376"; + String phone = "15170037929"; // 测试加密(每次都不同,不能用于查询) String encryptedPhone1 = aesEncryptUtil.encryptPhone(phone); diff --git a/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/config/WeChatMiniProgramConfig.java b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/config/WeChatMiniProgramConfig.java new file mode 100644 index 00000000..7f78b080 --- /dev/null +++ b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/config/WeChatMiniProgramConfig.java @@ -0,0 +1,25 @@ +package org.xyzh.common.wechat.config; + +import lombok.Data; + +/** + * 微信小程序配置 + * @author cascade + * @since 2026-01-09 + */ +@Data +public class WeChatMiniProgramConfig { + + /** 小程序AppID */ + private String appId; + + /** 小程序AppSecret */ + private String appSecret; + + /** 当前access_token */ + private String accessToken; + + /** access_token过期时间(毫秒时间戳) */ + private Long accessTokenExpireTime; + +} diff --git a/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/account/KefuAccountService.java b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/account/KefuAccountService.java index bd0b3248..e17bcb9f 100644 --- a/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/account/KefuAccountService.java +++ b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/account/KefuAccountService.java @@ -4,6 +4,7 @@ import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -11,7 +12,6 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import org.xyzh.common.wechat.kefu.core.KefuAccessTokenManager; import org.xyzh.common.wechat.pojo.kefu.KefuAccount; -import org.xyzh.common.wechat.pojo.kefu.WeChatResponse; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; @@ -28,6 +28,7 @@ import com.alibaba.fastjson2.JSONObject; * @copyright xyzh * @since 2025-12-19 */ +@Lazy @Service public class KefuAccountService { diff --git a/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/core/KefuAccessTokenManager.java b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/core/KefuAccessTokenManager.java index 0c999ffc..e1d41319 100644 --- a/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/core/KefuAccessTokenManager.java +++ b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/core/KefuAccessTokenManager.java @@ -3,6 +3,7 @@ package org.xyzh.common.wechat.kefu.core; import org.apache.dubbo.config.annotation.DubboReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import org.xyzh.api.system.service.SysConfigService; @@ -11,8 +12,6 @@ import org.xyzh.common.core.domain.ResultDomain; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; -import jakarta.annotation.PostConstruct; - /** * @description 微信客服 AccessToken 管理器 * 负责获取和刷新 access_token @@ -21,6 +20,7 @@ import jakarta.annotation.PostConstruct; * @copyright xyzh * @since 2025-12-19 */ +@Lazy @Component public class KefuAccessTokenManager { @@ -29,6 +29,7 @@ public class KefuAccessTokenManager { private final RestTemplate restTemplate = new RestTemplate(); + @Lazy @DubboReference(version = "1.0.0", group = "system", check = false, retries = 0) private SysConfigService sysConfigService; @@ -36,10 +37,20 @@ public class KefuAccessTokenManager { private String secret; private String accessToken; private Long accessTokenExpireTime; + private volatile boolean configLoaded = false; - @PostConstruct - public void init() { - loadConfig(); + /** + * 懒加载配置 + */ + private void ensureConfigLoaded() { + if (!configLoaded) { + synchronized (this) { + if (!configLoaded) { + loadConfig(); + configLoaded = true; + } + } + } } public void loadConfig() { @@ -64,6 +75,7 @@ public class KefuAccessTokenManager { * 获取 access_token,如果过期自动刷新 */ public String getAccessToken() { + ensureConfigLoaded(); if (accessToken != null && accessTokenExpireTime != null && System.currentTimeMillis() < accessTokenExpireTime) { return accessToken; @@ -75,6 +87,7 @@ public class KefuAccessTokenManager { * 刷新 access_token */ public String refreshAccessToken() { + ensureConfigLoaded(); if (corpId == null || secret == null) { logger.error("微信配置不完整,无法获取access_token"); return null; @@ -103,6 +116,7 @@ public class KefuAccessTokenManager { } public String getCorpId() { + ensureConfigLoaded(); return corpId; } diff --git a/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/info/KefuInfoService.java b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/info/KefuInfoService.java index b2615e59..b7a344d1 100644 --- a/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/info/KefuInfoService.java +++ b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/info/KefuInfoService.java @@ -4,6 +4,7 @@ import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -24,6 +25,7 @@ import com.alibaba.fastjson2.JSONObject; * @copyright xyzh * @since 2025-12-19 */ +@Lazy @Service public class KefuInfoService { diff --git a/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/message/KefuMessageService.java b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/message/KefuMessageService.java index a81682fc..02082f03 100644 --- a/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/message/KefuMessageService.java +++ b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/kefu/message/KefuMessageService.java @@ -4,6 +4,7 @@ import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -27,6 +28,7 @@ import com.alibaba.fastjson2.JSONObject; * @copyright xyzh * @since 2025-12-19 */ +@Lazy @Service public class KefuMessageService { diff --git a/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/pojo/WeChatPhoneResult.java b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/pojo/WeChatPhoneResult.java new file mode 100644 index 00000000..648e4a35 --- /dev/null +++ b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/pojo/WeChatPhoneResult.java @@ -0,0 +1,55 @@ +package org.xyzh.common.wechat.pojo; + +import com.alibaba.fastjson2.annotation.JSONField; + +import lombok.Data; + +/** + * 微信小程序获取手机号接口返回结果 + * @author cascade + * @since 2026-01-09 + */ +@Data +public class WeChatPhoneResult { + + /** 错误码 */ + private Integer errcode; + + /** 错误信息 */ + private String errmsg; + + /** 手机号信息 */ + @JSONField(name = "phone_info") + private PhoneInfo phoneInfo; + + /** + * 手机号信息 + */ + @Data + public static class PhoneInfo { + /** 用户绑定的手机号(国外手机号会有区号) */ + private String phoneNumber; + + /** 没有区号的手机号 */ + private String purePhoneNumber; + + /** 区号 */ + private String countryCode; + + /** 数据水印 */ + private Watermark watermark; + } + + /** + * 数据水印 + */ + @Data + public static class Watermark { + /** 小程序appid */ + private String appid; + + /** 时间戳 */ + private Long timestamp; + } + +} diff --git a/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/pojo/WeChatSessionResult.java b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/pojo/WeChatSessionResult.java new file mode 100644 index 00000000..ce9e20c0 --- /dev/null +++ b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/pojo/WeChatSessionResult.java @@ -0,0 +1,28 @@ +package org.xyzh.common.wechat.pojo; + +import lombok.Data; + +/** + * 微信小程序 code2Session 接口返回结果 + * @author cascade + * @since 2026-01-09 + */ +@Data +public class WeChatSessionResult { + + /** 用户唯一标识 */ + private String openid; + + /** 会话密钥 */ + private String sessionKey; + + /** 用户在开放平台的唯一标识符(需要绑定开放平台) */ + private String unionid; + + /** 错误码 */ + private Integer errcode; + + /** 错误信息 */ + private String errmsg; + +} diff --git a/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/service/WeChatMiniProgramService.java b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/service/WeChatMiniProgramService.java new file mode 100644 index 00000000..89a4a9c5 --- /dev/null +++ b/urbanLifelineServ/common/common-wechat/src/main/java/org/xyzh/common/wechat/service/WeChatMiniProgramService.java @@ -0,0 +1,303 @@ +package org.xyzh.common.wechat.service; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Base64; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.xyzh.api.system.service.SysConfigService; +import org.xyzh.common.core.domain.ResultDomain; +import org.xyzh.common.wechat.config.WeChatMiniProgramConfig; +import org.xyzh.common.wechat.pojo.WeChatPhoneResult; +import org.xyzh.common.wechat.pojo.WeChatSessionResult; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; + +/** + * 微信小程序服务 + * @author cascade + * @since 2026-01-09 + */ +@Lazy +@Service +public class WeChatMiniProgramService { + + private static final Logger logger = LoggerFactory.getLogger(WeChatMiniProgramService.class); + + /** 微信小程序配置缓存 */ + private volatile WeChatMiniProgramConfig config; + + /** code2Session接口地址 */ + private static final String CODE2SESSION_URL = "https://api.weixin.qq.com/sns/jscode2session"; + + /** 获取access_token接口地址 */ + private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token"; + + /** 获取手机号接口地址(新版API) */ + private static final String GET_PHONE_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber"; + + @Lazy + @DubboReference(version = "1.0.0", group = "system", timeout = 5000, check = false, retries = 0) + private SysConfigService sysConfigService; + + /** + * 获取微信小程序配置 + */ + public WeChatMiniProgramConfig getConfig() { + if (config == null) { + loadConfig(); + } + return config; + } + + /** + * 从系统配置加载微信小程序配置 + */ + private synchronized void loadConfig() { + if (config != null) { + return; + } + + config = new WeChatMiniProgramConfig(); + + try { + // 从系统配置获取小程序AppID + String appIdResult = sysConfigService.getStringConfig("wechat.miniprogram.appid"); + if (appIdResult != null && !appIdResult.trim().isEmpty()) { + config.setAppId(appIdResult); + } + + // 从系统配置获取小程序AppSecret + String appSecretResult = sysConfigService.getStringConfig("wechat.miniprogram.appsecret"); + if (appSecretResult != null && !appSecretResult.trim().isEmpty()) { + config.setAppSecret(appSecretResult); + } + + logger.info("微信小程序配置加载成功, appId: {}", config.getAppId()); + } catch (Exception e) { + logger.error("加载微信小程序配置失败", e); + } + } + + /** + * 刷新配置 + */ + public void refreshConfig() { + config = null; + loadConfig(); + } + + /** + * 通过code获取session信息(openid和session_key) + * @param code wx.login返回的code + * @return session信息 + */ + public ResultDomain code2Session(String code) { + WeChatMiniProgramConfig cfg = getConfig(); + if (cfg == null || cfg.getAppId() == null || cfg.getAppSecret() == null) { + return ResultDomain.failure("微信小程序配置未初始化"); + } + + try { + String url = String.format("%s?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", + CODE2SESSION_URL, cfg.getAppId(), cfg.getAppSecret(), code); + + String response = httpGet(url); + logger.debug("code2Session响应: {}", response); + + WeChatSessionResult result = JSON.parseObject(response, WeChatSessionResult.class); + + if (result.getErrcode() != null && result.getErrcode() != 0) { + logger.error("code2Session失败: {} - {}", result.getErrcode(), result.getErrmsg()); + return ResultDomain.failure("获取session失败: " + result.getErrmsg()); + } + + return ResultDomain.success("获取session成功", result); + } catch (Exception e) { + logger.error("code2Session异常", e); + return ResultDomain.failure("获取session异常: " + e.getMessage()); + } + } + + /** + * 获取access_token + * @return access_token + */ + public String getAccessToken() { + WeChatMiniProgramConfig cfg = getConfig(); + if (cfg == null) { + return null; + } + + // 检查缓存的token是否有效 + if (cfg.getAccessToken() != null && cfg.getAccessTokenExpireTime() != null + && System.currentTimeMillis() < cfg.getAccessTokenExpireTime()) { + return cfg.getAccessToken(); + } + + // 重新获取token + try { + String url = String.format("%s?grant_type=client_credential&appid=%s&secret=%s", + ACCESS_TOKEN_URL, cfg.getAppId(), cfg.getAppSecret()); + + String response = httpGet(url); + JSONObject json = JSON.parseObject(response); + + if (json.containsKey("access_token")) { + String accessToken = json.getString("access_token"); + int expiresIn = json.getIntValue("expires_in"); + + cfg.setAccessToken(accessToken); + // 提前5分钟过期 + cfg.setAccessTokenExpireTime(System.currentTimeMillis() + (expiresIn - 300) * 1000L); + + logger.info("获取access_token成功, 有效期: {}秒", expiresIn); + return accessToken; + } else { + logger.error("获取access_token失败: {}", response); + return null; + } + } catch (Exception e) { + logger.error("获取access_token异常", e); + return null; + } + } + + /** + * 通过phoneCode获取手机号(新版API,推荐使用) + * @param phoneCode getPhoneNumber返回的code + * @return 手机号信息 + */ + public ResultDomain getPhoneNumber(String phoneCode) { + String accessToken = getAccessToken(); + if (accessToken == null) { + return ResultDomain.failure("获取access_token失败"); + } + + try { + String url = GET_PHONE_URL + "?access_token=" + accessToken; + + JSONObject requestBody = new JSONObject(); + requestBody.put("code", phoneCode); + + String response = httpPost(url, requestBody.toJSONString()); + logger.debug("getPhoneNumber响应: {}", response); + + WeChatPhoneResult result = JSON.parseObject(response, WeChatPhoneResult.class); + + if (result.getErrcode() != null && result.getErrcode() != 0) { + logger.error("getPhoneNumber失败: {} - {}", result.getErrcode(), result.getErrmsg()); + return ResultDomain.failure("获取手机号失败: " + result.getErrmsg()); + } + + return ResultDomain.success("获取手机号成功", result); + } catch (Exception e) { + logger.error("getPhoneNumber异常", e); + return ResultDomain.failure("获取手机号异常: " + e.getMessage()); + } + } + + /** + * 通过encryptedData和iv解密手机号(旧版API) + * @param sessionKey 会话密钥 + * @param encryptedData 加密数据 + * @param iv 解密向量 + * @return 解密后的手机号 + */ + public ResultDomain decryptPhoneNumber(String sessionKey, String encryptedData, String iv) { + try { + byte[] sessionKeyBytes = Base64.getDecoder().decode(sessionKey); + byte[] encryptedDataBytes = Base64.getDecoder().decode(encryptedData); + byte[] ivBytes = Base64.getDecoder().decode(iv); + + SecretKeySpec keySpec = new SecretKeySpec(sessionKeyBytes, "AES"); + IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); + + byte[] decryptedBytes = cipher.doFinal(encryptedDataBytes); + String decryptedData = new String(decryptedBytes, StandardCharsets.UTF_8); + + logger.debug("解密数据: {}", decryptedData); + + JSONObject json = JSON.parseObject(decryptedData); + String phoneNumber = json.getString("phoneNumber"); + + if (phoneNumber == null || phoneNumber.isEmpty()) { + phoneNumber = json.getString("purePhoneNumber"); + } + + return ResultDomain.success("解密成功", phoneNumber); + } catch (Exception e) { + logger.error("解密手机号失败", e); + return ResultDomain.failure("解密手机号失败: " + e.getMessage()); + } + } + + /** + * HTTP GET请求 + */ + private String httpGet(String urlStr) throws Exception { + URL url = new URL(urlStr); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + conn.setConnectTimeout(5000); + conn.setReadTimeout(5000); + + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { + StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + return response.toString(); + } finally { + conn.disconnect(); + } + } + + /** + * HTTP POST请求 + */ + private String httpPost(String urlStr, String body) throws Exception { + URL url = new URL(urlStr); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("POST"); + conn.setConnectTimeout(5000); + conn.setReadTimeout(5000); + conn.setDoOutput(true); + conn.setRequestProperty("Content-Type", "application/json"); + + try (OutputStream os = conn.getOutputStream()) { + os.write(body.getBytes(StandardCharsets.UTF_8)); + } + + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) { + StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + return response.toString(); + } finally { + conn.disconnect(); + } + } + +} diff --git a/urbanLifelineServ/crontab/pom.xml b/urbanLifelineServ/crontab/pom.xml index 15205acc..936d2978 100644 --- a/urbanLifelineServ/crontab/pom.xml +++ b/urbanLifelineServ/crontab/pom.xml @@ -18,4 +18,14 @@ 21 + + crontab + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/urbanLifelineServ/crontab/src/main/resources/application.yml b/urbanLifelineServ/crontab/src/main/resources/application.yml index f2258367..464ea2e0 100644 --- a/urbanLifelineServ/crontab/src/main/resources/application.yml +++ b/urbanLifelineServ/crontab/src/main/resources/application.yml @@ -1,80 +1,35 @@ -# ================== Server ================== +# ================== Crontab 定时任务服务配置 ================== server: - port: 8189 - # servlet: - # context-path: /urban-lifeline/crontab # 微服务架构下,context-path由Gateway管理 + port: 8086 -# ================== Auth ==================== -urban-lifeline: - auth: - enabled: false # 定时任务服务通常不需要认证 - -security: - aes: - secret-key: 1234567890qwer - -# ================== Spring ================== spring: application: name: crontab-service - - # ================== Spring Cloud Nacos ================== - cloud: - nacos: - discovery: - server-addr: 127.0.0.1:8848 - namespace: dev - group: DEFAULT_GROUP - - # ================== DataSource ================== - datasource: - url: jdbc:postgresql://127.0.0.1:5432/urban_lifeline - username: postgres - password: postgres - driver-class-name: org.postgresql.Driver - # ================== Redis ================== - data: - redis: - host: 127.0.0.1 # 如果是 docker 跑的 redis,按实际 host / 端口改 - port: 6379 - database: 0 - password: 123456 # 如果有密码就填上,没密码可以去掉这一行 +# ================== Auth ================== +auth: + enabled: false # 定时任务服务不需要认证 + whitelist: + - /swagger-ui/** + - /swagger-ui.html + - /v3/api-docs/** + - /webjars/** + - /favicon.ico + - /error + - /actuator/health + - /actuator/info # ================== SpringDoc ================== springdoc: - api-docs: - enabled: true - path: /v3/api-docs - swagger-ui: - enabled: true - path: /swagger-ui.html group-configs: - group: 'default' display-name: '定时任务服务 API' paths-to-match: '/**' -# ================== Dubbo + Nacos ================== +# ================== Dubbo ================== dubbo: application: name: urban-lifeline-crontab qos-enable: false - protocol: - name: dubbo - port: -1 - registry: - address: nacos://127.0.0.1:8848 scan: base-packages: org.xyzh.crontab.service.impl - -# ================== MyBatis ================== -mybatis-plus: - mapper-locations: classpath:mapper/**/*.xml - type-aliases-package: org.xyzh.common.dto, org.xyzh.api - -# ================== Logging ================== -logging: - config: classpath:log4j2.xml - charset: - console: UTF-8 - file: UTF-8 diff --git a/urbanLifelineServ/file/src/main/resources/application.yml b/urbanLifelineServ/file/src/main/resources/application.yml index 0570b2ea..b93b3be9 100644 --- a/urbanLifelineServ/file/src/main/resources/application.yml +++ b/urbanLifelineServ/file/src/main/resources/application.yml @@ -1,10 +1,17 @@ -# ================== Server ================== +# ================== File 文件服务配置 ================== server: - port: 8184 - # servlet: - # context-path: /urban-lifeline/file # 微服务架构下,context-path由Gateway管理 + port: 8084 -# ================== Auth ==================== +spring: + application: + name: file-service + servlet: + multipart: + enabled: true + max-file-size: 500MB + max-request-size: 500MB + +# ================== Auth ================== auth: enabled: true gateway-mode: true @@ -19,83 +26,19 @@ auth: - /actuator/info - /file/download/** -security: - aes: - # AES-256 密钥(Base64编码,必须与所有服务保持一致) - # 警告:这是开发环境密钥,生产环境请使用密钥管理系统 - secret-key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI= - -# ================== Spring ================== -spring: - application: - name: file-service - # ================== Spring Cloud Nacos ================== - cloud: - nacos: - discovery: - server-addr: 127.0.0.1:8848 - namespace: dev - group: DEFAULT_GROUP - - # ================== DataSource ================== - datasource: - url: jdbc:postgresql://127.0.0.1:5432/urban_lifeline - username: postgres - password: postgres - driver-class-name: org.postgresql.Driver - - # ================== Redis ================== - data: - redis: - host: 127.0.0.1 # 如果是 docker 跑的 redis,按实际 host / 端口改 - port: 6379 - database: 0 - password: 123456 # 如果有密码就填上,没密码可以去掉这一行 - - # ================== 文件上传配置 ================== - servlet: - multipart: - enabled: true - max-file-size: 500MB - max-request-size: 500MB - # ================== SpringDoc ================== springdoc: - api-docs: - enabled: true - path: /v3/api-docs - swagger-ui: - enabled: true - path: /swagger-ui.html group-configs: - group: 'default' display-name: '文件服务 API' paths-to-match: '/**' -# ================== Dubbo + Nacos ================== +# ================== Dubbo ================== dubbo: application: name: urban-lifeline-file qos-enable: false protocol: - payload: 110100480 - name: dubbo - port: -1 - registry: - address: nacos://127.0.0.1:8848 + payload: 110100480 scan: base-packages: org.xyzh.file.service.impl - -# ================== MyBatis ================== -mybatis-plus: - mapper-locations: classpath:mapper/**/*.xml - type-aliases-package: org.xyzh.common.dto, org.xyzh.api - -# ================== Logging ================== -logging: - config: classpath:log4j2.xml - charset: - console: UTF-8 - file: UTF-8 - level: - org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE diff --git a/urbanLifelineServ/gateway/src/main/resources/application-dev.yml b/urbanLifelineServ/gateway/src/main/resources/application-dev.yml deleted file mode 100644 index fcd44792..00000000 --- a/urbanLifelineServ/gateway/src/main/resources/application-dev.yml +++ /dev/null @@ -1,12 +0,0 @@ -# 开发环境专用配置 -# 注意:不要在这里配置routes,会覆盖application.yml的配置 -# 路由配置统一在application.yml中管理 - -# 开发环境日志 -logging: - config: classpath:log4j2.xml - charset: - console: UTF-8 - file: UTF-8 - level: - org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE diff --git a/urbanLifelineServ/gateway/src/main/resources/application.yml b/urbanLifelineServ/gateway/src/main/resources/application.yml index acf9fac1..fbbcfe09 100644 --- a/urbanLifelineServ/gateway/src/main/resources/application.yml +++ b/urbanLifelineServ/gateway/src/main/resources/application.yml @@ -1,50 +1,40 @@ +# ================== Gateway 服务配置 ================== server: - port: 8180 + port: 8080 spring: application: name: gateway-service - # Gateway 必须使用 reactive 模式(WebFlux),不能使用 Spring MVC + # Gateway 必须使用 reactive 模式 main: web-application-type: reactive - # 配置中心 cloud: nacos: - discovery: - server-addr: ${NACOS_SERVER_ADDR:localhost:8848} - namespace: dev - group: DEFAULT_GROUP config: - enabled: false # 禁用Nacos配置中心,使用本地配置 - server-addr: ${NACOS_SERVER_ADDR:localhost:8848} - file-extension: yml - namespace: dev - group: DEFAULT_GROUP + enabled: false # Gateway 路由配置 gateway: - # 服务发现路由(自动路由) discovery: locator: - enabled: false # 关闭自动路由,使用手动配置 + enabled: false - # 手动配置路由 routes: - # ==================== 认证服务路由 ==================== + # 认证服务 - id: auth-service uri: lb://auth-service predicates: - Path=/urban-lifeline/auth/** filters: - - StripPrefix=1 # 去掉前缀:/urban-lifeline/auth/login → /auth/login + - StripPrefix=1 - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 100 redis-rate-limiter.burstCapacity: 200 - # ==================== 系统服务路由 ==================== + # 系统服务 - id: system-service uri: lb://system-service predicates: @@ -52,7 +42,7 @@ spring: filters: - StripPrefix=1 - # ==================== 日志服务路由 ==================== + # 日志服务 - id: log-service uri: lb://log-service predicates: @@ -60,7 +50,7 @@ spring: filters: - StripPrefix=1 - # ==================== 文件服务路由 ==================== + # 文件服务 - id: file-service uri: lb://file-service predicates: @@ -68,7 +58,7 @@ spring: filters: - StripPrefix=1 - # ==================== 消息服务路由 ==================== + # 消息服务 - id: message-service uri: lb://message-service predicates: @@ -76,7 +66,7 @@ spring: filters: - StripPrefix=1 - # ==================== 招投标服务路由 ==================== + # 招投标服务 - id: bidding-service uri: lb://bidding-service predicates: @@ -84,7 +74,7 @@ spring: filters: - StripPrefix=1 - # ==================== 平台服务路由 ==================== + # 平台服务 - id: platform-service uri: lb://platform-service predicates: @@ -92,7 +82,7 @@ spring: filters: - StripPrefix=1 - # ==================== 工单服务 WebSocket 路由 ==================== + # 工单服务 WebSocket - id: workcase-websocket uri: lb:ws://workcase-service predicates: @@ -100,7 +90,7 @@ spring: filters: - StripPrefix=1 - # ==================== 工单服务路由 ==================== + # 工单服务 - id: workcase-service uri: lb://workcase-service predicates: @@ -108,7 +98,7 @@ spring: filters: - StripPrefix=1 - # ==================== 定时任务服务路由 ==================== + # 定时任务服务 - id: crontab-service uri: lb://crontab-service predicates: @@ -116,7 +106,7 @@ spring: filters: - StripPrefix=1 - # ==================== AI 服务路由 ==================== + # AI 服务 - id: ai-service uri: lb://ai-service predicates: @@ -129,28 +119,14 @@ spring: cors-configurations: '[/**]': allowedOriginPatterns: "*" - allowedMethods: - - GET - - POST - - PUT - - DELETE - - OPTIONS + allowedMethods: [GET, POST, PUT, DELETE, OPTIONS] allowedHeaders: "*" allowCredentials: true maxAge: 3600 - datasource: - # 按你的实际库名改一下,比如 urban-lifeline_system - url: jdbc:postgresql://127.0.0.1:5432/urban_lifeline # 换成你的 PG 库名 - username: postgres # PG 用户 - password: postgres # PG 密码 - driver-class-name: org.postgresql.Driver - # Redis 配置(用于限流、缓存) + + # Redis 连接池配置(Gateway 限流用) data: redis: - host: ${REDIS_HOST:localhost} - port: ${REDIS_PORT:6379} - password: 123456 - database: 0 timeout: 5000ms lettuce: pool: @@ -159,18 +135,15 @@ spring: max-idle: 10 min-idle: 5 -# 认证配置 +# ================== Gateway 认证配置 ================== auth: enabled: true - # gateway-mode 是给下游微服务用的,gateway本身不需要此配置 token-header: Authorization token-prefix: "Bearer " - # 认证接口白名单(login/logout/captcha/refresh) login-path: /urban-lifeline/auth/login logout-path: /urban-lifeline/auth/logout captcha-path: /urban-lifeline/auth/captcha refresh-path: /urban-lifeline/auth/refresh - # 通用白名单(Swagger、健康检查等) whitelist: - /actuator/** - /v3/api-docs/** @@ -180,20 +153,14 @@ auth: - /doc.html - /favicon.ico - /error - # 各服务的 Swagger 文档 - /urban-lifeline/*/v3/api-docs/** - /urban-lifeline/*/swagger-ui/** - # file 服务白名单 - /urban-lifeline/file/download/** - # ai 服务白名单 - /urban-lifeline/ai/chat/** - /urban-lifeline/system/guest/identify - # workcase 会议入口白名单(支持URL参数token认证) - /urban-lifeline/workcase/meeting/*/entry -security: - aes: - secret-key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI= # Base64 编码,32字节(256位) -# Actuator 监控端点 + +# ================== Actuator ================== management: endpoints: web: @@ -202,12 +169,3 @@ management: endpoint: health: show-details: always - -# 日志配置(详细配置见 log4j2.xml) -logging: - config: classpath:log4j2.xml - charset: - console: UTF-8 - file: UTF-8 - level: - org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE \ No newline at end of file diff --git a/urbanLifelineServ/message/pom.xml b/urbanLifelineServ/message/pom.xml index c65f28dd..ce08ff47 100644 --- a/urbanLifelineServ/message/pom.xml +++ b/urbanLifelineServ/message/pom.xml @@ -77,4 +77,14 @@ + + message + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/urbanLifelineServ/message/src/main/resources/application.yml b/urbanLifelineServ/message/src/main/resources/application.yml index 43cac2fe..1d2c6bc7 100644 --- a/urbanLifelineServ/message/src/main/resources/application.yml +++ b/urbanLifelineServ/message/src/main/resources/application.yml @@ -1,11 +1,12 @@ -# ================== Server ================== +# ================== Message 消息服务配置 ================== server: - port: 8185 - # servlet: - # context-path: /urban-lifeline/message # 微服务架构下,context-path由Gateway管理 + port: 8085 -# ================== Auth ==================== +spring: + application: + name: message-service +# ================== Auth ================== auth: enabled: true gateway-mode: true @@ -18,74 +19,18 @@ auth: - /error - /actuator/health - /actuator/info - -security: - aes: - secret-key: 1234567890qwer -# ================== Spring ================== -spring: - application: - name: message-service - - # ================== Spring Cloud Nacos ================== - cloud: - nacos: - discovery: - server-addr: 127.0.0.1:8848 - namespace: dev - group: DEFAULT_GROUP - - # ================== DataSource ================== - datasource: - url: jdbc:postgresql://127.0.0.1:5432/urban_lifeline - username: postgres - password: postgres - driver-class-name: org.postgresql.Driver - - # ================== Redis ================== - data: - redis: - host: 127.0.0.1 # 如果是 docker 跑的 redis,按实际 host / 端口改 - port: 6379 - database: 0 - password: 123456 # 如果有密码就填上,没密码可以去掉这一行 # ================== SpringDoc ================== springdoc: - api-docs: - enabled: true - path: /v3/api-docs - swagger-ui: - enabled: true - path: /swagger-ui.html group-configs: - group: 'default' display-name: '消息服务 API' paths-to-match: '/**' -# ================== Dubbo + Nacos ================== +# ================== Dubbo ================== dubbo: application: name: urban-lifeline-message qos-enable: false - protocol: - name: dubbo - port: -1 - registry: - address: nacos://127.0.0.1:8848 scan: base-packages: org.xyzh.message.service.impl - -# ================== MyBatis ================== -mybatis-plus: - mapper-locations: classpath:mapper/**/*.xml - type-aliases-package: org.xyzh.common.dto, org.xyzh.api - -# ================== Logging ================== -logging: - config: classpath:log4j2.xml - charset: - console: UTF-8 - file: UTF-8 - level: - org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE diff --git a/urbanLifelineServ/platform/pom.xml b/urbanLifelineServ/platform/pom.xml index 35638ae6..960d9721 100644 --- a/urbanLifelineServ/platform/pom.xml +++ b/urbanLifelineServ/platform/pom.xml @@ -18,4 +18,14 @@ 21 + + platform + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/urbanLifelineServ/platform/src/main/resources/application.yml b/urbanLifelineServ/platform/src/main/resources/application.yml index 04a39beb..6bc62186 100644 --- a/urbanLifelineServ/platform/src/main/resources/application.yml +++ b/urbanLifelineServ/platform/src/main/resources/application.yml @@ -1,11 +1,12 @@ -# ================== Server ================== +# ================== Platform 平台服务配置 ================== server: - port: 8187 - # servlet: - # context-path: /urban-lifeline/platform # 微服务架构下,context-path由Gateway管理 + port: 8089 -# ================== Auth ==================== +spring: + application: + name: platform-service +# ================== Auth ================== auth: enabled: true gateway-mode: true @@ -19,74 +20,17 @@ auth: - /actuator/health - /actuator/info -security: - aes: - secret-key: 1234567890qwer - -# ================== Spring ================== -spring: - application: - name: platform-service - - # ================== Spring Cloud Nacos ================== - cloud: - nacos: - discovery: - server-addr: 127.0.0.1:8848 - namespace: dev - group: DEFAULT_GROUP - - # ================== DataSource ================== - datasource: - url: jdbc:postgresql://127.0.0.1:5432/urban_lifeline - username: postgres - password: postgres - driver-class-name: org.postgresql.Driver - - # ================== Redis ================== - data: - redis: - host: 127.0.0.1 # 如果是 docker 跑的 redis,按实际 host / 端口改 - port: 6379 - database: 0 - password: 123456 # 如果有密码就填上,没密码可以去掉这一行 - # ================== SpringDoc ================== springdoc: - api-docs: - enabled: true - path: /v3/api-docs - swagger-ui: - enabled: true - path: /swagger-ui.html group-configs: - group: 'default' display-name: '平台服务 API' paths-to-match: '/**' -# ================== Dubbo + Nacos ================== +# ================== Dubbo ================== dubbo: application: name: urban-lifeline-platform qos-enable: false - protocol: - name: dubbo - port: -1 - registry: - address: nacos://127.0.0.1:8848 scan: base-packages: org.xyzh.platform.service.impl - -# ================== MyBatis ================== -mybatis-plus: - mapper-locations: classpath:mapper/**/*.xml - type-aliases-package: org.xyzh.common.dto, org.xyzh.api - -# ================== Logging ================== -logging: - config: classpath:log4j2.xml - charset: - console: UTF-8 - file: UTF-8 - level: - org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE diff --git a/urbanLifelineServ/system/pom.xml b/urbanLifelineServ/system/pom.xml index af25b55b..9e9f9305 100644 --- a/urbanLifelineServ/system/pom.xml +++ b/urbanLifelineServ/system/pom.xml @@ -25,6 +25,10 @@ org.xyzh.common common-all + + org.xyzh.common + common-wechat + org.xyzh.apis api-system @@ -105,4 +109,14 @@ + + system + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/urbanLifelineServ/system/src/main/java/org/xyzh/system/controller/GuestController.java b/urbanLifelineServ/system/src/main/java/org/xyzh/system/controller/GuestController.java index 46160110..b3137c12 100644 --- a/urbanLifelineServ/system/src/main/java/org/xyzh/system/controller/GuestController.java +++ b/urbanLifelineServ/system/src/main/java/org/xyzh/system/controller/GuestController.java @@ -8,6 +8,8 @@ import java.util.concurrent.TimeUnit; import com.alibaba.fastjson2.JSON; import org.apache.dubbo.config.annotation.DubboReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; @@ -34,6 +36,9 @@ import org.xyzh.common.dto.sys.TbSysUserRoleDTO; import org.xyzh.common.dto.sys.TbSysViewDTO; import org.xyzh.common.utils.id.IdUtil; import org.xyzh.common.utils.validation.ValidationUtils; +import org.xyzh.common.wechat.pojo.WeChatPhoneResult; +import org.xyzh.common.wechat.pojo.WeChatSessionResult; +import org.xyzh.common.wechat.service.WeChatMiniProgramService; import org.xyzh.common.auth.utils.JwtTokenUtil; import org.xyzh.common.redis.service.RedisService; @@ -54,6 +59,8 @@ import jakarta.validation.constraints.NotNull; @RequestMapping("/system/guest") public class GuestController { + private static final Logger logger = LoggerFactory.getLogger(GuestController.class); + @Autowired private GuestService guestService; @@ -69,6 +76,9 @@ public class GuestController { @Autowired private RedisService redisService; + @Autowired + private WeChatMiniProgramService weChatMiniProgramService; + @PostMapping public ResultDomain createGuest(TbGuestDTO guest) { @@ -117,9 +127,96 @@ public class GuestController { // ========================= 微信小程序用户识别登录 ========================= + /** + * 模拟用户数据(用于测试,没有手机号校验appid时使用) + * 格式:手机号 -> [姓名, 微信ID, 角色] + */ + private static final java.util.Map MOCK_USERS = new java.util.HashMap() {{ + put("17857100375", new String[]{"超级管理员", "17857100375", "admin"}); + put("13870055185", new String[]{"魏瑶", "75719954", "engineer"}); + put("15170466624", new String[]{"刘杰", "liujie1370984851", "engineer"}); + put("15170037929", new String[]{"万家明", "WJM15170037929", "engineer"}); + put("19100185270", new String[]{"戴斌", "BaiBin0714", "guest"}); + put("15797790517", new String[]{"余其跃", "a540378218", "guest"}); + put("15879126468", new String[]{"李小华", "wxid_vgmmzfdcwx9021", "guest"}); + }}; + @Operation(summary = "微信小程序用户识别登录") @PostMapping("/identify") public ResultDomain identifyUser(@RequestBody LoginParam loginParam, HttpServletRequest request) { + logger.info("微信小程序登录请求: wechatId={}, phone={}, mockMode={}", + loginParam.getWechatId(), + loginParam.getPhone(), + loginParam.getMockMode() != null ? loginParam.getMockMode() : false); + + // ========== 模拟模式:直接使用传入的手机号匹配用户 ========== + if (Boolean.TRUE.equals(loginParam.getMockMode()) && loginParam.getPhone() != null) { + String phone = loginParam.getPhone().trim(); + String[] mockUser = MOCK_USERS.get(phone); + + if (mockUser != null) { + // 设置模拟用户信息 + loginParam.setUsername(mockUser[0]); + loginParam.setWechatId(mockUser[1]); + logger.info("模拟登录: phone={}, name={}, wechatId={}, role={}", + phone, mockUser[0], mockUser[1], mockUser[2]); + } else { + return ResultDomain.failure("未找到该手机号对应的测试用户"); + } + } else { + // ========== 正常模式:通过微信API获取手机号 ========== + // 1. 处理微信登录code,获取openid + String openid = null; + String sessionKey = null; + if (loginParam.getCode() != null && !loginParam.getCode().trim().isEmpty()) { + ResultDomain sessionResult = weChatMiniProgramService.code2Session(loginParam.getCode()); + if (sessionResult.getSuccess() && sessionResult.getData() != null) { + openid = sessionResult.getData().getOpenid(); + sessionKey = sessionResult.getData().getSessionKey(); + logger.info("获取openid成功: {}", openid); + loginParam.setWechatId(openid); + } else { + logger.warn("获取openid失败: {}", sessionResult.getMessage()); + } + } + + // 2. 处理手机号授权 + String phoneNumber = null; + + // 方式1:使用phoneCode获取手机号(新版API,推荐) + if (loginParam.getPhoneCode() != null && !loginParam.getPhoneCode().trim().isEmpty()) { + ResultDomain phoneResult = weChatMiniProgramService.getPhoneNumber(loginParam.getPhoneCode()); + if (phoneResult.getSuccess() && phoneResult.getData() != null && phoneResult.getData().getPhoneInfo() != null) { + phoneNumber = phoneResult.getData().getPhoneInfo().getPurePhoneNumber(); + if (phoneNumber == null) { + phoneNumber = phoneResult.getData().getPhoneInfo().getPhoneNumber(); + } + logger.info("通过phoneCode获取手机号成功: {}", phoneNumber); + } else { + logger.warn("通过phoneCode获取手机号失败: {}", phoneResult.getMessage()); + } + } + + // 方式2:使用encryptedData和iv解密手机号(旧版API) + if (phoneNumber == null && sessionKey != null + && loginParam.getEncryptedData() != null && !loginParam.getEncryptedData().trim().isEmpty() + && loginParam.getIv() != null && !loginParam.getIv().trim().isEmpty()) { + ResultDomain decryptResult = weChatMiniProgramService.decryptPhoneNumber( + sessionKey, loginParam.getEncryptedData(), loginParam.getIv()); + if (decryptResult.getSuccess() && decryptResult.getData() != null) { + phoneNumber = decryptResult.getData(); + logger.info("通过解密获取手机号成功: {}", phoneNumber); + } else { + logger.warn("解密手机号失败: {}", decryptResult.getMessage()); + } + } + + // 设置手机号 + if (phoneNumber != null) { + loginParam.setPhone(phoneNumber); + } + } + // 验证参数:必须有wechatId或phone if ((loginParam.getWechatId() == null || loginParam.getWechatId().trim().isEmpty()) && (loginParam.getPhone() == null || loginParam.getPhone().trim().isEmpty())) { @@ -132,14 +229,15 @@ public class GuestController { // 从 request 中提取客户端 IP 并设置到 loginParam loginParam.setClientIp(getClientIP(request)); - // 1. 尝试通过AuthService登录(员工) + // 3. 尝试通过AuthService登录(员工) ResultDomain loginResult = authService.login(loginParam); if (loginResult.getSuccess() && loginResult.getData() != null) { // 登录成功,是系统员工 + logger.info("员工登录成功: userId={}", loginResult.getData().getUser().getUserId()); return loginResult; } - // 2. 登录失败,查询/注册来客 + // 4. 登录失败,查询/注册来客 return handleGuestLogin(loginParam); } diff --git a/urbanLifelineServ/system/src/main/resources/application-dev.yml b/urbanLifelineServ/system/src/main/resources/application-dev.yml deleted file mode 100644 index f0acf0bc..00000000 --- a/urbanLifelineServ/system/src/main/resources/application-dev.yml +++ /dev/null @@ -1,124 +0,0 @@ -# ================== Server ================== -server: - port: 8182 - # servlet: - # context-path: /urban-lifeline/system # 微服务架构下,context-path由Gateway管理 -# ================== Auth ==================== - -auth: - enabled: true - gateway-mode: true - # 认证接口:可以按服务自定义 - login-path: /urban-lifeline/auth/login - logout-path: /urban-lifeline/auth/logout - captcha-path: /urban-lifeline/auth/captcha - refresh-path: /urban-lifeline/auth/refresh - - # 通用白名单(非认证接口) - whitelist: - # Swagger/OpenAPI 文档相关(建议不带 context-path) - - /swagger-ui/** - - /swagger-ui.html - - /v3/api-docs/** - - /webjars/** - - # 静态资源 - - /favicon.ico - - /error - - # 健康检查 - - /actuator/health - - /actuator/info - - /system/guest/identify - # 其他需要放行的路径 - # - /public/** - # - /api/public/** - -security: - aes: - # AES-256 密钥(Base64编码) - # 警告:这是开发环境密钥,生产环境请使用密钥管理系统 - secret-key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI= - -# ================== Spring ================== -spring: - application: - name: system-service - - # ================== Spring Cloud Nacos ================== - cloud: - nacos: - discovery: - server-addr: 127.0.0.1:8848 - namespace: dev - group: DEFAULT_GROUP - - # ================== DataSource ================== - datasource: - # 按你的实际库名改一下,比如 urban-lifeline_system - url: jdbc:postgresql://127.0.0.1:5432/urban_lifeline # 换成你的 PG 库名 - username: postgres # PG 用户 - password: postgres # PG 密码 - driver-class-name: org.postgresql.Driver - - # ================== Redis ================== - data: - redis: - host: 127.0.0.1 # 如果是 docker 跑的 redis,按实际 host / 端口改 - port: 6379 - database: 0 - password: 123456 # 如果有密码就填上,没密码可以去掉这一行 -# ================== SpringDoc ================== -springdoc: - api-docs: - enabled: true - path: /v3/api-docs - swagger-ui: - enabled: true - path: /swagger-ui.html - try-it-out-enabled: true - show-common-extensions: true - show-extensions: true - show-request-duration: true - filter: true - tags-sorter: alpha - operations-sorter: alpha - group-configs: - - group: 'default' - display-name: '系统服务 API' - paths-to-match: '/**' - -# ================== Dubbo + Nacos 注册中心 ================== -dubbo: - application: - name: urban-lifeline-system - qos-enable: false - - protocol: - name: dubbo - port: -1 # -1 表示随机端口,避免端口冲突;也可以写死一个端口 - - registry: - # Nacos 注册中心地址:使用 docker-compose 中映射到宿主机的 8848 端口 - address: nacos://127.0.0.1:8848 - # 如果 Nacos 有用户名密码,可以加上: - # username: nacos - # password: nacos - - # Dubbo 服务扫描包(你 @DubboService 标注的位置) - scan: - base-packages: org.xyzh.system.service.impl - -# ================== MyBatis ================== -mybatis-plus: - mapper-locations: classpath:mapper/**/*.xml - type-aliases-package: org.xyzh.common.dto, org.xyzh.api - -# ================== Logging ================== -logging: - config: classpath:log4j2.xml - charset: - console: UTF-8 - file: UTF-8 - level: - org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE diff --git a/urbanLifelineServ/system/src/main/resources/application.yml b/urbanLifelineServ/system/src/main/resources/application.yml index f5158608..f6a5ddf0 100644 --- a/urbanLifelineServ/system/src/main/resources/application.yml +++ b/urbanLifelineServ/system/src/main/resources/application.yml @@ -1,83 +1,32 @@ -# ================== Server ================== +# ================== System 系统服务配置 ================== server: - port: 8182 - # servlet: - # context-path: /urban-lifeline/system # 微服务架构下,context-path由Gateway管理 -# ================== Auth ==================== + port: 8082 +spring: + application: + name: system-service + +# ================== Auth ================== auth: enabled: true gateway-mode: true - # 认证接口:可以按服务自定义 - login-path: /urban-lifeline/auth/login - logout-path: /urban-lifeline/auth/logout - captcha-path: /urban-lifeline/auth/captcha - refresh-path: /urban-lifeline/auth/refresh - - # 通用白名单(非认证接口) whitelist: - # Swagger/OpenAPI 文档相关(建议不带 context-path) - /swagger-ui/** - /swagger-ui.html - /v3/api-docs/** - /webjars/** - - # 静态资源 - /favicon.ico - /error - - # 健康检查 - /actuator/health - /actuator/info - /system/guest/identify - # 其他需要放行的路径 - # - /public/** - # - /api/public/** -security: - aes: - secret-key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI= - -# ================== Spring ================== -spring: - application: - name: system-service - - # ================== Spring Cloud Nacos ================== - cloud: - nacos: - discovery: - server-addr: 127.0.0.1:8848 - namespace: dev - group: DEFAULT_GROUP - - # ================== DataSource ================== - datasource: - # 按你的实际库名改一下,比如 urban-lifeline_system - url: jdbc:postgresql://127.0.0.1:5432/urban_lifeline # 换成你的 PG 库名 - username: postgres # PG 用户 - password: postgres # PG 密码 - driver-class-name: org.postgresql.Driver - - # ================== Redis ================== - data: - redis: - host: 127.0.0.1 # 如果是 docker 跑的 redis,按实际 host / 端口改 - port: 6379 - database: 0 - password: 123456 # 如果有密码就填上,没密码可以去掉这一行 # ================== SpringDoc ================== springdoc: - api-docs: - enabled: true - path: /v3/api-docs swagger-ui: - enabled: true - path: /swagger-ui.html try-it-out-enabled: true show-common-extensions: true show-extensions: true - show-request-duration: true filter: true tags-sorter: alpha operations-sorter: alpha @@ -86,37 +35,10 @@ springdoc: display-name: '系统服务 API' paths-to-match: '/**' -# ================== Dubbo + Nacos 注册中心 ================== +# ================== Dubbo ================== dubbo: application: name: urban-lifeline-system qos-enable: false - - protocol: - name: dubbo - port: -1 # -1 表示随机端口,避免端口冲突;也可以写死一个端口 - - registry: - # Nacos 注册中心地址:使用 docker-compose 中映射到宿主机的 8848 端口 - address: nacos://127.0.0.1:8848 - # 如果 Nacos 有用户名密码,可以加上: - # username: nacos - # password: nacos - - # Dubbo 服务扫描包(你 @DubboService 标注的位置) scan: base-packages: org.xyzh.system.service.impl - -# ================== MyBatis ================== -mybatis-plus: - mapper-locations: classpath:mapper/**/*.xml - type-aliases-package: org.xyzh.common.dto, org.xyzh.api - -# ================== Logging ================== -logging: - config: classpath:log4j2.xml - charset: - console: UTF-8 - file: UTF-8 - level: - org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE \ No newline at end of file diff --git a/urbanLifelineServ/workcase/pom.xml b/urbanLifelineServ/workcase/pom.xml index c7dbd88e..42df991f 100644 --- a/urbanLifelineServ/workcase/pom.xml +++ b/urbanLifelineServ/workcase/pom.xml @@ -153,4 +153,14 @@ + + workcase + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseController.java b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseController.java index c6903cdd..1890b2ac 100644 --- a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseController.java +++ b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseController.java @@ -87,6 +87,18 @@ public class WorkcaseController { return workcaseService.deleteWorkcase(workcase); } + @Operation(summary = "撤销工单") + @PreAuthorize("hasAuthority('workcase:ticket:update')") + @PostMapping("/revoke/{workcaseId}") + public ResultDomain revokeWorkcase(@PathVariable(value = "workcaseId") String workcaseId) { + // 创建撤销处理过程 + TbWorkcaseProcessDTO process = new TbWorkcaseProcessDTO(); + process.setWorkcaseId(workcaseId); + process.setAction("repeal"); + process.setMessage("用户撤销工单"); + return workcaseService.createWorkcaseProcess(process); + } + @Operation(summary = "获取工单详情") @PreAuthorize("hasAuthority('workcase:ticket:view')") @GetMapping("/{workcaseId}") diff --git a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/VideoMeetingServiceImpl.java b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/VideoMeetingServiceImpl.java index 128f9056..2bf8207b 100644 --- a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/VideoMeetingServiceImpl.java +++ b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/VideoMeetingServiceImpl.java @@ -376,6 +376,7 @@ public class VideoMeetingServiceImpl implements VideoMeetingService { meeting.setJwtToken(userJwtToken); meeting.setJitsiIframeUrl(jitsiIframeUrl); // 真正的Jitsi URL meeting.setIframeUrl(meetingPageUrl); // 会议页面URL(用于router跳转) + meeting.setJitsiServerUrl(jitsiProperties.getServer().getUrl()); // 使用当前配置的服务器URL logger.info("生成用户专属会议URL成功: meetingId={}, userId={}, status={}", meetingId, userId, meeting.getStatus()); diff --git a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java index 476084b2..ccb9b985 100644 --- a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java +++ b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java @@ -416,10 +416,38 @@ public class WorkcaseServiceImpl implements WorkcaseService { // 不影响工单完成流程,只记录错误日志 } } else if (WorkcaseProcessAction.REPEAL.getName().equals(action)) { + // 1. 更新工单状态为已撤销 TbWorkcaseDTO workcase = new TbWorkcaseDTO(); workcase.setWorkcaseId(workcaseProcess.getWorkcaseId()); workcase.setStatus("cancelled"); workcaseMapper.updateWorkcase(workcase); + + // 2. 发送系统评分消息到聊天室 + try { + TbWorkcaseDTO workcaseData = workcaseMapper.selectWorkcaseById(workcaseProcess.getWorkcaseId()); + if (workcaseData != null && workcaseData.getRoomId() != null) { + // 创建系统评分消息 + org.xyzh.api.workcase.dto.TbChatRoomMessageDTO commentMessage = new org.xyzh.api.workcase.dto.TbChatRoomMessageDTO(); + commentMessage.setMessageId(IdUtil.generateUUID()); + commentMessage.setOptsn(IdUtil.getOptsn()); + commentMessage.setRoomId(workcaseData.getRoomId()); + commentMessage.setSenderId("system"); + commentMessage.setSenderType("system"); // 系统消息 + commentMessage.setSenderName("系统"); + commentMessage.setMessageType("comment"); // 评分消息 + commentMessage.setContent("工单已撤销,请为本次服务评分"); + commentMessage.setStatus("sent"); + commentMessage.setCreator("system"); + + // 发送消息到聊天室 + chatRoomService.sendMessage(commentMessage); + logger.info("工单撤销,已发送系统评分消息: workcaseId={}, roomId={}", + workcaseProcess.getWorkcaseId(), workcaseData.getRoomId()); + } + } catch (Exception e) { + logger.error("发送系统评分消息失败: workcaseId={}", workcaseProcess.getWorkcaseId(), e); + // 不影响工单撤销流程,只记录错误日志 + } } workcaseProcess.setCreator(LoginUtil.getCurrentUserId()); diff --git a/urbanLifelineServ/workcase/src/main/resources/application-dev.yml b/urbanLifelineServ/workcase/src/main/resources/application-dev.yml deleted file mode 100644 index 930a8654..00000000 --- a/urbanLifelineServ/workcase/src/main/resources/application-dev.yml +++ /dev/null @@ -1,117 +0,0 @@ -# ================== Server ================== -server: - port: 8088 - # servlet: - # context-path: /urban-lifeline/workcase - -# ================== Auth ==================== -auth: - enabled: true - gate-way: true - whitelist: - - /swagger-ui/** - - /swagger-ui.html - - /v3/api-docs/** - - /webjars/** - - /favicon.ico - - /error - - /actuator/health - - /actuator/info - # 微信客服回调接口(无需鉴权) - - /workcase/chat/kefu/callback - # CRM回调接口(无需鉴权,但需签名验证) - - /workcase/receive/crm - -security: - aes: - # AES-256 密钥(Base64编码,必须与所有服务保持一致) - # 警告:这是开发环境密钥,生产环境请使用密钥管理系统 - secret-key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI= - -# ================== Spring ================== -spring: - application: - name: workcase-service - # 文件上传配置 - servlet: - multipart: - enabled: true - max-file-size: 500MB - max-request-size: 500MB - # ================== Spring Cloud Nacos ================== - cloud: - nacos: - discovery: - server-addr: 127.0.0.1:8848 - namespace: dev - group: DEFAULT_GROUP - - # ================== DataSource ================== - datasource: - url: jdbc:postgresql://127.0.0.1:5432/urban_lifeline - username: postgres - password: postgres - driver-class-name: org.postgresql.Driver - - # ================== Redis ================== - data: - redis: - host: 127.0.0.1 - port: 6379 - database: 0 - # password: "" - -# ================== SpringDoc ================== -springdoc: - api-docs: - enabled: true - path: /v3/api-docs - swagger-ui: - enabled: true - path: /swagger-ui.html - group-configs: - - group: 'default' - display-name: '工单服务 API' - paths-to-match: '/**' - -# ================== Dubbo + Nacos ================== -dubbo: - application: - name: urban-lifeline-workcase - qos-enable: false - protocol: - payload: 110100480 - name: dubbo - port: -1 - registry: - address: nacos://127.0.0.1:8848 - scan: - base-packages: org.xyzh.workcase.service.impl - -# ================== MyBatis ================== -mybatis-plus: - mapper-locations: classpath:mapper/**/*.xml - type-aliases-package: org.xyzh.common.dto, org.xyzh.api -logging: - config: classpath:log4j2.xml - charset: - console: UTF-8 - file: UTF-8 - level: - org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE - -# ================== Jitsi Meet 视频会议配置 ================== -jitsi: - app: - # 应用ID(必须与Docker配置中的JWT_APP_ID一致) - id: urbanLifeline - # JWT密钥(必须与Docker配置中的JWT_APP_SECRET一致) - # 警告:生产环境请修改为强随机字符串,并妥善保管 - # 注意:HS256算法要求密钥长度至少32字节(256 bits) - secret: urbanLifeline-jitsi-secret-key-2025-production-safe-hs256 - server: - # Jitsi Meet服务器地址(独立子域名) - url: https://org.xyzh.yslg.jitsi - token: - # JWT Token有效期(毫秒)- 默认2小时 - expiration: 7200000 \ No newline at end of file diff --git a/urbanLifelineServ/workcase/src/main/resources/application.yml b/urbanLifelineServ/workcase/src/main/resources/application.yml index d671c900..c571cd3a 100644 --- a/urbanLifelineServ/workcase/src/main/resources/application.yml +++ b/urbanLifelineServ/workcase/src/main/resources/application.yml @@ -1,10 +1,17 @@ -# ================== Server ================== +# ================== Workcase 工单服务配置 ================== server: - port: 8188 - # servlet: - # context-path: /urban-lifeline/workcase # 微服务架构下,context-path由Gateway管理 + port: 8088 -# ================== Auth ==================== +spring: + application: + name: workcase-service + servlet: + multipart: + enabled: true + max-file-size: 500MB + max-request-size: 500MB + +# ================== Auth ================== auth: enabled: true gateway-mode: true @@ -17,81 +24,32 @@ auth: - /error - /actuator/health - /actuator/info - # 微信客服回调接口(无需鉴权) - /workcase/chat/kefu/callback - # CRM回调接口(无需鉴权,但需签名验证) - /workcase/receive/crm -security: - aes: - # AES-256 密钥(Base64编码,必须与所有服务保持一致) - # 警告:这是开发环境密钥,生产环境请使用密钥管理系统 - secret-key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI= - -# ================== Spring ================== -spring: - application: - name: workcase-service - - # ================== Spring Cloud Nacos ================== - cloud: - nacos: - discovery: - server-addr: 127.0.0.1:8848 - namespace: dev - group: DEFAULT_GROUP - - # ================== DataSource ================== - datasource: - url: jdbc:postgresql://127.0.0.1:5432/urban_lifeline - username: postgres - password: postgres - driver-class-name: org.postgresql.Driver - - # ================== Redis ================== - data: - redis: - host: 127.0.0.1 # 如果是 docker 跑的 redis,按实际 host / 端口改 - port: 6379 - database: 0 - password: 123456 # 如果有密码就填上,没密码可以去掉这一行 - # ================== SpringDoc ================== springdoc: - api-docs: - enabled: true - path: /v3/api-docs - swagger-ui: - enabled: true - path: /swagger-ui.html group-configs: - group: 'default' display-name: '工单服务 API' paths-to-match: '/**' -# ================== Dubbo + Nacos ================== +# ================== Dubbo ================== dubbo: application: name: urban-lifeline-workcase qos-enable: false protocol: - name: dubbo - port: -1 - registry: - address: nacos://127.0.0.1:8848 + payload: 110100480 scan: base-packages: org.xyzh.workcase.service.impl -# ================== MyBatis ================== -mybatis-plus: - mapper-locations: classpath:mapper/**/*.xml - type-aliases-package: org.xyzh.common.dto, org.xyzh.api - -# ================== Logging ================== -logging: - config: classpath:log4j2.xml - charset: - console: UTF-8 - file: UTF-8 - level: - org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping: TRACE +# ================== Jitsi Meet 视频会议配置 ================== +jitsi: + app: + id: ${JITSI_APP_ID:urbanLifeline} + secret: ${JITSI_APP_SECRET:urbanLifeline-jitsi-secret-key-2025-production-safe-hs256} + server: + url: ${JITSI_SERVER_URL:https://org.xyzh.yslg.jitsi} + token: + expiration: 7200000 diff --git a/urbanLifelineWeb/.trae/documents/修复平台应用空白页面问题.md b/urbanLifelineWeb/.trae/documents/修复平台应用空白页面问题.md new file mode 100644 index 00000000..0f2a5bef --- /dev/null +++ b/urbanLifelineWeb/.trae/documents/修复平台应用空白页面问题.md @@ -0,0 +1,144 @@ +# 问题分析 + +根据用户提供的信息和代码检查,已经确定了导致平台应用在 build/preview 模式下出现空白页面的根本原因: + +## 1. 循环依赖死锁 + +平台应用的 `vue-vendor` chunk 中包含了顶层 `await`,用于等待 Module Federation 的 `loadShare` 完成: +```javascript +const Z=await X.then(e=>e()); // 等待 vue +const Pe=await Ee.then(e=>e()); // 等待 vue-router +``` + +这导致了以下循环依赖: +1. `vue-vendor` 加载时,执行顶层 `await`,等待 `loadShare` 完成 +2. `loadShare` 需要初始化 Module Federation +3. Module Federation 初始化又依赖 `vue-vendor` 文件 +4. 形成循环依赖死锁,整个应用初始化被阻塞 + +## 2. 配置问题 + +从配置文件可以看到: +- 平台模块的 `vite.config.ts` 中,`shared` 配置包含了 `vue` 和 `vue-router` +- 共享模块的 `vite.config.ts` 中,`shared` 配置也包含了 `vue` 和 `vue-router` +- 平台模块的 `manualChunks` 将 `vue` 和 `vue-router` 打包到了 `vue-vendor` chunk 中 + +# 解决方案 + +## 1. 修改平台模块的 Vite 配置 + +### 1.1 移除 shared 配置中的 vue 和 vue-router + +从平台模块的 `shared` 配置中移除 `vue` 和 `vue-router`,避免 Module Federation 尝试共享这些核心依赖。 + +```typescript +// packages/platform/vite.config.ts +federation({ + name: 'platform', + remotes: { + shared: { + type: 'module', + name: 'shared', + entry: sharedEntry + } + }, + shared: { + // 移除 vue 和 vue-router,避免循环依赖 + // vue: {}, + // 'vue-router': {}, + 'element-plus': {}, + axios: {} + } +}) +``` + +### 1.2 调整 manualChunks 配置 + +保持 `manualChunks` 配置不变,继续将 `vue` 和 `vue-router` 打包到 `vue-vendor` chunk 中,但不再尝试通过 Module Federation 共享它们。 + +## 2. 修改共享模块的 Vite 配置 + +### 2.1 移除 shared 配置中的 vue 和 vue-router + +从共享模块的 `shared` 配置中移除 `vue` 和 `vue-router`,避免 Module Federation 尝试共享这些核心依赖。 + +```typescript +// packages/shared/vite.config.ts +federation({ + name: 'shared', + filename: 'remoteEntry.js', + exposes: { + // ... 暴露的模块 + }, + shared: { + // 移除 vue 和 vue-router,避免循环依赖 + // vue: {}, + // 'vue-router': {}, + 'element-plus': {}, + 'lucide-vue-next': {}, + axios: {} + } +}) +``` + +## 3. 重新构建和测试 + +### 3.1 构建共享模块 + +```bash +# 切换到共享模块目录 +cd f:/Project/urbanLifeline/urbanLifelineWeb/packages/shared + +# 构建共享模块 +pnpm build +``` + +### 3.2 构建平台模块 + +```bash +# 切换到平台模块目录 +cd f:/Project/urbanLifeline/urbanLifelineWeb/packages/platform + +# 构建平台模块 +pnpm build + +# 启动预览服务器 +pnpm preview +``` + +### 3.3 验证应用是否正常运行 + +- 访问 `https://org.xyzh.yslg/platform/` +- 检查控制台是否显示 `✅ Platform 应用启动成功` 日志 +- 确认页面不再是空白,显示正常内容 + +# 预期结果 + +- 应用能够正常初始化,控制台显示 `✅ Platform 应用启动成功` 日志 +- 访问 `https://org.xyzh.yslg/platform/` 时显示正常内容,而不是空白页面 +- 所有依赖模块都能正确加载,没有循环依赖死锁 + +# 风险评估 + +- **依赖重复加载**:移除 `vue` 和 `vue-router` 从 `shared` 配置中可能导致这些依赖在多个模块中重复加载,但这是解决循环依赖死锁的必要代价 +- **构建错误**:需要确保修改后的配置能够正确构建 +- **运行时错误**:需要验证移除共享依赖后,应用是否能够正常运行 + +# 后续优化建议 + +1. **使用更稳定的 Module Federation 配置**:考虑使用 `@module-federation/runtime` 或其他更稳定的 Module Federation 实现 +2. **调整打包策略**:避免将核心依赖(如 `vue` 和 `vue-router`)与 Module Federation 相关代码打包到同一个 chunk 中 +3. **添加错误处理**:在应用初始化过程中添加错误处理,当依赖加载失败时给出明确提示 +4. **改进日志记录**:在应用初始化的关键节点添加更多日志,便于定位问题 + +# 执行步骤 + +1. **修改平台模块的 Vite 配置**:移除 `shared` 配置中的 `vue` 和 `vue-router` +2. **修改共享模块的 Vite 配置**:移除 `shared` 配置中的 `vue` 和 `vue-router` +3. **构建共享模块**:确保共享模块能够正确构建 +4. **构建平台模块**:确保平台模块能够正确构建 +5. **启动预览服务器**:启动平台模块的预览服务器 +6. **验证应用是否正常运行**:访问应用并验证是否正常运行 +7. **检查控制台输出**:确认控制台显示预期的日志 + +通过执行以上步骤,我们可以解决平台应用在 build/preview 模式下出现空白页面的问题,确保应用能够正常初始化和运行。 \ No newline at end of file diff --git a/urbanLifelineWeb/.vscode/launch.json b/urbanLifelineWeb/.vscode/launch.json index df833abc..5b544fc2 100644 --- a/urbanLifelineWeb/.vscode/launch.json +++ b/urbanLifelineWeb/.vscode/launch.json @@ -16,6 +16,21 @@ "clear": false } }, + { + "name": "预览 Shared 开发服务器", + "type": "node-terminal", + "request": "launch", + "command": "npm run preview", + "cwd": "${workspaceFolder}/packages/shared", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "new", + "showReuseMessage": true, + "clear": false + } + }, { "name": "启动 Platform 开发服务器", "type": "node-terminal", @@ -31,6 +46,21 @@ "clear": false } }, + { + "name": "预览 Platform 开发服务器", + "type": "node-terminal", + "request": "launch", + "command": "npm run preview", + "cwd": "${workspaceFolder}/packages/platform", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "new", + "showReuseMessage": true, + "clear": false + } + }, { "name": "启动 workcase 开发服务器", "type": "node-terminal", @@ -46,6 +76,21 @@ "clear": false } }, + { + "name": "预览 workcase 开发服务器", + "type": "node-terminal", + "request": "launch", + "command": "npm run preview", + "cwd": "${workspaceFolder}/packages/workcase", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "new", + "showReuseMessage": true, + "clear": false + } + }, { "name": "启动 Bidding 开发服务器", "type": "node-terminal", @@ -60,6 +105,21 @@ "showReuseMessage": true, "clear": false } + }, + { + "name": "预览 Bidding 开发服务器", + "type": "node-terminal", + "request": "launch", + "command": "npm run preview", + "cwd": "${workspaceFolder}/packages/bidding", + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "new", + "showReuseMessage": true, + "clear": false + } } ], "compounds": [ @@ -77,6 +137,21 @@ "group": "", "order": 1 } + }, + { + "name": "启动所有预览 Web 项目", + "configurations": [ + "预览 Shared 开发服务器", + "预览 Platform 开发服务器", + "预览 workcase 开发服务器", + // "启动 Bidding 开发服务器" + ], + "stopAll": true, + "presentation": { + "hidden": false, + "group": "", + "order": 1 + } } ] } diff --git a/urbanLifelineWeb/packages/bidding/index.html b/urbanLifelineWeb/packages/bidding/index.html index 7a7c8d12..4f5733d0 100644 --- a/urbanLifelineWeb/packages/bidding/index.html +++ b/urbanLifelineWeb/packages/bidding/index.html @@ -5,26 +5,13 @@ 招标管理系统 - + + + + - - - - - - - +
diff --git a/urbanLifelineWeb/packages/bidding/package.json b/urbanLifelineWeb/packages/bidding/package.json index 9035ebcc..1bfcd3c0 100644 --- a/urbanLifelineWeb/packages/bidding/package.json +++ b/urbanLifelineWeb/packages/bidding/package.json @@ -15,10 +15,12 @@ "element-plus": "^2.12.0", "@element-plus/icons-vue": "^2.3.2", "@vueuse/core": "^11.3.0", - "axios": "^1.7.9" + "axios": "^1.7.9", + "lucide-vue-next": "^0.561.0" }, "devDependencies": { - "@types/node": "^22.0.0", + "@module-federation/vite": "^1.9.3", + "@types/node": "^20.10.0", "@vitejs/plugin-vue": "^5.2.1", "@vitejs/plugin-vue-jsx": "^4.1.1", "typescript": "^5.7.2", diff --git a/urbanLifelineWeb/packages/bidding/pnpm-lock.yaml b/urbanLifelineWeb/packages/bidding/pnpm-lock.yaml index 6b03b240..4ea2b16c 100644 --- a/urbanLifelineWeb/packages/bidding/pnpm-lock.yaml +++ b/urbanLifelineWeb/packages/bidding/pnpm-lock.yaml @@ -17,6 +17,9 @@ dependencies: element-plus: specifier: ^2.12.0 version: 2.12.0(vue@3.5.25) + lucide-vue-next: + specifier: ^0.561.0 + version: 0.561.0(vue@3.5.25) pinia: specifier: ^2.2.8 version: 2.3.1(typescript@5.9.3)(vue@3.5.25) @@ -28,9 +31,12 @@ dependencies: version: 4.6.3(vue@3.5.25) devDependencies: + '@module-federation/vite': + specifier: ^1.9.3 + version: 1.9.4 '@types/node': - specifier: ^22.0.0 - version: 22.19.1 + specifier: ^20.10.0 + version: 20.19.27 '@vitejs/plugin-vue': specifier: ^5.2.1 version: 5.2.4(vite@6.4.1)(vue@3.5.25) @@ -42,7 +48,7 @@ devDependencies: version: 5.9.3 vite: specifier: ^6.0.3 - version: 6.4.1(@types/node@22.19.1) + version: 6.4.1(@types/node@20.19.27) vue-tsc: specifier: ^2.2.0 version: 2.2.12(typescript@5.9.3) @@ -596,10 +602,61 @@ packages: '@jridgewell/sourcemap-codec': 1.5.5 dev: true + /@module-federation/error-codes@0.21.6: + resolution: {integrity: sha512-MLJUCQ05KnoVl8xd6xs9a5g2/8U+eWmVxg7xiBMeR0+7OjdWUbHwcwgVFatRIwSZvFgKHfWEiI7wsU1q1XbTRQ==} + dev: true + + /@module-federation/runtime-core@0.21.6: + resolution: {integrity: sha512-5Hd1Y5qp5lU/aTiK66lidMlM/4ji2gr3EXAtJdreJzkY+bKcI5+21GRcliZ4RAkICmvdxQU5PHPL71XmNc7Lsw==} + dependencies: + '@module-federation/error-codes': 0.21.6 + '@module-federation/sdk': 0.21.6 + dev: true + + /@module-federation/runtime@0.21.6: + resolution: {integrity: sha512-+caXwaQqwTNh+CQqyb4mZmXq7iEemRDrTZQGD+zyeH454JAYnJ3s/3oDFizdH6245pk+NiqDyOOkHzzFQorKhQ==} + dependencies: + '@module-federation/error-codes': 0.21.6 + '@module-federation/runtime-core': 0.21.6 + '@module-federation/sdk': 0.21.6 + dev: true + + /@module-federation/sdk@0.21.6: + resolution: {integrity: sha512-x6hARETb8iqHVhEsQBysuWpznNZViUh84qV2yE7AD+g7uIzHKiYdoWqj10posbo5XKf/147qgWDzKZoKoEP2dw==} + dev: true + + /@module-federation/vite@1.9.4: + resolution: {integrity: sha512-7UckjGCqpN6mCRs8J9+T/we0s4msl4SFJERG1uVQslIQJvomuOeu/+keIAbK6M4vjgRwXxkHKyWPhr95uhdulg==} + dependencies: + '@module-federation/runtime': 0.21.6 + '@module-federation/sdk': 0.21.6 + '@rollup/pluginutils': 5.3.0 + defu: 6.1.4 + estree-walker: 2.0.2 + magic-string: 0.30.21 + pathe: 1.1.2 + transitivePeerDependencies: + - rollup + dev: true + /@rolldown/pluginutils@1.0.0-beta.53: resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} dev: true + /@rollup/pluginutils@5.3.0: + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + dev: true + /@rollup/rollup-android-arm-eabi@4.53.3: resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} cpu: [arm] @@ -805,8 +862,8 @@ packages: resolution: {integrity: sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==} dev: false - /@types/node@22.19.1: - resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} + /@types/node@20.19.27: + resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==} dependencies: undici-types: 6.21.0 dev: true @@ -830,7 +887,7 @@ packages: '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) '@rolldown/pluginutils': 1.0.0-beta.53 '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5) - vite: 6.4.1(@types/node@22.19.1) + vite: 6.4.1(@types/node@20.19.27) vue: 3.5.25(typescript@5.9.3) transitivePeerDependencies: - supports-color @@ -843,7 +900,7 @@ packages: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 dependencies: - vite: 6.4.1(@types/node@22.19.1) + vite: 6.4.1(@types/node@20.19.27) vue: 3.5.25(typescript@5.9.3) dev: true @@ -1146,6 +1203,10 @@ packages: ms: 2.1.3 dev: true + /defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + dev: true + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1406,6 +1467,14 @@ packages: yallist: 3.1.1 dev: true + /lucide-vue-next@0.561.0(vue@3.5.25): + resolution: {integrity: sha512-c5HUckO0qHklVSOf/0vaSR3pEb8fYImRDCRDLde56uqS9js0D/e3RAvq0/YFWjkmyOBKCb0/IdskdoHZQEkT5g==} + peerDependencies: + vue: '>=3.0.1' + dependencies: + vue: 3.5.25(typescript@5.9.3) + dev: false + /magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} dependencies: @@ -1464,6 +1533,10 @@ packages: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} dev: true + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + /picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1570,7 +1643,7 @@ packages: picocolors: 1.1.1 dev: true - /vite@6.4.1(@types/node@22.19.1): + /vite@6.4.1(@types/node@20.19.27): resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -1610,7 +1683,7 @@ packages: yaml: optional: true dependencies: - '@types/node': 22.19.1 + '@types/node': 20.19.27 esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 diff --git a/urbanLifelineWeb/packages/bidding/public/app-config.js b/urbanLifelineWeb/packages/bidding/public/app-config.js index 327e13e4..b196c62c 100644 --- a/urbanLifelineWeb/packages/bidding/public/app-config.js +++ b/urbanLifelineWeb/packages/bidding/public/app-config.js @@ -1,24 +1,22 @@ /** - * @description 应用运行时配置文件 - * @author yslg - * @since 2025-12-06 + * @description 应用运行时配置文件 (支持 Docker 环境变量替换) * - * 说明: - * 1. 此文件在生产环境中被加载,用于覆盖内置配置 - * 2. Docker 部署时,可通过挂载此文件来修改配置,无需重新构建 - * 3. 配置结构必须与 packages/shared/src/config/index.ts 中的 AppRuntimeConfig 保持一致 + * 占位符说明: + * - __PLACEHOLDER__ 格式的值会在 Docker 启动时被环境变量替换 + * - 如果环境变量未设置,将使用默认值 * - * 使用示例(Docker): - * docker run -v /path/to/app-config.js:/app/public/app-config.js my-app:latest + * Docker 部署: + * 1. 通过 volume 挂载覆盖此文件 + * 2. 或通过启动脚本替换占位符 */ window.APP_RUNTIME_CONFIG = { // 环境标识 - env: 'production', + env: '__APP_ENV__', // API 配置 api: { - baseUrl: '/api', + baseUrl: '__API_BASE_URL__', timeout: 30000 }, @@ -27,12 +25,12 @@ window.APP_RUNTIME_CONFIG = { // 文件配置 file: { - downloadUrl: '/api/urban-lifeline/file/download/', - uploadUrl: '/api/urban-lifeline/file/upload', + downloadUrl: '__API_BASE_URL__/urban-lifeline/file/download/', + uploadUrl: '__API_BASE_URL__/urban-lifeline/file/upload', maxSize: { - image: 5, // MB - video: 100, // MB - document: 10 // MB + image: 5, + video: 100, + document: 10 }, acceptTypes: { image: 'image/*', @@ -44,20 +42,23 @@ window.APP_RUNTIME_CONFIG = { // Token 配置 token: { key: 'token', - refreshThreshold: 300000 // 5分钟 + refreshThreshold: 300000 }, // 公共资源路径 - publicImgPath: '/img', - publicWebPath: '/', + publicImgPath: '__PUBLIC_PATH__/img', + publicWebPath: '__PUBLIC_PATH__', // 单点登录配置 sso: { - platformUrl: '/', // platform 平台地址 - workcaseUrl: '/workcase', // workcase 服务地址 - biddingUrl: '/bidding' // bidding 服务地址 + platformUrl: '__SSO_PLATFORM_URL__', + workcaseUrl: '__SSO_WORKCASE_URL__', + biddingUrl: '__SSO_BIDDING_URL__' }, + // AES 加密密钥 + aesSecretKey: '__AES_SECRET_KEY__', + // 功能开关 features: { enableDebug: false, diff --git a/urbanLifelineWeb/packages/bidding/public/app-config.local.js b/urbanLifelineWeb/packages/bidding/public/app-config.local.js new file mode 100644 index 00000000..284797f1 --- /dev/null +++ b/urbanLifelineWeb/packages/bidding/public/app-config.local.js @@ -0,0 +1,60 @@ +/** + * @description 本地开发环境配置文件 + * 用于 dev 和 preview 模式 + */ + +window.APP_RUNTIME_CONFIG = { + // 环境标识 + env: 'production', + + // API 配置 + api: { + baseUrl: 'https://org.xyzh.yslg/api', + timeout: 30000 + }, + + // 应用基础路径 + baseUrl: '/bidding/', + + // 文件配置 + file: { + downloadUrl: 'https://org.xyzh.yslg/api/urban-lifeline/file/download/', + uploadUrl: 'https://org.xyzh.yslg/api/urban-lifeline/file/upload', + maxSize: { + image: 5, + video: 100, + document: 10 + }, + acceptTypes: { + image: 'image/*', + video: 'video/*', + document: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx' + } + }, + + // Token 配置 + token: { + key: 'token', + refreshThreshold: 300000 + }, + + // 公共资源路径 + publicImgPath: '/bidding/img', + publicWebPath: '/bidding', + + // 单点登录配置 + sso: { + platformUrl: 'https://org.xyzh.yslg/platform/', + workcaseUrl: 'https://org.xyzh.yslg/workcase/', + biddingUrl: 'https://org.xyzh.yslg/bidding/' + }, + + // AES 加密密钥(本地开发用,生产环境需要替换) + aesSecretKey: 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=', + + // 功能开关 + features: { + enableDebug: true, + enableMockData: false + } +}; diff --git a/urbanLifelineWeb/packages/bidding/public/logo.jpg b/urbanLifelineWeb/packages/bidding/public/logo.jpg new file mode 100644 index 00000000..18b5da66 Binary files /dev/null and b/urbanLifelineWeb/packages/bidding/public/logo.jpg differ diff --git a/urbanLifelineWeb/packages/bidding/src/App.vue b/urbanLifelineWeb/packages/bidding/src/App.vue new file mode 100644 index 00000000..7c3ac93e --- /dev/null +++ b/urbanLifelineWeb/packages/bidding/src/App.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/urbanLifelineWeb/packages/bidding/src/config/index.ts b/urbanLifelineWeb/packages/bidding/src/config/index.ts index a0e90ff6..fb6c89ec 100644 --- a/urbanLifelineWeb/packages/bidding/src/config/index.ts +++ b/urbanLifelineWeb/packages/bidding/src/config/index.ts @@ -1,16 +1,10 @@ /** - * @description Bidding 应用运行时配置 - * @author yslg - * @since 2025-12-06 + * @description 应用运行时配置 * * 配置加载策略: - * 1. 开发环境:使用下面定义的开发配置 + * 1. 开发环境:使用内置开发配置 * 2. 生产环境:从 window.APP_RUNTIME_CONFIG 读取(来自 app-config.js) - * 3. Docker部署:替换 app-config.js 文件实现配置外挂 - * - * 配置结构说明: - * 此文件的配置结构与 app-config.js 完全对应 - * 修改 app-config.js 后,这里的配置会自动应用 + * 3. Docker部署:启动时替换 app-config.js 中的占位符 */ // ============================================ @@ -43,12 +37,12 @@ export interface AppRuntimeConfig { }; publicImgPath: string; publicWebPath: string; - // 单点登录配置 sso?: { - platformUrl: string; // platform 平台地址 - workcaseUrl: string; // workcase 服务地址 - biddingUrl: string; // bidding 服务地址 + platformUrl: string; + workcaseUrl: string; + biddingUrl: string; }; + aesSecretKey?: string; features?: { enableDebug?: boolean; enableMockData?: boolean; @@ -57,101 +51,80 @@ export interface AppRuntimeConfig { } // ============================================ -// 配置定义(与 app-config.js 结构一致) +// 环境检测 // ============================================ const isDev = (import.meta as any).env?.DEV ?? false; +// ============================================ // 开发环境配置 +// ============================================ const devConfig: AppRuntimeConfig = { env: 'development', - api: { - // 开发环境通过 Vite 代理转发到后端,避免浏览器直接跨域 - // 实际请求路径示例:/api/... → 由代理转发到实际后端 baseUrl: '/api', timeout: 30000 }, - baseUrl: '/', - file: { - // 通过 Nginx → Gateway 访问文件服务,使用 /urban-lifeline 前缀 downloadUrl: '/api/urban-lifeline/file/download/', uploadUrl: '/api/urban-lifeline/file/upload', - maxSize: { - image: 5, - video: 100, - document: 10 - }, + maxSize: { image: 5, video: 100, document: 10 }, acceptTypes: { image: 'image/*', video: 'video/*', document: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx' } }, - token: { key: 'token', refreshThreshold: 300000 }, - - publicImgPath: 'http://localhost:7002/img', - publicWebPath: 'http://localhost:7002', - - // 单点登录配置 + publicImgPath: '/img', + publicWebPath: '/', sso: { - platformUrl: '/', // 通过nginx访问platform - workcaseUrl: '/workcase', // 通过nginx访问workcase - biddingUrl: '/bidding' // 通过nginx访问bidding + platformUrl: '/', + workcaseUrl: '/workcase', + biddingUrl: '/bidding' }, - + aesSecretKey: 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=', features: { enableDebug: true, enableMockData: false } }; +// ============================================ // 生产环境默认配置(兜底) +// ============================================ const prodDefaultConfig: AppRuntimeConfig = { env: 'production', - api: { baseUrl: '/api', timeout: 30000 }, - baseUrl: '/', - file: { downloadUrl: '/api/urban-lifeline/file/download/', uploadUrl: '/api/urban-lifeline/file/upload', - maxSize: { - image: 5, - video: 100, - document: 10 - }, + maxSize: { image: 5, video: 100, document: 10 }, acceptTypes: { image: 'image/*', video: 'video/*', document: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx' } }, - token: { key: 'token', refreshThreshold: 300000 }, - publicImgPath: '/img', publicWebPath: '/', - - // 单点登录配置(生产环境通过nginx代理) sso: { platformUrl: '/', workcaseUrl: '/workcase', biddingUrl: '/bidding' }, - + aesSecretKey: 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=', features: { enableDebug: false, enableMockData: false @@ -162,92 +135,82 @@ const prodDefaultConfig: AppRuntimeConfig = { // 配置加载 // ============================================ +/** + * 检查值是否为未替换的占位符 + */ +const isPlaceholder = (value: any): boolean => { + return typeof value === 'string' && value.startsWith('__') && value.endsWith('__'); +}; + +/** + * 深度合并配置,跳过占位符值 + */ +const mergeConfig = (target: any, source: any): any => { + const result = { ...target }; + for (const key in source) { + const value = source[key]; + if (value && typeof value === 'object' && !Array.isArray(value)) { + result[key] = mergeConfig(target[key] || {}, value); + } else if (!isPlaceholder(value)) { + result[key] = value; + } + } + return result; +}; + /** * 获取运行时配置 - * 生产环境优先从 window.APP_RUNTIME_CONFIG 读取(app-config.js 注入) */ const getRuntimeConfig = (): AppRuntimeConfig => { if (isDev) { - console.log('[配置] 开发环境,使用内置配置'); + console.log('[Config] 开发环境,使用内置配置'); return devConfig; } - // 生产环境:尝试读取外部配置 try { const runtimeConfig = (window as any).APP_RUNTIME_CONFIG; if (runtimeConfig && typeof runtimeConfig === 'object') { - console.log('[配置] 加载外部配置 app-config.js'); - console.log('[配置] API地址:', runtimeConfig.api?.baseUrl); - console.log('[配置] 环境:', runtimeConfig.env || 'production'); - return runtimeConfig as AppRuntimeConfig; + const merged = mergeConfig(prodDefaultConfig, runtimeConfig); + console.log('[Config] 加载运行时配置', merged); + return merged; } } catch (e) { - console.warn('[配置] 无法读取外部配置,使用默认配置', e); + console.warn('[Config] 无法读取外部配置', e); } - console.log('[配置] 使用默认生产配置'); + console.log('[Config] 使用默认生产配置'); return prodDefaultConfig; }; -// 当前应用配置 +// 当前配置 const config = getRuntimeConfig(); -console.log('[配置] 当前配置', config); // ============================================ -// 导出配置(向后兼容) +// 导出 // ============================================ -// 单独导出常用配置项 +// AES 密钥 +export const AES_SECRET_KEY = config.aesSecretKey || 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI='; + +// 常用配置项 export const API_BASE_URL = config.api.baseUrl; export const FILE_DOWNLOAD_URL = config.file.downloadUrl; +export const FILE_UPLOAD_URL = config.file.uploadUrl; export const PUBLIC_IMG_PATH = config.publicImgPath; export const PUBLIC_WEB_PATH = config.publicWebPath; -// 导出完整配置对象 +// 完整配置对象 export const APP_CONFIG = { - // 应用标题 title: '泰豪电源招投标系统', - - // 环境标识 env: config.env || 'production', - - // 应用基础路径 baseUrl: config.baseUrl, - - // API 配置 - api: { - baseUrl: config.api.baseUrl, - timeout: config.api.timeout - }, - - // 文件配置 - file: { - downloadUrl: config.file.downloadUrl, - uploadUrl: config.file.uploadUrl, - maxSize: config.file.maxSize, - acceptTypes: config.file.acceptTypes - }, - - // Token 配置 - token: { - key: config.token.key, - refreshThreshold: config.token.refreshThreshold - }, - - // 公共路径 + api: config.api, + file: config.file, + token: config.token, publicImgPath: config.publicImgPath, publicWebPath: config.publicWebPath, - - // 单点登录配置 - sso: config.sso || { - platformUrl: '/', - workcaseUrl: '/workcase', - biddingUrl: '/bidding' - }, - - // 功能开关 + sso: config.sso || { platformUrl: '/', workcaseUrl: '/workcase', biddingUrl: '/bidding' }, features: config.features || {} }; -// 默认导出 export default APP_CONFIG; diff --git a/urbanLifelineWeb/packages/bidding/src/layouts/SidebarLayout/SidebarLayout.scss b/urbanLifelineWeb/packages/bidding/src/layouts/SidebarLayout/SidebarLayout.scss new file mode 100644 index 00000000..c089e29c --- /dev/null +++ b/urbanLifelineWeb/packages/bidding/src/layouts/SidebarLayout/SidebarLayout.scss @@ -0,0 +1,191 @@ +// ==================== 品牌色变量 ==================== +$brand-color: #0055AA; +$brand-color-light: #EBF5FF; +$brand-color-hover: #004488; + +.sidebar-layout { + display: flex; + width: 100%; + height: 100vh; + overflow: hidden; + background: #fff; + font-family: 'Inter', 'Noto Sans SC', sans-serif; +} + +// ==================== 侧边栏 ==================== +.sidebar { + width: 256px; + height: 100%; + background: #fff; + display: flex; + flex-direction: column; + color: #333; + flex-shrink: 0; + transition: width 0.3s ease; + border-right: 1px solid #f1f5f9; + z-index: 50; + + &.collapsed { + width: 80px; + overflow: visible; + + .sidebar-header { + padding: 16px 0; + justify-content: center; + } + + .nav-item { + justify-content: center; + padding: 12px; + border-radius: 8px; + margin: 0 12px; + + span { + display: none; + } + } + + .user-section { + justify-content: center; + padding: 16px; + + .user-name { + display: none; + } + } + } +} + +.sidebar-header { + height: 64px; + padding: 0 16px; + margin-bottom: 8px; + display: flex; + align-items: center; + justify-content: space-between; + user-select: none; +} + +.collapse-btn { + width: 32px; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + border-radius: 8px; + cursor: pointer; + color: #94a3b8; + background: transparent; + border: none; + transition: all 0.2s; + flex-shrink: 0; + + &:hover { + background: #f1f5f9; + color: #64748b; + } +} + +.logo { + display: flex; + align-items: center; + gap: 8px; + + .logo-img { + height: 32px; + width: auto; + border-radius: 8px; + object-fit: contain; + } + + .logo-text { + font-size: 16px; + font-weight: 600; + color: #1e293b; + letter-spacing: -0.02em; + } +} + +// 导航菜单 +.nav-menu { + flex: 1; + padding: 8px 12px; +} + +.nav-section { + padding: 0; +} + +.nav-item { + position: relative; + display: flex; + align-items: center; + gap: 12px; + padding: 12px 16px; + margin-bottom: 2px; + border-radius: 8px; + cursor: pointer; + transition: all 0.2s ease; + color: #64748b; + font-size: 14px; + font-weight: 500; + + &:hover { + background: $brand-color-light; + color: $brand-color; + } + + &.active { + background: $brand-color; + color: #fff; + box-shadow: 0 4px 12px rgba($brand-color, 0.25); + } + + span { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} + +// 用户信息 +.user-section { + padding: 16px; + border-top: 1px solid #f1f5f9; + background: #f8fafc; + cursor: pointer; + transition: background 0.2s; + + &:hover { + background: #f1f5f9; + } + + .user-info-wrapper { + display: flex; + align-items: center; + gap: 12px; + } + + .user-avatar { + position: relative; + flex-shrink: 0; + } + + .user-name { + font-size: 14px; + font-weight: 500; + color: #374151; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} + +// ==================== 主内容区 ==================== +.main-content { + flex: 1; + height: 100%; + overflow: hidden; + background: #f8fafc; + position: relative; +} diff --git a/urbanLifelineWeb/packages/bidding/src/layouts/SidebarLayout/SidebarLayout.vue b/urbanLifelineWeb/packages/bidding/src/layouts/SidebarLayout/SidebarLayout.vue index fd579891..95570543 100644 --- a/urbanLifelineWeb/packages/bidding/src/layouts/SidebarLayout/SidebarLayout.vue +++ b/urbanLifelineWeb/packages/bidding/src/layouts/SidebarLayout/SidebarLayout.vue @@ -245,5 +245,5 @@ watch( diff --git a/urbanLifelineWeb/packages/bidding/src/layouts/SidebarLayout/index.ts b/urbanLifelineWeb/packages/bidding/src/layouts/SidebarLayout/index.ts deleted file mode 100644 index 972caa46..00000000 --- a/urbanLifelineWeb/packages/bidding/src/layouts/SidebarLayout/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as SidebarLayout } from './SidebarLayout.vue' diff --git a/urbanLifelineWeb/packages/bidding/src/layouts/index.ts b/urbanLifelineWeb/packages/bidding/src/layouts/index.ts index cbbe43a3..8f619aeb 100644 --- a/urbanLifelineWeb/packages/bidding/src/layouts/index.ts +++ b/urbanLifelineWeb/packages/bidding/src/layouts/index.ts @@ -1,3 +1,2 @@ export { default as SidebarLayout } from './SidebarLayout/SidebarLayout.vue' -// BlankLayout、SubSidebarLayout 从 shared 导入 -export { BlankLayout, SubSidebarLayout } from 'shared/layouts' +export { BlankLayout, SubSidebarLayout } from 'shared/layouts'; \ No newline at end of file diff --git a/urbanLifelineWeb/packages/bidding/src/main.ts b/urbanLifelineWeb/packages/bidding/src/main.ts new file mode 100644 index 00000000..7b7be01c --- /dev/null +++ b/urbanLifelineWeb/packages/bidding/src/main.ts @@ -0,0 +1,81 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' + +// 注意:shared 的样式现在通过 index.html 中的 标签加载 +// 不再需要在这里导入:import 'shared/styles' + +import App from './App.vue' +import router from './router/' + +// 导入需要的 Lucide 图标 +import { + LayoutGrid, + FileText, + Users, + User, + Settings, + Home, + ChevronDown, + ChevronRight, + ChevronLeft, + PanelLeftClose, + PanelLeftOpen, + RefreshCw, + LogOut, + Plus, + Trash2, + Search, + Menu +} from 'lucide-vue-next' + +// Lucide 图标映射 +const lucideIcons = { + LayoutGrid, + FileText, + Users, + User, + Settings, + Home, + ChevronDown, + ChevronRight, + ChevronLeft, + PanelLeftClose, + PanelLeftOpen, + RefreshCw, + LogOut, + Plus, + Trash2, + Search, + Menu +} + +// 异步初始化应用 +async function initApp() { + // 创建 Vue 应用 + const app = createApp(App) + + // 注册 Pinia + const pinia = createPinia() + app.use(pinia) + + // 注册 Element Plus + app.use(ElementPlus) + + // 注册 Lucide 图标 + for (const [name, component] of Object.entries(lucideIcons)) { + app.component(name, component) + } + + // 注册路由 + app.use(router) + + // 挂载应用 + app.mount('#app') + + console.log('✅ Bidding 应用启动成功') +} + +// 启动应用 +initApp() diff --git a/urbanLifelineWeb/packages/bidding/src/router/dynamicRoute.ts b/urbanLifelineWeb/packages/bidding/src/router/dynamicRoute.ts index c8c369aa..ed0af139 100644 --- a/urbanLifelineWeb/packages/bidding/src/router/dynamicRoute.ts +++ b/urbanLifelineWeb/packages/bidding/src/router/dynamicRoute.ts @@ -9,24 +9,27 @@ /// -import { - generateSimpleRoutes, - loadViewsFromStorage, - type RouteGeneratorConfig, - type GenerateSimpleRoutesOptions -} from 'shared/utils/route' -import type { TbSysViewDTO } from 'shared/types' import type { RouteRecordRaw } from 'vue-router' import router from './index' -import { SidebarLayout, BlankLayout, SubSidebarLayout } from '@/layouts' +import { SidebarLayout } from '@/layouts' + +// 动态导入 shared 模块(避免顶层 import 阻塞) +async function loadSharedModules() { + const [routeUtils, types] = await Promise.all([ + import('shared/utils/route'), + import('shared/types') + ]) + return { routeUtils, types } +} // Bidding 布局组件映射 const biddingLayoutMap: Record Promise> = { 'SidebarLayout': () => Promise.resolve({ default: SidebarLayout }), - 'BlankLayout': () => Promise.resolve({ default: BlankLayout }), 'NavigationLayout': () => Promise.resolve({ default: SidebarLayout }), 'BasicLayout': () => Promise.resolve({ default: SidebarLayout }), - 'SubSidebarLayout': () => Promise.resolve({ default: SubSidebarLayout }) + // 动态导入 shared 的布局组件,避免静态导入阻塞 + 'BlankLayout': () => import('shared/layouts').then(m => ({ default: m.BlankLayout })), + 'SubSidebarLayout': () => import('shared/layouts').then(m => ({ default: m.SubSidebarLayout })) } // 视图组件加载器 @@ -67,7 +70,7 @@ function viewLoader(componentPath: string): (() => Promise) | null { } // Bidding 路由生成器配置 -const routeConfig: RouteGeneratorConfig = { +const routeConfig: any = { layoutMap: biddingLayoutMap, viewLoader, notFoundComponent: () => import('vue').then(({ h }) => ({ @@ -78,7 +81,7 @@ const routeConfig: RouteGeneratorConfig = { } // Bidding 路由生成选项 -const routeOptions: GenerateSimpleRoutesOptions = { +const routeOptions: any = { asRootChildren: false, // 直接作为根级路由,不是某个布局的子路由 iframePlaceholder: () => import('shared/components').then(m => ({ default: m.IframeView })), verbose: true // 启用详细日志 @@ -88,17 +91,19 @@ const routeOptions: GenerateSimpleRoutesOptions = { * 添加动态路由(Bidding 特定) * @param views 视图列表(用作菜单) */ -export function addDynamicRoutes(views: TbSysViewDTO[]) { +export async function addDynamicRoutes(views: any[]) { if (!views || views.length === 0) { console.warn('[Bidding] addDynamicRoutes: 视图列表为空') return } console.log('[Bidding] addDynamicRoutes: 开始添加动态路由,视图数量:', views.length) - console.log('[Bidding] addDynamicRoutes: 路由配置:', routeConfig) - console.log('[Bidding] addDynamicRoutes: 路由选项:', routeOptions) try { + // 动态加载 shared 模块 + const { routeUtils } = await loadSharedModules() + const { generateSimpleRoutes } = routeUtils + // 使用 shared 中的通用方法生成路由 const routes = generateSimpleRoutes(views, routeConfig, routeOptions) @@ -120,10 +125,14 @@ export function addDynamicRoutes(views: TbSysViewDTO[]) { * 使用 shared 中的通用 loadViewsFromStorage 方法 * 筛选出 service='bidding' 的视图 */ -export function loadRoutesFromStorage(): boolean { +export async function loadRoutesFromStorage(): Promise { try { console.log('[Bidding] loadRoutesFromStorage: 开始加载动态路由') + // 动态加载 shared 模块 + const { routeUtils } = await loadSharedModules() + const { loadViewsFromStorage } = routeUtils + // 使用 shared 中的通用方法加载视图数据 const allViews = loadViewsFromStorage('loginDomain', 'userViews') @@ -131,7 +140,7 @@ export function loadRoutesFromStorage(): boolean { if (allViews) { // 过滤出 bidding 服务的视图 - const biddingViews = allViews.filter((view: TbSysViewDTO) => + const biddingViews = allViews.filter((view: any) => view.service === 'bidding' ) @@ -143,7 +152,7 @@ export function loadRoutesFromStorage(): boolean { } // 使用 Bidding 的 addDynamicRoutes 添加路由 - addDynamicRoutes(biddingViews) + await addDynamicRoutes(biddingViews) return true } diff --git a/urbanLifelineWeb/packages/bidding/src/router/index.ts b/urbanLifelineWeb/packages/bidding/src/router/index.ts index 120bc4cf..de596033 100644 --- a/urbanLifelineWeb/packages/bidding/src/router/index.ts +++ b/urbanLifelineWeb/packages/bidding/src/router/index.ts @@ -1,11 +1,13 @@ import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router' -// @ts-ignore -import { TokenManager } from 'shared/api' -// @ts-ignore -import { APP_CONFIG } from 'shared/config' -// @ts-ignore +// @ts-ignore - 动态导入,避免顶层 import 阻塞 import { loadRoutesFromStorage } from './dynamicRoute' +// 同步检查 token(直接读取 localStorage,避免导入 shared 模块) +function hasTokenSync(): boolean { + const token = localStorage.getItem('token') + return !!token && token.length > 0 +} + // bidding应用的动态路由会根据layout字段自动添加,不需要预定义Root布局 const routes: RouteRecordRaw[] = [] @@ -18,7 +20,7 @@ const router = createRouter({ let dynamicRoutesLoaded = false // 路由守卫 -router.beforeEach((to, from, next) => { +router.beforeEach(async (to, from, next) => { console.log('[Bidding Router] 路由守卫触发:', { to: to.path, from: from.path, @@ -32,7 +34,7 @@ router.beforeEach((to, from, next) => { // 检查是否需要登录 const requiresAuth = to.meta.requiresAuth !== false - const hasToken = TokenManager.hasToken() + const hasToken = hasTokenSync() console.log('[Bidding Router] 认证检查:', { requiresAuth, @@ -66,19 +68,24 @@ router.beforeEach((to, from, next) => { }) dynamicRoutesLoaded = true - const loaded = loadRoutesFromStorage?.() - console.log('[Bidding Router] 动态路由加载结果:', loaded) - console.log('[Bidding Router] 当前路径:', to.path) - console.log('[Bidding Router] 所有路由:', router.getRoutes().map(r => r.path)) - - if (loaded) { - // 动态路由加载成功,重新导航以匹配新添加的路由 - console.log('[Bidding Router] 动态路由加载成功,重新导航到:', to.path) - next({ ...to, replace: true }) - return - } else { - console.warn('[Bidding Router] 动态路由加载失败') + try { + const loaded = await loadRoutesFromStorage?.() + + console.log('[Bidding Router] 动态路由加载结果:', loaded) + console.log('[Bidding Router] 当前路径:', to.path) + console.log('[Bidding Router] 所有路由:', router.getRoutes().map(r => r.path)) + + if (loaded) { + // 动态路由加载成功,重新导航以匹配新添加的路由 + console.log('[Bidding Router] 动态路由加载成功,重新导航到:', to.path) + next({ ...to, replace: true }) + return + } else { + console.warn('[Bidding Router] 动态路由加载失败') + } + } catch (error) { + console.error('[Bidding Router] 动态路由加载异常:', error) } } diff --git a/urbanLifelineWeb/packages/bidding/vite.config.ts b/urbanLifelineWeb/packages/bidding/vite.config.ts index da3ee2ec..3342c231 100644 --- a/urbanLifelineWeb/packages/bidding/vite.config.ts +++ b/urbanLifelineWeb/packages/bidding/vite.config.ts @@ -1,6 +1,7 @@ import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import vueJsx from '@vitejs/plugin-vue-jsx' +import { federation } from '@module-federation/vite' import { resolve, dirname } from 'path' import { fileURLToPath } from 'url' import fs from 'fs' @@ -8,61 +9,112 @@ import fs from 'fs' const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) -export default defineConfig(({ mode }) => ({ - // 开发和生产环境都通过nginx代理访问/bidding - base: '/bidding/', - - plugins: [ - vue({ - script: { - defineModel: true, - propsDestructure: true - } - }), - vueJsx() - ], - - define: { - __VUE_OPTIONS_API__: true, - __VUE_PROD_DEVTOOLS__: true, - __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true - }, - - resolve: { - alias: { - '@': resolve(__dirname, 'src') - } - }, - - server: { - port: 7002, - host: true, - cors: true, - open: '/bidding/', // 开发时自动打开到 /bidding/ 路径 - // HTTPS 配置(使用 mkcert 生成的本地开发证书) - https: { - key: fs.readFileSync('C:/Users/FK05/443/localhost+3-key.pem'), - cert: fs.readFileSync('C:/Users/FK05/443/localhost+3.pem') - }, - proxy: { - '/api': { - target: 'http://localhost:8180', - changeOrigin: true, - rewrite: (path: string) => path.replace(/^\/api/, '') - } - } - }, - - build: { - outDir: 'dist', - sourcemap: true, - rollupOptions: { - output: { - manualChunks: { - 'vue-vendor': ['vue', 'vue-router', 'pinia'], - 'element-plus': ['element-plus'] +// 开发环境 shared 模块地址 +const DEV_SHARED_URL = 'https://localhost:7000/shared/remoteEntry.js' +// 生产环境使用相对路径,通过 Nginx 代理访问 +const PROD_SHARED_URL = '/shared/remoteEntry.js' + +export default defineConfig(({ mode }) => { + const isDev = mode === 'development' + const sharedEntry = isDev ? DEV_SHARED_URL : PROD_SHARED_URL + + return { + base: '/bidding/', + + plugins: [ + vue({ + script: { + defineModel: true, + propsDestructure: true } + }), + vueJsx(), + federation({ + name: 'bidding', + remotes: { + shared: { + type: 'module', + name: 'shared', + entry: sharedEntry + } + }, + shared: { + vue: {}, + 'vue-router': {}, + 'element-plus': {}, + axios: {} + } + }) + ], + + define: { + __VUE_OPTIONS_API__: true, + __VUE_PROD_DEVTOOLS__: true, + __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true + }, + + resolve: { + alias: { + '@': resolve(__dirname, 'src') + } + }, + + server: { + port: 7002, + host: true, + cors: true, + open: '/bidding/', + https: (() => { + try { + return { + key: fs.readFileSync('C:/Users/FK05/443/localhost+3-key.pem'), + cert: fs.readFileSync('C:/Users/FK05/443/localhost+3.pem') + } + } catch { + return undefined + } + })(), + hmr: { + path: '/@vite/client', + port: 7002 + }, + proxy: { + '/api': { + target: 'http://localhost:8180', + changeOrigin: true, + rewrite: (path: string) => path.replace(/^\/api/, '') + } + } + }, + + build: { + target: 'esnext', + outDir: 'dist', + sourcemap: true + // 注意:不要使用 manualChunks 分割 vue/vue-router/element-plus + // 因为它们已经在 Module Federation 的 shared 中声明 + // 同时使用会导致循环依赖死锁 + }, + + preview: { + port: 7002, + host: true, + cors: true, + https: (() => { + try { + return { + key: fs.readFileSync('C:/Users/FK05/443/localhost+3-key.pem'), + cert: fs.readFileSync('C:/Users/FK05/443/localhost+3.pem') + } + } catch { + return undefined + } + })(), + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type, Authorization' } } } -})) +}) diff --git a/urbanLifelineWeb/packages/platform/index.html b/urbanLifelineWeb/packages/platform/index.html index 07ddce13..42165d02 100644 --- a/urbanLifelineWeb/packages/platform/index.html +++ b/urbanLifelineWeb/packages/platform/index.html @@ -5,9 +5,13 @@ 泰豪电源 AI 数智化平台 - + + + + +
diff --git a/urbanLifelineWeb/packages/platform/public/app-config.js b/urbanLifelineWeb/packages/platform/public/app-config.js index 327e13e4..b196c62c 100644 --- a/urbanLifelineWeb/packages/platform/public/app-config.js +++ b/urbanLifelineWeb/packages/platform/public/app-config.js @@ -1,24 +1,22 @@ /** - * @description 应用运行时配置文件 - * @author yslg - * @since 2025-12-06 + * @description 应用运行时配置文件 (支持 Docker 环境变量替换) * - * 说明: - * 1. 此文件在生产环境中被加载,用于覆盖内置配置 - * 2. Docker 部署时,可通过挂载此文件来修改配置,无需重新构建 - * 3. 配置结构必须与 packages/shared/src/config/index.ts 中的 AppRuntimeConfig 保持一致 + * 占位符说明: + * - __PLACEHOLDER__ 格式的值会在 Docker 启动时被环境变量替换 + * - 如果环境变量未设置,将使用默认值 * - * 使用示例(Docker): - * docker run -v /path/to/app-config.js:/app/public/app-config.js my-app:latest + * Docker 部署: + * 1. 通过 volume 挂载覆盖此文件 + * 2. 或通过启动脚本替换占位符 */ window.APP_RUNTIME_CONFIG = { // 环境标识 - env: 'production', + env: '__APP_ENV__', // API 配置 api: { - baseUrl: '/api', + baseUrl: '__API_BASE_URL__', timeout: 30000 }, @@ -27,12 +25,12 @@ window.APP_RUNTIME_CONFIG = { // 文件配置 file: { - downloadUrl: '/api/urban-lifeline/file/download/', - uploadUrl: '/api/urban-lifeline/file/upload', + downloadUrl: '__API_BASE_URL__/urban-lifeline/file/download/', + uploadUrl: '__API_BASE_URL__/urban-lifeline/file/upload', maxSize: { - image: 5, // MB - video: 100, // MB - document: 10 // MB + image: 5, + video: 100, + document: 10 }, acceptTypes: { image: 'image/*', @@ -44,20 +42,23 @@ window.APP_RUNTIME_CONFIG = { // Token 配置 token: { key: 'token', - refreshThreshold: 300000 // 5分钟 + refreshThreshold: 300000 }, // 公共资源路径 - publicImgPath: '/img', - publicWebPath: '/', + publicImgPath: '__PUBLIC_PATH__/img', + publicWebPath: '__PUBLIC_PATH__', // 单点登录配置 sso: { - platformUrl: '/', // platform 平台地址 - workcaseUrl: '/workcase', // workcase 服务地址 - biddingUrl: '/bidding' // bidding 服务地址 + platformUrl: '__SSO_PLATFORM_URL__', + workcaseUrl: '__SSO_WORKCASE_URL__', + biddingUrl: '__SSO_BIDDING_URL__' }, + // AES 加密密钥 + aesSecretKey: '__AES_SECRET_KEY__', + // 功能开关 features: { enableDebug: false, diff --git a/urbanLifelineWeb/packages/platform/public/app-config.local.js b/urbanLifelineWeb/packages/platform/public/app-config.local.js new file mode 100644 index 00000000..497a7286 --- /dev/null +++ b/urbanLifelineWeb/packages/platform/public/app-config.local.js @@ -0,0 +1,60 @@ +/** + * @description 本地开发环境配置文件 + * 用于 dev 和 preview 模式 + */ + +window.APP_RUNTIME_CONFIG = { + // 环境标识 + env: 'production', + + // API 配置 + api: { + baseUrl: 'https://org.xyzh.yslg/api', + timeout: 30000 + }, + + // 应用基础路径 + baseUrl: '/platform/', + + // 文件配置 + file: { + downloadUrl: 'https://org.xyzh.yslg/api/urban-lifeline/file/download/', + uploadUrl: 'https://org.xyzh.yslg/api/urban-lifeline/file/upload', + maxSize: { + image: 5, + video: 100, + document: 10 + }, + acceptTypes: { + image: 'image/*', + video: 'video/*', + document: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx' + } + }, + + // Token 配置 + token: { + key: 'token', + refreshThreshold: 300000 + }, + + // 公共资源路径 + publicImgPath: '/platform/img', + publicWebPath: '/platform', + + // 单点登录配置 + sso: { + platformUrl: 'https://org.xyzh.yslg/platform/', + workcaseUrl: 'https://org.xyzh.yslg/workcase/', + biddingUrl: 'https://org.xyzh.yslg/bidding/' + }, + + // AES 加密密钥(本地开发用,生产环境需要替换) + aesSecretKey: 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=', + + // 功能开关 + features: { + enableDebug: true, + enableMockData: false + } +}; diff --git a/urbanLifelineWeb/packages/platform/src/config/index.ts b/urbanLifelineWeb/packages/platform/src/config/index.ts index 7960152d..dcd54616 100644 --- a/urbanLifelineWeb/packages/platform/src/config/index.ts +++ b/urbanLifelineWeb/packages/platform/src/config/index.ts @@ -1,28 +1,12 @@ /** - * @description Platform 应用运行时配置 - * @author yslg - * @since 2025-12-06 + * @description 应用运行时配置 * * 配置加载策略: - * 1. 开发环境:使用下面定义的开发配置 + * 1. 开发环境:使用内置开发配置 * 2. 生产环境:从 window.APP_RUNTIME_CONFIG 读取(来自 app-config.js) - * 3. Docker部署:替换 app-config.js 文件实现配置外挂 - * - * 配置结构说明: - * 此文件的配置结构与 app-config.js 完全对应 - * 修改 app-config.js 后,这里的配置会自动应用 + * 3. Docker部署:启动时替换 app-config.js 中的占位符 */ -// ============================================ -// AES 加密密钥 -// ============================================ -/** - * AES 加密密钥(与后端保持一致) - * 对应后端配置:security.aes.secret-key - * Base64 编码的 32 字节密钥(256 位) - */ -export const AES_SECRET_KEY = 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=' // Base64 编码,解码后是 "12345678901234567890123456789012" (32字节) - // ============================================ // 类型定义 // ============================================ @@ -53,12 +37,12 @@ export interface AppRuntimeConfig { }; publicImgPath: string; publicWebPath: string; - // 单点登录配置 sso?: { - platformUrl: string; // platform 平台地址 - workcaseUrl: string; // workcase 服务地址 - biddingUrl: string; // bidding 服务地址 + platformUrl: string; + workcaseUrl: string; + biddingUrl: string; }; + aesSecretKey?: string; features?: { enableDebug?: boolean; enableMockData?: boolean; @@ -67,101 +51,80 @@ export interface AppRuntimeConfig { } // ============================================ -// 配置定义(与 app-config.js 结构一致) +// 环境检测 // ============================================ const isDev = (import.meta as any).env?.DEV ?? false; +// ============================================ // 开发环境配置 +// ============================================ const devConfig: AppRuntimeConfig = { env: 'development', - api: { - // 开发环境通过 Vite 代理转发到后端,避免浏览器直接跨域 - // 实际请求路径示例:/api/... → 由代理转发到实际后端 baseUrl: '/api', timeout: 30000 }, - baseUrl: '/', - file: { - // 通过 Nginx → Gateway 访问文件服务,使用 /urban-lifeline 前缀 downloadUrl: '/api/urban-lifeline/file/download/', uploadUrl: '/api/urban-lifeline/file/upload', - maxSize: { - image: 5, - video: 100, - document: 10 - }, + maxSize: { image: 5, video: 100, document: 10 }, acceptTypes: { image: 'image/*', video: 'video/*', document: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx' } }, - token: { key: 'token', refreshThreshold: 300000 }, - - publicImgPath: 'http://localhost:7001/img', - publicWebPath: 'http://localhost:7001', - - // 单点登录配置 + publicImgPath: '/img', + publicWebPath: '/', sso: { - platformUrl: '/', // 通过nginx访问platform - workcaseUrl: '/workcase', // 通过nginx访问workcase - biddingUrl: '/bidding' // 通过nginx访问bidding + platformUrl: '/', + workcaseUrl: '/workcase', + biddingUrl: '/bidding' }, - + aesSecretKey: 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=', features: { enableDebug: true, enableMockData: false } }; +// ============================================ // 生产环境默认配置(兜底) +// ============================================ const prodDefaultConfig: AppRuntimeConfig = { env: 'production', - api: { baseUrl: '/api', timeout: 30000 }, - baseUrl: '/', - file: { downloadUrl: '/api/urban-lifeline/file/download/', uploadUrl: '/api/urban-lifeline/file/upload', - maxSize: { - image: 5, - video: 100, - document: 10 - }, + maxSize: { image: 5, video: 100, document: 10 }, acceptTypes: { image: 'image/*', video: 'video/*', document: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx' } }, - token: { key: 'token', refreshThreshold: 300000 }, - publicImgPath: '/img', publicWebPath: '/', - - // 单点登录配置(生产环境通过nginx代理) sso: { platformUrl: '/', workcaseUrl: '/workcase', biddingUrl: '/bidding' }, - + aesSecretKey: 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=', features: { enableDebug: false, enableMockData: false @@ -172,95 +135,86 @@ const prodDefaultConfig: AppRuntimeConfig = { // 配置加载 // ============================================ +/** + * 检查值是否为未替换的占位符 + */ +const isPlaceholder = (value: any): boolean => { + return typeof value === 'string' && value.startsWith('__') && value.endsWith('__'); +}; + +/** + * 深度合并配置,跳过占位符值 + */ +const mergeConfig = (target: any, source: any): any => { + const result = { ...target }; + for (const key in source) { + const value = source[key]; + if (value && typeof value === 'object' && !Array.isArray(value)) { + result[key] = mergeConfig(target[key] || {}, value); + } else if (!isPlaceholder(value)) { + result[key] = value; + } + } + return result; +}; + /** * 获取运行时配置 - * 生产环境优先从 window.APP_RUNTIME_CONFIG 读取(app-config.js 注入) */ const getRuntimeConfig = (): AppRuntimeConfig => { if (isDev) { - console.log('[配置] 开发环境,使用内置配置'); + console.log('[Config] 开发环境,使用内置配置'); return devConfig; } - // 生产环境:尝试读取外部配置 try { const runtimeConfig = (window as any).APP_RUNTIME_CONFIG; if (runtimeConfig && typeof runtimeConfig === 'object') { - console.log('[配置] 加载外部配置 app-config.js'); - console.log('[配置] API地址:', runtimeConfig.api?.baseUrl); - console.log('[配置] 环境:', runtimeConfig.env || 'production'); - return runtimeConfig as AppRuntimeConfig; + // 合并配置,未替换的占位符使用默认值 + const merged = mergeConfig(prodDefaultConfig, runtimeConfig); + console.log('[Config] 加载运行时配置', merged); + return merged; } } catch (e) { - console.warn('[配置] 无法读取外部配置,使用默认配置', e); + console.warn('[Config] 无法读取外部配置', e); } - console.log('[配置] 使用默认生产配置'); + console.log('[Config] 使用默认生产配置'); return prodDefaultConfig; }; -// 当前应用配置 +// 当前配置 const config = getRuntimeConfig(); -console.log('[配置] 当前配置', config); // ============================================ -// 导出配置(向后兼容) +// 导出 // ============================================ -// 单独导出常用配置项 +// AES 密钥 +export const AES_SECRET_KEY = config.aesSecretKey || 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI='; + +// 常用配置项 export const API_BASE_URL = config.api.baseUrl; export const FILE_DOWNLOAD_URL = config.file.downloadUrl; +export const FILE_UPLOAD_URL = config.file.uploadUrl; export const PUBLIC_IMG_PATH = config.publicImgPath; export const PUBLIC_WEB_PATH = config.publicWebPath; -// 导出完整配置对象 +// 完整配置对象 export const APP_CONFIG = { - // 应用标题 title: '泰豪电源 AI 数智化平台', name: '泰豪电源 AI 数智化平台', version: '1.0.0', copyright: '泰豪电源', - - // 环境标识 env: config.env || 'production', - - // 应用基础路径 baseUrl: config.baseUrl, - - // API 配置 - api: { - baseUrl: config.api.baseUrl, - timeout: config.api.timeout - }, - - // 文件配置 - file: { - downloadUrl: config.file.downloadUrl, - uploadUrl: config.file.uploadUrl, - maxSize: config.file.maxSize, - acceptTypes: config.file.acceptTypes - }, - - // Token 配置 - token: { - key: config.token.key, - refreshThreshold: config.token.refreshThreshold - }, - - // 公共路径 + api: config.api, + file: config.file, + token: config.token, publicImgPath: config.publicImgPath, publicWebPath: config.publicWebPath, - - // 单点登录配置 - sso: config.sso || { - platformUrl: '/', - workcaseUrl: '/workcase', - biddingUrl: '/bidding' - }, - - // 功能开关 + sso: config.sso || { platformUrl: '/', workcaseUrl: '/workcase', biddingUrl: '/bidding' }, features: config.features || {} }; -// 默认导出 export default APP_CONFIG; diff --git a/urbanLifelineWeb/packages/platform/src/layouts/AdminSidebarLayout/AdminSidebarLayout.vue b/urbanLifelineWeb/packages/platform/src/layouts/AdminSidebarLayout/AdminSidebarLayout.vue index da220064..3ac4e862 100644 --- a/urbanLifelineWeb/packages/platform/src/layouts/AdminSidebarLayout/AdminSidebarLayout.vue +++ b/urbanLifelineWeb/packages/platform/src/layouts/AdminSidebarLayout/AdminSidebarLayout.vue @@ -250,6 +250,6 @@ watch( ) - \ No newline at end of file diff --git a/urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/SidebarLayout.vue b/urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/SidebarLayout.vue index 0ef4cbf7..32630844 100644 --- a/urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/SidebarLayout.vue +++ b/urbanLifelineWeb/packages/platform/src/layouts/SidebarLayout/SidebarLayout.vue @@ -268,6 +268,6 @@ watch( ) - \ No newline at end of file diff --git a/urbanLifelineWeb/packages/platform/src/main.ts b/urbanLifelineWeb/packages/platform/src/main.ts index a25b1b37..7049815f 100644 --- a/urbanLifelineWeb/packages/platform/src/main.ts +++ b/urbanLifelineWeb/packages/platform/src/main.ts @@ -1,12 +1,16 @@ +console.log('📦 main.ts 模块开始加载...') + import { createApp } from 'vue' import { createPinia } from 'pinia' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' +// 注意:shared 的样式现在通过 index.html 中的 标签加载 +// 不再需要在这里导入:import 'shared/styles' + import App from './App.vue' import router from './router/' import { AES_SECRET_KEY } from './config' -import { initAesEncrypt } from 'shared/utils' // 导入需要的 Lucide 图标(用于动态组件) import { @@ -88,37 +92,41 @@ const lucideIcons = { // 异步初始化应用 async function initApp() { - // 1. 初始化 AES 加密工具 + // 1. 创建 Vue 应用 + const app = createApp(App) + + // 2. 注册 Pinia + const pinia = createPinia() + app.use(pinia) + + // 3. 注册 Element Plus + app.use(ElementPlus) + + // 4. 注册 Lucide 图标(用于动态组件) + for (const [name, component] of Object.entries(lucideIcons)) { + app.component(name, component) + } + + // 5. 注册路由 + app.use(router) + + // 6. 立即挂载应用(不等待 AES 初始化) + app.mount('#app') + + console.log('✅ Platform 应用启动成功') + + // 7. 后台初始化 AES 加密工具(不阻塞渲染) try { + const { initAesEncrypt } = await import('shared/utils') await initAesEncrypt(AES_SECRET_KEY) console.log('✅ AES 加密工具初始化成功') } catch (error) { console.error('❌ AES 加密工具初始化失败:', error) } - - // 2. 创建 Vue 应用 - const app = createApp(App) - - // 3. 注册 Pinia - const pinia = createPinia() - app.use(pinia) - - // 4. 注册 Element Plus - app.use(ElementPlus) - - // 5. 注册 Lucide 图标(用于动态组件) - for (const [name, component] of Object.entries(lucideIcons)) { - app.component(name, component) - } - - // 6. 注册路由 - app.use(router) - - // 7. 挂载应用 - app.mount('#app') - - console.log('✅ Platform 应用启动成功') } // 启动应用 -initApp() +console.log('🚀 开始初始化 Platform 应用...') +initApp().catch(error => { + console.error('❌ 应用初始化失败:', error) +}) diff --git a/urbanLifelineWeb/packages/platform/src/router/dynamicRoute.ts b/urbanLifelineWeb/packages/platform/src/router/dynamicRoute.ts index b5bb96e5..75762d32 100644 --- a/urbanLifelineWeb/packages/platform/src/router/dynamicRoute.ts +++ b/urbanLifelineWeb/packages/platform/src/router/dynamicRoute.ts @@ -9,25 +9,28 @@ /// -import { - generateSimpleRoutes, - loadViewsFromStorage, - type RouteGeneratorConfig, - type GenerateSimpleRoutesOptions -} from 'shared/utils/route' -import type { TbSysViewDTO } from 'shared/types' import type { RouteRecordRaw } from 'vue-router' import router from './index' -import { SidebarLayout, BlankLayout, AdminSidebarLayout, SubSidebarLayout } from '@/layouts' +import { SidebarLayout, AdminSidebarLayout } from '@/layouts' + +// 动态导入 shared 模块(避免顶层 import 阻塞) +async function loadSharedModules() { + const [routeUtils, types] = await Promise.all([ + import('shared/utils/route'), + import('shared/types') + ]) + return { routeUtils, types } +} // Platform 布局组件映射 const platformLayoutMap: Record Promise> = { 'SidebarLayout': () => Promise.resolve({ default: SidebarLayout }), - 'BlankLayout': () => Promise.resolve({ default: BlankLayout }), 'NavigationLayout': () => Promise.resolve({ default: SidebarLayout }), 'BasicLayout': () => Promise.resolve({ default: SidebarLayout }), 'AdminSidebarLayout': () => Promise.resolve({ default: AdminSidebarLayout }), - 'SubSidebarLayout': () => Promise.resolve({ default: SubSidebarLayout }) + // 动态导入 shared 的布局组件,避免静态导入阻塞 + 'BlankLayout': () => import('shared/layouts').then(m => ({ default: m.BlankLayout })), + 'SubSidebarLayout': () => import('shared/layouts').then(m => ({ default: m.SubSidebarLayout })) } // 视图组件加载器 @@ -68,7 +71,7 @@ function viewLoader(componentPath: string): (() => Promise) | null { } // Platform 路由生成器配置 -const routeConfig: RouteGeneratorConfig = { +const routeConfig: any = { layoutMap: platformLayoutMap, viewLoader, notFoundComponent: () => Promise.resolve({ @@ -79,7 +82,7 @@ const routeConfig: RouteGeneratorConfig = { } // Platform 路由生成选项 -const routeOptions: GenerateSimpleRoutesOptions = { +const routeOptions: any = { asRootChildren: false, // 直接作为根级路由,不是某个布局的子路由 iframePlaceholder: () => import('shared/components').then(m => ({ default: m.IframeView })), verbose: true // 启用详细日志 @@ -89,7 +92,7 @@ const routeOptions: GenerateSimpleRoutesOptions = { * 添加动态路由(Platform 特定) * @param views 视图列表(用作菜单) */ -export function addDynamicRoutes(views: TbSysViewDTO[]) { +export async function addDynamicRoutes(views: any[]) { if (!views || views.length === 0) { console.warn('[Platform] addDynamicRoutes: 视图列表为空') return @@ -98,6 +101,10 @@ export function addDynamicRoutes(views: TbSysViewDTO[]) { console.log('[Platform] addDynamicRoutes: 开始添加动态路由,视图数量:', views.length) try { + // 动态加载 shared 模块 + const { routeUtils } = await loadSharedModules() + const { generateSimpleRoutes } = routeUtils + // 使用 shared 中的通用方法生成路由 const routes = generateSimpleRoutes(views, routeConfig, routeOptions) @@ -133,10 +140,14 @@ export function addDynamicRoutes(views: TbSysViewDTO[]) { * * 使用 shared 中的通用 loadViewsFromStorage 方法 */ -export function loadRoutesFromStorage(): boolean { +export async function loadRoutesFromStorage(): Promise { try { console.log('[Platform] loadRoutesFromStorage: 开始加载动态路由') + // 动态加载 shared 模块 + const { routeUtils } = await loadSharedModules() + const { loadViewsFromStorage } = routeUtils + // 使用 shared 中的通用方法加载视图数据 const allViews = loadViewsFromStorage('loginDomain', 'userViews') @@ -144,7 +155,7 @@ export function loadRoutesFromStorage(): boolean { if (allViews) { // 过滤出 platform 服务的视图 - const platformViews = allViews.filter((view: TbSysViewDTO) => + const platformViews = allViews.filter((view: any) => view.service === 'platform' ) @@ -156,7 +167,7 @@ export function loadRoutesFromStorage(): boolean { } // 使用 Platform 的 addDynamicRoutes 添加路由 - addDynamicRoutes(platformViews) + await addDynamicRoutes(platformViews) return true } diff --git a/urbanLifelineWeb/packages/platform/src/router/index.ts b/urbanLifelineWeb/packages/platform/src/router/index.ts index af76e120..a37e45bb 100644 --- a/urbanLifelineWeb/packages/platform/src/router/index.ts +++ b/urbanLifelineWeb/packages/platform/src/router/index.ts @@ -1,11 +1,21 @@ import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router' -import { TokenManager } from 'shared/api' import { loadRoutesFromStorage } from './dynamicRoute' +// 同步检查 token(用于非异步场景) +function hasTokenSync(): boolean { + try { + const token = localStorage.getItem('token') + return !!token + } catch { + return false + } +} + // platform应用的动态路由会根据layout字段自动添加,不需要预定义Root布局 +// 参考 workcase 的方式:不预定义 404 路由,避免过早匹配 const routes: RouteRecordRaw[] = [ { - path: '/platform/login', + path: '/login', name: 'Login', component: () => import('@/views/public/Login/Login.vue'), meta: { @@ -24,26 +34,32 @@ const router = createRouter({ let dynamicRoutesLoaded = false // 路由守卫 -router.beforeEach((to, from, next) => { +router.beforeEach(async (to, from, next) => { + console.log('[Platform Router] 路由守卫触发:', { + to: to.path, + from: from.path, + dynamicRoutesLoaded + }) + // 设置页面标题 if (to.meta.title) { document.title = `${to.meta.title} - 泰豪电源 AI 数智化平台` } - // 检查是否需要登录 + // 检查是否需要登录(使用同步方法,避免阻塞) const requiresAuth = to.meta.requiresAuth !== false // 默认需要登录 - const hasToken = TokenManager.hasToken() + const hasToken = hasTokenSync() if (requiresAuth && !hasToken) { // 需要登录但未登录,跳转到登录页 next({ - path: '/platform/login', + path: '/login', query: { redirect: to.fullPath } // 保存原始路径 }) return } - if (to.path === '/platform/login' && hasToken) { + if (to.path === '/login' && hasToken) { // 已登录但访问登录页,跳转到首页 next('/') return @@ -51,27 +67,39 @@ router.beforeEach((to, from, next) => { // 如果已登录且动态路由未加载,先加载动态路由 if (hasToken && !dynamicRoutesLoaded) { - dynamicRoutesLoaded = true - const loaded = loadRoutesFromStorage() + console.log('[Platform Router] 开始加载动态路由...') + dynamicRoutesLoaded = true // 先设置标志,避免重复加载 - if (loaded) { - if (to.path === '/') { - // 访问根路径,重定向到第一个可用路由 - const firstRoute = getFirstAvailableRoute() - if (firstRoute && firstRoute !== '/') { - // 只有当第一个路由不是 / 时才重定向,避免无限循环 - console.log('[Platform Router] 根路径重定向到:', firstRoute) - next({ path: firstRoute, replace: true }) - return + try { + const loaded = await loadRoutesFromStorage() + + console.log('[Platform Router] 动态路由加载结果:', loaded) + + if (loaded) { + console.log('[Platform Router] 动态路由加载成功') + console.log('[Platform Router] 所有路由:', router.getRoutes().map(r => r.path)) + + if (to.path === '/') { + // 访问根路径,重定向到第一个可用路由 + const firstRoute = getFirstAvailableRoute() + if (firstRoute && firstRoute !== '/') { + console.log('[Platform Router] 根路径重定向到:', firstRoute) + next({ path: firstRoute, replace: true }) + return + } } else { - // 第一个路由就是 /,直接放行 - console.log('[Platform Router] 第一个路由就是根路径,直接放行') + // 动态路由加载成功,重新导航以匹配新添加的路由 + console.log('[Platform Router] 动态路由加载成功,重新导航到:', to.path) + next({ ...to, replace: true }) + return } } else { - // 动态路由已加载,重新导航到目标路由 - next({ ...to, replace: true }) - return + console.warn('[Platform Router] 动态路由加载失败') + dynamicRoutesLoaded = false // 重置标志,允许下次重试 } + } catch (error) { + console.error('[Platform Router] 加载动态路由失败:', error) + dynamicRoutesLoaded = false // 重置标志,允许下次重试 } } @@ -79,13 +107,13 @@ router.beforeEach((to, from, next) => { if (hasToken && to.path === '/' && dynamicRoutesLoaded) { const firstRoute = getFirstAvailableRoute() if (firstRoute && firstRoute !== '/') { - // 只有当第一个路由不是 / 时才重定向,避免无限循环 console.log('[Platform Router] 已登录访问根路径,重定向到:', firstRoute) next({ path: firstRoute, replace: true }) return } } + console.log('[Platform Router] 继续正常导航') next() }) @@ -143,5 +171,4 @@ export function resetDynamicRoutes() { dynamicRoutesLoaded = false } -// 导出路由和辅助函数 export default router diff --git a/urbanLifelineWeb/packages/platform/src/types/shared.d.ts b/urbanLifelineWeb/packages/platform/src/types/shared.d.ts index 89e856fc..0e142e0b 100644 --- a/urbanLifelineWeb/packages/platform/src/types/shared.d.ts +++ b/urbanLifelineWeb/packages/platform/src/types/shared.d.ts @@ -52,7 +52,7 @@ declare module 'shared/api' { import type { AxiosResponse, AxiosRequestConfig } from 'axios' interface ApiInstance { - get(url: string, config?: AxiosRequestConfig): Promise> + get(url: string,data?: any, config?: AxiosRequestConfig): Promise> post(url: string, data?: any, config?: AxiosRequestConfig): Promise> put(url: string, data?: any, config?: AxiosRequestConfig): Promise> delete(url: string, config?: AxiosRequestConfig): Promise> @@ -61,8 +61,6 @@ declare module 'shared/api' { export const api: ApiInstance export const TokenManager: any - export const authAPI: any - export const fileAPI: any } declare module 'shared/api/auth' { @@ -81,26 +79,52 @@ declare module 'shared/api/ai' { // ============ types模块 ================== declare module 'shared/types' { - export type { BaseDTO, BaseVO } from '../../../shared/src/types/base' - + // 基础类型 + export interface OrderField { + field: string + order: 'ASC' | 'DESC' + } + + export interface BaseDTO { + optsn?: string + creator?: string + updater?: string + deptPath?: string + remark?: string + createTime?: string + updateTime?: string + deleteTime?: string + deleted?: boolean + limit?: number + startTime?: string + endTime?: string + orderFields?: OrderField[] + } + + export interface BaseVO extends BaseDTO { + id?: string + creatorName?: string + updaterName?: string + } + // 重新导出 response export type { ResultDomain } from '../../../shared/src/types/response' - + // 重新导出 page export type { PageDomain, PageParam, PageRequest } from '../../../shared/src/types/page' - + // 重新导出 auth export type { LoginParam, LoginDomain } from '../../../shared/src/types/auth' - + // 重新导出 sys export type { SysUserVO, SysConfigVO, TbSysViewDTO } from '../../../shared/src/types/sys' - + // 重新导出 file export type { TbSysFileDTO } from '../../../shared/src/types/file' - + // 重新导出 ai - export type { - TbKnowledge, + export type { + TbKnowledge, TbKnowledgeFile, TbAgent, PromptCard, @@ -108,10 +132,17 @@ declare module 'shared/types' { TbChatMessage, DifyFileInfo, ChatPrepareData, - StopChatParams, - CommentMessageParams + CreateChatParam, + StopChatParam, + CommentMessageParam, + ChatListParam, + ChatMessageListParam, + SSEMessageData, + SSECallbacks, + SSETask, + TbKnowledgeFileLog } from '../../../shared/src/types/ai' - + // 重新导出 menu export type { MenuItem, toMenuItem, toMenuItems } from '../../../shared/src/types/menu' } diff --git a/urbanLifelineWeb/packages/platform/src/views/admin/overview/OverviewView.vue b/urbanLifelineWeb/packages/platform/src/views/admin/overview/OverviewView.vue index 4e7e9919..e0a2c51d 100644 --- a/urbanLifelineWeb/packages/platform/src/views/admin/overview/OverviewView.vue +++ b/urbanLifelineWeb/packages/platform/src/views/admin/overview/OverviewView.vue @@ -7,5 +7,5 @@ \ No newline at end of file diff --git a/urbanLifelineWeb/packages/platform/src/views/admin/userManagement/UserManagementView.vue b/urbanLifelineWeb/packages/platform/src/views/admin/userManagement/UserManagementView.vue index 1e4d725d..d249c512 100644 --- a/urbanLifelineWeb/packages/platform/src/views/admin/userManagement/UserManagementView.vue +++ b/urbanLifelineWeb/packages/platform/src/views/admin/userManagement/UserManagementView.vue @@ -7,5 +7,5 @@ \ No newline at end of file diff --git a/urbanLifelineWeb/packages/platform/src/views/public/Agents/AgentPlatformView.vue b/urbanLifelineWeb/packages/platform/src/views/public/Agents/AgentPlatformView.vue index 8ef8a202..30025adc 100644 --- a/urbanLifelineWeb/packages/platform/src/views/public/Agents/AgentPlatformView.vue +++ b/urbanLifelineWeb/packages/platform/src/views/public/Agents/AgentPlatformView.vue @@ -252,5 +252,5 @@ const handleSaveAgent = async (agentData: Partial) => { diff --git a/urbanLifelineWeb/packages/platform/src/views/public/Agents/components/AgentCard/AgentCard.vue b/urbanLifelineWeb/packages/platform/src/views/public/Agents/components/AgentCard/AgentCard.vue index 08bcbe38..d561c5c6 100644 --- a/urbanLifelineWeb/packages/platform/src/views/public/Agents/components/AgentCard/AgentCard.vue +++ b/urbanLifelineWeb/packages/platform/src/views/public/Agents/components/AgentCard/AgentCard.vue @@ -39,5 +39,5 @@ defineEmits<{ diff --git a/urbanLifelineWeb/packages/platform/src/views/public/Agents/components/AgentEdit/AgentEdit.vue b/urbanLifelineWeb/packages/platform/src/views/public/Agents/components/AgentEdit/AgentEdit.vue index dcd8c80c..9c2c1285 100644 --- a/urbanLifelineWeb/packages/platform/src/views/public/Agents/components/AgentEdit/AgentEdit.vue +++ b/urbanLifelineWeb/packages/platform/src/views/public/Agents/components/AgentEdit/AgentEdit.vue @@ -248,5 +248,5 @@ const handleSave = () => { diff --git a/urbanLifelineWeb/packages/platform/src/views/public/Chat/AIChatView.vue b/urbanLifelineWeb/packages/platform/src/views/public/Chat/AIChatView.vue index 6a703740..2c4958e8 100644 --- a/urbanLifelineWeb/packages/platform/src/views/public/Chat/AIChatView.vue +++ b/urbanLifelineWeb/packages/platform/src/views/public/Chat/AIChatView.vue @@ -423,5 +423,5 @@ onMounted(() => { \ No newline at end of file diff --git a/urbanLifelineWeb/packages/platform/src/views/public/Chat/components/ChatDefault/ChatDefault.vue b/urbanLifelineWeb/packages/platform/src/views/public/Chat/components/ChatDefault/ChatDefault.vue index f6c0f3c8..44d9d593 100644 --- a/urbanLifelineWeb/packages/platform/src/views/public/Chat/components/ChatDefault/ChatDefault.vue +++ b/urbanLifelineWeb/packages/platform/src/views/public/Chat/components/ChatDefault/ChatDefault.vue @@ -105,5 +105,5 @@ const handleSuggestionClick = (suggestion: string) => { \ No newline at end of file diff --git a/urbanLifelineWeb/packages/platform/src/views/public/Chat/components/ChatHistory/ChatHistory.vue b/urbanLifelineWeb/packages/platform/src/views/public/Chat/components/ChatHistory/ChatHistory.vue index e69de29b..2b0f0a77 100644 --- a/urbanLifelineWeb/packages/platform/src/views/public/Chat/components/ChatHistory/ChatHistory.vue +++ b/urbanLifelineWeb/packages/platform/src/views/public/Chat/components/ChatHistory/ChatHistory.vue @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/urbanLifelineWeb/packages/platform/vite.config.ts b/urbanLifelineWeb/packages/platform/vite.config.ts index 7eecb8e8..c08a8878 100644 --- a/urbanLifelineWeb/packages/platform/vite.config.ts +++ b/urbanLifelineWeb/packages/platform/vite.config.ts @@ -9,82 +9,111 @@ import fs from 'fs' const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) -export default defineConfig({ - // Platform 应用的基础路径 - base: '/platform/', - - plugins: [ - vue({ - script: { - defineModel: true, - propsDestructure: true - } - }), - vueJsx(), - federation({ - name: 'platform', - remotes: { +// 开发环境 shared 模块地址 +const DEV_SHARED_URL = 'https://localhost:7000/shared/remoteEntry.js' +// 生产环境使用相对路径,通过 Nginx 代理访问 +const PROD_SHARED_URL = '/shared/remoteEntry.js' + +export default defineConfig(({ mode }) => { + const isDev = mode === 'development' + const sharedEntry = isDev ? DEV_SHARED_URL : PROD_SHARED_URL + + return { + base: '/platform/', + + plugins: [ + vue({ + script: { + defineModel: true, + propsDestructure: true + } + }), + vueJsx(), + federation({ + name: 'platform', + remotes: { + shared: { + type: 'module', + name: 'shared', + entry: sharedEntry + } + }, shared: { - type: 'module', - name: 'shared', - entry: 'https://org.xyzh.yslg/shared/remoteEntry.js' + vue: {}, + 'vue-router': {}, + 'element-plus': {}, + axios: {} } + }) + ], + + define: { + __VUE_OPTIONS_API__: true, + __VUE_PROD_DEVTOOLS__: true, + __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true + }, + + resolve: { + alias: { + '@': resolve(__dirname, 'src') + } + }, + + server: { + port: 7001, + host: true, + cors: true, + open: '/', + https: (() => { + try { + return { + key: fs.readFileSync('C:/Users/FK05/443/localhost+3-key.pem'), + cert: fs.readFileSync('C:/Users/FK05/443/localhost+3.pem') + } + } catch { + return undefined + } + })(), + hmr: { + path: '/@vite/client', + port: 7001 }, - shared: { - vue: {}, - 'vue-router': {}, - 'element-plus': {}, - axios: {} - } - }) - ], - - define: { - __VUE_OPTIONS_API__: true, - __VUE_PROD_DEVTOOLS__: true, - __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true - }, - - resolve: { - alias: { - '@': resolve(__dirname, 'src') - } - }, - - server: { - port: 7001, - host: true, - cors: true, - open: '/', // 开发时自动打开到根路径 - // HTTPS 配置(使用 mkcert 生成的本地开发证书) - https: { - key: fs.readFileSync('C:/Users/FK05/443/localhost+3-key.pem'), - cert: fs.readFileSync('C:/Users/FK05/443/localhost+3.pem') - }, - hmr: { - // 修复 base 路径导致的 WebSocket 连接问题 - path: '/@vite/client', - port: 7001 - }, - proxy: { - '/api': { - target: 'http://localhost:8180', - changeOrigin: true, - rewrite: (path: string) => path.replace(/^\/api/, '') - } - } - }, - - build: { - outDir: 'dist', - sourcemap: true, - rollupOptions: { - output: { - manualChunks: { - 'vue-vendor': ['vue', 'vue-router', 'pinia'], - 'element-plus': ['element-plus'] + proxy: { + '/api': { + target: 'http://localhost:8180', + changeOrigin: true, + rewrite: (path: string) => path.replace(/^\/api/, '') } } + }, + + build: { + target: 'esnext', + outDir: 'dist', + sourcemap: true + // 注意:不要使用 manualChunks 分割 vue/vue-router/element-plus + // 因为它们已经在 Module Federation 的 shared 中声明 + // 同时使用会导致循环依赖死锁 + }, + preview: { + port: 7001, + host: true, + cors: true, + https: (() => { + try { + return { + key: fs.readFileSync('C:/Users/FK05/443/localhost+3-key.pem'), + cert: fs.readFileSync('C:/Users/FK05/443/localhost+3.pem') + } + } catch { + return undefined + } + })(), + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type, Authorization' + } } } }) diff --git a/urbanLifelineWeb/packages/shared/package.json b/urbanLifelineWeb/packages/shared/package.json index 2558e938..5ce9b2eb 100644 --- a/urbanLifelineWeb/packages/shared/package.json +++ b/urbanLifelineWeb/packages/shared/package.json @@ -12,6 +12,7 @@ "dependencies": { "@element-plus/icons-vue": "^2.3.2", "@stomp/stompjs": "^7.2.1", + "axios": "^1.7.0", "cors": "^2.8.5", "element-plus": "^2.12.0", "express": "^4.18.2", diff --git a/urbanLifelineWeb/packages/shared/pnpm-lock.yaml b/urbanLifelineWeb/packages/shared/pnpm-lock.yaml index 20c4b1cd..0b4a5cbc 100644 --- a/urbanLifelineWeb/packages/shared/pnpm-lock.yaml +++ b/urbanLifelineWeb/packages/shared/pnpm-lock.yaml @@ -11,6 +11,9 @@ dependencies: '@stomp/stompjs': specifier: ^7.2.1 version: 7.2.1 + axios: + specifier: ^1.7.0 + version: 1.13.2 cors: specifier: ^2.8.5 version: 2.8.5 @@ -1253,6 +1256,10 @@ packages: resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} dev: false + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + /available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -1260,6 +1267,16 @@ packages: possible-typed-array-names: 1.1.0 dev: true + /axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -1384,6 +1401,13 @@ packages: resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==} dev: true + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true @@ -1522,6 +1546,11 @@ packages: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} dev: true + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -1686,7 +1715,6 @@ packages: get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 - dev: true /es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} @@ -1840,6 +1868,16 @@ packages: - supports-color dev: false + /follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + /for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -1847,6 +1885,17 @@ packages: is-callable: 1.2.7 dev: true + /form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + dev: false + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -1978,7 +2027,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-symbols: 1.1.0 - dev: true /hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} @@ -2574,6 +2622,10 @@ packages: ipaddr.js: 1.9.1 dev: false + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + /qs@6.14.0: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} diff --git a/urbanLifelineWeb/packages/shared/src/components/ai/knowledge/documentDetail/DocumentDetail.vue b/urbanLifelineWeb/packages/shared/src/components/ai/knowledge/documentDetail/DocumentDetail.vue index 857ee867..a9125f35 100644 --- a/urbanLifelineWeb/packages/shared/src/components/ai/knowledge/documentDetail/DocumentDetail.vue +++ b/urbanLifelineWeb/packages/shared/src/components/ai/knowledge/documentDetail/DocumentDetail.vue @@ -4,6 +4,9 @@ - \ No newline at end of file diff --git a/urbanLifelineWeb/packages/shared/src/components/ai/knowledge/documentSegment/DocumentSegment.scss b/urbanLifelineWeb/packages/shared/src/components/ai/knowledge/documentSegment/DocumentSegment.scss index 9e456abe..fd499675 100644 --- a/urbanLifelineWeb/packages/shared/src/components/ai/knowledge/documentSegment/DocumentSegment.scss +++ b/urbanLifelineWeb/packages/shared/src/components/ai/knowledge/documentSegment/DocumentSegment.scss @@ -1,3 +1,4 @@ +// 文档分段组件样式 - 去掉 scoped 以支持 Module Federation .segment-dialog { :deep(.el-dialog) { border-radius: 14px; @@ -10,7 +11,6 @@ font-size: 18px; font-weight: 500; color: #101828; - letter-spacing: -0.02em; } } @@ -47,21 +47,12 @@ overflow-y: auto; padding-right: 4px; - &::-webkit-scrollbar { - width: 6px; - } - - &::-webkit-scrollbar-track { - background: transparent; - } - + &::-webkit-scrollbar { width: 6px; } + &::-webkit-scrollbar-track { background: transparent; } &::-webkit-scrollbar-thumb { background: #D1D5DB; border-radius: 3px; - - &:hover { - background: #9CA3AF; - } + &:hover { background: #9CA3AF; } } .segment-item { @@ -77,9 +68,7 @@ box-shadow: 0 4px 12px rgba(64, 158, 255, 0.12); } - &:last-child { - margin-bottom: 0; - } + &:last-child { margin-bottom: 0; } } .segment-header { @@ -93,7 +82,6 @@ font-weight: 500; color: #101828; font-size: 14px; - letter-spacing: -0.01em; white-space: nowrap; } @@ -101,7 +89,6 @@ flex: 1; font-size: 12px; color: #6A7282; - letter-spacing: -0.01em; white-space: nowrap; } @@ -115,14 +102,6 @@ .segment-content { margin-bottom: 12px; - - .el-textarea { - textarea { - font-family: inherit; - font-size: 14px; - line-height: 1.6; - } - } .segment-text { padding: 12px; @@ -134,7 +113,6 @@ font-size: 14px; white-space: pre-wrap; word-break: break-word; - letter-spacing: -0.01em; } } @@ -170,7 +148,6 @@ gap: 6px; font-size: 13px; color: #667085; - letter-spacing: -0.01em; .el-icon { font-size: 14px; @@ -190,13 +167,6 @@ font-size: 14px; color: #6A7282; margin: 0; - letter-spacing: -0.01em; } } -} - -.pagination-container { - margin-top: 16px; - display: flex; - justify-content: center; -} +} \ No newline at end of file diff --git a/urbanLifelineWeb/packages/shared/src/components/ai/knowledge/documentSegment/DocumentSegment.vue b/urbanLifelineWeb/packages/shared/src/components/ai/knowledge/documentSegment/DocumentSegment.vue index fa804b3d..5ff8ccf8 100644 --- a/urbanLifelineWeb/packages/shared/src/components/ai/knowledge/documentSegment/DocumentSegment.vue +++ b/urbanLifelineWeb/packages/shared/src/components/ai/knowledge/documentSegment/DocumentSegment.vue @@ -496,6 +496,6 @@ function formatTimestamp(timestamp: number): string { } - diff --git a/urbanLifelineWeb/packages/shared/src/components/dynamicFormItem/DynamicFormItem.vue b/urbanLifelineWeb/packages/shared/src/components/dynamicFormItem/DynamicFormItem.vue index 231289a0..ea74a24c 100644 --- a/urbanLifelineWeb/packages/shared/src/components/dynamicFormItem/DynamicFormItem.vue +++ b/urbanLifelineWeb/packages/shared/src/components/dynamicFormItem/DynamicFormItem.vue @@ -576,6 +576,6 @@ defineExpose({ }) - \ No newline at end of file diff --git a/urbanLifelineWeb/packages/shared/src/components/file/fileHistory/FileHistory.vue b/urbanLifelineWeb/packages/shared/src/components/file/fileHistory/FileHistory.vue index c22c2eab..83407345 100644 --- a/urbanLifelineWeb/packages/shared/src/components/file/fileHistory/FileHistory.vue +++ b/urbanLifelineWeb/packages/shared/src/components/file/fileHistory/FileHistory.vue @@ -150,6 +150,6 @@ const handleCustomAction = (key: string, row: KnowledgeFileVO) => { } - \ No newline at end of file diff --git a/urbanLifelineWeb/packages/shared/src/components/file/fileupload/FileUpload.vue b/urbanLifelineWeb/packages/shared/src/components/file/fileupload/FileUpload.vue index 98cecf24..c6eb689e 100644 --- a/urbanLifelineWeb/packages/shared/src/components/file/fileupload/FileUpload.vue +++ b/urbanLifelineWeb/packages/shared/src/components/file/fileupload/FileUpload.vue @@ -574,6 +574,6 @@ defineExpose({ }) - \ No newline at end of file diff --git a/urbanLifelineWeb/packages/shared/src/components/iframe/IframeView.scss b/urbanLifelineWeb/packages/shared/src/components/iframe/IframeView.scss new file mode 100644 index 00000000..d5cfc06d --- /dev/null +++ b/urbanLifelineWeb/packages/shared/src/components/iframe/IframeView.scss @@ -0,0 +1,75 @@ +// IframeView 组件样式 +.iframe-view { + position: relative; + width: 100%; + height: 100%; + overflow: hidden; + display: flex; + flex-direction: column; + + .iframe-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 12px 16px; + background: var(--el-bg-color); + border-bottom: 1px solid var(--el-border-color-light); + flex-shrink: 0; + + .iframe-title { + font-size: 16px; + font-weight: 500; + color: var(--el-text-color-primary); + } + } + + .iframe-content { + width: 100%; + height: 100%; + border: none; + flex: 1; + + &.with-header { + height: calc(100% - 49px); + } + } + + .iframe-error { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100%; + color: var(--el-text-color-secondary); + + .error-icon { + font-size: 48px; + margin-bottom: 16px; + color: var(--el-color-warning); + } + } + + .iframe-loading { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background: var(--el-bg-color); + gap: 12px; + + .is-loading { + animation: iframe-rotating 1.5s linear infinite; + color: var(--el-color-primary); + } + } +} + +@keyframes iframe-rotating { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} diff --git a/urbanLifelineWeb/packages/shared/src/components/iframe/IframeView.vue b/urbanLifelineWeb/packages/shared/src/components/iframe/IframeView.vue index 792d440f..0234e8c1 100644 --- a/urbanLifelineWeb/packages/shared/src/components/iframe/IframeView.vue +++ b/urbanLifelineWeb/packages/shared/src/components/iframe/IframeView.vue @@ -140,83 +140,7 @@ onUnmounted(() => { }) - diff --git a/urbanLifelineWeb/packages/shared/src/layouts/AdminSidebarLayout/AdminSidebarLayout.vue b/urbanLifelineWeb/packages/shared/src/layouts/AdminSidebarLayout/AdminSidebarLayout.vue index f7247986..2c0a0acd 100644 --- a/urbanLifelineWeb/packages/shared/src/layouts/AdminSidebarLayout/AdminSidebarLayout.vue +++ b/urbanLifelineWeb/packages/shared/src/layouts/AdminSidebarLayout/AdminSidebarLayout.vue @@ -353,6 +353,6 @@ watch( ) - \ No newline at end of file diff --git a/urbanLifelineWeb/packages/shared/src/layouts/BlankLayout/BlankLayout.vue b/urbanLifelineWeb/packages/shared/src/layouts/BlankLayout/BlankLayout.vue index e57dd5cc..18589fbc 100644 --- a/urbanLifelineWeb/packages/shared/src/layouts/BlankLayout/BlankLayout.vue +++ b/urbanLifelineWeb/packages/shared/src/layouts/BlankLayout/BlankLayout.vue @@ -9,10 +9,6 @@ // 适用于全屏页面,如聊天页面、独立功能页等 - diff --git a/urbanLifelineWeb/packages/shared/src/layouts/SharedLayout.vue b/urbanLifelineWeb/packages/shared/src/layouts/SharedLayout.vue index 4da507ce..c53078f7 100644 --- a/urbanLifelineWeb/packages/shared/src/layouts/SharedLayout.vue +++ b/urbanLifelineWeb/packages/shared/src/layouts/SharedLayout.vue @@ -94,7 +94,7 @@ const componentGroups = computed(() => { }) - \ No newline at end of file diff --git a/urbanLifelineWeb/packages/shared/src/styles/components.scss b/urbanLifelineWeb/packages/shared/src/styles/components.scss new file mode 100644 index 00000000..a1cda4b4 --- /dev/null +++ b/urbanLifelineWeb/packages/shared/src/styles/components.scss @@ -0,0 +1,8 @@ +// ==================== Shared Components 样式 ==================== +// 导入各组件的 scss 文件 + +@use '../components/iframe/IframeView.scss'; +@use '../components/file/fileupload/FileUpload.scss'; +@use '../components/file/fileHistory/FileHistory.scss'; +@use '../components/dynamicFormItem/DynamicFormItem.scss'; +@use '../components/ai/knowledge/documentSegment/DocumentSegment.scss'; diff --git a/urbanLifelineWeb/packages/shared/src/styles/index.scss b/urbanLifelineWeb/packages/shared/src/styles/index.scss new file mode 100644 index 00000000..8c78ea3f --- /dev/null +++ b/urbanLifelineWeb/packages/shared/src/styles/index.scss @@ -0,0 +1,6 @@ +// ==================== Shared 全局样式 ==================== +// 这个文件需要在宿主应用的 main.ts 中导入 +// import 'shared/styles' + +@use './layouts.scss'; +@use './components.scss'; diff --git a/urbanLifelineWeb/packages/shared/src/styles/index.ts b/urbanLifelineWeb/packages/shared/src/styles/index.ts new file mode 100644 index 00000000..293f6ccd --- /dev/null +++ b/urbanLifelineWeb/packages/shared/src/styles/index.ts @@ -0,0 +1,9 @@ +// ==================== Shared 全局样式入口 ==================== +// 这个文件作为样式的 JS 入口,确保 CSS 被正确加载 +// 在宿主应用中使用: import 'shared/styles' + +// 导入所有样式(Vite 会自动处理 CSS 注入) +import './index.scss' + +// 导出空对象,让 Module Federation 能正确处理 +export {} diff --git a/urbanLifelineWeb/packages/shared/src/styles/layouts.scss b/urbanLifelineWeb/packages/shared/src/styles/layouts.scss new file mode 100644 index 00000000..b0ee9bb1 --- /dev/null +++ b/urbanLifelineWeb/packages/shared/src/styles/layouts.scss @@ -0,0 +1 @@ +@use '../layouts/SubSidebarLayout/SubSidebarLayout.scss' \ No newline at end of file diff --git a/urbanLifelineWeb/packages/shared/vite.config.ts b/urbanLifelineWeb/packages/shared/vite.config.ts index 57d40ec1..c1b48b9e 100644 --- a/urbanLifelineWeb/packages/shared/vite.config.ts +++ b/urbanLifelineWeb/packages/shared/vite.config.ts @@ -70,7 +70,11 @@ export default defineConfig({ './config': './src/config/index.ts', // ========== Layouts 布局模块 ========== - './layouts': './src/layouts/index.ts' + './layouts': './src/layouts/index.ts', + + // ========== Styles 样式模块 ========== + // 直接暴露 SCSS 文件,确保 CSS 在远程加载时被正确注入 + './styles': './src/styles/index.scss' }, // 共享依赖(重要:避免重复加载) shared: { @@ -101,9 +105,19 @@ export default defineConfig({ minify: false, cssCodeSplit: false, sourcemap: true, + // 确保 CSS 被提取到单独的文件中 + cssMinify: true, rollupOptions: { output: { - format: 'es' + format: 'es', + // 确保 CSS 文件名固定,不带 hash + assetFileNames: (assetInfo) => { + // CSS 文件使用固定名称,便于在 index.html 中引用 + if (assetInfo.name?.endsWith('.css')) { + return 'assets/shared-styles.css' + } + return 'assets/[name]-[hash][extname]' + } } } }, @@ -113,11 +127,17 @@ export default defineConfig({ strictPort: true, host: true, cors: true, - // HTTPS 配置(使用 mkcert 生成的本地开发证书) - https: { - key: fs.readFileSync('C:/Users/FK05/443/localhost+3-key.pem'), - cert: fs.readFileSync('C:/Users/FK05/443/localhost+3.pem') - }, + // HTTPS 配置(本地开发用,可选) + https: (() => { + try { + return { + key: fs.readFileSync('C:/Users/FK05/443/localhost+3-key.pem'), + cert: fs.readFileSync('C:/Users/FK05/443/localhost+3.pem') + } + } catch { + return undefined + } + })(), headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', @@ -129,11 +149,16 @@ export default defineConfig({ port: 7000, host: true, cors: true, - // HTTPS 配置(使用 mkcert 生成的本地开发证书) - https: { - key: fs.readFileSync('C:/Users/FK05/443/localhost+3-key.pem'), - cert: fs.readFileSync('C:/Users/FK05/443/localhost+3.pem') - }, + https: (() => { + try { + return { + key: fs.readFileSync('C:/Users/FK05/443/localhost+3-key.pem'), + cert: fs.readFileSync('C:/Users/FK05/443/localhost+3.pem') + } + } catch { + return undefined + } + })(), headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', diff --git a/urbanLifelineWeb/packages/workcase/.__mf__temp/workcase/localSharedImportMap.js b/urbanLifelineWeb/packages/workcase/.__mf__temp/workcase/localSharedImportMap.js deleted file mode 100644 index adb405c6..00000000 --- a/urbanLifelineWeb/packages/workcase/.__mf__temp/workcase/localSharedImportMap.js +++ /dev/null @@ -1,130 +0,0 @@ - -// Windows temporarily needs this file, https://github.com/module-federation/vite/issues/68 - - import {loadShare} from "@module-federation/runtime"; - const importMap = { - - "element-plus": async () => { - let pkg = await import("__mf__virtual/workcase__prebuild__element_mf_2_plus__prebuild__.js"); - return pkg; - } - , - "vue": async () => { - let pkg = await import("__mf__virtual/workcase__prebuild__vue__prebuild__.js"); - return pkg; - } - , - "vue-router": async () => { - let pkg = await import("__mf__virtual/workcase__prebuild__vue_mf_2_router__prebuild__.js"); - return pkg; - } - - } - const usedShared = { - - "element-plus": { - name: "element-plus", - version: "2.12.0", - scope: ["default"], - loaded: false, - from: "workcase", - async get () { - if (false) { - throw new Error(`Shared module '${"element-plus"}' must be provided by host`); - } - usedShared["element-plus"].loaded = true - const {"element-plus": pkgDynamicImport} = importMap - const res = await pkgDynamicImport() - const exportModule = {...res} - // All npm packages pre-built by vite will be converted to esm - Object.defineProperty(exportModule, "__esModule", { - value: true, - enumerable: false - }) - return function () { - return exportModule - } - }, - shareConfig: { - singleton: false, - requiredVersion: "^2.12.0", - - } - } - , - "vue": { - name: "vue", - version: "3.5.25", - scope: ["default"], - loaded: false, - from: "workcase", - async get () { - if (false) { - throw new Error(`Shared module '${"vue"}' must be provided by host`); - } - usedShared["vue"].loaded = true - const {"vue": pkgDynamicImport} = importMap - const res = await pkgDynamicImport() - const exportModule = {...res} - // All npm packages pre-built by vite will be converted to esm - Object.defineProperty(exportModule, "__esModule", { - value: true, - enumerable: false - }) - return function () { - return exportModule - } - }, - shareConfig: { - singleton: false, - requiredVersion: "^3.5.25", - - } - } - , - "vue-router": { - name: "vue-router", - version: "4.6.3", - scope: ["default"], - loaded: false, - from: "workcase", - async get () { - if (false) { - throw new Error(`Shared module '${"vue-router"}' must be provided by host`); - } - usedShared["vue-router"].loaded = true - const {"vue-router": pkgDynamicImport} = importMap - const res = await pkgDynamicImport() - const exportModule = {...res} - // All npm packages pre-built by vite will be converted to esm - Object.defineProperty(exportModule, "__esModule", { - value: true, - enumerable: false - }) - return function () { - return exportModule - } - }, - shareConfig: { - singleton: false, - requiredVersion: "^4.6.3", - - } - } - - } - const usedRemotes = [ - { - entryGlobalName: "shared", - name: "shared", - type: "module", - entry: "https://org.xyzh.yslg/shared/remoteEntry.js", - shareScope: "default", - } - - ] - export { - usedShared, - usedRemotes - } - \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase/index.html b/urbanLifelineWeb/packages/workcase/index.html index 7b994e53..11f2d084 100644 --- a/urbanLifelineWeb/packages/workcase/index.html +++ b/urbanLifelineWeb/packages/workcase/index.html @@ -5,9 +5,13 @@ 案例管理系统 - + + + + +
diff --git a/urbanLifelineWeb/packages/workcase/public/app-config.js b/urbanLifelineWeb/packages/workcase/public/app-config.js index 327e13e4..9b2ac5ac 100644 --- a/urbanLifelineWeb/packages/workcase/public/app-config.js +++ b/urbanLifelineWeb/packages/workcase/public/app-config.js @@ -1,24 +1,22 @@ /** - * @description 应用运行时配置文件 - * @author yslg - * @since 2025-12-06 + * @description 应用运行时配置文件 (支持 Docker 环境变量替换) * - * 说明: - * 1. 此文件在生产环境中被加载,用于覆盖内置配置 - * 2. Docker 部署时,可通过挂载此文件来修改配置,无需重新构建 - * 3. 配置结构必须与 packages/shared/src/config/index.ts 中的 AppRuntimeConfig 保持一致 + * 占位符说明: + * - __PLACEHOLDER__ 格式的值会在 Docker 启动时被环境变量替换 + * - 如果环境变量未设置,将使用默认值 * - * 使用示例(Docker): - * docker run -v /path/to/app-config.js:/app/public/app-config.js my-app:latest + * Docker 部署: + * 1. 通过 volume 挂载覆盖此文件 + * 2. 或通过启动脚本替换占位符 */ window.APP_RUNTIME_CONFIG = { // 环境标识 - env: 'production', + env: '__APP_ENV__', // API 配置 api: { - baseUrl: '/api', + baseUrl: '__API_BASE_URL__', timeout: 30000 }, @@ -27,12 +25,13 @@ window.APP_RUNTIME_CONFIG = { // 文件配置 file: { - downloadUrl: '/api/urban-lifeline/file/download/', - uploadUrl: '/api/urban-lifeline/file/upload', + downloadUrl: '__API_BASE_URL__/urban-lifeline/file/download/', + uploadUrl: '__API_BASE_URL__/urban-lifeline/file/upload', maxSize: { - image: 5, // MB - video: 100, // MB - document: 10 // MB + image: 5, + video: 100, + document: 10, + default: '__FILE_MAX_SIZE__' // 默认最大文件大小(MB) }, acceptTypes: { image: 'image/*', @@ -44,18 +43,31 @@ window.APP_RUNTIME_CONFIG = { // Token 配置 token: { key: 'token', - refreshThreshold: 300000 // 5分钟 + refreshThreshold: 300000 }, // 公共资源路径 - publicImgPath: '/img', - publicWebPath: '/', + publicImgPath: '__PUBLIC_PATH__/img', + publicWebPath: '__PUBLIC_PATH__', // 单点登录配置 sso: { - platformUrl: '/', // platform 平台地址 - workcaseUrl: '/workcase', // workcase 服务地址 - biddingUrl: '/bidding' // bidding 服务地址 + platformUrl: '__SSO_PLATFORM_URL__', + workcaseUrl: '__SSO_WORKCASE_URL__', + biddingUrl: '__SSO_BIDDING_URL__' + }, + + // AES 加密密钥 + aesSecretKey: '__AES_SECRET_KEY__', + + // Jitsi 视频会议配置 + jitsi: { + serverUrl: '__JITSI_SERVER_URL__' + }, + + // AI 配置 + ai: { + defaultAgentId: '__AI_DEFAULT_AGENT_ID__' // 默认 AI Agent ID }, // 功能开关 diff --git a/urbanLifelineWeb/packages/workcase/public/app-config.local.js b/urbanLifelineWeb/packages/workcase/public/app-config.local.js new file mode 100644 index 00000000..b870e164 --- /dev/null +++ b/urbanLifelineWeb/packages/workcase/public/app-config.local.js @@ -0,0 +1,65 @@ +/** + * @description 本地开发环境配置文件 + * 用于 dev 和 preview 模式 + */ + +window.APP_RUNTIME_CONFIG = { + // 环境标识 + env: 'production', + + // API 配置 + api: { + baseUrl: 'https://org.xyzh.yslg/api', + timeout: 30000 + }, + + // 应用基础路径 + baseUrl: '/workcase/', + + // 文件配置 + file: { + downloadUrl: 'https://org.xyzh.yslg/api/urban-lifeline/file/download/', + uploadUrl: 'https://org.xyzh.yslg/api/urban-lifeline/file/upload', + maxSize: { + image: 5, + video: 100, + document: 10 + }, + acceptTypes: { + image: 'image/*', + video: 'video/*', + document: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx' + } + }, + + // Token 配置 + token: { + key: 'token', + refreshThreshold: 300000 + }, + + // 公共资源路径 + publicImgPath: '/workcase/img', + publicWebPath: '/workcase', + + // 单点登录配置 + sso: { + platformUrl: 'https://org.xyzh.yslg/platform/', + workcaseUrl: 'https://org.xyzh.yslg/workcase/', + biddingUrl: 'https://org.xyzh.yslg/bidding/' + }, + + // AES 加密密钥(本地开发用,生产环境需要替换) + aesSecretKey: 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=', + + // Jitsi 视频会议配置 + jitsi: { + serverUrl: 'https://meet.jit.si' + }, + + // 功能开关 + features: { + enableDebug: true, + enableMockData: false + } +}; diff --git a/urbanLifelineWeb/packages/workcase/src/api/workcase/workcase.ts b/urbanLifelineWeb/packages/workcase/src/api/workcase/workcase.ts index af9c8453..67f0a9ca 100644 --- a/urbanLifelineWeb/packages/workcase/src/api/workcase/workcase.ts +++ b/urbanLifelineWeb/packages/workcase/src/api/workcase/workcase.ts @@ -41,6 +41,15 @@ export const workcaseAPI = { return response.data }, + /** + * 撤销工单 + * @param workcaseId 工单ID + */ + async revokeWorkcase(workcaseId: string): Promise> { + const response = await api.post(`${this.baseUrl}/revoke/${workcaseId}`) + return response.data + }, + /** * 获取工单详情 * @param workcaseId 工单ID diff --git a/urbanLifelineWeb/packages/workcase/src/config/index.ts b/urbanLifelineWeb/packages/workcase/src/config/index.ts index dfd9f344..64d07526 100644 --- a/urbanLifelineWeb/packages/workcase/src/config/index.ts +++ b/urbanLifelineWeb/packages/workcase/src/config/index.ts @@ -1,28 +1,12 @@ /** * @description 应用运行时配置 - * @author yslg - * @since 2025-12-06 * * 配置加载策略: - * 1. 开发环境:使用下面定义的开发配置 + * 1. 开发环境:使用内置开发配置 * 2. 生产环境:从 window.APP_RUNTIME_CONFIG 读取(来自 app-config.js) - * 3. Docker部署:替换 app-config.js 文件实现配置外挂 - * - * 配置结构说明: - * 此文件的配置结构与 app-config.js 完全对应 - * 修改 app-config.js 后,这里的配置会自动应用 + * 3. Docker部署:启动时替换 app-config.js 中的占位符 */ -// ============================================ -// AES 加密密钥 -// ============================================ -/** - * AES 加密密钥(与后端保持一致) - * 对应后端配置:security.aes.secret-key - * Base64 编码的 32 字节密钥(256 位) - */ -export const AES_SECRET_KEY = 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=' // Base64 编码,解码后是 "12345678901234567890123456789012" (32字节) -export const AGENT_ID = '17664699513920001' // ============================================ // 类型定义 // ============================================ @@ -40,6 +24,7 @@ export interface AppRuntimeConfig { image: number; video: number; document: number; + default: number; // 默认最大文件大小(MB) }; acceptTypes: { image: string; @@ -53,11 +38,17 @@ export interface AppRuntimeConfig { }; publicImgPath: string; publicWebPath: string; - // 单点登录配置 sso?: { - platformUrl: string; // platform 平台地址 - workcaseUrl: string; // workcase 服务地址 - biddingUrl: string; // bidding 服务地址 + platformUrl: string; + workcaseUrl: string; + biddingUrl: string; + }; + aesSecretKey?: string; + jitsi?: { + serverUrl: string; + }; + ai?: { + defaultAgentId: string; // 默认 AI Agent ID }; features?: { enableDebug?: boolean; @@ -67,103 +58,92 @@ export interface AppRuntimeConfig { } // ============================================ -// 配置定义(与 app-config.js 结构一致) +// 环境检测 // ============================================ const isDev = (import.meta as any).env?.DEV ?? false; +// ============================================ // 开发环境配置 +// ============================================ const devConfig: AppRuntimeConfig = { env: 'development', - api: { - // 开发环境通过 Vite 代理转发到后端,避免浏览器直接跨域 - // 实际请求路径示例:/api/... → 由代理转发到实际后端 baseUrl: '/api', timeout: 30000 }, - baseUrl: '/', - file: { - // 通过 Nginx → Gateway 访问文件服务,使用 /urban-lifeline 前缀 downloadUrl: '/api/urban-lifeline/file/download/', uploadUrl: '/api/urban-lifeline/file/upload', - maxSize: { - image: 5, - video: 100, - document: 10 - }, + maxSize: { image: 5, video: 100, document: 10, default: 100 }, acceptTypes: { image: 'image/*', video: 'video/*', document: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx' } }, - token: { key: 'token', refreshThreshold: 300000 }, - - publicImgPath: 'http://localhost:5173/img', - publicWebPath: 'http://localhost:5173', - - // 单点登录配置 - // 推荐:开发环境也通过nginx访问(http://localhost) - // 备选:直接访问各服务端口(platformUrl: 'http://localhost:7001') + publicImgPath: '/img', + publicWebPath: '/', sso: { - platformUrl: '/', // 通过nginx访问platform - workcaseUrl: '/workcase', // 通过nginx访问workcase - biddingUrl: '/bidding' // 通过nginx访问bidding + platformUrl: '/', + workcaseUrl: '/workcase', + biddingUrl: '/bidding' + }, + aesSecretKey: 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=', + jitsi: { + serverUrl: 'https://meet.example.com' + }, + ai: { + defaultAgentId: '17664699513920001' }, - features: { enableDebug: true, enableMockData: false } }; +// ============================================ // 生产环境默认配置(兜底) +// ============================================ const prodDefaultConfig: AppRuntimeConfig = { env: 'production', - api: { baseUrl: '/api', timeout: 30000 }, - baseUrl: '/', - file: { - downloadUrl: '/api/file/download/', - uploadUrl: '/api/file/upload', - maxSize: { - image: 5, - video: 100, - document: 10 - }, + downloadUrl: '/api/urban-lifeline/file/download/', + uploadUrl: '/api/urban-lifeline/file/upload', + maxSize: { image: 5, video: 100, document: 10, default: 100 }, acceptTypes: { image: 'image/*', video: 'video/*', document: '.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx' } }, - token: { key: 'token', refreshThreshold: 300000 }, - publicImgPath: '/img', publicWebPath: '/', - - // 单点登录配置(生产环境通过nginx代理) sso: { platformUrl: '/', workcaseUrl: '/workcase', biddingUrl: '/bidding' }, - + aesSecretKey: 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=', + jitsi: { + serverUrl: 'https://meet.example.com' + }, + ai: { + defaultAgentId: '17664699513920001' + }, features: { enableDebug: false, enableMockData: false @@ -174,96 +154,93 @@ const prodDefaultConfig: AppRuntimeConfig = { // 配置加载 // ============================================ +/** + * 检查值是否为未替换的占位符 + */ +const isPlaceholder = (value: any): boolean => { + return typeof value === 'string' && value.startsWith('__') && value.endsWith('__'); +}; + +/** + * 深度合并配置,跳过占位符值 + */ +const mergeConfig = (target: any, source: any): any => { + const result = { ...target }; + for (const key in source) { + const value = source[key]; + if (value && typeof value === 'object' && !Array.isArray(value)) { + result[key] = mergeConfig(target[key] || {}, value); + } else if (!isPlaceholder(value)) { + result[key] = value; + } + } + return result; +}; + /** * 获取运行时配置 - * 生产环境优先从 window.APP_RUNTIME_CONFIG 读取(app-config.js 注入) */ const getRuntimeConfig = (): AppRuntimeConfig => { if (isDev) { - console.log('[配置] 开发环境,使用内置配置'); + console.log('[Config] 开发环境,使用内置配置'); return devConfig; } - // 生产环境:尝试读取外部配置 try { const runtimeConfig = (window as any).APP_RUNTIME_CONFIG; if (runtimeConfig && typeof runtimeConfig === 'object') { - console.log('[配置] 加载外部配置 app-config.js'); - console.log('[配置] API地址:', runtimeConfig.api?.baseUrl); - console.log('[配置] 环境:', runtimeConfig.env || 'production'); - return runtimeConfig as AppRuntimeConfig; + const merged = mergeConfig(prodDefaultConfig, runtimeConfig); + console.log('[Config] 加载运行时配置', merged); + return merged; } } catch (e) { - console.warn('[配置] 无法读取外部配置,使用默认配置', e); + console.warn('[Config] 无法读取外部配置', e); } - console.log('[配置] 使用默认生产配置'); + console.log('[Config] 使用默认生产配置'); return prodDefaultConfig; }; -// 当前应用配置 +// 当前配置 const config = getRuntimeConfig(); -console.log('[配置] 当前配置', config); // ============================================ -// 导出配置(向后兼容) +// 导出 // ============================================ -// 单独导出常用配置项 +// AES 密钥 +export const AES_SECRET_KEY = config.aesSecretKey || 'MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI='; + +// AI Agent ID(从配置读取,支持外部配置) +export const AGENT_ID = config.ai?.defaultAgentId || '17664699513920001'; + +// 常用配置项 export const API_BASE_URL = config.api.baseUrl; export const FILE_DOWNLOAD_URL = config.file.downloadUrl; export const FILE_UPLOAD_URL = config.file.uploadUrl; export const PUBLIC_IMG_PATH = config.publicImgPath; export const PUBLIC_WEB_PATH = config.publicWebPath; -// 文件上传大小限制(100MB) -export const FILE_MAX_SIZE = 100 * 1024 * 1024; +// 文件最大大小(从配置读取,单位:MB,转换为字节) +export const FILE_MAX_SIZE = (config.file.maxSize.default || 100) * 1024 * 1024; -// 导出完整配置对象 +// Jitsi 配置 +export const JITSI_SERVER_URL = config.jitsi?.serverUrl || 'https://meet.example.com'; + +// 完整配置对象 export const APP_CONFIG = { - // 应用标题 - title: '泰豪电源 AI 数智化平台', - - // 环境标识 + title: '泰豪电源工单系统', env: config.env || 'production', - - // 应用基础路径 baseUrl: config.baseUrl, - - // API 配置 - api: { - baseUrl: config.api.baseUrl, - timeout: config.api.timeout - }, - - // 文件配置 - file: { - downloadUrl: config.file.downloadUrl, - uploadUrl: config.file.uploadUrl, - maxSize: config.file.maxSize, - acceptTypes: config.file.acceptTypes - }, - - // Token 配置 - token: { - key: config.token.key, - refreshThreshold: config.token.refreshThreshold - }, - - // 公共路径 + api: config.api, + file: config.file, + token: config.token, publicImgPath: config.publicImgPath, publicWebPath: config.publicWebPath, - - // 单点登录配置 - sso: config.sso || { - platformUrl: '/', - workcaseUrl: '/workcase', - biddingUrl: '/bidding' - }, - - // 功能开关 + sso: config.sso || { platformUrl: '/', workcaseUrl: '/workcase', biddingUrl: '/bidding' }, + jitsi: config.jitsi || { serverUrl: 'https://meet.example.com' }, + ai: config.ai || { defaultAgentId: '17664699513920001' }, features: config.features || {} }; -// 默认导出 export default APP_CONFIG; diff --git a/urbanLifelineWeb/packages/workcase/src/layouts/SidebarLayout/SidebarLayout.vue b/urbanLifelineWeb/packages/workcase/src/layouts/SidebarLayout/SidebarLayout.vue index b22467f6..3ee5ec25 100644 --- a/urbanLifelineWeb/packages/workcase/src/layouts/SidebarLayout/SidebarLayout.vue +++ b/urbanLifelineWeb/packages/workcase/src/layouts/SidebarLayout/SidebarLayout.vue @@ -214,5 +214,5 @@ watch( \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase/src/main.ts b/urbanLifelineWeb/packages/workcase/src/main.ts index 01eab3e0..39075795 100644 --- a/urbanLifelineWeb/packages/workcase/src/main.ts +++ b/urbanLifelineWeb/packages/workcase/src/main.ts @@ -5,11 +5,12 @@ import 'element-plus/dist/index.css' import './assets/css/common.scss' +// 注意:shared 的样式现在通过 index.html 中的 标签加载 +// 不再需要在这里导入:import 'shared/styles' + import App from './App.vue' import router from './router/' import { AES_SECRET_KEY } from './config/index' -// @ts-ignore -import { initAesEncrypt } from 'shared/utils' // 导入需要的 Lucide 图标(用于动态组件) import { @@ -89,37 +90,41 @@ const lucideIcons = { // 异步初始化应用 async function initApp() { - // 1. 初始化 AES 加密工具 + // 1. 创建 Vue 应用 + const app = createApp(App) + + // 2. 注册 Pinia + const pinia = createPinia() + app.use(pinia) + + // 3. 注册 Element Plus + app.use(ElementPlus) + + // 4. 注册 Lucide 图标(用于动态组件) + for (const [name, component] of Object.entries(lucideIcons)) { + app.component(name, component) + } + + // 5. 注册路由 + app.use(router) + + // 6. 立即挂载应用(不等待 AES 初始化) + app.mount('#app') + + console.log('✅ Workcase 应用启动成功') + + // 7. 后台初始化 AES 加密工具(不阻塞渲染) try { + const { initAesEncrypt } = await import('shared/utils') await initAesEncrypt(AES_SECRET_KEY) console.log('✅ AES 加密工具初始化成功') } catch (error) { console.error('❌ AES 加密工具初始化失败:', error) } - - // 2. 创建 Vue 应用 - const app = createApp(App) - - // 3. 注册 Pinia - const pinia = createPinia() - app.use(pinia) - - // 4. 注册 Element Plus - app.use(ElementPlus) - - // 5. 注册 Lucide 图标(用于动态组件) - for (const [name, component] of Object.entries(lucideIcons)) { - app.component(name, component) - } - - // 6. 注册路由 - app.use(router) - - // 7. 挂载应用 - app.mount('#app') - - console.log('✅ Workcase 应用启动成功') } // 启动应用 -initApp() +console.log('🚀 开始初始化 Workcase 应用...') +initApp().catch(error => { + console.error('❌ 应用初始化失败:', error) +}) diff --git a/urbanLifelineWeb/packages/workcase/src/router/dynamicRoute.ts b/urbanLifelineWeb/packages/workcase/src/router/dynamicRoute.ts index 46103145..d7b7a162 100644 --- a/urbanLifelineWeb/packages/workcase/src/router/dynamicRoute.ts +++ b/urbanLifelineWeb/packages/workcase/src/router/dynamicRoute.ts @@ -9,24 +9,27 @@ /// -import { - generateSimpleRoutes, - loadViewsFromStorage, - type RouteGeneratorConfig, - type GenerateSimpleRoutesOptions -} from 'shared/utils/route' -import type { TbSysViewDTO } from 'shared/types' import type { RouteRecordRaw } from 'vue-router' import router from './index' -import { SidebarLayout, BlankLayout, SubSidebarLayout } from '@/layouts' +import { SidebarLayout } from '@/layouts' + +// 动态导入 shared 模块(避免顶层 import 阻塞) +async function loadSharedModules() { + const [routeUtils, types] = await Promise.all([ + import('shared/utils/route'), + import('shared/types') + ]) + return { routeUtils, types } +} // Workcase 布局组件映射 const workcaseLayoutMap: Record Promise> = { 'SidebarLayout': () => Promise.resolve({ default: SidebarLayout }), - 'BlankLayout': () => Promise.resolve({ default: BlankLayout }), 'NavigationLayout': () => Promise.resolve({ default: SidebarLayout }), 'BasicLayout': () => Promise.resolve({ default: SidebarLayout }), - 'SubSidebarLayout': () => Promise.resolve({ default: SubSidebarLayout }) + // 动态导入 shared 的布局组件,避免静态导入阻塞 + 'BlankLayout': () => import('shared/layouts').then(m => ({ default: m.BlankLayout })), + 'SubSidebarLayout': () => import('shared/layouts').then(m => ({ default: m.SubSidebarLayout })) } // 视图组件加载器 @@ -67,7 +70,7 @@ function viewLoader(componentPath: string): (() => Promise) | null { } // Workcase 路由生成器配置 -const routeConfig: RouteGeneratorConfig = { +const routeConfig: any = { layoutMap: workcaseLayoutMap, viewLoader, notFoundComponent: () => Promise.resolve({ @@ -78,7 +81,7 @@ const routeConfig: RouteGeneratorConfig = { } // Workcase 路由生成选项 -const routeOptions: GenerateSimpleRoutesOptions = { +const routeOptions: any = { asRootChildren: false, // 直接作为根级路由,不是某个布局的子路由 iframePlaceholder: () => import('shared/components').then(m => ({ default: m.IframeView })), verbose: true // 启用详细日志 @@ -88,17 +91,19 @@ const routeOptions: GenerateSimpleRoutesOptions = { * 添加动态路由(Workcase 特定) * @param views 视图列表(用作菜单) */ -export function addDynamicRoutes(views: TbSysViewDTO[]) { +export async function addDynamicRoutes(views: any[]) { if (!views || views.length === 0) { console.warn('[Workcase] addDynamicRoutes: 视图列表为空') return } console.log('[Workcase] addDynamicRoutes: 开始添加动态路由,视图数量:', views.length) - console.log('[Workcase] addDynamicRoutes: 路由配置:', routeConfig) - console.log('[Workcase] addDynamicRoutes: 路由选项:', routeOptions) try { + // 动态加载 shared 模块 + const { routeUtils } = await loadSharedModules() + const { generateSimpleRoutes } = routeUtils + // 使用 shared 中的通用方法生成路由 const routes = generateSimpleRoutes(views, routeConfig, routeOptions) @@ -109,6 +114,7 @@ export function addDynamicRoutes(views: TbSysViewDTO[]) { }) } catch (error) { + console.error('[Workcase] addDynamicRoutes: 添加路由失败', error) throw error } } @@ -119,10 +125,14 @@ export function addDynamicRoutes(views: TbSysViewDTO[]) { * 使用 shared 中的通用 loadViewsFromStorage 方法 * 筛选出 service='workcase' 的视图 */ -export function loadRoutesFromStorage(): boolean { +export async function loadRoutesFromStorage(): Promise { try { console.log('[Workcase] loadRoutesFromStorage: 开始加载动态路由') + // 动态加载 shared 模块 + const { routeUtils } = await loadSharedModules() + const { loadViewsFromStorage } = routeUtils + // 使用 shared 中的通用方法加载视图数据 const allViews = loadViewsFromStorage('loginDomain', 'userViews') @@ -130,7 +140,7 @@ export function loadRoutesFromStorage(): boolean { if (allViews) { // 过滤出 workcase 服务的视图 - const workcaseViews = allViews.filter((view: TbSysViewDTO) => + const workcaseViews = allViews.filter((view: any) => view.service === 'workcase' ) @@ -142,7 +152,7 @@ export function loadRoutesFromStorage(): boolean { } // 使用 Workcase 的 addDynamicRoutes 添加路由 - addDynamicRoutes(workcaseViews) + await addDynamicRoutes(workcaseViews) return true } diff --git a/urbanLifelineWeb/packages/workcase/src/router/index.ts b/urbanLifelineWeb/packages/workcase/src/router/index.ts index a68dc7c8..b5079c55 100644 --- a/urbanLifelineWeb/packages/workcase/src/router/index.ts +++ b/urbanLifelineWeb/packages/workcase/src/router/index.ts @@ -1,11 +1,22 @@ import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router' -// @ts-ignore -import { TokenManager } from 'shared/api' -// @ts-ignore -import { APP_CONFIG } from 'shared/config' -// @ts-ignore import { loadRoutesFromStorage } from './dynamicRoute' +// 同步检查 token(用于非异步场景) +function hasTokenSync(): boolean { + try { + const token = localStorage.getItem('token') + return !!token + } catch { + return false + } +} + +// 动态获取 TokenManager +async function getTokenManager() { + const module = await import('shared/api') + return module.TokenManager +} + // 公开路由(不需要登录认证) const routes: RouteRecordRaw[] = [ { @@ -64,7 +75,8 @@ router.beforeEach(async (to, from, next) => { const newToken = loginDomain.token // 保存到localStorage(覆盖旧的登录状态) - // 只用 TokenManager 存储 token,避免格式不一致 + // 动态获取 TokenManager + const TokenManager = await getTokenManager() TokenManager.setToken(newToken) localStorage.setItem('loginDomain', JSON.stringify(loginDomain)) @@ -80,9 +92,9 @@ router.beforeEach(async (to, from, next) => { } } - // 检查是否需要登录 + // 检查是否需要登录(使用同步方法) const requiresAuth = to.meta.requiresAuth !== false - const hasToken = TokenManager.hasToken() + const hasToken = hasTokenSync() console.log('[Workcase Router] 认证检查:', { requiresAuth, @@ -116,41 +128,45 @@ router.beforeEach(async (to, from, next) => { }) dynamicRoutesLoaded = true - const loaded = loadRoutesFromStorage?.() + try { + const loaded = await loadRoutesFromStorage() - console.log('[Workcase Router] 动态路由加载结果:', loaded) - console.log('[Workcase Router] 当前路径:', to.path) - console.log('[Workcase Router] 所有路由:', router.getRoutes().map(r => r.path)) + console.log('[Workcase Router] 动态路由加载结果:', loaded) + console.log('[Workcase Router] 当前路径:', to.path) + console.log('[Workcase Router] 所有路由:', router.getRoutes().map(r => r.path)) - if (loaded) { - if (to.path === '/') { - // 访问根路径,重定向到第一个可用路由 - const firstRoute = getFirstAvailableRoute() - if (firstRoute && firstRoute !== '/') { - // 只有当第一个路由不是 / 时才重定向,避免无限循环 - console.log('[Workcase Router] 根路径重定向到:', firstRoute) - next({ path: firstRoute, replace: true }) - return + if (loaded) { + if (to.path === '/') { + // 访问根路径,重定向到第一个可用路由 + const firstRoute = getFirstAvailableRoute() + if (firstRoute && firstRoute !== '/') { + // 只有当第一个路由不是 / 时才重定向,避免无限循环 + console.log('[Workcase Router] 根路径重定向到:', firstRoute) + next({ path: firstRoute, replace: true }) + return + } else { + // 第一个路由就是 /,直接放行 + console.log('[Workcase Router] 第一个路由就是根路径,直接放行') + } + } else if (to.path === '/admin') { + // 访问 /admin 路径,重定向到第一个 admin 路由 + const firstAdminRoute = getFirstAdminRoute() + if (firstAdminRoute) { + console.log('[Workcase Router] /admin 重定向到:', firstAdminRoute) + next({ path: firstAdminRoute, replace: true }) + return + } } else { - // 第一个路由就是 /,直接放行 - console.log('[Workcase Router] 第一个路由就是根路径,直接放行') - } - } else if (to.path === '/admin') { - // 访问 /admin 路径,重定向到第一个 admin 路由 - const firstAdminRoute = getFirstAdminRoute() - if (firstAdminRoute) { - console.log('[Workcase Router] /admin 重定向到:', firstAdminRoute) - next({ path: firstAdminRoute, replace: true }) + // 动态路由加载成功,重新导航以匹配新添加的路由 + console.log('[Workcase Router] 动态路由加载成功,重新导航到:', to.path) + next({ ...to, replace: true }) return } } else { - // 动态路由加载成功,重新导航以匹配新添加的路由 - console.log('[Workcase Router] 动态路由加载成功,重新导航到:', to.path) - next({ ...to, replace: true }) - return + console.warn('[Workcase Router] 动态路由加载失败') } - } else { - console.warn('[Workcase Router] 动态路由加载失败') + } catch (error) { + console.error('[Workcase Router] 加载动态路由失败:', error) } } diff --git a/urbanLifelineWeb/packages/workcase/src/views/admin/agent/AgentView.vue b/urbanLifelineWeb/packages/workcase/src/views/admin/agent/AgentView.vue index 1c82e607..aa6c10b8 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/admin/agent/AgentView.vue +++ b/urbanLifelineWeb/packages/workcase/src/views/admin/agent/AgentView.vue @@ -163,7 +163,7 @@ const testAgent = () => { \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase/src/views/admin/log/knowledgeLog/KnowledgeLogView.vue b/urbanLifelineWeb/packages/workcase/src/views/admin/log/knowledgeLog/KnowledgeLogView.vue index 78fccd1f..80cd521f 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/admin/log/knowledgeLog/KnowledgeLogView.vue +++ b/urbanLifelineWeb/packages/workcase/src/views/admin/log/knowledgeLog/KnowledgeLogView.vue @@ -267,7 +267,7 @@ onMounted(() => { diff --git a/urbanLifelineWeb/packages/workcase/src/views/public/AIChat/components/ChatHistory.vue b/urbanLifelineWeb/packages/workcase/src/views/public/AIChat/components/ChatHistory.vue index 459883a6..15fe99e9 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/public/AIChat/components/ChatHistory.vue +++ b/urbanLifelineWeb/packages/workcase/src/views/public/AIChat/components/ChatHistory.vue @@ -48,5 +48,5 @@ const handleLoadChat = (chatId: number) => { diff --git a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatMessage/ChatMessage.vue b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatMessage/ChatMessage.vue index 7b2989c9..ab67cecb 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatMessage/ChatMessage.vue +++ b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/ChatMessage/ChatMessage.vue @@ -351,7 +351,7 @@ watch(activeTab, async (newVal) => { }) \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/MeetingCard/MeetingCard.vue b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/MeetingCard/MeetingCard.vue index 139afc60..479e26ab 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/MeetingCard/MeetingCard.vue +++ b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/MeetingCard/MeetingCard.vue @@ -270,5 +270,5 @@ async function handleJoinMeeting() { } \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/chatRoom/ChatRoom.vue b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/chatRoom/ChatRoom.vue index 137e654c..b387f455 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/chatRoom/ChatRoom.vue +++ b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/chatRoom/ChatRoom.vue @@ -459,5 +459,5 @@ defineExpose({ \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/chatRoom/CommentMessageCard/CommentMessageCard.vue b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/chatRoom/CommentMessageCard/CommentMessageCard.vue index f068c022..d15adc32 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/chatRoom/CommentMessageCard/CommentMessageCard.vue +++ b/urbanLifelineWeb/packages/workcase/src/views/public/ChatRoom/chatRoom/CommentMessageCard/CommentMessageCard.vue @@ -130,5 +130,5 @@ const handleSubmit = async () => { diff --git a/urbanLifelineWeb/packages/workcase/src/views/public/JitsiMeeting/JitsiMeetingView.vue b/urbanLifelineWeb/packages/workcase/src/views/public/JitsiMeeting/JitsiMeetingView.vue index 435290d6..b4b63b6f 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/public/JitsiMeeting/JitsiMeetingView.vue +++ b/urbanLifelineWeb/packages/workcase/src/views/public/JitsiMeeting/JitsiMeetingView.vue @@ -53,7 +53,7 @@ const getMeetingParams = () => { } // 加载 Jitsi External API 脚本 -const loadJitsiScript = (): Promise => { +const loadJitsiScript = (jitsiServerUrl: string): Promise => { return new Promise((resolve, reject) => { // 检查是否已经加载 if ((window as any).JitsiMeetExternalAPI) { @@ -61,16 +61,19 @@ const loadJitsiScript = (): Promise => { return } + // 从 jitsiServerUrl 提取域名 + const urlObj = new URL(jitsiServerUrl) + const scriptUrl = `${urlObj.protocol}//${urlObj.host}/external_api.js` + const script = document.createElement('script') - // 从 Jitsi 子域名加载 External API - script.src = 'https://org.xyzh.yslg.jitsi/external_api.js' + script.src = scriptUrl script.async = true script.onload = () => { - console.log('[JitsiMeetingView] Jitsi External API 脚本加载成功') + console.log('[JitsiMeetingView] Jitsi External API 脚本加载成功:', scriptUrl) resolve() } script.onerror = () => { - reject(new Error('加载 Jitsi External API 失败')) + reject(new Error('加载 Jitsi External API 失败: ' + scriptUrl)) } document.head.appendChild(script) }) @@ -85,8 +88,8 @@ const initJitsiMeet = async (jitsiServerUrl: string, roomName: string, jwt: stri name: displayName }) - // 加载 External API 脚本 - await loadJitsiScript() + // 加载 External API 脚本(从服务器URL动态获取) + await loadJitsiScript(jitsiServerUrl) const JitsiMeetExternalAPI = (window as any).JitsiMeetExternalAPI @@ -316,5 +319,5 @@ onUnmounted(() => { diff --git a/urbanLifelineWeb/packages/workcase/src/views/public/workcase/WorkcaseDetail/WorkcaseDetail.vue b/urbanLifelineWeb/packages/workcase/src/views/public/workcase/WorkcaseDetail/WorkcaseDetail.vue index bc946d49..1e5ae0b7 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/public/workcase/WorkcaseDetail/WorkcaseDetail.vue +++ b/urbanLifelineWeb/packages/workcase/src/views/public/workcase/WorkcaseDetail/WorkcaseDetail.vue @@ -747,5 +747,5 @@ const submitProcessRecord = async () => { \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase/vite.config.ts b/urbanLifelineWeb/packages/workcase/vite.config.ts index 0b4f85e0..00e663b4 100644 --- a/urbanLifelineWeb/packages/workcase/vite.config.ts +++ b/urbanLifelineWeb/packages/workcase/vite.config.ts @@ -9,84 +9,115 @@ import fs from 'fs' const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename) -export default defineConfig(({ mode }) => ({ - // 开发和生产环境都通过nginx代理访问/workcase - base: '/workcase/', - - plugins: [ - vue({ - script: { - defineModel: true, - propsDestructure: true - } - }), - vueJsx(), - federation({ - name: 'workcase', - remotes: { +// 开发环境 shared 模块地址 +const DEV_SHARED_URL = 'https://localhost:7000/shared/remoteEntry.js' +// 生产环境使用相对路径,通过 Nginx 代理访问 +const PROD_SHARED_URL = '/shared/remoteEntry.js' + +export default defineConfig(({ mode, command }) => { + // dev 和 preview 都需要访问本地 shared 服务 + // command: 'serve' (dev), 'build', 或通过环境变量判断 preview + const isDev = mode === 'development' + // preview 模式通过 nginx 代理访问 shared,使用相对路径 + const sharedEntry = isDev ? DEV_SHARED_URL : PROD_SHARED_URL + + return { + base: '/workcase/', + + plugins: [ + vue({ + script: { + defineModel: true, + propsDestructure: true + } + }), + vueJsx(), + federation({ + name: 'workcase', + remotes: { + shared: { + type: 'module', + name: 'shared', + entry: sharedEntry + } + }, shared: { - type: 'module', - name: 'shared', - entry: 'https://org.xyzh.yslg/shared/remoteEntry.js' + vue: {}, + 'vue-router': {}, + 'element-plus': {}, + axios: {} } + }) + ], + + define: { + __VUE_OPTIONS_API__: true, + __VUE_PROD_DEVTOOLS__: true, + __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true, + global: 'globalThis' + }, + + resolve: { + alias: { + '@': resolve(__dirname, 'src') + } + }, + + server: { + port: 7003, + host: true, + cors: true, + open: '/workcase/', + https: (() => { + try { + return { + key: fs.readFileSync('C:/Users/FK05/443/localhost+3-key.pem'), + cert: fs.readFileSync('C:/Users/FK05/443/localhost+3.pem') + } + } catch { + return undefined + } + })(), + hmr: { + path: '/@vite/client', + port: 7003 }, - shared: { - vue: {}, - 'vue-router': {}, - 'element-plus': {}, - axios: {} - } - }) - ], - - define: { - __VUE_OPTIONS_API__: true, - __VUE_PROD_DEVTOOLS__: true, - __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: true, - global: 'globalThis' - }, - - resolve: { - alias: { - '@': resolve(__dirname, 'src') - } - }, - - server: { - port: 7003, - host: true, - cors: true, - open: '/workcase/', // 开发时自动打开到 /workcase/ 路径 - // HTTPS 配置(使用 mkcert 生成的本地开发证书) - https: { - key: fs.readFileSync('C:/Users/FK05/443/localhost+3-key.pem'), - cert: fs.readFileSync('C:/Users/FK05/443/localhost+3.pem') - }, - hmr: { - // 修复 base 路径导致的 WebSocket 连接问题 - path: '/@vite/client', - port: 7003 - }, - proxy: { - '/api': { - target: 'http://localhost:8180', - changeOrigin: true, - ws: true, // 启用 WebSocket 代理 - rewrite: (path: string) => path.replace(/^\/api/, '') - } - } - }, - - build: { - outDir: 'dist', - sourcemap: true, - rollupOptions: { - output: { - manualChunks: { - 'vue-vendor': ['vue', 'vue-router', 'pinia'], - 'element-plus': ['element-plus'] + proxy: { + '/api': { + target: 'http://localhost:8180', + changeOrigin: true, + ws: true, + rewrite: (path: string) => path.replace(/^\/api/, '') } } + }, + preview: { + port: 7003, + host: true, + cors: true, + https: (() => { + try { + return { + key: fs.readFileSync('C:/Users/FK05/443/localhost+3-key.pem'), + cert: fs.readFileSync('C:/Users/FK05/443/localhost+3.pem') + } + } catch { + return undefined + } + })(), + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type, Authorization' + } + }, + build: { + target: 'esnext', + outDir: 'dist', + sourcemap: true + // 注意:不要使用 manualChunks 分割 vue/vue-router/element-plus + // 因为它们已经在 Module Federation 的 shared 中声明 + // 同时使用会导致循环依赖死锁 } } -})) +}) diff --git a/urbanLifelineWeb/packages/workcase_wechat/App.uvue b/urbanLifelineWeb/packages/workcase_wechat/App.uvue index f15c6008..60d3eefd 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/App.uvue +++ b/urbanLifelineWeb/packages/workcase_wechat/App.uvue @@ -39,44 +39,6 @@ // 检查并选择模式 checkModeSelection() { const mode = uni.getStorageSync('userMode') - if (!mode) { - this.showModeSelector() - } - }, - // 显示模式选择器 - showModeSelector() { - uni.showActionSheet({ - itemList: ['员工模式 (17857100375)', '访客模式 (17857100377)'], - success: (res) => { - let wechatId = '' - let userMode = '' - let phone = '' - if (res.tapIndex === 0) { - wechatId = '17857100375' - phone = '17857100375' - userMode = 'staff' - } else { - wechatId = '17857100377' - phone = '17857100377' - userMode = 'guest' - } - // 存储选择 - uni.setStorageSync('userMode', userMode) - uni.setStorageSync('wechatId', wechatId) - uni.setStorageSync('phone', phone) - console.log('已选择模式:', userMode, 'wechatId:', wechatId) - uni.showToast({ - title: userMode === 'staff' ? '员工模式' : '访客模式', - icon: 'success' - }) - }, - fail: () => { - // 用户取消,默认使用访客模式 - uni.setStorageSync('userMode', 'guest') - uni.setStorageSync('wechatId', '17857100377') - console.log('默认使用访客模式') - } - }) } } } diff --git a/urbanLifelineWeb/packages/workcase_wechat/api/ai/aiChat.ts b/urbanLifelineWeb/packages/workcase_wechat/api/ai/aiChat.ts index aaa0dc05..ab2dd6ac 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/api/ai/aiChat.ts +++ b/urbanLifelineWeb/packages/workcase_wechat/api/ai/aiChat.ts @@ -1,5 +1,6 @@ import { request, uploadFile } from '../base' import type { ResultDomain } from '../../types' +import { BASE_URL } from '../../config' import type { TbChat, TbChatMessage, @@ -21,8 +22,50 @@ declare const uni: { request: (options: any) => any } -// API 基础配置 -const BASE_URL = 'http://localhost:8180' +/** + * ArrayBuffer 转字符串(兼容微信小程序真机环境) + * 微信小程序真机不支持 TextDecoder,需要手动解码 UTF-8 + */ +function arrayBufferToString(buffer: ArrayBuffer): string { + // 优先使用 TextDecoder(开发者工具和支持的环境) + if (typeof TextDecoder !== 'undefined') { + return new TextDecoder('utf-8').decode(new Uint8Array(buffer)) + } + + // 微信小程序真机兼容方案:手动解码 UTF-8 + const bytes = new Uint8Array(buffer) + let result = '' + let i = 0 + + while (i < bytes.length) { + const byte1 = bytes[i++] + + if (byte1 < 0x80) { + // 单字节字符 (0xxxxxxx) + result += String.fromCharCode(byte1) + } else if ((byte1 & 0xE0) === 0xC0) { + // 双字节字符 (110xxxxx 10xxxxxx) + const byte2 = bytes[i++] & 0x3F + result += String.fromCharCode(((byte1 & 0x1F) << 6) | byte2) + } else if ((byte1 & 0xF0) === 0xE0) { + // 三字节字符 (1110xxxx 10xxxxxx 10xxxxxx) - 中文常用 + const byte2 = bytes[i++] & 0x3F + const byte3 = bytes[i++] & 0x3F + result += String.fromCharCode(((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3) + } else if ((byte1 & 0xF8) === 0xF0) { + // 四字节字符 (11110xxx 10xxxxxx 10xxxxxx 10xxxxxx) - emoji等 + const byte2 = bytes[i++] & 0x3F + const byte3 = bytes[i++] & 0x3F + const byte4 = bytes[i++] & 0x3F + const codePoint = ((byte1 & 0x07) << 18) | (byte2 << 12) | (byte3 << 6) | byte4 + // 转换为 UTF-16 代理对 + const surrogate = codePoint - 0x10000 + result += String.fromCharCode(0xD800 + (surrogate >> 10), 0xDC00 + (surrogate & 0x3FF)) + } + } + + return result +} /** * @description AI对话相关接口(直接调用ai模块) @@ -130,8 +173,8 @@ export const aiChatAPI = { // 监听分块数据 requestTask.onChunkReceived((res: any) => { try { - const decoder = new TextDecoder('utf-8') - const text = decoder.decode(new Uint8Array(res.data)) + // 兼容微信小程序真机环境(不支持 TextDecoder) + const text = arrayBufferToString(res.data) const lines = text.split('\n') for (const line of lines) { diff --git a/urbanLifelineWeb/packages/workcase_wechat/api/base.ts b/urbanLifelineWeb/packages/workcase_wechat/api/base.ts index 00a68aae..b6f4c55b 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/api/base.ts +++ b/urbanLifelineWeb/packages/workcase_wechat/api/base.ts @@ -6,8 +6,12 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ declare const uni: { getStorageSync: (key: string) => any + removeStorageSync: (key: string) => void + setStorageSync: (key: string, data: any) => void request: (options: any) => void uploadFile: (options: any) => void + showToast: (options: any) => void + reLaunch: (options: any) => void } import type { ResultDomain } from '../types' @@ -36,6 +40,10 @@ export function request(options: { success: (res: any) => { if (res.statusCode === 200) { resolve(res.data as ResultDomain) + } else if (res.statusCode === 401) { + // Token 过期或无效,清除缓存并跳转到授权页面 + handleTokenExpired() + reject(new Error('登录已过期,请重新登录')) } else { reject(new Error(`请求失败: ${res.statusCode}`)) } @@ -47,6 +55,30 @@ export function request(options: { }) } +// 处理 Token 过期 +function handleTokenExpired() { + // 清除所有登录信息 + uni.removeStorageSync('token') + uni.removeStorageSync('userInfo') + uni.removeStorageSync('loginDomain') + uni.removeStorageSync('wechatId') + uni.removeStorageSync('nickname') + + // 提示用户 + uni.showToast({ + title: '登录已过期,正在重新登录', + icon: 'none', + duration: 2000 + }) + + // 刷新页面,触发自动登录 + setTimeout(() => { + uni.reLaunch({ + url: '/pages/index/index' + }) + }, 2000) +} + // 文件上传方法 export function uploadFile(options: { url: string @@ -71,6 +103,10 @@ export function uploadFile(options: { if (res.statusCode === 200) { const result = typeof res.data === 'string' ? JSON.parse(res.data) : res.data resolve(result as ResultDomain) + } else if (res.statusCode === 401) { + // Token 过期或无效 + handleTokenExpired() + reject(new Error('登录已过期,请重新登录')) } else { reject(new Error(`上传失败: ${res.statusCode}`)) } @@ -84,3 +120,12 @@ export function uploadFile(options: { }) }) } + +// 导出清除登录信息的方法,供其他地方使用 +export function clearLoginInfo() { + uni.removeStorageSync('token') + uni.removeStorageSync('userInfo') + uni.removeStorageSync('loginDomain') + uni.removeStorageSync('wechatId') + uni.removeStorageSync('nickname') +} diff --git a/urbanLifelineWeb/packages/workcase_wechat/api/workcase/workcase.ts b/urbanLifelineWeb/packages/workcase_wechat/api/workcase/workcase.ts index d79eff4f..d5a304a0 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/api/workcase/workcase.ts +++ b/urbanLifelineWeb/packages/workcase_wechat/api/workcase/workcase.ts @@ -38,6 +38,14 @@ export const workcaseAPI = { return request({ url: `${this.baseUrl}/${workcaseId}`, method: 'DELETE' }) }, + /** + * 撤销工单 + * @param workcaseId 工单ID + */ + revokeWorkcase(workcaseId: string): Promise> { + return request({ url: `${this.baseUrl}/revoke/${workcaseId}`, method: 'POST' }) + }, + /** * 获取工单详情 * @param workcaseId 工单ID diff --git a/urbanLifelineWeb/packages/workcase_wechat/api/workcase/workcaseChat.ts b/urbanLifelineWeb/packages/workcase_wechat/api/workcase/workcaseChat.ts index ae02c07a..972d8896 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/api/workcase/workcaseChat.ts +++ b/urbanLifelineWeb/packages/workcase_wechat/api/workcase/workcaseChat.ts @@ -1,6 +1,6 @@ import { request } from '../base' import type { ResultDomain, PageRequest } from '../../types' -import type { TbWorkcaseDTO } from '../../types/workcase/workcase' +import { BASE_URL } from '../../config' import type { TbChatRoomDTO, TbChatRoomMemberDTO, @@ -23,7 +23,8 @@ import type { ChatMessageListParam, SSECallbacks, SSETask, - SSEMessageData + SSEMessageData, + TbWorkcaseDTO } from '../../types/ai/aiChat' /* eslint-disable @typescript-eslint/no-explicit-any */ @@ -32,9 +33,6 @@ declare const uni: { request: (options: any) => any } -// API 基础配置 -const BASE_URL = 'http://localhost:8180' - /** * @description 工单对话相关接口 * @filename workcaseChat.ts diff --git a/urbanLifelineWeb/packages/workcase_wechat/config/index.ts b/urbanLifelineWeb/packages/workcase_wechat/config/index.ts index 2a1b5669..b15949c8 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/config/index.ts +++ b/urbanLifelineWeb/packages/workcase_wechat/config/index.ts @@ -1,4 +1,7 @@ -export const AGENT_ID = '17664699513920001' -export const BASE_URL = 'http://localhost:8180' -export const WS_HOST = 'localhost:8180' // WebSocket host(不包含协议) -export const FILE_DOWNLOAD_URL = 'http://localhost:8180/urban-lifeline/sys-file/download?fileId=' \ No newline at end of file +export const AGENT_ID = '17678420499370001' +// export const BASE_URL = 'http://localhost:8180' +// 根据宝塔nginx配置,/urban-lifeline/ 会代理到后端网关 +export const BASE_URL = 'https://demo-urbanlifeline.tensorgrove.com/urban-lifeline' + +// export const WS_HOST = 'localhost:8180' // WebSocket host(不包含协议) +export const WS_HOST = 'demo-urbanlifeline.tensorgrove.com/urban-lifeline' // WebSocket host(不包含协议) \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase_wechat/manifest.json b/urbanLifelineWeb/packages/workcase_wechat/manifest.json index e03c5d9d..3ec80b3f 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/manifest.json +++ b/urbanLifelineWeb/packages/workcase_wechat/manifest.json @@ -1,15 +1,17 @@ { "name" : "泰豪小电", - "appid" : "", + "appid" : "__UNI__69FD573", "description" : "泰豪小电智能工单系统", "versionName" : "1.0.0", "versionCode" : "100", "uni-app-x" : {}, "quickapp" : {}, "mp-weixin" : { - "appid" : "", + "appid" : "wx3708f41b1dc31f52", "setting" : { - "urlCheck" : false + "urlCheck" : true, + "postcss" : true, + "minified" : true }, "usingComponents" : true, "permission" : { @@ -59,5 +61,40 @@ } } } + }, + "app-android" : { + "distribute" : { + "permissions" : [ + "", + "", + "" + ], + "modules" : {}, + "icons" : { + "hdpi" : "", + "xhdpi" : "", + "xxhdpi" : "", + "xxxhdpi" : "" + }, + "splashScreens" : { + "default" : {} + } + } + }, + "app-ios" : { + "distribute" : { + "privacyDescription" : { + "NSCameraUsageDescription" : "用于视频会议时开启摄像头", + "NSMicrophoneUsageDescription" : "用于视频会议时开启麦克风" + }, + "modules" : {}, + "icons" : {}, + "splashScreens" : {} + } + }, + "web" : { + "router" : { + "mode" : "" + } } } diff --git a/urbanLifelineWeb/packages/workcase_wechat/pages/chatRoom/chatRoom/chatRoom.uvue b/urbanLifelineWeb/packages/workcase_wechat/pages/chatRoom/chatRoom/chatRoom.uvue index fa2be217..b68f6909 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/pages/chatRoom/chatRoom/chatRoom.uvue +++ b/urbanLifelineWeb/packages/workcase_wechat/pages/chatRoom/chatRoom/chatRoom.uvue @@ -79,9 +79,9 @@ - + - + {{ msg.senderName?.charAt(0) || '客' }} @@ -174,11 +174,25 @@ const currentUserName = ref('我') function loadUserInfo() { try { const userInfo = uni.getStorageSync('userInfo') + const loginDomain = uni.getStorageSync('loginDomain') if (userInfo) { const user = typeof userInfo === 'string' ? JSON.parse(userInfo) : userInfo currentUserId.value = user.userId || user.id || '' - currentUserName.value = user.username || user.nickName || '我' + // 优先从 loginDomain.userInfo 获取用户名 + if (loginDomain) { + const domain = typeof loginDomain === 'string' ? JSON.parse(loginDomain) : loginDomain + if (domain.userInfo && domain.userInfo.username) { + currentUserName.value = domain.userInfo.username + } else if (domain.userInfo && domain.userInfo.realName) { + currentUserName.value = domain.userInfo.realName + } else { + currentUserName.value = user.username || user.nickName || user.realName || user.name || '用户' + } + } else { + currentUserName.value = user.username || user.nickName || user.realName || user.name || '用户' + } } + console.log('[chatRoom] 用户信息:', currentUserId.value, currentUserName.value) } catch (e) { console.error('获取用户信息失败:', e) } @@ -739,7 +753,7 @@ async function initWebSocket() { // 构建WebSocket URL // 开发环境:ws://localhost:8180 或 ws://192.168.x.x:8180 // 生产环境:wss://your-domain.com - const protocol = 'ws:' // 开发环境使用ws,生产环境改为wss + const protocol = 'wss:' // 开发环境使用ws,生产环境改为wss // 小程序使用原生WebSocket端点(不是SockJS端点) const wsUrl = `${protocol}//${WS_HOST}/urban-lifeline/workcase/ws/chat?token=${encodeURIComponent(token)}` diff --git a/urbanLifelineWeb/packages/workcase_wechat/pages/chatRoom/chatRoomList/chatRoomList.uvue b/urbanLifelineWeb/packages/workcase_wechat/pages/chatRoom/chatRoomList/chatRoomList.uvue index cb7f3d19..fdb08999 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/pages/chatRoom/chatRoomList/chatRoomList.uvue +++ b/urbanLifelineWeb/packages/workcase_wechat/pages/chatRoom/chatRoomList/chatRoomList.uvue @@ -227,7 +227,7 @@ async function initWebSocket() { // 构建WebSocket URL // 开发环境:ws://localhost:8180 或 ws://192.168.x.x:8180 // 生产环境:wss://your-domain.com - const protocol = 'ws:' // 开发环境使用ws,生产环境改为wss + const protocol = 'wss:' // 开发环境使用ws,生产环境改为wss // 小程序使用原生WebSocket端点(不是SockJS端点) const wsUrl = `${protocol}//${WS_HOST}/urban-lifeline/workcase/ws/chat?token=${encodeURIComponent(token)}` diff --git a/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.scss b/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.scss index 16853d0b..6e41a812 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.scss +++ b/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.scss @@ -80,6 +80,15 @@ font-weight: 500; } +// 退出按钮特殊样式 +.logout-btn { + background: rgba(255, 59, 48, 0.1); + + .btn-text { + color: #ff3b30; + } +} + // 欢迎区域(机器人+浮动标签) .hero { position: relative; @@ -803,3 +812,144 @@ .modal-btn .btn-text { font-size: 16px; } + +// 手机号授权弹窗样式 +.phone-auth-modal { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 1001; + display: flex; + align-items: center; + justify-content: center; +} + +.phone-auth-content { + width: 85%; + max-width: 340px; + padding: 30px 24px; +} + +.phone-auth-body { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; +} + +.auth-icon-wrap { + width: 80px; + height: 80px; + border-radius: 50%; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 20px; +} + +.auth-icon { + font-size: 40px; +} + +.auth-desc { + font-size: 14px; + color: #666; + line-height: 1.6; + margin-bottom: 10px; +} + +.phone-auth-footer { + flex-direction: column; + gap: 12px; +} + +.phone-auth-btn { + width: 100%; + height: 48px; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + border-radius: 24px; + margin: 0; + padding: 0; +} + +.phone-auth-btn .btn-text { + color: white; + font-size: 16px; + font-weight: 600; +} + +.phone-auth-btn::after { + border: none; +} + +.skip-auth-btn { + width: 100%; + height: 40px; + background: transparent; + border-radius: 20px; + margin: 0; + padding: 0; +} + +.skip-auth-btn .skip-text { + color: #999; + font-size: 14px; + font-weight: 400; +} + +.skip-auth-btn::after { + border: none; +} + +// 模拟用户选择列表样式 +.mock-user-list { + display: flex; + flex-direction: column; + gap: 16px; + max-height: 400px; + overflow-y: auto; +} + +.mock-user-group { + display: flex; + flex-direction: column; + gap: 8px; +} + +.group-title { + font-size: 13px; + color: #999; + font-weight: 500; + padding-left: 4px; + margin-bottom: 4px; +} + +.mock-user-item { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + padding: 12px 16px; + background: #f8f9fa; + border-radius: 12px; + transition: all 0.2s; +} + +.mock-user-item:active { + background: #e9ecef; + transform: scale(0.98); +} + +.user-name { + font-size: 16px; + color: #333; + font-weight: 500; +} + +.user-phone { + font-size: 14px; + color: #666; +} diff --git a/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.uvue b/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.uvue index 3744829a..4a125390 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.uvue +++ b/urbanLifelineWeb/packages/workcase_wechat/pages/index/index.uvue @@ -4,8 +4,8 @@ 泰豪小电 -