NocoDB 自托管部署实践:从 SQLite 快速起步到 PostgreSQL 生产环境的完整指南
本文以 NocoDB 仓库内的官方法语版说明文档 markdown/readme/languages/french.md 为主体骨架,完整覆盖其中“快速体验 → 生产配置 → 特性与编程访问”的技术主线,并结合仓库源码(nc-secret-mgr、init-meta-service.provider.ts、Docker Compose 示例等)逐层展开配置解析与初始化原理。读完后,你可以独立完成 NocoDB 的本地 Docker 部署、PostgreSQL 生产部署,并理解 NC_DB、NC_AUTH_JWT_SECRET 等关键环境变量在底层代码中是如何被解析与生效的。
一、NocoDB 是什么:把现有数据库变成智能表格
NocoDB 的定位可以概括为一句话:将任意 MySQL、PostgreSQL、SQL Server、SQLite、MariaDB 变成一个智能表格(Spreadsheet)界面(这是法语 README 首屏的原话)。它不是一套需要额外维护的存储层,而是直接建立在你已有数据库之上的无代码界面层,提供表格、视图、角色权限、工作流集成与 REST API 访问能力。
主仓库的 README.md 中声明了各语言的本地化文档入口,本文参照的法语版即位于 markdown/readme/languages/french.md,它与英文主 README 保持同一技术结构:快速体验(Essayer rapidement)、生产配置(Configuration de la production)、特性(Caractéristiques)、社区与使命。
从主 README 的徽章信息看,项目要求 Node.js >= 14.18.0,采用 Conventional Commits 规范提交——这是理解其构建与发布流程的前提。
二、快速体验:三种本地运行方式
2.1 方式一:Docker 直接运行(默认 SQLite)
法语 README 给出的最简命令如下:
docker run -d \
--name noco \
-v "$(pwd)"/nocodb:/usr/app/data/ \
-p 8080:8080 \
nocodb/nocodb:latest
两个关键点的源码级解释:
-
为什么必须挂载
/usr/app/data/:文档明确说明 NocoDB 需要一套“元数据库”(meta database)来存储视图、表、列等元数据;如果未提供外部数据库,它会回退到 SQLite。从源码 packages/nc-secret-mgr/src/core/NcConfig.ts 可以看到,NcConfig类的默认元库配置就是 SQLite:meta: { db: { client: DriverClient.SQLITE, connection: { filename: 'noco.db', // 默认 SQLite 文件名 }, }, } = {...};并且
filename会被拼接到工具目录(toolDir)下——在 Docker 容器里,这个工具目录即/usr/app/data。因此把宿主机目录挂载到/usr/app/data/后,SQLite 文件(noco.db)才会持久化,这也是文档中“Si cette entrée est absente, nous utiliserons SQLite”的底层原因。 -
端口与访问入口:
-p 8080:8080暴露 HTTP 服务,运行后访问http://localhost:8080/dashboard进入仪表盘(法语文档“GUI”一节与主 README 均给出同一地址)。
2.2 方式二:Docker 运行并指定外部 PostgreSQL
生产就绪的最小命令(法语 README 原文示例):
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://host.docker.internal:5432?u=root&p=password&d=d1的含义是协议pg、主机host.docker.internal(Docker 内访问宿主机的特殊域名)、端口 5432,查询参数u(用户)、p(密码)、d(数据库名)。NC_AUTH_JWT_SECRET:JWT 签名密钥。从初始化代码 packages/nocodb/src/providers/init-meta-service.provider.ts 可以看到,应用启动流程中有一步明确的await Noco.initJwt()(“init jwt”),会话令牌即依赖该密钥签名。文档建议提供一个 UUID 形式的随机值。
NC_DB 是如何被解析的?调用链如下:
- packages/nocodb/src/providers/init-meta-service.provider.ts 启动时先调用
prepareEnv()(将NC_DATABASE_URL_FILE、DATABASE_URL_FILE、DATABASE_URL、NC_DATABASE_URL等旧变量归一到NC_DB),再执行NcConfig.createByEnv(); - packages/nc-secret-mgr/src/core/NcConfig.ts 中
createByEnv读取三个候选项:NC_DB(URL 形式)、NC_DB_JSON(内联 JSON)、NC_DB_JSON_FILE(JSON 文件路径),并将NC_AUTH_JWT_SECRET作为 secret 一并传入; - URL 形式最终由
metaUrlToDbConfig()转换为 knex 风格的驱动配置(driver + connection)。
也就是说,只要给出 NC_DB 一个 URL,NocoDB 就切换到该外部元数据库;不给,则使用挂载卷中的 SQLite noco.db。两种模式的切换完全由这一个环境变量的有无决定。
2.3 方式三:git clone 种子仓库
法语 README 提供的第三种方式:
git clone https://github.com/nocodb/nocodb-seed
cd nocodb-seed
npm install
npm start
该方式用于快速体验预置示例数据,本质上仍是本地跑一个 SQLite 版 NocoDB。
注意区分:上面克隆的是 nocodb-seed(种子数据仓库,用于体验);主仓库 README.md 中“Docker Compose”一节克隆的才是
nocodb主仓库本身,用于部署完整栈。
三、生产环境配置详解
法语 README 的“Configuration de la production”一节指出:NocoDB 需要一套数据库来存储工作表视图与外部数据源的元数据,连接参数通过环境变量 NC_DB 指定。下面结合当前仓库给出各部署形态。
3.1 Docker + Postgres(最简生产形态)
法语文档示例(占位符请自行替换):
docker run -d -p 8080:8080 \
-e NC_DB="pg://host:port?u=user&p=password&d=database" \
-e NC_AUTH_JWT_SECRET="569a1821-0a93-45e8-87ab-eb857f20a010" \
nocodb/nocodb:latest
生产环境务必使用自己的随机 NC_AUTH_JWT_SECRET,不要复用示例值。
3.2 Docker Compose(注意文档路径的演进)
法语 README 给出的原始步骤是:
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/1_Auto_Upstall/:一键安装脚本
noco.sh及其 bats 测试,自动安装 docker / docker-compose,并以 Compose 方式拉起 NocoDB + PostgreSQL + Redis + Traefik 网关,自动配置 SSL; - docker-compose/setup.sh:交互式向导,根据回答生成部署配置;
- docker-compose/examples/:五种预置生产配置。
docker-compose/examples/README.md 列出了当前推荐的组合矩阵:
| 示例 | PostgreSQL | Redis | 代理 | 适用场景 |
|---|---|---|---|---|
| quickstart-demo | 内置 | 内置 | 无(8080 端口) | 本地评估 |
| managed-postgres | 外部托管(RDS/Azure/Cloud SQL) | 外部 | 无 | 自有负载均衡后的生产 |
| external-postgres-and-redis | 外部自管 | 外部 | 无 | 最小 Docker 占用 |
| traefik-custom-ssl | 外部托管 | 外部 | Traefik + 自签 TLS | 自带 SSL 证书的生产 |
| postgres-private-ca | 外部(私有 CA) | 外部 | Traefik + Let's Encrypt | 私有云数据库 |
用法同样简单:复制示例目录、替换占位符(CHANGE_ME_db_password 等)、docker compose up -d。生产形态的示例均要求 PostgreSQL,这也是许可证激活的前提(在 Admin Panel → License 处激活)。
3.3 与元数据库相关的环境变量(源码可查证清单)
法语 README 将完整环境变量清单指向了官方文档站,此处仅列出当前仓库源码中可确认的元数据库相关变量及其作用:
| 环境变量 | 作用 | 源码依据 |
|---|---|---|
NC_DB |
元数据库连接串(pg://、mysql2://、mssql://、oracle:// 等前缀) |
packages/nc-secret-mgr/src/core/NcConfig.ts |
NC_DB_JSON / NC_DB_JSON_FILE |
以 JSON(内联或文件)方式提供元库配置,作为 URL 形式的替代 | 同上 |
NC_AUTH_JWT_SECRET |
JWT 签名密钥,启动时经 Noco.initJwt() 生效 |
packages/nocodb/src/providers/init-meta-service.provider.ts |
NC_DB_QUERY_LIMIT_DEFAULT / NC_DB_QUERY_LIMIT_MIN / NC_DB_QUERY_LIMIT_MAX |
数据查询的分页大小默认值、下限、上限 | packages/nocodb/src/helpers/extractLimitAndOffset.ts |
NC_DB_QUERY_QUEUE_CONCURRENCY |
元库查询队列的并发度,默认 1(串行) | packages/nocodb/src/db/BaseModelSqlv2.ts |
NC_DATABASE_URL / DATABASE_URL 及 _FILE 变体 |
旧式连接串变量,启动时由 prepareEnv() 归一到 NC_DB |
packages/nocodb/src/providers/init-meta-service.provider.ts |
从 extractLimitAndOffset.ts 的结构看,这些变量都带“兜底默认值 + 兼容旧变量名(如 DB_QUERY_LIMIT_MAX)”的双重解析模式,这意味着从旧版本升级上来的实例无需改动环境变量即可继续工作。
四、应用启动时到底做了什么(初始化调用链)
部署后 NocoDB 如何“冷启动”?packages/nocodb/src/providers/init-meta-service.provider.ts 的 InitMetaServiceProvider 工厂在文件头注释中列出了六个步骤,正文则完整实现了它:
prepareEnv():环境变量归一(旧 URL 变量 →NC_DB);NcConfig.createByEnv():解析元库配置(对应第三节表格中的解析链);- 初始化缓存(
NocoCache.init()); - 初始化 MetaService:连接元库、检查
nc_store表、读取实例配置NC_CONFIG_MAIN,并对“从过老版本(NC_VERSION 编码 < 100002)直接升级”的情况显式拦截,提示先升到 0.207.3 再升级——这解释了为什么升级老数据前不能直接用最新镜像; Noco.initJwt()+ 从环境变量初始化超管(initAdminFromEnv);NcUpgrader.upgrade():执行数据库迁移/升级任务,随后NcPluginMgrv2.init()加载插件(App Store 集成的宿主)。
此外还有两个对生产运维重要的细节:
- 版本常量:源码中当前版本标记为
NC_VERSION = '0258003',迁移任务版本NC_MIGRATION_JOBS_VERSION = '14'(init-meta-service.provider.ts); - 若设置了
NC_SECRET_KEY相关的initDataSourceEncryption(init-meta-service.provider.ts),外部数据源连接信息会在元库中加密存储——对接多业务库时建议启用。
五、特性概览:表格界面、权限与 App Store
法语 README 的“Caractéristiques”一节列出三大块能力,这里完整继承并补充源码位置:
5.1 富电子表格界面
- 搜索、排序、筛选、隐藏列;
- 多视图:Grid(网格)、Gallery(画廊)、Kanban(看板)、Form(表单);
- 视图共享:公开或密码保护;个人视图与锁定视图;
- 单元格图片上传:支持 S3、Minio、GCP、Azure、DigitalOcean、Linode、OVH、Backblaze 等对象存储;
- 角色体系:Owner / Creator / Editor / Commenter / Viewer 及自定义角色;
- 细粒度访问控制(Field-level ACL):权限可下沉到数据库级、表级、列级。
前端实现集中在 packages/nc-gui/components/ 下,例如 smartsheet/(表格主体,300+ 文件)、dashboard/、cell/(100+ 单元格渲染器)与 permissions/;权限常量与枚举位于 packages/nc-gui/lib/ 的 acl.ts、enums.ts。
5.2 App Store:工作流自动化集成
法语 README 列出四大类集成(官方 App Store 的三类 + 存储):
- Chat:Slack、Discord、Mattermost、Microsoft Teams、WhatsApp 等;
- Email:AWS SES、SMTP、MailerSend 等;
- SMS:Twilio;
- Storage:AWS S3、Google Cloud Storage、Minio 等。
插件在容器内由 NcPluginMgrv2 加载(见第四节启动链),仓库内也内置了两个扩展示例:packages/nc-gui/extensions/data-exporter/ 与 packages/nc-gui/extensions/json-exporter/。
5.3 编程访问:REST API 与 SDK
法语 README 说明:可使用 JWT 或社交认证产生的令牌对请求签名,以程序化方式调用 NocoDB。仓库内对应资产:
- REST API 的 OpenAPI 定义:packages/nocodb/src/schema/swagger.json(含元数据同步等端点说明);
- 官方 SDK 源码:packages/nocodb-sdk/(含
src/lib/下 200+ 模块)与新版本 packages/nocodb-sdk-v2/; - 集成脚手架:packages/nc-integration-scaffolder/ 用于生成新的 App Store 集成骨架。
六、Kubernetes 部署补充
虽然法语 README 未涉及,但当前仓库内附带了官方 Helm Chart:charts/nocodb/。其中 externalDatabase.urlEnvVar 参数(默认 DATABASE_URL,可改为 NC_DB)控制容器读取哪个环境变量作为元库连接串,与第三节的变量体系一致;Chart 还提供 app/worker 双 Deployment、HPA、PDB、Ingress、NetworkPolicy 等模板(见 charts/nocodb/templates/),适合已有 K8s 平台的团队。
七、小结
- 快速体验:
docker run一条命令,默认 SQLite 落在挂载卷/usr/app/data/,访问http://localhost:8080/dashboard; - 生产部署:核心只有两个动作——用
NC_DB指向 PostgreSQL(或 MySQL 等)元库,用NC_AUTH_JWT_SECRET设置随机 JWT 密钥;组合方式选 Docker、Docker Compose 示例(docker-compose/examples/)、Auto-Upstall 脚本或 Helm Chart; - 底层机制:
NC_DB经prepareEnv()归一 →NcConfig.createByEnv()解析 →metaUrlToDbConfig()转驱动配置;启动时按“缓存 → 元库连接 → JWT → Upgrader → 插件”的固定链路初始化; - 文档与仓库的差异:法语 README 中
docker-compose/pg路径已过时,以当前仓库docker-compose/examples/为准;完整环境变量清单以官方文档站为准,本文仅收录源码可证实的子集。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00