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_ATTACHMENTS、NC_DISABLE_MUX按示例默认值即可。
第四步:编辑 docker-compose.yml
docker-compose.yml 定义了三个服务:nocodb、worker(NC_WORKER_CONTAINER: 'true',复用同一镜像并共享nocodb_data卷)、traefik(traefik:v3.6,80/443 端口,Let's Encrypt 证书解析器)。两处必须替换(示例 README 明确要求):
nocodb服务 label 中的域名:
- 'traefik.http.routers.nocodb.rule=Host(`nocodb.example.com`)'把nocodb.example.com换成你的域名。
traefik服务 command 中的 Let's Encrypt 邮箱:
- '--certificatesresolvers.letsencrypt.acme.email=admin@example.com'nocodb与worker两个服务都把./nocodb/db.json绑定挂载到容器的/usr/app/data/db.json,所以第二步的修改在两个进程上同时生效。
docker-compose/examples的总 README 特别强调:启动前必须替换所有占位值(如CHANGE_ME_db_password、your-managed-db-host及同类),本文的db.json、docker.env、docker-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),仅供参考