Saltcorn 安装部署指南(Ubuntu 22.04)
Ubuntu 22.04.5 LTS 从零安装 Saltcorn v1.6.2:PostgreSQL 14 + Node.js 20 + npm 全局安装 + systemd 托管全流程实测回显,含弱口令被拒与多 worker session_secret 两大排障实录,附升级与卸载。
Saltcorn 安装部署指南(Ubuntu 22.04)
本文在 Ubuntu 22.04.5 LTS 服务器上从零实装 Saltcorn v1.6.2(npm 官方安装线),全部命令与回显均来自实测环境,日期 2026-10-28。安装前建议先阅读同系列《Saltcorn v1.6.2 介绍与选型指南》确认版本与选型结论。
一、安装前准备
1.1 环境与版本基线
实测服务器软件基线如下(安装后 saltcorn info 回显确认):
| 组件 | 实测版本 | 说明 |
|---|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS | cat /etc/os-release 确认 |
| PostgreSQL | 14.24 (Ubuntu 14.24-0ubuntu0.22.04.1) | Ubuntu 22.04 官方仓库自带 |
| Node.js | v20.20.2 | NodeSource setup_20.x 线 |
| npm | 10.8.2 | 随 Node.js 20 附带 |
| Saltcorn | @saltcorn/cli/1.6.2 linux-x64 | npm latest 稳定版 |
版本溯源说明:v1.6.2 为 2026-10-28 查询时 npm latest 与 GitHub 稳定标签双重认定的最新稳定版(预发布线已推进到 v1.6.3-beta.5 与 v1.7.0-beta.3)。Saltcorn 官方对 Node.js 的基线要求为 v18 及以上(GitHub README 安装章节),本文选用更保守的 Node.js 20 LTS 线。
资源画像:空库冷启动后 systemctl status saltcorn 显示主服务内存约 999 MB(含 6 个 worker 进程),进程数为 1 主 + 6 worker(Saltcorn 默认并发 worker 数 defaultNWorkers=6,与 CPU 核数相关)。生产建议至少准备 2 核 / 4 GB 内存,并预留文件存储空间。
1.2 安装路径决策
Saltcorn 有两条官方安装路径:npm 全局安装(npm install -g @saltcorn/cli)与 GitHub 源码安装。本文选 npm 安装线,理由:
- npm 是官方发行主通道,
@saltcorn/cli将 monorepo 内全部运行时组件(data/server/builder 等)作为依赖一次拉齐; - 版本可钉住(
@saltcorn/cli@1.6.2),升级/回滚路径清晰; - 无需手工处理源码构建链。
二、安装基础依赖
2.1 安装 PostgreSQL 14
Ubuntu 22.04 官方仓库的 PostgreSQL 版本为 14.x,满足 Saltcorn 要求,直接安装:
apt-get update
DEBIAN_FRONTEND=noninteractive apt-get install -y postgresql postgresql-contrib build-essential python3 curl git
实测回显(尾部):
Running hooks in /etc/ca-certificates/update.d...
done.
安装完成即由 systemd 接管,启动并确认状态:
systemctl start postgresql
systemctl is-active postgresql
实测回显:
active
2.2 安装 Node.js 20 LTS
Ubuntu 22.04 自带 apt 源中的 nodejs 为 12.x,过旧,改用 NodeSource 脚本接入 20.x 线:
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt-get install -y nodejs
node -v
npm -v
实测回显(节选):
2026-10-28 01:12:28 - To install N|solid Runtime, run: apt install nsolid -y
Setting up nodejs (20.20.2-1nodesource1) ...
v20.20.2
10.8.2
三、安装 Saltcorn 与初始化
3.1 确认发行版本并全局安装
先向 npm 查询当前 latest,确认与预期稳定版一致后再钉版本安装:
npm view @saltcorn/cli version
实测回显:
1.6.2
执行全局安装:
npm install -g @saltcorn/cli@1.6.2
实测回显(尾部):
changed 1496 packages in 37s
213 packages are looking for funding
run `npm fund` for details
验证 CLI 可用与安装路径:
saltcorn --version
which saltcorn
实测回显:
@saltcorn/cli/1.6.2 linux-x64 node-v20.20.2
/usr/bin/saltcorn
3.2 创建数据库角色与 Saltcorn 配置文件
Saltcorn 连接 PostgreSQL 需要角色 + 数据库 + 连接配置文件三件套。先在 psql 中创建(口令在真实环境请使用强随机值,本文为实验环境演示值):
runuser -u postgres -- psql -c "CREATE ROLE saltcorn LOGIN PASSWORD 'q1w2e3r4' CREATEDB;"
runuser -u postgres -- psql -c 'CREATE DATABASE saltcorn OWNER saltcorn;'
实测回显:
CREATE ROLE
CREATE DATABASE
写入连接配置文件。Saltcorn v1.6.2 的连接层配置文件路径为 /root/.config/.saltcorn(~/.config/.saltcorn,可用 saltcorn info 的 configFilePath 字段验证):
mkdir -p /root/.config
cat > /root/.config/.saltcorn <<'EOF'
{
"user": "saltcorn",
"password": "q1w2e3r4",
"database": "saltcorn",
"host": "localhost",
"port": 5432,
"multi_tenant": false,
"session_secret": "sc-lab-2026-oct-fixed-secret-42"
}
EOF
字段说明:
| 字段 | 作用 |
|---|---|
| user / password / database / host / port | PostgreSQL 连接四要素,与 3.2 建库建角色一致 |
| multi_tenant | 是否开启多租户模式,单应用部署固定 false |
| session_secret | 会话签名密钥,必须显式固定,原因见 5.2 排障实录——不设置时多 worker 进程各自随机生成,登录会话将随机失效 |
配置优先级(从高到低):命令行/调用参数 > 环境变量(PGUSER/PGHOST/PGPORT/PGPASSWORD/PGDATABASE 及 SALTCORN_* 系列)> 配置文件 > 内置默认值。因此生产环境也可完全用环境变量替代配置文件。
3.3 初始化数据库 schema
Saltcorn 首次使用需向目标库写入自身 schema(表、迁移记录、配置表)。v1.6.2 的 saltcorn setup 为交互式向导,自动化场景直接用非交互的 add-schema 并加 -f 跳过确认:
saltcorn add-schema -f
实测回显:
Successfully ran the 'add-schema' command
3.4 创建管理员账号
saltcorn create-user -e admin@example.com -p 'Q1w2E3r4!sc' -a
实测回显:
Success: User admin@example.com created successfully
注意:Saltcorn 内置弱口令策略,常见弱口令会被直接拒绝(实测 q1w2e3r4 被拒,详见 5.1)。创建后用 list-users 验证:
saltcorn list-users
实测回显:
┌─────────┬─────────────────────┐
│ (index) │ email │
├─────────┼─────────────────────┤
│ 0 │ 'admin@example.com' │
└─────────┴─────────────────────┘
四、systemd 服务托管
4.1 编写服务单元
创建 /etc/systemd/system/saltcorn.service:
[Unit]
Description=Saltcorn low-code application server
After=network.target postgresql.service
[Service]
Type=simple
User=root
WorkingDirectory=/root
Environment=HOME=/root
ExecStart=/usr/bin/saltcorn serve -p 8148
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
要点:After 引入 postgresql.service 保证数据库先起;serve -p 8148 指定监听端口(默认 3000);HOME 必须显式设置,Saltcorn 依赖 $HOME 定位 ~/.config/.saltcorn 配置文件;Restart=on-failure 提供进程崩溃自动拉起。
启用并启动:
systemctl daemon-reload
systemctl enable --now saltcorn
实测回显:
Created symlink /etc/systemd/system/multi-user.target.wants/saltcorn.service → /etc/systemd/system/saltcorn.service.
4.2 启动验证
服务状态:
systemctl status saltcorn --no-pager -l
实测回显(节选):
● saltcorn.service - Saltcorn low-code application server
Loaded: loaded (/etc/systemd/system/saltcorn.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2026-10-28 01:17:27 UTC; 16s ago
Main PID: 7371 (node)
Tasks: 77 (limit: 2932)
Memory: 999.2M
CPU: 8.767s
├─7371 node /usr/bin/saltcorn serve -p 8148
├─7396 /usr/bin/node /usr/bin/saltcorn serve -p 8148
├─7397 /usr/bin/node /usr/bin/saltcorn serve -p 8148
...
启动日志:
journalctl -u saltcorn --no-pager -n 8
实测回显:
Oct 28 01:17:27 saltcorn-lab systemd[1]: Started Saltcorn low-code application server.
Oct 28 01:17:30 saltcorn-lab saltcorn[7398]: Saltcorn listening on http://localhost:8148/
Oct 28 01:17:30 saltcorn-lab saltcorn[7397]: Saltcorn listening on http://localhost:8148/
Oct 28 01:17:30 saltcorn-lab saltcorn[7396]: Saltcorn listening on http://localhost:8148/
...
6 个 worker 各自输出一行 listening 即多 worker 就绪。HTTP 探活:
curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://localhost:8148/
curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://localhost:8148/auth/login
实测回显:
HTTP 302
Found. Redirecting to /auth/login
HTTP 200
根路径 302 跳转登录页、登录页 200,即部署成功。最后用 saltcorn info 做安装体检(口令与 jwt_secret 字段已脱敏):
saltcornVersion: 1.6.2
configFilePath: /root/.config/.saltcorn
nodeVersion: v20.20.2
databaseVendor: PostgreSQL
defaultNWorkers: 6
databaseVersion: >-
PostgreSQL 14.24 (Ubuntu 14.24-0ubuntu0.22.04.1) on x86_64-pc-linux-gnu, ...
configuration:
sc_version: 1.6.2
user: saltcorn
host: localhost
port: 5432
password: ****(脱敏)
database: saltcorn
jwt_secret: ****(脱敏)
multi_tenant: false
multi_node: false
file_store: /root/.local/share/saltcorn
default_schema: public
Web 登录验证(浏览器访问 http://<服务器IP>:8148,以 admin@example.com / Q1w2E3r4!sc 登录出现欢迎页即全链路打通)。
五、排障实录
5.1 管理员弱口令被 Saltcorn 拒绝
现象:按习惯用 q1w2e3r4 创建管理员:
saltcorn create-user -e admin@example.com -p q1w2e3r4 -a
实测报错:
Error: Password not accepted: Password too common
定位:Saltcorn 服务端内置口令强度校验,命中常见弱口令字典直接拒绝,CLI 与 Web 注册同样生效。这是平台级行为而非环境故障。
解决:改用带大小写与符号的口令后成功(Q1w2E3r4!sc)。数据库侧角色口令(PostgreSQL 自身不启用该字典)仍可用 q1w2e3r4,但生产环境建议统一强口令。
5.2 未固定 session_secret 导致 Web 登录全部失败(invalid csrf token)
现象:安装与 CLI 全部正常,但浏览器登录任意正确账号都回到登录页,无任何错误提示。服务端日志刷屏:
Oct 28 01:19:57 saltcorn-lab saltcorn[7415]: invalid csrf token
Oct 28 01:20:18 saltcorn-lab saltcorn[7399]: invalid csrf token
Oct 28 01:20:32 saltcorn-lab saltcorn[7416]: invalid csrf token
定位过程:
- 先排除凭据问题:用
bcryptjs.compare对比数据库users.password哈希与已知口令,password match: true,凭据无误; - 观察日志 PID:GET 请求落在 7396/7397/7398 等不同 worker,POST 也随机落点,而
invalid csrf token分布在不同 PID 上; systemctl status显示主进程 1 + worker 6(defaultNWorkers=6);saltcorn info中 configuration 无 session_secret 字段——未设置时每个 worker 进程启动时各自随机生成会话签名密钥;- 结论:express-session 会话 Cookie 由 worker A 的密钥签发,POST 命中 worker B 时签名校验失败被当作全新会话,其中的 CSRF 密钥随之丢失,于是所有 POST(包括登录)一律
invalid csrf token。
解决:在 /root/.config/.saltcorn 中显式固定 session_secret(任意足够长的随机串),systemctl restart saltcorn 后登录即恢复正常(登录后返回欢迎页,日志不再出现 invalid csrf token)。
经验:这一坑只在多 worker + 未固定 session_secret同时出现时触发,单 worker 环境难以复现,属于 Saltcorn 部署的高频隐形坑。所有多进程部署(无论 systemd 还是其他进程管理器)都必须显式固定该密钥。
六、升级与卸载
6.1 升级到新版本
npm 线升级为「换包 + 迁移 + 重启」三步(以下为命令与预期结果,本文未实测跨版本升级):
npm install -g @saltcorn/cli@latest # 预期:changed N packages 输出
saltcorn migrate # 预期:Successfully ran the 'migrate' command
systemctl restart saltcorn # 预期:服务重启,journal 重新输出 listening
升级前务必先备份:saltcorn backup -o /root/pre-upgrade.sql(pg_dump 格式,见《Saltcorn 常用命令与运维详解》)。若需锁旧稳定线,可安装对应 dist-tag(如 stable-1.5.x 线的 @saltcorn/cli@1.5.10)。
6.2 卸载
systemctl disable --now saltcorn # 停止并取消开机自启(预期:Removed 输出)
rm -f /etc/systemd/system/saltcorn.service && systemctl daemon-reload
npm uninstall -g @saltcorn/cli # 移除 CLI(预期:removed 1 package in Ns)
runuser -u postgres -- psql -c 'DROP DATABASE IF EXISTS saltcorn;'
runuser -u postgres -- psql -c 'DROP ROLE IF EXISTS saltcorn;'
rm -rf /root/.config/.saltcorn /root/.local/share/saltcorn # 清理配置、文件存储
文件存储目录 /root/.local/share/saltcorn 内含用户上传文件,确认不再保留后再删。
七、同系列导航
- 认知选型:《Saltcorn v1.6.2 介绍与选型指南》
- 参数调优:《Saltcorn 配置详解》
- 日常运维:《Saltcorn 常用命令与运维详解》