在fnOS飞牛NAS上部署宝塔NocoBase低零代码平台的方法温馨提醒本文全文免费严禁盗用、二次收费行为更新日志2026/03/29 首次发布2026/05/22 1、新增通过systemd托管进程实现重启后自动运行。2、新增一键更新脚本的范例。前言看过我上一篇文章的同学可能知道我在单位里部署了一台基于飞牛的NAS想想闲着也是闲着干脆额外部署了宝塔低代码平台用来做一套电子台账系统避免Excel表格或Word文档各种被改排版的问题同时又不希望像XX文档一样在线协作同一张表。当时我选择了AI推荐的JeeLowCode这一平台。这个平台分有社区版和商业版社区版确实是开源免费的。然而部署的过程不仅费时费力操作复杂官方提供的支持也非常少甚至连最基本的操作手册都被隐藏起来只有付费进了“收费群”的用户才有资格看。所以本质上这一平台的“开源免费”就是个玩笑收费版不仅底层代码结构都与社区版完全不同、互不兼容没付钱的用户甚至连怎么用这套平台都不一定能学得会。问AIJeeLowCode本身就够冷门了网上几乎没有什么可用的信息可以学习AI也给不出任何有价值的信息。所以思索再三我还是决定换一套平台进行开发。还是那句话我没有编程基础但复制粘贴和网站建设本身还是有点心得的。这回我换了个AI给我提供推荐于是发现了NocoBase这套系统。经过几天的高强度体验非常满意。NocoBase不仅不“歧视”免费用户更是给所有人提供了非常完善、充足的支持。官方文档全面开放90%的功能不受付费限制详见NocoBase定价安装简单快捷、占用资源少、付费与免费代码互相兼容、几乎可以实现零代码开发、能兼容Excel公式……虽然官方文档里的部署方案已经非常详细了但个中细节和优化方案我还是希望分享给大家。碎碎念JeeLowCode免费社区版主要有以下缺点依赖复杂前端静态后端JavaJava后端运行占用资源较多前端需要修改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_HOSTlocalhost -e DB_PORT3306 -e DB_DATABASEnocobase -e DB_USERroot -e DB_PASSWORD123456 -e DB_UNDERSCOREDtrue -e TZAsia/Shanghai其中DB_HOST是数据库IPDB_PORT是数据库端口DB_DATABASE是数据库名称DB_USER是你需要登录的账户DB_PASSWORD是密码DB_UNDERSCORED是允许小写的数据库名否则刚才创建nocobase数据库时必须全部大写TZ是时区。3、检查.env环境变量在项目下载完成后关闭终端窗口/www/wwwroot/目录下会出现一个my-nocobase-app的文件夹进入这个文件夹找到.env文件打开检查里面的内容应当大致如下APP_ENVdevelopmentAPP_KEY此处为APP_KEYAPP_PORT13000API_BASE_PATH/api/API_BASE_URLPLUGIN_PACKAGE_PREFIXDB_LOGGINGoffDB_DIALECTmariadbDB_HOSTlocalhostDB_PORT3306DB_DATABASEnocobaseDB_USERrootDB_PASSWORD123456TZAsia/ShanghaiDB_UNDERSCOREDtrueINIT_ROOT_EMAILadminnocobase.comINIT_ROOT_PASSWORDadmin123INIT_ROOT_NICKNAMESuper AdminINIT_ROOT_USERNAMEnocobase根据官方文档建议修改APP_KEY部分的内容以确保安全。其他内容请参照刚才下载项目时使用的链接如果都能对上比如数据库密码、名称等即可保存退出。4、部署NocoBase项目生产环境在my-nocobase-app目录下打开终端输入以下命令yarn install --production此时务必注意终端中的提示信息。如果出现了一列x.x.x的版本号并且终端卡在一处一直没有动静请按一下键盘的“↓”键此时你会发现终端需要你选择某个依赖的版本号这时候选择最新的回车就行。刚开始我就是没注意到这个导致终端等了半个小时都没有动静实际上部署过程是非常快的只需要大概1分钟。这一步完成后输入以下命令开始安装yarn nocobase install --langzh-CN这时候就不用手动操作任何东西等待安装完成即可。5、启动NocoBase并守护进程确保你依然位于my-nocobase-app目录下。根据官方文档NocoBase已自带PM2不需要额外安装输入以下命令即可实现后台启动进程常驻yarn start -d6、创建反向代理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/xmlrss 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-Controlpublic;access_log off;autoindex off;}location/static/plugins/{alias/www/wwwroot/my-nocobase-app/node_modules/;expires365d;add_header Cache-Controlpublic;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-Controlno-store, no-cache;add_headerX-Robots-Tagnoindex, nofollow;if_modified_since off;expires off;etag off;location~*\.(js|css)${expires365d;add_header Cache-Controlpublic;}}location^~/api/{proxy_pass http://127.0.0.1:13000;proxy_http_version1.1;proxy_set_headerUpgrade$http_upgrade;proxy_set_header Connectionupgrade;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-Controlno-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 ConnectionUpgrade;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_END10、使用Systemd启动并守护进程虽然官方提供了内置的PM2进程管理可以实现Nocobase进程的后台运行但实测中发现它并没有直接提供诸如服务器断电重启像飞牛系统更新之后自动恢复进程的能力。如果每次都要我们执行一次yarn start -d的话又太麻烦了所以我们可以直接将Nocobase创建成一个系统的服务利用Systemd来实现开机自启动和进程守护之后就不需要每次都手动执行启动命令了。首先如果你的网站已经在运行请先停止进程yarn nocobase pm2-stop之后来到/etc/systemd/system目录下新建一个名为“nocobase.service”的文件使用宝塔创建时注意设置好所有者打开这个文件在其中写入如下代码[Unit]DescriptionNocoBase ServiceAfternetwork.target[Service]Typesimple# 运行工作目录WorkingDirectory/www/wwwroot/my-nocobase-app# 启动命令ExecStartyarn start# 崩溃、意外退出自动重启RestartalwaysRestartSec5[Install]WantedBymulti-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[!-fyarn.lock];thenecho-e\n【错误】当前可能不在NocoBase目录下请将脚本放置在NocoBase网站根目录执行\nexit1fiecho 停止 Nocobase 服务 systemctl stop nocobase# 判断上一条命令停止服务是否执行成功if[$?-ne0];thenecho-e\n【错误】Nocobase 服务停止失败请检查服务状态\nexit1fiecho 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稳定版的升级。注升级前强烈建议先手动备份数据库至此所有部署工作结束
在fnOS飞牛NAS上部署宝塔+NocoBase低(零)代码平台的方法
在fnOS飞牛NAS上部署宝塔NocoBase低零代码平台的方法温馨提醒本文全文免费严禁盗用、二次收费行为更新日志2026/03/29 首次发布2026/05/22 1、新增通过systemd托管进程实现重启后自动运行。2、新增一键更新脚本的范例。前言看过我上一篇文章的同学可能知道我在单位里部署了一台基于飞牛的NAS想想闲着也是闲着干脆额外部署了宝塔低代码平台用来做一套电子台账系统避免Excel表格或Word文档各种被改排版的问题同时又不希望像XX文档一样在线协作同一张表。当时我选择了AI推荐的JeeLowCode这一平台。这个平台分有社区版和商业版社区版确实是开源免费的。然而部署的过程不仅费时费力操作复杂官方提供的支持也非常少甚至连最基本的操作手册都被隐藏起来只有付费进了“收费群”的用户才有资格看。所以本质上这一平台的“开源免费”就是个玩笑收费版不仅底层代码结构都与社区版完全不同、互不兼容没付钱的用户甚至连怎么用这套平台都不一定能学得会。问AIJeeLowCode本身就够冷门了网上几乎没有什么可用的信息可以学习AI也给不出任何有价值的信息。所以思索再三我还是决定换一套平台进行开发。还是那句话我没有编程基础但复制粘贴和网站建设本身还是有点心得的。这回我换了个AI给我提供推荐于是发现了NocoBase这套系统。经过几天的高强度体验非常满意。NocoBase不仅不“歧视”免费用户更是给所有人提供了非常完善、充足的支持。官方文档全面开放90%的功能不受付费限制详见NocoBase定价安装简单快捷、占用资源少、付费与免费代码互相兼容、几乎可以实现零代码开发、能兼容Excel公式……虽然官方文档里的部署方案已经非常详细了但个中细节和优化方案我还是希望分享给大家。碎碎念JeeLowCode免费社区版主要有以下缺点依赖复杂前端静态后端JavaJava后端运行占用资源较多前端需要修改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_HOSTlocalhost -e DB_PORT3306 -e DB_DATABASEnocobase -e DB_USERroot -e DB_PASSWORD123456 -e DB_UNDERSCOREDtrue -e TZAsia/Shanghai其中DB_HOST是数据库IPDB_PORT是数据库端口DB_DATABASE是数据库名称DB_USER是你需要登录的账户DB_PASSWORD是密码DB_UNDERSCORED是允许小写的数据库名否则刚才创建nocobase数据库时必须全部大写TZ是时区。3、检查.env环境变量在项目下载完成后关闭终端窗口/www/wwwroot/目录下会出现一个my-nocobase-app的文件夹进入这个文件夹找到.env文件打开检查里面的内容应当大致如下APP_ENVdevelopmentAPP_KEY此处为APP_KEYAPP_PORT13000API_BASE_PATH/api/API_BASE_URLPLUGIN_PACKAGE_PREFIXDB_LOGGINGoffDB_DIALECTmariadbDB_HOSTlocalhostDB_PORT3306DB_DATABASEnocobaseDB_USERrootDB_PASSWORD123456TZAsia/ShanghaiDB_UNDERSCOREDtrueINIT_ROOT_EMAILadminnocobase.comINIT_ROOT_PASSWORDadmin123INIT_ROOT_NICKNAMESuper AdminINIT_ROOT_USERNAMEnocobase根据官方文档建议修改APP_KEY部分的内容以确保安全。其他内容请参照刚才下载项目时使用的链接如果都能对上比如数据库密码、名称等即可保存退出。4、部署NocoBase项目生产环境在my-nocobase-app目录下打开终端输入以下命令yarn install --production此时务必注意终端中的提示信息。如果出现了一列x.x.x的版本号并且终端卡在一处一直没有动静请按一下键盘的“↓”键此时你会发现终端需要你选择某个依赖的版本号这时候选择最新的回车就行。刚开始我就是没注意到这个导致终端等了半个小时都没有动静实际上部署过程是非常快的只需要大概1分钟。这一步完成后输入以下命令开始安装yarn nocobase install --langzh-CN这时候就不用手动操作任何东西等待安装完成即可。5、启动NocoBase并守护进程确保你依然位于my-nocobase-app目录下。根据官方文档NocoBase已自带PM2不需要额外安装输入以下命令即可实现后台启动进程常驻yarn start -d6、创建反向代理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/xmlrss 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-Controlpublic;access_log off;autoindex off;}location/static/plugins/{alias/www/wwwroot/my-nocobase-app/node_modules/;expires365d;add_header Cache-Controlpublic;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-Controlno-store, no-cache;add_headerX-Robots-Tagnoindex, nofollow;if_modified_since off;expires off;etag off;location~*\.(js|css)${expires365d;add_header Cache-Controlpublic;}}location^~/api/{proxy_pass http://127.0.0.1:13000;proxy_http_version1.1;proxy_set_headerUpgrade$http_upgrade;proxy_set_header Connectionupgrade;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-Controlno-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 ConnectionUpgrade;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_END10、使用Systemd启动并守护进程虽然官方提供了内置的PM2进程管理可以实现Nocobase进程的后台运行但实测中发现它并没有直接提供诸如服务器断电重启像飞牛系统更新之后自动恢复进程的能力。如果每次都要我们执行一次yarn start -d的话又太麻烦了所以我们可以直接将Nocobase创建成一个系统的服务利用Systemd来实现开机自启动和进程守护之后就不需要每次都手动执行启动命令了。首先如果你的网站已经在运行请先停止进程yarn nocobase pm2-stop之后来到/etc/systemd/system目录下新建一个名为“nocobase.service”的文件使用宝塔创建时注意设置好所有者打开这个文件在其中写入如下代码[Unit]DescriptionNocoBase ServiceAfternetwork.target[Service]Typesimple# 运行工作目录WorkingDirectory/www/wwwroot/my-nocobase-app# 启动命令ExecStartyarn start# 崩溃、意外退出自动重启RestartalwaysRestartSec5[Install]WantedBymulti-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[!-fyarn.lock];thenecho-e\n【错误】当前可能不在NocoBase目录下请将脚本放置在NocoBase网站根目录执行\nexit1fiecho 停止 Nocobase 服务 systemctl stop nocobase# 判断上一条命令停止服务是否执行成功if[$?-ne0];thenecho-e\n【错误】Nocobase 服务停止失败请检查服务状态\nexit1fiecho 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稳定版的升级。注升级前强烈建议先手动备份数据库至此所有部署工作结束