支持MCP,轻量又全面的记账软件——ezBookkeeping|好玩儿的Docker项目

本博客用什么VPS?创作不易,欢迎请咕咕喝杯咖啡☕☕☕

前阵子去欧洲玩了一段时间,鸽了挺久了,今天有点时间,立马来和大家分享好玩儿的Docker项目。

1. 介绍

ezBookkeeping 是一款轻量级的个人理财应用,你可以自己架设(自托管)。它界面简洁,用起来很顺手,记账功能也强大。

这款应用的设计核心就是简单便携。它部署起来毫不费力,上手快,而且对系统资源的占用极小。无论是微型服务器、NAS 设备,还是树莓派,都能轻松运行。

ezBookkeeping 支持全平台,对各种设备都很友好。在手机、平板和电脑上用,体验都一样流畅。它还支持 PWA(渐进式网页应用),你可以直接把它添加到手机主屏幕,像本地应用一样方便地使用。

1.1 功能特点

开源与自托管

  • 为你提供隐私和数据控制权

轻量又快速

  • 性能卓越,即使在低配置环境下也能流畅运行

安装简单

  • 支持 Docker 部署
  • 兼容 SQLite, MySQL, PostgreSQL 数据库
  • 跨平台运行(支持 Windows, macOS, Linux)
  • 支持多种处理器架构 (x86, amd64, ARM)

界面友好

  • 界面已针对移动和桌面设备优化
  • 支持 PWA,在手机上可获得类似原生应用的体验
  • 提供深色模式

AI 赋能

  • 支持 MCP (Model Context Protocol),可集成 AI 功能

强大的记账功能

  • 支持两级账户和分类
  • 可为交易添加图片附件
  • 具备地图位置追踪功能
  • 支持周期性(重复)交易
  • 提供高级筛选、搜索、数据可视化和分析功能

本地化与全球化

  • 支持多种语言和货币
  • 自动更新汇率
  • 支持多时区显示
  • 可自定义日期、数字和货币格式

安全保障

  • 支持双重身份验证 (2FA)
  • 登录频率限制
  • 应用锁定功能(支持 PIN 码 / WebAuthn)

数据导入/导出

  • 支持多种格式,包括 CSV, OFX, QFX, QIF, IIF, Camt.053, MT940, GnuCash, Firefly III, Beancount 等等

简单来说,这是一个记账的项目,然后它还可以支持MCP,可以搭配大语言模型一起食用。

fa0b25dbc1ebb8c3e364c5de96542aff.png

6cd6cae5e006175532d59840d5683924.png

2. 相关地址

官方GitHub地址:https://github.com/mayswind/ezbookkeeping (目前958个star,欢迎大家去给作者点星星!)

官方Demo:https://ezbookkeeping-demo.mayswind.net

3. 搭建环境

4. 搭建视频(有时间补充!)

4.1 YouTube

视频地址:

4.2 哔哩哔哩

哔哩哔哩:

5. 搭建方式

5.1 安装 Docker 与 Nginx Proxy Manager

可以直接参考这篇内容:

https://blog.laoda.de/archives/nginxproxymanager/

5.2 创建安装目录

创建一下安装的目录:

sudo -i

mkdir -p /root/data/docker_data/ezbookkeeping

cd ezbookkeeping

我们来简单修改一下作者提供的docker-compose.yml文件

vim docker-compose.yml

咕咕修改之后的:

services:
  ezbookkeeping:
    image: mayswind/ezbookkeeping
    container_name: ezbookkeeping
    restart: unless-stopped
    ports:
      - 8082: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

修改完成之后,可以在英文输入法下,按 i 修改,完成之后,按一下 esc,然后 :wq 保存退出。

接着创建文件夹,赋予文件权限:

cd /root/data/docker_data/ezbookkeeping
mkdir ./{data,log,storage}
chmod a+rw {log,storage}

5.3 打开服务器防火墙(非必需)并访问网页

打开防火墙的端口 8082

举例,腾讯云打开方法如下(部分服务商没有自带的面板防火墙,就不用这步操作了):

image-20220630215240864
image-20220630220546335

类似图中的,这边我们填 8082,示例填 ezbookkeeping ,确定即可(如果你在 docker-compose 文件里换了 9009,这边就需要填 9009,以此类推)

56a42aff23098af08c1ae587e19739ae.png

查看端口是否被占用(以 8082 为例),输入:

lsof -i:8082  #查看 8082 端口是否被占用,如果被占用,重新自定义一个端口

如果啥也没出现,表示端口未被占用,我们可以继续下面的操作了~

如果出现:

-bash: lsof: command not found

运行:

apt install lsof  #安装 lsof

如果端口没有被占用(被占用了就修改一下端口,比如改成 8381,注意 docker 命令行里和防火墙都要改)

5.4 启动 ezbookkeeping

cd /root/data/docker_data/ezbookkeeping

docker compose up -d   # 注意,老版本用户用 docker-compose up -d

等待拉取好镜像,出现 done的字样之后,

