首页
/ NocoDB 自托管部署实战:从 Docker 快速启动到 NC_DB 元数据库配置的源码级解读

NocoDB 自托管部署实战:从 Docker 快速启动到 NC_DB 元数据库配置的源码级解读

2026-09-04 13:45:27作者:冯梦姬Eddie

NocoDB 是一个可免费自托管的 Airtable 替代品,其核心能力是把任意 MySQL、PostgreSQL、SQL Server、SQLite、MariaDB 数据库转换成一张“智能电子表格”。本篇基于 NocoDB 仓库中的西班牙语 README(markdown/readme/languages/spanish.md)整理并扩充,覆盖单条 Docker 命令快速启动、生产环境元数据库配置(NC_DB)的完整参数语义、仓库中现成的 Docker Compose 示例,以及这些配置在源码中是如何被解析和生效的,帮助读者既能快速跑起来,也能理解每个环境变量的底层行为。

NocoDB 是什么:把关系型数据库变成协同电子表格

按照 README 西班牙语版 的定位,NocoDB 的目标是用电子表格式界面操作数据库:表格、列、行的增删改查,排序、过滤、分组、列的隐藏/显示,网格(默认)、画廊、表单等多种视图,基于角色的细粒度权限控制,以及 Base/View 的公开或密码保护分享。

它支持三类“接入方式”:

  • 丰富的电子表格界面:变体单元格类型(ID、Links、Lookup、Rollup、单行文本、附件、货币、公式、用户等)、协同视图与私有视图、基于角色的访问控制(RBAC);
  • App Store 工作流自动化:分聊天(Slack、Discord、Mattermost 等)、邮件(AWS SES、SMTP、MailerSend 等)、存储(AWS S3、Google Cloud Storage、Minio 等)三大类集成;
  • 程序化访问:REST API 与 NocoDB SDK,使用 JWT 或社交认证 Token 对请求签名即可调用。

从仓库结构看,程序化访问有对应的独立包:nocodb-sdknocodb-sdk-v2,REST API 则直接由后端暴露。

快速开始:一条 Docker 命令启动 NocoDB

