Actual 自托管实测:单容器部署、HTTPS 门槛与银行同步边界

开源项目1分钟前发布 一方
0 00

Actual 是一款开源的本地优先个人记账应用,用信封预算法管理收支。它的特殊之处在于:预算文件存在你自己的设备上,服务器只负责在你几台设备之间同步改动,断网也能继续记账。本文按 26.11.0 版本讲清部署、HTTPS 这道硬门槛,以及银行同步的真实边界。

项目在 GitHub 上以 MIT 许可发布,主要语言是 TypeScript,仓库约 3 万星标、3200 多个 fork,近一年保持每月一次的发版节奏。桌面端、移动端和服务端拆成三个包,服务端就是你今天要部署的那一个。

定位:本地优先的信封预算

信封预算的逻辑是先把已有的钱分配到分类里,再花钱,而不是先花再统计。Actual 不强制这条规则,分配超额时只会把当月标成超预算,缺口滚到下个月。对习惯记账软件的人来说,这种设计的好处是数字始终对得上手上的现金。

本地优先是它和多数自托管记账工具的分水岭。预算是一份 SQLite 数据库,完整副本在浏览器或桌面客户端里,服务器保存的是账户列表、预算文件和变更日志。服务器挂了,只要还有一台设备开着,账本就不会丢;换设备时再同步回来即可。

它支持可选的端到端加密。开启后服务器上只有密文,代价是密码不会上传,忘了就恢复不了。官方文档也写明,加密保护的是预算数据,不保护银行同步的 API 凭据——这部分留在服务器上,管理员能读到。

部署:一条 docker run 就能起来

官方同时发布到 Docker Hub 的 actualbudget/actual-server 和 GitHub 容器仓库的 ghcr.io/actualbudget/actual,两个源内容一致,选一个即可。整栈只有一个容器,镜像内自带 SQLite,不需要另起数据库。具体的镜像行为可以在官方 Docker 文档里核对。

Actual Budget 的 GitHub 仓库首页,显示项目简介、语言构成与提交记录
截图来源:github.com(2026-11-05)

官方给的启动命令是这样的:docker run --pull=always --restart=unless-stopped -d -p 5006:5006 -v YOUR/PATH/TO/DATA:/data --name my_actual_budget actualbudget/actual-server:latest。把挂载路径换成你主机上的真实目录,容器会在里面自动建出 server-files 和 user-files 两个子目录,前者放 account.sqlite 这类账号与令牌数据,后者放预算文件本身。

仓库里也带了一份 docker-compose.yml,进入目录执行 docker compose up --detach 即可。升级用 docker compose pull && docker compose up -d,或者按官方写法先 stop、再 rm、再重新 run。

镜像标签用途注意
latest / latest-alpine稳定版,日常使用alpine 体积小,低功耗设备合适
nightly / nightly-alpine跟随 master 的每日构建bug 更多,务必先备份预算
26.11.0锁定到具体版本标签不带 v 前缀,写 v26.11.0 会拉取失败

树莓派这类低功耗设备优先选 alpine 标签,官方文档说它体积小、适合弱性能硬件。想省掉手写 compose 的麻烦,站内Coolify 这类自托管部署平台也能托管这个容器,但单容器应用本身没必要多加一层。

HTTPS 不是可选项

很多人卡在第一步:容器起来了,用 http://服务器IP:5006 打开,页面却报 SharedArrayBuffer 相关的错误。原因是 Actual 底层的 SQLite 引擎需要浏览器的跨源隔离能力,而浏览器只在安全上下文里开启它——https:// 或者 http://localhost 属于安全上下文,局域网 IP 上的 http 不属于。

于是只有两种走法:在本机用 localhost 访问,或者给服务配一个真域名加证书,用反向代理转发到 5006。官方文档给了 Caddy、Traefik、NGINX、Apache 与 Ngrok 的示例配置,Caddy 那份最短,一个反代条目就能自动申请 Let's Encrypt 证书。

