NocoDB在线表格数据库:fnOS部署、MySQL可视化与远程协作实操
前言
本文在飞牛 fnOS 环境中通过 Docker 部署 NocoDB,并继续搭建 MySQL 8.0 作为外部数据源。NocoDB 容器映射到主机 8086,数据目录挂载到当前路径下的 nocodb;MySQL 则通过 Docker Compose 运行并映射 3306。
数据库部分实际创建 shan 数据库与 user 表,写入两条测试数据,再从 NocoDB 中连接该 MySQL 数据源,确认表结构与数据能够在网页端显示。随后继续从网页新增数据、创建字段、编辑字段并按 name 查询,再用 JSON 文件做一次外部数据导入。
远程部分安装 cpolar,把 NocoDB 的 8086 暴露为 HTTP 公网入口,先验证随机域名,再切换固定二级子域名。
整篇重点放在"fnOS---NocoDB---MySQL---网页增删改查---数据导入---远程协作"这条实际链路上。
同时需要区分演示参数与长期使用配置:示例里的 JWT Secret、MySQL root 密码和 bind-address=0.0.0.0 都不应该直接作为生产环境的安全基线。
这篇也会把"页面能打开"和"数据库真的连通"分开验证。NocoDB 自己创建 Base 只是第一层,后面还要看到 MySQL 里的两条测试数据出现在网页中,并再从 NocoDB 写回数据,用 SELECT * FROM user; 回到数据库确认,才能说明连接链路真正生效。如果后面准备给团队长期使用,这种验证方式也更重要,因为一旦网页端和数据库端的数据不一致,问题可能出在连接、权限、字段结构或数据源配置任何一层。

1 NocoDB更适合解决哪类问题
NocoDB 的核心不是把表格做得更漂亮,而是把数据库操作变成更直观的网页界面。
对于不会 SQL 的用户来说,可以通过:
- 网格视图;
- 看板;
- 表单;
- 字段配置;
- 数据筛选;
- 排序和查询;
- 多人协作;
来管理数据。
对于已经有 MySQL、PostgreSQL 或 SQLite 的用户来说,它又可以继续连接现有数据源。
所以我更愿意把 NocoDB 看成:
数据库和在线表格之间的一层可视化界面。
这篇真正验证的也主要是两类能力:
- 自己新建 Base 和表;
- 连接现有 MySQL 数据库并继续编辑数据。
2 先把fnOS的SSH和Docker准备好
进入飞牛 fnOS 设置,先打开 SSH:

然后使用终端连接:

连接成功后:

接下来检查 Docker。
执行:
shell
docker -v
systemctl status -v

这里第二条 systemctl status -v 本身比较可疑,但属于现有代码块,我保留不改。
真正需要确认的是:
Docker 已经可以正常使用。
3 启动NocoDB容器
这篇使用的 Docker 命令如下:
shell
docker run -d \
docker run -d \
--name noco \
-v "$(pwd)"/nocodb:/usr/app/data/ \
-p 8086:8080 \
-e NC_AUTH_JWT_SECRET="569a1821-0a93-45e8-87ab-eb857f20a010" \
nocodb/nocodb:latest

参数里几个关键点:
- 容器名:
noco - 数据目录:
$(pwd)/nocodb:/usr/app/data/ - 主机端口:
8086 - 容器端口:
8080 - 环境变量:
NC_AUTH_JWT_SECRET - 镜像:
nocodb/nocodb:latest
这里要特别注意一个明显问题:
代码块开头连续出现了两次:
docker run -d \
这很像复制时重复了一行。
为了保持技术内容不被擅自修改,我没有直接删掉,但真正执行时需要先检查命令格式。
另外,示例 JWT Secret 是固定写在命令里的。
如果长期使用,不建议继续照搬同一串密钥。
4 先确认NocoDB页面能打开
浏览器访问:
http://飞牛IP:8086
页面:

做到这里,只能说明 NocoDB 容器已经启动、Web 页面可访问。
后面还要继续验证 Base、表格和外部数据库连接。
5 再准备一个MySQL 8.0数据源
为了验证 NocoDB 连接外部数据库,这篇又单独部署了 MySQL。
先创建目录:
shell
mkdir mysql
cd mysql/
然后创建并编辑:
docker-compose.yml
代码保持如下:
shell
vi docker-compose.yml
version: "3.8"
services:
mysql:
image: mysql:8.0
container_name: mysql
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: "Sjixin520!" # root密码,和你NocoDB填写保持一致
TZ: "Asia/Shanghai"
volumes:
- ./mysql-data:/var/lib/mysql # 数据持久化,NAS本地文件夹
command:
--default-authentication-plugin=mysql_native_password
--bind-address=0.0.0.0 # 允许局域网所有IP连接
root@fnOS:/docker/mysql# docker-compose up -d
这个代码块里也有一个明显的拼接问题。
Compose YAML 末尾混入了:
root@fnOS:/docker/mysql# docker-compose up -d
这其实是 Shell 提示符和命令,不属于 YAML 配置。
我同样没有直接修改代码块,但实际照做时要注意把命令和 YAML 文件分开。
6 MySQL这组参数更适合测试,不适合直接照搬生产
当前 MySQL 配置里用了:
MYSQL_ROOT_PASSWORD: "Sjixin520!"3306:3306--bind-address=0.0.0.0mysql_native_password
这些设置能让连接更直接,但同时也把访问面放宽了。
尤其:
bind-address=0.0.0.0
表示 MySQL 会监听所有地址。
如果飞牛主机所在网络本身可被更多设备访问,就应该继续结合防火墙、来源限制和数据库账号权限来收紧。
另外,长期使用时最好不要让 NocoDB 直接拿 root 账号作为业务连接账号,而是单独创建最小权限用户。
7 启动MySQL容器
启动命令:
shell
docker compose up -d
然后连接:
shell
mysql -h127.0.0.1 -P3306 -uroot -p

能够正常进入 MySQL 以后,再继续准备测试数据。
8 创建shan数据库
执行:
shell
CREATE DATABASE shan CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

这里创建:
shan
数据库,并使用:
utf8mb4
字符集。
9 创建user表
进入 shan 后创建表:
shell
use shan;
CREATE TABLE `user` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`name` VARCHAR(50) NOT NULL COMMENT '姓名',
`phone` VARCHAR(20) DEFAULT NULL COMMENT '手机号',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
然后查看:
shell
SHOW TABLES;

这个 user 表包含:
idnamephonecreate_time
作为后面的 NocoDB 可视化验证已经足够。
10 先在MySQL里写两条数据
执行:
shell
INSERT INTO user (name, phone)
VALUES
('李四','13900139000'),
('王五','13700137000');

当前写入:
- 李四
- 王五
后面进入 NocoDB 以后,要确认这两条数据能不能正常显示。
这一步相当于给后面的"同步验证"先准备一个基准。
11 第一次进入NocoDB
初次打开 NocoDB,需要先注册账号密码:

继续填写基本信息:

登录后:

进入工作区:

现在才开始真正使用 NocoDB。
12 先自己创建一个Base
点击:
New Base

填写名称和类型:

创建成功:

进入 Base:

然后新建表:

继续编辑表结构:


这一段验证的是 NocoDB 自己创建表格和字段的基础能力。
13 再把现有MySQL接进NocoDB
接下来验证更有价值的一部分:
不重新建数据,而是直接接现有 MySQL。
进入外部数据源连接:

填写连接参数,并选择刚才创建的数据库:

测试连接以后创建:

连接成功状态:

然后就能看到:
shan
数据库里的数据。

进入表以后:

这说明 MySQL 里的 user 表已经通过 NocoDB 的网页界面显示出来。
14 这才是NocoDB真正有意思的地方
传统方式下,如果想修改 MySQL 数据,往往需要:
- SQL 客户端;
- SQL 语句;
- 数据库权限;
- 或者专门做一套后台页面。
NocoDB 则把这一层变成网页表格。
所以这篇最值得看的不是"新建一张在线表"。
而是:
已有数据库也能被转换成一个更容易操作的可视化界面。
15 再验证一次数据同步
这篇继续插入一组数据:

然后回到 NocoDB:

新数据已经能显示。
接着直接在 NocoDB 页面里新增数据:

再回到 MySQL 查询:
shell
SELECT * FROM user;

这里的验证思路很清楚:
MySQL中的数据能被NocoDB看到,NocoDB中新增的数据也能回写到MySQL。
这比只看"连接成功"更有意义。
16 字段也可以继续在网页里维护
创建新字段:

再进行字段编辑:

然后根据:
name
字段查询:

这一部分更接近普通在线表格的使用体验。
对于不熟悉 SQL 的成员来说,学习成本会低很多。
17 NocoDB也支持直接导入外部文件
进入导入功能:

可以看到支持多种格式:

这里以 JSON 为例:
json
[
{
"id": 1,
"username": "zhangsan",
"age": 22,
"email": "zhangsan@test.com"
},
{
"id": 2,
"username": "lisi",
"age": 25,
"email": "lisi@test.com"
},
{
"id": 3,
"username": "wangwu",
"age": 28,
"email": "wangwu@test.com"
}
]
选择文件:

系统自动识别字段:

导入完成:

所以 NocoDB 不只能接外部数据库,也可以继续从文件开始建立数据。
18 这套本地部署的数据边界怎么理解
当前这篇里:
- NocoDB 跑在飞牛 fnOS;
- MySQL 也跑在飞牛 fnOS;
- NocoDB 连接的是本机/局域网 MySQL;
- 表数据由 MySQL 保存;
- NocoDB 自己的配置和元数据也落在挂载目录里。
所以从这篇实际链路看,核心数据确实由自己的设备承载。
但"自托管"并不自动等于"没有安全风险"。
真正长期使用还应该继续关注:
- 数据库账号;
- NocoDB账号;
- JWT Secret;
- 数据库备份;
- NAS权限;
- 远程访问入口。
19 本地跑通以后,再处理远程协作
前面已经完成:
- NocoDB启动;
- MySQL部署;
- Base和表;
- 外部MySQL接入;
- 数据同步;
- JSON导入。
如果只在局域网使用,到这里已经够了。
如果希望异地团队也能通过浏览器打开 NocoDB,再继续处理公网入口。
这里 cpolar 只负责把 NocoDB Web 页面带到外部网络。
MySQL 的 3306 并没有在后面的 cpolar 流程里继续做公网穿透。
这一点是好事:
远程用户访问的是NocoDB界面,而不是直接把数据库端口暴露出去。
20 安装cpolar
执行:
shell
sudo curl https://get.cpolar.sh | sh

安装完成后检查:
shell
sudo systemctl status cpolar

然后通过主机 IP 加:
9200
进入 Web UI:

21 先创建NocoDB随机公网地址
进入隧道管理,创建隧道:
- 隧道名称:
nocodb - 协议:
http - 本地地址:
8086 - 域名类型:随机域名
- 地区:
China Top

创建完成后查看在线隧道:

复制公网地址测试:

页面能够正常打开以后,说明 NocoDB Web UI 已经可以从外部访问。
22 远程协作真正开放的是什么
这里开放的是:
NocoDB网页入口。
团队成员通过浏览器进入 NocoDB,再按照 NocoDB 自己的账号和权限操作数据。
这和直接开放 MySQL 3306 是两回事。
更合理的远程协作方式应该是:
- 数据库留在内网;
- 用户从 NocoDB 进入;
- 再由 NocoDB 按数据库连接处理数据。
这样网络边界会更容易控制。
23 长期使用再切换固定二级子域名
进入预留页面:

这里示例使用:
nocodbb

然后回到隧道列表,编辑 NocoDB 隧道:

修改为:
- 域名类型:二级子域名;
- Sub Domain:填写预留名称;
- 地区:
China Top。
更新:

然后查看在线隧道:

最后通过固定地址访问:

页面正常打开以后,固定入口就配置完成。
具体套餐、固定域名条件和地址规则可能变化,长期使用时应以账号页面为准。
24 真正用于团队时,权限比"能打开"更重要
这篇已经证明异地设备可以打开 NocoDB。
但团队长期使用时,更重要的是:
- 每个人用独立账号;
- 不共享管理员账号;
- 按角色分配权限;
- 不让所有成员直接接触 MySQL root;
- 数据库定期备份;
- JWT Secret 不使用公开示例;
- MySQL 密码不要写成教程里的固定值。
NocoDB 把数据操作变简单以后,权限管理反而更应该认真做。
25 这套方案更适合什么场景
我觉得它比较适合:
- 个人台账;
- 运维资产登记;
- 小团队 CRM;
- 库存管理;
- 内部项目台账;
- 业务数据录入;
- 已有 MySQL 数据库的可视化管理。
如果只是几十行一次性的临时数据,普通在线表格会更轻。
但如果数据需要长期维护、多人录入,还要和真实数据库保持一致,NocoDB 这种"数据库 + 表格界面"的组合就开始有价值。
总结
整套流程可以拆成四层:fnOS 与 Docker 负责运行环境,NocoDB 提供网页表格界面,MySQL 保存业务数据,公网入口负责把 8086 带到外部浏览器。
本地阶段已经完成 NocoDB 初始化、自建 Base、MySQL 8.0、shan 数据库、user 表、数据插入、外部数据源连接、双向数据验证和 JSON 导入。
公网阶段只开放 NocoDB Web 页面,没有继续把 MySQL 3306 通过 cpolar 暴露出去,这种结构比直接让远程用户连接数据库更容易控制。
真正用于团队时,还应该把示例 JWT Secret、root 密码、bind-address=0.0.0.0 和账号权限重新收紧。这样 NocoDB 才不仅是一个"能用的在线表格",而是一套更适合长期维护的轻量数据管理入口。