Ubuntu 22.04 安装 Bigcapital v0.25.44 指南

在 Ubuntu 22.04 上以源码方式安装 Bigcapital v0.25.44 的完整实测指南,覆盖在线源码包与离线包两种方案、systemd 服务托管、Nginx 反向代理、数据库初始化、升级降级与排障实录。

BigcapitalBigcapital财务记账UbuntuUbuntu 22.042026/10/23

Ubuntu 22.04 安装 Bigcapital v0.25.44 指南

Bigcapital 是一套开源(AGPL-3.0)的财务记账与库存管理 Web 系统,采用 React 前端 + NestJS 后端的多包(monorepo)源码结构,运行时依赖 MariaDB(系统库 + 租户库)与 Redis(任务队列)。本文以 Ubuntu 22.04 为目标环境,给出两条完整的源码安装路径:方案 A(在线源码包安装) 与 方案 B(离线包安装),并在同一环境中完成了 systemd 托管、Nginx 前端托管与 API 反向代理、首个组织初始化、升级降级演练与排障沉淀。

软件定位与选型分析见 《Bigcapital v0.25.44 介绍与选型指南》;如更倾向使用官方打包的整套部署形态,参见 《Bigcapital v0.25.44 Docker Compose 部署指南》;环境变量逐项含义见 《Bigcapital v0.25.44 配置参数详解》。

本文所有命令与回显均在下述实测环境中逐条执行并采集,面向真实服务器视角书写;同一命令在不同机器上的耗时、进度条等非确定性输出会有差异,关键状态行(版本号、批次号、HTTP 状态码等)以实测为准。

一、环境信息

服务器配置(实测环境):

项目说明
操作系统Ubuntu 22.04.5 LTS(x86_64)
CPU12 核
内存31 GiB
磁盘可用空间 334 GB
网络时间UTC

软件版本清单(均为实测安装后的实际版本):

软件版本安装来源
Node.jsv18.20.8NodeSource apt 仓库(node_18.x)
pnpm9.0.5npm 全局安装(npm 10.8.2)
MariaDB10.6.23Ubuntu 22.04 官方仓库
Redis6.0.16Ubuntu 22.04 官方仓库
Nginx1.18.0Ubuntu 22.04 官方仓库
Git2.34.1Ubuntu 22.04 官方仓库

版本核实命令与回显:

cat /etc/os-release | head -2
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
node -v; pnpm -v; nginx -v; mariadb --version; redis-server -v
v18.20.8
9.0.5
nginx version: nginx/1.18.0 (Ubuntu)
mariadb  Ver 15.1 Distrib 10.6.23-MariaDB, for debian-linux-gnu (x86_64) using  EditLine wrapper
Redis server v=6.0.16 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=d6ed09173b889769

二、前置条件

  1. 一台 Ubuntu 22.04 服务器,具备 root 或 sudo 权限;本文命令均以 root 执行(构建 Bigcapital 时切换到专用普通用户,见 4.6)。
  2. 方案 A 要求服务器能访问 GitHub 发布物站点(codeload.github.com)与 npm 依赖源;方案 B 只要求目标服务器与维护机之间可传输文件。
  3. 端口规划:80(Nginx 对外)、3000(Bigcapital Server,仅监听本机使用)。数据库与 Redis 均为本机访问。
  4. 资源建议:2 核 4 GiB 起步;前端构建阶段内存占用较高,4 GiB 以下机器建议增加交换分区。实测环境为 12 核 31 GiB,全程构建顺利。
  5. 演示约定(后文所有示例沿用):
    • 数据库专用账号:bigcapital / q1w2e3r4;
    • 系统管理员账号:admin@bigcapital.local / q1w2e3r4t6(Bigcapital 注册口令强制要求不少于 10 位,8 位的 q1w2e3r4 会被拒绝,实测报错见 9.6);
    • 服务器对内地址:127.0.0.1,示例访问地址 http://localhost/。

三、版本选型说明

3.1 Bigcapital 版本选择

