飞牛部署Mtab完整实战:Docker安装、MySQL建库与固定地址访问
前言
这篇完整走一遍飞牛 NAS 部署 Mtab 的流程:先确认 Docker 环境,拉取 itushan/mtab 镜像,用 9205:80 启动容器,并把 /opt/mtab 挂载到容器 /app。
Web安装页能够打开以后,再登录 MySQL,创建 mtab_db、专用用户 mtab_user 和对应权限,然后把数据库信息填回 Mtab 安装向导,完成管理员初始化、书签分类和页面设置。
后半部分继续把 9205 做成外部访问入口,并配置固定二级子域名,让不同设备都能打开同一套导航页。
整篇重点放在"Docker---Mtab---MySQL---初始化---远程访问"这条链路上,同时把Docker容器里的数据库地址、mtab_user@'%'权限范围、systemctl status -v以及结尾混入LAMP/LNMP源码安装条件这些问题分开说明。
相比只演示一个漂亮首页,这篇更关注可复现性:容器到底映射到哪个端口、数据库从哪里连、独立用户怎么授权、页面初始化以后数据怎么保存,都要顺着一条链验证。这样后面无论换端口、迁移数据库,还是增加远程访问,都更容易判断问题卡在哪一层。
另外,这篇不会把源码安装和Docker安装混在一起。前者需要单独准备PHP、Nginx等Web环境,后者已经通过镜像封装了运行环境;两条路线的数据库和初始化逻辑可以相通,但前置条件并不一样。

1 Mtab真正解决的是"书签入口统一",不是替代浏览器
Mtab更适合做:
- 常用网站导航;
- 工作入口;
- 学习资料分类;
- 多设备统一书签页;
- 自建浏览器首页。
它不是浏览器插件,而是一套独立Web应用。
所以它和浏览器收藏夹的关系更像:
浏览器书签负责临时收藏,Mtab负责把高频入口重新整理成一个长期导航页。
这篇重点不是把所有功能都讲一遍,而是把:
飞牛部署 → 数据库 → 初始化 → 远程访问
这一条链跑通。
2 自建Mtab意味着数据放在自己的服务器,不等于"绝对不会泄露"
Mtab支持自托管。
这意味着:
- 程序运行在自己的飞牛;
- 数据库由自己维护;
- 书签数据不必交给公共导航站。
但这并不能直接推出:
- 没有任何第三方依赖;
- 永远不会泄露;
- 公网开放后天然安全。
真正的数据安全仍然取决于:
- 管理员密码;
- MySQL权限;
- 是否公开管理入口;
- 是否启用HTTPS;
- 是否定期备份;
- 软件本身是否及时更新。
3 先在飞牛开启SSH
进入飞牛设置,打开SSH:

继续确认:

然后从终端连接:

后面的Docker和MySQL配置都从这里完成。
4 先确认Docker环境
执行:
shell
docker -v
systemctl status -v
飞牛主页也能看到Docker状态:

其中:
docker -v
可以直接验证Docker命令。
但:
systemctl status -v
这个写法比较可疑。
如果执行时报参数错误,不应该直接判断Docker没有启动,而是先确认真正要查看的服务名和systemctl参数。
代码块按现有内容原样保留。
5 拉取Mtab镜像
执行:
shell
docker pull itushan/mtab

这里使用的是:
itushan/mtab
当前Docker Hub和项目仓库仍然提供这个镜像。
官方部署说明也明确给出了Docker方式,因此这一条技术路线本身没有问题。
6 启动Mtab容器
执行:
shell
docker run -itd --name mtab-new -p 9205:80 -v /opt/mtab:/app itushan/mtab

这里几个参数分别是:
- 容器名:
mtab-new - 宿主机端口:
9205 - 容器端口:
80 - 宿主机目录:
/opt/mtab - 容器目录:
/app
也就是:
飞牛9205 → Mtab容器80
项目官方示例常用9200,但宿主机端口本身可以根据实际占用情况修改。
9205在这里属于当前部署选择,不是Mtab固定端口。
7 先打开9205安装页面
浏览器访问:
http://飞牛IP:9205

