告别数字麻木,重拾消费感知:ezBookkeeping —— 您的轻量自托管记账伴侣

作者:修己xj日期:2025/12/6

在数字时代,消费与支付因网购而变得无比便捷,金钱也随之渐渐抽象为屏幕上冰冷的数字,失去了曾经真实可握的温度。过去用现金交易时,每一张纸币的递出都伴随着复杂的心绪——或许是计划,是犹豫,抑或是不舍。那种实实在在的“付出感”,无形中让人更懂衡量、更知节制。

如今,手机一扫、一键即付,消费变得轻而易举,人与金钱之间的情感联结却日益稀薄。支付动作的简化,也在不知不觉间削弱了我们对支出的敏感。就像从前用现金吃饭,人们会下意识地根据钱包里的余额约束开销;而数字支付让人难以感知“失去”,更容易在无声无息中越过原本的界限。

于是我不禁思考:既然我们享受着快捷支付的便利,是否也能找到一种方式,让消费重新变得可感知?我曾尝试手动记账,但不仅难以统计,账本也容易丢失;又试过一些记账软件,可它们往往太过“便捷”,依然无法帮我找回那份对消费的真实感知。直到最近在 GitHub 上发现了一个开源项目——它恰好满足了我所有这些期待。今天,就想把它介绍给大家。

ezbookkeeping-192.png

什么是ezBookkeeping?

ezBookkeeping 是一款轻量、自托管 (self-hosted) 的个人记账应用,拥有用户友好的界面和强大的记账功能。它部署简单,借助 Docker 只需一行命令即可启动。同时对系统资源占用低、可扩展性高,既可运行在树莓派等轻量设备上,也能扩展到 NAS、MicroServer 甚至集群环境。

ezBookkeeping 为移动端和桌面端提供了各自原生的界面设计。借助 PWA (渐进式网页应用) 技术,您还可以将它 添加到手机主屏幕,像原生 App 一样使用。

github 地址: github.com/mayswind/ez…

文档地址: ezbookkeeping.mayswind.net/zh_Hans

在线演示:ezbookkeeping-demo.mayswind.net

该项目在github已有3.2k star

_20251206_054722.png

Docker私有化部署

我使用的是docker-compose 进行私有化部署的,步骤如下:

  • 创建docker-compose.yml 文件

在我们的服务器上创建部署目录ezbookkeeping,在此目录下创建 docker-compose.yml 文件,内容如下:

1services:
2  ezbookkeeping:
3    image: mayswind/ezbookkeeping:latest
4    container_name: ezbookkeeping
5    hostname: "ezbookkeeping"
6    ports:
7      - "7080:8080"
8    # 默认数据库类型是 sqlite3,若使用默认数据库,注释掉以下环境变量
9    environment:
10      - "EBK_SERVER_ENABLE_GZIP=true"
11      - "EBK_DATABASE_TYPE=mysql"
12      - "EBK_DATABASE_HOST=192.168.31.195:3306"
13      - "EBK_DATABASE_NAME=ezbookkeeping"
14      - "EBK_DATABASE_USER=root"
15      - "EBK_DATABASE_PASSWD=xj123456"
16      - "EBK_LOG_MODE=file"
17      - "EBK_SECURITY_SECRET_KEY=its_should_be_a_random_string"
18    volumes:
19      - /etc/localtime:/etc/localtime:ro
20      - ./storage:/ezbookkeeping/storage # 请确保 UID:GID  1000:1000
21      - ./log:/ezbookkeeping/log # 请确保 UID:GID  1000:1000
22        #      - ./ezbookkeeping.ini:/ezbookkeeping/conf/ezbookkeeping.ini
23        #      - ./data:/ezbookkeeping/data # 默认使用sqlite3数据库挂载目录
24

ezbookkeeping 默认数据库类型是 sqlite3,数据库文件存储在容器中的 /ezbookkeeping/data/ezbookkeeping.db,若使用默认数据库,并持久化保存这些数据,你需要使用 Docker 持久化数据卷或挂载宿主机的路径到容器内。