本文安装 v0.25.44,为官方 GitHub 仓库当前最新稳定发布版(发布于 2026-10-15,版本信息查询日期 2026-10-22),发布物随仓库源码一同提供。安装统一采用官方发布源码包(refs/tags/v0.25.44),不使用开发分支——实测发现开发分支默认 HEAD(提交 d2a0bf1,2026-09-23)对应的标签仍是 v0.25.42,落后最新发布版两个版本,直接克隆默认分支得到的并非最新稳定版。

3.2 运行时版本对照

源码包根目录 package.json 对 Node.js 的约束(实测摘录):

grep -A3 '"engines"' /opt/bigcapital/package.json
  "engines": {
    "node": "16.x || 17.x || 18.x"
  },

据此确定的运行时选型:

组件实测选型说明
Node.js18.20.8engines 允许 16.x/17.x/18.x,取 18.x LTS 最新版;NodeSource 仓库安装
pnpm9.0.5仓库为 pnpm workspace 工程,锁文件(pnpm-lock.yaml)按 pnpm 9 生成
MariaDB10.6.23Ubuntu 22.04 官方仓库默认版本,实测可完整跑通全部迁移(31 个系统迁移 + 70 张租户表)
Redis6.0.16Ubuntu 22.04 官方仓库默认版本,可运行;服务日志提示推荐 6.2.0 及以上(见 9.5)
Nginx1.18.0用于托管前端静态文件并反向代理 API

四、方案A:在线源码包安装

4.1 方案说明

从官方发布地址下载 v0.25.44 源码包(含 pnpm-lock.yaml 锁定依赖版本),在服务器上联网安装依赖、构建前后端、初始化数据库,并用 systemd 托管常驻。该方案版本与官方发布物严格一致,适合可联网的服务器环境。

流程总览:系统依赖 → Node.js 18 与 pnpm → MariaDB 与 Redis → 数据库与账号 → 下载源码包 → 编写 .env → 安装依赖 → 构建后端 → 数据库迁移 → 构建前端 → 直接启动验证 → systemd 托管。

4.2 安装系统依赖

apt-get update && apt-get install -y git curl build-essential nginx mariadb-server redis-server

实测回显(在已完成安装的环境复跑,全新服务器会显示逐包下载与安装过程):

git is already the newest version (1:2.34.1-1ubuntu1.18).
nginx is already the newest version (1:18.0-6ubuntu14.21).
mariadb-server is already the newest version (1:10.6.23-0ubuntu0.22.04.1).
redis-server is already the newest version (5:6.0.16-1ubuntu1.2).
0 upgraded, 0 newly installed, 0 to remove and 3 not upgraded.

build-essential 提供编译工具链(部分依赖包安装时需要),git/curl 为下载与辅助工具。

4.3 安装 Node.js 18 与 pnpm

添加 NodeSource 的 Node 18 仓库并安装:

curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
3 packages can be upgraded. Run 'apt list --upgradable' to see them.
2026-10-22 18:04:01 - Repository configured successfully.
2026-10-22 18:04:01 - To install Node.js, run: apt install nodejs -y
2026-10-22 18:04:01 - You can use N|solid Runtime as a node.js alternative
2026-10-22 18:04:01 - To install N|solid Runtime, run: apt install nsolid -y
apt-get install -y nodejs
nodejs is already the newest version (18.20.8-1nodesource1).
0 upgraded, 0 newly installed, 0 to remove and 3 not upgraded.

全局安装 pnpm 9(Bigcapital 仓库为 pnpm workspace 工程,不要用 yarn/npm 安装依赖):

npm install -g pnpm@9
1 package is looking for funding
  run `npm fund` for details

验证:

node -v; pnpm -v
v18.20.8
9.0.5

4.4 启用 MariaDB 与 Redis

systemctl enable --now mariadb redis-server
Synchronizing state of redis-server.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable redis-server
Synchronizing state of mariadb.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable mariadb

验证两个服务均已运行:

systemctl is-active mariadb redis-server; redis-cli ping
active
active
PONG

4.5 初始化数据库与专用账号

Bigcapital 使用两类数据库:系统库(固定库名 bigcapital_system,存放用户、租户、组织登记等全局数据)与租户库(每个组织一个,库名 bigcapital_tenant_<组织ID>,在组织初始化时由程序自动创建,见 4.12)。因此专用账号必须对 bigcapital% 前缀的所有库具备完整权限:

mysql -u root <<'EOF'
CREATE DATABASE bigcapital_system CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'bigcapital'@'localhost' IDENTIFIED BY 'q1w2e3r4';
GRANT ALL PRIVILEGES ON `bigcapital%`.* TO 'bigcapital'@'localhost';
FLUSH PRIVILEGES;
EOF

确认授权结果:

mysql -u root -e "SHOW GRANTS FOR 'bigcapital'@'localhost';"
Grants for bigcapital@localhost
GRANT USAGE ON *.* TO `bigcapital`@`localhost` IDENTIFIED BY PASSWORD '*0971389F8E7F1AEB999104BDA7A0FA145087F348' WITH GRANT OPTION
GRANT ALL PRIVILEGES ON `bigcapital%`.* TO `bigcapital`@`localhost`

⚠️ 若跳过本步骤直接迁移,会得到 ER_BAD_DB_ERROR: Unknown database 'bigcapital_system' 报错(源码路径下的迁移 CLI 不会自动建库,详见 9.3)。账号权限收窄到 bigcapital% 前缀已实测足够:组织初始化时程序用该账号自动创建租户库成功(见 4.12 验证)。

4.6 下载并解压源码包

创建专用运行账号并下载解压(构建与运行均使用该账号,避免 root 运行应用):

useradd -r -m -d /opt/bigcapital-user -s /bin/bash bigcapital
cd /opt
curl -fsSL -o bigcapital-v0.25.44.tar.gz https://codeload.github.com/bigcapitalhq/bigcapital/tar.gz/refs/tags/v0.25.44

确认下载产物:

ls -lh /opt/bigcapital-v0.25.44.tar.gz
-rw-r--r-- 1 root root 8.7M Oct 22 18:06 bigcapital-v0.25.44.tar.gz

解压到 /opt/bigcapital:

cd /opt && tar xzf bigcapital-v0.25.44.tar.gz && mv bigcapital-0.25.44 bigcapital && rm bigcapital-v0.25.44.tar.gz

确认目录内容与体积:

ls /opt/bigcapital | head -8; du -sh /opt/bigcapital
AGENTS.md
CHANGELOG.md
CONTRIBUTING.md
DISCLAIMER
LICENSE
README.md
bin
commitlint.config.js
72M     /opt/bigcapital

4.7 编写环境配置文件 .env

在源码根目录创建 .env(Server 启动时会读取,本文件为最小可运行配置;完整变量模板见源码包内 .env.example,逐项含义见 《Bigcapital v0.25.44 配置参数详解》):

cat > /opt/bigcapital/.env <<'EOF'
APP_JWT_SECRET=ptsviuCqijT6S/3v4lM+ueLFJZiVwANRwmcZ54nWmVkLpTNrZlUK9ZDKPCnksZPc
DB_HOST=127.0.0.1
DB_USER=bigcapital
DB_PASSWORD=q1w2e3r4
DB_CHARSET=utf8
SYSTEM_DB_NAME=bigcapital_system
TENANT_DB_NAME_PERFIX=bigcapital_tenant_
BASE_URL=http://localhost
SIGNUP_DISABLED=false
SIGNUP_EMAIL_CONFIRMATION=false
EOF

关键项说明:

变量实测取值说明
APP_JWT_SECRET64 位随机串登录令牌签名密钥,生产环境必须更换为自己的随机值
DB_USER / DB_PASSWORDbigcapital / q1w2e3r4与 4.5 中创建的数据库账号一致
SYSTEM_DB_NAMEbigcapital_system系统库名
TENANT_DB_NAME_PERFIXbigcapital_tenant_租户库库名前缀(变量名中的 PERFIX 为项目原始拼写,照抄即可)
BASE_URLhttp://localhost对外访问地址,生产环境改为 http://<服务器IP或域名>
SIGNUP_DISABLEDfalse是否关闭注册入口

将目录属主交给运行账号(后续构建与运行都用 bigcapital 用户):

