介绍
ezBookkeeping 是一款轻量、自托管 (self-hosted) 的个人记账应用,拥有简洁美观的用户界面与强大的记账功能。它以“简单易用、易于部署”为设计理念,对系统资源的需求极低,非常适合部署在 MicroServer、NAS 设备,甚至树莓派上使用。
本应用支持多平台多设备,您可以无缝地在 手机、平板、桌面电脑 上使用。同时借助 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-compose.yml安装
支持 SQLite、MySQL、PostgreSQL 多种数据库
1、SQLite数据库的compose.yml
services:
ezbookkeeping:
image: mayswind/ezbookkeeping
container_name: ezbookkeeping
hostname: "ezbookkeeping"
ports:
- "8066:8080"
environment:
- "EBK_SERVER_DOMAIN=ezbookkeeping.yourdomain"
- "EBK_SERVER_ENABLE_GZIP=true"
- "EBK_DATABASE_TYPE=sqlite3"
- "EBK_DATABASE_FILE=./storage/ezbookkeeping.db" # 相对路径(容器内)
- "EBK_LOG_MODE=file"
- "EBK_SECURITY_SECRET_KEY=its_should_be_a_random_string"
volumes:
- "/etc/localtime:/etc/localtime:ro"
- "./storage:/ezbookkeeping/storage" # 本地相对路径(./ezbookkeeping_data/)
- "./log:/ezbookkeeping/log" # 本地相对路径(./ezbookkeeping_data/)
- "./data:/ezbookkeeping/data" #数据库固化
2、MySQL、PostgreSQL等独立数据库的compose.yml(适合已安装有独立数据库的)
services:
ezbookkeeping:
image: mayswind/ezbookkeeping
container_name: ezbookkeeping
hostname: "ezbookkeeping"
ports:
- "8066:8080" # 根据需要修改冒号前的端口,不跟其它应用冲突即可
environment:
- "EBK_SERVER_DOMAIN=ezbookkeeping.yourdomain"
- "EBK_SERVER_ENABLE_GZIP=true"
- "EBK_DATABASE_TYPE=mysql" # 数据库类型
- "EBK_DATABASE_HOST=mysql:3306" # 数据库地址及端口
- "EBK_DATABASE_NAME=ezbookkeeping" # 数据库名
- "EBK_DATABASE_USER=ezbookkeeping" # 数据库用户名
- "EBK_DATABASE_PASSWD=ezbookkeeping" # 数据库密码
- "EBK_LOG_MODE=file" # 日志类型
- "EBK_SECURITY_SECRET_KEY=its_should_be_a_random_string" # 随机KEY
volumes:
- "/etc/localtime:/etc/localtime:ro"
- "./storage:/ezbookkeeping/storage" # 请确保 UID:GID 是 1000:1000
- "./log/ezbookkeeping:/ezbookkeeping/log" # 请确保 UID:GID 是 1000:1000
3、带数据库一键安装的compose.yml
services:
ezbookkeeping:
image: mayswind/ezbookkeeping
container_name: ezbookkeeping
restart: unless-stopped
ports:
- 8066:8080
volumes:
- /etc/localtime:/etc/localtime:ro
- ./storage:/ezbookkeeping/storage
- ./log:/ezbookkeeping/log
# - ./ezbookkeeping.ini:/ezbookkeeping/conf/ezbookkeeping.ini
environment:
- EBK_DATABASE_TYPE=mysql
- EBK_DATABASE_HOST=mysql:3306
- EBK_DATABASE_NAME=ezbookkeeping
- EBK_DATABASE_USER=ezbookkeeping
- EBK_DATABASE_PASSWD=ezbookkeeping
- EBK_LOG_MODE=file
- EBK_SECURITY_SECRET_KEY=its_should_be_a_random_string
- EBK_MCP_ENABLE_MCP=true
# depends_on:
# mysql:
# condition: service_healthy
mysql:
image: mysql:8.0
container_name: ezbookkeeping-mysql
restart: unless-stopped
volumes:
- ./data:/var/lib/mysql
environment:
- MYSQL_DATABASE=ezbookkeeping
- MYSQL_USER=ezbookkeeping
- MYSQL_PASSWORD=ezbookkeeping
- MYSQL_ROOT_PASSWORD=ezbookkeeping
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-p ezbookkeeping"]
retries: 3
timeout: 5s
访问地址:http://你NAS的IP:8066
