ezBookkeeping
介绍
ezBookkeeping 是一款轻量、自托管 (self-hosted) 的个人记账应用,拥有用户友好的界面和强大的记账功能。它部署简单,借助 Docker 只需一行命令即可启动。同时对系统资源占用低、可扩展性高,既可运行在树莓派等轻量设备上,也能扩展到 NAS、MicroServer 甚至集群环境。
ezBookkeeping 为移动端和桌面端提供了各自原生的界面设计。借助 PWA (渐进式网页应用) 技术,您还可以将它 添加到手机主屏幕,像原生 App 一样使用。
项目地址:https://github.com/mayswind/ezbookkeeping
在线演示:https://ezbookkeeping-demo.mayswind.net
特性
- 开源 & 自托管
- 轻量 & 快速
- 安装简单
- 支持 Docker
- 支持 SQLite、MySQL、PostgreSQL 多种数据库
- 跨平台运行 (Windows, macOS, Linux)
- 支持 x86, amd64, ARM 架构
- 友好的用户界面
- 针对手机与桌面优化的 UI
- 支持 PWA,带来接近原生 App 的使用体验
- 深色模式
- AI驱动的功能
- 支持 MCP (Model Context Protocol) 用于 AI 集成
- 强大的记账功能
- 二级账户与分类结构
- 支持为交易添加图片附件
- 记录交易地理位置并在地图上展示
- 支持周期性交易
- 高级筛选、搜索、数据可视化与分析功能
- 本地化与国际化支持
- 多语言与多币种支持
- 自动汇率更新
- 多时区感知
- 自定义日期、数字与货币格式
- 安全可靠
- 两步认证 (2FA)
- 登录频次限制
- 应用锁 (PIN 码 / WebAuthn)
- 数据导入/导出
- 支持 CSV、OFX、QFX、QIF、IIF、Camt.053、MT940、GnuCash、FireFly III、Beancount、随手记、支付宝以及微信账单 等多种格式
截图
桌面版

移动版

安装
使用 Docker 部署
访问 Docker Hub 查看所有镜像和标签。
最新发布版本:
$ docker run -p8080:8080 mayswind/ezbookkeeping
最新每日构建:
$ docker run -p8080:8080 mayswind/ezbookkeeping:latest-snapshot
从二进制包安装
下载最新发布版本:https://github.com/mayswind/ezbookkeeping/releases
Linux / macOS
$ ./ezbookkeeping server run
Windows
> .\ezbookkeeping.exe server run
默认 ezBookkeeping 将会监听 8080 端口。您可以访问 http://{YOUR_HOST_ADDRESS}:8080/
。
从源代码构建
请确保您已经安装 Golang, GCC, Node.js 和 NPM。然后下载源代码并执行以下步骤:
Linux / macOS
$ ./build.sh package -o ezbookkeeping.tar.gz
所有的文件将被打包到 ezbookkeeping.tar.gz
.
Windows
> .\build.bat package -o ezbookkeeping.zip
所有的文件将被打包到 ezbookkeeping.zip
.
您还可以构建 Docker 镜像,确保您已经安装 Docker,然后执行以下步骤:
Linux
$ ./build.sh docker
关于安装 ezBookkeeping 的更多信息,您可以访问我们的文档。
SQLite 版本
可能对于大多数人来说,这个版本已经完全足够。
部署代码如下:
services:
ezbookkeeping:
image: mayswind/ezbookkeeping:latest
container_name: ezbookkeeping
hostname: ezbookkeeping
restart: unless-stopped
ports:
- "9527:8080" # 冒号左侧端口可改
environment:
EBK_SERVER_DOMAIN: 192.168.3.200 # 或你 NAS 的域名
EBK_ROOT_URL: http://192.168.3.200:3721 # 包括端口
EBK_LO**ODE: file
EBK_SECURITY_SECRET_KEY:
717ee782a9960010930a8e6da721443e01effdfde39023141c34ba51150d39d7 # 改成随机密钥
EBK_MCP_ENABLE_MCP: true # AI服务
volumes:
- /etc/localtime:/etc/localtime:ro # 同步宿主机时间
- /share/Container/ezbookkeeping/data:/ezbookkeeping/data # SQLite 数据库存放位置(NAS持久化目录)
- /share/Container/ezbookkeeping/storage:/ezbookkeeping/storage # 文件存储目录(附件、导出文件等)
- /share/Container/ezbookkeeping/log:/ezbookkeeping/log # 日志目录
随机密钥可通过以下命令生成:
openssl rand -hex 32

mysql 版本
若你已经部署mysql,或后续有共用数据库的打算,以及清楚自己在做什么,可以使用该版本。如果你对mysql并无了解,建议部署SQLite 版本。
如果你还没部署Mysql,部署代码可如下:
services:
mysql:
image: mysql:8.0
container_name: ezbookkeepin**ysql
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" # 可选,内部访问可去掉
# 如果你修改了 MYSQL_PASSWORD
# 则健康检查中的值也别忘记修改
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-p", "ezbookkeeping"]
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 的域名
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 # 对应上面,下同
EBK_DATABASE_PASSWD: ezbookkeeping # 对应上面 MYSQL_PASSWORD
EBK_LO**ODE: 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;
参考代码如下,酌情修改:
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 的域名
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_LO**ODE: 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
EBK_LO**ODE: file =