chown -R bigcapital:bigcapital /opt/bigcapital

4.8 安装项目依赖

sudo -u bigcapital bash -c 'cd /opt/bigcapital && pnpm install'

实测回显(关键行):

Scope: all 7 workspace projects
Lockfile is up to date, resolution step is skipped
Progress: resolved 1, reused 0, downloaded 0, added 0
Packages: +2864
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Progress: resolved 2864, reused 1686, downloaded 0, added 0

收尾行:

. prepare: fatal: not a git repository (or any of the parent directories): .git
. prepare: husky - git command not found, skipping install
. prepare: Done
Done in 5.6s

💡 两点说明:其一,回显中的 Done in 5.6s 是依赖缓存已就绪环境下的复跑耗时,全新服务器首次安装(联网下载 2864 个包)实测约 2 分 30 秒;其二,prepare 阶段的 .git 报错来自 husky 钩子安装——发布源码包本身不含 Git 仓库,husky 自动跳过属正常现象,不影响安装(见 9.6)。

4.9 构建后端

sudo -u bigcapital bash -c 'cd /opt/bigcapital && pnpm build:server'

实测回显(头部):


> bigcapital-monorepo@ build:server /opt/bigcapital
> lerna run build --scope "@bigcapital/server" --scope "@bigcapital/utils" --scope "@bigcapital/pdf-templates" --scope "@bigcapital/email-components"

lerna notice cli v8.1.3
lerna info versioning independent
lerna notice filter including ["@bigcapital/server","@bigcapital/utils","@bigcapital/pdf-templates","@bigcapital/email-components"]

实测回显(尾部):


 Lerna (powered by Nx)   Successfully ran target build for 4 projects

⚠️ 若构建报 ERR_DLOPEN_FAILED ... failed to map segment from shared object(涉及 /tmp/nx-native-file-cache/... 路径),是系统 /tmp 挂载了 noexec 所致,按 9.1 处理后重跑即可。

4.10 初始化数据库迁移

迁移 CLI 必须在 packages/server 目录下执行(迁移目录按当前工作目录解析,在其他目录执行会报 ENOENT,见 9.4):

sudo -u bigcapital bash -c 'cd /opt/bigcapital/packages/server && node dist/cli.js system:migrate:latest'
Batch 1 run: 31 migrations
sudo -u bigcapital bash -c 'cd /opt/bigcapital/packages/server && node dist/cli.js tenants:migrate:latest'
All tenants are migrated.

验证系统库表数量:

mysql -u bigcapital -pq1w2e3r4 -e "SELECT COUNT(*) AS system_tables FROM information_schema.tables WHERE table_schema='bigcapital_system';"
system_tables
17

4.11 构建前端

sudo -u bigcapital bash -c 'cd /opt/bigcapital && pnpm build:webapp'

实测回显(头部):


> bigcapital-monorepo@ build:webapp /opt/bigcapital
> lerna run build --scope "@bigcapital/webapp" --scope "@bigcapital/utils" --scope "@bigcapital/pdf-templates" --scope "@bigcapital/sdk-ts"

lerna notice cli v8.1.3
lerna info versioning independent
lerna notice filter including ["@bigcapital/webapp","@bigcapital/utils","@bigcapital/pdf-templates","@bigcapital/sdk-ts"]

实测回显(尾部):


 Lerna (powered by Nx)   Successfully ran target build for 4 projects

构建产物位于 /opt/bigcapital/packages/webapp/dist/(静态站点,由 Nginx 托管,见 7.2)。

4.12 直接启动验证

先以前台方式直接启动一次,确认 Server 能正常工作再交给 systemd:

sudo -u bigcapital bash -c 'cd /opt/bigcapital && nohup node packages/server/dist/main.js > /tmp/bigcapital-server.log 2>&1 &'

等待约 8 秒后验证 API:

curl -s http://127.0.0.1:3000/api/users
{"message":"Unauthorized","statusCode":401}

401 为预期结果——接口已被认证保护,匿名访问被拒绝。再确认 Swagger 文档页:

curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:3000/swagger
200

验证通过后停掉该进程,改用 systemd 托管:

pkill -f 'packages/server/dist/main.js'

4.13 systemd 服务托管

创建服务单元 /etc/systemd/system/bigcapital-server.service:

cat > /etc/systemd/system/bigcapital-server.service <<'EOF'
[Unit]
Description=Bigcapital API Server (NestJS)
After=network.target mariadb.service redis-server.service
Wants=mariadb.service redis-server.service

[Service]
Type=simple
User=bigcapital
WorkingDirectory=/opt/bigcapital
ExecStart=/usr/bin/node /opt/bigcapital/packages/server/dist/main.js
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

启动并设置开机自启:

systemctl daemon-reload && systemctl enable --now bigcapital-server

查看运行状态:

systemctl status bigcapital-server --no-pager | head -10
● bigcapital-server.service - Bigcapital API Server (NestJS)
     Loaded: loaded (/etc/systemd/system/bigcapital-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2026-10-22 17:51:24 UTC; 6s ago
   Main PID: 10854 (node)
      Tasks: 7 (limit: 94371)
     Memory: 190.1M
        CPU: 2.232s

日志中确认启动成功:

journalctl -u bigcapital-server --no-pager | grep Started | tail -1
Oct 22 17:51:24 bigcapital-src systemd[1]: Started Bigcapital API Server (NestJS).

五、方案B:离线包安装

5.1 方案说明

目标服务器完全无外网时的安装方式:在一台能联网的维护机上(可以是按方案 A 已装好的服务器),把含依赖(node_modules)的完整源码目录打成离线包,传输到目标服务器解包启动。离线包同时包含已构建好的前后端产物,目标服务器无需联网、无需 NodeSource 仓库、无需 pnpm,只需 Node.js 运行时与 MariaDB/Redis。

5.2 在联网机制作离线包

前提:联网机已按方案 A 完成 4.2~4.11(依赖已安装、前后端已构建)。排除 Git 目录、端到端测试目录与含密码的 .env 后打包:

cd /opt
tar --exclude='bigcapital/.git' --exclude='bigcapital/e2e' --exclude='bigcapital/.env' -czf /tmp/bigcapital-v0.25.44-dist.tar.gz bigcapital
ls -lh /tmp/bigcapital-v0.25.44-dist.tar.gz
-rw-r--r-- 1 bigcapital bigcapital 281M Oct 22 17:55 /tmp/bigcapital-v0.25.44-dist.tar.gz

打包内容(含依赖与构建产物)的总体积:

du -sh /opt/bigcapital
1.5G    /opt/bigcapital

💡 离线包必须包含 node_modules(目标机无法联网安装依赖),因此体积较大;.env 含数据库口令,通过单独拷贝配置的方式交付,不进包。

5.3 传输与解包

把离线包与 .env 拷贝到目标服务器的 /tmp(按实际维护机地址执行;传输命令本身无回显):

scp /tmp/bigcapital-v0.25.44-dist.tar.gz root@<目标服务器IP>:/tmp/
scp /opt/bigcapital/.env root@<目标服务器IP>:/tmp/bigcapital.env

目标服务器上准备运行账号并解包:

useradd -r -m -d /opt/bigcapital-user -s /bin/bash bigcapital
mkdir /opt/offline-extract && cd /opt/offline-extract && tar xzf /tmp/bigcapital-v0.25.44-dist.tar.gz && mv bigcapital /opt/bigcapital-offline && cd /opt && rmdir offline-extract

套用配置并修正属主:

cp /tmp/bigcapital.env /opt/bigcapital-offline/.env
chown -R bigcapital:bigcapital /opt/bigcapital-offline

确认解包结果(注意与源码包不同,离线解包目录已含依赖与构建产物):

du -sh /opt/bigcapital-offline && ls /opt/bigcapital-offline/packages/server/dist/main.js /opt/bigcapital-offline/packages/webapp/dist/index.html
1.5G    /opt/bigcapital-offline
/opt/bigcapital-offline/packages/server/dist/main.js
/opt/bigcapital-offline/packages/webapp/dist/index.html

5.4 配置数据库并启动验证

目标服务器需先完成与 4.2~4.5 相同的系统依赖、MariaDB/Redis 与数据库账号准备(这些均可离线进行:Ubuntu 安装光盘/本地源提供全部系统包,数据库初始化不依赖外网),.env 中的 BASE_URL 改为目标服务器的实际访问地址。

先以临时端口直接启动验证(不与已有实例冲突,此处用 3100 端口实测):

sudo -u bigcapital bash -c 'cd /opt/bigcapital-offline && PORT=3100 nohup node packages/server/dist/main.js > /tmp/bigcapital-offline.log 2>&1 &'

等待约 10 秒后验证:

curl -s http://127.0.0.1:3100/api/users
{"message":"Unauthorized","statusCode":401}

401 即离线部署成功。停止临时进程,按 4.13 创建 systemd 服务单元(把 WorkingDirectory 与 ExecStart 中的 /opt/bigcapital 改为 /opt/bigcapital-offline),即可交由 systemd 常驻。

六、方案对比与选择建议

维度方案A:在线源码包方案B:离线包
网络要求服务器需访问 codeload.github.com 与 npm 依赖源仅传输阶段需要维护机与目标机连通
依赖安装pnpm 联网安装 2864 个包(首次约 2.5 分钟)无需安装,node_modules 随包携带
构建产物目标机构建(需要构建工具链与内存)维护机构建,目标机直接使用
离线包体积下载源码包 8.7M离线包 281M(解包后 1.5G)
版本一致性与官方发布物严格一致与制作包时的源码一致
适用场景可联网服务器、批量新装无外网内网环境、机房隔离部署

选择建议:服务器能联网优先方案 A——流程标准、便于后续按第八章升级;内网隔离环境用方案 B,并在维护机上保留离线包与对应 .env 模板,作为后续升级的基础。两方案产出的运行形态完全一致(同样的 systemd 单元与 Nginx 配置),可随时从方案 A 切到方案 B 的分发模式做批量装机。

七、服务管理与配置说明

7.1 systemd 日常管理

systemctl restart bigcapital-server   # 重启
systemctl stop bigcapital-server      # 停止
systemctl status bigcapital-server    # 状态
journalctl -u bigcapital-server -f    # 跟踪日志

服务异常退出时由 systemd 按 Restart=on-failure 自动拉起(间隔 5 秒)。

7.2 Nginx 前端托管与 API 反向代理

创建站点配置 /etc/nginx/sites-available/bigcapital.conf:

cat > /etc/nginx/sites-available/bigcapital.conf <<'EOF'
server {
    listen 80 default_server;
    server_name _;

    root /opt/bigcapital/packages/webapp/dist;
    index index.html;

    # API 反向代理:转发到本机 3000 端口的 Bigcapital Server
    location /api/ {
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 25m;
    }

    # 前端单页应用:所有未命中路径回退到 index.html
    location / {
        try_files $uri $uri/ /index.html;
    }
}
EOF
ln -sf /etc/nginx/sites-available/bigcapital.conf /etc/nginx/sites-enabled/bigcapital.conf

检查语法并重载:

nginx -t && systemctl reload nginx
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

验证前端页面与 API 代理两条链路:

curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1/
200
curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1/api/users
401

200 说明前端站点已托管,401 说明 /api/ 前缀的请求已正确代理到 Server 并被认证保护。此时浏览器访问 http://<服务器IP>/ 即可打开 Bigcapital 登录/注册页面。

7.3 .env 核心配置项

除 4.7 的最小配置外,常用的可选项:

变量默认行为说明
PORT3000Server 监听端口,启动时可用环境变量覆盖(方案 B 的 3100 端口验证即通过 PORT=3100 实现)
SIGNUP_ALLOWED_DOMAINS / SIGNUP_ALLOWED_EMAILS空(不限制)注册邮箱白名单,多账号场景建议配置
GOTENBERG_URL空PDF 导出服务地址,不配置时相关导出功能不可用,其余功能不受影响
MAIL_* 系列空出站邮件(邀请、通知)配置,不配置不影响核心记账功能

全部环境变量的逐项解释与取值约束见 《Bigcapital v0.25.44 配置参数详解》。

八、升级、降级与多版本管理

8.1 升级流程(实测:v0.25.42 → v0.25.44)

升级本质是「换源码 → 重装依赖 → 重新构建 → 迁移数据库」,全程数据保留在 MariaDB 中,操作前先停服并备份当前目录:

systemctl stop bigcapital-server
cd /opt && mv bigcapital bigcapital-v0.25.42-bak

部署新版源码(联网机可直接下载新版本发布源码包,或按方案 B 用离线包),套用原配置:

cd /opt && tar xzf bigcapital-v0.25.44.tar.gz && mv bigcapital-0.25.44 bigcapital
cp bigcapital-v0.25.42-bak/.env bigcapital/.env
chown -R bigcapital:bigcapital /opt/bigcapital

重装依赖并构建(本次实测 v0.25.42 → v0.25.44,依赖有少量更新,安装耗时 52.1 秒):

sudo -u bigcapital bash -c 'cd /opt/bigcapital && pnpm install && pnpm build:server && pnpm build:webapp'
Done in 52.1s

 Lerna (powered by Nx)   Successfully ran target build for 4 projects

 Lerna (powered by Nx)   Successfully ran target build for 4 projects

执行迁移(本次升级实测新增 1 个系统迁移):

sudo -u bigcapital bash -c 'cd /opt/bigcapital/packages/server && node dist/cli.js system:migrate:latest && node dist/cli.js tenants:migrate:latest'
Batch 2 run: 1 migrations
-------------------
All tenants are migrated.

重启服务并验证:

systemctl start bigcapital-server
curl -s -o /dev/null -w 'api:%{http_code} ' http://127.0.0.1/api/users && curl -s -o /dev/null -w 'web:%{http_code}\n' http://127.0.0.1/
api:401 web:200

8.2 降级

Bigcapital 的数据库迁移不支持自动回退,降级采用「目录整体回退」:停服后把备份目录换回原路径,再重启服务。数据库层面需自行把系统库与租户库恢复到升级前的备份(升级前的 mysqldump 备份是降级的前提,建议每次升级前先执行)。

systemctl stop bigcapital-server
cd /opt && mv bigcapital bigcapital-v0.25.44-broken && mv bigcapital-v0.25.42-bak bigcapital
systemctl start bigcapital-server

8.3 多版本共存

如需并行验证多个版本,为每个版本准备独立目录、独立 .env(不同 PORT 与不同 SYSTEM_DB_NAME 前缀)与独立 systemd 单元即可;同一套 MariaDB 上多版本共存时,迁移记录按库名隔离,互不影响。生产环境建议单版本运行,多版本仅用于验证。

九、常见问题排障实录

9.1 构建报 ERR_DLOPEN_FAILED:failed to map segment from shared object

现象:pnpm build:server 失败,报错关键行:

Error: /tmp/nx-native-file-cache/2922472c08696a6abca9e97b97971d04f6f076227182e3ba025d610baa410592/19.0.7-nx.linux-x64-gnu.node: failed to map segment from shared object
  code: 'ERR_DLOPEN_FAILED'
 ELIFECYCLE  Command failed with exit code 1.

定位:构建器(Nx)会把原生二进制辅助文件解压到 /tmp/nx-native-file-cache/ 再动态加载,而该服务器 /tmp 挂载了 noexec(安全加固的常见配置),导致 .node 文件无法映射执行:

mount | grep ' /tmp '
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noexec,relatime,inode64)

