ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Webiny 独立部署(Standalone)SQL 存储接入 PostgreSQL:`createPostgresConnection` 与 `<Infra.Postgres>` 配置组件实战解析

Webiny 独立部署(Standalone)SQL 存储接入 PostgreSQL:`createPostgresConnection` 与 `<Infra.Postgres>` 配置组件实战解析 CMS后端前端【免费下载链接】webiny-jsOpen-source, self-hosted CMS platform on AWS serverless (Lambda, DynamoDB, S3). TypeScript framework with multi-tenancy, lifecycle hooks, GraphQL API, and AI-assisted development via MCP server. Built for developers at large organizations.项目地址https://gitcode.com/gh_mirrors/we/webiny-js点击查看免费下载本篇技术指南围绕仓库中 Postgres 连接支持会话移交记录 展开系统讲解 Webiny 开源仓库为独立部署Standalone托管形态引入 PostgreSQL 连接能力的具体实现webiny/api-event-handler-standalone-sql中的createPostgresConnection()连接工厂、webiny/project-standalone中新增的Infra.Postgres配置组件、createSqlApiHandler的命名调整以及 Headless CMS SQL 存储与 Knex 客户端解耦的底层原理。读完本文你将掌握如何在 Webiny 独立部署形态下用WEBINY_PG_*环境变量体系配置 Postgres 连接、通过 React 组件式配置把参数烘焙进构建产物并理解哪些连接选项必须保留在代码层配置。背景Standalone 托管形态与 SQL 存储装配Webiny 的独立部署Standalone形态面向不依赖 AWS 基础设施的自托管场景其 API 入口由webiny/api-event-handler-standalone-sql包提供。该包在传输层webiny/api-event-handler-standalone之上装配了 SQL 存储的完整接线干净的 DI Feature 注册ApiCoreSqlFeature、WebsocketsSqlFeature、SelfHostedAuthSqlFeature、HeadlessCmsSqlFeature直接注册到容器传统扩展点ACOregisterAcoSqlStorageOperations与审计日志registerAuditLogsSqlStorageOperations仍走registerExtensions的旧式插件注册连接由调用方持有createSqlApiHandler的配置要求显式传入knex客户端——这是理解 Postgres 接入的关键前提即连接对象与处理器解耦数据库换成 Postgres 不需要改动处理器本身。核心装配逻辑位于 createWebinyApiHandler.tsCreateSqlApiHandlerConfig仅包含extensions、knex必填与可选的tableNamePrefix。本次会话完成了什么按移交记录本次工作共 16 个提交14 个来自先前研究会话 2 个来自本次会话核心成果可归纳为四点确认api-headless-cms-sql与 Postgres 完全兼容代码中不存在任何 SQLite 专用 SQL意味着无需新建存储包即可让 CMS 数据落到 Postgres新增createPostgresConnection()位于webiny/api-event-handler-standalone-sql支持完整的WEBINY_PG_*环境变量体系新增Infra.Postgres配置组件位于webiny/project-standalone把全部可序列化的PgConnectionConfig选项暴露为组件 props重命名createSqliteApiHandler为createSqlApiHandler移除已废弃的旧别名并同步更新服务端模板引用同时为包新增pg驱动依赖。为什么api-headless-cms-sql不需要为 Postgres 新建包这是本次工作中最关键的架构决策。HeadlessCmsSqlFeature见 api-headless-cms-sql 入口的注册逻辑只依赖抽象的 Knex 客户端export const HeadlessCmsSqlFeature createFeatureISqlStorageOperationsConfig({ name: cms.storageOperations.sql, register: (container, config) { const sharedTables process.env.WEBINY_SHARED_TABLES true; container.registerInstance(TableNameResolverConfig, { sharedTables, tableNamePrefix: config.tableNamePrefix, tableNameSuffix: config.tableNameSuffix }); // 注册表名解析、值过滤、Schema/表管理及各组、模型、条目的 SQL 存储操作 } });该包内部的存储操作实现SqlCreateEntry、SqlListEntries、SqlGetEntry、SqlPublishEntry等见 api-headless-cms-sql/src/operations全部经由 Knex 查询构造器执行标准 SQL不依赖 SQLite 特有的方言如ON CONFLICT、类型亲和性等。因此Knex 客户端来自 SQLite 还是 Postgres对存储层透明切换数据库只需替换连接工厂api-headless-cms-sql无需任何改动这就解释了移交记录中不需要为 Postgres CMS 存储新建包的决策——Postgres 支持完全落在连接工厂与配置组件这一层。从源码结构看api-headless-cms-sql支持tableNamePrefix/tableNameSuffix/共享表WEBINY_SHARED_TABLES等表名解析策略这些同样与具体数据库无关Postgres 部署可直接复用。createPostgresConnection()连接工厂全量环境变量解析工厂实现位于 createPostgresConnection.ts职责是从环境变量读取连接参数组装出一个 Knexpg客户端。它接受一个可选的CreatePostgresConnectionOptionsexport interface CreatePostgresConnectionOptions { host?: string; port?: number; user?: string; password?: string; database?: string; /** * 可选的附加 Knex 连接配置SSL、连接池大小等。 * 当与 env vars 同时设置时此处的值优先。 */ connection?: PartialKnex.PgConnectionConfig; }注意connection选项的存在意义非序列化的PgConnectionConfig选项如stream、types、expirationChecker无法放进环境变量必须留在代码层通过connection传入。工厂在返回前用{ ...connectionConfig, ...options.connection }做浅合并实现显式代码选项覆盖环境变量的优先级规则。必填参数5 项缺失即抛错工厂对以下五个参数做了显式校验任一缺失都会抛出带配置指引的错误环境变量对应代码选项说明WEBINY_PG_HOSThostPostgres 服务器主机名WEBINY_PG_PORTportPostgres 端口经envInt解析为数字WEBINY_PG_USERuser数据库用户WEBINY_PG_PASSWORDpassword数据库密码WEBINY_PG_DATABASEdatabase数据库名可选参数全部可序列化选项环境变量对应PgConnectionConfig字段说明WEBINY_PG_CONNECTION_STRINGconnectionString完整连接串可整体覆盖 host/port/user/password/databaseWEBINY_PG_SSLssl布尔true/false启停 SSLWEBINY_PG_SSL_CAssl.caSSL CA 证书文件路径运行时读取WEBINY_PG_SSL_KEYssl.keySSL 客户端私钥文件路径运行时读取WEBINY_PG_SSL_CERTssl.certSSL 客户端证书文件路径运行时读取WEBINY_PG_SSL_REJECT_UNAUTHORIZEDssl.rejectUnauthorized是否拒绝未验证证书WEBINY_PG_APPLICATION_NAMEapplication_name用于pg_stat_activity的应用名WEBINY_PG_CONNECTION_TIMEOUT_MILLISconnectionTimeoutMillis连接等待超时毫秒WEBINY_PG_STATEMENT_TIMEOUTstatement_timeout语句超时毫秒WEBINY_PG_QUERY_TIMEOUTquery_timeout查询超时毫秒WEBINY_PG_IDLE_IN_TRANSACTION_SESSION_TIMEOUTidle_in_transaction_session_timeout事务中空闲会话超时毫秒WEBINY_PG_PARSE_INPUT_DATES_AS_UTCparseInputDatesAsUTC是否将输入日期按 UTC 解析WEBINY_PG_OPTIONSoptions连接选项字符串如-c search_pathmyschemaWEBINY_PG_KEEP_ALIVEkeepAlive是否启用 TCP keep-aliveWEBINY_PG_KEEP_ALIVE_INITIAL_DELAY_MILLISkeepAliveInitialDelayMillis首次 keep-alive 探测前的等待毫秒两个值得注意的实现细节布尔解析的undefined语义。envBool只在变量确实被设置时才调用toBoolean转换未设置时保持undefined而非false见 createPostgresConnection.ts 的注释。原因很直接调用方依赖未设置与显式 false的区分——例如 SSL 配置只在WEBINY_PG_SSL*相关变量确实出现时才生效若未设置也返回false会导致 SSL 分支被无条件触发。SSL 文件在构建期烘焙路径、运行期读取内容。配置组件把证书路径写入环境变量工厂在运行期通过fs.readFileSync(sslCa, utf8)等调用读取文件内容并组装成 Node TLSConnectionOptions见 createPostgresConnection.ts。也就是说路径是构建产物的一部分而证书内容不在产物里证书文件随运行时环境提供即可。Infra.Postgres配置组件环境变量的声明式来源WEBINY_PG_*环境变量并非手工维护而是由webiny/project-standalone的Infra.Postgres扩展组件在构建期渲染产生。组件定义位于 Postgres.tsx并通过 definitions.ts 注册为内置扩展类型Infra/Postgres与Sqlite并列供webiny.config.base.tsx中的ExtensionDefinitions解析。组件参数zod 校验的 props 架构paramsSchema用 zod 定义了 5 个必填属性host、port、user、password、database和一组可选属性ssl、connectionString、applicationName、connectionTimeoutMillis、statementTimeout、queryTimeout、idleInTransactionSessionTimeout、parseInputDatesAsUTC、options、keepAlive、keepAliveInitialDelayMillis每个属性都有面向开发者的describe说明与上一节的环境变量一一对应。SSL 的两种形态ssl属性接受布尔值或对象两种形态ssl{true}/ssl{false}→ 渲染出WEBINY_PG_SSLtrue/falsessl{{ rejectUnauthorized, ca, key, cert }}→ 渲染出WEBINY_PG_SSL_REJECT_UNAUTHORIZED、WEBINY_PG_SSL_CA、WEBINY_PG_SSL_KEY、WEBINY_PG_SSL_CERT四个变量见 Postgres.tsx 的SslEnvVars组件。这正好对应移交记录中的决策SSL 接受boolean | { rejectUnauthorized?, ca?, key?, cert? }——文件路径在构建期烘焙文件内容在运行期读取。而stream、types、expirationChecker等非序列化选项则刻意不暴露为组件 props仅能通过代码层的connection选项配置。组件如何工作render函数把每个 prop 映射为EnvVar varNameWEBINY_PG_XXX value{...} /数值/布尔类型经optionalString统一转成字符串如端口号5432→5432未设置的选项由OptionalEnvVar直接跳过不渲染。整个组件的运行模型是声明式配置 → 构建期烘焙为环境变量 → 运行期由连接工厂消费。一个完整的配置示例写入项目根webiny.config.tsx中的服务器配置部分形如Infra.Postgres hostdb.example.internal port{5432} userwebiny password{process.env.PG_PASSWORD!} databasewebiny ssl{{ rejectUnauthorized: true, ca: /etc/ssl/certs/rds-ca.pem }} applicationNamewebiny-api connectionTimeoutMillis{10_000} keepAlive /从createSqliteApiHandler到createSqlApiHandler重命名的含义移交记录的另一项改动是把createSqliteApiHandler重命名为createSqlApiHandler并移除旧别名。当前 包入口 index.ts 只导出新名称export { createSqlApiHandler } from ./createWebinyApiHandler.js; export type { CreateSqlApiHandlerConfig } from ./createWebinyApiHandler.js; export { createSqliteConnection } from ./createSqliteConnection.js; export type { CreateSqliteConnectionOptions } from ./createSqliteConnection.js; export { createPostgresConnection } from ./createPostgresConnection.js; export type { CreatePostgresConnectionOptions } from ./createPostgresConnection.js;重命名背后是命名空间与职责的清晰化处理器本就不关心底层是 SQLite 还是 Postgres连接由调用方持有旧名称会误导使用者以为它绑定 SQLite。createSqliteConnection作为与createPostgresConnection平行的连接工厂继续保留两者分别代表 SQL 家族下的两种具体数据库。组装起来从配置到运行的最小链路综合源码一次完整的 Postgres 接入包含三层配置层在webiny.config.tsx中声明Infra.Postgres ... /构建期渲染出WEBINY_PG_*环境变量工厂层应用入口调用createPostgresConnection()生成 Knexpg客户端工厂读取环境变量完成组装装配层把该客户端传入createSqlApiHandler({ extensions, knex })随后由HeadlessCmsSqlFeature等 DI Feature 消费Headless CMS、ACO、审计日志、WebSockets、自托管认证的 SQL 存储全部落到 Postgres。对应代码示例应用层import { createPostgresConnection, createSqlApiHandler } from webiny/api-event-handler-standalone-sql; const knex createPostgresConnection({ // 也可以不传任何选项全部走 WEBINY_PG_* 环境变量 connection: { pool: { min: 0, max: 10 } // 非序列化之外连接池等也可在此覆盖 } }); export const handler createSqlApiHandler({ extensions: [...], knex, tableNamePrefix: wb_ });依赖层面包的 package.json 已加入pg^8.23.0驱动与knex^3.3.0、better-sqlite3并存后两者仅服务于 SQLite 路径。当前状态与后续路线如实呈现按移交记录当前状态如下分支bruno/feat/api-headless-cms-postgres共 16 个提交其中 3 个未推送构建通过Lint/格式干净测试未新增——连接工厂属于纯配置逻辑暂无自动化测试覆盖尚未验证Postgres 连接尚未用真实数据库实测。移交记录同时列出了后续规划可作为继续深入阅读的路线图使用真实数据库验证 Postgres 连接为api-headless-cms-pg-osPostgres OpenSearch 组合做实现规划包脚手架、建表与基础 CRUDWAL worker 进程 OpenSearch 同步条目存储操作实现使用 pglite 与真实 OpenSearch 进行测试。相关源码索引移交记录docs/.bruno/handoff/2026-07-14-postgres-connection.md连接工厂createPostgresConnection.ts配置组件Postgres.tsxSQL 处理器装配createWebinyApiHandler.ts包导出index.ts扩展注册definitions.tsCMS SQL 存储 Featureapi-headless-cms-sql 入口依赖声明package.json适用前提说明以上能力目前属于仓库中的实验性EXPERIMENTAL自托管 SQL 方案的一部分createPostgresConnection与Infra.Postgres尚未经过真实数据库端到端验证若要在生产环境使用建议先按后续路线完成实测再参考本文链路接入。赞分享CMS后端前端【免费下载链接】webiny-jsOpen-source, self-hosted CMS platform on AWS serverless (Lambda, DynamoDB, S3). TypeScript framework with multi-tenancy, lifecycle hooks, GraphQL API, and AI-assisted development via MCP server. Built for developers at large organizations.项目地址https://gitcode.com/gh_mirrors/we/webiny-js点击查看免费下载相关推荐LND 接入 PostgreSQL从 kvdb 配置到 KV-over-SQL 存储原理详解LND 接入 PostgreSQL从 kvdb 配置到 KV over SQL 存储原理详解 output_article /output_article区块链Infisical 独立 Postgres Helm Chartinfisical-standalone-postgres配置实战安全加固、扩展容器与高可用部署Infisical 独立 Postgres Helm Chartinfisical standalone postgres配置实战安全加固、扩展容器与高可后端前端密钥管理应用安全认证鉴权Spinnaker Front50 SQL 存储配置指南MySQL / PostgreSQL 接入与元数据迁移Spinnaker Front50 SQL 存储配置指南MySQL / PostgreSQL 接入与元数据迁移 Front50 是 Spinnaker 的元数后端DevOps云原生微服务上一篇终极指南使用RevokeMsgPatcher实现微信QQ消息防撤回的完整教程下一篇BiliBili-UWP在Windows上重新定义B站观看体验的桌面客户端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表