配置外部 PostgreSQL 数据库
Langflow 默认使用 SQLite 数据库,也可以配置为 PostgreSQL。
本指南介绍如何在本地和容器化环境中,把默认的 SQLite 连接字符串 sqlite:///./langflow.db 替换为 PostgreSQL,为 Langflow 接入外部数据库。
这种配置下,Langflow 的全部结构化应用数据——包括 Flow、消息历史和日志——改由 PostgreSQL 管理。PostgreSQL 对并发用户的支持更稳健,数据完整性特性更完善,扩展性更好,因此更适合生产环境。以 PostgreSQL 作为数据库,Langflow 能更高效地支撑多用户和更大的负载。
- 一个 PostgreSQL 数据库,版本 15 或更高
将 Langflow 连接到本地 PostgreSQL 数据库
Section titled “将 Langflow 连接到本地 PostgreSQL 数据库”-
如果 Langflow 正在运行,用 Ctrl+C 停止。
-
找到 PostgreSQL 数据库的连接字符串,格式为
postgresql://user:password@host:port/dbname。连接字符串中的主机名取决于 PostgreSQL 的运行方式:
- 直接在本机运行 PostgreSQL,用
localhost。 - 在 Docker Compose 中运行,用服务名,如
postgres。 - 用
docker run在单独容器中运行,用容器的 IP 地址或网络别名。 - 使用云托管 PostgreSQL,服务商会提供包含用户名和密码的连接字符串。
- 直接在本机运行 PostgreSQL,用
-
编辑或创建 Langflow
.env文件:终端窗口 touch .env可以用 Langflow 仓库中的
.env.example文件作为模板。 -
在
.env文件中把LANGFLOW_DATABASE_URL设为你的 PostgreSQL 连接字符串:LANGFLOW_DATABASE_URL="postgresql://user:password@localhost:5432/dbname"Langflow 通过 SQLAlchemy 和 psycopg 驱动把 SSL 参数直接传给 PostgreSQL 连接。
支持以下 SSL 模式:
-
sslmode=require:要求 SSL 连接,但不验证服务器证书。安全性最低,但对多数场景可以接受。终端窗口 LANGFLOW_DATABASE_URL="postgresql://user:password@localhost:5432/dbname?sslmode=require" -
sslmode=verify-ca:要求 SSL,并对照证书颁发机构(CA)验证服务器证书。把证书路径加入连接字符串:终端窗口 LANGFLOW_DATABASE_URL="postgresql://user@localhost:5432/dbname?sslmode=verify-ca&sslcert=/path/to/client.crt&sslkey=/path/to/client.key&sslrootcert=/path/to/ca.crt" -
sslmode=verify-full:要求 SSL,验证服务器证书,并核对请求主机名与证书主机名。本例中的db.example.com必须与服务器证书的 CN 一致。安全性最高。终端窗口 LANGFLOW_DATABASE_URL="postgresql://user@db.example.com:5432/dbname?sslmode=verify-full&sslcert=/path/to/client.crt&sslkey=/path/to/client.key&sslrootcert=/path/to/ca.crt"不要把 Langflow 环境变量
LANGFLOW_SSL_CERT_FILE和LANGFLOW_SSL_KEY_FILE用于 PostgreSQL 证书:这两个变量用于给 Langflow 服务器启用 HTTPS,与 PostgreSQL 数据库连接无关。有关 PostgreSQL 中 SSL 证书管理的更多信息,见 PostgreSQL 文档。
-
-
保存修改,然后用
.env文件启动 Langflow:终端窗口 uv run langflow run --env-file .env可选的连接池和超时设置见配置外部内存。
-
在 Langflow 中运行任意 Flow,产生访问流量。
-
检查 PostgreSQL 数据库的表和活动,确认运行 Flow 后新建了表、产生了流量。
用 docker-compose.yml 部署 Langflow 与 PostgreSQL 容器
Section titled “用 docker-compose.yml 部署 Langflow 与 PostgreSQL 容器”把 Langflow 和 PostgreSQL 容器放到同一个 Docker 网络中启动,能保证服务间正常连通。示例见 Langflow 仓库中的 docker-compose.yml 文件。
示例 docker-compose.yml 还为 Langflow 和 PostgreSQL 数据配置了持久化卷。持久化卷把容器内的目录映射到宿主机存储,数据因此在容器重启后仍然保留。
Docker Compose 会为 docker-compose.yml 中定义的所有服务创建一个隔离网络,服务之间可以用服务名当主机名互相访问,比如数据库 URL 中的 postgres。反之,如果用 docker run 单独启动 PostgreSQL,它会与 Langflow 容器处于不同网络,Langflow 就无法用服务名连接 PostgreSQL。
要用示例 Docker Compose 文件启动 Langflow 和 PostgreSQL 服务,进入 langflow/docker_example 目录后运行 docker-compose up。如果用的是自己的 docker-compose.yml,请在该文件所在目录运行 docker-compose up。
用共享 PostgreSQL 数据库部署多个 Langflow 实例
Section titled “用共享 PostgreSQL 数据库部署多个 Langflow 实例”要让多个 Langflow 实例共享同一个 PostgreSQL 数据库,在 docker-compose.yml 中加入多个 Langflow 服务即可。
本示例让 docker-compose.yml 从 Langflow 的 .env 文件读取变量值,这样部署变量只需要维护一个文件,不必在多个文件之间来回复制。
-
在
.env文件中填入 PostgreSQL 数据库的值:POSTGRES_USER=langflowPOSTGRES_PASSWORD=your_secure_passwordPOSTGRES_DB=langflowPOSTGRES_HOST=postgresPOSTGRES_PORT=5432LANGFLOW_CONFIG_DIR=app/langflowLANGFLOW_PORT_1=7860LANGFLOW_PORT_2=7861LANGFLOW_HOST=0.0.0.0可选的连接池和超时设置见配置外部内存。
-
在
docker-compose.yml中引用这些变量。例如:services:postgres:# Pinned to a specific Debian base (trixie) so the postgres:16 tag does# not silently roll its OS, which triggers a glibc collation mismatch# warning on existing volumes. See https://github.com/langflow-ai/langflow/issues/9608image: postgres:16-trixieenvironment:- POSTGRES_USER=${POSTGRES_USER}- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}- POSTGRES_DB=${POSTGRES_DB}ports:- "${POSTGRES_PORT}:5432"volumes:- langflow-postgres:/var/lib/postgresql/datalangflow-1:image: langflowai/langflow:latestpull_policy: alwaysports:- "${LANGFLOW_PORT_1}:7860"depends_on:- postgresenvironment:- LANGFLOW_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}- LANGFLOW_CONFIG_DIR=${LANGFLOW_CONFIG_DIR}- LANGFLOW_HOST=${LANGFLOW_HOST}- PORT=7860volumes:- langflow-data-1:/app/langflowlangflow-2:image: langflowai/langflow:latestpull_policy: alwaysports:- "${LANGFLOW_PORT_2}:7860"depends_on:- postgresenvironment:- LANGFLOW_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}- LANGFLOW_CONFIG_DIR=${LANGFLOW_CONFIG_DIR}- LANGFLOW_HOST=${LANGFLOW_HOST}- PORT=7860volumes:- langflow-data-2:/app/langflowvolumes:langflow-postgres:langflow-data-1:langflow-data-2: -
用
docker-compose up部署该文件。第一个 Langflow 实例在http://localhost:7860,第二个在http://localhost:7861。 -
要确认两个实例用的是同一个数据库,用
docker exec在 PostgreSQL 容器里启动psql。容器名可能不同。终端窗口 docker exec -it docker-test-postgres-1 psql -U langflow -d langflow -
查询数据库的活动连接:
langflow=# SELECT * FROM pg_stat_activity WHERE datname = 'langflow'; -
检查查询结果中有多个
client_addr不同的连接,例如172.21.0.3和172.21.0.4。每个 Langflow 实例都在 Docker 网络中自己的容器里运行,来源 IP 不同即说明两个实例都连接着 PostgreSQL 数据库。 -
输入
quit退出psql。