Dify 框架连接 PGSQL 数据库与 Sandbox 环境下的 Linux 系统调用权限问题

Dify 框架连接 PGSQL 数据库与 Sandbox 环境下的 Linux 系统调用权限问题

背景

在使用 Dify 框架进行开发时,遇到了两个主要的技术挑战:

  1. 代码节点连接到 PGSQL(PostgreSQL)数据库
  2. 解决沙盒环境中由于系统调用限制导致的“operation not permitted”错误

本文档将详细描述如何解决这两个问题,并介绍 psycopg2-binary Python 依赖的作用及其配置方法。同时,我们将强调配置文件修改后正确重启服务的重要性。

技术解决方案

PGSQL 数据库连接

为了使基于 Python 的 Dify 应用能够与 PostgreSQL 数据库通信,我们在 volumessandboxdependenciespython-requirements.txt 文件中添加了 psycopg2-binary==2.9.10 依赖。该库提供了一个 PostgreSQL 数据库适配器,它包含了预编译的二进制文件,简化了安装过程,避免了需要单独编译 C 扩展的问题。

# volumes/sandbox/dependencies/python-requirements.txt
psycopg2-binary==2.9.10

当 Docker Compose 构建服务时,它会读取此文件并安装列出的所有 Python 包,包括 psycopg2-binary,从而为应用程序提供与 PGSQL 数据库交互的能力。安装完成后,通过代码节点配置应用中的数据库连接参数(如主机、端口、用户名、密码等),实现了代码节点与 PGSQL 数据库的成功连接。

Sandbox 中的 Linux 系统调用权限问题

在尝试运行代码节点时,遇到了如下错误信息:

error: operation not permitted

此错误表明应用程序尝试执行的操作被操作系统或沙盒环境所禁止。经分析,确定这是由于沙盒环境中对特定 Linux 系统调用的访问权限不足造成的。

为了解决这个问题,采取了以下步骤:

  • 调整沙盒策略:在 volumessandboxconfconfig.yaml 文件中扩展了 allowed_syscalls 列表,以允许必要的系统调用。这确保了沙盒内的应用程序可以执行所需的底层操作系统功能,而不会遇到权限错误。

下面是一个简化的 config.yaml 配置示例,其中列出了部分关键系统调用编号,表示这些操作是被允许的:

allowed_syscalls:
  # 基础文件操作
  - 0   # read - 从文件描述符读取数据
  - 1   # write - 向文件描述符写入数据
  - 2   # open - 打开文件
  - 3   # close - 关闭文件描述符
  - 4   # stat - 获取文件状态
  - 5   # fstat - 获取文件描述符状态
  - 6   # lstat - 获取符号链接状态
  - 7   # poll - 等待文件描述符上的事件
  - 8   # lseek - 重新定位读/写文件偏移量
  - 9   # mmap - 将文件或设备映射到内存
  - 10  # mprotect - 设置内存区域的保护
  - 11  # munmap - 取消内存映射
  - 12  # brk - 改变数据段大小

  # 系统操作
  - 13  # rt_sigaction - 检查或修改信号处理
  - 14  # rt_sigprocmask - 检查或修改阻塞信号
  - 15  # rt_sigreturn - 从信号处理程序返回
  - 16  # ioctl - 控制设备
  - 17  # pread64 - 从指定偏移量读取
  - 18  # pwrite64 - 向指定偏移量写入
  - 19  # readv - 从文件描述符读取数据到多个缓冲区
  - 20  # writev - 从多个缓冲区写入数据到文件描述符
  - 21  # access - 检查文件访问权限
  - 22  # pipe - 创建管道
  - 23  # select - 同步 I/O 多路复用
  - 24  # sched_yield - 让出处理器
  - 25  # mremap - 重新映射虚拟内存地址

  # 高级内存管理
  - 26  # msync - 同步内存与物理存储
  - 27  # mincore - 确定内存页是否驻留在内存中
  - 28  # madvise - 给出内存使用建议
  - 29  # shmget - 获取共享内存段
  - 30  # shmat - 附加共享内存段
  - 31  # shmctl - 共享内存控制
  - 32  # dup - 复制文件描述符
  - 33  # dup2 - 复制文件描述符到指定编号
  - 34  # pause - 挂起进程直到收到信号

  # 进程管理
  - 35  # nanosleep - 高精度睡眠
  - 36  # getitimer - 获取定时器值
  - 37  # alarm - 设置定时器
  - 38  # setitimer - 设置定时器
  - 39  # getpid - 获取进程ID
  - 40  # sendfile - 在文件描述符之间传输数据

  # 网络操作
  - 41  # socket - 创建套接字
### Dify 连接向量数据库方法 #### 配置环境变量 为了使 Dify 能够连接到向量数据库,如 Milvus,配置文件中的环境变量需要被正确设置。这通常涉及到指定目标向量数据库的服务地址和其他必要的认证信息[^3]。 对于 Milvus 数据库而言,在 `.env` 文件或其他形式的配置文件里应包含如下条目: ```bash MILVUS_HOST=localhost MILVUS_PORT=19530 ``` 这些参数指定了 Milvus 服务所在的主机名以及端口号。如果是在本地环境中测试,则可以采用默认值 `localhost:19530`; 若是远程服务器则需替换为实际 IP 地址和开放给外部访问的端口编号。 #### 修改应用程序代码适配器 除了调整环境变量外,还需要确保应用程序内部逻辑支持所选类型的向量存储解决方案。在某些情况下可能涉及更改数据模型定义或是引入特定 SDK 库来简化交互过程。 例如,当迁移到 Milvus 作为新的向量索引引擎时,应该安装对应的 Python 客户端包并导入相应的模块用于执行 CRUD 操作: ```python from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection connections.connect("default", host='localhost', port='19530') fields = [ FieldSchema(name="id", dtype=DataType.INT64, is_primary=True), FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128) ] schema = CollectionSchema(fields) collection = Collection(name="example_collection", schema=schema) ``` 上述脚本展示了怎样建立 Milvus 实例之间的连接,并创建一个新的集合(类似于传统 SQL 中表的概念),其中包含了两个字段——一个是整数型主键 "id" ,另一个是用来保存浮点数值数组表示法下的嵌入式特征向量 "embedding"[^1]. #### 执行迁移命令 完成以上准备工作之后就可以利用由 Dify 提供的一个名为 vdb-migrate 工具来进行正式的数据转移工作了。此工具会读取当前项目的结构化元数据并将它们映射成适合目的端系统的格式;同时也会处理好所有必要的初始化任务比如建表语句等。 具体来说就是运行下面这条指令启动整个流程: ```shell python manage.py vdb_migrate --target=milvus ``` 这里假设已经按照官方文档说明完成了前置条件搭建并且路径下存在可执行文件 `manage.py`.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值