解决:对 /tmp 重新挂载放开执行权限,清掉缓存后重跑构建:

mount -o remount,exec /tmp
rm -rf /tmp/nx-native-file-cache

复测构建通过(Successfully ran target build for 4 projects)。若 /tmp 加固策略不允许放开 noexec,可改为在 fstab 中为构建机单独挂载可执行的 tmpfs,或把构建临时目录指到其他可执行路径。

9.2 构建缓存权限冲突:nx postinstall EACCES

现象:先后用 root 与普通用户执行过构建的机器上,pnpm install 阶段 nx 的 postinstall 失败:

.../.pnpm/nx@19.0.7/node_modules/nx postinstall:   code: 'EACCES',
.../.pnpm/nx@19.0.7/node_modules/nx postinstall:   path: '/tmp/nx-native-file-cache/329f7b2ebd261c758970c346f1c8875ad8e09cb9d0c868adcfc591265a0cffa3'

定位与解决:/tmp/nx-native-file-cache 已被 root 用户创建,普通用户(bigcapital)无写入权限。删除缓存目录后重跑即可:

rm -rf /tmp/nx-native-file-cache

实测删除后 pnpm install 顺利完成。原则:同一台机器上构建始终使用同一个用户(本文统一为 bigcapital)。

9.3 迁移报 ER_BAD_DB_ERROR:Unknown database 'bigcapital_system'

