首页
/ NocoDB 自托管部署实战:Docker 快速起步、NC_DB 元数据库配置与生产环境 Compose 方案

NocoDB 自托管部署实战:Docker 快速起步、NC_DB 元数据库配置与生产环境 Compose 方案

2026-09-05 21:29:56作者:管翌锬

本篇围绕 NocoDB 官方荷兰语版 README 展开:先给出最小可用的一条命令部署方式,再深入讲解 NC_DB 连接串的解析规则、SQLite 回退机制与 NC_AUTH_JWT_SECRET 的安全作用,最后结合仓库内真实的 Docker Compose 示例文件,给出一套可直接用于生产环境的元数据库(PostgreSQL)+ Redis + Worker 的完整配置。读完你可以独立完成 NocoDB 的本地体验、对接已有 PostgreSQL 数据库,并理解容器内各环境变量的底层实现依据。

一、NocoDB 定位:把关系数据库变成智能电子表格

NocoDB 官方给出的核心描述是:将 MySQL、PostgreSQL、SQL Server、SQLite 与 MariaDB 任意一种数据库“驱动”为一张 Smart-Spreadsheet(智能电子表格)。也就是说,它本身不存储业务数据,而是作为一层无代码/低代码界面,把已有的关系型数据库包装成可搜索、可排序、可协作的表格产品。官方徽章标注的运行环境要求为 Node.js >= 14.18.0。

围绕这一核心能力,文档列出了三组主要功能面:

  • 富电子表格界面(Rich Spreadsheet Interface)
    • 轻松完成搜索、排序、过滤、隐藏列;
    • 多种视图:Grid、Gallery、Kanban、Form;
    • 视图分享:公开链接与密码保护分享;
    • 个人视图与锁定视图(Persoonlijke en vergrendelde meningen);
    • 单元格图片上传(支持 S3、Minio、GCP、Azure、DigitalOcean、Linode、OVH、Backblaze 等对象存储);
    • 角色体系:Owner(所有者)、Creator(创建者)、Editor(编辑者)、Commentator(评论者)、Viewer(查看者)以及自定义角色;
    • 细粒度访问控制:可细到数据库、表、列级别。
  • 工作流自动化 App Store
    • 聊天:Microsoft Teams、Slack、Discord、Meet;
    • 邮件:SMTP、SES、MailChimp;
    • 短信:Twilio;
    • WhatsApp;
    • 以及任意第三方 API。
  • 程序化 API 访问
    • REST API(带 Swagger 文档);
    • GraphQL API;
    • JWT 认证与社交登录;
    • API Token,用于对接 Zapier、Integromat 等自动化平台。

这些功能声明对应仓库中的实际模块:工作流/Webhook 能力位于 packages/nocodb/src/controllerspackages/nocodb/src/services,REST/GraphQL 双 API 由 packages/nocodb/src/schema/swagger.json 等文档定义支撑。

二、快速体验:一条 Docker 命令起步

2.1 最简部署(默认回退 SQLite)

官方文档给出的最小运行命令如下:

docker run -d \
  --name noco \
  -v "$(pwd)"/nocodb:/usr/app/data/ \
  -p 8080:8080 \
  nocodb/nocodb:latest

参数含义:

  • -v "$(pwd)"/nocodb:/usr/app/data/:将宿主机当前目录下新建的 nocodb 目录挂载到容器的 /usr/app/data/
  • -p 8080:8080:暴露 NocoDB 的默认服务端口 8080。

文档特别说明了两个关键点:

  1. NocoDB 需要“一个数据库”作为输入,即存放电子表格、视图等元数据以及管理外部数据库连接的元数据库;
  2. 如果未提供该输入,系统回退到 SQLite。为了让这个 SQLite 数据库持久化,才需要挂载 /usr/app/data/

因此上面的命令实际上是以“内置 SQLite”模式运行的单机体验版:元数据库文件会落在挂载目录里,容器删除后数据不丢失。

2.2 指定外部 PostgreSQL 作为元数据库

如果希望元数据库使用外部 PostgreSQL,只需追加 NC_DBNC_AUTH_JWT_SECRET 两个环境变量:

docker run -d \
  --name noco \
  -v "$(pwd)"/nocodb:/usr/app/data/ \
  -p 8080:8080 \
  -e NC_DB="pg://host.docker.internal:5432?u=root&p=password&d=d1" \
  -e NC_AUTH_JWT_SECRET="569a1821-0a93-45e8-87ab-eb857f20a010" \
  nocodb/nocodb:latest
  • NC_DB:元数据库连接串。这里用 pg:// 协议表示 PostgreSQL,host.docker.internal 是 Docker 中指向宿主机回环地址的保留域名(适用于容器内访问宿主机上跑着的 PostgreSQL);
  • NC_AUTH_JWT_SECRET:JWT 认证密钥,生产环境必须替换为随机值。

2.3 访问入口

启动完成后,通过浏览器访问:

http://localhost:8080/dashboard

即可进入 NocoDB 的仪表板界面,完成首个账户注册与数据库接入。

三、源码级解析:NC_DB 连接串是如何被解析的

NC_DB 并不是简单的 URL,NocoDB 将其解析为 Knex 数据库配置。核心逻辑位于 packages/nocodb/src/utils/nc-config/helpers.tsxcUrlToDbConfig / metaUrlToDbConfig 函数,协议到驱动的映射则定义在 packages/nocodb/src/utils/nc-config/constants.ts

export const driverClientMapping = {
  mysql: 'mysql2',
  mariadb: 'mysql2',
  postgres: 'pg',
  postgresql: 'pg',
  sqlite: 'sqlite3',
  oracle: 'oracledb',
};

export const defaultClientPortMapping = {
  mysql: 3306,
  postgres: 5432,
  pg: 5432,
  mssql: 1433,
  oracledb: 1521,
};

由此可以确认以下规则(全部来自源码,而非猜测):

规则 说明 源码依据
协议即驱动 pg://mysql://mssql:// 等协议前缀直接决定 Knex client driverClientMapping
端口可省略 URL 未写端口时按驱动取默认值:MySQL 3306 / PG 5432 / SQL Server 1433 / Oracle 1521 defaultClientPortMapping
短查询参数别名 u=user、p=password、d(或 db)=database、t=title,即 ?u=root&p=password&d=d1 的写法 knownQueryParams
SSL 证书文件 支持 keyFilePathcertFilePathcaFilePath 三个查询参数同时出现时启用自定义证书 xcUrlToDbConfig
内存 SQLite 特判 sqlite3://?d=:memory: 会强制连接池 min/max 为 1,保证单连接 metaUrlToDbConfig
连接池上限 NC_DB_POOL_MAX 环境变量可调,默认 10 defaultConnectionOptions

其中别名解析的源码片段如下:

export const knownQueryParams = [
  { parameter: 'database', aliases: ['d', 'db'] },
  { parameter: 'password', aliases: ['p'] },
  { parameter: 'user', aliases: ['u'] },
  { parameter: 'title', aliases: ['t'] },
  { parameter: 'keyFilePath', aliases: [] },
  { parameter: 'certFilePath', aliases: [] },
  { parameter: 'caFilePath', aliases: [] },
  { parameter: 'ssl', aliases: [] },
  { parameter: 'options', aliases: ['opt', 'opts'] },
];

所以文档示例里的 pg://host.docker.internal:5432?u=root&p=password&d=d1 会被解析为:client=pg,host=host.docker.internal,port=5432,user=root,password=password,database=d1

另外还有一个值得注意的细节:源码中 avoidSSL 列表包含 localhost127.0.0.1host.docker.internal172.17.0.1,即针对这些本地/宿主机地址会自动规避 SSL 强制要求,这也解释了为什么官方示例可以直接用 host.docker.internal 而不必配置证书。

四、Docker Compose 部署:从旧的 pg 目录到新的 Auto-Upstall 与 examples

4.1 文档原始流程与当前仓库现状

荷兰语文档(与主 README 同源)给出的 Compose 流程是:

git clone https://github.com/nocodb/nocodb
cd nocodb
cd docker-compose
cd pg
docker compose up -d

需要注意:在当前仓库中,docker-compose/pg 目录已被重构替换。现在 docker-compose 目录实际结构为:

docker-compose/
├── setup.sh              # 交互式安装向导入口
├── 1_Auto_Upstall/       # 向导本体:生成完整 compose 栈
└── examples/             # 5 套预置生产形态配置
    ├── quickstart-demo/
    ├── managed-postgres/
    ├── external-postgres-and-redis/
    ├── traefik-custom-ssl/
    └── postgres-private-ca/

因此推荐按当前仓库的两种方式部署:

方式一:交互式向导(见 docker-compose/1_Auto_Upstall/README.md

cd nocodb/docker-compose && ./setup.sh

该向导会询问域名、PostgreSQL(内置/已有)、Redis(内置/外部 URL)以及 Let's Encrypt 邮箱,然后生成包含 docker-compose.ymldocker.envnocodb/db.json(Knex 格式连接配置,支持内联自定义 CA)、update.sh 的完整目录。生成的 docker.envnocodb/db.json 会被 chmod 600,且 nocodb 服务带 GET /api/v1/health 健康检查,worker 服务等待其健康后再启动。

方式二:直接使用 examples 中的成品配置(见 docker-compose/examples/README.md):

示例 PostgreSQL Redis 代理 适用场景
quickstart-demo 内置 内置 无(8080) 本地评估
managed-postgres 外部托管(RDS/Azure/Cloud SQL) 外部 自有 LB 后的生产
external-postgres-and-redis 外部自建 外部 最小 Docker 占用
traefik-custom-ssl 外部托管 外部 Traefik + 自签 TLS 自带 SSL 证书的生产
postgres-private-ca 外部(私有 CA) 外部 Traefik + Let's Encrypt 内网/私有云数据库

使用示例:

cp -r docker-compose/examples/quickstart-demo ./my-deployment
cd my-deployment
docker compose up -d

注意 examples/README.md 的提醒:除 quickstart-demo 使用确定性的演示密码(quickstart_demo_pw_change_me,开箱即用)外,其余示例中的 CHANGE_ME_db_passwordyour-managed-db-host 等占位符必须全部替换后再启动。

4.2 剖析 quickstart-demo:NocoDB 生产形态的最小完整栈

docker-compose/examples/quickstart-demo/docker-compose.yml 是一个极有参考价值的文件,它展示了 NocoDB 应用、Worker、PostgreSQL、Redis 四者如何协同:

services:
  nocodb:
    image: nocodb/nocodb:latest
    environment:
      NC_DB: 'pg://db:5432?u=nocodb&p=quickstart_demo_pw_change_me&d=nocodb'
      NC_REDIS_URL: 'redis://redis:6379'
      NC_SITE_URL: 'http://localhost:8080'
      NC_DISABLE_MUX: 'true'
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    restart: unless-stopped
    volumes:
      - nocodb_data:/usr/app/data
    ports:
      - '8080:8080'
    healthcheck:
      test: ['CMD-SHELL', 'wget -q --tries=1 --spider http://localhost:8080/api/v1/health || exit 1']
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s

  worker:
    image: nocodb/nocodb:latest
    environment:
      NC_DB: 'pg://db:5432?u=nocodb&p=quickstart_demo_pw_change_me&d=nocodb'
      NC_REDIS_URL: 'redis://redis:6379'
      NC_SITE_URL: 'http://localhost:8080'
      NC_WORKER_CONTAINER: 'true'
    depends_on:
      nocodb:
        condition: service_healthy
    volumes:
      - nocodb_data:/usr/app/data

从这个真实配置中可以读出几条部署要点:

  1. 应用与 Worker 分离:同一个镜像跑两个服务,worker 通过 NC_WORKER_CONTAINER: 'true' 声明自己的角色,只处理后台任务(Webhook、通知等),不对外暴露端口。两个服务共享 nocodb_data 命名卷挂载到 /usr/app/data
  2. 健康检查驱动启动顺序dbpg_isready)与 redisredis-cli ping)先就绪,nocodb 通过 /api/v1/health 就绪后,worker 才启动——这正是 Auto-Upstall 生成的配置所采用的同一机制。
  3. NC_SITE_URL:对外站点地址,用于生成分享链接与邮件中的 URL,生产环境必须改成真实域名。
  4. NC_REDIS_URL:Redis 用于缓存与任务队列,外部化之后才能支撑多实例与 Worker 模式。
  5. PostgreSQL 17 + Redis 7 是当前示例的基线版本组合。

五、环境变量速查(基于仓库源码)

