hledger 是 Haskell 语言开发的一款开源复式记账工具,核心数据保存在 plain text accounting 格式的 journal 文件中。它提供了命令行、终端界面和 Web 界面三种交互方式,其中 hledger-web 最适合部署在云服务器上,因为只要用浏览器就能完成记账、查账和报表查看。相比传统财务软件,hledger 不依赖数据库,所有交易记录都能用文本编辑器直接查看和修改,非常适合重视数据可迁移性与透明度的个人或小团队。

先理解 hledger 的部署形态
hledger-web 本身是一个独立的 Web 服务进程,它读取指定的 journal 文件,然后在浏览器里展示账户余额、交易流水、资产负债表等复式记账信息。这个进程默认只监听本机地址 127.0.0.1 的 5000 端口,因此如果直接把云服务器上的端口暴露到公网,需要额外配置监听地址和访问控制。更稳妥的做法是让 hledger-web 只服务于本机,再由 nginx 作为反向代理统一处理域名、HTTPS 和身份校验。
从部署角度看,hledger 和 hledger-web 可以共用同一个二进制包,也可以分开安装。journal 文件本身只是个普通的 UTF-8 文本文件,可以用 git 管理历史版本。这种形态意味着整个系统没有隐藏状态,迁移、备份、审计都很直接。对于已经在使用命令行记账的用户来说,接入 Web 界面几乎不改变原有工作流,只是多了一个更直观的操作入口。
云服务器安装与环境准备
在 Debian 或 Ubuntu 上,hledger 已经被官方仓库收录,可以直接执行 sudo apt install hledger hledger-web。这样会同时安装命令行版本和 Web 版本,优点是省去编译时间,适合大多数云服务器。如果希望使用更新版本,可以到 hledger 官网下载预编译的二进制文件,解压后把可执行文件放到 /usr/local/bin/ 目录。预编译包通常已经包含了 hledger、hledger-ui 和 hledger-web 三个工具。
如果选择从源码安装,就需要服务器上有 Haskell 的构建环境,比如 stack 或 cabal。可以用 stack install hledger hledger-web 来编译安装,但云服务器内存较小的时候,编译整个依赖树可能会非常慢,甚至因为内存不足而失败。因此除非你特别需要某个新特性,否则推荐优先使用官方仓库或预编译二进制。安装完成后,先运行 hledger --version 和 hledger-web --version 确认命令可用。
接下来准备记账文件。可以在用户主目录下创建一个专用目录,例如 /home/你的用户名/accounting,然后在里面新建一个名为 main.journal 的文本文件。初始内容至少包含年度声明,比如一行 P 2025/01/01 CNY ¥ 用来声明货币格式,再添加几个初始账户。简单示例可以是:资产、负债、收入、支出四个顶层账户。后续录入交易时,hledger 会自动根据 journal 中的账户名生成报表。
配置并启动 hledger-web
启动 hledger-web 的基本命令是 hledger-web -f /home/你的用户名/accounting/main.journal。执行后服务会监听 127.0.0.1 的 5000 端口,你可以在服务器本地用 curl 测试,但外部浏览器还无法访问。要让 nginx 反向代理能连上,保持监听 127.0.0.1 就够了,不需要改成 0.0.0.0。只有在没有反向代理、直接开放端口的情况下才需要监听所有网卡。
如果服务需要对外提供访问,建议加上认证参数。hledger-web 提供了 --require-auth 选项,开启后每次访问都要输入用户名和密码。可以通过 --user 和 --password 指定登录凭据,例如 hledger-web -f main.journal --require-auth --user=你的账号 --password=你的密码。但要注意命令行参数可能会被同服务器其他用户通过进程列表看到,更安全的方式是把密码放进配置文件或使用环境变量。对于大多数个人使用场景,配合 nginx 的 Basic Auth 也能达到不错的保护效果。
端口和访问路径也可以灵活调整。使用 --port=5001 可以改变监听端口,使用 --base-url=https://你的域名 能让生成的链接自动带上正确前缀。若你的 journal 文件比较复杂,可以通过 --watch 让 hledger-web 在文件变化时自动重载。初次部署时,先不要加太多参数,确认基础功能正常后再逐步完善认证、域名和反向代理。
用 systemd 让服务常驻后台
云服务器重启后,直接在前台运行的 hledger-web 会退出。借助 systemd 可以把它注册为系统服务,实现开机自启和异常自动恢复。首先创建服务单元文件,通常放在 /etc/systemd/system/hledger-web.service。核心内容包含 User、Group、ExecStart 和 Restart 等配置项。User 最好使用独立的非 root 账号,避免 Web 进程拥有过高权限。
| 配置项 | 建议值 | 说明 |
|---|---|---|
| User | 你的用户名 | 运行服务的系统账号 |
| Group | 你的用户组 | 与 User 对应 |
| ExecStart | /usr/bin/hledger-web -f /home/你的用户名/accounting/main.journal --host=127.0.0.1 --port=5000 | 启动命令及参数 |
| Restart | on-failure | 异常退出后自动重启 |
保存文件后执行 sudo systemctl daemon-reload 重新加载配置,然后运行 sudo systemctl enable --now hledger-web 启动并设置开机自启。可以通过 systemctl status hledger-web 查看运行状态,如果出现启动失败,重点检查 journal 文件路径是否正确、端口是否被占用以及服务账号是否有权限读取文件。服务正常运行后,就可以进行反向代理配置了。
配置 nginx 反向代理与 HTTPS
为了让外部浏览器通过域名访问,需要安装 nginx 并在站点配置里添加反向代理规则。可以先执行 sudo apt install nginx,然后在 /etc/nginx/sites-available/ 下创建配置文件。核心指令是 proxy_pass http://127.0.0.1:5000;,把请求转交给本机的 hledger-web。同时要设置 proxy_set_header Host $host; 和 proxy_set_header X-Real-IP $remote_addr;,让后端能获取正确的域名和客户端 IP。
完成配置后,用 sudo nginx -t 检查语法,再执行 sudo systemctl reload nginx 使其生效。如果还没有域名,可以先用服务器 IP 加端口测试,但正式使用建议绑定域名并申请 TLS 证书。Let’s Encrypt 提供的 certbot 可以自动完成证书签发和续期,通常只需运行 sudo certbot --nginx -d 你的域名。开启 HTTPS 后,hledger-web 的登录凭据和交易数据在传输过程中就不会被明文窃听。
数据备份与安全加固
hledger 的 journal 文件就是全部财务数据,备份非常容易。可以在 journal 目录下执行 git init,每次记账后提交一次变更,这样既能回溯历史,也能把仓库推送到私有远程存储。还可以用 cron 定时任务把 journal 文件复制到对象存储或另一台服务器。关键原则是不要只在云服务器本地保留一份,至少要有一份异地备份。
安全方面,首先确保 journal 文件权限设置为 600,即只有服务账号和所有者可以读写。云服务器安全组或防火墙只开放 80 和 443 端口,SSH 端口限制来源 IP。如果 hledger-web 自带认证还不够,可以在 nginx 层再加一层 Basic Auth,或者使用更完善的访问控制规则。定期更新系统和 hledger 版本,避免已知漏洞。这样部署下来的云服务器复式记账界面既方便日常使用,也能有效保护个人财务数据的私密性。