理论上我们就可以输入 http://ip:8082 访问了。

但是这边我们推荐先搞一下反向代理!

做反向代理前,你需要一个域名!

namesilo 上面 xyz 后缀的域名一年就 7 块钱,可以年抛。(冷知识,namesilo上 6位数字的xyz续费永远都是0.99美元 = =)

如果想要长期使用,还是建议买 com 后缀的域名,更加正规一些,可以输入 laodade 来获得 1 美元的优惠(不知道现在还有没有)

namesilo 自带隐私保护,咕咕一直在用这家,价格也是这些注册商里面比较低的,关键是他家不像其他家域名注册商,没有七七八八的套路!(就是后台界面有些 古老 = =)

【域名购买】Namesilo 优惠码和域名解析教程(附带服务器购买推荐和注意事项)

我们接着往下看!

6. 反向代理

6.1 利用 Nginx Proxy Manager

在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:域名一枚,并做好解析到服务器上域名购买、域名解析 视频教程

4b00cb7fe121c71233685dcc787fdf32.png

之后,登陆 Nginx Proxy Manager(不会的看这个:安装 Nginx Proxy Manager相关教程))

注意:

Nginx Proxy Manager(以下简称 NPM)会用到 80443 端口,所以本机不能占用(比如原来就有 Nginx)

直接丢几张图:

9a07c1b059cf95aae62081a18f2ad5d8.png
c1fa9d7b7a32927f020093975c6fd8ea.png
396509498ad5fd92b67f6a782cade133.png
e5362e20c7d6d271d1e8103b0511ac04.png

注意填写对应的 域名IP端口,按文章来的话,应该是 8082

IP 填写:

如果 Nginx Proxy Manager 和 ezbookkeeping 在同一台服务器上,可以在终端输入:

ip addr show docker0

查看对应的 Docker 容器内部 IP。

支持MCP,轻量又全面的记账软件——ezBookkeeping|好玩儿的Docker项目

否则直接填 ezbookkeeping 所在的服务器 IP 就行。

6.2 利用宝塔面板

发现还是有不少小伙伴习惯用宝塔面板,这边也贴一个宝塔面板的反代配置:

直接新建一个站点,不要数据库,不要 php,纯静态即可。

然后打开下面的配置,修改 Nginx 的配置。

image-20220819150345725
image-20220819150542867

代码如下:

location / {
      proxy_pass http://127.0.0.1:8082/;       # 注意改成你实际使用的端口
      rewrite ^/(.*)$ /$1 break;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Upgrade-Insecure-Requests 1;
      proxy_set_header X-Forwarded-Proto https;
    }

此方法对 90% 的反向代理都能生效,然后就可以用域名来安装访问了。

有同学可能会问,为什么不直接用宝塔自带的反向代理功能。

image-20220819150730128

也可以,不过咕咕自己之前遇到过当有多个网站需要反代的时候,在这边设置会报错的情况 = =

所以后来就不用了,直接用上面的方法来操作了。

7. 使用教程

登录你的域名之后,可以看到首页:

7a03c1ab0e2dd10aa34612cba853e3ed.png

这个时候需要创建一个新账号:

826b774725884ccd0ba5d7bb5758c241.png

39679f5841b71f65fb9f2133518e24c5.png

这里的预设分类,可以选择打开:

5f1aacee44cf4f3e03d077634743e047.png

进入后台,结构很清晰:

694dcf2d58bfaadaa204d13269549e9d.png

我们先来添加一下账户:

3cefdb5bf5493e24f16be3df8c491cfe.png

比如,取名就叫做“咕咕的账本”:

b9869d80991a30d1f4e46bf18999a778.png

先来手动添加一笔试试看:

f3b17b3c3f41f5eb0e4f5521bbf1d214.png

可以正常添加:

e9f717d2e4a0fd9ef38bb95eb89a79bb.png

MCP配置

一开始我们就说了,这个账本支持MCP。

MCP(模型上下文协议)是由 Anthropic 开发的一种开放协议,它能让 AI 模型安全地连接到外部数据源和和工具。

简单来说,MCP 就像一座桥梁,它提供了一种通用的标准,让 AI 工具能安全地获取信息和执行操作,同时确保数据安全和用户可以掌控一切。

有了 MCP 协议,你就可以用自己喜欢的 AI 工具来:

  • 添加交易记录:比如,直接用自然语言(就是日常说话的方式)来创建交易,或者从不同的文件格式中批量导入交易记录。
  • 查询交易数据:比如,让你的 AI 工具帮你分析历史交易记录。
  • 以及做更多的事情

更多MCP相关介绍可以看这边:https://ezbookkeeping.mayswind.net/mcp

这边我们来看看怎么配置。

首先找到右上角的用户设置,

e66ee48541f398f0c84c40b839e68388.png

生成MCP令牌:

有两种形式,分别是普通的令牌和json配置:

7bcc4a9580e9e7d3c1fa1a74d0401b90.png

ab7a8343aff185cf6ab7475b925f0ea4.png

