beancount-gs 一款 self-hosted 复式记账程序,简化你的记账方式!

本程序将部署在 macOS 上,不使用 Docker(mac 上的 Docker 太卡了)

动机

我利用 beancount 来记账已经有一段时间了,但有些痛点问题困扰着我:

  • 没有 web 界面,fava 真的只能用来展示和分析且不好理解,需要有一个方便记账的界面
  • text 记账的方式,在 vscode 插件能力有限的情况下,很容易忘记 assets 和 expenses 到底叫啥名,如果有 web 界面那么一定会好很多,一个下拉列表就可以解决

有没有解决方案,不需要自己造轮子的那种?

  • 有!beancoutn-gs ,最近还在更新,就喜欢长期维护的!

主旨

下载与编译

我手头就一台 intel 的 MBP,不想装虚拟机,也绝不会想用 Docker Desktop(用过的都知道有多么卡和费电)。

因此,我的需求就是将程序作为服务直接在 mac 上跑,这不跟 Linux 的服务一个样么,多好啊。

bash
pip3 install beancount

git clone https://github.com/BaoXuebin/beancount-gs.git

beancount-gs

go build

完事,golang 就是好用啊!

我对源码中的监听端口做了修改,同时注释掉了打开浏览器的操作:

Untitled

还加入了环境变量的设置,防止找不到我的 beancount:

Untitled

请将编译好的可执行文件放到 /opt/beancount-gs/ 文件夹中。

还有很重要的事情是,把源码中编译好的前端文件夹 public 、 config 和 template 也 copy 到 /opt/beancount-gs/ 文件夹中,不然访问时啥也没有。

Untitled

开机自启动

launchd 是 macOS 内核装载后启动的第一个进程,类似 Linux 的1号进程。

Linux 中咱们是编写服务,然后使用 systemctl enable xxx 实现的。

编写 plist 文件

Plist 的全称是 Property lists 。

Untitled

类似的,macOS 就需要编写 plist 文件,放到用户登录后的 ~/Library/LaunchAgents 中:

xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>beancount-gs</string>
        <key>ProgramArguments</key>
        <array>
            <string>/opt/beancount-gs/beancount-gs</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>WorkingDirectory</key>
        <string>/opt/beancount-gs/</string>
        <key>StandardOutPath</key>
        <string>/opt/beancount-gs/beancount-gs.log</string>
        <key>StandardErrorPath</key>
        <string>/opt/beancount-gs/beancount-gs.log</string>
    </dict>
</plist>

这个就不用解释了吧,xml 文件就是写了一些键值对配置和启动的命令~

载入 plist 文件

man launchctl 查看用法吧

bash
launchctl load -w /Users/yuhanliu/Library/LaunchAgents/beancount-gs.plist
# launchctl unload -w /Users/yuhanliu/Library/LaunchAgents/beancount-gs.plist
# launchctl bootstrap user/501 ~/Library/LaunchAgents/beancount-gs.plist
# id -u yuhanliu 

launchctl start beancount-gs
# launchctl stop beancount-gs

Untitled

访问

Untitled

中间居然出现好多问题,这个程序的健壮性不是很强啊:

Untitled

我还要手动新建文件夹和对应的文件……

Untitled

参考文章

前言 · 语雀

Mac 开机自启动

comments powered by Disqus
相关文章
内存管理:分段、分区、分页

内存要怎么用起来呢?存储程序的思想,把程序放入内存,程序在CPU中取指执行! 而用户程序有逻辑地址,实际的内存是物理地址,于是先有一个地址重定位的问题。 由于程序载入内存之后,睡眠了的话,还会被移入到磁盘,因此在运行时做重定位更好,这叫做地址翻译。

阅读更多
如何在多个编程语言间切换自如

Attention 要自由切换编程语言,必然要通过实践,编程语言之海浩瀚无边,本文会随着作者的实践而不断更新,敬请期待。 基本思路 熟悉各语言基本语法,怎么定义变量、函数、控制流等,这里有语法简介、数据结构等章节。 识别各语言的特性,为什么 Python 有元组等,也就是要知道语言的特性和高级用法等。 在熟悉基本语法时,要能搞清楚各编程语言怎么描述相同的功能的。 在识别语言特性时,要能搞清楚各编程语言处理方式上的设计哲学。

阅读更多
JWT 的应用场景思考

JWT 的应用场景思考 简述 JWT JWT,全称 JSON Web Token。是一种开放标准,用于在各方之间安全传递信息,它是以 Base64 编码 json 对象的 token 。基于 token 的权限验证,与传统的 Session 认证完全不同,它不需要服务端保持 Session 记录,连用户状态都不需要关心。一旦用户登录网站,服务器就会生成 token,之后客户端每次登录时在HTTP的头信息中带上 token 即可。

阅读更多