用 NGINX 的人要特别注意响应头重复。应用自己会发 Cross-Origin-Embedder-Policy 与 Cross-Origin-Opener-Policy,如果反代再 add_header 一次,浏览器看到两个 require-corp 就会判定策略无效,直接报 SharedArrayBufferMissing。官方给的写法是先用 proxy_hide_header 隐藏上游的同名头,再由 NGINX 统一添加,保证只有一个来源。

另外不要把 5006 直接暴露到公网。默认安装只有一个服务器密码,全家共用同一个口令,谁都能看到全部账本;要区分账号得接 OpenID Connect,这本身就是另一套服务。凭据管理可以顺手看看站内整理的开源密码管理器清单,别用一个密码走天下。

银行同步:自动,但有三个前提

26.11.0 的核心改动是把银行同步自动化了:可以在 Bank Sync 里选每 12 小时、每天或每周同步一次,也能自定义间隔,最短 15 分钟。发布说明里还提到标签分组报表、侧边栏自定义,以及每个预算可以单独配置 SimpleFIN 凭据。这个功能默认关闭,而且只在 Actual 打开时才会执行;应用关着就等下次打开补跑,服务器不会自己去轮询银行。

首先要过的一关是服务商账号。官方银行同步文档列出 Akahu(新西兰)、Enable Banking(欧洲)、GoCardless BankAccountData(欧洲)、SimpleFIN Bridge(北美)和 Pluggy.ai(巴西),凭据要你自己去服务商注册并生成。注意 GoCardless 那条线官方标注为不再接受新账户,老教程里推荐的免费欧洲通道已经走不通;SimpleFIN 由服务商单独收费,与 Actual 无关。

其次是配置成本。同步需要往安装目录里放一个配置文件填密钥,不是界面上点两下就能完成的事。

还有一层是安全边界。API 密钥存在服务器上,不受端到端加密保护,能直接接触服务器数据库的人可以读走它。如果这点不能接受,就退回手动导入:CSV、QIF、OFX、QFX、CAMT.053 都支持,按账户导入,CSV 还能自己映射列。

银行覆盖这件事值得先查再装。十分钟确认你的银行在不在服务商列表里,比装完发现用不了再拆要省事得多。第三方对比里也提到,Actual 的自动同步只覆盖已链接账户,且频繁刷新会消耗银行给的额度。

和 Firefly III 的取舍

自托管记账绕不开这两个项目,但它们解决的不是同一件事。Actual 的对手之一是 Firefly III。

维度ActualFirefly III
记账模型信封预算,按分类分配已有资金复式记账,借贷双分录
部署组件单容器,内置 SQLitePHP 应用加数据库,导入另有一个独立组件
许可MITAGPL v3
适合谁想做月度预算、日常记账的人想要完整会计口径、报表与规则引擎的人

许可差异值得留意。MIT 允许你修改后闭源分发,保留版权声明即可;AGPL v3 是强 copyleft,改过的版本对外提供网络服务时也要开源对应代码。给自己的家庭账本用,两者都没有额外义务,但要基于它做二次产品就得先想清楚。

备份、许可与适合谁

备份是这类工具真正的运维成本。服务端自己不产生备份,自动备份只存在于桌面客户端里。需要保住的是挂载目录下的 server-files 与 user-files,再加一份应用内导出的预算文件就够。直接复制正在写入的 account.sqlite 有风险,可能抓到未完成的事务,等容器停掉再拷或者用应用导出更稳。

备份目的地可以直接用站内介绍过的自托管备份工具,restic 或 Kopia 定时拉走整个 /data 目录,加密后再传到异地。财务数据没有第二份副本这件事,比任何功能都更值得先解决。

适合的人是:想要一个自己说了算的预算工具、愿意每几天打开一次、能接受手动分类的人。开了端到端加密之后,连服务器管理员都看不到内容,这点对租用 VPS 的人有实际意义。不太适合的人是:期待装完就自动抓取所有交易、自动分类、自动提醒的人——Actual 的同步要配服务商,分类要自己定规则,省下的是订阅费,付出的是维护时间。

© 版权声明

相关文章