现象:执行 node dist/cli.js system:migrate:latest 时报:

Error: ER_BAD_DB_ERROR: Unknown database 'bigcapital_system'

定位与解决:源码路径下的迁移 CLI 不会自动建库,必须先按 4.5 手工创建系统库。补齐后重跑迁移正常。

9.4 迁移报 ENOENT:scandir src/database/system/migrations

现象:在源码根目录直接执行迁移 CLI 时报:

Error: ENOENT: no such file or directory, scandir '/opt/bigcapital/src/database/system/migrations'

定位:迁移目录按「当前工作目录 + 相对路径 ./src/database/system/migrations」解析,在根目录执行时被解析成 /opt/bigcapital/src/...(不存在)。

解决:迁移类 CLI 一律在 packages/server 目录下执行:

cd /opt/bigcapital/packages/server && node dist/cli.js system:migrate:latest

实测切换目录后迁移正常(Batch 1 run: 31 migrations)。

现象:Server 日志中反复出现:

It is highly recommended to use a minimum Redis version of 6.2.0

定位:Ubuntu 22.04 官方仓库的 Redis 为 6.0.16,低于项目建议的 6.2.0。实测 6.0.16 下任务队列(组织初始化、租户库创建)工作正常,该提示为兼容性建议而非硬性阻断。

