PassNAT LogoPassNAT

I Hate Money 记账:NAS 上 Docker 部署,旅行合租开销自动算谁给谁

作者

小编

发布时间

Curving abstract shapes with an orange and blue gradient

项目介绍

I Hate Money 是一个自托管的共同开销记账工具。几个人出去玩、合租或者一起吃饭,先把参与的人加进同一个「账目」,每花一笔就记一条:谁付的钱、花了多少、这笔钱是替哪几个人付的。系统按参与人数自动分摊,账目页上直接显示每个人的余额——谁垫得多、谁还欠着。

它最省事的地方是不用自己算。三个人露营,有人先付了营地费,有人买了烧烤食材,有人打车;记完三笔之后,「解决」页面会直接给出「谁付给谁多少」的结算建议,两个人各转一笔就平了。它只负责算账,转账还是用你平时用的方式,系统不会替你动钱。

界面自带简体中文,手机浏览器上也能记账。项目地址:点我跳转

部署安装

只要能跑 Docker 的 NAS 都能装,下面用飞牛 NAS 演示。这个应用是单容器,默认用 SQLite 存数据,把数据目录挂出来就能持久保存,不需要另外装数据库。

一、新建 Compose 项目

打开飞牛的「Docker」应用,切到「Compose」标签,点右上角的新增项目。项目名称填 ihatemoney,路径在「我的文件」下面挑一个空文件夹,没有就当场新建一个。来源选「创建 docker-compose.yml」,把下面这段整个贴进去:

1services:
2 ihatemoney:
3 image: ihatemoney/ihatemoney:latest
4 restart: unless-stopped
5 ports:
6 - "8000:8000"
7 environment:
8 SECRET_KEY: change-me-to-a-random-string
9 SESSION_COOKIE_SECURE: "False"
10 volumes:
11 - ./data:/database

这段编排里只需要改一处口令:

SECRET_KEY:换成你自己的随机字符串,越长越好。它用来签名登录状态,不要用示例里这串。换掉之后已经登录的浏览器需要重新登录,账目数据不受影响。

SESSION_COOKIE_SECURE:用内网穿透给的 http 地址访问时保持 "False",否则登录状态写不进去。将来如果配了 HTTPS,再改成 "True"。

端口 8000 被占用的话,把冒号左边的数字换一个,后面访问和穿透都用新端口。勾上「创建项目后立即启动」,第一次会拉取镜像,起来之后稍等十几秒。

二、第一次打开,建一个账目

浏览器打开 http://NAS的地址:8000,点右上角语言菜单选「中文 (简体)」。页面下方「新建账目」填三项:账目名称(比如「周末露营」)、共享密钥(自己定一个,别和别处重复)、邮箱。邮箱是给提醒邮件用的,没配 SMTP 也不影响使用,页面只会提示一句邮件发送失败。

点「创建」就进了账目页。共享密钥要发给一起记账的人——知道名称和密钥的人都能登录这个账目。

三、加成员、记第一笔

账目页右上角的「添加」就是加人:填个名字点添加,不需要给对方注册账号。把这次一起花钱的人都加进来。

点「添加新帐单」,填日期、事由、谁付的钱、金额,下面的「成员?」勾选这笔钱是替谁付的。默认三个人全勾,就是三人均分;只勾两个人,就由这两个人分。比如营地费 240 元由小林垫付、三人均分,每人 80;烧烤食材 180 元由阿杰垫付、只算小林和阿杰,每人 90。

金额框里可以直接写算式,比如 (18+36.2)/3,它会自己算结果。账单列表里每一行都会标出「每人多少」。

四、看余额和结算建议

账目页顶部一直显示每个人的余额:正数是垫付多了、别人欠他,负数是还欠着。

点导航栏的「解决」,系统会给出最省事的还法。三笔账记完,小林 +40,阿杰和小周各 -20,页面就建议「小周付给小林 20」「阿杰付给小林 20」。照着这个结果,用平时的转账方式把钱转过去就行;转完可以在页面上点一下登记,把这两笔记成已结清。

「统计」页还能看每个人的付款、支出和按月汇总,出去玩一趟花了多少一目了然。

五、把邀请链接发到群里

账目页左边有「邀请别人」,点进去会生成一条邀请链接。把链接发到群里,朋友点开就能直接看到账目、加成员、记账单,不用再输共享密钥。邀请页上还有二维码,手机扫一下也能进。

邀请链接等于这个账目的钥匙,别发到公开的地方;不想让新人进来时,可以在「设置」里换掉共享密钥。想收回某个人的权限,最稳妥的办法是换密钥后重新发链接。

六、用帕斯内网穿透,在外面也能记

在家里局域网记账没问题;出门在外想补一笔,就需要一个能从外面打开的地址。这里用 帕斯内网穿透 拿到公网地址:飞牛的「应用中心」里搜 PassNAT,装上这个穿透插件,打开它,点「创建隧道」。隧道名字随便起(不超过 12 个字符),接入节点和传输协议留默认,本地 IP 留默认的 127.0.0.1,本地端口填 8000(就是编排里冒号左边那个端口)。

建好之后点开这条隧道,按一下电源,状态变成运行中,详情里就能看到分配好的公网地址。把这个地址发给一起记账的人,手机流量下也能打开账目、记一笔、看余额。

不是飞牛的系统,PassNAT 文档的「连接使用」里有其他系统的连接教程:点我跳转。

几点说明

数据在哪。 数据库文件在编排挂出来的 ./data 目录里,备份这个目录就够了;换机器时把目录一起带走。默认是 SQLite,人不多、账目不复杂完全够用;要换成 PostgreSQL 或 MySQL,官方文档给了 SQLALCHEMY_DATABASE_URI 的写法。

它不会替你转账。 结算页给的是「谁该给谁多少」的建议,真正的转账仍然用微信、银行或者现金,转完自己在页面上登记一下。系统不接支付渠道,也不碰你的钱。

公网地址别到处发。 内网穿透给的是 http 地址,谁拿到地址都能打开登录页;账目本身还有共享密钥和邀请链接两道门,但用完了最好在插件里把隧道关掉。

升级。 镜像标签用的是 latest,升级前先备份 ./data 目录,再到 Docker 里重新拉取镜像、重启项目。