若想使用mysql或PostgreSQL,则需现在对应的数据库中创建好数据库,在环境变量中配置好相应的环境变量即可,我此处使用的是mysql数据库。

  • 启动服务

在docker-compose.yml的同级目录下使用以下命令启动服务

1docker-compose up -d 
2

启动之后汇报权限错误的日志,需要给挂载目录修改权限

给挂载目录授权

1sudo chmod -R 777 storage log
2

重启服务

1docker-compose restart
2

到此,我们服务就部署好了

使用

  • 注册

在浏览器中打开服务地址,首次的话我们先需要注册用户

_20251206_063538.png

_20251206_063650.png

注册的时候我们可以预设分类

  • 创建账户、分类

我们需要先创建好账户,根据自己记录的维度创建好消费及收入分类

_20251206_064953.png

  • 添加交易、常看统计

然后我们可以记录我们的每一笔消费、收入了

_20251206_065454.png

_20251206_065547.png

  • 移动端使用

在手机浏览器中打开网址http://ip:port/ 或者扫码,使用用户名登录之后就可以在手机端使用了,如果不想每次进浏览器,可以在浏览器中将页面发送到手机桌面。

_20251206_070326.png

结语

在众多个人财务应用中,ezBookkeeping以其开源特性、隐私保护、轻量高效和易部署的优势脱颖而出。无论你是技术爱好者想在树莓派上搭建服务,还是普通用户想在NAS上自建财务系统,ezBookkeeping都是一个值得尝试的优秀选择。

它的设计哲学很明确:给用户完全的控制权,同时提供专业级的记账体验。在这个数据隐私日益重要的时代,这样的应用显得尤为珍贵。

如果你正在寻找一个可靠、私密、功能全面的记账解决方案,不妨试试ezBookkeeping。只需几分钟的部署时间,你就能拥有一个完全属于自己的专业财务管理系统。


告别数字麻木,重拾消费感知:ezBookkeeping —— 您的轻量自托管记账伴侣》 是转载文章,点击查看原文


相关推荐


Dubbo动态服务发现配置指南:从基础到云原生实践
码农技术栈2025/12/3

深入掌握Dubbo动态服务发现机制,构建高效、可靠的微服务架构 文章目录 引言一、Dubbo服务发现核心原理1.1 服务发现基本概念1.2 Dubbo服务发现工作机制1.3 Dubbo2 vs Dubbo3:服务发现的演进1.3.1 Dubbo2接口级服务发现1.3.2 Dubbo3应用级服务发现 二、动态服务发现配置实战2.1 注册中心基础配置2.1.1 Spring Boot配置方式2.1.2 支持的主流注册中心2.1.3 注册中心集群配置 2.2 Dub


什么是Spring Boot 应用开发?
6***83052025/11/30

一、引言 在当今的软件开发领域,Java 依然占据着重要的地位,而 Spring Boot 作为 Java 生态系统中极具影响力的框架,极大地简化了企业级应用的开发流程,提升了开发效率和应用的可维护性。它基于 Spring 框架构建,通过约定优于配置的原则,减少了繁琐的样板代码,让开发者能够快速搭建出功能强大、易于扩展的应用程序,无论是构建小型的微服务还是大型的企业级应用系统,Spring Boot 都提供了全面而便捷的解决方案,涵盖了从后端数据处理、业务逻辑实现到前端交互接口提供等各个方面,成


低代码Agent开发框架使用指南(八)—Coze 知识库详解
大模型真好玩2025/11/28

前言 上篇文章《低代码Agent开发框架使用指南(七)—Coze 数据库详解》中,笔者详细介绍了如何在Coze平台中创建和使用数据库,并结合可视化图表完成了一个数据分析任务。除了能够高效处理结构化数据之外,作为一款功能强大的低代码开发平台,Coze同样支持对文档、表格、图片等非结构化数据进行管理与调用——这正是Coze知识库功能的核心价值所在。 低代码Agent开发相关文章已全部收录于笔者专栏《AI应用工厂:低代码智能体开发使用指南》。本专栏致力于帮助零代码经验的朋友快速上手智能体搭建,学会该技