建议:生产环境建议接入 6.2+ 的 Redis(如从 Redis 官方 apt 仓库安装),或使用发行版可提供的更新版本;短期内保持 6.0.16 亦可运行,需在监控中关注队列相关日志。

9.6 注册口令不足 10 位被拒绝

现象:用 8 位口令 q1w2e3r4 注册时报:

{"message":"password must be longer than or equal to 10 characters","statusCode":400}

说明:注册接口对口令长度有强校验(≥10 位),本文演示账号统一使用 q1w2e3r4t6。另外,发布源码包安装时 pnpm install 尾部出现的 fatal: not a git repository 与 husky - git command not found, skipping install 属正常现象(husky 是 Git 钩子工具,源码包无 .git 目录时自动跳过),不影响安装与运行。

十、卸载与清理

按依赖顺序完整卸载:

# 1. 停止并移除应用服务
systemctl stop bigcapital-server
systemctl disable bigcapital-server
rm -f /etc/systemd/system/bigcapital-server.service
systemctl daemon-reload

# 2. 移除 Nginx 站点配置
rm -f /etc/nginx/sites-enabled/bigcapital.conf /etc/nginx/sites-available/bigcapital.conf
systemctl reload nginx

# 3. 删除数据库与账号(会连带删除全部财务数据,务必先确认备份)
mysql -u root -e 'DROP DATABASE IF EXISTS bigcapital_system;'
mysql -u root -e "SHOW DATABASES LIKE 'bigcapital_tenant%';"   # 先核对要删除的租户库
mysql -u root -e "DROP DATABASE IF EXISTS bigcapital_tenant_xxxx;"
mysql -u root -e "DROP USER IF EXISTS 'bigcapital'@'localhost';"

# 4. 删除应用目录与离线包
rm -rf /opt/bigcapital /opt/bigcapital-offline /opt/bigcapital-v0.25.42-bak /tmp/bigcapital-v0.25.44-dist.tar.gz

# 5. (可选)卸载不再需要的依赖组件
apt-get purge -y mariadb-server redis-server nginx

如需保留数据仅下线应用,执行第 1、2、4 步即可。

十一、参考链接