在fnOS飞牛NAS上部署宝塔+NocoBase低(零)代码平台的方法
2026/5/23 9:48:30 网站建设 项目流程

在fnOS飞牛NAS上部署宝塔+NocoBase低(零)代码平台的方法

温馨提醒:本文全文免费,严禁盗用、二次收费行为!


更新日志:

2026/03/29 首次发布
2026/05/22 1、新增通过systemd托管进程,实现重启后自动运行。2、新增一键更新脚本的范例。


前言

看过我上一篇文章的同学可能知道,我在单位里部署了一台基于飞牛的NAS,想想闲着也是闲着,干脆额外部署了宝塔+低代码平台用来做一套电子台账系统,避免Excel表格或Word文档各种被改排版的问题,同时又不希望像XX文档一样在线协作同一张表。
当时我选择了AI推荐的JeeLowCode这一平台。这个平台分有社区版和商业版,社区版确实是开源免费的。然而,部署的过程不仅费时费力,操作复杂,官方提供的支持也非常少,甚至连最基本的操作手册都被隐藏起来,只有付费进了“收费群”的用户才有资格看。所以,本质上这一平台的“开源免费”就是个玩笑,收费版不仅底层代码结构都与社区版完全不同、互不兼容,没付钱的用户甚至连怎么用这套平台都不一定能学得会。问AI?JeeLowCode本身就够冷门了,网上几乎没有什么可用的信息可以学习,AI也给不出任何有价值的信息。
所以思索再三,我还是决定换一套平台进行开发。还是那句话,我没有编程基础,但复制粘贴和网站建设本身还是有点心得的。这回我换了个AI给我提供推荐,于是发现了NocoBase这套系统。经过几天的高强度体验,非常满意。
NocoBase不仅不“歧视”免费用户,更是给所有人提供了非常完善、充足的支持。官方文档全面开放,90%的功能不受付费限制(详见:NocoBase定价),安装简单快捷、占用资源少、付费与免费代码互相兼容、几乎可以实现零代码开发、能兼容Excel公式……
虽然官方文档里的部署方案已经非常详细了,但个中细节和优化方案我还是希望分享给大家。


碎碎念

JeeLowCode免费社区版主要有以下缺点:

  • 依赖复杂,前端静态,后端Java
  • Java后端运行占用资源较多
  • 前端需要修改Nginx配置文件,需要比较充足的知识储备
  • 前后端分离导致牵扯到各种端口号相关的问题
  • 未提供生产环境部署的简洁方案,只能从源码编译。耗时长、硬件要求高
  • 联动校验、部门数据权限这种最基础的功能根本找不到在哪设置
  • 实际还是涉及了较多代码的编写
  • 官方不提供任何技术文档,只能在社区提问(大概率还是会丢给你一个文档的链接,而你不付费还是看不到),或自己摸黑研究
  • 与付费版架构不同,底层代码互不兼容,功能不互通,无法直接迁移,无法获得同等的更新内容。如果试用满意决定付费,有可能需要彻底重新开发

而NocoBase免费版目前主要有以下缺点:

  • 手机版页面目前没有开发完成
  • 不提供用户具体行为的审计功能
  • 不能接入外部数据库,只能在本机的MySQL、MariaDB和PostgreSQL中选择
  • 用户注册、登录时可用的认证方式比较单一,不支持微信、手机号等方式登录
  • 登录后,超时注销的设置比较模糊
  • 不能接入钉钉、企业微信、微信小程序等第三方平台
  • 安全防护能力较差(对内部小规模使用环境基本无影响)
  • 不提供备份、迁移功能

请各位自行判断,选择适合自己的平台。


序、推荐或必要的硬件配置和软件环境

硬件设备:安装了fnOS飞牛的NAS一台(建议为x86架构,免费版不支持国产化ARM硬件)
物理内存:至少4GB
虚拟内存:至少2GB(物理内存+Swap总合推荐6~8GB,部署了Docker或飞牛应用较多的请根据实际情况灵活调整)
网络连接:必须
CPU:理论上没有最低限度,当然配置越高越好
硬盘:飞牛、宝塔和网站项目所在硬盘推荐使用SSD;对象存储可直接利用NAS存储阵列


一、在飞牛上部署宝塔面板

注意:本文默认你已经获得了root权限,全程在root账户下操作。若没有,请自行添加sudo命令,本文不再赘述。

