NocoDB 如何连接使用私有 CA 证书的 PostgreSQL?
2026/9/9 19:12:52 网站建设 项目流程

NocoDB 如何连接使用私有 CA 证书的 PostgreSQL?

【免费下载链接】nocodb🔥 🔥 🔥 A Free & Self-hostable Airtable Alternative项目地址: https://gitcode.com/GitHub_Trending/no/nocodb

如果你的 PostgreSQL 跑在机房或私有云里,证书来自私有或自签 CA,NocoDB 默认的 SSL 信任方式无法完成校验,直接连接会失败。NocoDB 的 Docker Compose 示例中有一个专门针对这种环境的配置:postgres-private-ca。它的组合是:外部 PostgreSQL(在连接配置里内嵌私有 CA 证书,并保留rejectUnauthorized: true的严格校验)、外部 Redis,以及 Traefik(Let's Encrypt 自动 HTTPS)作为 NocoDB 的前端代理。完成本文操作后,NocoDB 会带着 worker 一起启动,并持续通过/api/v1/health健康检查。

示例完整文件见 postgres-private-ca 示例目录,适用场景在 README 中说明:面向 on-prem 数据库和私有云环境。

准备条件

  • 一台已安装 Docker 与 docker compose 的主机,并且有一个可对外解析的域名(示例通过 Traefik + Let's Encrypt 对外提供 HTTPS);
  • 外部 PostgreSQL 实例,且其 SSL 证书由私有/自签 CA 签发。你需要拿到这张 CA 证书的 PEM 文件(下文用your-ca.pem指代);
  • 外部 Redis 实例,及其连接地址。

如果你的外部 Postgres 用的是公开受信 CA,则不需要本文的ca配置——external-postgres-and-redis 示例 中说明:公开受信 CA 保持默认的ssl.rejectUnauthorized: true即可,自签或私有 CA 才应改用postgres-private-ca示例。

复制示例目录

在仓库根目录下把示例拷贝为独立的部署目录:

cp -r docker-compose/examples/postgres-private-ca ./my-deployment cd my-deployment

后续所有编辑都在my-deployment中进行。

第一步:把 CA 证书压成单行字符串

CA 证书必须以单行字符串的形式内嵌到db.json,换行用\n表示。示例 README 给出的转换命令:

awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' your-ca.pem

your-ca.pem替换成你的 CA 证书文件路径,执行后把输出的整行内容记下来,稍后粘贴到db.json

第二步:编辑 nocodb/db.json

nocodb/db.json 是 knex 格式的数据库连接配置,示例原值如下:

{ "client": "pg", "connection": { "host": "your-private-db-host.internal", "port": "5432", "user": "nocodb", "password": "CHANGE_ME_db_password", "database": "nocodb", "ssl": { "rejectUnauthorized": true, "ca": "-----BEGIN CERTIFICATE-----\nPASTE_YOUR_CA_PEM_HERE_AS_ONE_LINE\n-----END CERTIFICATE-----" } } }

需要替换的项(示例 README 要求填写数据库的 host、凭据和端口,并替换ca值):

  • host/port/user/password/database:改为你私有 PostgreSQL 的实际值;
  • ca:粘贴上一步 awk 输出的单行证书内容,即-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----这种形式;
  • rejectUnauthorized保持true:这正是本示例与公开 CA 场景的区别——NocoDB 用你提供的 CA 严格校验服务端证书,而不是关闭校验。

对比一下,managed-postgres 的 db.json 的ssl只有"rejectUnauthorized": true、没有ca字段,因为托管数据库的 CA 已被信任。

第三步:编辑 docker.env

docker.env 中的关键项:

# Database NC_DB_JSON_FILE=/usr/app/data/db.json # Redis NC_REDIS_URL=redis://your-redis-host:6379 # Public URL (email links, webhooks, OAuth redirects). Set to your public-facing URL. NC_SITE_URL=https://nocodb.example.com # Settings NC_SECURE_ATTACHMENTS=true NC_DISABLE_MUX=true

必须修改:

  • NC_REDIS_URL:替换为你外部 Redis 的实际地址(your-redis-host:6379是占位值);
  • NC_SITE_URL:设置为你的对外 URL,用于邮件链接、webhook 和 OAuth 跳转。

NC_DB_JSON_FILE指向的是 db.json 在容器内的挂载路径,保持不动;NC_SECURE_ATTACHMENTSNC_DISABLE_MUX按示例默认值即可。

第四步:编辑 docker-compose.yml

docker-compose.yml 定义了三个服务:nocodbworkerNC_WORKER_CONTAINER: 'true',复用同一镜像并共享nocodb_data卷)、traefiktraefik:v3.6,80/443 端口,Let's Encrypt 证书解析器)。两处必须替换(示例 README 明确要求):

  1. nocodb服务 label 中的域名:
- 'traefik.http.routers.nocodb.rule=Host(`nocodb.example.com`)'

nocodb.example.com换成你的域名。

  1. traefik服务 command 中的 Let's Encrypt 邮箱:
- '--certificatesresolvers.letsencrypt.acme.email=admin@example.com'

nocodbworker两个服务都把./nocodb/db.json绑定挂载到容器的/usr/app/data/db.json,所以第二步的修改在两个进程上同时生效。

docker-compose/examples的总 README 特别强调:启动前必须替换所有占位值(如CHANGE_ME_db_passwordyour-managed-db-host及同类),本文的db.jsondocker.envdocker-compose.yml编辑步骤就是为此。

启动

docker compose up -d

验证连接是否成功

这个示例内置了可观察的成功信号:

  • nocodb服务配置了 healthcheck:wget -q --tries=1 --spider http://localhost:8080/api/v1/health,每 30 秒一次、超时 5 秒、最多重试 5 次,start_period为 30 秒;
  • worker服务的启动条件是depends_on: nocodb: condition: service_healthy,即 worker 只在nocodb通过健康检查后才会启动。

因此,worker容器进入运行状态就说明应用服务已经通过/api/v1/health检查;配合 Traefik,随后可通过https://你的域名访问 NocoDB 界面。如果nocodb反复不健康而worker一直停在等待状态,优先回查db.json中的 host、凭据和单行ca格式——本示例的整条链路就是靠这几处配置建立到私有 CA PostgreSQL 的加密连接。

边界与限制

  • ca值必须是单行字符串,换行写成\n;直接把多行 PEM 粘进 JSON 会导致配置不合法。
  • 本示例的对外访问依赖 Traefik + Let's Encrypt,需要一个真实域名;如果只想在内部网络暴露 NocoDB,这个拓扑需要自行调整,仓库示例中没有提供对应的现成配置。
  • 私有 CA 场景与公开 CA 场景是两个示例的分工:docker-compose/examples 总览 的表格中,postgres-private-ca的定位即 "On-prem / private cloud DB"。
  • 如果你不想手工编辑示例文件,仓库还提供交互式安装向导./setup.sh(即1_Auto_Upstall,见 1_Auto_Upstall/README.md),它会生成同样支持内嵌自定义 CA 的nocodb/db.json,但不会替你填 CA 内容,仍需按本文方式准备证书字符串。

【免费下载链接】nocodb🔥 🔥 🔥 A Free & Self-hostable Airtable Alternative项目地址: https://gitcode.com/GitHub_Trending/no/nocodb

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询