NocoDB 自托管部署实战:Docker、原生二进制与环境变量深度解析
本文基于 NocoDB 仓库中的官方说明文档(印尼语版 README),系统讲解 NocoDB 从"三分钟快速体验"到生产环境落地的完整部署路径:Docker 容器、全平台原生二进制、Docker Compose 示例栈三大安装方式,并深入源码剖析 NC_DB 等核心环境变量是如何被解析、连接串如何映射到数据库驱动的。读完后你可以独立完成一次可复现的自托管部署,并理解每个配置项背后的实现机制。
三种部署方式一览
NocoDB 定位为可自托管的 Airtable 替代品,其核心能力是把 MySQL、PostgreSQL、SQL Server、SQLite 与 MariaDB 等任意数据库变成带电子表格界面的智能数据平台。仓库给出的官方入口是以下三种方式:
| 方式 | 适用场景 | 数据持久化要点 |
|---|---|---|
| Docker 单容器 | 最快体验、单机轻量部署 | 自 0.10.6 起需将宿主机目录挂载到容器内 /usr/app/data/ |
| 原生二进制(Binaries) | 无 Docker 环境、macOS/Linux/Windows 全平台 | 进程工作目录即数据目录(详见下文 getToolDir 源码解析) |
| Docker Compose | 生产形态:PostgreSQL + Redis + Worker 多容器栈 | 命名卷 nocodb_data 挂载到 /usr/app/data |
方式一:Docker 单容器体验
SQLite 模式(默认)
不配置任何数据库环境变量时,NocoDB 使用内置 SQLite 存储元数据,一条命令即可启动:
docker run -d \
--name noco \
-v "$(pwd)"/nocodb:/usr/app/data/ \
-p 8080:8080 \
nocodb/nocodb:latest
PostgreSQL 模式(NC_DB 连接串)
若已有 PostgreSQL 实例,通过 NC_DB 环境变量传入连接串即可让 NocoDB 将元数据存入该库。文档给出的示例是(宿主机上运行容器时用 host.docker.internal 指向宿主机):
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
官方文档在此处给出两条重要提醒:
- 数据持久化:自 0.10.6 版本起,必须把宿主机目录挂载到
/usr/app/data/,否则容器重建后数据将丢失; - 字符集与排序规则:如果计划存储特殊字符(多语言内容),需要在创建数据库时自行调整字符集(character set)与排序规则(collation),官方以 MySQL 场景为例给出了相关讨论。
连接串的 ?u=&p=&d= 查询参数并非随意约定。在 连接串解析实现 中,jdbcToXcConfig 通过 parse-database-url 解析 URL,再用 knownQueryParams 把短参数(u、p、d 等)映射为驱动标准参数(user、password、database)。值得注意的细节是:当驱动为 PostgreSQL 且未显式指定 ssl、host 又不在 avoidSSL 白名单中时,会默认开启 SSL 连接(见 helpers.ts 第 66–72 行)。自托管连接内网数据库时若未启用 TLS,需要在连接串中显式关闭 SSL 或把 host 加入白名单。
NC_DB 的配置来源
NC_DB 最终由 NcConfig 统一消费:NcConfig.create 支持三种元数据库配置来源,优先级从高到低为:
metaUrl(即NC_DB连接串);metaJson(内联 JSON);metaJsonFile(对应NC_DB_JSON_FILE,指向 JSON 配置文件,文件不存在时直接抛错)。
若三者都未提供,则回退到默认的 SQLite 文件数据库 noco.db(见 NcConfig 默认 meta 定义)。此外 prepareEnv 还支持从 NC_DATABASE_URL_FILE / DATABASE_URL_FILE 指向的文件读取 URL,或直接从 NC_DATABASE_URL / DATABASE_URL 读取——这意味着部分云平台的托管数据库环境变量可以零改造地接入。
方式二:全平台原生二进制
无需 Docker 的机器上可直接下载单文件可执行程序。官方文档覆盖六种平台组合:
# MacOS (x64)
curl http://get.nocodb.com/macos-x64 -o nocodb -L && chmod +x nocodb && ./nocodb
# MacOS (arm64)
curl http://get.nocodb.com/macos-arm64 -o nocodb -L && chmod +x nocodb && ./nocodb
# Linux (x64)
curl http://get.nocodb.com/linux-x64 -o nocodb -L && chmod +x nocodb && ./nocodb
# Linux (arm64)
curl http://get.nocodb.com/linux-arm64 -o nocodb -L && chmod +x nocodb && ./nocodb
# Windows (x64)
iwr http://get.nocodb.com/win-x64.exe -o Noco-win-x64.exe
.\Noco-win-x64.exe
# Windows (arm64)
iwr http://get.nocodb.com/win-arm64.exe -o Noco-win-arm64.exe
.\Noco-win-arm64.exe
二进制模式的数据目录解析逻辑与容器一致:从源码结构看,getToolDir 按 NC_APP_DATA_DIR → NC_TOOL_DIR → 当前工作目录的顺序取值,因此裸机运行时元数据库文件(SQLite 场景)会落在启动目录中,如需自定义位置可设置上述任一变量。
方式三:Docker Compose 生产形态
官方文档给出的最简流程是克隆仓库后进入示例目录启动。需要注意的是,文档中提到的 docker-compose/2_pg 等编号目录在当前仓库中已演进为结构化的示例目录,当前仓库的 Compose 资源位于 docker-compose 目录,包含交互式安装向导与五个生产级示例:
git clone https://gitcode.com/GitHub_Trending/no/nocodb
# 以 quickstart-demo 为例
cd nocodb/docker-compose/examples/quickstart-demo
docker compose up -d
五个官方示例栈
示例索引按基础设施形态组织,可作为起点直接复制修改:
| 示例 | PostgreSQL | Redis | 代理 | 适用场景 |
|---|---|---|---|---|
| quickstart-demo | 内置 | 内置 | 无(端口 8080) | 本地评估 |
| managed-postgres | 外部托管(RDS/Azure/Cloud SQL) | 外部 | 无(端口 8080) | 自有负载均衡后的生产 |
| external-postgres-and-redis | 外部自管 | 外部 | 无(端口 8080) | 最小 Docker 占用 |
| traefik-custom-ssl | 外部托管 | 外部 | Traefik + 自定义 TLS 证书 | 自带 SSL 证书的生产 |
| postgres-private-ca | 外部(私有 CA) | 外部 | Traefik + Let's Encrypt | 内网/私有云数据库 |
示例说明文档特别强调:启动前必须替换所有占位值(CHANGE_ME_db_password 等);quickstart-demo 使用固定演示口令 quickstart_demo_pw_change_me 保证开箱即用,真实使用务必更换。
quickstart-demo 编排文件剖析
以最完整的 quickstart-demo 编排文件 为例,它由四个服务组成,体现了 NocoDB 生产部署的标准拓扑:
- nocodb(应用容器):
image: nocodb/nocodb:latest,关键环境变量包括:NC_DB: 'pg://db:5432?u=nocodb&p=quickstart_demo_pw_change_me&d=nocodb'—— 元数据库连接串;NC_REDIS_URL: 'redis://redis:6379'—— Redis 连接(NocoDB 用于缓存与实时协作通道);NC_SITE_URL: 'http://localhost:8080'—— 对外站点地址,影响分享链接、回调 URL 等;NC_DISABLE_MUX: 'true'—— 禁用 Mux 遥测;- 数据卷
nocodb_data:/usr/app/data,与单容器模式的持久化约定一致; - healthcheck 探测
GET /api/v1/health,30 秒间隔、5 秒超时、5 次重试;
- worker(后台任务容器):复用同一镜像,仅通过
NC_WORKER_CONTAINER: 'true'切换为 worker 角色,且depends_on等待应用容器 healthy 后再启动——源码中 worker 模式的判定正是检查该变量是否为字符串true(见 testDocker.ts); - db:
postgres:17.10,通过pg_isready做健康检查,数据落在postgres_data命名卷; - redis:
redis:7,数据落在redis_data命名卷。
从这一编排可以确认 NocoDB 推荐的伸缩模式:应用与后台任务分离,两者共享同一 PostgreSQL 与 Redis,worker 数量可独立于 API 副本横向扩展。
交互式安装向导 setup.sh
除手工编排外,仓库还提供了 setup.sh。它是一个薄封装,实际调用 Auto-Upstall 安装脚本,流程为:自动检测并安装 Docker(如缺失)→ 交互式提问 3~4 个问题(域名、PostgreSQL 内置/已有、Redis 内置/已有、Let's Encrypt 邮箱)→ 生成可直接运行的 Compose 栈(可选 Traefik + Let's Encrypt)。脚本还支持非交互参数,例如 --quick 一键内置 Postgres/Redis 部署到 8080 端口。生成物包含 docker-compose.yml、docker.env(内含 NC_DB_JSON_FILE、NC_REDIS_URL 等变量)、nocodb/db.json(knex 格式的数据库连接配置,支持内联自定义 CA)以及 update.sh 升级脚本,并自动把 docker.env 与 db.json 权限收紧为 600、在 SELinux 环境下为 bind mount 追加 :Z 后缀。
访问 GUI 与核心功能
部署完成后,通过浏览器访问 http://localhost:8080/dashboard 进入控制台,首个注册用户即为管理员。围绕这份文档的功能清单,NocoDB 的能力可以归为五块:
1. 电子表格界面(Spreadsheet UI)
- 搜索、排序、筛选、隐藏列;
- 多视图:Grid、Gallery、Kanban、Form;
- 视图分享:公开访问或密码保护;
- 个人视图与锁定视图;
- 单元格图片上传,支持 S3、MinIO、GCP、Azure、DigitalOcean、Linode、OVH、Backblaze 等对象存储;
- 角色体系:Owner、Creator、Editor、Commenter、Viewer、No Access 与自定义角色;
- 细粒度访问控制,可细化到数据库、表、列级别。
2. App Store(工作流自动化)
- 即时通讯:Microsoft Teams、Slack、Discord 等;
- 邮件:SMTP、SES、MailChimp;
- SMS:Twilio;以及 WhatsApp 与第三方 API 集成。
3. 程序化 API 访问
- REST API(带 Swagger 文档,仓库中 swagger 定义 与 swagger-v2 定义 随源码维护);
- GraphQL API;
- JWT 认证与社会化登录(Auth Social);
- API Token,用于对接 Zapier、Integromat 等集成平台。
4. 模式同步(Schema Sync) 支持在 NocoDB 界面之外对数据库做过 Schema 变更后的重新同步。官方文档提醒:跨环境迁移仍需要自行准备 Schema 迁移方案。
5. 审计日志(Audit) 所有用户操作日志集中存储、可查询,用于合规与追溯。
生产配置与环境变量要点
文档将"生产配置"的核心收敛为一句话:默认使用 SQLite 保存元数据,通过 NC_DB 指定自己的数据库。结合本仓库源码,把自托管时最常碰到的变量汇总如下:
| 环境变量 | 作用 | 源码依据 |
|---|---|---|
NC_DB |
元数据库连接串(pg://、mysql2://、mariadb://、sqlitefile:// 等,含 u/p/d 短参数) |
NcConfig.create、helpers.ts |
NC_DB_JSON_FILE |
以 knex 格式 JSON 文件替代连接串(setup.sh 即生成此文件) | NcConfig.create 分支 |
NC_AUTH_JWT_SECRET |
JWT 签名密钥,生产环境务必替换为随机值 | NcConfig.auth |
NC_SITE_URL |
对外站点地址,影响分享与回调链接 | NcConfig.ncSiteUrl |
NC_WORKER_CONTAINER |
置为 true 时该容器进入 worker 角色且不对外暴露端口 |
worker 判定 |
NC_REDIS_URL |
Redis 连接,用于缓存与实时协作 | quickstart-demo 编排 |
NC_APP_DATA_DIR / NC_TOOL_DIR |
数据目录覆盖(默认为当前工作目录) | getToolDir |
另外两个默认值也值得记住:服务端口默认 8080(NcConfig 中 port 的默认值);元数据库默认 SQLite 文件 noco.db(默认 meta 配置)。完整的变量清单以官方文档站为准,本文不在此逐一罗列。
开发环境说明
若要参与开发而非部署,仓库以 pnpm + lerna 管理 monorepo,主应用位于 packages/nocodb,前端位于 packages/nc-gui。需要特别指出的是:印尼语文档头部的 Node 徽章仍标注 >= 16.14.0,但当前 packages/nocodb 的 package.json 中 engines.node 已声明为 >= 22,本地开发请以仓库内声明为准,准备 Node 22 及以上环境。贡献流程参见 CONTRIBUTING 指南。
设计动机与项目使命
文档中"为什么做这个项目"一节给出了明确的立场:互联网企业普遍用电子表格或数据库支撑业务,电子表格每天被超十亿人协作使用,而数据库在计算能力上更强、团队却难以获得同等的操作效率;直接用 SaaS 方案则面临访问控制受限、厂商锁定、数据锁定、价格突变以及能力天花板等问题。NocoDB 由此出发,其使命是为全球互联网企业提供开源的最强 no-code 数据库界面,把强计算工具的访问民主化。
许可证
NocoDB 以 AGPLv3 协议发布,完整条款见 LICENSE.md。自托管使用与修改均受该协议约束,二次分发 SaaS 形态前建议先行评估合规性。
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 StartedRust0622
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