【Leetcode】1930. 长度为 3 的不同回文子序列
专业抄代码选手2025/11/25

这一题题目不难理解,就是在字符串中寻找有多少个独一无二的回文,只不过这个回文可以不相邻,而且长度只有3。固定首尾,然后再确定中间的字符,加一个去重即可(Set)。 时间复杂度过大,n的3次方 这里的思路比较耿直,直接用3层循环来做 i来寻找首,j来寻找尾,k在中间进行累加即可 最后利用set来进行去重 只不过这里不能ac,时间复杂度过大。 var countPalindromicSubsequence = function (s) { let set = new Set(); f


C#/.NET/.NET Core技术前沿周刊 | 第 62 期(2025年11.17-11.23)
追逐时光者2025/11/23

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐或自荐优质文章、项目、学习资源等。 🏆技术前沿周刊Gitee开源地址: gitee.com/ysgdaydayup… 📰技术前沿周刊GitHub开源地址: github.com/YSGStudyHar… 👪DotNetGuid


工业通信必看:PIC 单片机波特率转换方案(含特殊波特率 + 抗干扰电路)
csg11072025/11/22

在工业控制现场,不同设备的串口(如 RS485、RS232)波特率不统一是常遇到的头疼问题 —— 主控板或 PLC 要统一控制这些设备,必须保证波特率一致。可有些设备能手动设置波特率,有些却固定死,没法调整。 基于这个痛点,我从 2018 年开始研发数据双向透传的波特率转换器,经过反复测试改进,第一代产品就稳定落地,至今已在几十个工业项目中应用。今天就把 PIC 单片机实现波特率转换的核心逻辑、特殊波特率实现技巧、抗干扰电路设计讲透,新手也能参考落地。 一、核心方案:PIC 单片机选型与硬


🎨 新来的外包,在大群分享了它的限流算法的实现
有态度的下等马2025/11/20

1. 令牌桶按用户维度限流 前文golang/x/time/rate演示了基于整体请求速率的令牌桶限流; 那基于用户id、ip、apikey请求速率的限流(更贴近生产的需求), 阁下又该如何应对? 那这个问题就从全局速率变成了按照用户维度(group by userid)来做限流,那么 早先的全局的rateLimiter就要变成人手一个令牌桶,也就是userid:rateLimiter的键值对集合,select count( * ) from table ---> select userid,


IIoT 数据接口契约化工具JSON、OPC UA和Sparkplug B 优缺点对比分析
RockHopper20252025/11/19

本文以IIoT(Industrial Internet of Things)的核心需求为背景,系统性论述“数据接口契约化”的必要性,并对 JSON、OPC UA、Sparkplug B 三者作为“契约化工具(Contract Enforcement Mechanisms)”的优缺点作对比分析。 一、为什么 IIoT 需要“数据接口契约化” IIoT 的本质是:跨设备、跨系统、跨生命周期的数据互操作。 没有契约,就没有稳定接口;没有稳定接口,就没有可维护的生态。 1. 设备异构性极高 各


【微服务】【Nacos 3】 ② 深度解析:AI模块介绍
小毅&Nora2025/11/17

📖目录 前言1. Nacos AI 模块概述2. 核心组件详解2.1 MCP (Model Control Plane)2.1.1 核心功能2.1.2 关键类分析McpServerOperationService索引机制 2.1.3 控制器层 2.2 A2A (Agent to Agent)2.2.1 核心功能2.2.2 关键类分析A2aServerOperationService请求处理器 3. 关键源码剖析3.1 模型服务注册流程3.2 代理通信处理流程


Python 的内置函数 print
IMPYLH2025/11/16

Python 内建函数列表 > Python 的内置函数 print Python 的内置函数 print() 是编程中最常用的输出函数之一,主要用于将指定的内容输出到标准输出设备(通常是控制台)。它的基本语法如下: print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) 参数详解: *objects:可接收多个对象参数,会依次打印这些对象。例如: print("Hello", "World") # 输出:H

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读