默认模式(内置 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/,这是非易失数据(默认 SQLite 元数据库 noco.db 等)的落盘位置;
  • -p 8080:8080 暴露服务端口,容器内服务默认监听 8080(见下文源码分析);
  • 镜像为 nocodb/nocodb:latest

启动后访问 Dashboard:http://localhost:8080/dashboard

外接 PostgreSQL 示例

生产场景通常需要把 NocoDB 的元数据库(存储视图配置、Base 与外部数据库连接参数的地方)放到外部数据库上,通过环境变量 NC_DB 指定:

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

这里 host.docker.internal 是 Docker 内访问宿主机地址的约定写法,u=...&p=...&d=... 分别对应 user、password、database。NC_AUTH_JWT_SECRET 用于签发登录 JWT。

注意:西班牙语 README 中提到的 cd docker-compose/pg 旧路径已不存在,当前仓库把示例统一收敛到了 docker-compose/examples 目录,见下文。

NC_DB 与相关环境变量:源码级解析

环境变量的读取入口

所有部署相关的配置集中由 NcConfig.createByEnv 从环境变量装配:

环境变量 作用 默认值
NC_DB 元数据库连接 URL(pg://mysql://sqlite3:// 等) 未设置时使用内置 SQLite,文件为 noco.db
NC_DB_JSON / NC_DB_JSON_FILE 以 JSON(或 JSON 文件)形式提供完整的连接配置,替代 URL
NC_AUTH_JWT_SECRET JWT 签名密钥 无(登录态依赖它)
NC_PORT 对外暴露的 HTTP 端口 8080ncConfig.port = +(port ?? 8080)
NC_TRY 启用内存 SQLite(:memory:)试验模式
NC_WORKER 以 worker 进程模式运行(不对外暴露端口)
NC_DASHBOARD_URL Dashboard 挂载路径 /
NC_APP_DATA_DIR / NC_TOOL_DIR 元数据/附件数据根目录 进程工作目录

默认元数据库配置见 NcConfig 类定义:客户端固定为 sqlite3,连接文件名为 noco.db,且启动时会把它拼接到工具目录(NC_APP_DATA_DIRNC_TOOL_DIRprocess.cwd(),见 getToolDir)。这解释了为什么 Docker 官方写法要把数据目录挂到 /usr/app/data/

NC_DB URL 的解析规则

NC_DB 的解析逻辑在 metaUrlToDbConfig 中,规则如下:

  1. 协议即驱动:URL 协议直接决定数据库客户端,并经过 driverClientMapping 归一化:mysql/mariadbmysql2postgres/postgresqlpgsqlitesqlite3oracleoracledb
  2. 查询参数别名:查询串中的短参数会按 knownQueryParams 展开:d/db → database、p → password、u → user、t → title、opt/opts → options。这也正是 NC_DB="pg://host:5432?u=root&p=password&d=d1" 这种紧凑写法的依据。
  3. 默认端口:URL 中省略端口时按 defaultClientPortMapping 补全:mysql 3306、postgres 5432、mssql 1433、oracle 1521。
  4. 连接池与超时:默认注入 acquireConnectionTimeout: 600000(取连接超时 10 分钟),连接池上限由 NC_DB_POOL_MAX 控制,默认 10(defaultConnectionOptions)。
  5. PostgreSQL 专属search_path=... 查询参数会拆分为 searchPath 数组传给驱动。
  6. 扩展参数:除凭据类参数外,其余查询参数还支持点号路径写入配置对象(如 pool.max=20 这类嵌套写法),数值会自动转型。

SSL 行为

  • 当主机在 avoidSSL 白名单内(localhost127.0.0.1host.docker.internal172.17.0.1)时,即使默认逻辑也不强制 TLS——这解释了为什么快速启动示例里 host.docker.internal 可以不配置证书直接连;
  • 若设置了 NODE_TLS_REJECT_UNAUTHORIZED,解析结果会强制 ssl: true
  • 若连接串中显式给出 keyFilePath/certFilePath/caFilePath 三个文件路径,metaUrlToDbConfig 会在启动时读取文件内容填入 ssl.ca/key/cert,读取失败统一抛 Invalid SSL configuration. 错误。

元数据库自动创建

NcConfig.create 在装配完成后会调用 metaDbCreateIfNotExist:SQLite 场景下确保文件存在,其他数据库则调用驱动的 createDatabaseIfNotExists 自动建库——这就是 NC_DB 里指定的 d=d1 数据库在首次启动时能被自动创建的原因。缺少文件名/库名会直接抛出配置错误。

此外,NcConfig.isAuditEnabled 显示审计日志由 NC_ENABLE_AUDIT=true 开启,可作为生产加固项。

生产部署:仓库内置的 Docker Compose 示例

西班牙语 README 中的 Docker Compose 段落指向旧目录,当前仓库的可用示例在 docker-compose/examples 下,按“从简到繁”排列:

1. quickstart-demo:NocoDB + PostgreSQL + Redis 全家桶

quickstart-demo/docker-compose.yml 是最贴近生产形态的示例,包含四个服务:

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
    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']
  worker:            # 独立 worker 容器
    environment:
      NC_WORKER_CONTAINER: 'true'
  db:                # postgres:17.10
  redis:              # redis:7

值得注意的工程细节:

  • 独立 worker 容器:web 与 worker 同镜像,worker 通过 NC_WORKER_CONTAINER 标记为后台任务进程,与 web 共享同一 nocodb_data 卷和同一 NC_DB/NC_REDIS_URL,依赖 web 健康后再启动;
  • 健康检查:web 用 /api/v1/health 探测,postgres 用 pg_isready,redis 用 redis-cli ping,并以 service_healthy 条件串联启动顺序;
  • Redis 的作用NC_REDIS_URL 接入 Redis 用于缓存/实时等状态存储;
  • 该示例同时给出可复制的 NC_SITE_URL(对外访问地址,影响分享链接)与 NC_DISABLE_MUX 等生产常用变量。

2. managed-postgres:使用受管数据库

managed-postgres/docker-compose.yml 展示另一种模式:数据库在容器外(如云厂商托管 Postgres),此时连接信息放在 docker.envenv_file 中,并把结构化的 db.json 挂载到 /usr/app/data/db.json,对应 NC_DB_JSON_FILE 这条配置通道(见上文 NcConfig.createByEnv),适合不想把凭据全部写在 URL 里的场景。

3. 其余示例

功能特性与项目定位

继承西班牙语 README 的完整功能清单:

电子表格界面

  • 基础操作:表、列、行的创建/读取/更新/删除;
  • 单元格操作:排序、过滤、列的隐藏/显示;
  • 多种视图:网格(默认)、画廊、表单;
  • 视图权限:协同视图与私有视图;
  • Base/视图分享:公开或密码保护;
  • 变体单元格类型:ID、访问其他单元格、Lookup、Rollup、单行文本、附件、货币、公式等;
  • 基于角色的访问控制:多层级细粒度权限。

App Store 自动化集成:聊天(Slack、Discord、Mattermost)、邮件(AWS SES、SMTP、MailerSend)、存储(AWS S3、GCS、Minio)三大类。

程序化访问:REST API 与 NocoDB SDK,使用 JWT 或社交认证 Token 对请求签名。

项目动机(README 原文主旨):绝大多数互联网业务用电子表格或数据库解决业务问题,电子表格被十亿级用户协同使用,但数据库的操作性远落后于其计算能力;SaaS 方案意味着糟糕的访问控制、供应商锁定、数据锁定与突发调价。NocoDB 的愿景是提供面向所有互联网业务的、fair-code 的、最强大的数据库无代码界面,让强大的计算工具被民主化使用。

适用前提与限制

  • 运行环境按仓库徽章标注为 Node.js >= 14.18.0(西班牙语 README 顶部徽章);Docker 镜像方式部署时由镜像内置运行时,使用者只需 Docker;
  • NC_DB 的驱动支持以 driverClientMapping 为准(MySQL/MariaDB/PostgreSQL/SQLite/Oracle,另有 MSSQL 端口映射);
  • 本地开发式运行(直接跑 docker/main.js 等入口)仅适合快速验证,仓库建议生产部署走 Docker/Compose 或 Auto-Upstall;
  • 本仓库以只读方式提供示例,实际部署请复制示例文件到自己的环境修改密码与域名后再启动。

小结

  • 一条 docker run 即可用内置 SQLite 跑起 NocoDB,访问 http://localhost:8080/dashboard
  • 生产部署核心是 NC_DB(URL 形式)或 NC_DB_JSON/NC_DB_JSON_FILE(JSON 形式),加上 NC_AUTH_JWT_SECRETNC_DB 的协议、短参数别名、默认端口、SSL 白名单与自动建库行为均可在 nc-config 源码中逐一对应;
  • 优先复用 docker-compose/examples 中与健康检查、worker 容器、Redis 配套齐全的现成编排,再按托管库、私有 CA、自定义 SSL 等场景选择对应示例。
登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
528
588
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
906
1.83 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
891
5.78 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.53 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.34 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
987
506
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384