开源神器ezBookkeeping:一文掌握Docker私有化部署财务应用
本期将介绍一款出色的个人记账与财务管理应用:ezBookkeeping。它非常适合个人用户,具备简洁、强大与便携的特点,无论是在资源有限的微型设备还是云端服务器上都能顺畅运行。

实际体验表明,其在个人电脑和移动设备上均有良好的表现,项目整体非常出色,值得推荐。

应用简介
ezBookkeeping 是一款设计理念为简洁、易用与可移植的自托管个人财务应用。它界面友好,功能强大,部署过程简单,系统资源占用极少。这使得它不仅能在微服务器、NAS设备甚至树莓派上运行,也能在个人电脑、Mac以及云服务器环境中流畅工作。
该应用完全支持跨平台,并具有良好的设备兼容性,可以在手机、平板和桌面电脑上无缝使用。得益于对 PWA(渐进式 Web 应用)的支持,用户甚至可以将其添加到移动设备的主屏幕,获得类似于原生应用的使用体验。
功能特点
- 开源与自托管
- 代码完全开放,可部署在自有服务器上,确保个人财务隐私和数据完全自主掌控。非常适合重视数据安全、希望避免云端服务锁定的用户。
- 轻量与高性能
- 针对低资源环境进行了深度优化,即使在树莓派、旧式笔记本电脑或NAS上也能保证流畅运行。即使管理多个账本或处理海量交易记录,应用依然能够保持快速的响应速度。
- 简化部署流程
- 官方提供了标准化的 Docker 镜像,通常只需几行命令即可启动服务。支持包括 SQLite(无需额外配置)、MySQL、PostgreSQL 在内的多种数据库后端。应用本身兼容 Windows、macOS、Linux 系统,并支持 x86、amd64 及 ARM 等多种硬件架构。
- 跨平台与 PWA 支持
- 用户界面针对桌面端和移动端进行了适配。支持作为 PWA 应用安装,可直接添加至手机主屏幕,提供类原生应用体验。内置深色模式,方便在夜间环境舒适查看账目。
- 集成 AI 能力
- 支持 MCP(模型上下文协议),可以集成人工智能功能,用于智能分析交易、自动分类或生成财务洞察报告。
- 强大的核心记账功能
- 采用两级账户与分类体系,实现对收支更精细化的管理。支持为交易记录附加图片(如收据、发票照片)。可记录消费地点,并自动在地图上进行可视化展示。支持设置定期交易(如房租、订阅费),自动生成记录。提供高级搜索、过滤、数据可视化与分析工具,帮助用户深入理解消费模式。
- 国际化与本地化
- 支持多国语言与多种货币。汇率可自动更新。能够适配多时区显示,并允许用户自定义日期、数字及货币的显示格式。
- 多层次安全保障
- 支持基于时间的一次性密码等双重认证(2FA)方式。具备登录尝试次数限制机制,有效防范暴力破解。可通过应用锁(PIN 码或 WebAuthn)防止未经授权的访问。
- 灵活的数据交换
- 支持导入和导出多种通用财务数据格式,包括 CSV、OFX、QFX、QIF、IIF、Camt.053、MT940 等,以及与 GnuCash、Firefly III、Beancount、随手记、支付宝、微信账单等应用或平台的兼容格式。便于用户从旧系统迁移数据,或与其他财务软件进行对接。
部署指南
本文将以威联通(QNAP)NAS为例,演示通过 Docker Compose 部署 ezBookkeeping 的完整过程。

需要特别注意,ezBookkeeping 容器默认以 UID:GID 为 1000:1000 的用户身份运行。因此,必须确保挂载到容器内的宿主机目录对该用户具有读写权限。部署失败最常见的原因就是权限问题,请提前执行以下命令授权(请根据你的实际路径调整):
chown -R 1000:1000 /share/Container/ezbookkeeping/data
chown -R 1000:1000 /share/Container/ezbookkeeping/storage
chown -R 1000:1000 /share/Container/ezbookkeeping/log