这部分教程请参阅我的上一篇文章:在fnOS飞牛NAS上部署宝塔+JeeLowCode低代码平台的方法
具体步骤基本照抄即可,只需要注意:
1、Node.js版本必须安装20.x,不能低也不能高,实测24.x是不能通过create-nocobase-app的方式部署NocoBase的。
2、安装Node.js时,宝塔面板中的“Registry源”必须选择“npmmirror中国镜像”,否则yarn模块可能安装失败。
3、不需要安装JAVA环境和JDK。
4、Node.js安装后,请检查右侧“模块”菜单,确保yarn已经正确安装。

二、通过create-nocobase-app的方式部署NocoBase

首先,强烈建议大家参阅官方文档:NocoBase 文档
其次,本教程将使用MariaDB作为数据库,其他数据库请自行参考。

注:NocoBase其实支持Docker方式零代码部署,但出于资源占用的考量,我没有选择Docker。个人建议对Linux环境了解不多的用户,反而不要轻易尝试Docker,某些时候搞不好还要比命令行麻烦,还有小概率遇到奇奇怪怪的问题。

1、创建数据库

通过宝塔的“数据库-phpMyAdmin-通过面板访问”,登录MariaDB,新建一个数据库。名称可以自己定义,本文将以“nocobase”为例,编码保持utf8mb4不变。

默认情况下,数据库使用root账户访问。若你有安全性方面的需求,请自行研究创建用户、分配权限等方面的操作,本文不再赘述。

2、配置Yarn国内镜像

分别输入以下3行命令,避免国内下载项目时速度过慢的问题:

yarn config set disable-self-update-check true yarn config set registry https://registry.npmmirror.com/ yarn config set sqlite3_binary_host_mirror https://npmmirror.com/mirrors/sqlite3/

2、下载nocobase项目

在宝塔面板左侧点击“文件”,进入/www/wwwroot/目录(宝塔建站的目录,其他环境请自行调整),点击上方的“终端”按钮,在此处打开终端。
修改并输入以下命令:

yarn create nocobase-app my-nocobase-app -d mariadb -e DB_HOST=localhost -e DB_PORT=3306 -e DB_DATABASE=nocobase -e DB_USER=root -e DB_PASSWORD=123456 -e DB_UNDERSCORED=true -e TZ=Asia/Shanghai

其中,DB_HOST是数据库IP,DB_PORT是数据库端口,DB_DATABASE是数据库名称,DB_USER是你需要登录的账户,DB_PASSWORD是密码,DB_UNDERSCORED是允许小写的数据库名(否则刚才创建nocobase数据库时必须全部大写),TZ是时区。

3、检查.env环境变量

在项目下载完成后,关闭终端窗口,/www/wwwroot/目录下会出现一个my-nocobase-app的文件夹,进入这个文件夹,找到.env文件打开,检查里面的内容,应当大致如下:

APP_ENV=developmentAPP_KEY=(此处为APP_KEY)APP_PORT=13000API_BASE_PATH=/api/API_BASE_URL=PLUGIN_PACKAGE_PREFIX=DB_LOGGING=offDB_DIALECT=mariadbDB_HOST=localhostDB_PORT=3306DB_DATABASE=nocobaseDB_USER=rootDB_PASSWORD=123456TZ=Asia/ShanghaiDB_UNDERSCORED=trueINIT_ROOT_EMAIL=admin@nocobase.comINIT_ROOT_PASSWORD=admin123INIT_ROOT_NICKNAME=Super AdminINIT_ROOT_USERNAME=nocobase

根据官方文档,建议修改APP_KEY部分的内容,以确保安全。其他内容请参照刚才下载项目时使用的链接,如果都能对上,比如数据库密码、名称等,即可保存退出。

4、部署NocoBase项目(生产环境)

在my-nocobase-app目录下打开终端,输入以下命令:

yarn install --production

此时,务必注意终端中的提示信息。如果出现了一列x.x.x的版本号,并且终端卡在一处一直没有动静,请按一下键盘的“↓”键,此时你会发现终端需要你选择某个依赖的版本号,这时候选择最新的,回车就行。刚开始我就是没注意到这个,导致终端等了半个小时都没有动静,实际上部署过程是非常快的,只需要大概1分钟。

这一步完成后,输入以下命令开始安装:

yarn nocobase install --lang=zh-CN

这时候就不用手动操作任何东西,等待安装完成即可。

5、启动NocoBase并守护进程