普通:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyVG9rZW5JZCI6IjMzOTQ1NTM3NTIyOTE5OTc4MzYiLCJqdGkiOiIzNzY4ODA2Njg4MjQ1NjbWUiOiJSb3kiLCJ0eXBlIjo1LCJpYXQiOjE3NTQ5ODc3NzcsImV4cCI6MTA5NzgzNTk4MTR9.7JL_4kzKhihatpfQxIkhD6Z_ibZ_vBYtcQ_D9UCV--0

JSON配置:

c5dfb5b8dfc24e1ca0e2303fece2cde2.png

{
    "mcpServers": {
        "ezbookkeeping-mcp": {
            "type": "streamable-http",
            "url": "http://localhost:8080/mcp",
            "headers": {
                "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyVG9rZW5JZCI6IjMzOTQ1NTM3NTIyOTE5OTc4MzYiLCJqdGkiOiIzNzY4ODA2Njg4hbWUiOiJSb3kiLCJ0eXBlIjo1LCJpYXQiOjE3NTQ5ODc3NzcsImV4cCI6MTA5NzgzNTk4MTR9.7JL_4kzKhihatpfQxIkhD6Z_ibZ_vBYtcQ_D9UCV--0"
            }
        }
    }
}

这边可以保存下来,下次打开就看不到了。

29a8936f32b3247acb4510626a85c87b.png

Cherry Studio配置

这边以Cherry Studio为例,看看MCP怎么配置。

706dbf1ee98c6368863418e1a638da1c.png

配置情况如图:

57f3580946e4072cba358958444ff08f.png

  • 名称:主要用于识别,例如:ezBookkeeping
  • 类型:选择 streamableHttp 协议
  • URL:为 你的域名/mcp
  • 请求头: 为 Authorization=Bearer {token}

接着可以查看一下可以调用的工具:

c24978aa0964d06246f059399f92ee88.png

然后为了确保大模型能正确理解什么是今天,还需要加个时间MCP,这次我们选择json导入,

{
    "mcpServers": {
        "mcp-server-time": {
            "command": "uvx",
            "args": ["mcp-server-time"]
        }
    }
}

3a3ab3900b6dba588cbcdf54b8f47245.png

ca6653fe3ec6dfe069da60592b40b369.png

这下,你应该有两个MCP服务了。

8b12dc8711e6936375bb1d880271102a.png

查看一下时间工具的功能:

369abc91ad148e042f9e796c8580312e.png

接着,我们到Cherry Studio里新建一个助手,

399ab6071f945797e0fb61349d00cd16.png

选择启用这两个MCP服务:

4775185163eb58be74204ea756d6b915.png

测试一下,可以看到回答的时候,调用了MCP服务,

b65c160f578c98b0f083b0add6a749bb.png

这边提示错误,我没有说记录到哪个账本:

4f1fc419fafb5fc9f55764aca9b20b5d.png

900832a98c968a38f541aff971a5b140.png

还需要说明交易类别,

6cc43ba6b7f0df94f756c836bc1b5de4.png

后续,

fca2836dc485e298003061c20dd71ec3.png

记录成功!

756e050ca91dfb4f2a1f5b3020baa75c.png

不过这次似乎没有调用时间MCP,时间似乎有问题……

然后我尝试使用Deepseek,直接不调用MCP服务了,很奇怪。

8c18d8491e297ce50cc941024a31a3c2.png

后续一直没调用MCP服务,暂时还没解决,我的是Mac,有解决的小伙伴可以评论区分享一下。

7.1 更新 ezbookkeeping

cd /root/data/docker_data/ezbookkeeping

docker compose pull

docker compose up -d    # 请不要使用 docker compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。

docker image prune  # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像

提示:

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

输入 y

利用 Docker 搭建的应用,更新非常容易~

7.2 卸载 ezbookkeeping

同样进入安装页面,先停止所有容器。

cd /root/data/docker_data/ezbookkeeping

docker compose down

cd ..

rm -rf /root/data/docker_data/ezbookkeeping  # 完全删除

可以卸载得很干净。

8. 常见问题及注意点

还是MCP调用的问题,不是非常稳定,暂时不确定是不是Cherry Studio的问题。

9. 结尾

祝大家用得开心,有问题可以去 GitHub 提 Issues,也可以在评论区互相交流探讨。

同时,项目处于初期,有能力给项目做贡献的同学,也欢迎积极加入到 [项目]https://github.com/mayswind/ezbookkeeping) 中来,贡献自己的一份力量!

最后,感谢开发人员们的辛苦付出,让我们能用到这么优秀的项目!也希望开源项目越来越好!

10. 参考资料

官方GitHub:https://github.com/mayswind/ezbookkeeping

---------------
如何觉得文章内容不错,欢迎点击一下广告,支持一下咕咕😍😍😍

原创文章,作者:Roy,如若转载,请注明出处:https://iwanlab.com/docker-compose-install-ezbookkeeping/

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Roy的头像Roy
上一篇 2025年7月4日 上午10:37
下一篇 2023年6月14日 下午8:54
   

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注