openGym 实测:自托管健身追踪,JSON 文件即数据库——不用 Docker 也能跑起 API
openGym 实测:自托管健身追踪,JSON 文件即数据库——不用 Docker 也能跑起 API
"你的训练数据存在谁的服务器上?"这是所有健身 App 回避的问题。openGym(约 1.06 万星,30 天涨了约 9.8k)的答案很硬核:跑在你自己的机器上,数据就是你一个文件夹里的 JSON 文件。
官方 quickstart 是一条 docker compose up。我这台机器没有 Docker,于是换了条路:直接 node 跑它的 API,居然也跑通了,而且顺路看清了它最值得看的设计:没有数据库。
一、它是什么
一句话:自托管的健身与自重训练追踪器。无账户(自己的)、无订阅、无广告、无遥测。行为仍像现代 App——可装主屏幕、passkey 登录、离线可用、多设备同步。功能面按官方 README:训练计划(每工作日一套 routine、5600+ 动作库带动画、轮换制、超级组/drop set)、引导式训练(自动填上次重量、组间计时、破 PR 提示)、统计(进阶规则、估算 1RM、结构平衡、全年热力图)、数据迁移(导入 FitNotes/Strong/Hevy、Apple Health 体重、全量 JSON 导出)。README 明确写着"developed with Claude Code"。
技术栈也轻:前端 React 19 + Vite,API 是原生 node:http,只 3 个依赖(@simplewebauthn/server、web-push、undici)。
二、最值得看的设计:没有数据库
这是我读完配置后最感兴趣的点。它没有 SQLite、没有 Postgres,整个实例的状态就是一个目录里的文件(DATA_DIR):
db.json:profiles + passkey 公钥(读不动时有db.json.bak兜底)state-<用户>.json:每人的计划/训练/体重/设置各一个文档secret:session cookie 签名密钥(丢了全员登出)vapid.json:推送密钥(首跑自动生成)audit.log:管理员活动日志(JSON Lines,可 tail/jq)uploads/:自定义动作的照片/视频
官方备份口径就一句话:"Back up ./data and you've backed up everything."压缩成一条 tar 就是完整备份。对个人项目,"数据库"这一层直接消失了,备份、迁移、审查全是文件操作。代价也写在官方 roadmap 里:数据库存储还排在"later"。
同步机制同样朴素:每个 profile 一个带 server revision 的文档,冲突返回 409 + 当前文档,设备端字段级合并重试。
三、我的实测:不用 Docker,node 直跑 API
官方 quickstart(未跑,本机无 Docker):
git clone https://github.com/DuarteSantos8/openGym
cd openGym
cp .env.example .env
docker compose pull && docker compose up -d
我的路径——API 只有 3 个依赖,直接跑:
cd api && npm install && node server.js
实测日志 gym-api on :3000,数据目录当场生成(secret、vapid.json 都在)。浏览器直接打健康检查端点的真实返回:
http://127.0.0.1:3000/api/health → {"ok":true,"users":0,"writable":true}
http://127.0.0.1:3000/api/config →(默认配置与 .env.example 一致)
如实的边界:前端(React/Vite)我没有构建,所以本文不描述界面操作体验;Docker 路径未验证。已验证的是:API 可在无 Docker 环境以 3 个依赖起步、健康检查与配置端点行为正确、数据文件真实落盘。
四、部署约束:passkey 是硬门槛
passkey(WebAuthn)只能跑在 HTTPS 或 localhost 上,RP_ID/ORIGIN 绑定主机名,局域网 http IP 用不了 passkey,官方专门有一篇文档讲无公网域名怎么搞合法证书。想手机多设备同步,要么有域名 + HTTPS,要么走 guest/密码登录绕法。
五、许可证细节:两层,都要注意
这是自托管爱好者最容易忽略的:
- 代码是 AGPL-3.0:自托管没问题;但你修改后作为网络服务提供,必须同样开源你的修改版;
- 动作库的图片/动画不受 AGPL 保护:© gymvisual.com,"licensed for use in openGym only"——自托管服务器内 180px 可用,更大尺寸只在官方 App 包内;fork 商用或他用需单独授权。做二次分发前先读这段。
六、适合谁,边界在哪
适合:愿意跑 Docker Compose(或手动 node)的个人/家庭/homelab;重视数据自持、能接受"JSON 文件即数据库";想从 FitNotes/Strong/Hevy 迁移的人。
不适合:需要团队权限分级/教练协作的场景(多用户只是多个 passkey profile,admin 可读任意用户 state 文件——官方自己在 .env 注释里承认);不想碰 HTTPS 的人;等数据库存储的人(roadmap 还排在 later)。
七、小结
openGym 的价值不在功能多(那部分见官方 README),而在它把一个"数据自持"产品该有的样子做出来了:实例状态 = 一个目录,备份 = 一条 tar,审查 = 看 JSON。对一个 1 万星、两周一版的个人项目,这个架构选择值得每个"玩具 App"作者参考。部署前记住两件事:passkey 要 HTTPS/localhost,fork 分发前看清 AGPL 和媒体授权两层许可。
参考与署名:本文实测项目为 DuarteSantos8/openGym(代码 AGPL-3.0;动作媒体另有授权);本文不含任何项目源码,仅引用官方文档级命令与配置键名;实测部分为 node 直跑 API,Docker 与前端路径未验证(文中已如实标注)。
- 点赞
- 收藏
- 关注作者
评论(0)