文档将完整环境变量清单指向官方文档站。这里基于仓库源码 packages/nocodb/src/utils/nc-config/constants.ts 与上述 compose 实例,给出部署时最常碰到的几个:

变量 作用 默认值/说明
NC_DB 元数据库连接串(支持 pg/mysql/mssql/sqlite3/oracle 等协议) 缺省时回退 SQLite,路径由挂载卷持久化
NC_AUTH_JWT_SECRET 登录态 JWT 签名密钥 生产必须自定义随机值
NC_REDIS_URL Redis 连接地址 见 quickstart-demo
NC_SITE_URL 对外站点 URL 用于分享/邮件链接
NC_WORKER_CONTAINER 标识该容器为 worker worker 服务设为 true
NC_DB_POOL_MAX Knex 连接池上限 默认 10defaultConnectionOptions
NC_WEBHOOK_MAX_BODY_SIZE Webhook 出站请求/响应体上限(字节) 默认 10 MB,防止 worker OOM
NC_THUMBNAIL_MAX_SIZE 附件缩略图上限(字节) 默认 3 MB
NC_DISABLE_MUX 关闭协作通信服务 compose 示例中设为 true

一个容易踩坑的细节:Webhook 体上限并非拍脑袋,源码注释明确写道——没有该上限时 axios 会把整个响应对缓冲进内存,大量 Webhook 任务会 OOM 杀掉 worker,因此默认 10 MB,运维可用 NC_WEBHOOK_MAX_BODY_SIZE 调大。

六、生产部署建议汇总

综合文档与仓库实践,生产环境建议如下:

  1. 元数据库使用 PostgreSQL 而非 SQLite:SQLite 适合体验,SQLite 文件并发能力有限;所有 examples 均内置/外接 PostgreSQL,且 license 激活也要求 PostgreSQL。
  2. 固定镜像 tag:Auto-Upstall README 明确建议生产不要用 latest,可用 --image-tag=0.264.6 之类方式锁定版本,或直接编辑生成的 docker-compose.yml
  3. 密钥与配置分离:向导生成的 nocodb/db.json 以 bind mount 覆盖到 nocodb_data 卷之上,使“配置”与“数据(命名卷)”分离;docker.envdb.json 权限为 600。
  4. 替换所有占位密码:包括示例中的 quickstart_demo_pw_change_meNC_AUTH_JWT_SECRET
  5. 保留健康检查:nocodb 服务的 /api/v1/health 检查是 worker 正确启动的前提。

七、为什么做 NocoDB:文档中的设计动机

荷兰语文档末尾保留了两个有信息量的章节,这里按原文语义译述并保留:

为什么构建它(Waarom bouwen we dit):大多数互联网公司以电子表格或数据库来承载业务需求。电子表格每天有超过 10 亿人在协作使用,而数据库在计算能力上其实强大得多,体验速度却远不及电子表格。试图用 SaaS 方案解决这类问题,往往带来糟糕的访问控制、供应商锁定、数据被“绑架”、价格突变,以及对未来能力的天花板。

我们的使命(Onze missie):为全世界每一家互联网公司提供最强的无代码数据库界面。通过公平、可持续的商业模式广泛开放这些能力,让强大的计算工具走向民主化,使超过 10 亿人能够发展出在互联网上大胆实验与构建的技能。

八、小结

本文沿着荷兰语版 README 的主线完成了一次完整的 NocoDB 自托管路径梳理:

  • 一条 docker run 命令 + /usr/app/data 挂载即可获得 SQLite 回退模式的本地体验,http://localhost:8080/dashboard 进入系统;
  • NC_DB 连接串的协议、默认端口、u/p/d 短参数、SSL 证书参数均有 helpers.tsconstants.ts 源码背书;
  • 生产部署请以 docker-compose/examples 下的真实 Compose 配置或 setup.sh 向导为准,核心形态是 “NocoDB 应用 + Worker + PostgreSQL + Redis + 健康检查驱动的启动顺序”。

掌握以上内容后,你就可以在本地验证 NocoDB、将已有 PostgreSQL 数据库接入为元数据库或外部数据源,并按仓库给出的示例把 NocoDB 部署到生产环境。

登录后查看全文
热门项目推荐
相关项目推荐