使用 SQLite 数据库部署
对于大多数个人用户而言,使用 SQLite 数据库版本已经完全足够,且部署最为简单。
以下提供完整的 Docker Compose 配置示例,威联通用户可直接参考使用:
services:
ezbookkeeping:
image: mayswind/ezbookkeeping:latest
container_name: ezbookkeeping
hostname: ezbookkeeping
restart: unless-stopped
ports:
- "9527:8080" # 冒号左侧的宿主机端口可根据需要修改
environment:
EBK_SERVER_DOMAIN: 192.168.200.132 # 替换为你的 NAS IP 或域名
EBK_ROOT_URL: http://192.168.200.132:9527 # 包含端口号
EBK_LOG_MODE: file
EBK_SECURITY_SECRET_KEY: its_should_be_a_random_string # 请替换为随机生成的密钥
EBK_MCP_ENABLE_MCP: true # 启用 AI 服务 (MCP)
volumes:
- /etc/localtime:/etc/localtime:ro # 同步宿主机时间
- /share/Container/ezbookkeeping/data:/ezbookkeeping/data # SQLite 数据库文件存储路径
- /share/Container/ezbookkeeping/storage:/ezbookkeeping/storage # 附件、导出文件等存储路径
- /share/Container/ezbookkeeping/log:/ezbookkeeping/log # 应用日志路径
其中,EBK_SECURITY_SECRET_KEY 环境变量所需的随机密钥,可以通过以下命令生成:
openssl rand -hex 32

使用 MySQL 数据库部署
如果你计划使用已有的 MySQL 服务,或者未来有多个容器共用数据库的需求,并且清楚相关配置,可以选择此方案。若对 MySQL 不熟悉,建议优先使用 SQLite 版本。
如果尚未部署 MySQL,可以使用以下包含 MySQL 服务的组合配置:
services:
mysql:
image: mysql:8.0
container_name: ezbookkeeping-mysql
hostname: mysql
restart: unless-stopped
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: rootpassword # MySQL root 用户密码
MYSQL_DATABASE: ezbookkeeping
MYSQL_USER: ezbookkeeping
MYSQL_PASSWORD: ezbookkeeping # 可修改为其他强密码
volumes:
- /share/Container/ezbookkeeping/data_mysql:/var/lib/mysql
# 如果计划多容器共用,可指向统一的 MySQL 数据目录,例如:
# - /share/Container/mysql/data:/var/lib/mysql
ports:
- "3306:3306" # 可选,如果仅内部访问可注释掉此行
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-p", "ezbookkeeping"] # 如果修改了 MYSQL_PASSWORD,此处也需对应修改
interval: 10s
timeout: 5s
retries: 5
ezbookkeeping:
image: mayswind/ezbookkeeping:latest
container_name: ezbookkeeping
hostname: ezbookkeeping
restart: unless-stopped
depends_on:
mysql:
condition: service_healthy
ports:
- "9527:8080" # 冒号左侧的宿主机端口可根据需要修改
environment:
EBK_SERVER_DOMAIN: 192.168.200.132 # 替换为你的 NAS IP 或域名
EBK_ROOT_URL: http://192.168.200.132:9527 # 包含端口号
EBK_DATABASE_TYPE: mysql
EBK_DATABASE_HOST: mysql:3306
EBK_DATABASE_NAME: ezbookkeeping
EBK_DATABASE_USER: ezbookkeeping # 对应上面 MYSQL_USER
EBK_DATABASE_PASSWD: ezbookkeeping # 对应上面 MYSQL_PASSWORD
EBK_LOG_MODE: file
EBK_SECURITY_SECRET_KEY: 随机密钥替换这里 # 生成方式参考上文
EBK_MCP_ENABLE_MCP: "true" # 可选,启用 AI 功能
volumes:
- /etc/localtime:/etc/localtime:ro
- /share/Container/ezbookkeeping/storage:/ezbookkeeping/storage
- /share/Container/ezbookkeeping/log:/ezbookkeeping/log
如果已经部署了独立的 MySQL 服务,需要提前在 MySQL 中为 ezBookkeeping 创建专用的数据库和用户:
CREATE DATABASE ezbookkeeping CHARACTER SET utf8mb4;
CREATE USER 'ezbookkeeping'@'%' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON ezbookkeeping.* TO 'ezbookkeeping'@'%';
FLUSH PRIVILEGES;
然后,参考以下配置部署 ezBookkeeping 容器(请根据实际情况修改连接信息):
services:
ezbookkeeping:
image: mayswind/ezbookkeeping:latest
container_name: ezbookkeeping
hostname: ezbookkeeping
restart: unless-stopped
ports:
- "9527:8080"
environment:
EBK_SERVER_DOMAIN: 192.168.200.132 # 替换为你的 NAS IP 或域名
EBK_ROOT_URL: http://192.168.200.132:9527 # 包含端口号
EBK_SERVER_DOMAIN: yourdomain
EBK_SERVER_ENABLE_GZIP: "true"
EBK_DATABASE_TYPE: mysql
EBK_DATABASE_HOST: 127.0.0.1:3306 # 替换为 NAS 内部 MySQL 服务的实际地址
EBK_DATABASE_NAME: ezbookkeeping
EBK_DATABASE_USER: ezbookkeeping
EBK_DATABASE_PASSWD: 强密码替换这里
EBK_LOG_MODE: file
EBK_SECURITY_SECRET_KEY: 随机密钥替换这里
EBK_MCP_ENABLE_MCP: "true"
volumes:
- /etc/localtime:/etc/localtime:ro
- /share/Container/ezbookkeeping/storage:/ezbookkeeping/storage
- /share/Container/ezbookkeeping/log:/ezbookkeeping/log
配置提示
更多高级配置选项,可以参考官方详细的 Wiki 文档。其中包括邮件服务设置、通知配置、对象存储集成、汇率更新等功能的详细说明。