看到安装页面以后,只能证明:
Mtab容器已经提供Web页面。
这时应用还没有完成数据库初始化。
下一步才是准备MySQL。
8 Docker部署和源码部署不要混成一套前提
文章结尾又提到:
- LAMP/LNMP;
- PHP ≥ 7.4;
- MySQL ≥ 5.7;
- 源码下载。
这属于另一条:
源码 / Web环境部署路线。
当前正文实际走的是:
Docker镜像部署。
Docker镜像已经封装了Mtab Web运行环境,因此没有必要再把"手工准备PHP/Nginx"写成Docker路线的必选步骤。
当前Docker方式真正还需要单独准备的是:
可用MySQL数据库。
9 创建Mtab专用数据库
先登录MySQL:
shell
mysql -u root -p
然后创建数据库:
shell
CREATE DATABASE mtab_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
这里使用:
utf8mb4
能够更好地覆盖中文、Emoji等字符。
数据库名:
mtab_db
可以根据自己环境调整。
10 不要直接让Mtab长期使用MySQL root
创建专用用户:
shell
CREATE USER 'mtab_user'@'%' IDENTIFIED BY 'your_strong_password';
再授权:
shell
GRANT ALL PRIVILEGES ON mtab_db.* TO 'mtab_user'@'%';
FLUSH PRIVILEGES;
这样Mtab只使用:
mtab_user
而不是长期拿MySQL root账号连接。
这一点是对的。
应用使用独立数据库账号,更容易:
- 控制权限;
- 单独改密码;
- 排查连接;
- 后续迁移。
11 mtab_user@'%'虽然方便,但权限范围很宽
当前命令创建的是:
'mtab_user'@'%'
其中 % 表示:
允许这个MySQL用户从任意来源主机尝试连接。
这对测试很方便。
但长期使用时,如果Mtab的连接来源是固定的,更适合限制:
- 指定IP;
- 指定Docker网段;
- 指定容器网络范围。
尤其不要为了让Mtab连数据库,就顺手把3306直接暴露到公网。
12 验证数据库和用户
查看数据库:
shell
SHOW DATABASES;
再看用户:
shell
SELECT User, Host FROM mysql.user WHERE User = 'mtab_user';

能看到:
mtab_db
和:
mtab_user
以后,数据库准备基本完成。
13 这里最容易踩坑的是"数据库地址=localhost"
回到Mtab安装页面:

源表格里写:
数据库地址:localhost
但当前Mtab运行在Docker容器里。
官方Mtab Docker说明明确提醒:
容器部署时,数据库地址不要填写127.0.0.1,因为容器内的本机地址不是宿主机网络。
localhost本质上存在同样的问题。
在Mtab容器内部:
localhost指向Mtab容器自己。
并不会自动指向飞牛宿主机上的MySQL。
14 正确数据库地址取决于MySQL到底跑在哪里
如果MySQL运行在飞牛宿主机:
可以填写:
飞牛在容器侧可访问的宿主机IP
如果MySQL也是一个Docker容器,并和Mtab在同一Docker网络:
更适合填写:
MySQL容器服务名 / 容器名
官方Mtab提供的Compose示例也是让应用通过:
mysql
这个服务名访问数据库。
所以数据库地址不能机械照抄成localhost。
15 3306也不是"远程就必须开放公网"
源步骤写:
如果是远程服务器,请确保防火墙开放3306。
这句话范围太大。
如果:
- Mtab和MySQL在同一台主机;
- 两个容器在同一Docker网络;
- 只需要内网连接;
都没有必要把3306对互联网公开。
更合理的原则是:
数据库只开放给真正需要连接它的主机或容器。
16 数据库连接成功后继续安装
填写正确的:
- 数据库地址;
- 3306;
- 用户名;
- 密码;
- 数据库名。
然后测试:

连接成功以后,再继续下一步。
17 设置Mtab管理员账号
数据库初始化完成后:

设置管理员账号和密码。
这里建议使用:
- 单独密码;
- 足够长度;
- 不和其他网站复用。
尤其后面准备做外部访问时,Mtab管理员账号就是基础防线。
18 完成安装以后先在局域网验证
安装完成:

进入首页:

先确认:
- 页面正常加载;
- 数据库没有报错;
- 默认书签能够读取;
- 登录状态正常。
这一步成功以后,才说明:
浏览器 → 9205 → Mtab → MySQL
完整基础链已经通了。
19 先实际点一次导航链接
页面自带一些导航:

实际点开一个链接。
这能验证:
导航页不只是显示出来,跳转也能正常工作。
不过外部网站是否可访问,仍然取决于当前设备自己的网络。
20 分类管理是Mtab最核心的长期功能之一
进入分类设置:

真正用久以后,Mtab好不好用,很大程度取决于:
- 分类是否清晰;
- 名称是否容易理解;
- 高频网站有没有放在前面;
- 是否把所有链接堆成一屏。
导航工具不是收藏越多越好。
而是:
真正需要的时候能快速找到。
21 常规设置继续按自己的使用习惯调整
设置页面:

继续:

这里可以根据实际需求调整页面显示和使用方式。
这篇截图能够证明的是:
设置入口存在并可配置。
不需要把所有可能功能都扩大描述。
22 到这里,本地Mtab已经可以正常使用
目前已经完成:
- Docker运行;
- 9205页面;
- MySQL数据库;
- 专用数据库用户;
- 管理员初始化;
- 导航跳转;
- 分类;
- 常规设置。
如果只在家里或办公室局域网使用,到这里已经足够。
后面的步骤解决:
离开当前网络以后怎样继续打开自己的导航页。
23 安装cpolar
执行:
shell
sudo curl https://get.cpolar.sh | sh

再检查服务:
shell
sudo systemctl status cpolar

然后进入:
飞牛IP:9200

后面的网络入口都在这里配置。
24 给Mtab的9205创建随机公网地址
配置:
- 隧道名称:
mtab - 协议:
http - 本地地址:
9205 - 域名类型:随机域名
- 地区:
China Top

创建以后查看在线隧道:

从外部设备打开:

页面可以加载以后说明:
外部浏览器 → 公网地址 → cpolar → 飞牛9205 → Mtab
网络链已经打通。
25 公网访问以后,安全要求会比局域网更高
Mtab页面里保存的可能是:
- 公司系统入口;
- NAS地址;
- 管理后台;
- 私人网站;
- 常用服务。
这些网址本身就可能透露个人使用习惯和内部服务结构。
所以远程使用时至少应该:
- 管理员密码足够强;
- 不公开分享管理账号;
- 避免把敏感内网地址放在公开页面;
- 数据库不对公网开放;
- 有条件时使用HTTPS。
Mtab官方部署说明本身也建议外网访问时配合HTTPS。
26 cpolar只负责网络入口
Mtab负责:
- 导航;
- 分类;
- 用户和书签。
MySQL负责:
- 数据存储。
cpolar负责:
- 外部浏览器怎么到达9205。
三层职责要分开。
公网能打开,不代表Mtab数据库和管理员权限自动安全。
27 随机地址适合先验证
先用随机地址确认:
- 页面能打开;
- 登录正常;
- 分类能加载;
- 跳转正常;
- 手机浏览器显示正常。
这些都确认以后,再决定是否需要固定地址。
28 配置固定二级子域名
进入预留页面:

保留:
mtab

然后进入隧道列表:

修改为:
二级子域名

更新以后:

最后从外部设备访问:

页面仍然正常,就说明固定入口配置完成。
29 固定地址解决的是入口稳定,不是永久承诺
源步骤写:
永久不会变化。
更稳妥的说法应该是:
在账号、套餐和对应服务条件持续有效的情况下,固定二级子域名不需要像随机地址那样频繁修改。
它的价值是:
- 书签地址稳定;
- 浏览器主页不用反复改;
- 手机和电脑都可以保存同一个入口。
它不意味着服务永久存在。
30 这篇真正跑通了什么
应用:
飞牛 → Docker → Mtab → 9205
数据:
Mtab → MySQL → mtab_db
初始化:
数据库连接 → 管理员账号 → 分类设置
远程:
外部浏览器 → 公网地址 → 9205 → Mtab
真正完成:
- 飞牛SSH;
- Docker环境;
- Mtab镜像;
9205:80;/opt/mtab:/app;- MySQL建库;
- 独立数据库用户;
- 管理员初始化;
- 分类和设置;
- 随机公网访问;
- 固定二级子域名。
需要特别注意:
- Docker里的数据库地址不能机械填localhost;
mtab_user@'%'权限范围较宽;- 3306不应该默认对公网开放;
systemctl status -v写法可疑;- Docker路线和源码LAMP/LNMP路线不要混写;
- 固定地址不等于永久;
- 自托管不等于绝对安全。
总结
整套流程可以拆成四层:Docker负责运行Mtab,MySQL负责保存数据,Mtab负责导航与分类,公网入口负责让外部设备访问9205。
本文已经完成Mtab容器、MySQL专用数据库和用户、管理员初始化、分类设置,以及随机和固定地址访问。
最需要修正的是数据库连接:Docker部署下不能把localhost当成宿主机MySQL地址;另外mtab_user@'%'和3306公网开放也不适合作为默认生产配置。
把这些边界处理好以后,这篇更准确的定位是:在飞牛上搭一套可以长期维护、跨设备访问的自托管书签导航,而不是用"完全私有、绝对安全"来包装一个网页工具。