前阵子去欧洲玩了一段时间,鸽了挺久了,今天有点时间,立马来和大家分享好玩儿的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,可以搭配大语言模型一起食用。
2. 相关地址
官方GitHub地址:https://github.com/mayswind/ezbookkeeping (目前958个star,欢迎大家去给作者点星星!)
官方Demo:https://ezbookkeeping-demo.mayswind.net
3. 搭建环境
- 服务器:咕咕这边用的是莱卡云香港服务器,当然你也可以选择其他高性价比的服务器。内存1G以上即可,硬盘当然是越大越好啦。
- 系统:Debian 11 (DD 脚本 非必需 DD,用原来的系统也 OK,之后教程都是用 Debian 或者 Ubuntu 搭建~)
- 安装好 Docker、Docker-compose(相关脚本)
- 【必需】域名一枚,并做好解析到服务器上(域名购买、域名解析 视频教程)
- 【非必需】提前安装好宝塔面板海外版本 aapanel,并安装好 Nginx(安装地址)
- 【非必需本教程选用】安装好 Nginx Proxy Manager(相关教程)
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
举例,腾讯云打开方法如下(部分服务商没有自带的面板防火墙,就不用这步操作了):
类似图中的,这边我们填 8082
,示例填 ezbookkeeping
,确定即可(如果你在 docker-compose 文件里换了 9009
,这边就需要填 9009
,以此类推)
查看端口是否被占用(以 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
在添加反向代理之前,确保你已经完成了域名解析,不会的可以看这个:域名一枚,并做好解析到服务器上(域名购买、域名解析 视频教程)
之后,登陆 Nginx Proxy Manager(不会的看这个:安装 Nginx Proxy Manager(相关教程))
注意:
Nginx Proxy Manager(以下简称 NPM)会用到
80
、443
端口,所以本机不能占用(比如原来就有 Nginx)
直接丢几张图:
注意填写对应的
域名
、IP
和端口
,按文章来的话,应该是8082
IP 填写:
如果 Nginx Proxy Manager 和 ezbookkeeping 在同一台服务器上,可以在终端输入:
ip addr show docker0
查看对应的 Docker 容器内部 IP。
否则直接填 ezbookkeeping 所在的服务器 IP 就行。
6.2 利用宝塔面板
发现还是有不少小伙伴习惯用宝塔面板,这边也贴一个宝塔面板的反代配置:
直接新建一个站点,不要数据库,不要 php,纯静态即可。
然后打开下面的配置,修改 Nginx 的配置。
代码如下:
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% 的反向代理都能生效,然后就可以用域名来安装访问了。
有同学可能会问,为什么不直接用宝塔自带的反向代理功能。
也可以,不过咕咕自己之前遇到过当有多个网站需要反代的时候,在这边设置会报错的情况 = =
所以后来就不用了,直接用上面的方法来操作了。
7. 使用教程
登录你的域名之后,可以看到首页:
这个时候需要创建一个新账号:
这里的预设分类,可以选择打开:
进入后台,结构很清晰:
我们先来添加一下账户:
比如,取名就叫做“咕咕的账本”:
先来手动添加一笔试试看:
可以正常添加:
MCP配置
一开始我们就说了,这个账本支持MCP。
MCP(模型上下文协议)是由 Anthropic 开发的一种开放协议,它能让 AI 模型安全地连接到外部数据源和和工具。
简单来说,MCP 就像一座桥梁,它提供了一种通用的标准,让 AI 工具能安全地获取信息和执行操作,同时确保数据安全和用户可以掌控一切。
有了 MCP 协议,你就可以用自己喜欢的 AI 工具来:
- 添加交易记录:比如,直接用自然语言(就是日常说话的方式)来创建交易,或者从不同的文件格式中批量导入交易记录。
- 查询交易数据:比如,让你的 AI 工具帮你分析历史交易记录。
- 以及做更多的事情。
更多MCP相关介绍可以看这边:https://ezbookkeeping.mayswind.net/mcp
这边我们来看看怎么配置。
首先找到右上角的用户设置,
生成MCP令牌:
有两种形式,分别是普通的令牌和json配置:
普通:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyVG9rZW5JZCI6IjMzOTQ1NTM3NTIyOTE5OTc4MzYiLCJqdGkiOiIzNzY4ODA2Njg4MjQ1NjbWUiOiJSb3kiLCJ0eXBlIjo1LCJpYXQiOjE3NTQ5ODc3NzcsImV4cCI6MTA5NzgzNTk4MTR9.7JL_4kzKhihatpfQxIkhD6Z_ibZ_vBYtcQ_D9UCV--0
JSON配置:
{
"mcpServers": {
"ezbookkeeping-mcp": {
"type": "streamable-http",
"url": "http://localhost:8080/mcp",
"headers": {
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyVG9rZW5JZCI6IjMzOTQ1NTM3NTIyOTE5OTc4MzYiLCJqdGkiOiIzNzY4ODA2Njg4hbWUiOiJSb3kiLCJ0eXBlIjo1LCJpYXQiOjE3NTQ5ODc3NzcsImV4cCI6MTA5NzgzNTk4MTR9.7JL_4kzKhihatpfQxIkhD6Z_ibZ_vBYtcQ_D9UCV--0"
}
}
}
}
这边可以保存下来,下次打开就看不到了。
Cherry Studio配置
这边以Cherry Studio为例,看看MCP怎么配置。
配置情况如图:
名称
:主要用于识别,例如:ezBookkeeping
类型
:选择streamableHttp
协议URL
:为你的域名/mcp
请求头
: 为Authorization=Bearer {token}
接着可以查看一下可以调用的工具:
然后为了确保大模型能正确理解什么是今天,还需要加个时间MCP,这次我们选择json导入,
{
"mcpServers": {
"mcp-server-time": {
"command": "uvx",
"args": ["mcp-server-time"]
}
}
}
这下,你应该有两个MCP服务了。
查看一下时间工具的功能:
接着,我们到Cherry Studio里新建一个助手,
选择启用这两个MCP服务:
测试一下,可以看到回答的时候,调用了MCP服务,
这边提示错误,我没有说记录到哪个账本:
还需要说明交易类别,
后续,
记录成功!
不过这次似乎没有调用时间MCP,时间似乎有问题……
然后我尝试使用Deepseek,直接不调用MCP服务了,很奇怪。
后续一直没调用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/