初始化与界面展示
使用上述 SQLite 版本的配置部署成功后,在浏览器中访问 NAS_IP:9527 即可进入应用。

首次访问需要创建一个新的管理员账户。

在第二步中,建议启用预设分类模板,然后提交完成注册。有时提交后页面可能无响应,但实际上账户已创建成功,此时返回登录页尝试登录即可。若遇到持续问题,建议清理所有相关配置文件后重新部署初始化。

登录后的主界面清晰直观,设计符合多数用户的审美和操作习惯。

点击页面右上角的头像,可以进入个人设置中心,进行各项个性化配置。

在“密码与设备”管理页面,可以管理登录设备,并生成用于 AI 对话调用的 MCP 令牌。

支持启用两步验证(2FA),对于涉及资金安全的应用,启用此功能很有必要。

“数据管理”页面支持手动导出所有账本数据,便于备份或迁移。

“应用设置”中可以对界面显示、应用锁(6位PIN码)、资金统计方式以及多设备间的数据同步进行配置。

基础使用演示
在左侧导航栏的「账户」管理中,可以新增账户。支持为账户添加自定义标签,并上传相关图片作为凭据。

开始记录一笔交易时,可以详细填写信息,添加多个标签,并上传交易凭证图片(如收据)。

交易添加成功后,会在列表中立即显示。

主界面仪表盘会动态更新,展示清晰的财务状况概览,操作体验流畅。如果用户需要更复杂的交易分类或模板,可以在左侧“基础数据”模块中手动添加或删除分类条目。

MCP 服务配置与体验
接下来尝试配置 MCP 服务。首先需要在设置中生成 MCP 访问令牌。请注意,此令牌信息仅显示一次,务必妥善保存,否则需要重新创建。

在支持 MCP 协议的 AI 工具(如某些代码助手)中配置服务器信息。URL 部分填写能正确访问到你 ezBookkeeping 服务的域名或 IP 地址。

配置成功后,AI 工具可以识别到 ezBookkeeping 提供的功能接口。

但在实际指令测试中,部分功能可能无法成功调用。经过检查网络连接(全程局域网)和数据库文件权限,问题仍可能存在。用户或许可以尝试使用 MySQL 数据库后端,看是否能解决 MCP 功能调用异常的问题。

应用内也提供了关于 MCP 功能的介绍界面,对此感兴趣的用户可以进一步探索其潜力。
总体而言,ezBookkeeping 是一个设计优秀、功能全面的个人财务应用项目,在桌面端和移动端都能提供满意的使用体验。该项目仍在积极发展中,用户有任何建议或发现问题,可以前往其项目仓库提交反馈。