LangSmith 使用 PostgreSQL 数据库作为事务工作负载和操作数据(除运行外的几乎所有内容)的主要数据存储。默认情况下,LangSmith 自托管将使用内部 PostgreSQL 数据库。但是,您可以将 LangSmith 配置为使用外部 PostgreSQL 数据库。通过配置外部 PostgreSQL 数据库,您可以更轻松地管理数据库的备份、扩展和其他运维任务。
要求
- * 一个已配置的 PostgreSQL 数据库,您的 LangSmith 实例可以访问该数据库的网络。我们推荐使用托管 PostgreSQL 服务,例如:
- * Amazon RDS
- * Google Cloud SQL
- * Azure Database for PostgreSQL
- * 注意:我们仅正式支持 PostgreSQL 版本 >= 14。
- * 我们支持密码和 IAM/Workload Identity authentication.
- * 一个拥有 PostgreSQL 数据库管理员权限的用户。该用户将用于创建必要的表、索引和模式。
- * This user will also need to have the ability to create extensions in the database. We use/will try to install the
btree_gin,btree_gist,pgcrypto,citext,ltree,以及pg_trgmextensions. - * 如果使用 public 以外的模式,请确保没有其他已启用扩展的模式,否则必须将其包含在您的搜索路径中。
- * 对 pgbouncer 和其他连接池的支持基于社区。社区成员报告称 pgbouncer 已与
pool_mode=session和适合的ignore_startup_parameters设置一起使用(截至撰写本文时,search_path和lock_timeout需要被忽略)。需要注意避免污染连接池;建议具备一定 PostgreSQL 专业知识。LangChain Inc 目前没有对 pgbouncer 或 Amazon RDS Proxy 或任何其他连接池进行正式测试或商业支持的路线图计划,但欢迎社区通过 GitHub issues 进行讨论和协作支持。 - * 默认情况下,我们推荐使用具有 **至少 2 个 vCPU 和 8GB 内存的实例**。但是,实际需求将取决于您的工作负载和用户数量。我们建议监控您的 PostgreSQL 实例并根据需要进行扩展。
连接字符串
您需要提供 PostgreSQL 数据库的连接字符串。此连接字符串应包含以下信息:
- * 主机
- * 端口
- * 数据库
- * 用户名
- * 密码(如果有任何特殊字符,请务必对其进行 URL 编码)- **Note:** 使用 IAM 身份验证时,连接字符串中不需要密码。详见下文。
- * URL 参数
形式如下:
username:password@host:port/database?<url_params>
连接字符串示例可能如下:
myuser:mypassword@myhost:5432/mydatabase?sslmode=disable
如果没有 URL 参数,连接字符串将如下所示:
myuser:mypassword@myhost:5432/mydatabase
对于 IAM 身份验证,请省略密码并使用身份名称作为用户名:
my-workload-identity@myhost:5432/mydatabase?sslmode=require
配置
拿到连接字符串后,您可以将 LangSmith 实例配置为使用外部 PostgreSQL 数据库。您可以通过修改 values 文件来执行此操作,适用于您的 LangSmith Helm Chart 安装或 .env 文件适用于您的 Docker 安装。
postgres:
external:
enabled: true
connectionUrl: "Your connection url"
# In your .env file
POSTGRES_DATABASE_URI="Your connection url"
配置完成后,您应该能够重新安装您的 LangSmith 实例。如果一切配置正确,您的 LangSmith 实例现在应该正在使用您的外部 PostgreSQL 数据库。
PostgreSQL 的 TLS
Use this section to configure TLS for PostgreSQL connections. For mounting internal/public CAs so LangSmith trusts your PostgreSQL server certificate, see 配置自定义 TLS 证书.
服务器 TLS(单向)
要验证 PostgreSQL 服务器证书:
- - 使用以下方式提供 CA 证书包
config.customCa.secretName和config.customCa.secretKey. - - 使用
sslmode=requireorsslmode=verify-full以及sslrootcert=system添加到您的连接 URL。
config:
customCa:
secretName: "langsmith-custom-ca" # Secret containing your CA bundle
secretKey: "ca.crt" # Key in the Secret with the CA bundle
postgres:
external:
enabled: true
connectionUrl: "myuser:mypassword@myhost:5432/mydatabase?sslmode=verify-full&sslrootcert=system"
customTls: true
apiVersion: v1
kind: Secret
metadata:
name: langsmith-custom-ca
type: Opaque
stringData:
ca.crt: |
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
带有客户端身份验证的相互 TLS(mTLS)
从 LangSmith helm chart 版本 **0.12.29**开始,我们支持 PostgreSQL 客户端的 mTLS。对于 mTLS 中的服务器端身份验证,除了以下客户端证书配置外,还请使用 服务器 TLS 步骤 (自定义 CA)。
如果您的 PostgreSQL 服务器需要客户端证书身份验证:
- - 使用您的客户端证书和密钥提供一个 Secret。
- - 通过以下方式引用它
postgres.external.clientCert.secretName并使用以下方式指定密钥certSecretKey和keySecretKey. - - 使用
sslmode=verify-full和sslrootcert=system在您的连接 URL 中。
postgres:
external:
enabled: true
connectionUrl: "myuser:mypassword@myhost:5432/mydatabase?sslmode=verify-full&sslrootcert=system"
customTls: true
clientCert:
secretName: "postgres-mtls-secret"
certSecretKey: "tls.crt"
keySecretKey: "tls.key"
apiVersion: v1
kind: Secret
metadata:
name: postgres-mtls-secret
type: Opaque
stringData:
tls.crt: |
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
tls.key: |
-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----
证书卷的 Pod 安全上下文
为 mTLS 挂载的证书卷受文件访问限制保护。为了确保所有 LangSmith Pod 都能读取证书文件,您必须在 Pod 安全上下文中设置 fsGroup: 1000 。
您可以通过以下两种方式之一进行配置:
**选项 1:使用 commonPodSecurityContext**
在顶层设置 fsGroup 以将其应用到所有 Pod:
commonPodSecurityContext:
fsGroup: 1000
选项 2:添加到各个 Pod 的安全上下文
如果您需要更精细的控制,请将 fsGroup 添加到每个 Pod 的安全上下文中。请参阅 mTLS 配置示例 以获取完整参考。
IAM 身份验证
从 LangSmith helm chart 版本 **0.12.34**开始,我们支持 PostgreSQL 的 IAM 身份验证。这允许您使用云提供商的 workload identity 而不是静态密码。
AWS
Amazon RDS IAM 身份验证
Amazon RDS 支持 IAM 数据库身份验证,这允许您使用 AWS IAM 凭证而不是数据库密码对 PostgreSQL 实例进行身份验证。
前提条件
- **配置工作负载身份** 在您的 Kubernetes 集群中使用 AWS IRSA or EKS Pod Identity
- **启用 IAM 身份验证** 在您的 RDS PostgreSQL 实例上,并授予对您的工作负载身份的访问权限
配置
设置 iamAuthProvider to "aws" 并提供 IAM 兼容的连接字符串(无密码):
postgres:
external:
enabled: true
existingSecretName: "postgres-secret"
iamAuthProvider: "aws"
apiVersion: v1
kind: Secret
metadata:
name: postgres-secret
type: Opaque
stringData:
# IAM connection URL - note no password, username is the IAM identity name
connection_url: "<iam-identity-name>@<rds-host>:5432/<database>?sslmode=require"
必需的注解
您必须将 AWS IRSA 要求的 ServiceAccount 注解应用到所有连接到 PostgreSQL 的 LangSmith 组件:
Deployments: backend, queue, platformBackend, hostBackend, ingestQueue
Jobs: migrations, authBootstrap, feedbackConfigMigration, feedbackDataMigration, e2eTest
后端服务配置示例:
backend:
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::<account-id>:role/<role-name>"
queue:
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::<account-id>:role/<role-name>"
platformBackend:
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::<account-id>:role/<role-name>"
hostBackend:
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::<account-id>:role/<role-name>"
ingestQueue:
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::<account-id>:role/<role-name>"
请参阅 Helm values 参考 以获取可配置服务的完整列表。
GCP
Cloud SQL IAM 身份验证
Cloud SQL 支持 IAM 身份验证,这允许您使用 GCP 服务账户而不是数据库密码进行身份验证。
前提条件
- **配置工作负载身份** 在您的 Kubernetes 集群中使用 GCP Workload Identity
- **启用 IAM 身份验证** 在您的 Cloud SQL 实例上,并授予对您的工作负载身份的访问权限
配置
设置 iamAuthProvider to "gcp" 并提供 IAM 兼容的连接字符串(无密码):
postgres:
external:
enabled: true
existingSecretName: "postgres-secret"
iamAuthProvider: "gcp"
apiVersion: v1
kind: Secret
metadata:
name: postgres-secret
type: Opaque
stringData:
# IAM connection URL - note no password, username is the service account email
connection_url: "<service-account>@<project>.iam@<cloud-sql-host>:5432/<database>?sslmode=require"
必需的注解
您必须将 GCP Workload Identity 要求的 ServiceAccount 注解应用到所有连接到 PostgreSQL 的 LangSmith 组件:
Deployments: backend, queue, platformBackend, hostBackend, ingestQueue
Jobs: migrations, authBootstrap, feedbackConfigMigration, feedbackDataMigration, e2eTest
后端服务配置示例:
backend:
serviceAccount:
annotations:
iam.gke.io/gcp-service-account: "<service-account>@<project>.iam.gserviceaccount.com"
queue:
serviceAccount:
annotations:
iam.gke.io/gcp-service-account: "<service-account>@<project>.iam.gserviceaccount.com"
platformBackend:
serviceAccount:
annotations:
iam.gke.io/gcp-service-account: "<service-account>@<project>.iam.gserviceaccount.com"
hostBackend:
serviceAccount:
annotations:
iam.gke.io/gcp-service-account: "<service-account>@<project>.iam.gserviceaccount.com"
ingestQueue:
serviceAccount:
annotations:
iam.gke.io/gcp-service-account: "<service-account>@<project>.iam.gserviceaccount.com"
请参阅 Helm 值参考 获取可配置服务的完整列表。
Azure
支持 Microsoft Entra 身份验证的 Azure Database for PostgreSQL
Azure Database for PostgreSQL 支持 Microsoft Entra 身份验证,这允许您使用 Azure 托管标识进行身份验证,而非数据库密码。
前提条件
- **在工作负载标识中配置** 在 Kubernetes 集群中使用 Azure Workload Identity
- **启用 Microsoft Entra 身份验证** 在 Azure Database for PostgreSQL 实例上启用 Microsoft Entra 身份验证,并向您的工作负载标识授予访问权限
配置
设置 iamAuthProvider to "azure" 并提供 IAM 兼容的连接字符串(不含密码):
postgres:
external:
enabled: true
existingSecretName: "postgres-secret"
iamAuthProvider: "azure"
apiVersion: v1
kind: Secret
metadata:
name: postgres-secret
type: Opaque
stringData:
# IAM connection URL - note no password, username is the managed identity name
connection_url: "<managed-identity-name>@<azure-postgres-host>:5432/<database>?sslmode=require"
必需的注解
您必须将 Azure Workload Identity 所需的 ServiceAccount 注解和 Pod 标签应用到所有连接到 PostgreSQL 的 LangSmith 组件:
Deployments: backend, queue, platformBackend, hostBackend, ingestQueue
Jobs: migrations, authBootstrap, feedbackConfigMigration, feedbackDataMigration, e2eTest
后端服务配置示例:
backend:
serviceAccount:
annotations:
azure.workload.identity/client-id: "<managed-identity-client-id>"
deployment:
labels:
azure.workload.identity/use: "true"
migrations:
labels:
azure.workload.identity/use: "true"
queue:
serviceAccount:
annotations:
azure.workload.identity/client-id: "<managed-identity-client-id>"
deployment:
labels:
azure.workload.identity/use: "true"
platformBackend:
serviceAccount:
annotations:
azure.workload.identity/client-id: "<managed-identity-client-id>"
deployment:
labels:
azure.workload.identity/use: "true"
hostBackend:
serviceAccount:
annotations:
azure.workload.identity/client-id: "<managed-identity-client-id>"
deployment:
labels:
azure.workload.identity/use: "true"
ingestQueue:
serviceAccount:
annotations:
azure.workload.identity/client-id: "<managed-identity-client-id>"
deployment:
labels:
azure.workload.identity/use: "true"
请参阅 Helm 值参考 获取可配置服务的完整列表。