确保你依然位于my-nocobase-app目录下。
根据官方文档,NocoBase已自带PM2,不需要额外安装,输入以下命令即可实现后台启动+进程常驻:

yarn start -d

6、创建反向代理

NocoBase非常贴心地给你准备了Nginx用的配置文件范例。首先,确保你位于my-nocobase-app目录下,打开终端,输入以下命令:

yarn nocobase create-nginx-conf

此时,在my-nocobase-app/storage/目录下,会生成一个nocobase.conf的配置范例。打开它,将里面的代码复制出来备用。

点击左侧的“网站-反向代理”,点击“添加反代”,域名设置为你已经解析好到NAS的的域名(参见NAS的DDNS设置),目标设为127.0.0.1:13000(与.env文件的APP_PORT端口号相同,部署前可以自己修改,确保两边相同即可),其他不需要修改,点击确定。

点击创建好的反代右侧的“设置-配置文件”,将刚才复制出来的nocobase配置范例跟宝塔创建的原始配置文件内容结合一下,并根据实际情况修改,最终代码参考如下:

log_format apm'"$time_local" client=$remote_addr ''method=$request_method request="$request" ''request_length=$request_length ''status=$status bytes_sent=$bytes_sent ''body_bytes_sent=$body_bytes_sent ''referer=$http_referer ''user_agent="$http_user_agent" ''upstream_addr=$upstream_addr ''upstream_status=$upstream_status ''request_time=$request_time ''upstream_response_time=$upstream_response_time ''upstream_connect_time=$upstream_connect_time ''upstream_header_time=$upstream_header_time';server{# Nginx监听端口号,务必与APP_PORT不同,避免Nginx因端口冲突启动失败listen13001;# 开启IPv6监听,避免公网无法访问listen[::]:13001;server_name nocobase.domain.com;root/www/wwwroot/my-nocobase-app/node_modules/@nocobase/app/dist/client;index index.html;client_max_body_size0;# 关闭access log,避免Nginx启动时遇到奇怪的错误,有需要的请自行研究# access_log /var/log/nginx/nocobase.log apm;gzip on;gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;# 保留宝塔原始创建的Nginx配置文件片段,以便顺利申请、添加SSL证书#CERT-APPLY-CHECK--START# 用于SSL证书申请时的文件验证相关配置 -- 请勿删除include/www/server/panel/vhost/nginx/well-known/nocobase.domain.com.conf;#CERT-APPLY-CHECK--END#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则#error_page 404/404.html;#SSL-END#REDIRECT START#REDIRECT END#ERROR-PAGE-START 错误页配置,可以注释、删除或修改#error_page 404 /404.html;#error_page 502 /502.html;#ERROR-PAGE-END#一键申请SSL证书验证目录相关设置location/.well-known{allow all;}#禁止在证书验证目录放入敏感文件if($uri~"^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$"){return403;}location/storage/uploads/{alias/www/wwwroot/my-nocobase-app/storage/uploads/;add_header Cache-Control"public";access_log off;autoindex off;}location/static/plugins/{alias/www/wwwroot/my-nocobase-app/node_modules/;expires365d;add_header Cache-Control"public";access_log off;autoindex off;location~^/static/plugins/@([^/]+)/([^/]+)/dist/client/(.*)${allow all;}location~^/static/plugins/([^/]+)/dist/client/(.*)${allow all;}location~^/static/plugins/(.*)${deny all;}}location/{alias/www/wwwroot/my-nocobase-app/node_modules/@nocobase/app/dist/client/;try_files$uri$uri//index.html;add_header Last-Modified$date_gmt;add_header Cache-Control'no-store, no-cache';add_headerX-Robots-Tag"noindex, nofollow";if_modified_since off;expires off;etag off;location~*\.(js|css)${expires365d;add_header Cache-Control"public";}}location^~/api/{proxy_pass http://127.0.0.1:13000;proxy_http_version1.1;proxy_set_headerUpgrade$http_upgrade;proxy_set_header Connection'upgrade';proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_headerX-Forwarded-Proto$scheme;proxy_set_headerHost$host;proxy_set_headerReferer$http_referer;proxy_set_header User-Agent$http_user_agent;add_header Cache-Control'no-cache, no-store';proxy_cache_bypass$http_upgrade;proxy_connect_timeout600;proxy_send_timeout600;proxy_read_timeout600;send_timeout600;}location/ws{proxy_pass http://127.0.0.1:13000/ws;proxy_http_version1.1;proxy_set_headerUpgrade$http_upgrade;proxy_set_header Connection"Upgrade";proxy_set_headerHost$host;}}

你可以直接照抄我上面的代码,根据自己的实际情况修改监听端口号、域名,并将access log注释掉(不注释掉的话,我自己跑起来Nginx会报错,懒得解决了),然后点击保存即可。

此时检查左侧“URL代理”页面,确保里面出现了以下内容即可:

注意此处的端口号跟配置文件中的监听端口号不同。

7、测试NocoBase访问

在飞牛防火墙中放行13001端口(参照我之前的文章)。

在浏览器中访问“DDNS域名:Nginx端口号”,如:“nocobase.domain.com:13001”(再次强调,与.env文件中的APP_PORT端口号不能一样)。
如果能够正常出现登录界面,输入默认的超管账号:nocobase,密码:admin123,如果能够正常登录,则全部部署正确完成。
进入平台后,请尽快修改默认超管的账号密码。

8、设置软链接转移对象存储位置

NocoBase的本地对象存储(文件存储)放在网站根目录/storage/uploads/目录下,并且在设置中不可修改。虽然免费版也支持阿里云、亚马逊和腾讯云的对象存储,但既然我们已经部署在NAS下了,还是那一句话:放着好端端的存储阵列不用干嘛?

但我们并不是没有办法绕开这个限制。只需要利用系统的软链接功能,将./storage/uploads/映射到NAS存储阵列里就好了。
以本文的飞牛OS为例,存储空间挂载在/vol*/下,其中,*是存储空间的序号。例如存储空间1一般就是/vol1/,以此类推。我们还会看到类似/vol01/这样的挂载点,但你可以点进去看看,通常都是共享文件、网盘挂载之类的挂载点。
在确认好你想要放置的存储空间后(本文以存储空间1为例),进入目录,如vol1,在其中新建一个文件夹,如nocobase:

右键-权限,确保权限为755,用户设置为root,或与你NocoBase项目运行的用户一致。

之后回到/www/wwwroot/my-nocobase-app/storage/目录下,将uploads文件夹整个复制到刚才在NAS存储空间中创建的nocobase文件夹:

再回到/www/wwwroot/my-nocobase-app/storage/目录,将原先的uploads文件夹整个删除。

接着在此处打开终端,输入以下命令:

ln -s /vol1/nocobase/uploads uploads

之后退出终端,你应该能在当前目录下看到如下内容:

这样就代表软链接创建成功了。之后在NocoBase中上传附件时,文件会直接保存在/vol1/nocobase/uploads/目录下,而不会占用网站所在的硬盘空间。

9、申请SSL证书并开启HTTP2

根据NocoBase官方文档,开启HTTP2有助于显著提高网站响应速度。目前主流浏览器都已支持HTTP2,并且宝塔面板在导入SSL证书后,也会自动帮你打开HTTP2,这里就不用专门操作了。

SSL证书理论上可以直接通过宝塔申请,具体操作很简单了,本文不再赘述。
如果宝塔申请失败,而你也在用飞牛OS的话,可以前往飞牛的应用商店,下载AllinSSL这个软件,配置好授权API,并提交证书申请。在申请成功后,下载证书压缩包,打开后找到Nginx文件夹,里面分别有“key.pem”和“cert.pem”两个文件,用记事本打开,分别复制粘贴到宝塔的手动部署SSL页面即可。其中,密钥对应的是key.pem,证书对应的是cert.pem。

如果你不在使用飞牛OS,其他申请的办法还有很多,大家网上自己找找教程就好。
比如纯命令行环境下安装了LNMP一键安装包(www.lnmp.org),也可以直接使用lnmp ssl add命令申请,或是直接在lnmp vhost add过程中顺便就把证书一起申请了。

在SSL证书添加完成后,再次来到“配置文件”,此时你会发现代码多出了SSL端口和SSL证书相关的东西。这时我们需要修改一下SSL监听的端口,因为默认的443有可能和飞牛产生冲突。

server{listen13001;# 修改SSL端口为443以外的端口号,避免冲突listen13002ssl;listen13002quic;# 以下为监听IPv6相关,端口号与上半部分设置相同listen[::]:13002ssl;listen[::]:13002quic;# 宝塔已默认打开HTTP2,没有的话手动加上这一行http2 on;listen[::]:13001;

修改好后,保存配置文件。此时通过浏览器访问https://域名:SSL端口号,能够访问的话就证明证书和HTTP2已经部署成功。
你可以根据自己的需要,在宝塔中打开“强制HTTPS”功能的开关。有必要的还可以打开“HTTPS防窜站”功能,避免多个网站项目甚至飞牛OS本身因为单个SSL证书无法独立访问的问题,具体请百度。

此外,为了避免飞牛本身因为窜站无法访问,建议NocoBase使用单独的子域名。例如,飞牛使用的是fnos.domain.com,而nocobase则使用nocobase.domain.com。这个可以直接通过飞牛的DDNS实现,不需要跑去别的地方申请。

注意:在打开“强制HTTPS”后,配置文件中会出现如下内容:

#HTTP_TO_HTTPS_STARTset$isRedcert1;if($server_port!=443){set$isRedcert2;}if($uri~/\.well-known/){set$isRedcert1;}if($isRedcert!=1){rewrite^(/.*)$ https://$host$1 permanent;}#HTTP_TO_HTTPS_END

我们要修改一下“443”这个端口号。因为宝塔默认你是通过443端口访问的网站项目,而之前我们显然已经设置成了别的端口,所以在这里要改成你设置好的SSL端口,并在下放“$host$1”的位置额外加上端口号(此处以13002为例):

#HTTP_TO_HTTPS_STARTset$isRedcert1;if($server_port!=13002){set$isRedcert2;}if($uri~/\.well-known/){set$isRedcert1;}if($isRedcert!=1){rewrite^(/.*)$ https://$host:13002$1 permanent;}#HTTP_TO_HTTPS_END

10、使用Systemd启动并守护进程

虽然官方提供了内置的PM2进程管理,可以实现Nocobase进程的后台运行,但实测中发现它并没有直接提供诸如服务器断电重启(像飞牛系统更新之后)自动恢复进程的能力。如果每次都要我们执行一次yarn start -d的话又太麻烦了,所以我们可以直接将Nocobase创建成一个系统的服务,利用Systemd来实现开机自启动和进程守护,之后就不需要每次都手动执行启动命令了。

首先,如果你的网站已经在运行,请先停止进程:

yarn nocobase pm2-stop

之后,来到/etc/systemd/system目录下,新建一个名为“nocobase.service”的文件,使用宝塔创建时注意设置好所有者:

打开这个文件,在其中写入如下代码:

[Unit]Description=NocoBase ServiceAfter=network.target[Service]Type=simple# 运行工作目录WorkingDirectory=/www/wwwroot/my-nocobase-app# 启动命令ExecStart=yarn start# 崩溃、意外退出自动重启Restart=alwaysRestartSec=5[Install]WantedBy=multi-user.target

注:如果你的Nocobase所在目录不一样,请自行修改。

之后在终端中分别执行如下命令:

systemctl daemon-reload systemctl enable nocobase systemctlstartnocobase

之后,再执行systemctl status nocobase看看是否已经处于绿色的active和enabled状态,没有报错。如果一切正常,则设置完成。

(可选)11、NocoBase一键升级脚本范例

在NocoBase网站根目录下创建一个upgrade.sh,使用终端执行chmod +x upgrade.sh赋予执行权限,之后用文本编辑器打开,参照以下内容输入:

#!/bin/bash# 进入脚本所在目录# cd "$(dirname "$0")" || exit# 判断是否存在 yarn.lock 文件if[!-f"yarn.lock"];thenecho-e"\n【错误】当前可能不在NocoBase目录下,请将脚本放置在NocoBase网站根目录执行!\n"exit1fiecho"===== 停止 Nocobase 服务 ====="systemctl stop nocobase# 判断上一条命令(停止服务)是否执行成功if[$?-ne0];thenecho-e"\n【错误】Nocobase 服务停止失败,请检查服务状态!\n"exit1fiecho"===== Nocobase 服务停止成功"echo-e"\n===== 执行 Nocobase 升级 ====="yarnnocobase upgradeecho-e"\n===== 启动 Nocobase 服务(后台运行) ====="systemctl start nocobaseif[$?-ne0];thenecho-e"\n【错误】Nocobase 服务启动失败!"exit1fisystemctl status nocobaseecho-e"\n===== 操作完成!====="

之后,你只需要在终端中执行./upgrade.sh即可一键完成NocoBase稳定版的升级。
注:升级前强烈建议先手动备份数据库!

至此,所有部署工作结束

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询