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 =
